Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/next-sitemap-fork.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@opensourceframework/next-sitemap": major
---

Add `@opensourceframework/next-sitemap` as a maintained fork of the stale `next-sitemap` package. Provides a drop-in replacement with corrected CommonJS support (uses `.cjs` extension). Includes a smoke test to verify package loads.

Fixes #101
7 changes: 7 additions & 0 deletions packages/identity-obj-proxy/src/__tests__/smoke.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const idObj = require('..');

describe('identity-obj-proxy fork', () => {
it('should return the key as a string (smoke test)', () => {
expect(idObj.smoke).toBe('smoke');
});
});
2 changes: 2 additions & 0 deletions packages/next-sitemap/.npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
src
tsconfig.json
538 changes: 1 addition & 537 deletions packages/next-sitemap/README.md

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions packages/next-sitemap/bin/next-sitemap.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/usr/bin/env node
/* eslint-disable @typescript-eslint/no-var-requires */
const envLoader = require('@next/env')
const { CLI } = require('../dist/cjs/cli.js')

// Load environment variables
envLoader.loadEnvConfig(process.cwd(), process.env.NODE_ENV === 'development')

// Execute CLI
new CLI().execute()
9 changes: 9 additions & 0 deletions packages/next-sitemap/bin/next-sitemap.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env node
import envLoader from '@next/env'
import { CLI } from '../dist/esm/cli.js'

// Load environment variables
envLoader.loadEnvConfig(process.cwd(), process.env.NODE_ENV === 'development')

