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

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
@@ -10,8 +10,8 @@ import { functionPaths } from "../GenerationSnapshot.mjs";
10
10
  import { preserveComponentOutput } from "../Rollback.mjs";
11
11
  import { isDeclared } from "./declaration.mjs";
12
12
  import { Operation, Outcome, Phase, forBackend, isDirty, needsDeploymentNotification, plan, shouldRetry, transition } from "../SyncState.mjs";
13
- import { isRefreshSuccessful, make } from "../Watcher.mjs";
14
- import { EvaluationError, catchAndLog, generateSnapshot, loadPreviousFunctionPaths, updateDeclarations, validate } from "../Evaluation.mjs";
13
+ import { CoalesceQuiescence, isRefreshSuccessful, make } from "../Watcher.mjs";
14
+ import { EvaluationError, catchAndLog, generateSnapshot, loadPreviousFunctionPaths, prewarmedLayer, updateDeclarations, validate } from "../Evaluation.mjs";
15
15
  import * as Effect from "effect/Effect";
16
16
  import * as Command from "effect/cli/Command";
17
17
  import * as FileSystem from "effect/FileSystem";
@@ -26,6 +26,8 @@ import * as Ref from "effect/Ref";
26
26
  import * as String from "effect/String";
27
27
  import * as Console from "effect/Console";
28
28
  import * as Order from "effect/Order";
29
+ import * as Flag from "effect/cli/Flag";
30
+ import * as Duration from "effect/Duration";
29
31
  import * as Equal from "effect/Equal";
30
32
  //#region src/confect/dev.ts
