syncorejs 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_vendor/core/cli.d.mts.map +1 -1
- package/dist/_vendor/core/cli.mjs +272 -7
- package/dist/_vendor/core/cli.mjs.map +1 -1
- package/dist/_vendor/core/index.d.mts +3 -3
- package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/devtools.mjs +131 -0
- package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
- package/dist/_vendor/core/runtime/functions.d.mts +3 -3
- package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +1 -1
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +1 -1
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs +5 -1
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +99 -13
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +38 -4
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -1
- package/dist/_vendor/core/runtime/runtime.d.mts +65 -8
- package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
- package/dist/_vendor/core/transport.d.mts.map +1 -1
- package/dist/_vendor/core/transport.mjs +30 -5
- package/dist/_vendor/core/transport.mjs.map +1 -1
- package/dist/_vendor/devtools-protocol/index.d.ts +75 -1
- package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
- package/dist/_vendor/devtools-protocol/index.js.map +1 -1
- package/dist/_vendor/next/index.js +9 -1
- package/dist/_vendor/next/index.js.map +1 -1
- package/dist/_vendor/platform-expo/index.d.ts +1 -1
- package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/index.js +6 -1
- package/dist/_vendor/platform-expo/index.js.map +1 -1
- package/dist/_vendor/platform-node/index.d.mts +2 -1
- package/dist/_vendor/platform-node/index.d.mts.map +1 -1
- package/dist/_vendor/platform-node/index.mjs +27 -2
- package/dist/_vendor/platform-node/index.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.mjs +4 -0
- package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
- package/dist/_vendor/platform-web/external-change.d.ts +2 -2
- package/dist/_vendor/platform-web/external-change.js +2 -2
- package/dist/_vendor/platform-web/external-change.js.map +1 -1
- package/dist/_vendor/platform-web/index.d.ts +13 -10
- package/dist/_vendor/platform-web/index.d.ts.map +1 -1
- package/dist/_vendor/platform-web/index.js +66 -10
- package/dist/_vendor/platform-web/index.js.map +1 -1
- package/dist/_vendor/platform-web/indexeddb.d.ts +3 -3
- package/dist/_vendor/platform-web/indexeddb.js +3 -3
- package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
- package/dist/_vendor/platform-web/opfs.d.ts +3 -1
- package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
- package/dist/_vendor/platform-web/opfs.js +29 -3
- package/dist/_vendor/platform-web/opfs.js.map +1 -1
- package/dist/_vendor/platform-web/persistence.d.ts +31 -1
- package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
- package/dist/_vendor/platform-web/persistence.js.map +1 -1
- package/dist/_vendor/platform-web/react.d.ts.map +1 -1
- package/dist/_vendor/platform-web/react.js +9 -1
- package/dist/_vendor/platform-web/react.js.map +1 -1
- package/dist/_vendor/react/index.d.ts +6 -5
- package/dist/_vendor/react/index.d.ts.map +1 -1
- package/dist/_vendor/react/index.js +6 -5
- package/dist/_vendor/react/index.js.map +1 -1
- package/dist/_vendor/svelte/index.d.ts +8 -6
- package/dist/_vendor/svelte/index.d.ts.map +1 -1
- package/dist/_vendor/svelte/index.js +7 -5
- package/dist/_vendor/svelte/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":["connectToNet"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { appendFile, readdir, mkdir, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { createServer } from \"node:http\";\nimport { connect as connectToNet } from \"node:net\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { DatabaseSync, type SQLInputValue } from \"node:sqlite\";\nimport { Command } from \"commander\";\nimport { tsImport } from \"tsx/esm/api\";\nimport WebSocket, { WebSocketServer } from \"ws\";\nimport type {\n SyncoreDevtoolsClientMessage,\n SyncoreDevtoolsCommandPayload,\n SyncoreDevtoolsCommandResultPayload,\n SyncoreDevtoolsCapabilities,\n SyncoreDevtoolsMessage,\n SyncoreDevtoolsSubscriptionPayload,\n SyncoreDevtoolsSubscriptionResultPayload,\n SyncoreDevtoolsSubscribe,\n SyncoreDevtoolsUnsubscribe\n} from \"@syncore/devtools-protocol\";\nimport {\n SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION,\n SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION,\n SYNCORE_DEVTOOLS_PROTOCOL_VERSION,\n createPublicRuntimeId,\n createPublicTargetId\n} from \"@syncore/devtools-protocol\";\nimport {\n generateDevtoolsToken,\n isAllowedDashboardOrigin,\n isAuthorizedDashboardRequest,\n sanitizeDevtoolsToken\n} from \"./devtools-auth.js\";\nimport {\n createDevtoolsCommandHandler,\n createDevtoolsSubscriptionHost,\n generateId,\n SyncoreRuntime,\n type AnyTableDefinition,\n type DevtoolsSqlAnalysis,\n type DevtoolsSqlReadResult,\n type DevtoolsSqlSupport,\n createSchemaSnapshot,\n diffSchemaSnapshots,\n parseSchemaSnapshot,\n renderCreateIndexStatement,\n renderCreateSearchIndexStatement,\n renderCreateTableStatement,\n renderMigrationSql,\n searchIndexTableName,\n type SchemaSnapshot,\n type StorageObject,\n type StorageWriteInput,\n type SyncoreExternalChangeEvent,\n type SyncoreExternalChangeSignal,\n type SyncoreSchema,\n type SyncoreFunctionRegistry,\n type SyncoreResolvedComponents,\n type SyncoreSqlDriver,\n type SyncoreStorageAdapter,\n type TableDefinition,\n type Validator\n} from \"./index.js\";\n\nexport interface SyncoreProjectTargetConfig {\n databasePath: string;\n storageDirectory: string;\n}\n\nexport interface SyncoreConfig {\n projectTarget?: SyncoreProjectTargetConfig;\n databasePath?: string;\n storageDirectory?: string;\n}\n\nexport interface DevHubSessionState {\n dashboardUrl: string;\n authenticatedDashboardUrl: string;\n devtoolsUrl: string;\n token: string;\n}\n\nexport type SyncoreTemplateName =\n | \"minimal\"\n | \"node\"\n | \"react-web\"\n | \"svelte\"\n | \"expo\"\n | \"electron\"\n | \"next\";\n\nexport function templateUsesConnectedClients(\n template: SyncoreTemplateName\n): boolean {\n return (\n template === \"react-web\" ||\n template === \"svelte\" ||\n template === \"expo\" ||\n template === \"next\"\n );\n}\n\ninterface SyncoreTemplateFile {\n path: string;\n content: string;\n}\n\ninterface ScannedFunctionEntry {\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n}\n\nconst loadedTypeScriptModules = new Map<\n string,\n { mtimeMs: number; loaded: Promise<Record<string, unknown>> }\n>();\n\nexport interface ScaffoldProjectOptions {\n template: SyncoreTemplateName;\n force?: boolean;\n}\n\nexport interface ScaffoldProjectResult {\n template: SyncoreTemplateName;\n created: string[];\n updated: string[];\n skipped: string[];\n}\n\ninterface PackageJsonShape {\n name?: string;\n type?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nconst COMBINED_DEV_COMMAND =\n 'concurrently --kill-others-on-fail --names syncore,app --prefix-colors yellow,cyan \"npm run syncorejs:dev\" \"npm run dev:app\"';\n\nconst program = new Command();\nconst CORE_PACKAGE_ROOT = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"..\"\n);\nconst DEVTOOLS_SESSION_FILE = path.join(\".syncore\", \"devtools-session.json\");\nexport const SYNCORE_MIGRATION_SNAPSHOT_FILE_NAME = \"_schema_snapshot.json\";\nexport const VALID_SYNCORE_TEMPLATES: SyncoreTemplateName[] = [\n \"minimal\",\n \"node\",\n \"react-web\",\n \"svelte\",\n \"expo\",\n \"electron\",\n \"next\"\n];\nlet pendingDevBootstrap: ReturnType<typeof setTimeout> | undefined;\nlet devBootstrapInFlight = false;\nconst PROJECT_TARGET_RUNTIME_ID = \"syncore-project-target\";\n\nprogram\n .name(\"syncorejs\")\n .description(\"Syncore local-first toolkit CLI\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"init\")\n .description(\"Scaffold Syncore in the current directory\")\n .option(\n \"--template <template>\",\n `Template to scaffold (${VALID_SYNCORE_TEMPLATES.join(\", \")}, or auto)`,\n \"auto\"\n )\n .option(\"--force\", \"Overwrite Syncore-managed files when they already exist\")\n .action(async (options: { template: string; force?: boolean }) => {\n const cwd = process.cwd();\n const template = await resolveRequestedTemplate(cwd, options.template);\n const result = await scaffoldProject(cwd, {\n template,\n ...(options.force ? { force: true } : {})\n });\n await runCodegen(cwd);\n logScaffoldResult(result, \"Syncore project scaffolded.\");\n console.log(\n \"Next: run `npx syncorejs dev` to keep codegen and local migrations in sync.\"\n );\n });\n\nprogram\n .command(\"codegen\")\n .description(\"Generate typed Syncore references from syncore/functions\")\n .action(async () => {\n await runCodegen(process.cwd());\n console.log(\"Generated syncore/_generated files.\");\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Check Syncore project structure and inferred template\")\n .action(async () => {\n const cwd = process.cwd();\n const checks = [\n \"syncore.config.ts\",\n path.join(\"syncore\", \"schema.ts\"),\n path.join(\"syncore\", \"functions\"),\n path.join(\"syncore\", \"migrations\")\n ];\n console.log(`Detected template: ${await detectProjectTemplate(cwd)}`);\n for (const check of checks) {\n const exists = await fileExists(path.join(cwd, check));\n console.log(`${exists ? \"OK\" : \"MISSING\"} ${check}`);\n }\n });\n\nprogram\n .command(\"import\")\n .description(\"Import JSONL sample data into a local Syncore table\")\n .requiredOption(\"--table <table>\", \"Table name to import into\")\n .argument(\"<file>\", \"Path to a JSONL file\")\n .action(async (filePath: string, options: { table: string }) => {\n const importedCount = await importJsonlIntoProject(\n process.cwd(),\n options.table,\n filePath\n );\n console.log(\n `Imported ${importedCount} row(s) into ${JSON.stringify(options.table)}.`\n );\n });\n\nprogram\n .command(\"seed\")\n .description(\n \"Import seed data from syncore/seed.jsonl or syncore/seed/<table>.jsonl\"\n )\n .requiredOption(\"--table <table>\", \"Table name to seed\")\n .option(\"--file <file>\", \"Explicit JSONL file path\")\n .action(async (options: { table: string; file?: string }) => {\n const cwd = process.cwd();\n const seedFile =\n options.file ??\n (await resolveDefaultSeedFile(cwd, options.table)) ??\n path.join(\"syncore\", \"seed\", `${options.table}.jsonl`);\n const importedCount = await importJsonlIntoProject(\n cwd,\n options.table,\n seedFile\n );\n console.log(\n `Seeded ${importedCount} row(s) into ${JSON.stringify(options.table)} from ${seedFile}.`\n );\n });\n\nprogram\n .command(\"migrate:status\")\n .description(\n \"Compare the current schema against the last saved migration snapshot\"\n )\n .action(async () => {\n const cwd = process.cwd();\n const schema = await loadProjectSchema(cwd);\n const currentSnapshot = createSchemaSnapshot(schema);\n const storedSnapshot = await readStoredSnapshot(cwd);\n const plan = diffSchemaSnapshots(storedSnapshot, currentSnapshot);\n\n console.log(`Current schema hash: ${currentSnapshot.hash}`);\n console.log(`Stored snapshot: ${storedSnapshot?.hash ?? \"none\"}`);\n console.log(`Statements to generate: ${plan.statements.length}`);\n console.log(`Warnings: ${plan.warnings.length}`);\n console.log(`Destructive changes: ${plan.destructiveChanges.length}`);\n\n for (const warning of plan.warnings) {\n console.log(`WARN ${warning}`);\n }\n for (const destructiveChange of plan.destructiveChanges) {\n console.log(`BLOCK ${destructiveChange}`);\n }\n });\n\nprogram\n .command(\"migrate:generate\")\n .argument(\"[name]\", \"Optional migration name\", \"auto\")\n .description(\"Generate a SQL migration file from the current schema diff\")\n .action(async (name: string) => {\n const cwd = process.cwd();\n const schema = await loadProjectSchema(cwd);\n const currentSnapshot = createSchemaSnapshot(schema);\n const storedSnapshot = await readStoredSnapshot(cwd);\n const plan = diffSchemaSnapshots(storedSnapshot, currentSnapshot);\n\n if (plan.destructiveChanges.length > 0) {\n console.error(\"Destructive schema changes require a manual migration:\");\n for (const destructiveChange of plan.destructiveChanges) {\n console.error(`- ${destructiveChange}`);\n }\n process.exitCode = 1;\n return;\n }\n\n if (plan.statements.length === 0 && plan.warnings.length === 0) {\n console.log(\"No schema changes detected.\");\n return;\n }\n\n const migrationsDirectory = path.join(cwd, \"syncore\", \"migrations\");\n await mkdir(migrationsDirectory, { recursive: true });\n const migrationNumber = await getNextMigrationNumber(migrationsDirectory);\n const slug = slugify(name);\n const migrationFileName = `${String(migrationNumber).padStart(4, \"0\")}_${slug}.sql`;\n const migrationSql = renderMigrationSql(plan, {\n title: `Syncore migration ${migrationFileName}`\n });\n await writeFile(\n path.join(migrationsDirectory, migrationFileName),\n migrationSql\n );\n await writeStoredSnapshot(cwd, currentSnapshot);\n console.log(\n `Generated ${path.join(\"syncore\", \"migrations\", migrationFileName)}`\n );\n });\n\nprogram\n .command(\"migrate:apply\")\n .description(\n \"Apply SQL migrations from syncore/migrations to the configured database\"\n )\n .action(async () => {\n const appliedCount = await applyProjectMigrations(process.cwd());\n console.log(`Applied ${appliedCount} migration(s).`);\n });\n\nprogram\n .command(\"dev\")\n .description(\"Start the Syncore dev loop and devtools hub\")\n .option(\n \"--template <template>\",\n `Template to scaffold when Syncore is missing (${VALID_SYNCORE_TEMPLATES.join(\", \")}, or auto)`,\n \"auto\"\n )\n .action(async (options: { template: string }) => {\n const cwd = process.cwd();\n const template = await resolveRequestedTemplate(cwd, options.template);\n await startDevHub({ cwd, template });\n });\n\nexport async function runSyncoreCli(argv = process.argv): Promise<void> {\n await program.parseAsync(argv);\n}\n\nif (isCliEntryPoint()) {\n await runSyncoreCli();\n}\n\nexport async function runCodegen(cwd: string): Promise<void> {\n const functionsDir = path.join(cwd, \"syncore\", \"functions\");\n const generatedDir = path.join(cwd, \"syncore\", \"_generated\");\n const componentsManifestPath = path.join(cwd, \"syncore\", \"components.ts\");\n await mkdir(generatedDir, { recursive: true });\n const functionImportExtension = await resolveFunctionImportExtension(cwd);\n const hasComponentsManifest = await hasNonEmptyComponentsManifest(\n componentsManifestPath\n );\n\n const files = await listTypeScriptFiles(functionsDir);\n const functionEntries: ScannedFunctionEntry[] = [];\n\n for (const file of files) {\n const content = await readFile(file, \"utf8\");\n const relative = path\n .relative(functionsDir, file)\n .replaceAll(\"\\\\\", \"/\")\n .replace(/\\.tsx?$/, \"\");\n const pathParts = relative.split(\"/\");\n const regex = /export const (\\w+)\\s*=\\s*(query|mutation|action)\\(/g;\n for (const match of content.matchAll(regex)) {\n functionEntries.push({\n pathParts,\n exportName: match[1]!,\n kind: match[2] as \"query\" | \"mutation\" | \"action\"\n });\n }\n }\n\n const apiSource = [\n `/**`,\n ` * Generated \\`api\\` utility for referencing Syncore functions.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import { createFunctionReferenceFor } from \"syncorejs\";`,\n `import type { FunctionReferenceFor } from \"syncorejs\";`,\n `export { components } from \"./components${functionImportExtension}\";`,\n ``,\n ...renderFunctionTypeImports(functionEntries, functionImportExtension),\n ``,\n ...renderGeneratedApiInterfaces(functionEntries),\n ``,\n `/**`,\n ` * A utility for referencing Syncore functions in your app's public API.`,\n ` *`,\n ` * Usage:`,\n ` * \\`\\`\\`ts`,\n ` * const listTasks = api.tasks.list;`,\n ` * \\`\\`\\``,\n ` */`,\n `export const api: SyncoreApi = ${renderApiObject(functionEntries)} as const;`,\n ``\n ].join(\"\\n\");\n\n const functionsSource = [\n `/**`,\n ` * Generated Syncore function registry.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import type { SyncoreFunctionRegistry } from \"syncorejs\";`,\n `import { composeProjectFunctionRegistry } from \"syncorejs\";`,\n ...renderGeneratedManifestImportLines(\n hasComponentsManifest,\n functionImportExtension\n ),\n ...renderFunctionImports(functionEntries, functionImportExtension),\n ``,\n ...renderGeneratedManifestDeclarationLines(hasComponentsManifest),\n ``,\n ...renderGeneratedFunctionsInterface(functionEntries),\n ``,\n `/**`,\n ` * The runtime registry for every function exported from \\`syncore/functions\\`.`,\n ` *`,\n ` * Most application code should import from \\`./api\\` instead of using this map directly.`,\n ` */`,\n `const rootFunctions: SyncoreRootFunctionsRegistry = {`,\n ...functionEntries.map(\n (entry) =>\n ` ${JSON.stringify(`${entry.pathParts.join(\"/\")}/${entry.exportName}`)}: ${renderFunctionImportName(entry)},`\n ),\n `} as const;`,\n ``,\n `export const functions: SyncoreFunctionRegistry = composeProjectFunctionRegistry(rootFunctions, componentsManifest);`,\n ``\n ].join(\"\\n\");\n\n const schemaSource = [\n `/**`,\n ` * Generated composed Syncore schema including installed components.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import { composeProjectSchema } from \"syncorejs\";`,\n `import rootSchema from \"../schema${functionImportExtension}\";`,\n ...renderGeneratedManifestImportLines(\n hasComponentsManifest,\n functionImportExtension\n ),\n ``,\n ...renderGeneratedManifestDeclarationLines(hasComponentsManifest),\n ``,\n `const schema = composeProjectSchema(rootSchema, componentsManifest);`,\n ``,\n `export default schema;`,\n ``\n ].join(\"\\n\");\n\n const componentsSource = [\n `/**`,\n ` * Generated installed-component helpers for this Syncore app.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import { createInstalledComponentsApi, resolveComponentsManifest } from \"syncorejs\";`,\n ...renderGeneratedManifestImportLines(\n hasComponentsManifest,\n functionImportExtension\n ),\n ``,\n ...renderGeneratedManifestDeclarationLines(hasComponentsManifest),\n ``,\n `export const components = createInstalledComponentsApi(componentsManifest);`,\n ``,\n `export const resolvedComponents = resolveComponentsManifest(componentsManifest);`,\n ``,\n `export default resolvedComponents;`,\n ``\n ].join(\"\\n\");\n\n const runtimeSource = [\n `/**`,\n ` * Generated local runtime bundle for Syncore CLI and Node adapters.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import schema from \"./schema${functionImportExtension}\";`,\n `import { functions } from \"./functions${functionImportExtension}\";`,\n ...(hasComponentsManifest\n ? [`import { resolvedComponents } from \"./components${functionImportExtension}\";`]\n : [`const resolvedComponents = [] as const;`]),\n ``,\n `export { functions, schema };`,\n `export const components = resolvedComponents;`,\n ``\n ].join(\"\\n\");\n\n const serverSource = [\n `/**`,\n ` * Generated utilities for implementing Syncore query, mutation, and action functions.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import type schema from \"../schema${functionImportExtension}\";`,\n `import { action as baseAction, mutation as baseMutation, query as baseQuery } from \"syncorejs\";`,\n `import type {`,\n ` ActionCtx as BaseActionCtx,`,\n ` FunctionConfig,`,\n ` Infer,`,\n ` InferArgs,`,\n ` MutationCtx as BaseMutationCtx,`,\n ` QueryCtx as BaseQueryCtx,`,\n ` SyncoreFunctionDefinition,`,\n ` Validator,`,\n ` ValidatorMap`,\n `} from \"syncorejs\";`,\n ``,\n `export { createFunctionReference, createFunctionReferenceFor, s } from \"syncorejs\";`,\n ``,\n `/**`,\n ` * The context object available inside Syncore query handlers in this app.`,\n ` */`,\n `export type QueryCtx = BaseQueryCtx<typeof schema>;`,\n ``,\n `/**`,\n ` * The context object available inside Syncore mutation handlers in this app.`,\n ` */`,\n `export type MutationCtx = BaseMutationCtx<typeof schema>;`,\n ``,\n `/**`,\n ` * The context object available inside Syncore action handlers in this app.`,\n ` */`,\n `export type ActionCtx = BaseActionCtx<typeof schema>;`,\n ``,\n `export type { FunctionReference } from \"syncorejs\";`,\n ``,\n `/**`,\n ` * Define a query in this Syncore app's public API.`,\n ` *`,\n ` * Queries can read from your local Syncore database and can be called from clients.`,\n ` *`,\n ` * @param config - The query definition, including args and a handler.`,\n ` * @returns The wrapped query. Export it from \\`syncore/functions\\` to add it to the generated API.`,\n ` */`,\n `export const query = baseQuery as {`,\n ` <TValidator extends Validator<unknown, unknown, string>, TResult>(`,\n ` config: FunctionConfig<QueryCtx, Infer<TValidator>, TResult> & { args: TValidator }`,\n ` ): SyncoreFunctionDefinition<\"query\", QueryCtx, Infer<TValidator>, TResult>;`,\n ` <TArgsShape extends ValidatorMap, TResult>(`,\n ` config: FunctionConfig<QueryCtx, InferArgs<TArgsShape>, TResult> & { args: TArgsShape }`,\n ` ): SyncoreFunctionDefinition<\"query\", QueryCtx, InferArgs<TArgsShape>, TResult>;`,\n `};`,\n ``,\n `/**`,\n ` * Define a mutation in this Syncore app's public API.`,\n ` *`,\n ` * Mutations can write to your local Syncore database and can be called from clients.`,\n ` *`,\n ` * @param config - The mutation definition, including args and a handler.`,\n ` * @returns The wrapped mutation. Export it from \\`syncore/functions\\` to add it to the generated API.`,\n ` */`,\n `export const mutation = baseMutation as {`,\n ` <TValidator extends Validator<unknown, unknown, string>, TResult>(`,\n ` config: FunctionConfig<MutationCtx, Infer<TValidator>, TResult> & { args: TValidator }`,\n ` ): SyncoreFunctionDefinition<\"mutation\", MutationCtx, Infer<TValidator>, TResult>;`,\n ` <TArgsShape extends ValidatorMap, TResult>(`,\n ` config: FunctionConfig<MutationCtx, InferArgs<TArgsShape>, TResult> & { args: TArgsShape }`,\n ` ): SyncoreFunctionDefinition<\"mutation\", MutationCtx, InferArgs<TArgsShape>, TResult>;`,\n `};`,\n ``,\n `/**`,\n ` * Define an action in this Syncore app's public API.`,\n ` *`,\n ` * Actions can run arbitrary JavaScript and may call queries or mutations.`,\n ` *`,\n ` * @param config - The action definition, including args and a handler.`,\n ` * @returns The wrapped action. Export it from \\`syncore/functions\\` to add it to the generated API.`,\n ` */`,\n `export const action = baseAction as {`,\n ` <TValidator extends Validator<unknown, unknown, string>, TResult>(`,\n ` config: FunctionConfig<ActionCtx, Infer<TValidator>, TResult> & { args: TValidator }`,\n ` ): SyncoreFunctionDefinition<\"action\", ActionCtx, Infer<TValidator>, TResult>;`,\n ` <TArgsShape extends ValidatorMap, TResult>(`,\n ` config: FunctionConfig<ActionCtx, InferArgs<TArgsShape>, TResult> & { args: TArgsShape }`,\n ` ): SyncoreFunctionDefinition<\"action\", ActionCtx, InferArgs<TArgsShape>, TResult>;`,\n `};`,\n ``\n ].join(\"\\n\");\n\n await writeGeneratedFile(path.join(generatedDir, \"api.ts\"), apiSource);\n await writeGeneratedFile(\n path.join(generatedDir, \"components.ts\"),\n componentsSource\n );\n await writeGeneratedFile(\n path.join(generatedDir, \"functions.ts\"),\n functionsSource\n );\n await writeGeneratedFile(path.join(generatedDir, \"runtime.ts\"), runtimeSource);\n await writeGeneratedFile(path.join(generatedDir, \"schema.ts\"), schemaSource);\n await writeGeneratedFile(path.join(generatedDir, \"server.ts\"), serverSource);\n}\n\nasync function writeGeneratedFile(filePath: string, source: string): Promise<void> {\n try {\n if ((await readFile(filePath, \"utf8\")) === source) {\n return;\n }\n } catch {\n // Missing or unreadable generated files are replaced below.\n }\n await writeFile(filePath, source);\n}\n\nexport async function scaffoldProject(\n cwd: string,\n options: ScaffoldProjectOptions\n): Promise<ScaffoldProjectResult> {\n const files = buildTemplateFiles(options.template);\n const created: string[] = [];\n const updated: string[] = [];\n const skipped: string[] = [];\n\n await mkdir(path.join(cwd, \"syncore\", \"functions\"), { recursive: true });\n await mkdir(path.join(cwd, \"syncore\", \"_generated\"), { recursive: true });\n await mkdir(path.join(cwd, \"syncore\", \"migrations\"), { recursive: true });\n\n for (const file of files) {\n const targetPath = path.join(cwd, file.path);\n const result = await writeManagedFile(\n targetPath,\n file.content,\n options.force\n );\n const relative = path.relative(cwd, targetPath).replaceAll(\"\\\\\", \"/\");\n if (result === \"created\") {\n created.push(relative);\n } else if (result === \"updated\") {\n updated.push(relative);\n } else {\n skipped.push(relative);\n }\n }\n\n await ensurePackageScripts(cwd, options.template);\n await ensureGitignoreEntries(cwd, [\".syncore/\"]);\n\n return {\n template: options.template,\n created,\n updated,\n skipped\n };\n}\n\nfunction buildTemplateFiles(\n template: SyncoreTemplateName\n): SyncoreTemplateFile[] {\n const files: SyncoreTemplateFile[] = [\n {\n path: \"syncore.config.ts\",\n content: renderSyncoreConfigTemplate(template)\n },\n {\n path: path.join(\"syncore\", \"schema.ts\"),\n content: `import { defineSchema, defineTable, s } from \"syncorejs\";\n\nexport default defineSchema({\n tasks: defineTable({\n text: s.string(),\n done: s.boolean()\n }).index(\"by_done\", [\"done\"])\n});\n`\n },\n {\n path: path.join(\"syncore\", \"components.ts\"),\n content: `import { defineComponents } from \"syncorejs\";\n\nexport default defineComponents({});\n`\n },\n {\n path: path.join(\"syncore\", \"functions\", \"tasks.ts\"),\n content: `import { mutation, query, s } from \"../_generated/server\";\n\nexport const list = query({\n args: {},\n handler: async (ctx) =>\n ctx.db.query(\"tasks\").withIndex(\"by_done\").order(\"asc\").collect()\n});\n\nexport const create = mutation({\n args: { text: s.string() },\n handler: async (ctx, args) =>\n ctx.db.insert(\"tasks\", { text: args.text, done: false })\n});\n`\n }\n ];\n\n switch (template) {\n case \"react-web\":\n files.push(\n {\n path: path.join(\"src\", \"syncore.worker.ts\"),\n content: `/// <reference lib=\"webworker\" />\n\nimport { createBrowserWorkerRuntime } from \"syncorejs/browser\";\nimport schema from \"../syncore/_generated/schema\";\nimport { functions } from \"../syncore/_generated/functions\";\n\nvoid createBrowserWorkerRuntime({\n endpoint: self,\n schema,\n functions\n});\n`\n },\n {\n path: path.join(\"src\", \"syncore-provider.tsx\"),\n content: `import type { ReactNode } from \"react\";\nimport { SyncoreBrowserProvider } from \"syncorejs/browser/react\";\n\nexport function AppSyncoreProvider({ children }: { children: ReactNode }) {\n return (\n <SyncoreBrowserProvider workerUrl={new URL(\"./syncore.worker.ts\", import.meta.url)}>\n {children}\n </SyncoreBrowserProvider>\n );\n}\n`\n }\n );\n break;\n case \"expo\":\n files.push({\n path: path.join(\"lib\", \"syncore.ts\"),\n content: `import { createExpoSyncoreBootstrap } from \"syncorejs/expo\";\nimport schema from \"../syncore/_generated/schema\";\nimport { functions } from \"../syncore/_generated/functions\";\n\nexport const syncore = createExpoSyncoreBootstrap({\n schema,\n functions\n});\n`\n });\n break;\n case \"next\":\n files.push(\n {\n path: path.join(\"app\", \"syncore.worker.js\"),\n content: `/* eslint-disable */\n\nimport { createBrowserWorkerRuntime } from \"syncorejs/browser\";\nimport schema from \"../syncore/_generated/schema\";\nimport { functions } from \"../syncore/_generated/functions\";\n\nvoid createBrowserWorkerRuntime({\n endpoint: self,\n schema,\n functions\n});\n`\n },\n {\n path: path.join(\"app\", \"syncore-provider.tsx\"),\n content: `\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { SyncoreNextProvider } from \"syncorejs/next\";\n\nconst createWorker = () =>\n new Worker(new URL(\"./syncore.worker.js\", import.meta.url), {\n type: \"module\"\n });\n\nexport function AppSyncoreProvider({ children }: { children: ReactNode }) {\n return (\n <SyncoreNextProvider createWorker={createWorker}>\n {children}\n </SyncoreNextProvider>\n );\n}\n`\n }\n );\n break;\n case \"node\":\n files.push({\n path: \"script.mjs\",\n content: `import path from \"node:path\";\nimport { withNodeSyncoreClient } from \"syncorejs/node\";\nimport { api } from \"./syncore/_generated/api.ts\";\nimport schema from \"./syncore/_generated/schema.ts\";\nimport { functions } from \"./syncore/_generated/functions.ts\";\n\nawait withNodeSyncoreClient(\n {\n databasePath: path.join(process.cwd(), \".syncore\", \"syncore.db\"),\n storageDirectory: path.join(process.cwd(), \".syncore\", \"storage\"),\n schema,\n functions\n },\n async (client) => {\n await client.mutation(api.tasks.create, { text: \"Run locally\" });\n console.log(await client.query(api.tasks.list));\n }\n);\n`\n });\n break;\n case \"electron\":\n files.push({\n path: path.join(\"src\", \"syncore-runtime.ts\"),\n content: `import path from \"node:path\";\nimport { app } from \"electron\";\nimport { createNodeSyncoreRuntime } from \"syncorejs/node\";\nimport schema from \"../syncore/_generated/schema.js\";\nimport { functions } from \"../syncore/_generated/functions.js\";\n\nexport function createAppSyncoreRuntime() {\n const userDataDirectory = app.getPath(\"userData\");\n return createNodeSyncoreRuntime({\n databasePath: path.join(userDataDirectory, \"syncore.db\"),\n storageDirectory: path.join(userDataDirectory, \"storage\"),\n schema,\n functions,\n platform: \"electron-main\"\n });\n}\n`\n });\n break;\n case \"svelte\":\n files.push(\n {\n path: path.join(\"src\", \"syncore.worker.ts\"),\n content: `/// <reference lib=\"webworker\" />\n\nimport { createBrowserWorkerRuntime } from \"syncorejs/browser\";\nimport schema from \"../syncore/_generated/schema\";\nimport { functions } from \"../syncore/_generated/functions\";\n\nvoid createBrowserWorkerRuntime({\n endpoint: self,\n schema,\n functions\n});\n`\n },\n {\n path: path.join(\"src\", \"SyncoreProvider.svelte\"),\n content: `<script lang=\"ts\">\n import { onDestroy } from \"svelte\";\n import type { Snippet } from \"svelte\";\n import { createBrowserWorkerClient } from \"syncorejs/browser\";\n import { setSyncoreClient } from \"syncorejs/svelte\";\n\n interface Props {\n children?: Snippet;\n }\n\n const { children }: Props = $props();\n\n const managed = createBrowserWorkerClient({\n workerUrl: new URL(\"./syncore.worker.ts\", import.meta.url)\n });\n\n setSyncoreClient(managed.client);\n\n onDestroy(() => {\n void managed.dispose();\n });\n</script>\n\n{@render children?.()}\n`\n }\n );\n break;\n case \"minimal\":\n break;\n }\n\n return files;\n}\n\nfunction renderSyncoreConfigTemplate(template: SyncoreTemplateName): string {\n if (template === \"node\" || template === \"electron\") {\n return `export default {\n projectTarget: {\n databasePath: \".syncore/syncore.db\",\n storageDirectory: \".syncore/storage\"\n }\n};\n`;\n }\n\n return `export default {};\n`;\n}\n\nexport function logScaffoldResult(\n result: ScaffoldProjectResult,\n heading: string\n): void {\n console.log(heading);\n console.log(`Using template: ${result.template}`);\n if (result.created.length > 0) {\n console.log(`Created: ${result.created.join(\", \")}`);\n }\n if (result.updated.length > 0) {\n console.log(`Updated: ${result.updated.join(\", \")}`);\n }\n if (result.skipped.length > 0) {\n console.log(`Kept existing: ${result.skipped.join(\", \")}`);\n }\n}\n\nasync function ensureProjectScaffolded(\n cwd: string,\n template: SyncoreTemplateName\n): Promise<void> {\n if (await hasSyncoreProject(cwd)) {\n return;\n }\n const result = await scaffoldProject(cwd, { template });\n logScaffoldResult(\n result,\n \"Syncore dev did not find a Syncore project, so it scaffolded one for you.\"\n );\n}\n\nexport async function hasSyncoreProject(cwd: string): Promise<boolean> {\n return (\n (await fileExists(path.join(cwd, \"syncore.config.ts\"))) &&\n (await fileExists(path.join(cwd, \"syncore\", \"schema.ts\"))) &&\n (await fileExists(path.join(cwd, \"syncore\", \"functions\")))\n );\n}\n\nexport async function resolveRequestedTemplate(\n cwd: string,\n requestedTemplate: string\n): Promise<SyncoreTemplateName> {\n if (requestedTemplate !== \"auto\") {\n if (\n !VALID_SYNCORE_TEMPLATES.includes(\n requestedTemplate as SyncoreTemplateName\n )\n ) {\n throw new Error(\n `Unknown template ${JSON.stringify(requestedTemplate)}. Expected one of ${VALID_SYNCORE_TEMPLATES.join(\", \")} or auto.`\n );\n }\n return requestedTemplate as SyncoreTemplateName;\n }\n return detectProjectTemplate(cwd);\n}\n\nexport async function detectProjectTemplate(\n cwd: string\n): Promise<SyncoreTemplateName> {\n const packageJson = await readPackageJson(cwd);\n const dependencies = {\n ...(packageJson?.dependencies ?? {}),\n ...(packageJson?.devDependencies ?? {})\n };\n\n if (\"expo\" in dependencies || \"react-native\" in dependencies) {\n return \"expo\";\n }\n if (\"electron\" in dependencies) {\n return \"electron\";\n }\n if (\"next\" in dependencies) {\n return \"next\";\n }\n if (\n \"svelte\" in dependencies ||\n \"@sveltejs/vite-plugin-svelte\" in dependencies ||\n \"@sveltejs/kit\" in dependencies ||\n (await fileExists(path.join(cwd, \"src\", \"SyncoreProvider.svelte\")))\n ) {\n return \"svelte\";\n }\n if (\n \"vite\" in dependencies ||\n \"@vitejs/plugin-react\" in dependencies ||\n (await fileExists(path.join(cwd, \"src\", \"syncore.worker.ts\"))) ||\n (await fileExists(path.join(cwd, \"src\", \"syncore-provider.tsx\"))) ||\n ((await fileExists(path.join(cwd, \"src\", \"main.tsx\"))) &&\n \"react\" in dependencies)\n ) {\n return \"react-web\";\n }\n if (packageJson) {\n return \"node\";\n }\n return \"minimal\";\n}\n\nexport async function readPackageJson(\n cwd: string\n): Promise<PackageJsonShape | null> {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!(await fileExists(packageJsonPath))) {\n return null;\n }\n try {\n return JSON.parse(\n await readFile(packageJsonPath, \"utf8\")\n ) as PackageJsonShape;\n } catch {\n return null;\n }\n}\n\nasync function ensurePackageScripts(\n cwd: string,\n template: SyncoreTemplateName\n): Promise<void> {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!(await fileExists(packageJsonPath))) {\n const packageJson: PackageJsonShape = {\n type: \"module\",\n scripts: {\n \"syncorejs:dev\": \"syncorejs dev\",\n \"syncorejs:codegen\": \"syncorejs codegen\"\n }\n };\n await writeFile(\n packageJsonPath,\n `${JSON.stringify(packageJson, null, 2)}\\n`\n );\n return;\n }\n\n const packageJson = await readPackageJson(cwd);\n if (!packageJson) {\n return;\n }\n\n const nextPackageJson: PackageJsonShape = {\n ...packageJson,\n scripts: {\n ...(packageJson.scripts ?? {})\n }\n };\n\n nextPackageJson.scripts ??= {};\n nextPackageJson.scripts[\"syncorejs:dev\"] ??= \"syncorejs dev\";\n nextPackageJson.scripts[\"syncorejs:codegen\"] ??= \"syncorejs codegen\";\n\n maybeAddManagedDevScripts(nextPackageJson, template);\n\n if (stableStringify(nextPackageJson) === stableStringify(packageJson)) {\n return;\n }\n\n await writeFile(\n packageJsonPath,\n `${JSON.stringify(nextPackageJson, null, 2)}\\n`\n );\n}\n\nfunction maybeAddManagedDevScripts(\n packageJson: PackageJsonShape,\n template: SyncoreTemplateName\n): void {\n if (!supportsManagedCombinedDev(template)) {\n return;\n }\n\n packageJson.scripts ??= {};\n const scripts = packageJson.scripts;\n const currentDev = scripts.dev;\n if (!currentDev) {\n return;\n }\n\n if (\n scripts[\"dev:app\"] === currentDev &&\n scripts.dev === combinedDevCommand()\n ) {\n packageJson.devDependencies ??= {};\n packageJson.devDependencies.concurrently ??= \"^9.1.2\";\n return;\n }\n\n if (scripts[\"dev:app\"] && scripts[\"dev:app\"] !== currentDev) {\n return;\n }\n\n if (currentDev.includes(\"syncorejs:dev\") || currentDev.includes(\"dev:app\")) {\n return;\n }\n\n packageJson.devDependencies ??= {};\n packageJson.devDependencies.concurrently ??= \"^9.1.2\";\n scripts[\"dev:app\"] ??= currentDev;\n scripts.dev = combinedDevCommand();\n}\n\nfunction supportsManagedCombinedDev(template: SyncoreTemplateName): boolean {\n return (\n template === \"next\" ||\n template === \"react-web\" ||\n template === \"svelte\" ||\n template === \"electron\"\n );\n}\n\nfunction combinedDevCommand(): string {\n return COMBINED_DEV_COMMAND;\n}\n\nasync function ensureGitignoreEntries(\n cwd: string,\n entries: string[]\n): Promise<void> {\n const gitignorePath = path.join(cwd, \".gitignore\");\n const existing = (await fileExists(gitignorePath))\n ? await readFile(gitignorePath, \"utf8\")\n : \"\";\n const lines = new Set(\n existing\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n );\n let changed = false;\n for (const entry of entries) {\n if (!lines.has(entry)) {\n lines.add(entry);\n changed = true;\n }\n }\n if (!changed) {\n return;\n }\n const nextContent = `${[...lines].sort((left, right) => left.localeCompare(right)).join(\"\\n\")}\\n`;\n await writeFile(gitignorePath, nextContent);\n}\n\nasync function writeManagedFile(\n filePath: string,\n content: string,\n force = false\n): Promise<\"created\" | \"updated\" | \"skipped\"> {\n await mkdir(path.dirname(filePath), { recursive: true });\n if (!(await fileExists(filePath))) {\n await writeFile(filePath, content);\n return \"created\";\n }\n if (!force) {\n return \"skipped\";\n }\n const current = await readFile(filePath, \"utf8\");\n if (current === content) {\n return \"skipped\";\n }\n await writeFile(filePath, content);\n return \"updated\";\n}\n\nexport async function importJsonlIntoProject(\n cwd: string,\n tableName: string,\n sourcePath: string\n): Promise<number> {\n const schema = await loadProjectSchema(cwd);\n const table = schema.getTable(tableName) as TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >;\n const config = await loadProjectConfig(cwd);\n const projectTarget = requireProjectTargetConfig(config);\n const databasePath = path.resolve(cwd, projectTarget.databasePath);\n const storageDirectory = path.resolve(cwd, projectTarget.storageDirectory);\n const sourceFilePath = path.resolve(cwd, sourcePath);\n await mkdir(path.dirname(databasePath), { recursive: true });\n await mkdir(storageDirectory, { recursive: true });\n const source = await readFile(sourceFilePath, \"utf8\");\n const rows = source\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const database = new DatabaseSync(databasePath);\n try {\n ensureDatabaseReadyForImport(database, schema);\n let importedCount = 0;\n let lineNumber = 0;\n for (const line of rows) {\n lineNumber += 1;\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch (error) {\n throw new Error(\n `Invalid JSON on line ${lineNumber} of ${sourcePath}: ${formatError(error)}`,\n { cause: error }\n );\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\n `Line ${lineNumber} of ${sourcePath} must contain a JSON object.`\n );\n }\n const payload = { ...(parsed as Record<string, unknown>) };\n delete payload._id;\n delete payload._creationTime;\n const validated = table.validator.parse(payload) as Record<\n string,\n unknown\n >;\n const id = generateId();\n const creationTime = Date.now() + importedCount;\n const json = stableStringify(validated);\n database\n .prepare(\n `INSERT INTO ${quoteIdentifier(tableName)} (_id, _creationTime, _json) VALUES (?, ?, ?)`\n )\n .run(id, creationTime, json);\n syncSearchIndexesForImport(database, tableName, table, {\n _id: id,\n _creationTime: creationTime,\n _json: json\n });\n importedCount += 1;\n }\n return importedCount;\n } finally {\n database.close();\n }\n}\n\nexport async function resolveDefaultSeedFile(\n cwd: string,\n tableName: string\n): Promise<string | null> {\n const candidates = [\n path.join(cwd, \"syncore\", \"seed\", `${tableName}.jsonl`),\n path.join(cwd, \"syncore\", \"seed.jsonl\")\n ];\n for (const candidate of candidates) {\n if (await fileExists(candidate)) {\n return path.relative(cwd, candidate).replaceAll(\"\\\\\", \"/\");\n }\n }\n return null;\n}\n\nfunction ensureDatabaseReadyForImport(\n database: DatabaseSync,\n schema: SyncoreSchema<Record<string, AnyTableDefinition>>\n): void {\n for (const tableName of schema.tableNames()) {\n const table = schema.getTable(tableName) as TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >;\n database.exec(renderCreateTableStatement(tableName));\n for (const index of table.indexes) {\n database.exec(\n renderCreateIndexStatement(tableName, index.name, index.fields)\n );\n }\n for (const searchIndex of table.searchIndexes) {\n try {\n database.exec(renderCreateSearchIndexStatement(tableName, searchIndex));\n } catch (error) {\n if (\n !isUnsupportedFts5Statement(\n renderCreateSearchIndexStatement(tableName, searchIndex),\n error\n )\n ) {\n throw error;\n }\n }\n }\n }\n}\n\nfunction syncSearchIndexesForImport(\n database: DatabaseSync,\n tableName: string,\n table: TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >,\n row: { _id: string; _creationTime: number; _json: string }\n): void {\n if (table.searchIndexes.length === 0) {\n return;\n }\n const payload = JSON.parse(row._json) as Record<string, unknown>;\n for (const searchIndex of table.searchIndexes) {\n const searchTable = searchIndexTableName(tableName, searchIndex.name);\n try {\n database\n .prepare(`DELETE FROM ${quoteIdentifier(searchTable)} WHERE _id = ?`)\n .run(row._id);\n database\n .prepare(\n `INSERT INTO ${quoteIdentifier(searchTable)} (_id, search_value) VALUES (?, ?)`\n )\n .run(row._id, toSearchValue(payload[searchIndex.searchField]));\n } catch (error) {\n if (\n !isUnsupportedFts5Statement(\n renderCreateSearchIndexStatement(tableName, searchIndex),\n error\n )\n ) {\n throw error;\n }\n }\n }\n}\n\nasync function listTypeScriptFiles(directory: string): Promise<string[]> {\n if (!(await fileExists(directory))) {\n return [];\n }\n const entries = await readdir(directory, { withFileTypes: true });\n const files = await Promise.all(\n entries.map(async (entry) => {\n const fullPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n return listTypeScriptFiles(fullPath);\n }\n if (entry.isFile() && /\\.tsx?$/.test(entry.name)) {\n return [fullPath];\n }\n return [];\n })\n );\n return files.flat().sort((left, right) => left.localeCompare(right));\n}\n\ntype ApiModuleNode = {\n pathParts: string[];\n children: Map<string, ApiModuleNode>;\n functions: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>;\n};\n\nfunction renderGeneratedApiInterfaces(\n functionEntries: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>\n): string[] {\n const root = buildApiModuleTree(functionEntries);\n return renderGeneratedApiInterfaceNode(root);\n}\n\nfunction renderGeneratedApiInterfaceNode(node: ApiModuleNode): string[] {\n const childInterfaces = [...node.children.values()]\n .sort((left, right) =>\n left.pathParts.join(\"/\").localeCompare(right.pathParts.join(\"/\"))\n )\n .flatMap((child) => renderGeneratedApiInterfaceNode(child));\n\n const lines = [\n `/**`,\n ` * ${renderApiInterfaceDescription(node)}`,\n ` */`,\n `export interface ${renderApiInterfaceName(node)} {`\n ];\n\n for (const child of [...node.children.values()].sort((left, right) =>\n left.pathParts.join(\"/\").localeCompare(right.pathParts.join(\"/\"))\n )) {\n lines.push(\n ` /**`,\n ` * ${renderApiModulePropertyDescription(child)}`,\n ` */`,\n ` readonly ${renderPropertyKey(child.pathParts.at(-1) ?? \"\")}: ${renderApiInterfaceName(child)};`\n );\n }\n\n for (const entry of [...node.functions].sort((left, right) =>\n left.exportName.localeCompare(right.exportName)\n )) {\n lines.push(\n ` /**`,\n ` * ${renderApiFunctionPropertyDescription(entry)}`,\n ` */`,\n ` readonly ${renderPropertyKey(entry.exportName)}: FunctionReferenceFor<typeof ${renderFunctionImportName(entry)}>;`\n );\n }\n\n lines.push(`}`);\n return [...childInterfaces, lines.join(\"\\n\")];\n}\n\nfunction renderApiObject(\n functionEntries: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>\n): string {\n const root = buildApiModuleTree(functionEntries);\n return renderApiObjectNode(root);\n}\n\nfunction renderApiObjectNode(node: ApiModuleNode): string {\n const properties: string[] = [];\n\n for (const child of [...node.children.values()].sort((left, right) =>\n left.pathParts.join(\"/\").localeCompare(right.pathParts.join(\"/\"))\n )) {\n properties.push(\n `${renderPropertyKey(child.pathParts.at(-1) ?? \"\")}: ${renderApiObjectNode(child)}`\n );\n }\n\n for (const entry of [...node.functions].sort((left, right) =>\n left.exportName.localeCompare(right.exportName)\n )) {\n properties.push(\n `${renderPropertyKey(entry.exportName)}: createFunctionReferenceFor<typeof ${renderFunctionImportName(entry)}>(\"${entry.kind}\", \"${entry.pathParts.join(\"/\")}/${entry.exportName}\")`\n );\n }\n\n return `{ ${properties.join(\", \")} }`;\n}\n\nfunction buildApiModuleTree(\n functionEntries: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>\n): ApiModuleNode {\n const root: ApiModuleNode = {\n pathParts: [],\n children: new Map(),\n functions: []\n };\n\n for (const entry of functionEntries) {\n let cursor = root;\n for (const segment of entry.pathParts) {\n let child = cursor.children.get(segment);\n if (!child) {\n child = {\n pathParts: [...cursor.pathParts, segment],\n children: new Map(),\n functions: []\n };\n cursor.children.set(segment, child);\n }\n cursor = child;\n }\n cursor.functions.push(entry);\n }\n\n return root;\n}\n\nfunction renderGeneratedFunctionsInterface(\n functionEntries: ScannedFunctionEntry[]\n): string[] {\n const lines = [\n `/**`,\n ` * Type-safe runtime definitions for every function exported from \\`syncore/functions\\`.`,\n ` */`,\n `export interface SyncoreRootFunctionsRegistry extends SyncoreFunctionRegistry {`\n ];\n\n for (const entry of functionEntries\n .slice()\n .sort((left, right) =>\n `${left.pathParts.join(\"/\")}/${left.exportName}`.localeCompare(\n `${right.pathParts.join(\"/\")}/${right.exportName}`\n )\n )) {\n lines.push(\n ` /**`,\n ` * Runtime definition for the public Syncore ${entry.kind} \\`${entry.pathParts.join(\"/\")}/${entry.exportName}\\`.`,\n ` */`,\n ` readonly ${JSON.stringify(`${entry.pathParts.join(\"/\")}/${entry.exportName}`)}: typeof ${renderFunctionImportName(entry)};`\n );\n }\n\n lines.push(`}`);\n return [lines.join(\"\\n\")];\n}\n\nfunction renderGeneratedManifestImportLines(\n hasComponentsManifest: boolean,\n extension: \"\" | \".js\"\n): string[] {\n if (!hasComponentsManifest) {\n return [];\n }\n return [\n `import componentsManifest from \"../components${extension}\";`\n ];\n}\n\nfunction renderGeneratedManifestDeclarationLines(\n hasComponentsManifest: boolean\n): string[] {\n return hasComponentsManifest ? [] : [`const componentsManifest = {} as const;`];\n}\n\nfunction renderApiInterfaceName(node: ApiModuleNode): string {\n if (node.pathParts.length === 0) {\n return \"SyncoreApi\";\n }\n return `SyncoreApi__${node.pathParts.map(toTypeNamePart).join(\"__\")}`;\n}\n\nfunction renderApiInterfaceDescription(node: ApiModuleNode): string {\n if (node.pathParts.length === 0) {\n return \"Type-safe references to every public Syncore function in this app.\";\n }\n\n if (node.children.size === 0) {\n return `Type-safe references to functions exported from \\`syncore/functions/${node.pathParts.join(\"/\")}.ts\\`.`;\n }\n\n return `Type-safe references to functions grouped under \\`syncore/functions/${node.pathParts.join(\"/\")}/*\\`.`;\n}\n\nfunction renderApiModulePropertyDescription(node: ApiModuleNode): string {\n if (node.children.size === 0) {\n return `Functions exported from \\`syncore/functions/${node.pathParts.join(\"/\")}.ts\\`.`;\n }\n return `Functions grouped under \\`syncore/functions/${node.pathParts.join(\"/\")}/*\\`.`;\n}\n\nfunction renderApiFunctionPropertyDescription(entry: {\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n}): string {\n return `Reference to the public Syncore ${entry.kind} \\`${entry.pathParts.join(\"/\")}/${entry.exportName}\\`.`;\n}\n\nfunction renderPropertyKey(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/u.test(key) ? key : JSON.stringify(key);\n}\n\nfunction toTypeNamePart(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9_$]/g, \"_\");\n return /^[0-9]/u.test(sanitized) ? `_${sanitized}` : sanitized;\n}\n\nfunction renderFunctionImports(\n functionEntries: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>,\n extension: \"\" | \".js\"\n): string[] {\n return functionEntries\n .slice()\n .sort((left, right) =>\n `${left.pathParts.join(\"/\")}/${left.exportName}`.localeCompare(\n `${right.pathParts.join(\"/\")}/${right.exportName}`\n )\n )\n .map((entry) => {\n const relativePath = `../functions/${entry.pathParts.join(\"/\")}${extension}`;\n return `import { ${entry.exportName} as ${renderFunctionImportName(entry)} } from ${JSON.stringify(relativePath)};`;\n });\n}\n\nfunction renderFunctionTypeImports(\n functionEntries: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>,\n extension: \"\" | \".js\"\n): string[] {\n return renderFunctionImports(functionEntries, extension).map((line) =>\n line.replace(/^import \\{/, \"import type {\")\n );\n}\n\nfunction renderFunctionImportName(entry: {\n pathParts: string[];\n exportName: string;\n}): string {\n return [\n ...entry.pathParts.map((segment) =>\n segment.replace(/[^a-zA-Z0-9_$]/g, \"_\")\n ),\n entry.exportName\n ].join(\"__\");\n}\n\nexport function resolveProjectTargetConfig(\n config: SyncoreConfig\n): SyncoreProjectTargetConfig | null {\n if (\n config.projectTarget &&\n typeof config.projectTarget === \"object\" &&\n typeof config.projectTarget.databasePath === \"string\" &&\n typeof config.projectTarget.storageDirectory === \"string\"\n ) {\n return config.projectTarget;\n }\n\n if (\n typeof config.databasePath === \"string\" &&\n typeof config.storageDirectory === \"string\"\n ) {\n return {\n databasePath: config.databasePath,\n storageDirectory: config.storageDirectory\n };\n }\n\n return null;\n}\n\nexport async function loadProjectConfig(cwd: string): Promise<SyncoreConfig> {\n const filePath = path.join(cwd, \"syncore.config.ts\");\n const config = await loadDefaultExport<SyncoreConfig>(filePath);\n if (!config || typeof config !== \"object\") {\n throw new Error(\n \"syncore.config.ts must default export a Syncore config object.\"\n );\n }\n const projectTarget = resolveProjectTargetConfig(config);\n return projectTarget ? { ...config, projectTarget } : config;\n}\n\nfunction requireProjectTargetConfig(\n config: SyncoreConfig\n): SyncoreProjectTargetConfig {\n const projectTarget = resolveProjectTargetConfig(config);\n if (!projectTarget) {\n throw new Error(\n \"This Syncore project does not define a projectTarget. Use a connected client target instead.\"\n );\n }\n return projectTarget;\n}\n\nexport async function loadProjectRootSchema(\n cwd: string\n): Promise<SyncoreSchema<Record<string, AnyTableDefinition>>> {\n const filePath = path.join(cwd, \"syncore\", \"schema.ts\");\n const schema =\n await loadDefaultExport<SyncoreSchema<Record<string, AnyTableDefinition>>>(\n filePath\n );\n if (\n !schema ||\n typeof schema !== \"object\" ||\n typeof schema.tableNames !== \"function\"\n ) {\n throw new Error(\"syncore/schema.ts must default export defineSchema(...).\");\n }\n return schema;\n}\n\nexport async function loadProjectComponentsManifest(\n cwd: string\n): Promise<Record<string, unknown>> {\n const filePath = path.join(cwd, \"syncore\", \"components.ts\");\n if (!(await fileExists(filePath))) {\n return {};\n }\n\n const manifest = await loadDefaultExport<Record<string, unknown>>(filePath);\n if (!manifest || typeof manifest !== \"object\" || Array.isArray(manifest)) {\n throw new Error(\n \"syncore/components.ts must default export defineComponents({...}).\"\n );\n }\n return manifest;\n}\n\nexport async function loadProjectSchema(\n cwd: string\n): Promise<SyncoreSchema<Record<string, AnyTableDefinition>>> {\n const filePath = path.join(cwd, \"syncore\", \"_generated\", \"schema.ts\");\n if (!(await fileExists(filePath))) {\n await runCodegen(cwd);\n }\n const schema =\n await loadDefaultExport<SyncoreSchema<Record<string, AnyTableDefinition>>>(\n filePath\n );\n if (\n !schema ||\n typeof schema !== \"object\" ||\n typeof schema.tableNames !== \"function\"\n ) {\n throw new Error(\n \"syncore/_generated/schema.ts must default export a composed Syncore schema.\"\n );\n }\n return schema;\n}\n\nasync function loadDefaultExport<TValue>(filePath: string): Promise<TValue> {\n if (!(await fileExists(filePath))) {\n throw new Error(`Missing file: ${path.relative(process.cwd(), filePath)}`);\n }\n const loaded = (await loadTypeScriptModule(filePath)) as { default?: TValue };\n if (!(\"default\" in loaded)) {\n throw new Error(\n `File ${path.relative(process.cwd(), filePath)} must have a default export.`\n );\n }\n const resolvedDefault = unwrapDefaultExport(loaded.default);\n if (resolvedDefault === undefined) {\n throw new Error(\n `File ${path.relative(process.cwd(), filePath)} exported undefined.`\n );\n }\n return resolvedDefault;\n}\n\nasync function loadNamedExport<TValue>(\n filePath: string,\n exportName: string\n): Promise<TValue> {\n if (!(await fileExists(filePath))) {\n throw new Error(`Missing file: ${path.relative(process.cwd(), filePath)}`);\n }\n const loaded = (await loadTypeScriptModule(filePath)) as Record<\n string,\n TValue | undefined\n >;\n const defaultExport =\n loaded.default &&\n typeof loaded.default === \"object\" &&\n exportName in (loaded.default as Record<string, unknown>)\n ? (loaded.default as Record<string, TValue | undefined>)[exportName]\n : undefined;\n if (!(exportName in loaded) && defaultExport === undefined) {\n throw new Error(\n `File ${path.relative(process.cwd(), filePath)} must export ${exportName}.`\n );\n }\n const resolvedValue = unwrapDefaultExport(loaded[exportName] ?? defaultExport);\n if (resolvedValue === undefined) {\n throw new Error(\n `File ${path.relative(process.cwd(), filePath)} exported undefined for ${exportName}.`\n );\n }\n return resolvedValue;\n}\n\nasync function hasNonEmptyComponentsManifest(filePath: string): Promise<boolean> {\n if (!(await fileExists(filePath))) {\n return false;\n }\n const source = await readFile(filePath, \"utf8\");\n return !/defineComponents\\s*\\(\\s*\\{\\s*\\}\\s*\\)/.test(source);\n}\n\nasync function loadTypeScriptModule(\n filePath: string\n): Promise<Record<string, unknown>> {\n const fileStat = await stat(filePath);\n const cached = loadedTypeScriptModules.get(filePath);\n if (cached && cached.mtimeMs === fileStat.mtimeMs) {\n return await cached.loaded;\n }\n\n const moduleUrl = pathToFileURL(filePath).href;\n const loaded = tsImport(moduleUrl, {\n parentURL: import.meta.url\n }) as Promise<Record<string, unknown>>;\n loadedTypeScriptModules.set(filePath, {\n mtimeMs: fileStat.mtimeMs,\n loaded\n });\n return await loaded;\n}\n\nexport async function loadProjectFunctions(\n cwd: string\n): Promise<SyncoreFunctionRegistry> {\n const filePath = path.join(cwd, \"syncore\", \"_generated\", \"functions.ts\");\n if (!(await fileExists(filePath))) {\n await runCodegen(cwd);\n }\n const functions = await loadNamedExport<SyncoreFunctionRegistry>(\n filePath,\n \"functions\"\n );\n if (!functions || typeof functions !== \"object\") {\n throw new Error(\n \"syncore/_generated/functions.ts must export a functions registry.\"\n );\n }\n return functions;\n}\n\nexport async function loadProjectResolvedComponents(\n cwd: string\n): Promise<SyncoreResolvedComponents> {\n const componentsManifestPath = path.join(cwd, \"syncore\", \"components.ts\");\n if (await fileExists(componentsManifestPath)) {\n const source = await readFile(componentsManifestPath, \"utf8\");\n if (/defineComponents\\s*\\(\\s*\\{\\s*\\}\\s*\\)/.test(source)) {\n return [];\n }\n }\n\n const filePath = path.join(cwd, \"syncore\", \"_generated\", \"components.ts\");\n if (!(await fileExists(filePath))) {\n await runCodegen(cwd);\n }\n const components = await loadNamedExport<SyncoreResolvedComponents>(\n filePath,\n \"resolvedComponents\"\n );\n if (!Array.isArray(components)) {\n throw new Error(\n \"syncore/_generated/components.ts must export resolvedComponents.\"\n );\n }\n return components;\n}\n\nexport async function loadProjectRuntime(cwd: string): Promise<{\n schema: SyncoreSchema<Record<string, AnyTableDefinition>>;\n functions: SyncoreFunctionRegistry;\n components: SyncoreResolvedComponents;\n}> {\n const filePath = path.join(cwd, \"syncore\", \"_generated\", \"runtime.ts\");\n if (!(await fileExists(filePath))) {\n await runCodegen(cwd);\n }\n const loaded = await loadTypeScriptModule(filePath);\n const schema = unwrapDefaultExport(loaded.schema) as\n | SyncoreSchema<Record<string, AnyTableDefinition>>\n | undefined;\n const functions = unwrapDefaultExport(loaded.functions) as\n | SyncoreFunctionRegistry\n | undefined;\n const components = unwrapDefaultExport(loaded.components) as\n | SyncoreResolvedComponents\n | undefined;\n\n if (\n !schema ||\n typeof schema !== \"object\" ||\n typeof schema.tableNames !== \"function\"\n ) {\n throw new Error(\n \"syncore/_generated/runtime.ts must export a composed Syncore schema.\"\n );\n }\n if (!functions || typeof functions !== \"object\") {\n throw new Error(\n \"syncore/_generated/runtime.ts must export a functions registry.\"\n );\n }\n if (!Array.isArray(components)) {\n throw new Error(\n \"syncore/_generated/runtime.ts must export resolved components.\"\n );\n }\n return { schema, functions, components };\n}\n\ninterface ProjectTargetBackend {\n hello: Extract<SyncoreDevtoolsMessage, { type: \"hello\" }>;\n handleCommand(\n payload: SyncoreDevtoolsCommandPayload\n ): Promise<SyncoreDevtoolsCommandResultPayload>;\n subscribe(\n subscriptionId: string,\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: (\n payload: SyncoreDevtoolsSubscriptionResultPayload\n ) => void\n ): Promise<void>;\n unsubscribe(subscriptionId: string): void;\n dispose(): Promise<void>;\n}\n\nclass HubExternalChangeSignal implements SyncoreExternalChangeSignal {\n private readonly listeners = new Set<\n (event: SyncoreExternalChangeEvent) => void\n >();\n\n constructor(\n private readonly publishToHub: (\n event: SyncoreExternalChangeEvent\n ) => void | Promise<void>\n ) {}\n\n subscribe(listener: (event: SyncoreExternalChangeEvent) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n publish(event: SyncoreExternalChangeEvent): void | Promise<void> {\n return this.publishToHub(event);\n }\n\n receive(event: SyncoreExternalChangeEvent): void {\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n\n close(): void {\n this.listeners.clear();\n }\n}\n\nclass HubSqliteDriver implements SyncoreSqlDriver {\n private readonly database: DatabaseSync;\n private transactionDepth = 0;\n\n constructor(readonly databasePath: string) {\n this.database = new DatabaseSync(databasePath);\n this.database.exec(\"PRAGMA foreign_keys = ON;\");\n this.database.exec(\"PRAGMA journal_mode = WAL;\");\n }\n\n async exec(sql: string): Promise<void> {\n this.database.exec(sql);\n }\n\n async run(\n sql: string,\n params: unknown[] = []\n ): Promise<{ changes: number; lastInsertRowid?: number | string }> {\n const result = this.database.prepare(sql).run(...toSqlParameters(params));\n return {\n changes: Number(result.changes ?? 0),\n lastInsertRowid:\n typeof result.lastInsertRowid === \"bigint\"\n ? Number(result.lastInsertRowid)\n : result.lastInsertRowid\n };\n }\n\n async get<T>(sql: string, params: unknown[] = []): Promise<T | undefined> {\n return this.database.prepare(sql).get(...toSqlParameters(params)) as\n | T\n | undefined;\n }\n\n async all<T>(sql: string, params: unknown[] = []): Promise<T[]> {\n return this.database.prepare(sql).all(...toSqlParameters(params)) as T[];\n }\n\n async withTransaction<T>(callback: () => Promise<T>): Promise<T> {\n if (this.transactionDepth > 0) {\n return this.withSavepoint(`nested_${this.transactionDepth}`, callback);\n }\n this.transactionDepth += 1;\n this.database.exec(\"BEGIN\");\n try {\n const result = await callback();\n this.database.exec(\"COMMIT\");\n return result;\n } catch (error) {\n this.database.exec(\"ROLLBACK\");\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n async withSavepoint<T>(name: string, callback: () => Promise<T>): Promise<T> {\n const safeName = name.replaceAll(/[^a-zA-Z0-9_]/g, \"_\");\n this.database.exec(`SAVEPOINT ${safeName}`);\n try {\n const result = await callback();\n this.database.exec(`RELEASE SAVEPOINT ${safeName}`);\n return result;\n } catch (error) {\n this.database.exec(`ROLLBACK TO SAVEPOINT ${safeName}`);\n this.database.exec(`RELEASE SAVEPOINT ${safeName}`);\n throw error;\n }\n }\n\n async close(): Promise<void> {\n this.database.close();\n }\n}\n\nclass HubFileStorageAdapter implements SyncoreStorageAdapter {\n constructor(private readonly directory: string) {}\n\n private filePath(id: string): string {\n return path.join(this.directory, id);\n }\n\n async put(id: string, input: StorageWriteInput): Promise<StorageObject> {\n await mkdir(this.directory, { recursive: true });\n const filePath = this.filePath(id);\n const bytes = normalizeStorageInput(input.data);\n await writeFile(filePath, bytes);\n return {\n id,\n path: filePath,\n size: bytes.byteLength,\n contentType: input.contentType ?? null\n };\n }\n\n async get(id: string): Promise<StorageObject | null> {\n const filePath = this.filePath(id);\n try {\n const info = await stat(filePath);\n return {\n id,\n path: filePath,\n size: info.size,\n contentType: null\n };\n } catch {\n return null;\n }\n }\n\n async read(id: string): Promise<Uint8Array | null> {\n try {\n return await readFile(this.filePath(id));\n } catch {\n return null;\n }\n }\n\n async delete(id: string): Promise<void> {\n await rm(this.filePath(id), { force: true });\n }\n\n async list(): Promise<StorageObject[]> {\n try {\n const entries = await readdir(this.directory, { withFileTypes: true });\n return Promise.all(\n entries\n .filter((entry) => entry.isFile())\n .map(async (entry) => {\n const filePath = this.filePath(entry.name);\n const info = await stat(filePath);\n return {\n id: entry.name,\n path: filePath,\n size: info.size,\n contentType: null\n } satisfies StorageObject;\n })\n );\n } catch {\n return [];\n }\n }\n}\n\nconst hubDevtoolsSqlSupport: DevtoolsSqlSupport = {\n analyzeSqlStatement(query: string): DevtoolsSqlAnalysis {\n const normalized = query.trim().replace(/^\\(+/, \"\").toUpperCase();\n const firstKeyword = normalized.split(/\\s+/, 1)[0] ?? \"\";\n if (\n firstKeyword === \"SELECT\" ||\n firstKeyword === \"WITH\" ||\n firstKeyword === \"PRAGMA\" ||\n firstKeyword === \"EXPLAIN\"\n ) {\n return {\n mode: \"read\",\n readTables: [],\n writeTables: [],\n schemaChanged: false,\n observedScopes: [\"all\"]\n };\n }\n if (\n firstKeyword === \"INSERT\" ||\n firstKeyword === \"UPDATE\" ||\n firstKeyword === \"DELETE\" ||\n firstKeyword === \"REPLACE\"\n ) {\n return {\n mode: \"write\",\n readTables: [],\n writeTables: [],\n schemaChanged: false,\n observedScopes: [\"all\"]\n };\n }\n if (\n firstKeyword === \"CREATE\" ||\n firstKeyword === \"DROP\" ||\n firstKeyword === \"ALTER\"\n ) {\n return {\n mode: \"ddl\",\n readTables: [],\n writeTables: [],\n schemaChanged: true,\n observedScopes: [\"all\", \"schema.tables\"]\n };\n }\n throw new Error(`Unsupported SQL statement type: ${firstKeyword || \"unknown\"}`);\n },\n ensureSqlMode(analysis, expected): void {\n if (expected === \"watch\") {\n if (analysis.mode !== \"read\") {\n throw new Error(\"Live mode supports read-only SQL only.\");\n }\n return;\n }\n if (analysis.mode !== expected) {\n if (expected === \"read\") {\n throw new Error(\"Use SQL Write for mutating statements.\");\n }\n throw new Error(\"Use SQL Read or SQL Live for read-only statements.\");\n }\n },\n runReadonlyQuery(databasePath: string, query: string): DevtoolsSqlReadResult {\n const analysis = this.analyzeSqlStatement(query);\n this.ensureSqlMode(analysis, \"read\");\n const database = new DatabaseSync(databasePath, { readOnly: true });\n try {\n const statement = database.prepare(query);\n const rows = statement.all() as Array<Record<string, unknown>>;\n const columns = statement.columns().map((column) => column.name);\n return {\n columns,\n rows: rows.map((row) => columns.map((column) => row[column])),\n observedTables: []\n };\n } finally {\n database.close();\n }\n }\n};\n\nasync function createProjectTargetBackend(\n cwd: string,\n externalChangeSignal?: SyncoreExternalChangeSignal\n): Promise<ProjectTargetBackend | null> {\n const config = await loadProjectConfig(cwd);\n const projectTarget = resolveProjectTargetConfig(config);\n if (!projectTarget) {\n return null;\n }\n\n const { schema, functions, components } = await loadProjectRuntime(cwd);\n const databasePath = path.resolve(cwd, projectTarget.databasePath);\n const storageDirectory = path.resolve(cwd, projectTarget.storageDirectory);\n await mkdir(path.dirname(databasePath), { recursive: true });\n await mkdir(storageDirectory, { recursive: true });\n\n const driver = new HubSqliteDriver(databasePath);\n const runtime = new SyncoreRuntime({\n schema,\n functions,\n components,\n driver,\n storage: new HubFileStorageAdapter(storageDirectory),\n platform: \"project\",\n ...(externalChangeSignal ? { externalChangeSignal } : {})\n });\n await runtime.start();\n\n const commandHandler = createDevtoolsCommandHandler({\n driver,\n schema,\n functions,\n admin: runtime.getAdmin(),\n sql: hubDevtoolsSqlSupport\n });\n const subscriptionHost = createDevtoolsSubscriptionHost({\n driver,\n schema,\n functions,\n admin: runtime.getAdmin(),\n sql: hubDevtoolsSqlSupport\n });\n\n return {\n hello: {\n type: \"hello\",\n protocolVersion: SYNCORE_DEVTOOLS_PROTOCOL_VERSION,\n minSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION,\n maxSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION,\n runtimeId: PROJECT_TARGET_RUNTIME_ID,\n platform: \"project\",\n sessionLabel: \"Project Target\",\n targetKind: \"project\",\n runtimeRole: \"project-target\",\n storageProtocol: \"file\",\n databaseLabel: path.basename(databasePath),\n storageIdentity: `file::${databasePath}`,\n capabilities: createProjectDevtoolsCapabilities()\n },\n handleCommand: commandHandler,\n subscribe(subscriptionId, payload, listener) {\n return subscriptionHost.subscribe(subscriptionId, payload, listener);\n },\n unsubscribe(subscriptionId) {\n subscriptionHost.unsubscribe(subscriptionId);\n },\n async dispose() {\n subscriptionHost.dispose();\n await runtime.stop();\n }\n };\n}\n\nfunction createProjectDevtoolsCapabilities(): SyncoreDevtoolsCapabilities {\n return {\n sql: {\n read: true,\n write: true,\n live: true\n },\n data: {\n browse: true,\n mutate: true,\n importExport: true\n },\n scheduler: {\n read: true,\n edit: true\n }\n };\n}\n\nfunction normalizeStorageInput(input: StorageWriteInput[\"data\"]): Uint8Array {\n if (typeof input === \"string\") {\n return Buffer.from(input);\n }\n if (input instanceof Uint8Array) {\n return input;\n }\n return new Uint8Array(input);\n}\n\nfunction toSqlParameters(params: unknown[]): SQLInputValue[] {\n return params.map((value) => {\n if (value instanceof Uint8Array) {\n return Buffer.from(value);\n }\n return value as SQLInputValue;\n });\n}\n\nexport async function readStoredSnapshot(\n cwd: string\n): Promise<SchemaSnapshot | null> {\n const snapshotPath = path.join(\n cwd,\n \"syncore\",\n \"migrations\",\n SYNCORE_MIGRATION_SNAPSHOT_FILE_NAME\n );\n if (!(await fileExists(snapshotPath))) {\n return null;\n }\n return parseSchemaSnapshot(await readFile(snapshotPath, \"utf8\"));\n}\n\nexport async function writeStoredSnapshot(\n cwd: string,\n snapshot: SchemaSnapshot\n): Promise<void> {\n const migrationsDirectory = path.join(cwd, \"syncore\", \"migrations\");\n await mkdir(migrationsDirectory, { recursive: true });\n await writeFile(\n path.join(migrationsDirectory, SYNCORE_MIGRATION_SNAPSHOT_FILE_NAME),\n `${JSON.stringify(snapshot, null, 2)}\\n`\n );\n}\n\nexport async function getNextMigrationNumber(\n directory: string\n): Promise<number> {\n if (!(await fileExists(directory))) {\n return 1;\n }\n const migrationNumbers = (await readdir(directory))\n .map((name) => name.match(/^(\\d+)_.*\\.sql$/)?.[1])\n .filter((value): value is string => value !== undefined)\n .map((value) => Number.parseInt(value, 10));\n\n if (migrationNumbers.length === 0) {\n return 1;\n }\n return Math.max(...migrationNumbers) + 1;\n}\n\nexport async function applyProjectMigrations(\n cwd: string\n): Promise<number> {\n const config = await loadProjectConfig(cwd);\n const projectTarget = requireProjectTargetConfig(config);\n const databasePath = path.resolve(cwd, projectTarget.databasePath);\n const storageDirectory = path.resolve(cwd, projectTarget.storageDirectory);\n await mkdir(path.dirname(databasePath), { recursive: true });\n await mkdir(storageDirectory, { recursive: true });\n\n const database = new DatabaseSync(databasePath);\n ensureCliMigrationTrackingTable(database);\n\n const migrationsDirectory = path.join(cwd, \"syncore\", \"migrations\");\n if (!(await fileExists(migrationsDirectory))) {\n database.close();\n return 0;\n }\n\n const appliedRows = database\n .prepare(`SELECT id FROM \"_syncore_migrations\" ORDER BY id ASC`)\n .all() as Array<{ id: string }>;\n const appliedNames = new Set(appliedRows.map((row) => row.id));\n const migrationFiles = (await readdir(migrationsDirectory))\n .filter((name) => /\\.sql$/i.test(name))\n .sort((left, right) => left.localeCompare(right));\n\n let appliedCount = 0;\n\n for (const fileName of migrationFiles) {\n if (appliedNames.has(fileName)) {\n continue;\n }\n\n const sql = await readFile(\n path.join(migrationsDirectory, fileName),\n \"utf8\"\n );\n database.exec(\"BEGIN\");\n try {\n applyMigrationSql(database, sql, fileName);\n database\n .prepare(\n `INSERT OR REPLACE INTO \"_syncore_migrations\" (id, applied_at, sql) VALUES (?, ?, ?)`\n )\n .run(fileName, Date.now(), sql);\n database.exec(\"COMMIT\");\n appliedCount += 1;\n } catch (error) {\n database.exec(\"ROLLBACK\");\n database.close();\n throw error;\n }\n }\n\n database.close();\n return appliedCount;\n}\n\nfunction ensureCliMigrationTrackingTable(database: DatabaseSync): void {\n const tableExists = (\n database\n .prepare(\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name = '_syncore_migrations'`\n )\n .get() as { name?: string } | undefined\n )?.name === \"_syncore_migrations\";\n\n if (!tableExists) {\n database.exec(`\n CREATE TABLE \"_syncore_migrations\" (\n id TEXT PRIMARY KEY,\n applied_at INTEGER NOT NULL,\n sql TEXT NOT NULL\n );\n `);\n return;\n }\n\n const columns = database\n .prepare(`PRAGMA table_info(\"_syncore_migrations\")`)\n .all() as Array<{ name: string }>;\n const columnNames = new Set(columns.map((column) => column.name));\n\n if (\n columnNames.has(\"id\") &&\n columnNames.has(\"applied_at\") &&\n columnNames.has(\"sql\")\n ) {\n return;\n }\n\n database.exec(`\n ALTER TABLE \"_syncore_migrations\" RENAME TO \"_syncore_migrations_legacy\";\n CREATE TABLE \"_syncore_migrations\" (\n id TEXT PRIMARY KEY,\n applied_at INTEGER NOT NULL,\n sql TEXT NOT NULL\n );\n `);\n\n if (columnNames.has(\"name\")) {\n database.exec(`\n INSERT INTO \"_syncore_migrations\" (id, applied_at, sql)\n SELECT\n name,\n CASE\n WHEN typeof(applied_at) = 'integer' THEN applied_at\n ELSE CAST(strftime('%s', applied_at) AS INTEGER) * 1000\n END,\n ''\n FROM \"_syncore_migrations_legacy\";\n `);\n }\n\n database.exec(`DROP TABLE \"_syncore_migrations_legacy\";`);\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function resolveFunctionImportExtension(\n cwd: string\n): Promise<\"\" | \".js\"> {\n const tsconfigFiles = (await readdir(cwd, { withFileTypes: true }))\n .filter((entry) => entry.isFile() && /^tsconfig(\\..+)?\\.json$/u.test(entry.name))\n .map((entry) => path.join(cwd, entry.name))\n .sort();\n\n for (const configPath of tsconfigFiles) {\n try {\n const source = await readFile(configPath, \"utf8\");\n const parsed = JSON.parse(source) as {\n compilerOptions?: {\n module?: string;\n moduleResolution?: string;\n };\n };\n const moduleResolution = parsed.compilerOptions?.moduleResolution?.toLowerCase();\n const moduleKind = parsed.compilerOptions?.module?.toLowerCase();\n if (\n moduleResolution === \"nodenext\" ||\n moduleResolution === \"node16\" ||\n moduleKind === \"nodenext\" ||\n moduleKind === \"node16\"\n ) {\n return \".js\";\n }\n } catch {\n // Ignore unreadable tsconfig variants and fall back to extensionless imports.\n }\n }\n\n // Bundler-based app toolchains such as Next and Vite resolve extensionless\n // TypeScript source imports reliably, while NodeNext projects need explicit\n // JavaScript specifiers for emitted ESM.\n return \"\";\n}\n\nexport function formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nexport async function isLocalPortInUse(port: number): Promise<boolean> {\n return await new Promise((resolve) => {\n let settled = false;\n const socket = connectToNet({ host: \"127.0.0.1\", port });\n const finish = (inUse: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n socket.destroy();\n resolve(inUse);\n };\n const timeout = setTimeout(() => finish(false), 100);\n socket.once(\"connect\", () => {\n finish(true);\n });\n socket.once(\"error\", () => {\n finish(false);\n });\n });\n}\n\nexport function slugify(value: string): string {\n const slug = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return slug || \"auto\";\n}\n\nfunction applyMigrationSql(\n database: DatabaseSync,\n sql: string,\n fileName: string\n): void {\n const statements = sql\n .split(/;\\s*(?:\\r?\\n|$)/)\n .map((statement) => statement.trim())\n .filter(Boolean);\n\n for (const statement of statements) {\n try {\n database.exec(statement);\n } catch (error) {\n if (isUnsupportedFts5Statement(statement, error)) {\n console.warn(\n `Skipping FTS5 statement in ${fileName} because this SQLite build does not include FTS5 support.`\n );\n continue;\n }\n throw error;\n }\n }\n}\n\nexport async function startDevHub(options: {\n cwd: string;\n template: SyncoreTemplateName;\n}): Promise<DevHubSessionState> {\n const dashboardPort = resolvePortFromEnv(\"SYNCORE_DASHBOARD_PORT\", 4310);\n const devtoolsPort = resolvePortFromEnv(\"SYNCORE_DEVTOOLS_PORT\", 4311);\n const dashboardUrl = `http://localhost:${dashboardPort}`;\n const devtoolsUrl = `ws://127.0.0.1:${devtoolsPort}`;\n const logsDirectory = path.join(options.cwd, \".syncore\", \"logs\");\n const logFilePath = path.join(logsDirectory, \"runtime.jsonl\");\n const hubAccessToken =\n sanitizeDevtoolsToken(process.env.SYNCORE_DEVTOOLS_TOKEN) ??\n generateDevtoolsToken();\n const sessionState: DevHubSessionState = {\n dashboardUrl,\n authenticatedDashboardUrl: `${dashboardUrl}/?token=${hubAccessToken}`,\n devtoolsUrl,\n token: hubAccessToken\n };\n await mkdir(logsDirectory, { recursive: true });\n await writeFile(logFilePath, \"\");\n await runDevProjectBootstrap(options.cwd, options.template);\n await setupDevProjectWatch(options.cwd, options.template);\n\n if (await isLocalPortInUse(devtoolsPort)) {\n console.log(\n `Syncore devtools hub already running at ws://localhost:${devtoolsPort}. Reusing existing hub/dashboard.`\n );\n return (await readDevtoolsSessionState(options.cwd)) ?? sessionState;\n }\n await writeDevtoolsSessionState(options.cwd, sessionState);\n\n const httpServer = createServer((_request, response) => {\n response.writeHead(200, { \"content-type\": \"application/json\" });\n response.end(JSON.stringify({ ok: true, wsPort: devtoolsPort }));\n });\n const websocketServer = new WebSocketServer({ server: httpServer });\n const runtimeSockets = new Map<string, WebSocket>();\n const runtimeHellos = new Map<\n string,\n Extract<SyncoreDevtoolsMessage, { type: \"hello\" }>\n >();\n const runtimeEvents = new Map<\n string,\n Array<Extract<SyncoreDevtoolsMessage, { type: \"event\" }>[\"event\"]>\n >();\n const socketRuntimeIds = new Map<WebSocket, Set<string>>();\n const dashboardSockets = new Set<WebSocket>();\n const dashboardSubscriptions = new Map<\n WebSocket,\n Map<string, { runtimeId: string; payload: SyncoreDevtoolsSubscribe }>\n >();\n let relayExternalChange: (\n sourceRuntimeId: string,\n storageIdentity: string,\n event: SyncoreExternalChangeEvent\n ) => void = () => {};\n const projectTargetExternalChangeSignal = new HubExternalChangeSignal(\n (event) =>\n relayExternalChange(\n PROJECT_TARGET_RUNTIME_ID,\n runtimeHellos.get(PROJECT_TARGET_RUNTIME_ID)?.storageIdentity ?? \"\",\n event\n )\n );\n let projectTargetBackend: ProjectTargetBackend | null = null;\n try {\n projectTargetBackend = await createProjectTargetBackend(\n options.cwd,\n projectTargetExternalChangeSignal\n );\n } catch (error) {\n console.warn(\n `Project target fallback unavailable: ${formatError(error)}`\n );\n }\n const hello: SyncoreDevtoolsMessage = {\n type: \"hello\",\n protocolVersion: SYNCORE_DEVTOOLS_PROTOCOL_VERSION,\n minSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION,\n maxSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION,\n runtimeId: \"syncore-dev-hub\",\n platform: \"dev\"\n };\n if (projectTargetBackend) {\n runtimeHellos.set(PROJECT_TARGET_RUNTIME_ID, projectTargetBackend.hello);\n runtimeEvents.set(PROJECT_TARGET_RUNTIME_ID, []);\n }\n relayExternalChange = (sourceRuntimeId, storageIdentity, event) => {\n if (!storageIdentity) {\n return;\n }\n const message = {\n type: \"external.change\",\n runtimeId: sourceRuntimeId,\n storageIdentity,\n event\n } satisfies SyncoreDevtoolsMessage;\n\n for (const [runtimeId, runtimeHello] of runtimeHellos) {\n if (\n runtimeId === sourceRuntimeId ||\n runtimeHello.storageIdentity !== storageIdentity\n ) {\n continue;\n }\n if (runtimeId === PROJECT_TARGET_RUNTIME_ID) {\n projectTargetExternalChangeSignal.receive(event);\n continue;\n }\n const targetSocket = runtimeSockets.get(runtimeId);\n if (targetSocket?.readyState === WebSocket.OPEN) {\n targetSocket.send(JSON.stringify(message));\n }\n }\n };\n const appendHubLog = async (\n event: Extract<SyncoreDevtoolsMessage, { type: \"event\" }>[\"event\"]\n ) => {\n const runtimeHello = runtimeHellos.get(event.runtimeId);\n const clientRuntimeIds = [...runtimeHellos.values()]\n .filter(\n (hello) =>\n hello.runtimeId !== \"syncore-dev-hub\"\n )\n .map((hello) => hello.runtimeId)\n .sort();\n const clientTargetKeys = [...runtimeHellos.values()]\n .filter(\n (hello) =>\n hello.runtimeId !== \"syncore-dev-hub\"\n )\n .map((hello) => hello.storageIdentity ?? `runtime::${hello.runtimeId}`)\n .sort();\n const targetIdentity =\n runtimeHello?.storageIdentity ?? `runtime::${event.runtimeId}`;\n const targetId =\n event.runtimeId === \"syncore-dev-hub\"\n ? \"all\"\n : createPublicTargetId(targetIdentity, clientTargetKeys);\n const publicRuntimeId =\n event.runtimeId === \"syncore-dev-hub\"\n ? undefined\n : createPublicRuntimeId(event.runtimeId, clientRuntimeIds);\n const category =\n event.type === \"query.executed\"\n ? \"query\"\n : event.type === \"mutation.committed\"\n ? \"mutation\"\n : event.type === \"action.completed\"\n ? \"action\"\n : \"system\";\n const message =\n event.type === \"log\"\n ? event.message\n : event.type === \"query.executed\" ||\n event.type === \"mutation.committed\" ||\n event.type === \"action.completed\"\n ? event.functionName\n : event.type;\n await appendFile(\n logFilePath,\n `${JSON.stringify({\n version: 2,\n timestamp: event.timestamp,\n runtimeId: event.runtimeId,\n targetId,\n ...(publicRuntimeId ? { publicRuntimeId } : {}),\n ...(runtimeHello?.platform ? { platform: runtimeHello.platform } : {}),\n eventType: event.type,\n category,\n message,\n event\n })}\\n`\n );\n };\n\n websocketServer.on(\"connection\", (socket: WebSocket, request) => {\n const isBrowserDashboardClient = isAllowedDashboardOrigin(\n request.headers.origin,\n dashboardPort\n );\n const isAuthorizedDashboardClient =\n !isBrowserDashboardClient ||\n isAuthorizedDashboardRequest({\n requestUrl: request.url,\n originHeader: request.headers.origin,\n dashboardPort,\n expectedToken: hubAccessToken\n });\n if (isBrowserDashboardClient && !isAuthorizedDashboardClient) {\n socket.close(1008, \"Unauthorized devtools client\");\n return;\n }\n dashboardSockets.add(socket);\n socket.send(JSON.stringify(hello));\n for (const runtimeHello of runtimeHellos.values()) {\n socket.send(JSON.stringify(runtimeHello));\n }\n for (const [runtimeId, history] of runtimeEvents) {\n if (!runtimeHellos.has(runtimeId)) {\n continue;\n }\n if (history.length === 0) {\n continue;\n }\n socket.send(\n JSON.stringify({\n type: \"event.batch\",\n runtimeId,\n events: [...history]\n })\n );\n }\n\n socket.on(\"message\", (payload) => {\n const rawPayload = decodeWebSocketPayload(payload);\n if (rawPayload.length === 0) {\n return;\n }\n const message = JSON.parse(rawPayload) as\n | SyncoreDevtoolsMessage\n | (SyncoreDevtoolsClientMessage & { targetRuntimeId?: string });\n if (message.type === \"ping\") {\n if (!isAuthorizedDashboardClient) {\n socket.close(1008, \"Unauthorized devtools client\");\n return;\n }\n socket.send(\n JSON.stringify({ type: \"pong\" } satisfies SyncoreDevtoolsMessage)\n );\n return;\n }\n if (message.type === \"external.change\") {\n const runtimeHello = runtimeHellos.get(message.runtimeId);\n const storageIdentity =\n runtimeHello?.storageIdentity ?? message.storageIdentity;\n if (storageIdentity && storageIdentity === message.storageIdentity) {\n relayExternalChange(\n message.runtimeId,\n storageIdentity,\n message.event as SyncoreExternalChangeEvent\n );\n }\n return;\n }\n if (message.type === \"command\") {\n if (!isAuthorizedDashboardClient) {\n return;\n }\n const targetRuntimeId = message.targetRuntimeId;\n if (!targetRuntimeId) {\n return;\n }\n if (\n targetRuntimeId === PROJECT_TARGET_RUNTIME_ID &&\n projectTargetBackend\n ) {\n void (async () => {\n const payload = await projectTargetBackend.handleCommand(\n message.payload\n );\n if (socket.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(\n JSON.stringify({\n type: \"command.result\",\n commandId: message.commandId,\n runtimeId: PROJECT_TARGET_RUNTIME_ID,\n payload\n } satisfies SyncoreDevtoolsMessage)\n );\n })();\n return;\n }\n const target = runtimeSockets.get(targetRuntimeId);\n if (target && target.readyState === WebSocket.OPEN) {\n target.send(JSON.stringify(message));\n }\n return;\n }\n if (message.type === \"subscribe\") {\n if (!isAuthorizedDashboardClient) {\n return;\n }\n const targetRuntimeId = message.targetRuntimeId;\n if (!targetRuntimeId) {\n return;\n }\n const subscriptions =\n dashboardSubscriptions.get(socket) ??\n new Map<string, { runtimeId: string; payload: SyncoreDevtoolsSubscribe }>();\n subscriptions.set(message.subscriptionId, {\n runtimeId: targetRuntimeId,\n payload: message\n });\n dashboardSubscriptions.set(socket, subscriptions);\n if (\n targetRuntimeId === PROJECT_TARGET_RUNTIME_ID &&\n projectTargetBackend\n ) {\n void projectTargetBackend\n .subscribe(message.subscriptionId, message.payload, (payload) => {\n if (socket.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(\n JSON.stringify({\n type: \"subscription.data\",\n subscriptionId: message.subscriptionId,\n runtimeId: PROJECT_TARGET_RUNTIME_ID,\n payload\n } satisfies SyncoreDevtoolsMessage)\n );\n })\n .catch((error) => {\n if (socket.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(\n JSON.stringify({\n type: \"subscription.error\",\n subscriptionId: message.subscriptionId,\n runtimeId: PROJECT_TARGET_RUNTIME_ID,\n error: formatError(error)\n } satisfies SyncoreDevtoolsMessage)\n );\n });\n return;\n }\n const target = runtimeSockets.get(targetRuntimeId);\n if (target && target.readyState === WebSocket.OPEN) {\n target.send(JSON.stringify(message));\n }\n return;\n }\n if (message.type === \"unsubscribe\") {\n if (!isAuthorizedDashboardClient) {\n return;\n }\n const subscriptions = dashboardSubscriptions.get(socket);\n const subscription = subscriptions?.get(message.subscriptionId);\n if (!subscription) {\n return;\n }\n if (\n subscription.runtimeId === PROJECT_TARGET_RUNTIME_ID &&\n projectTargetBackend\n ) {\n projectTargetBackend.unsubscribe(message.subscriptionId);\n subscriptions?.delete(message.subscriptionId);\n if (subscriptions && subscriptions.size === 0) {\n dashboardSubscriptions.delete(socket);\n }\n return;\n }\n const target = runtimeSockets.get(subscription.runtimeId);\n if (target && target.readyState === WebSocket.OPEN) {\n const runtimeMessage: SyncoreDevtoolsUnsubscribe = {\n type: \"unsubscribe\",\n subscriptionId: message.subscriptionId,\n targetRuntimeId: subscription.runtimeId\n };\n target.send(JSON.stringify(runtimeMessage));\n }\n subscriptions?.delete(message.subscriptionId);\n if (subscriptions && subscriptions.size === 0) {\n dashboardSubscriptions.delete(socket);\n }\n return;\n }\n if (message.type === \"hello\") {\n dashboardSockets.delete(socket);\n runtimeSockets.set(message.runtimeId, socket);\n runtimeHellos.set(message.runtimeId, message);\n runtimeEvents.set(message.runtimeId, []);\n const runtimeIds = socketRuntimeIds.get(socket) ?? new Set<string>();\n runtimeIds.add(message.runtimeId);\n socketRuntimeIds.set(socket, runtimeIds);\n for (const [dashboardSocket, subscriptions] of dashboardSubscriptions) {\n if (dashboardSocket.readyState !== WebSocket.OPEN) {\n continue;\n }\n for (const subscription of subscriptions.values()) {\n if (subscription.runtimeId !== message.runtimeId) {\n continue;\n }\n socket.send(JSON.stringify(subscription.payload));\n }\n }\n for (const client of dashboardSockets) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(JSON.stringify(message));\n }\n }\n return;\n }\n const encoded = JSON.stringify(message);\n if (\n message.type === \"event\" &&\n message.event.type === \"runtime.disconnected\"\n ) {\n runtimeHellos.delete(message.event.runtimeId);\n }\n if (message.type === \"event\" && message.event.runtimeId !== \"syncore-dev-hub\") {\n const history = runtimeEvents.get(message.event.runtimeId) ?? [];\n history.push(message.event);\n runtimeEvents.set(message.event.runtimeId, history.slice(-200));\n if (message.event.type === \"runtime.disconnected\") {\n runtimeEvents.delete(message.event.runtimeId);\n }\n void appendHubLog(message.event);\n } else if (message.type === \"event\") {\n void appendHubLog(message.event);\n }\n if (\n message.type === \"command.result\" ||\n message.type === \"subscription.data\" ||\n message.type === \"subscription.error\"\n ) {\n for (const client of dashboardSockets) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(encoded);\n }\n }\n return;\n }\n for (const client of dashboardSockets) {\n if (client === socket || client.readyState !== WebSocket.OPEN) {\n continue;\n }\n client.send(encoded);\n }\n });\n\n socket.on(\"close\", () => {\n dashboardSockets.delete(socket);\n const subscriptions = dashboardSubscriptions.get(socket);\n if (subscriptions) {\n for (const [subscriptionId, subscription] of subscriptions) {\n if (\n subscription.runtimeId === PROJECT_TARGET_RUNTIME_ID &&\n projectTargetBackend\n ) {\n projectTargetBackend.unsubscribe(subscriptionId);\n continue;\n }\n const target = runtimeSockets.get(subscription.runtimeId);\n if (target && target.readyState === WebSocket.OPEN) {\n const message: SyncoreDevtoolsUnsubscribe = {\n type: \"unsubscribe\",\n subscriptionId,\n targetRuntimeId: subscription.runtimeId\n };\n target.send(JSON.stringify(message));\n }\n }\n dashboardSubscriptions.delete(socket);\n }\n const runtimeIds = socketRuntimeIds.get(socket);\n if (!runtimeIds) {\n return;\n }\n for (const runtimeId of runtimeIds) {\n if (runtimeSockets.get(runtimeId) === socket) {\n if (runtimeHellos.has(runtimeId)) {\n const disconnectedEvent: SyncoreDevtoolsMessage = {\n type: \"event\",\n event: {\n type: \"runtime.disconnected\",\n runtimeId,\n timestamp: Date.now()\n }\n };\n const payload = JSON.stringify(disconnectedEvent);\n void appendHubLog(disconnectedEvent.event);\n for (const client of dashboardSockets) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(payload);\n }\n }\n }\n runtimeSockets.delete(runtimeId);\n runtimeHellos.delete(runtimeId);\n runtimeEvents.delete(runtimeId);\n }\n }\n socketRuntimeIds.delete(socket);\n });\n });\n\n httpServer.on(\"error\", (error) => {\n console.error(`Syncore devtools hub failed: ${formatError(error)}`);\n process.exit(1);\n });\n\n await new Promise<void>((resolve, reject) => {\n httpServer.once(\"error\", reject);\n httpServer.listen(devtoolsPort, \"127.0.0.1\", () => {\n httpServer.off(\"error\", reject);\n resolve();\n });\n });\n console.log(`Syncore devtools hub: ws://localhost:${devtoolsPort}`);\n console.log(`Devtools dashboard token: ${hubAccessToken}`);\n console.log(\n `Electron/Node runtimes: set devtoolsUrl to ws://localhost:${devtoolsPort}.`\n );\n console.log(\n `Web/Next apps: connect the dashboard or worker bridge to ws://localhost:${devtoolsPort}.`\n );\n console.log(\n \"Expo apps: use the same hub URL through LAN or adb reverse while developing.\"\n );\n const dashboardRoot = path.resolve(\n CORE_PACKAGE_ROOT,\n \"..\",\n \"..\",\n \"apps\",\n \"dashboard\"\n );\n if (await fileExists(path.join(dashboardRoot, \"vite.config.ts\"))) {\n try {\n const viteModule = await import(\"vite\");\n const server = await viteModule.createServer({\n configFile: path.join(dashboardRoot, \"vite.config.ts\"),\n root: dashboardRoot,\n server: {\n port: dashboardPort\n }\n });\n await server.listen();\n console.log(`Dashboard shell: ${sessionState.authenticatedDashboardUrl}`);\n } catch (error) {\n console.log(\n `Dashboard source not started automatically: ${formatError(error)}`\n );\n }\n }\n\n const close = () => {\n void projectTargetBackend?.dispose();\n websocketServer.close();\n httpServer.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", close);\n process.on(\"SIGTERM\", close);\n return sessionState;\n}\n\nasync function writeDevtoolsSessionState(\n cwd: string,\n state: DevHubSessionState\n): Promise<void> {\n const sessionPath = path.join(cwd, DEVTOOLS_SESSION_FILE);\n await mkdir(path.dirname(sessionPath), { recursive: true });\n await writeFile(sessionPath, `${JSON.stringify(state, null, 2)}\\n`);\n}\n\nasync function readDevtoolsSessionState(\n cwd: string\n): Promise<DevHubSessionState | null> {\n const sessionPath = path.join(cwd, DEVTOOLS_SESSION_FILE);\n if (!(await fileExists(sessionPath))) {\n return null;\n }\n\n try {\n const source = await readFile(sessionPath, \"utf8\");\n const parsed = JSON.parse(source) as Partial<DevHubSessionState>;\n if (\n typeof parsed.dashboardUrl !== \"string\" ||\n typeof parsed.authenticatedDashboardUrl !== \"string\" ||\n typeof parsed.devtoolsUrl !== \"string\" ||\n typeof parsed.token !== \"string\"\n ) {\n return null;\n }\n return {\n dashboardUrl: parsed.dashboardUrl,\n authenticatedDashboardUrl: parsed.authenticatedDashboardUrl,\n devtoolsUrl: parsed.devtoolsUrl,\n token: parsed.token\n };\n } catch {\n return null;\n }\n}\n\nasync function setupDevProjectWatch(\n cwd: string,\n template: SyncoreTemplateName\n): Promise<void> {\n const snapshot = await createDevWatchSnapshot(cwd);\n if (snapshot.size === 0) {\n return;\n }\n\n console.log(\"Watching syncore/ for changes.\");\n let lastSnapshot = snapshot;\n const interval = setInterval(() => {\n void (async () => {\n const nextSnapshot = await createDevWatchSnapshot(cwd);\n if (!areDevWatchSnapshotsEqual(lastSnapshot, nextSnapshot)) {\n lastSnapshot = nextSnapshot;\n scheduleDevProjectBootstrap(cwd, template);\n }\n })();\n }, 500);\n\n const dispose = () => {\n clearInterval(interval);\n };\n\n process.once(\"SIGINT\", dispose);\n process.once(\"SIGTERM\", dispose);\n}\n\nfunction scheduleDevProjectBootstrap(\n cwd: string,\n template: SyncoreTemplateName\n): void {\n if (pendingDevBootstrap) {\n clearTimeout(pendingDevBootstrap);\n }\n pendingDevBootstrap = setTimeout(() => {\n void runDevProjectBootstrap(cwd, template);\n }, 150);\n}\n\nexport async function runDevProjectBootstrap(\n cwd: string,\n template: SyncoreTemplateName\n): Promise<void> {\n if (devBootstrapInFlight) {\n scheduleDevProjectBootstrap(cwd, template);\n return;\n }\n\n devBootstrapInFlight = true;\n try {\n await ensureProjectScaffolded(cwd, template);\n await runCodegen(cwd);\n const schema = await loadProjectSchema(cwd);\n const currentSnapshot = createSchemaSnapshot(schema);\n const storedSnapshot = await readStoredSnapshot(cwd);\n const plan = diffSchemaSnapshots(storedSnapshot, currentSnapshot);\n\n if (plan.destructiveChanges.length > 0) {\n console.error(\"Syncore dev blocked by destructive schema changes:\");\n for (const destructiveChange of plan.destructiveChanges) {\n console.error(`- ${destructiveChange}`);\n }\n return;\n }\n\n if (storedSnapshot?.hash !== currentSnapshot.hash) {\n await writeStoredSnapshot(cwd, currentSnapshot);\n if (plan.statements.length > 0 || plan.warnings.length > 0) {\n console.log(\n `Schema snapshot updated (${plan.statements.length} statement(s), ${plan.warnings.length} warning(s)).`\n );\n } else {\n console.log(\"Schema snapshot updated.\");\n }\n }\n\n for (const warning of plan.warnings) {\n console.warn(`Syncore dev warning: ${warning}`);\n }\n\n if (templateUsesConnectedClients(template)) {\n console.log(\n \"Syncore dev is ready. Codegen refreshed; waiting for a connected client runtime to apply schema locally.\"\n );\n return;\n }\n\n const appliedCount = await applyProjectMigrations(cwd);\n console.log(\n `Syncore dev is ready. Codegen refreshed; ${appliedCount} migration(s) applied.`\n );\n } catch (error) {\n console.error(`Syncore dev bootstrap failed: ${formatError(error)}`);\n } finally {\n devBootstrapInFlight = false;\n }\n}\n\nasync function createDevWatchSnapshot(\n cwd: string\n): Promise<Map<string, number>> {\n const snapshot = new Map<string, number>();\n const filesToCheck = [\n path.join(cwd, \"syncore.config.ts\"),\n path.join(cwd, \"syncore\", \"schema.ts\"),\n path.join(cwd, \".gitignore\"),\n path.join(cwd, \"package.json\")\n ];\n for (const file of filesToCheck) {\n if (await fileExists(file)) {\n const info = await stat(file);\n snapshot.set(file, info.mtimeMs);\n }\n }\n\n for (const directory of [\n path.join(cwd, \"syncore\", \"functions\"),\n path.join(cwd, \"syncore\", \"migrations\")\n ]) {\n for (const file of await listFilesRecursively(directory)) {\n const info = await stat(file);\n snapshot.set(file, info.mtimeMs);\n }\n }\n\n return snapshot;\n}\n\nasync function listFilesRecursively(directory: string): Promise<string[]> {\n if (!(await fileExists(directory))) {\n return [];\n }\n\n const entries = await readdir(directory, { withFileTypes: true });\n const files = await Promise.all(\n entries.map(async (entry) => {\n const fullPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n return listFilesRecursively(fullPath);\n }\n if (entry.isFile()) {\n return [fullPath];\n }\n return [];\n })\n );\n\n return files.flat().sort((left, right) => left.localeCompare(right));\n}\n\nfunction areDevWatchSnapshotsEqual(\n left: Map<string, number>,\n right: Map<string, number>\n): boolean {\n if (left.size !== right.size) {\n return false;\n }\n for (const [filePath, leftTimestamp] of left) {\n if (right.get(filePath) !== leftTimestamp) {\n return false;\n }\n }\n return true;\n}\n\nfunction decodeWebSocketPayload(\n payload: string | Buffer | ArrayBuffer | Buffer[]\n): string {\n if (typeof payload === \"string\") {\n return payload;\n }\n if (payload instanceof Buffer) {\n return payload.toString(\"utf8\");\n }\n if (Array.isArray(payload)) {\n return Buffer.concat(payload).toString(\"utf8\");\n }\n if (payload instanceof ArrayBuffer) {\n return Buffer.from(payload).toString(\"utf8\");\n }\n return Buffer.from(\n payload.buffer,\n payload.byteOffset,\n payload.byteLength\n ).toString(\"utf8\");\n}\n\nfunction isUnsupportedFts5Statement(\n statement: string,\n error: unknown\n): boolean {\n if (!/using\\s+fts5/i.test(statement)) {\n return false;\n }\n return error instanceof Error && /fts5/i.test(error.message);\n}\n\nfunction unwrapDefaultExport<TValue>(value: TValue): TValue {\n if (\n value &&\n typeof value === \"object\" &&\n \"default\" in (value as Record<string, unknown>) &&\n (value as Record<string, unknown>).default !== undefined\n ) {\n return unwrapDefaultExport(\n (value as Record<string, unknown>).default as TValue\n );\n }\n return value;\n}\n\nexport function resolvePortFromEnv(\n environmentVariable: string,\n fallback: number\n): number {\n const rawValue = process.env[environmentVariable];\n if (!rawValue) {\n return fallback;\n }\n\n const parsed = Number.parseInt(rawValue, 10);\n if (Number.isNaN(parsed) || parsed <= 0) {\n throw new Error(\n `${environmentVariable} must be a positive integer when provided.`\n );\n }\n\n return parsed;\n}\n\nfunction isCliEntryPoint(): boolean {\n const entryPath = process.argv[1];\n if (!entryPath) {\n return false;\n }\n return (\n path.resolve(entryPath) === path.resolve(fileURLToPath(import.meta.url))\n );\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortValue);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nested]) => [key, sortValue(nested)])\n );\n }\n return value;\n}\n\nfunction quoteIdentifier(identifier: string): string {\n return `\"${identifier.replaceAll('\"', '\"\"')}\"`;\n}\n\nfunction toSearchValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value === null || value === undefined) {\n return \"\";\n }\n if (\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\"\n ) {\n return String(value);\n }\n return stableStringify(value);\n}\n"],"mappings":"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AAe;EACpD;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG,gBAAgB,KAChB,UACC,KAAK,KAAK,UAAU,GAAG,MAAM,UAAU,KAAK,GAAG,EAAE,GAAG,MAAM,YAAY,EAAE,IAAI,yBAAyB,KAAK,EAAE,EAChH;EACA;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI;CAEX,MAAM,eAAe;EACnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,oCAAoC,wBAAwB;EAC5D,GAAG,mCACD,uBACA,uBACF;EACA;EACA,GAAG,wCAAwC,qBAAqB;EAChE;EACA;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI;CAEX,MAAM,mBAAmB;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG,mCACD,uBACA,uBACF;EACA;EACA,GAAG,wCAAwC,qBAAqB;EAChE;EACA;EACA;EACA;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI;CAEX,MAAM,gBAAgB;EACpB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,+BAA+B,wBAAwB;EACvD,yCAAyC,wBAAwB;EACjE,GAAI,wBACA,CAAC,mDAAmD,wBAAwB,GAAG,IAC/E,CAAC,yCAAyC;EAC9C;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI;CAEX,MAAM,eAAe;EACnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,qCAAqC,wBAAwB;EAC7D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;E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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":["connectToNet"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport {\n appendFile,\n readdir,\n mkdir,\n open,\n readFile,\n rm,\n stat,\n writeFile\n} from \"node:fs/promises\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n createServer,\n type IncomingMessage,\n type ServerResponse\n} from \"node:http\";\nimport { connect as connectToNet } from \"node:net\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { DatabaseSync, type SQLInputValue } from \"node:sqlite\";\nimport { Command } from \"commander\";\nimport { tsImport } from \"tsx/esm/api\";\nimport WebSocket, { WebSocketServer } from \"ws\";\nimport type {\n SyncoreDevtoolsClientMessage,\n SyncoreDevtoolsCommandPayload,\n SyncoreDevtoolsCommandResultPayload,\n SyncoreDevtoolsCapabilities,\n SyncoreDevtoolsMessage,\n SyncoreDevtoolsSubscriptionPayload,\n SyncoreDevtoolsSubscriptionResultPayload,\n SyncoreDevtoolsSubscribe,\n SyncoreDevtoolsUnsubscribe,\n StorageEntry\n} from \"@syncore/devtools-protocol\";\nimport {\n SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION,\n SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION,\n SYNCORE_DEVTOOLS_PROTOCOL_VERSION,\n createPublicRuntimeId,\n createPublicTargetId\n} from \"@syncore/devtools-protocol\";\nimport {\n generateDevtoolsToken,\n isAllowedDashboardOrigin,\n isAuthorizedDashboardRequest,\n sanitizeDevtoolsToken\n} from \"./devtools-auth.js\";\nimport {\n createDevtoolsCommandHandler,\n createDevtoolsSubscriptionHost,\n generateId,\n SyncoreRuntime,\n type AnyTableDefinition,\n type DevtoolsSqlAnalysis,\n type DevtoolsSqlReadResult,\n type DevtoolsSqlSupport,\n createSchemaSnapshot,\n diffSchemaSnapshots,\n parseSchemaSnapshot,\n renderCreateIndexStatement,\n renderCreateSearchIndexStatement,\n renderCreateTableStatement,\n renderMigrationSql,\n searchIndexTableName,\n type SchemaSnapshot,\n type StorageObject,\n type StorageWriteInput,\n type SyncoreExternalChangeEvent,\n type SyncoreExternalChangeSignal,\n type SyncoreSchema,\n type SyncoreFunctionRegistry,\n type SyncoreResolvedComponents,\n type SyncoreSqlDriver,\n type SyncoreStorageAdapter,\n type TableDefinition,\n type Validator\n} from \"./index.js\";\n\nexport interface SyncoreProjectTargetConfig {\n databasePath: string;\n storageDirectory: string;\n}\n\nexport interface SyncoreConfig {\n projectTarget?: SyncoreProjectTargetConfig;\n databasePath?: string;\n storageDirectory?: string;\n}\n\nexport interface DevHubSessionState {\n dashboardUrl: string;\n authenticatedDashboardUrl: string;\n devtoolsUrl: string;\n token: string;\n}\n\nexport type SyncoreTemplateName =\n | \"minimal\"\n | \"node\"\n | \"react-web\"\n | \"svelte\"\n | \"expo\"\n | \"electron\"\n | \"next\";\n\nexport function templateUsesConnectedClients(\n template: SyncoreTemplateName\n): boolean {\n return (\n template === \"react-web\" ||\n template === \"svelte\" ||\n template === \"expo\" ||\n template === \"next\"\n );\n}\n\ninterface SyncoreTemplateFile {\n path: string;\n content: string;\n}\n\ninterface ScannedFunctionEntry {\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n}\n\nconst loadedTypeScriptModules = new Map<\n string,\n { mtimeMs: number; loaded: Promise<Record<string, unknown>> }\n>();\n\nexport interface ScaffoldProjectOptions {\n template: SyncoreTemplateName;\n force?: boolean;\n}\n\nexport interface ScaffoldProjectResult {\n template: SyncoreTemplateName;\n created: string[];\n updated: string[];\n skipped: string[];\n}\n\ninterface PackageJsonShape {\n name?: string;\n type?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nconst COMBINED_DEV_COMMAND =\n 'concurrently --kill-others-on-fail --names syncore,app --prefix-colors yellow,cyan \"npm run syncorejs:dev\" \"npm run dev:app\"';\n\nconst program = new Command();\nconst CORE_PACKAGE_ROOT = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"..\"\n);\nconst DEVTOOLS_SESSION_FILE = path.join(\".syncore\", \"devtools-session.json\");\nexport const SYNCORE_MIGRATION_SNAPSHOT_FILE_NAME = \"_schema_snapshot.json\";\nexport const VALID_SYNCORE_TEMPLATES: SyncoreTemplateName[] = [\n \"minimal\",\n \"node\",\n \"react-web\",\n \"svelte\",\n \"expo\",\n \"electron\",\n \"next\"\n];\nlet pendingDevBootstrap: ReturnType<typeof setTimeout> | undefined;\nlet devBootstrapInFlight = false;\nconst PROJECT_TARGET_RUNTIME_ID = \"syncore-project-target\";\nconst STORAGE_ACCESS_TICKET_TTL_MS = 5 * 60 * 1000;\nconst STORAGE_ACCESS_CHUNK_BYTES = 1024 * 1024;\nconst STORAGE_ACCESS_MAX_PREVIEW_BYTES = 80_000;\n\nprogram\n .name(\"syncorejs\")\n .description(\"Syncore local-first toolkit CLI\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"init\")\n .description(\"Scaffold Syncore in the current directory\")\n .option(\n \"--template <template>\",\n `Template to scaffold (${VALID_SYNCORE_TEMPLATES.join(\", \")}, or auto)`,\n \"auto\"\n )\n .option(\"--force\", \"Overwrite Syncore-managed files when they already exist\")\n .action(async (options: { template: string; force?: boolean }) => {\n const cwd = process.cwd();\n const template = await resolveRequestedTemplate(cwd, options.template);\n const result = await scaffoldProject(cwd, {\n template,\n ...(options.force ? { force: true } : {})\n });\n await runCodegen(cwd);\n logScaffoldResult(result, \"Syncore project scaffolded.\");\n console.log(\n \"Next: run `npx syncorejs dev` to keep codegen and local migrations in sync.\"\n );\n });\n\nprogram\n .command(\"codegen\")\n .description(\"Generate typed Syncore references from syncore/functions\")\n .action(async () => {\n await runCodegen(process.cwd());\n console.log(\"Generated syncore/_generated files.\");\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Check Syncore project structure and inferred template\")\n .action(async () => {\n const cwd = process.cwd();\n const checks = [\n \"syncore.config.ts\",\n path.join(\"syncore\", \"schema.ts\"),\n path.join(\"syncore\", \"functions\"),\n path.join(\"syncore\", \"migrations\")\n ];\n console.log(`Detected template: ${await detectProjectTemplate(cwd)}`);\n for (const check of checks) {\n const exists = await fileExists(path.join(cwd, check));\n console.log(`${exists ? \"OK\" : \"MISSING\"} ${check}`);\n }\n });\n\nprogram\n .command(\"import\")\n .description(\"Import JSONL sample data into a local Syncore table\")\n .requiredOption(\"--table <table>\", \"Table name to import into\")\n .argument(\"<file>\", \"Path to a JSONL file\")\n .action(async (filePath: string, options: { table: string }) => {\n const importedCount = await importJsonlIntoProject(\n process.cwd(),\n options.table,\n filePath\n );\n console.log(\n `Imported ${importedCount} row(s) into ${JSON.stringify(options.table)}.`\n );\n });\n\nprogram\n .command(\"seed\")\n .description(\n \"Import seed data from syncore/seed.jsonl or syncore/seed/<table>.jsonl\"\n )\n .requiredOption(\"--table <table>\", \"Table name to seed\")\n .option(\"--file <file>\", \"Explicit JSONL file path\")\n .action(async (options: { table: string; file?: string }) => {\n const cwd = process.cwd();\n const seedFile =\n options.file ??\n (await resolveDefaultSeedFile(cwd, options.table)) ??\n path.join(\"syncore\", \"seed\", `${options.table}.jsonl`);\n const importedCount = await importJsonlIntoProject(\n cwd,\n options.table,\n seedFile\n );\n console.log(\n `Seeded ${importedCount} row(s) into ${JSON.stringify(options.table)} from ${seedFile}.`\n );\n });\n\nprogram\n .command(\"migrate:status\")\n .description(\n \"Compare the current schema against the last saved migration snapshot\"\n )\n .action(async () => {\n const cwd = process.cwd();\n const schema = await loadProjectSchema(cwd);\n const currentSnapshot = createSchemaSnapshot(schema);\n const storedSnapshot = await readStoredSnapshot(cwd);\n const plan = diffSchemaSnapshots(storedSnapshot, currentSnapshot);\n\n console.log(`Current schema hash: ${currentSnapshot.hash}`);\n console.log(`Stored snapshot: ${storedSnapshot?.hash ?? \"none\"}`);\n console.log(`Statements to generate: ${plan.statements.length}`);\n console.log(`Warnings: ${plan.warnings.length}`);\n console.log(`Destructive changes: ${plan.destructiveChanges.length}`);\n\n for (const warning of plan.warnings) {\n console.log(`WARN ${warning}`);\n }\n for (const destructiveChange of plan.destructiveChanges) {\n console.log(`BLOCK ${destructiveChange}`);\n }\n });\n\nprogram\n .command(\"migrate:generate\")\n .argument(\"[name]\", \"Optional migration name\", \"auto\")\n .description(\"Generate a SQL migration file from the current schema diff\")\n .action(async (name: string) => {\n const cwd = process.cwd();\n const schema = await loadProjectSchema(cwd);\n const currentSnapshot = createSchemaSnapshot(schema);\n const storedSnapshot = await readStoredSnapshot(cwd);\n const plan = diffSchemaSnapshots(storedSnapshot, currentSnapshot);\n\n if (plan.destructiveChanges.length > 0) {\n console.error(\"Destructive schema changes require a manual migration:\");\n for (const destructiveChange of plan.destructiveChanges) {\n console.error(`- ${destructiveChange}`);\n }\n process.exitCode = 1;\n return;\n }\n\n if (plan.statements.length === 0 && plan.warnings.length === 0) {\n console.log(\"No schema changes detected.\");\n return;\n }\n\n const migrationsDirectory = path.join(cwd, \"syncore\", \"migrations\");\n await mkdir(migrationsDirectory, { recursive: true });\n const migrationNumber = await getNextMigrationNumber(migrationsDirectory);\n const slug = slugify(name);\n const migrationFileName = `${String(migrationNumber).padStart(4, \"0\")}_${slug}.sql`;\n const migrationSql = renderMigrationSql(plan, {\n title: `Syncore migration ${migrationFileName}`\n });\n await writeFile(\n path.join(migrationsDirectory, migrationFileName),\n migrationSql\n );\n await writeStoredSnapshot(cwd, currentSnapshot);\n console.log(\n `Generated ${path.join(\"syncore\", \"migrations\", migrationFileName)}`\n );\n });\n\nprogram\n .command(\"migrate:apply\")\n .description(\n \"Apply SQL migrations from syncore/migrations to the configured database\"\n )\n .action(async () => {\n const appliedCount = await applyProjectMigrations(process.cwd());\n console.log(`Applied ${appliedCount} migration(s).`);\n });\n\nprogram\n .command(\"dev\")\n .description(\"Start the Syncore dev loop and devtools hub\")\n .option(\n \"--template <template>\",\n `Template to scaffold when Syncore is missing (${VALID_SYNCORE_TEMPLATES.join(\", \")}, or auto)`,\n \"auto\"\n )\n .action(async (options: { template: string }) => {\n const cwd = process.cwd();\n const template = await resolveRequestedTemplate(cwd, options.template);\n await startDevHub({ cwd, template });\n });\n\nexport async function runSyncoreCli(argv = process.argv): Promise<void> {\n await program.parseAsync(argv);\n}\n\nif (isCliEntryPoint()) {\n await runSyncoreCli();\n}\n\nexport async function runCodegen(cwd: string): Promise<void> {\n const functionsDir = path.join(cwd, \"syncore\", \"functions\");\n const generatedDir = path.join(cwd, \"syncore\", \"_generated\");\n const componentsManifestPath = path.join(cwd, \"syncore\", \"components.ts\");\n await mkdir(generatedDir, { recursive: true });\n const functionImportExtension = await resolveFunctionImportExtension(cwd);\n const hasComponentsManifest = await hasNonEmptyComponentsManifest(\n componentsManifestPath\n );\n\n const files = await listTypeScriptFiles(functionsDir);\n const functionEntries: ScannedFunctionEntry[] = [];\n\n for (const file of files) {\n const content = await readFile(file, \"utf8\");\n const relative = path\n .relative(functionsDir, file)\n .replaceAll(\"\\\\\", \"/\")\n .replace(/\\.tsx?$/, \"\");\n const pathParts = relative.split(\"/\");\n const regex = /export const (\\w+)\\s*=\\s*(query|mutation|action)\\(/g;\n for (const match of content.matchAll(regex)) {\n functionEntries.push({\n pathParts,\n exportName: match[1]!,\n kind: match[2] as \"query\" | \"mutation\" | \"action\"\n });\n }\n }\n\n const apiSource = [\n `/**`,\n ` * Generated \\`api\\` utility for referencing Syncore functions.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import { createFunctionReferenceFor } from \"syncorejs\";`,\n `import type { FunctionReferenceFor } from \"syncorejs\";`,\n `export { components } from \"./components${functionImportExtension}\";`,\n ``,\n ...renderFunctionTypeImports(functionEntries, functionImportExtension),\n ``,\n ...renderGeneratedApiInterfaces(functionEntries),\n ``,\n `/**`,\n ` * A utility for referencing Syncore functions in your app's public API.`,\n ` *`,\n ` * Usage:`,\n ` * \\`\\`\\`ts`,\n ` * const listTasks = api.tasks.list;`,\n ` * \\`\\`\\``,\n ` */`,\n `export const api: SyncoreApi = ${renderApiObject(functionEntries)} as const;`,\n ``\n ].join(\"\\n\");\n\n const functionsSource = [\n `/**`,\n ` * Generated Syncore function registry.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import type { SyncoreFunctionRegistry } from \"syncorejs\";`,\n `import { composeProjectFunctionRegistry } from \"syncorejs\";`,\n ...renderGeneratedManifestImportLines(\n hasComponentsManifest,\n functionImportExtension\n ),\n ...renderFunctionImports(functionEntries, functionImportExtension),\n ``,\n ...renderGeneratedManifestDeclarationLines(hasComponentsManifest),\n ``,\n ...renderGeneratedFunctionsInterface(functionEntries),\n ``,\n `/**`,\n ` * The runtime registry for every function exported from \\`syncore/functions\\`.`,\n ` *`,\n ` * Most application code should import from \\`./api\\` instead of using this map directly.`,\n ` */`,\n `const rootFunctions: SyncoreRootFunctionsRegistry = {`,\n ...functionEntries.map(\n (entry) =>\n ` ${JSON.stringify(`${entry.pathParts.join(\"/\")}/${entry.exportName}`)}: ${renderFunctionImportName(entry)},`\n ),\n `} as const;`,\n ``,\n `export const functions: SyncoreFunctionRegistry = composeProjectFunctionRegistry(rootFunctions, componentsManifest);`,\n ``\n ].join(\"\\n\");\n\n const schemaSource = [\n `/**`,\n ` * Generated composed Syncore schema including installed components.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import { composeProjectSchema } from \"syncorejs\";`,\n `import rootSchema from \"../schema${functionImportExtension}\";`,\n ...renderGeneratedManifestImportLines(\n hasComponentsManifest,\n functionImportExtension\n ),\n ``,\n ...renderGeneratedManifestDeclarationLines(hasComponentsManifest),\n ``,\n `const schema = composeProjectSchema(rootSchema, componentsManifest);`,\n ``,\n `export default schema;`,\n ``\n ].join(\"\\n\");\n\n const componentsSource = [\n `/**`,\n ` * Generated installed-component helpers for this Syncore app.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import { createInstalledComponentsApi, resolveComponentsManifest } from \"syncorejs\";`,\n ...renderGeneratedManifestImportLines(\n hasComponentsManifest,\n functionImportExtension\n ),\n ``,\n ...renderGeneratedManifestDeclarationLines(hasComponentsManifest),\n ``,\n `export const components = createInstalledComponentsApi(componentsManifest);`,\n ``,\n `export const resolvedComponents = resolveComponentsManifest(componentsManifest);`,\n ``,\n `export default resolvedComponents;`,\n ``\n ].join(\"\\n\");\n\n const runtimeSource = [\n `/**`,\n ` * Generated local runtime bundle for Syncore CLI and Node adapters.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import schema from \"./schema${functionImportExtension}\";`,\n `import { functions } from \"./functions${functionImportExtension}\";`,\n ...(hasComponentsManifest\n ? [\n `import { resolvedComponents } from \"./components${functionImportExtension}\";`\n ]\n : [`const resolvedComponents = [] as const;`]),\n ``,\n `export { functions, schema };`,\n `export const components = resolvedComponents;`,\n ``\n ].join(\"\\n\");\n\n const serverSource = [\n `/**`,\n ` * Generated utilities for implementing Syncore query, mutation, and action functions.`,\n ` *`,\n ` * THIS CODE IS AUTOMATICALLY GENERATED.`,\n ` *`,\n ` * To regenerate, run \\`npx syncorejs dev\\` or \\`npx syncorejs codegen\\`.`,\n ` * @module`,\n ` */`,\n ``,\n `import type schema from \"../schema${functionImportExtension}\";`,\n `import { action as baseAction, mutation as baseMutation, query as baseQuery } from \"syncorejs\";`,\n `import type {`,\n ` ActionCtx as BaseActionCtx,`,\n ` FunctionConfig,`,\n ` Infer,`,\n ` InferArgs,`,\n ` MutationCtx as BaseMutationCtx,`,\n ` QueryCtx as BaseQueryCtx,`,\n ` SyncoreFunctionDefinition,`,\n ` Validator,`,\n ` ValidatorMap`,\n `} from \"syncorejs\";`,\n ``,\n `export { createFunctionReference, createFunctionReferenceFor, s } from \"syncorejs\";`,\n ``,\n `/**`,\n ` * The context object available inside Syncore query handlers in this app.`,\n ` */`,\n `export type QueryCtx = BaseQueryCtx<typeof schema>;`,\n ``,\n `/**`,\n ` * The context object available inside Syncore mutation handlers in this app.`,\n ` */`,\n `export type MutationCtx = BaseMutationCtx<typeof schema>;`,\n ``,\n `/**`,\n ` * The context object available inside Syncore action handlers in this app.`,\n ` */`,\n `export type ActionCtx = BaseActionCtx<typeof schema>;`,\n ``,\n `export type { FunctionReference } from \"syncorejs\";`,\n ``,\n `/**`,\n ` * Define a query in this Syncore app's public API.`,\n ` *`,\n ` * Queries can read from your local Syncore database and can be called from clients.`,\n ` *`,\n ` * @param config - The query definition, including args and a handler.`,\n ` * @returns The wrapped query. Export it from \\`syncore/functions\\` to add it to the generated API.`,\n ` */`,\n `export const query = baseQuery as {`,\n ` <TValidator extends Validator<unknown, unknown, string>, TResult>(`,\n ` config: FunctionConfig<QueryCtx, Infer<TValidator>, TResult> & { args: TValidator }`,\n ` ): SyncoreFunctionDefinition<\"query\", QueryCtx, Infer<TValidator>, TResult>;`,\n ` <TArgsShape extends ValidatorMap, TResult>(`,\n ` config: FunctionConfig<QueryCtx, InferArgs<TArgsShape>, TResult> & { args: TArgsShape }`,\n ` ): SyncoreFunctionDefinition<\"query\", QueryCtx, InferArgs<TArgsShape>, TResult>;`,\n `};`,\n ``,\n `/**`,\n ` * Define a mutation in this Syncore app's public API.`,\n ` *`,\n ` * Mutations can write to your local Syncore database and can be called from clients.`,\n ` *`,\n ` * @param config - The mutation definition, including args and a handler.`,\n ` * @returns The wrapped mutation. Export it from \\`syncore/functions\\` to add it to the generated API.`,\n ` */`,\n `export const mutation = baseMutation as {`,\n ` <TValidator extends Validator<unknown, unknown, string>, TResult>(`,\n ` config: FunctionConfig<MutationCtx, Infer<TValidator>, TResult> & { args: TValidator }`,\n ` ): SyncoreFunctionDefinition<\"mutation\", MutationCtx, Infer<TValidator>, TResult>;`,\n ` <TArgsShape extends ValidatorMap, TResult>(`,\n ` config: FunctionConfig<MutationCtx, InferArgs<TArgsShape>, TResult> & { args: TArgsShape }`,\n ` ): SyncoreFunctionDefinition<\"mutation\", MutationCtx, InferArgs<TArgsShape>, TResult>;`,\n `};`,\n ``,\n `/**`,\n ` * Define an action in this Syncore app's public API.`,\n ` *`,\n ` * Actions can run arbitrary JavaScript and may call queries or mutations.`,\n ` *`,\n ` * @param config - The action definition, including args and a handler.`,\n ` * @returns The wrapped action. Export it from \\`syncore/functions\\` to add it to the generated API.`,\n ` */`,\n `export const action = baseAction as {`,\n ` <TValidator extends Validator<unknown, unknown, string>, TResult>(`,\n ` config: FunctionConfig<ActionCtx, Infer<TValidator>, TResult> & { args: TValidator }`,\n ` ): SyncoreFunctionDefinition<\"action\", ActionCtx, Infer<TValidator>, TResult>;`,\n ` <TArgsShape extends ValidatorMap, TResult>(`,\n ` config: FunctionConfig<ActionCtx, InferArgs<TArgsShape>, TResult> & { args: TArgsShape }`,\n ` ): SyncoreFunctionDefinition<\"action\", ActionCtx, InferArgs<TArgsShape>, TResult>;`,\n `};`,\n ``\n ].join(\"\\n\");\n\n await writeGeneratedFile(path.join(generatedDir, \"api.ts\"), apiSource);\n await writeGeneratedFile(\n path.join(generatedDir, \"components.ts\"),\n componentsSource\n );\n await writeGeneratedFile(\n path.join(generatedDir, \"functions.ts\"),\n functionsSource\n );\n await writeGeneratedFile(\n path.join(generatedDir, \"runtime.ts\"),\n runtimeSource\n );\n await writeGeneratedFile(path.join(generatedDir, \"schema.ts\"), schemaSource);\n await writeGeneratedFile(path.join(generatedDir, \"server.ts\"), serverSource);\n}\n\nasync function writeGeneratedFile(\n filePath: string,\n source: string\n): Promise<void> {\n try {\n if ((await readFile(filePath, \"utf8\")) === source) {\n return;\n }\n } catch {\n // Missing or unreadable generated files are replaced below.\n }\n await writeFile(filePath, source);\n}\n\nexport async function scaffoldProject(\n cwd: string,\n options: ScaffoldProjectOptions\n): Promise<ScaffoldProjectResult> {\n const files = buildTemplateFiles(options.template);\n const created: string[] = [];\n const updated: string[] = [];\n const skipped: string[] = [];\n\n await mkdir(path.join(cwd, \"syncore\", \"functions\"), { recursive: true });\n await mkdir(path.join(cwd, \"syncore\", \"_generated\"), { recursive: true });\n await mkdir(path.join(cwd, \"syncore\", \"migrations\"), { recursive: true });\n\n for (const file of files) {\n const targetPath = path.join(cwd, file.path);\n const result = await writeManagedFile(\n targetPath,\n file.content,\n options.force\n );\n const relative = path.relative(cwd, targetPath).replaceAll(\"\\\\\", \"/\");\n if (result === \"created\") {\n created.push(relative);\n } else if (result === \"updated\") {\n updated.push(relative);\n } else {\n skipped.push(relative);\n }\n }\n\n await ensurePackageScripts(cwd, options.template);\n await ensureGitignoreEntries(cwd, [\".syncore/\"]);\n\n return {\n template: options.template,\n created,\n updated,\n skipped\n };\n}\n\nfunction buildTemplateFiles(\n template: SyncoreTemplateName\n): SyncoreTemplateFile[] {\n const files: SyncoreTemplateFile[] = [\n {\n path: \"syncore.config.ts\",\n content: renderSyncoreConfigTemplate(template)\n },\n {\n path: path.join(\"syncore\", \"schema.ts\"),\n content: `import { defineSchema, defineTable, s } from \"syncorejs\";\n\nexport default defineSchema({\n tasks: defineTable({\n text: s.string(),\n done: s.boolean()\n }).index(\"by_done\", [\"done\"])\n});\n`\n },\n {\n path: path.join(\"syncore\", \"components.ts\"),\n content: `import { defineComponents } from \"syncorejs\";\n\nexport default defineComponents({});\n`\n },\n {\n path: path.join(\"syncore\", \"functions\", \"tasks.ts\"),\n content: `import { mutation, query, s } from \"../_generated/server\";\n\nexport const list = query({\n args: {},\n handler: async (ctx) =>\n ctx.db.query(\"tasks\").withIndex(\"by_done\").order(\"asc\").collect()\n});\n\nexport const create = mutation({\n args: { text: s.string() },\n handler: async (ctx, args) =>\n ctx.db.insert(\"tasks\", { text: args.text, done: false })\n});\n`\n }\n ];\n\n switch (template) {\n case \"react-web\":\n files.push(\n {\n path: path.join(\"src\", \"syncore.worker.ts\"),\n content: `/// <reference lib=\"webworker\" />\n\nimport { createBrowserWorkerRuntime } from \"syncorejs/browser\";\nimport schema from \"../syncore/_generated/schema\";\nimport { functions } from \"../syncore/_generated/functions\";\n\nvoid createBrowserWorkerRuntime({\n endpoint: self,\n schema,\n functions\n});\n`\n },\n {\n path: path.join(\"src\", \"syncore-provider.tsx\"),\n content: `import type { ReactNode } from \"react\";\nimport { SyncoreBrowserProvider } from \"syncorejs/browser/react\";\n\nexport function AppSyncoreProvider({ children }: { children: ReactNode }) {\n return (\n <SyncoreBrowserProvider workerUrl={new URL(\"./syncore.worker.ts\", import.meta.url)}>\n {children}\n </SyncoreBrowserProvider>\n );\n}\n`\n }\n );\n break;\n case \"expo\":\n files.push({\n path: path.join(\"lib\", \"syncore.ts\"),\n content: `import { createExpoSyncoreBootstrap } from \"syncorejs/expo\";\nimport schema from \"../syncore/_generated/schema\";\nimport { functions } from \"../syncore/_generated/functions\";\n\nexport const syncore = createExpoSyncoreBootstrap({\n schema,\n functions\n});\n`\n });\n break;\n case \"next\":\n files.push(\n {\n path: path.join(\"app\", \"syncore.worker.js\"),\n content: `/* eslint-disable */\n\nimport { createBrowserWorkerRuntime } from \"syncorejs/browser\";\nimport schema from \"../syncore/_generated/schema\";\nimport { functions } from \"../syncore/_generated/functions\";\n\nvoid createBrowserWorkerRuntime({\n endpoint: self,\n schema,\n functions\n});\n`\n },\n {\n path: path.join(\"app\", \"syncore-provider.tsx\"),\n content: `\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { SyncoreNextProvider } from \"syncorejs/next\";\n\nconst createWorker = () =>\n new Worker(new URL(\"./syncore.worker.js\", import.meta.url), {\n type: \"module\"\n });\n\nexport function AppSyncoreProvider({ children }: { children: ReactNode }) {\n return (\n <SyncoreNextProvider createWorker={createWorker}>\n {children}\n </SyncoreNextProvider>\n );\n}\n`\n }\n );\n break;\n case \"node\":\n files.push({\n path: \"script.mjs\",\n content: `import path from \"node:path\";\nimport { withNodeSyncoreClient } from \"syncorejs/node\";\nimport { api } from \"./syncore/_generated/api.ts\";\nimport schema from \"./syncore/_generated/schema.ts\";\nimport { functions } from \"./syncore/_generated/functions.ts\";\n\nawait withNodeSyncoreClient(\n {\n databasePath: path.join(process.cwd(), \".syncore\", \"syncore.db\"),\n storageDirectory: path.join(process.cwd(), \".syncore\", \"storage\"),\n schema,\n functions\n },\n async (client) => {\n await client.mutation(api.tasks.create, { text: \"Run locally\" });\n console.log(await client.query(api.tasks.list));\n }\n);\n`\n });\n break;\n case \"electron\":\n files.push({\n path: path.join(\"src\", \"syncore-runtime.ts\"),\n content: `import path from \"node:path\";\nimport { app } from \"electron\";\nimport { createNodeSyncoreRuntime } from \"syncorejs/node\";\nimport schema from \"../syncore/_generated/schema.js\";\nimport { functions } from \"../syncore/_generated/functions.js\";\n\nexport function createAppSyncoreRuntime() {\n const userDataDirectory = app.getPath(\"userData\");\n return createNodeSyncoreRuntime({\n databasePath: path.join(userDataDirectory, \"syncore.db\"),\n storageDirectory: path.join(userDataDirectory, \"storage\"),\n schema,\n functions,\n platform: \"electron-main\"\n });\n}\n`\n });\n break;\n case \"svelte\":\n files.push(\n {\n path: path.join(\"src\", \"syncore.worker.ts\"),\n content: `/// <reference lib=\"webworker\" />\n\nimport { createBrowserWorkerRuntime } from \"syncorejs/browser\";\nimport schema from \"../syncore/_generated/schema\";\nimport { functions } from \"../syncore/_generated/functions\";\n\nvoid createBrowserWorkerRuntime({\n endpoint: self,\n schema,\n functions\n});\n`\n },\n {\n path: path.join(\"src\", \"SyncoreProvider.svelte\"),\n content: `<script lang=\"ts\">\n import { onDestroy } from \"svelte\";\n import type { Snippet } from \"svelte\";\n import { createBrowserWorkerClient } from \"syncorejs/browser\";\n import { setSyncoreClient } from \"syncorejs/svelte\";\n\n interface Props {\n children?: Snippet;\n }\n\n const { children }: Props = $props();\n\n const managed = createBrowserWorkerClient({\n workerUrl: new URL(\"./syncore.worker.ts\", import.meta.url)\n });\n\n setSyncoreClient(managed.client);\n\n onDestroy(() => {\n void managed.dispose();\n });\n</script>\n\n{@render children?.()}\n`\n }\n );\n break;\n case \"minimal\":\n break;\n }\n\n return files;\n}\n\nfunction renderSyncoreConfigTemplate(template: SyncoreTemplateName): string {\n if (template === \"node\" || template === \"electron\") {\n return `export default {\n projectTarget: {\n databasePath: \".syncore/syncore.db\",\n storageDirectory: \".syncore/storage\"\n }\n};\n`;\n }\n\n return `export default {};\n`;\n}\n\nexport function logScaffoldResult(\n result: ScaffoldProjectResult,\n heading: string\n): void {\n console.log(heading);\n console.log(`Using template: ${result.template}`);\n if (result.created.length > 0) {\n console.log(`Created: ${result.created.join(\", \")}`);\n }\n if (result.updated.length > 0) {\n console.log(`Updated: ${result.updated.join(\", \")}`);\n }\n if (result.skipped.length > 0) {\n console.log(`Kept existing: ${result.skipped.join(\", \")}`);\n }\n}\n\nasync function ensureProjectScaffolded(\n cwd: string,\n template: SyncoreTemplateName\n): Promise<void> {\n if (await hasSyncoreProject(cwd)) {\n return;\n }\n const result = await scaffoldProject(cwd, { template });\n logScaffoldResult(\n result,\n \"Syncore dev did not find a Syncore project, so it scaffolded one for you.\"\n );\n}\n\nexport async function hasSyncoreProject(cwd: string): Promise<boolean> {\n return (\n (await fileExists(path.join(cwd, \"syncore.config.ts\"))) &&\n (await fileExists(path.join(cwd, \"syncore\", \"schema.ts\"))) &&\n (await fileExists(path.join(cwd, \"syncore\", \"functions\")))\n );\n}\n\nexport async function resolveRequestedTemplate(\n cwd: string,\n requestedTemplate: string\n): Promise<SyncoreTemplateName> {\n if (requestedTemplate !== \"auto\") {\n if (\n !VALID_SYNCORE_TEMPLATES.includes(\n requestedTemplate as SyncoreTemplateName\n )\n ) {\n throw new Error(\n `Unknown template ${JSON.stringify(requestedTemplate)}. Expected one of ${VALID_SYNCORE_TEMPLATES.join(\", \")} or auto.`\n );\n }\n return requestedTemplate as SyncoreTemplateName;\n }\n return detectProjectTemplate(cwd);\n}\n\nexport async function detectProjectTemplate(\n cwd: string\n): Promise<SyncoreTemplateName> {\n const packageJson = await readPackageJson(cwd);\n const dependencies = {\n ...(packageJson?.dependencies ?? {}),\n ...(packageJson?.devDependencies ?? {})\n };\n\n if (\"expo\" in dependencies || \"react-native\" in dependencies) {\n return \"expo\";\n }\n if (\"electron\" in dependencies) {\n return \"electron\";\n }\n if (\"next\" in dependencies) {\n return \"next\";\n }\n if (\n \"svelte\" in dependencies ||\n \"@sveltejs/vite-plugin-svelte\" in dependencies ||\n \"@sveltejs/kit\" in dependencies ||\n (await fileExists(path.join(cwd, \"src\", \"SyncoreProvider.svelte\")))\n ) {\n return \"svelte\";\n }\n if (\n \"vite\" in dependencies ||\n \"@vitejs/plugin-react\" in dependencies ||\n (await fileExists(path.join(cwd, \"src\", \"syncore.worker.ts\"))) ||\n (await fileExists(path.join(cwd, \"src\", \"syncore-provider.tsx\"))) ||\n ((await fileExists(path.join(cwd, \"src\", \"main.tsx\"))) &&\n \"react\" in dependencies)\n ) {\n return \"react-web\";\n }\n if (packageJson) {\n return \"node\";\n }\n return \"minimal\";\n}\n\nexport async function readPackageJson(\n cwd: string\n): Promise<PackageJsonShape | null> {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!(await fileExists(packageJsonPath))) {\n return null;\n }\n try {\n return JSON.parse(\n await readFile(packageJsonPath, \"utf8\")\n ) as PackageJsonShape;\n } catch {\n return null;\n }\n}\n\nasync function ensurePackageScripts(\n cwd: string,\n template: SyncoreTemplateName\n): Promise<void> {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!(await fileExists(packageJsonPath))) {\n const packageJson: PackageJsonShape = {\n type: \"module\",\n scripts: {\n \"syncorejs:dev\": \"syncorejs dev\",\n \"syncorejs:codegen\": \"syncorejs codegen\"\n }\n };\n await writeFile(\n packageJsonPath,\n `${JSON.stringify(packageJson, null, 2)}\\n`\n );\n return;\n }\n\n const packageJson = await readPackageJson(cwd);\n if (!packageJson) {\n return;\n }\n\n const nextPackageJson: PackageJsonShape = {\n ...packageJson,\n scripts: {\n ...(packageJson.scripts ?? {})\n }\n };\n\n nextPackageJson.scripts ??= {};\n nextPackageJson.scripts[\"syncorejs:dev\"] ??= \"syncorejs dev\";\n nextPackageJson.scripts[\"syncorejs:codegen\"] ??= \"syncorejs codegen\";\n\n maybeAddManagedDevScripts(nextPackageJson, template);\n\n if (stableStringify(nextPackageJson) === stableStringify(packageJson)) {\n return;\n }\n\n await writeFile(\n packageJsonPath,\n `${JSON.stringify(nextPackageJson, null, 2)}\\n`\n );\n}\n\nfunction maybeAddManagedDevScripts(\n packageJson: PackageJsonShape,\n template: SyncoreTemplateName\n): void {\n if (!supportsManagedCombinedDev(template)) {\n return;\n }\n\n packageJson.scripts ??= {};\n const scripts = packageJson.scripts;\n const currentDev = scripts.dev;\n if (!currentDev) {\n return;\n }\n\n if (\n scripts[\"dev:app\"] === currentDev &&\n scripts.dev === combinedDevCommand()\n ) {\n packageJson.devDependencies ??= {};\n packageJson.devDependencies.concurrently ??= \"^9.1.2\";\n return;\n }\n\n if (scripts[\"dev:app\"] && scripts[\"dev:app\"] !== currentDev) {\n return;\n }\n\n if (currentDev.includes(\"syncorejs:dev\") || currentDev.includes(\"dev:app\")) {\n return;\n }\n\n packageJson.devDependencies ??= {};\n packageJson.devDependencies.concurrently ??= \"^9.1.2\";\n scripts[\"dev:app\"] ??= currentDev;\n scripts.dev = combinedDevCommand();\n}\n\nfunction supportsManagedCombinedDev(template: SyncoreTemplateName): boolean {\n return (\n template === \"next\" ||\n template === \"react-web\" ||\n template === \"svelte\" ||\n template === \"electron\"\n );\n}\n\nfunction combinedDevCommand(): string {\n return COMBINED_DEV_COMMAND;\n}\n\nasync function ensureGitignoreEntries(\n cwd: string,\n entries: string[]\n): Promise<void> {\n const gitignorePath = path.join(cwd, \".gitignore\");\n const existing = (await fileExists(gitignorePath))\n ? await readFile(gitignorePath, \"utf8\")\n : \"\";\n const lines = new Set(\n existing\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n );\n let changed = false;\n for (const entry of entries) {\n if (!lines.has(entry)) {\n lines.add(entry);\n changed = true;\n }\n }\n if (!changed) {\n return;\n }\n const nextContent = `${[...lines].sort((left, right) => left.localeCompare(right)).join(\"\\n\")}\\n`;\n await writeFile(gitignorePath, nextContent);\n}\n\nasync function writeManagedFile(\n filePath: string,\n content: string,\n force = false\n): Promise<\"created\" | \"updated\" | \"skipped\"> {\n await mkdir(path.dirname(filePath), { recursive: true });\n if (!(await fileExists(filePath))) {\n await writeFile(filePath, content);\n return \"created\";\n }\n if (!force) {\n return \"skipped\";\n }\n const current = await readFile(filePath, \"utf8\");\n if (current === content) {\n return \"skipped\";\n }\n await writeFile(filePath, content);\n return \"updated\";\n}\n\nexport async function importJsonlIntoProject(\n cwd: string,\n tableName: string,\n sourcePath: string\n): Promise<number> {\n const schema = await loadProjectSchema(cwd);\n const table = schema.getTable(tableName) as TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >;\n const config = await loadProjectConfig(cwd);\n const projectTarget = requireProjectTargetConfig(config);\n const databasePath = path.resolve(cwd, projectTarget.databasePath);\n const storageDirectory = path.resolve(cwd, projectTarget.storageDirectory);\n const sourceFilePath = path.resolve(cwd, sourcePath);\n await mkdir(path.dirname(databasePath), { recursive: true });\n await mkdir(storageDirectory, { recursive: true });\n const source = await readFile(sourceFilePath, \"utf8\");\n const rows = source\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean);\n\n const database = new DatabaseSync(databasePath);\n try {\n ensureDatabaseReadyForImport(database, schema);\n let importedCount = 0;\n let lineNumber = 0;\n for (const line of rows) {\n lineNumber += 1;\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch (error) {\n throw new Error(\n `Invalid JSON on line ${lineNumber} of ${sourcePath}: ${formatError(error)}`,\n { cause: error }\n );\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\n `Line ${lineNumber} of ${sourcePath} must contain a JSON object.`\n );\n }\n const payload = { ...(parsed as Record<string, unknown>) };\n delete payload._id;\n delete payload._creationTime;\n const validated = table.validator.parse(payload) as Record<\n string,\n unknown\n >;\n const id = generateId();\n const creationTime = Date.now() + importedCount;\n const json = stableStringify(validated);\n database\n .prepare(\n `INSERT INTO ${quoteIdentifier(tableName)} (_id, _creationTime, _json) VALUES (?, ?, ?)`\n )\n .run(id, creationTime, json);\n syncSearchIndexesForImport(database, tableName, table, {\n _id: id,\n _creationTime: creationTime,\n _json: json\n });\n importedCount += 1;\n }\n return importedCount;\n } finally {\n database.close();\n }\n}\n\nexport async function resolveDefaultSeedFile(\n cwd: string,\n tableName: string\n): Promise<string | null> {\n const candidates = [\n path.join(cwd, \"syncore\", \"seed\", `${tableName}.jsonl`),\n path.join(cwd, \"syncore\", \"seed.jsonl\")\n ];\n for (const candidate of candidates) {\n if (await fileExists(candidate)) {\n return path.relative(cwd, candidate).replaceAll(\"\\\\\", \"/\");\n }\n }\n return null;\n}\n\nfunction ensureDatabaseReadyForImport(\n database: DatabaseSync,\n schema: SyncoreSchema<Record<string, AnyTableDefinition>>\n): void {\n for (const tableName of schema.tableNames()) {\n const table = schema.getTable(tableName) as TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >;\n database.exec(renderCreateTableStatement(tableName));\n for (const index of table.indexes) {\n database.exec(\n renderCreateIndexStatement(tableName, index.name, index.fields)\n );\n }\n for (const searchIndex of table.searchIndexes) {\n try {\n database.exec(renderCreateSearchIndexStatement(tableName, searchIndex));\n } catch (error) {\n if (\n !isUnsupportedFts5Statement(\n renderCreateSearchIndexStatement(tableName, searchIndex),\n error\n )\n ) {\n throw error;\n }\n }\n }\n }\n}\n\nfunction syncSearchIndexesForImport(\n database: DatabaseSync,\n tableName: string,\n table: TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >,\n row: { _id: string; _creationTime: number; _json: string }\n): void {\n if (table.searchIndexes.length === 0) {\n return;\n }\n const payload = JSON.parse(row._json) as Record<string, unknown>;\n for (const searchIndex of table.searchIndexes) {\n const searchTable = searchIndexTableName(tableName, searchIndex.name);\n try {\n database\n .prepare(`DELETE FROM ${quoteIdentifier(searchTable)} WHERE _id = ?`)\n .run(row._id);\n database\n .prepare(\n `INSERT INTO ${quoteIdentifier(searchTable)} (_id, search_value) VALUES (?, ?)`\n )\n .run(row._id, toSearchValue(payload[searchIndex.searchField]));\n } catch (error) {\n if (\n !isUnsupportedFts5Statement(\n renderCreateSearchIndexStatement(tableName, searchIndex),\n error\n )\n ) {\n throw error;\n }\n }\n }\n}\n\nasync function listTypeScriptFiles(directory: string): Promise<string[]> {\n if (!(await fileExists(directory))) {\n return [];\n }\n const entries = await readdir(directory, { withFileTypes: true });\n const files = await Promise.all(\n entries.map(async (entry) => {\n const fullPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n return listTypeScriptFiles(fullPath);\n }\n if (entry.isFile() && /\\.tsx?$/.test(entry.name)) {\n return [fullPath];\n }\n return [];\n })\n );\n return files.flat().sort((left, right) => left.localeCompare(right));\n}\n\ntype ApiModuleNode = {\n pathParts: string[];\n children: Map<string, ApiModuleNode>;\n functions: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>;\n};\n\nfunction renderGeneratedApiInterfaces(\n functionEntries: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>\n): string[] {\n const root = buildApiModuleTree(functionEntries);\n return renderGeneratedApiInterfaceNode(root);\n}\n\nfunction renderGeneratedApiInterfaceNode(node: ApiModuleNode): string[] {\n const childInterfaces = [...node.children.values()]\n .sort((left, right) =>\n left.pathParts.join(\"/\").localeCompare(right.pathParts.join(\"/\"))\n )\n .flatMap((child) => renderGeneratedApiInterfaceNode(child));\n\n const lines = [\n `/**`,\n ` * ${renderApiInterfaceDescription(node)}`,\n ` */`,\n `export interface ${renderApiInterfaceName(node)} {`\n ];\n\n for (const child of [...node.children.values()].sort((left, right) =>\n left.pathParts.join(\"/\").localeCompare(right.pathParts.join(\"/\"))\n )) {\n lines.push(\n ` /**`,\n ` * ${renderApiModulePropertyDescription(child)}`,\n ` */`,\n ` readonly ${renderPropertyKey(child.pathParts.at(-1) ?? \"\")}: ${renderApiInterfaceName(child)};`\n );\n }\n\n for (const entry of [...node.functions].sort((left, right) =>\n left.exportName.localeCompare(right.exportName)\n )) {\n lines.push(\n ` /**`,\n ` * ${renderApiFunctionPropertyDescription(entry)}`,\n ` */`,\n ` readonly ${renderPropertyKey(entry.exportName)}: FunctionReferenceFor<typeof ${renderFunctionImportName(entry)}>;`\n );\n }\n\n lines.push(`}`);\n return [...childInterfaces, lines.join(\"\\n\")];\n}\n\nfunction renderApiObject(\n functionEntries: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>\n): string {\n const root = buildApiModuleTree(functionEntries);\n return renderApiObjectNode(root);\n}\n\nfunction renderApiObjectNode(node: ApiModuleNode): string {\n const properties: string[] = [];\n\n for (const child of [...node.children.values()].sort((left, right) =>\n left.pathParts.join(\"/\").localeCompare(right.pathParts.join(\"/\"))\n )) {\n properties.push(\n `${renderPropertyKey(child.pathParts.at(-1) ?? \"\")}: ${renderApiObjectNode(child)}`\n );\n }\n\n for (const entry of [...node.functions].sort((left, right) =>\n left.exportName.localeCompare(right.exportName)\n )) {\n properties.push(\n `${renderPropertyKey(entry.exportName)}: createFunctionReferenceFor<typeof ${renderFunctionImportName(entry)}>(\"${entry.kind}\", \"${entry.pathParts.join(\"/\")}/${entry.exportName}\")`\n );\n }\n\n return `{ ${properties.join(\", \")} }`;\n}\n\nfunction buildApiModuleTree(\n functionEntries: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>\n): ApiModuleNode {\n const root: ApiModuleNode = {\n pathParts: [],\n children: new Map(),\n functions: []\n };\n\n for (const entry of functionEntries) {\n let cursor = root;\n for (const segment of entry.pathParts) {\n let child = cursor.children.get(segment);\n if (!child) {\n child = {\n pathParts: [...cursor.pathParts, segment],\n children: new Map(),\n functions: []\n };\n cursor.children.set(segment, child);\n }\n cursor = child;\n }\n cursor.functions.push(entry);\n }\n\n return root;\n}\n\nfunction renderGeneratedFunctionsInterface(\n functionEntries: ScannedFunctionEntry[]\n): string[] {\n const lines = [\n `/**`,\n ` * Type-safe runtime definitions for every function exported from \\`syncore/functions\\`.`,\n ` */`,\n `export interface SyncoreRootFunctionsRegistry extends SyncoreFunctionRegistry {`\n ];\n\n for (const entry of functionEntries\n .slice()\n .sort((left, right) =>\n `${left.pathParts.join(\"/\")}/${left.exportName}`.localeCompare(\n `${right.pathParts.join(\"/\")}/${right.exportName}`\n )\n )) {\n lines.push(\n ` /**`,\n ` * Runtime definition for the public Syncore ${entry.kind} \\`${entry.pathParts.join(\"/\")}/${entry.exportName}\\`.`,\n ` */`,\n ` readonly ${JSON.stringify(`${entry.pathParts.join(\"/\")}/${entry.exportName}`)}: typeof ${renderFunctionImportName(entry)};`\n );\n }\n\n lines.push(`}`);\n return [lines.join(\"\\n\")];\n}\n\nfunction renderGeneratedManifestImportLines(\n hasComponentsManifest: boolean,\n extension: \"\" | \".js\"\n): string[] {\n if (!hasComponentsManifest) {\n return [];\n }\n return [`import componentsManifest from \"../components${extension}\";`];\n}\n\nfunction renderGeneratedManifestDeclarationLines(\n hasComponentsManifest: boolean\n): string[] {\n return hasComponentsManifest\n ? []\n : [`const componentsManifest = {} as const;`];\n}\n\nfunction renderApiInterfaceName(node: ApiModuleNode): string {\n if (node.pathParts.length === 0) {\n return \"SyncoreApi\";\n }\n return `SyncoreApi__${node.pathParts.map(toTypeNamePart).join(\"__\")}`;\n}\n\nfunction renderApiInterfaceDescription(node: ApiModuleNode): string {\n if (node.pathParts.length === 0) {\n return \"Type-safe references to every public Syncore function in this app.\";\n }\n\n if (node.children.size === 0) {\n return `Type-safe references to functions exported from \\`syncore/functions/${node.pathParts.join(\"/\")}.ts\\`.`;\n }\n\n return `Type-safe references to functions grouped under \\`syncore/functions/${node.pathParts.join(\"/\")}/*\\`.`;\n}\n\nfunction renderApiModulePropertyDescription(node: ApiModuleNode): string {\n if (node.children.size === 0) {\n return `Functions exported from \\`syncore/functions/${node.pathParts.join(\"/\")}.ts\\`.`;\n }\n return `Functions grouped under \\`syncore/functions/${node.pathParts.join(\"/\")}/*\\`.`;\n}\n\nfunction renderApiFunctionPropertyDescription(entry: {\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n}): string {\n return `Reference to the public Syncore ${entry.kind} \\`${entry.pathParts.join(\"/\")}/${entry.exportName}\\`.`;\n}\n\nfunction renderPropertyKey(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/u.test(key) ? key : JSON.stringify(key);\n}\n\nfunction toTypeNamePart(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9_$]/g, \"_\");\n return /^[0-9]/u.test(sanitized) ? `_${sanitized}` : sanitized;\n}\n\nfunction renderFunctionImports(\n functionEntries: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>,\n extension: \"\" | \".js\"\n): string[] {\n return functionEntries\n .slice()\n .sort((left, right) =>\n `${left.pathParts.join(\"/\")}/${left.exportName}`.localeCompare(\n `${right.pathParts.join(\"/\")}/${right.exportName}`\n )\n )\n .map((entry) => {\n const relativePath = `../functions/${entry.pathParts.join(\"/\")}${extension}`;\n return `import { ${entry.exportName} as ${renderFunctionImportName(entry)} } from ${JSON.stringify(relativePath)};`;\n });\n}\n\nfunction renderFunctionTypeImports(\n functionEntries: Array<{\n pathParts: string[];\n exportName: string;\n kind: \"query\" | \"mutation\" | \"action\";\n }>,\n extension: \"\" | \".js\"\n): string[] {\n return renderFunctionImports(functionEntries, extension).map((line) =>\n line.replace(/^import \\{/, \"import type {\")\n );\n}\n\nfunction renderFunctionImportName(entry: {\n pathParts: string[];\n exportName: string;\n}): string {\n return [\n ...entry.pathParts.map((segment) =>\n segment.replace(/[^a-zA-Z0-9_$]/g, \"_\")\n ),\n entry.exportName\n ].join(\"__\");\n}\n\nexport function resolveProjectTargetConfig(\n config: SyncoreConfig\n): SyncoreProjectTargetConfig | null {\n if (\n config.projectTarget &&\n typeof config.projectTarget === \"object\" &&\n typeof config.projectTarget.databasePath === \"string\" &&\n typeof config.projectTarget.storageDirectory === \"string\"\n ) {\n return config.projectTarget;\n }\n\n if (\n typeof config.databasePath === \"string\" &&\n typeof config.storageDirectory === \"string\"\n ) {\n return {\n databasePath: config.databasePath,\n storageDirectory: config.storageDirectory\n };\n }\n\n return null;\n}\n\nexport async function loadProjectConfig(cwd: string): Promise<SyncoreConfig> {\n const filePath = path.join(cwd, \"syncore.config.ts\");\n const config = await loadDefaultExport<SyncoreConfig>(filePath);\n if (!config || typeof config !== \"object\") {\n throw new Error(\n \"syncore.config.ts must default export a Syncore config object.\"\n );\n }\n const projectTarget = resolveProjectTargetConfig(config);\n return projectTarget ? { ...config, projectTarget } : config;\n}\n\nfunction requireProjectTargetConfig(\n config: SyncoreConfig\n): SyncoreProjectTargetConfig {\n const projectTarget = resolveProjectTargetConfig(config);\n if (!projectTarget) {\n throw new Error(\n \"This Syncore project does not define a projectTarget. Use a connected client target instead.\"\n );\n }\n return projectTarget;\n}\n\nexport async function loadProjectRootSchema(\n cwd: string\n): Promise<SyncoreSchema<Record<string, AnyTableDefinition>>> {\n const filePath = path.join(cwd, \"syncore\", \"schema.ts\");\n const schema =\n await loadDefaultExport<SyncoreSchema<Record<string, AnyTableDefinition>>>(\n filePath\n );\n if (\n !schema ||\n typeof schema !== \"object\" ||\n typeof schema.tableNames !== \"function\"\n ) {\n throw new Error(\"syncore/schema.ts must default export defineSchema(...).\");\n }\n return schema;\n}\n\nexport async function loadProjectComponentsManifest(\n cwd: string\n): Promise<Record<string, unknown>> {\n const filePath = path.join(cwd, \"syncore\", \"components.ts\");\n if (!(await fileExists(filePath))) {\n return {};\n }\n\n const manifest = await loadDefaultExport<Record<string, unknown>>(filePath);\n if (!manifest || typeof manifest !== \"object\" || Array.isArray(manifest)) {\n throw new Error(\n \"syncore/components.ts must default export defineComponents({...}).\"\n );\n }\n return manifest;\n}\n\nexport async function loadProjectSchema(\n cwd: string\n): Promise<SyncoreSchema<Record<string, AnyTableDefinition>>> {\n const filePath = path.join(cwd, \"syncore\", \"_generated\", \"schema.ts\");\n if (!(await fileExists(filePath))) {\n await runCodegen(cwd);\n }\n const schema =\n await loadDefaultExport<SyncoreSchema<Record<string, AnyTableDefinition>>>(\n filePath\n );\n if (\n !schema ||\n typeof schema !== \"object\" ||\n typeof schema.tableNames !== \"function\"\n ) {\n throw new Error(\n \"syncore/_generated/schema.ts must default export a composed Syncore schema.\"\n );\n }\n return schema;\n}\n\nasync function loadDefaultExport<TValue>(filePath: string): Promise<TValue> {\n if (!(await fileExists(filePath))) {\n throw new Error(`Missing file: ${path.relative(process.cwd(), filePath)}`);\n }\n const loaded = (await loadTypeScriptModule(filePath)) as { default?: TValue };\n if (!(\"default\" in loaded)) {\n throw new Error(\n `File ${path.relative(process.cwd(), filePath)} must have a default export.`\n );\n }\n const resolvedDefault = unwrapDefaultExport(loaded.default);\n if (resolvedDefault === undefined) {\n throw new Error(\n `File ${path.relative(process.cwd(), filePath)} exported undefined.`\n );\n }\n return resolvedDefault;\n}\n\nasync function loadNamedExport<TValue>(\n filePath: string,\n exportName: string\n): Promise<TValue> {\n if (!(await fileExists(filePath))) {\n throw new Error(`Missing file: ${path.relative(process.cwd(), filePath)}`);\n }\n const loaded = (await loadTypeScriptModule(filePath)) as Record<\n string,\n TValue | undefined\n >;\n const defaultExport =\n loaded.default &&\n typeof loaded.default === \"object\" &&\n exportName in (loaded.default as Record<string, unknown>)\n ? (loaded.default as Record<string, TValue | undefined>)[exportName]\n : undefined;\n if (!(exportName in loaded) && defaultExport === undefined) {\n throw new Error(\n `File ${path.relative(process.cwd(), filePath)} must export ${exportName}.`\n );\n }\n const resolvedValue = unwrapDefaultExport(\n loaded[exportName] ?? defaultExport\n );\n if (resolvedValue === undefined) {\n throw new Error(\n `File ${path.relative(process.cwd(), filePath)} exported undefined for ${exportName}.`\n );\n }\n return resolvedValue;\n}\n\nasync function hasNonEmptyComponentsManifest(\n filePath: string\n): Promise<boolean> {\n if (!(await fileExists(filePath))) {\n return false;\n }\n const source = await readFile(filePath, \"utf8\");\n return !/defineComponents\\s*\\(\\s*\\{\\s*\\}\\s*\\)/.test(source);\n}\n\nasync function loadTypeScriptModule(\n filePath: string\n): Promise<Record<string, unknown>> {\n const fileStat = await stat(filePath);\n const cached = loadedTypeScriptModules.get(filePath);\n if (cached && cached.mtimeMs === fileStat.mtimeMs) {\n return await cached.loaded;\n }\n\n const moduleUrl = pathToFileURL(filePath).href;\n const loaded = tsImport(moduleUrl, {\n parentURL: import.meta.url\n }) as Promise<Record<string, unknown>>;\n loadedTypeScriptModules.set(filePath, {\n mtimeMs: fileStat.mtimeMs,\n loaded\n });\n return await loaded;\n}\n\nexport async function loadProjectFunctions(\n cwd: string\n): Promise<SyncoreFunctionRegistry> {\n const filePath = path.join(cwd, \"syncore\", \"_generated\", \"functions.ts\");\n if (!(await fileExists(filePath))) {\n await runCodegen(cwd);\n }\n const functions = await loadNamedExport<SyncoreFunctionRegistry>(\n filePath,\n \"functions\"\n );\n if (!functions || typeof functions !== \"object\") {\n throw new Error(\n \"syncore/_generated/functions.ts must export a functions registry.\"\n );\n }\n return functions;\n}\n\nexport async function loadProjectResolvedComponents(\n cwd: string\n): Promise<SyncoreResolvedComponents> {\n const componentsManifestPath = path.join(cwd, \"syncore\", \"components.ts\");\n if (await fileExists(componentsManifestPath)) {\n const source = await readFile(componentsManifestPath, \"utf8\");\n if (/defineComponents\\s*\\(\\s*\\{\\s*\\}\\s*\\)/.test(source)) {\n return [];\n }\n }\n\n const filePath = path.join(cwd, \"syncore\", \"_generated\", \"components.ts\");\n if (!(await fileExists(filePath))) {\n await runCodegen(cwd);\n }\n const components = await loadNamedExport<SyncoreResolvedComponents>(\n filePath,\n \"resolvedComponents\"\n );\n if (!Array.isArray(components)) {\n throw new Error(\n \"syncore/_generated/components.ts must export resolvedComponents.\"\n );\n }\n return components;\n}\n\nexport async function loadProjectRuntime(cwd: string): Promise<{\n schema: SyncoreSchema<Record<string, AnyTableDefinition>>;\n functions: SyncoreFunctionRegistry;\n components: SyncoreResolvedComponents;\n}> {\n const filePath = path.join(cwd, \"syncore\", \"_generated\", \"runtime.ts\");\n if (!(await fileExists(filePath))) {\n await runCodegen(cwd);\n }\n const loaded = await loadTypeScriptModule(filePath);\n const schema = unwrapDefaultExport(loaded.schema) as\n | SyncoreSchema<Record<string, AnyTableDefinition>>\n | undefined;\n const functions = unwrapDefaultExport(loaded.functions) as\n | SyncoreFunctionRegistry\n | undefined;\n const components = unwrapDefaultExport(loaded.components) as\n | SyncoreResolvedComponents\n | undefined;\n\n if (\n !schema ||\n typeof schema !== \"object\" ||\n typeof schema.tableNames !== \"function\"\n ) {\n throw new Error(\n \"syncore/_generated/runtime.ts must export a composed Syncore schema.\"\n );\n }\n if (!functions || typeof functions !== \"object\") {\n throw new Error(\n \"syncore/_generated/runtime.ts must export a functions registry.\"\n );\n }\n if (!Array.isArray(components)) {\n throw new Error(\n \"syncore/_generated/runtime.ts must export resolved components.\"\n );\n }\n return { schema, functions, components };\n}\n\ninterface ProjectTargetBackend {\n hello: Extract<SyncoreDevtoolsMessage, { type: \"hello\" }>;\n handleCommand(\n payload: SyncoreDevtoolsCommandPayload\n ): Promise<SyncoreDevtoolsCommandResultPayload>;\n subscribe(\n subscriptionId: string,\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: (payload: SyncoreDevtoolsSubscriptionResultPayload) => void\n ): Promise<void>;\n unsubscribe(subscriptionId: string): void;\n dispose(): Promise<void>;\n}\n\ninterface StorageAccessTicket {\n id: string;\n runtimeId: string;\n storageId: string;\n purpose: \"preview\" | \"download\";\n entry: StorageEntry;\n supportsRange: boolean;\n expiresAt: number;\n}\n\ninterface PendingHubCommand {\n resolve(payload: SyncoreDevtoolsCommandResultPayload): void;\n reject(error: Error): void;\n timeout: ReturnType<typeof setTimeout>;\n}\n\nclass HubExternalChangeSignal implements SyncoreExternalChangeSignal {\n private readonly listeners = new Set<\n (event: SyncoreExternalChangeEvent) => void\n >();\n\n constructor(\n private readonly publishToHub: (\n event: SyncoreExternalChangeEvent\n ) => void | Promise<void>\n ) {}\n\n subscribe(listener: (event: SyncoreExternalChangeEvent) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n publish(event: SyncoreExternalChangeEvent): void | Promise<void> {\n return this.publishToHub(event);\n }\n\n receive(event: SyncoreExternalChangeEvent): void {\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n\n close(): void {\n this.listeners.clear();\n }\n}\n\nclass HubSqliteDriver implements SyncoreSqlDriver {\n private readonly database: DatabaseSync;\n private transactionDepth = 0;\n\n constructor(readonly databasePath: string) {\n this.database = new DatabaseSync(databasePath);\n this.database.exec(\"PRAGMA foreign_keys = ON;\");\n this.database.exec(\"PRAGMA journal_mode = WAL;\");\n }\n\n async exec(sql: string): Promise<void> {\n this.database.exec(sql);\n }\n\n async run(\n sql: string,\n params: unknown[] = []\n ): Promise<{ changes: number; lastInsertRowid?: number | string }> {\n const result = this.database.prepare(sql).run(...toSqlParameters(params));\n return {\n changes: Number(result.changes ?? 0),\n lastInsertRowid:\n typeof result.lastInsertRowid === \"bigint\"\n ? Number(result.lastInsertRowid)\n : result.lastInsertRowid\n };\n }\n\n async get<T>(sql: string, params: unknown[] = []): Promise<T | undefined> {\n return this.database.prepare(sql).get(...toSqlParameters(params)) as\n | T\n | undefined;\n }\n\n async all<T>(sql: string, params: unknown[] = []): Promise<T[]> {\n return this.database.prepare(sql).all(...toSqlParameters(params)) as T[];\n }\n\n async withTransaction<T>(callback: () => Promise<T>): Promise<T> {\n if (this.transactionDepth > 0) {\n return this.withSavepoint(`nested_${this.transactionDepth}`, callback);\n }\n this.transactionDepth += 1;\n this.database.exec(\"BEGIN\");\n try {\n const result = await callback();\n this.database.exec(\"COMMIT\");\n return result;\n } catch (error) {\n this.database.exec(\"ROLLBACK\");\n throw error;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n async withSavepoint<T>(name: string, callback: () => Promise<T>): Promise<T> {\n const safeName = name.replaceAll(/[^a-zA-Z0-9_]/g, \"_\");\n this.database.exec(`SAVEPOINT ${safeName}`);\n try {\n const result = await callback();\n this.database.exec(`RELEASE SAVEPOINT ${safeName}`);\n return result;\n } catch (error) {\n this.database.exec(`ROLLBACK TO SAVEPOINT ${safeName}`);\n this.database.exec(`RELEASE SAVEPOINT ${safeName}`);\n throw error;\n }\n }\n\n async close(): Promise<void> {\n this.database.close();\n }\n}\n\nclass HubFileStorageAdapter implements SyncoreStorageAdapter {\n constructor(private readonly directory: string) {}\n\n private filePath(id: string): string {\n return path.join(this.directory, id);\n }\n\n async put(id: string, input: StorageWriteInput): Promise<StorageObject> {\n await mkdir(this.directory, { recursive: true });\n const filePath = this.filePath(id);\n const bytes = normalizeStorageInput(input.data);\n await writeFile(filePath, bytes);\n return {\n id,\n path: filePath,\n size: bytes.byteLength,\n contentType: input.contentType ?? null\n };\n }\n\n async get(id: string): Promise<StorageObject | null> {\n const filePath = this.filePath(id);\n try {\n const info = await stat(filePath);\n return {\n id,\n path: filePath,\n size: info.size,\n contentType: null\n };\n } catch {\n return null;\n }\n }\n\n async read(id: string): Promise<Uint8Array | null> {\n try {\n return await readFile(this.filePath(id));\n } catch {\n return null;\n }\n }\n\n async readRange(\n id: string,\n offset: number,\n length: number\n ): Promise<Uint8Array | null> {\n let handle;\n try {\n handle = await open(this.filePath(id), \"r\");\n const buffer = Buffer.alloc(Math.max(length, 0));\n const result = await handle.read(\n buffer,\n 0,\n buffer.byteLength,\n Math.max(offset, 0)\n );\n return buffer.subarray(0, result.bytesRead);\n } catch {\n return null;\n } finally {\n await handle?.close();\n }\n }\n\n async delete(id: string): Promise<void> {\n await rm(this.filePath(id), { force: true });\n }\n\n async list(): Promise<StorageObject[]> {\n try {\n const entries = await readdir(this.directory, { withFileTypes: true });\n return Promise.all(\n entries\n .filter((entry) => entry.isFile())\n .map(async (entry) => {\n const filePath = this.filePath(entry.name);\n const info = await stat(filePath);\n return {\n id: entry.name,\n path: filePath,\n size: info.size,\n contentType: null\n } satisfies StorageObject;\n })\n );\n } catch {\n return [];\n }\n }\n}\n\nconst hubDevtoolsSqlSupport: DevtoolsSqlSupport = {\n analyzeSqlStatement(query: string): DevtoolsSqlAnalysis {\n const normalized = query.trim().replace(/^\\(+/, \"\").toUpperCase();\n const firstKeyword = normalized.split(/\\s+/, 1)[0] ?? \"\";\n if (\n firstKeyword === \"SELECT\" ||\n firstKeyword === \"WITH\" ||\n firstKeyword === \"PRAGMA\" ||\n firstKeyword === \"EXPLAIN\"\n ) {\n return {\n mode: \"read\",\n readTables: [],\n writeTables: [],\n schemaChanged: false,\n observedScopes: [\"all\"]\n };\n }\n if (\n firstKeyword === \"INSERT\" ||\n firstKeyword === \"UPDATE\" ||\n firstKeyword === \"DELETE\" ||\n firstKeyword === \"REPLACE\"\n ) {\n return {\n mode: \"write\",\n readTables: [],\n writeTables: [],\n schemaChanged: false,\n observedScopes: [\"all\"]\n };\n }\n if (\n firstKeyword === \"CREATE\" ||\n firstKeyword === \"DROP\" ||\n firstKeyword === \"ALTER\"\n ) {\n return {\n mode: \"ddl\",\n readTables: [],\n writeTables: [],\n schemaChanged: true,\n observedScopes: [\"all\", \"schema.tables\"]\n };\n }\n throw new Error(\n `Unsupported SQL statement type: ${firstKeyword || \"unknown\"}`\n );\n },\n ensureSqlMode(analysis, expected): void {\n if (expected === \"watch\") {\n if (analysis.mode !== \"read\") {\n throw new Error(\"Live mode supports read-only SQL only.\");\n }\n return;\n }\n if (analysis.mode !== expected) {\n if (expected === \"read\") {\n throw new Error(\"Use SQL Write for mutating statements.\");\n }\n throw new Error(\"Use SQL Read or SQL Live for read-only statements.\");\n }\n },\n runReadonlyQuery(databasePath: string, query: string): DevtoolsSqlReadResult {\n const analysis = this.analyzeSqlStatement(query);\n this.ensureSqlMode(analysis, \"read\");\n const database = new DatabaseSync(databasePath, { readOnly: true });\n try {\n const statement = database.prepare(query);\n const rows = statement.all() as Array<Record<string, unknown>>;\n const columns = statement.columns().map((column) => column.name);\n return {\n columns,\n rows: rows.map((row) => columns.map((column) => row[column])),\n observedTables: []\n };\n } finally {\n database.close();\n }\n }\n};\n\nasync function createProjectTargetBackend(\n cwd: string,\n externalChangeSignal?: SyncoreExternalChangeSignal\n): Promise<ProjectTargetBackend | null> {\n const config = await loadProjectConfig(cwd);\n const projectTarget = resolveProjectTargetConfig(config);\n if (!projectTarget) {\n return null;\n }\n\n const { schema, functions, components } = await loadProjectRuntime(cwd);\n const databasePath = path.resolve(cwd, projectTarget.databasePath);\n const storageDirectory = path.resolve(cwd, projectTarget.storageDirectory);\n await mkdir(path.dirname(databasePath), { recursive: true });\n await mkdir(storageDirectory, { recursive: true });\n\n const driver = new HubSqliteDriver(databasePath);\n const runtime = new SyncoreRuntime({\n schema,\n functions,\n components,\n driver,\n storage: new HubFileStorageAdapter(storageDirectory),\n platform: \"project\",\n runtimeCapabilities: {\n storage: {\n available: true,\n protocol: \"file\",\n supportsRange: true\n }\n },\n ...(externalChangeSignal ? { externalChangeSignal } : {})\n });\n await runtime.start();\n\n const commandHandler = createDevtoolsCommandHandler({\n driver,\n schema,\n functions,\n admin: runtime.getAdmin(),\n sql: hubDevtoolsSqlSupport\n });\n const subscriptionHost = createDevtoolsSubscriptionHost({\n driver,\n schema,\n functions,\n admin: runtime.getAdmin(),\n sql: hubDevtoolsSqlSupport\n });\n\n return {\n hello: {\n type: \"hello\",\n protocolVersion: SYNCORE_DEVTOOLS_PROTOCOL_VERSION,\n minSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION,\n maxSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION,\n runtimeId: PROJECT_TARGET_RUNTIME_ID,\n platform: \"project\",\n sessionLabel: \"Project Target\",\n targetKind: \"project\",\n runtimeRole: \"project-target\",\n storageProtocol: \"file\",\n databaseLabel: path.basename(databasePath),\n storageIdentity: `file::${databasePath}`,\n capabilities: createProjectDevtoolsCapabilities()\n },\n handleCommand: commandHandler,\n subscribe(subscriptionId, payload, listener) {\n return subscriptionHost.subscribe(subscriptionId, payload, listener);\n },\n unsubscribe(subscriptionId) {\n subscriptionHost.unsubscribe(subscriptionId);\n },\n async dispose() {\n subscriptionHost.dispose();\n await runtime.stop();\n }\n };\n}\n\nfunction createProjectDevtoolsCapabilities(): SyncoreDevtoolsCapabilities {\n return {\n sql: {\n read: true,\n write: true,\n live: true\n },\n data: {\n browse: true,\n mutate: true,\n importExport: true\n },\n storage: {\n browse: true,\n download: true,\n readRange: true,\n delete: true,\n maxPreviewBytes: 80_000\n },\n scheduler: {\n read: true,\n edit: true\n }\n };\n}\n\nfunction normalizeStorageInput(input: StorageWriteInput[\"data\"]): Uint8Array {\n if (typeof input === \"string\") {\n return Buffer.from(input);\n }\n if (input instanceof Uint8Array) {\n return input;\n }\n return new Uint8Array(input);\n}\n\nfunction toSqlParameters(params: unknown[]): SQLInputValue[] {\n return params.map((value) => {\n if (value instanceof Uint8Array) {\n return Buffer.from(value);\n }\n return value as SQLInputValue;\n });\n}\n\nexport async function readStoredSnapshot(\n cwd: string\n): Promise<SchemaSnapshot | null> {\n const snapshotPath = path.join(\n cwd,\n \"syncore\",\n \"migrations\",\n SYNCORE_MIGRATION_SNAPSHOT_FILE_NAME\n );\n if (!(await fileExists(snapshotPath))) {\n return null;\n }\n return parseSchemaSnapshot(await readFile(snapshotPath, \"utf8\"));\n}\n\nexport async function writeStoredSnapshot(\n cwd: string,\n snapshot: SchemaSnapshot\n): Promise<void> {\n const migrationsDirectory = path.join(cwd, \"syncore\", \"migrations\");\n await mkdir(migrationsDirectory, { recursive: true });\n await writeFile(\n path.join(migrationsDirectory, SYNCORE_MIGRATION_SNAPSHOT_FILE_NAME),\n `${JSON.stringify(snapshot, null, 2)}\\n`\n );\n}\n\nexport async function getNextMigrationNumber(\n directory: string\n): Promise<number> {\n if (!(await fileExists(directory))) {\n return 1;\n }\n const migrationNumbers = (await readdir(directory))\n .map((name) => name.match(/^(\\d+)_.*\\.sql$/)?.[1])\n .filter((value): value is string => value !== undefined)\n .map((value) => Number.parseInt(value, 10));\n\n if (migrationNumbers.length === 0) {\n return 1;\n }\n return Math.max(...migrationNumbers) + 1;\n}\n\nexport async function applyProjectMigrations(cwd: string): Promise<number> {\n const config = await loadProjectConfig(cwd);\n const projectTarget = requireProjectTargetConfig(config);\n const databasePath = path.resolve(cwd, projectTarget.databasePath);\n const storageDirectory = path.resolve(cwd, projectTarget.storageDirectory);\n await mkdir(path.dirname(databasePath), { recursive: true });\n await mkdir(storageDirectory, { recursive: true });\n\n const database = new DatabaseSync(databasePath);\n ensureCliMigrationTrackingTable(database);\n\n const migrationsDirectory = path.join(cwd, \"syncore\", \"migrations\");\n if (!(await fileExists(migrationsDirectory))) {\n database.close();\n return 0;\n }\n\n const appliedRows = database\n .prepare(`SELECT id FROM \"_syncore_migrations\" ORDER BY id ASC`)\n .all() as Array<{ id: string }>;\n const appliedNames = new Set(appliedRows.map((row) => row.id));\n const migrationFiles = (await readdir(migrationsDirectory))\n .filter((name) => /\\.sql$/i.test(name))\n .sort((left, right) => left.localeCompare(right));\n\n let appliedCount = 0;\n\n for (const fileName of migrationFiles) {\n if (appliedNames.has(fileName)) {\n continue;\n }\n\n const sql = await readFile(\n path.join(migrationsDirectory, fileName),\n \"utf8\"\n );\n database.exec(\"BEGIN\");\n try {\n applyMigrationSql(database, sql, fileName);\n database\n .prepare(\n `INSERT OR REPLACE INTO \"_syncore_migrations\" (id, applied_at, sql) VALUES (?, ?, ?)`\n )\n .run(fileName, Date.now(), sql);\n database.exec(\"COMMIT\");\n appliedCount += 1;\n } catch (error) {\n database.exec(\"ROLLBACK\");\n database.close();\n throw error;\n }\n }\n\n database.close();\n return appliedCount;\n}\n\nfunction ensureCliMigrationTrackingTable(database: DatabaseSync): void {\n const tableExists =\n (\n database\n .prepare(\n `SELECT name FROM sqlite_master WHERE type = 'table' AND name = '_syncore_migrations'`\n )\n .get() as { name?: string } | undefined\n )?.name === \"_syncore_migrations\";\n\n if (!tableExists) {\n database.exec(`\n CREATE TABLE \"_syncore_migrations\" (\n id TEXT PRIMARY KEY,\n applied_at INTEGER NOT NULL,\n sql TEXT NOT NULL\n );\n `);\n return;\n }\n\n const columns = database\n .prepare(`PRAGMA table_info(\"_syncore_migrations\")`)\n .all() as Array<{ name: string }>;\n const columnNames = new Set(columns.map((column) => column.name));\n\n if (\n columnNames.has(\"id\") &&\n columnNames.has(\"applied_at\") &&\n columnNames.has(\"sql\")\n ) {\n return;\n }\n\n database.exec(`\n ALTER TABLE \"_syncore_migrations\" RENAME TO \"_syncore_migrations_legacy\";\n CREATE TABLE \"_syncore_migrations\" (\n id TEXT PRIMARY KEY,\n applied_at INTEGER NOT NULL,\n sql TEXT NOT NULL\n );\n `);\n\n if (columnNames.has(\"name\")) {\n database.exec(`\n INSERT INTO \"_syncore_migrations\" (id, applied_at, sql)\n SELECT\n name,\n CASE\n WHEN typeof(applied_at) = 'integer' THEN applied_at\n ELSE CAST(strftime('%s', applied_at) AS INTEGER) * 1000\n END,\n ''\n FROM \"_syncore_migrations_legacy\";\n `);\n }\n\n database.exec(`DROP TABLE \"_syncore_migrations_legacy\";`);\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function resolveFunctionImportExtension(\n cwd: string\n): Promise<\"\" | \".js\"> {\n const tsconfigFiles = (await readdir(cwd, { withFileTypes: true }))\n .filter(\n (entry) => entry.isFile() && /^tsconfig(\\..+)?\\.json$/u.test(entry.name)\n )\n .map((entry) => path.join(cwd, entry.name))\n .sort();\n\n for (const configPath of tsconfigFiles) {\n try {\n const source = await readFile(configPath, \"utf8\");\n const parsed = JSON.parse(source) as {\n compilerOptions?: {\n module?: string;\n moduleResolution?: string;\n };\n };\n const moduleResolution =\n parsed.compilerOptions?.moduleResolution?.toLowerCase();\n const moduleKind = parsed.compilerOptions?.module?.toLowerCase();\n if (\n moduleResolution === \"nodenext\" ||\n moduleResolution === \"node16\" ||\n moduleKind === \"nodenext\" ||\n moduleKind === \"node16\"\n ) {\n return \".js\";\n }\n } catch {\n // Ignore unreadable tsconfig variants and fall back to extensionless imports.\n }\n }\n\n // Bundler-based app toolchains such as Next and Vite resolve extensionless\n // TypeScript source imports reliably, while NodeNext projects need explicit\n // JavaScript specifiers for emitted ESM.\n return \"\";\n}\n\nexport function formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\nexport async function isLocalPortInUse(port: number): Promise<boolean> {\n return await new Promise((resolve) => {\n let settled = false;\n const socket = connectToNet({ host: \"127.0.0.1\", port });\n const finish = (inUse: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n socket.destroy();\n resolve(inUse);\n };\n const timeout = setTimeout(() => finish(false), 100);\n socket.once(\"connect\", () => {\n finish(true);\n });\n socket.once(\"error\", () => {\n finish(false);\n });\n });\n}\n\nexport function slugify(value: string): string {\n const slug = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return slug || \"auto\";\n}\n\nfunction applyMigrationSql(\n database: DatabaseSync,\n sql: string,\n fileName: string\n): void {\n const statements = sql\n .split(/;\\s*(?:\\r?\\n|$)/)\n .map((statement) => statement.trim())\n .filter(Boolean);\n\n for (const statement of statements) {\n try {\n database.exec(statement);\n } catch (error) {\n if (isUnsupportedFts5Statement(statement, error)) {\n console.warn(\n `Skipping FTS5 statement in ${fileName} because this SQLite build does not include FTS5 support.`\n );\n continue;\n }\n throw error;\n }\n }\n}\n\nexport async function startDevHub(options: {\n cwd: string;\n template: SyncoreTemplateName;\n}): Promise<DevHubSessionState> {\n const dashboardPort = resolvePortFromEnv(\"SYNCORE_DASHBOARD_PORT\", 4310);\n const devtoolsPort = resolvePortFromEnv(\"SYNCORE_DEVTOOLS_PORT\", 4311);\n const dashboardUrl = `http://localhost:${dashboardPort}`;\n const devtoolsUrl = `ws://127.0.0.1:${devtoolsPort}`;\n const logsDirectory = path.join(options.cwd, \".syncore\", \"logs\");\n const logFilePath = path.join(logsDirectory, \"runtime.jsonl\");\n const hubAccessToken =\n sanitizeDevtoolsToken(process.env.SYNCORE_DEVTOOLS_TOKEN) ??\n generateDevtoolsToken();\n const sessionState: DevHubSessionState = {\n dashboardUrl,\n authenticatedDashboardUrl: `${dashboardUrl}/?token=${hubAccessToken}`,\n devtoolsUrl,\n token: hubAccessToken\n };\n await mkdir(logsDirectory, { recursive: true });\n await writeFile(logFilePath, \"\");\n await runDevProjectBootstrap(options.cwd, options.template);\n await setupDevProjectWatch(options.cwd, options.template);\n\n if (await isLocalPortInUse(devtoolsPort)) {\n console.log(\n `Syncore devtools hub already running at ws://localhost:${devtoolsPort}. Reusing existing hub/dashboard.`\n );\n return (await readDevtoolsSessionState(options.cwd)) ?? sessionState;\n }\n await writeDevtoolsSessionState(options.cwd, sessionState);\n\n const httpServer = createServer((request, response) => {\n void handleStorageAccessHttpRequest(request, response).catch((error) => {\n if (!response.headersSent) {\n writeJsonResponse(response, 500, { error: formatError(error) });\n } else {\n response.destroy(error instanceof Error ? error : undefined);\n }\n });\n });\n const websocketServer = new WebSocketServer({ server: httpServer });\n const storageAccessTickets = new Map<string, StorageAccessTicket>();\n const pendingHubCommands = new Map<string, PendingHubCommand>();\n const runtimeSockets = new Map<string, WebSocket>();\n const runtimeHellos = new Map<\n string,\n Extract<SyncoreDevtoolsMessage, { type: \"hello\" }>\n >();\n const runtimeEvents = new Map<\n string,\n Array<Extract<SyncoreDevtoolsMessage, { type: \"event\" }>[\"event\"]>\n >();\n const socketRuntimeIds = new Map<WebSocket, Set<string>>();\n const dashboardSockets = new Set<WebSocket>();\n const dashboardSubscriptions = new Map<\n WebSocket,\n Map<string, { runtimeId: string; payload: SyncoreDevtoolsSubscribe }>\n >();\n let relayExternalChange: (\n sourceRuntimeId: string,\n storageIdentity: string,\n event: SyncoreExternalChangeEvent\n ) => void = () => {};\n const projectTargetExternalChangeSignal = new HubExternalChangeSignal(\n (event) =>\n relayExternalChange(\n PROJECT_TARGET_RUNTIME_ID,\n runtimeHellos.get(PROJECT_TARGET_RUNTIME_ID)?.storageIdentity ?? \"\",\n event\n )\n );\n let projectTargetBackend: ProjectTargetBackend | null = null;\n try {\n projectTargetBackend = await createProjectTargetBackend(\n options.cwd,\n projectTargetExternalChangeSignal\n );\n } catch (error) {\n console.warn(`Project target fallback unavailable: ${formatError(error)}`);\n }\n const hello: SyncoreDevtoolsMessage = {\n type: \"hello\",\n protocolVersion: SYNCORE_DEVTOOLS_PROTOCOL_VERSION,\n minSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MIN_SUPPORTED_PROTOCOL_VERSION,\n maxSupportedProtocolVersion:\n SYNCORE_DEVTOOLS_MAX_SUPPORTED_PROTOCOL_VERSION,\n runtimeId: \"syncore-dev-hub\",\n platform: \"dev\"\n };\n if (projectTargetBackend) {\n runtimeHellos.set(PROJECT_TARGET_RUNTIME_ID, projectTargetBackend.hello);\n runtimeEvents.set(PROJECT_TARGET_RUNTIME_ID, []);\n }\n relayExternalChange = (sourceRuntimeId, storageIdentity, event) => {\n if (!storageIdentity) {\n return;\n }\n const message = {\n type: \"external.change\",\n runtimeId: sourceRuntimeId,\n storageIdentity,\n event\n } satisfies SyncoreDevtoolsMessage;\n\n for (const [runtimeId, runtimeHello] of runtimeHellos) {\n if (\n runtimeId === sourceRuntimeId ||\n runtimeHello.storageIdentity !== storageIdentity\n ) {\n continue;\n }\n if (runtimeId === PROJECT_TARGET_RUNTIME_ID) {\n projectTargetExternalChangeSignal.receive(event);\n continue;\n }\n const targetSocket = runtimeSockets.get(runtimeId);\n if (targetSocket?.readyState === WebSocket.OPEN) {\n targetSocket.send(JSON.stringify(message));\n }\n }\n };\n const appendHubLog = async (\n event: Extract<SyncoreDevtoolsMessage, { type: \"event\" }>[\"event\"]\n ) => {\n const runtimeHello = runtimeHellos.get(event.runtimeId);\n const clientRuntimeIds = [...runtimeHellos.values()]\n .filter((hello) => hello.runtimeId !== \"syncore-dev-hub\")\n .map((hello) => hello.runtimeId)\n .sort();\n const clientTargetKeys = [...runtimeHellos.values()]\n .filter((hello) => hello.runtimeId !== \"syncore-dev-hub\")\n .map((hello) => hello.storageIdentity ?? `runtime::${hello.runtimeId}`)\n .sort();\n const targetIdentity =\n runtimeHello?.storageIdentity ?? `runtime::${event.runtimeId}`;\n const targetId =\n event.runtimeId === \"syncore-dev-hub\"\n ? \"all\"\n : createPublicTargetId(targetIdentity, clientTargetKeys);\n const publicRuntimeId =\n event.runtimeId === \"syncore-dev-hub\"\n ? undefined\n : createPublicRuntimeId(event.runtimeId, clientRuntimeIds);\n const category =\n event.type === \"query.executed\"\n ? \"query\"\n : event.type === \"mutation.committed\"\n ? \"mutation\"\n : event.type === \"action.completed\"\n ? \"action\"\n : \"system\";\n const message =\n event.type === \"log\"\n ? event.message\n : event.type === \"query.executed\" ||\n event.type === \"mutation.committed\" ||\n event.type === \"action.completed\"\n ? event.functionName\n : event.type;\n await appendFile(\n logFilePath,\n `${JSON.stringify({\n version: 2,\n timestamp: event.timestamp,\n runtimeId: event.runtimeId,\n targetId,\n ...(publicRuntimeId ? { publicRuntimeId } : {}),\n ...(runtimeHello?.platform ? { platform: runtimeHello.platform } : {}),\n eventType: event.type,\n category,\n message,\n event\n })}\\n`\n );\n };\n\n const requestRuntimeCommand = async (\n targetRuntimeId: string,\n payload: SyncoreDevtoolsCommandPayload,\n timeoutMs = 30_000\n ): Promise<SyncoreDevtoolsCommandResultPayload> => {\n if (targetRuntimeId === PROJECT_TARGET_RUNTIME_ID && projectTargetBackend) {\n return projectTargetBackend.handleCommand(payload);\n }\n const target = runtimeSockets.get(targetRuntimeId);\n if (!target || target.readyState !== WebSocket.OPEN) {\n throw new Error(`Runtime ${targetRuntimeId} is not connected.`);\n }\n const commandId = `hub:${randomUUID()}`;\n return await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n pendingHubCommands.delete(commandId);\n reject(new Error(`Runtime command ${payload.kind} timed out.`));\n }, timeoutMs);\n pendingHubCommands.set(commandId, {\n resolve,\n reject,\n timeout\n });\n target.send(\n JSON.stringify({\n type: \"command\",\n commandId,\n targetRuntimeId,\n payload\n } satisfies SyncoreDevtoolsClientMessage)\n );\n });\n };\n\n const createStorageAccessTicket = async (\n targetRuntimeId: string,\n id: string,\n purpose: \"preview\" | \"download\"\n ): Promise<\n Extract<\n SyncoreDevtoolsCommandResultPayload,\n { kind: \"storage.access.create.result\" }\n >\n > => {\n const metadata = await requestRuntimeCommand(targetRuntimeId, {\n kind: \"storage.readRange\",\n id,\n offset: 0,\n length: 0\n });\n if (metadata.kind !== \"storage.readRange.result\") {\n return {\n kind: \"storage.access.create.result\",\n error: \"Runtime returned an unexpected storage access response.\"\n };\n }\n if (metadata.error || !metadata.entry) {\n return {\n kind: \"storage.access.create.result\",\n error: metadata.error ?? \"Storage object could not be accessed.\"\n };\n }\n const ticket = randomUUID();\n const expiresAt = Date.now() + STORAGE_ACCESS_TICKET_TTL_MS;\n storageAccessTickets.set(ticket, {\n id: ticket,\n runtimeId: targetRuntimeId,\n storageId: id,\n purpose,\n entry: metadata.entry,\n supportsRange: metadata.supportsRange,\n expiresAt\n });\n cleanupExpiredStorageTickets();\n return {\n kind: \"storage.access.create.result\",\n entry: metadata.entry,\n url: `http://127.0.0.1:${devtoolsPort}/storage/access/${ticket}`,\n expiresAt,\n supportsRange: metadata.supportsRange,\n maxPreviewBytes: STORAGE_ACCESS_MAX_PREVIEW_BYTES\n };\n };\n\n const cleanupExpiredStorageTickets = () => {\n const now = Date.now();\n for (const [ticket, access] of storageAccessTickets) {\n if (access.expiresAt <= now) {\n storageAccessTickets.delete(ticket);\n }\n }\n };\n\n const handleStorageAccessHttpRequest = async (\n request: IncomingMessage,\n response: ServerResponse\n ): Promise<void> => {\n setStorageCorsHeaders(response);\n if (request.method === \"OPTIONS\") {\n response.writeHead(204);\n response.end();\n return;\n }\n const requestUrl = new URL(\n request.url ?? \"/\",\n `http://127.0.0.1:${devtoolsPort}`\n );\n const match = /^\\/storage\\/access\\/([^/]+)$/.exec(requestUrl.pathname);\n if (!match) {\n writeJsonResponse(response, 200, { ok: true, wsPort: devtoolsPort });\n return;\n }\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n writeTextResponse(response, 405, \"Method not allowed.\");\n return;\n }\n cleanupExpiredStorageTickets();\n const ticket = storageAccessTickets.get(match[1]!);\n if (!ticket || ticket.expiresAt <= Date.now()) {\n writeTextResponse(\n response,\n 401,\n \"Storage access ticket is invalid or expired.\"\n );\n return;\n }\n\n const range = parseStorageRangeHeader(\n request.headers.range,\n ticket.entry.size\n );\n if (\"error\" in range) {\n writeTextResponse(response, range.status, range.error);\n return;\n }\n const start = range.start;\n const end = range.end;\n const byteLength = end >= start ? end - start + 1 : 0;\n if (\n !ticket.supportsRange &&\n ticket.entry.size > STORAGE_ACCESS_CHUNK_BYTES\n ) {\n writeTextResponse(\n response,\n 409,\n \"This storage backend does not support streaming large files.\"\n );\n return;\n }\n\n writeStorageAccessHeaders(response, ticket, {\n status: range.partial ? 206 : 200,\n start,\n end,\n byteLength\n });\n if (request.method === \"HEAD\") {\n response.end();\n return;\n }\n\n let offset = start;\n while (offset <= end) {\n const chunkLength = Math.min(\n STORAGE_ACCESS_CHUNK_BYTES,\n end - offset + 1\n );\n const chunk = await requestRuntimeCommand(\n ticket.runtimeId,\n {\n kind: \"storage.readRange\",\n id: ticket.storageId,\n offset,\n length: chunkLength\n },\n 60_000\n );\n if (chunk.kind !== \"storage.readRange.result\") {\n throw new Error(\n \"Runtime returned an unexpected storage chunk response.\"\n );\n }\n if (chunk.error || !chunk.base64) {\n throw new Error(chunk.error ?? \"Storage chunk could not be read.\");\n }\n const bytes = Buffer.from(chunk.base64, \"base64\");\n if (bytes.byteLength === 0) {\n break;\n }\n await writeResponseChunk(response, bytes);\n offset += bytes.byteLength;\n }\n response.end();\n };\n\n websocketServer.on(\"connection\", (socket: WebSocket, request) => {\n const isBrowserDashboardClient = isAllowedDashboardOrigin(\n request.headers.origin,\n dashboardPort\n );\n const isAuthorizedDashboardClient =\n !isBrowserDashboardClient ||\n isAuthorizedDashboardRequest({\n requestUrl: request.url,\n originHeader: request.headers.origin,\n dashboardPort,\n expectedToken: hubAccessToken\n });\n if (isBrowserDashboardClient && !isAuthorizedDashboardClient) {\n socket.close(1008, \"Unauthorized devtools client\");\n return;\n }\n dashboardSockets.add(socket);\n socket.send(JSON.stringify(hello));\n for (const runtimeHello of runtimeHellos.values()) {\n socket.send(JSON.stringify(runtimeHello));\n }\n for (const [runtimeId, history] of runtimeEvents) {\n if (!runtimeHellos.has(runtimeId)) {\n continue;\n }\n if (history.length === 0) {\n continue;\n }\n socket.send(\n JSON.stringify({\n type: \"event.batch\",\n runtimeId,\n events: [...history]\n })\n );\n }\n\n socket.on(\"message\", (payload) => {\n const rawPayload = decodeWebSocketPayload(payload);\n if (rawPayload.length === 0) {\n return;\n }\n const message = JSON.parse(rawPayload) as\n | SyncoreDevtoolsMessage\n | (SyncoreDevtoolsClientMessage & { targetRuntimeId?: string });\n if (message.type === \"ping\") {\n if (!isAuthorizedDashboardClient) {\n socket.close(1008, \"Unauthorized devtools client\");\n return;\n }\n socket.send(\n JSON.stringify({ type: \"pong\" } satisfies SyncoreDevtoolsMessage)\n );\n return;\n }\n if (message.type === \"external.change\") {\n const runtimeHello = runtimeHellos.get(message.runtimeId);\n const storageIdentity =\n runtimeHello?.storageIdentity ?? message.storageIdentity;\n if (storageIdentity && storageIdentity === message.storageIdentity) {\n relayExternalChange(\n message.runtimeId,\n storageIdentity,\n message.event as SyncoreExternalChangeEvent\n );\n }\n return;\n }\n if (message.type === \"command\") {\n if (!isAuthorizedDashboardClient) {\n return;\n }\n const targetRuntimeId = message.targetRuntimeId;\n if (!targetRuntimeId) {\n return;\n }\n if (message.payload.kind === \"storage.access.create\") {\n void createStorageAccessTicket(\n targetRuntimeId,\n message.payload.id,\n message.payload.purpose\n )\n .then((payload) => {\n if (socket.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(\n JSON.stringify({\n type: \"command.result\",\n commandId: message.commandId,\n runtimeId: targetRuntimeId,\n payload\n } satisfies SyncoreDevtoolsMessage)\n );\n })\n .catch((error) => {\n if (socket.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(\n JSON.stringify({\n type: \"command.result\",\n commandId: message.commandId,\n runtimeId: targetRuntimeId,\n payload: {\n kind: \"storage.access.create.result\",\n error: formatError(error)\n }\n } satisfies SyncoreDevtoolsMessage)\n );\n });\n return;\n }\n if (\n targetRuntimeId === PROJECT_TARGET_RUNTIME_ID &&\n projectTargetBackend\n ) {\n void (async () => {\n const payload = await projectTargetBackend.handleCommand(\n message.payload\n );\n if (socket.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(\n JSON.stringify({\n type: \"command.result\",\n commandId: message.commandId,\n runtimeId: PROJECT_TARGET_RUNTIME_ID,\n payload\n } satisfies SyncoreDevtoolsMessage)\n );\n })();\n return;\n }\n const target = runtimeSockets.get(targetRuntimeId);\n if (target && target.readyState === WebSocket.OPEN) {\n target.send(JSON.stringify(message));\n }\n return;\n }\n if (message.type === \"subscribe\") {\n if (!isAuthorizedDashboardClient) {\n return;\n }\n const targetRuntimeId = message.targetRuntimeId;\n if (!targetRuntimeId) {\n return;\n }\n const subscriptions =\n dashboardSubscriptions.get(socket) ??\n new Map<\n string,\n { runtimeId: string; payload: SyncoreDevtoolsSubscribe }\n >();\n subscriptions.set(message.subscriptionId, {\n runtimeId: targetRuntimeId,\n payload: message\n });\n dashboardSubscriptions.set(socket, subscriptions);\n if (\n targetRuntimeId === PROJECT_TARGET_RUNTIME_ID &&\n projectTargetBackend\n ) {\n void projectTargetBackend\n .subscribe(message.subscriptionId, message.payload, (payload) => {\n if (socket.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(\n JSON.stringify({\n type: \"subscription.data\",\n subscriptionId: message.subscriptionId,\n runtimeId: PROJECT_TARGET_RUNTIME_ID,\n payload\n } satisfies SyncoreDevtoolsMessage)\n );\n })\n .catch((error) => {\n if (socket.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(\n JSON.stringify({\n type: \"subscription.error\",\n subscriptionId: message.subscriptionId,\n runtimeId: PROJECT_TARGET_RUNTIME_ID,\n error: formatError(error)\n } satisfies SyncoreDevtoolsMessage)\n );\n });\n return;\n }\n const target = runtimeSockets.get(targetRuntimeId);\n if (target && target.readyState === WebSocket.OPEN) {\n target.send(JSON.stringify(message));\n }\n return;\n }\n if (message.type === \"unsubscribe\") {\n if (!isAuthorizedDashboardClient) {\n return;\n }\n const subscriptions = dashboardSubscriptions.get(socket);\n const subscription = subscriptions?.get(message.subscriptionId);\n if (!subscription) {\n return;\n }\n if (\n subscription.runtimeId === PROJECT_TARGET_RUNTIME_ID &&\n projectTargetBackend\n ) {\n projectTargetBackend.unsubscribe(message.subscriptionId);\n subscriptions?.delete(message.subscriptionId);\n if (subscriptions && subscriptions.size === 0) {\n dashboardSubscriptions.delete(socket);\n }\n return;\n }\n const target = runtimeSockets.get(subscription.runtimeId);\n if (target && target.readyState === WebSocket.OPEN) {\n const runtimeMessage: SyncoreDevtoolsUnsubscribe = {\n type: \"unsubscribe\",\n subscriptionId: message.subscriptionId,\n targetRuntimeId: subscription.runtimeId\n };\n target.send(JSON.stringify(runtimeMessage));\n }\n subscriptions?.delete(message.subscriptionId);\n if (subscriptions && subscriptions.size === 0) {\n dashboardSubscriptions.delete(socket);\n }\n return;\n }\n if (message.type === \"hello\") {\n dashboardSockets.delete(socket);\n runtimeSockets.set(message.runtimeId, socket);\n runtimeHellos.set(message.runtimeId, message);\n runtimeEvents.set(message.runtimeId, []);\n const runtimeIds = socketRuntimeIds.get(socket) ?? new Set<string>();\n runtimeIds.add(message.runtimeId);\n socketRuntimeIds.set(socket, runtimeIds);\n for (const [dashboardSocket, subscriptions] of dashboardSubscriptions) {\n if (dashboardSocket.readyState !== WebSocket.OPEN) {\n continue;\n }\n for (const subscription of subscriptions.values()) {\n if (subscription.runtimeId !== message.runtimeId) {\n continue;\n }\n socket.send(JSON.stringify(subscription.payload));\n }\n }\n for (const client of dashboardSockets) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(JSON.stringify(message));\n }\n }\n return;\n }\n const encoded = JSON.stringify(message);\n if (\n message.type === \"event\" &&\n message.event.type === \"runtime.disconnected\"\n ) {\n runtimeHellos.delete(message.event.runtimeId);\n }\n if (\n message.type === \"event\" &&\n message.event.runtimeId !== \"syncore-dev-hub\"\n ) {\n const history = runtimeEvents.get(message.event.runtimeId) ?? [];\n history.push(message.event);\n runtimeEvents.set(message.event.runtimeId, history.slice(-200));\n if (message.event.type === \"runtime.disconnected\") {\n runtimeEvents.delete(message.event.runtimeId);\n }\n void appendHubLog(message.event);\n } else if (message.type === \"event\") {\n void appendHubLog(message.event);\n }\n if (\n message.type === \"command.result\" ||\n message.type === \"subscription.data\" ||\n message.type === \"subscription.error\"\n ) {\n if (message.type === \"command.result\") {\n const pending = pendingHubCommands.get(message.commandId);\n if (pending) {\n clearTimeout(pending.timeout);\n pendingHubCommands.delete(message.commandId);\n pending.resolve(message.payload);\n return;\n }\n }\n for (const client of dashboardSockets) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(encoded);\n }\n }\n return;\n }\n for (const client of dashboardSockets) {\n if (client === socket || client.readyState !== WebSocket.OPEN) {\n continue;\n }\n client.send(encoded);\n }\n });\n\n socket.on(\"close\", () => {\n dashboardSockets.delete(socket);\n const subscriptions = dashboardSubscriptions.get(socket);\n if (subscriptions) {\n for (const [subscriptionId, subscription] of subscriptions) {\n if (\n subscription.runtimeId === PROJECT_TARGET_RUNTIME_ID &&\n projectTargetBackend\n ) {\n projectTargetBackend.unsubscribe(subscriptionId);\n continue;\n }\n const target = runtimeSockets.get(subscription.runtimeId);\n if (target && target.readyState === WebSocket.OPEN) {\n const message: SyncoreDevtoolsUnsubscribe = {\n type: \"unsubscribe\",\n subscriptionId,\n targetRuntimeId: subscription.runtimeId\n };\n target.send(JSON.stringify(message));\n }\n }\n dashboardSubscriptions.delete(socket);\n }\n const runtimeIds = socketRuntimeIds.get(socket);\n if (!runtimeIds) {\n return;\n }\n for (const runtimeId of runtimeIds) {\n if (runtimeSockets.get(runtimeId) === socket) {\n if (runtimeHellos.has(runtimeId)) {\n const disconnectedEvent: SyncoreDevtoolsMessage = {\n type: \"event\",\n event: {\n type: \"runtime.disconnected\",\n runtimeId,\n timestamp: Date.now()\n }\n };\n const payload = JSON.stringify(disconnectedEvent);\n void appendHubLog(disconnectedEvent.event);\n for (const client of dashboardSockets) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(payload);\n }\n }\n }\n runtimeSockets.delete(runtimeId);\n runtimeHellos.delete(runtimeId);\n runtimeEvents.delete(runtimeId);\n }\n }\n socketRuntimeIds.delete(socket);\n });\n });\n\n httpServer.on(\"error\", (error) => {\n console.error(`Syncore devtools hub failed: ${formatError(error)}`);\n process.exit(1);\n });\n\n await new Promise<void>((resolve, reject) => {\n httpServer.once(\"error\", reject);\n httpServer.listen(devtoolsPort, \"127.0.0.1\", () => {\n httpServer.off(\"error\", reject);\n resolve();\n });\n });\n console.log(`Syncore devtools hub: ws://localhost:${devtoolsPort}`);\n console.log(`Devtools dashboard token: ${hubAccessToken}`);\n console.log(\n `Electron/Node runtimes: set devtoolsUrl to ws://localhost:${devtoolsPort}.`\n );\n console.log(\n `Web/Next apps: connect the dashboard or worker bridge to ws://localhost:${devtoolsPort}.`\n );\n console.log(\n \"Expo apps: use the same hub URL through LAN or adb reverse while developing.\"\n );\n const dashboardRoot = path.resolve(\n CORE_PACKAGE_ROOT,\n \"..\",\n \"..\",\n \"apps\",\n \"dashboard\"\n );\n if (await fileExists(path.join(dashboardRoot, \"vite.config.ts\"))) {\n try {\n const viteModule = await import(\"vite\");\n const server = await viteModule.createServer({\n configFile: path.join(dashboardRoot, \"vite.config.ts\"),\n root: dashboardRoot,\n server: {\n port: dashboardPort\n }\n });\n await server.listen();\n console.log(`Dashboard shell: ${sessionState.authenticatedDashboardUrl}`);\n } catch (error) {\n console.log(\n `Dashboard source not started automatically: ${formatError(error)}`\n );\n }\n }\n\n const close = () => {\n void projectTargetBackend?.dispose();\n websocketServer.close();\n httpServer.close();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", close);\n process.on(\"SIGTERM\", close);\n return sessionState;\n}\n\nfunction setStorageCorsHeaders(response: ServerResponse): void {\n response.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n response.setHeader(\"Access-Control-Allow-Methods\", \"GET, HEAD, OPTIONS\");\n response.setHeader(\"Access-Control-Allow-Headers\", \"Range\");\n response.setHeader(\n \"Access-Control-Expose-Headers\",\n \"Accept-Ranges, Content-Disposition, Content-Length, Content-Range, Content-Type\"\n );\n}\n\nfunction writeJsonResponse(\n response: ServerResponse,\n status: number,\n payload: unknown\n): void {\n response.writeHead(status, { \"content-type\": \"application/json\" });\n response.end(JSON.stringify(payload));\n}\n\nfunction writeTextResponse(\n response: ServerResponse,\n status: number,\n message: string\n): void {\n response.writeHead(status, { \"content-type\": \"text/plain; charset=utf-8\" });\n response.end(message);\n}\n\nfunction parseStorageRangeHeader(\n header: string | undefined,\n size: number\n):\n | { start: number; end: number; partial: boolean }\n | {\n error: string;\n status: number;\n } {\n if (size === 0) {\n if (!header) {\n return { start: 0, end: -1, partial: false };\n }\n return { error: \"Requested range is not satisfiable.\", status: 416 };\n }\n if (!header) {\n return { start: 0, end: size - 1, partial: false };\n }\n if (header.includes(\",\")) {\n return { error: \"Multi-range requests are not supported.\", status: 416 };\n }\n const match = /^bytes=(\\d+)-(\\d*)$/.exec(header);\n if (!match) {\n return { error: \"Only simple byte ranges are supported.\", status: 416 };\n }\n const start = Number(match[1]);\n const end = match[2] ? Number(match[2]) : size - 1;\n if (\n !Number.isSafeInteger(start) ||\n !Number.isSafeInteger(end) ||\n start < 0 ||\n end < start ||\n start >= size\n ) {\n return { error: \"Requested range is not satisfiable.\", status: 416 };\n }\n return { start, end: Math.min(end, size - 1), partial: true };\n}\n\nfunction writeStorageAccessHeaders(\n response: ServerResponse,\n ticket: StorageAccessTicket,\n range: { status: number; start: number; end: number; byteLength: number }\n): void {\n const headers: Record<string, string | number> = {\n \"content-type\": ticket.entry.contentType ?? \"application/octet-stream\",\n \"content-length\": range.byteLength,\n \"accept-ranges\": ticket.supportsRange ? \"bytes\" : \"none\",\n \"content-disposition\": renderStorageContentDisposition(ticket)\n };\n if (range.status === 206) {\n headers[\"content-range\"] =\n `bytes ${range.start}-${range.end}/${ticket.entry.size}`;\n }\n response.writeHead(range.status, headers);\n}\n\nfunction renderStorageContentDisposition(ticket: StorageAccessTicket): string {\n const mode = ticket.purpose === \"download\" ? \"attachment\" : \"inline\";\n const fallback = sanitizeHeaderFilename(\n ticket.entry.fileName ?? ticket.entry.id\n );\n const encoded = encodeURIComponent(\n ticket.entry.fileName ?? `${ticket.entry.id}.bin`\n );\n return `${mode}; filename=\"${fallback}\"; filename*=UTF-8''${encoded}`;\n}\n\nfunction sanitizeHeaderFilename(value: string): string {\n return value.replaceAll(/[\"\\\\\\r\\n]/g, \"_\");\n}\n\nasync function writeResponseChunk(\n response: ServerResponse,\n chunk: Buffer\n): Promise<void> {\n if (response.write(chunk)) {\n return;\n }\n await new Promise<void>((resolve) => {\n response.once(\"drain\", resolve);\n });\n}\n\nasync function writeDevtoolsSessionState(\n cwd: string,\n state: DevHubSessionState\n): Promise<void> {\n const sessionPath = path.join(cwd, DEVTOOLS_SESSION_FILE);\n await mkdir(path.dirname(sessionPath), { recursive: true });\n await writeFile(sessionPath, `${JSON.stringify(state, null, 2)}\\n`);\n}\n\nasync function readDevtoolsSessionState(\n cwd: string\n): Promise<DevHubSessionState | null> {\n const sessionPath = path.join(cwd, DEVTOOLS_SESSION_FILE);\n if (!(await fileExists(sessionPath))) {\n return null;\n }\n\n try {\n const source = await readFile(sessionPath, \"utf8\");\n const parsed = JSON.parse(source) as Partial<DevHubSessionState>;\n if (\n typeof parsed.dashboardUrl !== \"string\" ||\n typeof parsed.authenticatedDashboardUrl !== \"string\" ||\n typeof parsed.devtoolsUrl !== \"string\" ||\n typeof parsed.token !== \"string\"\n ) {\n return null;\n }\n return {\n dashboardUrl: parsed.dashboardUrl,\n authenticatedDashboardUrl: parsed.authenticatedDashboardUrl,\n devtoolsUrl: parsed.devtoolsUrl,\n token: parsed.token\n };\n } catch {\n return null;\n }\n}\n\nasync function setupDevProjectWatch(\n cwd: string,\n template: SyncoreTemplateName\n): Promise<void> {\n const snapshot = await createDevWatchSnapshot(cwd);\n if (snapshot.size === 0) {\n return;\n }\n\n console.log(\"Watching syncore/ for changes.\");\n let lastSnapshot = snapshot;\n const interval = setInterval(() => {\n void (async () => {\n const nextSnapshot = await createDevWatchSnapshot(cwd);\n if (!areDevWatchSnapshotsEqual(lastSnapshot, nextSnapshot)) {\n lastSnapshot = nextSnapshot;\n scheduleDevProjectBootstrap(cwd, template);\n }\n })();\n }, 500);\n\n const dispose = () => {\n clearInterval(interval);\n };\n\n process.once(\"SIGINT\", dispose);\n process.once(\"SIGTERM\", dispose);\n}\n\nfunction scheduleDevProjectBootstrap(\n cwd: string,\n template: SyncoreTemplateName\n): void {\n if (pendingDevBootstrap) {\n clearTimeout(pendingDevBootstrap);\n }\n pendingDevBootstrap = setTimeout(() => {\n void runDevProjectBootstrap(cwd, template);\n }, 150);\n}\n\nexport async function runDevProjectBootstrap(\n cwd: string,\n template: SyncoreTemplateName\n): Promise<void> {\n if (devBootstrapInFlight) {\n scheduleDevProjectBootstrap(cwd, template);\n return;\n }\n\n devBootstrapInFlight = true;\n try {\n await ensureProjectScaffolded(cwd, template);\n await runCodegen(cwd);\n const schema = await loadProjectSchema(cwd);\n const currentSnapshot = createSchemaSnapshot(schema);\n const storedSnapshot = await readStoredSnapshot(cwd);\n const plan = diffSchemaSnapshots(storedSnapshot, currentSnapshot);\n\n if (plan.destructiveChanges.length > 0) {\n console.error(\"Syncore dev blocked by destructive schema changes:\");\n for (const destructiveChange of plan.destructiveChanges) {\n console.error(`- ${destructiveChange}`);\n }\n return;\n }\n\n if (storedSnapshot?.hash !== currentSnapshot.hash) {\n await writeStoredSnapshot(cwd, currentSnapshot);\n if (plan.statements.length > 0 || plan.warnings.length > 0) {\n console.log(\n `Schema snapshot updated (${plan.statements.length} statement(s), ${plan.warnings.length} warning(s)).`\n );\n } else {\n console.log(\"Schema snapshot updated.\");\n }\n }\n\n for (const warning of plan.warnings) {\n console.warn(`Syncore dev warning: ${warning}`);\n }\n\n if (templateUsesConnectedClients(template)) {\n console.log(\n \"Syncore dev is ready. Codegen refreshed; waiting for a connected client runtime to apply schema locally.\"\n );\n return;\n }\n\n const appliedCount = await applyProjectMigrations(cwd);\n console.log(\n `Syncore dev is ready. Codegen refreshed; ${appliedCount} migration(s) applied.`\n );\n } catch (error) {\n console.error(`Syncore dev bootstrap failed: ${formatError(error)}`);\n } finally {\n devBootstrapInFlight = false;\n }\n}\n\nasync function createDevWatchSnapshot(\n cwd: string\n): Promise<Map<string, number>> {\n const snapshot = new Map<string, number>();\n const filesToCheck = [\n path.join(cwd, \"syncore.config.ts\"),\n path.join(cwd, \"syncore\", \"schema.ts\"),\n path.join(cwd, \".gitignore\"),\n path.join(cwd, \"package.json\")\n ];\n for (const file of filesToCheck) {\n if (await fileExists(file)) {\n const info = await stat(file);\n snapshot.set(file, info.mtimeMs);\n }\n }\n\n for (const directory of [\n path.join(cwd, \"syncore\", \"functions\"),\n path.join(cwd, \"syncore\", \"migrations\")\n ]) {\n for (const file of await listFilesRecursively(directory)) {\n const info = await stat(file);\n snapshot.set(file, info.mtimeMs);\n }\n }\n\n return snapshot;\n}\n\nasync function listFilesRecursively(directory: string): Promise<string[]> {\n if (!(await fileExists(directory))) {\n return [];\n }\n\n const entries = await readdir(directory, { withFileTypes: true });\n const files = await Promise.all(\n entries.map(async (entry) => {\n const fullPath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n return listFilesRecursively(fullPath);\n }\n if (entry.isFile()) {\n return [fullPath];\n }\n return [];\n })\n );\n\n return files.flat().sort((left, right) => left.localeCompare(right));\n}\n\nfunction areDevWatchSnapshotsEqual(\n left: Map<string, number>,\n right: Map<string, number>\n): boolean {\n if (left.size !== right.size) {\n return false;\n }\n for (const [filePath, leftTimestamp] of left) {\n if (right.get(filePath) !== leftTimestamp) {\n return false;\n }\n }\n return true;\n}\n\nfunction decodeWebSocketPayload(\n payload: string | Buffer | ArrayBuffer | Buffer[]\n): string {\n if (typeof payload === \"string\") {\n return payload;\n }\n if (payload instanceof Buffer) {\n return payload.toString(\"utf8\");\n }\n if (Array.isArray(payload)) {\n return Buffer.concat(payload).toString(\"utf8\");\n }\n if (payload instanceof ArrayBuffer) {\n return Buffer.from(payload).toString(\"utf8\");\n }\n return Buffer.from(\n payload.buffer,\n payload.byteOffset,\n payload.byteLength\n ).toString(\"utf8\");\n}\n\nfunction isUnsupportedFts5Statement(\n statement: string,\n error: unknown\n): boolean {\n if (!/using\\s+fts5/i.test(statement)) {\n return false;\n }\n return error instanceof Error && /fts5/i.test(error.message);\n}\n\nfunction unwrapDefaultExport<TValue>(value: TValue): TValue {\n if (\n value &&\n typeof value === \"object\" &&\n \"default\" in (value as Record<string, unknown>) &&\n (value as Record<string, unknown>).default !== undefined\n ) {\n return unwrapDefaultExport(\n (value as Record<string, unknown>).default as TValue\n );\n }\n return value;\n}\n\nexport function resolvePortFromEnv(\n environmentVariable: string,\n fallback: number\n): number {\n const rawValue = process.env[environmentVariable];\n if (!rawValue) {\n return fallback;\n }\n\n const parsed = Number.parseInt(rawValue, 10);\n if (Number.isNaN(parsed) || parsed <= 0) {\n throw new Error(\n `${environmentVariable} must be a positive integer when provided.`\n );\n }\n\n return parsed;\n}\n\nfunction isCliEntryPoint(): boolean {\n const entryPath = process.argv[1];\n if (!entryPath) {\n return false;\n }\n return (\n path.resolve(entryPath) === path.resolve(fileURLToPath(import.meta.url))\n );\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortValue);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nested]) => [key, sortValue(nested)])\n );\n }\n return value;\n}\n\nfunction quoteIdentifier(identifier: string): string {\n return `\"${identifier.replaceAll('\"', '\"\"')}\"`;\n}\n\nfunction toSearchValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value === null || value === undefined) {\n return \"\";\n }\n if (\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\"\n ) {\n return String(value);\n }\n return stableStringify(value);\n}\n"],"mappings":"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AiB,uBAAuB;EACjE;EACA,GAAG,wCAAwC,qBAAqB;EAChE;EACA,GAAG,kCAAkC,eAAe;EACpD;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG,gBAAgB,KAChB,UACC,KAAK,KAAK,UAAU,GAAG,MAAM,UAAU,KAAK,GAAG,EAAE,GAAG,MAAM,YAAY,EAAE,IAAI,yBAAyB,KAAK,EAAE,EAChH;EACA;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI;CAEX,MAAM,eAAe;EACnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,oCAAoC,wBAAwB;EAC5D,GAAG,mCACD,uBACA,uBACF;EACA;EACA,GAAG,wCAAwC,qBAAqB;EAChE;EACA;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI;CAEX,MAAM,mBAAmB;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG,mCACD,uBACA,uBACF;EACA;EACA,GAAG,wCAAwC,qBAAqB;EAChE;EACA;EACA;EACA;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI;CAEX,MAAM,gBAAgB;EACpB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,+BAA+B,wBAAwB;EACvD,yCAAyC,wBAAwB;EACjE,GAAI,wBACA,CACE,mDAAmD,wBAAwB,GAC7E,IACA,CAAC,yCAAyC;EAC9C;EACA;EACA;EACA;CACF,EAAE,KAAK,IAAI;CAEX,MAAM,eAAe;EACnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,qCAAqC,wBAAwB;EAC7D;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;E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"}
|