@gaganref/confect-cli 10.3.1-fork.1 → 10.3.1-fork.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Bundler.mjs.map +1 -1
- package/dist/CodegenError.mjs +1 -1
- package/dist/CodegenError.mjs.map +1 -1
- package/dist/ConfectDirectory.mjs.map +1 -1
- package/dist/ConvexConfig.mjs.map +1 -1
- package/dist/ConvexDirectory.mjs.map +1 -1
- package/dist/DirectoryOptions.mjs.map +1 -1
- package/dist/EntryPoint.mjs.map +1 -1
- package/dist/Evaluation.mjs.map +1 -1
- package/dist/EvaluationWorker.mjs.map +1 -1
- package/dist/FunctionModule.mjs.map +1 -1
- package/dist/FunctionPath.mjs.map +1 -1
- package/dist/FunctionPaths.mjs.map +1 -1
- package/dist/GenerationSnapshot.mjs.map +1 -1
- package/dist/GroupPaths.mjs.map +1 -1
- package/dist/ImplModulePath.mjs.map +1 -1
- package/dist/LeafModule.mjs +1 -1
- package/dist/LeafModule.mjs.map +1 -1
- package/dist/Remove.mjs.map +1 -1
- package/dist/Rollback.mjs.map +1 -1
- package/dist/SpecAssemblyNode.mjs.map +1 -1
- package/dist/SpecModulePath.mjs.map +1 -1
- package/dist/SyncState.mjs.map +1 -1
- package/dist/TableModule.mjs.map +1 -1
- package/dist/TableModulePath.mjs.map +1 -1
- package/dist/WatchBuild.mjs.map +1 -1
- package/dist/WatchTopology.mjs.map +1 -1
- package/dist/Watcher.mjs +49 -50
- package/dist/Watcher.mjs.map +1 -1
- package/dist/cliApp.mjs.map +1 -1
- package/dist/confect/codegen.mjs +31 -9
- package/dist/confect/codegen.mjs.map +1 -1
- package/dist/confect/declaration.mjs +4 -3
- package/dist/confect/declaration.mjs.map +1 -1
- package/dist/confect/dev.mjs.map +1 -1
- package/dist/confect.mjs.map +1 -1
- package/dist/index.mjs +0 -0
- package/dist/index.mjs.map +1 -1
- package/dist/log.mjs.map +1 -1
- package/dist/templates.mjs +6 -6
- package/dist/templates.mjs.map +1 -1
- package/dist/utils.mjs +1 -1
- package/dist/utils.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.mjs","names":["DirectoryOptions.flags","CodegenError.tapAndLog","DirectoryOptions.layer","TableModule.discover","TableModule.validate","GenerationSnapshot.fromLoadedLeaves","FunctionModule.generateFunctions","EntryPoint.planDeclarations","GenerationSnapshot.update","FunctionModule.applyFunctionPlan","GenerationSnapshot.diff","CodegenError.ComponentNodeGroupError","ConvexConfig.componentName","ConvexConfig.CONVEX_CONFIG_FILENAME","Bundler.bundle","CodegenError.CallbackPrefixError","CodegenError.InvalidConvexConfigError","templates.componentContract","templates.assembledSpec","templates.registeredFunctionsForGroup","FunctionPaths.make","TableModule.TABLES_DIRNAME","templates.id","templates.tableWrapper","templates.runtimeSchema","templates.convexSchema","templates.schema","templates.services","DocName.fromTableName","CodegenError.ConflictingDocNameError","templates.docs","templates.refs","ConvexConfig.discoverInstalledComponents","templates.components","ConvexConfig.typeImportPath","ConvexConfig.resolveDefinition"],"sources":["../../src/confect/codegen.ts"],"sourcesContent":["import { App, Callback, Env, type GroupSpec, Spec } from \"@confect/core\";\nimport * as Command from \"effect/cli/Command\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as Array from \"effect/Array\";\nimport * as Effect from \"effect/Effect\";\nimport * as Result from \"effect/Result\";\nimport type * as PlatformError from \"effect/PlatformError\";\nimport type { BuildError } from \"../BuildError\";\nimport { pipe } from \"effect/Function\";\nimport * as HashSet from \"effect/HashSet\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Record from \"effect/Record\";\nimport type * as Scope from \"effect/Scope\";\nimport * as Bundler from \"../Bundler\";\nimport { fromBundlerError } from \"../BuildError\";\nimport * as CodegenError from \"../CodegenError\";\nimport { LegacySchemaFileError } from \"../CodegenError\";\nimport { ConfectDirectory } from \"../ConfectDirectory\";\nimport * as ConvexConfig from \"../ConvexConfig\";\nimport { ConvexDirectory } from \"../ConvexDirectory\";\nimport * as DirectoryOptions from \"../DirectoryOptions\";\nimport * as DocName from \"../DocName\";\nimport * as FunctionPaths from \"../FunctionPaths\";\nimport * as FunctionModule from \"../FunctionModule\";\nimport * as GenerationSnapshot from \"../GenerationSnapshot\";\nimport * as EntryPoint from \"../EntryPoint\";\nimport type { ImplModulePath } from \"../ImplModulePath\";\nimport {\n implPathForSpec,\n loadAll,\n registeredFunctionsRelativePath,\n validateAllImpls,\n withImplFiles,\n type LeafModule,\n type LoadedLeafModule,\n} from \"../LeafModule\";\nimport {\n logFileAdded,\n logFileModified,\n logFileRemoved,\n logPending,\n logSuccess,\n logWarn,\n} from \"../log\";\nimport { ProjectRoot } from \"../ProjectRoot\";\nimport { preserveComponentOutput } from \"../Rollback\";\nimport { assemblyNodesFromLeaves } from \"../SpecAssemblyNode\";\nimport * as TableModule from \"../TableModule\";\nimport * as templates from \"../templates\";\nimport {\n generateAuthConfig,\n generateCrons,\n generateHttp,\n removePathIfExists,\n toModuleImportPath,\n touchConvexSchema,\n writeFileStringAndLog,\n} from \"../utils\";\nimport { syncDeclaration, syncDeclaredHttp } from \"./declaration\";\n\nconst GENERATED_DIRNAME = \"_generated\";\n\nconst isComponent = Effect.map(\n ConvexDirectory.target,\n (target) => target.kind === \"component\",\n);\n\nconst GENERATED_SPEC_PATH = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"spec.ts\"),\n);\nconst GENERATED_SCHEMA_PATH = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"schema.ts\"),\n);\nconst GENERATED_CONVEX_SCHEMA_PATH = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"convexSchema.ts\"),\n);\nconst GENERATED_ID_PATH = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"id.ts\"),\n);\nconst GENERATED_COMPONENTS_PATH = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"components.ts\"),\n);\nconst GENERATED_TABLES_DIRNAME = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"tables\"),\n);\n\nconst LEGACY_PATHS = Effect.gen(function* () {\n const path = yield* Path.Path;\n\n return [\n \"spec.ts\",\n \"nodeSpec.ts\",\n \"impl.ts\",\n \"nodeImpl.ts\",\n path.join(GENERATED_DIRNAME, \"registeredFunctions.ts\"),\n path.join(GENERATED_DIRNAME, \"nodeRegisteredFunctions.ts\"),\n path.join(GENERATED_DIRNAME, \"impl.ts\"),\n path.join(GENERATED_DIRNAME, \"nodeImpl.ts\"),\n // `_generated/nodeSpec.ts` is not part of the generated output (all groups\n // live in `_generated/spec.ts`); delete any copy left by an older version.\n path.join(GENERATED_DIRNAME, \"nodeSpec.ts\"),\n ];\n});\n\nexport const codegen = Command.make(\"codegen\", DirectoryOptions.flags, () =>\n Effect.gen(function* () {\n yield* logPending(\"Performing initial sync…\");\n yield* codegenHandler.pipe(\n Effect.asVoid,\n Effect.tap(() => logSuccess(\"Generated files are up-to-date\")),\n CodegenError.tapAndLog,\n );\n }),\n).pipe(\n Command.provide(DirectoryOptions.layer),\n Command.withDescription(\n \"Generate `confect/_generated` files and the contents of the `convex` directory (except `tsconfig.json`, and `convex.config.ts` unless `confect/app.ts` declares the backend)\",\n ),\n);\n\nconst runCodegen = Effect.gen(function* () {\n yield* validateComponentConfiguration;\n yield* generateConfectGeneratedDirectory;\n // A declared backend's `convex.config.ts` and manifest come first: the\n // components registry below reads the config, and nothing may validate\n // against a manifest the current declaration did not produce.\n const declared = yield* syncDeclaration;\n // Reject a legacy `confect/schema.ts` up front so the user-facing\n // migration message surfaces before any bundler error from impl\n // validation (each impl imports `_generated/schema.ts`).\n yield* rejectLegacySchemaFile;\n // List `confect/tables/*.ts` (filename-only—no bundling yet) so the\n // `_generated/id.ts` constructor can be emitted *before* we bundle any\n // user-authored table module. Tables import from `_generated/id.ts` for\n // cross-table id refs, so it must exist on disk first.\n const tableModules = yield* TableModule.discover;\n yield* warnIfNoTables(tableModules);\n yield* generateIdConstructor(tableModules);\n // Tables and specs can use bound component IDs and schemas, so their\n // imports need the registry even on a project's first codegen run.\n yield* generateComponents;\n yield* validateCallbackPrefixes(declared);\n // Now that `_generated/id.ts` is on disk, bundle each table module and\n // check its default export is an `UnnamedTable`. Surface diagnostics\n // here (rather than later) so they appear before impl-validation noise.\n yield* TableModule.validate(tableModules);\n yield* validateNoDocNameCollisions(tableModules);\n yield* generateTableWrappers(tableModules);\n yield* removeObsoleteTableWrappers(tableModules);\n yield* generateRuntimeSchema(tableModules);\n const leaves = yield* loadAll;\n yield* rejectComponentNodeGroups(leaves);\n yield* removeLegacyFiles;\n const snapshot = yield* Effect.fromResult(\n GenerationSnapshot.fromLoadedLeaves(leaves),\n );\n yield* generateAssembledSpecs(leaves);\n // `_generated/api.ts`/`nodeApi.ts` are no longer imported by generated or\n // impl code (impls take the database schema from `_generated/schema`\n // directly), so remove any copies left over from earlier versions before\n // impl validation runs.\n yield* Effect.all(\n [\n removeGeneratedApi,\n generateRefs,\n generateComponentContract(tableModules),\n removeGeneratedNodeApi,\n generateDocs(tableModules),\n generateServices,\n generateConvexSchema(tableModules),\n ],\n { concurrency: \"unbounded\" },\n );\n yield* validateAllImpls(leaves);\n yield* generateGroupRegisteredFunctions(leaves);\n yield* removeObsoleteRegisteredFunctions(leaves);\n const [functionPaths] = yield* Effect.all(\n [\n FunctionModule.generateFunctions(snapshot),\n generateConvexSchemaReexport,\n logGenerated(\n Option.match(declared, {\n onNone: () => generateHttp,\n onSome: syncDeclaredHttp,\n }),\n ),\n logGenerated(generateCrons),\n Option.isNone(declared)\n ? logGenerated(generateAuthConfig)\n : Effect.succeedNone,\n ],\n { concurrency: \"unbounded\" },\n );\n if (Option.isSome(declared)) yield* generateTesting(declared.value);\n return {\n functionPaths,\n snapshot,\n };\n});\n\nexport const generateWithSnapshot = runCodegen.pipe(\n Effect.withSpan(\"Cli.codegen\"),\n);\n\nexport const makeCodegenHandler = (\n duringRestore?: Effect.Effect<void, never, Scope.Scope>,\n) =>\n preserveComponentOutput(generateWithSnapshot, duringRestore).pipe(\n Effect.tap(() => touchConvexSchema),\n Effect.map(({ functionPaths }) => ({ functionPaths })),\n );\n\nexport const codegenHandler = makeCodegenHandler();\n\nexport const updateDeclarations = Effect.fn(\"Cli.updateDeclarations\")(\n function* (\n snapshot: GenerationSnapshot.GenerationSnapshot,\n declarations: Array.NonEmptyReadonlyArray<EntryPoint.Declaration>,\n affectedImpls: ReadonlyArray<ImplModulePath>,\n ) {\n const path = yield* Path.Path;\n const { paths, tables } = EntryPoint.planDeclarations(\n declarations,\n affectedImpls,\n path,\n );\n yield* TableModule.validate(tables);\n return yield* withImplFiles(paths, (leaves) =>\n Effect.gen(function* () {\n yield* rejectComponentNodeGroups(leaves);\n const next = yield* Effect.fromResult(\n GenerationSnapshot.update(snapshot, leaves),\n );\n yield* validateAllImpls(leaves);\n yield* generateGroupRegisteredFunctions(leaves);\n yield* FunctionModule.applyFunctionPlan(\n GenerationSnapshot.diff(snapshot, next),\n );\n return next;\n }),\n );\n },\n);\n\n// Convex components cannot run Node.js functions, at any nesting depth.\nconst validateComponentGroupRuntime = (\n group: GroupSpec.AnyWithProps,\n groupPath: string,\n specPath: string,\n): Result.Result<void, CodegenError.ComponentNodeGroupError> =>\n Result.gen(function* () {\n if (group.runtime === \"Node\") {\n return yield* Result.fail(\n new CodegenError.ComponentNodeGroupError({ specPath, groupPath }),\n );\n }\n for (const [name, child] of Object.entries(group.groups)) {\n yield* validateComponentGroupRuntime(\n child,\n `${groupPath}.${name}`,\n specPath,\n );\n }\n });\n\nconst rejectComponentNodeGroups = Effect.fnUntraced(function* (\n leaves: ReadonlyArray<LoadedLeafModule>,\n) {\n if ((yield* ConvexDirectory.target).kind === \"app\") return;\n yield* Effect.forEach(leaves, (leaf) =>\n Effect.fromResult(\n validateComponentGroupRuntime(\n leaf.spec,\n leaf.groupPathDot,\n leaf.relativePath,\n ),\n ),\n );\n});\n\nconst validateCallbackPrefixes = Effect.fnUntraced(function* (\n declared: Option.Option<App.Any>,\n) {\n if ((yield* ConvexDirectory.target).kind !== \"component\") return;\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const callbacksPath = path.join(yield* ConfectDirectory.get, \"callbacks.ts\");\n if (!(yield* fs.exists(callbacksPath))) return;\n const name = Option.isSome(declared)\n ? Env.name(App.env(declared.value))\n : yield* ConvexConfig.componentName(\n path.join(\n yield* ConvexDirectory.get,\n ConvexConfig.CONVEX_CONFIG_FILENAME,\n ),\n );\n const { module } = yield* Bundler.bundle(callbacksPath).pipe(\n Effect.mapError((error) => fromBundlerError(\"confect/callbacks.ts\", error)),\n );\n for (const contract of Object.values(module)) {\n if (Callback.isContract(contract) && !contract.id.startsWith(`${name}/`)) {\n return yield* new CodegenError.CallbackPrefixError({\n declarationPath: \"confect/callbacks.ts\",\n contractId: contract.id,\n componentName: name,\n });\n }\n }\n});\n\nconst validateComponentConfiguration = Effect.gen(function* () {\n return yield* Match.value((yield* ConvexDirectory.target).kind).pipe(\n Match.when(\"app\", () => Effect.void),\n Match.when(\"component\", () =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const authPath = path.join(confectDirectory, \"auth.ts\");\n if (yield* fs.exists(authPath)) {\n return yield* new CodegenError.InvalidConvexConfigError({\n configPath: authPath,\n reason:\n \"Components cannot configure application authentication. Pass identity explicitly through function arguments.\",\n });\n }\n }),\n ),\n Match.exhaustive,\n );\n});\n\nconst generateComponentContract = Effect.fnUntraced(function* (\n tables: ReadonlyArray<TableModule.TableModule>,\n) {\n return yield* Match.value((yield* ConvexDirectory.target).kind).pipe(\n Match.when(\"app\", () => Effect.void),\n Match.when(\"component\", () =>\n Effect.gen(function* () {\n const path = yield* Path.Path;\n const directory = yield* ConfectDirectory.get;\n const contents = yield* templates.componentContract({\n tableNames: Array.map(tables, (table) => table.tableName),\n });\n yield* writeFileStringAndLog(\n path.join(directory, GENERATED_DIRNAME, \"component.ts\"),\n contents,\n );\n }),\n ),\n Match.exhaustive,\n );\n});\n\nconst generateConfectGeneratedDirectory = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n\n if (!(yield* fs.exists(path.join(confectDirectory, \"_generated\")))) {\n yield* fs.makeDirectory(path.join(confectDirectory, \"_generated\"), {\n recursive: true,\n });\n yield* logFileAdded(path.join(confectDirectory, \"_generated\") + \"/\");\n }\n});\n\nconst removeLegacyFiles = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const legacyPaths = yield* LEGACY_PATHS;\n\n yield* Effect.forEach(\n legacyPaths,\n Effect.fnUntraced(function* (relativePath: string) {\n const absolutePath = path.join(confectDirectory, relativePath);\n if (yield* fs.exists(absolutePath)) {\n yield* removePathIfExists(absolutePath);\n yield* logFileRemoved(absolutePath);\n }\n }),\n );\n});\n\nconst generateAssembledSpecs = Effect.fnUntraced(function* (\n leaves: ReadonlyArray<LeafModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedSpecPath = yield* GENERATED_SPEC_PATH;\n\n // A single assembled spec holds every group regardless of runtime—a Node\n // group's `makeNode()` lives in its imported leaf spec, so the assembled\n // file is runtime-agnostic. Always emit it (even empty) so downstream\n // readers (`loadGeneratedSpec`, `generateRefs`) always find a spec module.\n const nodes = assemblyNodesFromLeaves(leaves);\n const specContents = yield* templates.assembledSpec({ nodes });\n yield* writeFileStringAndLog(\n path.join(confectDirectory, generatedSpecPath),\n specContents,\n );\n});\n\nconst generateGroupRegisteredFunctions = Effect.fnUntraced(function* (\n leaves: ReadonlyArray<LoadedLeafModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n\n yield* Effect.forEach(\n leaves,\n Effect.fnUntraced(function* (leaf: LoadedLeafModule) {\n const registryRelativePath = yield* registeredFunctionsRelativePath(leaf);\n const registryPath = path.join(\n confectDirectory,\n \"_generated\",\n registryRelativePath,\n );\n const registryDir = path.dirname(registryPath);\n const fs = yield* FileSystem.FileSystem;\n if (!(yield* fs.exists(registryDir))) {\n yield* fs.makeDirectory(registryDir, { recursive: true });\n }\n\n const implRelativePath = yield* implPathForSpec(leaf.relativePath);\n const schemaImportPath = yield* toModuleImportPath(\n path.relative(\n path.dirname(registryPath),\n path.join(confectDirectory, \"_generated\", \"schema.ts\"),\n ),\n );\n // The group's own leaf spec (sibling of its impl), referenced\n // type-only by the registry to shape its returned record.\n const specImportPath = yield* toModuleImportPath(\n path.relative(\n path.dirname(registryPath),\n path.join(confectDirectory, leaf.relativePath),\n ),\n );\n const implImportPath = yield* toModuleImportPath(\n path.relative(\n path.dirname(registryPath),\n path.join(confectDirectory, implRelativePath),\n ),\n );\n\n const contents = yield* templates.registeredFunctionsForGroup({\n spec: leaf.spec,\n schemaImportPath,\n specImportPath,\n implImportPath,\n });\n\n yield* writeFileStringAndLog(registryPath, contents);\n }),\n );\n});\n\nconst removeObsoleteRegisteredFunctions = Effect.fnUntraced(function* (\n leaves: ReadonlyArray<LeafModule>,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const registryRoot = path.join(\n confectDirectory,\n \"_generated\",\n \"registeredFunctions\",\n );\n\n if (!(yield* fs.exists(registryRoot))) {\n return;\n }\n\n const expected = new Set(\n yield* Effect.forEach(leaves, (leaf) =>\n registeredFunctionsRelativePath(leaf),\n ),\n );\n\n const existing = yield* fs.readDirectory(registryRoot, { recursive: true });\n yield* Effect.forEach(existing, (relativePath) => {\n if (path.extname(relativePath) !== \".ts\") {\n return Effect.void;\n }\n const normalized = path.join(\"registeredFunctions\", relativePath);\n if (!expected.has(normalized)) {\n return Effect.gen(function* () {\n const absolutePath = path.join(registryRoot, relativePath);\n if (yield* fs.exists(absolutePath)) {\n yield* removePathIfExists(absolutePath);\n yield* logFileRemoved(absolutePath);\n }\n });\n }\n return Effect.void;\n });\n});\n\nconst getGeneratedSpecPath = Effect.gen(function* () {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedSpecPath = yield* GENERATED_SPEC_PATH;\n return path.join(confectDirectory, generatedSpecPath);\n});\n\nconst loadGeneratedSpec = Effect.gen(function* () {\n const specPath = yield* getGeneratedSpecPath;\n const { module: specModule } = yield* Bundler.bundle(specPath);\n const spec = specModule.default;\n\n if (!Spec.isSpec(spec)) {\n return yield* Effect.die(\n new Error(\"_generated/spec.ts does not export a valid Spec\"),\n );\n }\n\n return spec;\n});\n\nconst emptyFunctionPaths = FunctionPaths.FunctionPaths.make(HashSet.empty());\n\nexport const loadPreviousFunctionPaths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const specPath = yield* getGeneratedSpecPath;\n\n if (!(yield* fs.exists(specPath))) {\n return emptyFunctionPaths;\n }\n\n const specResult = yield* loadGeneratedSpec.pipe(Effect.result);\n\n return Result.match(specResult, {\n onFailure: () => emptyFunctionPaths,\n onSuccess: (spec) => FunctionPaths.make(spec),\n });\n});\n\n/**\n * Remove a now-obsolete `_generated/<name>.ts` if present (and log it), for\n * projects upgrading from a version that still emitted it.\n */\nconst removeObsoleteGeneratedFile = Effect.fnUntraced(function* (\n fileName: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const filePath = path.join(confectDirectory, \"_generated\", fileName);\n\n if (yield* fs.exists(filePath)) {\n yield* removePathIfExists(filePath);\n yield* logFileRemoved(filePath);\n }\n});\n\n// `_generated/api.ts` is no longer imported by generated or impl code: impls\n// take the database schema (`_generated/schema`) directly, and per-group\n// registries reference the spec type-only. Remove any stale copy.\nconst removeGeneratedApi = removeObsoleteGeneratedFile(\"api.ts\");\n\n// `_generated/nodeApi.ts` is obsolete for the same reason.\nconst removeGeneratedNodeApi = removeObsoleteGeneratedFile(\"nodeApi.ts\");\n\n/**\n * The user-authored `confect/schema.ts` is no longer supported: codegen now\n * owns both `_generated/schema.ts` (runtime) and `_generated/convexSchema.ts`\n * (deploy), derived from a single scan of `confect/tables/*.ts`. Detect a stray\n * file and fail with a clear migration message—leaving it in place would\n * silently shadow the codegen-owned\n * `_generated/schema.ts`/`_generated/convexSchema.ts`.\n */\nconst rejectLegacySchemaFile = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const legacyPath = path.join(confectDirectory, \"schema.ts\");\n\n if (yield* fs.exists(legacyPath)) {\n return yield* new LegacySchemaFileError({ schemaPath: \"schema.ts\" });\n }\n});\n\n/**\n * Surface a yellow `⚠` warning when codegen sees no tables—either the\n * `confect/tables/` directory is missing or it contains no `.ts` files.\n * Generation still succeeds (emitting an empty `DatabaseSchema` and\n * `defineSchema({})`), since action-only/table-free Confect backends are\n * legal—but the warning catches the much more common case of a typoed directory\n * or files placed under the wrong root.\n */\nconst warnIfNoTables = (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) =>\n tableModules.length === 0\n ? logWarn(\n `No tables discovered in \\`confect/${TableModule.TABLES_DIRNAME}/\\`. ` +\n `Generating an empty schema; add a \\`Table.make(...)\\` module under that ` +\n `directory unless this backend is intentionally tables-free.`,\n )\n : Effect.void;\n\nconst tableModuleBindings = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n generatedFilePath: string,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedDir = path.dirname(generatedFilePath);\n\n const generatedTablesDirname = yield* GENERATED_TABLES_DIRNAME;\n\n return yield* Effect.forEach(\n tableModules,\n Effect.fnUntraced(function* (tableModule: TableModule.TableModule) {\n const wrapperAbsolutePath = path.join(\n confectDirectory,\n generatedTablesDirname,\n `${tableModule.tableName}.ts`,\n );\n const importPath = yield* toModuleImportPath(\n path.relative(generatedDir, wrapperAbsolutePath),\n );\n return {\n importPath,\n tableName: tableModule.tableName,\n };\n }),\n );\n});\n\nconst generateIdConstructor = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedIdPath = yield* GENERATED_ID_PATH;\n const idPath = path.join(confectDirectory, generatedIdPath);\n\n const tableNames = Array.map(\n tableModules,\n (tableModule) => tableModule.tableName,\n );\n const contents = yield* Match.value(yield* ConvexDirectory.target).pipe(\n Match.when({ kind: \"app\" }, () => templates.id({ tableNames })),\n Match.when({ kind: \"component\" }, ({ scope }) =>\n templates.id({ tableNames, scope }),\n ),\n Match.exhaustive,\n );\n\n yield* writeFileStringAndLog(idPath, contents);\n});\n\nconst generateTableWrappers = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedTablesDirname = yield* GENERATED_TABLES_DIRNAME;\n const wrappersDir = path.join(confectDirectory, generatedTablesDirname);\n\n if (!(yield* fs.exists(wrappersDir))) {\n yield* fs.makeDirectory(wrappersDir, { recursive: true });\n }\n\n yield* Effect.forEach(\n tableModules,\n Effect.fnUntraced(function* (tableModule: TableModule.TableModule) {\n const wrapperPath = path.join(\n confectDirectory,\n generatedTablesDirname,\n `${tableModule.tableName}.ts`,\n );\n const unnamedAbsolutePath = path.join(\n confectDirectory,\n tableModule.relativePath,\n );\n const unnamedImportPath = yield* toModuleImportPath(\n path.relative(path.dirname(wrapperPath), unnamedAbsolutePath),\n );\n const contents = yield* templates.tableWrapper({\n tableName: tableModule.tableName,\n unnamedImportPath,\n component: yield* isComponent,\n });\n yield* writeFileStringAndLog(wrapperPath, contents);\n }),\n { concurrency: \"unbounded\" },\n );\n});\n\n/**\n * Remove any stale `_generated/tables/*.ts` wrapper whose source table has been\n * deleted or renamed. Mirrors `removeObsoleteRegisteredFunctions` for the\n * wrapper directory.\n */\nconst removeObsoleteTableWrappers = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedTablesDirname = yield* GENERATED_TABLES_DIRNAME;\n const wrappersDir = path.join(confectDirectory, generatedTablesDirname);\n\n if (!(yield* fs.exists(wrappersDir))) {\n return;\n }\n\n const expected = new Set(\n Array.map(tableModules, (tableModule) => `${tableModule.tableName}.ts`),\n );\n const existing = yield* fs.readDirectory(wrappersDir, { recursive: true });\n yield* Effect.forEach(existing, (entry) => {\n if (path.extname(entry) !== \".ts\") {\n return Effect.void;\n }\n if (!expected.has(entry)) {\n return Effect.gen(function* () {\n const absolutePath = path.join(wrappersDir, entry);\n if (yield* fs.exists(absolutePath)) {\n yield* removePathIfExists(absolutePath);\n yield* logFileRemoved(absolutePath);\n }\n });\n }\n return Effect.void;\n });\n});\n\nconst generateRuntimeSchema = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedSchemaPath = yield* GENERATED_SCHEMA_PATH;\n const schemaPath = path.join(confectDirectory, generatedSchemaPath);\n\n const bindings = yield* tableModuleBindings(tableModules, schemaPath);\n const contents = yield* templates.runtimeSchema({\n tableModules: bindings,\n component: yield* isComponent,\n });\n\n yield* writeFileStringAndLog(schemaPath, contents);\n});\n\nconst generateConvexSchema = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedConvexSchemaPath = yield* GENERATED_CONVEX_SCHEMA_PATH;\n const convexSchemaPath = path.join(\n confectDirectory,\n generatedConvexSchemaPath,\n );\n\n const bindings = yield* tableModuleBindings(tableModules, convexSchemaPath);\n const contents = yield* templates.convexSchema({ tableModules: bindings });\n\n yield* writeFileStringAndLog(convexSchemaPath, contents);\n});\n\nconst generateConvexSchemaReexport = Effect.gen(function* () {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const convexDirectory = yield* ConvexDirectory.get;\n const generatedConvexSchemaRelativePath = yield* GENERATED_CONVEX_SCHEMA_PATH;\n\n const convexSchemaPath = path.join(convexDirectory, \"schema.ts\");\n const generatedConvexSchemaPath = path.join(\n confectDirectory,\n generatedConvexSchemaRelativePath,\n );\n\n const convexSchemaImportPath = yield* toModuleImportPath(\n path.relative(path.dirname(convexSchemaPath), generatedConvexSchemaPath),\n );\n\n const schemaContents = yield* templates.schema({\n convexSchemaImportPath,\n });\n\n yield* writeFileStringAndLog(convexSchemaPath, schemaContents);\n});\n\nconst generateServices = Effect.gen(function* () {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n\n const confectGeneratedDirectory = path.join(confectDirectory, \"_generated\");\n\n const servicesPath = path.join(confectGeneratedDirectory, \"services.ts\");\n const generatedSchemaPath = yield* GENERATED_SCHEMA_PATH;\n const schemaImportPath = yield* toModuleImportPath(\n path.relative(\n path.dirname(servicesPath),\n path.join(confectDirectory, generatedSchemaPath),\n ),\n );\n\n const servicesContentsString = yield* templates.services({\n schemaImportPath,\n component: yield* isComponent,\n });\n\n yield* writeFileStringAndLog(servicesPath, servicesContentsString);\n});\n\n/**\n * Two tables whose names fold to the same PascalCase document type name (e.g.\n * `user_profiles` and `userProfiles` → `UserProfilesDoc`) would emit duplicate\n * interfaces in `_generated/docs.ts`. Catch that up front with a clear error\n * rather than letting `tsc` report a duplicate-identifier later.\n */\nconst validateNoDocNameCollisions = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const collisions = pipe(\n tableModules,\n Array.groupBy((tableModule) =>\n DocName.fromTableName(tableModule.tableName),\n ),\n Record.toEntries,\n Array.filter(([, group]) => group.length > 1),\n Array.map(([docName, group]) => ({\n docName,\n tableNames: Array.map(group, (tableModule) => tableModule.tableName),\n })),\n );\n\n if (Array.isReadonlyArrayNonEmpty(collisions)) {\n return yield* new CodegenError.ConflictingDocNameError({ collisions });\n }\n});\n\nconst generateDocs = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n\n const confectGeneratedDirectory = path.join(confectDirectory, \"_generated\");\n\n const docsPath = path.join(confectGeneratedDirectory, \"docs.ts\");\n const generatedSchemaPath = yield* GENERATED_SCHEMA_PATH;\n const schemaImportPath = yield* toModuleImportPath(\n path.relative(\n path.dirname(docsPath),\n path.join(confectDirectory, generatedSchemaPath),\n ),\n );\n\n const docsContentsString = yield* templates.docs({\n schemaImportPath,\n tables: Array.map(tableModules, (tableModule) => ({\n tableName: tableModule.tableName,\n docName: DocName.fromTableName(tableModule.tableName),\n })),\n });\n\n yield* writeFileStringAndLog(docsPath, docsContentsString);\n});\n\nconst generateRefs = Effect.gen(function* () {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n\n const confectGeneratedDirectory = path.join(confectDirectory, \"_generated\");\n const refsPath = path.join(confectGeneratedDirectory, \"refs.ts\");\n const refsDir = path.dirname(refsPath);\n const generatedSpecPath = yield* GENERATED_SPEC_PATH;\n\n const specImportPath = yield* toModuleImportPath(\n path.relative(refsDir, path.join(confectDirectory, generatedSpecPath)),\n );\n\n const refsContents = yield* templates.refs({ specImportPath });\n\n yield* writeFileStringAndLog(refsPath, refsContents);\n});\n\n/**\n * Generate `confect/_generated/components.ts`—the typed registry of Convex\n * components installed in `convex/convex.config.ts` (see\n * {@link templates.components}). The file is emitted even when there is no\n * `convex.config.ts` (as an empty registry) so the import surface stays stable.\n * It must exist before loading tables and specs because they may import bound\n * component IDs and schemas.\n */\nexport const generateComponents = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const convexDirectory = yield* ConvexDirectory.get;\n const projectRoot = yield* ProjectRoot.get;\n\n const confectGeneratedDirectory = path.join(\n confectDirectory,\n GENERATED_DIRNAME,\n );\n const generatedComponentsPath = yield* GENERATED_COMPONENTS_PATH;\n const componentsPath = path.join(confectDirectory, generatedComponentsPath);\n\n const convexConfigPath = path.join(\n convexDirectory,\n ConvexConfig.CONVEX_CONFIG_FILENAME,\n );\n\n const installedComponents = (yield* fs.exists(convexConfigPath))\n ? yield* ConvexConfig.discoverInstalledComponents(\n convexConfigPath,\n path.relative(projectRoot, convexConfigPath),\n (yield* ConvexDirectory.target).kind,\n )\n : [];\n\n const contents = yield* templates.components({\n components: Array.map(\n installedComponents,\n ({ name, componentDefinitionPath }) => ({\n name,\n typeImportPath: ConvexConfig.typeImportPath(\n path,\n componentDefinitionPath,\n confectGeneratedDirectory,\n ),\n }),\n ),\n });\n\n yield* writeFileStringAndLog(componentsPath, contents);\n});\n\nconst logGenerated = <E, R>(\n effect: Effect.Effect<\n Option.Option<{\n readonly change: \"Added\" | \"Modified\" | \"Unchanged\";\n readonly convexFilePath: string;\n }>,\n E,\n R\n >,\n) =>\n effect.pipe(\n Effect.tap(\n Option.match({\n onNone: () => Effect.void,\n onSome: ({ change, convexFilePath }) =>\n Match.value(change).pipe(\n Match.when(\"Added\", () => logFileAdded(convexFilePath)),\n Match.when(\"Modified\", () => logFileModified(convexFilePath)),\n Match.when(\"Unchanged\", () => Effect.void),\n Match.exhaustive,\n ),\n }),\n ),\n );\n\n/**\n * Test-only imports never enter the runtime schema or function wrappers.\n */\nconst quote = (value: string) => JSON.stringify(value);\n\nconst generateTesting = Effect.fnUntraced(function* (app: App.Any) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const convexDirectory = yield* ConvexDirectory.get;\n const generated = path.join(confectDirectory, \"_generated\");\n const relative = (file: string) => {\n const value = path.relative(generated, file).split(path.sep).join(\"/\");\n return value.startsWith(\".\") ? value : `./${value}`;\n };\n const imports = [\n 'import schema from \"./schema\";',\n 'import convexSchema from \"./convexSchema\";',\n ];\n const moduleMap = Effect.fnUntraced(function* (directory: string) {\n const files = (yield* fs.readDirectory(directory, { recursive: true }))\n .filter(\n (file) =>\n /\\.[cm]?[jt]s$/.test(file) &&\n !file.endsWith(\".d.ts\") &&\n !file.split(path.sep).includes(\"_generated\") &&\n !file.includes(\".config.\"),\n )\n .sort();\n return `{ \"_generated/testing.ts\": () => Promise.resolve({}),\\n${files\n .map((file) => {\n const specifier = relative(path.join(directory, file));\n return `${quote(file.split(path.sep).join(\"/\"))}: () => import(${quote(specifier.replace(/\\.[cm]?[jt]s$/, \"\"))}),`;\n })\n .join(\"\\n\")}\\n}`;\n });\n const components: Array<string> = [];\n const httpMounts: Array<string> = [];\n const kits = new Map<string, string>();\n const visit = Effect.fnUntraced(function* (\n directory: string,\n prefix: string,\n kind: \"app\" | \"component\",\n parentHttpPrefix: string | undefined,\n ): Effect.fn.Return<\n void,\n | PlatformError.PlatformError\n | BuildError\n | CodegenError.InvalidConvexConfigError,\n FileSystem.FileSystem | Path.Path\n > {\n const config = path.join(directory, ConvexConfig.CONVEX_CONFIG_FILENAME);\n if (!(yield* fs.exists(config))) return;\n const installed = yield* ConvexConfig.discoverInstalledComponents(\n config,\n relative(config),\n kind,\n );\n for (const component of installed) {\n const name = prefix + component.name;\n const resolved = path.isAbsolute(component.componentDefinitionPath)\n ? component.componentDefinitionPath\n : path.dirname(\n yield* ConvexConfig.resolveDefinition(\n `${component.componentDefinitionPath}/convex.config`,\n config,\n path,\n ).pipe(\n Effect.fromOption,\n Effect.mapError(\n () =>\n new CodegenError.InvalidConvexConfigError({\n configPath: relative(config),\n reason: `Cannot resolve component ${component.componentDefinitionPath} for testing.`,\n }),\n ),\n ),\n );\n const localPrefix =\n prefix === \"\"\n ? App.mounts(app).find((mount) => mount.name === component.name)\n ?.httpPrefix\n : component.httpPrefix;\n const httpPrefix =\n parentHttpPrefix === undefined || localPrefix === undefined\n ? undefined\n : `${parentHttpPrefix.replace(/\\/+$/, \"\")}${localPrefix}`.replace(\n /\\/+$/,\n \"\",\n ) || \"/\";\n if (\n httpPrefix !== undefined &&\n ((yield* fs.exists(path.join(resolved, \"http.ts\"))) ||\n (yield* fs.exists(path.join(resolved, \"http.js\"))))\n ) {\n httpMounts.push(\n `{ componentPath: ${quote(name)}, httpPrefix: ${quote(httpPrefix)} }`,\n );\n }\n let identifier = kits.get(resolved);\n if (identifier === undefined) {\n identifier = `component${kits.size}`;\n kits.set(resolved, identifier);\n imports.push(\n `import ${identifier}Schema from ${quote(relative(path.join(resolved, \"schema\")))};`,\n );\n imports.push(\n `const ${identifier} = { schema: ${identifier}Schema, modules: ${yield* moduleMap(resolved)} };`,\n );\n }\n components.push(`${quote(name)}: ${identifier},`);\n yield* visit(resolved, `${name}/`, \"component\", httpPrefix);\n }\n });\n yield* visit(convexDirectory, \"\", (yield* ConvexDirectory.target).kind, \"\");\n yield* writeFileStringAndLog(\n path.join(generated, \"testing.ts\"),\n [\n \"// Generated by `confect codegen`. Test-only; do not import in backend functions.\",\n ...imports,\n `export default { httpMounts: [${httpMounts.join(\",\")}], schema, convexSchema, modules: ${yield* moduleMap(convexDirectory)}, components: {${components.join(\"\\n\")}} };`,\n ].join(\"\\n\"),\n );\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"codegen.mjs","names":["DirectoryOptions.flags","CodegenError.tapAndLog","DirectoryOptions.layer","TableModule.discover","TableModule.validate","GenerationSnapshot.fromLoadedLeaves","FunctionModule.generateFunctions","EntryPoint.planDeclarations","GenerationSnapshot.update","FunctionModule.applyFunctionPlan","GenerationSnapshot.diff","CodegenError.ComponentNodeGroupError","ConvexConfig.componentName","ConvexConfig.CONVEX_CONFIG_FILENAME","Bundler.bundle","CodegenError.CallbackPrefixError","CodegenError.InvalidConvexConfigError","templates.componentContract","templates.assembledSpec","templates.registeredFunctionsForGroup","FunctionPaths.make","TableModule.TABLES_DIRNAME","templates.id","templates.tableWrapper","templates.runtimeSchema","templates.convexSchema","templates.schema","templates.services","DocName.fromTableName","CodegenError.ConflictingDocNameError","templates.docs","templates.refs","ConvexConfig.discoverInstalledComponents","templates.components","ConvexConfig.typeImportPath","ConvexConfig.resolveDefinition","Bundler.resolveModule"],"sources":["../../src/confect/codegen.ts"],"sourcesContent":["import { App, Callback, Env, type GroupSpec, Spec } from \"@confect/core\";\nimport * as Command from \"effect/cli/Command\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport * as Array from \"effect/Array\";\nimport * as Effect from \"effect/Effect\";\nimport * as Result from \"effect/Result\";\nimport type * as PlatformError from \"effect/PlatformError\";\nimport type { BuildError } from \"../BuildError.js\";\nimport { pipe } from \"effect/Function\";\nimport * as HashSet from \"effect/HashSet\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Record from \"effect/Record\";\nimport type * as Scope from \"effect/Scope\";\nimport * as Bundler from \"../Bundler.js\";\nimport { fromBundlerError } from \"../BuildError.js\";\nimport * as CodegenError from \"../CodegenError.js\";\nimport { LegacySchemaFileError } from \"../CodegenError.js\";\nimport { ConfectDirectory } from \"../ConfectDirectory.js\";\nimport * as ConvexConfig from \"../ConvexConfig.js\";\nimport { ConvexDirectory } from \"../ConvexDirectory.js\";\nimport * as DirectoryOptions from \"../DirectoryOptions.js\";\nimport * as DocName from \"../DocName.js\";\nimport * as FunctionPaths from \"../FunctionPaths.js\";\nimport * as FunctionModule from \"../FunctionModule.js\";\nimport * as GenerationSnapshot from \"../GenerationSnapshot.js\";\nimport * as EntryPoint from \"../EntryPoint.js\";\nimport type { ImplModulePath } from \"../ImplModulePath.js\";\nimport {\n implPathForSpec,\n loadAll,\n registeredFunctionsRelativePath,\n validateAllImpls,\n withImplFiles,\n type LeafModule,\n type LoadedLeafModule,\n} from \"../LeafModule.js\";\nimport {\n logFileAdded,\n logFileModified,\n logFileRemoved,\n logPending,\n logSuccess,\n logWarn,\n} from \"../log.js\";\nimport { ProjectRoot } from \"../ProjectRoot.js\";\nimport { preserveComponentOutput } from \"../Rollback.js\";\nimport { assemblyNodesFromLeaves } from \"../SpecAssemblyNode.js\";\nimport * as TableModule from \"../TableModule.js\";\nimport * as templates from \"../templates.js\";\nimport {\n generateAuthConfig,\n generateCrons,\n generateHttp,\n removePathIfExists,\n toModuleImportPath,\n touchConvexSchema,\n writeFileStringAndLog,\n} from \"../utils.js\";\nimport { syncDeclaration, syncDeclaredHttp } from \"./declaration.js\";\n\nconst GENERATED_DIRNAME = \"_generated\";\n\nconst isComponent = Effect.map(\n ConvexDirectory.target,\n (target) => target.kind === \"component\",\n);\n\nconst GENERATED_SPEC_PATH = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"spec.ts\"),\n);\nconst GENERATED_SCHEMA_PATH = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"schema.ts\"),\n);\nconst GENERATED_CONVEX_SCHEMA_PATH = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"convexSchema.ts\"),\n);\nconst GENERATED_ID_PATH = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"id.ts\"),\n);\nconst GENERATED_COMPONENTS_PATH = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"components.ts\"),\n);\nconst GENERATED_TABLES_DIRNAME = Effect.map(Path.Path, (path) =>\n path.join(GENERATED_DIRNAME, \"tables\"),\n);\n\nconst LEGACY_PATHS = Effect.gen(function* () {\n const path = yield* Path.Path;\n\n return [\n \"spec.ts\",\n \"nodeSpec.ts\",\n \"impl.ts\",\n \"nodeImpl.ts\",\n path.join(GENERATED_DIRNAME, \"registeredFunctions.ts\"),\n path.join(GENERATED_DIRNAME, \"nodeRegisteredFunctions.ts\"),\n path.join(GENERATED_DIRNAME, \"impl.ts\"),\n path.join(GENERATED_DIRNAME, \"nodeImpl.ts\"),\n // `_generated/nodeSpec.ts` is not part of the generated output (all groups\n // live in `_generated/spec.ts`); delete any copy left by an older version.\n path.join(GENERATED_DIRNAME, \"nodeSpec.ts\"),\n ];\n});\n\nexport const codegen = Command.make(\"codegen\", DirectoryOptions.flags, () =>\n Effect.gen(function* () {\n yield* logPending(\"Performing initial sync…\");\n yield* codegenHandler.pipe(\n Effect.asVoid,\n Effect.tap(() => logSuccess(\"Generated files are up-to-date\")),\n CodegenError.tapAndLog,\n );\n }),\n).pipe(\n Command.provide(DirectoryOptions.layer),\n Command.withDescription(\n \"Generate `confect/_generated` files and the contents of the `convex` directory (except `tsconfig.json`, and `convex.config.ts` unless `confect/app.ts` declares the backend)\",\n ),\n);\n\nconst runCodegen = Effect.gen(function* () {\n yield* validateComponentConfiguration;\n yield* generateConfectGeneratedDirectory;\n // A declared backend's `convex.config.ts` and manifest come first: the\n // components registry below reads the config, and nothing may validate\n // against a manifest the current declaration did not produce.\n const declared = yield* syncDeclaration;\n // Reject a legacy `confect/schema.ts` up front so the user-facing\n // migration message surfaces before any bundler error from impl\n // validation (each impl imports `_generated/schema.ts`).\n yield* rejectLegacySchemaFile;\n // List `confect/tables/*.ts` (filename-only—no bundling yet) so the\n // `_generated/id.ts` constructor can be emitted *before* we bundle any\n // user-authored table module. Tables import from `_generated/id.ts` for\n // cross-table id refs, so it must exist on disk first.\n const tableModules = yield* TableModule.discover;\n yield* warnIfNoTables(tableModules);\n yield* generateIdConstructor(tableModules);\n // Tables and specs can use bound component IDs and schemas, so their\n // imports need the registry even on a project's first codegen run.\n yield* generateComponents;\n yield* validateCallbackPrefixes(declared);\n // Now that `_generated/id.ts` is on disk, bundle each table module and\n // check its default export is an `UnnamedTable`. Surface diagnostics\n // here (rather than later) so they appear before impl-validation noise.\n yield* TableModule.validate(tableModules);\n yield* validateNoDocNameCollisions(tableModules);\n yield* generateTableWrappers(tableModules);\n yield* removeObsoleteTableWrappers(tableModules);\n yield* generateRuntimeSchema(tableModules);\n const leaves = yield* loadAll;\n yield* rejectComponentNodeGroups(leaves);\n yield* removeLegacyFiles;\n const snapshot = yield* Effect.fromResult(\n GenerationSnapshot.fromLoadedLeaves(leaves),\n );\n yield* generateAssembledSpecs(leaves);\n // `_generated/api.ts`/`nodeApi.ts` are no longer imported by generated or\n // impl code (impls take the database schema from `_generated/schema`\n // directly), so remove any copies left over from earlier versions before\n // impl validation runs.\n yield* Effect.all(\n [\n removeGeneratedApi,\n generateRefs,\n generateComponentContract(tableModules),\n removeGeneratedNodeApi,\n generateDocs(tableModules),\n generateServices,\n generateConvexSchema(tableModules),\n ],\n { concurrency: \"unbounded\" },\n );\n yield* validateAllImpls(leaves);\n yield* generateGroupRegisteredFunctions(leaves);\n yield* removeObsoleteRegisteredFunctions(leaves);\n const [functionPaths] = yield* Effect.all(\n [\n FunctionModule.generateFunctions(snapshot),\n generateConvexSchemaReexport,\n logGenerated(\n Option.match(declared, {\n onNone: () => generateHttp,\n onSome: syncDeclaredHttp,\n }),\n ),\n logGenerated(generateCrons),\n Option.isNone(declared)\n ? logGenerated(generateAuthConfig)\n : Effect.succeedNone,\n ],\n { concurrency: \"unbounded\" },\n );\n if (Option.isSome(declared)) yield* generateTesting(declared.value);\n return {\n functionPaths,\n snapshot,\n };\n});\n\nexport const generateWithSnapshot = runCodegen.pipe(\n Effect.withSpan(\"Cli.codegen\"),\n);\n\nexport const makeCodegenHandler = (\n duringRestore?: Effect.Effect<void, never, Scope.Scope>,\n) =>\n preserveComponentOutput(generateWithSnapshot, duringRestore).pipe(\n Effect.tap(() => touchConvexSchema),\n Effect.map(({ functionPaths }) => ({ functionPaths })),\n );\n\nexport const codegenHandler = makeCodegenHandler();\n\nexport const updateDeclarations = Effect.fn(\"Cli.updateDeclarations\")(\n function* (\n snapshot: GenerationSnapshot.GenerationSnapshot,\n declarations: Array.NonEmptyReadonlyArray<EntryPoint.Declaration>,\n affectedImpls: ReadonlyArray<ImplModulePath>,\n ) {\n const path = yield* Path.Path;\n const { paths, tables } = EntryPoint.planDeclarations(\n declarations,\n affectedImpls,\n path,\n );\n yield* TableModule.validate(tables);\n return yield* withImplFiles(paths, (leaves) =>\n Effect.gen(function* () {\n yield* rejectComponentNodeGroups(leaves);\n const next = yield* Effect.fromResult(\n GenerationSnapshot.update(snapshot, leaves),\n );\n yield* validateAllImpls(leaves);\n yield* generateGroupRegisteredFunctions(leaves);\n yield* FunctionModule.applyFunctionPlan(\n GenerationSnapshot.diff(snapshot, next),\n );\n return next;\n }),\n );\n },\n);\n\n// Convex components cannot run Node.js functions, at any nesting depth.\nconst validateComponentGroupRuntime = (\n group: GroupSpec.AnyWithProps,\n groupPath: string,\n specPath: string,\n): Result.Result<void, CodegenError.ComponentNodeGroupError> =>\n Result.gen(function* () {\n if (group.runtime === \"Node\") {\n return yield* Result.fail(\n new CodegenError.ComponentNodeGroupError({ specPath, groupPath }),\n );\n }\n for (const [name, child] of Object.entries(group.groups)) {\n yield* validateComponentGroupRuntime(\n child,\n `${groupPath}.${name}`,\n specPath,\n );\n }\n });\n\nconst rejectComponentNodeGroups = Effect.fnUntraced(function* (\n leaves: ReadonlyArray<LoadedLeafModule>,\n) {\n if ((yield* ConvexDirectory.target).kind === \"app\") return;\n yield* Effect.forEach(leaves, (leaf) =>\n Effect.fromResult(\n validateComponentGroupRuntime(\n leaf.spec,\n leaf.groupPathDot,\n leaf.relativePath,\n ),\n ),\n );\n});\n\nconst validateCallbackPrefixes = Effect.fnUntraced(function* (\n declared: Option.Option<App.Any>,\n) {\n if ((yield* ConvexDirectory.target).kind !== \"component\") return;\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const callbacksPath = path.join(yield* ConfectDirectory.get, \"callbacks.ts\");\n if (!(yield* fs.exists(callbacksPath))) return;\n const name = Option.isSome(declared)\n ? Env.name(App.env(declared.value))\n : yield* ConvexConfig.componentName(\n path.join(\n yield* ConvexDirectory.get,\n ConvexConfig.CONVEX_CONFIG_FILENAME,\n ),\n );\n const { module } = yield* Bundler.bundle(callbacksPath).pipe(\n Effect.mapError((error) => fromBundlerError(\"confect/callbacks.ts\", error)),\n );\n for (const contract of Object.values(module)) {\n if (Callback.isContract(contract) && !contract.id.startsWith(`${name}/`)) {\n return yield* new CodegenError.CallbackPrefixError({\n declarationPath: \"confect/callbacks.ts\",\n contractId: contract.id,\n componentName: name,\n });\n }\n }\n});\n\nconst validateComponentConfiguration = Effect.gen(function* () {\n return yield* Match.value((yield* ConvexDirectory.target).kind).pipe(\n Match.when(\"app\", () => Effect.void),\n Match.when(\"component\", () =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const authPath = path.join(confectDirectory, \"auth.ts\");\n if (yield* fs.exists(authPath)) {\n return yield* new CodegenError.InvalidConvexConfigError({\n configPath: authPath,\n reason:\n \"Components cannot configure application authentication. Pass identity explicitly through function arguments.\",\n });\n }\n }),\n ),\n Match.exhaustive,\n );\n});\n\nconst generateComponentContract = Effect.fnUntraced(function* (\n tables: ReadonlyArray<TableModule.TableModule>,\n) {\n return yield* Match.value((yield* ConvexDirectory.target).kind).pipe(\n Match.when(\"app\", () => Effect.void),\n Match.when(\"component\", () =>\n Effect.gen(function* () {\n const path = yield* Path.Path;\n const directory = yield* ConfectDirectory.get;\n const contents = yield* templates.componentContract({\n tableNames: Array.map(tables, (table) => table.tableName),\n });\n yield* writeFileStringAndLog(\n path.join(directory, GENERATED_DIRNAME, \"component.ts\"),\n contents,\n );\n }),\n ),\n Match.exhaustive,\n );\n});\n\nconst generateConfectGeneratedDirectory = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n\n if (!(yield* fs.exists(path.join(confectDirectory, \"_generated\")))) {\n yield* fs.makeDirectory(path.join(confectDirectory, \"_generated\"), {\n recursive: true,\n });\n yield* logFileAdded(path.join(confectDirectory, \"_generated\") + \"/\");\n }\n});\n\nconst removeLegacyFiles = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const legacyPaths = yield* LEGACY_PATHS;\n\n yield* Effect.forEach(\n legacyPaths,\n Effect.fnUntraced(function* (relativePath: string) {\n const absolutePath = path.join(confectDirectory, relativePath);\n if (yield* fs.exists(absolutePath)) {\n yield* removePathIfExists(absolutePath);\n yield* logFileRemoved(absolutePath);\n }\n }),\n );\n});\n\nconst generateAssembledSpecs = Effect.fnUntraced(function* (\n leaves: ReadonlyArray<LeafModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedSpecPath = yield* GENERATED_SPEC_PATH;\n\n // A single assembled spec holds every group regardless of runtime—a Node\n // group's `makeNode()` lives in its imported leaf spec, so the assembled\n // file is runtime-agnostic. Always emit it (even empty) so downstream\n // readers (`loadGeneratedSpec`, `generateRefs`) always find a spec module.\n const nodes = assemblyNodesFromLeaves(leaves);\n const specContents = yield* templates.assembledSpec({ nodes });\n yield* writeFileStringAndLog(\n path.join(confectDirectory, generatedSpecPath),\n specContents,\n );\n});\n\nconst generateGroupRegisteredFunctions = Effect.fnUntraced(function* (\n leaves: ReadonlyArray<LoadedLeafModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n\n yield* Effect.forEach(\n leaves,\n Effect.fnUntraced(function* (leaf: LoadedLeafModule) {\n const registryRelativePath = yield* registeredFunctionsRelativePath(leaf);\n const registryPath = path.join(\n confectDirectory,\n \"_generated\",\n registryRelativePath,\n );\n const registryDir = path.dirname(registryPath);\n const fs = yield* FileSystem.FileSystem;\n if (!(yield* fs.exists(registryDir))) {\n yield* fs.makeDirectory(registryDir, { recursive: true });\n }\n\n const implRelativePath = yield* implPathForSpec(leaf.relativePath);\n const schemaImportPath = yield* toModuleImportPath(\n path.relative(\n path.dirname(registryPath),\n path.join(confectDirectory, \"_generated\", \"schema.ts\"),\n ),\n );\n // The group's own leaf spec (sibling of its impl), referenced\n // type-only by the registry to shape its returned record.\n const specImportPath = yield* toModuleImportPath(\n path.relative(\n path.dirname(registryPath),\n path.join(confectDirectory, leaf.relativePath),\n ),\n );\n const implImportPath = yield* toModuleImportPath(\n path.relative(\n path.dirname(registryPath),\n path.join(confectDirectory, implRelativePath),\n ),\n );\n\n const contents = yield* templates.registeredFunctionsForGroup({\n spec: leaf.spec,\n schemaImportPath,\n specImportPath,\n implImportPath,\n });\n\n yield* writeFileStringAndLog(registryPath, contents);\n }),\n );\n});\n\nconst removeObsoleteRegisteredFunctions = Effect.fnUntraced(function* (\n leaves: ReadonlyArray<LeafModule>,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const registryRoot = path.join(\n confectDirectory,\n \"_generated\",\n \"registeredFunctions\",\n );\n\n if (!(yield* fs.exists(registryRoot))) {\n return;\n }\n\n const expected = new Set(\n yield* Effect.forEach(leaves, (leaf) =>\n registeredFunctionsRelativePath(leaf),\n ),\n );\n\n const existing = yield* fs.readDirectory(registryRoot, { recursive: true });\n yield* Effect.forEach(existing, (relativePath) => {\n if (path.extname(relativePath) !== \".ts\") {\n return Effect.void;\n }\n const normalized = path.join(\"registeredFunctions\", relativePath);\n if (!expected.has(normalized)) {\n return Effect.gen(function* () {\n const absolutePath = path.join(registryRoot, relativePath);\n if (yield* fs.exists(absolutePath)) {\n yield* removePathIfExists(absolutePath);\n yield* logFileRemoved(absolutePath);\n }\n });\n }\n return Effect.void;\n });\n});\n\nconst getGeneratedSpecPath = Effect.gen(function* () {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedSpecPath = yield* GENERATED_SPEC_PATH;\n return path.join(confectDirectory, generatedSpecPath);\n});\n\nconst loadGeneratedSpec = Effect.gen(function* () {\n const specPath = yield* getGeneratedSpecPath;\n const { module: specModule } = yield* Bundler.bundle(specPath);\n const spec = specModule.default;\n\n if (!Spec.isSpec(spec)) {\n return yield* Effect.die(\n new Error(\"_generated/spec.ts does not export a valid Spec\"),\n );\n }\n\n return spec;\n});\n\nconst emptyFunctionPaths = FunctionPaths.FunctionPaths.make(HashSet.empty());\n\nexport const loadPreviousFunctionPaths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const specPath = yield* getGeneratedSpecPath;\n\n if (!(yield* fs.exists(specPath))) {\n return emptyFunctionPaths;\n }\n\n const specResult = yield* loadGeneratedSpec.pipe(Effect.result);\n\n return Result.match(specResult, {\n onFailure: () => emptyFunctionPaths,\n onSuccess: (spec) => FunctionPaths.make(spec),\n });\n});\n\n/**\n * Remove a now-obsolete `_generated/<name>.ts` if present (and log it), for\n * projects upgrading from a version that still emitted it.\n */\nconst removeObsoleteGeneratedFile = Effect.fnUntraced(function* (\n fileName: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const filePath = path.join(confectDirectory, \"_generated\", fileName);\n\n if (yield* fs.exists(filePath)) {\n yield* removePathIfExists(filePath);\n yield* logFileRemoved(filePath);\n }\n});\n\n// `_generated/api.ts` is no longer imported by generated or impl code: impls\n// take the database schema (`_generated/schema`) directly, and per-group\n// registries reference the spec type-only. Remove any stale copy.\nconst removeGeneratedApi = removeObsoleteGeneratedFile(\"api.ts\");\n\n// `_generated/nodeApi.ts` is obsolete for the same reason.\nconst removeGeneratedNodeApi = removeObsoleteGeneratedFile(\"nodeApi.ts\");\n\n/**\n * The user-authored `confect/schema.ts` is no longer supported: codegen now\n * owns both `_generated/schema.ts` (runtime) and `_generated/convexSchema.ts`\n * (deploy), derived from a single scan of `confect/tables/*.ts`. Detect a stray\n * file and fail with a clear migration message—leaving it in place would\n * silently shadow the codegen-owned\n * `_generated/schema.ts`/`_generated/convexSchema.ts`.\n */\nconst rejectLegacySchemaFile = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const legacyPath = path.join(confectDirectory, \"schema.ts\");\n\n if (yield* fs.exists(legacyPath)) {\n return yield* new LegacySchemaFileError({ schemaPath: \"schema.ts\" });\n }\n});\n\n/**\n * Surface a yellow `⚠` warning when codegen sees no tables—either the\n * `confect/tables/` directory is missing or it contains no `.ts` files.\n * Generation still succeeds (emitting an empty `DatabaseSchema` and\n * `defineSchema({})`), since action-only/table-free Confect backends are\n * legal—but the warning catches the much more common case of a typoed directory\n * or files placed under the wrong root.\n */\nconst warnIfNoTables = (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) =>\n tableModules.length === 0\n ? logWarn(\n `No tables discovered in \\`confect/${TableModule.TABLES_DIRNAME}/\\`. ` +\n `Generating an empty schema; add a \\`Table.make(...)\\` module under that ` +\n `directory unless this backend is intentionally tables-free.`,\n )\n : Effect.void;\n\nconst tableModuleBindings = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n generatedFilePath: string,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedDir = path.dirname(generatedFilePath);\n\n const generatedTablesDirname = yield* GENERATED_TABLES_DIRNAME;\n\n return yield* Effect.forEach(\n tableModules,\n Effect.fnUntraced(function* (tableModule: TableModule.TableModule) {\n const wrapperAbsolutePath = path.join(\n confectDirectory,\n generatedTablesDirname,\n `${tableModule.tableName}.ts`,\n );\n const importPath = yield* toModuleImportPath(\n path.relative(generatedDir, wrapperAbsolutePath),\n );\n return {\n importPath,\n tableName: tableModule.tableName,\n };\n }),\n );\n});\n\nconst generateIdConstructor = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedIdPath = yield* GENERATED_ID_PATH;\n const idPath = path.join(confectDirectory, generatedIdPath);\n\n const tableNames = Array.map(\n tableModules,\n (tableModule) => tableModule.tableName,\n );\n const contents = yield* Match.value(yield* ConvexDirectory.target).pipe(\n Match.when({ kind: \"app\" }, () => templates.id({ tableNames })),\n Match.when({ kind: \"component\" }, ({ scope }) =>\n templates.id({ tableNames, scope }),\n ),\n Match.exhaustive,\n );\n\n yield* writeFileStringAndLog(idPath, contents);\n});\n\nconst generateTableWrappers = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedTablesDirname = yield* GENERATED_TABLES_DIRNAME;\n const wrappersDir = path.join(confectDirectory, generatedTablesDirname);\n\n if (!(yield* fs.exists(wrappersDir))) {\n yield* fs.makeDirectory(wrappersDir, { recursive: true });\n }\n\n yield* Effect.forEach(\n tableModules,\n Effect.fnUntraced(function* (tableModule: TableModule.TableModule) {\n const wrapperPath = path.join(\n confectDirectory,\n generatedTablesDirname,\n `${tableModule.tableName}.ts`,\n );\n const unnamedAbsolutePath = path.join(\n confectDirectory,\n tableModule.relativePath,\n );\n const unnamedImportPath = yield* toModuleImportPath(\n path.relative(path.dirname(wrapperPath), unnamedAbsolutePath),\n );\n const contents = yield* templates.tableWrapper({\n tableName: tableModule.tableName,\n unnamedImportPath,\n component: yield* isComponent,\n });\n yield* writeFileStringAndLog(wrapperPath, contents);\n }),\n { concurrency: \"unbounded\" },\n );\n});\n\n/**\n * Remove any stale `_generated/tables/*.ts` wrapper whose source table has been\n * deleted or renamed. Mirrors `removeObsoleteRegisteredFunctions` for the\n * wrapper directory.\n */\nconst removeObsoleteTableWrappers = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedTablesDirname = yield* GENERATED_TABLES_DIRNAME;\n const wrappersDir = path.join(confectDirectory, generatedTablesDirname);\n\n if (!(yield* fs.exists(wrappersDir))) {\n return;\n }\n\n const expected = new Set(\n Array.map(tableModules, (tableModule) => `${tableModule.tableName}.ts`),\n );\n const existing = yield* fs.readDirectory(wrappersDir, { recursive: true });\n yield* Effect.forEach(existing, (entry) => {\n if (path.extname(entry) !== \".ts\") {\n return Effect.void;\n }\n if (!expected.has(entry)) {\n return Effect.gen(function* () {\n const absolutePath = path.join(wrappersDir, entry);\n if (yield* fs.exists(absolutePath)) {\n yield* removePathIfExists(absolutePath);\n yield* logFileRemoved(absolutePath);\n }\n });\n }\n return Effect.void;\n });\n});\n\nconst generateRuntimeSchema = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedSchemaPath = yield* GENERATED_SCHEMA_PATH;\n const schemaPath = path.join(confectDirectory, generatedSchemaPath);\n\n const bindings = yield* tableModuleBindings(tableModules, schemaPath);\n const contents = yield* templates.runtimeSchema({\n tableModules: bindings,\n component: yield* isComponent,\n });\n\n yield* writeFileStringAndLog(schemaPath, contents);\n});\n\nconst generateConvexSchema = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const generatedConvexSchemaPath = yield* GENERATED_CONVEX_SCHEMA_PATH;\n const convexSchemaPath = path.join(\n confectDirectory,\n generatedConvexSchemaPath,\n );\n\n const bindings = yield* tableModuleBindings(tableModules, convexSchemaPath);\n const contents = yield* templates.convexSchema({ tableModules: bindings });\n\n yield* writeFileStringAndLog(convexSchemaPath, contents);\n});\n\nconst generateConvexSchemaReexport = Effect.gen(function* () {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const convexDirectory = yield* ConvexDirectory.get;\n const generatedConvexSchemaRelativePath = yield* GENERATED_CONVEX_SCHEMA_PATH;\n\n const convexSchemaPath = path.join(convexDirectory, \"schema.ts\");\n const generatedConvexSchemaPath = path.join(\n confectDirectory,\n generatedConvexSchemaRelativePath,\n );\n\n const convexSchemaImportPath = yield* toModuleImportPath(\n path.relative(path.dirname(convexSchemaPath), generatedConvexSchemaPath),\n );\n\n const schemaContents = yield* templates.schema({\n convexSchemaImportPath,\n });\n\n yield* writeFileStringAndLog(convexSchemaPath, schemaContents);\n});\n\nconst generateServices = Effect.gen(function* () {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n\n const confectGeneratedDirectory = path.join(confectDirectory, \"_generated\");\n\n const servicesPath = path.join(confectGeneratedDirectory, \"services.ts\");\n const generatedSchemaPath = yield* GENERATED_SCHEMA_PATH;\n const schemaImportPath = yield* toModuleImportPath(\n path.relative(\n path.dirname(servicesPath),\n path.join(confectDirectory, generatedSchemaPath),\n ),\n );\n\n const servicesContentsString = yield* templates.services({\n schemaImportPath,\n component: yield* isComponent,\n });\n\n yield* writeFileStringAndLog(servicesPath, servicesContentsString);\n});\n\n/**\n * Two tables whose names fold to the same PascalCase document type name (e.g.\n * `user_profiles` and `userProfiles` → `UserProfilesDoc`) would emit duplicate\n * interfaces in `_generated/docs.ts`. Catch that up front with a clear error\n * rather than letting `tsc` report a duplicate-identifier later.\n */\nconst validateNoDocNameCollisions = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const collisions = pipe(\n tableModules,\n Array.groupBy((tableModule) =>\n DocName.fromTableName(tableModule.tableName),\n ),\n Record.toEntries,\n Array.filter(([, group]) => group.length > 1),\n Array.map(([docName, group]) => ({\n docName,\n tableNames: Array.map(group, (tableModule) => tableModule.tableName),\n })),\n );\n\n if (Array.isReadonlyArrayNonEmpty(collisions)) {\n return yield* new CodegenError.ConflictingDocNameError({ collisions });\n }\n});\n\nconst generateDocs = Effect.fnUntraced(function* (\n tableModules: ReadonlyArray<TableModule.TableModule>,\n) {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n\n const confectGeneratedDirectory = path.join(confectDirectory, \"_generated\");\n\n const docsPath = path.join(confectGeneratedDirectory, \"docs.ts\");\n const generatedSchemaPath = yield* GENERATED_SCHEMA_PATH;\n const schemaImportPath = yield* toModuleImportPath(\n path.relative(\n path.dirname(docsPath),\n path.join(confectDirectory, generatedSchemaPath),\n ),\n );\n\n const docsContentsString = yield* templates.docs({\n schemaImportPath,\n tables: Array.map(tableModules, (tableModule) => ({\n tableName: tableModule.tableName,\n docName: DocName.fromTableName(tableModule.tableName),\n })),\n });\n\n yield* writeFileStringAndLog(docsPath, docsContentsString);\n});\n\nconst generateRefs = Effect.gen(function* () {\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n\n const confectGeneratedDirectory = path.join(confectDirectory, \"_generated\");\n const refsPath = path.join(confectGeneratedDirectory, \"refs.ts\");\n const refsDir = path.dirname(refsPath);\n const generatedSpecPath = yield* GENERATED_SPEC_PATH;\n\n const specImportPath = yield* toModuleImportPath(\n path.relative(refsDir, path.join(confectDirectory, generatedSpecPath)),\n );\n\n const refsContents = yield* templates.refs({ specImportPath });\n\n yield* writeFileStringAndLog(refsPath, refsContents);\n});\n\n/**\n * Generate `confect/_generated/components.ts`—the typed registry of Convex\n * components installed in `convex/convex.config.ts` (see\n * {@link templates.components}). The file is emitted even when there is no\n * `convex.config.ts` (as an empty registry) so the import surface stays stable.\n * It must exist before loading tables and specs because they may import bound\n * component IDs and schemas.\n */\nexport const generateComponents = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const convexDirectory = yield* ConvexDirectory.get;\n const projectRoot = yield* ProjectRoot.get;\n\n const confectGeneratedDirectory = path.join(\n confectDirectory,\n GENERATED_DIRNAME,\n );\n const generatedComponentsPath = yield* GENERATED_COMPONENTS_PATH;\n const componentsPath = path.join(confectDirectory, generatedComponentsPath);\n\n const convexConfigPath = path.join(\n convexDirectory,\n ConvexConfig.CONVEX_CONFIG_FILENAME,\n );\n\n const installedComponents = (yield* fs.exists(convexConfigPath))\n ? yield* ConvexConfig.discoverInstalledComponents(\n convexConfigPath,\n path.relative(projectRoot, convexConfigPath),\n (yield* ConvexDirectory.target).kind,\n )\n : [];\n\n const contents = yield* templates.components({\n components: Array.map(\n installedComponents,\n ({ name, componentDefinitionPath }) => ({\n name,\n typeImportPath: ConvexConfig.typeImportPath(\n path,\n componentDefinitionPath,\n confectGeneratedDirectory,\n ),\n }),\n ),\n });\n\n yield* writeFileStringAndLog(componentsPath, contents);\n});\n\nconst logGenerated = <E, R>(\n effect: Effect.Effect<\n Option.Option<{\n readonly change: \"Added\" | \"Modified\" | \"Unchanged\";\n readonly convexFilePath: string;\n }>,\n E,\n R\n >,\n) =>\n effect.pipe(\n Effect.tap(\n Option.match({\n onNone: () => Effect.void,\n onSome: ({ change, convexFilePath }) =>\n Match.value(change).pipe(\n Match.when(\"Added\", () => logFileAdded(convexFilePath)),\n Match.when(\"Modified\", () => logFileModified(convexFilePath)),\n Match.when(\"Unchanged\", () => Effect.void),\n Match.exhaustive,\n ),\n }),\n ),\n );\n\n/**\n * Test-only imports never enter the runtime schema or function wrappers.\n */\nconst quote = (value: string) => JSON.stringify(value);\n\nconst generateTesting = Effect.fnUntraced(function* (app: App.Any) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const confectDirectory = yield* ConfectDirectory.get;\n const convexDirectory = yield* ConvexDirectory.get;\n const generated = path.join(confectDirectory, \"_generated\");\n const relative = (file: string) => {\n const value = path.relative(generated, file).split(path.sep).join(\"/\");\n return value.startsWith(\".\") ? value : `./${value}`;\n };\n const imports = [\n 'import schema from \"./schema.js\";',\n 'import convexSchema from \"./convexSchema.js\";',\n ];\n const moduleMap = Effect.fnUntraced(function* (directory: string) {\n const files = (yield* fs.readDirectory(directory, { recursive: true }))\n .filter(\n (file) =>\n /\\.[cm]?[jt]s$/.test(file) &&\n !file.endsWith(\".d.ts\") &&\n !file.split(path.sep).includes(\"_generated\") &&\n !file.includes(\".config.\"),\n )\n .sort();\n return `{ \"_generated/testing.ts\": () => Promise.resolve({}),\\n${files\n .map((file) => {\n const specifier = relative(path.join(directory, file));\n return `${quote(file.split(path.sep).join(\"/\"))}: () => import(${quote(specifier.replace(/\\.([cm]?)[jt]s$/, \".$1js\"))}),`;\n })\n .join(\"\\n\")}\\n}`;\n });\n const declarations: Array<string> = [];\n const identifiers = new Set([\"schema\", \"convexSchema\"]);\n const components: Array<string> = [];\n const httpMounts: Array<string> = [];\n const kits = new Map<string, string>();\n const visit = Effect.fnUntraced(function* (\n directory: string,\n prefix: string,\n kind: \"app\" | \"component\",\n parentHttpPrefix: string | undefined,\n ): Effect.fn.Return<\n void,\n | PlatformError.PlatformError\n | BuildError\n | CodegenError.InvalidConvexConfigError,\n FileSystem.FileSystem | Path.Path\n > {\n const config = path.join(directory, ConvexConfig.CONVEX_CONFIG_FILENAME);\n if (!(yield* fs.exists(config))) return;\n const installed = yield* ConvexConfig.discoverInstalledComponents(\n config,\n relative(config),\n kind,\n );\n for (const component of installed) {\n const name = prefix + component.name;\n // A bare definition belongs to another package. Its directory is read\n // here but never written out; tests reach it through `<package>/test`.\n const fromPackage = !path.isAbsolute(component.componentDefinitionPath);\n const resolved = fromPackage\n ? path.dirname(\n yield* ConvexConfig.resolveDefinition(\n `${component.componentDefinitionPath}/convex.config`,\n config,\n path,\n ).pipe(\n Effect.fromOption,\n Effect.mapError(\n () =>\n new CodegenError.InvalidConvexConfigError({\n configPath: relative(config),\n reason: `Cannot resolve component ${component.componentDefinitionPath} for testing.`,\n }),\n ),\n ),\n )\n : component.componentDefinitionPath;\n const localPrefix =\n prefix === \"\"\n ? App.mounts(app).find((mount) => mount.name === component.name)\n ?.httpPrefix\n : component.httpPrefix;\n const httpPrefix =\n parentHttpPrefix === undefined || localPrefix === undefined\n ? undefined\n : `${parentHttpPrefix.replace(/\\/+$/, \"\")}${localPrefix}`.replace(\n /\\/+$/,\n \"\",\n ) || \"/\";\n if (\n httpPrefix !== undefined &&\n ((yield* fs.exists(path.join(resolved, \"http.ts\"))) ||\n (yield* fs.exists(path.join(resolved, \"http.js\"))))\n ) {\n httpMounts.push(\n `{ componentPath: ${quote(name)}, httpPrefix: ${quote(httpPrefix)} }`,\n );\n }\n let identifier = kits.get(resolved);\n if (identifier === undefined) {\n const cleaned = name.replaceAll(/[^A-Za-z0-9_$]/g, \"_\");\n const base = /^[A-Za-z_$]/.test(cleaned) ? cleaned : `_${cleaned}`;\n identifier = `${base}Kit`;\n let schemaIdentifier = `${base}Schema`;\n for (\n let n = 2;\n identifiers.has(identifier) || identifiers.has(schemaIdentifier);\n n++\n ) {\n identifier = `${base}Kit${n}`;\n schemaIdentifier = `${base}Schema${n}`;\n }\n identifiers.add(identifier);\n identifiers.add(schemaIdentifier);\n kits.set(resolved, identifier);\n if (fromPackage) {\n const testEntry = `${component.componentDefinitionPath}/test`;\n if (Option.isNone(Bundler.resolveModule(testEntry, config))) {\n return yield* new CodegenError.InvalidConvexConfigError({\n configPath: relative(config),\n reason: `the component package ${quote(component.componentDefinitionPath)} has no ${quote(testEntry)} export. Tests register a component from another package through that entry's \\`register(t, name)\\`.`,\n });\n }\n imports.push(`import * as ${identifier} from ${quote(testEntry)};`);\n } else {\n imports.push(\n `import ${schemaIdentifier} from ${quote(relative(path.join(resolved, \"schema.js\")))};`,\n );\n declarations.push(\n `const ${identifier} = { schema: ${schemaIdentifier}, modules: ${yield* moduleMap(resolved)} };`,\n );\n }\n }\n components.push(`${quote(name)}: ${identifier},`);\n // A package's `register` installs its own children.\n if (!fromPackage) {\n yield* visit(resolved, `${name}/`, \"component\", httpPrefix);\n }\n }\n });\n yield* visit(convexDirectory, \"\", (yield* ConvexDirectory.target).kind, \"\");\n yield* writeFileStringAndLog(\n path.join(generated, \"testing.ts\"),\n [\n \"// Generated by `confect codegen`. Test-only; do not import in backend functions.\",\n ...imports,\n ...declarations,\n `export default { httpMounts: [${httpMounts.join(\",\")}], schema, convexSchema, modules: ${yield* moduleMap(convexDirectory)}, components: {${components.join(\"\\n\")}} };`,\n ].join(\"\\n\"),\n );\n});\n"],"mappings":"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"}
|
|
@@ -94,7 +94,7 @@ const componentImport = Effect.fnUntraced(function* () {
|
|
|
94
94
|
const convexDirectory = yield* ConvexDirectory.get;
|
|
95
95
|
return (definition) => Option.map(componentImportOf(definition), (recorded) => {
|
|
96
96
|
const bare = !recorded.specifier.startsWith(".") && !path.isAbsolute(recorded.specifier);
|
|
97
|
-
const relative = toPosixPath(path, path.relative(convexDirectory, recorded.path)).replace(/\.[cm]?[jt]s$/, "");
|
|
97
|
+
const relative = toPosixPath(path, path.relative(convexDirectory, recorded.path)).replace(/\.([cm]?)[jt]s$/, ".$1js");
|
|
98
98
|
return {
|
|
99
99
|
importPath: bare ? recorded.specifier : relative.startsWith(".") ? relative : `./${relative}`,
|
|
100
100
|
componentName: Predicate.hasProperty(definition, "defaultName") && Predicate.isString(definition.defaultName) ? definition.defaultName : "component"
|
|
@@ -143,9 +143,10 @@ const writeDeclaration = Effect.gen(function* () {
|
|
|
143
143
|
})), Effect.fromResult);
|
|
144
144
|
const convexConfigPath = path.join(convexDirectory, CONVEX_CONFIG_FILENAME);
|
|
145
145
|
const authConfigPath = path.join(convexDirectory, "auth.config.ts");
|
|
146
|
-
const
|
|
146
|
+
const authImportPath = yield* toModuleImportPath(path.relative(convexDirectory, authPath));
|
|
147
|
+
const legacyAuthConfigs = yield* Effect.forEach([authImportPath, authImportPath.replace(/\.js$/, "")], (importPath) => authConfig({ authImportPath: importPath }));
|
|
147
148
|
yield* assertOwned(convexConfigPath, "app.ts", []);
|
|
148
|
-
yield* assertOwned(authConfigPath, "auth.ts",
|
|
149
|
+
yield* assertOwned(authConfigPath, "auth.ts", legacyAuthConfigs);
|
|
149
150
|
if (target === "app") {
|
|
150
151
|
const digest$1 = digest({
|
|
151
152
|
files: yield* declarationInputs([app, ...Option.toArray(auth)]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declaration.mjs","names":["Bundler.bundle","ConvexConfig.componentConfigPlugin","Declaration.isGenerated","Bundler.resolveModule","ConvexConfig.componentImportOf","Declaration.parse","Declaration.fileOf","ConvexConfig.CONVEX_CONFIG_FILENAME","templates.authConfig","digest","Declaration.digest","Declaration.manifest","Declaration.convexConfig","Declaration.authConfig","templates.http","http","templates.declaredHttp"],"sources":["../../src/confect/declaration.ts"],"sourcesContent":["import { App, Http } from \"@confect/core\";\nimport * as Effect from \"effect/Effect\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Option from \"effect/Option\";\nimport * as Path from \"effect/Path\";\nimport * as Predicate from \"effect/Predicate\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport { fromBundlerError } from \"../BuildError\";\nimport * as Bundler from \"../Bundler\";\nimport {\n HandWrittenConvexFileError,\n DeclarationKindMismatchError,\n InvalidDeclarationError,\n} from \"../CodegenError\";\nimport { ConfectDirectory } from \"../ConfectDirectory\";\nimport * as ConvexConfig from \"../ConvexConfig\";\nimport { ConvexDirectory } from \"../ConvexDirectory\";\nimport * as Declaration from \"../Declaration\";\nimport { logFileRemoved } from \"../log\";\nimport { ProjectRoot } from \"../ProjectRoot\";\nimport * as templates from \"../templates\";\nimport {\n removePathIfExists,\n toModuleImportPath,\n toPosixPath,\n writeFileString,\n writeFileStringAndLog,\n} from \"../utils\";\n\n/**\n * Bumped when the generated files change shape, so a manifest written by an\n * older generator never matches a current one.\n */\nconst GENERATOR_FORMAT = \"1\";\n\nconst confectPath = Effect.fnUntraced(function* (file: string) {\n const path = yield* Path.Path;\n return path.join(yield* ConfectDirectory.get, file);\n});\n\n/**\n * A backend opts in to the declaration by writing `confect/app.ts`.\n */\nexport const isDeclared = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n return yield* fs.exists(yield* confectPath(\"app.ts\"));\n});\n\nconst displayPath = Effect.fnUntraced(function* (absolutePath: string) {\n const path = yield* Path.Path;\n return toPosixPath(path, path.relative(yield* ProjectRoot.get, absolutePath));\n});\n\nconst bundleDeclaration = Effect.fnUntraced(function* (file: string) {\n const path = yield* Path.Path;\n const absolutePath = yield* confectPath(file);\n return yield* Bundler.bundle(absolutePath, {\n plugins: [ConvexConfig.componentConfigPlugin(path)],\n }).pipe(\n Effect.mapError((error) => fromBundlerError(`confect/${file}`, error)),\n );\n});\n\nconst invalid = (file: string) => (error: { readonly message: string }) =>\n new InvalidDeclarationError({\n declarationPath: `confect/${file}`,\n reason: error.message,\n });\n\n/**\n * Fail instead of overwriting a Convex file someone wrote by hand. A file with\n * the generated header, or one of the exact files an earlier codegen wrote\n * there, is ours to replace.\n */\nconst assertOwned = Effect.fnUntraced(function* (\n convexPath: string,\n declarationFile: string,\n legacy: ReadonlyArray<string>,\n) {\n const fs = yield* FileSystem.FileSystem;\n if (!(yield* fs.exists(convexPath))) return;\n if (Declaration.isGenerated(yield* fs.readFileString(convexPath), legacy)) {\n return;\n }\n return yield* new HandWrittenConvexFileError({\n convexPath: yield* displayPath(convexPath),\n declarationPath: `confect/${declarationFile}`,\n });\n});\n\nconst decodeVersion = Schema.decodeUnknownOption(\n Schema.fromJsonString(Schema.Struct({ version: Schema.String })),\n);\n\nconst packageVersion = Effect.fnUntraced(function* (\n name: string,\n from: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n return yield* Option.match(\n Bundler.resolveModule(`${name}/package.json`, path.join(from, \"_\")),\n {\n onNone: () => Effect.succeed(\"unresolved\"),\n onSome: (packageJson) =>\n fs.readFileString(packageJson).pipe(\n Effect.map((contents) =>\n Option.match(decodeVersion(contents), {\n onNone: () => \"unknown\",\n onSome: ({ version }) => version,\n }),\n ),\n ),\n },\n );\n});\n\n/**\n * Every first-party file the declaration modules import, by project-relative\n * path and contents. Files under `node_modules` and outside the project count\n * through package versions instead, so rebuilding a dependency does not change\n * the digest.\n */\nconst declarationInputs = Effect.fnUntraced(function* (\n bundles: ReadonlyArray<Bundler.Bundled>,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const projectRoot = yield* ProjectRoot.get;\n const files = new Set<string>();\n for (const { metafile } of bundles) {\n for (const input of Object.keys(metafile.inputs)) {\n const relative = path.relative(projectRoot, input);\n if (\n path.isAbsolute(input) &&\n !relative.startsWith(\"..\") &&\n !relative.split(path.sep).includes(\"node_modules\")\n ) {\n files.add(input);\n }\n }\n }\n // Plugin namespaces (component config wrappers) appear as inputs too;\n // only real files count.\n const real = yield* Effect.filter([...files], (file) => fs.exists(file));\n return yield* Effect.forEach(real, (file) =>\n fs\n .readFileString(file)\n .pipe(\n Effect.map(\n (contents) =>\n [\n toPosixPath(path, path.relative(projectRoot, file)),\n contents,\n ] as const,\n ),\n ),\n );\n});\n\nconst componentImport = Effect.fnUntraced(function* () {\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n return (definition: unknown): Option.Option<Declaration.ComponentImport> =>\n Option.map(ConvexConfig.componentImportOf(definition), (recorded) => {\n const bare =\n !recorded.specifier.startsWith(\".\") &&\n !path.isAbsolute(recorded.specifier);\n const relative = toPosixPath(\n path,\n path.relative(convexDirectory, recorded.path),\n ).replace(/\\.[cm]?[jt]s$/, \"\");\n return {\n importPath: bare\n ? recorded.specifier\n : relative.startsWith(\".\")\n ? relative\n : `./${relative}`,\n componentName:\n Predicate.hasProperty(definition, \"defaultName\") &&\n Predicate.isString(definition.defaultName)\n ? definition.defaultName\n : \"component\",\n };\n });\n});\n\nconst manifestPath = Effect.gen(function* () {\n const path = yield* Path.Path;\n return path.join(yield* ConfectDirectory.get, \"_generated\", \"manifest.ts\");\n});\n\n/**\n * Remove a file codegen wrote whose source is gone; leave anything else.\n */\nconst removeGenerated = Effect.fnUntraced(function* (\n filePath: string,\n legacy: ReadonlyArray<string>,\n) {\n const fs = yield* FileSystem.FileSystem;\n if (!(yield* fs.exists(filePath))) return;\n if (!Declaration.isGenerated(yield* fs.readFileString(filePath), legacy)) {\n return;\n }\n yield* removePathIfExists(filePath);\n yield* logFileRemoved(filePath);\n});\n\nconst removeManifest = Effect.gen(function* () {\n yield* removeGenerated(yield* manifestPath, []);\n});\n\nconst writeDeclaration = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n const projectRoot = yield* ProjectRoot.get;\n const target = (yield* ConvexDirectory.target).kind;\n\n const app = yield* bundleDeclaration(\"app.ts\");\n const appValue: unknown = app.module.default;\n if (App.isApp(appValue) && appValue.kind !== target) {\n return yield* new DeclarationKindMismatchError({\n declarationPath: \"confect/app.ts\",\n declaredKind: appValue.kind,\n targetKind: target,\n });\n }\n const authPath = yield* confectPath(\"auth.ts\");\n const auth = (yield* fs.exists(authPath))\n ? Option.some(yield* bundleDeclaration(\"auth.ts\"))\n : Option.none();\n\n const declaration = yield* Declaration.parse({\n target,\n app: app.module.default,\n auth: Option.map(auth, ({ module }) => module.default),\n componentImport: yield* componentImport(),\n }).pipe(\n Result.mapError(\n (error) =>\n new InvalidDeclarationError({\n declarationPath: Declaration.fileOf(error),\n reason: error.message,\n }),\n ),\n Effect.fromResult,\n );\n\n const convexConfigPath = path.join(\n convexDirectory,\n ConvexConfig.CONVEX_CONFIG_FILENAME,\n );\n const authConfigPath = path.join(convexDirectory, \"auth.config.ts\");\n const legacyAuthConfig = yield* templates.authConfig({\n authImportPath: yield* toModuleImportPath(\n path.relative(convexDirectory, authPath),\n ),\n });\n yield* assertOwned(convexConfigPath, \"app.ts\", []);\n yield* assertOwned(authConfigPath, \"auth.ts\", [legacyAuthConfig]);\n\n if (target === \"app\") {\n const digest = Declaration.digest({\n files: yield* declarationInputs([app, ...Option.toArray(auth)]),\n versions: [\n [\"convex\", yield* packageVersion(\"convex\", projectRoot)],\n [\"@confect/cli generator format\", GENERATOR_FORMAT],\n ],\n });\n yield* writeFileStringAndLog(\n yield* manifestPath,\n Declaration.manifest(declaration, digest),\n );\n }\n yield* writeFileStringAndLog(\n convexConfigPath,\n Declaration.convexConfig(declaration),\n );\n yield* Option.match(declaration.providers, {\n onNone: () =>\n Effect.gen(function* () {\n if (yield* fs.exists(authConfigPath)) {\n yield* removePathIfExists(authConfigPath);\n yield* logFileRemoved(authConfigPath);\n }\n }),\n onSome: (providers) =>\n writeFileStringAndLog(authConfigPath, Declaration.authConfig(providers)),\n });\n return App.isApp(appValue) ? Option.some(appValue) : Option.none<App.Any>();\n});\n\n/**\n * Write the declaration's Convex files and manifest from `confect/app.ts`,\n * `confect/env.ts` and `confect/auth.ts`, before anything else is validated. On\n * any failure the previous manifest is removed, so a stale manifest never\n * outlives a declaration that no longer produces it.\n */\nexport const syncDeclaration = Effect.gen(function* () {\n if (!(yield* isDeclared)) {\n yield* removeManifest;\n return Option.none<App.Any>();\n }\n return yield* writeDeclaration.pipe(Effect.tapError(() => removeManifest));\n});\n\n/**\n * Check every HTTP route the backend serves and write `convex/http.ts` from\n * `confect/http.ts`. Runs after generation, because `http.ts` imports its\n * handlers, which import generated services.\n */\nexport const syncDeclaredHttp = (app: App.Any) =>\n checkAndWriteHttp(app).pipe(Effect.tapError(() => removeManifest));\n\nconst checkAndWriteHttp = Effect.fnUntraced(function* (app: App.Any) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n const confectDirectory = yield* ConfectDirectory.get;\n const httpPath = yield* confectPath(\"http.ts\");\n\n const convexHttpPath = path.join(convexDirectory, \"http.ts\");\n if (!(yield* fs.exists(httpPath))) {\n yield* Http.routes(app).pipe(\n Result.mapError(invalid(\"app.ts\")),\n Effect.fromResult,\n );\n yield* removeGenerated(convexHttpPath, [\n yield* templates.http({\n httpImportPath: yield* toModuleImportPath(\n path.relative(convexDirectory, httpPath),\n ),\n }),\n ]);\n return Option.none();\n }\n\n const http = (yield* bundleDeclaration(\"http.ts\")).module.default;\n if (!Http.isHttp(http)) {\n return yield* new InvalidDeclarationError({\n declarationPath: \"confect/http.ts\",\n reason: \"it must default-export Http.make(...).\",\n });\n }\n yield* Http.routes(app, http).pipe(\n Result.mapError(invalid(\"http.ts\")),\n Effect.fromResult,\n );\n\n const contents = yield* templates.declaredHttp({\n schemaImportPath: yield* toModuleImportPath(\n path.relative(\n convexDirectory,\n path.join(confectDirectory, \"_generated\", \"schema.ts\"),\n ),\n ),\n httpImportPath: yield* toModuleImportPath(\n path.relative(convexDirectory, httpPath),\n ),\n });\n const change = yield* writeFileString(convexHttpPath, contents);\n return Option.some({ change, convexFilePath: convexHttpPath });\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"declaration.mjs","names":["Bundler.bundle","ConvexConfig.componentConfigPlugin","Declaration.isGenerated","Bundler.resolveModule","ConvexConfig.componentImportOf","Declaration.parse","Declaration.fileOf","ConvexConfig.CONVEX_CONFIG_FILENAME","templates.authConfig","digest","Declaration.digest","Declaration.manifest","Declaration.convexConfig","Declaration.authConfig","templates.http","http","templates.declaredHttp"],"sources":["../../src/confect/declaration.ts"],"sourcesContent":["import { App, Http } from \"@confect/core\";\nimport * as Effect from \"effect/Effect\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Option from \"effect/Option\";\nimport * as Path from \"effect/Path\";\nimport * as Predicate from \"effect/Predicate\";\nimport * as Result from \"effect/Result\";\nimport * as Schema from \"effect/Schema\";\nimport { fromBundlerError } from \"../BuildError.js\";\nimport * as Bundler from \"../Bundler.js\";\nimport {\n HandWrittenConvexFileError,\n DeclarationKindMismatchError,\n InvalidDeclarationError,\n} from \"../CodegenError.js\";\nimport { ConfectDirectory } from \"../ConfectDirectory.js\";\nimport * as ConvexConfig from \"../ConvexConfig.js\";\nimport { ConvexDirectory } from \"../ConvexDirectory.js\";\nimport * as Declaration from \"../Declaration.js\";\nimport { logFileRemoved } from \"../log.js\";\nimport { ProjectRoot } from \"../ProjectRoot.js\";\nimport * as templates from \"../templates.js\";\nimport {\n removePathIfExists,\n toModuleImportPath,\n toPosixPath,\n writeFileString,\n writeFileStringAndLog,\n} from \"../utils.js\";\n\n/**\n * Bumped when the generated files change shape, so a manifest written by an\n * older generator never matches a current one.\n */\nconst GENERATOR_FORMAT = \"1\";\n\nconst confectPath = Effect.fnUntraced(function* (file: string) {\n const path = yield* Path.Path;\n return path.join(yield* ConfectDirectory.get, file);\n});\n\n/**\n * A backend opts in to the declaration by writing `confect/app.ts`.\n */\nexport const isDeclared = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n return yield* fs.exists(yield* confectPath(\"app.ts\"));\n});\n\nconst displayPath = Effect.fnUntraced(function* (absolutePath: string) {\n const path = yield* Path.Path;\n return toPosixPath(path, path.relative(yield* ProjectRoot.get, absolutePath));\n});\n\nconst bundleDeclaration = Effect.fnUntraced(function* (file: string) {\n const path = yield* Path.Path;\n const absolutePath = yield* confectPath(file);\n return yield* Bundler.bundle(absolutePath, {\n plugins: [ConvexConfig.componentConfigPlugin(path)],\n }).pipe(\n Effect.mapError((error) => fromBundlerError(`confect/${file}`, error)),\n );\n});\n\nconst invalid = (file: string) => (error: { readonly message: string }) =>\n new InvalidDeclarationError({\n declarationPath: `confect/${file}`,\n reason: error.message,\n });\n\n/**\n * Fail instead of overwriting a Convex file someone wrote by hand. A file with\n * the generated header, or one of the exact files an earlier codegen wrote\n * there, is ours to replace.\n */\nconst assertOwned = Effect.fnUntraced(function* (\n convexPath: string,\n declarationFile: string,\n legacy: ReadonlyArray<string>,\n) {\n const fs = yield* FileSystem.FileSystem;\n if (!(yield* fs.exists(convexPath))) return;\n if (Declaration.isGenerated(yield* fs.readFileString(convexPath), legacy)) {\n return;\n }\n return yield* new HandWrittenConvexFileError({\n convexPath: yield* displayPath(convexPath),\n declarationPath: `confect/${declarationFile}`,\n });\n});\n\nconst decodeVersion = Schema.decodeUnknownOption(\n Schema.fromJsonString(Schema.Struct({ version: Schema.String })),\n);\n\nconst packageVersion = Effect.fnUntraced(function* (\n name: string,\n from: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n return yield* Option.match(\n Bundler.resolveModule(`${name}/package.json`, path.join(from, \"_\")),\n {\n onNone: () => Effect.succeed(\"unresolved\"),\n onSome: (packageJson) =>\n fs.readFileString(packageJson).pipe(\n Effect.map((contents) =>\n Option.match(decodeVersion(contents), {\n onNone: () => \"unknown\",\n onSome: ({ version }) => version,\n }),\n ),\n ),\n },\n );\n});\n\n/**\n * Every first-party file the declaration modules import, by project-relative\n * path and contents. Files under `node_modules` and outside the project count\n * through package versions instead, so rebuilding a dependency does not change\n * the digest.\n */\nconst declarationInputs = Effect.fnUntraced(function* (\n bundles: ReadonlyArray<Bundler.Bundled>,\n) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const projectRoot = yield* ProjectRoot.get;\n const files = new Set<string>();\n for (const { metafile } of bundles) {\n for (const input of Object.keys(metafile.inputs)) {\n const relative = path.relative(projectRoot, input);\n if (\n path.isAbsolute(input) &&\n !relative.startsWith(\"..\") &&\n !relative.split(path.sep).includes(\"node_modules\")\n ) {\n files.add(input);\n }\n }\n }\n // Plugin namespaces (component config wrappers) appear as inputs too;\n // only real files count.\n const real = yield* Effect.filter([...files], (file) => fs.exists(file));\n return yield* Effect.forEach(real, (file) =>\n fs\n .readFileString(file)\n .pipe(\n Effect.map(\n (contents) =>\n [\n toPosixPath(path, path.relative(projectRoot, file)),\n contents,\n ] as const,\n ),\n ),\n );\n});\n\nconst componentImport = Effect.fnUntraced(function* () {\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n return (definition: unknown): Option.Option<Declaration.ComponentImport> =>\n Option.map(ConvexConfig.componentImportOf(definition), (recorded) => {\n const bare =\n !recorded.specifier.startsWith(\".\") &&\n !path.isAbsolute(recorded.specifier);\n const relative = toPosixPath(\n path,\n path.relative(convexDirectory, recorded.path),\n ).replace(/\\.([cm]?)[jt]s$/, \".$1js\");\n return {\n importPath: bare\n ? recorded.specifier\n : relative.startsWith(\".\")\n ? relative\n : `./${relative}`,\n componentName:\n Predicate.hasProperty(definition, \"defaultName\") &&\n Predicate.isString(definition.defaultName)\n ? definition.defaultName\n : \"component\",\n };\n });\n});\n\nconst manifestPath = Effect.gen(function* () {\n const path = yield* Path.Path;\n return path.join(yield* ConfectDirectory.get, \"_generated\", \"manifest.ts\");\n});\n\n/**\n * Remove a file codegen wrote whose source is gone; leave anything else.\n */\nconst removeGenerated = Effect.fnUntraced(function* (\n filePath: string,\n legacy: ReadonlyArray<string>,\n) {\n const fs = yield* FileSystem.FileSystem;\n if (!(yield* fs.exists(filePath))) return;\n if (!Declaration.isGenerated(yield* fs.readFileString(filePath), legacy)) {\n return;\n }\n yield* removePathIfExists(filePath);\n yield* logFileRemoved(filePath);\n});\n\nconst removeManifest = Effect.gen(function* () {\n yield* removeGenerated(yield* manifestPath, []);\n});\n\nconst writeDeclaration = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n const projectRoot = yield* ProjectRoot.get;\n const target = (yield* ConvexDirectory.target).kind;\n\n const app = yield* bundleDeclaration(\"app.ts\");\n const appValue: unknown = app.module.default;\n if (App.isApp(appValue) && appValue.kind !== target) {\n return yield* new DeclarationKindMismatchError({\n declarationPath: \"confect/app.ts\",\n declaredKind: appValue.kind,\n targetKind: target,\n });\n }\n const authPath = yield* confectPath(\"auth.ts\");\n const auth = (yield* fs.exists(authPath))\n ? Option.some(yield* bundleDeclaration(\"auth.ts\"))\n : Option.none();\n\n const declaration = yield* Declaration.parse({\n target,\n app: app.module.default,\n auth: Option.map(auth, ({ module }) => module.default),\n componentImport: yield* componentImport(),\n }).pipe(\n Result.mapError(\n (error) =>\n new InvalidDeclarationError({\n declarationPath: Declaration.fileOf(error),\n reason: error.message,\n }),\n ),\n Effect.fromResult,\n );\n\n const convexConfigPath = path.join(\n convexDirectory,\n ConvexConfig.CONVEX_CONFIG_FILENAME,\n );\n const authConfigPath = path.join(convexDirectory, \"auth.config.ts\");\n const authImportPath = yield* toModuleImportPath(\n path.relative(convexDirectory, authPath),\n );\n const legacyAuthConfigs = yield* Effect.forEach(\n [authImportPath, authImportPath.replace(/\\.js$/, \"\")],\n (importPath) => templates.authConfig({ authImportPath: importPath }),\n );\n yield* assertOwned(convexConfigPath, \"app.ts\", []);\n yield* assertOwned(authConfigPath, \"auth.ts\", legacyAuthConfigs);\n\n if (target === \"app\") {\n const digest = Declaration.digest({\n files: yield* declarationInputs([app, ...Option.toArray(auth)]),\n versions: [\n [\"convex\", yield* packageVersion(\"convex\", projectRoot)],\n [\"@confect/cli generator format\", GENERATOR_FORMAT],\n ],\n });\n yield* writeFileStringAndLog(\n yield* manifestPath,\n Declaration.manifest(declaration, digest),\n );\n }\n yield* writeFileStringAndLog(\n convexConfigPath,\n Declaration.convexConfig(declaration),\n );\n yield* Option.match(declaration.providers, {\n onNone: () =>\n Effect.gen(function* () {\n if (yield* fs.exists(authConfigPath)) {\n yield* removePathIfExists(authConfigPath);\n yield* logFileRemoved(authConfigPath);\n }\n }),\n onSome: (providers) =>\n writeFileStringAndLog(authConfigPath, Declaration.authConfig(providers)),\n });\n return App.isApp(appValue) ? Option.some(appValue) : Option.none<App.Any>();\n});\n\n/**\n * Write the declaration's Convex files and manifest from `confect/app.ts`,\n * `confect/env.ts` and `confect/auth.ts`, before anything else is validated. On\n * any failure the previous manifest is removed, so a stale manifest never\n * outlives a declaration that no longer produces it.\n */\nexport const syncDeclaration = Effect.gen(function* () {\n if (!(yield* isDeclared)) {\n yield* removeManifest;\n return Option.none<App.Any>();\n }\n return yield* writeDeclaration.pipe(Effect.tapError(() => removeManifest));\n});\n\n/**\n * Check every HTTP route the backend serves and write `convex/http.ts` from\n * `confect/http.ts`. Runs after generation, because `http.ts` imports its\n * handlers, which import generated services.\n */\nexport const syncDeclaredHttp = (app: App.Any) =>\n checkAndWriteHttp(app).pipe(Effect.tapError(() => removeManifest));\n\nconst checkAndWriteHttp = Effect.fnUntraced(function* (app: App.Any) {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n const confectDirectory = yield* ConfectDirectory.get;\n const httpPath = yield* confectPath(\"http.ts\");\n\n const convexHttpPath = path.join(convexDirectory, \"http.ts\");\n if (!(yield* fs.exists(httpPath))) {\n yield* Http.routes(app).pipe(\n Result.mapError(invalid(\"app.ts\")),\n Effect.fromResult,\n );\n yield* removeGenerated(convexHttpPath, [\n yield* templates.http({\n httpImportPath: yield* toModuleImportPath(\n path.relative(convexDirectory, httpPath),\n ),\n }),\n ]);\n return Option.none();\n }\n\n const http = (yield* bundleDeclaration(\"http.ts\")).module.default;\n if (!Http.isHttp(http)) {\n return yield* new InvalidDeclarationError({\n declarationPath: \"confect/http.ts\",\n reason: \"it must default-export Http.make(...).\",\n });\n }\n yield* Http.routes(app, http).pipe(\n Result.mapError(invalid(\"http.ts\")),\n Effect.fromResult,\n );\n\n const contents = yield* templates.declaredHttp({\n schemaImportPath: yield* toModuleImportPath(\n path.relative(\n convexDirectory,\n path.join(confectDirectory, \"_generated\", \"schema.ts\"),\n ),\n ),\n httpImportPath: yield* toModuleImportPath(\n path.relative(convexDirectory, httpPath),\n ),\n });\n const change = yield* writeFileString(convexHttpPath, contents);\n return Option.some({ change, convexFilePath: convexHttpPath });\n});\n"],"mappings":"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"}
|
package/dist/confect/dev.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.mjs","names":["Ansi.green","Ansi.red","Ansi.magenta","Ansi.blackBright","FunctionPaths.diff","Evaluation.loadPreviousFunctionPaths","Watcher.make","DirectoryOptions.flags","DirectoryOptions.layer","SyncState.isDirty","SyncState.forBackend","SyncState.plan","GenerationSnapshot.functionPaths","Evaluation.catchAndLog","Watcher.isRefreshSuccessful","Evaluation.EvaluationError","validate","Evaluation.validate","Evaluation.generateSnapshot","Evaluation.updateDeclarations","SyncState.transition","SyncState.shouldRetry","SyncState.needsDeploymentNotification"],"sources":["../../src/confect/dev.ts"],"sourcesContent":["import * as Command from \"effect/cli/Command\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport { pipe } from \"effect/Function\";\nimport * as Array from \"effect/Array\";\nimport * as Console from \"effect/Console\";\nimport * as Effect from \"effect/Effect\";\nimport * as Equal from \"effect/Equal\";\nimport * as HashSet from \"effect/HashSet\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as Ref from \"effect/Ref\";\nimport * as Result from \"effect/Result\";\nimport * as String from \"effect/String\";\nimport type * as esbuild from \"esbuild\";\nimport * as Ansi from \"../Ansi\";\nimport { renderCodegenError } from \"../CodegenError\";\nimport * as SyncState from \"../SyncState\";\nimport type { OptionalFile } from \"../EntryPoint\";\nimport * as Watcher from \"../Watcher\";\nimport * as Evaluation from \"../Evaluation\";\nimport { ConvexDirectory } from \"../ConvexDirectory\";\nimport * as DirectoryOptions from \"../DirectoryOptions\";\nimport * as FunctionPaths from \"../FunctionPaths\";\nimport * as GenerationSnapshot from \"../GenerationSnapshot\";\nimport type { ImplModulePath } from \"../ImplModulePath\";\nimport type * as GroupPath from \"../GroupPath\";\nimport type * as GroupPaths from \"../GroupPaths\";\nimport {\n logCoalescedBuildErrors,\n logCoalescedBuildWarnings,\n logFunctionAdded,\n logFunctionRemoved,\n logPending,\n logSuccess,\n} from \"../log\";\nimport { ProjectRoot } from \"../ProjectRoot\";\nimport { preserveComponentOutput } from \"../Rollback\";\nimport {\n generateAuthConfig,\n generateCrons,\n generateHttp,\n touchConvexSchema,\n} from \"../utils\";\nimport { isDeclared } from \"./declaration\";\n\nconst changeChar = (change: \"Added\" | \"Removed\" | \"Modified\") =>\n Match.value(change).pipe(\n Match.when(\"Added\", () => ({ char: \"+\", color: Ansi.green })),\n Match.when(\"Removed\", () => ({ char: \"-\", color: Ansi.red })),\n Match.when(\"Modified\", () => ({ char: \"~\", color: Ansi.magenta })),\n Match.exhaustive,\n );\n\nconst logFileChangeIndented = Effect.fnUntraced(function* (\n change: \"Added\" | \"Removed\" | \"Modified\",\n fullPath: string,\n) {\n const projectRoot = yield* ProjectRoot.get;\n const path = yield* Path.Path;\n\n const prefix = projectRoot + path.sep;\n const suffix = pipe(fullPath, String.startsWith(prefix))\n ? pipe(fullPath, String.slice(prefix.length))\n : fullPath;\n\n const { char, color } = changeChar(change);\n\n yield* Console.log(\n `${color(char)} ${Ansi.blackBright(prefix)}${color(suffix)}`,\n );\n});\n\nconst logFunctionPathDiff = Effect.fnUntraced(function* (\n previous: FunctionPaths.FunctionPaths,\n current: FunctionPaths.FunctionPaths,\n) {\n const {\n functionsAdded,\n functionsRemoved,\n groupsRemoved,\n groupsAdded,\n groupsChanged,\n } = FunctionPaths.diff(previous, current);\n\n const logForGroups = (\n groupPaths: GroupPaths.GroupPaths,\n fnPaths: FunctionPaths.FunctionPaths,\n logFn: typeof logFunctionAdded,\n ) =>\n Effect.forEach(groupPaths, (gp) =>\n Effect.forEach(\n Array.fromIterable(\n HashSet.filter(fnPaths, (fp) => Equal.equals(fp.groupPath, gp)),\n ),\n logFn,\n ),\n );\n\n yield* logForGroups(groupsRemoved, functionsRemoved, logFunctionRemoved);\n yield* logForGroups(groupsAdded, functionsAdded, logFunctionAdded);\n yield* Effect.forEach(\n groupsChanged,\n Effect.fnUntraced(function* (gp: GroupPath.GroupPath) {\n yield* Effect.forEach(\n Array.fromIterable(\n HashSet.filter(functionsAdded, (fp) =>\n Equal.equals(fp.groupPath, gp),\n ),\n ),\n logFunctionAdded,\n );\n yield* Effect.forEach(\n Array.fromIterable(\n HashSet.filter(functionsRemoved, (fp) =>\n Equal.equals(fp.groupPath, gp),\n ),\n ),\n logFunctionRemoved,\n );\n }),\n );\n});\n\nexport const devHandler = Effect.gen(function* () {\n yield* logPending(\"Performing initial sync…\");\n const previousFunctionPaths = yield* Evaluation.loadPreviousFunctionPaths;\n\n const watcher = yield* Watcher.make();\n\n yield* Effect.all([watcher.run, syncLoop(previousFunctionPaths, watcher)], {\n concurrency: \"unbounded\",\n });\n});\n\nexport const dev = Command.make(\n \"dev\",\n DirectoryOptions.flags,\n () => devHandler,\n).pipe(\n Command.withDescription(\"Start the Confect development server\"),\n Command.provide(DirectoryOptions.layer),\n);\n\nconst esbuildMessageKey = (m: esbuild.Message): string =>\n `${m.location?.file ?? \"\"}:${m.location?.line ?? \"\"}:${m.location?.column ?? \"\"}:${m.text}`;\n\nconst dedupeWatcherMessages = (\n messages: ReadonlyArray<esbuild.Message>,\n): ReadonlyArray<esbuild.Message> =>\n pipe(\n messages,\n Array.dedupeWith(\n (messageA, messageB) =>\n esbuildMessageKey(messageA) === esbuildMessageKey(messageB),\n ),\n );\n\nconst watcherMessagesSignature = (\n messages: ReadonlyArray<esbuild.Message>,\n): string =>\n pipe(\n messages,\n Array.map(esbuildMessageKey),\n Array.dedupe,\n Array.sort(Order.String),\n Array.join(\"\\n\"),\n );\n\n/**\n * Log any watcher messages (errors or warnings) that haven't already been\n * logged at their current signature. Suppresses the per-watcher fanout that\n * happens when one root cause (e.g. a missing import) breaks every entry\n * point's build at the same source location.\n */\nconst logChangedWatcherMessages = Effect.fnUntraced(function* (\n messages: ReadonlyArray<esbuild.Message>,\n lastLoggedSignatureRef: Ref.Ref<string>,\n log: (messages: ReadonlyArray<esbuild.Message>) => Effect.Effect<void>,\n) {\n const signature = watcherMessagesSignature(messages);\n const previous = yield* Ref.get(lastLoggedSignatureRef);\n if (signature === previous) return;\n yield* Ref.set(lastLoggedSignatureRef, signature);\n if (messages.length === 0) return;\n yield* log(dedupeWatcherMessages(messages));\n});\n\nconst syncLoop = Effect.fnUntraced(function* (\n initialFunctionPaths: FunctionPaths.FunctionPaths,\n watcher: Watcher.Watcher,\n) {\n const functionPathsRef = yield* Ref.make(initialFunctionPaths);\n const lastLoggedErrorsRef = yield* Ref.make<string>(\"\");\n const lastLoggedWarningsRef = yield* Ref.make<string>(\"\");\n const phaseRef = yield* Ref.make<SyncState.Phase>(\n SyncState.Phase.Bootstrapping(),\n );\n const optionalPendingRef = yield* Ref.make(HashSet.empty<OptionalFile>());\n const logMessages = Effect.gen(function* () {\n const { errors, warnings } = yield* watcher.diagnostics;\n yield* logChangedWatcherMessages(\n errors,\n lastLoggedErrorsRef,\n logCoalescedBuildErrors,\n );\n yield* logChangedWatcherMessages(\n warnings,\n lastLoggedWarningsRef,\n logCoalescedBuildWarnings,\n );\n });\n\n return yield* Effect.forever(\n Effect.gen(function* () {\n yield* Effect.logDebug(\"Running sync loop…\");\n const taken = yield* watcher.next;\n\n const phase = yield* Ref.get(phaseRef);\n const firstSync = SyncState.Phase.$is(\"Bootstrapping\")(phase);\n if (!firstSync) yield* logMessages;\n\n if (!SyncState.isDirty(taken)) return;\n\n const declared = yield* isDeclared;\n const pending = SyncState.forBackend(\n {\n ...taken,\n optional: yield* Ref.updateAndGet(\n optionalPendingRef,\n HashSet.union(taken.optional),\n ),\n },\n {\n declared,\n component: (yield* ConvexDirectory.target).kind === \"component\",\n },\n );\n const optional = pending.optional;\n const operation = SyncState.plan(phase, pending);\n yield* Effect.logDebug(\"Planned development sync\").pipe(\n Effect.annotateLogs({\n phase: phase._tag,\n work: pending.work._tag,\n operation: operation._tag,\n }),\n );\n if (\n !firstSync &&\n !(\n SyncState.Operation.$is(\"Validate\")(operation) &&\n operation.paths.length === 0\n )\n )\n yield* logPending(\"Dependencies may have changed, reloading…\");\n\n const regenerate = <R>(\n generation: Effect.Effect<\n GenerationSnapshot.GenerationSnapshot,\n Effect.Error<typeof Evaluation.generateSnapshot>,\n R\n >,\n ) =>\n Effect.gen(function* () {\n const current = yield* generation.pipe(\n Effect.tap((snapshot) =>\n Effect.gen(function* () {\n const nextFunctionPaths =\n GenerationSnapshot.functionPaths(snapshot);\n const previous = yield* Ref.get(functionPathsRef);\n yield* logFunctionPathDiff(previous, nextFunctionPaths);\n yield* Ref.set(functionPathsRef, nextFunctionPaths);\n }),\n ),\n Evaluation.catchAndLog,\n );\n if (Option.isNone(current)) {\n return SyncState.Outcome.GenerationFailed();\n }\n const refreshed = yield* watcher.refresh.pipe(Effect.result);\n if (Result.isFailure(refreshed)) {\n yield* Console.error(\n `Dependency watcher could not ${refreshed.failure.operation}: ${globalThis.String(refreshed.failure.cause)}`,\n );\n return SyncState.Outcome.ReconciliationFailed();\n }\n if (!Watcher.isRefreshSuccessful(refreshed.success)) {\n yield* logMessages;\n return SyncState.Outcome.ReconciliationFailed();\n }\n return SyncState.Outcome.Succeeded({ snapshot: current.value });\n });\n const preserved = <R>(\n generation: Effect.Effect<\n GenerationSnapshot.GenerationSnapshot,\n Effect.Error<typeof Evaluation.generateSnapshot>,\n R\n >,\n ) =>\n preserveComponentOutput(generation, watcher.duringRestore).pipe(\n Effect.tapErrorTag(\n \"ComponentNodeGroupError\",\n () => watcher.discardRestoreEchoes,\n ),\n Effect.catchTags({\n RemoveBusyError: (error) =>\n Effect.fail(\n new Evaluation.EvaluationError({\n diagnostic: renderCodegenError(error),\n }),\n ),\n // Output that cannot be restored leaves nothing to serve.\n PlatformError: Effect.die,\n }),\n );\n const validate = (\n paths: ReadonlyArray<ImplModulePath>,\n snapshot: GenerationSnapshot.GenerationSnapshot,\n ) =>\n Effect.gen(function* () {\n if (Array.isReadonlyArrayNonEmpty(paths)) {\n const validated = yield* Evaluation.validate(paths).pipe(\n Evaluation.catchAndLog,\n );\n if (Option.isNone(validated)) {\n return SyncState.Outcome.ValidationFailed({ paths, snapshot });\n }\n }\n return SyncState.Outcome.Succeeded({ snapshot });\n });\n const outcome = yield* SyncState.Operation.$match(operation, {\n Generate: () => regenerate(preserved(Evaluation.generateSnapshot)),\n Validate: ({ paths, snapshot }) => validate(paths, snapshot),\n Update: ({ snapshot, declarations, paths }) =>\n regenerate(\n preserved(\n Evaluation.updateDeclarations(snapshot, declarations, paths),\n ),\n ),\n });\n yield* Ref.set(phaseRef, SyncState.transition(outcome));\n if (SyncState.shouldRetry(phase, outcome)) {\n yield* watcher.requestRetry;\n }\n if (!SyncState.Outcome.$is(\"Succeeded\")(outcome)) return;\n\n const dirtyOptionalFiles = [\n ...(HashSet.has(optional, \"Http\")\n ? [syncOptionalFile(generateHttp, \"http.ts\")]\n : []),\n ...(HashSet.has(optional, \"Crons\")\n ? [syncOptionalFile(generateCrons, \"crons.ts\")]\n : []),\n ...(HashSet.has(optional, \"Auth\")\n ? [syncOptionalFile(generateAuthConfig, \"auth.config.ts\")]\n : []),\n ];\n\n yield* Array.isReadonlyArrayNonEmpty(dirtyOptionalFiles)\n ? Effect.all(dirtyOptionalFiles, { concurrency: \"unbounded\" })\n : Effect.void;\n yield* Ref.set(optionalPendingRef, HashSet.empty());\n\n if (SyncState.needsDeploymentNotification(phase))\n yield* touchConvexSchema;\n\n if (!SyncState.isDirty(yield* watcher.pending)) {\n yield* logSuccess(\"Generated files are up-to-date\");\n }\n }),\n );\n});\n\nconst syncOptionalFile = (generate: typeof generateHttp, convexFile: string) =>\n pipe(\n generate,\n Effect.andThen(\n Option.match({\n onSome: ({ change, convexFilePath }) =>\n Match.value(change).pipe(\n Match.when(\"Unchanged\", () => Effect.void),\n Match.whenOr(\"Added\", \"Modified\", (addedOrModified) =>\n logFileChangeIndented(addedOrModified, convexFilePath),\n ),\n Match.exhaustive,\n ),\n onNone: () =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n const convexFilePath = path.join(convexDirectory, convexFile);\n\n if (yield* fs.exists(convexFilePath)) {\n yield* fs.remove(convexFilePath);\n yield* logFileChangeIndented(\"Removed\", convexFilePath);\n }\n }),\n }),\n ),\n );\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dev.mjs","names":["Ansi.green","Ansi.red","Ansi.magenta","Ansi.blackBright","FunctionPaths.diff","Evaluation.loadPreviousFunctionPaths","Watcher.make","DirectoryOptions.flags","DirectoryOptions.layer","SyncState.isDirty","SyncState.forBackend","SyncState.plan","GenerationSnapshot.functionPaths","Evaluation.catchAndLog","Watcher.isRefreshSuccessful","Evaluation.EvaluationError","validate","Evaluation.validate","Evaluation.generateSnapshot","Evaluation.updateDeclarations","SyncState.transition","SyncState.shouldRetry","SyncState.needsDeploymentNotification"],"sources":["../../src/confect/dev.ts"],"sourcesContent":["import * as Command from \"effect/cli/Command\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport { pipe } from \"effect/Function\";\nimport * as Array from \"effect/Array\";\nimport * as Console from \"effect/Console\";\nimport * as Effect from \"effect/Effect\";\nimport * as Equal from \"effect/Equal\";\nimport * as HashSet from \"effect/HashSet\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as Ref from \"effect/Ref\";\nimport * as Result from \"effect/Result\";\nimport * as String from \"effect/String\";\nimport type * as esbuild from \"esbuild\";\nimport * as Ansi from \"../Ansi.js\";\nimport { renderCodegenError } from \"../CodegenError.js\";\nimport * as SyncState from \"../SyncState.js\";\nimport type { OptionalFile } from \"../EntryPoint.js\";\nimport * as Watcher from \"../Watcher.js\";\nimport * as Evaluation from \"../Evaluation.js\";\nimport { ConvexDirectory } from \"../ConvexDirectory.js\";\nimport * as DirectoryOptions from \"../DirectoryOptions.js\";\nimport * as FunctionPaths from \"../FunctionPaths.js\";\nimport * as GenerationSnapshot from \"../GenerationSnapshot.js\";\nimport type { ImplModulePath } from \"../ImplModulePath.js\";\nimport type * as GroupPath from \"../GroupPath.js\";\nimport type * as GroupPaths from \"../GroupPaths.js\";\nimport {\n logCoalescedBuildErrors,\n logCoalescedBuildWarnings,\n logFunctionAdded,\n logFunctionRemoved,\n logPending,\n logSuccess,\n} from \"../log.js\";\nimport { ProjectRoot } from \"../ProjectRoot.js\";\nimport { preserveComponentOutput } from \"../Rollback.js\";\nimport {\n generateAuthConfig,\n generateCrons,\n generateHttp,\n touchConvexSchema,\n} from \"../utils.js\";\nimport { isDeclared } from \"./declaration.js\";\n\nconst changeChar = (change: \"Added\" | \"Removed\" | \"Modified\") =>\n Match.value(change).pipe(\n Match.when(\"Added\", () => ({ char: \"+\", color: Ansi.green })),\n Match.when(\"Removed\", () => ({ char: \"-\", color: Ansi.red })),\n Match.when(\"Modified\", () => ({ char: \"~\", color: Ansi.magenta })),\n Match.exhaustive,\n );\n\nconst logFileChangeIndented = Effect.fnUntraced(function* (\n change: \"Added\" | \"Removed\" | \"Modified\",\n fullPath: string,\n) {\n const projectRoot = yield* ProjectRoot.get;\n const path = yield* Path.Path;\n\n const prefix = projectRoot + path.sep;\n const suffix = pipe(fullPath, String.startsWith(prefix))\n ? pipe(fullPath, String.slice(prefix.length))\n : fullPath;\n\n const { char, color } = changeChar(change);\n\n yield* Console.log(\n `${color(char)} ${Ansi.blackBright(prefix)}${color(suffix)}`,\n );\n});\n\nconst logFunctionPathDiff = Effect.fnUntraced(function* (\n previous: FunctionPaths.FunctionPaths,\n current: FunctionPaths.FunctionPaths,\n) {\n const {\n functionsAdded,\n functionsRemoved,\n groupsRemoved,\n groupsAdded,\n groupsChanged,\n } = FunctionPaths.diff(previous, current);\n\n const logForGroups = (\n groupPaths: GroupPaths.GroupPaths,\n fnPaths: FunctionPaths.FunctionPaths,\n logFn: typeof logFunctionAdded,\n ) =>\n Effect.forEach(groupPaths, (gp) =>\n Effect.forEach(\n Array.fromIterable(\n HashSet.filter(fnPaths, (fp) => Equal.equals(fp.groupPath, gp)),\n ),\n logFn,\n ),\n );\n\n yield* logForGroups(groupsRemoved, functionsRemoved, logFunctionRemoved);\n yield* logForGroups(groupsAdded, functionsAdded, logFunctionAdded);\n yield* Effect.forEach(\n groupsChanged,\n Effect.fnUntraced(function* (gp: GroupPath.GroupPath) {\n yield* Effect.forEach(\n Array.fromIterable(\n HashSet.filter(functionsAdded, (fp) =>\n Equal.equals(fp.groupPath, gp),\n ),\n ),\n logFunctionAdded,\n );\n yield* Effect.forEach(\n Array.fromIterable(\n HashSet.filter(functionsRemoved, (fp) =>\n Equal.equals(fp.groupPath, gp),\n ),\n ),\n logFunctionRemoved,\n );\n }),\n );\n});\n\nexport const devHandler = Effect.gen(function* () {\n yield* logPending(\"Performing initial sync…\");\n const previousFunctionPaths = yield* Evaluation.loadPreviousFunctionPaths;\n\n const watcher = yield* Watcher.make();\n\n yield* Effect.all([watcher.run, syncLoop(previousFunctionPaths, watcher)], {\n concurrency: \"unbounded\",\n });\n});\n\nexport const dev = Command.make(\n \"dev\",\n DirectoryOptions.flags,\n () => devHandler,\n).pipe(\n Command.withDescription(\"Start the Confect development server\"),\n Command.provide(DirectoryOptions.layer),\n);\n\nconst esbuildMessageKey = (m: esbuild.Message): string =>\n `${m.location?.file ?? \"\"}:${m.location?.line ?? \"\"}:${m.location?.column ?? \"\"}:${m.text}`;\n\nconst dedupeWatcherMessages = (\n messages: ReadonlyArray<esbuild.Message>,\n): ReadonlyArray<esbuild.Message> =>\n pipe(\n messages,\n Array.dedupeWith(\n (messageA, messageB) =>\n esbuildMessageKey(messageA) === esbuildMessageKey(messageB),\n ),\n );\n\nconst watcherMessagesSignature = (\n messages: ReadonlyArray<esbuild.Message>,\n): string =>\n pipe(\n messages,\n Array.map(esbuildMessageKey),\n Array.dedupe,\n Array.sort(Order.String),\n Array.join(\"\\n\"),\n );\n\n/**\n * Log any watcher messages (errors or warnings) that haven't already been\n * logged at their current signature. Suppresses the per-watcher fanout that\n * happens when one root cause (e.g. a missing import) breaks every entry\n * point's build at the same source location.\n */\nconst logChangedWatcherMessages = Effect.fnUntraced(function* (\n messages: ReadonlyArray<esbuild.Message>,\n lastLoggedSignatureRef: Ref.Ref<string>,\n log: (messages: ReadonlyArray<esbuild.Message>) => Effect.Effect<void>,\n) {\n const signature = watcherMessagesSignature(messages);\n const previous = yield* Ref.get(lastLoggedSignatureRef);\n if (signature === previous) return;\n yield* Ref.set(lastLoggedSignatureRef, signature);\n if (messages.length === 0) return;\n yield* log(dedupeWatcherMessages(messages));\n});\n\nconst syncLoop = Effect.fnUntraced(function* (\n initialFunctionPaths: FunctionPaths.FunctionPaths,\n watcher: Watcher.Watcher,\n) {\n const functionPathsRef = yield* Ref.make(initialFunctionPaths);\n const lastLoggedErrorsRef = yield* Ref.make<string>(\"\");\n const lastLoggedWarningsRef = yield* Ref.make<string>(\"\");\n const phaseRef = yield* Ref.make<SyncState.Phase>(\n SyncState.Phase.Bootstrapping(),\n );\n const optionalPendingRef = yield* Ref.make(HashSet.empty<OptionalFile>());\n const logMessages = Effect.gen(function* () {\n const { errors, warnings } = yield* watcher.diagnostics;\n yield* logChangedWatcherMessages(\n errors,\n lastLoggedErrorsRef,\n logCoalescedBuildErrors,\n );\n yield* logChangedWatcherMessages(\n warnings,\n lastLoggedWarningsRef,\n logCoalescedBuildWarnings,\n );\n });\n\n return yield* Effect.forever(\n Effect.gen(function* () {\n yield* Effect.logDebug(\"Running sync loop…\");\n const taken = yield* watcher.next;\n\n const phase = yield* Ref.get(phaseRef);\n const firstSync = SyncState.Phase.$is(\"Bootstrapping\")(phase);\n if (!firstSync) yield* logMessages;\n\n if (!SyncState.isDirty(taken)) return;\n\n const declared = yield* isDeclared;\n const pending = SyncState.forBackend(\n {\n ...taken,\n optional: yield* Ref.updateAndGet(\n optionalPendingRef,\n HashSet.union(taken.optional),\n ),\n },\n {\n declared,\n component: (yield* ConvexDirectory.target).kind === \"component\",\n },\n );\n const optional = pending.optional;\n const operation = SyncState.plan(phase, pending);\n yield* Effect.logDebug(\"Planned development sync\").pipe(\n Effect.annotateLogs({\n phase: phase._tag,\n work: pending.work._tag,\n operation: operation._tag,\n }),\n );\n if (\n !firstSync &&\n !(\n SyncState.Operation.$is(\"Validate\")(operation) &&\n operation.paths.length === 0\n )\n )\n yield* logPending(\"Dependencies may have changed, reloading…\");\n\n const regenerate = <R>(\n generation: Effect.Effect<\n GenerationSnapshot.GenerationSnapshot,\n Effect.Error<typeof Evaluation.generateSnapshot>,\n R\n >,\n ) =>\n Effect.gen(function* () {\n const current = yield* generation.pipe(\n Effect.tap((snapshot) =>\n Effect.gen(function* () {\n const nextFunctionPaths =\n GenerationSnapshot.functionPaths(snapshot);\n const previous = yield* Ref.get(functionPathsRef);\n yield* logFunctionPathDiff(previous, nextFunctionPaths);\n yield* Ref.set(functionPathsRef, nextFunctionPaths);\n }),\n ),\n Evaluation.catchAndLog,\n );\n if (Option.isNone(current)) {\n return SyncState.Outcome.GenerationFailed();\n }\n const refreshed = yield* watcher.refresh.pipe(Effect.result);\n if (Result.isFailure(refreshed)) {\n yield* Console.error(\n `Dependency watcher could not ${refreshed.failure.operation}: ${globalThis.String(refreshed.failure.cause)}`,\n );\n return SyncState.Outcome.ReconciliationFailed();\n }\n if (!Watcher.isRefreshSuccessful(refreshed.success)) {\n yield* logMessages;\n return SyncState.Outcome.ReconciliationFailed();\n }\n return SyncState.Outcome.Succeeded({ snapshot: current.value });\n });\n const preserved = <R>(\n generation: Effect.Effect<\n GenerationSnapshot.GenerationSnapshot,\n Effect.Error<typeof Evaluation.generateSnapshot>,\n R\n >,\n ) =>\n preserveComponentOutput(generation, watcher.duringRestore).pipe(\n Effect.tapErrorTag(\n \"ComponentNodeGroupError\",\n () => watcher.discardRestoreEchoes,\n ),\n Effect.catchTags({\n RemoveBusyError: (error) =>\n Effect.fail(\n new Evaluation.EvaluationError({\n diagnostic: renderCodegenError(error),\n }),\n ),\n // Output that cannot be restored leaves nothing to serve.\n PlatformError: Effect.die,\n }),\n );\n const validate = (\n paths: ReadonlyArray<ImplModulePath>,\n snapshot: GenerationSnapshot.GenerationSnapshot,\n ) =>\n Effect.gen(function* () {\n if (Array.isReadonlyArrayNonEmpty(paths)) {\n const validated = yield* Evaluation.validate(paths).pipe(\n Evaluation.catchAndLog,\n );\n if (Option.isNone(validated)) {\n return SyncState.Outcome.ValidationFailed({ paths, snapshot });\n }\n }\n return SyncState.Outcome.Succeeded({ snapshot });\n });\n const outcome = yield* SyncState.Operation.$match(operation, {\n Generate: () => regenerate(preserved(Evaluation.generateSnapshot)),\n Validate: ({ paths, snapshot }) => validate(paths, snapshot),\n Update: ({ snapshot, declarations, paths }) =>\n regenerate(\n preserved(\n Evaluation.updateDeclarations(snapshot, declarations, paths),\n ),\n ),\n });\n yield* Ref.set(phaseRef, SyncState.transition(outcome));\n if (SyncState.shouldRetry(phase, outcome)) {\n yield* watcher.requestRetry;\n }\n if (!SyncState.Outcome.$is(\"Succeeded\")(outcome)) return;\n\n const dirtyOptionalFiles = [\n ...(HashSet.has(optional, \"Http\")\n ? [syncOptionalFile(generateHttp, \"http.ts\")]\n : []),\n ...(HashSet.has(optional, \"Crons\")\n ? [syncOptionalFile(generateCrons, \"crons.ts\")]\n : []),\n ...(HashSet.has(optional, \"Auth\")\n ? [syncOptionalFile(generateAuthConfig, \"auth.config.ts\")]\n : []),\n ];\n\n yield* Array.isReadonlyArrayNonEmpty(dirtyOptionalFiles)\n ? Effect.all(dirtyOptionalFiles, { concurrency: \"unbounded\" })\n : Effect.void;\n yield* Ref.set(optionalPendingRef, HashSet.empty());\n\n if (SyncState.needsDeploymentNotification(phase))\n yield* touchConvexSchema;\n\n if (!SyncState.isDirty(yield* watcher.pending)) {\n yield* logSuccess(\"Generated files are up-to-date\");\n }\n }),\n );\n});\n\nconst syncOptionalFile = (generate: typeof generateHttp, convexFile: string) =>\n pipe(\n generate,\n Effect.andThen(\n Option.match({\n onSome: ({ change, convexFilePath }) =>\n Match.value(change).pipe(\n Match.when(\"Unchanged\", () => Effect.void),\n Match.whenOr(\"Added\", \"Modified\", (addedOrModified) =>\n logFileChangeIndented(addedOrModified, convexFilePath),\n ),\n Match.exhaustive,\n ),\n onNone: () =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n const convexFilePath = path.join(convexDirectory, convexFile);\n\n if (yield* fs.exists(convexFilePath)) {\n yield* fs.remove(convexFilePath);\n yield* logFileChangeIndented(\"Removed\", convexFilePath);\n }\n }),\n }),\n ),\n );\n"],"mappings":"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"}
|
package/dist/confect.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confect.mjs","names":[],"sources":["../src/confect.ts"],"sourcesContent":["import * as Command from \"effect/cli/Command\";\nimport { codegen } from \"./confect/codegen\";\nimport { dev } from \"./confect/dev\";\n\nexport const confect = Command.make(\"confect\").pipe(\n Command.withDescription(\"Generate and sync Confect files with Convex\"),\n Command.withSubcommands([codegen, dev]),\n);\n"],"mappings":";;;;AAIA,MAAa,UAAU,QAAQ,KAAK,SAAS,CAAC,CAAC,KAC7C,QAAQ,gBAAgB,6CAA6C,GACrE,QAAQ,gBAAgB,CAAC,SAAS,GAAG,CAAC,CACxC"}
|
|
1
|
+
{"version":3,"file":"confect.mjs","names":[],"sources":["../src/confect.ts"],"sourcesContent":["import * as Command from \"effect/cli/Command\";\nimport { codegen } from \"./confect/codegen.js\";\nimport { dev } from \"./confect/dev.js\";\n\nexport const confect = Command.make(\"confect\").pipe(\n Command.withDescription(\"Generate and sync Confect files with Convex\"),\n Command.withSubcommands([codegen, dev]),\n);\n"],"mappings":";;;;AAIA,MAAa,UAAU,QAAQ,KAAK,SAAS,CAAC,CAAC,KAC7C,QAAQ,gBAAgB,6CAA6C,GACrE,QAAQ,gBAAgB,CAAC,SAAS,GAAG,CAAC,CACxC"}
|
package/dist/index.mjs
CHANGED
|
File without changes
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport * as NodeRuntime from \"@effect/platform-node/NodeRuntime\";\nimport * as Effect from \"effect/Effect\";\nimport { cliApp } from \"./cliApp\";\n\n// Track if we received SIGINT so we can re-raise it after cleanup.\n// This ensures proper terminal state restoration when run via e.g. `pnpm`.\nconst canReRaiseSignals = process.platform !== \"win32\";\n\nlet interrupted = false;\nprocess.prependListener(\"SIGINT\", () => {\n interrupted = true;\n});\nprocess.on(\"exit\", () => {\n if (interrupted && canReRaiseSignals) {\n process.kill(process.pid, \"SIGINT\");\n }\n});\n\ncliApp.pipe(Effect.provide(NodeServices.layer), NodeRuntime.runMain);\n"],"mappings":";;;;;;AASA,MAAM,oBAAoB,QAAQ,aAAa;AAE/C,IAAI,cAAc;AAClB,QAAQ,gBAAgB,gBAAgB;CACtC,cAAc;AAChB,CAAC;AACD,QAAQ,GAAG,cAAc;CACvB,IAAI,eAAe,mBACjB,QAAQ,KAAK,QAAQ,KAAK,QAAQ;AAEtC,CAAC;AAED,OAAO,KAAK,OAAO,QAAQ,aAAa,KAAK,GAAG,YAAY,OAAO"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport * as NodeRuntime from \"@effect/platform-node/NodeRuntime\";\nimport * as Effect from \"effect/Effect\";\nimport { cliApp } from \"./cliApp.js\";\n\n// Track if we received SIGINT so we can re-raise it after cleanup.\n// This ensures proper terminal state restoration when run via e.g. `pnpm`.\nconst canReRaiseSignals = process.platform !== \"win32\";\n\nlet interrupted = false;\nprocess.prependListener(\"SIGINT\", () => {\n interrupted = true;\n});\nprocess.on(\"exit\", () => {\n if (interrupted && canReRaiseSignals) {\n process.kill(process.pid, \"SIGINT\");\n }\n});\n\ncliApp.pipe(Effect.provide(NodeServices.layer), NodeRuntime.runMain);\n"],"mappings":";;;;;;AASA,MAAM,oBAAoB,QAAQ,aAAa;AAE/C,IAAI,cAAc;AAClB,QAAQ,gBAAgB,gBAAgB;CACtC,cAAc;AAChB,CAAC;AACD,QAAQ,GAAG,cAAc;CACvB,IAAI,eAAe,mBACjB,QAAQ,KAAK,QAAQ,KAAK,QAAQ;AAEtC,CAAC;AAED,OAAO,KAAK,OAAO,QAAQ,aAAa,KAAK,GAAG,YAAY,OAAO"}
|
package/dist/log.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.mjs","names":["Ansi.blackBright","Ansi.green","Ansi.red","Ansi.yellow","GroupPath.toString"],"sources":["../src/log.ts"],"sourcesContent":["import { pipe } from \"effect/Function\";\nimport * as Array from \"effect/Array\";\nimport * as Console from \"effect/Console\";\nimport * as Effect from \"effect/Effect\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Path from \"effect/Path\";\nimport * as Predicate from \"effect/Predicate\";\nimport * as String from \"effect/String\";\nimport * as esbuild from \"esbuild\";\nimport type {\n BuildError,\n BundleFailedError,\n ImportFailedError,\n} from \"./BuildError\";\nimport * as Ansi from \"./Ansi\";\nimport type * as FunctionPath from \"./FunctionPath\";\nimport * as GroupPath from \"./GroupPath\";\nimport { ProjectRoot } from \"./ProjectRoot\";\n\n// --- Path styling ---\n\n/**\n * Render a relative path with the directory portion dimmed (`Ansi.blackBright`)\n * and the file leaf rendered in the default terminal color.\n */\nexport const formatPath = (relativePath: string): string => {\n const lastSep = Math.max(\n relativePath.lastIndexOf(\"/\"),\n relativePath.lastIndexOf(\"\\\\\"),\n );\n const dir = lastSep < 0 ? \"\" : relativePath.slice(0, lastSep + 1);\n const leaf = lastSep < 0 ? relativePath : relativePath.slice(lastSep + 1);\n return Ansi.blackBright(dir) + leaf;\n};\n\n// --- File operation logs ---\n\nconst logFile = (char: string, color: Ansi.Style) =>\n Effect.fnUntraced(function* (fullPath: string) {\n const projectRoot = yield* ProjectRoot.get;\n const path = yield* Path.Path;\n\n const prefix = projectRoot + path.sep;\n const suffix = pipe(fullPath, String.startsWith(prefix))\n ? pipe(fullPath, String.slice(prefix.length))\n : fullPath;\n\n yield* Console.log(\n `${color(char)} ${Ansi.blackBright(prefix)}${color(suffix)}`,\n );\n });\n\nexport const logFileAdded = logFile(\"+\", Ansi.green);\n\nexport const logFileRemoved = logFile(\"-\", Ansi.red);\n\nexport const logFileModified = logFile(\"~\", Ansi.yellow);\n\n// --- Function subline logs ---\n\nconst logFunction =\n (char: string, color: Ansi.Style) =>\n (functionPath: FunctionPath.FunctionPath) =>\n Console.log(\n ` ${color(char)} ${Ansi.blackBright(\n GroupPath.toString(functionPath.groupPath) + \".\",\n )}${color(functionPath.name)}`,\n );\n\nexport const logFunctionAdded = logFunction(\"+\", Ansi.green);\n\nexport const logFunctionRemoved = logFunction(\"-\", Ansi.red);\n\n// --- Process status logs ---\n\nconst logStatus = (char: string, charColor: Ansi.Style) => (message: string) =>\n Console.log(`${charColor(char)} ${message}`);\n\nexport const logSuccess = logStatus(\"✔︎\", Ansi.green);\n\nexport const logFailure = logStatus(\"✘\", Ansi.red);\n\nexport const logPending = logStatus(\"⭘\", Ansi.yellow);\n\nexport const logWarn = logStatus(\"⚠\", Ansi.yellow);\n\n// --- Build message rendering ---\n\nconst cross = Ansi.red(\"✘\");\n\nconst warningSign = Ansi.yellow(\"⚠\");\n\nconst gutter = (color: Ansi.Style): string => color(\"│\");\n\nconst errorGutter = gutter(Ansi.red);\n\nconst withGutterBlock =\n (gutterChar: string) =>\n (output: string): string =>\n pipe(\n String.split(output, \"\\n\"),\n Array.map((line) =>\n pipe(line, String.trim) === \"\" ? gutterChar : `${gutterChar} ${line}`,\n ),\n Array.join(\"\\n\"),\n (guttered) => `${gutterChar}\\n${guttered}\\n${gutterChar}`,\n );\n\nconst withErrorGutterBlock = withGutterBlock(errorGutter);\n\nconst formatBuildMessage = (\n error: esbuild.Message | undefined,\n formattedMessage: string,\n): string => {\n const lines = String.split(formattedMessage, \"\\n\");\n const redErrorText = Ansi.red(error?.text ?? \"\");\n const replaced = pipe(\n Array.findFirstIndex(lines, (l) => pipe(l, String.trim, String.isNonEmpty)),\n Option.flatMap((index) => Array.modify(lines, index, () => redErrorText)),\n Option.getOrElse(() => lines),\n );\n return pipe(replaced, Array.join(\"\\n\"));\n};\n\n/**\n * Render a list of esbuild messages into a styled, gutter-prefixed block.\n */\nexport const formatEsbuildMessages = (\n errors: readonly esbuild.Message[],\n formattedMessages: readonly string[],\n): string =>\n pipe(\n formattedMessages,\n Array.map((message, i) => formatBuildMessage(errors[i], message)),\n Array.join(\"\"),\n String.trimEnd,\n withErrorGutterBlock,\n );\n\nconst renderImportFailedError = (error: ImportFailedError): string => {\n const causeMessage = Predicate.isError(error.cause)\n ? error.cause.message\n : Predicate.isString(error.cause)\n ? error.cause\n : globalThis.String(error.cause);\n const oneLineCause = pipe(\n String.split(causeMessage, \"\\n\"),\n Array.findFirst((line) => pipe(line, String.trim, String.isNonEmpty)),\n Option.map(String.trim),\n Option.getOrElse(() => \"unknown error\"),\n );\n return `${cross} Failed to load bundled module ${formatPath(\n error.file,\n )}: ${oneLineCause}; check the file's top-level imports and side effects.`;\n};\n\n/**\n * Render a {@link BundleFailedError} as a multi-line, ANSI-styled string: a\n * one-line `✘ <file>: build errors` header followed by the gutter-prefixed\n * esbuild diagnostic block. Multi-line is appropriate here because a single\n * `BundleFailedError` carries an array of distinct esbuild messages.\n */\nconst renderBundleFailedError = (error: BundleFailedError): string => {\n const messages = error.errors as readonly esbuild.Message[];\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"error\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${cross} ${formatPath(error.file)}: build errors`;\n return `${header}\\n${formatEsbuildMessages(messages, formatted)}`;\n};\n\n/**\n * Render any {@link BuildError} into a styled, ready-to-print string.\n * `ImportFailedError` collapses to a single line; `BundleFailedError` expands\n * to a header plus one diagnostic block per esbuild message.\n */\nexport const renderBuildError = (error: BuildError): string =>\n Match.value(error).pipe(\n Match.tag(\"BundleFailedError\", renderBundleFailedError),\n Match.tag(\"ImportFailedError\", renderImportFailedError),\n Match.exhaustive,\n );\n\nexport const logBuildError = (error: BuildError) =>\n Console.error(renderBuildError(error));\n\n/**\n * Render a flat list of esbuild messages as a single error block with a generic\n * `✘ Build errors` header.\n */\nconst renderCoalescedBuildErrors = (\n messages: readonly esbuild.Message[],\n): string => {\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"error\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${cross} Build errors`;\n return `${header}\\n${formatEsbuildMessages(messages, formatted)}`;\n};\n\nexport const logCoalescedBuildErrors = (\n messages: readonly esbuild.Message[],\n) =>\n messages.length === 0\n ? Effect.void\n : Console.error(renderCoalescedBuildErrors(messages));\n\nconst renderCoalescedBuildWarnings = (\n messages: readonly esbuild.Message[],\n): string => {\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"warning\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${warningSign} Build warnings`;\n const body = pipe(\n formatted,\n Array.join(\"\"),\n String.trimEnd,\n withGutterBlock(gutter(Ansi.yellow)),\n );\n return `${header}\\n${body}`;\n};\n\nexport const logCoalescedBuildWarnings = (\n messages: readonly esbuild.Message[],\n) =>\n messages.length === 0\n ? Effect.void\n : Console.error(renderCoalescedBuildWarnings(messages));\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"log.mjs","names":["Ansi.blackBright","Ansi.green","Ansi.red","Ansi.yellow","GroupPath.toString"],"sources":["../src/log.ts"],"sourcesContent":["import { pipe } from \"effect/Function\";\nimport * as Array from \"effect/Array\";\nimport * as Console from \"effect/Console\";\nimport * as Effect from \"effect/Effect\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Path from \"effect/Path\";\nimport * as Predicate from \"effect/Predicate\";\nimport * as String from \"effect/String\";\nimport * as esbuild from \"esbuild\";\nimport type {\n BuildError,\n BundleFailedError,\n ImportFailedError,\n} from \"./BuildError.js\";\nimport * as Ansi from \"./Ansi.js\";\nimport type * as FunctionPath from \"./FunctionPath.js\";\nimport * as GroupPath from \"./GroupPath.js\";\nimport { ProjectRoot } from \"./ProjectRoot.js\";\n\n// --- Path styling ---\n\n/**\n * Render a relative path with the directory portion dimmed (`Ansi.blackBright`)\n * and the file leaf rendered in the default terminal color.\n */\nexport const formatPath = (relativePath: string): string => {\n const lastSep = Math.max(\n relativePath.lastIndexOf(\"/\"),\n relativePath.lastIndexOf(\"\\\\\"),\n );\n const dir = lastSep < 0 ? \"\" : relativePath.slice(0, lastSep + 1);\n const leaf = lastSep < 0 ? relativePath : relativePath.slice(lastSep + 1);\n return Ansi.blackBright(dir) + leaf;\n};\n\n// --- File operation logs ---\n\nconst logFile = (char: string, color: Ansi.Style) =>\n Effect.fnUntraced(function* (fullPath: string) {\n const projectRoot = yield* ProjectRoot.get;\n const path = yield* Path.Path;\n\n const prefix = projectRoot + path.sep;\n const suffix = pipe(fullPath, String.startsWith(prefix))\n ? pipe(fullPath, String.slice(prefix.length))\n : fullPath;\n\n yield* Console.log(\n `${color(char)} ${Ansi.blackBright(prefix)}${color(suffix)}`,\n );\n });\n\nexport const logFileAdded = logFile(\"+\", Ansi.green);\n\nexport const logFileRemoved = logFile(\"-\", Ansi.red);\n\nexport const logFileModified = logFile(\"~\", Ansi.yellow);\n\n// --- Function subline logs ---\n\nconst logFunction =\n (char: string, color: Ansi.Style) =>\n (functionPath: FunctionPath.FunctionPath) =>\n Console.log(\n ` ${color(char)} ${Ansi.blackBright(\n GroupPath.toString(functionPath.groupPath) + \".\",\n )}${color(functionPath.name)}`,\n );\n\nexport const logFunctionAdded = logFunction(\"+\", Ansi.green);\n\nexport const logFunctionRemoved = logFunction(\"-\", Ansi.red);\n\n// --- Process status logs ---\n\nconst logStatus = (char: string, charColor: Ansi.Style) => (message: string) =>\n Console.log(`${charColor(char)} ${message}`);\n\nexport const logSuccess = logStatus(\"✔︎\", Ansi.green);\n\nexport const logFailure = logStatus(\"✘\", Ansi.red);\n\nexport const logPending = logStatus(\"⭘\", Ansi.yellow);\n\nexport const logWarn = logStatus(\"⚠\", Ansi.yellow);\n\n// --- Build message rendering ---\n\nconst cross = Ansi.red(\"✘\");\n\nconst warningSign = Ansi.yellow(\"⚠\");\n\nconst gutter = (color: Ansi.Style): string => color(\"│\");\n\nconst errorGutter = gutter(Ansi.red);\n\nconst withGutterBlock =\n (gutterChar: string) =>\n (output: string): string =>\n pipe(\n String.split(output, \"\\n\"),\n Array.map((line) =>\n pipe(line, String.trim) === \"\" ? gutterChar : `${gutterChar} ${line}`,\n ),\n Array.join(\"\\n\"),\n (guttered) => `${gutterChar}\\n${guttered}\\n${gutterChar}`,\n );\n\nconst withErrorGutterBlock = withGutterBlock(errorGutter);\n\nconst formatBuildMessage = (\n error: esbuild.Message | undefined,\n formattedMessage: string,\n): string => {\n const lines = String.split(formattedMessage, \"\\n\");\n const redErrorText = Ansi.red(error?.text ?? \"\");\n const replaced = pipe(\n Array.findFirstIndex(lines, (l) => pipe(l, String.trim, String.isNonEmpty)),\n Option.flatMap((index) => Array.modify(lines, index, () => redErrorText)),\n Option.getOrElse(() => lines),\n );\n return pipe(replaced, Array.join(\"\\n\"));\n};\n\n/**\n * Render a list of esbuild messages into a styled, gutter-prefixed block.\n */\nexport const formatEsbuildMessages = (\n errors: readonly esbuild.Message[],\n formattedMessages: readonly string[],\n): string =>\n pipe(\n formattedMessages,\n Array.map((message, i) => formatBuildMessage(errors[i], message)),\n Array.join(\"\"),\n String.trimEnd,\n withErrorGutterBlock,\n );\n\nconst renderImportFailedError = (error: ImportFailedError): string => {\n const causeMessage = Predicate.isError(error.cause)\n ? error.cause.message\n : Predicate.isString(error.cause)\n ? error.cause\n : globalThis.String(error.cause);\n const oneLineCause = pipe(\n String.split(causeMessage, \"\\n\"),\n Array.findFirst((line) => pipe(line, String.trim, String.isNonEmpty)),\n Option.map(String.trim),\n Option.getOrElse(() => \"unknown error\"),\n );\n return `${cross} Failed to load bundled module ${formatPath(\n error.file,\n )}: ${oneLineCause}; check the file's top-level imports and side effects.`;\n};\n\n/**\n * Render a {@link BundleFailedError} as a multi-line, ANSI-styled string: a\n * one-line `✘ <file>: build errors` header followed by the gutter-prefixed\n * esbuild diagnostic block. Multi-line is appropriate here because a single\n * `BundleFailedError` carries an array of distinct esbuild messages.\n */\nconst renderBundleFailedError = (error: BundleFailedError): string => {\n const messages = error.errors as readonly esbuild.Message[];\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"error\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${cross} ${formatPath(error.file)}: build errors`;\n return `${header}\\n${formatEsbuildMessages(messages, formatted)}`;\n};\n\n/**\n * Render any {@link BuildError} into a styled, ready-to-print string.\n * `ImportFailedError` collapses to a single line; `BundleFailedError` expands\n * to a header plus one diagnostic block per esbuild message.\n */\nexport const renderBuildError = (error: BuildError): string =>\n Match.value(error).pipe(\n Match.tag(\"BundleFailedError\", renderBundleFailedError),\n Match.tag(\"ImportFailedError\", renderImportFailedError),\n Match.exhaustive,\n );\n\nexport const logBuildError = (error: BuildError) =>\n Console.error(renderBuildError(error));\n\n/**\n * Render a flat list of esbuild messages as a single error block with a generic\n * `✘ Build errors` header.\n */\nconst renderCoalescedBuildErrors = (\n messages: readonly esbuild.Message[],\n): string => {\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"error\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${cross} Build errors`;\n return `${header}\\n${formatEsbuildMessages(messages, formatted)}`;\n};\n\nexport const logCoalescedBuildErrors = (\n messages: readonly esbuild.Message[],\n) =>\n messages.length === 0\n ? Effect.void\n : Console.error(renderCoalescedBuildErrors(messages));\n\nconst renderCoalescedBuildWarnings = (\n messages: readonly esbuild.Message[],\n): string => {\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"warning\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${warningSign} Build warnings`;\n const body = pipe(\n formatted,\n Array.join(\"\"),\n String.trimEnd,\n withGutterBlock(gutter(Ansi.yellow)),\n );\n return `${header}\\n${body}`;\n};\n\nexport const logCoalescedBuildWarnings = (\n messages: readonly esbuild.Message[],\n) =>\n messages.length === 0\n ? Effect.void\n : Console.error(renderCoalescedBuildWarnings(messages));\n"],"mappings":"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"}
|