@vercel/fs-detectors 5.1.0 → 5.1.2

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 (31) hide show
  1. package/dist/detect-builders.js +0 -1
  2. package/dist/detect-file-system-api.js +0 -1
  3. package/dist/detect-framework.js +0 -1
  4. package/dist/detectors/filesystem.js +0 -1
  5. package/dist/detectors/local-file-system-detector.js +0 -1
  6. package/dist/get-project-paths.js +0 -1
  7. package/dist/index.js +0 -1
  8. package/dist/is-official-runtime.js +0 -1
  9. package/dist/monorepos/get-monorepo-default-settings.js +0 -1
  10. package/dist/monorepos/monorepo-managers.js +0 -1
  11. package/dist/package-managers/package-managers.js +0 -1
  12. package/dist/workspaces/get-glob-fs.js +0 -1
  13. package/dist/workspaces/get-workspace-package-paths.js +0 -1
  14. package/dist/workspaces/get-workspaces.js +0 -1
  15. package/dist/workspaces/workspace-managers.js +0 -1
  16. package/package.json +5 -4
  17. package/dist/detect-builders.js.map +0 -7
  18. package/dist/detect-file-system-api.js.map +0 -7
  19. package/dist/detect-framework.js.map +0 -7
  20. package/dist/detectors/filesystem.js.map +0 -7
  21. package/dist/detectors/local-file-system-detector.js.map +0 -7
  22. package/dist/get-project-paths.js.map +0 -7
  23. package/dist/index.js.map +0 -7
  24. package/dist/is-official-runtime.js.map +0 -7
  25. package/dist/monorepos/get-monorepo-default-settings.js.map +0 -7
  26. package/dist/monorepos/monorepo-managers.js.map +0 -7
  27. package/dist/package-managers/package-managers.js.map +0 -7
  28. package/dist/workspaces/get-glob-fs.js.map +0 -7
  29. package/dist/workspaces/get-workspace-package-paths.js.map +0 -7
  30. package/dist/workspaces/get-workspaces.js.map +0 -7
  31. package/dist/workspaces/workspace-managers.js.map +0 -7
@@ -771,4 +771,3 @@ function sortFilesBySegmentCount(fileA, fileB) {
771
771
  detectOutputDirectory,
772
772
  sortFiles
773
773
  });
