@gaganref/confect-cli 10.3.1-fork.2 → 10.3.1-fork.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/Bundler.mjs +22 -1
  2. package/dist/Bundler.mjs.map +1 -1
  3. package/dist/CodegenError.mjs +11 -2
  4. package/dist/CodegenError.mjs.map +1 -1
  5. package/dist/ConfectDirectory.mjs.map +1 -1
  6. package/dist/ConvexConfig.mjs.map +1 -1
  7. package/dist/ConvexDirectory.mjs.map +1 -1
  8. package/dist/DirectoryOptions.mjs.map +1 -1
  9. package/dist/EntryPoint.mjs.map +1 -1
  10. package/dist/Evaluation.mjs +39 -13
  11. package/dist/Evaluation.mjs.map +1 -1
  12. package/dist/EvaluationWorker.mjs +13 -1
  13. package/dist/EvaluationWorker.mjs.map +1 -1
  14. package/dist/FunctionModule.mjs +81 -13
  15. package/dist/FunctionModule.mjs.map +1 -1
  16. package/dist/FunctionPath.mjs.map +1 -1
  17. package/dist/FunctionPaths.mjs.map +1 -1
  18. package/dist/GenerationSnapshot.mjs.map +1 -1
  19. package/dist/GroupPaths.mjs.map +1 -1
  20. package/dist/ImplModulePath.mjs.map +1 -1
  21. package/dist/LeafModule.mjs +17 -17
  22. package/dist/LeafModule.mjs.map +1 -1
  23. package/dist/Remove.mjs.map +1 -1
  24. package/dist/Rollback.mjs.map +1 -1
  25. package/dist/SpecAssemblyNode.mjs.map +1 -1
  26. package/dist/SpecModulePath.mjs.map +1 -1
  27. package/dist/SyncState.mjs.map +1 -1
  28. package/dist/TableModule.mjs.map +1 -1
  29. package/dist/TableModulePath.mjs.map +1 -1
  30. package/dist/WatchBuild.mjs.map +1 -1
  31. package/dist/WatchTopology.mjs.map +1 -1
  32. package/dist/Watcher.mjs +57 -55
  33. package/dist/Watcher.mjs.map +1 -1
  34. package/dist/cliApp.mjs.map +1 -1
  35. package/dist/confect/codegen.mjs +75 -23
  36. package/dist/confect/codegen.mjs.map +1 -1
  37. package/dist/confect/declaration.mjs +4 -3
  38. package/dist/confect/declaration.mjs.map +1 -1
  39. package/dist/confect/dev.mjs +9 -4
  40. package/dist/confect/dev.mjs.map +1 -1
  41. package/dist/confect.mjs.map +1 -1
  42. package/dist/index.mjs.map +1 -1
  43. package/dist/log.mjs.map +1 -1
  44. package/dist/templates.mjs +16 -12
  45. package/dist/templates.mjs.map +1 -1
  46. package/dist/utils.mjs +1 -1
  47. package/dist/utils.mjs.map +1 -1
  48. package/package.json +3 -3
@@ -1,8 +1,8 @@
1
1
  import { fromBundlerError } from "../BuildError.mjs";
2
2
  import { ProjectRoot } from "../ProjectRoot.mjs";
3
3
  import { logFileAdded, logFileModified, logFileRemoved, logPending, logSuccess, logWarn } from "../log.mjs";
4
- import { bundle } from "../Bundler.mjs";
5
- import { CallbackPrefixError, ComponentNodeGroupError, ConflictingDocNameError, InvalidConvexConfigError, LegacySchemaFileError, tapAndLog } from "../CodegenError.mjs";
4
+ import { bundle, exportNames, resolveModule } from "../Bundler.mjs";
5
+ import { CallbackPrefixError, ComponentNodeGroupError, ConflictingDocNameError, InvalidConvexConfigError, InvalidDeclarationError, LegacySchemaFileError, tapAndLog } from "../CodegenError.mjs";
6
6
  import { ConvexDirectory } from "../ConvexDirectory.mjs";
7
7
  import { ConfectDirectory } from "../ConfectDirectory.mjs";
8
8
  import { assemblyNodesFromLeaves } from "../SpecAssemblyNode.mjs";
@@ -13,7 +13,7 @@ import { flags, layer } from "../DirectoryOptions.mjs";
13
13
  import { fromTableName } from "../DocName.mjs";
14
14
  import { FunctionPaths, make } from "../FunctionPaths.mjs";
15
15
  import { diff, fromLoadedLeaves, update } from "../GenerationSnapshot.mjs";
