convex 1.37.0 → 1.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +1 -1
- package/dist/cjs/bundler/debugBundle.js +2 -1
- package/dist/cjs/bundler/debugBundle.js.map +2 -2
- package/dist/cjs/bundler/index.js +6 -3
- package/dist/cjs/bundler/index.js.map +2 -2
- package/dist/cjs/bundler/serverOnly.js +37 -0
- package/dist/cjs/bundler/serverOnly.js.map +7 -0
- package/dist/cjs/cli/configure.js +5 -32
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/deploy.js +1 -1
- package/dist/cjs/cli/deploy.js.map +1 -1
- package/dist/cjs/cli/deploymentCreate.js +21 -9
- package/dist/cjs/cli/deploymentCreate.js.map +2 -2
- package/dist/cjs/cli/deploymentSelect.js +25 -0
- package/dist/cjs/cli/deploymentSelect.js.map +2 -2
- package/dist/cjs/cli/deploymentTokenCreate.js +1 -1
- package/dist/cjs/cli/deploymentTokenCreate.js.map +2 -2
- package/dist/cjs/cli/deploymentTokenDelete.js +1 -1
- package/dist/cjs/cli/deploymentTokenDelete.js.map +2 -2
- package/dist/cjs/cli/index.js +5 -2
- package/dist/cjs/cli/index.js.map +2 -2
- package/dist/cjs/cli/lib/deploymentSelection.js +4 -7
- package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/cjs/cli/lib/env.js +1 -0
- package/dist/cjs/cli/lib/env.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/anonymous.js +4 -4
- package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/errors.js +1 -1
- package/dist/cjs/cli/lib/localDeployment/errors.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js +64 -9
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/utils.js +19 -7
- package/dist/cjs/cli/lib/localDeployment/utils.js.map +3 -3
- package/dist/cjs/cli/lib/utils/globalConfig.js +1 -2
- package/dist/cjs/cli/lib/utils/globalConfig.js.map +2 -2
- package/dist/cjs/cli/lib/utils/utils.js +8 -0
- package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/audit_logging.js +3 -1
- package/dist/cjs/server/audit_logging.js.map +2 -2
- package/dist/cjs/server/components/index.js +1 -12
- package/dist/cjs/server/components/index.js.map +2 -2
- package/dist/cjs/server/impl/registration_impl.js +8 -5
- package/dist/cjs/server/impl/registration_impl.js.map +2 -2
- package/dist/cjs/server/index.js.map +2 -2
- package/dist/cjs/server/log.js.map +2 -2
- package/dist/cjs/server/logVars.js.map +2 -2
- package/dist/cjs/server/meta.js.map +1 -1
- package/dist/cjs-types/bundler/debugBundle.d.ts.map +1 -1
- package/dist/cjs-types/bundler/index.d.ts.map +1 -1
- package/dist/cjs-types/bundler/serverOnly.d.ts +3 -0
- package/dist/cjs-types/bundler/serverOnly.d.ts.map +1 -0
- package/dist/cjs-types/cli/configure.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentCreate.d.ts +4 -0
- package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentTokenCreate.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentTokenDelete.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +6 -6
- package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +6 -6
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +8 -8
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/errors.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts +8 -0
- package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +13 -4
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/globalConfig.d.ts +0 -1
- package/dist/cjs-types/cli/lib/utils/globalConfig.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/utils.d.ts +7 -0
- package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/server/audit_logging.d.ts +1 -0
- package/dist/cjs-types/server/audit_logging.d.ts.map +1 -1
- package/dist/cjs-types/server/components/index.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +2 -0
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cjs-types/server/log.d.ts +28 -0
- package/dist/cjs-types/server/log.d.ts.map +1 -1
- package/dist/cjs-types/server/logVars.d.ts +1 -0
- package/dist/cjs-types/server/logVars.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts +2 -0
- package/dist/cjs-types/server/meta.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +1583 -1520
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/bundler/debugBundle.js +2 -1
- package/dist/esm/bundler/debugBundle.js.map +2 -2
- package/dist/esm/bundler/index.js +6 -3
- package/dist/esm/bundler/index.js.map +2 -2
- package/dist/esm/bundler/serverOnly.js +15 -0
- package/dist/esm/bundler/serverOnly.js.map +7 -0
- package/dist/esm/cli/configure.js +5 -32
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/deploy.js +1 -1
- package/dist/esm/cli/deploy.js.map +1 -1
- package/dist/esm/cli/deploymentCreate.js +21 -10
- package/dist/esm/cli/deploymentCreate.js.map +2 -2
- package/dist/esm/cli/deploymentSelect.js +25 -0
- package/dist/esm/cli/deploymentSelect.js.map +2 -2
- package/dist/esm/cli/deploymentTokenCreate.js +2 -1
- package/dist/esm/cli/deploymentTokenCreate.js.map +2 -2
- package/dist/esm/cli/deploymentTokenDelete.js +2 -1
- package/dist/esm/cli/deploymentTokenDelete.js.map +2 -2
- package/dist/esm/cli/index.js +5 -2
- package/dist/esm/cli/index.js.map +2 -2
- package/dist/esm/cli/lib/deploymentSelection.js +5 -7
- package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/esm/cli/lib/env.js +2 -0
- package/dist/esm/cli/lib/env.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/anonymous.js +4 -4
- package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/errors.js +1 -1
- package/dist/esm/cli/lib/localDeployment/errors.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/localDeployment.js +70 -11
- package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/utils.js +19 -7
- package/dist/esm/cli/lib/localDeployment/utils.js.map +3 -3
- package/dist/esm/cli/lib/utils/globalConfig.js +1 -2
- package/dist/esm/cli/lib/utils/globalConfig.js.map +2 -2
- package/dist/esm/cli/lib/utils/utils.js +6 -0
- package/dist/esm/cli/lib/utils/utils.js.map +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/audit_logging.js +3 -1
- package/dist/esm/server/audit_logging.js.map +2 -2
- package/dist/esm/server/components/index.js +1 -12
- package/dist/esm/server/components/index.js.map +2 -2
- package/dist/esm/server/impl/registration_impl.js +8 -5
- package/dist/esm/server/impl/registration_impl.js.map +2 -2
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm/server/log.js.map +2 -2
- package/dist/esm/server/logVars.js.map +2 -2
- package/dist/esm-types/bundler/debugBundle.d.ts.map +1 -1
- package/dist/esm-types/bundler/index.d.ts.map +1 -1
- package/dist/esm-types/bundler/serverOnly.d.ts +3 -0
- package/dist/esm-types/bundler/serverOnly.d.ts.map +1 -0
- package/dist/esm-types/cli/configure.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentCreate.d.ts +4 -0
- package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentTokenCreate.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentTokenDelete.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +6 -6
- package/dist/esm-types/cli/lib/deployApi/modules.d.ts +6 -6
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +8 -8
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/errors.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts +8 -0
- package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +13 -4
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/globalConfig.d.ts +0 -1
- package/dist/esm-types/cli/lib/utils/globalConfig.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/utils.d.ts +7 -0
- package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/server/audit_logging.d.ts +1 -0
- package/dist/esm-types/server/audit_logging.d.ts.map +1 -1
- package/dist/esm-types/server/components/index.d.ts.map +1 -1
- package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +2 -0
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/esm-types/server/log.d.ts +28 -0
- package/dist/esm-types/server/log.d.ts.map +1 -1
- package/dist/esm-types/server/logVars.d.ts +1 -0
- package/dist/esm-types/server/logVars.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts +2 -0
- package/dist/esm-types/server/meta.d.ts.map +1 -1
- package/dist/react.bundle.js +1 -1
- package/dist/react.bundle.js.map +1 -1
- package/package.json +1 -1
- package/schemas/convex.schema.json +1 -1
- package/src/bundler/debugBundle.ts +2 -1
- package/src/bundler/index.ts +7 -3
- package/src/bundler/serverOnly.ts +18 -0
- package/src/cli/configure.ts +2 -35
- package/src/cli/deploy.ts +1 -1
- package/src/cli/deploymentCreate.test.ts +4 -0
- package/src/cli/deploymentCreate.ts +23 -9
- package/src/cli/deploymentSelect.test.ts +60 -6
- package/src/cli/deploymentSelect.ts +34 -0
- package/src/cli/deploymentSelection.test.ts +72 -19
- package/src/cli/deploymentTokenCreate.ts +4 -1
- package/src/cli/deploymentTokenDelete.ts +9 -1
- package/src/cli/index.ts +6 -2
- package/src/cli/lib/deploymentSelection.ts +5 -7
- package/src/cli/lib/env.ts +2 -0
- package/src/cli/lib/localDeployment/anonymous.ts +5 -4
- package/src/cli/lib/localDeployment/errors.ts +1 -3
- package/src/cli/lib/localDeployment/localDeployment.ts +85 -10
- package/src/cli/lib/localDeployment/utils.ts +31 -7
- package/src/cli/lib/utils/globalConfig.ts +0 -3
- package/src/cli/lib/utils/utils.ts +15 -0
- package/src/index.ts +1 -1
- package/src/server/audit_logging.ts +2 -3
- package/src/server/components/index.ts +3 -15
- package/src/server/impl/registration_impl.ts +13 -7
- package/src/server/index.ts +0 -6
- package/src/server/log.ts +21 -3
- package/src/server/logVars.ts +0 -3
- package/src/server/meta.ts +0 -7
- package/dist/cjs/cli/disableLocalDev.js +0 -121
- package/dist/cjs/cli/disableLocalDev.js.map +0 -7
- package/dist/cjs-types/cli/disableLocalDev.d.ts +0 -6
- package/dist/cjs-types/cli/disableLocalDev.d.ts.map +0 -1
- package/dist/esm/cli/disableLocalDev.js +0 -105
- package/dist/esm/cli/disableLocalDev.js.map +0 -7
- package/dist/esm-types/cli/disableLocalDev.d.ts +0 -6
- package/dist/esm-types/cli/disableLocalDev.d.ts.map +0 -1
- package/src/cli/disableLocalDev.ts +0 -134
|
@@ -37,6 +37,7 @@ var import_path = __toESM(require("path"), 1);
|
|
|
37
37
|
var import_esbuild = __toESM(require("esbuild"), 1);
|
|
38
38
|
var import_log = require("./log.js");
|
|
39
39
|
var import_wasm = require("./wasm.js");
|
|
40
|
+
var import_serverOnly = require("./serverOnly.js");
|
|
40
41
|
var import_depgraph = __toESM(require("./depgraph.js"), 1);
|
|
41
42
|
async function innerEsbuild({
|
|
42
43
|
entryPoints,
|
|
@@ -109,7 +110,7 @@ async function debugIsolateBundlesSerially(ctx, {
|
|
|
109
110
|
chunksFolder: "_deps",
|
|
110
111
|
extraConditions,
|
|
111
112
|
dir,
|
|
112
|
-
plugins: [plugin, import_wasm.wasmPlugin],
|
|
113
|
+
plugins: [import_serverOnly.serverOnlyPlugin, plugin, import_wasm.wasmPlugin],
|
|
113
114
|
logLevel: "silent"
|
|
114
115
|
});
|
|
115
116
|
} catch (error) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bundler/debugBundle.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport esbuild, { BuildFailure, LogLevel, Plugin } from \"esbuild\";\nimport { Context } from \"./context.js\";\nimport {\n logError,\n changeSpinner,\n logFailure,\n logVerbose,\n logMessage,\n} from \"./log.js\";\nimport { wasmPlugin } from \"./wasm.js\";\nimport dependencyTrackerPlugin from \"./depgraph.js\";\n\nexport async function innerEsbuild({\n entryPoints,\n platform,\n dir,\n extraConditions,\n generateSourceMaps,\n plugins,\n chunksFolder,\n logLevel,\n includeSourcesContent = false,\n splitting = true,\n}: {\n entryPoints: string[];\n platform: esbuild.Platform;\n dir: string;\n extraConditions: string[];\n generateSourceMaps: boolean;\n plugins: Plugin[];\n chunksFolder: string;\n logLevel?: LogLevel;\n includeSourcesContent?: boolean;\n splitting?: boolean | undefined;\n}) {\n const result = await esbuild.build({\n entryPoints,\n bundle: true,\n platform: platform,\n format: \"esm\",\n target: \"esnext\",\n jsx: \"automatic\",\n outdir: \"out\",\n outbase: dir,\n conditions: [\"convex\", \"module\", ...extraConditions],\n plugins,\n write: false,\n sourcemap: generateSourceMaps,\n sourcesContent: includeSourcesContent,\n splitting,\n chunkNames: path.join(chunksFolder, \"[hash]\"),\n treeShaking: true,\n minifySyntax: true,\n minifyIdentifiers: true,\n // Enabling minifyWhitespace breaks sourcemaps on convex backends.\n // The sourcemaps produced are valid on https://evanw.github.io/source-map-visualization\n // but something we're doing (perhaps involving https://github.com/getsentry/rust-sourcemap)\n // makes everything map to the same line.\n minifyWhitespace: false, // false is the default, just showing for clarify.\n keepNames: true,\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n },\n metafile: true,\n logLevel: logLevel || \"warning\",\n });\n return result;\n}\n\nexport function isEsbuildBuildError(e: any): e is BuildFailure {\n return (\n \"errors\" in e &&\n \"warnings\" in e &&\n Array.isArray(e.errors) &&\n Array.isArray(e.warnings)\n );\n}\n\n/**\n * Bundle non-\"use node\" entry points one at a time to track down the first file with an error\n * is being imported.\n */\nexport async function debugIsolateBundlesSerially(\n ctx: Context,\n {\n entryPoints,\n extraConditions,\n dir,\n }: {\n entryPoints: string[];\n extraConditions: string[];\n dir: string;\n },\n): Promise<void> {\n logMessage(\n `Bundling convex entry points one at a time to track down things that can't be bundled for the Convex JS runtime.`,\n );\n let i = 1;\n for (const entryPoint of entryPoints) {\n changeSpinner(\n `bundling entry point ${entryPoint} (${i++}/${entryPoints.length})...`,\n );\n\n const { plugin, tracer } = dependencyTrackerPlugin();\n try {\n await innerEsbuild({\n entryPoints: [entryPoint],\n platform: \"browser\",\n generateSourceMaps: true,\n chunksFolder: \"_deps\",\n extraConditions,\n dir,\n plugins: [plugin, wasmPlugin],\n logLevel: \"silent\",\n });\n } catch (error) {\n if (!isEsbuildBuildError(error) || !error.errors[0]) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: null,\n });\n }\n\n const buildError = error.errors[0];\n const errorFile = buildError.location?.file;\n if (!errorFile) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: null,\n });\n }\n\n const importedPath = buildError.text.match(/\"([^\"]+)\"/)?.[1];\n if (!importedPath) continue;\n\n const full = path.resolve(errorFile);\n logError(\"\");\n logError(\n `Bundling ${entryPoint} resulted in ${error.errors.length} esbuild errors.`,\n );\n logError(`One of the bundling errors occurred while bundling ${full}:\\n`);\n logError(\n esbuild\n .formatMessagesSync([buildError], {\n kind: \"error\",\n color: true,\n })\n .join(\"\\n\"),\n );\n logError(\"It would help to avoid importing this file.\");\n const chains = tracer.traceImportChains(entryPoint, full);\n const chain: string[] = chains[0];\n chain.reverse();\n\n logError(``);\n if (chain.length > 0) {\n const problematicFileRelative = formatFilePath(dir, chain[0]);\n\n if (chain.length === 1) {\n logError(` ${problematicFileRelative}`);\n } else {\n logError(` ${problematicFileRelative} is imported by`);\n\n for (let i = 1; i < chain.length - 1; i++) {\n const fileRelative = formatFilePath(dir, chain[i]);\n logError(` ${fileRelative}, which is imported by`);\n }\n\n const entryPointFile = chain[chain.length - 1];\n const entryPointRelative = formatFilePath(dir, entryPointFile);\n\n logError(` ${entryPointRelative}, which doesn't use \"use node\"\\n`);\n logError(\n ` For registered action functions to use Node.js APIs in any code they run they must be defined\\n` +\n ` in a file with 'use node' at the top. See https://docs.convex.dev/functions/runtimes#nodejs-runtime\\n`,\n );\n }\n }\n\n logFailure(\"Bundling failed\");\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Bundling failed.\",\n });\n }\n logVerbose(`${entryPoint} bundled`);\n }\n}\n\n// Helper function to format file paths consistently\nfunction formatFilePath(baseDir: string, filePath: string): string {\n // If it's already a relative path like \"./shared\", just return it\n if (!path.isAbsolute(filePath)) {\n // For relative paths, ensure they start with \"convex/\"\n if (!filePath.startsWith(\"convex/\")) {\n // If it's a path like \"./subdir/file.ts\" or \"subdir/file.ts\"\n const cleanPath = filePath.replace(/^\\.\\//, \"\");\n return `convex/${cleanPath}`;\n }\n return filePath;\n }\n\n // Get the path relative to the base directory\n const relativePath = path.relative(baseDir, filePath);\n\n // Remove any leading \"./\" that path.relative might add\n const cleanPath = relativePath.replace(/^\\.\\//, \"\");\n\n // Check if this is a path within the convex directory\n const isConvexPath =\n cleanPath.startsWith(\"convex/\") ||\n cleanPath.includes(\"/convex/\") ||\n path.dirname(cleanPath) === \"convex\";\n\n if (isConvexPath) {\n // If it already starts with convex/, return it as is\n if (cleanPath.startsWith(\"convex/\")) {\n return cleanPath;\n }\n\n // For files in the convex directory\n if (path.dirname(cleanPath) === \"convex\") {\n const filename = path.basename(cleanPath);\n return `convex/${filename}`;\n }\n\n // For files in subdirectories of convex\n const convexIndex = cleanPath.indexOf(\"convex/\");\n if (convexIndex >= 0) {\n return cleanPath.substring(convexIndex);\n }\n }\n\n // For any other path, assume it's in the convex directory\n // This handles cases where the file is in a subdirectory of convex\n // but the path doesn't include \"convex/\" explicitly\n return `convex/${cleanPath}`;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,qBAAwD;AAExD,iBAMO;AACP,kBAA2B;AAC3B,sBAAoC;AAEpC,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,wBAAwB;AAAA,EACxB,YAAY;AACd,GAWG;AACD,QAAM,SAAS,MAAM,eAAAA,QAAQ,MAAM;AAAA,IACjC;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY,CAAC,UAAU,UAAU,GAAG,eAAe;AAAA,IACnD;AAAA,IACA,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB;AAAA,IACA,YAAY,YAAAC,QAAK,KAAK,cAAc,QAAQ;AAAA,IAC5C,aAAa;AAAA,IACb,cAAc;AAAA,IACd,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKnB,kBAAkB;AAAA;AAAA,IAClB,WAAW;AAAA,IACX,QAAQ;AAAA,MACN,wBAAwB;AAAA,IAC1B;AAAA,IACA,UAAU;AAAA,IACV,UAAU,YAAY;AAAA,EACxB,CAAC;AACD,SAAO;AACT;AAEO,SAAS,oBAAoB,GAA2B;AAC7D,SACE,YAAY,KACZ,cAAc,KACd,MAAM,QAAQ,EAAE,MAAM,KACtB,MAAM,QAAQ,EAAE,QAAQ;AAE5B;AAMA,eAAsB,4BACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AACF,GAKe;AACf;AAAA,IACE;AAAA,EACF;AACA,MAAI,IAAI;AACR,aAAW,cAAc,aAAa;AACpC;AAAA,MACE,wBAAwB,UAAU,KAAK,GAAG,IAAI,YAAY,MAAM;AAAA,IAClE;AAEA,UAAM,EAAE,QAAQ,OAAO,QAAI,gBAAAC,SAAwB;AACnD,QAAI;AACF,YAAM,aAAa;AAAA,QACjB,aAAa,CAAC,UAAU;AAAA,QACxB,UAAU;AAAA,QACV,oBAAoB;AAAA,QACpB,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA,SAAS,CAAC,QAAQ,sBAAU;AAAA,
|
|
4
|
+
"sourcesContent": ["import path from \"path\";\nimport esbuild, { BuildFailure, LogLevel, Plugin } from \"esbuild\";\nimport { Context } from \"./context.js\";\nimport {\n logError,\n changeSpinner,\n logFailure,\n logVerbose,\n logMessage,\n} from \"./log.js\";\nimport { wasmPlugin } from \"./wasm.js\";\nimport { serverOnlyPlugin } from \"./serverOnly.js\";\nimport dependencyTrackerPlugin from \"./depgraph.js\";\n\nexport async function innerEsbuild({\n entryPoints,\n platform,\n dir,\n extraConditions,\n generateSourceMaps,\n plugins,\n chunksFolder,\n logLevel,\n includeSourcesContent = false,\n splitting = true,\n}: {\n entryPoints: string[];\n platform: esbuild.Platform;\n dir: string;\n extraConditions: string[];\n generateSourceMaps: boolean;\n plugins: Plugin[];\n chunksFolder: string;\n logLevel?: LogLevel;\n includeSourcesContent?: boolean;\n splitting?: boolean | undefined;\n}) {\n const result = await esbuild.build({\n entryPoints,\n bundle: true,\n platform: platform,\n format: \"esm\",\n target: \"esnext\",\n jsx: \"automatic\",\n outdir: \"out\",\n outbase: dir,\n conditions: [\"convex\", \"module\", ...extraConditions],\n plugins,\n write: false,\n sourcemap: generateSourceMaps,\n sourcesContent: includeSourcesContent,\n splitting,\n chunkNames: path.join(chunksFolder, \"[hash]\"),\n treeShaking: true,\n minifySyntax: true,\n minifyIdentifiers: true,\n // Enabling minifyWhitespace breaks sourcemaps on convex backends.\n // The sourcemaps produced are valid on https://evanw.github.io/source-map-visualization\n // but something we're doing (perhaps involving https://github.com/getsentry/rust-sourcemap)\n // makes everything map to the same line.\n minifyWhitespace: false, // false is the default, just showing for clarify.\n keepNames: true,\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n },\n metafile: true,\n logLevel: logLevel || \"warning\",\n });\n return result;\n}\n\nexport function isEsbuildBuildError(e: any): e is BuildFailure {\n return (\n \"errors\" in e &&\n \"warnings\" in e &&\n Array.isArray(e.errors) &&\n Array.isArray(e.warnings)\n );\n}\n\n/**\n * Bundle non-\"use node\" entry points one at a time to track down the first file with an error\n * is being imported.\n */\nexport async function debugIsolateBundlesSerially(\n ctx: Context,\n {\n entryPoints,\n extraConditions,\n dir,\n }: {\n entryPoints: string[];\n extraConditions: string[];\n dir: string;\n },\n): Promise<void> {\n logMessage(\n `Bundling convex entry points one at a time to track down things that can't be bundled for the Convex JS runtime.`,\n );\n let i = 1;\n for (const entryPoint of entryPoints) {\n changeSpinner(\n `bundling entry point ${entryPoint} (${i++}/${entryPoints.length})...`,\n );\n\n const { plugin, tracer } = dependencyTrackerPlugin();\n try {\n await innerEsbuild({\n entryPoints: [entryPoint],\n platform: \"browser\",\n generateSourceMaps: true,\n chunksFolder: \"_deps\",\n extraConditions,\n dir,\n plugins: [serverOnlyPlugin, plugin, wasmPlugin],\n logLevel: \"silent\",\n });\n } catch (error) {\n if (!isEsbuildBuildError(error) || !error.errors[0]) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: null,\n });\n }\n\n const buildError = error.errors[0];\n const errorFile = buildError.location?.file;\n if (!errorFile) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: null,\n });\n }\n\n const importedPath = buildError.text.match(/\"([^\"]+)\"/)?.[1];\n if (!importedPath) continue;\n\n const full = path.resolve(errorFile);\n logError(\"\");\n logError(\n `Bundling ${entryPoint} resulted in ${error.errors.length} esbuild errors.`,\n );\n logError(`One of the bundling errors occurred while bundling ${full}:\\n`);\n logError(\n esbuild\n .formatMessagesSync([buildError], {\n kind: \"error\",\n color: true,\n })\n .join(\"\\n\"),\n );\n logError(\"It would help to avoid importing this file.\");\n const chains = tracer.traceImportChains(entryPoint, full);\n const chain: string[] = chains[0];\n chain.reverse();\n\n logError(``);\n if (chain.length > 0) {\n const problematicFileRelative = formatFilePath(dir, chain[0]);\n\n if (chain.length === 1) {\n logError(` ${problematicFileRelative}`);\n } else {\n logError(` ${problematicFileRelative} is imported by`);\n\n for (let i = 1; i < chain.length - 1; i++) {\n const fileRelative = formatFilePath(dir, chain[i]);\n logError(` ${fileRelative}, which is imported by`);\n }\n\n const entryPointFile = chain[chain.length - 1];\n const entryPointRelative = formatFilePath(dir, entryPointFile);\n\n logError(` ${entryPointRelative}, which doesn't use \"use node\"\\n`);\n logError(\n ` For registered action functions to use Node.js APIs in any code they run they must be defined\\n` +\n ` in a file with 'use node' at the top. See https://docs.convex.dev/functions/runtimes#nodejs-runtime\\n`,\n );\n }\n }\n\n logFailure(\"Bundling failed\");\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Bundling failed.\",\n });\n }\n logVerbose(`${entryPoint} bundled`);\n }\n}\n\n// Helper function to format file paths consistently\nfunction formatFilePath(baseDir: string, filePath: string): string {\n // If it's already a relative path like \"./shared\", just return it\n if (!path.isAbsolute(filePath)) {\n // For relative paths, ensure they start with \"convex/\"\n if (!filePath.startsWith(\"convex/\")) {\n // If it's a path like \"./subdir/file.ts\" or \"subdir/file.ts\"\n const cleanPath = filePath.replace(/^\\.\\//, \"\");\n return `convex/${cleanPath}`;\n }\n return filePath;\n }\n\n // Get the path relative to the base directory\n const relativePath = path.relative(baseDir, filePath);\n\n // Remove any leading \"./\" that path.relative might add\n const cleanPath = relativePath.replace(/^\\.\\//, \"\");\n\n // Check if this is a path within the convex directory\n const isConvexPath =\n cleanPath.startsWith(\"convex/\") ||\n cleanPath.includes(\"/convex/\") ||\n path.dirname(cleanPath) === \"convex\";\n\n if (isConvexPath) {\n // If it already starts with convex/, return it as is\n if (cleanPath.startsWith(\"convex/\")) {\n return cleanPath;\n }\n\n // For files in the convex directory\n if (path.dirname(cleanPath) === \"convex\") {\n const filename = path.basename(cleanPath);\n return `convex/${filename}`;\n }\n\n // For files in subdirectories of convex\n const convexIndex = cleanPath.indexOf(\"convex/\");\n if (convexIndex >= 0) {\n return cleanPath.substring(convexIndex);\n }\n }\n\n // For any other path, assume it's in the convex directory\n // This handles cases where the file is in a subdirectory of convex\n // but the path doesn't include \"convex/\" explicitly\n return `convex/${cleanPath}`;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["esbuild", "path", "dependencyTrackerPlugin", "i", "cleanPath"]
|
|
7
7
|
}
|
|
@@ -49,6 +49,7 @@ var Sentry = __toESM(require("@sentry/node"), 1);
|
|
|
49
49
|
var import_fs = require("./fs.js");
|
|
50
50
|
var import_log = require("./log.js");
|
|
51
51
|
var import_wasm = require("./wasm.js");
|
|
52
|
+
var import_serverOnly = require("./serverOnly.js");
|
|
52
53
|
var import_external = require("./external.js");
|
|
53
54
|
var import_debugBundle = require("./debugBundle.js");
|
|
54
55
|
var import_fs2 = require("./fs.js");
|
|
@@ -89,13 +90,15 @@ async function doEsbuild({
|
|
|
89
90
|
chunksFolder,
|
|
90
91
|
extraConditions,
|
|
91
92
|
dir,
|
|
92
|
-
//
|
|
93
|
-
|
|
93
|
+
// serverOnlyPlugin runs first so `server-only` is always stubbed,
|
|
94
|
+
// even if it appears in the external packages list.
|
|
95
|
+
// wasmPlugin runs last so it doesn't run on external modules.
|
|
96
|
+
plugins: [import_serverOnly.serverOnlyPlugin, external.plugin, import_wasm.wasmPlugin],
|
|
94
97
|
includeSourcesContent,
|
|
95
98
|
splitting
|
|
96
99
|
});
|
|
97
100
|
for (const [relPath, input] of Object.entries(result.metafile.inputs)) {
|
|
98
|
-
if (relPath.indexOf("(disabled):") !== -1 || relPath.startsWith("wasm-binary:") || relPath.startsWith("wasm-stub:")) {
|
|
101
|
+
if (relPath.indexOf("(disabled):") !== -1 || relPath.startsWith("wasm-binary:") || relPath.startsWith("wasm-stub:") || relPath.startsWith("server-only-stub:")) {
|
|
99
102
|
continue;
|
|
100
103
|
}
|
|
101
104
|
const absPath = import_path.default.resolve(relPath);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/bundler/index.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport { chalkStderr } from \"chalk\";\nimport esbuild from \"esbuild\";\nimport { parse as parseAST } from \"@babel/parser\";\nimport { Identifier, ImportSpecifier } from \"@babel/types\";\nimport * as Sentry from \"@sentry/node\";\nimport { Filesystem, consistentPathSort } from \"./fs.js\";\nimport { Context } from \"./context.js\";\nimport { logVerbose, logWarning } from \"./log.js\";\nimport { wasmPlugin } from \"./wasm.js\";\nimport {\n ExternalPackage,\n computeExternalPackages,\n createExternalPlugin,\n findExactVersionAndDependencies,\n} from \"./external.js\";\nimport { innerEsbuild, isEsbuildBuildError } from \"./debugBundle.js\";\nexport { nodeFs, RecordingFs } from \"./fs.js\";\nexport type { Filesystem } from \"./fs.js\";\n\nexport const actionsDir = \"actions\";\n\n// Returns a generator of { isDir, path, depth } for all paths\n// within dirPath in some topological order (not including\n// dirPath itself).\nexport function* walkDir(\n fs: Filesystem,\n dirPath: string,\n shouldSkipDir?: (dirPath: string) => boolean,\n depth?: number,\n): Generator<{ isDir: boolean; path: string; depth: number }, void, void> {\n depth = depth ?? 0;\n for (const dirEntry of fs.listDir(dirPath).sort(consistentPathSort)) {\n const childPath = path.join(dirPath, dirEntry.name);\n if (dirEntry.isDirectory()) {\n if (shouldSkipDir && shouldSkipDir(childPath)) {\n continue;\n }\n yield { isDir: true, path: childPath, depth };\n yield* walkDir(fs, childPath, shouldSkipDir, depth + 1);\n } else if (dirEntry.isFile()) {\n yield { isDir: false, path: childPath, depth };\n }\n }\n}\n\n// Convex specific module environment.\ntype ModuleEnvironment = \"node\" | \"isolate\";\n\nexport interface Bundle {\n path: string;\n source: string;\n sourceMap?: string | undefined;\n environment: ModuleEnvironment;\n}\n\nexport interface BundleHash {\n path: string;\n hash: string;\n environment: ModuleEnvironment;\n}\n\ntype EsBuildResult = esbuild.BuildResult & {\n outputFiles: esbuild.OutputFile[];\n // Set of referenced external modules.\n externalModuleNames: Set<string>;\n // Set of bundled modules.\n bundledModuleNames: Set<string>;\n};\n\nasync function doEsbuild({\n ctx,\n dir,\n entryPoints,\n generateSourceMaps,\n platform,\n chunksFolder,\n externalPackages,\n extraConditions,\n includeSourcesContent,\n splitting,\n}: {\n ctx: Context;\n dir: string;\n entryPoints: string[];\n generateSourceMaps: boolean;\n platform: esbuild.Platform;\n chunksFolder: string;\n externalPackages: Map<string, ExternalPackage>;\n extraConditions: string[];\n includeSourcesContent: boolean;\n splitting?: boolean | undefined;\n}): Promise<EsBuildResult> {\n const external = createExternalPlugin(ctx, externalPackages);\n try {\n const result = await innerEsbuild({\n entryPoints,\n platform,\n generateSourceMaps,\n chunksFolder,\n extraConditions,\n dir,\n // The wasmPlugin should be last so it doesn't run on external modules.\n plugins: [external.plugin, wasmPlugin],\n includeSourcesContent,\n splitting,\n });\n\n for (const [relPath, input] of Object.entries(result.metafile!.inputs)) {\n // TODO: esbuild outputs paths prefixed with \"(disabled)\"\" when bundling our internal\n // udf-runtime package. The files do actually exist locally, though.\n if (\n relPath.indexOf(\"(disabled):\") !== -1 ||\n relPath.startsWith(\"wasm-binary:\") ||\n relPath.startsWith(\"wasm-stub:\")\n ) {\n continue;\n }\n const absPath = path.resolve(relPath);\n const st = ctx.fs.stat(absPath);\n if (st.size !== input.bytes) {\n logWarning(\n `Bundled file ${absPath} changed right after esbuild invocation`,\n );\n // Consider this a transient error so we'll try again and hopefully\n // no files change right after esbuild next time.\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n printedMessage: null,\n });\n }\n ctx.fs.registerPath(absPath, st);\n }\n return {\n ...result,\n externalModuleNames: external.externalModuleNames,\n bundledModuleNames: external.bundledModuleNames,\n };\n } catch (e: unknown) {\n // esbuild sometimes throws a build error instead of returning a result\n // containing an array of errors. Syntax errors are one of these cases.\n let recommendUseNode = false;\n if (isEsbuildBuildError(e)) {\n for (const error of e.errors) {\n if (error.location) {\n const absPath = path.resolve(error.location.file);\n const st = ctx.fs.stat(absPath);\n ctx.fs.registerPath(absPath, st);\n }\n if (\n platform !== \"node\" &&\n !recommendUseNode &&\n error.notes.some((note) =>\n note.text.includes(\"Are you trying to bundle for node?\"),\n )\n ) {\n recommendUseNode = true;\n }\n }\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n // We don't print any error because esbuild already printed\n // all the relevant information.\n printedMessage: recommendUseNode\n ? `\\nIt looks like you are using Node APIs from a file without the \"use node\" directive.\\n` +\n `Split out actions using Node.js APIs like this into a new file only containing actions that uses \"use node\" ` +\n `so these actions will run in a Node.js environment.\\n` +\n `For more information see https://docs.convex.dev/functions/runtimes#nodejs-runtime\\n`\n : null,\n });\n }\n}\n\nexport async function bundle({\n ctx,\n dir,\n entryPoints,\n generateSourceMaps,\n platform,\n chunksFolder = \"_deps\",\n externalPackagesAllowList = [],\n extraConditions = [],\n includeSourcesContent = false,\n splitting,\n}: {\n ctx: Context;\n dir: string;\n entryPoints: string[];\n generateSourceMaps: boolean;\n platform: esbuild.Platform;\n chunksFolder?: string;\n externalPackagesAllowList?: string[];\n extraConditions?: string[];\n includeSourcesContent?: boolean;\n splitting?: boolean;\n}): Promise<{\n modules: Bundle[];\n externalDependencies: Map<string, string>;\n bundledModuleNames: Set<string>;\n}> {\n const availableExternalPackages = await computeExternalPackages(\n ctx,\n externalPackagesAllowList,\n );\n const result = await doEsbuild({\n ctx,\n dir,\n entryPoints,\n generateSourceMaps,\n platform,\n chunksFolder,\n externalPackages: availableExternalPackages,\n extraConditions,\n includeSourcesContent,\n splitting,\n });\n // Some ESBuild errors won't show up here, instead crashing in doEsbuild().\n if (result.errors.length) {\n const errorMessage = result.errors\n .map((e) => `esbuild error: ${e.text}`)\n .join(\"\\n\");\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: errorMessage,\n });\n }\n for (const warning of result.warnings) {\n logWarning(chalkStderr.yellow(`esbuild warning: ${warning.text}`));\n }\n const sourceMaps = new Map();\n const modules: Bundle[] = [];\n const environment = platform === \"node\" ? \"node\" : \"isolate\";\n for (const outputFile of result.outputFiles) {\n const relPath = path.relative(path.normalize(\"out\"), outputFile.path);\n if (path.extname(relPath) === \".map\") {\n sourceMaps.set(relPath, outputFile.text);\n continue;\n }\n const posixRelPath = relPath.split(path.sep).join(path.posix.sep);\n modules.push({ path: posixRelPath, source: outputFile.text, environment });\n }\n for (const module of modules) {\n const sourceMapPath = module.path + \".map\";\n const sourceMap = sourceMaps.get(sourceMapPath);\n if (sourceMap) {\n module.sourceMap = sourceMap;\n }\n }\n\n return {\n modules,\n externalDependencies: await externalPackageVersions(\n ctx,\n availableExternalPackages,\n result.externalModuleNames,\n ),\n bundledModuleNames: result.bundledModuleNames,\n };\n}\n\n// We could return the full list of availableExternalPackages, but this would be\n// installing more packages that we need. Instead, we collect all external\n// dependencies we found during bundling the /convex function, as well as their\n// respective peer and optional dependencies.\nasync function externalPackageVersions(\n ctx: Context,\n availableExternalPackages: Map<string, ExternalPackage>,\n referencedPackages: Set<string>,\n): Promise<Map<string, string>> {\n const versions = new Map<string, string>();\n const referencedPackagesQueue = Array.from(referencedPackages.keys());\n\n for (let i = 0; i < referencedPackagesQueue.length; i++) {\n const moduleName = referencedPackagesQueue[i];\n // This assertion is safe because referencedPackages can only contain\n // packages in availableExternalPackages.\n const modulePath = availableExternalPackages.get(moduleName)!.path;\n // Since we don't support lock files and different install commands yet, we\n // pick up the exact version installed on the local filesystem.\n const { version, peerAndOptionalDependencies } =\n await findExactVersionAndDependencies(ctx, moduleName, modulePath);\n versions.set(moduleName, version);\n\n for (const dependency of peerAndOptionalDependencies) {\n if (\n availableExternalPackages.has(dependency) &&\n !referencedPackages.has(dependency)\n ) {\n referencedPackagesQueue.push(dependency);\n referencedPackages.add(dependency);\n }\n }\n }\n\n return versions;\n}\n\nexport async function bundleSchema(\n ctx: Context,\n dir: string,\n extraConditions: string[],\n) {\n let target = path.resolve(dir, \"schema.ts\");\n if (!ctx.fs.exists(target)) {\n target = path.resolve(dir, \"schema.js\");\n }\n const result = await bundle({\n ctx,\n dir,\n entryPoints: [target],\n generateSourceMaps: true,\n platform: \"browser\",\n extraConditions,\n });\n return result.modules;\n}\n\nexport async function bundleAuthConfig(ctx: Context, dir: string) {\n const authConfigPath = path.resolve(dir, \"auth.config.js\");\n const authConfigTsPath = path.resolve(dir, \"auth.config.ts\");\n if (ctx.fs.exists(authConfigPath) && ctx.fs.exists(authConfigTsPath)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Found both ${authConfigPath} and ${authConfigTsPath}, choose one.`,\n });\n }\n const chosenPath = ctx.fs.exists(authConfigTsPath)\n ? authConfigTsPath\n : authConfigPath;\n if (!ctx.fs.exists(chosenPath)) {\n logVerbose(\n chalkStderr.yellow(\n `Found no auth config file at ${authConfigTsPath} or ${authConfigPath} so there are no configured auth providers`,\n ),\n );\n return [];\n }\n logVerbose(chalkStderr.yellow(`Bundling auth config found at ${chosenPath}`));\n const result = await bundle({\n ctx,\n dir,\n entryPoints: [chosenPath],\n generateSourceMaps: true,\n platform: \"browser\",\n // The auth config must be one module\n splitting: false,\n });\n return result.modules;\n}\n\nexport async function doesImportConvexHttpRouter(source: string) {\n try {\n const ast = parseAST(source, {\n sourceType: \"module\",\n plugins: [\"typescript\"],\n });\n return ast.program.body.some((node) => {\n if (node.type !== \"ImportDeclaration\") return false;\n return node.specifiers.some((s) => {\n const specifier = s as ImportSpecifier;\n const imported = specifier.imported as Identifier;\n return imported.name === \"httpRouter\";\n });\n });\n } catch {\n return (\n source.match(\n /import\\s*\\{\\s*httpRouter.*\\}\\s*from\\s*\"\\s*convex\\/server\\s*\"/,\n ) !== null\n );\n }\n}\n\nconst ENTRY_POINT_EXTENSIONS = [\n // ESBuild js loader\n \".js\",\n \".mjs\",\n \".cjs\",\n // ESBuild ts loader\n \".ts\",\n \".tsx\",\n \".mts\",\n \".cts\",\n // ESBuild jsx loader\n \".jsx\",\n // ESBuild supports css, text, json, and more but these file types are not\n // allowed to define entry points.\n];\n\nexport async function entryPoints(\n ctx: Context,\n dir: string,\n): Promise<string[]> {\n const entryPoints = [];\n\n // Don't deploy directories in convex/ that define components\n // as this leads to double-deploying.\n const looksLikeNestedComponent = (dirPath: string): boolean => {\n const config = path.join(dirPath, \"convex.config.ts\");\n const isComponentDefinition = ctx.fs.exists(config);\n if (isComponentDefinition) {\n logVerbose(chalkStderr.yellow(`Skipping component directory ${dirPath}`));\n }\n return isComponentDefinition;\n };\n\n for (const { isDir, path: fpath, depth } of walkDir(\n ctx.fs,\n dir,\n looksLikeNestedComponent,\n )) {\n if (isDir) {\n continue;\n }\n const relPath = path.relative(dir, fpath);\n const parsedPath = path.parse(fpath);\n const base = parsedPath.base;\n const extension = parsedPath.ext.toLowerCase();\n\n if (relPath.startsWith(\"_deps\" + path.sep)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `The path \"${fpath}\" is within the \"_deps\" directory, which is reserved for dependencies. Please move your code to another directory.`,\n });\n }\n\n if (depth === 0 && base.toLowerCase().startsWith(\"https.\")) {\n const source = ctx.fs.readUtf8File(fpath);\n if (await doesImportConvexHttpRouter(source))\n logWarning(\n chalkStderr.yellow(\n `Found ${fpath}. HTTP action routes will not be imported from this file. Did you mean to include http${extension}?`,\n ),\n );\n Sentry.captureMessage(\n `User code top level directory contains file ${base} which imports httpRouter.`,\n \"warning\",\n );\n }\n\n // This should match isEntryPoint in the convex eslint plugin.\n if (!ENTRY_POINT_EXTENSIONS.some((ext) => relPath.endsWith(ext))) {\n logVerbose(chalkStderr.yellow(`Skipping non-JS file ${fpath}`));\n } else if (relPath.startsWith(\"_generated\" + path.sep)) {\n logVerbose(chalkStderr.yellow(`Skipping ${fpath}`));\n } else if (base.startsWith(\".\")) {\n logVerbose(chalkStderr.yellow(`Skipping dotfile ${fpath}`));\n } else if (base.startsWith(\"#\")) {\n logVerbose(chalkStderr.yellow(`Skipping likely emacs tempfile ${fpath}`));\n } else if (base === \"schema.ts\" || base === \"schema.js\") {\n logVerbose(chalkStderr.yellow(`Skipping ${fpath}`));\n } else if ((base.match(/\\./g) || []).length > 1) {\n // `auth.config.ts` and `convex.config.ts` are important not to bundle.\n // `*.test.ts` `*.spec.ts` are common in developer code.\n logVerbose(\n chalkStderr.yellow(`Skipping ${fpath} that contains multiple dots`),\n );\n } else if (relPath.includes(\" \")) {\n logVerbose(\n chalkStderr.yellow(`Skipping ${relPath} because it contains a space`),\n );\n } else {\n logVerbose(chalkStderr.green(`Preparing ${fpath}`));\n entryPoints.push(fpath);\n }\n }\n\n // If using TypeScript, require that at least one line starts with `export` or `import`,\n // a TypeScript requirement. This prevents confusing type errors from empty .ts files.\n const nonEmptyEntryPoints = entryPoints.filter((fpath) => {\n // This check only makes sense for TypeScript files\n if (!fpath.endsWith(\".ts\") && !fpath.endsWith(\".tsx\")) {\n return true;\n }\n const contents = ctx.fs.readUtf8File(fpath);\n if (/^\\s{0,100}(import|export)/m.test(contents)) {\n return true;\n }\n logVerbose(\n chalkStderr.yellow(\n `Skipping ${fpath} because it has no export or import to make it a valid TypeScript module`,\n ),\n );\n });\n\n return nonEmptyEntryPoints;\n}\n\n// A fallback regex in case we fail to parse the AST.\nexport const useNodeDirectiveRegex = /^\\s*(\"|')use node(\"|');?\\s*$/;\n\nfunction hasUseNodeDirective(ctx: Context, fpath: string): boolean {\n // Do a quick check for the exact string. If it doesn't exist, don't\n // bother parsing.\n const source = ctx.fs.readUtf8File(fpath);\n if (source.indexOf(\"use node\") === -1) {\n return false;\n }\n\n // We parse the AST here to extract the \"use node\" declaration. This is more\n // robust than doing a regex. We only use regex as a fallback.\n try {\n const ast = parseAST(source, {\n // parse in strict mode and allow module declarations\n sourceType: \"module\",\n\n // esbuild supports jsx and typescript by default. Allow the same plugins\n // here too.\n plugins: [\"jsx\", \"typescript\"],\n });\n return ast.program.directives\n .map((d) => d.value.value)\n .includes(\"use node\");\n } catch (error: any) {\n // Given that we have failed to parse, we are most likely going to fail in\n // the esbuild step, which seem to return better formatted error messages.\n // We don't throw here and fallback to regex.\n let lineMatches = false;\n for (const line of source.split(\"\\n\")) {\n if (line.match(useNodeDirectiveRegex)) {\n lineMatches = true;\n break;\n }\n }\n\n // Log that we failed to parse in verbose node if we need this for debugging.\n logVerbose(\n `Failed to parse ${fpath}. Use node is set to ${lineMatches} based on regex. Parse error: ${error.toString()}.`,\n );\n\n return lineMatches;\n }\n}\n\nexport function mustBeIsolate(relPath: string): boolean {\n // Check if the path without extension matches any of the static paths.\n return [\"http\", \"crons\", \"schema\", \"auth.config\"].includes(\n relPath.replace(/\\.[^/.]+$/, \"\"),\n );\n}\n\nasync function determineEnvironment(\n ctx: Context,\n dir: string,\n fpath: string,\n): Promise<ModuleEnvironment> {\n const relPath = path.relative(dir, fpath);\n\n const useNodeDirectiveFound = hasUseNodeDirective(ctx, fpath);\n if (useNodeDirectiveFound) {\n if (mustBeIsolate(relPath)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `\"use node\" directive is not allowed for ${relPath}.`,\n });\n }\n return \"node\";\n }\n\n const actionsPrefix = actionsDir + path.sep;\n if (relPath.startsWith(actionsPrefix)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `${relPath} is in /actions subfolder but has no \"use node\"; directive. You can now define actions in any folder and indicate they should run in node by adding \"use node\" directive. /actions is a deprecated way to choose Node.js environment, and we require \"use node\" for all files within that folder to avoid unexpected errors during the migration. See https://docs.convex.dev/functions/actions for more details`,\n });\n }\n\n return \"isolate\";\n}\n\nexport async function entryPointsByEnvironment(ctx: Context, dir: string) {\n const isolate = [];\n const node = [];\n for (const entryPoint of await entryPoints(ctx, dir)) {\n const environment = await determineEnvironment(ctx, dir, entryPoint);\n if (environment === \"node\") {\n node.push(entryPoint);\n } else {\n isolate.push(entryPoint);\n }\n }\n\n return { isolate, node };\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,mBAA4B;AAE5B,oBAAkC;AAElC,aAAwB;AACxB,gBAA+C;AAE/C,iBAAuC;AACvC,kBAA2B;AAC3B,sBAKO;AACP,yBAAkD;AAClD,IAAAA,aAAoC;AAG7B,MAAM,aAAa;AAKnB,UAAU,QACf,IACA,SACA,eACA,OACwE;AACxE,UAAQ,SAAS;AACjB,aAAW,YAAY,GAAG,QAAQ,OAAO,EAAE,KAAK,4BAAkB,GAAG;AACnE,UAAM,YAAY,YAAAC,QAAK,KAAK,SAAS,SAAS,IAAI;AAClD,QAAI,SAAS,YAAY,GAAG;AAC1B,UAAI,iBAAiB,cAAc,SAAS,GAAG;AAC7C;AAAA,MACF;AACA,YAAM,EAAE,OAAO,MAAM,MAAM,WAAW,MAAM;AAC5C,aAAO,QAAQ,IAAI,WAAW,eAAe,QAAQ,CAAC;AAAA,IACxD,WAAW,SAAS,OAAO,GAAG;AAC5B,YAAM,EAAE,OAAO,OAAO,MAAM,WAAW,MAAM;AAAA,IAC/C;AAAA,EACF;AACF;AA0BA,eAAe,UAAU;AAAA,EACvB;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAW2B;AACzB,QAAM,eAAW,sCAAqB,KAAK,gBAAgB;AAC3D,MAAI;AACF,UAAM,SAAS,UAAM,iCAAa;AAAA,MAChC,aAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,
|
|
4
|
+
"sourcesContent": ["import path from \"path\";\nimport { chalkStderr } from \"chalk\";\nimport esbuild from \"esbuild\";\nimport { parse as parseAST } from \"@babel/parser\";\nimport { Identifier, ImportSpecifier } from \"@babel/types\";\nimport * as Sentry from \"@sentry/node\";\nimport { Filesystem, consistentPathSort } from \"./fs.js\";\nimport { Context } from \"./context.js\";\nimport { logVerbose, logWarning } from \"./log.js\";\nimport { wasmPlugin } from \"./wasm.js\";\nimport { serverOnlyPlugin } from \"./serverOnly.js\";\nimport {\n ExternalPackage,\n computeExternalPackages,\n createExternalPlugin,\n findExactVersionAndDependencies,\n} from \"./external.js\";\nimport { innerEsbuild, isEsbuildBuildError } from \"./debugBundle.js\";\nexport { nodeFs, RecordingFs } from \"./fs.js\";\nexport type { Filesystem } from \"./fs.js\";\n\nexport const actionsDir = \"actions\";\n\n// Returns a generator of { isDir, path, depth } for all paths\n// within dirPath in some topological order (not including\n// dirPath itself).\nexport function* walkDir(\n fs: Filesystem,\n dirPath: string,\n shouldSkipDir?: (dirPath: string) => boolean,\n depth?: number,\n): Generator<{ isDir: boolean; path: string; depth: number }, void, void> {\n depth = depth ?? 0;\n for (const dirEntry of fs.listDir(dirPath).sort(consistentPathSort)) {\n const childPath = path.join(dirPath, dirEntry.name);\n if (dirEntry.isDirectory()) {\n if (shouldSkipDir && shouldSkipDir(childPath)) {\n continue;\n }\n yield { isDir: true, path: childPath, depth };\n yield* walkDir(fs, childPath, shouldSkipDir, depth + 1);\n } else if (dirEntry.isFile()) {\n yield { isDir: false, path: childPath, depth };\n }\n }\n}\n\n// Convex specific module environment.\ntype ModuleEnvironment = \"node\" | \"isolate\";\n\nexport interface Bundle {\n path: string;\n source: string;\n sourceMap?: string | undefined;\n environment: ModuleEnvironment;\n}\n\nexport interface BundleHash {\n path: string;\n hash: string;\n environment: ModuleEnvironment;\n}\n\ntype EsBuildResult = esbuild.BuildResult & {\n outputFiles: esbuild.OutputFile[];\n // Set of referenced external modules.\n externalModuleNames: Set<string>;\n // Set of bundled modules.\n bundledModuleNames: Set<string>;\n};\n\nasync function doEsbuild({\n ctx,\n dir,\n entryPoints,\n generateSourceMaps,\n platform,\n chunksFolder,\n externalPackages,\n extraConditions,\n includeSourcesContent,\n splitting,\n}: {\n ctx: Context;\n dir: string;\n entryPoints: string[];\n generateSourceMaps: boolean;\n platform: esbuild.Platform;\n chunksFolder: string;\n externalPackages: Map<string, ExternalPackage>;\n extraConditions: string[];\n includeSourcesContent: boolean;\n splitting?: boolean | undefined;\n}): Promise<EsBuildResult> {\n const external = createExternalPlugin(ctx, externalPackages);\n try {\n const result = await innerEsbuild({\n entryPoints,\n platform,\n generateSourceMaps,\n chunksFolder,\n extraConditions,\n dir,\n // serverOnlyPlugin runs first so `server-only` is always stubbed,\n // even if it appears in the external packages list.\n // wasmPlugin runs last so it doesn't run on external modules.\n plugins: [serverOnlyPlugin, external.plugin, wasmPlugin],\n includeSourcesContent,\n splitting,\n });\n\n for (const [relPath, input] of Object.entries(result.metafile!.inputs)) {\n // TODO: esbuild outputs paths prefixed with \"(disabled)\"\" when bundling our internal\n // udf-runtime package. The files do actually exist locally, though.\n if (\n relPath.indexOf(\"(disabled):\") !== -1 ||\n relPath.startsWith(\"wasm-binary:\") ||\n relPath.startsWith(\"wasm-stub:\") ||\n relPath.startsWith(\"server-only-stub:\")\n ) {\n continue;\n }\n const absPath = path.resolve(relPath);\n const st = ctx.fs.stat(absPath);\n if (st.size !== input.bytes) {\n logWarning(\n `Bundled file ${absPath} changed right after esbuild invocation`,\n );\n // Consider this a transient error so we'll try again and hopefully\n // no files change right after esbuild next time.\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n printedMessage: null,\n });\n }\n ctx.fs.registerPath(absPath, st);\n }\n return {\n ...result,\n externalModuleNames: external.externalModuleNames,\n bundledModuleNames: external.bundledModuleNames,\n };\n } catch (e: unknown) {\n // esbuild sometimes throws a build error instead of returning a result\n // containing an array of errors. Syntax errors are one of these cases.\n let recommendUseNode = false;\n if (isEsbuildBuildError(e)) {\n for (const error of e.errors) {\n if (error.location) {\n const absPath = path.resolve(error.location.file);\n const st = ctx.fs.stat(absPath);\n ctx.fs.registerPath(absPath, st);\n }\n if (\n platform !== \"node\" &&\n !recommendUseNode &&\n error.notes.some((note) =>\n note.text.includes(\"Are you trying to bundle for node?\"),\n )\n ) {\n recommendUseNode = true;\n }\n }\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n // We don't print any error because esbuild already printed\n // all the relevant information.\n printedMessage: recommendUseNode\n ? `\\nIt looks like you are using Node APIs from a file without the \"use node\" directive.\\n` +\n `Split out actions using Node.js APIs like this into a new file only containing actions that uses \"use node\" ` +\n `so these actions will run in a Node.js environment.\\n` +\n `For more information see https://docs.convex.dev/functions/runtimes#nodejs-runtime\\n`\n : null,\n });\n }\n}\n\nexport async function bundle({\n ctx,\n dir,\n entryPoints,\n generateSourceMaps,\n platform,\n chunksFolder = \"_deps\",\n externalPackagesAllowList = [],\n extraConditions = [],\n includeSourcesContent = false,\n splitting,\n}: {\n ctx: Context;\n dir: string;\n entryPoints: string[];\n generateSourceMaps: boolean;\n platform: esbuild.Platform;\n chunksFolder?: string;\n externalPackagesAllowList?: string[];\n extraConditions?: string[];\n includeSourcesContent?: boolean;\n splitting?: boolean;\n}): Promise<{\n modules: Bundle[];\n externalDependencies: Map<string, string>;\n bundledModuleNames: Set<string>;\n}> {\n const availableExternalPackages = await computeExternalPackages(\n ctx,\n externalPackagesAllowList,\n );\n const result = await doEsbuild({\n ctx,\n dir,\n entryPoints,\n generateSourceMaps,\n platform,\n chunksFolder,\n externalPackages: availableExternalPackages,\n extraConditions,\n includeSourcesContent,\n splitting,\n });\n // Some ESBuild errors won't show up here, instead crashing in doEsbuild().\n if (result.errors.length) {\n const errorMessage = result.errors\n .map((e) => `esbuild error: ${e.text}`)\n .join(\"\\n\");\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: errorMessage,\n });\n }\n for (const warning of result.warnings) {\n logWarning(chalkStderr.yellow(`esbuild warning: ${warning.text}`));\n }\n const sourceMaps = new Map();\n const modules: Bundle[] = [];\n const environment = platform === \"node\" ? \"node\" : \"isolate\";\n for (const outputFile of result.outputFiles) {\n const relPath = path.relative(path.normalize(\"out\"), outputFile.path);\n if (path.extname(relPath) === \".map\") {\n sourceMaps.set(relPath, outputFile.text);\n continue;\n }\n const posixRelPath = relPath.split(path.sep).join(path.posix.sep);\n modules.push({ path: posixRelPath, source: outputFile.text, environment });\n }\n for (const module of modules) {\n const sourceMapPath = module.path + \".map\";\n const sourceMap = sourceMaps.get(sourceMapPath);\n if (sourceMap) {\n module.sourceMap = sourceMap;\n }\n }\n\n return {\n modules,\n externalDependencies: await externalPackageVersions(\n ctx,\n availableExternalPackages,\n result.externalModuleNames,\n ),\n bundledModuleNames: result.bundledModuleNames,\n };\n}\n\n// We could return the full list of availableExternalPackages, but this would be\n// installing more packages that we need. Instead, we collect all external\n// dependencies we found during bundling the /convex function, as well as their\n// respective peer and optional dependencies.\nasync function externalPackageVersions(\n ctx: Context,\n availableExternalPackages: Map<string, ExternalPackage>,\n referencedPackages: Set<string>,\n): Promise<Map<string, string>> {\n const versions = new Map<string, string>();\n const referencedPackagesQueue = Array.from(referencedPackages.keys());\n\n for (let i = 0; i < referencedPackagesQueue.length; i++) {\n const moduleName = referencedPackagesQueue[i];\n // This assertion is safe because referencedPackages can only contain\n // packages in availableExternalPackages.\n const modulePath = availableExternalPackages.get(moduleName)!.path;\n // Since we don't support lock files and different install commands yet, we\n // pick up the exact version installed on the local filesystem.\n const { version, peerAndOptionalDependencies } =\n await findExactVersionAndDependencies(ctx, moduleName, modulePath);\n versions.set(moduleName, version);\n\n for (const dependency of peerAndOptionalDependencies) {\n if (\n availableExternalPackages.has(dependency) &&\n !referencedPackages.has(dependency)\n ) {\n referencedPackagesQueue.push(dependency);\n referencedPackages.add(dependency);\n }\n }\n }\n\n return versions;\n}\n\nexport async function bundleSchema(\n ctx: Context,\n dir: string,\n extraConditions: string[],\n) {\n let target = path.resolve(dir, \"schema.ts\");\n if (!ctx.fs.exists(target)) {\n target = path.resolve(dir, \"schema.js\");\n }\n const result = await bundle({\n ctx,\n dir,\n entryPoints: [target],\n generateSourceMaps: true,\n platform: \"browser\",\n extraConditions,\n });\n return result.modules;\n}\n\nexport async function bundleAuthConfig(ctx: Context, dir: string) {\n const authConfigPath = path.resolve(dir, \"auth.config.js\");\n const authConfigTsPath = path.resolve(dir, \"auth.config.ts\");\n if (ctx.fs.exists(authConfigPath) && ctx.fs.exists(authConfigTsPath)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Found both ${authConfigPath} and ${authConfigTsPath}, choose one.`,\n });\n }\n const chosenPath = ctx.fs.exists(authConfigTsPath)\n ? authConfigTsPath\n : authConfigPath;\n if (!ctx.fs.exists(chosenPath)) {\n logVerbose(\n chalkStderr.yellow(\n `Found no auth config file at ${authConfigTsPath} or ${authConfigPath} so there are no configured auth providers`,\n ),\n );\n return [];\n }\n logVerbose(chalkStderr.yellow(`Bundling auth config found at ${chosenPath}`));\n const result = await bundle({\n ctx,\n dir,\n entryPoints: [chosenPath],\n generateSourceMaps: true,\n platform: \"browser\",\n // The auth config must be one module\n splitting: false,\n });\n return result.modules;\n}\n\nexport async function doesImportConvexHttpRouter(source: string) {\n try {\n const ast = parseAST(source, {\n sourceType: \"module\",\n plugins: [\"typescript\"],\n });\n return ast.program.body.some((node) => {\n if (node.type !== \"ImportDeclaration\") return false;\n return node.specifiers.some((s) => {\n const specifier = s as ImportSpecifier;\n const imported = specifier.imported as Identifier;\n return imported.name === \"httpRouter\";\n });\n });\n } catch {\n return (\n source.match(\n /import\\s*\\{\\s*httpRouter.*\\}\\s*from\\s*\"\\s*convex\\/server\\s*\"/,\n ) !== null\n );\n }\n}\n\nconst ENTRY_POINT_EXTENSIONS = [\n // ESBuild js loader\n \".js\",\n \".mjs\",\n \".cjs\",\n // ESBuild ts loader\n \".ts\",\n \".tsx\",\n \".mts\",\n \".cts\",\n // ESBuild jsx loader\n \".jsx\",\n // ESBuild supports css, text, json, and more but these file types are not\n // allowed to define entry points.\n];\n\nexport async function entryPoints(\n ctx: Context,\n dir: string,\n): Promise<string[]> {\n const entryPoints = [];\n\n // Don't deploy directories in convex/ that define components\n // as this leads to double-deploying.\n const looksLikeNestedComponent = (dirPath: string): boolean => {\n const config = path.join(dirPath, \"convex.config.ts\");\n const isComponentDefinition = ctx.fs.exists(config);\n if (isComponentDefinition) {\n logVerbose(chalkStderr.yellow(`Skipping component directory ${dirPath}`));\n }\n return isComponentDefinition;\n };\n\n for (const { isDir, path: fpath, depth } of walkDir(\n ctx.fs,\n dir,\n looksLikeNestedComponent,\n )) {\n if (isDir) {\n continue;\n }\n const relPath = path.relative(dir, fpath);\n const parsedPath = path.parse(fpath);\n const base = parsedPath.base;\n const extension = parsedPath.ext.toLowerCase();\n\n if (relPath.startsWith(\"_deps\" + path.sep)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `The path \"${fpath}\" is within the \"_deps\" directory, which is reserved for dependencies. Please move your code to another directory.`,\n });\n }\n\n if (depth === 0 && base.toLowerCase().startsWith(\"https.\")) {\n const source = ctx.fs.readUtf8File(fpath);\n if (await doesImportConvexHttpRouter(source))\n logWarning(\n chalkStderr.yellow(\n `Found ${fpath}. HTTP action routes will not be imported from this file. Did you mean to include http${extension}?`,\n ),\n );\n Sentry.captureMessage(\n `User code top level directory contains file ${base} which imports httpRouter.`,\n \"warning\",\n );\n }\n\n // This should match isEntryPoint in the convex eslint plugin.\n if (!ENTRY_POINT_EXTENSIONS.some((ext) => relPath.endsWith(ext))) {\n logVerbose(chalkStderr.yellow(`Skipping non-JS file ${fpath}`));\n } else if (relPath.startsWith(\"_generated\" + path.sep)) {\n logVerbose(chalkStderr.yellow(`Skipping ${fpath}`));\n } else if (base.startsWith(\".\")) {\n logVerbose(chalkStderr.yellow(`Skipping dotfile ${fpath}`));\n } else if (base.startsWith(\"#\")) {\n logVerbose(chalkStderr.yellow(`Skipping likely emacs tempfile ${fpath}`));\n } else if (base === \"schema.ts\" || base === \"schema.js\") {\n logVerbose(chalkStderr.yellow(`Skipping ${fpath}`));\n } else if ((base.match(/\\./g) || []).length > 1) {\n // `auth.config.ts` and `convex.config.ts` are important not to bundle.\n // `*.test.ts` `*.spec.ts` are common in developer code.\n logVerbose(\n chalkStderr.yellow(`Skipping ${fpath} that contains multiple dots`),\n );\n } else if (relPath.includes(\" \")) {\n logVerbose(\n chalkStderr.yellow(`Skipping ${relPath} because it contains a space`),\n );\n } else {\n logVerbose(chalkStderr.green(`Preparing ${fpath}`));\n entryPoints.push(fpath);\n }\n }\n\n // If using TypeScript, require that at least one line starts with `export` or `import`,\n // a TypeScript requirement. This prevents confusing type errors from empty .ts files.\n const nonEmptyEntryPoints = entryPoints.filter((fpath) => {\n // This check only makes sense for TypeScript files\n if (!fpath.endsWith(\".ts\") && !fpath.endsWith(\".tsx\")) {\n return true;\n }\n const contents = ctx.fs.readUtf8File(fpath);\n if (/^\\s{0,100}(import|export)/m.test(contents)) {\n return true;\n }\n logVerbose(\n chalkStderr.yellow(\n `Skipping ${fpath} because it has no export or import to make it a valid TypeScript module`,\n ),\n );\n });\n\n return nonEmptyEntryPoints;\n}\n\n// A fallback regex in case we fail to parse the AST.\nexport const useNodeDirectiveRegex = /^\\s*(\"|')use node(\"|');?\\s*$/;\n\nfunction hasUseNodeDirective(ctx: Context, fpath: string): boolean {\n // Do a quick check for the exact string. If it doesn't exist, don't\n // bother parsing.\n const source = ctx.fs.readUtf8File(fpath);\n if (source.indexOf(\"use node\") === -1) {\n return false;\n }\n\n // We parse the AST here to extract the \"use node\" declaration. This is more\n // robust than doing a regex. We only use regex as a fallback.\n try {\n const ast = parseAST(source, {\n // parse in strict mode and allow module declarations\n sourceType: \"module\",\n\n // esbuild supports jsx and typescript by default. Allow the same plugins\n // here too.\n plugins: [\"jsx\", \"typescript\"],\n });\n return ast.program.directives\n .map((d) => d.value.value)\n .includes(\"use node\");\n } catch (error: any) {\n // Given that we have failed to parse, we are most likely going to fail in\n // the esbuild step, which seem to return better formatted error messages.\n // We don't throw here and fallback to regex.\n let lineMatches = false;\n for (const line of source.split(\"\\n\")) {\n if (line.match(useNodeDirectiveRegex)) {\n lineMatches = true;\n break;\n }\n }\n\n // Log that we failed to parse in verbose node if we need this for debugging.\n logVerbose(\n `Failed to parse ${fpath}. Use node is set to ${lineMatches} based on regex. Parse error: ${error.toString()}.`,\n );\n\n return lineMatches;\n }\n}\n\nexport function mustBeIsolate(relPath: string): boolean {\n // Check if the path without extension matches any of the static paths.\n return [\"http\", \"crons\", \"schema\", \"auth.config\"].includes(\n relPath.replace(/\\.[^/.]+$/, \"\"),\n );\n}\n\nasync function determineEnvironment(\n ctx: Context,\n dir: string,\n fpath: string,\n): Promise<ModuleEnvironment> {\n const relPath = path.relative(dir, fpath);\n\n const useNodeDirectiveFound = hasUseNodeDirective(ctx, fpath);\n if (useNodeDirectiveFound) {\n if (mustBeIsolate(relPath)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `\"use node\" directive is not allowed for ${relPath}.`,\n });\n }\n return \"node\";\n }\n\n const actionsPrefix = actionsDir + path.sep;\n if (relPath.startsWith(actionsPrefix)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `${relPath} is in /actions subfolder but has no \"use node\"; directive. You can now define actions in any folder and indicate they should run in node by adding \"use node\" directive. /actions is a deprecated way to choose Node.js environment, and we require \"use node\" for all files within that folder to avoid unexpected errors during the migration. See https://docs.convex.dev/functions/actions for more details`,\n });\n }\n\n return \"isolate\";\n}\n\nexport async function entryPointsByEnvironment(ctx: Context, dir: string) {\n const isolate = [];\n const node = [];\n for (const entryPoint of await entryPoints(ctx, dir)) {\n const environment = await determineEnvironment(ctx, dir, entryPoint);\n if (environment === \"node\") {\n node.push(entryPoint);\n } else {\n isolate.push(entryPoint);\n }\n }\n\n return { isolate, node };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_fs", "path", "entryPoints", "module", "parseAST"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var serverOnly_exports = {};
|
|
20
|
+
__export(serverOnly_exports, {
|
|
21
|
+
serverOnlyPlugin: () => serverOnlyPlugin
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(serverOnly_exports);
|
|
24
|
+
const serverOnlyPlugin = {
|
|
25
|
+
name: "convex-server-only",
|
|
26
|
+
setup(build) {
|
|
27
|
+
build.onResolve({ filter: /^server-only$/ }, (args) => ({
|
|
28
|
+
path: args.path,
|
|
29
|
+
namespace: "server-only-stub"
|
|
30
|
+
}));
|
|
31
|
+
build.onLoad({ filter: /.*/, namespace: "server-only-stub" }, () => ({
|
|
32
|
+
contents: "",
|
|
33
|
+
loader: "js"
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=serverOnly.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/bundler/serverOnly.ts"],
|
|
4
|
+
"sourcesContent": ["import { Plugin } from \"esbuild\";\n\n// Stub `import \"server-only\"` to an empty module so user code that uses\n// Next.js's server-only can be bundled and analyzed correctly:\n// https://nextjs.org/docs/app/getting-started/server-and-client-components#preventing-environment-poisoning\nexport const serverOnlyPlugin: Plugin = {\n name: \"convex-server-only\",\n setup(build) {\n build.onResolve({ filter: /^server-only$/ }, (args) => ({\n path: args.path,\n namespace: \"server-only-stub\",\n }));\n build.onLoad({ filter: /.*/, namespace: \"server-only-stub\" }, () => ({\n contents: \"\",\n loader: \"js\",\n }));\n },\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,MAAM,mBAA2B;AAAA,EACtC,MAAM;AAAA,EACN,MAAM,OAAO;AACX,UAAM,UAAU,EAAE,QAAQ,gBAAgB,GAAG,CAAC,UAAU;AAAA,MACtD,MAAM,KAAK;AAAA,MACX,WAAW;AAAA,IACb,EAAE;AACF,UAAM,OAAO,EAAE,QAAQ,MAAM,WAAW,mBAAmB,GAAG,OAAO;AAAA,MACnE,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,EAAE;AAAA,EACJ;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -47,7 +47,6 @@ var import_dashboard = require("./lib/dashboard.js");
|
|
|
47
47
|
var import_codegen = require("./lib/codegen.js");
|
|
48
48
|
var import_localDeployment = require("./lib/localDeployment/localDeployment.js");
|
|
49
49
|
var import_prompts = require("./lib/utils/prompts.js");
|
|
50
|
-
var import_globalConfig = require("./lib/utils/globalConfig.js");
|
|
51
50
|
var import_aiFiles = require("./lib/aiFiles/index.js");
|
|
52
51
|
var import_deploymentSelection = require("./lib/deploymentSelection.js");
|
|
53
52
|
var import_login = require("./lib/login.js");
|
|
@@ -91,15 +90,6 @@ async function deploymentCredentialsOrConfigure(ctx, deploymentSelection, chosen
|
|
|
91
90
|
};
|
|
92
91
|
}
|
|
93
92
|
async function _deploymentCredentialsOrConfigure(ctx, deploymentSelection, chosenConfiguration, cmdOptions) {
|
|
94
|
-
const config = (0, import_globalConfig.readGlobalConfig)(ctx);
|
|
95
|
-
const globallyForceCloud = !!config?.optOutOfLocalDevDeploymentsUntilBetaOver;
|
|
96
|
-
if (globallyForceCloud && cmdOptions.local) {
|
|
97
|
-
return await ctx.crash({
|
|
98
|
-
exitCode: 1,
|
|
99
|
-
errorType: "fatal",
|
|
100
|
-
printedMessage: "Can't specify --local when local deployments are disabled on this machine. Run `npx convex disable-local-deployments --undo-global` to allow use of --local."
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
93
|
switch (deploymentSelection.kind) {
|
|
104
94
|
case "existingDeployment":
|
|
105
95
|
return {
|
|
@@ -118,9 +108,6 @@ async function _deploymentCredentialsOrConfigure(ctx, deploymentSelection, chose
|
|
|
118
108
|
ctx,
|
|
119
109
|
chosenConfiguration,
|
|
120
110
|
deploymentSelection.selectionWithinProject,
|
|
121
|
-
{
|
|
122
|
-
globallyForceCloud
|
|
123
|
-
},
|
|
124
111
|
cmdOptions
|
|
125
112
|
);
|
|
126
113
|
}
|
|
@@ -134,8 +121,7 @@ async function _deploymentCredentialsOrConfigure(ctx, deploymentSelection, chose
|
|
|
134
121
|
return await handleDeploymentWithinProject(ctx, {
|
|
135
122
|
chosenConfiguration,
|
|
136
123
|
deploymentSelection,
|
|
137
|
-
cmdOptions
|
|
138
|
-
globallyForceCloud
|
|
124
|
+
cmdOptions
|
|
139
125
|
});
|
|
140
126
|
}
|
|
141
127
|
case "anonymous": {
|
|
@@ -150,9 +136,6 @@ async function _deploymentCredentialsOrConfigure(ctx, deploymentSelection, chose
|
|
|
150
136
|
ctx,
|
|
151
137
|
chosenConfiguration,
|
|
152
138
|
deploymentSelection.selectionWithinProject,
|
|
153
|
-
{
|
|
154
|
-
globallyForceCloud
|
|
155
|
-
},
|
|
156
139
|
cmdOptions
|
|
157
140
|
);
|
|
158
141
|
}
|
|
@@ -197,9 +180,6 @@ async function _deploymentCredentialsOrConfigure(ctx, deploymentSelection, chose
|
|
|
197
180
|
ctx,
|
|
198
181
|
chosenConfiguration,
|
|
199
182
|
deploymentSelection.selectionWithinProject,
|
|
200
|
-
{
|
|
201
|
-
globallyForceCloud
|
|
202
|
-
},
|
|
203
183
|
cmdOptions
|
|
204
184
|
);
|
|
205
185
|
}
|
|
@@ -208,8 +188,7 @@ async function _deploymentCredentialsOrConfigure(ctx, deploymentSelection, chose
|
|
|
208
188
|
async function handleDeploymentWithinProject(ctx, {
|
|
209
189
|
chosenConfiguration,
|
|
210
190
|
deploymentSelection,
|
|
211
|
-
cmdOptions
|
|
212
|
-
globallyForceCloud
|
|
191
|
+
cmdOptions
|
|
213
192
|
}) {
|
|
214
193
|
const hasAuth = ctx.bigBrainAuth() !== null;
|
|
215
194
|
const loginMessage = hasAuth && (0, import_deploymentSelection.shouldAllowAnonymousDevelopment)() ? void 0 : `Tip: You can try out Convex without creating an account by clearing the ${import_utils.CONVEX_DEPLOYMENT_ENV_VAR_NAME} environment variable (often in .env.local).`;
|
|
@@ -225,9 +204,6 @@ async function handleDeploymentWithinProject(ctx, {
|
|
|
225
204
|
ctx,
|
|
226
205
|
chosenConfiguration,
|
|
227
206
|
deploymentSelection.selectionWithinProject,
|
|
228
|
-
{
|
|
229
|
-
globallyForceCloud
|
|
230
|
-
},
|
|
231
207
|
cmdOptions
|
|
232
208
|
);
|
|
233
209
|
return result;
|
|
@@ -242,9 +218,6 @@ async function handleDeploymentWithinProject(ctx, {
|
|
|
242
218
|
ctx,
|
|
243
219
|
chosenConfiguration,
|
|
244
220
|
deploymentSelection.selectionWithinProject,
|
|
245
|
-
{
|
|
246
|
-
globallyForceCloud
|
|
247
|
-
},
|
|
248
221
|
cmdOptions
|
|
249
222
|
);
|
|
250
223
|
return result;
|
|
@@ -275,7 +248,7 @@ async function handleDeploymentWithinProject(ctx, {
|
|
|
275
248
|
deploymentFields: selectedDeployment.deploymentFields
|
|
276
249
|
};
|
|
277
250
|
}
|
|
278
|
-
async function handleChooseProject(ctx, chosenConfiguration, selectionWithinProject,
|
|
251
|
+
async function handleChooseProject(ctx, chosenConfiguration, selectionWithinProject, cmdOptions) {
|
|
279
252
|
await (0, import_login.ensureLoggedIn)(ctx, {
|
|
280
253
|
overrideAuthUrl: cmdOptions.overrideAuthUrl,
|
|
281
254
|
overrideAuthClient: cmdOptions.overrideAuthClient,
|
|
@@ -286,8 +259,8 @@ async function handleChooseProject(ctx, chosenConfiguration, selectionWithinProj
|
|
|
286
259
|
team: cmdOptions.team,
|
|
287
260
|
project: cmdOptions.project,
|
|
288
261
|
devDeployment: cmdOptions.devDeployment,
|
|
289
|
-
local:
|
|
290
|
-
cloud:
|
|
262
|
+
local: cmdOptions.local,
|
|
263
|
+
cloud: cmdOptions.cloud
|
|
291
264
|
});
|
|
292
265
|
const deploymentOptions = selectionWithinProject.kind === "prod" ? { kind: "prod" } : project.devDeployment === "local" ? { kind: "local", ...cmdOptions.localOptions } : { kind: "dev" };
|
|
293
266
|
const {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/configure.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n} from \"../bundler/log.js\";\nimport {\n DeploymentType,\n DeploymentName,\n fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows,\n createProject,\n loadSelectedDeploymentCredentials,\n checkAccessToSelectedProject,\n DeploymentSelectionWithinProject,\n} from \"./lib/api.js\";\nimport { readProjectConfig, ensureConvexFunctionsDir } from \"./lib/config.js\";\nimport {\n DeploymentDetails,\n eraseDeploymentEnvVar,\n writeDeploymentEnvVar,\n} from \"./lib/deployment.js\";\nimport { finalizeConfiguration } from \"./lib/init.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n functionsDir,\n hasProjects,\n logAndHandleFetchError,\n selectDevDeploymentType,\n selectRegionOrUseDefault,\n validateOrSelectProject,\n validateOrSelectTeam,\n} from \"./lib/utils/utils.js\";\nimport { writeUrlsToEnvFile } from \"./lib/envvars.js\";\nimport path from \"path\";\nimport { projectDashboardUrl } from \"./lib/dashboard.js\";\nimport { doInitConvexFolder } from \"./lib/codegen.js\";\nimport { handleLocalDeployment } from \"./lib/localDeployment/localDeployment.js\";\nimport {\n promptOptions,\n promptString,\n promptYesNo,\n} from \"./lib/utils/prompts.js\";\nimport { readGlobalConfig } from \"./lib/utils/globalConfig.js\";\nimport { attemptSetupAiFiles } from \"./lib/aiFiles/index.js\";\nimport {\n DeploymentSelection,\n deploymentNameFromSelection,\n shouldAllowAnonymousDevelopment,\n} from \"./lib/deploymentSelection.js\";\nimport { ensureLoggedIn } from \"./lib/login.js\";\nimport { handleAnonymousDeployment } from \"./lib/localDeployment/anonymous.js\";\nimport { fetchDeploymentCanonicalUrls } from \"./lib/deploy2.js\";\ntype DeploymentCredentials = {\n url: string;\n adminKey: string;\n};\n\ntype ChosenConfiguration =\n // `--configure new`\n | \"new\"\n // `--configure existing`\n | \"existing\"\n // `--configure`\n | \"ask\"\n // `--configure` was not specified\n | null;\n\ntype ConfigureCmdOptions = {\n prod: boolean;\n localOptions: {\n ports?: {\n cloud: number;\n site: number;\n };\n backendVersion?: string | undefined;\n dashboardVersion?: string | undefined;\n forceUpgrade: boolean;\n };\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n local?: boolean | undefined;\n cloud?: boolean | undefined;\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n overrideAuthUrl?: string | undefined;\n overrideAuthClient?: string | undefined;\n overrideAuthUsername?: string | undefined;\n overrideAuthPassword?: string | undefined;\n};\n\n/**\n * As of writing, this is used by:\n * - `npx convex dev`\n * - `npx convex codegen`\n *\n * But is not used by `npx convex deploy` or other commands.\n */\nexport async function deploymentCredentialsOrConfigure(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n siteUrl: string | null;\n } | null;\n }\n> {\n const selectedDeployment = await _deploymentCredentialsOrConfigure(\n ctx,\n deploymentSelection,\n chosenConfiguration,\n cmdOptions,\n );\n const { convexSiteUrl: siteUrl } = await fetchDeploymentCanonicalUrls(ctx, {\n adminKey: selectedDeployment.adminKey,\n deploymentUrl: selectedDeployment.url,\n });\n\n if (selectedDeployment.deploymentFields !== null) {\n // Set the `CONVEX_DEPLOYMENT` env var + the `CONVEX_URL` env var\n await updateEnvAndConfigForDeploymentSelection(\n ctx,\n {\n url: selectedDeployment.url,\n siteUrl,\n deploymentName: selectedDeployment.deploymentFields.deploymentName,\n teamSlug: selectedDeployment.deploymentFields.teamSlug,\n projectSlug: selectedDeployment.deploymentFields.projectSlug,\n deploymentType: selectedDeployment.deploymentFields.deploymentType,\n },\n deploymentNameFromSelection(deploymentSelection),\n );\n } else {\n // Clear the `CONVEX_DEPLOYMENT` env var + set the `CONVEX_URL` and\n // `CONVEX_SITE_URL` env vars.\n await handleManuallySetUrlAndAdminKey(ctx, {\n url: selectedDeployment.url,\n siteUrl,\n adminKey: selectedDeployment.adminKey,\n });\n }\n return {\n url: selectedDeployment.url,\n adminKey: selectedDeployment.adminKey,\n deploymentFields:\n selectedDeployment.deploymentFields === null\n ? null\n : { ...selectedDeployment.deploymentFields, siteUrl: siteUrl },\n };\n}\n\nexport async function _deploymentCredentialsOrConfigure(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n } | null;\n }\n> {\n const config = readGlobalConfig(ctx);\n const globallyForceCloud = !!config?.optOutOfLocalDevDeploymentsUntilBetaOver;\n if (globallyForceCloud && cmdOptions.local) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Can't specify --local when local deployments are disabled on this machine. Run `npx convex disable-local-deployments --undo-global` to allow use of --local.\",\n });\n }\n\n switch (deploymentSelection.kind) {\n case \"existingDeployment\":\n return {\n url: deploymentSelection.deploymentToActOn.url,\n adminKey: deploymentSelection.deploymentToActOn.adminKey,\n deploymentFields:\n deploymentSelection.deploymentToActOn.deploymentFields,\n };\n case \"chooseProject\": {\n await ensureLoggedIn(ctx, {\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n {\n globallyForceCloud,\n },\n cmdOptions,\n );\n }\n case \"preview\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Use `npx convex deploy` to use preview deployments.\",\n });\n case \"deploymentWithinProject\": {\n return await handleDeploymentWithinProject(ctx, {\n chosenConfiguration,\n deploymentSelection,\n cmdOptions,\n globallyForceCloud,\n });\n }\n case \"anonymous\": {\n const hasAuth = ctx.bigBrainAuth() !== null;\n const isAgentMode = process.env.CONVEX_AGENT_MODE === \"anonymous\";\n if (\n !isAgentMode &&\n process.stdin.isTTY &&\n hasAuth &&\n deploymentSelection.deploymentName !== null\n ) {\n const shouldConfigure =\n chosenConfiguration !== null ||\n (await promptYesNo(ctx, {\n message: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is configured with deployment ${deploymentSelection.deploymentName}, which is not linked with your account. Would you like to link it now?`,\n }));\n if (shouldConfigure) {\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n {\n globallyForceCloud,\n },\n cmdOptions,\n );\n }\n }\n const alreadyHasConfiguredAnonymousDeployment =\n deploymentSelection.deploymentName !== null &&\n chosenConfiguration === null;\n if (isAgentMode) {\n logWarning(\n chalkStderr.yellow.bold(\n \"CONVEX_AGENT_MODE=anonymous mode is in beta, functionality may change in the future.\",\n ),\n );\n }\n\n const shouldPromptForLogin =\n isAgentMode || !process.stdin.isTTY\n ? \"no\"\n : alreadyHasConfiguredAnonymousDeployment\n ? \"no\"\n : await promptOptions(ctx, {\n message:\n \"Welcome to Convex! Would you like to login to your account?\",\n choices: [\n {\n name: \"Start without an account (run Convex locally)\",\n value: \"no\",\n },\n { name: \"Login or create an account\", value: \"yes\" },\n ],\n default: \"no\",\n });\n if (shouldPromptForLogin === \"no\") {\n const result = await handleAnonymousDeployment(ctx, {\n chosenConfiguration,\n deploymentName: deploymentSelection.deploymentName,\n ...cmdOptions.localOptions,\n });\n return {\n adminKey: result.adminKey,\n url: result.deploymentUrl,\n deploymentFields: {\n deploymentName: result.deploymentName,\n deploymentType: \"anonymous\",\n projectSlug: null,\n teamSlug: null,\n },\n };\n }\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n {\n globallyForceCloud,\n },\n cmdOptions,\n );\n }\n }\n}\n\nasync function handleDeploymentWithinProject(\n ctx: Context,\n {\n chosenConfiguration,\n deploymentSelection,\n cmdOptions,\n globallyForceCloud,\n }: {\n chosenConfiguration: ChosenConfiguration;\n deploymentSelection: DeploymentSelection & {\n kind: \"deploymentWithinProject\";\n };\n cmdOptions: ConfigureCmdOptions;\n globallyForceCloud: boolean;\n },\n) {\n const hasAuth = ctx.bigBrainAuth() !== null;\n const loginMessage =\n hasAuth && shouldAllowAnonymousDevelopment()\n ? undefined\n : \"Tip: You can try out Convex without creating an account by clearing the \" +\n `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} environment variable (often in .env.local).`;\n await ensureLoggedIn(ctx, {\n message: loginMessage,\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n if (chosenConfiguration !== null) {\n const result = await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n {\n globallyForceCloud,\n },\n cmdOptions,\n );\n return result;\n }\n\n const accessResult = await checkAccessToSelectedProject(\n ctx,\n deploymentSelection.targetProject,\n );\n if (accessResult.kind === \"noAccess\") {\n logMessage(\"You don't have access to the selected project.\");\n const result = await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n {\n globallyForceCloud,\n },\n cmdOptions,\n );\n return result;\n }\n\n const selectedDeployment = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n // We'll start running it below\n { ensureLocalRunning: false },\n );\n if (\n selectedDeployment.deploymentFields !== null &&\n selectedDeployment.deploymentFields.deploymentType === \"local\"\n ) {\n // Start running the local backend, which may bind to different ports\n // than what was saved from a previous run.\n const localDeployment = await handleLocalDeployment(ctx, {\n teamSlug: selectedDeployment.deploymentFields.teamSlug!,\n projectSlug: selectedDeployment.deploymentFields.projectSlug!,\n forceUpgrade: cmdOptions.localOptions.forceUpgrade,\n ports: cmdOptions.localOptions.ports,\n backendVersion: cmdOptions.localOptions.backendVersion,\n });\n return {\n url: localDeployment.deploymentUrl,\n adminKey: localDeployment.adminKey,\n deploymentFields: selectedDeployment.deploymentFields,\n };\n }\n return {\n url: selectedDeployment.url,\n adminKey: selectedDeployment.adminKey,\n deploymentFields: selectedDeployment.deploymentFields,\n };\n}\n\nasync function handleChooseProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n selectionWithinProject: DeploymentSelectionWithinProject,\n args: {\n globallyForceCloud: boolean;\n },\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n };\n }\n> {\n await ensureLoggedIn(ctx, {\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n const project = await selectProject(ctx, chosenConfiguration, {\n team: cmdOptions.team,\n project: cmdOptions.project,\n devDeployment: cmdOptions.devDeployment,\n local: args.globallyForceCloud ? false : cmdOptions.local,\n cloud: args.globallyForceCloud ? true : cmdOptions.cloud,\n });\n // TODO complain about any non-default cmdOptions.localOptions here\n // because we're ignoring them if this isn't a local development.\n\n const deploymentOptions: DeploymentOptions =\n selectionWithinProject.kind === \"prod\"\n ? { kind: \"prod\" }\n : project.devDeployment === \"local\"\n ? { kind: \"local\", ...cmdOptions.localOptions }\n : { kind: \"dev\" };\n const {\n deploymentName,\n deploymentUrl: url,\n adminKey,\n } = await ensureDeploymentProvisioned(ctx, {\n teamSlug: project.teamSlug,\n projectSlug: project.projectSlug,\n deploymentOptions,\n });\n return {\n url,\n adminKey,\n deploymentFields: {\n deploymentName,\n deploymentType: deploymentOptions.kind,\n projectSlug: project.projectSlug,\n teamSlug: project.teamSlug,\n },\n };\n}\n\nasync function handleManuallySetUrlAndAdminKey(\n ctx: Context,\n cmdOptions: { url: string; siteUrl: string; adminKey: string },\n) {\n const { url, siteUrl, adminKey } = cmdOptions;\n const didErase = await eraseDeploymentEnvVar(ctx);\n if (didErase) {\n logMessage(\n chalkStderr.yellowBright(\n `Removed the CONVEX_DEPLOYMENT environment variable from .env.local`,\n ),\n );\n }\n const envFileConfig = await writeUrlsToEnvFile(ctx, {\n convexUrl: url,\n siteUrl,\n });\n if (\n envFileConfig !== null &&\n (envFileConfig.convexUrlEnvVar || envFileConfig.siteUrlEnvVar)\n ) {\n // Join both names with \" and \" if both exist, otherwise just use one of them.\n const updatedVars = [\n envFileConfig.convexUrlEnvVar,\n envFileConfig.siteUrlEnvVar,\n ]\n .filter(Boolean)\n .join(\" and \");\n logMessage(\n chalkStderr.green(`Saved ${updatedVars} to ${envFileConfig.envFile}`),\n );\n }\n return { url, adminKey };\n}\n\nexport async function selectProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n local?: boolean | undefined;\n cloud?: boolean | undefined;\n defaultProjectName?: string | undefined;\n },\n): Promise<{\n teamSlug: string;\n projectSlug: string;\n devDeployment: \"cloud\" | \"local\";\n}> {\n // Prompt the user to select a project.\n const choice =\n chosenConfiguration !== \"ask\" && chosenConfiguration !== null\n ? chosenConfiguration\n : await askToConfigure(ctx);\n switch (choice) {\n case \"new\":\n return selectNewProject(ctx, chosenConfiguration, cmdOptions);\n case \"existing\":\n return selectExistingProject(ctx, chosenConfiguration, cmdOptions);\n default:\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"No project selected.\",\n });\n }\n}\n\nconst cwd = path.basename(process.cwd());\nasync function selectNewProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n config: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n cloud?: boolean | undefined;\n local?: boolean | undefined;\n defaultProjectName?: string | undefined;\n },\n) {\n const { team: selectedTeam, chosen: didChooseBetweenTeams } =\n await validateOrSelectTeam(ctx, config.team, \"Team:\");\n let projectName: string = config.project || cwd;\n let choseProjectInteractively = false;\n if (!config.project) {\n projectName = await promptString(ctx, {\n message: \"Project name:\",\n default: config.defaultProjectName || cwd,\n });\n choseProjectInteractively = true;\n }\n\n const { devDeployment } = await selectDevDeploymentType(ctx, {\n chosenConfiguration,\n newOrExisting: \"new\",\n teamSlug: selectedTeam.slug,\n userHasChosenSomethingInteractively:\n didChooseBetweenTeams || choseProjectInteractively,\n projectSlug: undefined,\n devDeploymentFromFlag: config.devDeployment,\n forceDevDeployment: config.local\n ? \"local\"\n : config.cloud\n ? \"cloud\"\n : undefined,\n });\n\n const region =\n devDeployment === \"cloud\"\n ? await selectRegionOrUseDefault(ctx, selectedTeam, \"dev\")\n : null;\n\n showSpinner(\"Creating new Convex project...\");\n\n const deploymentToProvision =\n devDeployment === \"cloud\"\n ? {\n deploymentType: \"dev\" as const,\n region,\n }\n : null;\n\n let projectSlug, teamSlug;\n try {\n ({ projectSlug, teamSlug } = await createProject(ctx, {\n teamSlug: selectedTeam.slug,\n projectName,\n deploymentToProvision,\n }));\n } catch (err) {\n logFailure(\"Unable to create project.\");\n return await logAndHandleFetchError(ctx, err);\n }\n const teamMessage = didChooseBetweenTeams\n ? \" in team \" + chalkStderr.bold(teamSlug)\n : \"\";\n logFinishedStep(\n `Created project ${chalkStderr.bold(\n projectSlug,\n )}${teamMessage}, manage it at ${chalkStderr.bold(\n projectDashboardUrl(teamSlug, projectSlug),\n )}`,\n );\n\n await doInitConvexFolder(ctx);\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const folder = functionsDir(configPath, projectConfig);\n await attemptSetupAiFiles({\n ctx,\n aiFilesConfig: projectConfig.aiFiles,\n convexDir: path.resolve(folder),\n projectDir: path.resolve(path.dirname(configPath)),\n });\n return { teamSlug, projectSlug, devDeployment };\n}\n\nasync function selectExistingProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n config: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n local?: boolean | undefined;\n cloud?: boolean | undefined;\n },\n): Promise<{\n teamSlug: string;\n projectSlug: string;\n devDeployment: \"cloud\" | \"local\";\n}> {\n const {\n team: { slug: teamSlug },\n chosen,\n } = await validateOrSelectTeam(ctx, config.team, \"Team:\");\n\n const projectSlug = await validateOrSelectProject(\n ctx,\n config.project,\n teamSlug,\n \"Configure project\",\n \"Project:\",\n );\n if (projectSlug === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Run the command again to create a new project instead.\",\n });\n }\n const { devDeployment } = await selectDevDeploymentType(ctx, {\n chosenConfiguration,\n newOrExisting: \"existing\",\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively: chosen || !config.project,\n devDeploymentFromFlag: config.devDeployment,\n forceDevDeployment: config.local\n ? \"local\"\n : config.cloud\n ? \"cloud\"\n : undefined,\n });\n\n logFinishedStep(`Reinitialized project ${chalkStderr.bold(projectSlug)}`);\n\n return { teamSlug, projectSlug, devDeployment };\n}\n\nasync function askToConfigure(ctx: Context): Promise<\"new\" | \"existing\"> {\n if (!(await hasProjects(ctx))) {\n return \"new\";\n }\n return await promptOptions(ctx, {\n message: \"What would you like to configure?\",\n default: \"new\",\n choices: [\n { name: \"create a new project\", value: \"new\" },\n { name: \"choose an existing project\", value: \"existing\" },\n ],\n });\n}\n\ntype DeploymentOptions =\n | {\n kind: \"prod\";\n }\n | { kind: \"dev\" }\n | {\n kind: \"local\";\n ports?:\n | {\n cloud: number;\n site: number;\n }\n | undefined;\n backendVersion?: string | undefined;\n forceUpgrade: boolean;\n };\n\n/**\n * This method assumes that the member has access to the selected project.\n */\nasync function ensureDeploymentProvisioned(\n ctx: Context,\n options: {\n teamSlug: string;\n projectSlug: string;\n deploymentOptions: DeploymentOptions;\n },\n): Promise<DeploymentDetails> {\n switch (options.deploymentOptions.kind) {\n case \"dev\":\n case \"prod\": {\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: options.teamSlug,\n projectSlug: options.projectSlug,\n },\n options.deploymentOptions.kind,\n );\n return {\n ...credentials,\n onActivity: null,\n };\n }\n case \"local\": {\n const credentials = await handleLocalDeployment(ctx, {\n teamSlug: options.teamSlug,\n projectSlug: options.projectSlug,\n ...options.deploymentOptions,\n });\n return credentials;\n }\n default:\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid deployment type: ${(options.deploymentOptions as any).kind}`,\n errForSentry: `Invalid deployment type: ${(options.deploymentOptions as any).kind}`,\n });\n }\n}\n\nexport async function updateEnvAndConfigForDeploymentSelection(\n ctx: Context,\n options: {\n url: string;\n siteUrl?: string | null;\n deploymentName: string;\n teamSlug: string | null;\n projectSlug: string | null;\n deploymentType: DeploymentType;\n },\n existingValue: string | null,\n) {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n\n const { wroteToGitIgnore, changedDeploymentEnvVar } =\n options.deploymentType !== \"prod\"\n ? await writeDeploymentEnvVar(\n ctx,\n options.deploymentType,\n {\n team: options.teamSlug,\n project: options.projectSlug,\n deploymentName: options.deploymentName,\n },\n existingValue,\n )\n : { wroteToGitIgnore: false, changedDeploymentEnvVar: false };\n await ensureConvexFunctionsDir(ctx, projectConfig);\n await finalizeConfiguration(ctx, {\n deploymentType: options.deploymentType,\n deploymentName: options.deploymentName,\n url: options.url,\n siteUrl: options.siteUrl,\n wroteToGitIgnore,\n changedDeploymentEnvVar,\n functionsPath: functionsDir(configPath, projectConfig),\n });\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAE5B,iBAMO;AACP,iBAQO;AACP,oBAA4D;AAC5D,wBAIO;AACP,kBAAsC;AACtC,mBASO;AACP,qBAAmC;AACnC,kBAAiB;AACjB,uBAAoC;AACpC,qBAAmC;AACnC,6BAAsC;AACtC,qBAIO;AACP,
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n} from \"../bundler/log.js\";\nimport {\n DeploymentType,\n DeploymentName,\n fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows,\n createProject,\n loadSelectedDeploymentCredentials,\n checkAccessToSelectedProject,\n DeploymentSelectionWithinProject,\n} from \"./lib/api.js\";\nimport { readProjectConfig, ensureConvexFunctionsDir } from \"./lib/config.js\";\nimport {\n DeploymentDetails,\n eraseDeploymentEnvVar,\n writeDeploymentEnvVar,\n} from \"./lib/deployment.js\";\nimport { finalizeConfiguration } from \"./lib/init.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n functionsDir,\n hasProjects,\n logAndHandleFetchError,\n selectDevDeploymentType,\n selectRegionOrUseDefault,\n validateOrSelectProject,\n validateOrSelectTeam,\n} from \"./lib/utils/utils.js\";\nimport { writeUrlsToEnvFile } from \"./lib/envvars.js\";\nimport path from \"path\";\nimport { projectDashboardUrl } from \"./lib/dashboard.js\";\nimport { doInitConvexFolder } from \"./lib/codegen.js\";\nimport { handleLocalDeployment } from \"./lib/localDeployment/localDeployment.js\";\nimport {\n promptOptions,\n promptString,\n promptYesNo,\n} from \"./lib/utils/prompts.js\";\nimport { attemptSetupAiFiles } from \"./lib/aiFiles/index.js\";\nimport {\n DeploymentSelection,\n deploymentNameFromSelection,\n shouldAllowAnonymousDevelopment,\n} from \"./lib/deploymentSelection.js\";\nimport { ensureLoggedIn } from \"./lib/login.js\";\nimport { handleAnonymousDeployment } from \"./lib/localDeployment/anonymous.js\";\nimport { fetchDeploymentCanonicalUrls } from \"./lib/deploy2.js\";\ntype DeploymentCredentials = {\n url: string;\n adminKey: string;\n};\n\ntype ChosenConfiguration =\n // `--configure new`\n | \"new\"\n // `--configure existing`\n | \"existing\"\n // `--configure`\n | \"ask\"\n // `--configure` was not specified\n | null;\n\ntype ConfigureCmdOptions = {\n prod: boolean;\n localOptions: {\n ports?: {\n cloud: number;\n site: number;\n };\n backendVersion?: string | undefined;\n dashboardVersion?: string | undefined;\n forceUpgrade: boolean;\n };\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n local?: boolean | undefined;\n cloud?: boolean | undefined;\n url?: string | undefined;\n adminKey?: string | undefined;\n envFile?: string | undefined;\n overrideAuthUrl?: string | undefined;\n overrideAuthClient?: string | undefined;\n overrideAuthUsername?: string | undefined;\n overrideAuthPassword?: string | undefined;\n};\n\n/**\n * As of writing, this is used by:\n * - `npx convex dev`\n * - `npx convex codegen`\n *\n * But is not used by `npx convex deploy` or other commands.\n */\nexport async function deploymentCredentialsOrConfigure(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n siteUrl: string | null;\n } | null;\n }\n> {\n const selectedDeployment = await _deploymentCredentialsOrConfigure(\n ctx,\n deploymentSelection,\n chosenConfiguration,\n cmdOptions,\n );\n const { convexSiteUrl: siteUrl } = await fetchDeploymentCanonicalUrls(ctx, {\n adminKey: selectedDeployment.adminKey,\n deploymentUrl: selectedDeployment.url,\n });\n\n if (selectedDeployment.deploymentFields !== null) {\n // Set the `CONVEX_DEPLOYMENT` env var + the `CONVEX_URL` env var\n await updateEnvAndConfigForDeploymentSelection(\n ctx,\n {\n url: selectedDeployment.url,\n siteUrl,\n deploymentName: selectedDeployment.deploymentFields.deploymentName,\n teamSlug: selectedDeployment.deploymentFields.teamSlug,\n projectSlug: selectedDeployment.deploymentFields.projectSlug,\n deploymentType: selectedDeployment.deploymentFields.deploymentType,\n },\n deploymentNameFromSelection(deploymentSelection),\n );\n } else {\n // Clear the `CONVEX_DEPLOYMENT` env var + set the `CONVEX_URL` and\n // `CONVEX_SITE_URL` env vars.\n await handleManuallySetUrlAndAdminKey(ctx, {\n url: selectedDeployment.url,\n siteUrl,\n adminKey: selectedDeployment.adminKey,\n });\n }\n return {\n url: selectedDeployment.url,\n adminKey: selectedDeployment.adminKey,\n deploymentFields:\n selectedDeployment.deploymentFields === null\n ? null\n : { ...selectedDeployment.deploymentFields, siteUrl: siteUrl },\n };\n}\n\nexport async function _deploymentCredentialsOrConfigure(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string | null;\n teamSlug: string | null;\n } | null;\n }\n> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\":\n return {\n url: deploymentSelection.deploymentToActOn.url,\n adminKey: deploymentSelection.deploymentToActOn.adminKey,\n deploymentFields:\n deploymentSelection.deploymentToActOn.deploymentFields,\n };\n case \"chooseProject\": {\n await ensureLoggedIn(ctx, {\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n }\n case \"preview\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Use `npx convex deploy` to use preview deployments.\",\n });\n case \"deploymentWithinProject\": {\n return await handleDeploymentWithinProject(ctx, {\n chosenConfiguration,\n deploymentSelection,\n cmdOptions,\n });\n }\n case \"anonymous\": {\n const hasAuth = ctx.bigBrainAuth() !== null;\n const isAgentMode = process.env.CONVEX_AGENT_MODE === \"anonymous\";\n if (\n !isAgentMode &&\n process.stdin.isTTY &&\n hasAuth &&\n deploymentSelection.deploymentName !== null\n ) {\n const shouldConfigure =\n chosenConfiguration !== null ||\n (await promptYesNo(ctx, {\n message: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is configured with deployment ${deploymentSelection.deploymentName}, which is not linked with your account. Would you like to link it now?`,\n }));\n if (shouldConfigure) {\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n }\n }\n const alreadyHasConfiguredAnonymousDeployment =\n deploymentSelection.deploymentName !== null &&\n chosenConfiguration === null;\n if (isAgentMode) {\n logWarning(\n chalkStderr.yellow.bold(\n \"CONVEX_AGENT_MODE=anonymous mode is in beta, functionality may change in the future.\",\n ),\n );\n }\n\n const shouldPromptForLogin =\n isAgentMode || !process.stdin.isTTY\n ? \"no\"\n : alreadyHasConfiguredAnonymousDeployment\n ? \"no\"\n : await promptOptions(ctx, {\n message:\n \"Welcome to Convex! Would you like to login to your account?\",\n choices: [\n {\n name: \"Start without an account (run Convex locally)\",\n value: \"no\",\n },\n { name: \"Login or create an account\", value: \"yes\" },\n ],\n default: \"no\",\n });\n if (shouldPromptForLogin === \"no\") {\n const result = await handleAnonymousDeployment(ctx, {\n chosenConfiguration,\n deploymentName: deploymentSelection.deploymentName,\n ...cmdOptions.localOptions,\n });\n return {\n adminKey: result.adminKey,\n url: result.deploymentUrl,\n deploymentFields: {\n deploymentName: result.deploymentName,\n deploymentType: \"anonymous\",\n projectSlug: null,\n teamSlug: null,\n },\n };\n }\n return await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n }\n }\n}\n\nasync function handleDeploymentWithinProject(\n ctx: Context,\n {\n chosenConfiguration,\n deploymentSelection,\n cmdOptions,\n }: {\n chosenConfiguration: ChosenConfiguration;\n deploymentSelection: DeploymentSelection & {\n kind: \"deploymentWithinProject\";\n };\n cmdOptions: ConfigureCmdOptions;\n },\n) {\n const hasAuth = ctx.bigBrainAuth() !== null;\n const loginMessage =\n hasAuth && shouldAllowAnonymousDevelopment()\n ? undefined\n : \"Tip: You can try out Convex without creating an account by clearing the \" +\n `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} environment variable (often in .env.local).`;\n await ensureLoggedIn(ctx, {\n message: loginMessage,\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n if (chosenConfiguration !== null) {\n const result = await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n return result;\n }\n\n const accessResult = await checkAccessToSelectedProject(\n ctx,\n deploymentSelection.targetProject,\n );\n if (accessResult.kind === \"noAccess\") {\n logMessage(\"You don't have access to the selected project.\");\n const result = await handleChooseProject(\n ctx,\n chosenConfiguration,\n deploymentSelection.selectionWithinProject,\n cmdOptions,\n );\n return result;\n }\n\n const selectedDeployment = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n // We'll start running it below\n { ensureLocalRunning: false },\n );\n if (\n selectedDeployment.deploymentFields !== null &&\n selectedDeployment.deploymentFields.deploymentType === \"local\"\n ) {\n // Start running the local backend, which may bind to different ports\n // than what was saved from a previous run.\n const localDeployment = await handleLocalDeployment(ctx, {\n teamSlug: selectedDeployment.deploymentFields.teamSlug!,\n projectSlug: selectedDeployment.deploymentFields.projectSlug!,\n forceUpgrade: cmdOptions.localOptions.forceUpgrade,\n ports: cmdOptions.localOptions.ports,\n backendVersion: cmdOptions.localOptions.backendVersion,\n });\n return {\n url: localDeployment.deploymentUrl,\n adminKey: localDeployment.adminKey,\n deploymentFields: selectedDeployment.deploymentFields,\n };\n }\n return {\n url: selectedDeployment.url,\n adminKey: selectedDeployment.adminKey,\n deploymentFields: selectedDeployment.deploymentFields,\n };\n}\n\nasync function handleChooseProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n selectionWithinProject: DeploymentSelectionWithinProject,\n cmdOptions: ConfigureCmdOptions,\n): Promise<\n DeploymentCredentials & {\n deploymentFields: {\n deploymentName: DeploymentName;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n };\n }\n> {\n await ensureLoggedIn(ctx, {\n overrideAuthUrl: cmdOptions.overrideAuthUrl,\n overrideAuthClient: cmdOptions.overrideAuthClient,\n overrideAuthUsername: cmdOptions.overrideAuthUsername,\n overrideAuthPassword: cmdOptions.overrideAuthPassword,\n });\n const project = await selectProject(ctx, chosenConfiguration, {\n team: cmdOptions.team,\n project: cmdOptions.project,\n devDeployment: cmdOptions.devDeployment,\n local: cmdOptions.local,\n cloud: cmdOptions.cloud,\n });\n // TODO complain about any non-default cmdOptions.localOptions here\n // because we're ignoring them if this isn't a local development.\n\n const deploymentOptions: DeploymentOptions =\n selectionWithinProject.kind === \"prod\"\n ? { kind: \"prod\" }\n : project.devDeployment === \"local\"\n ? { kind: \"local\", ...cmdOptions.localOptions }\n : { kind: \"dev\" };\n const {\n deploymentName,\n deploymentUrl: url,\n adminKey,\n } = await ensureDeploymentProvisioned(ctx, {\n teamSlug: project.teamSlug,\n projectSlug: project.projectSlug,\n deploymentOptions,\n });\n return {\n url,\n adminKey,\n deploymentFields: {\n deploymentName,\n deploymentType: deploymentOptions.kind,\n projectSlug: project.projectSlug,\n teamSlug: project.teamSlug,\n },\n };\n}\n\nasync function handleManuallySetUrlAndAdminKey(\n ctx: Context,\n cmdOptions: { url: string; siteUrl: string; adminKey: string },\n) {\n const { url, siteUrl, adminKey } = cmdOptions;\n const didErase = await eraseDeploymentEnvVar(ctx);\n if (didErase) {\n logMessage(\n chalkStderr.yellowBright(\n `Removed the CONVEX_DEPLOYMENT environment variable from .env.local`,\n ),\n );\n }\n const envFileConfig = await writeUrlsToEnvFile(ctx, {\n convexUrl: url,\n siteUrl,\n });\n if (\n envFileConfig !== null &&\n (envFileConfig.convexUrlEnvVar || envFileConfig.siteUrlEnvVar)\n ) {\n // Join both names with \" and \" if both exist, otherwise just use one of them.\n const updatedVars = [\n envFileConfig.convexUrlEnvVar,\n envFileConfig.siteUrlEnvVar,\n ]\n .filter(Boolean)\n .join(\" and \");\n logMessage(\n chalkStderr.green(`Saved ${updatedVars} to ${envFileConfig.envFile}`),\n );\n }\n return { url, adminKey };\n}\n\nexport async function selectProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n cmdOptions: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n local?: boolean | undefined;\n cloud?: boolean | undefined;\n defaultProjectName?: string | undefined;\n },\n): Promise<{\n teamSlug: string;\n projectSlug: string;\n devDeployment: \"cloud\" | \"local\";\n}> {\n // Prompt the user to select a project.\n const choice =\n chosenConfiguration !== \"ask\" && chosenConfiguration !== null\n ? chosenConfiguration\n : await askToConfigure(ctx);\n switch (choice) {\n case \"new\":\n return selectNewProject(ctx, chosenConfiguration, cmdOptions);\n case \"existing\":\n return selectExistingProject(ctx, chosenConfiguration, cmdOptions);\n default:\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"No project selected.\",\n });\n }\n}\n\nconst cwd = path.basename(process.cwd());\nasync function selectNewProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n config: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n cloud?: boolean | undefined;\n local?: boolean | undefined;\n defaultProjectName?: string | undefined;\n },\n) {\n const { team: selectedTeam, chosen: didChooseBetweenTeams } =\n await validateOrSelectTeam(ctx, config.team, \"Team:\");\n let projectName: string = config.project || cwd;\n let choseProjectInteractively = false;\n if (!config.project) {\n projectName = await promptString(ctx, {\n message: \"Project name:\",\n default: config.defaultProjectName || cwd,\n });\n choseProjectInteractively = true;\n }\n\n const { devDeployment } = await selectDevDeploymentType(ctx, {\n chosenConfiguration,\n newOrExisting: \"new\",\n teamSlug: selectedTeam.slug,\n userHasChosenSomethingInteractively:\n didChooseBetweenTeams || choseProjectInteractively,\n projectSlug: undefined,\n devDeploymentFromFlag: config.devDeployment,\n forceDevDeployment: config.local\n ? \"local\"\n : config.cloud\n ? \"cloud\"\n : undefined,\n });\n\n const region =\n devDeployment === \"cloud\"\n ? await selectRegionOrUseDefault(ctx, selectedTeam, \"dev\")\n : null;\n\n showSpinner(\"Creating new Convex project...\");\n\n const deploymentToProvision =\n devDeployment === \"cloud\"\n ? {\n deploymentType: \"dev\" as const,\n region,\n }\n : null;\n\n let projectSlug, teamSlug;\n try {\n ({ projectSlug, teamSlug } = await createProject(ctx, {\n teamSlug: selectedTeam.slug,\n projectName,\n deploymentToProvision,\n }));\n } catch (err) {\n logFailure(\"Unable to create project.\");\n return await logAndHandleFetchError(ctx, err);\n }\n const teamMessage = didChooseBetweenTeams\n ? \" in team \" + chalkStderr.bold(teamSlug)\n : \"\";\n logFinishedStep(\n `Created project ${chalkStderr.bold(\n projectSlug,\n )}${teamMessage}, manage it at ${chalkStderr.bold(\n projectDashboardUrl(teamSlug, projectSlug),\n )}`,\n );\n\n await doInitConvexFolder(ctx);\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const folder = functionsDir(configPath, projectConfig);\n await attemptSetupAiFiles({\n ctx,\n aiFilesConfig: projectConfig.aiFiles,\n convexDir: path.resolve(folder),\n projectDir: path.resolve(path.dirname(configPath)),\n });\n return { teamSlug, projectSlug, devDeployment };\n}\n\nasync function selectExistingProject(\n ctx: Context,\n chosenConfiguration: ChosenConfiguration,\n config: {\n team?: string | undefined;\n project?: string | undefined;\n devDeployment?: \"cloud\" | \"local\" | undefined;\n local?: boolean | undefined;\n cloud?: boolean | undefined;\n },\n): Promise<{\n teamSlug: string;\n projectSlug: string;\n devDeployment: \"cloud\" | \"local\";\n}> {\n const {\n team: { slug: teamSlug },\n chosen,\n } = await validateOrSelectTeam(ctx, config.team, \"Team:\");\n\n const projectSlug = await validateOrSelectProject(\n ctx,\n config.project,\n teamSlug,\n \"Configure project\",\n \"Project:\",\n );\n if (projectSlug === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Run the command again to create a new project instead.\",\n });\n }\n const { devDeployment } = await selectDevDeploymentType(ctx, {\n chosenConfiguration,\n newOrExisting: \"existing\",\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively: chosen || !config.project,\n devDeploymentFromFlag: config.devDeployment,\n forceDevDeployment: config.local\n ? \"local\"\n : config.cloud\n ? \"cloud\"\n : undefined,\n });\n\n logFinishedStep(`Reinitialized project ${chalkStderr.bold(projectSlug)}`);\n\n return { teamSlug, projectSlug, devDeployment };\n}\n\nasync function askToConfigure(ctx: Context): Promise<\"new\" | \"existing\"> {\n if (!(await hasProjects(ctx))) {\n return \"new\";\n }\n return await promptOptions(ctx, {\n message: \"What would you like to configure?\",\n default: \"new\",\n choices: [\n { name: \"create a new project\", value: \"new\" },\n { name: \"choose an existing project\", value: \"existing\" },\n ],\n });\n}\n\ntype DeploymentOptions =\n | {\n kind: \"prod\";\n }\n | { kind: \"dev\" }\n | {\n kind: \"local\";\n ports?:\n | {\n cloud: number;\n site: number;\n }\n | undefined;\n backendVersion?: string | undefined;\n forceUpgrade: boolean;\n };\n\n/**\n * This method assumes that the member has access to the selected project.\n */\nasync function ensureDeploymentProvisioned(\n ctx: Context,\n options: {\n teamSlug: string;\n projectSlug: string;\n deploymentOptions: DeploymentOptions;\n },\n): Promise<DeploymentDetails> {\n switch (options.deploymentOptions.kind) {\n case \"dev\":\n case \"prod\": {\n const credentials =\n await fetchDeploymentCredentialsProvisioningDevOrProdMaybeThrows(\n ctx,\n {\n kind: \"teamAndProjectSlugs\",\n teamSlug: options.teamSlug,\n projectSlug: options.projectSlug,\n },\n options.deploymentOptions.kind,\n );\n return {\n ...credentials,\n onActivity: null,\n };\n }\n case \"local\": {\n const credentials = await handleLocalDeployment(ctx, {\n teamSlug: options.teamSlug,\n projectSlug: options.projectSlug,\n ...options.deploymentOptions,\n });\n return credentials;\n }\n default:\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid deployment type: ${(options.deploymentOptions as any).kind}`,\n errForSentry: `Invalid deployment type: ${(options.deploymentOptions as any).kind}`,\n });\n }\n}\n\nexport async function updateEnvAndConfigForDeploymentSelection(\n ctx: Context,\n options: {\n url: string;\n siteUrl?: string | null;\n deploymentName: string;\n teamSlug: string | null;\n projectSlug: string | null;\n deploymentType: DeploymentType;\n },\n existingValue: string | null,\n) {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n\n const { wroteToGitIgnore, changedDeploymentEnvVar } =\n options.deploymentType !== \"prod\"\n ? await writeDeploymentEnvVar(\n ctx,\n options.deploymentType,\n {\n team: options.teamSlug,\n project: options.projectSlug,\n deploymentName: options.deploymentName,\n },\n existingValue,\n )\n : { wroteToGitIgnore: false, changedDeploymentEnvVar: false };\n await ensureConvexFunctionsDir(ctx, projectConfig);\n await finalizeConfiguration(ctx, {\n deploymentType: options.deploymentType,\n deploymentName: options.deploymentName,\n url: options.url,\n siteUrl: options.siteUrl,\n wroteToGitIgnore,\n changedDeploymentEnvVar,\n functionsPath: functionsDir(configPath, projectConfig),\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["path"]
|
|
7
7
|
}
|
package/dist/cjs/cli/deploy.js
CHANGED
|
@@ -155,7 +155,7 @@ async function deployToNewPreviewDeployment(ctx, deploymentSelection, options) {
|
|
|
155
155
|
await ctx.crash({
|
|
156
156
|
exitCode: 1,
|
|
157
157
|
errorType: "fatal",
|
|
158
|
-
printedMessage: "`npx convex deploy` to a preview deployment could not determine the preview name. Provide one using `--preview-
|
|
158
|
+
printedMessage: "`npx convex deploy` to a preview deployment could not determine the preview name. Provide one using `--preview-name`"
|
|
159
159
|
});
|
|
160
160
|
}
|
|
161
161
|
if (options.dryRun) {
|