@analogjs/vite-plugin-nitro 3.0.0-alpha.1 → 3.0.0-alpha.10

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.
Files changed (50) hide show
  1. package/package.json +5 -9
  2. package/src/index.d.ts +9 -9
  3. package/src/index.js +6 -2
  4. package/src/index.js.map +1 -1
  5. package/src/lib/build-server.d.ts +3 -2
  6. package/src/lib/build-server.js +103 -76
  7. package/src/lib/build-server.js.map +1 -1
  8. package/src/lib/build-sitemap.d.ts +6 -6
  9. package/src/lib/build-sitemap.js +48 -60
  10. package/src/lib/build-sitemap.js.map +1 -1
  11. package/src/lib/build-ssr.d.ts +2 -2
  12. package/src/lib/build-ssr.js +16 -18
  13. package/src/lib/build-ssr.js.map +1 -1
  14. package/src/lib/hooks/post-rendering-hook.d.ts +1 -1
  15. package/src/lib/hooks/post-rendering-hook.js +10 -6
  16. package/src/lib/hooks/post-rendering-hook.js.map +1 -1
  17. package/src/lib/options.d.ts +114 -106
  18. package/src/lib/plugins/dev-server-plugin.d.ts +3 -3
  19. package/src/lib/plugins/dev-server-plugin.js +91 -101
  20. package/src/lib/plugins/dev-server-plugin.js.map +1 -1
  21. package/src/lib/plugins/page-endpoints.d.ts +5 -5
  22. package/src/lib/plugins/page-endpoints.js +28 -63
  23. package/src/lib/plugins/page-endpoints.js.map +1 -1
  24. package/src/lib/utils/get-content-files.d.ts +54 -54
  25. package/src/lib/utils/get-content-files.js +88 -97
  26. package/src/lib/utils/get-content-files.js.map +1 -1
  27. package/src/lib/utils/get-page-handlers.d.ts +58 -58
  28. package/src/lib/utils/get-page-handlers.js +70 -84
  29. package/src/lib/utils/get-page-handlers.js.map +1 -1
  30. package/src/lib/utils/load-esm.d.ts +18 -18
  31. package/src/lib/utils/node-web-bridge.d.ts +1 -1
  32. package/src/lib/utils/node-web-bridge.js +50 -45
  33. package/src/lib/utils/node-web-bridge.js.map +1 -1
  34. package/src/lib/utils/register-dev-middleware.d.ts +12 -12
  35. package/src/lib/utils/register-dev-middleware.js +41 -44
  36. package/src/lib/utils/register-dev-middleware.js.map +1 -1
  37. package/src/lib/utils/renderers.d.ts +50 -39
  38. package/src/lib/utils/renderers.js +69 -56
  39. package/src/lib/utils/renderers.js.map +1 -1
  40. package/src/lib/utils/rolldown.d.ts +2 -0
  41. package/src/lib/utils/rolldown.js +12 -0
  42. package/src/lib/utils/rolldown.js.map +1 -0
  43. package/src/lib/vite-plugin-nitro.d.ts +3 -3
  44. package/src/lib/vite-plugin-nitro.js +493 -577
  45. package/src/lib/vite-plugin-nitro.js.map +1 -1
  46. package/README.md +0 -125
  47. package/src/lib/options.js +0 -2
  48. package/src/lib/options.js.map +0 -1
  49. package/src/lib/utils/load-esm.js +0 -23
  50. package/src/lib/utils/load-esm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"page-endpoints.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/plugins/page-endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,IAAI,EAAE,iDAAiD;QACvD,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,EAAU;YACvC,IAAI,aAAa,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBACvE,MAAM,QAAQ,GAAG,SAAS,CAAC;oBACzB,KAAK,EAAE;wBACL,QAAQ,EAAE,KAAK;wBACf,UAAU,EAAE,EAAE;wBACd,MAAM,EAAE,IAAI;qBACb;oBACD,KAAK,EAAE,KAAK;oBACZ,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,SAAS;oBACnB,MAAM,EAAE,KAAK;oBACb,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;gBAEH,IAAI,WAAW,GAAa,EAAE,CAAC;gBAE/B,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;oBAC7C,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;wBAC/C,WAAW,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;oBACxD,CAAC;gBACH,CAAC;gBAED,mEAAmE;gBACnE,kEAAkE;gBAClE,gEAAgE;gBAChE,6CAA6C;gBAC7C,gEAAgE;gBAChE,wCAAwC;gBACxC,EAAE;gBACF,uEAAuE;gBACvE,uEAAuE;gBACvE,qBAAqB;gBACrB,sDAAsD;gBACtD,kEAAkE;gBAClE,EAAE;gBACF,wEAAwE;gBACxE,8DAA8D;gBAC9D,MAAM,IAAI,GAAG;;;;cAKP,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC1B,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC;kBACA,KAAK;;;kBAIX;;cAGE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAC5B,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC;;;;eAKN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAsCD,CAAC;gBAEJ,OAAO;oBACL,IAAI;oBACJ,GAAG,EAAE,IAAI;iBACV,CAAC;YACJ,CAAC;YAED,OAAO;QACT,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"page-endpoints.js","names":[],"sources":["../../../../../../packages/vite-plugin-nitro/src/lib/plugins/page-endpoints.ts"],"sourcesContent":["import { parseSync } from 'oxc-parser';\nimport { normalizePath } from 'vite';\nimport { SERVER_FETCH_FACTORY_SNIPPET } from '../utils/renderers.js';\n\nexport function pageEndpointsPlugin() {\n return {\n name: 'analogjs-vite-plugin-nitro-rollup-page-endpoint',\n async transform(\n _code: string,\n id: string,\n ): Promise<{ code: string; map: null } | undefined> {\n if (normalizePath(id).includes('/pages/') && id.endsWith('.server.ts')) {\n const result = parseSync(id, _code, {\n sourceType: 'module',\n lang: 'ts',\n });\n\n const fileExports: string[] = result.module.staticExports.flatMap((e) =>\n e.entries\n .filter((entry) => entry.exportName.name !== null)\n .map((entry) => entry.exportName.name as string),\n );\n\n // In h3 v2 / Nitro v3, event.node is undefined during prerendering\n // (which uses the fetch-based pipeline, not Node.js http). We use\n // optional chaining so that page endpoints work in both Node.js\n // server and fetch-based prerender contexts.\n // Nitro v3 no longer guarantees the private `nitro/deps/ofetch`\n // subpath that older codegen relied on.\n //\n // Page loaders expect Nitro-style `$fetch` semantics (parsed data plus\n // internal relative-route support), so construct a request-local fetch\n // using public APIs:\n // - `createFetch` from `ofetch` for `$fetch` behavior\n // - `fetchWithEvent` from `h3` for internal Nitro request routing\n //\n // This avoids both unstable private Nitro imports and assumptions about\n // a global runtime `$fetch` being available during prerender.\n const code = `\n import { defineHandler, fetchWithEvent } from 'nitro/h3';\n import { createFetch } from 'ofetch';\n\n ${\n fileExports.includes('load')\n ? _code\n : `\n ${_code}\n export const load = () => {\n return {};\n }`\n }\n\n ${\n fileExports.includes('action')\n ? ''\n : `\n export const action = () => {\n return {};\n }\n `\n }\n\n export default defineHandler(async(event) => {\n ${SERVER_FETCH_FACTORY_SNIPPET}\n\n if (event.method === 'GET') {\n try {\n return await load({\n params: event.context.params,\n req: event.node?.req,\n res: event.node?.res,\n fetch: serverFetch,\n event\n });\n } catch(e) {\n console.error(\\` An error occurred: \\${e}\\`)\n throw e;\n }\n } else {\n try {\n return await action({\n params: event.context.params,\n req: event.node?.req,\n res: event.node?.res,\n fetch: serverFetch,\n event\n });\n } catch(e) {\n console.error(\\` An error occurred: \\${e}\\`)\n throw e;\n }\n }\n });\n `;\n\n return {\n code,\n map: null,\n };\n }\n\n return;\n },\n };\n}\n"],"mappings":";;;;AAIA,SAAgB,sBAAsB;AACpC,QAAO;EACL,MAAM;EACN,MAAM,UACJ,OACA,IACkD;AAClD,OAAI,cAAc,GAAG,CAAC,SAAS,UAAU,IAAI,GAAG,SAAS,aAAa,EAAE;IAMtE,MAAM,cALS,UAAU,IAAI,OAAO;KAClC,YAAY;KACZ,MAAM;KACP,CAAC,CAEmC,OAAO,cAAc,SAAS,MACjE,EAAE,QACC,QAAQ,UAAU,MAAM,WAAW,SAAS,KAAK,CACjD,KAAK,UAAU,MAAM,WAAW,KAAe,CACnD;AA0ED,WAAO;KACL,MA1DW;;;;cAKP,YAAY,SAAS,OAAO,GACxB,QACA;kBACA,MAAM;;;mBAIX;;cAGC,YAAY,SAAS,SAAS,GAC1B,KACA;;;;gBAKL;;;gBAGG,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkCnC,KAAK;KACN;;;EAKN"}
@@ -1,56 +1,56 @@
1
- import { PrerenderContentFile } from '../options';
1
+ import { PrerenderContentFile } from "../options";
2
2
  /**
3
- * Discovers content files with front matter and extracts metadata for prerendering.
4
- *
5
- * This function:
6
- * 1. Discovers all content files matching the specified glob pattern
7
- * 2. Reads each file and parses front matter metadata
8
- * 3. Extracts file name, extension, and path information
9
- * 4. Returns structured data for prerendering content pages
10
- *
11
- * @param workspaceRoot The workspace root directory path
12
- * @param rootDir The project root directory relative to workspace
13
- * @param glob The glob pattern to match content files (e.g., 'content/blog')
14
- * @returns Array of PrerenderContentFile objects with metadata and front matter
15
- *
16
- * Example usage:
17
- * const contentFiles = getMatchingContentFilesWithFrontMatter(
18
- * '/workspace',
19
- * 'apps/my-app',
20
- * 'content/blog'
21
- * );
22
- *
23
- * Sample discovered file paths:
24
- * - /workspace/apps/my-app/content/blog/first-post.md
25
- * - /workspace/apps/my-app/content/blog/2024/01/hello-world.md
26
- * - /workspace/apps/my-app/content/blog/tech/angular-v17.mdx
27
- * - /workspace/apps/my-app/content/blog/about/index.md
28
- *
29
- * Sample output structure:
30
- * {
31
- * name: 'first-post',
32
- * extension: 'md',
33
- * path: 'content/blog',
34
- * attributes: { title: 'My First Post', date: '2024-01-01', tags: ['intro'] }
35
- * }
36
- *
37
- * tinyglobby vs fast-glob comparison:
38
- * - Both support the same glob patterns for file discovery
39
- * - Both are efficient for finding content files
40
- * - tinyglobby is now used instead of fast-glob
41
- * - tinyglobby provides similar functionality with smaller bundle size
42
- * - tinyglobby's globSync returns absolute paths when absolute: true is set
43
- *
44
- * Front matter parsing:
45
- * - Uses front-matter library to parse YAML/TOML front matter
46
- * - Extracts metadata like title, date, tags, author, etc.
47
- * - Supports both YAML (---) and TOML (+++) delimiters
48
- * - Returns structured attributes for prerendering
49
- *
50
- * File path processing:
51
- * - Normalizes paths for cross-platform compatibility
52
- * - Extracts file name without extension
53
- * - Determines file extension for content type handling
54
- * - Maintains relative path structure for routing
55
- */
3
+ * Discovers content files with front matter and extracts metadata for prerendering.
4
+ *
5
+ * This function:
6
+ * 1. Discovers all content files matching the specified glob pattern
7
+ * 2. Reads each file and parses front matter metadata
8
+ * 3. Extracts file name, extension, and path information
9
+ * 4. Returns structured data for prerendering content pages
10
+ *
11
+ * @param workspaceRoot The workspace root directory path
12
+ * @param rootDir The project root directory relative to workspace
13
+ * @param glob The glob pattern to match content files (e.g., 'content/blog')
14
+ * @returns Array of PrerenderContentFile objects with metadata and front matter
15
+ *
16
+ * Example usage:
17
+ * const contentFiles = getMatchingContentFilesWithFrontMatter(
18
+ * '/workspace',
19
+ * 'apps/my-app',
20
+ * 'content/blog'
21
+ * );
22
+ *
23
+ * Sample discovered file paths:
24
+ * - /workspace/apps/my-app/content/blog/first-post.md
25
+ * - /workspace/apps/my-app/content/blog/2024/01/hello-world.md
26
+ * - /workspace/apps/my-app/content/blog/tech/angular-v17.mdx
27
+ * - /workspace/apps/my-app/content/blog/about/index.md
28
+ *
29
+ * Sample output structure:
30
+ * {
31
+ * name: 'first-post',
32
+ * extension: 'md',
33
+ * path: 'content/blog',
34
+ * attributes: { title: 'My First Post', date: '2024-01-01', tags: ['intro'] }
35
+ * }
36
+ *
37
+ * tinyglobby vs fast-glob comparison:
38
+ * - Both support the same glob patterns for file discovery
39
+ * - Both are efficient for finding content files
40
+ * - tinyglobby is now used instead of fast-glob
41
+ * - tinyglobby provides similar functionality with smaller bundle size
42
+ * - tinyglobby's globSync returns absolute paths when absolute: true is set
43
+ *
44
+ * Front matter parsing:
45
+ * - Uses front-matter library to parse YAML/TOML front matter
46
+ * - Extracts metadata like title, date, tags, author, etc.
47
+ * - Supports both YAML (---) and TOML (+++) delimiters
48
+ * - Returns structured attributes for prerendering
49
+ *
50
+ * File path processing:
51
+ * - Normalizes paths for cross-platform compatibility
52
+ * - Extracts file name without extension
53
+ * - Determines file extension for content type handling
54
+ * - Maintains relative path structure for routing
55
+ */
56
56
  export declare function getMatchingContentFilesWithFrontMatter(workspaceRoot: string, rootDir: string, glob: string): PrerenderContentFile[];
@@ -1,100 +1,91 @@
1
- import { readFileSync } from 'node:fs';
2
- import { join, relative, resolve } from 'node:path';
3
- import { normalizePath } from 'vite';
4
- import { createRequire } from 'node:module';
5
- import { globSync } from 'tinyglobby';
6
- const require = createRequire(import.meta.url);
1
+ import { normalizePath } from "vite";
2
+ import { join, relative, resolve } from "node:path";
3
+ import { readFileSync } from "node:fs";
4
+ import { globSync } from "tinyglobby";
5
+ import { createRequire } from "node:module";
6
+ //#region packages/vite-plugin-nitro/src/lib/utils/get-content-files.ts
7
+ var require = createRequire(import.meta.url);
7
8
  /**
8
- * Discovers content files with front matter and extracts metadata for prerendering.
9
- *
10
- * This function:
11
- * 1. Discovers all content files matching the specified glob pattern
12
- * 2. Reads each file and parses front matter metadata
13
- * 3. Extracts file name, extension, and path information
14
- * 4. Returns structured data for prerendering content pages
15
- *
16
- * @param workspaceRoot The workspace root directory path
17
- * @param rootDir The project root directory relative to workspace
18
- * @param glob The glob pattern to match content files (e.g., 'content/blog')
19
- * @returns Array of PrerenderContentFile objects with metadata and front matter
20
- *
21
- * Example usage:
22
- * const contentFiles = getMatchingContentFilesWithFrontMatter(
23
- * '/workspace',
24
- * 'apps/my-app',
25
- * 'content/blog'
26
- * );
27
- *
28
- * Sample discovered file paths:
29
- * - /workspace/apps/my-app/content/blog/first-post.md
30
- * - /workspace/apps/my-app/content/blog/2024/01/hello-world.md
31
- * - /workspace/apps/my-app/content/blog/tech/angular-v17.mdx
32
- * - /workspace/apps/my-app/content/blog/about/index.md
33
- *
34
- * Sample output structure:
35
- * {
36
- * name: 'first-post',
37
- * extension: 'md',
38
- * path: 'content/blog',
39
- * attributes: { title: 'My First Post', date: '2024-01-01', tags: ['intro'] }
40
- * }
41
- *
42
- * tinyglobby vs fast-glob comparison:
43
- * - Both support the same glob patterns for file discovery
44
- * - Both are efficient for finding content files
45
- * - tinyglobby is now used instead of fast-glob
46
- * - tinyglobby provides similar functionality with smaller bundle size
47
- * - tinyglobby's globSync returns absolute paths when absolute: true is set
48
- *
49
- * Front matter parsing:
50
- * - Uses front-matter library to parse YAML/TOML front matter
51
- * - Extracts metadata like title, date, tags, author, etc.
52
- * - Supports both YAML (---) and TOML (+++) delimiters
53
- * - Returns structured attributes for prerendering
54
- *
55
- * File path processing:
56
- * - Normalizes paths for cross-platform compatibility
57
- * - Extracts file name without extension
58
- * - Determines file extension for content type handling
59
- * - Maintains relative path structure for routing
60
- */
61
- export function getMatchingContentFilesWithFrontMatter(workspaceRoot, rootDir, glob) {
62
- // Dynamically require front-matter library
63
- // eslint-disable-next-line @typescript-eslint/no-var-requires
64
- const fm = require('front-matter');
65
- // Normalize the project root path for consistent path handling
66
- const root = normalizePath(resolve(workspaceRoot, rootDir));
67
- // Resolve the content directory path relative to the project root
68
- const resolvedDir = normalizePath(relative(root, join(root, glob)));
69
- // Discover all content files in the specified directory
70
- // Pattern: looks for any files in the resolved directory
71
- const contentFiles = globSync([`${root}/${resolvedDir}/*`], {
72
- dot: true,
73
- absolute: true,
74
- });
75
- // Process each discovered content file to extract metadata and front matter
76
- const mappedFilesWithFm = contentFiles.map((f) => {
77
- // Read the file contents as UTF-8 text
78
- const fileContents = readFileSync(f, 'utf8');
79
- // Parse front matter from the file content
80
- const raw = fm(fileContents);
81
- const filepath = normalizePath(f).replace(root, '');
82
- const match = filepath.match(/\/([^/.]+)(\.([^/.]+))?$/);
83
- let name = '';
84
- let extension = '';
85
- if (match) {
86
- name = match[1]; // File name without extension
87
- extension = match[3] || ''; // File extension or empty string if no extension
88
- }
89
- // Return structured content file data for prerendering
90
- return {
91
- name,
92
- extension,
93
- path: resolvedDir,
94
- attributes: raw.attributes,
95
- content: fileContents,
96
- };
97
- });
98
- return mappedFilesWithFm;
9
+ * Discovers content files with front matter and extracts metadata for prerendering.
10
+ *
11
+ * This function:
12
+ * 1. Discovers all content files matching the specified glob pattern
13
+ * 2. Reads each file and parses front matter metadata
14
+ * 3. Extracts file name, extension, and path information
15
+ * 4. Returns structured data for prerendering content pages
16
+ *
17
+ * @param workspaceRoot The workspace root directory path
18
+ * @param rootDir The project root directory relative to workspace
19
+ * @param glob The glob pattern to match content files (e.g., 'content/blog')
20
+ * @returns Array of PrerenderContentFile objects with metadata and front matter
21
+ *
22
+ * Example usage:
23
+ * const contentFiles = getMatchingContentFilesWithFrontMatter(
24
+ * '/workspace',
25
+ * 'apps/my-app',
26
+ * 'content/blog'
27
+ * );
28
+ *
29
+ * Sample discovered file paths:
30
+ * - /workspace/apps/my-app/content/blog/first-post.md
31
+ * - /workspace/apps/my-app/content/blog/2024/01/hello-world.md
32
+ * - /workspace/apps/my-app/content/blog/tech/angular-v17.mdx
33
+ * - /workspace/apps/my-app/content/blog/about/index.md
34
+ *
35
+ * Sample output structure:
36
+ * {
37
+ * name: 'first-post',
38
+ * extension: 'md',
39
+ * path: 'content/blog',
40
+ * attributes: { title: 'My First Post', date: '2024-01-01', tags: ['intro'] }
41
+ * }
42
+ *
43
+ * tinyglobby vs fast-glob comparison:
44
+ * - Both support the same glob patterns for file discovery
45
+ * - Both are efficient for finding content files
46
+ * - tinyglobby is now used instead of fast-glob
47
+ * - tinyglobby provides similar functionality with smaller bundle size
48
+ * - tinyglobby's globSync returns absolute paths when absolute: true is set
49
+ *
50
+ * Front matter parsing:
51
+ * - Uses front-matter library to parse YAML/TOML front matter
52
+ * - Extracts metadata like title, date, tags, author, etc.
53
+ * - Supports both YAML (---) and TOML (+++) delimiters
54
+ * - Returns structured attributes for prerendering
55
+ *
56
+ * File path processing:
57
+ * - Normalizes paths for cross-platform compatibility
58
+ * - Extracts file name without extension
59
+ * - Determines file extension for content type handling
60
+ * - Maintains relative path structure for routing
61
+ */
62
+ function getMatchingContentFilesWithFrontMatter(workspaceRoot, rootDir, glob) {
63
+ const fm = require("front-matter");
64
+ const root = normalizePath(resolve(workspaceRoot, rootDir));
65
+ const resolvedDir = normalizePath(relative(root, join(root, glob)));
66
+ return globSync([`${root}/${resolvedDir}/*`], {
67
+ dot: true,
68
+ absolute: true
69
+ }).map((f) => {
70
+ const fileContents = readFileSync(f, "utf8");
71
+ const raw = fm(fileContents);
72
+ const match = normalizePath(f).replace(root, "").match(/\/([^/.]+)(\.([^/.]+))?$/);
73
+ let name = "";
74
+ let extension = "";
75
+ if (match) {
76
+ name = match[1];
77
+ extension = match[3] || "";
78
+ }
79
+ return {
80
+ name,
81
+ extension,
82
+ path: resolvedDir,
83
+ attributes: raw.attributes,
84
+ content: fileContents
85
+ };
86
+ });
99
87
  }
88
+ //#endregion
89
+ export { getMatchingContentFilesWithFrontMatter };
90
+
100
91
  //# sourceMappingURL=get-content-files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-content-files.js","sourceRoot":"","sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/get-content-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,UAAU,sCAAsC,CACpD,aAAqB,EACrB,OAAe,EACf,IAAY;IAEZ,2CAA2C;IAC3C,8DAA8D;IAC9D,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEnC,+DAA+D;IAC/D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5D,kEAAkE;IAClE,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpE,wDAAwD;IACxD,yDAAyD;IACzD,MAAM,YAAY,GAAa,QAAQ,CAAC,CAAC,GAAG,IAAI,IAAI,WAAW,IAAI,CAAC,EAAE;QACpE,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,4EAA4E;IAC5E,MAAM,iBAAiB,GAA2B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACvE,uCAAuC;QACvC,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7C,2CAA2C;QAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;QAE7B,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACzD,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,8BAA8B;YAC/C,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,iDAAiD;QAC/E,CAAC;QAED,uDAAuD;QACvD,OAAO;YACL,IAAI;YACJ,SAAS;YACT,IAAI,EAAE,WAAW;YACjB,UAAU,EAAE,GAAG,CAAC,UAAiD;YACjE,OAAO,EAAE,YAAY;SACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"get-content-files.js","names":[],"sources":["../../../../../../packages/vite-plugin-nitro/src/lib/utils/get-content-files.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { join, relative, resolve } from 'node:path';\nimport { normalizePath } from 'vite';\nimport { createRequire } from 'node:module';\nimport { globSync } from 'tinyglobby';\n\nimport { PrerenderContentFile } from '../options';\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Discovers content files with front matter and extracts metadata for prerendering.\n *\n * This function:\n * 1. Discovers all content files matching the specified glob pattern\n * 2. Reads each file and parses front matter metadata\n * 3. Extracts file name, extension, and path information\n * 4. Returns structured data for prerendering content pages\n *\n * @param workspaceRoot The workspace root directory path\n * @param rootDir The project root directory relative to workspace\n * @param glob The glob pattern to match content files (e.g., 'content/blog')\n * @returns Array of PrerenderContentFile objects with metadata and front matter\n *\n * Example usage:\n * const contentFiles = getMatchingContentFilesWithFrontMatter(\n * '/workspace',\n * 'apps/my-app',\n * 'content/blog'\n * );\n *\n * Sample discovered file paths:\n * - /workspace/apps/my-app/content/blog/first-post.md\n * - /workspace/apps/my-app/content/blog/2024/01/hello-world.md\n * - /workspace/apps/my-app/content/blog/tech/angular-v17.mdx\n * - /workspace/apps/my-app/content/blog/about/index.md\n *\n * Sample output structure:\n * {\n * name: 'first-post',\n * extension: 'md',\n * path: 'content/blog',\n * attributes: { title: 'My First Post', date: '2024-01-01', tags: ['intro'] }\n * }\n *\n * tinyglobby vs fast-glob comparison:\n * - Both support the same glob patterns for file discovery\n * - Both are efficient for finding content files\n * - tinyglobby is now used instead of fast-glob\n * - tinyglobby provides similar functionality with smaller bundle size\n * - tinyglobby's globSync returns absolute paths when absolute: true is set\n *\n * Front matter parsing:\n * - Uses front-matter library to parse YAML/TOML front matter\n * - Extracts metadata like title, date, tags, author, etc.\n * - Supports both YAML (---) and TOML (+++) delimiters\n * - Returns structured attributes for prerendering\n *\n * File path processing:\n * - Normalizes paths for cross-platform compatibility\n * - Extracts file name without extension\n * - Determines file extension for content type handling\n * - Maintains relative path structure for routing\n */\nexport function getMatchingContentFilesWithFrontMatter(\n workspaceRoot: string,\n rootDir: string,\n glob: string,\n): PrerenderContentFile[] {\n // Dynamically require front-matter library\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const fm = require('front-matter');\n\n // Normalize the project root path for consistent path handling\n const root = normalizePath(resolve(workspaceRoot, rootDir));\n\n // Resolve the content directory path relative to the project root\n const resolvedDir = normalizePath(relative(root, join(root, glob)));\n\n // Discover all content files in the specified directory\n // Pattern: looks for any files in the resolved directory\n const contentFiles: string[] = globSync([`${root}/${resolvedDir}/*`], {\n dot: true,\n absolute: true,\n });\n\n // Process each discovered content file to extract metadata and front matter\n const mappedFilesWithFm: PrerenderContentFile[] = contentFiles.map((f) => {\n // Read the file contents as UTF-8 text\n const fileContents = readFileSync(f, 'utf8');\n\n // Parse front matter from the file content\n const raw = fm(fileContents);\n\n const filepath = normalizePath(f).replace(root, '');\n\n const match = filepath.match(/\\/([^/.]+)(\\.([^/.]+))?$/);\n let name = '';\n let extension = '';\n if (match) {\n name = match[1]; // File name without extension\n extension = match[3] || ''; // File extension or empty string if no extension\n }\n\n // Return structured content file data for prerendering\n return {\n name,\n extension,\n path: resolvedDir,\n attributes: raw.attributes as { attributes: Record<string, any> },\n content: fileContents,\n };\n });\n\n return mappedFilesWithFm;\n}\n"],"mappings":";;;;;;AAQA,IAAM,UAAU,cAAc,OAAO,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwD9C,SAAgB,uCACd,eACA,SACA,MACwB;CAGxB,MAAM,KAAK,QAAQ,eAAe;CAGlC,MAAM,OAAO,cAAc,QAAQ,eAAe,QAAQ,CAAC;CAG3D,MAAM,cAAc,cAAc,SAAS,MAAM,KAAK,MAAM,KAAK,CAAC,CAAC;AAqCnE,QAjC+B,SAAS,CAAC,GAAG,KAAK,GAAG,YAAY,IAAI,EAAE;EACpE,KAAK;EACL,UAAU;EACX,CAAC,CAG6D,KAAK,MAAM;EAExE,MAAM,eAAe,aAAa,GAAG,OAAO;EAG5C,MAAM,MAAM,GAAG,aAAa;EAI5B,MAAM,QAFW,cAAc,EAAE,CAAC,QAAQ,MAAM,GAAG,CAE5B,MAAM,2BAA2B;EACxD,IAAI,OAAO;EACX,IAAI,YAAY;AAChB,MAAI,OAAO;AACT,UAAO,MAAM;AACb,eAAY,MAAM,MAAM;;AAI1B,SAAO;GACL;GACA;GACA,MAAM;GACN,YAAY,IAAI;GAChB,SAAS;GACV;GACD"}
@@ -1,62 +1,62 @@
1
- import type { NitroEventHandler } from 'nitro/types';
1
+ import type { NitroEventHandler } from "nitro/types";
2
2
  type GetHandlersArgs = {
3
- workspaceRoot: string;
4
- sourceRoot: string;
5
- rootDir: string;
6
- additionalPagesDirs?: string[];
7
- hasAPIDir?: boolean;
3
+ workspaceRoot: string;
4
+ sourceRoot: string;
5
+ rootDir: string;
6
+ additionalPagesDirs?: string[];
7
+ hasAPIDir?: boolean;
8
8
  };
9
9
  /**
10
- * Discovers and generates Nitro event handlers for server-side page routes.
11
- *
12
- * This function:
13
- * 1. Discovers all .server.ts files in the app/pages directory and additional pages directories
14
- * 2. Converts file paths to route patterns using Angular-style route syntax
15
- * 3. Generates Nitro event handlers with proper route mapping and lazy loading
16
- * 4. Handles dynamic route parameters and catch-all routes
17
- *
18
- * @param workspaceRoot The workspace root directory path
19
- * @param sourceRoot The source directory path (e.g., 'src')
20
- * @param rootDir The project root directory relative to workspace
21
- * @param additionalPagesDirs Optional array of additional pages directories to scan
22
- * @param hasAPIDir Whether the project has an API directory (affects route prefixing)
23
- * @returns Array of NitroEventHandler objects with handler paths and route patterns
24
- *
25
- * Example usage:
26
- * const handlers = getPageHandlers({
27
- * workspaceRoot: '/workspace',
28
- * sourceRoot: 'src',
29
- * rootDir: 'apps/my-app',
30
- * additionalPagesDirs: ['/libs/shared/pages'],
31
- * hasAPIDir: true
32
- * });
33
- *
34
- * Sample discovered file paths:
35
- * - /workspace/apps/my-app/src/app/pages/index.server.ts
36
- * - /workspace/apps/my-app/src/app/pages/users/[id].server.ts
37
- * - /workspace/apps/my-app/src/app/pages/products/[...slug].server.ts
38
- * - /workspace/apps/my-app/src/app/pages/(auth)/login.server.ts
39
- *
40
- * Route transformation examples:
41
- * - index.server.ts → /_analog/pages/index
42
- * - users/[id].server.ts → /_analog/pages/users/:id
43
- * - products/[...slug].server.ts → /_analog/pages/products/**:slug
44
- * - (auth)/login.server.ts → /_analog/pages/-auth-/login
45
- *
46
- * tinyglobby vs fast-glob comparison:
47
- * - Both support the same glob patterns for file discovery
48
- * - Both are efficient for finding server-side page files
49
- * - tinyglobby is now used instead of fast-glob
50
- * - tinyglobby provides similar functionality with smaller bundle size
51
- * - tinyglobby's globSync returns absolute paths when absolute: true is set
52
- *
53
- * Route transformation rules:
54
- * 1. Removes .server.ts extension
55
- * 2. Converts [param] to :param for dynamic routes
56
- * 3. Converts [...param] to **:param for catch-all routes
57
- * 4. Converts (group) to -group- for route groups
58
- * 5. Converts dots to forward slashes
59
- * 6. Prefixes with /_analog/pages and optionally /api
60
- */
61
- export declare function getPageHandlers({ workspaceRoot, sourceRoot, rootDir, additionalPagesDirs, hasAPIDir, }: GetHandlersArgs): NitroEventHandler[];
10
+ * Discovers and generates Nitro event handlers for server-side page routes.
11
+ *
12
+ * This function:
13
+ * 1. Discovers all .server.ts files in the app/pages directory and additional pages directories
14
+ * 2. Converts file paths to route patterns using Angular-style route syntax
15
+ * 3. Generates Nitro event handlers with proper route mapping and lazy loading
16
+ * 4. Handles dynamic route parameters and catch-all routes
17
+ *
18
+ * @param workspaceRoot The workspace root directory path
19
+ * @param sourceRoot The source directory path (e.g., 'src')
20
+ * @param rootDir The project root directory relative to workspace
21
+ * @param additionalPagesDirs Optional array of additional pages directories to scan
22
+ * @param hasAPIDir Whether the project has an API directory (affects route prefixing)
23
+ * @returns Array of NitroEventHandler objects with handler paths and route patterns
24
+ *
25
+ * Example usage:
26
+ * const handlers = getPageHandlers({
27
+ * workspaceRoot: '/workspace',
28
+ * sourceRoot: 'src',
29
+ * rootDir: 'apps/my-app',
30
+ * additionalPagesDirs: ['/libs/shared/pages'],
31
+ * hasAPIDir: true
32
+ * });
33
+ *
34
+ * Sample discovered file paths:
35
+ * - /workspace/apps/my-app/src/app/pages/index.server.ts
36
+ * - /workspace/apps/my-app/src/app/pages/users/[id].server.ts
37
+ * - /workspace/apps/my-app/src/app/pages/products/[...slug].server.ts
38
+ * - /workspace/apps/my-app/src/app/pages/(auth)/login.server.ts
39
+ *
40
+ * Route transformation examples:
41
+ * - index.server.ts → /_analog/pages/index
42
+ * - users/[id].server.ts → /_analog/pages/users/:id
43
+ * - products/[...slug].server.ts → /_analog/pages/products/**:slug
44
+ * - (auth)/login.server.ts → /_analog/pages/-auth-/login
45
+ *
46
+ * tinyglobby vs fast-glob comparison:
47
+ * - Both support the same glob patterns for file discovery
48
+ * - Both are efficient for finding server-side page files
49
+ * - tinyglobby is now used instead of fast-glob
50
+ * - tinyglobby provides similar functionality with smaller bundle size
51
+ * - tinyglobby's globSync returns absolute paths when absolute: true is set
52
+ *
53
+ * Route transformation rules:
54
+ * 1. Removes .server.ts extension
55
+ * 2. Converts [param] to :param for dynamic routes
56
+ * 3. Converts [...param] to **:param for catch-all routes
57
+ * 4. Converts (group) to -group- for route groups
58
+ * 5. Converts dots to forward slashes
59
+ * 6. Prefixes with /_analog/pages and optionally /api
60
+ */
61
+ export declare function getPageHandlers({ workspaceRoot, sourceRoot, rootDir, additionalPagesDirs, hasAPIDir }: GetHandlersArgs): NitroEventHandler[];
62
62
  export {};
@@ -1,87 +1,73 @@
1
- import { resolve } from 'node:path';
2
- import { globSync } from 'tinyglobby';
3
- import { normalizePath } from 'vite';
1
+ import { normalizePath } from "vite";
2
+ import { resolve } from "node:path";
3
+ import { globSync } from "tinyglobby";
4
+ //#region packages/vite-plugin-nitro/src/lib/utils/get-page-handlers.ts
4
5
  /**
5
- * Discovers and generates Nitro event handlers for server-side page routes.
6
- *
7
- * This function:
8
- * 1. Discovers all .server.ts files in the app/pages directory and additional pages directories
9
- * 2. Converts file paths to route patterns using Angular-style route syntax
10
- * 3. Generates Nitro event handlers with proper route mapping and lazy loading
11
- * 4. Handles dynamic route parameters and catch-all routes
12
- *
13
- * @param workspaceRoot The workspace root directory path
14
- * @param sourceRoot The source directory path (e.g., 'src')
15
- * @param rootDir The project root directory relative to workspace
16
- * @param additionalPagesDirs Optional array of additional pages directories to scan
17
- * @param hasAPIDir Whether the project has an API directory (affects route prefixing)
18
- * @returns Array of NitroEventHandler objects with handler paths and route patterns
19
- *
20
- * Example usage:
21
- * const handlers = getPageHandlers({
22
- * workspaceRoot: '/workspace',
23
- * sourceRoot: 'src',
24
- * rootDir: 'apps/my-app',
25
- * additionalPagesDirs: ['/libs/shared/pages'],
26
- * hasAPIDir: true
27
- * });
28
- *
29
- * Sample discovered file paths:
30
- * - /workspace/apps/my-app/src/app/pages/index.server.ts
31
- * - /workspace/apps/my-app/src/app/pages/users/[id].server.ts
32
- * - /workspace/apps/my-app/src/app/pages/products/[...slug].server.ts
33
- * - /workspace/apps/my-app/src/app/pages/(auth)/login.server.ts
34
- *
35
- * Route transformation examples:
36
- * - index.server.ts → /_analog/pages/index
37
- * - users/[id].server.ts → /_analog/pages/users/:id
38
- * - products/[...slug].server.ts → /_analog/pages/products/**:slug
39
- * - (auth)/login.server.ts → /_analog/pages/-auth-/login
40
- *
41
- * tinyglobby vs fast-glob comparison:
42
- * - Both support the same glob patterns for file discovery
43
- * - Both are efficient for finding server-side page files
44
- * - tinyglobby is now used instead of fast-glob
45
- * - tinyglobby provides similar functionality with smaller bundle size
46
- * - tinyglobby's globSync returns absolute paths when absolute: true is set
47
- *
48
- * Route transformation rules:
49
- * 1. Removes .server.ts extension
50
- * 2. Converts [param] to :param for dynamic routes
51
- * 3. Converts [...param] to **:param for catch-all routes
52
- * 4. Converts (group) to -group- for route groups
53
- * 5. Converts dots to forward slashes
54
- * 6. Prefixes with /_analog/pages and optionally /api
55
- */
56
- export function getPageHandlers({ workspaceRoot, sourceRoot, rootDir, additionalPagesDirs, hasAPIDir, }) {
57
- // Normalize the project root path for consistent path handling
58
- const root = normalizePath(resolve(workspaceRoot, rootDir));
59
- // Discover all .server.ts files in the app/pages directory and additional pages directories
60
- // Pattern: looks for any .server.ts files in app/pages/**/*.server.ts and additional directories
61
- const endpointFiles = globSync([
62
- `${root}/${sourceRoot}/app/pages/**/*.server.ts`,
63
- ...(additionalPagesDirs || []).map((dir) => `${workspaceRoot}${dir}/**/*.server.ts`),
64
- ], { dot: true, absolute: true });
65
- // Transform each discovered file into a Nitro event handler
66
- const handlers = endpointFiles.map((endpointFile) => {
67
- // Normalize the endpoint file path for consistent path handling
68
- const normalized = normalizePath(endpointFile);
69
- // Transform the normalized path into a route pattern
70
- const route = normalized
71
- .replace(/^(.*?)\/pages/, '/pages')
72
- .replace(/\.server\.ts$/, '') // Remove .server.ts extension
73
- .replace(/\[\.{3}(.+)\]/g, '**:$1') // Convert [...param] to **:param (catch-all routes)
74
- .replace(/\[\.{3}(\w+)\]/g, '**:$1') // Alternative catch-all pattern
75
- .replace(/\/\((.*?)\)$/, '/-$1-') // Convert (group) to -group- (route groups)
76
- .replace(/\[(\w+)\]/g, ':$1') // Convert [param] to :param (dynamic routes)
77
- .replace(/\./g, '/'); // Convert dots to forward slashes
78
- // Return Nitro event handler with absolute handler path and transformed route
79
- return {
80
- handler: endpointFile,
81
- route: `${hasAPIDir ? '/api' : ''}/_analog${route}`,
82
- lazy: true,
83
- };
84
- });
85
- return handlers;
6
+ * Discovers and generates Nitro event handlers for server-side page routes.
7
+ *
8
+ * This function:
9
+ * 1. Discovers all .server.ts files in the app/pages directory and additional pages directories
10
+ * 2. Converts file paths to route patterns using Angular-style route syntax
11
+ * 3. Generates Nitro event handlers with proper route mapping and lazy loading
12
+ * 4. Handles dynamic route parameters and catch-all routes
13
+ *
14
+ * @param workspaceRoot The workspace root directory path
15
+ * @param sourceRoot The source directory path (e.g., 'src')
16
+ * @param rootDir The project root directory relative to workspace
17
+ * @param additionalPagesDirs Optional array of additional pages directories to scan
18
+ * @param hasAPIDir Whether the project has an API directory (affects route prefixing)
19
+ * @returns Array of NitroEventHandler objects with handler paths and route patterns
20
+ *
21
+ * Example usage:
22
+ * const handlers = getPageHandlers({
23
+ * workspaceRoot: '/workspace',
24
+ * sourceRoot: 'src',
25
+ * rootDir: 'apps/my-app',
26
+ * additionalPagesDirs: ['/libs/shared/pages'],
27
+ * hasAPIDir: true
28
+ * });
29
+ *
30
+ * Sample discovered file paths:
31
+ * - /workspace/apps/my-app/src/app/pages/index.server.ts
32
+ * - /workspace/apps/my-app/src/app/pages/users/[id].server.ts
33
+ * - /workspace/apps/my-app/src/app/pages/products/[...slug].server.ts
34
+ * - /workspace/apps/my-app/src/app/pages/(auth)/login.server.ts
35
+ *
36
+ * Route transformation examples:
37
+ * - index.server.ts → /_analog/pages/index
38
+ * - users/[id].server.ts → /_analog/pages/users/:id
39
+ * - products/[...slug].server.ts → /_analog/pages/products/**:slug
40
+ * - (auth)/login.server.ts → /_analog/pages/-auth-/login
41
+ *
42
+ * tinyglobby vs fast-glob comparison:
43
+ * - Both support the same glob patterns for file discovery
44
+ * - Both are efficient for finding server-side page files
45
+ * - tinyglobby is now used instead of fast-glob
46
+ * - tinyglobby provides similar functionality with smaller bundle size
47
+ * - tinyglobby's globSync returns absolute paths when absolute: true is set
48
+ *
49
+ * Route transformation rules:
50
+ * 1. Removes .server.ts extension
51
+ * 2. Converts [param] to :param for dynamic routes
52
+ * 3. Converts [...param] to **:param for catch-all routes
53
+ * 4. Converts (group) to -group- for route groups
54
+ * 5. Converts dots to forward slashes
55
+ * 6. Prefixes with /_analog/pages and optionally /api
56
+ */
57
+ function getPageHandlers({ workspaceRoot, sourceRoot, rootDir, additionalPagesDirs, hasAPIDir }) {
58
+ return globSync([`${normalizePath(resolve(workspaceRoot, rootDir))}/${sourceRoot}/app/pages/**/*.server.ts`, ...(additionalPagesDirs || []).map((dir) => `${workspaceRoot}${dir}/**/*.server.ts`)], {
59
+ dot: true,
60
+ absolute: true
61
+ }).map((endpointFile) => {
62
+ const route = normalizePath(endpointFile).replace(/^(.*?)\/pages/, "/pages").replace(/\.server\.ts$/, "").replace(/\[\.{3}(.+)\]/g, "**:$1").replace(/\[\.{3}(\w+)\]/g, "**:$1").replace(/\/\((.*?)\)$/, "/-$1-").replace(/\[(\w+)\]/g, ":$1").replace(/\./g, "/");
63
+ return {
64
+ handler: endpointFile,
65
+ route: `${hasAPIDir ? "/api" : ""}/_analog${route}`,
66
+ lazy: true
67
+ };
68
+ });
86
69
  }
70
+ //#endregion
71
+ export { getPageHandlers };
72
+
87
73
  //# sourceMappingURL=get-page-handlers.js.map