@analogjs/platform 3.0.0-alpha.97 → 3.0.0-alpha.98
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/migrations/migrate-setup-testbed-browser-mode/migrate-setup-testbed-browser-mode.d.ts +7 -0
- package/migrations/migrate-setup-testbed-browser-mode/migrate-setup-testbed-browser-mode.js +68 -0
- package/migrations/migrate-setup-testbed-browser-mode/migrate-setup-testbed-browser-mode.js.map +1 -0
- package/migrations/migrate-to-separated-plugins/migrate-to-separated-plugins.js +1 -6
- package/migrations/migrate-to-separated-plugins/migrate-to-separated-plugins.js.map +1 -1
- package/migrations/migrate-vitest-builder-aliases/migrate-vitest-builder-aliases.d.ts +6 -0
- package/migrations/migrate-vitest-builder-aliases/migrate-vitest-builder-aliases.js +62 -0
- package/migrations/migrate-vitest-builder-aliases/migrate-vitest-builder-aliases.js.map +1 -0
- package/migrations/migration.json +10 -0
- package/migrations/utils/source-edits.d.ts +9 -0
- package/migrations/utils/source-edits.js +33 -0
- package/migrations/utils/source-edits.js.map +1 -0
- package/package.json +5 -5
- package/src/lib/nx-plugin/builders.json +1 -2
- package/src/lib/nx-plugin/executors.json +1 -7
- package/src/lib/nx-plugin/generators.json +0 -10
- package/src/lib/nx-plugin/src/generators/app/generator.js +2 -5
- package/src/lib/nx-plugin/src/generators/app/generator.js.map +1 -1
- package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.d.ts +1 -4
- package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.js +2 -5
- package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.js.map +1 -1
- package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.d.ts +6 -6
- package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.js.map +1 -1
- package/src/lib/nx-plugin/src/generators/init/lib/add-analog-dependencies.js +1 -1
- package/src/lib/nx-plugin/src/generators/init/lib/add-analog-dependencies.js.map +1 -1
- package/src/lib/nx-plugin/src/generators/preset/generator.js +2 -5
- package/src/lib/nx-plugin/src/generators/preset/generator.js.map +1 -1
- package/src/lib/nx-plugin/src/utils/versions/dev-dependencies.d.ts +2 -2
- package/src/lib/nx-plugin/src/utils/versions/dev-dependencies.js +7 -10
- package/src/lib/nx-plugin/src/utils/versions/dev-dependencies.js.map +1 -1
- package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.d.ts +6 -10
- package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.js +6 -12
- package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.js.map +1 -1
- package/src/lib/route-file-discovery.js +4 -16
- package/src/lib/route-file-discovery.js.map +1 -1
- package/src/lib/route-idiom-diagnostics.js +2 -11
- package/src/lib/route-idiom-diagnostics.js.map +1 -1
- package/src/lib/route-manifest.d.ts +5 -5
- package/src/lib/route-manifest.js +8 -8
- package/src/lib/route-manifest.js.map +1 -1
- package/src/lib/router-plugin.js +2 -15
- package/src/lib/router-plugin.js.map +1 -1
- package/src/lib/ssr/inject-html-plugin.js +1 -2
- package/src/lib/ssr/inject-html-plugin.js.map +1 -1
- package/src/lib/nx-plugin/src/executors/vitest/compat.d.ts +0 -3
- package/src/lib/nx-plugin/src/executors/vitest/compat.js +0 -8
- package/src/lib/nx-plugin/src/executors/vitest/compat.js.map +0 -1
- package/src/lib/nx-plugin/src/executors/vitest/schema.d.ts +0 -1
- package/src/lib/nx-plugin/src/executors/vitest/schema.json +0 -35
- package/src/lib/nx-plugin/src/executors/vitest/vitest.impl.d.ts +0 -2
- package/src/lib/nx-plugin/src/executors/vitest/vitest.impl.js +0 -7
- package/src/lib/nx-plugin/src/executors/vitest/vitest.impl.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/app/lib/add-analog-dependencies.d.ts +0 -2
- package/src/lib/nx-plugin/src/generators/app/lib/initialize-analog-workspace.d.ts +0 -3
- package/src/lib/nx-plugin/src/generators/app/versions/dependencies.d.ts +0 -5
- package/src/lib/nx-plugin/src/generators/app/versions/dev-dependencies.d.ts +0 -4
- package/src/lib/nx-plugin/src/generators/app/versions/nx-dependencies.d.ts +0 -4
- package/src/lib/nx-plugin/src/generators/setup-vitest/compat.d.ts +0 -9
- package/src/lib/nx-plugin/src/generators/setup-vitest/compat.js +0 -19
- package/src/lib/nx-plugin/src/generators/setup-vitest/compat.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/setup-vitest/files/src/test-setup.ts__template__ +0 -22
- package/src/lib/nx-plugin/src/generators/setup-vitest/files/vite.config.mts__template__ +0 -23
- package/src/lib/nx-plugin/src/generators/setup-vitest/generator.d.ts +0 -4
- package/src/lib/nx-plugin/src/generators/setup-vitest/generator.js +0 -38
- package/src/lib/nx-plugin/src/generators/setup-vitest/generator.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/add-analog-dependencies.d.ts +0 -2
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/add-analog-dependencies.js +0 -11
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/add-analog-dependencies.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-test-target.d.ts +0 -3
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-test-target.js +0 -24
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-test-target.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-tsconfig.d.ts +0 -3
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-tsconfig.js +0 -23
- package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-tsconfig.js.map +0 -1
- package/src/lib/nx-plugin/src/generators/setup-vitest/schema.d.ts +0 -7
- package/src/lib/nx-plugin/src/generators/setup-vitest/schema.json +0 -19
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-plugin.js","names":[],"sources":["../../../src/lib/router-plugin.ts"],"sourcesContent":["import { normalizePath, Plugin, UserConfig, ViteDevServer } from 'vite';\nimport { globSync } from 'tinyglobby';\nimport { readFileSync } from 'node:fs';\nimport { isAbsolute, relative, resolve } from 'node:path';\n\nimport { Options } from './options.js';\nimport {\n analyzeAnalogRouteFile,\n formatAnalogRouteIdiomDiagnostic,\n} from './route-idiom-diagnostics.js';\n\n/**\n * Router plugin that handles route file discovery and hot module replacement.\n *\n * This plugin provides three main functionalities:\n * 1. Route invalidation when files are added/deleted (HMR workaround)\n * 2. Dynamic route file discovery and import generation\n * 3. Content route file discovery for markdown and Analog content\n *\n * @param options Configuration options for the router plugin\n * @returns Array of Vite plugins for route handling\n *\n * IMPORTANT: This plugin uses tinyglobby for file discovery.\n * Key behavior with { dot: true, absolute: true }:\n * - Returns absolute paths for ALL discovered files\n * - Path normalization is required to match expected output format\n * - Files within project root must use relative paths in object keys\n * - Files outside project root keep absolute paths in object keys\n */\nexport function routerPlugin(options?: Options): Plugin[] {\n const workspaceRoot = normalizePath(\n options?.workspaceRoot ?? process.env['NX_WORKSPACE_ROOT'] ?? process.cwd(),\n );\n let config: UserConfig;\n let root: string;\n // Option dirs are workspace-relative, often written with a leading `/`.\n // Normalize them once into absolute workspace paths so watcher events,\n // glob patterns, and key generation all compare against the same shape.\n const normalizeWatchedDir = (dir: string) => {\n const normalizedDir = normalizePath(\n dir.startsWith(`${workspaceRoot}/`) || dir === workspaceRoot\n ? dir\n : dir.startsWith('/')\n ? `${workspaceRoot}${dir}`\n : resolve(workspaceRoot, dir),\n );\n return normalizedDir.endsWith('/')\n ? normalizedDir.slice(0, -1)\n : normalizedDir;\n };\n // Computed eagerly — these depend only on `options` and `workspaceRoot`,\n // both of which are fixed at construction time.\n const additionalPagesDirs = (options?.additionalPagesDirs || []).map((dir) =>\n normalizeWatchedDir(dir),\n );\n const additionalContentDirs = (options?.additionalContentDirs || []).map(\n (dir) => normalizeWatchedDir(dir),\n );\n // Returns every directory that can contain route-like files. The root-\n // relative entries are only available after the Vite `config` hook sets\n // `root`. The short-form fallbacks (`/app/routes`, etc.) let watcher\n // events match before `config` runs — they cover the common convention\n // where paths start with these prefixes.\n const getRouteLikeDirs = () => [\n ...(root\n ? [\n normalizeWatchedDir(`${root}/app/routes`),\n normalizeWatchedDir(`${root}/src/app/routes`),\n normalizeWatchedDir(`${root}/src/app/pages`),\n normalizeWatchedDir(`${root}/src/content`),\n ]\n : []),\n '/app/routes',\n '/src/app/routes',\n '/src/app/pages',\n '/src/content',\n ...additionalPagesDirs,\n ...additionalContentDirs,\n ];\n // These lists are used repeatedly by transform hooks during serve. Keeping\n // them warm avoids a full glob on every route/content invalidation.\n let routeFilesCache: string[] | undefined;\n let pageRouteFilesCache: string[] | undefined;\n let contentRouteFilesCache: string[] | undefined;\n let endpointFilesCache: string[] | undefined;\n const routeDiagnosticCache = new Map<string, string>();\n const isRouteLikeFile = (path: string) => {\n // Watcher paths from chokidar are already absolute — `normalizePath`\n // (forward-slash only) is sufficient; `resolve()` would be a no-op.\n const normalizedPath = normalizePath(path);\n\n return getRouteLikeDirs().some(\n (dir) => normalizedPath === dir || normalizedPath.startsWith(`${dir}/`),\n );\n };\n const discoverRouteFiles = () => {\n routeFilesCache ??= globSync(\n [\n `${root}/app/routes/**/*.ts`,\n `${root}/src/app/routes/**/*.ts`,\n `${root}/src/app/pages/**/*.page.ts`,\n ...additionalPagesDirs.map((dir) => `${dir}/**/*.page.ts`),\n ],\n { dot: true, absolute: true },\n );\n\n return routeFilesCache;\n };\n const discoverContentRouteFiles = () => {\n contentRouteFilesCache ??= globSync(\n [\n `${root}/src/app/routes/**/*.md`,\n `${root}/src/app/pages/**/*.md`,\n `${root}/src/content/**/*.md`,\n ...additionalContentDirs.map((dir) => `${dir}/**/*.md`),\n ],\n { dot: true, absolute: true },\n );\n\n return contentRouteFilesCache;\n };\n const discoverEndpointFiles = () => {\n endpointFilesCache ??= globSync(\n [\n `${root}/src/app/pages/**/*.server.ts`,\n ...additionalPagesDirs.map((dir) => `${dir}/**/*.server.ts`),\n ],\n { dot: true, absolute: true },\n );\n\n return endpointFilesCache;\n };\n const discoverPageRouteFiles = () => {\n pageRouteFilesCache ??= discoverRouteFiles().filter((file) =>\n file.endsWith('.page.ts'),\n );\n\n return pageRouteFilesCache;\n };\n const invalidateDiscoveryCaches = () => {\n routeFilesCache = undefined;\n pageRouteFilesCache = undefined;\n contentRouteFilesCache = undefined;\n endpointFilesCache = undefined;\n };\n const reportRouteDiagnostics = (path: string) => {\n if (!path.endsWith('.page.ts')) {\n return;\n }\n\n try {\n const code = readFileSync(path, 'utf-8');\n const routeFiles = discoverPageRouteFiles();\n const diagnostics = analyzeAnalogRouteFile({\n filename: path,\n code,\n routeFiles,\n });\n\n const rendered = diagnostics.map((diagnostic) =>\n formatAnalogRouteIdiomDiagnostic(diagnostic, path, workspaceRoot),\n );\n const fingerprint = rendered.join('\\n\\n');\n\n if (!fingerprint) {\n routeDiagnosticCache.delete(path);\n return;\n }\n\n if (routeDiagnosticCache.get(path) === fingerprint) {\n return;\n }\n\n routeDiagnosticCache.set(path, fingerprint);\n rendered.forEach((message) => console.warn(message));\n } catch {\n routeDiagnosticCache.delete(path);\n }\n };\n const getModuleKey = (module: string) => {\n // Before config sets `root`, fall back to workspace-relative keys.\n if (!root) {\n return `/${normalizePath(relative(workspaceRoot, module))}`;\n }\n\n const relToRoot = normalizePath(relative(root, module));\n // Use true path containment instead of a raw prefix check so siblings like\n // `/apps/my-app-tools/...` are not mistaken for files inside `/apps/my-app`.\n const isInRoot = !relToRoot.startsWith('..') && !isAbsolute(relToRoot);\n\n if (isInRoot) {\n return `/${relToRoot}`;\n }\n\n return `/${normalizePath(relative(workspaceRoot, module))}`;\n };\n const invalidateFileModules = (server: ViteDevServer, path: string) => {\n const normalizedPath = normalizePath(path);\n // A newly added page can be discovered before its final contents settle.\n // Invalidate the page module itself so later edits don't keep serving the\n // first incomplete transform from Vite's module graph.\n const fileModules =\n server.moduleGraph.getModulesByFile?.(normalizedPath) ??\n server.moduleGraph.fileToModulesMap.get(normalizedPath);\n\n fileModules?.forEach((mod) => {\n server.moduleGraph.invalidateModule(mod);\n\n mod.importers.forEach((imp) => {\n server.moduleGraph.invalidateModule(imp);\n });\n });\n };\n\n return [\n {\n name: 'analogjs-router-invalidate-routes',\n configureServer(server) {\n /**\n * Invalidates route modules when files are added or deleted.\n * This is a workaround for Vite's HMR limitations with dynamic imports.\n *\n * @param path The file path that was added or deleted\n */\n function invalidateRoutes(\n path: string,\n event: 'add' | 'change' | 'unlink',\n ) {\n if (!isRouteLikeFile(path)) {\n return;\n }\n\n // Add/remove changes the route graph shape, so the discovery caches\n // must be rebuilt. Plain edits can keep using the current file set.\n if (event !== 'change') {\n invalidateDiscoveryCaches();\n }\n\n if (event === 'change') {\n reportRouteDiagnostics(path);\n } else if (event === 'unlink') {\n routeDiagnosticCache.delete(path);\n discoverPageRouteFiles().forEach((file) =>\n reportRouteDiagnostics(file),\n );\n } else {\n discoverPageRouteFiles().forEach((file) =>\n reportRouteDiagnostics(file),\n );\n }\n\n invalidateFileModules(server, path);\n\n // For an in-place edit we only need module invalidation. Keeping the\n // app alive here lets Angular/Vite attempt the narrower HMR path.\n if (event === 'change') {\n return;\n }\n\n server.moduleGraph.fileToModulesMap.forEach((mods) => {\n mods.forEach((mod) => {\n if (mod.id?.includes('analogjs') && mod.id?.includes('fesm')) {\n server.moduleGraph.invalidateModule(mod);\n\n mod.importers.forEach((imp) => {\n server.moduleGraph.invalidateModule(imp);\n });\n }\n });\n });\n\n server.ws.send('analog:debug-full-reload', {\n plugin: 'platform:router-plugin',\n reason: 'route-graph-shape-changed',\n event,\n path,\n });\n server.ws.send({\n type: 'full-reload',\n });\n }\n\n server.watcher.on('add', (path) => invalidateRoutes(path, 'add'));\n server.watcher.on('change', (path) => invalidateRoutes(path, 'change'));\n server.watcher.on('unlink', (path) => invalidateRoutes(path, 'unlink'));\n\n // Vite's watcher only covers the app root by default.\n // additionalPagesDirs / additionalContentDirs live outside the\n // root (e.g. libs/shared/feature in a monorepo), so file\n // add/rename/delete events are never fired for them. Explicitly\n // add these directories to chokidar so route invalidation works.\n for (const dir of [...additionalPagesDirs, ...additionalContentDirs]) {\n server.watcher.add(dir);\n }\n\n discoverPageRouteFiles().forEach((file) =>\n reportRouteDiagnostics(file),\n );\n },\n },\n {\n name: 'analog-glob-routes',\n // enforce: 'post' ensures this transform runs AFTER the Angular compiler\n // plugin, which replaces module content with its own compiled output.\n // Without this, the Angular plugin would overwrite the route replacements.\n enforce: 'post',\n config(_config) {\n config = _config;\n root = normalizePath(resolve(workspaceRoot, config.root || '.') || '.');\n },\n /**\n * Transforms code to replace ANALOG_ROUTE_FILES and ANALOG_CONTENT_ROUTE_FILES\n * placeholders with actual dynamic imports of discovered route and content files.\n *\n * @param code The source code to transform\n * @returns Transformed code with dynamic imports or undefined if no transformation needed\n */\n // Vite 8 / Rolldown filtered transform: the `filter.code` substring\n // pre-filter lets the bundler skip modules that don't contain the\n // marker. '_ROUTE_FILES' is a common substring of both\n // 'ANALOG_ROUTE_FILES' and 'ANALOG_CONTENT_ROUTE_FILES'.\n //\n // IMPORTANT: Do NOT change this to 'ANALOG_ROUTE_FILES' — that is NOT\n // a substring of 'ANALOG_CONTENT_ROUTE_FILES' (they diverge at\n // position 7: 'ANALOG_C...' vs 'ANALOG_R...'). When tsconfig path\n // aliases resolve @analogjs/router and @analogjs/router/content to\n // separate source files, each variable lives in its own module and\n // the filter must match both independently.\n transform: {\n filter: {\n code: '_ROUTE_FILES',\n },\n handler(code) {\n if (\n code.includes('ANALOG_ROUTE_FILES') ||\n code.includes('ANALOG_CONTENT_ROUTE_FILES')\n ) {\n // Discover route files using tinyglobby\n // NOTE: { absolute: true } returns absolute paths for ALL files\n const routeFiles = discoverRouteFiles();\n\n // Discover content files using tinyglobby\n const contentRouteFiles = discoverContentRouteFiles();\n\n let result = code.replace(\n 'ANALOG_ROUTE_FILES = {};',\n `\n ANALOG_ROUTE_FILES = {${routeFiles.map((module) => {\n // Keys are app-root-relative for in-app files,\n // workspace-relative for library files (additionalPagesDirs).\n // import() keeps absolute paths for Vite's module resolution.\n const key = getModuleKey(module);\n return `\"${key}\": () => import('${module}')`;\n })}};\n `,\n );\n\n result = result.replace(\n 'ANALOG_CONTENT_ROUTE_FILES = {};',\n `\n ANALOG_CONTENT_ROUTE_FILES = {${contentRouteFiles.map((module) => {\n const key = getModuleKey(module);\n return `\"${key}\": () => import('${module}?analog-content-file=true').then(m => m.default)`;\n })}};\n `,\n );\n\n result = result.replace(\n 'ANALOG_CONTENT_FILE_COUNT = 0',\n `ANALOG_CONTENT_FILE_COUNT = ${contentRouteFiles.length}`,\n );\n\n return {\n code: result,\n map: { mappings: '' },\n };\n }\n\n return;\n },\n },\n },\n {\n name: 'analog-glob-endpoints',\n // enforce: 'post' ensures this transform runs AFTER the Angular compiler\n // plugin, which replaces module content with its own compiled output.\n // Without this, the Angular plugin would overwrite the endpoint replacements.\n enforce: 'post',\n /**\n * Transforms code to replace ANALOG_PAGE_ENDPOINTS placeholder\n * with actual dynamic imports of discovered server endpoint files.\n *\n * @param code The source code to transform\n * @returns Transformed code with dynamic imports or undefined if no transformation needed\n */\n transform: {\n filter: {\n code: 'ANALOG_PAGE_ENDPOINTS',\n },\n handler(code) {\n if (code.includes('ANALOG_PAGE_ENDPOINTS')) {\n // Discover server endpoint files using tinyglobby\n const endpointFiles = discoverEndpointFiles();\n\n const result = code.replace(\n 'ANALOG_PAGE_ENDPOINTS = {};',\n `\n ANALOG_PAGE_ENDPOINTS = {${endpointFiles.map((module) => {\n const key = getModuleKey(module);\n return `\"${key}\": () => import('${module}')`;\n })}};\n `,\n );\n\n return {\n code: result,\n map: { mappings: '' },\n };\n }\n\n return;\n },\n },\n },\n ];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router-plugin.js","names":[],"sources":["../../../src/lib/router-plugin.ts"],"sourcesContent":["import { normalizePath, Plugin, UserConfig, ViteDevServer } from 'vite';\nimport { globSync } from 'tinyglobby';\nimport { readFileSync } from 'node:fs';\nimport { isAbsolute, relative, resolve } from 'node:path';\n\nimport { Options } from './options.js';\nimport {\n analyzeAnalogRouteFile,\n formatAnalogRouteIdiomDiagnostic,\n} from './route-idiom-diagnostics.js';\n\n/**\n * Router plugin that handles route file discovery and hot module replacement.\n *\n * This plugin provides three main functionalities:\n * 1. Route invalidation when files are added/deleted (HMR workaround)\n * 2. Dynamic route file discovery and import generation\n * 3. Content route file discovery for markdown and Analog content\n *\n * @param options Configuration options for the router plugin\n * @returns Array of Vite plugins for route handling\n *\n * IMPORTANT: This plugin uses tinyglobby for file discovery.\n * Key behavior with { dot: true, absolute: true }:\n * - Returns absolute paths for ALL discovered files\n * - Path normalization is required to match expected output format\n * - Files within project root must use relative paths in object keys\n * - Files outside project root keep absolute paths in object keys\n */\nexport function routerPlugin(options?: Options): Plugin[] {\n const workspaceRoot = normalizePath(\n options?.workspaceRoot ?? process.env['NX_WORKSPACE_ROOT'] ?? process.cwd(),\n );\n let config: UserConfig;\n let root: string;\n // Option dirs are workspace-relative, often written with a leading `/`.\n // Normalize them once into absolute workspace paths so watcher events,\n // glob patterns, and key generation all compare against the same shape.\n const normalizeWatchedDir = (dir: string) => {\n const normalizedDir = normalizePath(\n dir.startsWith(`${workspaceRoot}/`) || dir === workspaceRoot\n ? dir\n : dir.startsWith('/')\n ? `${workspaceRoot}${dir}`\n : resolve(workspaceRoot, dir),\n );\n return normalizedDir.endsWith('/')\n ? normalizedDir.slice(0, -1)\n : normalizedDir;\n };\n // Computed eagerly — these depend only on `options` and `workspaceRoot`,\n // both of which are fixed at construction time.\n const additionalPagesDirs = (options?.additionalPagesDirs || []).map((dir) =>\n normalizeWatchedDir(dir),\n );\n const additionalContentDirs = (options?.additionalContentDirs || []).map(\n (dir) => normalizeWatchedDir(dir),\n );\n // Returns every directory that can contain route-like files. The root-\n // relative entries are only available after the Vite `config` hook sets\n // `root`. The short-form fallbacks (`/src/app/pages`, etc.) let watcher\n // events match before `config` runs — they cover the common convention\n // where paths start with these prefixes.\n const getRouteLikeDirs = () => [\n ...(root\n ? [\n normalizeWatchedDir(`${root}/src/app/pages`),\n normalizeWatchedDir(`${root}/src/content`),\n ]\n : []),\n '/src/app/pages',\n '/src/content',\n ...additionalPagesDirs,\n ...additionalContentDirs,\n ];\n // These lists are used repeatedly by transform hooks during serve. Keeping\n // them warm avoids a full glob on every route/content invalidation.\n let routeFilesCache: string[] | undefined;\n let pageRouteFilesCache: string[] | undefined;\n let contentRouteFilesCache: string[] | undefined;\n let endpointFilesCache: string[] | undefined;\n const routeDiagnosticCache = new Map<string, string>();\n const isRouteLikeFile = (path: string) => {\n // Watcher paths from chokidar are already absolute — `normalizePath`\n // (forward-slash only) is sufficient; `resolve()` would be a no-op.\n const normalizedPath = normalizePath(path);\n\n return getRouteLikeDirs().some(\n (dir) => normalizedPath === dir || normalizedPath.startsWith(`${dir}/`),\n );\n };\n const discoverRouteFiles = () => {\n routeFilesCache ??= globSync(\n [\n `${root}/src/app/pages/**/*.page.ts`,\n ...additionalPagesDirs.map((dir) => `${dir}/**/*.page.ts`),\n ],\n { dot: true, absolute: true },\n );\n\n return routeFilesCache;\n };\n const discoverContentRouteFiles = () => {\n contentRouteFilesCache ??= globSync(\n [\n `${root}/src/app/pages/**/*.md`,\n `${root}/src/content/**/*.md`,\n ...additionalContentDirs.map((dir) => `${dir}/**/*.md`),\n ],\n { dot: true, absolute: true },\n );\n\n return contentRouteFilesCache;\n };\n const discoverEndpointFiles = () => {\n endpointFilesCache ??= globSync(\n [\n `${root}/src/app/pages/**/*.server.ts`,\n ...additionalPagesDirs.map((dir) => `${dir}/**/*.server.ts`),\n ],\n { dot: true, absolute: true },\n );\n\n return endpointFilesCache;\n };\n const discoverPageRouteFiles = () => {\n pageRouteFilesCache ??= discoverRouteFiles().filter((file) =>\n file.endsWith('.page.ts'),\n );\n\n return pageRouteFilesCache;\n };\n const invalidateDiscoveryCaches = () => {\n routeFilesCache = undefined;\n pageRouteFilesCache = undefined;\n contentRouteFilesCache = undefined;\n endpointFilesCache = undefined;\n };\n const reportRouteDiagnostics = (path: string) => {\n if (!path.endsWith('.page.ts')) {\n return;\n }\n\n try {\n const code = readFileSync(path, 'utf-8');\n const routeFiles = discoverPageRouteFiles();\n const diagnostics = analyzeAnalogRouteFile({\n filename: path,\n code,\n routeFiles,\n });\n\n const rendered = diagnostics.map((diagnostic) =>\n formatAnalogRouteIdiomDiagnostic(diagnostic, path, workspaceRoot),\n );\n const fingerprint = rendered.join('\\n\\n');\n\n if (!fingerprint) {\n routeDiagnosticCache.delete(path);\n return;\n }\n\n if (routeDiagnosticCache.get(path) === fingerprint) {\n return;\n }\n\n routeDiagnosticCache.set(path, fingerprint);\n rendered.forEach((message) => console.warn(message));\n } catch {\n routeDiagnosticCache.delete(path);\n }\n };\n const getModuleKey = (module: string) => {\n // Before config sets `root`, fall back to workspace-relative keys.\n if (!root) {\n return `/${normalizePath(relative(workspaceRoot, module))}`;\n }\n\n const relToRoot = normalizePath(relative(root, module));\n // Use true path containment instead of a raw prefix check so siblings like\n // `/apps/my-app-tools/...` are not mistaken for files inside `/apps/my-app`.\n const isInRoot = !relToRoot.startsWith('..') && !isAbsolute(relToRoot);\n\n if (isInRoot) {\n return `/${relToRoot}`;\n }\n\n return `/${normalizePath(relative(workspaceRoot, module))}`;\n };\n const invalidateFileModules = (server: ViteDevServer, path: string) => {\n const normalizedPath = normalizePath(path);\n // A newly added page can be discovered before its final contents settle.\n // Invalidate the page module itself so later edits don't keep serving the\n // first incomplete transform from Vite's module graph.\n const fileModules =\n server.moduleGraph.getModulesByFile?.(normalizedPath) ??\n server.moduleGraph.fileToModulesMap.get(normalizedPath);\n\n fileModules?.forEach((mod) => {\n server.moduleGraph.invalidateModule(mod);\n\n mod.importers.forEach((imp) => {\n server.moduleGraph.invalidateModule(imp);\n });\n });\n };\n\n return [\n {\n name: 'analogjs-router-invalidate-routes',\n configureServer(server) {\n /**\n * Invalidates route modules when files are added or deleted.\n * This is a workaround for Vite's HMR limitations with dynamic imports.\n *\n * @param path The file path that was added or deleted\n */\n function invalidateRoutes(\n path: string,\n event: 'add' | 'change' | 'unlink',\n ) {\n if (!isRouteLikeFile(path)) {\n return;\n }\n\n // Add/remove changes the route graph shape, so the discovery caches\n // must be rebuilt. Plain edits can keep using the current file set.\n if (event !== 'change') {\n invalidateDiscoveryCaches();\n }\n\n if (event === 'change') {\n reportRouteDiagnostics(path);\n } else if (event === 'unlink') {\n routeDiagnosticCache.delete(path);\n discoverPageRouteFiles().forEach((file) =>\n reportRouteDiagnostics(file),\n );\n } else {\n discoverPageRouteFiles().forEach((file) =>\n reportRouteDiagnostics(file),\n );\n }\n\n invalidateFileModules(server, path);\n\n // For an in-place edit we only need module invalidation. Keeping the\n // app alive here lets Angular/Vite attempt the narrower HMR path.\n if (event === 'change') {\n return;\n }\n\n server.moduleGraph.fileToModulesMap.forEach((mods) => {\n mods.forEach((mod) => {\n if (mod.id?.includes('analogjs') && mod.id?.includes('fesm')) {\n server.moduleGraph.invalidateModule(mod);\n\n mod.importers.forEach((imp) => {\n server.moduleGraph.invalidateModule(imp);\n });\n }\n });\n });\n\n server.ws.send('analog:debug-full-reload', {\n plugin: 'platform:router-plugin',\n reason: 'route-graph-shape-changed',\n event,\n path,\n });\n server.ws.send({\n type: 'full-reload',\n });\n }\n\n server.watcher.on('add', (path) => invalidateRoutes(path, 'add'));\n server.watcher.on('change', (path) => invalidateRoutes(path, 'change'));\n server.watcher.on('unlink', (path) => invalidateRoutes(path, 'unlink'));\n\n // Vite's watcher only covers the app root by default.\n // additionalPagesDirs / additionalContentDirs live outside the\n // root (e.g. libs/shared/feature in a monorepo), so file\n // add/rename/delete events are never fired for them. Explicitly\n // add these directories to chokidar so route invalidation works.\n for (const dir of [...additionalPagesDirs, ...additionalContentDirs]) {\n server.watcher.add(dir);\n }\n\n discoverPageRouteFiles().forEach((file) =>\n reportRouteDiagnostics(file),\n );\n },\n },\n {\n name: 'analog-glob-routes',\n // enforce: 'post' ensures this transform runs AFTER the Angular compiler\n // plugin, which replaces module content with its own compiled output.\n // Without this, the Angular plugin would overwrite the route replacements.\n enforce: 'post',\n config(_config) {\n config = _config;\n root = normalizePath(resolve(workspaceRoot, config.root || '.') || '.');\n },\n /**\n * Transforms code to replace ANALOG_ROUTE_FILES and ANALOG_CONTENT_ROUTE_FILES\n * placeholders with actual dynamic imports of discovered route and content files.\n *\n * @param code The source code to transform\n * @returns Transformed code with dynamic imports or undefined if no transformation needed\n */\n // Vite 8 / Rolldown filtered transform: the `filter.code` substring\n // pre-filter lets the bundler skip modules that don't contain the\n // marker. '_ROUTE_FILES' is a common substring of both\n // 'ANALOG_ROUTE_FILES' and 'ANALOG_CONTENT_ROUTE_FILES'.\n //\n // IMPORTANT: Do NOT change this to 'ANALOG_ROUTE_FILES' — that is NOT\n // a substring of 'ANALOG_CONTENT_ROUTE_FILES' (they diverge at\n // position 7: 'ANALOG_C...' vs 'ANALOG_R...'). When tsconfig path\n // aliases resolve @analogjs/router and @analogjs/router/content to\n // separate source files, each variable lives in its own module and\n // the filter must match both independently.\n transform: {\n filter: {\n code: '_ROUTE_FILES',\n },\n handler(code) {\n if (\n code.includes('ANALOG_ROUTE_FILES') ||\n code.includes('ANALOG_CONTENT_ROUTE_FILES')\n ) {\n // Discover route files using tinyglobby\n // NOTE: { absolute: true } returns absolute paths for ALL files\n const routeFiles = discoverRouteFiles();\n\n // Discover content files using tinyglobby\n const contentRouteFiles = discoverContentRouteFiles();\n\n let result = code.replace(\n 'ANALOG_ROUTE_FILES = {};',\n `\n ANALOG_ROUTE_FILES = {${routeFiles.map((module) => {\n // Keys are app-root-relative for in-app files,\n // workspace-relative for library files (additionalPagesDirs).\n // import() keeps absolute paths for Vite's module resolution.\n const key = getModuleKey(module);\n return `\"${key}\": () => import('${module}')`;\n })}};\n `,\n );\n\n result = result.replace(\n 'ANALOG_CONTENT_ROUTE_FILES = {};',\n `\n ANALOG_CONTENT_ROUTE_FILES = {${contentRouteFiles.map((module) => {\n const key = getModuleKey(module);\n return `\"${key}\": () => import('${module}?analog-content-file=true').then(m => m.default)`;\n })}};\n `,\n );\n\n result = result.replace(\n 'ANALOG_CONTENT_FILE_COUNT = 0',\n `ANALOG_CONTENT_FILE_COUNT = ${contentRouteFiles.length}`,\n );\n\n return {\n code: result,\n map: { mappings: '' },\n };\n }\n\n return;\n },\n },\n },\n {\n name: 'analog-glob-endpoints',\n // enforce: 'post' ensures this transform runs AFTER the Angular compiler\n // plugin, which replaces module content with its own compiled output.\n // Without this, the Angular plugin would overwrite the endpoint replacements.\n enforce: 'post',\n /**\n * Transforms code to replace ANALOG_PAGE_ENDPOINTS placeholder\n * with actual dynamic imports of discovered server endpoint files.\n *\n * @param code The source code to transform\n * @returns Transformed code with dynamic imports or undefined if no transformation needed\n */\n transform: {\n filter: {\n code: 'ANALOG_PAGE_ENDPOINTS',\n },\n handler(code) {\n if (code.includes('ANALOG_PAGE_ENDPOINTS')) {\n // Discover server endpoint files using tinyglobby\n const endpointFiles = discoverEndpointFiles();\n\n const result = code.replace(\n 'ANALOG_PAGE_ENDPOINTS = {};',\n `\n ANALOG_PAGE_ENDPOINTS = {${endpointFiles.map((module) => {\n const key = getModuleKey(module);\n return `\"${key}\": () => import('${module}')`;\n })}};\n `,\n );\n\n return {\n code: result,\n map: { mappings: '' },\n };\n }\n\n return;\n },\n },\n },\n ];\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
|
-
import { VERSION } from "@angular/compiler-cli";
|
|
3
2
|
import { readFile } from "node:fs/promises";
|
|
4
3
|
//#region packages/platform/src/lib/ssr/inject-html-plugin.ts
|
|
5
4
|
var require = createRequire(import.meta.url);
|
|
@@ -20,7 +19,7 @@ function eventReplayPlugin() {
|
|
|
20
19
|
};
|
|
21
20
|
}
|
|
22
21
|
function injectHTMLPlugin() {
|
|
23
|
-
return
|
|
22
|
+
return [eventReplayPlugin()];
|
|
24
23
|
}
|
|
25
24
|
//#endregion
|
|
26
25
|
export { injectHTMLPlugin };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inject-html-plugin.js","names":[],"sources":["../../../../src/lib/ssr/inject-html-plugin.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"inject-html-plugin.js","names":[],"sources":["../../../../src/lib/ssr/inject-html-plugin.ts"],"sourcesContent":["import { Plugin } from 'vite';\nimport { readFile } from 'node:fs/promises';\nimport { createRequire } from 'node:module';\n\nconst require = createRequire(import.meta.url);\n\nfunction eventReplayPlugin(): Plugin {\n return {\n name: 'analogjs-event-replay-plugin',\n async transformIndexHtml() {\n const eventReplayScript = await readFile(\n require.resolve('@angular/core/event-dispatch-contract.min.js'),\n 'utf-8',\n );\n\n return [\n {\n tag: 'script',\n attrs: {\n type: 'text/javascript',\n id: 'ng-event-dispatch-contract',\n },\n children: eventReplayScript,\n injectTo: 'body',\n },\n ];\n },\n };\n}\n\nexport function injectHTMLPlugin(): Plugin[] {\n return [eventReplayPlugin()];\n}\n"],"mappings":";;;AAIA,IAAM,UAAU,cAAc,OAAO,KAAK,IAAI;AAE9C,SAAS,oBAA4B;AACnC,QAAO;EACL,MAAM;EACN,MAAM,qBAAqB;AAMzB,UAAO,CACL;IACE,KAAK;IACL,OAAO;KACL,MAAM;KACN,IAAI;KACL;IACD,UAZsB,MAAM,SAC9B,QAAQ,QAAQ,+CAA+C,EAC/D,QACD;IAUG,UAAU;IACX,CACF;;EAEJ;;AAGH,SAAgB,mBAA6B;AAC3C,QAAO,CAAC,mBAAmB,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
require("../../../_virtual/_rolldown/runtime.js");
|
|
2
|
-
const require_src_executors_vitest_vitest_impl = require("./vitest.impl.js");
|
|
3
|
-
//#region packages/nx-plugin/src/executors/vitest/compat.ts
|
|
4
|
-
var compat = (0, require("@nx/devkit").convertNxExecutor)(require_src_executors_vitest_vitest_impl);
|
|
5
|
-
//#endregion
|
|
6
|
-
module.exports = compat;
|
|
7
|
-
|
|
8
|
-
//# sourceMappingURL=compat.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compat.js","names":[],"sources":["../../../../../../../../nx-plugin/src/executors/vitest/compat.ts"],"sourcesContent":["import { convertNxExecutor } from '@nx/devkit';\n\nimport vitestExecutor from './vitest.impl';\n\nconst compat: ReturnType<typeof convertNxExecutor> =\n convertNxExecutor(vitestExecutor);\nexport default compat;\n"],"mappings":";;;AAIA,IAAM,UAAA,yBAAA,mBACc,yCAAe"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type { VitestExecutorOptions } from '@nx/vite/executors';
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 2,
|
|
3
|
-
"cli": "nx",
|
|
4
|
-
"title": "Vitest executor",
|
|
5
|
-
"description": "Test using Vitest.",
|
|
6
|
-
"type": "object",
|
|
7
|
-
"properties": {
|
|
8
|
-
"configFile": {
|
|
9
|
-
"type": "string",
|
|
10
|
-
"description": "The path to the local vitest config",
|
|
11
|
-
"x-completion-type": "file",
|
|
12
|
-
"x-completion-glob": "@(vitest|vite).config@(.js|.ts)",
|
|
13
|
-
"aliases": ["config"]
|
|
14
|
-
},
|
|
15
|
-
"reportsDirectory": {
|
|
16
|
-
"type": "string",
|
|
17
|
-
"description": "Directory to write coverage report to."
|
|
18
|
-
},
|
|
19
|
-
"mode": {
|
|
20
|
-
"type": "string",
|
|
21
|
-
"description": "Mode for Vite."
|
|
22
|
-
},
|
|
23
|
-
"testFiles": {
|
|
24
|
-
"aliases": ["testFile"],
|
|
25
|
-
"type": "array",
|
|
26
|
-
"items": { "type": "string" }
|
|
27
|
-
},
|
|
28
|
-
"watch": {
|
|
29
|
-
"description": "Watch files for changes and rerun tests related to changed files.",
|
|
30
|
-
"type": "boolean"
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
"required": [],
|
|
34
|
-
"examplesFile": "../../../docs/test-examples.md"
|
|
35
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
require("../../../_virtual/_rolldown/runtime.js");
|
|
2
|
-
//#region packages/nx-plugin/src/executors/vitest/vitest.impl.ts
|
|
3
|
-
var vitest_impl_default = require("@nx/vitest/executors").vitestExecutor;
|
|
4
|
-
//#endregion
|
|
5
|
-
module.exports = vitest_impl_default;
|
|
6
|
-
|
|
7
|
-
//# sourceMappingURL=vitest.impl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vitest.impl.js","names":[],"sources":["../../../../../../../../nx-plugin/src/executors/vitest/vitest.impl.ts"],"sourcesContent":["import { vitestExecutor } from '@nx/vitest/executors';\n\nexport default vitestExecutor;\n"],"mappings":";;AAEA,IAAA,sDAAe"}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
declare const dependencyKeys: readonly ["@analogjs/content", "@analogjs/router", "@angular/platform-server", "front-matter", "marked", "marked-gfm-heading-id", "marked-highlight", "marked-mangle", "mermaid", "prismjs"];
|
|
2
|
-
export type AnalogDependency = (typeof dependencyKeys)[number];
|
|
3
|
-
export type ExtendedDependenciesRecord = Record<AnalogDependency, string>;
|
|
4
|
-
export declare const getAnalogDependencies: (nxVersion: string, angularVersion: string) => ExtendedDependenciesRecord;
|
|
5
|
-
export {};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
declare const devDependencyKeys: readonly ["@analogjs/platform", "@analogjs/vite-plugin-angular", "jsdom", "vite", "vite-tsconfig-paths", "vitest"];
|
|
2
|
-
export type AnalogDevDependency = (typeof devDependencyKeys)[number];
|
|
3
|
-
export declare const getAnalogDevDependencies: (nxVersion: string) => Record<AnalogDevDependency, string>;
|
|
4
|
-
export {};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { convertNxGenerator } from "@nx/devkit";
|
|
2
|
-
/**
|
|
3
|
-
* Angular CLI schematic wrapper for the Vitest setup generator.
|
|
4
|
-
* Referenced by `generators.json#schematics.setup-vitest.factory` so that
|
|
5
|
-
* `ng generate @analogjs/platform:setup-vitest` resolves through the
|
|
6
|
-
* Angular schematics engine.
|
|
7
|
-
*/
|
|
8
|
-
export declare const setupVitestSchematic: ReturnType<typeof convertNxGenerator>;
|
|
9
|
-
export default setupVitestSchematic;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
Object.defineProperties(exports, {
|
|
2
|
-
__esModule: { value: true },
|
|
3
|
-
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
-
});
|
|
5
|
-
require("../../../_virtual/_rolldown/runtime.js");
|
|
6
|
-
const require_src_generators_setup_vitest_generator = require("./generator.js");
|
|
7
|
-
//#region packages/nx-plugin/src/generators/setup-vitest/compat.ts
|
|
8
|
-
/**
|
|
9
|
-
* Angular CLI schematic wrapper for the Vitest setup generator.
|
|
10
|
-
* Referenced by `generators.json#schematics.setup-vitest.factory` so that
|
|
11
|
-
* `ng generate @analogjs/platform:setup-vitest` resolves through the
|
|
12
|
-
* Angular schematics engine.
|
|
13
|
-
*/
|
|
14
|
-
var setupVitestSchematic = (0, require("@nx/devkit").convertNxGenerator)(require_src_generators_setup_vitest_generator);
|
|
15
|
-
//#endregion
|
|
16
|
-
exports.default = setupVitestSchematic;
|
|
17
|
-
exports.setupVitestSchematic = setupVitestSchematic;
|
|
18
|
-
|
|
19
|
-
//# sourceMappingURL=compat.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compat.js","names":[],"sources":["../../../../../../../../nx-plugin/src/generators/setup-vitest/compat.ts"],"sourcesContent":["import { convertNxGenerator } from '@nx/devkit';\n\nimport setupVitestGenerator from './generator';\n\n/**\n * Angular CLI schematic wrapper for the Vitest setup generator.\n * Referenced by `generators.json#schematics.setup-vitest.factory` so that\n * `ng generate @analogjs/platform:setup-vitest` resolves through the\n * Angular schematics engine.\n */\nexport const setupVitestSchematic: ReturnType<typeof convertNxGenerator> =\n convertNxGenerator(setupVitestGenerator) as ReturnType<\n typeof convertNxGenerator\n >;\nexport default setupVitestSchematic;\n"],"mappings":";;;;;;;;;;;;;AAUA,IAAa,wBAAA,yBAAA,oBACQ,8CAAqB"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
<% if (majorAngularVersion > 20) { %>
|
|
2
|
-
import '@angular/compiler';
|
|
3
|
-
import '@analogjs/vitest-angular/setup-snapshots';
|
|
4
|
-
import '@analogjs/vitest-angular/setup-serializers';
|
|
5
|
-
import { setupTestBed } from '@analogjs/vitest-angular/setup-testbed';
|
|
6
|
-
|
|
7
|
-
setupTestBed();
|
|
8
|
-
<% } else { %>
|
|
9
|
-
import '@angular/compiler';
|
|
10
|
-
import '@analogjs/vitest-angular/setup-zone';
|
|
11
|
-
|
|
12
|
-
import {
|
|
13
|
-
BrowserTestingModule,
|
|
14
|
-
platformBrowserTesting,
|
|
15
|
-
} from '@angular/platform-browser/testing';
|
|
16
|
-
import { getTestBed } from '@angular/core/testing';
|
|
17
|
-
|
|
18
|
-
getTestBed().initTestEnvironment(
|
|
19
|
-
BrowserTestingModule,
|
|
20
|
-
platformBrowserTesting()
|
|
21
|
-
);
|
|
22
|
-
<% } %>
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/// <reference types="vitest" />
|
|
2
|
-
|
|
3
|
-
import angular from '@analogjs/vite-plugin-angular';
|
|
4
|
-
import { defineConfig } from 'vite';
|
|
5
|
-
|
|
6
|
-
// https://vitejs.dev/config/
|
|
7
|
-
export default defineConfig(({ mode }) => {
|
|
8
|
-
return {
|
|
9
|
-
plugins: [
|
|
10
|
-
angular(),
|
|
11
|
-
],
|
|
12
|
-
test: {
|
|
13
|
-
globals: true,
|
|
14
|
-
environment: 'jsdom',
|
|
15
|
-
setupFiles: ['src/test-setup.ts'],
|
|
16
|
-
include: ['**/*.spec.ts'],
|
|
17
|
-
reporters: ['default'],
|
|
18
|
-
},
|
|
19
|
-
define: {
|
|
20
|
-
'import.meta.vitest': mode !== 'production',
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
});
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
require("../../../_virtual/_rolldown/runtime.js");
|
|
2
|
-
const require_version_utils = require("../../utils/version-utils.js");
|
|
3
|
-
const require_add_analog_dependencies = require("./lib/add-analog-dependencies.js");
|
|
4
|
-
const require_update_test_target = require("./lib/update-test-target.js");
|
|
5
|
-
const require_update_tsconfig = require("./lib/update-tsconfig.js");
|
|
6
|
-
let _nx_devkit = require("@nx/devkit");
|
|
7
|
-
let semver = require("semver");
|
|
8
|
-
let node_path = require("node:path");
|
|
9
|
-
//#region packages/nx-plugin/src/generators/setup-vitest/generator.ts
|
|
10
|
-
function addFiles(tree, options, majorAngularVersion) {
|
|
11
|
-
const projectConfig = (0, _nx_devkit.getProjects)(tree).get(options.project);
|
|
12
|
-
if (!projectConfig) throw new Error(`Project "${options.project}" not found.`);
|
|
13
|
-
const templateOptions = {
|
|
14
|
-
...options,
|
|
15
|
-
majorAngularVersion,
|
|
16
|
-
template: ""
|
|
17
|
-
};
|
|
18
|
-
(0, _nx_devkit.generateFiles)(tree, (0, node_path.join)(__dirname, "files"), projectConfig.root || ".", templateOptions);
|
|
19
|
-
}
|
|
20
|
-
async function setupVitestGenerator(tree, options) {
|
|
21
|
-
const angularVersion = require_version_utils.getInstalledPackageVersion(tree, "@angular/core");
|
|
22
|
-
if (!angularVersion) throw new Error("@angular/core is not installed.");
|
|
23
|
-
const coercedVersion = (0, semver.coerce)(angularVersion);
|
|
24
|
-
if (!coercedVersion) throw new Error(`Unable to coerce Angular version: ${angularVersion}`);
|
|
25
|
-
const majorAngularVersion = (0, semver.major)(coercedVersion);
|
|
26
|
-
require_add_analog_dependencies.addAnalogDependencies(tree, angularVersion, require_version_utils.getInstalledPackageVersion(tree, "nx") ?? "");
|
|
27
|
-
require_update_tsconfig.updateTsConfig(tree, options);
|
|
28
|
-
require_update_test_target.updateTestTarget(tree, options);
|
|
29
|
-
addFiles(tree, options, majorAngularVersion);
|
|
30
|
-
await (0, _nx_devkit.formatFiles)(tree);
|
|
31
|
-
return () => {
|
|
32
|
-
(0, _nx_devkit.installPackagesTask)(tree);
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
//#endregion
|
|
36
|
-
module.exports = setupVitestGenerator;
|
|
37
|
-
|
|
38
|
-
//# sourceMappingURL=generator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","names":[],"sources":["../../../../../../../../nx-plugin/src/generators/setup-vitest/generator.ts"],"sourcesContent":["import {\n formatFiles,\n generateFiles,\n getProjects,\n installPackagesTask,\n Tree,\n} from '@nx/devkit';\nimport { join } from 'node:path';\nimport { coerce, major } from 'semver';\n\nimport { getInstalledPackageVersion } from '../../utils/version-utils';\nimport { addAnalogDependencies } from './lib/add-analog-dependencies';\nimport { updateTestTarget } from './lib/update-test-target';\nimport { updateTsConfig } from './lib/update-tsconfig';\nimport { SetupVitestGeneratorSchema } from './schema';\n\nfunction addFiles(\n tree: Tree,\n options: SetupVitestGeneratorSchema,\n majorAngularVersion: number,\n) {\n const projects = getProjects(tree);\n\n const projectConfig = projects.get(options.project);\n\n if (!projectConfig) {\n throw new Error(`Project \"${options.project}\" not found.`);\n }\n\n const templateOptions = {\n ...options,\n majorAngularVersion,\n template: '',\n };\n\n generateFiles(\n tree,\n join(__dirname, 'files'),\n projectConfig.root || '.',\n templateOptions,\n );\n}\n\nasync function setupVitestGenerator(\n tree: Tree,\n options: SetupVitestGeneratorSchema,\n): Promise<() => void> {\n const angularVersion = getInstalledPackageVersion(tree, '@angular/core');\n\n if (!angularVersion) {\n throw new Error('@angular/core is not installed.');\n }\n\n const coercedVersion = coerce(angularVersion);\n\n if (!coercedVersion) {\n throw new Error(`Unable to coerce Angular version: ${angularVersion}`);\n }\n\n const majorAngularVersion = major(coercedVersion);\n\n const nxVersion = getInstalledPackageVersion(tree, 'nx');\n\n addAnalogDependencies(tree, angularVersion, nxVersion ?? '');\n updateTsConfig(tree, options);\n updateTestTarget(tree, options);\n\n addFiles(tree, options, majorAngularVersion);\n\n await formatFiles(tree);\n\n return () => {\n installPackagesTask(tree);\n };\n}\n\nexport default setupVitestGenerator;\n"],"mappings":";;;;;;;;;AAgBA,SAAS,SACP,MACA,SACA,qBACA;CAGA,MAAM,iBAAA,GAAA,WAAA,aAFuB,KAAK,CAEH,IAAI,QAAQ,QAAQ;AAEnD,KAAI,CAAC,cACH,OAAM,IAAI,MAAM,YAAY,QAAQ,QAAQ,cAAc;CAG5D,MAAM,kBAAkB;EACtB,GAAG;EACH;EACA,UAAU;EACX;AAED,EAAA,GAAA,WAAA,eACE,OAAA,GAAA,UAAA,MACK,WAAW,QAAQ,EACxB,cAAc,QAAQ,KACtB,gBACD;;AAGH,eAAe,qBACb,MACA,SACqB;CACrB,MAAM,iBAAiB,sBAAA,2BAA2B,MAAM,gBAAgB;AAExE,KAAI,CAAC,eACH,OAAM,IAAI,MAAM,kCAAkC;CAGpD,MAAM,kBAAA,GAAA,OAAA,QAAwB,eAAe;AAE7C,KAAI,CAAC,eACH,OAAM,IAAI,MAAM,qCAAqC,iBAAiB;CAGxE,MAAM,uBAAA,GAAA,OAAA,OAA4B,eAAe;AAIjD,iCAAA,sBAAsB,MAAM,gBAFV,sBAAA,2BAA2B,MAAM,KAAK,IAEC,GAAG;AAC5D,yBAAA,eAAe,MAAM,QAAQ;AAC7B,4BAAA,iBAAiB,MAAM,QAAQ;AAE/B,UAAS,MAAM,SAAS,oBAAoB;AAE5C,QAAA,GAAA,WAAA,aAAkB,KAAK;AAEvB,cAAa;AACX,GAAA,GAAA,WAAA,qBAAoB,KAAK"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
require("../../../../_virtual/_rolldown/runtime.js");
|
|
2
|
-
const require_dev_dependencies = require("../../../utils/versions/dev-dependencies.js");
|
|
3
|
-
let _nx_devkit = require("@nx/devkit");
|
|
4
|
-
//#region packages/nx-plugin/src/generators/setup-vitest/lib/add-analog-dependencies.ts
|
|
5
|
-
function addAnalogDependencies(tree, angularVersion, nxVersion) {
|
|
6
|
-
(0, _nx_devkit.addDependenciesToPackageJson)(tree, {}, require_dev_dependencies.getAnalogDevDependencies(angularVersion, nxVersion));
|
|
7
|
-
}
|
|
8
|
-
//#endregion
|
|
9
|
-
exports.addAnalogDependencies = addAnalogDependencies;
|
|
10
|
-
|
|
11
|
-
//# sourceMappingURL=add-analog-dependencies.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"add-analog-dependencies.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/generators/setup-vitest/lib/add-analog-dependencies.ts"],"sourcesContent":["import { addDependenciesToPackageJson, Tree } from '@nx/devkit';\n\nimport { getAnalogDevDependencies } from '../../../utils/versions/dev-dependencies';\n\nexport function addAnalogDependencies(\n tree: Tree,\n angularVersion: string,\n nxVersion: string,\n): void {\n const devDependencies = getAnalogDevDependencies(angularVersion, nxVersion);\n\n addDependenciesToPackageJson(tree, {}, devDependencies);\n}\n"],"mappings":";;;;AAIA,SAAgB,sBACd,MACA,gBACA,WACM;AAGN,EAAA,GAAA,WAAA,8BAA6B,MAAM,EAAE,EAFb,yBAAA,yBAAyB,gBAAgB,UAAU,CAEpB"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
require("../../../../_virtual/_rolldown/runtime.js");
|
|
2
|
-
let _nx_devkit = require("@nx/devkit");
|
|
3
|
-
//#region packages/nx-plugin/src/generators/setup-vitest/lib/update-test-target.ts
|
|
4
|
-
function updateTestTarget(tree, schema) {
|
|
5
|
-
const angularJsonPath = "/angular.json";
|
|
6
|
-
if (tree.exists(angularJsonPath)) (0, _nx_devkit.updateJson)(tree, angularJsonPath, (json) => {
|
|
7
|
-
json.projects[schema.project].architect.test = { builder: "@analogjs/vitest-angular:test" };
|
|
8
|
-
return json;
|
|
9
|
-
}, {
|
|
10
|
-
expectComments: true,
|
|
11
|
-
allowTrailingComma: true
|
|
12
|
-
});
|
|
13
|
-
else {
|
|
14
|
-
const projectConfig = (0, _nx_devkit.getProjects)(tree).get(schema.project);
|
|
15
|
-
if (!projectConfig) throw new Error(`Project "${schema.project}" not found.`);
|
|
16
|
-
if (!projectConfig.targets) throw new Error(`Project "${schema.project}" has no targets.`);
|
|
17
|
-
projectConfig.targets.test = { executor: "@analogjs/vitest-angular:test" };
|
|
18
|
-
(0, _nx_devkit.updateProjectConfiguration)(tree, schema.project, projectConfig);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
//#endregion
|
|
22
|
-
exports.updateTestTarget = updateTestTarget;
|
|
23
|
-
|
|
24
|
-
//# sourceMappingURL=update-test-target.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-test-target.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/generators/setup-vitest/lib/update-test-target.ts"],"sourcesContent":["import {\n Tree,\n getProjects,\n updateJson,\n updateProjectConfiguration,\n} from '@nx/devkit';\n\nimport { SetupVitestGeneratorSchema } from '../schema';\n\nexport function updateTestTarget(\n tree: Tree,\n schema: SetupVitestGeneratorSchema,\n): void {\n const angularJsonPath = '/angular.json';\n\n if (tree.exists(angularJsonPath)) {\n updateJson(\n tree,\n angularJsonPath,\n (json) => {\n json.projects[schema.project].architect.test = {\n builder: '@analogjs/vitest-angular:test',\n };\n\n return json;\n },\n { expectComments: true, allowTrailingComma: true },\n );\n } else {\n const projects = getProjects(tree);\n\n const projectConfig = projects.get(schema.project);\n\n if (!projectConfig) {\n throw new Error(`Project \"${schema.project}\" not found.`);\n }\n\n if (!projectConfig.targets) {\n throw new Error(`Project \"${schema.project}\" has no targets.`);\n }\n\n projectConfig.targets.test = {\n executor: '@analogjs/vitest-angular:test',\n };\n\n updateProjectConfiguration(tree, schema.project, projectConfig);\n }\n}\n"],"mappings":";;;AASA,SAAgB,iBACd,MACA,QACM;CACN,MAAM,kBAAkB;AAExB,KAAI,KAAK,OAAO,gBAAgB,CAC9B,EAAA,GAAA,WAAA,YACE,MACA,kBACC,SAAS;AACR,OAAK,SAAS,OAAO,SAAS,UAAU,OAAO,EAC7C,SAAS,iCACV;AAED,SAAO;IAET;EAAE,gBAAgB;EAAM,oBAAoB;EAAM,CACnD;MACI;EAGL,MAAM,iBAAA,GAAA,WAAA,aAFuB,KAAK,CAEH,IAAI,OAAO,QAAQ;AAElD,MAAI,CAAC,cACH,OAAM,IAAI,MAAM,YAAY,OAAO,QAAQ,cAAc;AAG3D,MAAI,CAAC,cAAc,QACjB,OAAM,IAAI,MAAM,YAAY,OAAO,QAAQ,mBAAmB;AAGhE,gBAAc,QAAQ,OAAO,EAC3B,UAAU,iCACX;AAED,GAAA,GAAA,WAAA,4BAA2B,MAAM,OAAO,SAAS,cAAc"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
require("../../../../_virtual/_rolldown/runtime.js");
|
|
2
|
-
let _nx_devkit = require("@nx/devkit");
|
|
3
|
-
//#region packages/nx-plugin/src/generators/setup-vitest/lib/update-tsconfig.ts
|
|
4
|
-
function updateTsConfig(tree, schema) {
|
|
5
|
-
const projectConfig = (0, _nx_devkit.getProjects)(tree).get(schema.project);
|
|
6
|
-
if (!projectConfig) throw new Error(`Project "${schema.project}" not found.`);
|
|
7
|
-
const tsconfigPath = (0, _nx_devkit.joinPathFragments)(projectConfig.root, "tsconfig.spec.json");
|
|
8
|
-
if (tree.exists(tsconfigPath)) (0, _nx_devkit.updateJson)(tree, tsconfigPath, (json) => {
|
|
9
|
-
json.compilerOptions ??= {};
|
|
10
|
-
json.compilerOptions.module = void 0;
|
|
11
|
-
json.compilerOptions.target ??= "es2022";
|
|
12
|
-
json.files = ["src/test-setup.ts"];
|
|
13
|
-
json.compilerOptions.types = (json.compilerOptions.types ?? ["node"]).filter((type) => type !== "jest").concat(["vitest/globals"]);
|
|
14
|
-
return json;
|
|
15
|
-
}, {
|
|
16
|
-
expectComments: true,
|
|
17
|
-
allowTrailingComma: true
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
//#endregion
|
|
21
|
-
exports.updateTsConfig = updateTsConfig;
|
|
22
|
-
|
|
23
|
-
//# sourceMappingURL=update-tsconfig.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-tsconfig.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/generators/setup-vitest/lib/update-tsconfig.ts"],"sourcesContent":["import { Tree, getProjects, joinPathFragments, updateJson } from '@nx/devkit';\n\nimport { SetupVitestGeneratorSchema } from '../schema';\n\ninterface TsConfig {\n files: string[];\n compilerOptions: {\n module?: string;\n target?: string;\n types?: string[];\n };\n}\n\nexport function updateTsConfig(\n tree: Tree,\n schema: SetupVitestGeneratorSchema,\n): void {\n const projects = getProjects(tree);\n\n const projectConfig = projects.get(schema.project)!;\n\n if (!projectConfig) {\n throw new Error(`Project \"${schema.project}\" not found.`);\n }\n\n const tsconfigPath = joinPathFragments(\n projectConfig.root,\n 'tsconfig.spec.json',\n );\n\n if (tree.exists(tsconfigPath)) {\n updateJson<TsConfig>(\n tree,\n tsconfigPath,\n (json) => {\n json.compilerOptions ??= {};\n json.compilerOptions.module = undefined;\n json.compilerOptions.target ??= 'es2022';\n json.files = ['src/test-setup.ts'];\n json.compilerOptions.types = (json.compilerOptions.types ?? ['node'])\n .filter((type) => type !== 'jest')\n .concat(['vitest/globals']);\n\n return json;\n },\n { expectComments: true, allowTrailingComma: true },\n );\n }\n}\n"],"mappings":";;;AAaA,SAAgB,eACd,MACA,QACM;CAGN,MAAM,iBAAA,GAAA,WAAA,aAFuB,KAAK,CAEH,IAAI,OAAO,QAAQ;AAElD,KAAI,CAAC,cACH,OAAM,IAAI,MAAM,YAAY,OAAO,QAAQ,cAAc;CAG3D,MAAM,gBAAA,GAAA,WAAA,mBACJ,cAAc,MACd,qBACD;AAED,KAAI,KAAK,OAAO,aAAa,CAC3B,EAAA,GAAA,WAAA,YACE,MACA,eACC,SAAS;AACR,OAAK,oBAAoB,EAAE;AAC3B,OAAK,gBAAgB,SAAS,KAAA;AAC9B,OAAK,gBAAgB,WAAW;AAChC,OAAK,QAAQ,CAAC,oBAAoB;AAClC,OAAK,gBAAgB,SAAS,KAAK,gBAAgB,SAAS,CAAC,OAAO,EACjE,QAAQ,SAAS,SAAS,OAAO,CACjC,OAAO,CAAC,iBAAiB,CAAC;AAE7B,SAAO;IAET;EAAE,gBAAgB;EAAM,oBAAoB;EAAM,CACnD"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "http://json-schema.org/schema",
|
|
3
|
-
"cli": "nx",
|
|
4
|
-
"$id": "page",
|
|
5
|
-
"title": "Create an Analog page",
|
|
6
|
-
"type": "object",
|
|
7
|
-
"properties": {
|
|
8
|
-
"project": {
|
|
9
|
-
"type": "string",
|
|
10
|
-
"description": "The project where the page will be located.",
|
|
11
|
-
"x-prompt": "Which project will this page be located in?",
|
|
12
|
-
"$default": {
|
|
13
|
-
"$source": "projectName"
|
|
14
|
-
},
|
|
15
|
-
"x-dropdown": "projects"
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
"required": ["project"]
|
|
19
|
-
}
|