16
- import { applyFunctionPlan, generateFunctions } from "../FunctionModule.mjs";
16
+ import { applyFunctionPlan, assertOwnedEntrypoints, generateFunctions } from "../FunctionModule.mjs";
17
17
  import { implPathForSpec, loadAll, registeredFunctionsRelativePath, validateAllImpls, withImplFiles } from "../LeafModule.mjs";
18
18
  import { TABLES_DIRNAME, discover, validate } from "../TableModule.mjs";
19
19
  import { planDeclarations } from "../EntryPoint.mjs";
@@ -59,6 +59,7 @@ const codegen = Command.make("codegen", flags, () => Effect.gen(function* () {
59
59
  yield* codegenHandler.pipe(Effect.asVoid, Effect.tap(() => logSuccess("Generated files are up-to-date")), tapAndLog);
60
60
  })).pipe(Command.provide(layer), Command.withDescription("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)"));
61
61
  const generateWithSnapshot = Effect.gen(function* () {
62
+ yield* assertOwnedEntrypoints;
62
63
  yield* validateComponentConfiguration;
63
64
  yield* generateConfectGeneratedDirectory;
64
65
  const declared = yield* syncDeclaration;
@@ -87,8 +88,9 @@ const generateWithSnapshot = Effect.gen(function* () {
87
88
  generateServices,
88
89
  generateConvexSchema(tableModules)
89
90
  ], { concurrency: "unbounded" });
90
- yield* validateAllImpls(leaves);
91
- yield* generateGroupRegisteredFunctions(leaves);
91
+ const required = Option.isSome(declared) ? declared.value.requiresMiddleware : [];
92
+ yield* validateAllImpls(leaves, required);
93
+ yield* generateGroupRegisteredFunctions(leaves, required);
92
94
  yield* removeObsoleteRegisteredFunctions(leaves);
93
95
  const [functionPaths] = yield* Effect.all([
94
96
  generateFunctions(snapshot),
@@ -115,8 +117,10 @@ const updateDeclarations = Effect.fn("Cli.updateDeclarations")(function* (snapsh
115
117
  return yield* withImplFiles(paths, (leaves) => Effect.gen(function* () {
116
118
  yield* rejectComponentNodeGroups(leaves);
117
119
  const next = yield* Effect.fromResult(update(snapshot, leaves));
118
- yield* validateAllImpls(leaves);
119
- yield* generateGroupRegisteredFunctions(leaves);
120
+ const declared = yield* syncDeclaration;
121
+ const required = Option.isSome(declared) ? declared.value.requiresMiddleware : [];
122
+ yield* validateAllImpls(leaves, required);
123
+ yield* generateGroupRegisteredFunctions(leaves, required);
120
124
  yield* applyFunctionPlan(diff(snapshot, next));
121
125
  return next;
122
126
  }));
@@ -196,7 +200,7 @@ const generateAssembledSpecs = Effect.fnUntraced(function* (leaves) {
196
200
  const specContents = yield* assembledSpec({ nodes });
197
201
  yield* writeFileStringAndLog(path.join(confectDirectory, generatedSpecPath), specContents);
198
202
  });
199
- const generateGroupRegisteredFunctions = Effect.fnUntraced(function* (leaves) {
203
+ const generateGroupRegisteredFunctions = Effect.fnUntraced(function* (leaves, required = []) {
200
204
  const path = yield* Path.Path;
201
205
  const confectDirectory = yield* ConfectDirectory.get;
202
206
  yield* Effect.forEach(leaves, Effect.fnUntraced(function* (leaf) {
@@ -211,6 +215,8 @@ const generateGroupRegisteredFunctions = Effect.fnUntraced(function* (leaves) {
211
215
  const implImportPath = yield* toModuleImportPath(path.relative(path.dirname(registryPath), path.join(confectDirectory, implRelativePath)));
212
216
  const contents = yield* registeredFunctionsForGroup({
213
217
  spec: leaf.spec,
218
+ required,
219
+ groupPath: leaf.groupPathDot,
214
220
  schemaImportPath,
215
221
  specImportPath,
216
222
  implImportPath
@@ -491,54 +497,100 @@ const logGenerated = (effect) => effect.pipe(Effect.tap(Option.match({
491
497
  * Test-only imports never enter the runtime schema or function wrappers.
492
498
  */
493
499
  const quote = (value) => JSON.stringify(value);
500
+ /**
501
+ * A mount's `testing` kit must be a package specifier, so the generated
502
+ * registry holds no machine-specific path, and must export `register`. A kit
503
+ * whose exports cannot be listed without running it passes here, and
504
+ * `TestConfect.layer` names the mount if it has no `register`.
505
+ */
506
+ const checkTestKit = Effect.fnUntraced(function* (mount, specifier, config, configDisplay) {
507
+ const path = yield* Path.Path;
508
+ const invalid = (problem) => new InvalidDeclarationError({
509
+ declarationPath: "confect/app.ts",
510
+ reason: `the mount ${quote(mount)} names the test kit ${quote(specifier)}${problem}`
511
+ });
512
+ if (specifier.startsWith(".") || path.isAbsolute(specifier)) return yield* invalid("; name it by a package specifier, such as \"<package>/testing\".");
513
+ const resolved = resolveModule(specifier, config);
514
+ if (Option.isNone(resolved)) return yield* invalid(`, which does not resolve from ${configDisplay}.`);
515
+ const exports = yield* exportNames(resolved.value).pipe(Effect.mapError((error) => fromBundlerError(specifier, error)));
516
+ if (Option.isSome(exports) && !exports.value.includes("register")) return yield* invalid(", which does not export `register(t, name)`.");
517
+ });
494
518
  const generateTesting = Effect.fnUntraced(function* (app) {
495
519
  const fs = yield* FileSystem.FileSystem;
496
520
  const path = yield* Path.Path;
497
521
  const confectDirectory = yield* ConfectDirectory.get;
498
522
  const convexDirectory = yield* ConvexDirectory.get;
499
523
  const generated = path.join(confectDirectory, "_generated");
524
+ const configDisplay = path.relative(yield* ProjectRoot.get, path.join(convexDirectory, CONVEX_CONFIG_FILENAME)).split(path.sep).join("/");
500
525
  const relative = (file) => {
501
526
  const value = path.relative(generated, file).split(path.sep).join("/");
502
527
  return value.startsWith(".") ? value : `./${value}`;
503
528
  };
504
- const imports = ["import schema from \"./schema\";", "import convexSchema from \"./convexSchema\";"];
529
+ const imports = ["import schema from \"./schema.js\";", "import convexSchema from \"./convexSchema.js\";"];
505
530
  const moduleMap = Effect.fnUntraced(function* (directory) {
506
531
  return `{ "_generated/testing.ts": () => Promise.resolve({}),\n${(yield* fs.readDirectory(directory, { recursive: true })).filter((file) => /\.[cm]?[jt]s$/.test(file) && !file.endsWith(".d.ts") && !file.split(path.sep).includes("_generated") && !file.includes(".config.")).sort().map((file) => {
507
532
  const specifier = relative(path.join(directory, file));
508
- return `${quote(file.split(path.sep).join("/"))}: () => import(${quote(specifier.replace(/\.[cm]?[jt]s$/, ""))}),`;
533
+ return `${quote(file.split(path.sep).join("/"))}: () => import(${quote(specifier.replace(/\.([cm]?)[jt]s$/, ".$1js"))}),`;
509
534
  }).join("\n")}\n}`;
510
535
  });
536
+ const declarations = [];
537
+ const identifiers = /* @__PURE__ */ new Set(["schema", "convexSchema"]);
511
538
  const components = [];
512
539
  const httpMounts = [];
513
540
  const kits = /* @__PURE__ */ new Map();
514
- const visit = Effect.fnUntraced(function* (directory, prefix, kind, parentHttpPrefix) {
541
+ const visit = Effect.fnUntraced(function* (directory, prefix, kind, parentHttpPrefix, registeredByKit) {
515
542
  const config = path.join(directory, CONVEX_CONFIG_FILENAME);
516
543
  if (!(yield* fs.exists(config))) return;
517
544
  const installed = yield* discoverInstalledComponents(config, relative(config), kind);
518
545
  for (const component of installed) {
519
546
  const name = prefix + component.name;
520
- const resolved = path.isAbsolute(component.componentDefinitionPath) ? component.componentDefinitionPath : path.dirname(yield* resolveDefinition(`${component.componentDefinitionPath}/convex.config`, config, path).pipe(Effect.fromOption, Effect.mapError(() => new InvalidConvexConfigError({
547
+ const mount = prefix === "" ? App.mounts(app).find((declared) => declared.name === component.name) : void 0;
548
+ const fromPackage = !path.isAbsolute(component.componentDefinitionPath);
549
+ const kitEntry = mount?.testing ?? (fromPackage ? `${component.componentDefinitionPath}/test` : void 0);
550
+ const resolved = fromPackage ? path.dirname(yield* resolveDefinition(`${component.componentDefinitionPath}/convex.config`, config, path).pipe(Effect.fromOption, Effect.mapError(() => new InvalidConvexConfigError({
521
551
  configPath: relative(config),
522
552
  reason: `Cannot resolve component ${component.componentDefinitionPath} for testing.`
523
- }))));
524
- const localPrefix = prefix === "" ? App.mounts(app).find((mount) => mount.name === component.name)?.httpPrefix : component.httpPrefix;
553
+ })))) : component.componentDefinitionPath;
554
+ const localPrefix = prefix === "" ? mount?.httpPrefix : component.httpPrefix;
525
555
  const httpPrefix = parentHttpPrefix === void 0 || localPrefix === void 0 ? void 0 : `${parentHttpPrefix.replace(/\/+$/, "")}${localPrefix}`.replace(/\/+$/, "") || "/";
526
556
  if (httpPrefix !== void 0 && ((yield* fs.exists(path.join(resolved, "http.ts"))) || (yield* fs.exists(path.join(resolved, "http.js"))))) httpMounts.push(`{ componentPath: ${quote(name)}, httpPrefix: ${quote(httpPrefix)} }`);
527
- let identifier = kits.get(resolved);
528
- if (identifier === void 0) {
529
- identifier = `component${kits.size}`;
530
- kits.set(resolved, identifier);
531
- imports.push(`import ${identifier}Schema from ${quote(relative(path.join(resolved, "schema")))};`);
532
- imports.push(`const ${identifier} = { schema: ${identifier}Schema, modules: ${yield* moduleMap(resolved)} };`);
557
+ if (!registeredByKit) {
558
+ const kitKey = kitEntry ?? resolved;
559
+ let identifier = kits.get(kitKey);
560
+ if (identifier === void 0) {
561
+ const cleaned = name.replaceAll(/[^A-Za-z0-9_$]/g, "_");
562
+ const base = /^[A-Za-z_$]/.test(cleaned) ? cleaned : `_${cleaned}`;
563
+ identifier = `${base}Kit`;
564
+ let schemaIdentifier = `${base}Schema`;
565
+ for (let n = 2; identifiers.has(identifier) || identifiers.has(schemaIdentifier); n++) {
566
+ identifier = `${base}Kit${n}`;
567
+ schemaIdentifier = `${base}Schema${n}`;
568
+ }
569
+ identifiers.add(identifier);
570
+ identifiers.add(schemaIdentifier);
571
+ kits.set(kitKey, identifier);
572
+ if (kitEntry === void 0) {
573
+ imports.push(`import ${schemaIdentifier} from ${quote(relative(path.join(resolved, "schema.js")))};`);
574
+ declarations.push(`const ${identifier} = { schema: ${schemaIdentifier}, modules: ${yield* moduleMap(resolved)} };`);
575
+ } else {
576
+ if (mount?.testing !== void 0) yield* checkTestKit(mount.name, mount.testing, config, configDisplay);
577
+ else if (Option.isNone(resolveModule(kitEntry, config))) return yield* new InvalidConvexConfigError({
578
+ configPath: relative(config),
579
+ reason: `the component package ${quote(component.componentDefinitionPath)} has no ${quote(kitEntry)} export. Tests register a component from another package through that entry's \`register(t, name)\`.`
580
+ });
581
+ imports.push(`import * as ${identifier} from ${quote(kitEntry)};`);
582
+ }
583
+ }
584
+ components.push(`${quote(name)}: ${identifier},`);
533
585
  }
534
- components.push(`${quote(name)}: ${identifier},`);
535
- yield* visit(resolved, `${name}/`, "component", httpPrefix);
586
+ if (!fromPackage) yield* visit(resolved, `${name}/`, "component", httpPrefix, registeredByKit || kitEntry !== void 0);
536
587
  }
537
588
  });
538
- yield* visit(convexDirectory, "", (yield* ConvexDirectory.target).kind, "");
589
+ yield* visit(convexDirectory, "", (yield* ConvexDirectory.target).kind, "", false);
539
590
  yield* writeFileStringAndLog(path.join(generated, "testing.ts"), [
540
591
  "// Generated by `confect codegen`. Test-only; do not import in backend functions.",
541
592
  ...imports,
593
+ ...declarations,
542
594
  `export default { httpMounts: [${httpMounts.join(",")}], schema, convexSchema, modules: ${yield* moduleMap(convexDirectory)}, components: {${components.join("\n")}} };`
543
595
  ].join("\n"));
544
596
  });
@@ -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","FunctionModule.assertOwnedEntrypoints","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","CodegenError.InvalidDeclarationError","Bundler.resolveModule","Bundler.exportNames","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.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* FunctionModule.assertOwnedEntrypoints;\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 const required = Option.isSome(declared)\n ? declared.value.requiresMiddleware\n : [];\n yield* validateAllImpls(leaves, required);\n yield* generateGroupRegisteredFunctions(leaves, required);\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 const declared = yield* syncDeclaration;\n const required = Option.isSome(declared)\n ? declared.value.requiresMiddleware\n : [];\n yield* validateAllImpls(leaves, required);\n yield* generateGroupRegisteredFunctions(leaves, required);\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 required: ReadonlyArray<{ readonly key: string }> = [],\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 required,\n groupPath: leaf.groupPathDot,\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\n/**\n * A mount's `testing` kit must be a package specifier, so the generated\n * registry holds no machine-specific path, and must export `register`. A kit\n * whose exports cannot be listed without running it passes here, and\n * `TestConfect.layer` names the mount if it has no `register`.\n */\nconst checkTestKit = Effect.fnUntraced(function* (\n mount: string,\n specifier: string,\n config: string,\n configDisplay: string,\n) {\n const path = yield* Path.Path;\n const invalid = (problem: string) =>\n new CodegenError.InvalidDeclarationError({\n declarationPath: \"confect/app.ts\",\n reason: `the mount ${quote(mount)} names the test kit ${quote(specifier)}${problem}`,\n });\n if (specifier.startsWith(\".\") || path.isAbsolute(specifier)) {\n return yield* invalid(\n '; name it by a package specifier, such as \"<package>/testing\".',\n );\n }\n const resolved = Bundler.resolveModule(specifier, config);\n if (Option.isNone(resolved)) {\n return yield* invalid(`, which does not resolve from ${configDisplay}.`);\n }\n const exports = yield* Bundler.exportNames(resolved.value).pipe(\n Effect.mapError((error) => fromBundlerError(specifier, error)),\n );\n if (Option.isSome(exports) && !exports.value.includes(\"register\")) {\n return yield* invalid(\", which does not export `register(t, name)`.\");\n }\n});\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 configDisplay = path\n .relative(\n yield* ProjectRoot.get,\n path.join(convexDirectory, ConvexConfig.CONVEX_CONFIG_FILENAME),\n )\n .split(path.sep)\n .join(\"/\");\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 registeredByKit: boolean,\n ): Effect.fn.Return<\n void,\n | PlatformError.PlatformError\n | BuildError\n | CodegenError.InvalidConvexConfigError\n | CodegenError.InvalidDeclarationError,\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 mount =\n prefix === \"\"\n ? App.mounts(app).find((declared) => declared.name === component.name)\n : undefined;\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 // or the kit its mount names.\n const fromPackage = !path.isAbsolute(component.componentDefinitionPath);\n const kitEntry =\n mount?.testing ??\n (fromPackage ? `${component.componentDefinitionPath}/test` : undefined);\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 === \"\" ? mount?.httpPrefix : 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 // A kit's `register` installs the mount's own children, so below it the\n // walk only collects HTTP mounts.\n if (!registeredByKit) {\n const kitKey = kitEntry ?? resolved;\n let identifier = kits.get(kitKey);\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(kitKey, identifier);\n if (kitEntry === undefined) {\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 } else {\n if (mount?.testing !== undefined) {\n yield* checkTestKit(\n mount.name,\n mount.testing,\n config,\n configDisplay,\n );\n } else if (Option.isNone(Bundler.resolveModule(kitEntry, config))) {\n return yield* new CodegenError.InvalidConvexConfigError({\n configPath: relative(config),\n reason: `the component package ${quote(component.componentDefinitionPath)} has no ${quote(kitEntry)} 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(kitEntry)};`);\n }\n }\n components.push(`${quote(name)}: ${identifier},`);\n }\n // A package's own `register` installs its children.\n if (!fromPackage) {\n yield* visit(\n resolved,\n `${name}/`,\n \"component\",\n httpPrefix,\n registeredByKit || kitEntry !== undefined,\n );\n }\n }\n });\n yield* visit(\n convexDirectory,\n \"\",\n (yield* ConvexDirectory.target).kind,\n \"\",\n false,\n );\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 legacyAuthConfig = yield* authConfig({ authImportPath: yield* toModuleImportPath(path.relative(convexDirectory, authPath)) });
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", [legacyAuthConfig]);
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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"}