31
33
  const changeChar = (change) => Match.value(change).pipe(Match.when("Added", () => ({
@@ -59,8 +61,11 @@ const devHandler = Effect.gen(function* () {
59
61
  const previousFunctionPaths = yield* loadPreviousFunctionPaths;
60
62
  const watcher = yield* make();
61
63
  yield* Effect.all([watcher.run, syncLoop(previousFunctionPaths, watcher)], { concurrency: "unbounded" });
62
- });
63
- const dev = Command.make("dev", flags, () => devHandler).pipe(Command.withDescription("Start the Confect development server"), Command.provide(layer));
64
+ }).pipe(Effect.provide(prewarmedLayer));
65
+ const dev = Command.make("dev", {
66
+ ...flags,
67
+ coalesceMs: Flag.Int("coalesce-ms").pipe(Flag.filter((ms) => ms >= 0 && ms <= 5e3, () => "Set --coalesce-ms to an integer between 0 and 5000 milliseconds."), Flag.withDefault(Duration.toMillis(CoalesceQuiescence.defaultValue())), Flag.withDescription("Quiet period before processing saved files, in milliseconds."))
68
+ }, ({ coalesceMs }) => devHandler.pipe(Effect.provideService(CoalesceQuiescence, Duration.millis(coalesceMs)))).pipe(Command.withDescription("Start the Confect development server"), Command.provide((options) => layer(options)));
64
69
  const esbuildMessageKey = (m) => `${m.location?.file ?? ""}:${m.location?.line ?? ""}:${m.location?.column ?? ""}:${m.text}`;
65
70
  const dedupeWatcherMessages = (messages) => pipe(messages, Array.dedupeWith((messageA, messageB) => esbuildMessageKey(messageA) === esbuildMessageKey(messageB)));
66
71
  const watcherMessagesSignature = (messages) => pipe(messages, Array.map(esbuildMessageKey), Array.dedupe, Array.sort(Order.String), Array.join("\n"));
@@ -1 +1 @@
1
- {"version":3,"file":"dev.mjs","names":["Ansi.green","Ansi.red","Ansi.magenta","Ansi.blackBright","FunctionPaths.diff","Evaluation.loadPreviousFunctionPaths","Watcher.make","DirectoryOptions.flags","DirectoryOptions.layer","SyncState.isDirty","SyncState.forBackend","SyncState.plan","GenerationSnapshot.functionPaths","Evaluation.catchAndLog","Watcher.isRefreshSuccessful","Evaluation.EvaluationError","validate","Evaluation.validate","Evaluation.generateSnapshot","Evaluation.updateDeclarations","SyncState.transition","SyncState.shouldRetry","SyncState.needsDeploymentNotification"],"sources":["../../src/confect/dev.ts"],"sourcesContent":["import * as Command from \"effect/cli/Command\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport { pipe } from \"effect/Function\";\nimport * as Array from \"effect/Array\";\nimport * as Console from \"effect/Console\";\nimport * as Effect from \"effect/Effect\";\nimport * as Equal from \"effect/Equal\";\nimport * as HashSet from \"effect/HashSet\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as Ref from \"effect/Ref\";\nimport * as Result from \"effect/Result\";\nimport * as String from \"effect/String\";\nimport type * as esbuild from \"esbuild\";\nimport * as Ansi from \"../Ansi\";\nimport { renderCodegenError } from \"../CodegenError\";\nimport * as SyncState from \"../SyncState\";\nimport type { OptionalFile } from \"../EntryPoint\";\nimport * as Watcher from \"../Watcher\";\nimport * as Evaluation from \"../Evaluation\";\nimport { ConvexDirectory } from \"../ConvexDirectory\";\nimport * as DirectoryOptions from \"../DirectoryOptions\";\nimport * as FunctionPaths from \"../FunctionPaths\";\nimport * as GenerationSnapshot from \"../GenerationSnapshot\";\nimport type { ImplModulePath } from \"../ImplModulePath\";\nimport type * as GroupPath from \"../GroupPath\";\nimport type * as GroupPaths from \"../GroupPaths\";\nimport {\n logCoalescedBuildErrors,\n logCoalescedBuildWarnings,\n logFunctionAdded,\n logFunctionRemoved,\n logPending,\n logSuccess,\n} from \"../log\";\nimport { ProjectRoot } from \"../ProjectRoot\";\nimport { preserveComponentOutput } from \"../Rollback\";\nimport {\n generateAuthConfig,\n generateCrons,\n generateHttp,\n touchConvexSchema,\n} from \"../utils\";\nimport { isDeclared } from \"./declaration\";\n\nconst changeChar = (change: \"Added\" | \"Removed\" | \"Modified\") =>\n Match.value(change).pipe(\n Match.when(\"Added\", () => ({ char: \"+\", color: Ansi.green })),\n Match.when(\"Removed\", () => ({ char: \"-\", color: Ansi.red })),\n Match.when(\"Modified\", () => ({ char: \"~\", color: Ansi.magenta })),\n Match.exhaustive,\n );\n\nconst logFileChangeIndented = Effect.fnUntraced(function* (\n change: \"Added\" | \"Removed\" | \"Modified\",\n fullPath: string,\n) {\n const projectRoot = yield* ProjectRoot.get;\n const path = yield* Path.Path;\n\n const prefix = projectRoot + path.sep;\n const suffix = pipe(fullPath, String.startsWith(prefix))\n ? pipe(fullPath, String.slice(prefix.length))\n : fullPath;\n\n const { char, color } = changeChar(change);\n\n yield* Console.log(\n `${color(char)} ${Ansi.blackBright(prefix)}${color(suffix)}`,\n );\n});\n\nconst logFunctionPathDiff = Effect.fnUntraced(function* (\n previous: FunctionPaths.FunctionPaths,\n current: FunctionPaths.FunctionPaths,\n) {\n const {\n functionsAdded,\n functionsRemoved,\n groupsRemoved,\n groupsAdded,\n groupsChanged,\n } = FunctionPaths.diff(previous, current);\n\n const logForGroups = (\n groupPaths: GroupPaths.GroupPaths,\n fnPaths: FunctionPaths.FunctionPaths,\n logFn: typeof logFunctionAdded,\n ) =>\n Effect.forEach(groupPaths, (gp) =>\n Effect.forEach(\n Array.fromIterable(\n HashSet.filter(fnPaths, (fp) => Equal.equals(fp.groupPath, gp)),\n ),\n logFn,\n ),\n );\n\n yield* logForGroups(groupsRemoved, functionsRemoved, logFunctionRemoved);\n yield* logForGroups(groupsAdded, functionsAdded, logFunctionAdded);\n yield* Effect.forEach(\n groupsChanged,\n Effect.fnUntraced(function* (gp: GroupPath.GroupPath) {\n yield* Effect.forEach(\n Array.fromIterable(\n HashSet.filter(functionsAdded, (fp) =>\n Equal.equals(fp.groupPath, gp),\n ),\n ),\n logFunctionAdded,\n );\n yield* Effect.forEach(\n Array.fromIterable(\n HashSet.filter(functionsRemoved, (fp) =>\n Equal.equals(fp.groupPath, gp),\n ),\n ),\n logFunctionRemoved,\n );\n }),\n );\n});\n\nexport const devHandler = Effect.gen(function* () {\n yield* logPending(\"Performing initial sync…\");\n const previousFunctionPaths = yield* Evaluation.loadPreviousFunctionPaths;\n\n const watcher = yield* Watcher.make();\n\n yield* Effect.all([watcher.run, syncLoop(previousFunctionPaths, watcher)], {\n concurrency: \"unbounded\",\n });\n});\n\nexport const dev = Command.make(\n \"dev\",\n DirectoryOptions.flags,\n () => devHandler,\n).pipe(\n Command.withDescription(\"Start the Confect development server\"),\n Command.provide(DirectoryOptions.layer),\n);\n\nconst esbuildMessageKey = (m: esbuild.Message): string =>\n `${m.location?.file ?? \"\"}:${m.location?.line ?? \"\"}:${m.location?.column ?? \"\"}:${m.text}`;\n\nconst dedupeWatcherMessages = (\n messages: ReadonlyArray<esbuild.Message>,\n): ReadonlyArray<esbuild.Message> =>\n pipe(\n messages,\n Array.dedupeWith(\n (messageA, messageB) =>\n esbuildMessageKey(messageA) === esbuildMessageKey(messageB),\n ),\n );\n\nconst watcherMessagesSignature = (\n messages: ReadonlyArray<esbuild.Message>,\n): string =>\n pipe(\n messages,\n Array.map(esbuildMessageKey),\n Array.dedupe,\n Array.sort(Order.String),\n Array.join(\"\\n\"),\n );\n\n/**\n * Log any watcher messages (errors or warnings) that haven't already been\n * logged at their current signature. Suppresses the per-watcher fanout that\n * happens when one root cause (e.g. a missing import) breaks every entry\n * point's build at the same source location.\n */\nconst logChangedWatcherMessages = Effect.fnUntraced(function* (\n messages: ReadonlyArray<esbuild.Message>,\n lastLoggedSignatureRef: Ref.Ref<string>,\n log: (messages: ReadonlyArray<esbuild.Message>) => Effect.Effect<void>,\n) {\n const signature = watcherMessagesSignature(messages);\n const previous = yield* Ref.get(lastLoggedSignatureRef);\n if (signature === previous) return;\n yield* Ref.set(lastLoggedSignatureRef, signature);\n if (messages.length === 0) return;\n yield* log(dedupeWatcherMessages(messages));\n});\n\nconst syncLoop = Effect.fnUntraced(function* (\n initialFunctionPaths: FunctionPaths.FunctionPaths,\n watcher: Watcher.Watcher,\n) {\n const functionPathsRef = yield* Ref.make(initialFunctionPaths);\n const lastLoggedErrorsRef = yield* Ref.make<string>(\"\");\n const lastLoggedWarningsRef = yield* Ref.make<string>(\"\");\n const phaseRef = yield* Ref.make<SyncState.Phase>(\n SyncState.Phase.Bootstrapping(),\n );\n const optionalPendingRef = yield* Ref.make(HashSet.empty<OptionalFile>());\n const logMessages = Effect.gen(function* () {\n const { errors, warnings } = yield* watcher.diagnostics;\n yield* logChangedWatcherMessages(\n errors,\n lastLoggedErrorsRef,\n logCoalescedBuildErrors,\n );\n yield* logChangedWatcherMessages(\n warnings,\n lastLoggedWarningsRef,\n logCoalescedBuildWarnings,\n );\n });\n\n return yield* Effect.forever(\n Effect.gen(function* () {\n yield* Effect.logDebug(\"Running sync loop…\");\n const taken = yield* watcher.next;\n\n const phase = yield* Ref.get(phaseRef);\n const firstSync = SyncState.Phase.$is(\"Bootstrapping\")(phase);\n if (!firstSync) yield* logMessages;\n\n if (!SyncState.isDirty(taken)) return;\n\n const declared = yield* isDeclared;\n const pending = SyncState.forBackend(\n {\n ...taken,\n optional: yield* Ref.updateAndGet(\n optionalPendingRef,\n HashSet.union(taken.optional),\n ),\n },\n {\n declared,\n component: (yield* ConvexDirectory.target).kind === \"component\",\n },\n );\n const optional = pending.optional;\n const operation = SyncState.plan(phase, pending);\n yield* Effect.logDebug(\"Planned development sync\").pipe(\n Effect.annotateLogs({\n phase: phase._tag,\n work: pending.work._tag,\n operation: operation._tag,\n }),\n );\n if (\n !firstSync &&\n !(\n SyncState.Operation.$is(\"Validate\")(operation) &&\n operation.paths.length === 0\n )\n )\n yield* logPending(\"Dependencies may have changed, reloading…\");\n\n const regenerate = <R>(\n generation: Effect.Effect<\n GenerationSnapshot.GenerationSnapshot,\n Effect.Error<typeof Evaluation.generateSnapshot>,\n R\n >,\n ) =>\n Effect.gen(function* () {\n const current = yield* generation.pipe(\n Effect.tap((snapshot) =>\n Effect.gen(function* () {\n const nextFunctionPaths =\n GenerationSnapshot.functionPaths(snapshot);\n const previous = yield* Ref.get(functionPathsRef);\n yield* logFunctionPathDiff(previous, nextFunctionPaths);\n yield* Ref.set(functionPathsRef, nextFunctionPaths);\n }),\n ),\n Evaluation.catchAndLog,\n );\n if (Option.isNone(current)) {\n return SyncState.Outcome.GenerationFailed();\n }\n const refreshed = yield* watcher.refresh.pipe(Effect.result);\n if (Result.isFailure(refreshed)) {\n yield* Console.error(\n `Dependency watcher could not ${refreshed.failure.operation}: ${globalThis.String(refreshed.failure.cause)}`,\n );\n return SyncState.Outcome.ReconciliationFailed();\n }\n if (!Watcher.isRefreshSuccessful(refreshed.success)) {\n yield* logMessages;\n return SyncState.Outcome.ReconciliationFailed();\n }\n return SyncState.Outcome.Succeeded({ snapshot: current.value });\n });\n const preserved = <R>(\n generation: Effect.Effect<\n GenerationSnapshot.GenerationSnapshot,\n Effect.Error<typeof Evaluation.generateSnapshot>,\n R\n >,\n ) =>\n preserveComponentOutput(generation, watcher.duringRestore).pipe(\n Effect.tapErrorTag(\n \"ComponentNodeGroupError\",\n () => watcher.discardRestoreEchoes,\n ),\n Effect.catchTags({\n RemoveBusyError: (error) =>\n Effect.fail(\n new Evaluation.EvaluationError({\n diagnostic: renderCodegenError(error),\n }),\n ),\n // Output that cannot be restored leaves nothing to serve.\n PlatformError: Effect.die,\n }),\n );\n const validate = (\n paths: ReadonlyArray<ImplModulePath>,\n snapshot: GenerationSnapshot.GenerationSnapshot,\n ) =>\n Effect.gen(function* () {\n if (Array.isReadonlyArrayNonEmpty(paths)) {\n const validated = yield* Evaluation.validate(paths).pipe(\n Evaluation.catchAndLog,\n );\n if (Option.isNone(validated)) {\n return SyncState.Outcome.ValidationFailed({ paths, snapshot });\n }\n }\n return SyncState.Outcome.Succeeded({ snapshot });\n });\n const outcome = yield* SyncState.Operation.$match(operation, {\n Generate: () => regenerate(preserved(Evaluation.generateSnapshot)),\n Validate: ({ paths, snapshot }) => validate(paths, snapshot),\n Update: ({ snapshot, declarations, paths }) =>\n regenerate(\n preserved(\n Evaluation.updateDeclarations(snapshot, declarations, paths),\n ),\n ),\n });\n yield* Ref.set(phaseRef, SyncState.transition(outcome));\n if (SyncState.shouldRetry(phase, outcome)) {\n yield* watcher.requestRetry;\n }\n if (!SyncState.Outcome.$is(\"Succeeded\")(outcome)) return;\n\n const dirtyOptionalFiles = [\n ...(HashSet.has(optional, \"Http\")\n ? [syncOptionalFile(generateHttp, \"http.ts\")]\n : []),\n ...(HashSet.has(optional, \"Crons\")\n ? [syncOptionalFile(generateCrons, \"crons.ts\")]\n : []),\n ...(HashSet.has(optional, \"Auth\")\n ? [syncOptionalFile(generateAuthConfig, \"auth.config.ts\")]\n : []),\n ];\n\n yield* Array.isReadonlyArrayNonEmpty(dirtyOptionalFiles)\n ? Effect.all(dirtyOptionalFiles, { concurrency: \"unbounded\" })\n : Effect.void;\n yield* Ref.set(optionalPendingRef, HashSet.empty());\n\n if (SyncState.needsDeploymentNotification(phase))\n yield* touchConvexSchema;\n\n if (!SyncState.isDirty(yield* watcher.pending)) {\n yield* logSuccess(\"Generated files are up-to-date\");\n }\n }),\n );\n});\n\nconst syncOptionalFile = (generate: typeof generateHttp, convexFile: string) =>\n pipe(\n generate,\n Effect.andThen(\n Option.match({\n onSome: ({ change, convexFilePath }) =>\n Match.value(change).pipe(\n Match.when(\"Unchanged\", () => Effect.void),\n Match.whenOr(\"Added\", \"Modified\", (addedOrModified) =>\n logFileChangeIndented(addedOrModified, convexFilePath),\n ),\n Match.exhaustive,\n ),\n onNone: () =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n const convexFilePath = path.join(convexDirectory, convexFile);\n\n if (yield* fs.exists(convexFilePath)) {\n yield* fs.remove(convexFilePath);\n yield* logFileChangeIndented(\"Removed\", convexFilePath);\n }\n }),\n }),\n ),\n );\n"],"mappings":"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"}
1
+ {"version":3,"file":"dev.mjs","names":["Ansi.green","Ansi.red","Ansi.magenta","Ansi.blackBright","FunctionPaths.diff","Evaluation.loadPreviousFunctionPaths","Watcher.make","Evaluation.prewarmedLayer","DirectoryOptions.flags","Watcher.CoalesceQuiescence","DirectoryOptions.layer","SyncState.isDirty","SyncState.forBackend","SyncState.plan","GenerationSnapshot.functionPaths","Evaluation.catchAndLog","Watcher.isRefreshSuccessful","Evaluation.EvaluationError","validate","Evaluation.validate","Evaluation.generateSnapshot","Evaluation.updateDeclarations","SyncState.transition","SyncState.shouldRetry","SyncState.needsDeploymentNotification"],"sources":["../../src/confect/dev.ts"],"sourcesContent":["import * as Command from \"effect/cli/Command\";\nimport * as Flag from \"effect/cli/Flag\";\nimport * as Duration from \"effect/Duration\";\nimport * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport { pipe } from \"effect/Function\";\nimport * as Array from \"effect/Array\";\nimport * as Console from \"effect/Console\";\nimport * as Effect from \"effect/Effect\";\nimport * as Equal from \"effect/Equal\";\nimport * as HashSet from \"effect/HashSet\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Order from \"effect/Order\";\nimport * as Ref from \"effect/Ref\";\nimport * as Result from \"effect/Result\";\nimport * as String from \"effect/String\";\nimport type * as esbuild from \"esbuild\";\nimport * as Ansi from \"../Ansi.js\";\nimport { renderCodegenError } from \"../CodegenError.js\";\nimport * as SyncState from \"../SyncState.js\";\nimport type { OptionalFile } from \"../EntryPoint.js\";\nimport * as Watcher from \"../Watcher.js\";\nimport * as Evaluation from \"../Evaluation.js\";\nimport { ConvexDirectory } from \"../ConvexDirectory.js\";\nimport * as DirectoryOptions from \"../DirectoryOptions.js\";\nimport * as FunctionPaths from \"../FunctionPaths.js\";\nimport * as GenerationSnapshot from \"../GenerationSnapshot.js\";\nimport type { ImplModulePath } from \"../ImplModulePath.js\";\nimport type * as GroupPath from \"../GroupPath.js\";\nimport type * as GroupPaths from \"../GroupPaths.js\";\nimport {\n logCoalescedBuildErrors,\n logCoalescedBuildWarnings,\n logFunctionAdded,\n logFunctionRemoved,\n logPending,\n logSuccess,\n} from \"../log.js\";\nimport { ProjectRoot } from \"../ProjectRoot.js\";\nimport { preserveComponentOutput } from \"../Rollback.js\";\nimport {\n generateAuthConfig,\n generateCrons,\n generateHttp,\n touchConvexSchema,\n} from \"../utils.js\";\nimport { isDeclared } from \"./declaration.js\";\n\nconst changeChar = (change: \"Added\" | \"Removed\" | \"Modified\") =>\n Match.value(change).pipe(\n Match.when(\"Added\", () => ({ char: \"+\", color: Ansi.green })),\n Match.when(\"Removed\", () => ({ char: \"-\", color: Ansi.red })),\n Match.when(\"Modified\", () => ({ char: \"~\", color: Ansi.magenta })),\n Match.exhaustive,\n );\n\nconst logFileChangeIndented = Effect.fnUntraced(function* (\n change: \"Added\" | \"Removed\" | \"Modified\",\n fullPath: string,\n) {\n const projectRoot = yield* ProjectRoot.get;\n const path = yield* Path.Path;\n\n const prefix = projectRoot + path.sep;\n const suffix = pipe(fullPath, String.startsWith(prefix))\n ? pipe(fullPath, String.slice(prefix.length))\n : fullPath;\n\n const { char, color } = changeChar(change);\n\n yield* Console.log(\n `${color(char)} ${Ansi.blackBright(prefix)}${color(suffix)}`,\n );\n});\n\nconst logFunctionPathDiff = Effect.fnUntraced(function* (\n previous: FunctionPaths.FunctionPaths,\n current: FunctionPaths.FunctionPaths,\n) {\n const {\n functionsAdded,\n functionsRemoved,\n groupsRemoved,\n groupsAdded,\n groupsChanged,\n } = FunctionPaths.diff(previous, current);\n\n const logForGroups = (\n groupPaths: GroupPaths.GroupPaths,\n fnPaths: FunctionPaths.FunctionPaths,\n logFn: typeof logFunctionAdded,\n ) =>\n Effect.forEach(groupPaths, (gp) =>\n Effect.forEach(\n Array.fromIterable(\n HashSet.filter(fnPaths, (fp) => Equal.equals(fp.groupPath, gp)),\n ),\n logFn,\n ),\n );\n\n yield* logForGroups(groupsRemoved, functionsRemoved, logFunctionRemoved);\n yield* logForGroups(groupsAdded, functionsAdded, logFunctionAdded);\n yield* Effect.forEach(\n groupsChanged,\n Effect.fnUntraced(function* (gp: GroupPath.GroupPath) {\n yield* Effect.forEach(\n Array.fromIterable(\n HashSet.filter(functionsAdded, (fp) =>\n Equal.equals(fp.groupPath, gp),\n ),\n ),\n logFunctionAdded,\n );\n yield* Effect.forEach(\n Array.fromIterable(\n HashSet.filter(functionsRemoved, (fp) =>\n Equal.equals(fp.groupPath, gp),\n ),\n ),\n logFunctionRemoved,\n );\n }),\n );\n});\n\nexport const devHandler = Effect.gen(function* () {\n yield* logPending(\"Performing initial sync…\");\n const previousFunctionPaths = yield* Evaluation.loadPreviousFunctionPaths;\n\n const watcher = yield* Watcher.make();\n\n yield* Effect.all([watcher.run, syncLoop(previousFunctionPaths, watcher)], {\n concurrency: \"unbounded\",\n });\n}).pipe(Effect.provide(Evaluation.prewarmedLayer));\n\nexport const dev = Command.make(\n \"dev\",\n {\n ...DirectoryOptions.flags,\n coalesceMs: Flag.Int(\"coalesce-ms\").pipe(\n Flag.filter(\n (ms) => ms >= 0 && ms <= 5000,\n () =>\n \"Set --coalesce-ms to an integer between 0 and 5000 milliseconds.\",\n ),\n Flag.withDefault(\n Duration.toMillis(Watcher.CoalesceQuiescence.defaultValue()),\n ),\n Flag.withDescription(\n \"Quiet period before processing saved files, in milliseconds.\",\n ),\n ),\n },\n ({ coalesceMs }) =>\n devHandler.pipe(\n Effect.provideService(\n Watcher.CoalesceQuiescence,\n Duration.millis(coalesceMs),\n ),\n ),\n).pipe(\n Command.withDescription(\"Start the Confect development server\"),\n Command.provide(\n (options: { componentDir: Option.Option<string>; coalesceMs: number }) =>\n DirectoryOptions.layer(options),\n ),\n);\n\nconst esbuildMessageKey = (m: esbuild.Message): string =>\n `${m.location?.file ?? \"\"}:${m.location?.line ?? \"\"}:${m.location?.column ?? \"\"}:${m.text}`;\n\nconst dedupeWatcherMessages = (\n messages: ReadonlyArray<esbuild.Message>,\n): ReadonlyArray<esbuild.Message> =>\n pipe(\n messages,\n Array.dedupeWith(\n (messageA, messageB) =>\n esbuildMessageKey(messageA) === esbuildMessageKey(messageB),\n ),\n );\n\nconst watcherMessagesSignature = (\n messages: ReadonlyArray<esbuild.Message>,\n): string =>\n pipe(\n messages,\n Array.map(esbuildMessageKey),\n Array.dedupe,\n Array.sort(Order.String),\n Array.join(\"\\n\"),\n );\n\n/**\n * Log any watcher messages (errors or warnings) that haven't already been\n * logged at their current signature. Suppresses the per-watcher fanout that\n * happens when one root cause (e.g. a missing import) breaks every entry\n * point's build at the same source location.\n */\nconst logChangedWatcherMessages = Effect.fnUntraced(function* (\n messages: ReadonlyArray<esbuild.Message>,\n lastLoggedSignatureRef: Ref.Ref<string>,\n log: (messages: ReadonlyArray<esbuild.Message>) => Effect.Effect<void>,\n) {\n const signature = watcherMessagesSignature(messages);\n const previous = yield* Ref.get(lastLoggedSignatureRef);\n if (signature === previous) return;\n yield* Ref.set(lastLoggedSignatureRef, signature);\n if (messages.length === 0) return;\n yield* log(dedupeWatcherMessages(messages));\n});\n\nconst syncLoop = Effect.fnUntraced(function* (\n initialFunctionPaths: FunctionPaths.FunctionPaths,\n watcher: Watcher.Watcher,\n) {\n const functionPathsRef = yield* Ref.make(initialFunctionPaths);\n const lastLoggedErrorsRef = yield* Ref.make<string>(\"\");\n const lastLoggedWarningsRef = yield* Ref.make<string>(\"\");\n const phaseRef = yield* Ref.make<SyncState.Phase>(\n SyncState.Phase.Bootstrapping(),\n );\n const optionalPendingRef = yield* Ref.make(HashSet.empty<OptionalFile>());\n const logMessages = Effect.gen(function* () {\n const { errors, warnings } = yield* watcher.diagnostics;\n yield* logChangedWatcherMessages(\n errors,\n lastLoggedErrorsRef,\n logCoalescedBuildErrors,\n );\n yield* logChangedWatcherMessages(\n warnings,\n lastLoggedWarningsRef,\n logCoalescedBuildWarnings,\n );\n });\n\n return yield* Effect.forever(\n Effect.gen(function* () {\n yield* Effect.logDebug(\"Running sync loop…\");\n const taken = yield* watcher.next;\n\n const phase = yield* Ref.get(phaseRef);\n const firstSync = SyncState.Phase.$is(\"Bootstrapping\")(phase);\n if (!firstSync) yield* logMessages;\n\n if (!SyncState.isDirty(taken)) return;\n\n const declared = yield* isDeclared;\n const pending = SyncState.forBackend(\n {\n ...taken,\n optional: yield* Ref.updateAndGet(\n optionalPendingRef,\n HashSet.union(taken.optional),\n ),\n },\n {\n declared,\n component: (yield* ConvexDirectory.target).kind === \"component\",\n },\n );\n const optional = pending.optional;\n const operation = SyncState.plan(phase, pending);\n yield* Effect.logDebug(\"Planned development sync\").pipe(\n Effect.annotateLogs({\n phase: phase._tag,\n work: pending.work._tag,\n operation: operation._tag,\n }),\n );\n if (\n !firstSync &&\n !(\n SyncState.Operation.$is(\"Validate\")(operation) &&\n operation.paths.length === 0\n )\n )\n yield* logPending(\"Dependencies may have changed, reloading…\");\n\n const regenerate = <R>(\n generation: Effect.Effect<\n GenerationSnapshot.GenerationSnapshot,\n Effect.Error<typeof Evaluation.generateSnapshot>,\n R\n >,\n ) =>\n Effect.gen(function* () {\n const current = yield* generation.pipe(\n Effect.tap((snapshot) =>\n Effect.gen(function* () {\n const nextFunctionPaths =\n GenerationSnapshot.functionPaths(snapshot);\n const previous = yield* Ref.get(functionPathsRef);\n yield* logFunctionPathDiff(previous, nextFunctionPaths);\n yield* Ref.set(functionPathsRef, nextFunctionPaths);\n }),\n ),\n Evaluation.catchAndLog,\n );\n if (Option.isNone(current)) {\n return SyncState.Outcome.GenerationFailed();\n }\n const refreshed = yield* watcher.refresh.pipe(Effect.result);\n if (Result.isFailure(refreshed)) {\n yield* Console.error(\n `Dependency watcher could not ${refreshed.failure.operation}: ${globalThis.String(refreshed.failure.cause)}`,\n );\n return SyncState.Outcome.ReconciliationFailed();\n }\n if (!Watcher.isRefreshSuccessful(refreshed.success)) {\n yield* logMessages;\n return SyncState.Outcome.ReconciliationFailed();\n }\n return SyncState.Outcome.Succeeded({ snapshot: current.value });\n });\n const preserved = <R>(\n generation: Effect.Effect<\n GenerationSnapshot.GenerationSnapshot,\n Effect.Error<typeof Evaluation.generateSnapshot>,\n R\n >,\n ) =>\n preserveComponentOutput(generation, watcher.duringRestore).pipe(\n Effect.tapErrorTag(\n \"ComponentNodeGroupError\",\n () => watcher.discardRestoreEchoes,\n ),\n Effect.catchTags({\n RemoveBusyError: (error) =>\n Effect.fail(\n new Evaluation.EvaluationError({\n diagnostic: renderCodegenError(error),\n }),\n ),\n // Output that cannot be restored leaves nothing to serve.\n PlatformError: Effect.die,\n }),\n );\n const validate = (\n paths: ReadonlyArray<ImplModulePath>,\n snapshot: GenerationSnapshot.GenerationSnapshot,\n ) =>\n Effect.gen(function* () {\n if (Array.isReadonlyArrayNonEmpty(paths)) {\n const validated = yield* Evaluation.validate(paths).pipe(\n Evaluation.catchAndLog,\n );\n if (Option.isNone(validated)) {\n return SyncState.Outcome.ValidationFailed({ paths, snapshot });\n }\n }\n return SyncState.Outcome.Succeeded({ snapshot });\n });\n const outcome = yield* SyncState.Operation.$match(operation, {\n Generate: () => regenerate(preserved(Evaluation.generateSnapshot)),\n Validate: ({ paths, snapshot }) => validate(paths, snapshot),\n Update: ({ snapshot, declarations, paths }) =>\n regenerate(\n preserved(\n Evaluation.updateDeclarations(snapshot, declarations, paths),\n ),\n ),\n });\n yield* Ref.set(phaseRef, SyncState.transition(outcome));\n if (SyncState.shouldRetry(phase, outcome)) {\n yield* watcher.requestRetry;\n }\n if (!SyncState.Outcome.$is(\"Succeeded\")(outcome)) return;\n\n const dirtyOptionalFiles = [\n ...(HashSet.has(optional, \"Http\")\n ? [syncOptionalFile(generateHttp, \"http.ts\")]\n : []),\n ...(HashSet.has(optional, \"Crons\")\n ? [syncOptionalFile(generateCrons, \"crons.ts\")]\n : []),\n ...(HashSet.has(optional, \"Auth\")\n ? [syncOptionalFile(generateAuthConfig, \"auth.config.ts\")]\n : []),\n ];\n\n yield* Array.isReadonlyArrayNonEmpty(dirtyOptionalFiles)\n ? Effect.all(dirtyOptionalFiles, { concurrency: \"unbounded\" })\n : Effect.void;\n yield* Ref.set(optionalPendingRef, HashSet.empty());\n\n if (SyncState.needsDeploymentNotification(phase))\n yield* touchConvexSchema;\n\n if (!SyncState.isDirty(yield* watcher.pending)) {\n yield* logSuccess(\"Generated files are up-to-date\");\n }\n }),\n );\n});\n\nconst syncOptionalFile = (generate: typeof generateHttp, convexFile: string) =>\n pipe(\n generate,\n Effect.andThen(\n Option.match({\n onSome: ({ change, convexFilePath }) =>\n Match.value(change).pipe(\n Match.when(\"Unchanged\", () => Effect.void),\n Match.whenOr(\"Added\", \"Modified\", (addedOrModified) =>\n logFileChangeIndented(addedOrModified, convexFilePath),\n ),\n Match.exhaustive,\n ),\n onNone: () =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n const convexFilePath = path.join(convexDirectory, convexFile);\n\n if (yield* fs.exists(convexFilePath)) {\n yield* fs.remove(convexFilePath);\n yield* logFileChangeIndented(\"Removed\", convexFilePath);\n }\n }),\n }),\n ),\n );\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"confect.mjs","names":[],"sources":["../src/confect.ts"],"sourcesContent":["import * as Command from \"effect/cli/Command\";\nimport { codegen } from \"./confect/codegen\";\nimport { dev } from \"./confect/dev\";\n\nexport const confect = Command.make(\"confect\").pipe(\n Command.withDescription(\"Generate and sync Confect files with Convex\"),\n Command.withSubcommands([codegen, dev]),\n);\n"],"mappings":";;;;AAIA,MAAa,UAAU,QAAQ,KAAK,SAAS,CAAC,CAAC,KAC7C,QAAQ,gBAAgB,6CAA6C,GACrE,QAAQ,gBAAgB,CAAC,SAAS,GAAG,CAAC,CACxC"}
1
+ {"version":3,"file":"confect.mjs","names":[],"sources":["../src/confect.ts"],"sourcesContent":["import * as Command from \"effect/cli/Command\";\nimport { codegen } from \"./confect/codegen.js\";\nimport { dev } from \"./confect/dev.js\";\n\nexport const confect = Command.make(\"confect\").pipe(\n Command.withDescription(\"Generate and sync Confect files with Convex\"),\n Command.withSubcommands([codegen, dev]),\n);\n"],"mappings":";;;;AAIA,MAAa,UAAU,QAAQ,KAAK,SAAS,CAAC,CAAC,KAC7C,QAAQ,gBAAgB,6CAA6C,GACrE,QAAQ,gBAAgB,CAAC,SAAS,GAAG,CAAC,CACxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport * as NodeRuntime from \"@effect/platform-node/NodeRuntime\";\nimport * as Effect from \"effect/Effect\";\nimport { cliApp } from \"./cliApp\";\n\n// Track if we received SIGINT so we can re-raise it after cleanup.\n// This ensures proper terminal state restoration when run via e.g. `pnpm`.\nconst canReRaiseSignals = process.platform !== \"win32\";\n\nlet interrupted = false;\nprocess.prependListener(\"SIGINT\", () => {\n interrupted = true;\n});\nprocess.on(\"exit\", () => {\n if (interrupted && canReRaiseSignals) {\n process.kill(process.pid, \"SIGINT\");\n }\n});\n\ncliApp.pipe(Effect.provide(NodeServices.layer), NodeRuntime.runMain);\n"],"mappings":";;;;;;AASA,MAAM,oBAAoB,QAAQ,aAAa;AAE/C,IAAI,cAAc;AAClB,QAAQ,gBAAgB,gBAAgB;CACtC,cAAc;AAChB,CAAC;AACD,QAAQ,GAAG,cAAc;CACvB,IAAI,eAAe,mBACjB,QAAQ,KAAK,QAAQ,KAAK,QAAQ;AAEtC,CAAC;AAED,OAAO,KAAK,OAAO,QAAQ,aAAa,KAAK,GAAG,YAAY,OAAO"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport * as NodeRuntime from \"@effect/platform-node/NodeRuntime\";\nimport * as Effect from \"effect/Effect\";\nimport { cliApp } from \"./cliApp.js\";\n\n// Track if we received SIGINT so we can re-raise it after cleanup.\n// This ensures proper terminal state restoration when run via e.g. `pnpm`.\nconst canReRaiseSignals = process.platform !== \"win32\";\n\nlet interrupted = false;\nprocess.prependListener(\"SIGINT\", () => {\n interrupted = true;\n});\nprocess.on(\"exit\", () => {\n if (interrupted && canReRaiseSignals) {\n process.kill(process.pid, \"SIGINT\");\n }\n});\n\ncliApp.pipe(Effect.provide(NodeServices.layer), NodeRuntime.runMain);\n"],"mappings":";;;;;;AASA,MAAM,oBAAoB,QAAQ,aAAa;AAE/C,IAAI,cAAc;AAClB,QAAQ,gBAAgB,gBAAgB;CACtC,cAAc;AAChB,CAAC;AACD,QAAQ,GAAG,cAAc;CACvB,IAAI,eAAe,mBACjB,QAAQ,KAAK,QAAQ,KAAK,QAAQ;AAEtC,CAAC;AAED,OAAO,KAAK,OAAO,QAAQ,aAAa,KAAK,GAAG,YAAY,OAAO"}
package/dist/log.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"log.mjs","names":["Ansi.blackBright","Ansi.green","Ansi.red","Ansi.yellow","GroupPath.toString"],"sources":["../src/log.ts"],"sourcesContent":["import { pipe } from \"effect/Function\";\nimport * as Array from \"effect/Array\";\nimport * as Console from \"effect/Console\";\nimport * as Effect from \"effect/Effect\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Path from \"effect/Path\";\nimport * as Predicate from \"effect/Predicate\";\nimport * as String from \"effect/String\";\nimport * as esbuild from \"esbuild\";\nimport type {\n BuildError,\n BundleFailedError,\n ImportFailedError,\n} from \"./BuildError\";\nimport * as Ansi from \"./Ansi\";\nimport type * as FunctionPath from \"./FunctionPath\";\nimport * as GroupPath from \"./GroupPath\";\nimport { ProjectRoot } from \"./ProjectRoot\";\n\n// --- Path styling ---\n\n/**\n * Render a relative path with the directory portion dimmed (`Ansi.blackBright`)\n * and the file leaf rendered in the default terminal color.\n */\nexport const formatPath = (relativePath: string): string => {\n const lastSep = Math.max(\n relativePath.lastIndexOf(\"/\"),\n relativePath.lastIndexOf(\"\\\\\"),\n );\n const dir = lastSep < 0 ? \"\" : relativePath.slice(0, lastSep + 1);\n const leaf = lastSep < 0 ? relativePath : relativePath.slice(lastSep + 1);\n return Ansi.blackBright(dir) + leaf;\n};\n\n// --- File operation logs ---\n\nconst logFile = (char: string, color: Ansi.Style) =>\n Effect.fnUntraced(function* (fullPath: string) {\n const projectRoot = yield* ProjectRoot.get;\n const path = yield* Path.Path;\n\n const prefix = projectRoot + path.sep;\n const suffix = pipe(fullPath, String.startsWith(prefix))\n ? pipe(fullPath, String.slice(prefix.length))\n : fullPath;\n\n yield* Console.log(\n `${color(char)} ${Ansi.blackBright(prefix)}${color(suffix)}`,\n );\n });\n\nexport const logFileAdded = logFile(\"+\", Ansi.green);\n\nexport const logFileRemoved = logFile(\"-\", Ansi.red);\n\nexport const logFileModified = logFile(\"~\", Ansi.yellow);\n\n// --- Function subline logs ---\n\nconst logFunction =\n (char: string, color: Ansi.Style) =>\n (functionPath: FunctionPath.FunctionPath) =>\n Console.log(\n ` ${color(char)} ${Ansi.blackBright(\n GroupPath.toString(functionPath.groupPath) + \".\",\n )}${color(functionPath.name)}`,\n );\n\nexport const logFunctionAdded = logFunction(\"+\", Ansi.green);\n\nexport const logFunctionRemoved = logFunction(\"-\", Ansi.red);\n\n// --- Process status logs ---\n\nconst logStatus = (char: string, charColor: Ansi.Style) => (message: string) =>\n Console.log(`${charColor(char)} ${message}`);\n\nexport const logSuccess = logStatus(\"✔︎\", Ansi.green);\n\nexport const logFailure = logStatus(\"✘\", Ansi.red);\n\nexport const logPending = logStatus(\"⭘\", Ansi.yellow);\n\nexport const logWarn = logStatus(\"⚠\", Ansi.yellow);\n\n// --- Build message rendering ---\n\nconst cross = Ansi.red(\"✘\");\n\nconst warningSign = Ansi.yellow(\"⚠\");\n\nconst gutter = (color: Ansi.Style): string => color(\"│\");\n\nconst errorGutter = gutter(Ansi.red);\n\nconst withGutterBlock =\n (gutterChar: string) =>\n (output: string): string =>\n pipe(\n String.split(output, \"\\n\"),\n Array.map((line) =>\n pipe(line, String.trim) === \"\" ? gutterChar : `${gutterChar} ${line}`,\n ),\n Array.join(\"\\n\"),\n (guttered) => `${gutterChar}\\n${guttered}\\n${gutterChar}`,\n );\n\nconst withErrorGutterBlock = withGutterBlock(errorGutter);\n\nconst formatBuildMessage = (\n error: esbuild.Message | undefined,\n formattedMessage: string,\n): string => {\n const lines = String.split(formattedMessage, \"\\n\");\n const redErrorText = Ansi.red(error?.text ?? \"\");\n const replaced = pipe(\n Array.findFirstIndex(lines, (l) => pipe(l, String.trim, String.isNonEmpty)),\n Option.flatMap((index) => Array.modify(lines, index, () => redErrorText)),\n Option.getOrElse(() => lines),\n );\n return pipe(replaced, Array.join(\"\\n\"));\n};\n\n/**\n * Render a list of esbuild messages into a styled, gutter-prefixed block.\n */\nexport const formatEsbuildMessages = (\n errors: readonly esbuild.Message[],\n formattedMessages: readonly string[],\n): string =>\n pipe(\n formattedMessages,\n Array.map((message, i) => formatBuildMessage(errors[i], message)),\n Array.join(\"\"),\n String.trimEnd,\n withErrorGutterBlock,\n );\n\nconst renderImportFailedError = (error: ImportFailedError): string => {\n const causeMessage = Predicate.isError(error.cause)\n ? error.cause.message\n : Predicate.isString(error.cause)\n ? error.cause\n : globalThis.String(error.cause);\n const oneLineCause = pipe(\n String.split(causeMessage, \"\\n\"),\n Array.findFirst((line) => pipe(line, String.trim, String.isNonEmpty)),\n Option.map(String.trim),\n Option.getOrElse(() => \"unknown error\"),\n );\n return `${cross} Failed to load bundled module ${formatPath(\n error.file,\n )}: ${oneLineCause}; check the file's top-level imports and side effects.`;\n};\n\n/**\n * Render a {@link BundleFailedError} as a multi-line, ANSI-styled string: a\n * one-line `✘ <file>: build errors` header followed by the gutter-prefixed\n * esbuild diagnostic block. Multi-line is appropriate here because a single\n * `BundleFailedError` carries an array of distinct esbuild messages.\n */\nconst renderBundleFailedError = (error: BundleFailedError): string => {\n const messages = error.errors as readonly esbuild.Message[];\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"error\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${cross} ${formatPath(error.file)}: build errors`;\n return `${header}\\n${formatEsbuildMessages(messages, formatted)}`;\n};\n\n/**\n * Render any {@link BuildError} into a styled, ready-to-print string.\n * `ImportFailedError` collapses to a single line; `BundleFailedError` expands\n * to a header plus one diagnostic block per esbuild message.\n */\nexport const renderBuildError = (error: BuildError): string =>\n Match.value(error).pipe(\n Match.tag(\"BundleFailedError\", renderBundleFailedError),\n Match.tag(\"ImportFailedError\", renderImportFailedError),\n Match.exhaustive,\n );\n\nexport const logBuildError = (error: BuildError) =>\n Console.error(renderBuildError(error));\n\n/**\n * Render a flat list of esbuild messages as a single error block with a generic\n * `✘ Build errors` header.\n */\nconst renderCoalescedBuildErrors = (\n messages: readonly esbuild.Message[],\n): string => {\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"error\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${cross} Build errors`;\n return `${header}\\n${formatEsbuildMessages(messages, formatted)}`;\n};\n\nexport const logCoalescedBuildErrors = (\n messages: readonly esbuild.Message[],\n) =>\n messages.length === 0\n ? Effect.void\n : Console.error(renderCoalescedBuildErrors(messages));\n\nconst renderCoalescedBuildWarnings = (\n messages: readonly esbuild.Message[],\n): string => {\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"warning\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${warningSign} Build warnings`;\n const body = pipe(\n formatted,\n Array.join(\"\"),\n String.trimEnd,\n withGutterBlock(gutter(Ansi.yellow)),\n );\n return `${header}\\n${body}`;\n};\n\nexport const logCoalescedBuildWarnings = (\n messages: readonly esbuild.Message[],\n) =>\n messages.length === 0\n ? Effect.void\n : Console.error(renderCoalescedBuildWarnings(messages));\n"],"mappings":"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"}
1
+ {"version":3,"file":"log.mjs","names":["Ansi.blackBright","Ansi.green","Ansi.red","Ansi.yellow","GroupPath.toString"],"sources":["../src/log.ts"],"sourcesContent":["import { pipe } from \"effect/Function\";\nimport * as Array from \"effect/Array\";\nimport * as Console from \"effect/Console\";\nimport * as Effect from \"effect/Effect\";\nimport * as Match from \"effect/Match\";\nimport * as Option from \"effect/Option\";\nimport * as Path from \"effect/Path\";\nimport * as Predicate from \"effect/Predicate\";\nimport * as String from \"effect/String\";\nimport * as esbuild from \"esbuild\";\nimport type {\n BuildError,\n BundleFailedError,\n ImportFailedError,\n} from \"./BuildError.js\";\nimport * as Ansi from \"./Ansi.js\";\nimport type * as FunctionPath from \"./FunctionPath.js\";\nimport * as GroupPath from \"./GroupPath.js\";\nimport { ProjectRoot } from \"./ProjectRoot.js\";\n\n// --- Path styling ---\n\n/**\n * Render a relative path with the directory portion dimmed (`Ansi.blackBright`)\n * and the file leaf rendered in the default terminal color.\n */\nexport const formatPath = (relativePath: string): string => {\n const lastSep = Math.max(\n relativePath.lastIndexOf(\"/\"),\n relativePath.lastIndexOf(\"\\\\\"),\n );\n const dir = lastSep < 0 ? \"\" : relativePath.slice(0, lastSep + 1);\n const leaf = lastSep < 0 ? relativePath : relativePath.slice(lastSep + 1);\n return Ansi.blackBright(dir) + leaf;\n};\n\n// --- File operation logs ---\n\nconst logFile = (char: string, color: Ansi.Style) =>\n Effect.fnUntraced(function* (fullPath: string) {\n const projectRoot = yield* ProjectRoot.get;\n const path = yield* Path.Path;\n\n const prefix = projectRoot + path.sep;\n const suffix = pipe(fullPath, String.startsWith(prefix))\n ? pipe(fullPath, String.slice(prefix.length))\n : fullPath;\n\n yield* Console.log(\n `${color(char)} ${Ansi.blackBright(prefix)}${color(suffix)}`,\n );\n });\n\nexport const logFileAdded = logFile(\"+\", Ansi.green);\n\nexport const logFileRemoved = logFile(\"-\", Ansi.red);\n\nexport const logFileModified = logFile(\"~\", Ansi.yellow);\n\n// --- Function subline logs ---\n\nconst logFunction =\n (char: string, color: Ansi.Style) =>\n (functionPath: FunctionPath.FunctionPath) =>\n Console.log(\n ` ${color(char)} ${Ansi.blackBright(\n GroupPath.toString(functionPath.groupPath) + \".\",\n )}${color(functionPath.name)}`,\n );\n\nexport const logFunctionAdded = logFunction(\"+\", Ansi.green);\n\nexport const logFunctionRemoved = logFunction(\"-\", Ansi.red);\n\n// --- Process status logs ---\n\nconst logStatus = (char: string, charColor: Ansi.Style) => (message: string) =>\n Console.log(`${charColor(char)} ${message}`);\n\nexport const logSuccess = logStatus(\"✔︎\", Ansi.green);\n\nexport const logFailure = logStatus(\"✘\", Ansi.red);\n\nexport const logPending = logStatus(\"⭘\", Ansi.yellow);\n\nexport const logWarn = logStatus(\"⚠\", Ansi.yellow);\n\n// --- Build message rendering ---\n\nconst cross = Ansi.red(\"✘\");\n\nconst warningSign = Ansi.yellow(\"⚠\");\n\nconst gutter = (color: Ansi.Style): string => color(\"│\");\n\nconst errorGutter = gutter(Ansi.red);\n\nconst withGutterBlock =\n (gutterChar: string) =>\n (output: string): string =>\n pipe(\n String.split(output, \"\\n\"),\n Array.map((line) =>\n pipe(line, String.trim) === \"\" ? gutterChar : `${gutterChar} ${line}`,\n ),\n Array.join(\"\\n\"),\n (guttered) => `${gutterChar}\\n${guttered}\\n${gutterChar}`,\n );\n\nconst withErrorGutterBlock = withGutterBlock(errorGutter);\n\nconst formatBuildMessage = (\n error: esbuild.Message | undefined,\n formattedMessage: string,\n): string => {\n const lines = String.split(formattedMessage, \"\\n\");\n const redErrorText = Ansi.red(error?.text ?? \"\");\n const replaced = pipe(\n Array.findFirstIndex(lines, (l) => pipe(l, String.trim, String.isNonEmpty)),\n Option.flatMap((index) => Array.modify(lines, index, () => redErrorText)),\n Option.getOrElse(() => lines),\n );\n return pipe(replaced, Array.join(\"\\n\"));\n};\n\n/**\n * Render a list of esbuild messages into a styled, gutter-prefixed block.\n */\nexport const formatEsbuildMessages = (\n errors: readonly esbuild.Message[],\n formattedMessages: readonly string[],\n): string =>\n pipe(\n formattedMessages,\n Array.map((message, i) => formatBuildMessage(errors[i], message)),\n Array.join(\"\"),\n String.trimEnd,\n withErrorGutterBlock,\n );\n\nconst renderImportFailedError = (error: ImportFailedError): string => {\n const causeMessage = Predicate.isError(error.cause)\n ? error.cause.message\n : Predicate.isString(error.cause)\n ? error.cause\n : globalThis.String(error.cause);\n const oneLineCause = pipe(\n String.split(causeMessage, \"\\n\"),\n Array.findFirst((line) => pipe(line, String.trim, String.isNonEmpty)),\n Option.map(String.trim),\n Option.getOrElse(() => \"unknown error\"),\n );\n return `${cross} Failed to load bundled module ${formatPath(\n error.file,\n )}: ${oneLineCause}; check the file's top-level imports and side effects.`;\n};\n\n/**\n * Render a {@link BundleFailedError} as a multi-line, ANSI-styled string: a\n * one-line `✘ <file>: build errors` header followed by the gutter-prefixed\n * esbuild diagnostic block. Multi-line is appropriate here because a single\n * `BundleFailedError` carries an array of distinct esbuild messages.\n */\nconst renderBundleFailedError = (error: BundleFailedError): string => {\n const messages = error.errors as readonly esbuild.Message[];\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"error\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${cross} ${formatPath(error.file)}: build errors`;\n return `${header}\\n${formatEsbuildMessages(messages, formatted)}`;\n};\n\n/**\n * Render any {@link BuildError} into a styled, ready-to-print string.\n * `ImportFailedError` collapses to a single line; `BundleFailedError` expands\n * to a header plus one diagnostic block per esbuild message.\n */\nexport const renderBuildError = (error: BuildError): string =>\n Match.value(error).pipe(\n Match.tag(\"BundleFailedError\", renderBundleFailedError),\n Match.tag(\"ImportFailedError\", renderImportFailedError),\n Match.exhaustive,\n );\n\nexport const logBuildError = (error: BuildError) =>\n Console.error(renderBuildError(error));\n\n/**\n * Render a flat list of esbuild messages as a single error block with a generic\n * `✘ Build errors` header.\n */\nconst renderCoalescedBuildErrors = (\n messages: readonly esbuild.Message[],\n): string => {\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"error\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${cross} Build errors`;\n return `${header}\\n${formatEsbuildMessages(messages, formatted)}`;\n};\n\nexport const logCoalescedBuildErrors = (\n messages: readonly esbuild.Message[],\n) =>\n messages.length === 0\n ? Effect.void\n : Console.error(renderCoalescedBuildErrors(messages));\n\nconst renderCoalescedBuildWarnings = (\n messages: readonly esbuild.Message[],\n): string => {\n const formatted = esbuild.formatMessagesSync(messages as esbuild.Message[], {\n kind: \"warning\",\n color: true,\n terminalWidth: 80,\n });\n const header = `${warningSign} Build warnings`;\n const body = pipe(\n formatted,\n Array.join(\"\"),\n String.trimEnd,\n withGutterBlock(gutter(Ansi.yellow)),\n );\n return `${header}\\n${body}`;\n};\n\nexport const logCoalescedBuildWarnings = (\n messages: readonly esbuild.Message[],\n) =>\n messages.length === 0\n ? Effect.void\n : Console.error(renderCoalescedBuildWarnings(messages));\n"],"mappings":"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"}
@@ -47,7 +47,7 @@ const runtimeSchemaEffect = Effect.fnUntraced(function* ({ tableModules, compone
47
47
  yield* Effect.forEach(tableModules, ({ tableName, importPath }) => cbw.writeLine(`import ${tableName} from "${importPath}";`));
48
48
  }
49
49
  yield* cbw.blankLine();
50
- if (component) yield* cbw.writeLine(`import { target as $target } from "./id";`);
50
+ if (component) yield* cbw.writeLine(`import { target as $target } from "./id.js";`);
51
51
  if (tableModules.length === 0) yield* cbw.writeLine(`const databaseSchema: $DatabaseSchema.DatabaseSchema${component ? "<{}, typeof $target>" : ""} = $DatabaseSchema.make({}${component ? ", $target" : ""});`);
52
52
  else {
53
53
  yield* cbw.writeLine(`const databaseSchema: $DatabaseSchema.DatabaseSchema<{`);
@@ -145,7 +145,7 @@ const tableWrapper = ({ tableName, unnamedImportPath, component = false }) => ta
145
145
  const tableWrapperEffect = Effect.fnUntraced(function* ({ tableName, unnamedImportPath, component = false }) {
146
146
  const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });
147
147
  yield* cbw.writeLine(`import unnamed from "${unnamedImportPath}";`);
148
- if (component) yield* cbw.writeLine(`import { scope } from "../id";`);
148
+ if (component) yield* cbw.writeLine(`import { scope } from "../id.js";`);
149
149
  yield* cbw.blankLine();
150
150
  yield* cbw.writeLine(`export default unnamed("${tableName}"${component ? ", scope" : ""});`);
151
151
  return yield* cbw.toString();
@@ -232,8 +232,8 @@ const refsEffect = Effect.fnUntraced(function* ({ specImportPath }) {
232
232
  const componentContract = Effect.fnUntraced(function* ({ tableNames }) {
233
233
  const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });
234
234
  yield* cbw.writeLine("import { Component } from \"@confect/core\";");
235
- yield* cbw.writeLine("import spec from \"./spec\";");
236
- yield* cbw.writeLine("import { scope } from \"./id\";");
235
+ yield* cbw.writeLine("import spec from \"./spec.js\";");
236
+ yield* cbw.writeLine("import { scope } from \"./id.js\";");
237
237
  yield* cbw.blankLine();
238
238
  const names = Array.map([
239
239
  ...tableNames,
@@ -278,13 +278,15 @@ const docsEffect = Effect.fnUntraced(function* ({ schemaImportPath, tables }) {
278
278
  yield* cbw.writeLine(`}`);
279
279
  return yield* cbw.toString();
280
280
  });
281
- const registeredFunctionsForGroup = ({ spec, schemaImportPath, specImportPath, implImportPath }) => registeredFunctionsForGroupEffect({
281
+ const registeredFunctionsForGroup = ({ spec, schemaImportPath, specImportPath, implImportPath, groupPath = "", required = [] }) => registeredFunctionsForGroupEffect({
282
282
  spec,
283
283
  schemaImportPath,
284
284
  specImportPath,
285
- implImportPath
285
+ implImportPath,
286
+ groupPath,
287
+ required
286
288
  });
287
- const registeredFunctionsForGroupEffect = Effect.fnUntraced(function* ({ spec, schemaImportPath, specImportPath, implImportPath }) {
289
+ const registeredFunctionsForGroupEffect = Effect.fnUntraced(function* ({ spec, schemaImportPath, specImportPath, implImportPath, groupPath = "", required = [] }) {
288
290
  const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });
289
291
  const useNode = spec.runtime === "Node";
290
292
  const hasConfectFunctions = (group) => Object.values(group.functions).some((functionSpec) => functionSpec.functionProvenance._tag === "Confect") || Object.values(group.groups).some(hasConfectFunctions);
@@ -292,12 +294,14 @@ const registeredFunctionsForGroupEffect = Effect.fnUntraced(function* ({ spec, s
292
294
  if (useNode) yield* cbw.writeLine(`import { RegisteredNodeFunction } from "@confect/server/node";`);
293
295
  else if (!forwarding) yield* cbw.writeLine(`import { RegisteredFunctions } from "@confect/server";`);
294
296
  else yield* cbw.writeLine(`import { ConvexFunctionDefinitions, RegisteredConvexFunction, type RegisteredFunctions } from "@confect/server";`);
297
+ if (required.length > 0) yield* cbw.writeLine(`import { GroupImpl } from "@confect/server";`);
295
298
  yield* cbw.writeLine(`import databaseSchema from "${schemaImportPath}";`);
296
299
  yield* cbw.writeLine(`import groupLayer from "${implImportPath}";`);
297
300
  yield* cbw.blankLine();
301
+ const groupLayer = required.length === 0 ? "groupLayer" : `groupLayer.pipe(GroupImpl.finalize({ required: [${required.map(({ key }) => `{ key: ${JSON.stringify(key)} }`).join(", ")}], groupPath: ${JSON.stringify(groupPath)} }))`;
298
302
  const specType = `typeof import("${specImportPath}")["default"]`;
299
- if (useNode) yield* cbw.writeLine(`export default RegisteredNodeFunction.buildForGroup<${specType}>(databaseSchema, groupLayer);`);
300
- else if (!forwarding) yield* cbw.writeLine(`export default RegisteredFunctions.buildForGroup<${specType}>(databaseSchema, groupLayer);`);
303
+ if (useNode) yield* cbw.writeLine(`export default RegisteredNodeFunction.buildForGroup<${specType}>(databaseSchema, ${groupLayer});`);
304
+ else if (!forwarding) yield* cbw.writeLine(`export default RegisteredFunctions.buildForGroup<${specType}>(databaseSchema, ${groupLayer});`);
301
305
  else {
302
306
  const bindings = (group, path) => `{
303
307
  ${[...Object.entries(group.functions).map(([name, functionSpec]) => {
@@ -311,7 +315,7 @@ ${[...Object.entries(group.functions).map(([name, functionSpec]) => {
311
315
  }`;
312
316
  yield* cbw.writeLine(`const forward = <Ctx, Args, Returns>(handler: (ctx: Ctx, args: Args) => Promise<Returns>) => (ctx: Ctx, args: Args) => handler(ctx, args);
313
317
 
314
- const definitions = ConvexFunctionDefinitions.buildForGroup<${specType}>(databaseSchema, groupLayer);
318
+ const definitions = ConvexFunctionDefinitions.buildForGroup<${specType}>(databaseSchema, ${groupLayer});
315
319
 
316
320
  export default ${bindings(spec, "definitions")} as RegisteredFunctions.RegisteredFunctionsForGroupSpec<${specType}>;`);
317
321
  }
@@ -349,8 +353,8 @@ const servicesEffect = Effect.fnUntraced(function* ({ schemaImportPath, componen
349
353
  }));
350
354
  yield* cbw.writeLine(`} from "@confect/server";`);
351
355
  yield* cbw.writeLine(`import type schemaDefinition from "${schemaImportPath}";`);
352
- yield* cbw.writeLine(`import type { Docs } from "./docs";`);
353
- if (component) yield* cbw.writeLine(`import type { scope } from "./id";`);
356
+ yield* cbw.writeLine(`import type { Docs } from "./docs.js";`);
357
+ if (component) yield* cbw.writeLine(`import type { scope } from "./id.js";`);
354
358
  yield* cbw.blankLine();
355
359
  if (!component) {
356
360
  yield* cbw.writeLine("export const Auth = Auth_.Auth;");
@@ -1 +1 @@
1
- {"version":3,"file":"templates.mjs","names":["renderSpecAssembly"],"sources":["../src/templates.ts"],"sourcesContent":["import type * as IdScope from \"@confect/core/IdScope\";\nimport * as Array from \"effect/Array\";\nimport * as Effect from \"effect/Effect\";\nimport type * as GroupSpec from \"@confect/core/GroupSpec\";\nimport { CodeBlockWriter } from \"./CodeBlockWriter\";\nimport {\n render as renderSpecAssembly,\n type SpecAssemblyNode,\n} from \"./SpecAssemblyNode\";\n\n/**\n * Emit `convex/schema.ts` as a one-line re-export of the codegen-emitted deploy\n * schema in `confect/_generated/convexSchema.ts`. Deploy-time consumers (the\n * Convex CLI, `convex-test`) keep reading `convex/schema.ts`; the runtime\n * `DatabaseSchema` in `confect/_generated/schema.ts` is untouched by this\n * file.\n */\nexport const schema = ({\n convexSchemaImportPath,\n}: Parameters<typeof schemaEffect>[0]) =>\n schemaEffect({ convexSchemaImportPath });\n\nconst schemaEffect = Effect.fnUntraced(function* ({\n convexSchemaImportPath,\n}: {\n convexSchemaImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`export { default } from \"${convexSchemaImportPath}\";`);\n\n return yield* cbw.toString();\n});\n\ninterface TableModuleBinding {\n readonly importPath: string;\n readonly tableName: string;\n}\n\n/**\n * Emit `confect/_generated/schema.ts`—the runtime `DatabaseSchema` used by\n * impls and the per-group registries (and downstream by per-function bundles\n * for codec lookup). Every table wrapper at\n * `confect/_generated/tables/<name>.ts` is imported statically and registered\n * as a value entry on the `DatabaseSchema.make({...})` call. Per-table laziness\n * lives inside each `Table`: its `Fields` and `Doc` are lazy memoised getters\n * that only evaluate the user-supplied field-schema callback on first access,\n * so unused tables in a function bundle never pay schema-construction cost\n * despite the static import.\n *\n * The `DatabaseSchema` import is aliased to `$DatabaseSchema` because each\n * table is imported under its own (filename-derived) name; a table named\n * `DatabaseSchema` would otherwise collide with the library import and emit a\n * duplicate-binding file. The leading `$` makes the alias collision-proof:\n * `validateConfectTableIdentifier` requires names to match\n * `/^[a-zA-Z][a-zA-Z0-9_]*$/`, which forbids `$`, so no valid table import can\n * ever shadow it.\n */\nexport const runtimeSchema = ({\n tableModules,\n component = false,\n}: Parameters<typeof runtimeSchemaEffect>[0]) =>\n runtimeSchemaEffect({ tableModules, component });\n\nconst runtimeSchemaEffect = Effect.fnUntraced(function* ({\n tableModules,\n component = false,\n}: {\n tableModules: ReadonlyArray<TableModuleBinding>;\n component?: boolean;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(\n `import { DatabaseSchema as $DatabaseSchema } from \"@confect/server\";`,\n );\n\n if (tableModules.length > 0) {\n yield* cbw.blankLine();\n yield* Effect.forEach(tableModules, ({ tableName, importPath }) =>\n cbw.writeLine(`import ${tableName} from \"${importPath}\";`),\n );\n }\n\n yield* cbw.blankLine();\n\n if (component) {\n yield* cbw.writeLine(`import { target as $target } from \"./id\";`);\n }\n\n if (tableModules.length === 0) {\n yield* cbw.writeLine(\n `const databaseSchema: $DatabaseSchema.DatabaseSchema${component ? \"<{}, typeof $target>\" : \"\"} = $DatabaseSchema.make({}${component ? \", $target\" : \"\"});`,\n );\n } else {\n yield* cbw.writeLine(\n `const databaseSchema: $DatabaseSchema.DatabaseSchema<{`,\n );\n yield* cbw.indent(\n Effect.forEach(\n tableModules,\n ({ tableName }) =>\n cbw.writeLine(`readonly ${tableName}: typeof ${tableName};`),\n { discard: true },\n ),\n );\n yield* cbw.writeLine(\n `}${component ? \", typeof $target\" : \"\"}> = $DatabaseSchema.make({`,\n );\n yield* cbw.indent(\n Effect.gen(function* () {\n for (const { tableName } of tableModules) {\n yield* cbw.writeLine(`${tableName},`);\n }\n }),\n );\n yield* cbw.writeLine(`}${component ? \", $target\" : \"\"});`);\n }\n\n yield* cbw.blankLine();\n yield* cbw.writeLine(`export default databaseSchema;`);\n\n return yield* cbw.toString();\n});\n\n/**\n * Emit `confect/_generated/convexSchema.ts`—the Convex deploy-time\n * `SchemaDefinition`. Imports every table from its generated wrapper at\n * `_generated/tables/<name>` and calls `defineSchema({...})` exactly once.\n * `Table.tableDefinition` lives in `@confect/server` because it is the\n * `defineTable` binding; the generated table wrappers themselves stay\n * client-safe (`Fields`/`Doc` from `@confect/core`).\n *\n * The `defineSchema` and `Table` imports are aliased with a leading `$` because\n * each table is imported under its own (filename-derived) name; a table named\n * `defineSchema` or `Table` would otherwise collide with the library import and\n * emit a duplicate-binding file. `validateConfectTableIdentifier` requires\n * names to match `/^[a-zA-Z][a-zA-Z0-9_]*$/`, which forbids `$`, so no valid\n * table import can ever shadow them.\n */\nexport const convexSchema = ({\n tableModules,\n}: Parameters<typeof convexSchemaEffect>[0]) =>\n convexSchemaEffect({ tableModules });\n\nconst convexSchemaEffect = Effect.fnUntraced(function* ({\n tableModules,\n}: {\n tableModules: ReadonlyArray<TableModuleBinding>;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(\n `import { defineSchema as $defineSchema } from \"convex/server\";`,\n );\n\n if (tableModules.length > 0) {\n yield* cbw.writeLine(`import { Table as $Table } from \"@confect/server\";`);\n yield* cbw.blankLine();\n yield* Effect.forEach(tableModules, ({ tableName, importPath }) =>\n cbw.writeLine(`import ${tableName} from \"${importPath}\";`),\n );\n }\n\n yield* cbw.blankLine();\n\n if (tableModules.length === 0) {\n yield* cbw.writeLine(`export default $defineSchema({});`);\n } else {\n yield* cbw.writeLine(`export default $defineSchema({`);\n yield* cbw.indent(\n Effect.gen(function* () {\n for (const { tableName } of tableModules) {\n yield* cbw.writeLine(\n `${tableName}: $Table.tableDefinition(${tableName}),`,\n );\n }\n }),\n );\n yield* cbw.writeLine(`});`);\n }\n\n return yield* cbw.toString();\n});\n\n/**\n * Emit `confect/_generated/id.ts`—a type-constrained `Id` constructor and a\n * `TableNames` union derived from the user's `confect/tables/*.ts` filenames.\n * User-authored table modules import `Id` from this file to declare cross-table\n * id references without typing the destination name as a free string (and\n * without ever importing each other transitively).\n *\n * `Id` also accepts Convex system tables, with the component scope when\n * present. `TableNames` includes only user tables and resolves to `never` for\n * an empty table directory.\n */\nexport const id = ({ tableNames, scope }: Parameters<typeof idEffect>[0]) =>\n idEffect({ tableNames, scope });\n\nconst idEffect = Effect.fnUntraced(function* ({\n tableNames,\n scope,\n}: {\n tableNames: ReadonlyArray<string>;\n scope?: IdScope.Component<string> | undefined;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(\n `import { GenericId${scope === undefined ? \"\" : \", IdScope\"} } from \"@confect/core\";`,\n );\n yield* cbw.writeLine(\n `import type { SystemTableNames } from \"convex/server\";`,\n );\n yield* cbw.blankLine();\n if (scope !== undefined) {\n yield* cbw.writeLine(\n // oxlint-disable-next-line effecttsgo/prefer-schema-over-json -- Emit an escaped TypeScript string literal, not a JSON payload.\n `export const scope = IdScope.component(${JSON.stringify(scope.slice(\"component:\".length))});`,\n );\n yield* cbw.writeLine(\n `export const target = { kind: \"component\", scope } as const;`,\n );\n }\n\n const union =\n tableNames.length === 0\n ? \"never\"\n : tableNames.map((n) => `\"${n}\"`).join(\" | \");\n yield* cbw.writeLine(`export type TableNames = ${union};`);\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n `export type Id<TableName extends TableNames | SystemTableNames> = GenericId.GenericId<TableName${scope === undefined ? \"\" : \", typeof scope\"}>;`,\n );\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n `export const Id = <const TableName extends TableNames | SystemTableNames>(`,\n );\n yield* cbw.indent(cbw.writeLine(`tableName: TableName,`));\n yield* cbw.writeLine(\n `) => GenericId.GenericId(tableName${scope === undefined ? \"\" : \", scope\"});`,\n );\n\n return yield* cbw.toString();\n});\n\n/**\n * Emit `confect/_generated/tables/<tableName>.ts`—a two-line wrapper that\n * imports the user-authored `UnnamedTable` and binds the file basename to it,\n * producing the fully-named `Table` value that downstream consumers (schema,\n * specs, impls) read.\n */\nexport const tableWrapper = ({\n tableName,\n unnamedImportPath,\n component = false,\n}: Parameters<typeof tableWrapperEffect>[0]) =>\n tableWrapperEffect({ tableName, unnamedImportPath, component });\n\nconst tableWrapperEffect = Effect.fnUntraced(function* ({\n tableName,\n unnamedImportPath,\n component = false,\n}: {\n tableName: string;\n unnamedImportPath: string;\n component?: boolean;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import unnamed from \"${unnamedImportPath}\";`);\n if (component) yield* cbw.writeLine(`import { scope } from \"../id\";`);\n yield* cbw.blankLine();\n yield* cbw.writeLine(\n `export default unnamed(\"${tableName}\"${component ? \", scope\" : \"\"});`,\n );\n\n return yield* cbw.toString();\n});\n\nexport const http = ({ httpImportPath }: Parameters<typeof httpEffect>[0]) =>\n httpEffect({ httpImportPath });\n\nconst httpEffect = Effect.fnUntraced(function* ({\n httpImportPath,\n}: {\n httpImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import http from \"${httpImportPath}\";`);\n yield* cbw.newLine();\n yield* cbw.writeLine(`export default http;`);\n\n return yield* cbw.toString();\n});\n\n/**\n * Emit `convex/http.ts` for a declared backend: the Convex router serving\n * `confect/http.ts`'s routes, typed by the generated database schema.\n */\nexport const declaredHttp = Effect.fnUntraced(function* ({\n schemaImportPath,\n httpImportPath,\n}: {\n schemaImportPath: string;\n httpImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(\n \"// Generated by `confect codegen` from confect/http.ts. Do not edit.\",\n );\n yield* cbw.writeLine(`import { HttpRouter } from \"@confect/server\";`);\n yield* cbw.writeLine(`import schema from \"${schemaImportPath}\";`);\n yield* cbw.writeLine(`import http from \"${httpImportPath}\";`);\n yield* cbw.newLine();\n yield* cbw.writeLine(\n `export default HttpRouter.forSchema(schema)(http.routes, { api: http.api });`,\n );\n\n return yield* cbw.toString();\n});\n\nexport const crons = ({ cronsImportPath }: Parameters<typeof cronsEffect>[0]) =>\n cronsEffect({ cronsImportPath });\n\nconst cronsEffect = Effect.fnUntraced(function* ({\n cronsImportPath,\n}: {\n cronsImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import crons from \"${cronsImportPath}\";`);\n yield* cbw.newLine();\n yield* cbw.writeLine(`export default crons.convexCronJobs;`);\n\n return yield* cbw.toString();\n});\n\nexport const authConfig = ({\n authImportPath,\n}: Parameters<typeof authConfigEffect>[0]) =>\n authConfigEffect({ authImportPath });\n\nconst authConfigEffect = Effect.fnUntraced(function* ({\n authImportPath,\n}: {\n authImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import auth from \"${authImportPath}\";`);\n yield* cbw.newLine();\n yield* cbw.writeLine(`export default auth;`);\n\n return yield* cbw.toString();\n});\n\n/**\n * Emit `confect/_generated/components.ts`—a typed registry of the Convex\n * components installed via `app.use(...)` in `convex/convex.config.ts`. Mirrors\n * the `components` export of Convex's generated `convex/_generated/api`: the\n * runtime value is `componentsGeneric()` (a name-preserving proxy), and each\n * entry is typed with the `ComponentApi` that component packages export from\n * `_generated/component.js`. Unlike `convex/_generated/api`, this file exists\n * before `convex codegen` ever runs, so impl modules can import it\n * safely—`confect codegen` bundles and evaluates each impl's import graph, and\n * `convex/_generated/api` doesn't exist yet at that point.\n *\n * The `as any` cast is confined here: `componentsGeneric()` is typed\n * `AnyChildComponents`, which deliberately doesn't overlap the precise registry\n * type; the `Components` annotation on the const supplies the real type.\n */\nexport const components = ({\n components: installedComponents,\n}: Parameters<typeof componentsEffect>[0]) =>\n componentsEffect({ components: installedComponents });\n\nconst componentsEffect = Effect.fnUntraced(function* ({\n components: installedComponents,\n}: {\n components: ReadonlyArray<{ name: string; typeImportPath: string }>;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import { componentsGeneric } from \"convex/server\";`);\n yield* cbw.blankLine();\n\n if (installedComponents.length === 0) {\n yield* cbw.writeLine(`export type Components = {};`);\n } else {\n yield* cbw.writeLine(`export type Components = {`);\n yield* cbw.indent(\n Effect.forEach(\n installedComponents,\n ({ name, typeImportPath }) =>\n cbw.writeLine(\n `\"${name}\": import(\"${typeImportPath}/_generated/component.js\").ComponentApi<\"${name}\">;`,\n ),\n { discard: true },\n ),\n );\n yield* cbw.writeLine(`};`);\n }\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n `export const components: Components = componentsGeneric() as any;`,\n );\n\n return yield* cbw.toString();\n});\n\nexport const refs = ({ specImportPath }: Parameters<typeof refsEffect>[0]) =>\n refsEffect({ specImportPath });\n\nconst refsEffect = Effect.fnUntraced(function* ({\n specImportPath,\n}: {\n specImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import { Refs } from \"@confect/core\";`);\n yield* cbw.writeLine(`import spec from \"${specImportPath}\";`);\n yield* cbw.blankLine();\n yield* cbw.writeLine(\n `const refs: Refs.FromSpec<typeof spec> = Refs.make(spec);`,\n );\n yield* cbw.blankLine();\n yield* cbw.writeLine(`export default refs;`);\n\n return yield* cbw.toString();\n});\n\nexport const componentContract = Effect.fnUntraced(function* ({\n tableNames,\n}: {\n tableNames: ReadonlyArray<string>;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n yield* cbw.writeLine('import { Component } from \"@confect/core\";');\n yield* cbw.writeLine('import spec from \"./spec\";');\n yield* cbw.writeLine('import { scope } from \"./id\";');\n yield* cbw.blankLine();\n const names = Array.map(\n [...tableNames, \"_storage\", \"_scheduled_functions\"],\n (name) => `\"${name}\"`,\n );\n yield* cbw.writeLine(\n `const component: Component.Component<typeof spec, typeof scope, ${names.join(\" | \")}> = Component.make(spec, scope, [${names.join(\", \")}]);`,\n );\n yield* cbw.writeLine(\"export default component;\");\n return yield* cbw.toString();\n});\n\n/**\n * Emit `_generated/docs.ts`: one named `type <table>` alias per table plus a\n * `Docs` registry. Each alias is `Document.Document<typeof schemaDefinition,\n * \"<table>\">`, so it stays structurally exact while giving the document a\n * _name_—declaration emit then prints e.g. `NotesDoc` instead of expanding the\n * row structure. A `type` alias (rather than an extending `interface`) is used\n * so it works for every document shape: object tables, but also union schemas\n * (`Schema.Union`) and other non-object documents, which an `interface …\n * extends` cannot represent (TS2312). The registry is threaded into the\n * generated `DatabaseReader`/`DatabaseWriter` tags so query/mutation helpers\n * print named documents with no user annotations.\n */\nexport const docs = ({\n schemaImportPath,\n tables,\n}: Parameters<typeof docsEffect>[0]) =>\n docsEffect({ schemaImportPath, tables });\n\nconst docsEffect = Effect.fnUntraced(function* ({\n schemaImportPath,\n tables,\n}: {\n schemaImportPath: string;\n tables: ReadonlyArray<{ tableName: string; docName: string }>;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n // With no tables there is nothing to import—emitting the (unused) imports\n // would trip `noUnusedLocals`.\n if (tables.length === 0) {\n yield* cbw.writeLine(`export interface Docs {}`);\n return yield* cbw.toString();\n }\n\n yield* cbw.writeLine(`import type { Document } from \"@confect/server\";`);\n yield* cbw.writeLine(\n `import type schemaDefinition from \"${schemaImportPath}\";`,\n );\n yield* cbw.blankLine();\n\n for (const { tableName, docName } of tables) {\n yield* cbw.writeLine(\n `export type ${docName} = Document.Document<typeof schemaDefinition, \"${tableName}\">;`,\n );\n }\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(`export interface Docs {`);\n yield* cbw.indent(\n Effect.gen(function* () {\n for (const { tableName, docName } of tables) {\n yield* cbw.writeLine(`${tableName}: ${docName};`);\n }\n }),\n );\n yield* cbw.writeLine(`}`);\n\n return yield* cbw.toString();\n});\n\nexport const registeredFunctionsForGroup = ({\n spec,\n schemaImportPath,\n specImportPath,\n implImportPath,\n}: Parameters<typeof registeredFunctionsForGroupEffect>[0]) =>\n registeredFunctionsForGroupEffect({\n spec,\n schemaImportPath,\n specImportPath,\n implImportPath,\n });\n\nconst registeredFunctionsForGroupEffect = Effect.fnUntraced(function* ({\n spec,\n schemaImportPath,\n specImportPath,\n implImportPath,\n}: {\n spec: GroupSpec.AnyWithProps;\n schemaImportPath: string;\n specImportPath: string;\n implImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n const useNode = spec.runtime === \"Node\";\n\n const hasConfectFunctions = (group: GroupSpec.AnyWithProps): boolean =>\n Object.values(group.functions).some(\n (functionSpec) => functionSpec.functionProvenance._tag === \"Confect\",\n ) || Object.values(group.groups).some(hasConfectFunctions);\n const forwarding = !useNode && hasConfectFunctions(spec);\n\n if (useNode) {\n yield* cbw.writeLine(\n `import { RegisteredNodeFunction } from \"@confect/server/node\";`,\n );\n } else if (!forwarding) {\n yield* cbw.writeLine(\n `import { RegisteredFunctions } from \"@confect/server\";`,\n );\n } else {\n yield* cbw.writeLine(\n `import { ConvexFunctionDefinitions, RegisteredConvexFunction, type RegisteredFunctions } from \"@confect/server\";`,\n );\n }\n\n yield* cbw.writeLine(`import databaseSchema from \"${schemaImportPath}\";`);\n yield* cbw.writeLine(`import groupLayer from \"${implImportPath}\";`);\n yield* cbw.blankLine();\n // The group's own leaf spec is referenced type-only (`typeof import(...)`),\n // so the spec module is erased at transpile time and never enters the\n // per-function bundle; only `databaseSchema` and the impl are runtime\n // imports. Typing from the leaf spec (not the project-wide assembled spec)\n // keeps the registry's type dependent solely on its own group.\n const specType = `typeof import(\"${specImportPath}\")[\"default\"]`;\n if (useNode) {\n yield* cbw.writeLine(\n `export default RegisteredNodeFunction.buildForGroup<${specType}>(databaseSchema, groupLayer);`,\n );\n } else if (!forwarding) {\n yield* cbw.writeLine(\n `export default RegisteredFunctions.buildForGroup<${specType}>(databaseSchema, groupLayer);`,\n );\n } else {\n const bindings = (group: GroupSpec.AnyWithProps, path: string): string =>\n `{\n${[\n ...Object.entries(group.functions).map(([name, functionSpec]) => {\n const key = JSON.stringify(name);\n const definition = `${path}[${key}]`;\n return `[${key}]: ${\n functionSpec.functionProvenance._tag === \"Convex\"\n ? `${definition}.handler`\n : `RegisteredConvexFunction.register({ ...${definition}, handler: forward(${definition}.handler) })`\n },`;\n }),\n ...Object.entries(group.groups).map(([name, child]) => {\n const key = JSON.stringify(name);\n return `[${key}]: ${bindings(child, `${path}[${key}]`)},`;\n }),\n].join(\"\\n\")}\n}`;\n yield* cbw.writeLine(`const forward = <Ctx, Args, Returns>(handler: (ctx: Ctx, args: Args) => Promise<Returns>) => (ctx: Ctx, args: Args) => handler(ctx, args);\n\nconst definitions = ConvexFunctionDefinitions.buildForGroup<${specType}>(databaseSchema, groupLayer);\n\nexport default ${bindings(spec, \"definitions\")} as RegisteredFunctions.RegisteredFunctionsForGroupSpec<${specType}>;`);\n }\n\n return yield* cbw.toString();\n});\n\nexport const services = ({\n schemaImportPath,\n component = false,\n}: Parameters<typeof servicesEffect>[0]) =>\n servicesEffect({ schemaImportPath, component });\n\nconst servicesEffect = Effect.fnUntraced(function* ({\n schemaImportPath,\n component = false,\n}: {\n schemaImportPath: string;\n component?: boolean;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n // Imports\n yield* cbw.writeLine(\"import {\");\n yield* cbw.indent(\n Effect.gen(function* () {\n yield* cbw.writeLine(\"ActionCtx as ActionCtx_,\");\n yield* cbw.writeLine(\"ActionRunner as ActionRunner_,\");\n if (!component) yield* cbw.writeLine(\"Auth as Auth_,\");\n yield* cbw.writeLine(\"type DataModel,\");\n yield* cbw.writeLine(\"DatabaseReader as DatabaseReader_,\");\n yield* cbw.writeLine(\"DatabaseWriter as DatabaseWriter_,\");\n yield* cbw.writeLine(\"ExecutionMetadata as ExecutionMetadata_,\");\n yield* cbw.writeLine(\"MutationCtx as MutationCtx_,\");\n yield* cbw.writeLine(\"MutationRunner as MutationRunner_,\");\n yield* cbw.writeLine(\n \"MutationTransactionContext as MutationTransactionContext_,\",\n );\n yield* cbw.writeLine(\"QueryCtx as QueryCtx_,\");\n yield* cbw.writeLine(\"QueryRunner as QueryRunner_,\");\n yield* cbw.writeLine(\n \"QueryTransactionContext as QueryTransactionContext_,\",\n );\n yield* cbw.writeLine(\"RequestMetadata as RequestMetadata_,\");\n yield* cbw.writeLine(\"Scheduler as Scheduler_,\");\n if (!component) yield* cbw.writeLine(\"Storage as Storage_,\");\n yield* cbw.writeLine(\"StorageActionWriter as StorageActionWriter_,\");\n yield* cbw.writeLine(\"StorageReader as StorageReader_,\");\n yield* cbw.writeLine(\"StorageWriter as StorageWriter_,\");\n yield* cbw.writeLine(\"TransactionMetadata as TransactionMetadata_,\");\n yield* cbw.writeLine(\"VectorSearch as VectorSearch_,\");\n }),\n );\n yield* cbw.writeLine(`} from \"@confect/server\";`);\n yield* cbw.writeLine(\n `import type schemaDefinition from \"${schemaImportPath}\";`,\n );\n yield* cbw.writeLine(`import type { Docs } from \"./docs\";`);\n if (component) yield* cbw.writeLine(`import type { scope } from \"./id\";`);\n yield* cbw.blankLine();\n\n // Auth\n if (!component) {\n yield* cbw.writeLine(\"export const Auth = Auth_.Auth;\");\n yield* cbw.writeLine(\"export type Auth = typeof Auth.Identifier;\");\n }\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n \"export const ExecutionMetadata = ExecutionMetadata_.ExecutionMetadata;\",\n );\n yield* cbw.writeLine(\n \"export type ExecutionMetadata = typeof ExecutionMetadata.Identifier;\",\n );\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n \"export const RequestMetadata = RequestMetadata_.RequestMetadata;\",\n );\n yield* cbw.writeLine(\n \"export type RequestMetadata = typeof RequestMetadata.Identifier;\",\n );\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n \"export const TransactionMetadata = TransactionMetadata_.TransactionMetadata;\",\n );\n yield* cbw.writeLine(\n \"export type TransactionMetadata = typeof TransactionMetadata.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // Scheduler\n yield* cbw.writeLine(\n component\n ? \"export const Scheduler = Scheduler_.forScope<typeof scope>();\"\n : \"export const Scheduler = Scheduler_.Scheduler;\",\n );\n yield* cbw.writeLine(\"export type Scheduler = typeof Scheduler.Identifier;\");\n yield* cbw.blankLine();\n\n if (!component) {\n yield* cbw.writeLine(\"export const Storage = Storage_.Storage;\");\n yield* cbw.writeLine(\"export type Storage = typeof Storage.Identifier;\");\n yield* cbw.blankLine();\n }\n\n // StorageReader\n yield* cbw.writeLine(\n `export const StorageReader = StorageReader_.StorageReader${component ? \".forScope<typeof scope>()\" : \"\"};`,\n );\n yield* cbw.writeLine(\n \"export type StorageReader = typeof StorageReader.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // StorageWriter\n yield* cbw.writeLine(\n `export const StorageWriter = StorageWriter_.StorageWriter${component ? \".forScope<typeof scope>()\" : \"\"};`,\n );\n yield* cbw.writeLine(\n \"export type StorageWriter = typeof StorageWriter.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // StorageActionWriter\n yield* cbw.writeLine(\n `export const StorageActionWriter = StorageActionWriter_.StorageActionWriter${component ? \".forScope<typeof scope>()\" : \"\"};`,\n );\n yield* cbw.writeLine(\n \"export type StorageActionWriter = typeof StorageActionWriter.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // VectorSearch\n yield* cbw.writeLine(\n \"export const VectorSearch: VectorSearch_.VectorSearchTag<\",\n );\n yield* cbw.indent(\n cbw.writeLine(\"DataModel.FromSchema<typeof schemaDefinition>\"),\n );\n yield* cbw.writeLine(\n \"> = VectorSearch_.VectorSearch<DataModel.FromSchema<typeof schemaDefinition>>();\",\n );\n yield* cbw.writeLine(\n \"export type VectorSearch = typeof VectorSearch.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // DatabaseReader\n yield* cbw.writeLine(\n \"export const DatabaseReader: DatabaseReader_.DatabaseReaderTag<\",\n );\n yield* cbw.indent(\n Effect.gen(function* () {\n yield* cbw.writeLine(\"typeof schemaDefinition,\");\n yield* cbw.writeLine(\"Docs\");\n }),\n );\n yield* cbw.writeLine(\n \"> = DatabaseReader_.DatabaseReader<typeof schemaDefinition, Docs>();\",\n );\n yield* cbw.writeLine(\n \"export type DatabaseReader = typeof DatabaseReader.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // DatabaseWriter\n yield* cbw.writeLine(\n \"export const DatabaseWriter: DatabaseWriter_.DatabaseWriterTag<\",\n );\n yield* cbw.indent(\n Effect.gen(function* () {\n yield* cbw.writeLine(\"typeof schemaDefinition,\");\n yield* cbw.writeLine(\"Docs\");\n }),\n );\n yield* cbw.writeLine(\n \"> = DatabaseWriter_.DatabaseWriter<typeof schemaDefinition, Docs>();\",\n );\n yield* cbw.writeLine(\n \"export type DatabaseWriter = typeof DatabaseWriter.Identifier;\",\n );\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n \"export const QueryTransactionContext = QueryTransactionContext_.QueryTransactionContext;\",\n );\n yield* cbw.writeLine(\n \"export type QueryTransactionContext = typeof QueryTransactionContext.Identifier;\",\n );\n yield* cbw.blankLine();\n yield* cbw.writeLine(\n \"export const MutationTransactionContext = MutationTransactionContext_.MutationTransactionContext;\",\n );\n yield* cbw.writeLine(\n \"export type MutationTransactionContext = typeof MutationTransactionContext.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // QueryRunner\n yield* cbw.writeLine(\"export const QueryRunner = QueryRunner_.QueryRunner;\");\n yield* cbw.writeLine(\n \"export type QueryRunner = typeof QueryRunner.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // MutationRunner\n yield* cbw.writeLine(\n \"export const MutationRunner = MutationRunner_.MutationRunner;\",\n );\n yield* cbw.writeLine(\n \"export type MutationRunner = typeof MutationRunner.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // ActionRunner\n yield* cbw.writeLine(\n \"export const ActionRunner = ActionRunner_.ActionRunner;\",\n );\n yield* cbw.writeLine(\n \"export type ActionRunner = typeof ActionRunner.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // QueryCtx\n yield* cbw.writeLine(\"export const QueryCtx: QueryCtx_.QueryCtxTag<\");\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\"> = QueryCtx_.QueryCtx<\");\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\">();\");\n yield* cbw.writeLine(\"export type QueryCtx = typeof QueryCtx.Identifier;\");\n yield* cbw.blankLine();\n\n // MutationCtx\n yield* cbw.writeLine(\n \"export const MutationCtx: MutationCtx_.MutationCtxTag<\",\n );\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\"> = MutationCtx_.MutationCtx<\");\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\">();\");\n yield* cbw.writeLine(\n \"export type MutationCtx = typeof MutationCtx.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // ActionCtx\n yield* cbw.writeLine(\"export const ActionCtx: ActionCtx_.ActionCtxTag<\");\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\"> = ActionCtx_.ActionCtx<\");\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\">();\");\n yield* cbw.writeLine(\"export type ActionCtx = typeof ActionCtx.Identifier;\");\n\n return yield* cbw.toString();\n});\n\nexport const assembledSpec = ({\n nodes,\n}: {\n nodes: ReadonlyArray<SpecAssemblyNode>;\n}) => renderSpecAssembly(nodes);\n"],"mappings":"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"}
1
+ {"version":3,"file":"templates.mjs","names":["renderSpecAssembly"],"sources":["../src/templates.ts"],"sourcesContent":["import type * as IdScope from \"@confect/core/IdScope\";\nimport * as Array from \"effect/Array\";\nimport * as Effect from \"effect/Effect\";\nimport type * as GroupSpec from \"@confect/core/GroupSpec\";\nimport { CodeBlockWriter } from \"./CodeBlockWriter.js\";\nimport {\n render as renderSpecAssembly,\n type SpecAssemblyNode,\n} from \"./SpecAssemblyNode.js\";\n\n/**\n * Emit `convex/schema.ts` as a one-line re-export of the codegen-emitted deploy\n * schema in `confect/_generated/convexSchema.ts`. Deploy-time consumers (the\n * Convex CLI, `convex-test`) keep reading `convex/schema.ts`; the runtime\n * `DatabaseSchema` in `confect/_generated/schema.ts` is untouched by this\n * file.\n */\nexport const schema = ({\n convexSchemaImportPath,\n}: Parameters<typeof schemaEffect>[0]) =>\n schemaEffect({ convexSchemaImportPath });\n\nconst schemaEffect = Effect.fnUntraced(function* ({\n convexSchemaImportPath,\n}: {\n convexSchemaImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`export { default } from \"${convexSchemaImportPath}\";`);\n\n return yield* cbw.toString();\n});\n\ninterface TableModuleBinding {\n readonly importPath: string;\n readonly tableName: string;\n}\n\n/**\n * Emit `confect/_generated/schema.ts`—the runtime `DatabaseSchema` used by\n * impls and the per-group registries (and downstream by per-function bundles\n * for codec lookup). Every table wrapper at\n * `confect/_generated/tables/<name>.ts` is imported statically and registered\n * as a value entry on the `DatabaseSchema.make({...})` call. Per-table laziness\n * lives inside each `Table`: its `Fields` and `Doc` are lazy memoised getters\n * that only evaluate the user-supplied field-schema callback on first access,\n * so unused tables in a function bundle never pay schema-construction cost\n * despite the static import.\n *\n * The `DatabaseSchema` import is aliased to `$DatabaseSchema` because each\n * table is imported under its own (filename-derived) name; a table named\n * `DatabaseSchema` would otherwise collide with the library import and emit a\n * duplicate-binding file. The leading `$` makes the alias collision-proof:\n * `validateConfectTableIdentifier` requires names to match\n * `/^[a-zA-Z][a-zA-Z0-9_]*$/`, which forbids `$`, so no valid table import can\n * ever shadow it.\n */\nexport const runtimeSchema = ({\n tableModules,\n component = false,\n}: Parameters<typeof runtimeSchemaEffect>[0]) =>\n runtimeSchemaEffect({ tableModules, component });\n\nconst runtimeSchemaEffect = Effect.fnUntraced(function* ({\n tableModules,\n component = false,\n}: {\n tableModules: ReadonlyArray<TableModuleBinding>;\n component?: boolean;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(\n `import { DatabaseSchema as $DatabaseSchema } from \"@confect/server\";`,\n );\n\n if (tableModules.length > 0) {\n yield* cbw.blankLine();\n yield* Effect.forEach(tableModules, ({ tableName, importPath }) =>\n cbw.writeLine(`import ${tableName} from \"${importPath}\";`),\n );\n }\n\n yield* cbw.blankLine();\n\n if (component) {\n yield* cbw.writeLine(`import { target as $target } from \"./id.js\";`);\n }\n\n if (tableModules.length === 0) {\n yield* cbw.writeLine(\n `const databaseSchema: $DatabaseSchema.DatabaseSchema${component ? \"<{}, typeof $target>\" : \"\"} = $DatabaseSchema.make({}${component ? \", $target\" : \"\"});`,\n );\n } else {\n yield* cbw.writeLine(\n `const databaseSchema: $DatabaseSchema.DatabaseSchema<{`,\n );\n yield* cbw.indent(\n Effect.forEach(\n tableModules,\n ({ tableName }) =>\n cbw.writeLine(`readonly ${tableName}: typeof ${tableName};`),\n { discard: true },\n ),\n );\n yield* cbw.writeLine(\n `}${component ? \", typeof $target\" : \"\"}> = $DatabaseSchema.make({`,\n );\n yield* cbw.indent(\n Effect.gen(function* () {\n for (const { tableName } of tableModules) {\n yield* cbw.writeLine(`${tableName},`);\n }\n }),\n );\n yield* cbw.writeLine(`}${component ? \", $target\" : \"\"});`);\n }\n\n yield* cbw.blankLine();\n yield* cbw.writeLine(`export default databaseSchema;`);\n\n return yield* cbw.toString();\n});\n\n/**\n * Emit `confect/_generated/convexSchema.ts`—the Convex deploy-time\n * `SchemaDefinition`. Imports every table from its generated wrapper at\n * `_generated/tables/<name>` and calls `defineSchema({...})` exactly once.\n * `Table.tableDefinition` lives in `@confect/server` because it is the\n * `defineTable` binding; the generated table wrappers themselves stay\n * client-safe (`Fields`/`Doc` from `@confect/core`).\n *\n * The `defineSchema` and `Table` imports are aliased with a leading `$` because\n * each table is imported under its own (filename-derived) name; a table named\n * `defineSchema` or `Table` would otherwise collide with the library import and\n * emit a duplicate-binding file. `validateConfectTableIdentifier` requires\n * names to match `/^[a-zA-Z][a-zA-Z0-9_]*$/`, which forbids `$`, so no valid\n * table import can ever shadow them.\n */\nexport const convexSchema = ({\n tableModules,\n}: Parameters<typeof convexSchemaEffect>[0]) =>\n convexSchemaEffect({ tableModules });\n\nconst convexSchemaEffect = Effect.fnUntraced(function* ({\n tableModules,\n}: {\n tableModules: ReadonlyArray<TableModuleBinding>;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(\n `import { defineSchema as $defineSchema } from \"convex/server\";`,\n );\n\n if (tableModules.length > 0) {\n yield* cbw.writeLine(`import { Table as $Table } from \"@confect/server\";`);\n yield* cbw.blankLine();\n yield* Effect.forEach(tableModules, ({ tableName, importPath }) =>\n cbw.writeLine(`import ${tableName} from \"${importPath}\";`),\n );\n }\n\n yield* cbw.blankLine();\n\n if (tableModules.length === 0) {\n yield* cbw.writeLine(`export default $defineSchema({});`);\n } else {\n yield* cbw.writeLine(`export default $defineSchema({`);\n yield* cbw.indent(\n Effect.gen(function* () {\n for (const { tableName } of tableModules) {\n yield* cbw.writeLine(\n `${tableName}: $Table.tableDefinition(${tableName}),`,\n );\n }\n }),\n );\n yield* cbw.writeLine(`});`);\n }\n\n return yield* cbw.toString();\n});\n\n/**\n * Emit `confect/_generated/id.ts`—a type-constrained `Id` constructor and a\n * `TableNames` union derived from the user's `confect/tables/*.ts` filenames.\n * User-authored table modules import `Id` from this file to declare cross-table\n * id references without typing the destination name as a free string (and\n * without ever importing each other transitively).\n *\n * `Id` also accepts Convex system tables, with the component scope when\n * present. `TableNames` includes only user tables and resolves to `never` for\n * an empty table directory.\n */\nexport const id = ({ tableNames, scope }: Parameters<typeof idEffect>[0]) =>\n idEffect({ tableNames, scope });\n\nconst idEffect = Effect.fnUntraced(function* ({\n tableNames,\n scope,\n}: {\n tableNames: ReadonlyArray<string>;\n scope?: IdScope.Component<string> | undefined;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(\n `import { GenericId${scope === undefined ? \"\" : \", IdScope\"} } from \"@confect/core\";`,\n );\n yield* cbw.writeLine(\n `import type { SystemTableNames } from \"convex/server\";`,\n );\n yield* cbw.blankLine();\n if (scope !== undefined) {\n yield* cbw.writeLine(\n // oxlint-disable-next-line effecttsgo/prefer-schema-over-json -- Emit an escaped TypeScript string literal, not a JSON payload.\n `export const scope = IdScope.component(${JSON.stringify(scope.slice(\"component:\".length))});`,\n );\n yield* cbw.writeLine(\n `export const target = { kind: \"component\", scope } as const;`,\n );\n }\n\n const union =\n tableNames.length === 0\n ? \"never\"\n : tableNames.map((n) => `\"${n}\"`).join(\" | \");\n yield* cbw.writeLine(`export type TableNames = ${union};`);\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n `export type Id<TableName extends TableNames | SystemTableNames> = GenericId.GenericId<TableName${scope === undefined ? \"\" : \", typeof scope\"}>;`,\n );\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n `export const Id = <const TableName extends TableNames | SystemTableNames>(`,\n );\n yield* cbw.indent(cbw.writeLine(`tableName: TableName,`));\n yield* cbw.writeLine(\n `) => GenericId.GenericId(tableName${scope === undefined ? \"\" : \", scope\"});`,\n );\n\n return yield* cbw.toString();\n});\n\n/**\n * Emit `confect/_generated/tables/<tableName>.ts`—a two-line wrapper that\n * imports the user-authored `UnnamedTable` and binds the file basename to it,\n * producing the fully-named `Table` value that downstream consumers (schema,\n * specs, impls) read.\n */\nexport const tableWrapper = ({\n tableName,\n unnamedImportPath,\n component = false,\n}: Parameters<typeof tableWrapperEffect>[0]) =>\n tableWrapperEffect({ tableName, unnamedImportPath, component });\n\nconst tableWrapperEffect = Effect.fnUntraced(function* ({\n tableName,\n unnamedImportPath,\n component = false,\n}: {\n tableName: string;\n unnamedImportPath: string;\n component?: boolean;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import unnamed from \"${unnamedImportPath}\";`);\n if (component) yield* cbw.writeLine(`import { scope } from \"../id.js\";`);\n yield* cbw.blankLine();\n yield* cbw.writeLine(\n `export default unnamed(\"${tableName}\"${component ? \", scope\" : \"\"});`,\n );\n\n return yield* cbw.toString();\n});\n\nexport const http = ({ httpImportPath }: Parameters<typeof httpEffect>[0]) =>\n httpEffect({ httpImportPath });\n\nconst httpEffect = Effect.fnUntraced(function* ({\n httpImportPath,\n}: {\n httpImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import http from \"${httpImportPath}\";`);\n yield* cbw.newLine();\n yield* cbw.writeLine(`export default http;`);\n\n return yield* cbw.toString();\n});\n\n/**\n * Emit `convex/http.ts` for a declared backend: the Convex router serving\n * `confect/http.ts`'s routes, typed by the generated database schema.\n */\nexport const declaredHttp = Effect.fnUntraced(function* ({\n schemaImportPath,\n httpImportPath,\n}: {\n schemaImportPath: string;\n httpImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(\n \"// Generated by `confect codegen` from confect/http.ts. Do not edit.\",\n );\n yield* cbw.writeLine(`import { HttpRouter } from \"@confect/server\";`);\n yield* cbw.writeLine(`import schema from \"${schemaImportPath}\";`);\n yield* cbw.writeLine(`import http from \"${httpImportPath}\";`);\n yield* cbw.newLine();\n yield* cbw.writeLine(\n `export default HttpRouter.forSchema(schema)(http.routes, { api: http.api });`,\n );\n\n return yield* cbw.toString();\n});\n\nexport const crons = ({ cronsImportPath }: Parameters<typeof cronsEffect>[0]) =>\n cronsEffect({ cronsImportPath });\n\nconst cronsEffect = Effect.fnUntraced(function* ({\n cronsImportPath,\n}: {\n cronsImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import crons from \"${cronsImportPath}\";`);\n yield* cbw.newLine();\n yield* cbw.writeLine(`export default crons.convexCronJobs;`);\n\n return yield* cbw.toString();\n});\n\nexport const authConfig = ({\n authImportPath,\n}: Parameters<typeof authConfigEffect>[0]) =>\n authConfigEffect({ authImportPath });\n\nconst authConfigEffect = Effect.fnUntraced(function* ({\n authImportPath,\n}: {\n authImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import auth from \"${authImportPath}\";`);\n yield* cbw.newLine();\n yield* cbw.writeLine(`export default auth;`);\n\n return yield* cbw.toString();\n});\n\n/**\n * Emit `confect/_generated/components.ts`—a typed registry of the Convex\n * components installed via `app.use(...)` in `convex/convex.config.ts`. Mirrors\n * the `components` export of Convex's generated `convex/_generated/api`: the\n * runtime value is `componentsGeneric()` (a name-preserving proxy), and each\n * entry is typed with the `ComponentApi` that component packages export from\n * `_generated/component.js`. Unlike `convex/_generated/api`, this file exists\n * before `convex codegen` ever runs, so impl modules can import it\n * safely—`confect codegen` bundles and evaluates each impl's import graph, and\n * `convex/_generated/api` doesn't exist yet at that point.\n *\n * The `as any` cast is confined here: `componentsGeneric()` is typed\n * `AnyChildComponents`, which deliberately doesn't overlap the precise registry\n * type; the `Components` annotation on the const supplies the real type.\n */\nexport const components = ({\n components: installedComponents,\n}: Parameters<typeof componentsEffect>[0]) =>\n componentsEffect({ components: installedComponents });\n\nconst componentsEffect = Effect.fnUntraced(function* ({\n components: installedComponents,\n}: {\n components: ReadonlyArray<{ name: string; typeImportPath: string }>;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import { componentsGeneric } from \"convex/server\";`);\n yield* cbw.blankLine();\n\n if (installedComponents.length === 0) {\n yield* cbw.writeLine(`export type Components = {};`);\n } else {\n yield* cbw.writeLine(`export type Components = {`);\n yield* cbw.indent(\n Effect.forEach(\n installedComponents,\n ({ name, typeImportPath }) =>\n cbw.writeLine(\n `\"${name}\": import(\"${typeImportPath}/_generated/component.js\").ComponentApi<\"${name}\">;`,\n ),\n { discard: true },\n ),\n );\n yield* cbw.writeLine(`};`);\n }\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n `export const components: Components = componentsGeneric() as any;`,\n );\n\n return yield* cbw.toString();\n});\n\nexport const refs = ({ specImportPath }: Parameters<typeof refsEffect>[0]) =>\n refsEffect({ specImportPath });\n\nconst refsEffect = Effect.fnUntraced(function* ({\n specImportPath,\n}: {\n specImportPath: string;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n yield* cbw.writeLine(`import { Refs } from \"@confect/core\";`);\n yield* cbw.writeLine(`import spec from \"${specImportPath}\";`);\n yield* cbw.blankLine();\n yield* cbw.writeLine(\n `const refs: Refs.FromSpec<typeof spec> = Refs.make(spec);`,\n );\n yield* cbw.blankLine();\n yield* cbw.writeLine(`export default refs;`);\n\n return yield* cbw.toString();\n});\n\nexport const componentContract = Effect.fnUntraced(function* ({\n tableNames,\n}: {\n tableNames: ReadonlyArray<string>;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n yield* cbw.writeLine('import { Component } from \"@confect/core\";');\n yield* cbw.writeLine('import spec from \"./spec.js\";');\n yield* cbw.writeLine('import { scope } from \"./id.js\";');\n yield* cbw.blankLine();\n const names = Array.map(\n [...tableNames, \"_storage\", \"_scheduled_functions\"],\n (name) => `\"${name}\"`,\n );\n yield* cbw.writeLine(\n `const component: Component.Component<typeof spec, typeof scope, ${names.join(\" | \")}> = Component.make(spec, scope, [${names.join(\", \")}]);`,\n );\n yield* cbw.writeLine(\"export default component;\");\n return yield* cbw.toString();\n});\n\n/**\n * Emit `_generated/docs.ts`: one named `type <table>` alias per table plus a\n * `Docs` registry. Each alias is `Document.Document<typeof schemaDefinition,\n * \"<table>\">`, so it stays structurally exact while giving the document a\n * _name_—declaration emit then prints e.g. `NotesDoc` instead of expanding the\n * row structure. A `type` alias (rather than an extending `interface`) is used\n * so it works for every document shape: object tables, but also union schemas\n * (`Schema.Union`) and other non-object documents, which an `interface …\n * extends` cannot represent (TS2312). The registry is threaded into the\n * generated `DatabaseReader`/`DatabaseWriter` tags so query/mutation helpers\n * print named documents with no user annotations.\n */\nexport const docs = ({\n schemaImportPath,\n tables,\n}: Parameters<typeof docsEffect>[0]) =>\n docsEffect({ schemaImportPath, tables });\n\nconst docsEffect = Effect.fnUntraced(function* ({\n schemaImportPath,\n tables,\n}: {\n schemaImportPath: string;\n tables: ReadonlyArray<{ tableName: string; docName: string }>;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n // With no tables there is nothing to import—emitting the (unused) imports\n // would trip `noUnusedLocals`.\n if (tables.length === 0) {\n yield* cbw.writeLine(`export interface Docs {}`);\n return yield* cbw.toString();\n }\n\n yield* cbw.writeLine(`import type { Document } from \"@confect/server\";`);\n yield* cbw.writeLine(\n `import type schemaDefinition from \"${schemaImportPath}\";`,\n );\n yield* cbw.blankLine();\n\n for (const { tableName, docName } of tables) {\n yield* cbw.writeLine(\n `export type ${docName} = Document.Document<typeof schemaDefinition, \"${tableName}\">;`,\n );\n }\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(`export interface Docs {`);\n yield* cbw.indent(\n Effect.gen(function* () {\n for (const { tableName, docName } of tables) {\n yield* cbw.writeLine(`${tableName}: ${docName};`);\n }\n }),\n );\n yield* cbw.writeLine(`}`);\n\n return yield* cbw.toString();\n});\n\nexport const registeredFunctionsForGroup = ({\n spec,\n schemaImportPath,\n specImportPath,\n implImportPath,\n groupPath = \"\",\n required = [],\n}: Parameters<typeof registeredFunctionsForGroupEffect>[0]) =>\n registeredFunctionsForGroupEffect({\n spec,\n schemaImportPath,\n specImportPath,\n implImportPath,\n groupPath,\n required,\n });\n\nconst registeredFunctionsForGroupEffect = Effect.fnUntraced(function* ({\n spec,\n schemaImportPath,\n specImportPath,\n implImportPath,\n groupPath = \"\",\n required = [],\n}: {\n spec: GroupSpec.AnyWithProps;\n schemaImportPath: string;\n specImportPath: string;\n implImportPath: string;\n groupPath?: string;\n required?: ReadonlyArray<{ readonly key: string }>;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n const useNode = spec.runtime === \"Node\";\n\n const hasConfectFunctions = (group: GroupSpec.AnyWithProps): boolean =>\n Object.values(group.functions).some(\n (functionSpec) => functionSpec.functionProvenance._tag === \"Confect\",\n ) || Object.values(group.groups).some(hasConfectFunctions);\n const forwarding = !useNode && hasConfectFunctions(spec);\n\n if (useNode) {\n yield* cbw.writeLine(\n `import { RegisteredNodeFunction } from \"@confect/server/node\";`,\n );\n } else if (!forwarding) {\n yield* cbw.writeLine(\n `import { RegisteredFunctions } from \"@confect/server\";`,\n );\n } else {\n yield* cbw.writeLine(\n `import { ConvexFunctionDefinitions, RegisteredConvexFunction, type RegisteredFunctions } from \"@confect/server\";`,\n );\n }\n\n if (required.length > 0) {\n yield* cbw.writeLine(`import { GroupImpl } from \"@confect/server\";`);\n }\n yield* cbw.writeLine(`import databaseSchema from \"${schemaImportPath}\";`);\n yield* cbw.writeLine(`import groupLayer from \"${implImportPath}\";`);\n yield* cbw.blankLine();\n // The group's own leaf spec is referenced type-only (`typeof import(...)`),\n // so the spec module is erased at transpile time and never enters the\n // per-function bundle; only `databaseSchema` and the impl are runtime\n // imports. Typing from the leaf spec (not the project-wide assembled spec)\n // keeps the registry's type dependent solely on its own group.\n const groupLayer =\n required.length === 0\n ? \"groupLayer\"\n : // oxlint-disable-next-line effecttsgo/prefer-schema-over-json -- Emit escaped TypeScript string literals, not JSON payloads.\n `groupLayer.pipe(GroupImpl.finalize({ required: [${required.map(({ key }) => `{ key: ${JSON.stringify(key)} }`).join(\", \")}], groupPath: ${JSON.stringify(groupPath)} }))`;\n const specType = `typeof import(\"${specImportPath}\")[\"default\"]`;\n if (useNode) {\n yield* cbw.writeLine(\n `export default RegisteredNodeFunction.buildForGroup<${specType}>(databaseSchema, ${groupLayer});`,\n );\n } else if (!forwarding) {\n yield* cbw.writeLine(\n `export default RegisteredFunctions.buildForGroup<${specType}>(databaseSchema, ${groupLayer});`,\n );\n } else {\n const bindings = (group: GroupSpec.AnyWithProps, path: string): string =>\n `{\n${[\n ...Object.entries(group.functions).map(([name, functionSpec]) => {\n const key = JSON.stringify(name);\n const definition = `${path}[${key}]`;\n return `[${key}]: ${\n functionSpec.functionProvenance._tag === \"Convex\"\n ? `${definition}.handler`\n : `RegisteredConvexFunction.register({ ...${definition}, handler: forward(${definition}.handler) })`\n },`;\n }),\n ...Object.entries(group.groups).map(([name, child]) => {\n const key = JSON.stringify(name);\n return `[${key}]: ${bindings(child, `${path}[${key}]`)},`;\n }),\n].join(\"\\n\")}\n}`;\n yield* cbw.writeLine(`const forward = <Ctx, Args, Returns>(handler: (ctx: Ctx, args: Args) => Promise<Returns>) => (ctx: Ctx, args: Args) => handler(ctx, args);\n\nconst definitions = ConvexFunctionDefinitions.buildForGroup<${specType}>(databaseSchema, ${groupLayer});\n\nexport default ${bindings(spec, \"definitions\")} as RegisteredFunctions.RegisteredFunctionsForGroupSpec<${specType}>;`);\n }\n\n return yield* cbw.toString();\n});\n\nexport const services = ({\n schemaImportPath,\n component = false,\n}: Parameters<typeof servicesEffect>[0]) =>\n servicesEffect({ schemaImportPath, component });\n\nconst servicesEffect = Effect.fnUntraced(function* ({\n schemaImportPath,\n component = false,\n}: {\n schemaImportPath: string;\n component?: boolean;\n}) {\n const cbw = new CodeBlockWriter({ indentNumberOfSpaces: 2 });\n\n // Imports\n yield* cbw.writeLine(\"import {\");\n yield* cbw.indent(\n Effect.gen(function* () {\n yield* cbw.writeLine(\"ActionCtx as ActionCtx_,\");\n yield* cbw.writeLine(\"ActionRunner as ActionRunner_,\");\n if (!component) yield* cbw.writeLine(\"Auth as Auth_,\");\n yield* cbw.writeLine(\"type DataModel,\");\n yield* cbw.writeLine(\"DatabaseReader as DatabaseReader_,\");\n yield* cbw.writeLine(\"DatabaseWriter as DatabaseWriter_,\");\n yield* cbw.writeLine(\"ExecutionMetadata as ExecutionMetadata_,\");\n yield* cbw.writeLine(\"MutationCtx as MutationCtx_,\");\n yield* cbw.writeLine(\"MutationRunner as MutationRunner_,\");\n yield* cbw.writeLine(\n \"MutationTransactionContext as MutationTransactionContext_,\",\n );\n yield* cbw.writeLine(\"QueryCtx as QueryCtx_,\");\n yield* cbw.writeLine(\"QueryRunner as QueryRunner_,\");\n yield* cbw.writeLine(\n \"QueryTransactionContext as QueryTransactionContext_,\",\n );\n yield* cbw.writeLine(\"RequestMetadata as RequestMetadata_,\");\n yield* cbw.writeLine(\"Scheduler as Scheduler_,\");\n if (!component) yield* cbw.writeLine(\"Storage as Storage_,\");\n yield* cbw.writeLine(\"StorageActionWriter as StorageActionWriter_,\");\n yield* cbw.writeLine(\"StorageReader as StorageReader_,\");\n yield* cbw.writeLine(\"StorageWriter as StorageWriter_,\");\n yield* cbw.writeLine(\"TransactionMetadata as TransactionMetadata_,\");\n yield* cbw.writeLine(\"VectorSearch as VectorSearch_,\");\n }),\n );\n yield* cbw.writeLine(`} from \"@confect/server\";`);\n yield* cbw.writeLine(\n `import type schemaDefinition from \"${schemaImportPath}\";`,\n );\n yield* cbw.writeLine(`import type { Docs } from \"./docs.js\";`);\n if (component) yield* cbw.writeLine(`import type { scope } from \"./id.js\";`);\n yield* cbw.blankLine();\n\n // Auth\n if (!component) {\n yield* cbw.writeLine(\"export const Auth = Auth_.Auth;\");\n yield* cbw.writeLine(\"export type Auth = typeof Auth.Identifier;\");\n }\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n \"export const ExecutionMetadata = ExecutionMetadata_.ExecutionMetadata;\",\n );\n yield* cbw.writeLine(\n \"export type ExecutionMetadata = typeof ExecutionMetadata.Identifier;\",\n );\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n \"export const RequestMetadata = RequestMetadata_.RequestMetadata;\",\n );\n yield* cbw.writeLine(\n \"export type RequestMetadata = typeof RequestMetadata.Identifier;\",\n );\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n \"export const TransactionMetadata = TransactionMetadata_.TransactionMetadata;\",\n );\n yield* cbw.writeLine(\n \"export type TransactionMetadata = typeof TransactionMetadata.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // Scheduler\n yield* cbw.writeLine(\n component\n ? \"export const Scheduler = Scheduler_.forScope<typeof scope>();\"\n : \"export const Scheduler = Scheduler_.Scheduler;\",\n );\n yield* cbw.writeLine(\"export type Scheduler = typeof Scheduler.Identifier;\");\n yield* cbw.blankLine();\n\n if (!component) {\n yield* cbw.writeLine(\"export const Storage = Storage_.Storage;\");\n yield* cbw.writeLine(\"export type Storage = typeof Storage.Identifier;\");\n yield* cbw.blankLine();\n }\n\n // StorageReader\n yield* cbw.writeLine(\n `export const StorageReader = StorageReader_.StorageReader${component ? \".forScope<typeof scope>()\" : \"\"};`,\n );\n yield* cbw.writeLine(\n \"export type StorageReader = typeof StorageReader.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // StorageWriter\n yield* cbw.writeLine(\n `export const StorageWriter = StorageWriter_.StorageWriter${component ? \".forScope<typeof scope>()\" : \"\"};`,\n );\n yield* cbw.writeLine(\n \"export type StorageWriter = typeof StorageWriter.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // StorageActionWriter\n yield* cbw.writeLine(\n `export const StorageActionWriter = StorageActionWriter_.StorageActionWriter${component ? \".forScope<typeof scope>()\" : \"\"};`,\n );\n yield* cbw.writeLine(\n \"export type StorageActionWriter = typeof StorageActionWriter.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // VectorSearch\n yield* cbw.writeLine(\n \"export const VectorSearch: VectorSearch_.VectorSearchTag<\",\n );\n yield* cbw.indent(\n cbw.writeLine(\"DataModel.FromSchema<typeof schemaDefinition>\"),\n );\n yield* cbw.writeLine(\n \"> = VectorSearch_.VectorSearch<DataModel.FromSchema<typeof schemaDefinition>>();\",\n );\n yield* cbw.writeLine(\n \"export type VectorSearch = typeof VectorSearch.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // DatabaseReader\n yield* cbw.writeLine(\n \"export const DatabaseReader: DatabaseReader_.DatabaseReaderTag<\",\n );\n yield* cbw.indent(\n Effect.gen(function* () {\n yield* cbw.writeLine(\"typeof schemaDefinition,\");\n yield* cbw.writeLine(\"Docs\");\n }),\n );\n yield* cbw.writeLine(\n \"> = DatabaseReader_.DatabaseReader<typeof schemaDefinition, Docs>();\",\n );\n yield* cbw.writeLine(\n \"export type DatabaseReader = typeof DatabaseReader.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // DatabaseWriter\n yield* cbw.writeLine(\n \"export const DatabaseWriter: DatabaseWriter_.DatabaseWriterTag<\",\n );\n yield* cbw.indent(\n Effect.gen(function* () {\n yield* cbw.writeLine(\"typeof schemaDefinition,\");\n yield* cbw.writeLine(\"Docs\");\n }),\n );\n yield* cbw.writeLine(\n \"> = DatabaseWriter_.DatabaseWriter<typeof schemaDefinition, Docs>();\",\n );\n yield* cbw.writeLine(\n \"export type DatabaseWriter = typeof DatabaseWriter.Identifier;\",\n );\n yield* cbw.blankLine();\n\n yield* cbw.writeLine(\n \"export const QueryTransactionContext = QueryTransactionContext_.QueryTransactionContext;\",\n );\n yield* cbw.writeLine(\n \"export type QueryTransactionContext = typeof QueryTransactionContext.Identifier;\",\n );\n yield* cbw.blankLine();\n yield* cbw.writeLine(\n \"export const MutationTransactionContext = MutationTransactionContext_.MutationTransactionContext;\",\n );\n yield* cbw.writeLine(\n \"export type MutationTransactionContext = typeof MutationTransactionContext.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // QueryRunner\n yield* cbw.writeLine(\"export const QueryRunner = QueryRunner_.QueryRunner;\");\n yield* cbw.writeLine(\n \"export type QueryRunner = typeof QueryRunner.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // MutationRunner\n yield* cbw.writeLine(\n \"export const MutationRunner = MutationRunner_.MutationRunner;\",\n );\n yield* cbw.writeLine(\n \"export type MutationRunner = typeof MutationRunner.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // ActionRunner\n yield* cbw.writeLine(\n \"export const ActionRunner = ActionRunner_.ActionRunner;\",\n );\n yield* cbw.writeLine(\n \"export type ActionRunner = typeof ActionRunner.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // QueryCtx\n yield* cbw.writeLine(\"export const QueryCtx: QueryCtx_.QueryCtxTag<\");\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\"> = QueryCtx_.QueryCtx<\");\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\">();\");\n yield* cbw.writeLine(\"export type QueryCtx = typeof QueryCtx.Identifier;\");\n yield* cbw.blankLine();\n\n // MutationCtx\n yield* cbw.writeLine(\n \"export const MutationCtx: MutationCtx_.MutationCtxTag<\",\n );\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\"> = MutationCtx_.MutationCtx<\");\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\">();\");\n yield* cbw.writeLine(\n \"export type MutationCtx = typeof MutationCtx.Identifier;\",\n );\n yield* cbw.blankLine();\n\n // ActionCtx\n yield* cbw.writeLine(\"export const ActionCtx: ActionCtx_.ActionCtxTag<\");\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\"> = ActionCtx_.ActionCtx<\");\n yield* cbw.indent(\n cbw.writeLine(\n `DataModel.ToConvex<DataModel.FromSchema<typeof schemaDefinition>>${component ? \", typeof scope\" : \"\"}`,\n ),\n );\n yield* cbw.writeLine(\">();\");\n yield* cbw.writeLine(\"export type ActionCtx = typeof ActionCtx.Identifier;\");\n\n return yield* cbw.toString();\n});\n\nexport const assembledSpec = ({\n nodes,\n}: {\n nodes: ReadonlyArray<SpecAssemblyNode>;\n}) => renderSpecAssembly(nodes);\n"],"mappings":"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"}
package/dist/utils.mjs CHANGED
@@ -23,7 +23,7 @@ const toPosixPath = (path, pathStr) => pipe(String.split(pathStr, path.sep), Arr
23
23
  const toModuleImportPath = Effect.fnUntraced(function* (relativePath) {
24
24
  const path = yield* Path.Path;
25
25
  const withoutExt = toPosixPath(path, yield* removePathExtension(relativePath));
26
- return String.startsWith(".")(withoutExt) ? withoutExt : `./${withoutExt}`;
26
+ return String.startsWith(".")(withoutExt) ? `${withoutExt}.js` : `./${withoutExt}.js`;
27
27
  });
28
28
  const writeFileStringAndLog = Effect.fnUntraced(function* (filePath, contents) {
29
29
  const fs = yield* FileSystem.FileSystem;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":["templates.http","templates.crons","templates.authConfig"],"sources":["../src/utils.ts"],"sourcesContent":["import * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport type { PlatformError } from \"effect/PlatformError\";\nimport { pipe } from \"effect/Function\";\nimport * as Array from \"effect/Array\";\nimport * as Effect from \"effect/Effect\";\nimport * as DateTime from \"effect/DateTime\";\nimport * as Option from \"effect/Option\";\nimport * as String from \"effect/String\";\nimport { logFileAdded, logFileModified } from \"./log\";\nimport { ConfectDirectory } from \"./ConfectDirectory\";\nimport { ConvexDirectory } from \"./ConvexDirectory\";\nimport * as templates from \"./templates\";\n\nexport const removePathExtension = Effect.fnUntraced(function* (\n pathStr: string,\n) {\n const path = yield* Path.Path;\n\n return String.slice(0, -path.extname(pathStr).length)(pathStr);\n});\n\nexport const toPosixPath = (path: Path.Path, pathStr: string): string =>\n pipe(String.split(pathStr, path.sep), Array.join(\"/\"));\n\n/**\n * Ensures a relative path is a valid ESM/TS module specifier (e.g. `spec` →\n * `./spec`).\n */\nexport const toModuleImportPath = Effect.fnUntraced(function* (\n relativePath: string,\n) {\n const path = yield* Path.Path;\n const withoutExt = toPosixPath(\n path,\n yield* removePathExtension(relativePath),\n );\n return String.startsWith(\".\")(withoutExt) ? withoutExt : `./${withoutExt}`;\n});\n\nexport const writeFileStringAndLog = Effect.fnUntraced(function* (\n filePath: string,\n contents: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n if (!(yield* fs.exists(filePath))) {\n yield* fs.writeFileString(filePath, contents);\n yield* logFileAdded(filePath);\n return;\n }\n const existing = yield* fs.readFileString(filePath);\n if (existing !== contents) {\n yield* fs.writeFileString(filePath, contents);\n yield* logFileModified(filePath);\n }\n});\n\nexport const findProjectRoot = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const startDir = path.resolve(\".\");\n const root = path.parse(startDir).root;\n\n const directories = Array.unfold(startDir, (dir) =>\n dir === root\n ? Option.none()\n : Option.some([dir, path.dirname(dir)] as const),\n );\n\n const projectRoot = yield* Effect.findFirst(directories, (dir) =>\n fs.exists(path.join(dir, \"package.json\")),\n );\n\n return Option.getOrElse(projectRoot, () => startDir);\n});\n\nexport type WriteChange = \"Added\" | \"Modified\" | \"Unchanged\";\n\nexport const writeFileString = Effect.fnUntraced(function* (\n filePath: string,\n contents: string,\n): Effect.fn.Return<WriteChange, PlatformError, FileSystem.FileSystem> {\n const fs = yield* FileSystem.FileSystem;\n\n if (!(yield* fs.exists(filePath))) {\n yield* fs.writeFileString(filePath, contents);\n return \"Added\";\n }\n const existing = yield* fs.readFileString(filePath);\n if (existing !== contents) {\n yield* fs.writeFileString(filePath, contents);\n return \"Modified\";\n }\n return \"Unchanged\";\n});\n\nexport const removePathIfExists = Effect.fnUntraced(function* (\n filePath: string,\n): Effect.fn.Return<void, PlatformError, FileSystem.FileSystem> {\n const fs = yield* FileSystem.FileSystem;\n\n if (!(yield* fs.exists(filePath))) {\n return;\n }\n\n yield* fs\n .remove(filePath)\n .pipe(\n Effect.catchTag(\"PlatformError\", (error) =>\n error.reason._tag === \"NotFound\" ? Effect.void : Effect.fail(error),\n ),\n );\n});\n\n/**\n * Bump the mtime of `convex/schema.ts` so the Convex CLI's chokidar watcher\n * emits a `change` event after explicit codegen, bootstrap, or recovery.\n * Recovery can leave generated contents unchanged, so it needs an explicit\n * notification to release Convex from a previous error. Ordinary successful\n * watch updates rely on their source/output changes instead of invalidating a\n * Convex push that may already be processing those changes.\n */\nexport const touchConvexSchema = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n const schemaPath = path.join(convexDirectory, \"schema.ts\");\n\n if (!(yield* fs.exists(schemaPath))) {\n return;\n }\n\n const now = yield* DateTime.nowAsDate;\n yield* fs.utimes(schemaPath, now, now);\n});\n\nconst generateOptionalFile = Effect.fnUntraced(function* (\n confectFile: string,\n convexFile: string,\n generateContents: (importPath: string) => Effect.Effect<string>,\n) {\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\n const confectFilePath = path.join(confectDirectory, confectFile);\n\n if (!(yield* fs.exists(confectFilePath))) {\n return Option.none();\n }\n\n const convexFilePath = path.join(convexDirectory, convexFile);\n const relativeImportPath = path.relative(\n path.dirname(convexFilePath),\n confectFilePath,\n );\n const contents = yield* generateContents(\n yield* toModuleImportPath(relativeImportPath),\n );\n const change = yield* writeFileString(convexFilePath, contents);\n return Option.some({ change, convexFilePath });\n});\n\nexport const generateHttp = generateOptionalFile(\n \"http.ts\",\n \"http.ts\",\n (importPath) => templates.http({ httpImportPath: importPath }),\n);\n\nexport const generateCrons = generateOptionalFile(\n \"crons.ts\",\n \"crons.ts\",\n (importPath) => templates.crons({ cronsImportPath: importPath }),\n);\n\nexport const generateAuthConfig = generateOptionalFile(\n \"auth.ts\",\n \"auth.config.ts\",\n (importPath) => templates.authConfig({ authImportPath: importPath }),\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.mjs","names":["templates.http","templates.crons","templates.authConfig"],"sources":["../src/utils.ts"],"sourcesContent":["import * as FileSystem from \"effect/FileSystem\";\nimport * as Path from \"effect/Path\";\nimport type { PlatformError } from \"effect/PlatformError\";\nimport { pipe } from \"effect/Function\";\nimport * as Array from \"effect/Array\";\nimport * as Effect from \"effect/Effect\";\nimport * as DateTime from \"effect/DateTime\";\nimport * as Option from \"effect/Option\";\nimport * as String from \"effect/String\";\nimport { logFileAdded, logFileModified } from \"./log.js\";\nimport { ConfectDirectory } from \"./ConfectDirectory.js\";\nimport { ConvexDirectory } from \"./ConvexDirectory.js\";\nimport * as templates from \"./templates.js\";\n\nexport const removePathExtension = Effect.fnUntraced(function* (\n pathStr: string,\n) {\n const path = yield* Path.Path;\n\n return String.slice(0, -path.extname(pathStr).length)(pathStr);\n});\n\nexport const toPosixPath = (path: Path.Path, pathStr: string): string =>\n pipe(String.split(pathStr, path.sep), Array.join(\"/\"));\n\n/**\n * Ensures a relative path is a valid ESM/TS module specifier (e.g. `spec` →\n * `./spec`).\n */\nexport const toModuleImportPath = Effect.fnUntraced(function* (\n relativePath: string,\n) {\n const path = yield* Path.Path;\n const withoutExt = toPosixPath(\n path,\n yield* removePathExtension(relativePath),\n );\n return String.startsWith(\".\")(withoutExt)\n ? `${withoutExt}.js`\n : `./${withoutExt}.js`;\n});\n\nexport const writeFileStringAndLog = Effect.fnUntraced(function* (\n filePath: string,\n contents: string,\n) {\n const fs = yield* FileSystem.FileSystem;\n if (!(yield* fs.exists(filePath))) {\n yield* fs.writeFileString(filePath, contents);\n yield* logFileAdded(filePath);\n return;\n }\n const existing = yield* fs.readFileString(filePath);\n if (existing !== contents) {\n yield* fs.writeFileString(filePath, contents);\n yield* logFileModified(filePath);\n }\n});\n\nexport const findProjectRoot = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const startDir = path.resolve(\".\");\n const root = path.parse(startDir).root;\n\n const directories = Array.unfold(startDir, (dir) =>\n dir === root\n ? Option.none()\n : Option.some([dir, path.dirname(dir)] as const),\n );\n\n const projectRoot = yield* Effect.findFirst(directories, (dir) =>\n fs.exists(path.join(dir, \"package.json\")),\n );\n\n return Option.getOrElse(projectRoot, () => startDir);\n});\n\nexport type WriteChange = \"Added\" | \"Modified\" | \"Unchanged\";\n\nexport const writeFileString = Effect.fnUntraced(function* (\n filePath: string,\n contents: string,\n): Effect.fn.Return<WriteChange, PlatformError, FileSystem.FileSystem> {\n const fs = yield* FileSystem.FileSystem;\n\n if (!(yield* fs.exists(filePath))) {\n yield* fs.writeFileString(filePath, contents);\n return \"Added\";\n }\n const existing = yield* fs.readFileString(filePath);\n if (existing !== contents) {\n yield* fs.writeFileString(filePath, contents);\n return \"Modified\";\n }\n return \"Unchanged\";\n});\n\nexport const removePathIfExists = Effect.fnUntraced(function* (\n filePath: string,\n): Effect.fn.Return<void, PlatformError, FileSystem.FileSystem> {\n const fs = yield* FileSystem.FileSystem;\n\n if (!(yield* fs.exists(filePath))) {\n return;\n }\n\n yield* fs\n .remove(filePath)\n .pipe(\n Effect.catchTag(\"PlatformError\", (error) =>\n error.reason._tag === \"NotFound\" ? Effect.void : Effect.fail(error),\n ),\n );\n});\n\n/**\n * Bump the mtime of `convex/schema.ts` so the Convex CLI's chokidar watcher\n * emits a `change` event after explicit codegen, bootstrap, or recovery.\n * Recovery can leave generated contents unchanged, so it needs an explicit\n * notification to release Convex from a previous error. Ordinary successful\n * watch updates rely on their source/output changes instead of invalidating a\n * Convex push that may already be processing those changes.\n */\nexport const touchConvexSchema = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const convexDirectory = yield* ConvexDirectory.get;\n const schemaPath = path.join(convexDirectory, \"schema.ts\");\n\n if (!(yield* fs.exists(schemaPath))) {\n return;\n }\n\n const now = yield* DateTime.nowAsDate;\n yield* fs.utimes(schemaPath, now, now);\n});\n\nconst generateOptionalFile = Effect.fnUntraced(function* (\n confectFile: string,\n convexFile: string,\n generateContents: (importPath: string) => Effect.Effect<string>,\n) {\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\n const confectFilePath = path.join(confectDirectory, confectFile);\n\n if (!(yield* fs.exists(confectFilePath))) {\n return Option.none();\n }\n\n const convexFilePath = path.join(convexDirectory, convexFile);\n const relativeImportPath = path.relative(\n path.dirname(convexFilePath),\n confectFilePath,\n );\n const contents = yield* generateContents(\n yield* toModuleImportPath(relativeImportPath),\n );\n const change = yield* writeFileString(convexFilePath, contents);\n return Option.some({ change, convexFilePath });\n});\n\nexport const generateHttp = generateOptionalFile(\n \"http.ts\",\n \"http.ts\",\n (importPath) => templates.http({ httpImportPath: importPath }),\n);\n\nexport const generateCrons = generateOptionalFile(\n \"crons.ts\",\n \"crons.ts\",\n (importPath) => templates.crons({ cronsImportPath: importPath }),\n);\n\nexport const generateAuthConfig = generateOptionalFile(\n \"auth.ts\",\n \"auth.config.ts\",\n (importPath) => templates.authConfig({ authImportPath: importPath }),\n);\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gaganref/confect-cli",
3
- "version": "10.3.1-fork.2",
3
+ "version": "10.3.1-fork.20",
4
4
  "dependencies": {
5
5
  "@effect/platform-node": "^4.0.4",
6
6
  "bundle-require": "^5.1.0",
@@ -9,8 +9,8 @@
9
9
  "exsolve": "^1.1.3"
10
10
  },
11
11
  "peerDependencies": {
12
- "@confect/core": "npm:@gaganref/confect-core@10.3.1-fork.2",
13
- "@confect/server": "npm:@gaganref/confect-server@10.3.1-fork.2",
12
+ "@confect/core": "npm:@gaganref/confect-core@10.3.1-fork.20",
13
+ "@confect/server": "npm:@gaganref/confect-server@10.3.1-fork.20",
14
14
  "effect": "^4.0.4"
15
15
  },
16
16
  "description": "Developer tooling for codegen and sync",