// Execute CLI
new CLI().execute()
96 changes: 57 additions & 39 deletions packages/next-sitemap/package.json
Original file line number Diff line number Diff line change
@@ -1,57 +1,75 @@
{
"name": "@opensourceframework/next-sitemap",
"version": "1.0.0",
"main": "index.js",
"description": "Sitemap generator for next.js (maintained fork)",
"type": "module",
"main": "./dist/cjs/index.cjs",
"module": "./dist/esm/index.js",
"types": "./dist/@types/index.d.ts",
"exports": {
".": {
"import": "./dist/esm/index.js",
"require": "./dist/cjs/index.cjs",
"types": "./dist/@types/index.d.ts"
}
},
"files": [
"dist",
"bin"
],
"repository": {
"type": "git",
"url": "git+https://github.com/riceharvest/opensourceframework.git",
"directory": "packages/next-sitemap"
},
"author": "OpenSource Framework Contributors (fork), Original: Unknown",
"license": "MIT",
"type": "module",
"workspaces": {
"packages": [
"packages/*",
"examples/*",
"docs"
]
"bugs": {
"url": "https://github.com/riceharvest/opensourceframework/issues?q=is%3Aissue+is%3Aopen+next-sitemap"
},
"scripts": {
"clean": "tsc --build --clean",
"dev:test": "bun test --watch",
"dev:tsc": "tsc --build --watch",
"build": "turbo run deploy --force",
"test": "bun test --ci --coverage --verbose",
"lint": "eslint .",
"prettier:check": "prettier --check \"**/*.{js,mjs,cjs,jsx,json,ts,tsx,md,mdx,css,html,yml,yaml,scss,less,graphql,graphqls,gql}\"",
"format": "prettier --write \"**/*.{js,mjs,cjs,jsx,json,ts,tsx,md,mdx,css,html,yml,yaml,scss,less,graphql,graphqls,gql}\""
},
"devDependencies": {
"@corex/workspace": "^4.0.43",
"@typescript-eslint/eslint-plugin": "^6.9.1",
"@typescript-eslint/parser": "^6.9.1",
"eslint": "^8.52.0",
"eslint-config-next": "^14.0.0",
"fast-xml-parser": "^4.3.2",
"prettier": "^3.0.3",
"turbo": "^1.10.16"
},
"contributors": [
"homepage": "https://github.com/riceharvest/opensourceframework/tree/main/packages/next-sitemap#readme",
"funding": [
{
"name": "Unknown",
"url": "https://github.com/next-sitemap"
"url": "https://github.com/riceharvest/opensourceframework"
}
],
"homepage": "https://github.com/riceharvest/opensourceframework/tree/main/packages/next-sitemap#readme",
"engines": {
"node": ">=18"
},
"keywords": [
"nextjs",
"next",
"sitemap",
"seo",
"react"
],
"author": "OpenSource Framework Contributors (fork), Original: Vishnu Sankar",
"contributors": [
"Vishnu Sankar <https://www.iamvishnusankar.com>"
],
"license": "MIT",
"sideEffects": false,
"publishConfig": {
"access": "public"
},
"engines": {
"node": ">=18.0.0"
"bin": {
"next-sitemap": "./bin/next-sitemap.mjs",
"next-sitemap-cjs": "./bin/next-sitemap.cjs"
},
"scripts": {
"build": "tsc && tsc --module commonjs --outDir dist/cjs && node scripts/fix-cjs.cjs",
"test": "pnpm build && node -e \"const p=require('./dist/cjs/index.cjs'); console.log('Package loads OK, exports:', Object.keys(p));\""
},
"funding": {
"type": "GitHub",
"url": "https://github.com/sponsors/riceharvest"
"dependencies": {
"@corex/deepmerge": "^4.0.43",
"@next/env": "^13.5.6",
"fast-glob": "^3.3.1",
"minimist": "^1.2.8"
},
"peerDependencies": {
"next": "*"
},
"devDependencies": {
"@corex/tsconfig": "^4.0.43",
"fast-xml-parser": "^5.5.9",
"typescript": "^5.2.2"
}
}
38 changes: 38 additions & 0 deletions packages/next-sitemap/scripts/fix-cjs.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
const fs = require('fs');
const path = require('path');

function getAllFiles(dir, ext) {
let results = [];
const list = fs.readdirSync(dir);
list.forEach(file => {
const full = path.join(dir, file);
const stat = fs.statSync(full);
if (stat.isDirectory()) {
results = results.concat(getAllFiles(full, ext));
} else if (full.endsWith(ext)) {
results.push(full);
}
});
return results;
}

const cwd = process.cwd();
const cjsDir = path.join(cwd, 'dist', 'cjs');

// Rename all .js files in dist/cjs to .cjs
const jsFiles = getAllFiles(cjsDir, '.js');
jsFiles.forEach(file => {
const newFile = file.replace(/\.js$/, '.cjs');
fs.renameSync(file, newFile);
});

// After renaming, update require statements in .cjs files to point to .cjs
const cjsFiles = getAllFiles(cjsDir, '.cjs');
cjsFiles.forEach(file => {
let content = fs.readFileSync(file, 'utf8');
// Replace require('...js') or require("...js") with .cjs extension, handling any relative paths (e.g., './', '../')
content = content.replace(/require\((['"])([^'"]+)\.js\1\)/g, "require($1$2.cjs$1)");
fs.writeFileSync(file, content);
});

console.log('Fixed CJS output: renamed .js to .cjs and updated require statements.');
34 changes: 34 additions & 0 deletions packages/next-sitemap/src/__fixtures__/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import type { IConfig } from '../interface.js'
import { withDefaultConfig } from '../utils/defaults.js'

export const sampleConfig: IConfig = withDefaultConfig({
siteUrl: 'https://example.com',
sourceDir: 'public',
changefreq: 'daily',
priority: 0.7,
sitemapSize: 5000,
generateRobotsTxt: true,
trailingSlash: false,
robotsTxtOptions: {
policies: [
{
userAgent: '*',
allow: '/',
},
{
userAgent: 'black-listed-bot',
disallow: ['/sub-path-1', '/path-2'],
},
{
userAgent: 'friendly-bot',
allow: '/',
crawlDelay: 10,
},
],
additionalSitemaps: [
'https://example.com/my-custom-sitemap-1.xml',
'https://example.com/my-custom-sitemap-2.xml',
'https://example.com/my-custom-sitemap-3.xml',
],
},
})
125 changes: 125 additions & 0 deletions packages/next-sitemap/src/__fixtures__/manifest.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import type {
IBuildManifest,
IPreRenderManifest,
IRoutesManifest,
INextManifest,
} from '../interface.js'

export const sampleBuildManifest: IBuildManifest = {
pages: {
'/': [],
'/[dynamic]': [],
'/_app': [],
'/_error': [],
},
}

export const samplePreRenderManifest: IPreRenderManifest = {
routes: {
'/page-0': {},
'/page-1': {},
'/page-2': {},
'/page-3': {},
},
notFoundRoutes: [],
}

export const sampleManifest: INextManifest = {
build: sampleBuildManifest,
preRender: samplePreRenderManifest,
}

export const sampleI18nBuildManifest: IBuildManifest = {
pages: {
'/': [],
'/about': [],
'/[dynamic]': [],
'/_app': [],
'/_error': [],
},
}

export const sampleI18nPreRenderManifest: IPreRenderManifest = {
routes: {
'/en-US': {},
'/fr': {},
'/en-US/about': {},
'/fr/about': {},
'/page-0': {},
'/page-1': {},
'/en-US/page-1': {},
'/page-2': {},
'/fr/page-2': {},
'/page-3': {},
},
notFoundRoutes: [],
}

export const sampleRenderManifest: IRoutesManifest = {
i18n: {
locales: ['en-US', 'fr', 'nl-NL', 'nl-BE'],
defaultLocale: 'en-US',
},
}

export const sampleI18nManifest: INextManifest = {
build: sampleI18nBuildManifest,
preRender: sampleI18nPreRenderManifest,
routes: sampleRenderManifest,
}

export const sampleNotFoundRoutesBuildManifest: IBuildManifest = {
pages: {
'/': [],
'/about': [],
'/only-nl': [],
'/[dynamic]': [],
'/_app': [],
'/_error': [],
},
}
export const sampleNotFoundRoutesPreRenderManifest: IPreRenderManifest = {
routes: {
'/en-US': {},
'/fr': {},
'/nl-NL': {},

'/en-US/about': {},
'/fr/about': {},
'/nl-NL/about': {},

'/en-US/only-nl': {},
'/fr/only-nl': {},
'/nl-NL/only-nl': {},

'/en-US/page-0': {},
'/fr/page-0': {},
'/nl-NL/page-0': {},

'/en-US/page-1': {},
'/fr/page-1': {},
'/nl-NL/page-1': {},
},
notFoundRoutes: [
'/fr',
'/nl-NL/about',
'/en-US/only-nl',
'/fr/only-nl',
'/nl-NL/page-0',
'/fr/page-1',
'/nl-NL/page-1',
],
}

export const sampleNotFoundRoutesRenderManifest: IRoutesManifest = {
i18n: {
locales: ['en-US', 'fr', 'nl-NL'],
defaultLocale: 'en-US',
},
}

export const sampleNotFoundRoutesManifest: INextManifest = {
build: sampleNotFoundRoutesBuildManifest,
preRender: sampleNotFoundRoutesPreRenderManifest,
routes: sampleNotFoundRoutesRenderManifest,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Bun Snapshot v1, https://goo.gl/fbAQLP

exports[`RobotsTxtBuilder generateRobotsTxt: additionalSitemap 1`] = `
"# *
User-agent: *
Allow: /

# black-listed-bot
User-agent: black-listed-bot
Disallow: /sub-path-1
Disallow: /path-2

# friendly-bot
User-agent: friendly-bot
Allow: /
Crawl-delay: 10

# Host
Host: https://example.com

# Sitemaps
Sitemap: https://example.com/my-custom-sitemap-1.xml
Sitemap: https://example.com/my-custom-sitemap-2.xml
Sitemap: https://example.com/my-custom-sitemap-3.xml
"
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { sampleConfig } from '../../../__fixtures__/config.js'
import { RobotsTxtBuilder } from '../../robots-txt-builder.js'

let builder: RobotsTxtBuilder

beforeEach(() => {
builder = new RobotsTxtBuilder()
})

describe('RobotsTxtBuilder', () => {
test('generateRobotsTxt: additionalSitemap', () => {
expect(builder.generateRobotsTxt(sampleConfig as any)).toMatchSnapshot()
})
})
Loading
Loading