@yak-io/nextjs 0.7.1 → 0.8.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.
@@ -0,0 +1,266 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
+ // If the importer is in node compatibility mode or this is not an ESM
19
+ // file that has been converted to a CommonJS file using a Babel-
20
+ // compatible transform (i.e. "__esModule" has not been set), then set
21
+ // "default" to the CommonJS "module.exports" for node compatibility.
22
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
+ mod
24
+ ));
25
+
26
+ // src/cli/generate-manifest.ts
27
+ var fs = __toESM(require("node:fs"), 1);
28
+ var path = __toESM(require("node:path"), 1);
29
+ function extractMetadata(filePath) {
30
+ try {
31
+ const content = fs.readFileSync(filePath, "utf-8");
32
+ const metadataMatch = content.match(
33
+ /export\s+const\s+metadata\s*(?::\s*Metadata\s*)?=\s*\{([^}]*(?:\{[^}]*\}[^}]*)*)\}/s
34
+ );
35
+ if (!metadataMatch) {
36
+ return {};
37
+ }
38
+ const metadataBlock = metadataMatch[1];
39
+ const result = {};
40
+ const titleMatch = metadataBlock?.match(/title\s*:\s*["'`]([^"'`]+)["'`]/);
41
+ if (titleMatch?.[1]) {
42
+ result.title = titleMatch[1];
43
+ }
44
+ const descMatch = metadataBlock?.match(/description\s*:\s*["'`]([^"'`]+)["'`]/);
45
+ if (descMatch?.[1]) {
46
+ result.description = descMatch[1];
47
+ }
48
+ return result;
49
+ } catch {
50
+ return {};
51
+ }
52
+ }
53
+ function isRouteGroup(segment) {
54
+ return segment.startsWith("(") && segment.endsWith(")");
55
+ }
56
+ function isOptionalCatchAll(segment) {
57
+ return segment.startsWith("[[...") && segment.endsWith("]]");
58
+ }
59
+ function isRequiredCatchAll(segment) {
60
+ return segment.startsWith("[...") && segment.endsWith("]") && !segment.startsWith("[[");
61
+ }
62
+ function isDynamicSegment(segment) {
63
+ return segment.startsWith("[") && segment.endsWith("]") && !isOptionalCatchAll(segment) && !isRequiredCatchAll(segment);
64
+ }
65
+ function normalizeDynamicSegment(segment) {
66
+ const paramName = segment.slice(1, -1);
67
+ return `:${paramName}`;
68
+ }
69
+ function normalizeRoutePath(segments) {
70
+ const urlSegments = segments.filter((seg) => !isRouteGroup(seg) && !isOptionalCatchAll(seg)).map((seg) => {
71
+ if (isDynamicSegment(seg)) {
72
+ return normalizeDynamicSegment(seg);
73
+ }
74
+ if (isRequiredCatchAll(seg)) {
75
+ const paramName = seg.slice(4, -1);
76
+ return `:${paramName}+`;
77
+ }
78
+ return seg;
79
+ });
80
+ if (urlSegments.length === 0) return "/";
81
+ return `/${urlSegments.join("/")}`;
82
+ }
83
+ function isPageFile(filename) {
84
+ return filename === "page.tsx" || filename === "page.js";
85
+ }
86
+ function scanDirectory(dirPath, segments = []) {
87
+ const routes = [];
88
+ try {
89
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
90
+ for (const entry of entries) {
91
+ const fullPath = path.join(dirPath, entry.name);
92
+ if (entry.isDirectory()) {
93
+ if (entry.name.startsWith("_") || entry.name === "api") {
94
+ continue;
95
+ }
96
+ routes.push(...scanDirectory(fullPath, [...segments, entry.name]));
97
+ } else if (entry.isFile() && isPageFile(entry.name)) {
98
+ const metadata = extractMetadata(fullPath);
99
+ routes.push({
100
+ path: normalizeRoutePath(segments),
101
+ title: metadata.title,
102
+ description: metadata.description
103
+ });
104
+ }
105
+ }
106
+ } catch (error) {
107
+ console.error(`Error scanning directory ${dirPath}:`, error);
108
+ }
109
+ return routes;
110
+ }
111
+ var VALID_PAGE_EXTENSIONS = /* @__PURE__ */ new Set([".js", ".jsx", ".ts", ".tsx", ".md", ".mdx"]);
112
+ var SPECIAL_PAGE_FILENAMES = /* @__PURE__ */ new Set([
113
+ "_app",
114
+ "_document",
115
+ "_error",
116
+ "404",
117
+ "500",
118
+ "middleware",
119
+ "_middleware"
120
+ ]);
121
+ function scanPagesDirectory(dirPath, segments = []) {
122
+ const routes = [];
123
+ try {
124
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
125
+ for (const entry of entries) {
126
+ const fullPath = path.join(dirPath, entry.name);
127
+ if (entry.isDirectory()) {
128
+ if (entry.name.startsWith("_") || entry.name === "api") {
129
+ continue;
130
+ }
131
+ routes.push(...scanPagesDirectory(fullPath, [...segments, entry.name]));
132
+ } else if (entry.isFile()) {
133
+ const extension = path.extname(entry.name);
134
+ if (!VALID_PAGE_EXTENSIONS.has(extension)) {
135
+ continue;
136
+ }
137
+ const baseName = entry.name.slice(0, -extension.length);
138
+ if (!baseName || SPECIAL_PAGE_FILENAMES.has(baseName) || baseName.startsWith("_")) {
139
+ continue;
140
+ }
141
+ const routeSegments = buildPagesSegments(segments, baseName);
142
+ const metadata = extractMetadata(fullPath);
143
+ routes.push({
144
+ path: normalizeRoutePath(routeSegments),
145
+ title: metadata.title,
146
+ description: metadata.description
147
+ });
148
+ }
149
+ }
150
+ } catch (error) {
151
+ console.error(`Error scanning directory ${dirPath}:`, error);
152
+ }
153
+ return routes;
154
+ }
155
+ function buildPagesSegments(segments, baseName) {
156
+ const routeSegments = [...segments];
157
+ if (baseName !== "index") {
158
+ routeSegments.push(baseName);
159
+ }
160
+ return routeSegments;
161
+ }
162
+ function parseArgs() {
163
+ const args = process.argv.slice(2);
164
+ let appDir = "./src/app";
165
+ let pagesDir;
166
+ let output = "./src/yak.routes.ts";
167
+ let help = false;
168
+ for (let i = 0; i < args.length; i++) {
169
+ const arg = args[i];
170
+ if (arg === "--help" || arg === "-h") {
171
+ help = true;
172
+ } else if (arg === "--app-dir" && args[i + 1]) {
173
+ appDir = args[i + 1];
174
+ i++;
175
+ } else if (arg === "--pages-dir" && args[i + 1]) {
176
+ pagesDir = args[i + 1];
177
+ i++;
178
+ } else if (arg === "--output" && args[i + 1]) {
179
+ output = args[i + 1];
180
+ i++;
181
+ }
182
+ }
183
+ return { appDir, pagesDir, output, help };
184
+ }
185
+ function showHelp() {
186
+ console.log(`
187
+ Yak Next.js Route Manifest Generator
188
+
189
+ Scans a Next.js app directory and generates a TypeScript module with route definitions.
190
+
191
+ Usage:
192
+ yak-nextjs generate-manifest [options]
193
+
194
+ Options:
195
+ --app-dir <path> Path to Next.js app directory (default: ./src/app)
196
+ --pages-dir <path> Path to Next.js pages directory (optional)
197
+ --output <path> Output file path (default: ./src/yak.routes.ts)
198
+ --help, -h Show this help message
199
+
200
+ Examples:
201
+ yak-nextjs generate-manifest
202
+ yak-nextjs generate-manifest --app-dir ./app
203
+ yak-nextjs generate-manifest --output ./src/generated/yak.routes.ts
204
+ `);
205
+ }
206
+ function generateTypeScriptModule(routes) {
207
+ const routesJson = JSON.stringify(routes, null, 2);
208
+ return `/**
209
+ * Auto-generated by yak-nextjs generate-manifest
210
+ * DO NOT EDIT - This file is regenerated at build time
211
+ *
212
+ * Generated: ${(/* @__PURE__ */ new Date()).toISOString()}
213
+ */
214
+
215
+ import type { RouteInfo } from "@yak-io/nextjs/server";
216
+
217
+ /**
218
+ * All scanned routes from your Next.js application.
219
+ * Use with createRouteManifestAdapter for filtering options.
220
+ */
221
+ export const routes: RouteInfo[] = ${routesJson} as const;
222
+ `;
223
+ }
224
+ function main() {
225
+ const { appDir, pagesDir, output, help } = parseArgs();
226
+ if (help) {
227
+ showHelp();
228
+ process.exit(0);
229
+ }
230
+ console.log("\u{1F50D} Scanning Next.js page routes...");
231
+ const routes = [];
232
+ const appDirPath = path.resolve(process.cwd(), appDir);
233
+ if (fs.existsSync(appDirPath)) {
234
+ console.log(` App directory: ${appDir}`);
235
+ routes.push(...scanDirectory(appDirPath, []));
236
+ } else {
237
+ console.log(` App directory: ${appDir} (not found, skipping)`);
238
+ }
239
+ if (pagesDir) {
240
+ const pagesDirPath = path.resolve(process.cwd(), pagesDir);
241
+ if (fs.existsSync(pagesDirPath)) {
242
+ console.log(` Pages directory: ${pagesDir}`);
243
+ routes.push(...scanPagesDirectory(pagesDirPath, []));
244
+ } else {
245
+ console.log(` Pages directory: ${pagesDir} (not found, skipping)`);
246
+ }
247
+ }
248
+ if (routes.length === 0) {
249
+ console.error("\u274C Error: No routes found. Check your directory paths.");
250
+ process.exit(1);
251
+ }
252
+ const uniqueRoutes = Array.from(new Map(routes.map((r) => [r.path, r])).values()).sort(
253
+ (a, b) => a.path.localeCompare(b.path)
254
+ );
255
+ const outputPath = path.resolve(process.cwd(), output);
256
+ const outputDir = path.dirname(outputPath);
257
+ if (!fs.existsSync(outputDir)) {
258
+ fs.mkdirSync(outputDir, { recursive: true });
259
+ }
260
+ const content = generateTypeScriptModule(uniqueRoutes);
261
+ fs.writeFileSync(outputPath, content, "utf-8");
262
+ console.log(`\u2705 Generated route manifest with ${uniqueRoutes.length} routes`);
263
+ console.log(` Output: ${outputPath}`);
264
+ }
265
+ main();
266
+ //# sourceMappingURL=generate-manifest.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/cli/generate-manifest.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env node\n\n/**\n * Yak Next.js Route Manifest Generator\n *\n * This CLI tool scans a Next.js app directory and generates a manifest\n * of all available page routes that can be injected into the chat context.\n *\n * Usage:\n * yak-nextjs generate-manifest [options]\n *\n * Options:\n * --app-dir <path> Path to Next.js app directory (default: ./src/app)\n * --pages-dir <path> Path to Next.js pages directory (optional, scanned in addition to app-dir)\n * --output <path> Output file path (default: ./src/yak-routes-manifest.json)\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { RouteInfo } from \"@yak-io/javascript/server\";\n\n/**\n * Extract static metadata (title and description) from a Next.js page file.\n * Parses `export const metadata = { title: \"...\", description: \"...\" }` patterns.\n * Does not support dynamic generateMetadata functions.\n */\nfunction extractMetadata(filePath: string): { title?: string; description?: string } {\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n\n // Match `export const metadata` object\n const metadataMatch = content.match(\n /export\\s+const\\s+metadata\\s*(?::\\s*Metadata\\s*)?=\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}/s\n );\n\n if (!metadataMatch) {\n return {};\n }\n\n const metadataBlock = metadataMatch[1];\n const result: { title?: string; description?: string } = {};\n\n // Extract title - handle both single and double quotes\n const titleMatch = metadataBlock?.match(/title\\s*:\\s*[\"'`]([^\"'`]+)[\"'`]/);\n if (titleMatch?.[1]) {\n result.title = titleMatch[1];\n }\n\n // Extract description - handle both single and double quotes\n const descMatch = metadataBlock?.match(/description\\s*:\\s*[\"'`]([^\"'`]+)[\"'`]/);\n if (descMatch?.[1]) {\n result.description = descMatch[1];\n }\n\n return result;\n } catch {\n return {};\n }\n}\n\n/**\n * Check if a path segment is a route group (organizational only, not part of URL)\n */\nfunction isRouteGroup(segment: string): boolean {\n return segment.startsWith(\"(\") && segment.endsWith(\")\");\n}\n\n/**\n * Check if a path segment is an optional catch-all (e.g., [[...slug]])\n * These segments match the base path without any additional segments\n */\nfunction isOptionalCatchAll(segment: string): boolean {\n return segment.startsWith(\"[[...\") && segment.endsWith(\"]]\");\n}\n\n/**\n * Check if a path segment is a required catch-all (e.g., [...slug])\n * These segments require at least one additional path segment\n */\nfunction isRequiredCatchAll(segment: string): boolean {\n return segment.startsWith(\"[...\") && segment.endsWith(\"]\") && !segment.startsWith(\"[[\");\n}\n\n/**\n * Check if a path segment is a dynamic segment (e.g., [id])\n */\nfunction isDynamicSegment(segment: string): boolean {\n return (\n segment.startsWith(\"[\") &&\n segment.endsWith(\"]\") &&\n !isOptionalCatchAll(segment) &&\n !isRequiredCatchAll(segment)\n );\n}\n\n/**\n * Normalize a dynamic segment for display\n * e.g., [id] \u2192 :id, [postId] \u2192 :postId\n */\nfunction normalizeDynamicSegment(segment: string): string {\n // Extract the parameter name from [name] format\n const paramName = segment.slice(1, -1);\n return `:${paramName}`;\n}\n\n/**\n * Normalize a route path for display (excludes route groups and handles dynamic segments)\n */\nfunction normalizeRoutePath(segments: string[]): string {\n // Filter out route groups - they don't appear in URLs\n // Filter out optional catch-all segments - they match the base path\n const urlSegments = segments\n .filter((seg) => !isRouteGroup(seg) && !isOptionalCatchAll(seg))\n .map((seg) => {\n if (isDynamicSegment(seg)) {\n return normalizeDynamicSegment(seg);\n }\n if (isRequiredCatchAll(seg)) {\n // For required catch-all, extract the name: [...slug] \u2192 :slug+\n const paramName = seg.slice(4, -1);\n return `:${paramName}+`;\n }\n return seg;\n });\n if (urlSegments.length === 0) return \"/\";\n return `/${urlSegments.join(\"/\")}`;\n}\n\n/**\n * Check if file is a page file\n */\nfunction isPageFile(filename: string): boolean {\n return filename === \"page.tsx\" || filename === \"page.js\";\n}\n\n/**\n * Recursively scan a directory for Next.js page routes\n */\nfunction scanDirectory(dirPath: string, segments: string[] = []): RouteInfo[] {\n const routes: RouteInfo[] = [];\n\n try {\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip special Next.js directories and api routes\n if (entry.name.startsWith(\"_\") || entry.name === \"api\") {\n continue;\n }\n\n // Recursively scan subdirectories\n routes.push(...scanDirectory(fullPath, [...segments, entry.name]));\n } else if (entry.isFile() && isPageFile(entry.name)) {\n const metadata = extractMetadata(fullPath);\n\n routes.push({\n path: normalizeRoutePath(segments),\n title: metadata.title,\n description: metadata.description,\n });\n }\n }\n } catch (error) {\n console.error(`Error scanning directory ${dirPath}:`, error);\n }\n\n return routes;\n}\n\n/**\n * File discovery helpers for legacy `pages/` directories\n */\nconst VALID_PAGE_EXTENSIONS = new Set([\".js\", \".jsx\", \".ts\", \".tsx\", \".md\", \".mdx\"]);\nconst SPECIAL_PAGE_FILENAMES = new Set([\n \"_app\",\n \"_document\",\n \"_error\",\n \"404\",\n \"500\",\n \"middleware\",\n \"_middleware\",\n]);\n\n/**\n * Recursively scan a pages directory for Next.js page routes\n */\nfunction scanPagesDirectory(dirPath: string, segments: string[] = []): RouteInfo[] {\n const routes: RouteInfo[] = [];\n\n try {\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip special directories and api routes\n if (entry.name.startsWith(\"_\") || entry.name === \"api\") {\n continue;\n }\n\n routes.push(...scanPagesDirectory(fullPath, [...segments, entry.name]));\n } else if (entry.isFile()) {\n const extension = path.extname(entry.name);\n if (!VALID_PAGE_EXTENSIONS.has(extension)) {\n continue;\n }\n\n const baseName = entry.name.slice(0, -extension.length);\n if (!baseName || SPECIAL_PAGE_FILENAMES.has(baseName) || baseName.startsWith(\"_\")) {\n continue;\n }\n\n const routeSegments = buildPagesSegments(segments, baseName);\n const metadata = extractMetadata(fullPath);\n\n routes.push({\n path: normalizeRoutePath(routeSegments),\n title: metadata.title,\n description: metadata.description,\n });\n }\n }\n } catch (error) {\n console.error(`Error scanning directory ${dirPath}:`, error);\n }\n\n return routes;\n}\n\nfunction buildPagesSegments(segments: string[], baseName: string): string[] {\n const routeSegments = [...segments];\n if (baseName !== \"index\") {\n routeSegments.push(baseName);\n }\n return routeSegments;\n}\n\n/**\n * Parse command-line arguments\n */\nfunction parseArgs(): {\n appDir: string;\n pagesDir: string | undefined;\n output: string;\n help: boolean;\n} {\n const args = process.argv.slice(2);\n let appDir = \"./src/app\";\n let pagesDir: string | undefined;\n // Default to ./src/yak.routes.ts - TypeScript module that gets bundled\n let output = \"./src/yak.routes.ts\";\n let help = false;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === \"--help\" || arg === \"-h\") {\n help = true;\n } else if (arg === \"--app-dir\" && args[i + 1]) {\n appDir = args[i + 1] as string;\n i++;\n } else if (arg === \"--pages-dir\" && args[i + 1]) {\n pagesDir = args[i + 1] as string;\n i++;\n } else if (arg === \"--output\" && args[i + 1]) {\n output = args[i + 1] as string;\n i++;\n }\n }\n\n return { appDir, pagesDir, output, help };\n}\n\n/**\n * Display help message\n */\nfunction showHelp(): void {\n console.log(`\nYak Next.js Route Manifest Generator\n\nScans a Next.js app directory and generates a TypeScript module with route definitions.\n\nUsage:\n yak-nextjs generate-manifest [options]\n\nOptions:\n --app-dir <path> Path to Next.js app directory (default: ./src/app)\n --pages-dir <path> Path to Next.js pages directory (optional)\n --output <path> Output file path (default: ./src/yak.routes.ts)\n --help, -h Show this help message\n\nExamples:\n yak-nextjs generate-manifest\n yak-nextjs generate-manifest --app-dir ./app\n yak-nextjs generate-manifest --output ./src/generated/yak.routes.ts\n `);\n}\n\n/**\n * Generate TypeScript module content\n */\nfunction generateTypeScriptModule(routes: RouteInfo[]): string {\n const routesJson = JSON.stringify(routes, null, 2);\n\n return `/**\n * Auto-generated by yak-nextjs generate-manifest\n * DO NOT EDIT - This file is regenerated at build time\n * \n * Generated: ${new Date().toISOString()}\n */\n\nimport type { RouteInfo } from \"@yak-io/nextjs/server\";\n\n/**\n * All scanned routes from your Next.js application.\n * Use with createRouteManifestAdapter for filtering options.\n */\nexport const routes: RouteInfo[] = ${routesJson} as const;\n`;\n}\n\n/**\n * Main entry point\n */\nfunction main(): void {\n const { appDir, pagesDir, output, help } = parseArgs();\n\n if (help) {\n showHelp();\n process.exit(0);\n }\n\n console.log(\"\uD83D\uDD0D Scanning Next.js page routes...\");\n\n const routes: RouteInfo[] = [];\n\n // Scan app directory\n const appDirPath = path.resolve(process.cwd(), appDir);\n if (fs.existsSync(appDirPath)) {\n console.log(` App directory: ${appDir}`);\n routes.push(...scanDirectory(appDirPath, []));\n } else {\n console.log(` App directory: ${appDir} (not found, skipping)`);\n }\n\n // Scan pages directory if provided\n if (pagesDir) {\n const pagesDirPath = path.resolve(process.cwd(), pagesDir);\n if (fs.existsSync(pagesDirPath)) {\n console.log(` Pages directory: ${pagesDir}`);\n routes.push(...scanPagesDirectory(pagesDirPath, []));\n } else {\n console.log(` Pages directory: ${pagesDir} (not found, skipping)`);\n }\n }\n\n if (routes.length === 0) {\n console.error(\"\u274C Error: No routes found. Check your directory paths.\");\n process.exit(1);\n }\n\n // Deduplicate routes by path (app router takes precedence)\n const uniqueRoutes = Array.from(new Map(routes.map((r) => [r.path, r])).values()).sort((a, b) =>\n a.path.localeCompare(b.path)\n );\n\n const outputPath = path.resolve(process.cwd(), output);\n\n // Ensure output directory exists\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Write TypeScript module\n const content = generateTypeScriptModule(uniqueRoutes);\n fs.writeFileSync(outputPath, content, \"utf-8\");\n\n console.log(`\u2705 Generated route manifest with ${uniqueRoutes.length} routes`);\n console.log(` Output: ${outputPath}`);\n}\n\n// Run the CLI\nmain();\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }