codesift-mcp 0.4.0 → 0.5.3
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/README.md +94 -25
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +8 -6
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/platform.d.ts.map +1 -1
- package/dist/cli/platform.js +12 -14
- package/dist/cli/platform.js.map +1 -1
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +30 -6
- package/dist/cli/setup.js.map +1 -1
- package/dist/formatters.d.ts +2 -2
- package/dist/formatters.d.ts.map +1 -1
- package/dist/formatters.js +23 -0
- package/dist/formatters.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +21 -21
- package/dist/parser/extractors/php.d.ts.map +1 -1
- package/dist/parser/extractors/php.js +37 -29
- package/dist/parser/extractors/php.js.map +1 -1
- package/dist/parser/extractors/typescript.d.ts.map +1 -1
- package/dist/parser/extractors/typescript.js +43 -0
- package/dist/parser/extractors/typescript.js.map +1 -1
- package/dist/parser/parse-cache.d.ts +39 -0
- package/dist/parser/parse-cache.d.ts.map +1 -0
- package/dist/parser/parse-cache.js +87 -0
- package/dist/parser/parse-cache.js.map +1 -0
- package/dist/parser/parser-manager.d.ts +1 -1
- package/dist/parser/parser-manager.d.ts.map +1 -1
- package/dist/parser/parser-manager.js +14 -5
- package/dist/parser/parser-manager.js.map +1 -1
- package/dist/parser/stub-languages.d.ts +2 -0
- package/dist/parser/stub-languages.d.ts.map +1 -0
- package/dist/parser/stub-languages.js +5 -0
- package/dist/parser/stub-languages.js.map +1 -0
- package/dist/register-tool-loaders.d.ts +130 -0
- package/dist/register-tool-loaders.d.ts.map +1 -0
- package/dist/register-tool-loaders.js +212 -0
- package/dist/register-tool-loaders.js.map +1 -0
- package/dist/register-tools.d.ts +2 -2
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +355 -634
- package/dist/register-tools.js.map +1 -1
- package/dist/search/tool-ranker.d.ts +90 -0
- package/dist/search/tool-ranker.d.ts.map +1 -0
- package/dist/search/tool-ranker.js +420 -0
- package/dist/search/tool-ranker.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +23 -14
- package/dist/server.js.map +1 -1
- package/dist/storage/usage-tracker.d.ts.map +1 -1
- package/dist/storage/usage-tracker.js +4 -1
- package/dist/storage/usage-tracker.js.map +1 -1
- package/dist/tools/astro-actions.d.ts +54 -0
- package/dist/tools/astro-actions.d.ts.map +1 -0
- package/dist/tools/astro-actions.js +561 -0
- package/dist/tools/astro-actions.js.map +1 -0
- package/dist/tools/astro-audit.d.ts +87 -0
- package/dist/tools/astro-audit.d.ts.map +1 -0
- package/dist/tools/astro-audit.js +345 -0
- package/dist/tools/astro-audit.js.map +1 -0
- package/dist/tools/astro-content-collections.d.ts +44 -0
- package/dist/tools/astro-content-collections.d.ts.map +1 -0
- package/dist/tools/astro-content-collections.js +630 -0
- package/dist/tools/astro-content-collections.js.map +1 -0
- package/dist/tools/astro-islands.d.ts +3 -1
- package/dist/tools/astro-islands.d.ts.map +1 -1
- package/dist/tools/astro-islands.js +19 -4
- package/dist/tools/astro-islands.js.map +1 -1
- package/dist/tools/astro-migration.d.ts +31 -0
- package/dist/tools/astro-migration.d.ts.map +1 -0
- package/dist/tools/astro-migration.js +378 -0
- package/dist/tools/astro-migration.js.map +1 -0
- package/dist/tools/async-correctness.d.ts +26 -0
- package/dist/tools/async-correctness.d.ts.map +1 -0
- package/dist/tools/async-correctness.js +166 -0
- package/dist/tools/async-correctness.js.map +1 -0
- package/dist/tools/django-view-security-tools.d.ts +32 -0
- package/dist/tools/django-view-security-tools.d.ts.map +1 -0
- package/dist/tools/django-view-security-tools.js +184 -0
- package/dist/tools/django-view-security-tools.js.map +1 -0
- package/dist/tools/fastapi-depends.d.ts +63 -0
- package/dist/tools/fastapi-depends.d.ts.map +1 -0
- package/dist/tools/fastapi-depends.js +191 -0
- package/dist/tools/fastapi-depends.js.map +1 -0
- package/dist/tools/hono-analyze-app.js +1 -9
- package/dist/tools/hono-analyze-app.js.map +1 -1
- package/dist/tools/hono-api-contract.d.ts.map +1 -1
- package/dist/tools/hono-api-contract.js +41 -9
- package/dist/tools/hono-api-contract.js.map +1 -1
- package/dist/tools/hono-context-flow.js +1 -9
- package/dist/tools/hono-context-flow.js.map +1 -1
- package/dist/tools/hono-dead-routes.d.ts.map +1 -1
- package/dist/tools/hono-dead-routes.js +2 -9
- package/dist/tools/hono-dead-routes.js.map +1 -1
- package/dist/tools/hono-entry-resolver.d.ts +27 -0
- package/dist/tools/hono-entry-resolver.d.ts.map +1 -0
- package/dist/tools/hono-entry-resolver.js +31 -0
- package/dist/tools/hono-entry-resolver.js.map +1 -0
- package/dist/tools/hono-inline-analyze.js +1 -9
- package/dist/tools/hono-inline-analyze.js.map +1 -1
- package/dist/tools/hono-middleware-chain.d.ts +24 -6
- package/dist/tools/hono-middleware-chain.d.ts.map +1 -1
- package/dist/tools/hono-middleware-chain.js +77 -40
- package/dist/tools/hono-middleware-chain.js.map +1 -1
- package/dist/tools/hono-modules.js +1 -9
- package/dist/tools/hono-modules.js.map +1 -1
- package/dist/tools/hono-response-types.js +1 -9
- package/dist/tools/hono-response-types.js.map +1 -1
- package/dist/tools/hono-rpc-types.js +1 -9
- package/dist/tools/hono-rpc-types.js.map +1 -1
- package/dist/tools/hono-security.d.ts +14 -4
- package/dist/tools/hono-security.d.ts.map +1 -1
- package/dist/tools/hono-security.js +185 -14
- package/dist/tools/hono-security.js.map +1 -1
- package/dist/tools/hono-visualize.js +1 -9
- package/dist/tools/hono-visualize.js.map +1 -1
- package/dist/tools/nest-ext-tools.d.ts +115 -0
- package/dist/tools/nest-ext-tools.d.ts.map +1 -1
- package/dist/tools/nest-ext-tools.js +393 -0
- package/dist/tools/nest-ext-tools.js.map +1 -1
- package/dist/tools/nest-tools.d.ts +27 -0
- package/dist/tools/nest-tools.d.ts.map +1 -1
- package/dist/tools/nest-tools.js +137 -37
- package/dist/tools/nest-tools.js.map +1 -1
- package/dist/tools/nextjs-component-readers.d.ts +101 -0
- package/dist/tools/nextjs-component-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-component-readers.js +287 -0
- package/dist/tools/nextjs-component-readers.js.map +1 -0
- package/dist/tools/nextjs-component-tools.d.ts +8 -78
- package/dist/tools/nextjs-component-tools.d.ts.map +1 -1
- package/dist/tools/nextjs-component-tools.js +9 -257
- package/dist/tools/nextjs-component-tools.js.map +1 -1
- package/dist/tools/nextjs-framework-audit-tools.d.ts +24 -1
- package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -1
- package/dist/tools/nextjs-framework-audit-tools.js +184 -1
- package/dist/tools/nextjs-framework-audit-tools.js.map +1 -1
- package/dist/tools/nextjs-route-readers.d.ts +81 -0
- package/dist/tools/nextjs-route-readers.d.ts.map +1 -0
- package/dist/tools/nextjs-route-readers.js +340 -0
- package/dist/tools/nextjs-route-readers.js.map +1 -0
- package/dist/tools/nextjs-route-tools.d.ts +7 -71
- package/dist/tools/nextjs-route-tools.d.ts.map +1 -1
- package/dist/tools/nextjs-route-tools.js +9 -327
- package/dist/tools/nextjs-route-tools.js.map +1 -1
- package/dist/tools/pattern-tools.d.ts.map +1 -1
- package/dist/tools/pattern-tools.js +92 -2
- package/dist/tools/pattern-tools.js.map +1 -1
- package/dist/tools/php-tools.d.ts +14 -5
- package/dist/tools/php-tools.d.ts.map +1 -1
- package/dist/tools/php-tools.js +166 -64
- package/dist/tools/php-tools.js.map +1 -1
- package/dist/tools/plan-turn-tools.d.ts +89 -0
- package/dist/tools/plan-turn-tools.d.ts.map +1 -0
- package/dist/tools/plan-turn-tools.js +508 -0
- package/dist/tools/plan-turn-tools.js.map +1 -0
- package/dist/tools/project-tools.d.ts +1 -1
- package/dist/tools/project-tools.js +1 -1
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/pydantic-models.d.ts +46 -0
- package/dist/tools/pydantic-models.d.ts.map +1 -0
- package/dist/tools/pydantic-models.js +249 -0
- package/dist/tools/pydantic-models.js.map +1 -0
- package/dist/tools/python-audit.d.ts +40 -0
- package/dist/tools/python-audit.d.ts.map +1 -0
- package/dist/tools/python-audit.js +244 -0
- package/dist/tools/python-audit.js.map +1 -0
- package/dist/tools/python-constants-tools.d.ts +44 -0
- package/dist/tools/python-constants-tools.d.ts.map +1 -0
- package/dist/tools/python-constants-tools.js +525 -0
- package/dist/tools/python-constants-tools.js.map +1 -0
- package/dist/tools/react-tools.d.ts +46 -1
- package/dist/tools/react-tools.d.ts.map +1 -1
- package/dist/tools/react-tools.js +126 -1
- package/dist/tools/react-tools.js.map +1 -1
- package/dist/tools/review-diff-tools.d.ts +5 -0
- package/dist/tools/review-diff-tools.d.ts.map +1 -1
- package/dist/tools/review-diff-tools.js +109 -3
- package/dist/tools/review-diff-tools.js.map +1 -1
- package/dist/tools/search-tools.d.ts +3 -2
- package/dist/tools/search-tools.d.ts.map +1 -1
- package/dist/tools/search-tools.js +16 -3
- package/dist/tools/search-tools.js.map +1 -1
- package/dist/tools/sql-tools.d.ts +40 -0
- package/dist/tools/sql-tools.d.ts.map +1 -1
- package/dist/tools/sql-tools.js +123 -0
- package/dist/tools/sql-tools.js.map +1 -1
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +7 -10
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/taint-tools.d.ts +43 -0
- package/dist/tools/taint-tools.d.ts.map +1 -0
- package/dist/tools/taint-tools.js +922 -0
- package/dist/tools/taint-tools.js.map +1 -0
- package/dist/utils/import-graph.d.ts +6 -0
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +43 -7
- package/dist/utils/import-graph.js.map +1 -1
- package/package.json +3 -3
- package/rules/codesift.md +51 -13
- package/rules/codesift.mdc +51 -13
- package/rules/codex.md +51 -13
- package/rules/gemini.md +51 -13
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js route readers: AST-based route segment config extraction,
|
|
3
|
+
* rendering strategy classification, and single-file parsing.
|
|
4
|
+
*
|
|
5
|
+
* These readers are pure helpers with no orchestration logic. They are used by
|
|
6
|
+
* `nextjs-route-tools.ts` (orchestrator) and re-exported from it for backward
|
|
7
|
+
* compatibility with existing consumers and tests. Split follows the T2/T3
|
|
8
|
+
* reader + orchestrator precedent.
|
|
9
|
+
*/
|
|
10
|
+
import type Parser from "web-tree-sitter";
|
|
11
|
+
export type RenderingStrategy = "static" | "ssr" | "isr" | "edge" | "client" | "unknown";
|
|
12
|
+
export type RouteEntryType = "page" | "route" | "layout" | "loading" | "error" | "not-found" | "global-error" | "default" | "template" | "parallel" | "intercepting" | "app" | "document" | "error_page";
|
|
13
|
+
export interface RouteSegmentConfig {
|
|
14
|
+
dynamic?: "auto" | "force-dynamic" | "force-static" | "error";
|
|
15
|
+
dynamic_non_literal?: boolean;
|
|
16
|
+
revalidate?: number | false;
|
|
17
|
+
revalidate_non_literal?: boolean;
|
|
18
|
+
runtime?: "nodejs" | "edge";
|
|
19
|
+
runtime_non_literal?: boolean;
|
|
20
|
+
has_generate_static_params: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface NextjsRouteEntry {
|
|
23
|
+
url_path: string;
|
|
24
|
+
file_path: string;
|
|
25
|
+
router: "app" | "pages";
|
|
26
|
+
type: RouteEntryType;
|
|
27
|
+
rendering: RenderingStrategy;
|
|
28
|
+
config: RouteSegmentConfig;
|
|
29
|
+
has_metadata: boolean;
|
|
30
|
+
methods?: string[];
|
|
31
|
+
layout_chain: string[];
|
|
32
|
+
middleware_applies: boolean;
|
|
33
|
+
is_client_component: boolean;
|
|
34
|
+
/** Free-text explanation of *why* a route is SSR. Set only when rendering === "ssr". */
|
|
35
|
+
rendering_reason?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface NextjsRouteConflict {
|
|
38
|
+
url_path: string;
|
|
39
|
+
app: string;
|
|
40
|
+
pages: string;
|
|
41
|
+
}
|
|
42
|
+
export interface PagesRouterSignals {
|
|
43
|
+
hasGetServerSideProps?: boolean;
|
|
44
|
+
hasGetStaticProps?: boolean;
|
|
45
|
+
hasRevalidateInReturn?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Read Next.js route segment config exports from an AST.
|
|
49
|
+
*
|
|
50
|
+
* Recognizes:
|
|
51
|
+
* export const dynamic = "force-dynamic"
|
|
52
|
+
* export const revalidate = 60 | false
|
|
53
|
+
* export const runtime = "edge"
|
|
54
|
+
* export async function generateStaticParams() {...}
|
|
55
|
+
*
|
|
56
|
+
* Non-literal initializers (Identifier, BinaryExpression, etc.) set a
|
|
57
|
+
* `_non_literal` flag and leave the corresponding value `undefined`.
|
|
58
|
+
*
|
|
59
|
+
* @internal exported for unit testing
|
|
60
|
+
*/
|
|
61
|
+
export declare function readRouteSegmentConfig(tree: Parser.Tree, _source: string): RouteSegmentConfig;
|
|
62
|
+
/**
|
|
63
|
+
* Map a route segment config (+ optional Pages Router signals) to a
|
|
64
|
+
* rendering strategy.
|
|
65
|
+
*
|
|
66
|
+
* Priority (App Router): runtime=edge > force-dynamic > force-static >
|
|
67
|
+
* revalidate > generateStaticParams > default (static).
|
|
68
|
+
*
|
|
69
|
+
* Pages Router: getServerSideProps → ssr; getStaticProps + revalidate → isr;
|
|
70
|
+
* getStaticProps → static; otherwise unknown.
|
|
71
|
+
*
|
|
72
|
+
* @internal exported for unit testing
|
|
73
|
+
*/
|
|
74
|
+
export declare function classifyRendering(config: RouteSegmentConfig, router: "app" | "pages", pagesSignals?: PagesRouterSignals): RenderingStrategy;
|
|
75
|
+
/**
|
|
76
|
+
* Process a single route file into a `NextjsRouteEntry`.
|
|
77
|
+
*
|
|
78
|
+
* @internal exported for unit testing
|
|
79
|
+
*/
|
|
80
|
+
export declare function parseRouteFile(filePath: string, repoRoot: string, router: "app" | "pages"): Promise<NextjsRouteEntry>;
|
|
81
|
+
//# sourceMappingURL=nextjs-route-readers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-route-readers.d.ts","sourceRoot":"","sources":["../../src/tools/nextjs-route-readers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAa1C,MAAM,MAAM,iBAAiB,GACzB,QAAQ,GACR,KAAK,GACL,KAAK,GACL,MAAM,GACN,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,SAAS,GACT,OAAO,GACP,WAAW,GACX,cAAc,GACd,SAAS,GACT,UAAU,GACV,UAAU,GACV,cAAc,GACd,KAAK,GACL,UAAU,GACV,YAAY,CAAC;AAEjB,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,cAAc,GAAG,OAAO,CAAC;IAC9D,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,0BAA0B,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC;IACxB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAmBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,OAAO,EAAE,MAAM,GACd,kBAAkB,CA4BpB;AAkDD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,KAAK,GAAG,OAAO,EACvB,YAAY,CAAC,EAAE,kBAAkB,GAChC,iBAAiB,CAkBnB;AAyFD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,KAAK,GAAG,OAAO,GACtB,OAAO,CAAC,gBAAgB,CAAC,CA2G3B"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Next.js route readers: AST-based route segment config extraction,
|
|
3
|
+
* rendering strategy classification, and single-file parsing.
|
|
4
|
+
*
|
|
5
|
+
* These readers are pure helpers with no orchestration logic. They are used by
|
|
6
|
+
* `nextjs-route-tools.ts` (orchestrator) and re-exported from it for backward
|
|
7
|
+
* compatibility with existing consumers and tests. Split follows the T2/T3
|
|
8
|
+
* reader + orchestrator precedent.
|
|
9
|
+
*/
|
|
10
|
+
import { readFile } from "node:fs/promises";
|
|
11
|
+
import { relative, basename } from "node:path";
|
|
12
|
+
import { cachedParseFile as parseFile } from "../utils/nextjs-audit-cache.js";
|
|
13
|
+
import { computeLayoutChain, deriveUrlPath, extractFetchCalls, scanDirective, } from "../utils/nextjs.js";
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Route segment config reader (AST initializer extraction)
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
const KNOWN_CONFIG_NAMES = new Set([
|
|
18
|
+
"dynamic",
|
|
19
|
+
"revalidate",
|
|
20
|
+
"runtime",
|
|
21
|
+
"fetchCache",
|
|
22
|
+
"preferredRegion",
|
|
23
|
+
"maxDuration",
|
|
24
|
+
"dynamicParams",
|
|
25
|
+
]);
|
|
26
|
+
const DYNAMIC_VALUES = new Set(["auto", "force-dynamic", "force-static", "error"]);
|
|
27
|
+
const RUNTIME_VALUES = new Set(["nodejs", "edge"]);
|
|
28
|
+
/**
|
|
29
|
+
* Read Next.js route segment config exports from an AST.
|
|
30
|
+
*
|
|
31
|
+
* Recognizes:
|
|
32
|
+
* export const dynamic = "force-dynamic"
|
|
33
|
+
* export const revalidate = 60 | false
|
|
34
|
+
* export const runtime = "edge"
|
|
35
|
+
* export async function generateStaticParams() {...}
|
|
36
|
+
*
|
|
37
|
+
* Non-literal initializers (Identifier, BinaryExpression, etc.) set a
|
|
38
|
+
* `_non_literal` flag and leave the corresponding value `undefined`.
|
|
39
|
+
*
|
|
40
|
+
* @internal exported for unit testing
|
|
41
|
+
*/
|
|
42
|
+
export function readRouteSegmentConfig(tree, _source) {
|
|
43
|
+
const config = { has_generate_static_params: false };
|
|
44
|
+
const root = tree.rootNode;
|
|
45
|
+
for (const exportNode of root.descendantsOfType("export_statement")) {
|
|
46
|
+
// `export const X = Y` → lexical_declaration > variable_declarator
|
|
47
|
+
for (const decl of exportNode.descendantsOfType("variable_declarator")) {
|
|
48
|
+
const nameNode = decl.childForFieldName("name") ?? decl.namedChild(0);
|
|
49
|
+
if (nameNode?.type !== "identifier")
|
|
50
|
+
continue;
|
|
51
|
+
const name = nameNode.text;
|
|
52
|
+
if (!KNOWN_CONFIG_NAMES.has(name))
|
|
53
|
+
continue;
|
|
54
|
+
const value = decl.childForFieldName("value") ?? decl.namedChild(1);
|
|
55
|
+
if (!value)
|
|
56
|
+
continue;
|
|
57
|
+
readConfigValue(config, name, value);
|
|
58
|
+
}
|
|
59
|
+
// `export async function generateStaticParams() {...}` / `export function ...`
|
|
60
|
+
for (const fn of exportNode.descendantsOfType("function_declaration")) {
|
|
61
|
+
const nameNode = fn.childForFieldName("name") ?? fn.namedChild(0);
|
|
62
|
+
if (nameNode?.type === "identifier" && nameNode.text === "generateStaticParams") {
|
|
63
|
+
config.has_generate_static_params = true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return config;
|
|
68
|
+
}
|
|
69
|
+
function readConfigValue(config, name, value) {
|
|
70
|
+
// String literal
|
|
71
|
+
if (value.type === "string") {
|
|
72
|
+
const frag = value.namedChild(0);
|
|
73
|
+
const text = frag?.type === "string_fragment" ? frag.text : value.text.slice(1, -1);
|
|
74
|
+
if (name === "dynamic" && DYNAMIC_VALUES.has(text)) {
|
|
75
|
+
config.dynamic = text;
|
|
76
|
+
}
|
|
77
|
+
else if (name === "runtime" && RUNTIME_VALUES.has(text)) {
|
|
78
|
+
config.runtime = text;
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Number literal
|
|
83
|
+
if (value.type === "number") {
|
|
84
|
+
const num = parseFloat(value.text);
|
|
85
|
+
if (!Number.isNaN(num) && name === "revalidate") {
|
|
86
|
+
config.revalidate = num;
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// Boolean false literal
|
|
91
|
+
if (value.type === "false") {
|
|
92
|
+
if (name === "revalidate")
|
|
93
|
+
config.revalidate = false;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (value.type === "true") {
|
|
97
|
+
// `revalidate = true` is not a valid Next.js value — ignore
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Any other initializer (Identifier, BinaryExpression, CallExpression, ...)
|
|
101
|
+
// is "non-literal". Flag it so callers know the value is unknowable at
|
|
102
|
+
// static-analysis time.
|
|
103
|
+
if (name === "dynamic")
|
|
104
|
+
config.dynamic_non_literal = true;
|
|
105
|
+
else if (name === "revalidate")
|
|
106
|
+
config.revalidate_non_literal = true;
|
|
107
|
+
else if (name === "runtime")
|
|
108
|
+
config.runtime_non_literal = true;
|
|
109
|
+
}
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// Rendering strategy classification
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
/**
|
|
114
|
+
* Map a route segment config (+ optional Pages Router signals) to a
|
|
115
|
+
* rendering strategy.
|
|
116
|
+
*
|
|
117
|
+
* Priority (App Router): runtime=edge > force-dynamic > force-static >
|
|
118
|
+
* revalidate > generateStaticParams > default (static).
|
|
119
|
+
*
|
|
120
|
+
* Pages Router: getServerSideProps → ssr; getStaticProps + revalidate → isr;
|
|
121
|
+
* getStaticProps → static; otherwise unknown.
|
|
122
|
+
*
|
|
123
|
+
* @internal exported for unit testing
|
|
124
|
+
*/
|
|
125
|
+
export function classifyRendering(config, router, pagesSignals) {
|
|
126
|
+
if (router === "pages") {
|
|
127
|
+
if (pagesSignals?.hasGetServerSideProps)
|
|
128
|
+
return "ssr";
|
|
129
|
+
if (pagesSignals?.hasGetStaticProps) {
|
|
130
|
+
return pagesSignals.hasRevalidateInReturn ? "isr" : "static";
|
|
131
|
+
}
|
|
132
|
+
return "unknown";
|
|
133
|
+
}
|
|
134
|
+
// App Router priority
|
|
135
|
+
if (config.runtime === "edge")
|
|
136
|
+
return "edge";
|
|
137
|
+
if (config.dynamic === "force-dynamic")
|
|
138
|
+
return "ssr";
|
|
139
|
+
if (config.dynamic === "force-static")
|
|
140
|
+
return "static";
|
|
141
|
+
if (typeof config.revalidate === "number" && config.revalidate > 0)
|
|
142
|
+
return "isr";
|
|
143
|
+
if (config.has_generate_static_params)
|
|
144
|
+
return "static";
|
|
145
|
+
// Next.js 15 default: static
|
|
146
|
+
return "static";
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// parseRouteFile — process a single route file into a NextjsRouteEntry
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
const HTTP_METHODS = new Set([
|
|
152
|
+
"GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS",
|
|
153
|
+
]);
|
|
154
|
+
const APP_CONVENTION_TYPES = {
|
|
155
|
+
page: "page",
|
|
156
|
+
route: "route",
|
|
157
|
+
layout: "layout",
|
|
158
|
+
loading: "loading",
|
|
159
|
+
error: "error",
|
|
160
|
+
"not-found": "not-found",
|
|
161
|
+
"global-error": "global-error",
|
|
162
|
+
default: "default",
|
|
163
|
+
template: "template",
|
|
164
|
+
};
|
|
165
|
+
/** Derive a route file's `type` field from its path. */
|
|
166
|
+
function deriveRouteType(filePath, router) {
|
|
167
|
+
const name = basename(filePath).replace(/\.[jt]sx?$/, "");
|
|
168
|
+
if (router === "pages") {
|
|
169
|
+
if (name === "_app")
|
|
170
|
+
return "app";
|
|
171
|
+
if (name === "_document")
|
|
172
|
+
return "document";
|
|
173
|
+
if (name === "_error")
|
|
174
|
+
return "error_page";
|
|
175
|
+
// default for pages/ files: treat api/* as route, otherwise page
|
|
176
|
+
return filePath.includes("/api/") ? "route" : "page";
|
|
177
|
+
}
|
|
178
|
+
// App Router
|
|
179
|
+
if (filePath.includes("/@"))
|
|
180
|
+
return "parallel";
|
|
181
|
+
if (/\/\(\.{1,3}\)/.test(filePath))
|
|
182
|
+
return "intercepting";
|
|
183
|
+
return APP_CONVENTION_TYPES[name] ?? "page";
|
|
184
|
+
}
|
|
185
|
+
/** Detect Pages Router data-fetching signals via exported function/const names. */
|
|
186
|
+
function detectPagesRouterSignals(tree) {
|
|
187
|
+
const signals = {};
|
|
188
|
+
for (const exportNode of tree.rootNode.descendantsOfType("export_statement")) {
|
|
189
|
+
for (const fn of exportNode.descendantsOfType("function_declaration")) {
|
|
190
|
+
const name = (fn.childForFieldName("name") ?? fn.namedChild(0))?.text;
|
|
191
|
+
if (name === "getServerSideProps")
|
|
192
|
+
signals.hasGetServerSideProps = true;
|
|
193
|
+
if (name === "getStaticProps")
|
|
194
|
+
signals.hasGetStaticProps = true;
|
|
195
|
+
}
|
|
196
|
+
for (const decl of exportNode.descendantsOfType("variable_declarator")) {
|
|
197
|
+
const name = (decl.childForFieldName("name") ?? decl.namedChild(0))?.text;
|
|
198
|
+
if (name === "getServerSideProps")
|
|
199
|
+
signals.hasGetServerSideProps = true;
|
|
200
|
+
if (name === "getStaticProps")
|
|
201
|
+
signals.hasGetStaticProps = true;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return signals;
|
|
205
|
+
}
|
|
206
|
+
/** Detect `export const metadata = {...}` or `export function generateMetadata`. */
|
|
207
|
+
function detectMetadataExport(tree) {
|
|
208
|
+
for (const exportNode of tree.rootNode.descendantsOfType("export_statement")) {
|
|
209
|
+
for (const decl of exportNode.descendantsOfType("variable_declarator")) {
|
|
210
|
+
const name = (decl.childForFieldName("name") ?? decl.namedChild(0))?.text;
|
|
211
|
+
if (name === "metadata")
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
for (const fn of exportNode.descendantsOfType("function_declaration")) {
|
|
215
|
+
const name = (fn.childForFieldName("name") ?? fn.namedChild(0))?.text;
|
|
216
|
+
if (name === "generateMetadata")
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
/** Collect HTTP method names from top-level exports of a route.ts file. */
|
|
223
|
+
function extractHttpMethods(tree) {
|
|
224
|
+
const methods = new Set();
|
|
225
|
+
for (const exportNode of tree.rootNode.descendantsOfType("export_statement")) {
|
|
226
|
+
for (const fn of exportNode.descendantsOfType("function_declaration")) {
|
|
227
|
+
const name = (fn.childForFieldName("name") ?? fn.namedChild(0))?.text;
|
|
228
|
+
if (name && HTTP_METHODS.has(name))
|
|
229
|
+
methods.add(name);
|
|
230
|
+
}
|
|
231
|
+
for (const decl of exportNode.descendantsOfType("variable_declarator")) {
|
|
232
|
+
const name = (decl.childForFieldName("name") ?? decl.namedChild(0))?.text;
|
|
233
|
+
if (name && HTTP_METHODS.has(name))
|
|
234
|
+
methods.add(name);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return [...methods];
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Process a single route file into a `NextjsRouteEntry`.
|
|
241
|
+
*
|
|
242
|
+
* @internal exported for unit testing
|
|
243
|
+
*/
|
|
244
|
+
export async function parseRouteFile(filePath, repoRoot, router) {
|
|
245
|
+
const relPath = relative(repoRoot, filePath);
|
|
246
|
+
const type = deriveRouteType(relPath, router);
|
|
247
|
+
const url_path = deriveUrlPath(relPath, router);
|
|
248
|
+
const source = await readFile(filePath, "utf8");
|
|
249
|
+
const tree = await parseFile(filePath, source);
|
|
250
|
+
if (!tree) {
|
|
251
|
+
return {
|
|
252
|
+
url_path,
|
|
253
|
+
file_path: relPath,
|
|
254
|
+
router,
|
|
255
|
+
type,
|
|
256
|
+
rendering: "unknown",
|
|
257
|
+
config: { has_generate_static_params: false },
|
|
258
|
+
has_metadata: false,
|
|
259
|
+
layout_chain: [],
|
|
260
|
+
middleware_applies: false,
|
|
261
|
+
is_client_component: false,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
const config = readRouteSegmentConfig(tree, source);
|
|
265
|
+
const has_metadata = detectMetadataExport(tree);
|
|
266
|
+
let methods;
|
|
267
|
+
if (type === "route") {
|
|
268
|
+
methods = extractHttpMethods(tree);
|
|
269
|
+
}
|
|
270
|
+
const pagesSignals = router === "pages" ? detectPagesRouterSignals(tree) : undefined;
|
|
271
|
+
let rendering = classifyRendering(config, router, pagesSignals);
|
|
272
|
+
// Q2 — detect runtime SSR triggers (cookies/headers/fetch no-store) and
|
|
273
|
+
// upgrade `static` → `ssr` when present, capturing a human-readable reason.
|
|
274
|
+
let rendering_reason;
|
|
275
|
+
if (router === "app") {
|
|
276
|
+
if (rendering === "ssr") {
|
|
277
|
+
// Already SSR — explain why.
|
|
278
|
+
if (config.dynamic === "force-dynamic") {
|
|
279
|
+
rendering_reason = "dynamic='force-dynamic' config export";
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
const fetches = extractFetchCalls(tree, source);
|
|
283
|
+
const noStore = fetches.find((f) => f.callee === "fetch" && f.cacheOption === "no-store");
|
|
284
|
+
if (noStore) {
|
|
285
|
+
rendering_reason = `fetch with cache:'no-store' at line ${noStore.line}`;
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
const dynamicCall = fetches.find((f) => f.callee === "cookies" || f.callee === "headers");
|
|
289
|
+
if (dynamicCall) {
|
|
290
|
+
rendering_reason = `${dynamicCall.callee}() called at line ${dynamicCall.line}`;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
rendering_reason = "unknown SSR trigger";
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else if (rendering === "static") {
|
|
299
|
+
// Maybe upgrade: presence of cookies/headers/fetch no-store implies SSR.
|
|
300
|
+
const fetches = extractFetchCalls(tree, source);
|
|
301
|
+
const noStore = fetches.find((f) => f.callee === "fetch" && f.cacheOption === "no-store");
|
|
302
|
+
if (noStore) {
|
|
303
|
+
rendering = "ssr";
|
|
304
|
+
rendering_reason = `fetch with cache:'no-store' at line ${noStore.line}`;
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
const dynamicCall = fetches.find((f) => f.callee === "cookies" || f.callee === "headers");
|
|
308
|
+
if (dynamicCall) {
|
|
309
|
+
rendering = "ssr";
|
|
310
|
+
rendering_reason = `${dynamicCall.callee}() called at line ${dynamicCall.line}`;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const directive = await scanDirective(filePath);
|
|
316
|
+
const is_client_component = directive === "use client";
|
|
317
|
+
const layout_chain = router === "app"
|
|
318
|
+
? await computeLayoutChain(relPath, repoRoot)
|
|
319
|
+
: [];
|
|
320
|
+
const entry = {
|
|
321
|
+
url_path,
|
|
322
|
+
file_path: relPath,
|
|
323
|
+
router,
|
|
324
|
+
type,
|
|
325
|
+
rendering,
|
|
326
|
+
config,
|
|
327
|
+
has_metadata,
|
|
328
|
+
layout_chain,
|
|
329
|
+
middleware_applies: false, // filled in by orchestrator (Task 30)
|
|
330
|
+
is_client_component,
|
|
331
|
+
};
|
|
332
|
+
if (methods !== undefined) {
|
|
333
|
+
entry.methods = methods;
|
|
334
|
+
}
|
|
335
|
+
if (rendering_reason !== undefined) {
|
|
336
|
+
entry.rendering_reason = rendering_reason;
|
|
337
|
+
}
|
|
338
|
+
return entry;
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=nextjs-route-readers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs-route-readers.js","sourceRoot":"","sources":["../../src/tools/nextjs-route-readers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,eAAe,IAAI,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAoE5B,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,SAAS;IACT,YAAY;IACZ,SAAS;IACT,YAAY;IACZ,iBAAiB;IACjB,aAAa;IACb,eAAe;CAChB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;AACnF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAiB,EACjB,OAAe;IAEf,MAAM,MAAM,GAAuB,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAAC;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;IAE3B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACpE,mEAAmE;QACnE,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACtE,IAAI,QAAQ,EAAE,IAAI,KAAK,YAAY;gBAAE,SAAS;YAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACpE,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,+EAA+E;QAC/E,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACtE,MAAM,QAAQ,GAAG,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAClE,IAAI,QAAQ,EAAE,IAAI,KAAK,YAAY,IAAI,QAAQ,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;gBAChF,MAAM,CAAC,0BAA0B,GAAG,IAAI,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CACtB,MAA0B,EAC1B,IAAY,EACZ,KAAwB;IAExB,iBAAiB;IACjB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,EAAE,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpF,IAAI,IAAI,KAAK,SAAS,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,OAAO,GAAG,IAA2D,CAAC;QAC/E,CAAC;aAAM,IAAI,IAAI,KAAK,SAAS,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,OAAO,GAAG,IAAyB,CAAC;QAC7C,CAAC;QACD,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAChD,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;QAC1B,CAAC;QACD,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,KAAK,YAAY;YAAE,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;QACrD,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,4DAA4D;QAC5D,OAAO;IACT,CAAC;IAED,4EAA4E;IAC5E,uEAAuE;IACvE,wBAAwB;IACxB,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC;SACrD,IAAI,IAAI,KAAK,YAAY;QAAE,MAAM,CAAC,sBAAsB,GAAG,IAAI,CAAC;SAChE,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC;AACjE,CAAC;AAED,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA0B,EAC1B,MAAuB,EACvB,YAAiC;IAEjC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,IAAI,YAAY,EAAE,qBAAqB;YAAE,OAAO,KAAK,CAAC;QACtD,IAAI,YAAY,EAAE,iBAAiB,EAAE,CAAC;YACpC,OAAO,YAAY,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,sBAAsB;IACtB,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc;QAAE,OAAO,QAAQ,CAAC;IACvD,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACjF,IAAI,MAAM,CAAC,0BAA0B;QAAE,OAAO,QAAQ,CAAC;IAEvD,6BAA6B;IAC7B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,uEAAuE;AACvE,8EAA8E;AAE9E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;CAC3D,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAmC;IAC3D,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,WAAW,EAAE,WAAW;IACxB,cAAc,EAAE,cAAc;IAC9B,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,wDAAwD;AACxD,SAAS,eAAe,CAAC,QAAgB,EAAE,MAAuB;IAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAE1D,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QAClC,IAAI,IAAI,KAAK,WAAW;YAAE,OAAO,UAAU,CAAC;QAC5C,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,YAAY,CAAC;QAC3C,iEAAiE;QACjE,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACvD,CAAC;IAED,aAAa;IACb,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAC/C,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,cAAc,CAAC;IAC1D,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;AAC9C,CAAC;AAED,mFAAmF;AACnF,SAAS,wBAAwB,CAAC,IAAiB;IACjD,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7E,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACtE,IAAI,IAAI,KAAK,oBAAoB;gBAAE,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;YACxE,IAAI,IAAI,KAAK,gBAAgB;gBAAE,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAClE,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YAC1E,IAAI,IAAI,KAAK,oBAAoB;gBAAE,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;YACxE,IAAI,IAAI,KAAK,gBAAgB;gBAAE,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAClE,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,oFAAoF;AACpF,SAAS,oBAAoB,CAAC,IAAiB;IAC7C,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7E,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YAC1E,IAAI,IAAI,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC;QACvC,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACtE,IAAI,IAAI,KAAK,kBAAkB;gBAAE,OAAO,IAAI,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,2EAA2E;AAC3E,SAAS,kBAAkB,CAAC,IAAiB;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7E,KAAK,MAAM,EAAE,IAAI,UAAU,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACtE,IAAI,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YAC1E,IAAI,IAAI,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,QAAgB,EAChB,MAAuB;IAEvB,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE/C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,OAAO;YAClB,MAAM;YACN,IAAI;YACJ,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE;YAC7C,YAAY,EAAE,KAAK;YACnB,YAAY,EAAE,EAAE;YAChB,kBAAkB,EAAE,KAAK;YACzB,mBAAmB,EAAE,KAAK;SAC3B,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAEhD,IAAI,OAA6B,CAAC;IAClC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,IAAI,SAAS,GAAG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAEhE,wEAAwE;IACxE,4EAA4E;IAC5E,IAAI,gBAAoC,CAAC;IACzC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,6BAA6B;YAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;gBACvC,gBAAgB,GAAG,uCAAuC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAChD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,WAAW,KAAK,UAAU,CAC5D,CAAC;gBACF,IAAI,OAAO,EAAE,CAAC;oBACZ,gBAAgB,GAAG,uCAAuC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC3E,CAAC;qBAAM,CAAC;oBACN,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CACxD,CAAC;oBACF,IAAI,WAAW,EAAE,CAAC;wBAChB,gBAAgB,GAAG,GAAG,WAAW,CAAC,MAAM,qBAAqB,WAAW,CAAC,IAAI,EAAE,CAAC;oBAClF,CAAC;yBAAM,CAAC;wBACN,gBAAgB,GAAG,qBAAqB,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,yEAAyE;YACzE,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,WAAW,KAAK,UAAU,CAC5D,CAAC;YACF,IAAI,OAAO,EAAE,CAAC;gBACZ,SAAS,GAAG,KAAK,CAAC;gBAClB,gBAAgB,GAAG,uCAAuC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CACxD,CAAC;gBACF,IAAI,WAAW,EAAE,CAAC;oBAChB,SAAS,GAAG,KAAK,CAAC;oBAClB,gBAAgB,GAAG,GAAG,WAAW,CAAC,MAAM,qBAAqB,WAAW,CAAC,IAAI,EAAE,CAAC;gBAClF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,mBAAmB,GAAG,SAAS,KAAK,YAAY,CAAC;IAEvD,MAAM,YAAY,GAAG,MAAM,KAAK,KAAK;QACnC,CAAC,CAAC,MAAM,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC7C,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,KAAK,GAAqB;QAC9B,QAAQ;QACR,SAAS,EAAE,OAAO;QAClB,MAAM;QACN,IAAI;QACJ,SAAS;QACT,MAAM;QACN,YAAY;QACZ,YAAY;QACZ,kBAAkB,EAAE,KAAK,EAAE,sCAAsC;QACjE,mBAAmB;KACpB,CAAC;IACF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;IAC1B,CAAC;IACD,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -2,39 +2,14 @@
|
|
|
2
2
|
* Next.js route map: enumerate all route files (App Router + Pages Router),
|
|
3
3
|
* classify rendering strategy from route segment config, and detect hybrid
|
|
4
4
|
* conflicts where the same URL is served by both routers.
|
|
5
|
+
*
|
|
6
|
+
* This file is the orchestrator. AST reader helpers (`readRouteSegmentConfig`,
|
|
7
|
+
* `classifyRendering`, `parseRouteFile`) live in `nextjs-route-readers.ts` and
|
|
8
|
+
* are re-exported from here for backward compatibility.
|
|
5
9
|
*/
|
|
6
|
-
import type
|
|
7
|
-
export
|
|
8
|
-
export type
|
|
9
|
-
export interface RouteSegmentConfig {
|
|
10
|
-
dynamic?: "auto" | "force-dynamic" | "force-static" | "error";
|
|
11
|
-
dynamic_non_literal?: boolean;
|
|
12
|
-
revalidate?: number | false;
|
|
13
|
-
revalidate_non_literal?: boolean;
|
|
14
|
-
runtime?: "nodejs" | "edge";
|
|
15
|
-
runtime_non_literal?: boolean;
|
|
16
|
-
has_generate_static_params: boolean;
|
|
17
|
-
}
|
|
18
|
-
export interface NextjsRouteEntry {
|
|
19
|
-
url_path: string;
|
|
20
|
-
file_path: string;
|
|
21
|
-
router: "app" | "pages";
|
|
22
|
-
type: RouteEntryType;
|
|
23
|
-
rendering: RenderingStrategy;
|
|
24
|
-
config: RouteSegmentConfig;
|
|
25
|
-
has_metadata: boolean;
|
|
26
|
-
methods?: string[];
|
|
27
|
-
layout_chain: string[];
|
|
28
|
-
middleware_applies: boolean;
|
|
29
|
-
is_client_component: boolean;
|
|
30
|
-
/** Free-text explanation of *why* a route is SSR. Set only when rendering === "ssr". */
|
|
31
|
-
rendering_reason?: string;
|
|
32
|
-
}
|
|
33
|
-
export interface NextjsRouteConflict {
|
|
34
|
-
url_path: string;
|
|
35
|
-
app: string;
|
|
36
|
-
pages: string;
|
|
37
|
-
}
|
|
10
|
+
import type { NextjsRouteEntry, NextjsRouteConflict } from "./nextjs-route-readers.js";
|
|
11
|
+
export { readRouteSegmentConfig, classifyRendering, parseRouteFile, } from "./nextjs-route-readers.js";
|
|
12
|
+
export type { RenderingStrategy, RouteEntryType, RouteSegmentConfig, NextjsRouteEntry, NextjsRouteConflict, PagesRouterSignals, } from "./nextjs-route-readers.js";
|
|
38
13
|
export interface NextjsRouteMapResult {
|
|
39
14
|
routes: NextjsRouteEntry[];
|
|
40
15
|
conflicts: NextjsRouteConflict[];
|
|
@@ -53,45 +28,6 @@ export interface NextjsRouteMapOptions {
|
|
|
53
28
|
include_metadata?: boolean | undefined;
|
|
54
29
|
max_routes?: number | undefined;
|
|
55
30
|
}
|
|
56
|
-
/**
|
|
57
|
-
* Read Next.js route segment config exports from an AST.
|
|
58
|
-
*
|
|
59
|
-
* Recognizes:
|
|
60
|
-
* export const dynamic = "force-dynamic"
|
|
61
|
-
* export const revalidate = 60 | false
|
|
62
|
-
* export const runtime = "edge"
|
|
63
|
-
* export async function generateStaticParams() {...}
|
|
64
|
-
*
|
|
65
|
-
* Non-literal initializers (Identifier, BinaryExpression, etc.) set a
|
|
66
|
-
* `_non_literal` flag and leave the corresponding value `undefined`.
|
|
67
|
-
*
|
|
68
|
-
* @internal exported for unit testing
|
|
69
|
-
*/
|
|
70
|
-
export declare function readRouteSegmentConfig(tree: Parser.Tree, _source: string): RouteSegmentConfig;
|
|
71
|
-
export interface PagesRouterSignals {
|
|
72
|
-
hasGetServerSideProps?: boolean;
|
|
73
|
-
hasGetStaticProps?: boolean;
|
|
74
|
-
hasRevalidateInReturn?: boolean;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Map a route segment config (+ optional Pages Router signals) to a
|
|
78
|
-
* rendering strategy.
|
|
79
|
-
*
|
|
80
|
-
* Priority (App Router): runtime=edge > force-dynamic > force-static >
|
|
81
|
-
* revalidate > generateStaticParams > default (static).
|
|
82
|
-
*
|
|
83
|
-
* Pages Router: getServerSideProps → ssr; getStaticProps + revalidate → isr;
|
|
84
|
-
* getStaticProps → static; otherwise unknown.
|
|
85
|
-
*
|
|
86
|
-
* @internal exported for unit testing
|
|
87
|
-
*/
|
|
88
|
-
export declare function classifyRendering(config: RouteSegmentConfig, router: "app" | "pages", pagesSignals?: PagesRouterSignals): RenderingStrategy;
|
|
89
|
-
/**
|
|
90
|
-
* Process a single route file into a `NextjsRouteEntry`.
|
|
91
|
-
*
|
|
92
|
-
* @internal exported for unit testing
|
|
93
|
-
*/
|
|
94
|
-
export declare function parseRouteFile(filePath: string, repoRoot: string, router: "app" | "pages"): Promise<NextjsRouteEntry>;
|
|
95
31
|
/**
|
|
96
32
|
* Enumerate all Next.js routes (App + Pages Router) with rendering strategy
|
|
97
33
|
* classification and hybrid conflict detection.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs-route-tools.d.ts","sourceRoot":"","sources":["../../src/tools/nextjs-route-tools.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"nextjs-route-tools.d.ts","sourceRoot":"","sources":["../../src/tools/nextjs-route-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGvF,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAMnC,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IACxD,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAgBD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAoJ/B"}
|