@farm.js/core 0.1.0-beta.65 → 0.1.0-beta.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/route-manager.cjs +2 -1
- package/dist/api/route-manager.cjs.map +1 -1
- package/dist/api/route-manager.d.mts +6 -2
- package/dist/api/route-manager.d.ts +6 -2
- package/dist/api/route-manager.mjs +1 -1
- package/dist/api.cjs +2 -1
- package/dist/api.cjs.map +1 -1
- package/dist/api.d.mts +1 -1
- package/dist/api.d.ts +1 -1
- package/dist/api.mjs +2 -2
- package/dist/{chunk-H5D6FDSG.mjs → chunk-5MK6T6UG.mjs} +3 -3
- package/dist/{chunk-BYBYZSQ4.mjs → chunk-6HZ23B26.mjs} +2 -2
- package/dist/{chunk-ITSBK56Q.mjs → chunk-BDDLX64F.mjs} +3 -2
- package/dist/chunk-BDDLX64F.mjs.map +1 -0
- package/dist/{chunk-R6UV2YLL.mjs → chunk-GL2EOYB7.mjs} +4 -4
- package/dist/{chunk-R6UV2YLL.mjs.map → chunk-GL2EOYB7.mjs.map} +1 -1
- package/dist/{chunk-ECLBGYGZ.mjs → chunk-NF34YWNW.mjs} +2 -2
- package/dist/{chunk-VQYZ6JT6.mjs → chunk-P5WK3VZN.mjs} +2 -2
- package/dist/{chunk-VQYZ6JT6.mjs.map → chunk-P5WK3VZN.mjs.map} +1 -1
- package/dist/client/lifecycle.mjs +2 -2
- package/dist/client-plugins.cjs +1 -1
- package/dist/client-plugins.cjs.map +1 -1
- package/dist/client-plugins.mjs +2 -2
- package/dist/client.cjs +1 -1
- package/dist/client.cjs.map +1 -1
- package/dist/client.mjs +2 -2
- package/dist/index.cjs +4 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +6 -6
- package/dist/internal/build-runtime.cjs +4 -3
- package/dist/internal/build-runtime.cjs.map +1 -1
- package/dist/internal/build-runtime.mjs +4 -4
- package/dist/internal/client-runtime.cjs +1 -1
- package/dist/internal/client-runtime.cjs.map +1 -1
- package/dist/internal/client-runtime.mjs +2 -2
- package/dist/plugin.cjs +4 -3
- package/dist/plugin.cjs.map +1 -1
- package/dist/plugin.mjs +3 -3
- package/dist/server.cjs +4 -3
- package/dist/server.cjs.map +1 -1
- package/dist/server.mjs +3 -3
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.mjs +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.mjs +1 -1
- package/dist/vite.cjs +4 -3
- package/dist/vite.cjs.map +1 -1
- package/dist/vite.mjs +3 -3
- package/package.json +3 -3
- package/dist/chunk-ITSBK56Q.mjs.map +0 -1
- /package/dist/{chunk-H5D6FDSG.mjs.map → chunk-5MK6T6UG.mjs.map} +0 -0
- /package/dist/{chunk-BYBYZSQ4.mjs.map → chunk-6HZ23B26.mjs.map} +0 -0
- /package/dist/{chunk-ECLBGYGZ.mjs.map → chunk-NF34YWNW.mjs.map} +0 -0
package/dist/vite.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
farmPlugin,
|
|
5
5
|
rewriteEarlySsrRelativeImports,
|
|
6
6
|
withFarmRequestTracing
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-GL2EOYB7.mjs";
|
|
8
8
|
import "./chunk-MD4TKIKU.mjs";
|
|
9
9
|
import "./chunk-ZVDDKVZY.mjs";
|
|
10
10
|
import "./chunk-AMZZCRQ7.mjs";
|
|
@@ -38,7 +38,7 @@ import "./chunk-S35F2MY7.mjs";
|
|
|
38
38
|
import "./chunk-HUATZB2U.mjs";
|
|
39
39
|
import "./chunk-35SSRS5K.mjs";
|
|
40
40
|
import "./chunk-E6EPN5BT.mjs";
|
|
41
|
-
import "./chunk-
|
|
41
|
+
import "./chunk-BDDLX64F.mjs";
|
|
42
42
|
import "./chunk-HO33MT4X.mjs";
|
|
43
43
|
import "./chunk-FQYDHKKU.mjs";
|
|
44
44
|
import "./chunk-SXWF4QRU.mjs";
|
|
@@ -62,7 +62,7 @@ import "./chunk-RBRLLZL5.mjs";
|
|
|
62
62
|
import "./chunk-WZ5QFROO.mjs";
|
|
63
63
|
import "./chunk-7ZMKVETU.mjs";
|
|
64
64
|
import "./chunk-FXG2PS27.mjs";
|
|
65
|
-
import "./chunk-
|
|
65
|
+
import "./chunk-P5WK3VZN.mjs";
|
|
66
66
|
import "./chunk-CGILA3WO.mjs";
|
|
67
67
|
export {
|
|
68
68
|
defineConfig,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@farm.js/core",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.66",
|
|
4
4
|
"description": "Core Farm.js framework for modern integrated apps",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"@farm.js/core",
|
|
@@ -618,8 +618,8 @@
|
|
|
618
618
|
"tsup": "^8.3.5",
|
|
619
619
|
"typescript": "^5.3.3",
|
|
620
620
|
"vitest": "^3.2.7",
|
|
621
|
-
"@farm.js/
|
|
622
|
-
"@farm.js/
|
|
621
|
+
"@farm.js/renderer-tests": "0.0.0",
|
|
622
|
+
"@farm.js/otel": "0.1.0-beta.25"
|
|
623
623
|
},
|
|
624
624
|
"peerDependencies": {
|
|
625
625
|
"react": "^18.2.0 || ^19.0.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/route-manager.ts","../src/routes-shared.ts","../src/routes.server.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { ViteDevServer } from \"vite\";\nimport { logger } from \"../utils\";\nimport type { ProgrammaticApiRoute } from \"../routes\";\nimport { createProgrammaticRouteModuleId } from \"../routes-shared\";\nimport { findProgrammaticRouteFilesInDir } from \"../routes.server\";\nimport {\n getFarmRouteRuntimeConfig,\n normalizeFarmRouteRuntimeConfig,\n type FarmRouteRuntimeConfig,\n} from \"../route-runtime\";\nimport { _runWithFarmI18nRequest, type FarmI18nRuntime } from \"../i18n/server\";\nimport { invokeAPIRouteEndpoint, matchAPIRoute, type APIRouteMatch } from \"./runtime\";\n\nexport interface APIRoute extends FarmRouteRuntimeConfig {\n path: string;\n filePath: string;\n methods: string[];\n endpoints: Record<string, any>;\n}\n\nexport interface APIRouteManagerOptions {\n throwOnLoadError?: boolean;\n i18n?: FarmI18nRuntime;\n bodySizeLimit?: number;\n}\n\nexport const API_ROUTE_METHODS = [\n \"GET\",\n \"HEAD\",\n \"QUERY\",\n \"POST\",\n \"PUT\",\n \"DELETE\",\n \"PATCH\",\n \"OPTIONS\",\n] as const;\n\nexport class APIRouteManager {\n private routes: Map<string, APIRoute> = new Map();\n private viteServer?: ViteDevServer;\n private appDirs: string[];\n private throwOnLoadError: boolean;\n private i18n?: FarmI18nRuntime;\n private bodySizeLimit?: number;\n\n constructor(\n appDir: string | readonly string[],\n viteServer?: ViteDevServer,\n options: APIRouteManagerOptions = {},\n ) {\n this.appDirs = Array.isArray(appDir) ? [...appDir] : [appDir as string];\n this.viteServer = viteServer;\n this.throwOnLoadError = options.throwOnLoadError === true;\n this.i18n = options.i18n;\n this.bodySizeLimit = options.bodySizeLimit;\n }\n\n /**\n * Discover route.ts files in /app/api and explicit endpoints in root routes.ts\n */\n async discoverRoutes(): Promise<void> {\n this.routes.clear();\n\n for (const appDir of this.appDirs) {\n const apiDir = path.join(appDir, \"api\");\n let routeFiles: string[] = [];\n\n if (fs.existsSync(apiDir)) {\n routeFiles = this.findRouteFiles(apiDir);\n }\n\n for (const filePath of routeFiles) {\n await this.loadRoute(filePath, appDir);\n }\n\n await this.loadRootRoutes(appDir);\n await this.loadProgrammaticApiRoutes(appDir);\n }\n\n if (process.env.FARM_VERBOSE) {\n logger.success(`Discovered ${this.routes.size} API routes`);\n for (const [routePath, route] of this.routes) {\n logger.info(` ${route.methods.join(\", \")} ${routePath}`);\n }\n }\n }\n\n /**\n * Recursively find all route.ts files\n */\n private findRouteFiles(dir: string): string[] {\n const files: string[] = [];\n\n if (!fs.existsSync(dir)) {\n return files;\n }\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n files.push(...this.findRouteFiles(fullPath));\n } else if (\n entry.name === \"route.ts\" ||\n entry.name === \"route.tsx\" ||\n entry.name === \"route.js\"\n ) {\n files.push(fullPath);\n }\n }\n\n return files;\n }\n\n /**\n * Load a route.ts file and extract HTTP method exports\n */\n private async loadRoute(filePath: string, appDir: string): Promise<void> {\n try {\n // Convert file path to API route path\n // /app/api/auth/login/route.ts -> /api/auth/login\n const apiDir = path.join(appDir, \"api\");\n const relativePath = path.relative(apiDir, path.dirname(filePath));\n const routePath = \"/api/\" + (relativePath === \".\" ? \"\" : relativePath.replace(/\\\\/g, \"/\"));\n\n const routeModule = await this.loadModule(filePath);\n\n const endpoints: Record<string, any> = {};\n const availableMethods: string[] = [];\n\n for (const method of API_ROUTE_METHODS) {\n if (routeModule[method]) {\n endpoints[method] = routeModule[method];\n availableMethods.push(method);\n }\n }\n\n if (availableMethods.length > 0) {\n const runtimeConfig = normalizeFarmRouteRuntimeConfig(\n getFarmRouteRuntimeConfig(routeModule),\n `API route \"${routePath}\"`,\n );\n this.routes.set(routePath, {\n path: routePath,\n filePath,\n methods: availableMethods,\n endpoints,\n ...runtimeConfig,\n });\n }\n } catch (error) {\n this.handleLoadError(`Error loading route ${filePath}`, error);\n }\n }\n\n /**\n * Load explicit-path endpoints from src/routes.ts-style files.\n */\n private async loadRootRoutes(appDir: string): Promise<void> {\n const routesFile = this.findRootRoutesFile(appDir);\n if (!routesFile) {\n return;\n }\n\n try {\n const routesModule = await this.loadModule(routesFile);\n\n for (const exportValue of Object.values(routesModule)) {\n const endpoint = exportValue as any;\n if (!endpoint?.__path) {\n continue;\n }\n\n const method = String(endpoint.__method || \"GET\").toUpperCase();\n this.addEndpoint(endpoint.__path, routesFile, method, endpoint);\n }\n } catch (error) {\n this.handleLoadError(`Error loading root API routes ${routesFile}`, error);\n }\n }\n\n private async loadProgrammaticApiRoutes(appDir: string): Promise<void> {\n const candidateRoots = [path.dirname(appDir), appDir];\n const routeFiles = Array.from(\n new Set(candidateRoots.flatMap((srcRoot) => findProgrammaticRouteFilesInDir(srcRoot))),\n );\n if (routeFiles.length === 0) return;\n\n const { getProgrammaticRouteManifest } = await import(\"../routes\");\n\n for (const routeFile of routeFiles) {\n try {\n const routesModule = await this.loadModule(routeFile);\n const manifest = getProgrammaticRouteManifest(routesModule);\n if (!manifest) continue;\n\n for (const definition of manifest.routes) {\n if (definition.kind !== \"api\") continue;\n this.addProgrammaticApiRoute(routeFile, definition);\n }\n } catch (error) {\n this.handleLoadError(`Error loading programmatic API routes ${routeFile}`, error);\n }\n }\n }\n\n private handleLoadError(message: string, error: unknown): void {\n logger.error(`${message}: ${error}`);\n if (this.throwOnLoadError) {\n throw error;\n }\n }\n\n private findRootRoutesFile(appDir: string): string | null {\n const routeNames = [\"routes.ts\", \"routes.tsx\", \"routes.js\"];\n const candidateDirs = [path.dirname(appDir), appDir];\n const seen = new Set<string>();\n\n for (const dir of candidateDirs) {\n for (const routeName of routeNames) {\n const routesFile = path.join(dir, routeName);\n if (seen.has(routesFile)) {\n continue;\n }\n seen.add(routesFile);\n\n if (fs.existsSync(routesFile)) {\n return routesFile;\n }\n }\n }\n\n return null;\n }\n\n private async loadModule(filePath: string): Promise<Record<string, unknown>> {\n if (this.viteServer) {\n return await this.viteServer.ssrLoadModule(filePath);\n }\n\n const fileUrl = `file://${filePath}`;\n return await import(/* @vite-ignore */ fileUrl);\n }\n\n private addEndpoint(\n routePath: string,\n filePath: string,\n method: string,\n endpoint: any,\n runtimeConfig: FarmRouteRuntimeConfig = {},\n ): void {\n const normalizedMethod = method.toUpperCase();\n const existingRoute = this.routes.get(routePath);\n\n if (existingRoute) {\n if (!existingRoute.methods.includes(normalizedMethod)) {\n existingRoute.methods.push(normalizedMethod);\n }\n existingRoute.endpoints[normalizedMethod] = endpoint;\n Object.assign(existingRoute, runtimeConfig);\n return;\n }\n\n this.routes.set(routePath, {\n path: routePath,\n filePath,\n methods: [normalizedMethod],\n endpoints: { [normalizedMethod]: endpoint },\n ...runtimeConfig,\n });\n }\n\n private addProgrammaticApiRoute(filePath: string, route: ProgrammaticApiRoute): void {\n const modulePath = createProgrammaticRouteModuleId(filePath, \"api\", route.path);\n const runtimeConfig = normalizeFarmRouteRuntimeConfig(route, `API route \"${route.path}\"`);\n for (const [method, endpoint] of Object.entries(route.methods)) {\n if (endpoint) {\n this.addEndpoint(route.path, modulePath, method, endpoint, runtimeConfig);\n }\n }\n }\n\n /**\n * Get the handler that directly invokes endpoint handlers\n */\n getHandler(): ((req: Request) => Promise<Response>) | null {\n if (this.routes.size === 0) {\n return null;\n }\n\n return async (request: Request): Promise<Response> => {\n const url = new URL(request.url);\n const pathname = url.pathname;\n const method = request.method.toUpperCase();\n\n // Find matching route\n const match = matchAPIRoute(this.routes, pathname);\n if (!match) {\n return new Response(JSON.stringify({ error: \"Not Found\" }), {\n status: 404,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n // Check if method is supported\n const { route, params } = match;\n const endpoint = route.endpoints[method];\n if (!endpoint) {\n return new Response(JSON.stringify({ error: \"Method Not Allowed\" }), {\n status: 405,\n headers: {\n Allow: route.methods.join(\", \"),\n \"Content-Type\": \"application/json\",\n },\n });\n }\n\n const invoke = async () => {\n try {\n return await invokeAPIRouteEndpoint(endpoint, request, params, this.bodySizeLimit);\n } catch (error: any) {\n console.error(`[API Error] ${pathname}:`, error);\n return new Response(JSON.stringify({ error: \"Internal Server Error\" }), {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n };\n\n return this.i18n?.config.enabled\n ? _runWithFarmI18nRequest(this.i18n, request, invoke, {\n redirect: false,\n })\n : invoke();\n };\n }\n\n /**\n * Check if a path is an API route\n */\n isAPIRoute(pathname: string): boolean {\n return Boolean(this.matchRoute(pathname));\n }\n\n matchRoute(pathname: string): APIRouteMatch<APIRoute> | null {\n return matchAPIRoute(this.routes, pathname);\n }\n\n /**\n * Get all routes for client type generation\n */\n getRoutes(): Map<string, APIRoute> {\n return this.routes;\n }\n}\n\nexport {\n invokeAPIRouteEndpoint,\n isWebResponse,\n matchAPIRoute,\n normalizeRouteResponse,\n} from \"./runtime\";\nexport type { APIRouteMatch, APIRouteParams, APIRouteParamValue } from \"./runtime\";\n","import type { ParsedRoute } from \"./types\";\n\nexport const PROGRAMMATIC_ROUTE_FILE_NAMES = [\n \"farm.route.ts\",\n \"farm.route.tsx\",\n \"farm.route.js\",\n \"farm.route.jsx\",\n \"farm.routes.ts\",\n \"farm.routes.tsx\",\n \"farm.routes.js\",\n \"farm.routes.jsx\",\n \"routes.ts\",\n \"routes.tsx\",\n \"routes.js\",\n \"routes.jsx\",\n] as const;\n\nexport interface ProgrammaticRouteSearchClientOptions {\n stripDefaults?: boolean | readonly string[];\n preserve?: readonly string[];\n temporary?: readonly string[];\n}\n\ntype ProgrammaticRouteSearchLike =\n | { parse(value: unknown): unknown }\n | ({\n schema?: { parse(value: unknown): unknown };\n } & ProgrammaticRouteSearchClientOptions);\n\nexport function getProgrammaticRouteSearchClientOptions(\n search: ProgrammaticRouteSearchLike | undefined,\n): ProgrammaticRouteSearchClientOptions | undefined {\n if (!search || \"parse\" in search) return undefined;\n\n const options: ProgrammaticRouteSearchClientOptions = {};\n if (typeof search.stripDefaults !== \"undefined\") options.stripDefaults = search.stripDefaults;\n if (search.preserve?.length) options.preserve = [...search.preserve];\n if (search.temporary?.length) options.temporary = [...search.temporary];\n\n return Object.keys(options).length > 0 ? options : undefined;\n}\n\nexport function isProgrammaticRoutesFileName(fileName: string): boolean {\n const normalized = fileName.replace(/\\\\/g, \"/\");\n const baseName = normalized.split(\"/\").pop() || normalized;\n return PROGRAMMATIC_ROUTE_FILE_NAMES.includes(\n baseName as (typeof PROGRAMMATIC_ROUTE_FILE_NAMES)[number],\n );\n}\n\nexport function createProgrammaticRouteModuleId(\n filePath: string,\n kind: \"page\" | \"layout\" | \"api\",\n routePath: string,\n): string {\n return `${filePath}?farm-route=${kind}:${encodeURIComponent(normalizeProgrammaticRoutePath(routePath))}`;\n}\n\nexport function parseProgrammaticRouteModuleId(moduleId: string): {\n filePath: string;\n kind: \"page\" | \"layout\" | \"api\";\n routePath: string;\n} | null {\n const queryIndex = moduleId.indexOf(\"?\");\n if (queryIndex === -1) return null;\n\n const filePath = moduleId.slice(0, queryIndex);\n const params = new URLSearchParams(moduleId.slice(queryIndex + 1));\n const value = params.get(\"farm-route\");\n if (!value) return null;\n\n const separator = value.indexOf(\":\");\n if (separator === -1) return null;\n\n const kind = value.slice(0, separator);\n if (kind !== \"page\" && kind !== \"layout\" && kind !== \"api\") return null;\n\n return {\n filePath,\n kind,\n routePath: normalizeProgrammaticRoutePath(value.slice(separator + 1)),\n };\n}\n\nexport function parseProgrammaticRoutePath(\n routePath: string,\n type: ParsedRoute[\"type\"] = \"page\",\n): ParsedRoute {\n const fileName = type === \"layout\" ? \"layout.tsx\" : \"page.tsx\";\n const normalized = normalizeProgrammaticRoutePath(routePath);\n const filePath =\n normalized === \"/\" ? fileName : `${normalized.slice(1).replace(/\\/+$/, \"\")}/${fileName}`;\n\n return {\n filePath,\n segments: normalized.split(\"/\").filter(Boolean).map(parseRouteSegment),\n type,\n };\n}\n\nexport function scanProgrammaticPagePaths(source: string): string[] {\n const paths = new Set<string>();\n const callRe = /\\b(?:page|createRoute)\\s*\\(\\s*([\"'`])([^\"'`]+)\\1/g;\n\n for (const match of source.matchAll(callRe)) {\n if (match[2]) paths.add(normalizeProgrammaticRoutePath(match[2]));\n }\n\n return Array.from(paths);\n}\n\nexport function normalizeProgrammaticRoutePath(routePath: string): string {\n const withSlash = routePath.startsWith(\"/\") ? routePath : `/${routePath}`;\n const withoutTrailing = withSlash.length > 1 ? withSlash.replace(/\\/+$/, \"\") : withSlash;\n return withoutTrailing || \"/\";\n}\n\nfunction parseRouteSegment(segment: string): ParsedRoute[\"segments\"][number] {\n if (segment.startsWith(\"[\") && segment.endsWith(\"]\")) {\n let name = segment.slice(1, -1);\n let isOptional = false;\n let isCatchAll = false;\n\n if (name.startsWith(\"[\") && name.endsWith(\"]\")) {\n isOptional = true;\n name = name.slice(1, -1);\n }\n\n if (name.startsWith(\"...\")) {\n isCatchAll = true;\n name = name.slice(3);\n }\n\n return { segment: name, isDynamic: true, isOptional, isCatchAll };\n }\n\n return { segment, isDynamic: false, isOptional: false, isCatchAll: false };\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { PROGRAMMATIC_ROUTE_FILE_NAMES, scanProgrammaticPagePaths } from \"./routes-shared\";\nimport type { ProgrammaticRouteManifest } from \"./routes\";\n\nexport interface LoadedProgrammaticRouteManifest {\n filePath: string;\n manifest: ProgrammaticRouteManifest;\n}\n\nexport async function loadProgrammaticRouteManifests(options: {\n root: string;\n srcDir?: string;\n loadModule: (filePath: string) => Promise<Record<string, any>>;\n}): Promise<LoadedProgrammaticRouteManifest[]> {\n const manifests: LoadedProgrammaticRouteManifest[] = [];\n const routeFiles = findProgrammaticRouteFiles(options.root, options.srcDir);\n if (routeFiles.length === 0) return manifests;\n\n const { getProgrammaticRouteManifest } = await import(\"./routes\");\n\n for (const filePath of routeFiles) {\n const mod = await options.loadModule(filePath);\n const manifest = getProgrammaticRouteManifest(mod);\n if (manifest) {\n manifests.push({ filePath, manifest });\n }\n }\n\n return manifests;\n}\n\nexport function findProgrammaticRouteFiles(root: string, srcDir = \"src\"): string[] {\n return findProgrammaticRouteFilesInDir(join(root, srcDir));\n}\n\nexport function findProgrammaticRouteFilesInDir(srcRoot: string): string[] {\n const files: string[] = [];\n\n for (const fileName of PROGRAMMATIC_ROUTE_FILE_NAMES) {\n const filePath = join(srcRoot, fileName);\n if (existsSync(filePath)) {\n files.push(filePath);\n }\n }\n\n return files;\n}\n\nexport async function discoverProgrammaticRoutePaths(\n root: string,\n srcDir = \"src\",\n): Promise<string[]> {\n const paths = new Set<string>();\n const files = new Set([\n ...findProgrammaticRouteFiles(root, srcDir),\n ...(await findProgrammaticRouteSourceFiles(join(root, srcDir))),\n ]);\n\n for (const filePath of files) {\n const source = readFileSync(filePath, \"utf8\");\n for (const routePath of scanProgrammaticPagePaths(source)) {\n paths.add(routePath);\n }\n }\n\n return Array.from(paths).sort();\n}\n\nasync function findProgrammaticRouteSourceFiles(srcRoot: string): Promise<string[]> {\n if (!existsSync(srcRoot)) {\n return [];\n }\n\n try {\n const glob = await import(\"fast-glob\");\n return await glob.default(\"**/*.{ts,tsx,js,jsx}\", {\n cwd: srcRoot,\n absolute: true,\n ignore: [\n \"**/*.d.ts\",\n \"**/node_modules/**\",\n \"**/.*/**\",\n \"farm-routes.d.ts\",\n \"farm-env.d.ts\",\n \"lib/api.generated.ts\",\n ],\n });\n } catch {\n return [];\n }\n}\n"],"mappings":"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","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|