@accept-md/core 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +86 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/scanner/app-router.d.ts +9 -0
- package/dist/scanner/app-router.d.ts.map +1 -0
- package/dist/scanner/app-router.js +115 -0
- package/dist/scanner/app-router.js.map +1 -0
- package/dist/scanner/index.d.ts +15 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +38 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/pages-router.d.ts +6 -0
- package/dist/scanner/pages-router.d.ts.map +1 -0
- package/dist/scanner/pages-router.js +95 -0
- package/dist/scanner/pages-router.js.map +1 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +40 -0
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default config and config loading for accept-md.
|
|
3
|
+
*/
|
|
4
|
+
import type { NextMarkdownConfig } from './types.js';
|
|
5
|
+
export declare const DEFAULT_CONFIG: NextMarkdownConfig;
|
|
6
|
+
export declare function loadConfig(projectRoot: string): NextMarkdownConfig;
|
|
7
|
+
export declare function pathMatchesGlobs(pathname: string, globs: string[]): boolean;
|
|
8
|
+
export declare function shouldExcludePath(pathname: string, config: NextMarkdownConfig): boolean;
|
|
9
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAOrD,eAAO,MAAM,cAAc,EAAE,kBAQ5B,CAAC;AAIF,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAclE;AAgBD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAM3E;AAyBD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAIvF"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default config and config loading for accept-md.
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { createRequire } from 'node:module';
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
export const DEFAULT_CONFIG = {
|
|
9
|
+
include: ['/**'],
|
|
10
|
+
exclude: ['/api/**', '/_next/**', '/__markdown/**'],
|
|
11
|
+
cleanSelectors: ['nav', 'footer', '.no-markdown', '[data-no-markdown]', 'script', 'style'],
|
|
12
|
+
outputMode: 'markdown',
|
|
13
|
+
cache: true,
|
|
14
|
+
transformers: [],
|
|
15
|
+
debug: false,
|
|
16
|
+
};
|
|
17
|
+
const CONFIG_NAMES = ['accept-md.config.js', 'accept-md.config.mjs', 'accept-md.config.cjs'];
|
|
18
|
+
export function loadConfig(projectRoot) {
|
|
19
|
+
for (const name of CONFIG_NAMES) {
|
|
20
|
+
const path = join(projectRoot, name);
|
|
21
|
+
if (!existsSync(path))
|
|
22
|
+
continue;
|
|
23
|
+
try {
|
|
24
|
+
// Dynamic import for ESM/CJS
|
|
25
|
+
const mod = require(path);
|
|
26
|
+
const user = mod.default ?? mod;
|
|
27
|
+
return mergeConfig(DEFAULT_CONFIG, user);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// try next name
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { ...DEFAULT_CONFIG };
|
|
34
|
+
}
|
|
35
|
+
function mergeConfig(base, user) {
|
|
36
|
+
return {
|
|
37
|
+
...base,
|
|
38
|
+
...user,
|
|
39
|
+
include: user.include ?? base.include,
|
|
40
|
+
exclude: user.exclude ?? base.exclude,
|
|
41
|
+
cleanSelectors: user.cleanSelectors ?? base.cleanSelectors,
|
|
42
|
+
transformers: user.transformers ?? base.transformers,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function pathMatchesGlobs(pathname, globs) {
|
|
46
|
+
const normalized = pathname.endsWith('/') && pathname !== '/' ? pathname.slice(0, -1) : pathname;
|
|
47
|
+
for (const pattern of globs) {
|
|
48
|
+
if (matchGlob(normalized, pattern))
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
/** Simple glob: * matches one segment, ** matches rest. */
|
|
54
|
+
function matchGlob(pathname, pattern) {
|
|
55
|
+
if (pattern === '/**')
|
|
56
|
+
return true;
|
|
57
|
+
const pathParts = pathname.split('/').filter(Boolean);
|
|
58
|
+
const patternParts = pattern.split('/').filter(Boolean);
|
|
59
|
+
let p = 0;
|
|
60
|
+
let q = 0;
|
|
61
|
+
while (p < patternParts.length && q < pathParts.length) {
|
|
62
|
+
const part = patternParts[p];
|
|
63
|
+
if (part === '**')
|
|
64
|
+
return true;
|
|
65
|
+
if (part === '*') {
|
|
66
|
+
p++;
|
|
67
|
+
q++;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (part !== pathParts[q])
|
|
71
|
+
return false;
|
|
72
|
+
p++;
|
|
73
|
+
q++;
|
|
74
|
+
}
|
|
75
|
+
if (p < patternParts.length && patternParts[p] === '**')
|
|
76
|
+
return true;
|
|
77
|
+
return p === patternParts.length && q === pathParts.length;
|
|
78
|
+
}
|
|
79
|
+
export function shouldExcludePath(pathname, config) {
|
|
80
|
+
if (config.exclude?.length && pathMatchesGlobs(pathname, config.exclude))
|
|
81
|
+
return true;
|
|
82
|
+
if (config.include?.length && !pathMatchesGlobs(pathname, config.include))
|
|
83
|
+
return true;
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Router (app/) route scanner for Next.js 13+.
|
|
3
|
+
*/
|
|
4
|
+
import type { ParsedRoute } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Recursively scan app directory and collect page routes (paths that have a page.tsx/js).
|
|
7
|
+
*/
|
|
8
|
+
export declare function scanAppRouter(appDir: string, baseSegments?: string[]): ParsedRoute[];
|
|
9
|
+
//# sourceMappingURL=app-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-router.d.ts","sourceRoot":"","sources":["../../src/scanner/app-router.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAsD,MAAM,aAAa,CAAC;AA4CnG;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,WAAW,EAAE,CA0DxF"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Router (app/) route scanner for Next.js 13+.
|
|
3
|
+
*/
|
|
4
|
+
import { readdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
const ROUTE_SEGMENT_NAMES = new Set([
|
|
7
|
+
'page',
|
|
8
|
+
'layout',
|
|
9
|
+
'loading',
|
|
10
|
+
'error',
|
|
11
|
+
'not-found',
|
|
12
|
+
'template',
|
|
13
|
+
'default',
|
|
14
|
+
'route',
|
|
15
|
+
]);
|
|
16
|
+
const FILE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js'];
|
|
17
|
+
function getSegmentType(name) {
|
|
18
|
+
if (ROUTE_SEGMENT_NAMES.has(name))
|
|
19
|
+
return name;
|
|
20
|
+
return 'page'; // folders without page are layout segments, we care about leaf routes
|
|
21
|
+
}
|
|
22
|
+
function parseDynamicSegment(name) {
|
|
23
|
+
if (name.startsWith('[[...') && name.endsWith(']]'))
|
|
24
|
+
return 'optional-catch-all';
|
|
25
|
+
if (name.startsWith('[...') && name.endsWith(']'))
|
|
26
|
+
return 'catch-all';
|
|
27
|
+
if (name.startsWith('[') && name.endsWith(']'))
|
|
28
|
+
return 'dynamic';
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
function isRouteFile(name) {
|
|
32
|
+
const base = name.replace(/\.(tsx?|jsx?)$/, '');
|
|
33
|
+
return ROUTE_SEGMENT_NAMES.has(base);
|
|
34
|
+
}
|
|
35
|
+
function isLayoutOrPageDir(dirPath) {
|
|
36
|
+
try {
|
|
37
|
+
const entries = readdirSync(dirPath);
|
|
38
|
+
return entries.some((e) => {
|
|
39
|
+
const base = e.replace(/\.(tsx?|jsx?)$/, '');
|
|
40
|
+
return base === 'page' || base === 'layout';
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Recursively scan app directory and collect page routes (paths that have a page.tsx/js).
|
|
49
|
+
*/
|
|
50
|
+
export function scanAppRouter(appDir, baseSegments = []) {
|
|
51
|
+
const routes = [];
|
|
52
|
+
let entries;
|
|
53
|
+
try {
|
|
54
|
+
entries = readdirSync(appDir, { withFileTypes: true });
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return routes;
|
|
58
|
+
}
|
|
59
|
+
for (const ent of entries) {
|
|
60
|
+
const fullPath = join(appDir, ent.name);
|
|
61
|
+
const name = ent.name;
|
|
62
|
+
// Skip private / internal
|
|
63
|
+
if (name.startsWith('_') || name.startsWith('.'))
|
|
64
|
+
continue;
|
|
65
|
+
// Skip route groups (parentheses) for path - they don't affect URL
|
|
66
|
+
const segmentName = name.startsWith('(') && name.endsWith(')') ? '' : name;
|
|
67
|
+
// Parallel routes @xxx
|
|
68
|
+
const parallelRoute = name.startsWith('@') ? name : undefined;
|
|
69
|
+
// Intercepting (.) (..) etc.
|
|
70
|
+
const intercepting = /^\(\.\)|^\(\.\.\)/.test(name) ? name : undefined;
|
|
71
|
+
if (ent.isFile()) {
|
|
72
|
+
const base = name.replace(/\.(tsx?|jsx?)$/, '');
|
|
73
|
+
if (base === 'page' || base === 'route') {
|
|
74
|
+
const pathSegments = baseSegments;
|
|
75
|
+
const path = '/' + pathSegments.map(segmentToPath).filter(Boolean).join('/');
|
|
76
|
+
const dynamicType = parseDynamicSegment(segmentName);
|
|
77
|
+
const segments = pathSegments.map((seg) => ({
|
|
78
|
+
name: seg,
|
|
79
|
+
type: 'page',
|
|
80
|
+
relativePath: pathSegments.join('/'),
|
|
81
|
+
dynamicType: parseDynamicSegment(seg),
|
|
82
|
+
}));
|
|
83
|
+
routes.push({
|
|
84
|
+
path: path || '/',
|
|
85
|
+
isDynamic: pathSegments.some((s) => !!parseDynamicSegment(s)),
|
|
86
|
+
segments,
|
|
87
|
+
router: 'app',
|
|
88
|
+
sourcePath: fullPath,
|
|
89
|
+
parallelRoute,
|
|
90
|
+
intercepting,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (ent.isDirectory()) {
|
|
96
|
+
const nextSegments = segmentName ? [...baseSegments, segmentName] : baseSegments;
|
|
97
|
+
const childPath = join(appDir, ent.name);
|
|
98
|
+
// Recurse into layout/page directories
|
|
99
|
+
if (isLayoutOrPageDir(childPath) || segmentName.startsWith('[')) {
|
|
100
|
+
routes.push(...scanAppRouter(childPath, nextSegments));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return routes;
|
|
105
|
+
}
|
|
106
|
+
function segmentToPath(seg) {
|
|
107
|
+
if (seg.startsWith('[[...') && seg.endsWith(']]'))
|
|
108
|
+
return '*' + seg.slice(5, -2);
|
|
109
|
+
if (seg.startsWith('[...') && seg.endsWith(']'))
|
|
110
|
+
return '*' + seg.slice(4, -1);
|
|
111
|
+
if (seg.startsWith('[') && seg.endsWith(']'))
|
|
112
|
+
return ':' + seg.slice(1, -1);
|
|
113
|
+
return seg;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=app-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-router.js","sourceRoot":"","sources":["../../src/scanner/app-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified route scanner for App Router and Pages Router.
|
|
3
|
+
*/
|
|
4
|
+
import type { ParsedRoute, RouterType } from '../types.js';
|
|
5
|
+
export { scanAppRouter } from './app-router.js';
|
|
6
|
+
export { scanPagesRouter } from './pages-router.js';
|
|
7
|
+
export interface ScanProjectOptions {
|
|
8
|
+
appDir?: string;
|
|
9
|
+
pagesDir?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function scanProject(projectRoot: string, options?: ScanProjectOptions): {
|
|
12
|
+
routes: ParsedRoute[];
|
|
13
|
+
routerType: RouterType | null;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAC3B;IAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,CA+B1D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified route scanner for App Router and Pages Router.
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { scanAppRouter } from './app-router.js';
|
|
7
|
+
import { scanPagesRouter } from './pages-router.js';
|
|
8
|
+
export { scanAppRouter } from './app-router.js';
|
|
9
|
+
export { scanPagesRouter } from './pages-router.js';
|
|
10
|
+
export function scanProject(projectRoot, options) {
|
|
11
|
+
const appDirPath = join(projectRoot, options?.appDir ?? 'app');
|
|
12
|
+
const pagesDirPath = join(projectRoot, options?.pagesDir ?? 'pages');
|
|
13
|
+
const hasApp = existsSync(appDirPath);
|
|
14
|
+
const hasPages = existsSync(pagesDirPath);
|
|
15
|
+
const routes = [];
|
|
16
|
+
let routerType = null;
|
|
17
|
+
if (hasApp) {
|
|
18
|
+
routes.push(...scanAppRouter(appDirPath));
|
|
19
|
+
routerType = 'app';
|
|
20
|
+
}
|
|
21
|
+
if (hasPages) {
|
|
22
|
+
const pageRoutes = scanPagesRouter(pagesDirPath).filter((r) => !r.sourcePath.includes('/api/'));
|
|
23
|
+
routes.push(...pageRoutes);
|
|
24
|
+
if (!routerType)
|
|
25
|
+
routerType = 'pages';
|
|
26
|
+
}
|
|
27
|
+
// Dedupe by path (app and pages can both exist)
|
|
28
|
+
const seen = new Set();
|
|
29
|
+
const unique = routes.filter((r) => {
|
|
30
|
+
const key = r.path;
|
|
31
|
+
if (seen.has(key))
|
|
32
|
+
return false;
|
|
33
|
+
seen.add(key);
|
|
34
|
+
return true;
|
|
35
|
+
});
|
|
36
|
+
return { routes: unique, routerType };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD,MAAM,UAAU,WAAW,CACzB,WAAmB,EACnB,OAA4B;IAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,UAAU,GAAsB,IAAI,CAAC;IAEzC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1C,UAAU,GAAG,KAAK,CAAC;IACrB,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,MAAM,CACrD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CACvC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAC3B,IAAI,CAAC,UAAU;YAAE,UAAU,GAAG,OAAO,CAAC;IACxC,CAAC;IAED,gDAAgD;IAChD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACjC,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages-router.d.ts","sourceRoot":"","sources":["../../src/scanner/pages-router.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAoC,MAAM,aAAa,CAAC;AAkBjF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,GAAE,MAAM,EAAO,GAAG,WAAW,EAAE,CA0E5F"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pages Router (pages/) route scanner for Next.js.
|
|
3
|
+
*/
|
|
4
|
+
import { readdirSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
const PAGE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js'];
|
|
7
|
+
function parseDynamicSegment(name) {
|
|
8
|
+
if (name.startsWith('[[...') && name.endsWith(']]'))
|
|
9
|
+
return 'optional-catch-all';
|
|
10
|
+
if (name.startsWith('[...') && name.endsWith(']'))
|
|
11
|
+
return 'catch-all';
|
|
12
|
+
if (name.startsWith('[') && name.endsWith(']'))
|
|
13
|
+
return 'dynamic';
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
function segmentToPath(seg) {
|
|
17
|
+
if (seg.startsWith('[[...') && seg.endsWith(']]'))
|
|
18
|
+
return '*' + seg.slice(5, -2);
|
|
19
|
+
if (seg.startsWith('[...') && seg.endsWith(']'))
|
|
20
|
+
return '*' + seg.slice(4, -1);
|
|
21
|
+
if (seg.startsWith('[') && seg.endsWith(']'))
|
|
22
|
+
return ':' + seg.slice(1, -1);
|
|
23
|
+
return seg;
|
|
24
|
+
}
|
|
25
|
+
export function scanPagesRouter(pagesDir, baseSegments = []) {
|
|
26
|
+
const routes = [];
|
|
27
|
+
let entries;
|
|
28
|
+
try {
|
|
29
|
+
entries = readdirSync(pagesDir, { withFileTypes: true }).map((e) => ({
|
|
30
|
+
name: e.name,
|
|
31
|
+
isFile: e.isFile(),
|
|
32
|
+
isDirectory: e.isDirectory(),
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return routes;
|
|
37
|
+
}
|
|
38
|
+
for (const ent of entries) {
|
|
39
|
+
const name = ent.name;
|
|
40
|
+
const fullPath = join(pagesDir, name);
|
|
41
|
+
if (name.startsWith('_') || name.startsWith('.'))
|
|
42
|
+
continue;
|
|
43
|
+
if (name === 'api')
|
|
44
|
+
continue; // skip API routes
|
|
45
|
+
if (ent.isFile) {
|
|
46
|
+
const ext = PAGE_EXTENSIONS.find((e) => name.endsWith(e));
|
|
47
|
+
if (!ext)
|
|
48
|
+
continue;
|
|
49
|
+
const base = name.slice(0, -ext.length);
|
|
50
|
+
if (base !== 'index') {
|
|
51
|
+
const pathSegments = [...baseSegments, base];
|
|
52
|
+
const path = '/' + pathSegments.map(segmentToPath).join('/');
|
|
53
|
+
const segments = pathSegments.map((seg) => ({
|
|
54
|
+
name: seg,
|
|
55
|
+
type: 'page',
|
|
56
|
+
relativePath: pathSegments.join('/'),
|
|
57
|
+
dynamicType: parseDynamicSegment(seg),
|
|
58
|
+
}));
|
|
59
|
+
routes.push({
|
|
60
|
+
path,
|
|
61
|
+
isDynamic: pathSegments.some((s) => !!parseDynamicSegment(s)),
|
|
62
|
+
segments,
|
|
63
|
+
router: 'pages',
|
|
64
|
+
sourcePath: fullPath,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
const path = baseSegments.length ? '/' + baseSegments.map(segmentToPath).join('/') : '/';
|
|
69
|
+
const segments = baseSegments.map((seg) => ({
|
|
70
|
+
name: seg,
|
|
71
|
+
type: 'page',
|
|
72
|
+
relativePath: baseSegments.join('/'),
|
|
73
|
+
dynamicType: parseDynamicSegment(seg),
|
|
74
|
+
}));
|
|
75
|
+
if (baseSegments.length) {
|
|
76
|
+
segments.push({ name: 'index', type: 'page', relativePath: name, dynamicType: undefined });
|
|
77
|
+
}
|
|
78
|
+
routes.push({
|
|
79
|
+
path,
|
|
80
|
+
isDynamic: baseSegments.some((s) => !!parseDynamicSegment(s)),
|
|
81
|
+
segments,
|
|
82
|
+
router: 'pages',
|
|
83
|
+
sourcePath: fullPath,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (ent.isDirectory) {
|
|
89
|
+
const nextSegments = [...baseSegments, name];
|
|
90
|
+
routes.push(...scanPagesRouter(fullPath, nextSegments));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return routes;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=pages-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pages-router.js","sourceRoot":"","sources":["../../src/scanner/pages-router.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route types and metadata for Next.js route detection.
|
|
3
|
+
*/
|
|
4
|
+
export type RouterType = 'app' | 'pages';
|
|
5
|
+
export type RouteSegmentType = 'page' | 'layout' | 'loading' | 'error' | 'not-found' | 'template' | 'default' | 'route';
|
|
6
|
+
export type DynamicSegmentType = 'dynamic' | 'catch-all' | 'optional-catch-all';
|
|
7
|
+
export interface RouteSegment {
|
|
8
|
+
/** File name without extension, e.g. page, layout, [id] */
|
|
9
|
+
name: string;
|
|
10
|
+
type: RouteSegmentType;
|
|
11
|
+
/** For [id], [...slug], [[...slug]] */
|
|
12
|
+
dynamicType?: DynamicSegmentType;
|
|
13
|
+
/** Full path relative to app/ or pages/ */
|
|
14
|
+
relativePath: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ParsedRoute {
|
|
17
|
+
/** URL path pattern, e.g. /posts/[id], /blog/[...slug] */
|
|
18
|
+
path: string;
|
|
19
|
+
/** Whether this is a dynamic route */
|
|
20
|
+
isDynamic: boolean;
|
|
21
|
+
segments: RouteSegment[];
|
|
22
|
+
/** app or pages */
|
|
23
|
+
router: RouterType;
|
|
24
|
+
/** Relative file path from project root */
|
|
25
|
+
sourcePath: string;
|
|
26
|
+
/** Parallel route group, e.g. @modal */
|
|
27
|
+
parallelRoute?: string;
|
|
28
|
+
/** Intercepting route, e.g. (.)(..) */
|
|
29
|
+
intercepting?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface NextMarkdownConfig {
|
|
32
|
+
/** Glob patterns for routes to include (default: ['/**']) */
|
|
33
|
+
include?: string[];
|
|
34
|
+
/** Glob patterns to exclude (default: ['/api/**', '/_next/**']) */
|
|
35
|
+
exclude?: string[];
|
|
36
|
+
/** CSS selectors to remove before converting to markdown */
|
|
37
|
+
cleanSelectors?: string[];
|
|
38
|
+
/** Output format (default: 'markdown') */
|
|
39
|
+
outputMode?: 'markdown';
|
|
40
|
+
/** Enable response caching (default: true) */
|
|
41
|
+
cache?: boolean;
|
|
42
|
+
/** Custom transform functions (markdown string -> markdown string) */
|
|
43
|
+
transformers?: Array<(md: string) => string>;
|
|
44
|
+
/** Base URL for internal fetch (default: from request) */
|
|
45
|
+
baseUrl?: string;
|
|
46
|
+
/** Debug logging */
|
|
47
|
+
debug?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface ProjectDetection {
|
|
50
|
+
isNext: boolean;
|
|
51
|
+
routerType: RouterType | null;
|
|
52
|
+
hasAppDir: boolean;
|
|
53
|
+
hasPagesDir: boolean;
|
|
54
|
+
/** Relative path to app directory, e.g. 'app' or 'src/app' */
|
|
55
|
+
appDir: string | null;
|
|
56
|
+
/** Relative path to pages directory, e.g. 'pages' or 'src/pages' */
|
|
57
|
+
pagesDir: string | null;
|
|
58
|
+
nextVersion?: string;
|
|
59
|
+
middlewarePath: string | null;
|
|
60
|
+
configPath: string | null;
|
|
61
|
+
}
|
|
62
|
+
export interface DoctorReport {
|
|
63
|
+
detected: ProjectDetection;
|
|
64
|
+
routes: ParsedRoute[];
|
|
65
|
+
conflicts: string[];
|
|
66
|
+
issues: string[];
|
|
67
|
+
suggestions: string[];
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;AAEzC,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,QAAQ,GACR,SAAS,GACT,OAAO,GACP,WAAW,GACX,UAAU,GACV,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAEhF,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,CAAC;IACvB,uCAAuC;IACvC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,mBAAmB;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,0CAA0C;IAC1C,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IAC7C,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@accept-md/core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/hemanthvalsaraj/accept-md.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/hemanthvalsaraj/accept-md#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/hemanthvalsaraj/accept-md/issues"
|
|
15
|
+
},
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"dependencies": {},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^20.10.0",
|
|
31
|
+
"typescript": "^5.3.0",
|
|
32
|
+
"vitest": "^1.2.0"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc",
|
|
36
|
+
"clean": "rm -rf dist",
|
|
37
|
+
"lint": "eslint src",
|
|
38
|
+
"test": "vitest run"
|
|
39
|
+
}
|
|
40
|
+
}
|