774
- //# sourceMappingURL=detect-builders.js.map
@@ -190,4 +190,3 @@ async function detectFileSystemAPI({
190
190
  0 && (module.exports = {
191
191
  detectFileSystemAPI
192
192
  });
193
- //# sourceMappingURL=detect-file-system-api.js.map
@@ -216,4 +216,3 @@ function lookupInstalledVersion(cwd, packageName) {
216
216
  detectFrameworks,
217
217
  removeSupersededFrameworks
218
218
  });
219
- //# sourceMappingURL=detect-framework.js.map
@@ -106,4 +106,3 @@ class DetectorFilesystem {
106
106
  0 && (module.exports = {
107
107
  DetectorFilesystem
108
108
  });
109
- //# sourceMappingURL=filesystem.js.map
@@ -92,4 +92,3 @@ class LocalFileSystemDetector extends import_filesystem.DetectorFilesystem {
92
92
  0 && (module.exports = {
93
93
  LocalFileSystemDetector
94
94
  });
95
- //# sourceMappingURL=local-file-system-detector.js.map
@@ -76,4 +76,3 @@ const getProjectPaths = async ({
76
76
  0 && (module.exports = {
77
77
  getProjectPaths
78
78
  });
79
- //# sourceMappingURL=get-project-paths.js.map
package/dist/index.js CHANGED
@@ -84,4 +84,3 @@ __reExport(src_exports, require("./monorepos/get-monorepo-default-settings"), mo
84
84
  workspaceManagers,
85
85
  ...require("./monorepos/get-monorepo-default-settings")
86
86
  });
87
- //# sourceMappingURL=index.js.map
@@ -36,4 +36,3 @@ const isStaticRuntime = (name) => {
36
36
  isOfficialRuntime,
37
37
  isStaticRuntime
38
38
  });
39
- //# sourceMappingURL=is-official-runtime.js.map
@@ -166,4 +166,3 @@ async function getMonorepoDefaultSettings(projectName, projectPath, relativeToRo
166
166
  MissingBuildTarget,
167
167
  getMonorepoDefaultSettings
168
168
  });
169
- //# sourceMappingURL=get-monorepo-default-settings.js.map
@@ -115,4 +115,3 @@ var monorepo_managers_default = monorepoManagers;
115
115
  0 && (module.exports = {
116
116
  monorepoManagers
117
117
  });
118
- //# sourceMappingURL=monorepo-managers.js.map
@@ -99,4 +99,3 @@ const packageManagers = [
99
99
  0 && (module.exports = {
100
100
  packageManagers
101
101
  });
102
- //# sourceMappingURL=package-managers.js.map
@@ -93,4 +93,3 @@ function getGlobFs(_fs) {
93
93
  0 && (module.exports = {
94
94
  getGlobFs
95
95
  });
96
- //# sourceMappingURL=get-glob-fs.js.map
@@ -138,4 +138,3 @@ async function getRushWorkspacePackagePaths({
138
138
  0 && (module.exports = {
139
139
  getWorkspacePackagePaths
140
140
  });
141
- //# sourceMappingURL=get-workspace-package-paths.js.map
@@ -73,4 +73,3 @@ async function getWorkspaces({
73
73
  0 && (module.exports = {
74
74
  getWorkspaces
75
75
  });
76
- //# sourceMappingURL=get-workspaces.js.map
@@ -105,4 +105,3 @@ var workspace_managers_default = workspaceManagers;
105
105
  0 && (module.exports = {
106
106
  workspaceManagers
107
107
  });
108
- //# sourceMappingURL=workspace-managers.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vercel/fs-detectors",
3
- "version": "5.1.0",
3
+ "version": "5.1.2",
4
4
  "description": "Vercel filesystem detectors",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -16,7 +16,7 @@
16
16
  "dependencies": {
17
17
  "@vercel/error-utils": "2.0.1",
18
18
  "@vercel/frameworks": "2.0.2",
19
- "@vercel/routing-utils": "3.0.0",
19
+ "@vercel/routing-utils": "3.1.0",
20
20
  "glob": "8.0.3",
21
21
  "js-yaml": "4.1.0",
22
22
  "json5": "2.2.2",
@@ -30,7 +30,7 @@
30
30
  "@types/minimatch": "3.0.5",
31
31
  "@types/node": "14.18.33",
32
32
  "@types/semver": "7.3.10",
33
- "@vercel/build-utils": "7.2.0",
33
+ "@vercel/build-utils": "7.2.2",
34
34
  "jest-junit": "16.0.0",
35
35
  "typescript": "4.9.5"
36
36
  },
@@ -38,6 +38,7 @@
38
38
  "build": "node ../../utils/build.mjs",
39
39
  "test": "jest --reporters=default --reporters=jest-junit --env node --verbose --runInBand --bail",
40
40
  "test-unit": "pnpm test test/unit.*test.*",
41
- "test-e2e": "pnpm test test/integration.test.ts"
41
+ "test-e2e": "pnpm test test/integration.test.ts",
42
+ "type-check": "tsc --noEmit"
42
43
  }
43
44
  }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/detect-builders.ts"],
4
- "sourcesContent": ["import minimatch from 'minimatch';\nimport { valid as validSemver } from 'semver';\nimport { parse as parsePath, extname } from 'path';\nimport type { Route, RouteWithSrc } from '@vercel/routing-utils';\nimport frameworkList, { Framework } from '@vercel/frameworks';\nimport type {\n PackageJson,\n Builder,\n Config,\n BuilderFunctions,\n ProjectSettings,\n} from '@vercel/build-utils';\nimport { isOfficialRuntime } from './is-official-runtime';\nconst slugToFramework = new Map<string | null, Framework>(\n frameworkList.map(f => [f.slug, f])\n);\n\ninterface ErrorResponse {\n code: string;\n message: string;\n action?: string;\n link?: string;\n}\n\ninterface Options {\n tag?: string;\n functions?: BuilderFunctions;\n ignoreBuildScript?: boolean;\n projectSettings?: ProjectSettings;\n cleanUrls?: boolean;\n trailingSlash?: boolean;\n featHandleMiss?: boolean;\n}\n\n// We need to sort the file paths by alphabet to make\n// sure the routes stay in the same order e.g. for deduping\nexport function sortFiles(fileA: string, fileB: string) {\n return fileA.localeCompare(fileB);\n}\n\nexport function detectApiExtensions(builders: Builder[]): Set<string> {\n return new Set<string>(\n builders\n .filter((b): b is Builder & { src: string } =>\n Boolean(b.config && b.config.zeroConfig && b.src?.startsWith('api/'))\n )\n .map(b => extname(b.src))\n .filter(Boolean)\n );\n}\n\nexport function detectApiDirectory(builders: Builder[]): string | null {\n // TODO: We eventually want to save the api directory to\n // builder.config.apiDirectory so it is only detected once\n const found = builders.some(\n b => b.config && b.config.zeroConfig && b.src?.startsWith('api/')\n );\n return found ? 'api' : null;\n}\n\n// TODO: Replace this function with `config.outputDirectory`\nfunction getPublicBuilder(\n builders: Builder[]\n): (Builder & { src: string }) | null {\n for (const builder of builders) {\n if (\n typeof builder.src === 'string' &&\n isOfficialRuntime('static', builder.use) &&\n /^.*\\/\\*\\*\\/\\*$/.test(builder.src) &&\n builder.config?.zeroConfig === true\n ) {\n return builder as Builder & { src: string };\n }\n }\n\n return null;\n}\nexport function detectOutputDirectory(builders: Builder[]): string | null {\n // TODO: We eventually want to save the output directory to\n // builder.config.outputDirectory so it is only detected once\n const publicBuilder = getPublicBuilder(builders);\n return publicBuilder ? publicBuilder.src.replace('/**/*', '') : null;\n}\n\nexport async function detectBuilders(\n files: string[],\n pkg?: PackageJson | undefined | null,\n options: Options = {}\n): Promise<{\n builders: Builder[] | null;\n errors: ErrorResponse[] | null;\n warnings: ErrorResponse[];\n defaultRoutes: Route[] | null;\n redirectRoutes: Route[] | null;\n rewriteRoutes: Route[] | null;\n errorRoutes: Route[] | null;\n}> {\n const errors: ErrorResponse[] = [];\n const warnings: ErrorResponse[] = [];\n\n let apiBuilders: Builder[] = [];\n let frontendBuilder: Builder | null = null;\n\n const functionError = validateFunctions(options);\n\n if (functionError) {\n return {\n builders: null,\n errors: [functionError],\n warnings,\n defaultRoutes: null,\n redirectRoutes: null,\n rewriteRoutes: null,\n errorRoutes: null,\n };\n }\n\n const sortedFiles = files.sort(sortFiles);\n const apiSortedFiles = files.sort(sortFilesBySegmentCount);\n\n // Keep track of functions that are used\n const usedFunctions = new Set<string>();\n\n const addToUsedFunctions = (builder: Builder) => {\n const key = Object.keys(builder.config!.functions || {})[0];\n if (key) usedFunctions.add(key);\n };\n\n const absolutePathCache = new Map<string, string>();\n\n const { projectSettings = {} } = options;\n const { buildCommand, outputDirectory, framework } = projectSettings;\n const frameworkConfig = slugToFramework.get(framework || '');\n const ignoreRuntimes = new Set(frameworkConfig?.ignoreRuntimes);\n const withTag = options.tag ? `@${options.tag}` : '';\n const apiMatches = getApiMatches()\n .filter(\n b =>\n // Root-level middleware is enabled, unless `disableRootMiddleware: true`\n (b.config?.middleware && !frameworkConfig?.disableRootMiddleware) ||\n // \"api\" dir runtimes are enabled, unless opted-out via `ignoreRuntimes`\n !ignoreRuntimes.has(b.use)\n )\n .map(b => {\n b.use = `${b.use}${withTag}`;\n return b;\n });\n\n // If either is missing we'll make the frontend static\n const makeFrontendStatic = buildCommand === '' || outputDirectory === '';\n\n // Only used when there is no frontend builder,\n // but prevents looping over the files again.\n const usedOutputDirectory = outputDirectory || 'public';\n let hasUsedOutputDirectory = false;\n let hasNoneApiFiles = false;\n let hasNextApiFiles = false;\n\n let fallbackEntrypoint: string | null = null;\n\n const apiRoutes: RouteWithSrc[] = [];\n const dynamicRoutes: RouteWithSrc[] = [];\n\n // API\n for (const fileName of sortedFiles) {\n const apiBuilder = maybeGetApiBuilder(fileName, apiMatches, options);\n\n if (apiBuilder) {\n const { routeError, apiRoute, isDynamic } = getApiRoute(\n fileName,\n apiSortedFiles,\n options,\n absolutePathCache\n );\n\n if (routeError) {\n return {\n builders: null,\n errors: [routeError],\n warnings,\n defaultRoutes: null,\n redirectRoutes: null,\n rewriteRoutes: null,\n errorRoutes: null,\n };\n }\n\n if (apiRoute) {\n apiRoutes.push(apiRoute);\n if (isDynamic) {\n dynamicRoutes.push(apiRoute);\n }\n }\n\n addToUsedFunctions(apiBuilder);\n apiBuilders.push(apiBuilder);\n continue;\n }\n\n if (\n !hasUsedOutputDirectory &&\n fileName.startsWith(`${usedOutputDirectory}/`)\n ) {\n hasUsedOutputDirectory = true;\n }\n\n if (\n !hasNoneApiFiles &&\n !fileName.startsWith('api/') &&\n fileName !== 'package.json'\n ) {\n hasNoneApiFiles = true;\n }\n\n if (\n !hasNextApiFiles &&\n (fileName.startsWith('pages/api') || fileName.startsWith('src/pages/api'))\n ) {\n hasNextApiFiles = true;\n }\n\n if (\n !fallbackEntrypoint &&\n buildCommand &&\n !fileName.includes('/') &&\n fileName !== 'now.json' &&\n fileName !== 'vercel.json'\n ) {\n fallbackEntrypoint = fileName;\n }\n }\n\n if (\n !makeFrontendStatic &&\n (hasBuildScript(pkg) || buildCommand || framework)\n ) {\n // Framework or Build\n frontendBuilder = detectFrontBuilder(\n pkg,\n files,\n usedFunctions,\n fallbackEntrypoint,\n options\n );\n } else {\n if (\n pkg &&\n !makeFrontendStatic &&\n !apiBuilders.length &&\n !options.ignoreBuildScript\n ) {\n // We only show this error when there are no api builders\n // since the dependencies of the pkg could be used for those\n errors.push(getMissingBuildScriptError());\n return {\n errors,\n warnings,\n builders: null,\n redirectRoutes: null,\n defaultRoutes: null,\n rewriteRoutes: null,\n errorRoutes: null,\n };\n }\n\n // If `outputDirectory` is an empty string,\n // we'll default to the root directory.\n if (hasUsedOutputDirectory && outputDirectory !== '') {\n frontendBuilder = {\n use: '@vercel/static',\n src: `${usedOutputDirectory}/**/*`,\n config: {\n zeroConfig: true,\n outputDirectory: usedOutputDirectory,\n },\n };\n } else if (apiBuilders.length && hasNoneApiFiles) {\n // Everything besides the api directory\n // and package.json can be served as static files\n frontendBuilder = {\n use: '@vercel/static',\n src: '!{api/**,package.json,middleware.[jt]s}',\n config: {\n zeroConfig: true,\n },\n };\n }\n }\n\n const unusedFunctionError = checkUnusedFunctions(\n frontendBuilder,\n usedFunctions,\n options\n );\n\n if (unusedFunctionError) {\n return {\n builders: null,\n errors: [unusedFunctionError],\n warnings,\n redirectRoutes: null,\n defaultRoutes: null,\n rewriteRoutes: null,\n errorRoutes: null,\n };\n }\n\n // Exclude the middleware builder for Next.js apps since @vercel/next\n // will build middlewares.\n //\n // While maybeGetApiBuilder() excludes the middleware builder, however,\n // we need to check if it's a Next.js app here again for the case where\n // `projectSettings.framework == null`.\n if (\n framework === null &&\n frontendBuilder?.use === '@vercel/next' &&\n apiBuilders.length > 0\n ) {\n apiBuilders = apiBuilders.filter(builder => {\n const isMiddlewareBuilder =\n builder.use === '@vercel/node' && builder.config?.middleware;\n return !isMiddlewareBuilder;\n });\n }\n\n const builders: Builder[] = [];\n\n if (apiBuilders.length) {\n builders.push(...apiBuilders);\n }\n\n if (frontendBuilder) {\n builders.push(frontendBuilder);\n\n if (\n hasNextApiFiles &&\n apiBuilders.some(b => isOfficialRuntime('node', b.use))\n ) {\n warnings.push({\n code: 'conflicting_files',\n message:\n 'When using Next.js, it is recommended to place JavaScript Functions inside of the `pages/api` (provided by Next.js) directory instead of `api` (provided by Vercel). Other languages (Python, Go, etc) should still go in the `api` directory.',\n link: 'https://nextjs.org/docs/api-routes/introduction',\n action: 'Learn More',\n });\n }\n }\n\n const routesResult = getRouteResult(\n apiRoutes,\n dynamicRoutes,\n usedOutputDirectory,\n apiBuilders,\n frontendBuilder,\n options\n );\n\n return {\n warnings,\n builders: builders.length ? builders : null,\n errors: errors.length ? errors : null,\n redirectRoutes: routesResult.redirectRoutes,\n defaultRoutes: routesResult.defaultRoutes,\n rewriteRoutes: routesResult.rewriteRoutes,\n errorRoutes: routesResult.errorRoutes,\n };\n}\n\nfunction maybeGetApiBuilder(\n fileName: string,\n apiMatches: Builder[],\n options: Options\n) {\n const middleware =\n fileName === 'middleware.js' || fileName === 'middleware.ts';\n\n // Root-level Middleware file is handled by `@vercel/next`, so don't\n // schedule a separate Builder when \"nextjs\" framework is selected\n if (middleware && options.projectSettings?.framework === 'nextjs') {\n return null;\n }\n\n if (!(fileName.startsWith('api/') || middleware)) {\n return null;\n }\n\n if (fileName.includes('/.')) {\n return null;\n }\n\n if (fileName.includes('/_')) {\n return null;\n }\n\n if (fileName.includes('/node_modules/')) {\n return null;\n }\n\n if (fileName.endsWith('.d.ts')) {\n return null;\n }\n\n const match = apiMatches.find(({ src = '**' }) => {\n return src === fileName || minimatch(fileName, src);\n });\n\n const { fnPattern, func } = getFunction(fileName, options);\n\n const use = func?.runtime || match?.use;\n\n if (!use) {\n return null;\n }\n\n const config: Config = { zeroConfig: true };\n\n if (middleware) {\n config.middleware = true;\n }\n\n if (fnPattern && func) {\n config.functions = { [fnPattern]: func };\n\n if (func.includeFiles) {\n config.includeFiles = func.includeFiles;\n }\n\n if (func.excludeFiles) {\n config.excludeFiles = func.excludeFiles;\n }\n }\n\n const builder: Builder = {\n use,\n src: fileName,\n config,\n };\n\n return builder;\n}\n\nfunction getFunction(fileName: string, { functions = {} }: Options) {\n const keys = Object.keys(functions);\n\n if (!keys.length) {\n return { fnPattern: null, func: null };\n }\n\n const func = keys.find(key => key === fileName || minimatch(fileName, key));\n\n return func\n ? { fnPattern: func, func: functions[func] }\n : { fnPattern: null, func: null };\n}\n\nfunction getApiMatches(): Builder[] {\n const config = { zeroConfig: true };\n\n return [\n {\n src: 'middleware.[jt]s',\n use: `@vercel/node`,\n config: { ...config, middleware: true },\n },\n { src: 'api/**/*.+(js|mjs|ts|tsx)', use: `@vercel/node`, config },\n { src: 'api/**/!(*_test).go', use: `@vercel/go`, config },\n { src: 'api/**/*.py', use: `@vercel/python`, config },\n { src: 'api/**/*.rb', use: `@vercel/ruby`, config },\n ];\n}\n\nfunction hasBuildScript(pkg: PackageJson | undefined | null) {\n const { scripts = {} } = pkg || {};\n return Boolean(scripts && scripts['build']);\n}\n\nfunction detectFrontBuilder(\n pkg: PackageJson | null | undefined,\n files: string[],\n usedFunctions: Set<string>,\n fallbackEntrypoint: string | null,\n options: Options\n): Builder {\n const { tag, projectSettings = {} } = options;\n const withTag = tag ? `@${tag}` : '';\n const { createdAt = 0 } = projectSettings;\n let { framework } = projectSettings;\n\n const config: Config = {\n zeroConfig: true,\n };\n\n if (framework) {\n config.framework = framework;\n }\n\n if (projectSettings.devCommand) {\n config.devCommand = projectSettings.devCommand;\n }\n\n if (typeof projectSettings.installCommand === 'string') {\n config.installCommand = projectSettings.installCommand;\n }\n\n if (projectSettings.buildCommand) {\n config.buildCommand = projectSettings.buildCommand;\n }\n\n if (projectSettings.outputDirectory) {\n config.outputDirectory = projectSettings.outputDirectory;\n }\n\n if (\n pkg &&\n (framework === undefined ||\n (framework !== 'storybook' && createdAt < Date.parse('2020-03-01')))\n ) {\n const deps: PackageJson['dependencies'] = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n if (deps['next']) {\n framework = 'nextjs';\n }\n }\n\n if (options.functions) {\n // When the builder is not used yet we'll use it for the frontend\n Object.entries(options.functions).forEach(([key, func]) => {\n if (!usedFunctions.has(key)) {\n if (!config.functions) config.functions = {};\n config.functions[key] = { ...func };\n }\n });\n }\n\n const f = slugToFramework.get(framework || '');\n if (f && f.useRuntime) {\n const { src, use } = f.useRuntime;\n return { src, use: `${use}${withTag}`, config };\n }\n\n // Entrypoints for other frameworks\n // TODO - What if just a build script is provided, but no entrypoint.\n const entrypoints = new Set([\n 'package.json',\n 'config.yaml',\n 'config.toml',\n 'config.json',\n '_config.yml',\n 'config.yml',\n 'config.rb',\n ]);\n\n const source = pkg\n ? 'package.json'\n : files.find(file => entrypoints.has(file)) ||\n fallbackEntrypoint ||\n 'package.json';\n\n return {\n src: source || 'package.json',\n use: `@vercel/static-build${withTag}`,\n config,\n };\n}\n\nfunction getMissingBuildScriptError() {\n return {\n code: 'missing_build_script',\n message:\n 'Your `package.json` file is missing a `build` property inside the `scripts` property.' +\n '\\nLearn More: https://vercel.link/missing-build-script',\n };\n}\n\nfunction validateFunctions({ functions = {} }: Options) {\n for (const [path, func] of Object.entries(functions)) {\n if (path.length > 256) {\n return {\n code: 'invalid_function_glob',\n message: 'Function globs must be less than 256 characters long.',\n };\n }\n\n if (!func || typeof func !== 'object') {\n return {\n code: 'invalid_function',\n message: 'Function must be an object.',\n };\n }\n\n if (Object.keys(func).length === 0) {\n return {\n code: 'invalid_function',\n message: 'Function must contain at least one property.',\n };\n }\n\n if (\n func.maxDuration !== undefined &&\n (func.maxDuration < 1 ||\n func.maxDuration > 900 ||\n !Number.isInteger(func.maxDuration))\n ) {\n return {\n code: 'invalid_function_duration',\n message: 'Functions must have a duration between 1 and 900.',\n };\n }\n\n if (\n func.memory !== undefined &&\n (func.memory < 128 || func.memory > 3008)\n ) {\n return {\n code: 'invalid_function_memory',\n message: 'Functions must have a memory value between 128 and 3008',\n };\n }\n\n if (path.startsWith('/')) {\n return {\n code: 'invalid_function_source',\n message: `The function path \"${path}\" is invalid. The path must be relative to your project root and therefore cannot start with a slash.`,\n };\n }\n\n if (func.runtime !== undefined) {\n const tag = `${func.runtime}`.split('@').pop();\n\n if (!tag || !validSemver(tag)) {\n return {\n code: 'invalid_function_runtime',\n message:\n 'Function Runtimes must have a valid version, for example `now-php@1.0.0`.',\n };\n }\n }\n\n if (func.includeFiles !== undefined) {\n if (typeof func.includeFiles !== 'string') {\n return {\n code: 'invalid_function_property',\n message: `The property \\`includeFiles\\` must be a string.`,\n };\n }\n }\n\n if (func.excludeFiles !== undefined) {\n if (typeof func.excludeFiles !== 'string') {\n return {\n code: 'invalid_function_property',\n message: `The property \\`excludeFiles\\` must be a string.`,\n };\n }\n }\n }\n\n return null;\n}\n\nfunction checkUnusedFunctions(\n frontendBuilder: Builder | null,\n usedFunctions: Set<string>,\n options: Options\n): ErrorResponse | null {\n const unusedFunctions = new Set(\n Object.keys(options.functions || {}).filter(key => !usedFunctions.has(key))\n );\n\n if (!unusedFunctions.size) {\n return null;\n }\n\n // Next.js can use functions only for `src/pages` or `pages`\n if (frontendBuilder && isOfficialRuntime('next', frontendBuilder.use)) {\n for (const fnKey of unusedFunctions.values()) {\n if (\n fnKey.startsWith('pages/') ||\n fnKey.startsWith('src/pages') ||\n fnKey.startsWith('app/') ||\n fnKey.startsWith('src/app/')\n ) {\n unusedFunctions.delete(fnKey);\n } else {\n return {\n code: 'unused_function',\n message: `The pattern \"${fnKey}\" defined in \\`functions\\` doesn't match any Serverless Functions.`,\n action: 'Learn More',\n link: 'https://vercel.link/unmatched-function-pattern',\n };\n }\n }\n }\n\n if (unusedFunctions.size) {\n const [fnKey] = Array.from(unusedFunctions);\n\n return {\n code: 'unused_function',\n message: `The pattern \"${fnKey}\" defined in \\`functions\\` doesn't match any Serverless Functions inside the \\`api\\` directory.`,\n action: 'Learn More',\n link: 'https://vercel.link/unmatched-function-pattern',\n };\n }\n\n return null;\n}\n\nfunction getApiRoute(\n fileName: string,\n sortedFiles: string[],\n options: Options,\n absolutePathCache: Map<string, string>\n): {\n apiRoute: RouteWithSrc | null;\n isDynamic: boolean;\n routeError: ErrorResponse | null;\n} {\n const conflictingSegment = getConflictingSegment(fileName);\n\n if (conflictingSegment) {\n return {\n apiRoute: null,\n isDynamic: false,\n routeError: {\n code: 'conflicting_path_segment',\n message:\n `The segment \"${conflictingSegment}\" occurs more than ` +\n `one time in your path \"${fileName}\". Please make sure that ` +\n `every segment in a path is unique.`,\n },\n };\n }\n\n const occurrences = pathOccurrences(fileName, sortedFiles, absolutePathCache);\n\n if (occurrences.length > 0) {\n const messagePaths = concatArrayOfText(\n occurrences.map(name => `\"${name}\"`)\n );\n\n return {\n apiRoute: null,\n isDynamic: false,\n routeError: {\n code: 'conflicting_file_path',\n message:\n `Two or more files have conflicting paths or names. ` +\n `Please make sure path segments and filenames, without their extension, are unique. ` +\n `The path \"${fileName}\" has conflicts with ${messagePaths}.`,\n },\n };\n }\n\n const out = createRouteFromPath(\n fileName,\n Boolean(options.featHandleMiss),\n Boolean(options.cleanUrls)\n );\n\n return {\n apiRoute: out.route,\n isDynamic: out.isDynamic,\n routeError: null,\n };\n}\n\n// Checks if a placeholder with the same name is used\n// multiple times inside the same path\nfunction getConflictingSegment(filePath: string): string | null {\n const segments = new Set<string>();\n\n for (const segment of filePath.split('/')) {\n const name = getSegmentName(segment);\n\n if (name !== null && segments.has(name)) {\n return name;\n }\n\n if (name) {\n segments.add(name);\n }\n }\n\n return null;\n}\n\n// Takes a filename or foldername, strips the extension\n// gets the part between the \"[]\" brackets.\n// It will return `null` if there are no brackets\n// and therefore no segment.\nfunction getSegmentName(segment: string): string | null {\n const { name } = parsePath(segment);\n\n if (name.startsWith('[') && name.endsWith(']')) {\n return name.slice(1, -1);\n }\n\n return null;\n}\n\nfunction getAbsolutePath(unresolvedPath: string) {\n const { dir, name } = parsePath(unresolvedPath);\n const parts = joinPath(dir, name).split('/');\n return parts.map(part => part.replace(/\\[.*\\]/, '1')).join('/');\n}\n\n// Counts how often a path occurs when all placeholders\n// got resolved, so we can check if they have conflicts\nfunction pathOccurrences(\n fileName: string,\n files: string[],\n absolutePathCache: Map<string, string>\n): string[] {\n let currentAbsolutePath = absolutePathCache.get(fileName);\n\n if (!currentAbsolutePath) {\n currentAbsolutePath = getAbsolutePath(fileName);\n absolutePathCache.set(fileName, currentAbsolutePath);\n }\n\n const prev: string[] = [];\n\n // Do not call expensive functions like `minimatch` in here\n // because we iterate over every file.\n for (const file of files) {\n if (file === fileName) {\n continue;\n }\n\n let absolutePath = absolutePathCache.get(file);\n\n if (!absolutePath) {\n absolutePath = getAbsolutePath(file);\n absolutePathCache.set(file, absolutePath);\n }\n\n if (absolutePath === currentAbsolutePath) {\n prev.push(file);\n } else if (partiallyMatches(fileName, file)) {\n prev.push(file);\n }\n }\n\n return prev;\n}\n\nfunction joinPath(...segments: string[]) {\n const joinedPath = segments.join('/');\n return joinedPath.replace(/\\/{2,}/g, '/');\n}\n\nfunction escapeName(name: string) {\n const special = '[]^$.|?*+()'.split('');\n\n for (const char of special) {\n name = name.replace(new RegExp(`\\\\${char}`, 'g'), `\\\\${char}`);\n }\n\n return name;\n}\n\nfunction concatArrayOfText(texts: string[]): string {\n if (texts.length <= 2) {\n return texts.join(' and ');\n }\n\n const last = texts.pop();\n return `${texts.join(', ')}, and ${last}`;\n}\n\n// Check if the path partially matches and has the same\n// name for the path segment at the same position\nfunction partiallyMatches(pathA: string, pathB: string): boolean {\n const partsA = pathA.split('/');\n const partsB = pathB.split('/');\n\n const long = partsA.length > partsB.length ? partsA : partsB;\n const short = long === partsA ? partsB : partsA;\n\n let index = 0;\n\n for (const segmentShort of short) {\n const segmentLong = long[index];\n\n const nameLong = getSegmentName(segmentLong);\n const nameShort = getSegmentName(segmentShort);\n\n // If there are no segments or the paths differ we\n // return as they are not matching\n if (segmentShort !== segmentLong && (!nameLong || !nameShort)) {\n return false;\n }\n\n if (nameLong !== nameShort) {\n return true;\n }\n\n index += 1;\n }\n\n return false;\n}\n\nfunction createRouteFromPath(\n filePath: string,\n featHandleMiss: boolean,\n cleanUrls: boolean\n): { route: RouteWithSrc; isDynamic: boolean } {\n const parts = filePath.split('/');\n\n let counter = 1;\n const query: string[] = [];\n let isDynamic = false;\n\n const srcParts = parts.map((segment, i): string => {\n const name = getSegmentName(segment);\n const isLast = i === parts.length - 1;\n\n if (name !== null) {\n // We can't use `URLSearchParams` because `$` would get escaped\n query.push(`${name}=$${counter++}`);\n isDynamic = true;\n return `([^/]+)`;\n } else if (isLast) {\n const { name: fileName, ext } = parsePath(segment);\n const isIndex = fileName === 'index';\n const prefix = isIndex ? '/' : '';\n\n const names = [\n isIndex ? prefix : `${fileName}/`,\n prefix + escapeName(fileName),\n featHandleMiss && cleanUrls\n ? ''\n : prefix + escapeName(fileName) + escapeName(ext),\n ].filter(Boolean);\n\n // Either filename with extension, filename without extension\n // or nothing when the filename is `index`.\n // When `cleanUrls: true` then do *not* add the filename with extension.\n return `(${names.join('|')})${isIndex ? '?' : ''}`;\n }\n\n return segment;\n });\n\n const { name: fileName, ext } = parsePath(filePath);\n const isIndex = fileName === 'index';\n const queryString = `${query.length ? '?' : ''}${query.join('&')}`;\n\n const src = isIndex\n ? `^/${srcParts.slice(0, -1).join('/')}${srcParts.slice(-1)[0]}$`\n : `^/${srcParts.join('/')}$`;\n\n let route: RouteWithSrc;\n\n if (featHandleMiss) {\n const extensionless = ext ? filePath.slice(0, -ext.length) : filePath;\n route = {\n src,\n dest: `/${extensionless}${queryString}`,\n check: true,\n };\n } else {\n route = {\n src,\n dest: `/${filePath}${queryString}`,\n };\n }\n\n return { route, isDynamic };\n}\n\nfunction getRouteResult(\n apiRoutes: RouteWithSrc[],\n dynamicRoutes: RouteWithSrc[],\n outputDirectory: string,\n apiBuilders: Builder[],\n frontendBuilder: Builder | null,\n options: Options\n): {\n defaultRoutes: Route[];\n redirectRoutes: Route[];\n rewriteRoutes: Route[];\n errorRoutes: Route[];\n} {\n const defaultRoutes: Route[] = [];\n const redirectRoutes: Route[] = [];\n const rewriteRoutes: Route[] = [];\n const errorRoutes: Route[] = [];\n const framework = frontendBuilder?.config?.framework || '';\n const isGatsby = framework === 'gatsby';\n const isNextjs =\n framework === 'nextjs' || isOfficialRuntime('next', frontendBuilder?.use);\n const ignoreRuntimes = slugToFramework.get(framework)?.ignoreRuntimes;\n\n if (apiRoutes && apiRoutes.length > 0) {\n if (options.featHandleMiss) {\n // Exclude extension names if the corresponding plugin is not found in package.json\n // detectBuilders({ignoreRoutesForBuilders: ['@vercel/python']})\n // return a copy of routes.\n // We should exclud errorRoutes and\n const extSet = detectApiExtensions(apiBuilders);\n if (extSet.size > 0) {\n const extGroup = `(?:\\\\.(?:${Array.from(extSet)\n .map(ext => ext.slice(1))\n .join('|')}))`;\n\n if (options.cleanUrls) {\n redirectRoutes.push({\n src: `^/(api(?:.+)?)/index${extGroup}?/?$`,\n headers: { Location: options.trailingSlash ? '/$1/' : '/$1' },\n status: 308,\n });\n\n redirectRoutes.push({\n src: `^/api/(.+)${extGroup}/?$`,\n headers: {\n Location: options.trailingSlash ? '/api/$1/' : '/api/$1',\n },\n status: 308,\n });\n } else {\n defaultRoutes.push({ handle: 'miss' });\n defaultRoutes.push({\n src: `^/api/(.+)${extGroup}$`,\n dest: '/api/$1',\n check: true,\n });\n }\n }\n\n rewriteRoutes.push(...dynamicRoutes);\n\n const hasApiBuild = apiBuilders.find(builder => {\n return builder.src?.startsWith('api/');\n });\n if (typeof ignoreRuntimes === 'undefined' && hasApiBuild) {\n // This route is only necessary to hide the directory listing\n // to avoid enumerating serverless function names.\n // But it causes issues in `vc dev` for frameworks that handle\n // their own functions such as redwood, so we ignore.\n rewriteRoutes.push({\n src: '^/api(/.*)?$',\n status: 404,\n });\n }\n } else {\n defaultRoutes.push(...apiRoutes);\n\n if (apiRoutes.length) {\n defaultRoutes.push({\n status: 404,\n src: '^/api(/.*)?$',\n });\n }\n }\n }\n\n if (\n outputDirectory &&\n frontendBuilder &&\n !options.featHandleMiss &&\n isOfficialRuntime('static', frontendBuilder.use)\n ) {\n defaultRoutes.push({\n src: '/(.*)',\n dest: `/${outputDirectory}/$1`,\n });\n }\n\n if (options.featHandleMiss && !isNextjs && !isGatsby) {\n // Exclude Next.js (and Gatsby) to avoid overriding custom error page\n // https://nextjs.org/docs/advanced-features/custom-error-page\n errorRoutes.push({\n status: 404,\n src: '^(?!/api).*$',\n dest: options.cleanUrls ? '/404' : '/404.html',\n });\n }\n\n return {\n defaultRoutes,\n redirectRoutes,\n rewriteRoutes,\n errorRoutes,\n };\n}\n\nfunction sortFilesBySegmentCount(fileA: string, fileB: string): number {\n const lengthA = fileA.split('/').length;\n const lengthB = fileB.split('/').length;\n\n if (lengthA > lengthB) {\n return -1;\n }\n\n if (lengthA < lengthB) {\n return 1;\n }\n\n // Paths that have the same segment length but\n // less placeholders are preferred\n const countSegments = (prev: number, segment: string) =>\n getSegmentName(segment) ? prev + 1 : 0;\n const segmentLengthA = fileA.split('/').reduce(countSegments, 0);\n const segmentLengthB = fileB.split('/').reduce(countSegments, 0);\n\n if (segmentLengthA > segmentLengthB) {\n return 1;\n }\n\n if (segmentLengthA < segmentLengthB) {\n return -1;\n }\n\n return fileA.localeCompare(fileB);\n}\n"],
5
- "mappings": "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",
6
- "names": ["frameworkList", "minimatch", "validSemver", "parsePath", "fileName", "ext", "isIndex"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/detect-file-system-api.ts"],
4
- "sourcesContent": ["import semver from 'semver';\nimport { isOfficialRuntime } from './';\nimport type {\n Builder,\n BuilderFunctions,\n PackageJson,\n ProjectSettings,\n} from '@vercel/build-utils';\n\ninterface Metadata {\n plugins: string[];\n hasDotOutput: boolean;\n hasMiddleware: boolean;\n}\n\n/**\n * If the Deployment can be built with the new File System API,\n * return the new Builder. Otherwise an \"Exclusion Condition\"\n * was hit so return `null` builder with a `reason` for exclusion.\n */\nexport async function detectFileSystemAPI({\n files,\n projectSettings,\n builders,\n vercelConfig,\n pkg,\n tag,\n enableFlag = false,\n}: {\n files: { [relPath: string]: any };\n projectSettings: ProjectSettings;\n builders: Builder[];\n vercelConfig:\n | { builds?: Builder[]; functions?: BuilderFunctions }\n | null\n | undefined;\n pkg: PackageJson | null | undefined;\n tag: string | undefined;\n enableFlag: boolean | undefined;\n}): Promise<\n | { metadata: Metadata; fsApiBuilder: Builder; reason: null }\n | { metadata: Metadata; fsApiBuilder: null; reason: string }\n> {\n const framework = projectSettings.framework || '';\n const deps = Object.assign({}, pkg?.dependencies, pkg?.devDependencies);\n const plugins = Object.keys(deps).filter(dep =>\n dep.startsWith('vercel-plugin-')\n );\n const hasDotOutput = Object.keys(files).some(file =>\n file.startsWith('.output/')\n );\n const hasMiddleware = Boolean(\n files['_middleware.js'] || files['_middleware.ts']\n );\n\n const metadata: Metadata = {\n plugins,\n hasDotOutput,\n hasMiddleware,\n };\n\n const isEnabled = enableFlag || hasMiddleware || hasDotOutput;\n if (!isEnabled) {\n return { metadata, fsApiBuilder: null, reason: 'Flag not enabled.' };\n }\n\n if (vercelConfig?.builds && vercelConfig.builds.length > 0) {\n return {\n metadata,\n fsApiBuilder: null,\n reason:\n 'Detected `builds` in vercel.json. Please remove it in favor of CLI plugins.',\n };\n }\n\n if (Object.values(vercelConfig?.functions || {}).some(fn => !!fn.runtime)) {\n return {\n metadata,\n fsApiBuilder: null,\n reason:\n 'Detected `functions.runtime` in vercel.json. Please remove it in favor of CLI plugins.',\n };\n }\n\n if (process.env.HUGO_VERSION) {\n return {\n metadata,\n fsApiBuilder: null,\n reason: 'Detected `HUGO_VERSION` environment variable. Please remove it.',\n };\n }\n\n if (process.env.ZOLA_VERSION) {\n return {\n metadata,\n fsApiBuilder: null,\n reason: 'Detected `ZOLA_VERSION` environment variable. Please remove it.',\n };\n }\n\n if (process.env.GUTENBERG_VERSION) {\n return {\n metadata,\n fsApiBuilder: null,\n reason:\n 'Detected `GUTENBERG_VERSION` environment variable. Please remove it.',\n };\n }\n\n const invalidBuilder = builders.find(({ use }) => {\n const valid =\n isOfficialRuntime('go', use) ||\n isOfficialRuntime('python', use) ||\n isOfficialRuntime('ruby', use) ||\n isOfficialRuntime('node', use) ||\n isOfficialRuntime('next', use) ||\n isOfficialRuntime('static', use) ||\n isOfficialRuntime('static-build', use);\n return !valid;\n });\n\n if (invalidBuilder) {\n return {\n metadata,\n fsApiBuilder: null,\n reason: `Detected \\`${invalidBuilder.use}\\` in vercel.json. Please remove it in favor of CLI plugins.`,\n };\n }\n\n for (const lang of ['go', 'python', 'ruby']) {\n for (const { use } of builders) {\n const plugin = 'vercel-plugin-' + lang;\n if (isOfficialRuntime(lang, use) && !deps[plugin]) {\n return {\n metadata,\n fsApiBuilder: null,\n reason: `Detected \\`${lang}\\` Serverless Function usage without plugin \\`${plugin}\\`. Please run \\`npm i ${plugin}\\`.`,\n };\n }\n }\n }\n\n if (\n framework === 'nuxtjs' ||\n framework === 'sveltekit' ||\n framework === 'redwoodjs'\n ) {\n return {\n metadata,\n fsApiBuilder: null,\n reason: `Detected framework \\`${framework}\\` that only supports legacy File System API. Please contact the framework author.`,\n };\n }\n\n if (framework === 'nextjs' && !hasDotOutput) {\n // Use the old pipeline if a custom output directory was specified for Next.js\n // because `vercel build` cannot ensure that the directory will be in the same\n // location as `.output`, which can break imports (not just nft.json files).\n if (projectSettings?.outputDirectory) {\n return {\n metadata,\n fsApiBuilder: null,\n reason: `Detected Next.js with Output Directory \\`${projectSettings.outputDirectory}\\` override. Please change it back to the default.`,\n };\n }\n const nextVersion = deps['next'];\n if (!nextVersion) {\n return {\n metadata,\n fsApiBuilder: null,\n reason: `Detected Next.js in Project Settings but missing \\`next\\` package.json dependencies. Please run \\`npm i next\\`.`,\n };\n }\n\n // TODO: Read version from lockfile instead of package.json\n if (nextVersion !== 'latest' && nextVersion !== 'canary') {\n const fixedVersion = semver.valid(semver.coerce(nextVersion) || '');\n\n if (!fixedVersion || !semver.gte(fixedVersion, '12.0.0')) {\n return {\n metadata,\n fsApiBuilder: null,\n reason: `Detected legacy Next.js version \"${nextVersion}\" in package.json. Please run \\`npm i next@latest\\` to upgrade.`,\n };\n }\n }\n }\n\n if (!hasDotOutput) {\n // TODO: Read version from lockfile instead of package.json\n const vercelCliVersion = deps['vercel'];\n if (\n vercelCliVersion &&\n vercelCliVersion !== 'latest' &&\n vercelCliVersion !== 'canary'\n ) {\n const fixedVersion = semver.valid(semver.coerce(vercelCliVersion) || '');\n // TODO: we might want to use '24.0.0' once its released\n if (!fixedVersion || !semver.gte(fixedVersion, '23.1.3-canary.68')) {\n return {\n metadata,\n fsApiBuilder: null,\n reason: `Detected legacy Vercel CLI version \"${vercelCliVersion}\" in package.json. Please run \\`npm i vercel@latest\\` to upgrade.`,\n };\n }\n }\n }\n\n const frontendBuilder = builders.find(\n ({ use }) =>\n isOfficialRuntime('next', use) ||\n isOfficialRuntime('static', use) ||\n isOfficialRuntime('static-build', use)\n );\n const config = frontendBuilder?.config || {};\n const withTag = tag ? `@${tag}` : '';\n\n const fsApiBuilder = {\n use: `@vercelruntimes/file-system-api${withTag}`,\n src: '**',\n config: {\n ...config,\n fileSystemAPI: true,\n framework: config.framework || framework || null,\n projectSettings,\n hasMiddleware,\n hasDotOutput,\n },\n };\n return { metadata, fsApiBuilder, reason: null };\n}\n"],
5
- "mappings": "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",
6
- "names": ["semver"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/detect-framework.ts"],
4
- "sourcesContent": ["import type { Framework, FrameworkDetectionItem } from '@vercel/frameworks';\nimport { spawnSync } from 'child_process';\nimport { DetectorFilesystem } from './detectors/filesystem';\n\ninterface BaseFramework {\n slug: Framework['slug'];\n detectors?: Framework['detectors'];\n}\n\nexport interface DetectFrameworkOptions {\n fs: DetectorFilesystem;\n frameworkList: readonly BaseFramework[];\n}\n\nexport interface DetectFrameworkRecordOptions {\n fs: DetectorFilesystem;\n frameworkList: readonly Framework[];\n}\n\ntype MatchResult = {\n framework: BaseFramework;\n detectedVersion?: string;\n};\n\nasync function matches(\n fs: DetectorFilesystem,\n framework: BaseFramework\n): Promise<MatchResult | undefined> {\n const { detectors } = framework;\n\n if (!detectors) {\n return;\n }\n\n const { every, some } = detectors;\n\n if (every !== undefined && !Array.isArray(every)) {\n return;\n }\n\n if (some !== undefined && !Array.isArray(some)) {\n return;\n }\n\n const check = async ({\n path,\n matchContent,\n matchPackage,\n }: FrameworkDetectionItem): Promise<MatchResult | undefined> => {\n if (matchPackage && matchContent) {\n throw new Error(\n `Cannot specify \"matchPackage\" and \"matchContent\" in the same detector for \"${framework.slug}\"`\n );\n }\n if (matchPackage && path) {\n throw new Error(\n `Cannot specify \"matchPackage\" and \"path\" in the same detector for \"${framework.slug}\" because \"path\" is assumed to be \"package.json\".`\n );\n }\n\n if (!path && !matchPackage) {\n throw new Error(\n `Must specify either \"path\" or \"matchPackage\" in detector for \"${framework.slug}\".`\n );\n }\n\n if (!path) {\n path = 'package.json';\n }\n\n if (matchPackage) {\n matchContent = `\"(dev)?(d|D)ependencies\":\\\\s*{[^}]*\"${matchPackage}\":\\\\s*\"(.+?)\"[^}]*}`;\n }\n\n if ((await fs.hasPath(path)) === false) {\n return;\n }\n\n if (matchContent) {\n if ((await fs.isFile(path)) === false) {\n return;\n }\n\n const regex = new RegExp(matchContent, 'm');\n const content = await fs.readFile(path);\n\n const match = content.toString().match(regex);\n if (!match) {\n return;\n }\n if (matchPackage && match[3]) {\n return {\n framework,\n detectedVersion: match[3],\n };\n }\n }\n\n return {\n framework,\n };\n };\n\n const result: (MatchResult | undefined)[] = [];\n\n if (every) {\n const everyResult = await Promise.all(every.map(item => check(item)));\n result.push(...everyResult);\n }\n\n if (some) {\n let someResult: MatchResult | undefined;\n\n for (const item of some) {\n const itemResult = await check(item);\n if (itemResult) {\n someResult = itemResult;\n break;\n }\n }\n\n result.push(someResult);\n }\n\n if (!result.every(res => !!res)) {\n return;\n }\n\n const detectedVersion = result.find(\n r => typeof r === 'object' && r.detectedVersion\n )?.detectedVersion;\n return {\n framework,\n detectedVersion,\n };\n}\n\nfunction removeSupersededFramework(\n matches: (Pick<Framework, 'supersedes' | 'slug'> | null)[],\n slug: string\n) {\n const index = matches.findIndex(f => f?.slug === slug);\n const framework = matches[index];\n if (framework) {\n if (framework.supersedes) {\n removeSupersededFramework(matches, framework.supersedes);\n }\n matches.splice(index, 1);\n }\n}\n\nexport function removeSupersededFrameworks(\n matches: (Pick<Framework, 'supersedes' | 'slug'> | null)[]\n) {\n for (const match of matches.slice()) {\n if (match?.supersedes) {\n removeSupersededFramework(matches, match.supersedes);\n }\n }\n}\n\n// TODO: Deprecate and replace with `detectFrameworkRecord`\nexport async function detectFramework({\n fs,\n frameworkList,\n}: DetectFrameworkOptions): Promise<string | null> {\n const result = await Promise.all(\n frameworkList.map(async frameworkMatch => {\n if (await matches(fs, frameworkMatch)) {\n return frameworkMatch;\n }\n return null;\n })\n );\n removeSupersededFrameworks(result);\n return result.find(res => res !== null)?.slug ?? null;\n}\n\n/**\n * Detects all matching Frameworks based on the given virtual filesystem.\n */\nexport async function detectFrameworks({\n fs,\n frameworkList,\n}: DetectFrameworkRecordOptions): Promise<Framework[]> {\n const result = await Promise.all(\n frameworkList.map(async frameworkMatch => {\n if (await matches(fs, frameworkMatch)) {\n return frameworkMatch;\n }\n return null;\n })\n );\n removeSupersededFrameworks(result);\n return result.filter(res => res !== null) as Framework[];\n}\n\n/**\n * Framework with a `detectedVersion` specifying the version\n * or version range of the relevant package\n */\ntype VersionedFramework = Framework & {\n detectedVersion?: string;\n};\n\n// Note: Does not currently support a `frameworkList` of monorepo managers\nexport async function detectFrameworkRecord({\n fs,\n frameworkList,\n}: DetectFrameworkRecordOptions): Promise<VersionedFramework | null> {\n const result = await Promise.all(\n frameworkList.map(async frameworkMatch => {\n const matchResult = await matches(fs, frameworkMatch);\n if (matchResult) {\n return {\n ...frameworkMatch,\n detectedVersion: matchResult?.detectedVersion,\n };\n }\n return null;\n })\n );\n removeSupersededFrameworks(result);\n return result.find(res => res !== null) ?? null;\n}\n\nexport function detectFrameworkVersion(\n frameworkRecord: Framework\n): string | undefined {\n const allDetectors = [\n ...(frameworkRecord.detectors?.every || []),\n ...(frameworkRecord.detectors?.some || []),\n ];\n const firstMatchPackage = allDetectors.find(d => d.matchPackage);\n\n if (!firstMatchPackage?.matchPackage) {\n return;\n }\n\n return lookupInstalledVersion(\n process.execPath,\n firstMatchPackage.matchPackage\n );\n}\n\nfunction lookupInstalledVersion(\n cwd: string,\n packageName: string\n): string | undefined {\n try {\n const script = `require('${packageName}/package.json').version`;\n return spawnSync(cwd, ['-p', script], {\n encoding: 'utf-8',\n }).stdout.trim();\n } catch (error) {\n console.debug(\n `Error looking up version of installed package \"${packageName}\": ${error}`\n );\n }\n\n return;\n}\n"],
5
- "mappings": "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",
6
- "names": ["matches"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/detectors/filesystem.ts"],
4
- "sourcesContent": ["import { posix as posixPath } from 'path';\n\nexport interface DetectorFilesystemStat {\n name: string;\n path: string;\n type: 'file' | 'dir';\n}\n/**\n * `DetectorFilesystem` is an abstract class that represents a virtual filesystem\n * to perform read-only operations on in order to detect which framework is being\n * used.\n *\n * Its abstract methods must be implemented by a subclass that perform the actual\n * FS operations. Example subclasses could be implemented as:\n *\n * - Local filesystem, which proxies the FS operations to the equivalent `fs`\n * module functions.\n * - HTTP filesystem, which implements the FS operations over an HTTP server\n * and does not require a local copy of the files.\n * - `Files` filesystem, which operates on a virtual `Files` object (i.e. from\n * the `glob()` function) which could include `FileFsRef`, `FileBlob`, etc.\n *\n * This base class implements various helper functions for common tasks (i.e.\n * read and parse a JSON file). It also includes caching for all FS operations\n * so that multiple detector functions de-dup read operations on the same file\n * to reduce network/filesystem overhead.\n *\n * **NOTE:** It's important that all instance methods in this base class are\n * bound to `this` so that the `fs` object may be destructured in the detector\n * functions. The easiest way to do this is to use the `=` syntax when defining\n * methods in this class definition.\n */\nexport abstract class DetectorFilesystem {\n protected abstract _hasPath(name: string): Promise<boolean>;\n protected abstract _readFile(name: string): Promise<Buffer>;\n protected abstract _isFile(name: string): Promise<boolean>;\n protected abstract _readdir(name: string): Promise<DetectorFilesystemStat[]>;\n protected abstract _chdir(name: string): DetectorFilesystem;\n\n private pathCache: Map<string, Promise<boolean>>;\n private fileCache: Map<string, Promise<boolean>>;\n private readFileCache: Map<string, Promise<Buffer>>;\n private readdirCache: Map<string, Promise<DetectorFilesystemStat[]>>;\n\n constructor() {\n this.pathCache = new Map();\n this.fileCache = new Map();\n this.readFileCache = new Map();\n this.readdirCache = new Map();\n }\n\n public hasPath = async (path: string): Promise<boolean> => {\n let p = this.pathCache.get(path);\n if (!p) {\n p = this._hasPath(path);\n this.pathCache.set(path, p);\n }\n return p;\n };\n\n public isFile = async (name: string): Promise<boolean> => {\n let p = this.fileCache.get(name);\n if (!p) {\n p = this._isFile(name);\n this.fileCache.set(name, p);\n }\n return p;\n };\n\n public readFile = async (name: string): Promise<Buffer> => {\n let p = this.readFileCache.get(name);\n if (!p) {\n p = this._readFile(name);\n this.readFileCache.set(name, p);\n }\n return p;\n };\n\n /**\n * Returns a list of Stat objects from the current working directory.\n * @param dirPath The path of the directory to read.\n * @param options.potentialFiles optional. Array of potential file names (relative to the path). If provided, these will be used to mark the filesystem caches as existing or not existing.\n */\n public readdir = async (\n dirPath: string,\n options?: { potentialFiles?: string[] }\n ): Promise<DetectorFilesystemStat[]> => {\n let p = this.readdirCache.get(dirPath);\n if (!p) {\n p = this._readdir(dirPath);\n this.readdirCache.set(dirPath, p);\n }\n\n const directoryContent = await p;\n const directoryFiles = new Set<string>();\n\n for (const file of directoryContent) {\n if (file.type === 'file') {\n // we know this file exists, mark it as so on the filesystem\n this.fileCache.set(file.path, Promise.resolve(true));\n this.pathCache.set(file.path, Promise.resolve(true));\n directoryFiles.add(file.name);\n }\n }\n\n if (options?.potentialFiles) {\n // calculate the set of paths that truly do not exist\n const filesThatDoNotExist = options.potentialFiles.filter(\n path => !directoryFiles.has(path)\n );\n for (const filePath of filesThatDoNotExist) {\n const fullFilePath =\n dirPath === '/' ? filePath : posixPath.join(dirPath, filePath);\n // we know this file does not exist, mark it as so on the filesystem\n this.fileCache.set(fullFilePath, Promise.resolve(false));\n this.pathCache.set(fullFilePath, Promise.resolve(false));\n }\n }\n\n return p;\n };\n\n /**\n * Changes the current directory to the specified path and returns a new instance of DetectorFilesystem.\n */\n public chdir = (name: string): DetectorFilesystem => {\n return this._chdir(name);\n };\n\n /**\n * Writes a file to the filesystem cache.\n * @param name the name of the file to write\n * @param content The content of the file\n */\n public writeFile = async (name: string, content: string): Promise<void> => {\n this.readFileCache.set(name, Promise.resolve(Buffer.from(content)));\n this.fileCache.set(name, Promise.resolve(true));\n this.pathCache.set(name, Promise.resolve(true));\n };\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAmC;AAgC5B,MAAe,mBAAmB;AAAA,EAYvC,cAAc;AAOd,SAAO,UAAU,OAAO,SAAmC;AACzD,UAAI,IAAI,KAAK,UAAU,IAAI,IAAI;AAC/B,UAAI,CAAC,GAAG;AACN,YAAI,KAAK,SAAS,IAAI;AACtB,aAAK,UAAU,IAAI,MAAM,CAAC;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAEA,SAAO,SAAS,OAAO,SAAmC;AACxD,UAAI,IAAI,KAAK,UAAU,IAAI,IAAI;AAC/B,UAAI,CAAC,GAAG;AACN,YAAI,KAAK,QAAQ,IAAI;AACrB,aAAK,UAAU,IAAI,MAAM,CAAC;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAEA,SAAO,WAAW,OAAO,SAAkC;AACzD,UAAI,IAAI,KAAK,cAAc,IAAI,IAAI;AACnC,UAAI,CAAC,GAAG;AACN,YAAI,KAAK,UAAU,IAAI;AACvB,aAAK,cAAc,IAAI,MAAM,CAAC;AAAA,MAChC;AACA,aAAO;AAAA,IACT;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAO,UAAU,OACf,SACA,YACsC;AACtC,UAAI,IAAI,KAAK,aAAa,IAAI,OAAO;AACrC,UAAI,CAAC,GAAG;AACN,YAAI,KAAK,SAAS,OAAO;AACzB,aAAK,aAAa,IAAI,SAAS,CAAC;AAAA,MAClC;AAEA,YAAM,mBAAmB,MAAM;AAC/B,YAAM,iBAAiB,oBAAI,IAAY;AAEvC,iBAAW,QAAQ,kBAAkB;AACnC,YAAI,KAAK,SAAS,QAAQ;AAExB,eAAK,UAAU,IAAI,KAAK,MAAM,QAAQ,QAAQ,IAAI,CAAC;AACnD,eAAK,UAAU,IAAI,KAAK,MAAM,QAAQ,QAAQ,IAAI,CAAC;AACnD,yBAAe,IAAI,KAAK,IAAI;AAAA,QAC9B;AAAA,MACF;AAEA,UAAI,SAAS,gBAAgB;AAE3B,cAAM,sBAAsB,QAAQ,eAAe;AAAA,UACjD,UAAQ,CAAC,eAAe,IAAI,IAAI;AAAA,QAClC;AACA,mBAAW,YAAY,qBAAqB;AAC1C,gBAAM,eACJ,YAAY,MAAM,WAAW,YAAAA,MAAU,KAAK,SAAS,QAAQ;AAE/D,eAAK,UAAU,IAAI,cAAc,QAAQ,QAAQ,KAAK,CAAC;AACvD,eAAK,UAAU,IAAI,cAAc,QAAQ,QAAQ,KAAK,CAAC;AAAA,QACzD;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAKA;AAAA;AAAA;AAAA,SAAO,QAAQ,CAAC,SAAqC;AACnD,aAAO,KAAK,OAAO,IAAI;AAAA,IACzB;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAO,YAAY,OAAO,MAAc,YAAmC;AACzE,WAAK,cAAc,IAAI,MAAM,QAAQ,QAAQ,OAAO,KAAK,OAAO,CAAC,CAAC;AAClE,WAAK,UAAU,IAAI,MAAM,QAAQ,QAAQ,IAAI,CAAC;AAC9C,WAAK,UAAU,IAAI,MAAM,QAAQ,QAAQ,IAAI,CAAC;AAAA,IAChD;AA7FE,SAAK,YAAY,oBAAI,IAAI;AACzB,SAAK,YAAY,oBAAI,IAAI;AACzB,SAAK,gBAAgB,oBAAI,IAAI;AAC7B,SAAK,eAAe,oBAAI,IAAI;AAAA,EAC9B;AA0FF;",
6
- "names": ["posixPath"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/detectors/local-file-system-detector.ts"],
4
- "sourcesContent": ["import fs from 'fs/promises';\nimport { join, relative } from 'path';\nimport { DetectorFilesystem, DetectorFilesystemStat } from './filesystem';\nimport { isErrnoException } from '@vercel/error-utils';\n\nexport class LocalFileSystemDetector extends DetectorFilesystem {\n private rootPath: string;\n\n constructor(rootPath: string) {\n super();\n this.rootPath = rootPath;\n }\n\n async _hasPath(name: string): Promise<boolean> {\n try {\n await fs.stat(this.getFilePath(name));\n return true;\n } catch (err) {\n if (isErrnoException(err) && err.code === 'ENOENT') {\n return false;\n }\n throw err;\n }\n }\n\n _readFile(name: string): Promise<Buffer> {\n return fs.readFile(this.getFilePath(name));\n }\n\n async _isFile(name: string): Promise<boolean> {\n const stat = await fs.stat(this.getFilePath(name));\n return stat.isFile();\n }\n\n async _readdir(dir: string): Promise<DetectorFilesystemStat[]> {\n const dirPath = this.getFilePath(dir);\n const files = await fs.readdir(dirPath);\n return Promise.all(\n files.map(async name => {\n const absPath = join(this.rootPath, dir, name);\n const path = join(this.getRelativeFilePath(dir), name);\n\n const stat = await fs.stat(absPath);\n let type: DetectorFilesystemStat['type'];\n if (stat.isFile()) {\n type = 'file';\n } else if (stat.isDirectory()) {\n type = 'dir';\n } else {\n throw new Error(`Dirent was neither file nor directory: ${path}`);\n }\n\n return { name, path, type };\n })\n );\n }\n\n _chdir(name: string): DetectorFilesystem {\n return new LocalFileSystemDetector(this.getFilePath(name));\n }\n\n private getRelativeFilePath(name: string) {\n return name.startsWith(this.rootPath)\n ? relative(this.rootPath, name)\n : name;\n }\n\n private getFilePath(name: string) {\n return join(this.rootPath, this.getRelativeFilePath(name));\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAe;AACf,kBAA+B;AAC/B,wBAA2D;AAC3D,yBAAiC;AAE1B,MAAM,gCAAgC,qCAAmB;AAAA,EAG9D,YAAY,UAAkB;AAC5B,UAAM;AACN,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,SAAS,MAAgC;AAC7C,QAAI;AACF,YAAM,gBAAAA,QAAG,KAAK,KAAK,YAAY,IAAI,CAAC;AACpC,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,cAAI,qCAAiB,GAAG,KAAK,IAAI,SAAS,UAAU;AAClD,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,UAAU,MAA+B;AACvC,WAAO,gBAAAA,QAAG,SAAS,KAAK,YAAY,IAAI,CAAC;AAAA,EAC3C;AAAA,EAEA,MAAM,QAAQ,MAAgC;AAC5C,UAAM,OAAO,MAAM,gBAAAA,QAAG,KAAK,KAAK,YAAY,IAAI,CAAC;AACjD,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,MAAM,SAAS,KAAgD;AAC7D,UAAM,UAAU,KAAK,YAAY,GAAG;AACpC,UAAM,QAAQ,MAAM,gBAAAA,QAAG,QAAQ,OAAO;AACtC,WAAO,QAAQ;AAAA,MACb,MAAM,IAAI,OAAM,SAAQ;AACtB,cAAM,cAAU,kBAAK,KAAK,UAAU,KAAK,IAAI;AAC7C,cAAM,WAAO,kBAAK,KAAK,oBAAoB,GAAG,GAAG,IAAI;AAErD,cAAM,OAAO,MAAM,gBAAAA,QAAG,KAAK,OAAO;AAClC,YAAI;AACJ,YAAI,KAAK,OAAO,GAAG;AACjB,iBAAO;AAAA,QACT,WAAW,KAAK,YAAY,GAAG;AAC7B,iBAAO;AAAA,QACT,OAAO;AACL,gBAAM,IAAI,MAAM,0CAA0C,IAAI,EAAE;AAAA,QAClE;AAEA,eAAO,EAAE,MAAM,MAAM,KAAK;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAO,MAAkC;AACvC,WAAO,IAAI,wBAAwB,KAAK,YAAY,IAAI,CAAC;AAAA,EAC3D;AAAA,EAEQ,oBAAoB,MAAc;AACxC,WAAO,KAAK,WAAW,KAAK,QAAQ,QAChC,sBAAS,KAAK,UAAU,IAAI,IAC5B;AAAA,EACN;AAAA,EAEQ,YAAY,MAAc;AAChC,eAAO,kBAAK,KAAK,UAAU,KAAK,oBAAoB,IAAI,CAAC;AAAA,EAC3D;AACF;",
6
- "names": ["fs"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/get-project-paths.ts"],
4
- "sourcesContent": ["import { detectFramework } from './detect-framework';\nimport { DetectorFilesystem } from './detectors/filesystem';\nimport frameworks from '@vercel/frameworks';\n\nconst MAX_DEPTH_TRAVERSE = 3;\n\nexport interface GetProjectPathsOptions {\n fs: DetectorFilesystem;\n path?: string;\n skipPaths?: string[];\n depth?: number;\n}\n\nexport type ProjectPath = string;\n\nexport const getProjectPaths = async ({\n fs,\n path,\n skipPaths,\n depth = MAX_DEPTH_TRAVERSE,\n}: GetProjectPathsOptions): Promise<ProjectPath[]> => {\n if (depth === 0) return [];\n\n const allPaths: Array<ProjectPath> = [];\n const topPath: string = path ?? './';\n\n if (path && skipPaths?.includes(path)) {\n return allPaths;\n }\n const framework = await detectFramework({\n fs: fs.chdir(topPath),\n frameworkList: frameworks,\n });\n\n if (framework !== null) allPaths.push(topPath);\n\n if (depth > 1) {\n const directoryContents = await fs.readdir(topPath);\n const childDirectories = directoryContents.filter(\n stat => stat.type === 'dir' && !skipPaths?.includes(stat.path)\n );\n\n const paths = (\n await Promise.all(\n childDirectories.map(({ path }) => {\n return getProjectPaths({\n fs,\n path,\n depth: depth - 1,\n skipPaths,\n });\n })\n )\n ).flat();\n\n return [...paths, ...allPaths];\n }\n\n return allPaths;\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAgC;AAEhC,wBAAuB;AAEvB,MAAM,qBAAqB;AAWpB,MAAM,kBAAkB,OAAO;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AACV,MAAsD;AACpD,MAAI,UAAU;AAAG,WAAO,CAAC;AAEzB,QAAM,WAA+B,CAAC;AACtC,QAAM,UAAkB,QAAQ;AAEhC,MAAI,QAAQ,WAAW,SAAS,IAAI,GAAG;AACrC,WAAO;AAAA,EACT;AACA,QAAM,YAAY,UAAM,yCAAgB;AAAA,IACtC,IAAI,GAAG,MAAM,OAAO;AAAA,IACpB,eAAe,kBAAAA;AAAA,EACjB,CAAC;AAED,MAAI,cAAc;AAAM,aAAS,KAAK,OAAO;AAE7C,MAAI,QAAQ,GAAG;AACb,UAAM,oBAAoB,MAAM,GAAG,QAAQ,OAAO;AAClD,UAAM,mBAAmB,kBAAkB;AAAA,MACzC,UAAQ,KAAK,SAAS,SAAS,CAAC,WAAW,SAAS,KAAK,IAAI;AAAA,IAC/D;AAEA,UAAM,SACJ,MAAM,QAAQ;AAAA,MACZ,iBAAiB,IAAI,CAAC,EAAE,MAAAC,MAAK,MAAM;AACjC,eAAO,gBAAgB;AAAA,UACrB;AAAA,UACA,MAAAA;AAAA,UACA,OAAO,QAAQ;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,GACA,KAAK;AAEP,WAAO,CAAC,GAAG,OAAO,GAAG,QAAQ;AAAA,EAC/B;AAEA,SAAO;AACT;",
6
- "names": ["frameworks", "path"]
7
- }
package/dist/index.js.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/index.ts"],
4
- "sourcesContent": ["export {\n detectBuilders,\n detectOutputDirectory,\n detectApiDirectory,\n detectApiExtensions,\n} from './detect-builders';\nexport { detectFileSystemAPI } from './detect-file-system-api';\nexport {\n detectFramework,\n detectFrameworks,\n detectFrameworkRecord,\n detectFrameworkVersion,\n} from './detect-framework';\nexport { getProjectPaths } from './get-project-paths';\nexport { DetectorFilesystem } from './detectors/filesystem';\nexport { LocalFileSystemDetector } from './detectors/local-file-system-detector';\nexport { workspaceManagers } from './workspaces/workspace-managers';\nexport {\n getWorkspaces,\n GetWorkspaceOptions,\n Workspace,\n WorkspaceType,\n} from './workspaces/get-workspaces';\nexport {\n getWorkspacePackagePaths,\n GetWorkspacePackagePathsOptions,\n} from './workspaces/get-workspace-package-paths';\nexport { monorepoManagers } from './monorepos/monorepo-managers';\nexport { isOfficialRuntime, isStaticRuntime } from './is-official-runtime';\nexport { packageManagers } from './package-managers/package-managers';\nexport * from './monorepos/get-monorepo-default-settings';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAKO;AACP,oCAAoC;AACpC,8BAKO;AACP,+BAAgC;AAChC,wBAAmC;AACnC,wCAAwC;AACxC,gCAAkC;AAClC,4BAKO;AACP,yCAGO;AACP,+BAAiC;AACjC,iCAAmD;AACnD,8BAAgC;AAChC,wBAAc,sDA9Bd;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/is-official-runtime.ts"],
4
- "sourcesContent": ["/*\n * Helper function to support both `@vercel` and legacy `@now` official Runtimes.\n */\nexport const isOfficialRuntime = (desired: string, name?: string): boolean => {\n if (typeof name !== 'string') {\n return false;\n }\n return (\n name === `@vercel/${desired}` ||\n name === `@now/${desired}` ||\n name.startsWith(`@vercel/${desired}@`) ||\n name.startsWith(`@now/${desired}@`)\n );\n};\n\n/*\n * Helper function to detect both `@vercel/static` and legacy `@now/static` official Runtimes.\n */\nexport const isStaticRuntime = (name?: string): boolean => {\n return isOfficialRuntime('static', name);\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGO,MAAM,oBAAoB,CAAC,SAAiB,SAA2B;AAC5E,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,SACE,SAAS,WAAW,OAAO,MAC3B,SAAS,QAAQ,OAAO,MACxB,KAAK,WAAW,WAAW,OAAO,GAAG,KACrC,KAAK,WAAW,QAAQ,OAAO,GAAG;AAEtC;AAKO,MAAM,kBAAkB,CAAC,SAA2B;AACzD,SAAO,kBAAkB,UAAU,IAAI;AACzC;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/monorepos/get-monorepo-default-settings.ts"],
4
- "sourcesContent": ["import { join } from 'path';\nimport { monorepoManagers } from './monorepo-managers';\nimport { packageManagers } from '../package-managers/package-managers';\nimport { DetectorFilesystem } from '../detectors/filesystem';\nimport { detectFramework } from '../detect-framework';\nimport JSON5 from 'json5';\nimport semver from 'semver';\n\nexport class MissingBuildPipeline extends Error {\n constructor() {\n super(\n 'Missing required `build` pipeline in turbo.json or package.json Turbo configuration.'\n );\n }\n}\n\nexport class MissingBuildTarget extends Error {\n constructor() {\n super(\n 'Missing required `build` target in either nx.json, project.json, or package.json Nx configuration.'\n );\n }\n}\n\nfunction supportsRootCommand(turboSemVer: string | undefined) {\n if (!turboSemVer) {\n return false;\n }\n\n if (!semver.validRange(turboSemVer)) {\n return false;\n }\n\n return !semver.intersects(turboSemVer, '<1.8.0');\n}\n\ntype MonorepoDefaultSettings = {\n buildCommand?: string | null;\n installCommand?: string | null;\n commandForIgnoringBuildStep?: string;\n monorepoManager: string;\n} | null;\n\nexport async function getMonorepoDefaultSettings(\n projectName: string,\n projectPath: string,\n relativeToRoot: string,\n detectorFilesystem: DetectorFilesystem\n): Promise<MonorepoDefaultSettings> {\n const [monorepoManager, packageManager] = await Promise.all([\n detectFramework({\n fs: detectorFilesystem,\n frameworkList: monorepoManagers,\n }),\n detectFramework({\n fs: detectorFilesystem,\n frameworkList: packageManagers,\n }),\n ]);\n\n if (monorepoManager === 'turbo') {\n const [turboJSONBuf, packageJSONBuf] = await Promise.all([\n detectorFilesystem.readFile('turbo.json').catch(() => null),\n detectorFilesystem.readFile('package.json').catch(() => null),\n ]);\n\n let hasBuildPipeline = false;\n let turboSemVer = null;\n\n if (turboJSONBuf !== null) {\n const turboJSON = JSON5.parse(turboJSONBuf.toString('utf-8'));\n\n if (turboJSON?.pipeline?.build) {\n hasBuildPipeline = true;\n }\n }\n\n if (packageJSONBuf !== null) {\n const packageJSON = JSON.parse(packageJSONBuf.toString('utf-8'));\n\n if (packageJSON?.turbo?.pipeline?.build) {\n hasBuildPipeline = true;\n }\n\n turboSemVer =\n packageJSON?.dependencies?.turbo ||\n packageJSON?.devDependencies?.turbo ||\n null;\n }\n\n if (!hasBuildPipeline) {\n throw new MissingBuildPipeline();\n }\n\n if (projectPath === '/') {\n return {\n monorepoManager: 'turbo',\n buildCommand: 'turbo run build',\n installCommand: packageManager ? `${packageManager} install` : null,\n commandForIgnoringBuildStep: 'npx turbo-ignore',\n };\n }\n\n let buildCommand = null;\n if (projectPath) {\n if (supportsRootCommand(turboSemVer)) {\n buildCommand = `turbo run build`;\n } else {\n // We don't know for sure if the local `turbo` supports inference.\n buildCommand = `cd ${relativeToRoot} && turbo run build --filter={${projectPath}}...`;\n }\n }\n\n return {\n monorepoManager: 'turbo',\n buildCommand,\n installCommand:\n packageManager === 'npm'\n ? `${packageManager} install --prefix=${relativeToRoot}`\n : packageManager\n ? `${packageManager} install`\n : null,\n commandForIgnoringBuildStep: 'npx turbo-ignore',\n };\n } else if (monorepoManager === 'nx') {\n // No ENOENT handling required here since conditional wouldn't be `true` unless `nx.json` was found.\n const nxJSONBuf = await detectorFilesystem.readFile('nx.json');\n const nxJSON = JSON5.parse(nxJSONBuf.toString('utf-8'));\n\n if (!nxJSON?.targetDefaults?.build) {\n const [projectJSONBuf, packageJSONBuf] = await Promise.all([\n detectorFilesystem\n .readFile(join(projectPath, 'project.json'))\n .catch(() => null),\n detectorFilesystem\n .readFile(join(projectPath, 'package.json'))\n .catch(() => null),\n ]);\n\n let hasBuildTarget = false;\n\n if (projectJSONBuf) {\n const projectJSON = JSON5.parse(projectJSONBuf.toString('utf-8'));\n if (projectJSON?.targets?.build) {\n hasBuildTarget = true;\n }\n }\n\n if (packageJSONBuf) {\n const packageJSON = JSON5.parse(packageJSONBuf.toString('utf-8'));\n if (packageJSON?.nx) {\n if (packageJSON.nx.targets?.build) {\n hasBuildTarget = true;\n }\n }\n }\n\n if (!hasBuildTarget) {\n throw new MissingBuildTarget();\n }\n }\n\n if (projectPath === '/') {\n return {\n monorepoManager: 'nx',\n buildCommand: 'npx nx build',\n installCommand: packageManager ? `${packageManager} install` : null,\n };\n }\n return {\n monorepoManager: 'nx',\n buildCommand: projectName\n ? `cd ${relativeToRoot} && npx nx build ${projectName}`\n : null,\n installCommand:\n packageManager === 'npm'\n ? `${packageManager} install --prefix=${relativeToRoot}`\n : packageManager\n ? `${packageManager} install`\n : null,\n };\n }\n // TODO (@Ethan-Arrowood) - Revisit rush support when we can test it better\n /* else if (monorepoManager === 'rush') {\n setCommand(\n 'buildCommand',\n `node ${relativeToRoot}/common/scripts/install-run-rush.js build --to ${projectName}`\n );\n setCommand(\n 'installCommand',\n `node ${relativeToRoot}/common/scripts/install-run-rush.js install`\n );\n } */\n\n return null;\n}\n"],
5
- "mappings": "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",
6
- "names": ["semver", "JSON5"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/monorepos/monorepo-managers.ts"],
4
- "sourcesContent": ["import type { Framework } from '@vercel/frameworks';\n\n/**\n * The supported list of monorepo managers.\n *\n * This list is designed to work with the @see {@link detectFramework} function.\n *\n * @example\n * import { monorepoManagers as frameworkList } from '@vercel/fs-detectors'\n * import { detectFramework } from '@vercel/fs-detectors'\n *\n * const fs = new GitDetectorFilesystem(...)\n * detectFramwork({ fs, frameworkList }) // returns the 'slug' field if detected, otherwise null\n *\n */\nexport const monorepoManagers: Array<\n Omit<Framework, 'description' | 'getOutputDirName'>\n> = [\n {\n name: 'Turborepo',\n slug: 'turbo',\n logo: 'https://api-frameworks.vercel.sh/monorepo-logos/turborepo.svg',\n darkModeLogo:\n 'https://api-frameworks.vercel.sh/monorepo-logos/turborepo-dark.svg',\n detectors: {\n some: [\n {\n path: 'turbo.json',\n },\n {\n path: 'package.json',\n matchContent: '\"turbo\":\\\\s*{[^}]*.+[^}]*}',\n },\n ],\n },\n settings: {\n buildCommand: {\n placeholder: 'Turborepo default',\n value: null,\n },\n outputDirectory: {\n value: null,\n },\n installCommand: {\n value: null,\n },\n devCommand: {\n value: null,\n },\n },\n },\n {\n name: 'Nx',\n slug: 'nx',\n logo: 'https://api-frameworks.vercel.sh/monorepo-logos/nx.svg',\n detectors: {\n every: [\n {\n path: 'nx.json',\n },\n ],\n },\n settings: {\n buildCommand: {\n placeholder: 'Nx default',\n value: null,\n },\n outputDirectory: {\n value: null,\n },\n installCommand: {\n value: null,\n },\n devCommand: {\n value: null,\n },\n },\n },\n {\n name: 'Rush',\n slug: 'rush',\n logo: 'https://api-frameworks.vercel.sh/monorepo-logos/rush.svg',\n detectors: {\n every: [\n {\n path: 'rush.json',\n },\n ],\n },\n settings: {\n buildCommand: {\n placeholder: 'Rush default',\n value: null,\n },\n outputDirectory: {\n value: null,\n },\n installCommand: {\n placeholder: 'Rush default',\n },\n devCommand: {\n value: null,\n },\n },\n },\n];\n\nexport default monorepoManagers;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeO,MAAM,mBAET;AAAA,EACF;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cACE;AAAA,IACF,WAAW;AAAA,MACT,MAAM;AAAA,QACJ;AAAA,UACE,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,cAAc;AAAA,QACZ,aAAa;AAAA,QACb,OAAO;AAAA,MACT;AAAA,MACA,iBAAiB;AAAA,QACf,OAAO;AAAA,MACT;AAAA,MACA,gBAAgB;AAAA,QACd,OAAO;AAAA,MACT;AAAA,MACA,YAAY;AAAA,QACV,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,cAAc;AAAA,QACZ,aAAa;AAAA,QACb,OAAO;AAAA,MACT;AAAA,MACA,iBAAiB;AAAA,QACf,OAAO;AAAA,MACT;AAAA,MACA,gBAAgB;AAAA,QACd,OAAO;AAAA,MACT;AAAA,MACA,YAAY;AAAA,QACV,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,cAAc;AAAA,QACZ,aAAa;AAAA,QACb,OAAO;AAAA,MACT;AAAA,MACA,iBAAiB;AAAA,QACf,OAAO;AAAA,MACT;AAAA,MACA,gBAAgB;AAAA,QACd,aAAa;AAAA,MACf;AAAA,MACA,YAAY;AAAA,QACV,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,4BAAQ;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/package-managers/package-managers.ts"],
4
- "sourcesContent": ["import type { Framework } from '@vercel/frameworks';\n\nexport const packageManagers: Array<\n Omit<Framework, 'description' | 'getOutputDirName' | 'settings'>\n> = [\n {\n name: 'npm',\n slug: 'npm',\n logo: '',\n darkModeLogo: '',\n detectors: {\n some: [\n {\n path: 'package-lock.json',\n },\n {\n path: 'package.json',\n matchContent: '\"packageManager\":\\\\s*\"npm@.*\"',\n },\n ],\n },\n },\n {\n name: 'pnpm',\n slug: 'pnpm',\n logo: '',\n darkModeLogo: '',\n detectors: {\n some: [\n {\n path: 'pnpm-lock.yaml',\n },\n {\n path: 'package.json',\n matchContent: '\"packageManager\":\\\\s*\"pnpm@.*\"',\n },\n ],\n },\n },\n {\n name: 'bun',\n slug: 'bun',\n logo: '',\n darkModeLogo: '',\n detectors: {\n some: [\n {\n path: 'bun.lockb',\n },\n {\n path: 'package.json',\n // Depends on https://github.com/nodejs/corepack/pull/307\n matchContent: '\"packageManager\":\\\\s*\"bun@.*\"',\n },\n ],\n },\n },\n {\n name: 'yarn',\n slug: 'yarn',\n logo: '',\n darkModeLogo: '',\n detectors: {\n some: [\n {\n path: 'yarn.lock',\n },\n {\n path: 'package.json',\n matchContent: '\"packageManager\":\\\\s*\"yarn@.*\"',\n },\n {\n path: 'package.json',\n },\n ],\n },\n },\n];\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,kBAET;AAAA,EACF;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,WAAW;AAAA,MACT,MAAM;AAAA,QACJ;AAAA,UACE,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,WAAW;AAAA,MACT,MAAM;AAAA,QACJ;AAAA,UACE,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,WAAW;AAAA,MACT,MAAM;AAAA,QACJ;AAAA,UACE,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,MAAM;AAAA;AAAA,UAEN,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,cAAc;AAAA,IACd,WAAW;AAAA,MACT,MAAM;AAAA,QACJ;AAAA,UACE,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,cAAc;AAAA,QAChB;AAAA,QACA;AAAA,UACE,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/workspaces/get-glob-fs.ts"],
4
- "sourcesContent": ["import fs from 'fs';\nimport { DetectorFilesystem } from '../detectors/filesystem';\n\ntype GlobFs = typeof fs;\n\nfunction removeWindowsPrefix(path: string) {\n // on windows, this will return a path like\n // D:/c/package.json\n // since we abstract the filesystem, we need to remove windows specific info from the path\n // and let the FS decide how to process the path\n // D:/c/package.json => /c/package.json\n return path.replace(/^[a-zA-Z]:/, '');\n}\n\nexport function getGlobFs(_fs: DetectorFilesystem): GlobFs {\n const readdir = (\n path: fs.PathLike,\n callback: (err: NodeJS.ErrnoException | null, files: string[]) => void\n ): void => {\n _fs\n .readdir(removeWindowsPrefix(String(path)))\n .then(stats =>\n callback(\n null,\n stats.map(stat => stat.name)\n )\n )\n .catch(err => callback(err, []));\n };\n\n const stat = (\n path: fs.PathLike,\n callback: (\n err: NodeJS.ErrnoException | null,\n stats: fs.Stats | null\n ) => void\n ): void => {\n _fs\n .isFile(removeWindowsPrefix(String(path)))\n .then(isPathAFile => {\n callback(null, {\n ino: 0,\n mode: 0,\n nlink: 0,\n uid: 0,\n gid: 0,\n rdev: 0,\n size: 0,\n blksize: 0,\n blocks: 0,\n atimeMs: 0,\n mtimeMs: 0,\n ctimeMs: 0,\n birthtimeMs: 0,\n atime: new Date(),\n mtime: new Date(),\n ctime: new Date(),\n birthtime: new Date(),\n dev: 0,\n isBlockDevice: () => false,\n isCharacterDevice: () => false,\n isDirectory: () => !isPathAFile,\n isFIFO: () => false,\n isFile: () => isPathAFile,\n isSocket: () => false,\n isSymbolicLink: () => false,\n });\n })\n .catch(err => callback(err, null));\n };\n\n return new Proxy(fs, {\n get(_target, prop) {\n switch (prop) {\n case 'readdir':\n return readdir;\n case 'lstat':\n case 'stat':\n return stat;\n default:\n throw new Error('Not Implemented');\n }\n },\n });\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAe;AAKf,SAAS,oBAAoB,MAAc;AAMzC,SAAO,KAAK,QAAQ,cAAc,EAAE;AACtC;AAEO,SAAS,UAAU,KAAiC;AACzD,QAAM,UAAU,CACd,MACA,aACS;AACT,QACG,QAAQ,oBAAoB,OAAO,IAAI,CAAC,CAAC,EACzC;AAAA,MAAK,WACJ;AAAA,QACE;AAAA,QACA,MAAM,IAAI,CAAAA,UAAQA,MAAK,IAAI;AAAA,MAC7B;AAAA,IACF,EACC,MAAM,SAAO,SAAS,KAAK,CAAC,CAAC,CAAC;AAAA,EACnC;AAEA,QAAM,OAAO,CACX,MACA,aAIS;AACT,QACG,OAAO,oBAAoB,OAAO,IAAI,CAAC,CAAC,EACxC,KAAK,iBAAe;AACnB,eAAS,MAAM;AAAA,QACb,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,aAAa;AAAA,QACb,OAAO,oBAAI,KAAK;AAAA,QAChB,OAAO,oBAAI,KAAK;AAAA,QAChB,OAAO,oBAAI,KAAK;AAAA,QAChB,WAAW,oBAAI,KAAK;AAAA,QACpB,KAAK;AAAA,QACL,eAAe,MAAM;AAAA,QACrB,mBAAmB,MAAM;AAAA,QACzB,aAAa,MAAM,CAAC;AAAA,QACpB,QAAQ,MAAM;AAAA,QACd,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM;AAAA,QAChB,gBAAgB,MAAM;AAAA,MACxB,CAAC;AAAA,IACH,CAAC,EACA,MAAM,SAAO,SAAS,KAAK,IAAI,CAAC;AAAA,EACrC;AAEA,SAAO,IAAI,MAAM,UAAAC,SAAI;AAAA,IACnB,IAAI,SAAS,MAAM;AACjB,cAAQ,MAAM;AAAA,QACZ,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AAAA,QACL,KAAK;AACH,iBAAO;AAAA,QACT;AACE,gBAAM,IAAI,MAAM,iBAAiB;AAAA,MACrC;AAAA,IACF;AAAA,EACF,CAAC;AACH;",
6
- "names": ["stat", "fs"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/workspaces/get-workspace-package-paths.ts"],
4
- "sourcesContent": ["import _path from 'path';\nimport yaml from 'js-yaml';\nimport glob from 'glob';\nimport json5 from 'json5';\nimport { DetectorFilesystem } from '../detectors/filesystem';\nimport { Workspace } from './get-workspaces';\nimport { getGlobFs } from './get-glob-fs';\n\nconst posixPath = _path.posix;\n\ninterface GetPackagePathOptions {\n fs: DetectorFilesystem;\n}\n\nexport interface GetWorkspacePackagePathsOptions extends GetPackagePathOptions {\n fs: DetectorFilesystem;\n workspace: Workspace;\n}\n\nexport async function getWorkspacePackagePaths({\n fs,\n workspace,\n}: GetWorkspacePackagePathsOptions): Promise<string[]> {\n const { type, rootPath } = workspace;\n const workspaceFs = fs.chdir(rootPath);\n\n let results: string[] = [];\n\n switch (type) {\n case 'yarn':\n case 'npm':\n results = await getPackageJsonWorkspacePackagePaths({ fs: workspaceFs });\n break;\n case 'pnpm':\n results = await getPnpmWorkspacePackagePaths({ fs: workspaceFs });\n break;\n case 'nx':\n results = await getNxWorkspacePackagePaths({ fs: workspaceFs });\n break;\n case 'rush':\n results = await getRushWorkspacePackagePaths({ fs: workspaceFs });\n break;\n default:\n throw new Error(`Unknown workspace implementation: ${type}`);\n }\n\n return results.map(packagePath => {\n return posixPath.join(rootPath, posixPath.dirname(packagePath));\n });\n}\n\ntype PackageJsonWithWorkspace = {\n workspaces?:\n | {\n packages?: string[];\n noHoist?: string[];\n }\n | string[];\n};\n\ntype PnpmWorkspaces = {\n packages?: string[];\n};\n\ntype RushWorkspaces = {\n projects: [\n {\n projectFolder: string;\n }\n ];\n};\n\nconst isWin = process.platform === 'win32';\nconst normalizePath = (p: string) => (isWin ? p.replace(/\\\\/g, '/') : p);\n\nasync function getPackagePaths(\n packages: string[],\n fs: DetectorFilesystem\n): Promise<string[]> {\n return (\n await Promise.all(\n packages.map(\n packageGlob =>\n new Promise<string[]>((resolve, reject) => {\n glob(\n normalizePath(posixPath.join(packageGlob, 'package.json')),\n {\n cwd: '/',\n fs: getGlobFs(fs),\n },\n (err, matches) => {\n if (err) reject(err);\n else resolve(matches);\n }\n );\n })\n )\n )\n ).flat();\n}\n\nasync function getPackageJsonWorkspacePackagePaths({\n fs,\n}: GetPackagePathOptions): Promise<string[]> {\n const packageJsonAsBuffer = await fs.readFile('package.json');\n const { workspaces } = JSON.parse(\n packageJsonAsBuffer.toString()\n ) as PackageJsonWithWorkspace;\n\n let packages: string[] = [];\n\n if (Array.isArray(workspaces)) {\n packages = workspaces;\n } else {\n packages = workspaces?.packages ?? [];\n }\n\n return getPackagePaths(packages, fs);\n}\n\nasync function getNxWorkspacePackagePaths({\n fs,\n}: GetPackagePathOptions): Promise<string[]> {\n const nxWorkspaceJsonAsBuffer = await fs.readFile('workspace.json');\n\n const { projects } = JSON.parse(nxWorkspaceJsonAsBuffer.toString());\n\n const packages: string[] = Object.values(projects);\n return getPackagePaths(packages, fs);\n}\n\nasync function getPnpmWorkspacePackagePaths({\n fs,\n}: GetPackagePathOptions): Promise<string[]> {\n const pnpmWorkspaceAsBuffer = await fs.readFile('pnpm-workspace.yaml');\n const { packages = [] } = yaml.load(\n pnpmWorkspaceAsBuffer.toString()\n ) as PnpmWorkspaces;\n\n return getPackagePaths(packages, fs);\n}\n\nasync function getRushWorkspacePackagePaths({\n fs,\n}: GetPackagePathOptions): Promise<string[]> {\n const rushWorkspaceAsBuffer = await fs.readFile('rush.json');\n\n const { projects = [] } = json5.parse(\n rushWorkspaceAsBuffer.toString()\n ) as RushWorkspaces;\n\n if (Array.isArray(projects)) {\n const packages = projects\n .filter(proj => proj.projectFolder)\n .map(project => project.projectFolder);\n\n return getPackagePaths(packages, fs);\n } else {\n return [];\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["_path", "glob", "yaml", "json5"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/workspaces/get-workspaces.ts"],
4
- "sourcesContent": ["import path from 'path';\nimport { DetectorFilesystem } from '../detectors/filesystem';\nimport { workspaceManagers } from './workspace-managers';\nimport { detectFramework as detectWorkspaceManagers } from '../detect-framework';\n\nconst MAX_DEPTH_TRAVERSE = 3;\nconst posixPath = path.posix;\n\nexport interface GetWorkspaceOptions {\n fs: DetectorFilesystem;\n depth?: number;\n cwd?: string;\n}\n\nexport type WorkspaceType = 'yarn' | 'pnpm' | 'npm' | 'nx' | 'rush';\n\nexport type Workspace = {\n type: WorkspaceType;\n rootPath: string;\n};\n\nexport async function getWorkspaces({\n fs,\n depth = MAX_DEPTH_TRAVERSE,\n cwd = '/',\n}: GetWorkspaceOptions): Promise<Workspace[]> {\n if (depth === 0) return [];\n\n const workspaceType = await detectWorkspaceManagers({\n fs,\n frameworkList: workspaceManagers,\n });\n\n if (workspaceType === null) {\n const directoryContents = await fs.readdir('./');\n const childDirectories = directoryContents.filter(\n stat => stat.type === 'dir'\n );\n\n return (\n await Promise.all(\n childDirectories.map(childDirectory =>\n getWorkspaces({\n fs: fs.chdir(childDirectory.path),\n depth: depth - 1,\n cwd: posixPath.join(cwd, childDirectory.path),\n })\n )\n )\n ).flat();\n }\n\n return [\n {\n type: workspaceType as WorkspaceType,\n rootPath: cwd,\n },\n ];\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AAEjB,gCAAkC;AAClC,8BAA2D;AAE3D,MAAM,qBAAqB;AAC3B,MAAM,YAAY,YAAAA,QAAK;AAevB,eAAsB,cAAc;AAAA,EAClC;AAAA,EACA,QAAQ;AAAA,EACR,MAAM;AACR,GAA8C;AAC5C,MAAI,UAAU;AAAG,WAAO,CAAC;AAEzB,QAAM,gBAAgB,UAAM,wBAAAC,iBAAwB;AAAA,IAClD;AAAA,IACA,eAAe;AAAA,EACjB,CAAC;AAED,MAAI,kBAAkB,MAAM;AAC1B,UAAM,oBAAoB,MAAM,GAAG,QAAQ,IAAI;AAC/C,UAAM,mBAAmB,kBAAkB;AAAA,MACzC,UAAQ,KAAK,SAAS;AAAA,IACxB;AAEA,YACE,MAAM,QAAQ;AAAA,MACZ,iBAAiB;AAAA,QAAI,oBACnB,cAAc;AAAA,UACZ,IAAI,GAAG,MAAM,eAAe,IAAI;AAAA,UAChC,OAAO,QAAQ;AAAA,UACf,KAAK,UAAU,KAAK,KAAK,eAAe,IAAI;AAAA,QAC9C,CAAC;AAAA,MACH;AAAA,IACF,GACA,KAAK;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AACF;",
6
- "names": ["path", "detectWorkspaceManagers"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/workspaces/workspace-managers.ts"],
4
- "sourcesContent": ["import type { Framework } from '@vercel/frameworks';\n\n/**\n * The supported list of workspace managers.\n *\n * This list is designed to work with the @see {@link detectFramework} function.\n *\n * @example\n * import { workspaceManagers as frameworkList } from '@vercel/fs-detectors'\n * import { detectFramework } from '@vercel/fs-detectors'\n *\n * const fs = new GitDetectorFilesystem(...)\n * detectFramwork({ fs, frameworkList }) // returns the 'slug' field if detected, otherwise null\n *\n */\nexport const workspaceManagers: Array<\n Omit<Framework, 'description' | 'logo' | 'settings' | 'getOutputDirName'>\n> = [\n {\n name: 'Yarn',\n slug: 'yarn',\n detectors: {\n every: [\n {\n path: 'package.json',\n matchContent:\n '\"workspaces\":\\\\s*(?:\\\\[[^\\\\]]*]|{[^}]*\"packages\":[^}]*})',\n },\n {\n path: 'yarn.lock',\n },\n ],\n },\n },\n {\n name: 'pnpm',\n slug: 'pnpm',\n detectors: {\n every: [\n {\n path: 'pnpm-workspace.yaml',\n },\n ],\n },\n },\n {\n name: 'npm',\n slug: 'npm',\n detectors: {\n every: [\n {\n path: 'package.json',\n matchContent:\n '\"workspaces\":\\\\s*(?:\\\\[[^\\\\]]*]|{[^}]*\"packages\":[^}]*})',\n },\n {\n path: 'package-lock.json',\n },\n ],\n },\n },\n {\n name: 'nx',\n slug: 'nx',\n detectors: {\n every: [\n {\n path: 'workspace.json',\n matchContent: '\"projects\":\\\\s*{[^}]',\n },\n ],\n },\n },\n {\n name: 'rush',\n slug: 'rush',\n detectors: {\n every: [\n {\n path: 'rush.json',\n },\n ],\n },\n },\n {\n name: 'default',\n slug: 'yarn',\n detectors: {\n every: [\n {\n path: 'package.json',\n matchContent:\n '\"workspaces\":\\\\s*(?:\\\\[[^\\\\]]*]|{[^}]*\"packages\":[^}]*})',\n },\n ],\n },\n },\n];\n\nexport default workspaceManagers;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeO,MAAM,oBAET;AAAA,EACF;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,cACE;AAAA,QACJ;AAAA,QACA;AAAA,UACE,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,cACE;AAAA,QACJ;AAAA,QACA;AAAA,UACE,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,WAAW;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,cACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAO,6BAAQ;",
6
- "names": []
7
- }