syncorejs 0.2.0 → 0.2.2
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/README.md +2 -1
- package/dist/_vendor/cli/app.d.mts.map +1 -1
- package/dist/_vendor/cli/app.mjs +323 -42
- package/dist/_vendor/cli/app.mjs.map +1 -1
- package/dist/_vendor/cli/context.mjs +27 -9
- package/dist/_vendor/cli/context.mjs.map +1 -1
- package/dist/_vendor/cli/doctor.mjs +513 -46
- package/dist/_vendor/cli/doctor.mjs.map +1 -1
- package/dist/_vendor/cli/messages.mjs +5 -4
- package/dist/_vendor/cli/messages.mjs.map +1 -1
- package/dist/_vendor/cli/project.mjs +110 -12
- package/dist/_vendor/cli/project.mjs.map +1 -1
- package/dist/_vendor/cli/render.mjs +57 -9
- package/dist/_vendor/cli/render.mjs.map +1 -1
- package/dist/_vendor/cli/targets.mjs +4 -3
- package/dist/_vendor/cli/targets.mjs.map +1 -1
- package/dist/_vendor/core/cli.d.mts +13 -3
- package/dist/_vendor/core/cli.d.mts.map +1 -1
- package/dist/_vendor/core/cli.mjs +242 -91
- package/dist/_vendor/core/cli.mjs.map +1 -1
- package/dist/_vendor/core/devtools-auth.mjs +60 -0
- package/dist/_vendor/core/devtools-auth.mjs.map +1 -0
- package/dist/_vendor/core/index.d.mts +5 -3
- package/dist/_vendor/core/index.mjs +22 -2
- package/dist/_vendor/core/index.mjs.map +1 -1
- package/dist/_vendor/core/runtime/components.d.mts +111 -0
- package/dist/_vendor/core/runtime/components.d.mts.map +1 -0
- package/dist/_vendor/core/runtime/components.mjs +186 -0
- package/dist/_vendor/core/runtime/components.mjs.map +1 -0
- package/dist/_vendor/core/runtime/devtools.d.mts +4 -4
- package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/devtools.mjs +52 -41
- package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
- package/dist/_vendor/core/runtime/functions.d.mts +10 -10
- package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/functions.mjs +2 -2
- package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +77 -0
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +617 -0
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +186 -0
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +220 -0
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +203 -0
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs +177 -0
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +144 -0
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +220 -0
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs +32 -0
- package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/systemMeta.mjs +61 -0
- package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -0
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +37 -0
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -0
- package/dist/_vendor/core/runtime/runtime.d.mts +159 -205
- package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/runtime.mjs +16 -1371
- package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
- package/dist/_vendor/core/transport.d.mts +111 -0
- package/dist/_vendor/core/transport.d.mts.map +1 -0
- package/dist/_vendor/core/transport.mjs +419 -0
- package/dist/_vendor/core/transport.mjs.map +1 -0
- package/dist/_vendor/devtools-protocol/index.d.ts +39 -1
- package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
- package/dist/_vendor/devtools-protocol/index.js +25 -9
- package/dist/_vendor/devtools-protocol/index.js.map +1 -1
- package/dist/_vendor/next/index.d.ts +1 -1
- package/dist/_vendor/next/index.d.ts.map +1 -1
- package/dist/_vendor/next/index.js +31 -13
- package/dist/_vendor/next/index.js.map +1 -1
- package/dist/_vendor/platform-expo/index.d.ts +12 -12
- package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/index.js +4 -2
- package/dist/_vendor/platform-expo/index.js.map +1 -1
- package/dist/_vendor/platform-expo/react.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/react.js +11 -10
- package/dist/_vendor/platform-expo/react.js.map +1 -1
- package/dist/_vendor/platform-node/index.d.mts +23 -19
- package/dist/_vendor/platform-node/index.d.mts.map +1 -1
- package/dist/_vendor/platform-node/index.mjs +13 -5
- package/dist/_vendor/platform-node/index.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.d.mts.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.mjs +15 -2
- package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc.d.mts +11 -35
- package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
- package/dist/_vendor/platform-node/ipc.mjs +3 -273
- package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
- package/dist/_vendor/platform-web/external-change.d.ts +2 -1
- package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
- package/dist/_vendor/platform-web/external-change.js +2 -1
- package/dist/_vendor/platform-web/external-change.js.map +1 -1
- package/dist/_vendor/platform-web/index.d.ts +21 -21
- package/dist/_vendor/platform-web/index.d.ts.map +1 -1
- package/dist/_vendor/platform-web/index.js +44 -7
- package/dist/_vendor/platform-web/index.js.map +1 -1
- package/dist/_vendor/platform-web/react.d.ts.map +1 -1
- package/dist/_vendor/platform-web/react.js +29 -13
- package/dist/_vendor/platform-web/react.js.map +1 -1
- package/dist/_vendor/platform-web/worker.d.ts +11 -35
- package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
- package/dist/_vendor/platform-web/worker.js +3 -267
- package/dist/_vendor/platform-web/worker.js.map +1 -1
- package/dist/_vendor/react/index.d.ts +36 -20
- package/dist/_vendor/react/index.d.ts.map +1 -1
- package/dist/_vendor/react/index.js +279 -57
- package/dist/_vendor/react/index.js.map +1 -1
- package/dist/_vendor/schema/definition.d.ts +48 -63
- package/dist/_vendor/schema/definition.d.ts.map +1 -1
- package/dist/_vendor/schema/definition.js +22 -39
- package/dist/_vendor/schema/definition.js.map +1 -1
- package/dist/_vendor/schema/index.d.ts +4 -4
- package/dist/_vendor/schema/index.js +2 -2
- package/dist/_vendor/schema/planner.d.ts +19 -2
- package/dist/_vendor/schema/planner.d.ts.map +1 -1
- package/dist/_vendor/schema/planner.js +79 -3
- package/dist/_vendor/schema/planner.js.map +1 -1
- package/dist/_vendor/schema/validators.d.ts +141 -121
- package/dist/_vendor/schema/validators.d.ts.map +1 -1
- package/dist/_vendor/schema/validators.js +300 -42
- package/dist/_vendor/schema/validators.js.map +1 -1
- package/dist/_vendor/svelte/index.d.ts +47 -19
- package/dist/_vendor/svelte/index.d.ts.map +1 -1
- package/dist/_vendor/svelte/index.js +250 -20
- package/dist/_vendor/svelte/index.js.map +1 -1
- package/dist/components.d.ts +2 -0
- package/dist/components.js +2 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- package/package.json +8 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.mjs","names":["createPublicRuntimeId","createSharedPublicRuntimeId","createSharedPublicTargetId"],"sources":["../src/project.ts"],"sourcesContent":["import { mkdtemp, mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport AdmZip from \"adm-zip\";\nimport type {\n FunctionReference,\n RegisteredSyncoreFunction,\n SyncoreFunctionRegistry\n} from \"@syncore/core\";\nimport type {\n SyncoreDevtoolsClientMessage,\n SyncoreDevtoolsCommandPayload,\n SyncoreDevtoolsCommandResultPayload,\n SyncoreDevtoolsMessage,\n SyncoreDevtoolsSubscriptionPayload,\n SyncoreDevtoolsSubscriptionResultPayload\n} from \"@syncore/devtools-protocol\";\nimport {\n createBasePublicId,\n createPublicRuntimeId as createSharedPublicRuntimeId,\n createPublicTargetId as createSharedPublicTargetId\n} from \"@syncore/devtools-protocol\";\nimport {\n VALID_SYNCORE_TEMPLATES,\n detectProjectTemplate,\n fileExists,\n importJsonlIntoProject,\n isLocalPortInUse,\n loadProjectConfig,\n loadProjectFunctions,\n loadProjectSchema,\n resolveProjectTargetConfig,\n runCodegen,\n resolvePortFromEnv\n} from \"@syncore/core/cli\";\nimport {\n createManagedNodeSyncoreClient,\n NodeSqliteDriver\n} from \"@syncore/platform-node\";\nimport WebSocket from \"ws\";\n\nexport interface ProjectPaths {\n databasePath: string;\n storageDirectory: string;\n}\n\nexport interface TableSummary {\n name: string;\n documentCount: number;\n}\n\nexport interface TableRowsResult {\n table: string;\n rows: Array<Record<string, unknown>>;\n}\n\nexport interface ImportSource {\n table: string;\n filePath: string;\n}\n\nexport interface ImportDocumentBatch {\n table: string;\n rows: Array<Record<string, unknown>>;\n}\n\nexport interface WorkspaceProjectMatch {\n path: string;\n relativePath: string;\n template: string;\n}\n\nexport type TargetCapability =\n | \"run\"\n | \"readData\"\n | \"writeData\"\n | \"exportData\"\n | \"streamLogs\";\n\nexport interface ClientRuntimeDescriptor {\n id: string;\n runtimeId: string;\n label: string;\n platform: string;\n appName?: string;\n origin?: string;\n sessionLabel?: string;\n storageIdentity?: string;\n online: true;\n primary: boolean;\n}\n\nexport interface ClientRuntimeLookupEntry extends ClientRuntimeDescriptor {\n targetId: string;\n targetLabel: string;\n}\n\nconst PROJECT_TARGET_CAPABILITIES: TargetCapability[] = [\n \"run\",\n \"readData\",\n \"writeData\",\n \"exportData\"\n];\n\nconst CLIENT_TARGET_CAPABILITIES: TargetCapability[] = [\n \"run\",\n \"readData\",\n \"writeData\",\n \"exportData\",\n \"streamLogs\"\n];\n\nexport interface ClientTargetDescriptor {\n id: string;\n kind: \"client\";\n label: string;\n runtimeId: string;\n runtimeIds: string[];\n runtimes: ClientRuntimeDescriptor[];\n platform: string;\n appName?: string;\n origin?: string;\n sessionLabels: string[];\n storageProtocol?: string;\n databaseLabel?: string;\n storageIdentity?: string;\n connectedSessions: number;\n online: true;\n capabilities: TargetCapability[];\n}\n\nexport interface ProjectTargetDescriptor {\n id: \"project\";\n kind: \"project\";\n label: string;\n databasePath: string;\n storageDirectory: string;\n online: true;\n capabilities: TargetCapability[];\n}\n\nexport type SyncoreTargetDescriptor =\n | ProjectTargetDescriptor\n | ClientTargetDescriptor;\n\nexport function createPublicRuntimeId(\n runtimeId: string,\n runtimeIds?: Iterable<string>\n): string {\n return createSharedPublicRuntimeId(runtimeId, runtimeIds);\n}\n\nexport function getClientRuntimeLabel(input: {\n sessionLabel?: string;\n appName?: string;\n platform: string;\n}): string {\n return input.sessionLabel ?? input.appName ?? input.platform;\n}\n\nexport function buildRuntimeLookup(\n targets: SyncoreTargetDescriptor[]\n): Map<string, ClientRuntimeLookupEntry> {\n const lookup = new Map<string, ClientRuntimeLookupEntry>();\n for (const target of targets) {\n if (target.kind !== \"client\") {\n continue;\n }\n for (const runtime of target.runtimes) {\n lookup.set(runtime.runtimeId, {\n ...runtime,\n targetId: target.id,\n targetLabel: target.label\n });\n }\n }\n return lookup;\n}\n\nexport async function resolveProjectPaths(\n cwd: string\n): Promise<ProjectPaths | null> {\n const configPath = path.join(cwd, \"syncore.config.ts\");\n if (!(await fileExists(configPath))) {\n return null;\n }\n const config = await loadProjectConfig(cwd);\n const projectTarget = resolveProjectTargetConfig(config);\n if (!projectTarget) {\n return null;\n }\n return {\n databasePath: path.resolve(cwd, projectTarget.databasePath),\n storageDirectory: path.resolve(cwd, projectTarget.storageDirectory)\n };\n}\n\nexport async function requireProjectPaths(cwd: string): Promise<ProjectPaths> {\n const paths = await resolveProjectPaths(cwd);\n if (!paths) {\n throw new Error(\n \"This Syncore project does not define a projectTarget. Use a connected client target instead.\"\n );\n }\n return paths;\n}\n\nexport async function resolveProjectTargetDescriptor(\n cwd: string\n): Promise<ProjectTargetDescriptor | null> {\n const paths = await resolveProjectPaths(cwd);\n if (!paths) {\n return null;\n }\n\n return {\n id: \"project\",\n kind: \"project\",\n label: `project (${path.basename(paths.databasePath)})`,\n databasePath: paths.databasePath,\n storageDirectory: paths.storageDirectory,\n online: true,\n capabilities: [...PROJECT_TARGET_CAPABILITIES]\n };\n}\n\nexport async function createManagedProjectClient(cwd: string) {\n const [paths, schema, functions] = await Promise.all([\n requireProjectPaths(cwd),\n loadProjectSchema(cwd),\n loadRuntimeProjectFunctions(cwd)\n ]);\n\n return await createManagedNodeSyncoreClient({\n databasePath: paths.databasePath,\n storageDirectory: paths.storageDirectory,\n schema,\n functions,\n devtools: false,\n platform: \"cli\"\n });\n}\n\nexport async function listProjectFunctions(\n cwd: string\n): Promise<Array<{ name: string; kind: RegisteredSyncoreFunction[\"kind\"] }>> {\n const functions = await loadRuntimeProjectFunctions(cwd);\n return Object.entries(functions)\n .filter((entry): entry is [string, RegisteredSyncoreFunction] => Boolean(entry[1]))\n .map(([name, definition]) => ({\n name,\n kind: definition.kind\n }))\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\nexport async function resolveProjectFunction(\n cwd: string,\n requestedName: string\n): Promise<{\n name: string;\n definition: RegisteredSyncoreFunction;\n reference: FunctionReference;\n}> {\n const functions = await loadRuntimeProjectFunctions(cwd);\n const normalizedName = normalizeFunctionName(requestedName, functions);\n const definition = functions[normalizedName];\n if (!definition) {\n const available = Object.keys(functions).sort((left, right) =>\n left.localeCompare(right)\n );\n const suggestions = suggestFunctionNames(requestedName, available);\n throw new Error(\n `Unknown function ${JSON.stringify(requestedName)}.${suggestions.length > 0 ? ` Did you mean: ${suggestions.join(\", \")}?` : \"\"} Available functions: ${available.join(\", \")}`\n );\n }\n\n return {\n name: normalizedName,\n definition,\n reference: {\n kind: definition.kind,\n name: normalizedName\n }\n };\n}\n\nfunction suggestFunctionNames(\n requestedName: string,\n available: string[]\n): string[] {\n const normalized = requestedName\n .trim()\n .replace(/^api\\./, \"\")\n .replaceAll(\".\", \"/\")\n .replaceAll(\":\", \"/\")\n .toLowerCase();\n return available\n .map((name) => ({\n name,\n score:\n (name.toLowerCase() === normalized ? 100 : 0) +\n (name.toLowerCase().startsWith(normalized) ? 30 : 0) +\n (name.toLowerCase().includes(normalized) ? 20 : 0) +\n sharedSegmentsScore(normalized, name.toLowerCase())\n }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score || left.name.localeCompare(right.name))\n .slice(0, 5)\n .map((entry) => entry.name);\n}\n\nfunction sharedSegmentsScore(left: string, right: string): number {\n const leftSegments = left.split(\"/\").filter(Boolean);\n const rightSegments = right.split(\"/\").filter(Boolean);\n let score = 0;\n for (const segment of leftSegments) {\n if (rightSegments.includes(segment)) {\n score += 10;\n }\n }\n return score;\n}\n\nexport function normalizeFunctionName(\n requestedName: string,\n functions: SyncoreFunctionRegistry\n): string {\n const trimmed = requestedName.trim();\n const candidates = [\n trimmed,\n trimmed.replace(/^api\\./, \"\").replaceAll(\".\", \"/\"),\n trimmed.replace(/^api\\./, \"\").replaceAll(\".\", \"/\").replaceAll(\":\", \"/\"),\n trimmed.replaceAll(\":\", \"/\"),\n trimmed.replaceAll(\".\", \"/\")\n ];\n\n for (const candidate of candidates) {\n if (functions[candidate]) {\n return candidate;\n }\n }\n\n return trimmed.replace(/^api\\./, \"\").replaceAll(\".\", \"/\").replaceAll(\":\", \"/\");\n}\n\nexport async function listProjectTables(cwd: string): Promise<TableSummary[]> {\n const [paths, schema] = await Promise.all([\n requireProjectPaths(cwd),\n loadProjectSchema(cwd)\n ]);\n await mkdir(path.dirname(paths.databasePath), { recursive: true });\n const driver = new NodeSqliteDriver(paths.databasePath);\n\n try {\n const results: TableSummary[] = [];\n for (const tableName of schema.tableNames()) {\n const row = await driver.get<{ count: number }>(\n `SELECT COUNT(*) AS count FROM ${quoteIdentifier(tableName)}`\n );\n results.push({\n name: tableName,\n documentCount: Number(row?.count ?? 0)\n });\n }\n return results;\n } finally {\n await driver.close();\n }\n}\n\nexport async function readProjectTable(\n cwd: string,\n tableName: string,\n options: {\n limit: number;\n order: \"asc\" | \"desc\";\n }\n): Promise<TableRowsResult> {\n const paths = await requireProjectPaths(cwd);\n const driver = new NodeSqliteDriver(paths.databasePath);\n\n try {\n const rows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(\n `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(tableName)} ORDER BY _creationTime ${options.order.toUpperCase()} LIMIT ?`,\n [options.limit]\n );\n return {\n table: tableName,\n rows: rows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }))\n };\n } finally {\n await driver.close();\n }\n}\n\nexport async function exportProjectData(\n cwd: string,\n outputPath: string,\n options: {\n table?: string;\n } = {}\n): Promise<{\n path: string;\n tables: string[];\n format: \"json\" | \"jsonl\" | \"directory\" | \"zip\";\n}> {\n const resolvedOutput = path.resolve(cwd, outputPath);\n const tables = options.table\n ? [options.table]\n : (await listProjectTables(cwd)).map((table) => table.name);\n if (tables.length === 0) {\n throw new Error(\"No tables are available to export.\");\n }\n\n const payloads = await Promise.all(\n tables.map(async (table) => ({\n table,\n rows: (\n await readProjectTable(cwd, table, {\n limit: Number.MAX_SAFE_INTEGER,\n order: \"asc\"\n })\n ).rows\n }))\n );\n\n return await writeExportData(resolvedOutput, payloads);\n}\n\nexport async function writeExportData(\n resolvedOutput: string,\n payloads: Array<{ table: string; rows: Array<Record<string, unknown>> }>\n): Promise<{\n path: string;\n tables: string[];\n format: \"json\" | \"jsonl\" | \"directory\" | \"zip\";\n}> {\n const tables = payloads.map((payload) => payload.table);\n if (tables.length === 0) {\n throw new Error(\"No tables are available to export.\");\n }\n\n const extension = path.extname(resolvedOutput).toLowerCase();\n if (extension === \".json\" || extension === \".jsonl\") {\n if (tables.length !== 1) {\n throw new Error(\n `Single-file exports require --table. Available tables: ${tables.join(\", \")}`\n );\n }\n const payload = payloads[0]!;\n await mkdir(path.dirname(resolvedOutput), { recursive: true });\n await writeFile(\n resolvedOutput,\n extension === \".json\"\n ? `${JSON.stringify(payload.rows, null, 2)}\\n`\n : `${payload.rows.map((row) => JSON.stringify(row)).join(\"\\n\")}\\n`\n );\n return {\n path: resolvedOutput,\n tables: [payload.table],\n format: extension === \".json\" ? \"json\" : \"jsonl\"\n };\n }\n\n if (extension === \".zip\") {\n const zip = new AdmZip();\n for (const payload of payloads) {\n zip.addFile(\n `${payload.table}.jsonl`,\n Buffer.from(\n `${payload.rows.map((row) => JSON.stringify(row)).join(\"\\n\")}\\n`\n )\n );\n }\n await mkdir(path.dirname(resolvedOutput), { recursive: true });\n zip.writeZip(resolvedOutput);\n return {\n path: resolvedOutput,\n tables,\n format: \"zip\"\n };\n }\n\n await mkdir(resolvedOutput, { recursive: true });\n for (const payload of payloads) {\n await writeFile(\n path.join(resolvedOutput, `${payload.table}.jsonl`),\n `${payload.rows.map((row) => JSON.stringify(row)).join(\"\\n\")}\\n`\n );\n }\n\n return {\n path: resolvedOutput,\n tables,\n format: \"directory\"\n };\n}\n\nexport async function importProjectData(\n cwd: string,\n sourcePath: string,\n options: {\n table?: string;\n } = {}\n): Promise<Array<{ table: string; importedCount: number }>> {\n const resolvedSource = path.resolve(cwd, sourcePath);\n const extension = path.extname(resolvedSource).toLowerCase();\n const cleanupDirectories: string[] = [];\n\n try {\n const sources =\n extension === \".zip\"\n ? await extractImportSourcesFromZip(resolvedSource, cleanupDirectories)\n : await resolveImportSources(\n resolvedSource,\n options.table,\n cleanupDirectories\n );\n\n const imported = [] as Array<{ table: string; importedCount: number }>;\n for (const source of sources) {\n const importedCount = await importJsonlIntoProject(\n cwd,\n source.table,\n source.filePath\n );\n imported.push({\n table: source.table,\n importedCount\n });\n }\n return imported;\n } finally {\n for (const directory of cleanupDirectories) {\n await rm(directory, { recursive: true, force: true });\n }\n }\n}\n\nexport async function loadImportDocumentBatches(\n cwd: string,\n sourcePath: string,\n options: {\n table?: string;\n } = {}\n): Promise<ImportDocumentBatch[]> {\n const resolvedSource = path.resolve(cwd, sourcePath);\n const extension = path.extname(resolvedSource).toLowerCase();\n const cleanupDirectories: string[] = [];\n\n try {\n const sources =\n extension === \".zip\"\n ? await extractImportSourcesFromZip(resolvedSource, cleanupDirectories)\n : await resolveImportSources(\n resolvedSource,\n options.table,\n cleanupDirectories\n );\n\n return await Promise.all(\n sources.map(async (source) => ({\n table: source.table,\n rows: await readJsonlRows(source.filePath)\n }))\n );\n } finally {\n for (const directory of cleanupDirectories) {\n await rm(directory, { recursive: true, force: true });\n }\n }\n}\n\nexport async function findWorkspaceSyncoreProjects(\n cwd: string\n): Promise<WorkspaceProjectMatch[]> {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!(await fileExists(packageJsonPath))) {\n return [];\n }\n\n let workspaces: string[] = [];\n try {\n const packageJson = JSON.parse(await readFile(packageJsonPath, \"utf8\")) as {\n workspaces?: string[];\n };\n workspaces = packageJson.workspaces ?? [];\n } catch {\n return [];\n }\n\n const directories = new Set<string>();\n for (const workspace of workspaces) {\n const prefix = workspace.replace(/\\/\\*+$/, \"\");\n const fullPrefix = path.join(cwd, prefix);\n if (!(await fileExists(fullPrefix))) {\n continue;\n }\n const entries = await readdir(fullPrefix, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n directories.add(path.join(fullPrefix, entry.name));\n }\n }\n }\n\n const matches: WorkspaceProjectMatch[] = [];\n for (const directory of directories) {\n if (!(await fileExists(path.join(directory, \"syncore.config.ts\")))) {\n continue;\n }\n matches.push({\n path: directory,\n relativePath: path.relative(cwd, directory).replaceAll(\"\\\\\", \"/\"),\n template: await detectProjectTemplate(directory)\n });\n }\n return matches.sort((left, right) =>\n left.relativePath.localeCompare(right.relativePath)\n );\n}\n\nexport async function resolveDocsTarget(cwd: string): Promise<string> {\n const template = await detectProjectTemplate(cwd);\n const docsFile =\n template === \"react-web\"\n ? path.join(\"docs\", \"quickstarts\", \"react-web.md\")\n : template === \"next\"\n ? path.join(\"docs\", \"quickstarts\", \"next-pwa.md\")\n : template === \"expo\"\n ? path.join(\"docs\", \"quickstarts\", \"expo.md\")\n : template === \"electron\"\n ? path.join(\"docs\", \"quickstarts\", \"electron.md\")\n : template === \"node\"\n ? path.join(\"docs\", \"quickstarts\", \"node-script.md\")\n : path.join(\"README.md\");\n\n return pathToFileURL(\n path.resolve(import.meta.dirname, \"..\", \"..\", \"..\", docsFile)\n ).href;\n}\n\nexport function resolveDashboardUrl(): string {\n return `http://localhost:${resolvePortFromEnv(\"SYNCORE_DASHBOARD_PORT\", 4310)}`;\n}\n\nexport function resolveDevtoolsUrl(): string {\n return `ws://127.0.0.1:${resolvePortFromEnv(\"SYNCORE_DEVTOOLS_PORT\", 4311)}`;\n}\n\ntype RuntimeHello = Extract<SyncoreDevtoolsMessage, { type: \"hello\" }>;\ntype RuntimeEventMessage = Extract<SyncoreDevtoolsMessage, { type: \"event\" }>;\n\ninterface HubConnection {\n collectSnapshot(timeoutMs?: number): Promise<{\n hellos: RuntimeHello[];\n events: RuntimeEventMessage[\"event\"][];\n }>;\n listRuntimeHellos(): RuntimeHello[];\n onEvent(listener: (event: RuntimeEventMessage[\"event\"]) => void): () => void;\n sendCommand(\n runtimeId: string,\n payload: SyncoreDevtoolsCommandPayload\n ): Promise<SyncoreDevtoolsCommandResultPayload>;\n subscribe(\n runtimeId: string,\n payload: SyncoreDevtoolsSubscriptionPayload,\n handlers: {\n onData(payload: SyncoreDevtoolsSubscriptionResultPayload): void;\n onError?(error: string): void;\n }\n ): () => void;\n dispose(): Promise<void>;\n}\n\nexport async function listConnectedClientTargets(\n devtoolsUrl = resolveDevtoolsUrl()\n): Promise<ClientTargetDescriptor[]> {\n const port = Number.parseInt(new URL(devtoolsUrl).port, 10);\n if (!Number.isFinite(port) || !(await isLocalPortInUse(port))) {\n return [];\n }\n\n let hub: HubConnection;\n try {\n hub = await connectToDevtoolsHub(devtoolsUrl);\n } catch {\n return [];\n }\n try {\n const snapshot = await hub.collectSnapshot();\n return buildClientTargets(snapshot.hellos);\n } finally {\n await hub.dispose();\n }\n}\n\nexport async function listAvailableTargets(\n cwd: string\n): Promise<SyncoreTargetDescriptor[]> {\n const [projectTarget, clientTargets] = await Promise.all([\n resolveProjectTargetDescriptor(cwd),\n listConnectedClientTargets()\n ]);\n\n return [\n ...(projectTarget ? [projectTarget] : []),\n ...clientTargets\n ];\n}\n\nexport async function connectToProjectHub(\n devtoolsUrl = resolveDevtoolsUrl()\n): Promise<HubConnection | null> {\n const port = Number.parseInt(new URL(devtoolsUrl).port, 10);\n if (!Number.isFinite(port) || !(await isLocalPortInUse(port))) {\n return null;\n }\n try {\n return await connectToDevtoolsHub(devtoolsUrl);\n } catch {\n return null;\n }\n}\n\nexport function isKnownTemplate(value: string): value is (typeof VALID_SYNCORE_TEMPLATES)[number] {\n return VALID_SYNCORE_TEMPLATES.includes(\n value as (typeof VALID_SYNCORE_TEMPLATES)[number]\n );\n}\n\nasync function loadRuntimeProjectFunctions(\n cwd: string\n): Promise<SyncoreFunctionRegistry> {\n try {\n return await loadProjectFunctions(cwd);\n } catch (error) {\n if (!(await fileExists(path.join(cwd, \"syncore\", \"functions\")))) {\n throw error;\n }\n\n await runCodegen(cwd);\n return await loadProjectFunctions(cwd);\n }\n}\n\nfunction quoteIdentifier(value: string): string {\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n}\n\nasync function resolveImportSources(\n sourcePath: string,\n explicitTable: string | undefined,\n cleanupDirectories: string[]\n): Promise<ImportSource[]> {\n const extension = path.extname(sourcePath).toLowerCase();\n if (extension === \".jsonl\") {\n if (!explicitTable) {\n throw new Error(\"`syncorejs import` requires --table when importing a .jsonl file.\");\n }\n return [{ table: explicitTable, filePath: sourcePath }];\n }\n\n if (extension === \".json\") {\n if (!explicitTable) {\n throw new Error(\"`syncorejs import` requires --table when importing a .json file.\");\n }\n const rows = JSON.parse(await readFile(sourcePath, \"utf8\")) as unknown;\n if (!Array.isArray(rows)) {\n throw new Error(`${sourcePath} must contain a JSON array.`);\n }\n const { directory, filePath } = await writeRowsToTempJsonl(rows);\n cleanupDirectories.push(directory);\n return [{ table: explicitTable, filePath }];\n }\n\n if (await isDirectory(sourcePath)) {\n const entries = await readdir(sourcePath, { withFileTypes: true });\n const sources: ImportSource[] = [];\n for (const entry of entries) {\n const fullPath = path.join(sourcePath, entry.name);\n if (entry.isFile() && entry.name.endsWith(\".jsonl\")) {\n sources.push({\n table: entry.name.replace(/\\.jsonl$/i, \"\"),\n filePath: fullPath\n });\n }\n if (entry.isDirectory()) {\n const nestedPath = path.join(fullPath, \"documents.jsonl\");\n if (await fileExists(nestedPath)) {\n sources.push({\n table: entry.name,\n filePath: nestedPath\n });\n }\n }\n }\n if (sources.length === 0) {\n throw new Error(`No importable JSONL files were found in ${sourcePath}.`);\n }\n return sources.sort((left, right) => left.table.localeCompare(right.table));\n }\n\n throw new Error(`Unsupported import source: ${sourcePath}`);\n}\n\nasync function extractImportSourcesFromZip(\n sourcePath: string,\n cleanupDirectories: string[]\n): Promise<ImportSource[]> {\n const tempDirectory = await mkdtemp(\n path.join(os.tmpdir(), \"syncore-cli-import-\")\n );\n cleanupDirectories.push(tempDirectory);\n const zip = new AdmZip(sourcePath);\n zip.extractAllTo(tempDirectory, true);\n return await resolveImportSources(tempDirectory, undefined, cleanupDirectories);\n}\n\nasync function writeRowsToTempJsonl(rows: unknown[]): Promise<{\n directory: string;\n filePath: string;\n}> {\n const tempDirectory = await mkdtemp(\n path.join(os.tmpdir(), \"syncore-cli-json-\")\n );\n const tempFile = path.join(tempDirectory, \"rows.jsonl\");\n await writeFile(\n tempFile,\n `${rows.map((row) => JSON.stringify(row)).join(\"\\n\")}\\n`\n );\n return {\n directory: tempDirectory,\n filePath: tempFile\n };\n}\n\nasync function readJsonlRows(\n filePath: string\n): Promise<Array<Record<string, unknown>>> {\n const source = await readFile(filePath, \"utf8\");\n const rows: Array<Record<string, unknown>> = [];\n let lineNumber = 0;\n\n for (const line of source.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n lineNumber += 1;\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\n `Line ${lineNumber} of ${filePath} must contain a JSON object.`\n );\n }\n rows.push(parsed as Record<string, unknown>);\n }\n\n return rows;\n}\n\nasync function isDirectory(filePath: string): Promise<boolean> {\n try {\n const entries = await readdir(filePath);\n return Array.isArray(entries);\n } catch {\n return false;\n }\n}\n\nasync function connectToDevtoolsHub(url: string): Promise<HubConnection> {\n const socket = new WebSocket(url);\n socket.on(\"error\", () => {\n // The hub can disappear between the port probe and the websocket handshake.\n // Keep those transient client-side failures from surfacing as process-level errors.\n });\n const hellos = new Map<string, RuntimeHello>();\n const events: RuntimeEventMessage[\"event\"][] = [];\n const eventListeners = new Set<(event: RuntimeEventMessage[\"event\"]) => void>();\n const commandResolvers = new Map<\n string,\n {\n resolve(payload: SyncoreDevtoolsCommandResultPayload): void;\n reject(error: Error): void;\n }\n >();\n const subscriptionHandlers = new Map<\n string,\n {\n onData(payload: SyncoreDevtoolsSubscriptionResultPayload): void;\n onError?(error: string): void;\n }\n >();\n\n await new Promise<void>((resolve, reject) => {\n socket.once(\"open\", () => resolve());\n socket.once(\"error\", (error) => reject(error));\n });\n\n socket.on(\"message\", (rawPayload) => {\n const payload =\n typeof rawPayload === \"string\"\n ? rawPayload\n : rawPayload instanceof Buffer\n ? rawPayload.toString(\"utf8\")\n : Array.isArray(rawPayload)\n ? Buffer.concat(rawPayload).toString(\"utf8\")\n : rawPayload instanceof ArrayBuffer\n ? Buffer.from(rawPayload).toString(\"utf8\")\n : Buffer.from(\n rawPayload.buffer,\n rawPayload.byteOffset,\n rawPayload.byteLength\n ).toString(\"utf8\");\n if (payload.length === 0) {\n return;\n }\n\n const message = JSON.parse(payload) as SyncoreDevtoolsMessage;\n if (message.type === \"hello\") {\n hellos.set(message.runtimeId, message);\n return;\n }\n if (message.type === \"event\") {\n events.unshift(message.event);\n events.splice(200);\n if (message.event.type === \"runtime.disconnected\") {\n hellos.delete(message.event.runtimeId);\n }\n for (const listener of eventListeners) {\n listener(message.event);\n }\n return;\n }\n if (message.type === \"command.result\") {\n const resolver = commandResolvers.get(message.commandId);\n if (!resolver) {\n return;\n }\n commandResolvers.delete(message.commandId);\n resolver.resolve(message.payload);\n return;\n }\n if (message.type === \"subscription.data\") {\n subscriptionHandlers.get(message.subscriptionId)?.onData(message.payload);\n return;\n }\n if (message.type === \"subscription.error\") {\n subscriptionHandlers.get(message.subscriptionId)?.onError?.(message.error);\n }\n });\n\n const dispose = async () => {\n for (const [commandId, resolver] of commandResolvers) {\n commandResolvers.delete(commandId);\n resolver.reject(new Error(\"Syncore devtools hub disconnected.\"));\n }\n subscriptionHandlers.clear();\n\n if (socket.readyState === WebSocket.CLOSED) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n socket.once(\"close\", () => resolve());\n socket.close();\n });\n };\n\n return {\n async collectSnapshot(timeoutMs = 120) {\n await new Promise((resolve) => setTimeout(resolve, timeoutMs));\n return {\n hellos: [...hellos.values()],\n events: [...events]\n };\n },\n listRuntimeHellos() {\n return [...hellos.values()];\n },\n onEvent(listener) {\n eventListeners.add(listener);\n return () => {\n eventListeners.delete(listener);\n };\n },\n async sendCommand(runtimeId, payload) {\n const commandId = createHubRequestId(\"command\");\n const result = await new Promise<SyncoreDevtoolsCommandResultPayload>(\n (resolve, reject) => {\n commandResolvers.set(commandId, { resolve, reject });\n socket.send(\n JSON.stringify({\n type: \"command\",\n commandId,\n targetRuntimeId: runtimeId,\n payload\n } satisfies SyncoreDevtoolsClientMessage)\n );\n }\n );\n return result;\n },\n subscribe(runtimeId, payload, handlers) {\n const subscriptionId = createHubRequestId(\"subscription\");\n subscriptionHandlers.set(subscriptionId, handlers);\n socket.send(\n JSON.stringify({\n type: \"subscribe\",\n subscriptionId,\n targetRuntimeId: runtimeId,\n payload\n } satisfies SyncoreDevtoolsClientMessage)\n );\n return () => {\n if (!subscriptionHandlers.has(subscriptionId)) {\n return;\n }\n subscriptionHandlers.delete(subscriptionId);\n socket.send(\n JSON.stringify({\n type: \"unsubscribe\",\n subscriptionId,\n targetRuntimeId: runtimeId\n } satisfies SyncoreDevtoolsClientMessage)\n );\n };\n },\n dispose\n };\n}\n\nfunction buildClientTargets(hellos: RuntimeHello[]): ClientTargetDescriptor[] {\n const groups = new Map<\n string,\n {\n key: string;\n runtimes: RuntimeHello[];\n }\n >();\n\n for (const hello of hellos) {\n if (hello.runtimeId === \"syncore-dev-hub\") {\n continue;\n }\n const key = hello.storageIdentity ?? `runtime::${hello.runtimeId}`;\n const group = groups.get(key) ?? { key, runtimes: [] };\n group.runtimes.push(hello);\n groups.set(key, group);\n }\n\n const allRuntimeIds = hellos\n .filter((hello) => hello.runtimeId !== \"syncore-dev-hub\")\n .map((hello) => hello.runtimeId)\n .sort();\n\n return [...groups.values()]\n .map(({ key, runtimes }) => {\n const sortedRuntimes = [...runtimes].sort((left, right) =>\n left.runtimeId.localeCompare(right.runtimeId)\n );\n const primary = sortedRuntimes[0]!;\n const sessionLabels = Array.from(\n new Set(\n sortedRuntimes\n .map((entry) => entry.sessionLabel)\n .filter((value): value is string => typeof value === \"string\")\n )\n );\n const runtimeIds = sortedRuntimes.map((entry) => entry.runtimeId);\n const runtimeDescriptors = sortedRuntimes.map((entry, index) => ({\n id: createPublicRuntimeId(entry.runtimeId, allRuntimeIds),\n runtimeId: entry.runtimeId,\n label: getClientRuntimeLabel({\n ...(entry.sessionLabel ? { sessionLabel: entry.sessionLabel } : {}),\n ...(entry.appName ? { appName: entry.appName } : {}),\n platform: entry.platform\n }),\n platform: entry.platform,\n ...(entry.appName ? { appName: entry.appName } : {}),\n ...(entry.origin ? { origin: entry.origin } : {}),\n ...(entry.sessionLabel ? { sessionLabel: entry.sessionLabel } : {}),\n ...(entry.storageIdentity\n ? { storageIdentity: entry.storageIdentity }\n : {}),\n online: true as const,\n primary: index === 0\n }));\n return {\n id: createPublicClientTargetId(key, groups),\n kind: \"client\" as const,\n label: renderClientTargetLabel(primary, runtimes.length),\n runtimeId: primary.runtimeId,\n runtimeIds,\n runtimes: runtimeDescriptors,\n platform: primary.platform,\n ...(primary.appName ? { appName: primary.appName } : {}),\n ...(primary.origin ? { origin: primary.origin } : {}),\n sessionLabels,\n ...(primary.storageProtocol\n ? { storageProtocol: primary.storageProtocol }\n : {}),\n ...(primary.databaseLabel ? { databaseLabel: primary.databaseLabel } : {}),\n ...(primary.storageIdentity\n ? { storageIdentity: primary.storageIdentity }\n : {}),\n connectedSessions: runtimes.length,\n online: true as const,\n capabilities: [...CLIENT_TARGET_CAPABILITIES]\n };\n })\n .sort((left, right) => left.label.localeCompare(right.label));\n}\n\nexport function createPublicClientTargetId(\n key: string,\n groupsOrKeys: Map<string, { key: string; runtimes: RuntimeHello[] }> | Iterable<string>\n): string {\n const keys =\n groupsOrKeys instanceof Map ? [...groupsOrKeys.keys()] : [...groupsOrKeys];\n return createSharedPublicTargetId(key, keys);\n}\n\nexport function targetSupportsCapability(\n target: SyncoreTargetDescriptor,\n capability: TargetCapability\n): boolean {\n return target.capabilities.includes(capability);\n}\n\nfunction renderClientTargetLabel(\n hello: RuntimeHello,\n connectedSessions: number\n): string {\n const base =\n hello.appName ??\n hello.databaseLabel ??\n hello.origin ??\n `${hello.platform} client`;\n return connectedSessions > 1 ? `${base} (${connectedSessions} sessions)` : base;\n}\n\nexport function createBasePublicClientTargetId(input: string): string {\n return createBasePublicId(input);\n}\n\nfunction createHubRequestId(prefix: string): string {\n return `syncore-cli-${prefix}-${Date.now()}-${Math.random()\n .toString(36)\n .slice(2, 10)}`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"project.mjs","names":["createPublicRuntimeId","createSharedPublicRuntimeId","createSharedPublicTargetId"],"sources":["../src/project.ts"],"sourcesContent":["import { mkdtemp, mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport AdmZip from \"adm-zip\";\nimport type {\n FunctionReference,\n RegisteredSyncoreFunction,\n SyncoreFunctionRegistry\n} from \"@syncore/core\";\nimport type {\n SyncoreDevtoolsClientMessage,\n SyncoreDevtoolsCommandPayload,\n SyncoreDevtoolsCommandResultPayload,\n SyncoreDevtoolsMessage,\n SyncoreDevtoolsSubscriptionPayload,\n SyncoreDevtoolsSubscriptionResultPayload\n} from \"@syncore/devtools-protocol\";\nimport {\n createBasePublicId,\n createPublicRuntimeId as createSharedPublicRuntimeId,\n createPublicTargetId as createSharedPublicTargetId\n} from \"@syncore/devtools-protocol\";\nimport {\n type DevHubSessionState,\n VALID_SYNCORE_TEMPLATES,\n detectProjectTemplate,\n fileExists,\n importJsonlIntoProject,\n isLocalPortInUse,\n loadProjectConfig,\n loadProjectFunctions,\n loadProjectResolvedComponents,\n loadProjectSchema,\n resolveProjectTargetConfig,\n runCodegen,\n resolvePortFromEnv\n} from \"@syncore/core/cli\";\nimport {\n createManagedNodeSyncoreClient,\n NodeSqliteDriver\n} from \"@syncore/platform-node\";\nimport WebSocket from \"ws\";\n\nexport interface ProjectPaths {\n databasePath: string;\n storageDirectory: string;\n}\n\nexport interface TableSummary {\n name: string;\n displayName?: string;\n owner: \"root\" | \"component\";\n componentPath?: string;\n componentName?: string;\n documentCount: number;\n}\n\nexport interface TableRowsResult {\n table: string;\n rows: Array<Record<string, unknown>>;\n}\n\nexport interface ImportSource {\n table: string;\n filePath: string;\n}\n\nexport interface ImportDocumentBatch {\n table: string;\n rows: Array<Record<string, unknown>>;\n}\n\nexport interface WorkspaceProjectMatch {\n path: string;\n relativePath: string;\n template: string;\n}\n\nexport type TargetCapability =\n | \"run\"\n | \"readData\"\n | \"writeData\"\n | \"exportData\"\n | \"streamLogs\";\n\nexport interface ClientRuntimeDescriptor {\n id: string;\n runtimeId: string;\n label: string;\n platform: string;\n appName?: string;\n origin?: string;\n sessionLabel?: string;\n storageIdentity?: string;\n online: true;\n primary: boolean;\n}\n\nexport interface ClientRuntimeLookupEntry extends ClientRuntimeDescriptor {\n targetId: string;\n targetLabel: string;\n}\n\nconst PROJECT_TARGET_CAPABILITIES: TargetCapability[] = [\n \"run\",\n \"readData\",\n \"writeData\",\n \"exportData\"\n];\n\nconst CLIENT_TARGET_CAPABILITIES: TargetCapability[] = [\n \"run\",\n \"readData\",\n \"writeData\",\n \"exportData\",\n \"streamLogs\"\n];\n\nexport interface ClientTargetDescriptor {\n id: string;\n kind: \"client\";\n label: string;\n runtimeId: string;\n runtimeIds: string[];\n runtimes: ClientRuntimeDescriptor[];\n platform: string;\n appName?: string;\n origin?: string;\n sessionLabels: string[];\n storageProtocol?: string;\n databaseLabel?: string;\n storageIdentity?: string;\n connectedSessions: number;\n online: true;\n capabilities: TargetCapability[];\n}\n\nexport interface ProjectTargetDescriptor {\n id: \"project\";\n kind: \"project\";\n label: string;\n databasePath: string;\n storageDirectory: string;\n online: true;\n capabilities: TargetCapability[];\n}\n\nexport type SyncoreTargetDescriptor =\n | ProjectTargetDescriptor\n | ClientTargetDescriptor;\n\nexport function createPublicRuntimeId(\n runtimeId: string,\n runtimeIds?: Iterable<string>\n): string {\n return createSharedPublicRuntimeId(runtimeId, runtimeIds);\n}\n\nexport function getClientRuntimeLabel(input: {\n sessionLabel?: string;\n appName?: string;\n platform: string;\n}): string {\n return input.sessionLabel ?? input.appName ?? input.platform;\n}\n\nexport function buildRuntimeLookup(\n targets: SyncoreTargetDescriptor[]\n): Map<string, ClientRuntimeLookupEntry> {\n const lookup = new Map<string, ClientRuntimeLookupEntry>();\n for (const target of targets) {\n if (target.kind !== \"client\") {\n continue;\n }\n for (const runtime of target.runtimes) {\n lookup.set(runtime.runtimeId, {\n ...runtime,\n targetId: target.id,\n targetLabel: target.label\n });\n }\n }\n return lookup;\n}\n\nexport async function resolveProjectPaths(\n cwd: string\n): Promise<ProjectPaths | null> {\n const configPath = path.join(cwd, \"syncore.config.ts\");\n if (!(await fileExists(configPath))) {\n return null;\n }\n const config = await loadProjectConfig(cwd);\n const projectTarget = resolveProjectTargetConfig(config);\n if (!projectTarget) {\n return null;\n }\n return {\n databasePath: path.resolve(cwd, projectTarget.databasePath),\n storageDirectory: path.resolve(cwd, projectTarget.storageDirectory)\n };\n}\n\nexport async function requireProjectPaths(cwd: string): Promise<ProjectPaths> {\n const paths = await resolveProjectPaths(cwd);\n if (!paths) {\n throw new Error(\n \"This Syncore project does not define a projectTarget. Use a connected client target instead.\"\n );\n }\n return paths;\n}\n\nexport async function resolveProjectTargetDescriptor(\n cwd: string\n): Promise<ProjectTargetDescriptor | null> {\n const paths = await resolveProjectPaths(cwd);\n if (!paths) {\n return null;\n }\n\n return {\n id: \"project\",\n kind: \"project\",\n label: `project (${path.basename(paths.databasePath)})`,\n databasePath: paths.databasePath,\n storageDirectory: paths.storageDirectory,\n online: true,\n capabilities: [...PROJECT_TARGET_CAPABILITIES]\n };\n}\n\nexport async function createManagedProjectClient(cwd: string) {\n const [paths, schema, functions, components] = await Promise.all([\n requireProjectPaths(cwd),\n loadProjectSchema(cwd),\n loadRuntimeProjectFunctions(cwd),\n loadProjectResolvedComponents(cwd)\n ]);\n\n return await createManagedNodeSyncoreClient({\n databasePath: paths.databasePath,\n storageDirectory: paths.storageDirectory,\n schema,\n functions,\n components,\n devtools: false,\n platform: \"cli\"\n });\n}\n\nexport async function listProjectFunctions(\n cwd: string\n): Promise<Array<{ name: string; kind: RegisteredSyncoreFunction[\"kind\"] }>> {\n const functions = await loadRuntimeProjectFunctions(cwd);\n return Object.entries(functions)\n .filter((entry): entry is [string, RegisteredSyncoreFunction] => Boolean(entry[1]))\n .map(([name, definition]) => ({\n name,\n kind: definition.kind\n }))\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\nexport async function resolveProjectFunction(\n cwd: string,\n requestedName: string\n): Promise<{\n name: string;\n definition: RegisteredSyncoreFunction;\n reference: FunctionReference;\n}> {\n const functions = await loadRuntimeProjectFunctions(cwd);\n const normalizedName = normalizeFunctionName(requestedName, functions);\n const definition = functions[normalizedName];\n if (!definition) {\n const available = Object.keys(functions).sort((left, right) =>\n left.localeCompare(right)\n );\n const suggestions = suggestFunctionNames(requestedName, available);\n throw new Error(\n `Unknown function ${JSON.stringify(requestedName)}.${suggestions.length > 0 ? ` Did you mean: ${suggestions.join(\", \")}?` : \"\"} Available functions: ${available.join(\", \")}`\n );\n }\n\n return {\n name: normalizedName,\n definition,\n reference: {\n kind: definition.kind,\n name: normalizedName\n }\n };\n}\n\nfunction suggestFunctionNames(\n requestedName: string,\n available: string[]\n): string[] {\n const normalized = requestedName\n .trim()\n .replace(/^api\\./, \"\")\n .replaceAll(\".\", \"/\")\n .replaceAll(\":\", \"/\")\n .toLowerCase();\n return available\n .map((name) => ({\n name,\n score:\n (name.toLowerCase() === normalized ? 100 : 0) +\n (name.toLowerCase().startsWith(normalized) ? 30 : 0) +\n (name.toLowerCase().includes(normalized) ? 20 : 0) +\n sharedSegmentsScore(normalized, name.toLowerCase())\n }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score || left.name.localeCompare(right.name))\n .slice(0, 5)\n .map((entry) => entry.name);\n}\n\nfunction sharedSegmentsScore(left: string, right: string): number {\n const leftSegments = left.split(\"/\").filter(Boolean);\n const rightSegments = right.split(\"/\").filter(Boolean);\n let score = 0;\n for (const segment of leftSegments) {\n if (rightSegments.includes(segment)) {\n score += 10;\n }\n }\n return score;\n}\n\nexport function normalizeFunctionName(\n requestedName: string,\n functions: SyncoreFunctionRegistry\n): string {\n const trimmed = requestedName.trim();\n const candidates = [\n trimmed,\n trimmed.replace(/^api\\./, \"\").replaceAll(\".\", \"/\"),\n trimmed.replace(/^api\\./, \"\").replaceAll(\".\", \"/\").replaceAll(\":\", \"/\"),\n trimmed.replaceAll(\":\", \"/\"),\n trimmed.replaceAll(\".\", \"/\")\n ];\n\n for (const candidate of candidates) {\n if (functions[candidate]) {\n return candidate;\n }\n }\n\n const normalized = trimmed\n .replace(/^api\\./, \"\")\n .replaceAll(\".\", \"/\")\n .replaceAll(\":\", \"/\");\n const componentMatch = [...Object.keys(functions)]\n .filter((name) => isComponentPublicFunctionMatch(name, normalized))\n .sort((left, right) => left.localeCompare(right));\n if (componentMatch.length === 1) {\n return componentMatch[0]!;\n }\n\n return normalized;\n}\n\nexport async function listProjectTables(cwd: string): Promise<TableSummary[]> {\n const [paths, schema] = await Promise.all([\n requireProjectPaths(cwd),\n loadProjectSchema(cwd)\n ]);\n await mkdir(path.dirname(paths.databasePath), { recursive: true });\n const driver = new NodeSqliteDriver(paths.databasePath);\n\n try {\n const results: TableSummary[] = [];\n for (const tableName of schema.tableNames()) {\n const table = schema.getTable(tableName);\n const row = await driver.get<{ count: number }>(\n `SELECT COUNT(*) AS count FROM ${quoteIdentifier(tableName)}`\n );\n results.push({\n name: tableName,\n ...(table.options.tableName ? { displayName: table.options.tableName } : {}),\n owner: table.options.componentPath ? \"component\" : \"root\",\n ...(table.options.componentPath\n ? { componentPath: table.options.componentPath }\n : {}),\n ...(table.options.componentName\n ? { componentName: table.options.componentName }\n : {}),\n documentCount: Number(row?.count ?? 0)\n });\n }\n return results;\n } finally {\n await driver.close();\n }\n}\n\nexport async function readProjectTable(\n cwd: string,\n tableName: string,\n options: {\n limit: number;\n order: \"asc\" | \"desc\";\n }\n): Promise<TableRowsResult> {\n const paths = await requireProjectPaths(cwd);\n const driver = new NodeSqliteDriver(paths.databasePath);\n\n try {\n const rows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(\n `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(tableName)} ORDER BY _creationTime ${options.order.toUpperCase()} LIMIT ?`,\n [options.limit]\n );\n return {\n table: tableName,\n rows: rows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }))\n };\n } finally {\n await driver.close();\n }\n}\n\nexport async function exportProjectData(\n cwd: string,\n outputPath: string,\n options: {\n table?: string;\n } = {}\n): Promise<{\n path: string;\n tables: string[];\n format: \"json\" | \"jsonl\" | \"directory\" | \"zip\";\n}> {\n const resolvedOutput = path.resolve(cwd, outputPath);\n const tables = options.table\n ? [options.table]\n : (await listProjectTables(cwd)).map((table) => table.name);\n if (tables.length === 0) {\n throw new Error(\"No tables are available to export.\");\n }\n\n const payloads = await Promise.all(\n tables.map(async (table) => ({\n table,\n rows: (\n await readProjectTable(cwd, table, {\n limit: Number.MAX_SAFE_INTEGER,\n order: \"asc\"\n })\n ).rows\n }))\n );\n\n return await writeExportData(resolvedOutput, payloads);\n}\n\nexport async function writeExportData(\n resolvedOutput: string,\n payloads: Array<{ table: string; rows: Array<Record<string, unknown>> }>\n): Promise<{\n path: string;\n tables: string[];\n format: \"json\" | \"jsonl\" | \"directory\" | \"zip\";\n}> {\n const tables = payloads.map((payload) => payload.table);\n if (tables.length === 0) {\n throw new Error(\"No tables are available to export.\");\n }\n\n const extension = path.extname(resolvedOutput).toLowerCase();\n if (extension === \".json\" || extension === \".jsonl\") {\n if (tables.length !== 1) {\n throw new Error(\n `Single-file exports require --table. Available tables: ${tables.join(\", \")}`\n );\n }\n const payload = payloads[0]!;\n await mkdir(path.dirname(resolvedOutput), { recursive: true });\n await writeFile(\n resolvedOutput,\n extension === \".json\"\n ? `${JSON.stringify(payload.rows, null, 2)}\\n`\n : `${payload.rows.map((row) => JSON.stringify(row)).join(\"\\n\")}\\n`\n );\n return {\n path: resolvedOutput,\n tables: [payload.table],\n format: extension === \".json\" ? \"json\" : \"jsonl\"\n };\n }\n\n if (extension === \".zip\") {\n const zip = new AdmZip();\n for (const payload of payloads) {\n zip.addFile(\n `${payload.table}.jsonl`,\n Buffer.from(\n `${payload.rows.map((row) => JSON.stringify(row)).join(\"\\n\")}\\n`\n )\n );\n }\n await mkdir(path.dirname(resolvedOutput), { recursive: true });\n zip.writeZip(resolvedOutput);\n return {\n path: resolvedOutput,\n tables,\n format: \"zip\"\n };\n }\n\n await mkdir(resolvedOutput, { recursive: true });\n for (const payload of payloads) {\n await writeFile(\n path.join(resolvedOutput, `${payload.table}.jsonl`),\n `${payload.rows.map((row) => JSON.stringify(row)).join(\"\\n\")}\\n`\n );\n }\n\n return {\n path: resolvedOutput,\n tables,\n format: \"directory\"\n };\n}\n\nexport async function importProjectData(\n cwd: string,\n sourcePath: string,\n options: {\n table?: string;\n } = {}\n): Promise<Array<{ table: string; importedCount: number }>> {\n const resolvedSource = path.resolve(cwd, sourcePath);\n const extension = path.extname(resolvedSource).toLowerCase();\n const cleanupDirectories: string[] = [];\n\n try {\n const sources =\n extension === \".zip\"\n ? await extractImportSourcesFromZip(resolvedSource, cleanupDirectories)\n : await resolveImportSources(\n resolvedSource,\n options.table,\n cleanupDirectories\n );\n\n const imported = [] as Array<{ table: string; importedCount: number }>;\n for (const source of sources) {\n const importedCount = await importJsonlIntoProject(\n cwd,\n source.table,\n source.filePath\n );\n imported.push({\n table: source.table,\n importedCount\n });\n }\n return imported;\n } finally {\n for (const directory of cleanupDirectories) {\n await rm(directory, { recursive: true, force: true });\n }\n }\n}\n\nexport async function loadImportDocumentBatches(\n cwd: string,\n sourcePath: string,\n options: {\n table?: string;\n } = {}\n): Promise<ImportDocumentBatch[]> {\n const resolvedSource = path.resolve(cwd, sourcePath);\n const extension = path.extname(resolvedSource).toLowerCase();\n const cleanupDirectories: string[] = [];\n\n try {\n const sources =\n extension === \".zip\"\n ? await extractImportSourcesFromZip(resolvedSource, cleanupDirectories)\n : await resolveImportSources(\n resolvedSource,\n options.table,\n cleanupDirectories\n );\n\n return await Promise.all(\n sources.map(async (source) => ({\n table: source.table,\n rows: await readJsonlRows(source.filePath)\n }))\n );\n } finally {\n for (const directory of cleanupDirectories) {\n await rm(directory, { recursive: true, force: true });\n }\n }\n}\n\nexport async function findWorkspaceSyncoreProjects(\n cwd: string\n): Promise<WorkspaceProjectMatch[]> {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!(await fileExists(packageJsonPath))) {\n return [];\n }\n\n let workspaces: string[] = [];\n try {\n const packageJson = JSON.parse(await readFile(packageJsonPath, \"utf8\")) as {\n workspaces?: string[];\n };\n workspaces = packageJson.workspaces ?? [];\n } catch {\n return [];\n }\n\n const directories = new Set<string>();\n for (const workspace of workspaces) {\n const prefix = workspace.replace(/\\/\\*+$/, \"\");\n const fullPrefix = path.join(cwd, prefix);\n if (!(await fileExists(fullPrefix))) {\n continue;\n }\n const entries = await readdir(fullPrefix, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n directories.add(path.join(fullPrefix, entry.name));\n }\n }\n }\n\n const matches: WorkspaceProjectMatch[] = [];\n for (const directory of directories) {\n if (!(await fileExists(path.join(directory, \"syncore.config.ts\")))) {\n continue;\n }\n matches.push({\n path: directory,\n relativePath: path.relative(cwd, directory).replaceAll(\"\\\\\", \"/\"),\n template: await detectProjectTemplate(directory)\n });\n }\n return matches.sort((left, right) =>\n left.relativePath.localeCompare(right.relativePath)\n );\n}\n\nexport async function resolveDocsTarget(cwd: string): Promise<string> {\n const template = await detectProjectTemplate(cwd);\n const docsFile =\n template === \"react-web\"\n ? path.join(\"docs\", \"quickstarts\", \"react-web.md\")\n : template === \"next\"\n ? path.join(\"docs\", \"quickstarts\", \"next-pwa.md\")\n : template === \"expo\"\n ? path.join(\"docs\", \"quickstarts\", \"expo.md\")\n : template === \"electron\"\n ? path.join(\"docs\", \"quickstarts\", \"electron.md\")\n : template === \"node\"\n ? path.join(\"docs\", \"quickstarts\", \"node-script.md\")\n : path.join(\"README.md\");\n\n return pathToFileURL(\n path.resolve(import.meta.dirname, \"..\", \"..\", \"..\", docsFile)\n ).href;\n}\n\nexport function resolveDashboardUrl(): string {\n return `http://localhost:${resolvePortFromEnv(\"SYNCORE_DASHBOARD_PORT\", 4310)}`;\n}\n\nexport async function resolveActiveDashboardUrl(cwd: string): Promise<string> {\n const session = await readDevtoolsSessionState(cwd);\n return session?.authenticatedDashboardUrl ?? resolveDashboardUrl();\n}\n\nexport function resolveDevtoolsUrl(): string {\n return `ws://127.0.0.1:${resolvePortFromEnv(\"SYNCORE_DEVTOOLS_PORT\", 4311)}`;\n}\n\nexport async function readDevtoolsSessionState(\n cwd: string\n): Promise<DevHubSessionState | null> {\n const sessionPath = path.join(cwd, \".syncore\", \"devtools-session.json\");\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\ntype RuntimeHello = Extract<SyncoreDevtoolsMessage, { type: \"hello\" }>;\ntype RuntimeEventMessage = Extract<SyncoreDevtoolsMessage, { type: \"event\" }>;\n\ninterface HubConnection {\n collectSnapshot(timeoutMs?: number): Promise<{\n hellos: RuntimeHello[];\n events: RuntimeEventMessage[\"event\"][];\n }>;\n listRuntimeHellos(): RuntimeHello[];\n onEvent(listener: (event: RuntimeEventMessage[\"event\"]) => void): () => void;\n sendCommand(\n runtimeId: string,\n payload: SyncoreDevtoolsCommandPayload\n ): Promise<SyncoreDevtoolsCommandResultPayload>;\n subscribe(\n runtimeId: string,\n payload: SyncoreDevtoolsSubscriptionPayload,\n handlers: {\n onData(payload: SyncoreDevtoolsSubscriptionResultPayload): void;\n onError?(error: string): void;\n }\n ): () => void;\n dispose(): Promise<void>;\n}\n\nexport async function listConnectedClientTargets(\n devtoolsUrl = resolveDevtoolsUrl()\n): Promise<ClientTargetDescriptor[]> {\n const port = Number.parseInt(new URL(devtoolsUrl).port, 10);\n if (!Number.isFinite(port) || !(await isLocalPortInUse(port))) {\n return [];\n }\n\n let hub: HubConnection;\n try {\n hub = await connectToDevtoolsHub(devtoolsUrl);\n } catch {\n return [];\n }\n try {\n const snapshot = await hub.collectSnapshot();\n return buildClientTargets(snapshot.hellos);\n } finally {\n await hub.dispose();\n }\n}\n\nexport async function listAvailableTargets(\n cwd: string\n): Promise<SyncoreTargetDescriptor[]> {\n const [projectTarget, clientTargets] = await Promise.all([\n resolveProjectTargetDescriptor(cwd),\n listConnectedClientTargets()\n ]);\n\n return [\n ...(projectTarget ? [projectTarget] : []),\n ...clientTargets\n ];\n}\n\nexport async function connectToProjectHub(\n devtoolsUrl = resolveDevtoolsUrl()\n): Promise<HubConnection | null> {\n const port = Number.parseInt(new URL(devtoolsUrl).port, 10);\n if (!Number.isFinite(port) || !(await isLocalPortInUse(port))) {\n return null;\n }\n try {\n return await connectToDevtoolsHub(devtoolsUrl);\n } catch {\n return null;\n }\n}\n\nexport function isKnownTemplate(value: string): value is (typeof VALID_SYNCORE_TEMPLATES)[number] {\n return VALID_SYNCORE_TEMPLATES.includes(\n value as (typeof VALID_SYNCORE_TEMPLATES)[number]\n );\n}\n\nasync function loadRuntimeProjectFunctions(\n cwd: string\n): Promise<SyncoreFunctionRegistry> {\n try {\n return await loadProjectFunctions(cwd);\n } catch (error) {\n if (!(await fileExists(path.join(cwd, \"syncore\", \"functions\")))) {\n throw error;\n }\n\n await runCodegen(cwd);\n return await loadProjectFunctions(cwd);\n }\n}\n\nfunction isComponentPublicFunctionMatch(\n functionName: string,\n requestedName: string\n): boolean {\n const match = /^components\\/(.+)\\/public\\/(.+)$/.exec(functionName);\n if (!match) {\n return false;\n }\n const componentPath = match[1] ?? \"\";\n const localName = match[2] ?? \"\";\n return (\n requestedName === `components/${componentPath}/${localName}` ||\n requestedName === `${componentPath}/${localName}`\n );\n}\n\nfunction quoteIdentifier(value: string): string {\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n}\n\nasync function resolveImportSources(\n sourcePath: string,\n explicitTable: string | undefined,\n cleanupDirectories: string[]\n): Promise<ImportSource[]> {\n const extension = path.extname(sourcePath).toLowerCase();\n if (extension === \".jsonl\") {\n if (!explicitTable) {\n throw new Error(\"`syncorejs import` requires --table when importing a .jsonl file.\");\n }\n return [{ table: explicitTable, filePath: sourcePath }];\n }\n\n if (extension === \".json\") {\n if (!explicitTable) {\n throw new Error(\"`syncorejs import` requires --table when importing a .json file.\");\n }\n const rows = JSON.parse(await readFile(sourcePath, \"utf8\")) as unknown;\n if (!Array.isArray(rows)) {\n throw new Error(`${sourcePath} must contain a JSON array.`);\n }\n const { directory, filePath } = await writeRowsToTempJsonl(rows);\n cleanupDirectories.push(directory);\n return [{ table: explicitTable, filePath }];\n }\n\n if (await isDirectory(sourcePath)) {\n const entries = await readdir(sourcePath, { withFileTypes: true });\n const sources: ImportSource[] = [];\n for (const entry of entries) {\n const fullPath = path.join(sourcePath, entry.name);\n if (entry.isFile() && entry.name.endsWith(\".jsonl\")) {\n sources.push({\n table: entry.name.replace(/\\.jsonl$/i, \"\"),\n filePath: fullPath\n });\n }\n if (entry.isDirectory()) {\n const nestedPath = path.join(fullPath, \"documents.jsonl\");\n if (await fileExists(nestedPath)) {\n sources.push({\n table: entry.name,\n filePath: nestedPath\n });\n }\n }\n }\n if (sources.length === 0) {\n throw new Error(`No importable JSONL files were found in ${sourcePath}.`);\n }\n return sources.sort((left, right) => left.table.localeCompare(right.table));\n }\n\n throw new Error(`Unsupported import source: ${sourcePath}`);\n}\n\nasync function extractImportSourcesFromZip(\n sourcePath: string,\n cleanupDirectories: string[]\n): Promise<ImportSource[]> {\n const tempDirectory = await mkdtemp(\n path.join(os.tmpdir(), \"syncore-cli-import-\")\n );\n cleanupDirectories.push(tempDirectory);\n const zip = new AdmZip(sourcePath);\n await assertSafeZipExtractionPaths(sourcePath, zip, tempDirectory);\n zip.extractAllTo(tempDirectory, true);\n return await resolveImportSources(tempDirectory, undefined, cleanupDirectories);\n}\n\nasync function assertSafeZipExtractionPaths(\n sourcePath: string,\n zip: AdmZip,\n extractionDirectory: string\n): Promise<void> {\n const resolvedExtractionDirectory = path.resolve(extractionDirectory);\n const extractionRoot = `${resolvedExtractionDirectory}${path.sep}`;\n\n for (const entryPath of await readRawZipEntryPaths(sourcePath)) {\n assertSafeZipEntryPath(\n entryPath,\n resolvedExtractionDirectory,\n extractionRoot\n );\n }\n\n for (const entry of zip.getEntries()) {\n assertSafeZipEntryPath(\n entry.entryName,\n resolvedExtractionDirectory,\n extractionRoot\n );\n }\n}\n\nfunction assertSafeZipEntryPath(\n entryName: string,\n resolvedExtractionDirectory: string,\n extractionRoot: string\n): void {\n const entryPath = entryName.replaceAll(\"\\\\\", \"/\");\n if (path.posix.isAbsolute(entryPath) || /^[A-Za-z]:/.test(entryPath)) {\n throw new Error(`Invalid ZIP entry path: ${entryName}`);\n }\n\n const extractionTarget = path.resolve(resolvedExtractionDirectory, entryPath);\n if (\n extractionTarget !== resolvedExtractionDirectory &&\n !extractionTarget.startsWith(extractionRoot)\n ) {\n throw new Error(`Invalid ZIP entry path: ${entryName}`);\n }\n}\n\nasync function readRawZipEntryPaths(sourcePath: string): Promise<string[]> {\n const archive = await readFile(sourcePath);\n const endOfCentralDirectoryOffset = findEndOfCentralDirectoryOffset(archive);\n if (endOfCentralDirectoryOffset < 0) {\n throw new Error(`Invalid ZIP archive: ${sourcePath}`);\n }\n\n const entryCount = archive.readUInt16LE(endOfCentralDirectoryOffset + 10);\n const centralDirectorySize = archive.readUInt32LE(\n endOfCentralDirectoryOffset + 12\n );\n const centralDirectoryOffset = archive.readUInt32LE(\n endOfCentralDirectoryOffset + 16\n );\n const centralDirectoryEnd = centralDirectoryOffset + centralDirectorySize;\n if (centralDirectoryEnd > archive.length) {\n throw new Error(`Invalid ZIP archive: ${sourcePath}`);\n }\n\n const entryPaths: string[] = [];\n let cursor = centralDirectoryOffset;\n for (let index = 0; index < entryCount; index += 1) {\n if (cursor + 46 > centralDirectoryEnd) {\n throw new Error(`Invalid ZIP archive: ${sourcePath}`);\n }\n if (archive.readUInt32LE(cursor) !== 0x02014b50) {\n throw new Error(`Invalid ZIP archive: ${sourcePath}`);\n }\n\n const flags = archive.readUInt16LE(cursor + 8);\n const fileNameLength = archive.readUInt16LE(cursor + 28);\n const extraFieldLength = archive.readUInt16LE(cursor + 30);\n const commentLength = archive.readUInt16LE(cursor + 32);\n const fileNameStart = cursor + 46;\n const fileNameEnd = fileNameStart + fileNameLength;\n const nextEntryOffset = fileNameEnd + extraFieldLength + commentLength;\n if (nextEntryOffset > centralDirectoryEnd) {\n throw new Error(`Invalid ZIP archive: ${sourcePath}`);\n }\n\n entryPaths.push(\n decodeZipEntryPath(archive.subarray(fileNameStart, fileNameEnd), flags)\n );\n cursor = nextEntryOffset;\n }\n\n return entryPaths;\n}\n\nfunction findEndOfCentralDirectoryOffset(archive: Buffer): number {\n const minOffset = Math.max(0, archive.length - 0xffff - 22);\n for (let offset = archive.length - 22; offset >= minOffset; offset -= 1) {\n if (archive.readUInt32LE(offset) === 0x06054b50) {\n return offset;\n }\n }\n return -1;\n}\n\nfunction decodeZipEntryPath(entryPath: Buffer, flags: number): string {\n return entryPath.toString((flags & 0x0800) === 0 ? \"latin1\" : \"utf8\");\n}\n\nasync function writeRowsToTempJsonl(rows: unknown[]): Promise<{\n directory: string;\n filePath: string;\n}> {\n const tempDirectory = await mkdtemp(\n path.join(os.tmpdir(), \"syncore-cli-json-\")\n );\n const tempFile = path.join(tempDirectory, \"rows.jsonl\");\n await writeFile(\n tempFile,\n `${rows.map((row) => JSON.stringify(row)).join(\"\\n\")}\\n`\n );\n return {\n directory: tempDirectory,\n filePath: tempFile\n };\n}\n\nasync function readJsonlRows(\n filePath: string\n): Promise<Array<Record<string, unknown>>> {\n const source = await readFile(filePath, \"utf8\");\n const rows: Array<Record<string, unknown>> = [];\n let lineNumber = 0;\n\n for (const line of source.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n lineNumber += 1;\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\n `Line ${lineNumber} of ${filePath} must contain a JSON object.`\n );\n }\n rows.push(parsed as Record<string, unknown>);\n }\n\n return rows;\n}\n\nasync function isDirectory(filePath: string): Promise<boolean> {\n try {\n const entries = await readdir(filePath);\n return Array.isArray(entries);\n } catch {\n return false;\n }\n}\n\nasync function connectToDevtoolsHub(url: string): Promise<HubConnection> {\n const socket = new WebSocket(url);\n socket.on(\"error\", () => {\n // The hub can disappear between the port probe and the websocket handshake.\n // Keep those transient client-side failures from surfacing as process-level errors.\n });\n const hellos = new Map<string, RuntimeHello>();\n const events: RuntimeEventMessage[\"event\"][] = [];\n const eventListeners = new Set<(event: RuntimeEventMessage[\"event\"]) => void>();\n let lastSnapshotMessageAt = 0;\n const commandResolvers = new Map<\n string,\n {\n resolve(payload: SyncoreDevtoolsCommandResultPayload): void;\n reject(error: Error): void;\n }\n >();\n const subscriptionHandlers = new Map<\n string,\n {\n onData(payload: SyncoreDevtoolsSubscriptionResultPayload): void;\n onError?(error: string): void;\n }\n >();\n\n socket.on(\"message\", (rawPayload) => {\n const payload =\n typeof rawPayload === \"string\"\n ? rawPayload\n : rawPayload instanceof Buffer\n ? rawPayload.toString(\"utf8\")\n : Array.isArray(rawPayload)\n ? Buffer.concat(rawPayload).toString(\"utf8\")\n : rawPayload instanceof ArrayBuffer\n ? Buffer.from(rawPayload).toString(\"utf8\")\n : Buffer.from(\n rawPayload.buffer,\n rawPayload.byteOffset,\n rawPayload.byteLength\n ).toString(\"utf8\");\n if (payload.length === 0) {\n return;\n }\n\n const message = JSON.parse(payload) as SyncoreDevtoolsMessage;\n lastSnapshotMessageAt = Date.now();\n if (message.type === \"hello\") {\n hellos.set(message.runtimeId, message);\n return;\n }\n if (message.type === \"event\") {\n events.unshift(message.event);\n events.splice(200);\n if (message.event.type === \"runtime.disconnected\") {\n hellos.delete(message.event.runtimeId);\n }\n for (const listener of eventListeners) {\n listener(message.event);\n }\n return;\n }\n if (message.type === \"command.result\") {\n const resolver = commandResolvers.get(message.commandId);\n if (!resolver) {\n return;\n }\n commandResolvers.delete(message.commandId);\n resolver.resolve(message.payload);\n return;\n }\n if (message.type === \"subscription.data\") {\n subscriptionHandlers.get(message.subscriptionId)?.onData(message.payload);\n return;\n }\n if (message.type === \"subscription.error\") {\n subscriptionHandlers.get(message.subscriptionId)?.onError?.(message.error);\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n socket.once(\"open\", () => resolve());\n socket.once(\"error\", (error) => reject(error));\n });\n\n const dispose = async () => {\n for (const [commandId, resolver] of commandResolvers) {\n commandResolvers.delete(commandId);\n resolver.reject(new Error(\"Syncore devtools hub disconnected.\"));\n }\n subscriptionHandlers.clear();\n\n if (socket.readyState === WebSocket.CLOSED) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n socket.once(\"close\", () => resolve());\n socket.close();\n });\n };\n\n return {\n async collectSnapshot(timeoutMs = 500) {\n const deadline = Date.now() + timeoutMs;\n let lastObservedMessageAt = lastSnapshotMessageAt;\n\n while (Date.now() < deadline) {\n await new Promise((resolve) => setTimeout(resolve, 40));\n const sawClientHello = [...hellos.keys()].some(\n (runtimeId) => runtimeId !== \"syncore-dev-hub\"\n );\n if (!sawClientHello) {\n lastObservedMessageAt = lastSnapshotMessageAt;\n continue;\n }\n if (lastSnapshotMessageAt === lastObservedMessageAt) {\n break;\n }\n lastObservedMessageAt = lastSnapshotMessageAt;\n }\n return {\n hellos: [...hellos.values()],\n events: [...events]\n };\n },\n listRuntimeHellos() {\n return [...hellos.values()];\n },\n onEvent(listener) {\n eventListeners.add(listener);\n return () => {\n eventListeners.delete(listener);\n };\n },\n async sendCommand(runtimeId, payload) {\n const commandId = createHubRequestId(\"command\");\n const result = await new Promise<SyncoreDevtoolsCommandResultPayload>(\n (resolve, reject) => {\n commandResolvers.set(commandId, { resolve, reject });\n socket.send(\n JSON.stringify({\n type: \"command\",\n commandId,\n targetRuntimeId: runtimeId,\n payload\n } satisfies SyncoreDevtoolsClientMessage)\n );\n }\n );\n return result;\n },\n subscribe(runtimeId, payload, handlers) {\n const subscriptionId = createHubRequestId(\"subscription\");\n subscriptionHandlers.set(subscriptionId, handlers);\n socket.send(\n JSON.stringify({\n type: \"subscribe\",\n subscriptionId,\n targetRuntimeId: runtimeId,\n payload\n } satisfies SyncoreDevtoolsClientMessage)\n );\n return () => {\n if (!subscriptionHandlers.has(subscriptionId)) {\n return;\n }\n subscriptionHandlers.delete(subscriptionId);\n socket.send(\n JSON.stringify({\n type: \"unsubscribe\",\n subscriptionId,\n targetRuntimeId: runtimeId\n } satisfies SyncoreDevtoolsClientMessage)\n );\n };\n },\n dispose\n };\n}\n\nfunction buildClientTargets(hellos: RuntimeHello[]): ClientTargetDescriptor[] {\n const groups = new Map<\n string,\n {\n key: string;\n runtimes: RuntimeHello[];\n }\n >();\n\n for (const hello of hellos) {\n if (hello.runtimeId === \"syncore-dev-hub\") {\n continue;\n }\n const key = hello.storageIdentity ?? `runtime::${hello.runtimeId}`;\n const group = groups.get(key) ?? { key, runtimes: [] };\n group.runtimes.push(hello);\n groups.set(key, group);\n }\n\n const allRuntimeIds = hellos\n .filter((hello) => hello.runtimeId !== \"syncore-dev-hub\")\n .map((hello) => hello.runtimeId)\n .sort();\n\n return [...groups.values()]\n .map(({ key, runtimes }) => {\n const sortedRuntimes = [...runtimes].sort((left, right) =>\n left.runtimeId.localeCompare(right.runtimeId)\n );\n const primary = sortedRuntimes[0]!;\n const sessionLabels = Array.from(\n new Set(\n sortedRuntimes\n .map((entry) => entry.sessionLabel)\n .filter((value): value is string => typeof value === \"string\")\n )\n );\n const runtimeIds = sortedRuntimes.map((entry) => entry.runtimeId);\n const runtimeDescriptors = sortedRuntimes.map((entry, index) => ({\n id: createPublicRuntimeId(entry.runtimeId, allRuntimeIds),\n runtimeId: entry.runtimeId,\n label: getClientRuntimeLabel({\n ...(entry.sessionLabel ? { sessionLabel: entry.sessionLabel } : {}),\n ...(entry.appName ? { appName: entry.appName } : {}),\n platform: entry.platform\n }),\n platform: entry.platform,\n ...(entry.appName ? { appName: entry.appName } : {}),\n ...(entry.origin ? { origin: entry.origin } : {}),\n ...(entry.sessionLabel ? { sessionLabel: entry.sessionLabel } : {}),\n ...(entry.storageIdentity\n ? { storageIdentity: entry.storageIdentity }\n : {}),\n online: true as const,\n primary: index === 0\n }));\n return {\n id: createPublicClientTargetId(key, groups),\n kind: \"client\" as const,\n label: renderClientTargetLabel(primary, runtimes.length),\n runtimeId: primary.runtimeId,\n runtimeIds,\n runtimes: runtimeDescriptors,\n platform: primary.platform,\n ...(primary.appName ? { appName: primary.appName } : {}),\n ...(primary.origin ? { origin: primary.origin } : {}),\n sessionLabels,\n ...(primary.storageProtocol\n ? { storageProtocol: primary.storageProtocol }\n : {}),\n ...(primary.databaseLabel ? { databaseLabel: primary.databaseLabel } : {}),\n ...(primary.storageIdentity\n ? { storageIdentity: primary.storageIdentity }\n : {}),\n connectedSessions: runtimes.length,\n online: true as const,\n capabilities: [...CLIENT_TARGET_CAPABILITIES]\n };\n })\n .sort((left, right) => left.label.localeCompare(right.label));\n}\n\nexport function createPublicClientTargetId(\n key: string,\n groupsOrKeys: Map<string, { key: string; runtimes: RuntimeHello[] }> | Iterable<string>\n): string {\n const keys =\n groupsOrKeys instanceof Map ? [...groupsOrKeys.keys()] : [...groupsOrKeys];\n return createSharedPublicTargetId(key, keys);\n}\n\nexport function targetSupportsCapability(\n target: SyncoreTargetDescriptor,\n capability: TargetCapability\n): boolean {\n return target.capabilities.includes(capability);\n}\n\nfunction renderClientTargetLabel(\n hello: RuntimeHello,\n connectedSessions: number\n): string {\n const base =\n hello.appName ??\n hello.databaseLabel ??\n hello.origin ??\n `${hello.platform} client`;\n return connectedSessions > 1 ? `${base} (${connectedSessions} sessions)` : base;\n}\n\nexport function createBasePublicClientTargetId(input: string): string {\n return createBasePublicId(input);\n}\n\nfunction createHubRequestId(prefix: string): string {\n return `syncore-cli-${prefix}-${Date.now()}-${Math.random()\n .toString(36)\n .slice(2, 10)}`;\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import { templateUsesConnectedClients } from "./messages.mjs";
|
|
1
2
|
//#region src/render.ts
|
|
3
|
+
function formatPersistedLogEntry(entry) {
|
|
4
|
+
return formatLogEntry(entry);
|
|
5
|
+
}
|
|
2
6
|
function renderOutput(context, value, format) {
|
|
3
7
|
if (format === "json") {
|
|
4
8
|
context.printJson(value);
|
|
@@ -75,24 +79,45 @@ function printDoctorReport(report, options = {}) {
|
|
|
75
79
|
if (report.cwd) process.stdout.write(` cwd: ${report.cwd}\n`);
|
|
76
80
|
if (report.template) process.stdout.write(` template: ${report.template}\n`);
|
|
77
81
|
if (report.status) process.stdout.write(` status: ${report.status}\n`);
|
|
82
|
+
process.stdout.write(" issue:\n");
|
|
83
|
+
process.stdout.write(` ${report.primaryIssue.summary}\n`);
|
|
84
|
+
process.stdout.write(` details: ${report.primaryIssue.details}\n`);
|
|
85
|
+
process.stdout.write(` impact: ${report.primaryIssue.impact}\n`);
|
|
86
|
+
if (report.primaryIssue.suggestedAction) process.stdout.write(` action: ${report.primaryIssue.suggestedAction}\n`);
|
|
87
|
+
process.stdout.write(" diagnostics:\n");
|
|
88
|
+
for (const diagnostic of sortDiagnostics(report.diagnostics)) {
|
|
89
|
+
process.stdout.write(` ${diagnostic.status.toUpperCase()} ${diagnostic.category} ${diagnostic.summary}\n`);
|
|
90
|
+
if (diagnostic.details) process.stdout.write(` ${diagnostic.details}\n`);
|
|
91
|
+
if (diagnostic.suggestedAction) process.stdout.write(` next: ${diagnostic.suggestedAction}\n`);
|
|
92
|
+
if (diagnostic.canAutoFix && diagnostic.fixCommand) process.stdout.write(` autofix: ${diagnostic.fixCommand}\n`);
|
|
93
|
+
}
|
|
94
|
+
process.stdout.write(" files:\n");
|
|
78
95
|
for (const category of [
|
|
79
96
|
"project",
|
|
80
97
|
"generated",
|
|
81
98
|
"schema"
|
|
82
99
|
]) {
|
|
83
|
-
process.stdout.write(`
|
|
84
|
-
for (const check of report.checks.filter((entry) => entry.category === category)) process.stdout.write(`
|
|
100
|
+
process.stdout.write(` ${category}:\n`);
|
|
101
|
+
for (const check of report.checks.filter((entry) => entry.category === category)) process.stdout.write(` ${check.ok ? "OK" : "MISSING"} ${check.path}\n`);
|
|
85
102
|
}
|
|
86
103
|
process.stdout.write(" hub:\n");
|
|
87
104
|
process.stdout.write(` ${report.hub.running ? "OK" : "MISSING"} ${report.hub.url}\n`);
|
|
88
105
|
if (options.verbose) {
|
|
89
106
|
if (report.hub.dashboardUrl) process.stdout.write(` ${report.hub.dashboardRunning ? "OK" : "MISSING"} ${report.hub.dashboardUrl}\n`);
|
|
90
107
|
if (report.hub.ports) process.stdout.write(` ports: dashboard=${report.hub.ports.dashboard} devtools=${report.hub.ports.devtools}\n`);
|
|
108
|
+
}
|
|
109
|
+
process.stdout.write(" drift:\n");
|
|
110
|
+
process.stdout.write(` state: ${report.drift.state}\n`);
|
|
111
|
+
process.stdout.write(` current: ${report.drift.currentSchemaHash ?? "unavailable"} stored: ${report.drift.storedSchemaHash ?? "none"}\n`);
|
|
112
|
+
if (report.drift.details) process.stdout.write(` ${report.drift.details}\n`);
|
|
113
|
+
if (report.drift.destructiveChanges.length > 0) process.stdout.write(` destructive: ${report.drift.destructiveChanges.join("; ")}\n`);
|
|
114
|
+
if (report.projectTarget) {
|
|
115
|
+
process.stdout.write(" project target:\n");
|
|
116
|
+
process.stdout.write(` db: ${report.projectTarget.databasePath}\n`);
|
|
117
|
+
process.stdout.write(` storage: ${report.projectTarget.storageDirectory}\n`);
|
|
118
|
+
} else if (options.verbose) {
|
|
91
119
|
process.stdout.write(" project target:\n");
|
|
92
|
-
|
|
93
|
-
process.stdout.write(` db: ${report.projectTarget.databasePath}\n`);
|
|
94
|
-
process.stdout.write(` storage: ${report.projectTarget.storageDirectory}\n`);
|
|
95
|
-
} else process.stdout.write(" none\n");
|
|
120
|
+
process.stdout.write(" none\n");
|
|
96
121
|
}
|
|
97
122
|
process.stdout.write(" targets:\n");
|
|
98
123
|
if (report.targets.length === 0) {
|
|
@@ -107,13 +132,20 @@ function printDoctorReport(report, options = {}) {
|
|
|
107
132
|
for (const runtime of target.runtimes) process.stdout.write(` runtime ${runtime.id} label=${runtime.label} origin=${runtime.origin ?? "unknown"} platform=${runtime.platform} status=online${runtime.primary ? " primary=true" : ""}\n`);
|
|
108
133
|
}
|
|
109
134
|
}
|
|
135
|
+
if (report.runtimeSignals.recent.length > 0 && (options.verbose || report.status !== "ready")) {
|
|
136
|
+
process.stdout.write(" runtime signals:\n");
|
|
137
|
+
for (const signal of report.runtimeSignals.recent) process.stdout.write(` ${new Date(signal.timestamp).toISOString()} ${signal.category} ${signal.targetId} ${signal.message}\n`);
|
|
138
|
+
}
|
|
110
139
|
}
|
|
111
140
|
function printDevReadySummary(context, options) {
|
|
112
141
|
const projectTarget = options.targets.find((target) => target.kind === "project");
|
|
113
142
|
const clientTargets = options.targets.filter((target) => target.kind === "client");
|
|
114
143
|
process.stdout.write("\nReady:\n");
|
|
115
144
|
process.stdout.write(` template: ${options.template}\n`);
|
|
116
|
-
process.stdout.write(` projectTarget: ${options.projectTargetConfigured
|
|
145
|
+
process.stdout.write(` projectTarget: ${describeProjectTargetState(options.template, options.projectTargetConfigured)}\n`);
|
|
146
|
+
if (options.codegenStatus) process.stdout.write(` codegen: ${options.codegenStatus}\n`);
|
|
147
|
+
if (options.driftStatus) process.stdout.write(` drift: ${options.driftStatus}\n`);
|
|
148
|
+
if (options.typecheckStatus) process.stdout.write(` typecheck: ${options.typecheckStatus}\n`);
|
|
117
149
|
process.stdout.write(` dashboard: ${options.dashboardUrl}\n`);
|
|
118
150
|
process.stdout.write(` devtools: ${options.devtoolsUrl}\n`);
|
|
119
151
|
if (projectTarget && options.targets.length === 1) process.stdout.write(" default target: project\n");
|
|
@@ -121,13 +153,29 @@ function printDevReadySummary(context, options) {
|
|
|
121
153
|
else process.stdout.write(" targets: waiting for client\n");
|
|
122
154
|
context.nextStep("Run `npx syncorejs targets` for detailed target inspection.");
|
|
123
155
|
}
|
|
156
|
+
function describeProjectTargetState(template, projectTargetConfigured) {
|
|
157
|
+
if (projectTargetConfigured) return "configured";
|
|
158
|
+
return templateUsesConnectedClients(template) ? "client-managed" : "not configured";
|
|
159
|
+
}
|
|
124
160
|
function isPersistedLogEntry(value) {
|
|
125
161
|
return Boolean(value && typeof value === "object" && "eventType" in value && "category" in value && "message" in value);
|
|
126
162
|
}
|
|
127
163
|
function formatLogEntry(entry) {
|
|
128
|
-
return `${new Date(entry.timestamp).toISOString().slice(11, 19)} ${entry.targetId ?? "all"} ${entry.origin === "dashboard" ? "dashboard" : entry.publicRuntimeId && entry.runtimeLabel ? `${entry.publicRuntimeId} ${entry.runtimeLabel}` : entry.publicRuntimeId ?? entry.runtimeLabel ?? "runtime"} ${entry.category} ${entry.message}`;
|
|
164
|
+
return `${new Date(entry.timestamp).toISOString().slice(11, 19)} ${entry.targetId ?? "all"} ${entry.origin === "dashboard" ? "dashboard" : entry.publicRuntimeId && entry.runtimeLabel ? `${entry.publicRuntimeId} ${entry.runtimeLabel}` : entry.publicRuntimeId ?? entry.runtimeLabel ?? "runtime"}${entry.owner === "component" && entry.componentPath ? ` component:${entry.componentPath}` : ""} ${entry.category} ${entry.message}`;
|
|
165
|
+
}
|
|
166
|
+
function sortDiagnostics(diagnostics) {
|
|
167
|
+
const order = {
|
|
168
|
+
fail: 0,
|
|
169
|
+
warn: 1,
|
|
170
|
+
pass: 2
|
|
171
|
+
};
|
|
172
|
+
return [...diagnostics].sort((left, right) => {
|
|
173
|
+
const statusDiff = order[left.status] - order[right.status];
|
|
174
|
+
if (statusDiff !== 0) return statusDiff;
|
|
175
|
+
return left.id.localeCompare(right.id);
|
|
176
|
+
});
|
|
129
177
|
}
|
|
130
178
|
//#endregion
|
|
131
|
-
export { printDevReadySummary, printDoctorReport, printTargetsTable, renderOutput };
|
|
179
|
+
export { formatPersistedLogEntry, printDevReadySummary, printDoctorReport, printTargetsTable, renderOutput };
|
|
132
180
|
|
|
133
181
|
//# sourceMappingURL=render.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.mjs","names":[],"sources":["../src/render.ts"],"sourcesContent":["import type { CliContext } from \"./context.js\";\nimport type {\n ClientTargetDescriptor,\n SyncoreTargetDescriptor\n} from \"./project.js\";\n\nexport type JsonLikeFormat = \"pretty\" | \"json\" | \"jsonl\";\n\nexport interface PersistedLogEntry {\n version?: 2;\n timestamp: number;\n runtimeId: string;\n targetId: string;\n targetLabel?: string;\n publicRuntimeId?: string;\n runtimeLabel?: string;\n origin?: \"runtime\" | \"dashboard\";\n platform?: string;\n eventType: string;\n category: \"query\" | \"mutation\" | \"action\" | \"system\";\n message: string;\n event: Record<string, unknown>;\n}\n\nexport function renderOutput(\n context: CliContext,\n value: unknown,\n format: JsonLikeFormat\n): void {\n if (format === \"json\") {\n context.printJson(value);\n return;\n }\n if (format === \"jsonl\") {\n if (Array.isArray(value)) {\n for (const entry of value) {\n process.stdout.write(`${JSON.stringify(entry)}\\n`);\n }\n return;\n }\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n return;\n }\n\n if (Array.isArray(value) && value.every((entry) => isPersistedLogEntry(entry))) {\n for (const entry of value) {\n process.stdout.write(`${formatLogEntry(entry)}\\n`);\n }\n return;\n }\n if (isPersistedLogEntry(value)) {\n process.stdout.write(`${formatLogEntry(value)}\\n`);\n return;\n }\n if (typeof value === \"string\") {\n process.stdout.write(`${value}\\n`);\n return;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n process.stdout.write(\"[]\\n\");\n return;\n }\n for (const [index, entry] of value.entries()) {\n process.stdout.write(`${JSON.stringify(entry, null, 2)}\\n`);\n if (index < value.length - 1) {\n process.stdout.write(\"\\n\");\n }\n }\n return;\n }\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\nexport function printTargetsTable(\n targets: SyncoreTargetDescriptor[],\n options: {\n verbose?: boolean;\n } = {}\n): void {\n if (targets.length === 0) {\n process.stdout.write(\" No targets available.\\n\");\n return;\n }\n process.stdout.write(\" project:\\n\");\n const projectTargets = targets.filter((target) => target.kind === \"project\");\n if (projectTargets.length === 0) {\n process.stdout.write(\" none\\n\");\n }\n for (const target of projectTargets) {\n process.stdout.write(\n ` ${target.id} ${target.label} online ${target.capabilities.join(\", \")}\\n`\n );\n process.stdout.write(` db: ${target.databasePath}\\n`);\n process.stdout.write(` storage: ${target.storageDirectory}\\n`);\n }\n process.stdout.write(\" clients:\\n\");\n const clientTargets = targets.filter((target) => target.kind === \"client\");\n if (clientTargets.length === 0) {\n process.stdout.write(\" none\\n\");\n return;\n }\n for (const target of clientTargets) {\n process.stdout.write(\n ` ${target.id} ${target.label} ${target.platform} ${target.connectedSessions} session(s)\\n`\n );\n process.stdout.write(\n ` origin: ${target.origin ?? \"unknown\"} storage: ${target.storageProtocol ?? \"unknown\"} capabilities: ${target.capabilities.join(\", \")}\\n`\n );\n for (const runtime of target.runtimes) {\n process.stdout.write(\n ` runtime ${runtime.id} ${runtime.label}${runtime.primary ? \" primary\" : \"\"}\\n`\n );\n process.stdout.write(\n ` origin: ${runtime.origin ?? \"unknown\"} platform: ${runtime.platform} status: online\\n`\n );\n }\n if (options.verbose) {\n process.stdout.write(\n ` runtimeIds: ${target.runtimeIds.join(\", \")}\\n`\n );\n for (const runtime of target.runtimes) {\n if (runtime.appName || runtime.sessionLabel || runtime.storageIdentity) {\n process.stdout.write(\n ` app: ${runtime.appName ?? \"unknown\"} session: ${runtime.sessionLabel ?? \"unknown\"} storageIdentity: ${runtime.storageIdentity ?? \"unknown\"}\\n`\n );\n }\n }\n process.stdout.write(\n ` sessions: ${target.sessionLabels.join(\", \") || \"unknown\"}\\n`\n );\n process.stdout.write(\n ` storageIdentity: ${target.storageIdentity ?? \"unknown\"} database: ${target.databaseLabel ?? \"unknown\"}\\n`\n );\n }\n }\n}\n\nexport function printDoctorReport(\n report: {\n cwd?: string;\n status?: string;\n template?: string;\n checks: Array<{ category: \"project\" | \"generated\" | \"schema\"; path: string; ok: boolean }>;\n hub: {\n running: boolean;\n url: string;\n dashboardUrl?: string;\n dashboardRunning?: boolean;\n ports?: { devtools: number; dashboard: number };\n };\n targets: SyncoreTargetDescriptor[];\n projectTarget?: {\n databasePath: string;\n storageDirectory: string;\n } | null;\n },\n options: {\n verbose?: boolean;\n } = {}\n): void {\n if (report.cwd) {\n process.stdout.write(` cwd: ${report.cwd}\\n`);\n }\n if (report.template) {\n process.stdout.write(` template: ${report.template}\\n`);\n }\n if (report.status) {\n process.stdout.write(` status: ${report.status}\\n`);\n }\n for (const category of [\"project\", \"generated\", \"schema\"] as const) {\n process.stdout.write(` ${category}:\\n`);\n for (const check of report.checks.filter((entry) => entry.category === category)) {\n process.stdout.write(` ${check.ok ? \"OK\" : \"MISSING\"} ${check.path}\\n`);\n }\n }\n\n process.stdout.write(\" hub:\\n\");\n process.stdout.write(` ${report.hub.running ? \"OK\" : \"MISSING\"} ${report.hub.url}\\n`);\n if (options.verbose) {\n if (report.hub.dashboardUrl) {\n process.stdout.write(\n ` ${report.hub.dashboardRunning ? \"OK\" : \"MISSING\"} ${report.hub.dashboardUrl}\\n`\n );\n }\n if (report.hub.ports) {\n process.stdout.write(\n ` ports: dashboard=${report.hub.ports.dashboard} devtools=${report.hub.ports.devtools}\\n`\n );\n }\n process.stdout.write(\" project target:\\n\");\n if (report.projectTarget) {\n process.stdout.write(` db: ${report.projectTarget.databasePath}\\n`);\n process.stdout.write(` storage: ${report.projectTarget.storageDirectory}\\n`);\n } else {\n process.stdout.write(\" none\\n\");\n }\n }\n\n process.stdout.write(\" targets:\\n\");\n if (report.targets.length === 0) {\n process.stdout.write(\" none\\n\");\n return;\n }\n for (const target of report.targets) {\n process.stdout.write(\n ` ${target.id} (${target.kind}) ${target.label} [${target.capabilities.join(\", \")}]\\n`\n );\n if (options.verbose && target.kind === \"client\") {\n process.stdout.write(\n ` platform=${target.platform} origin=${target.origin ?? \"unknown\"} storage=${target.storageProtocol ?? \"unknown\"} sessions=${target.connectedSessions}\\n`\n );\n process.stdout.write(\n ` runtimeIds=${target.runtimeIds.join(\", \")}\\n`\n );\n for (const runtime of target.runtimes) {\n process.stdout.write(\n ` runtime ${runtime.id} label=${runtime.label} origin=${runtime.origin ?? \"unknown\"} platform=${runtime.platform} status=online${runtime.primary ? \" primary=true\" : \"\"}\\n`\n );\n }\n }\n }\n}\n\nexport function printDevReadySummary(\n context: CliContext,\n options: {\n template: string;\n projectTargetConfigured: boolean;\n dashboardUrl: string;\n devtoolsUrl: string;\n targets: SyncoreTargetDescriptor[];\n }\n): void {\n const projectTarget = options.targets.find((target) => target.kind === \"project\");\n const clientTargets = options.targets.filter(\n (target): target is ClientTargetDescriptor => target.kind === \"client\"\n );\n\n process.stdout.write(\"\\nReady:\\n\");\n process.stdout.write(` template: ${options.template}\\n`);\n process.stdout.write(\n ` projectTarget: ${options.projectTargetConfigured ? \"configured\" : \"not configured\"}\\n`\n );\n process.stdout.write(` dashboard: ${options.dashboardUrl}\\n`);\n process.stdout.write(` devtools: ${options.devtoolsUrl}\\n`);\n if (projectTarget && options.targets.length === 1) {\n process.stdout.write(\" default target: project\\n\");\n } else if (clientTargets.length > 0) {\n process.stdout.write(` targets: ${clientTargets.map((target) => target.id).join(\", \")}\\n`);\n } else {\n process.stdout.write(\" targets: waiting for client\\n\");\n }\n\n context.nextStep(\"Run `npx syncorejs targets` for detailed target inspection.\");\n}\n\nfunction isPersistedLogEntry(value: unknown): value is PersistedLogEntry {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"eventType\" in value &&\n \"category\" in value &&\n \"message\" in value\n );\n}\n\nfunction formatLogEntry(entry: PersistedLogEntry): string {\n const timestamp = new Date(entry.timestamp).toISOString().slice(11, 19);\n const target = entry.targetId ?? \"all\";\n const runtime =\n entry.origin === \"dashboard\"\n ? \"dashboard\"\n : entry.publicRuntimeId && entry.runtimeLabel\n ? `${entry.publicRuntimeId} ${entry.runtimeLabel}`\n : entry.publicRuntimeId ?? entry.runtimeLabel ?? \"runtime\";\n return `${timestamp} ${target} ${runtime} ${entry.category} ${entry.message}`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"render.mjs","names":[],"sources":["../src/render.ts"],"sourcesContent":["import type { CliContext } from \"./context.js\";\nimport type { DoctorReport } from \"./doctor.js\";\nimport type {\n ClientTargetDescriptor,\n SyncoreTargetDescriptor\n} from \"./project.js\";\nimport { templateUsesConnectedClients } from \"./messages.js\";\n\nexport type JsonLikeFormat = \"pretty\" | \"json\" | \"jsonl\";\n\nexport interface PersistedLogEntry {\n version?: 2;\n timestamp: number;\n runtimeId: string;\n targetId: string;\n targetLabel?: string;\n publicRuntimeId?: string;\n runtimeLabel?: string;\n origin?: \"runtime\" | \"dashboard\";\n platform?: string;\n eventType: string;\n category: \"query\" | \"mutation\" | \"action\" | \"system\";\n owner?: \"root\" | \"component\";\n componentPath?: string;\n componentName?: string;\n message: string;\n event: Record<string, unknown>;\n}\n\nexport function formatPersistedLogEntry(entry: PersistedLogEntry): string {\n return formatLogEntry(entry);\n}\n\nexport function renderOutput(\n context: CliContext,\n value: unknown,\n format: JsonLikeFormat\n): void {\n if (format === \"json\") {\n context.printJson(value);\n return;\n }\n if (format === \"jsonl\") {\n if (Array.isArray(value)) {\n for (const entry of value) {\n process.stdout.write(`${JSON.stringify(entry)}\\n`);\n }\n return;\n }\n process.stdout.write(`${JSON.stringify(value)}\\n`);\n return;\n }\n\n if (Array.isArray(value) && value.every((entry) => isPersistedLogEntry(entry))) {\n for (const entry of value) {\n process.stdout.write(`${formatLogEntry(entry)}\\n`);\n }\n return;\n }\n if (isPersistedLogEntry(value)) {\n process.stdout.write(`${formatLogEntry(value)}\\n`);\n return;\n }\n if (typeof value === \"string\") {\n process.stdout.write(`${value}\\n`);\n return;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n process.stdout.write(\"[]\\n\");\n return;\n }\n for (const [index, entry] of value.entries()) {\n process.stdout.write(`${JSON.stringify(entry, null, 2)}\\n`);\n if (index < value.length - 1) {\n process.stdout.write(\"\\n\");\n }\n }\n return;\n }\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\nexport function printTargetsTable(\n targets: SyncoreTargetDescriptor[],\n options: {\n verbose?: boolean;\n } = {}\n): void {\n if (targets.length === 0) {\n process.stdout.write(\" No targets available.\\n\");\n return;\n }\n process.stdout.write(\" project:\\n\");\n const projectTargets = targets.filter((target) => target.kind === \"project\");\n if (projectTargets.length === 0) {\n process.stdout.write(\" none\\n\");\n }\n for (const target of projectTargets) {\n process.stdout.write(\n ` ${target.id} ${target.label} online ${target.capabilities.join(\", \")}\\n`\n );\n process.stdout.write(` db: ${target.databasePath}\\n`);\n process.stdout.write(` storage: ${target.storageDirectory}\\n`);\n }\n process.stdout.write(\" clients:\\n\");\n const clientTargets = targets.filter((target) => target.kind === \"client\");\n if (clientTargets.length === 0) {\n process.stdout.write(\" none\\n\");\n return;\n }\n for (const target of clientTargets) {\n process.stdout.write(\n ` ${target.id} ${target.label} ${target.platform} ${target.connectedSessions} session(s)\\n`\n );\n process.stdout.write(\n ` origin: ${target.origin ?? \"unknown\"} storage: ${target.storageProtocol ?? \"unknown\"} capabilities: ${target.capabilities.join(\", \")}\\n`\n );\n for (const runtime of target.runtimes) {\n process.stdout.write(\n ` runtime ${runtime.id} ${runtime.label}${runtime.primary ? \" primary\" : \"\"}\\n`\n );\n process.stdout.write(\n ` origin: ${runtime.origin ?? \"unknown\"} platform: ${runtime.platform} status: online\\n`\n );\n }\n if (options.verbose) {\n process.stdout.write(\n ` runtimeIds: ${target.runtimeIds.join(\", \")}\\n`\n );\n for (const runtime of target.runtimes) {\n if (runtime.appName || runtime.sessionLabel || runtime.storageIdentity) {\n process.stdout.write(\n ` app: ${runtime.appName ?? \"unknown\"} session: ${runtime.sessionLabel ?? \"unknown\"} storageIdentity: ${runtime.storageIdentity ?? \"unknown\"}\\n`\n );\n }\n }\n process.stdout.write(\n ` sessions: ${target.sessionLabels.join(\", \") || \"unknown\"}\\n`\n );\n process.stdout.write(\n ` storageIdentity: ${target.storageIdentity ?? \"unknown\"} database: ${target.databaseLabel ?? \"unknown\"}\\n`\n );\n }\n }\n}\n\nexport function printDoctorReport(\n report: DoctorReport,\n options: {\n verbose?: boolean;\n } = {}\n): void {\n if (report.cwd) {\n process.stdout.write(` cwd: ${report.cwd}\\n`);\n }\n if (report.template) {\n process.stdout.write(` template: ${report.template}\\n`);\n }\n if (report.status) {\n process.stdout.write(` status: ${report.status}\\n`);\n }\n process.stdout.write(\" issue:\\n\");\n process.stdout.write(` ${report.primaryIssue.summary}\\n`);\n process.stdout.write(` details: ${report.primaryIssue.details}\\n`);\n process.stdout.write(` impact: ${report.primaryIssue.impact}\\n`);\n if (report.primaryIssue.suggestedAction) {\n process.stdout.write(` action: ${report.primaryIssue.suggestedAction}\\n`);\n }\n\n process.stdout.write(\" diagnostics:\\n\");\n for (const diagnostic of sortDiagnostics(report.diagnostics)) {\n process.stdout.write(\n ` ${diagnostic.status.toUpperCase()} ${diagnostic.category} ${diagnostic.summary}\\n`\n );\n if (diagnostic.details) {\n process.stdout.write(` ${diagnostic.details}\\n`);\n }\n if (diagnostic.suggestedAction) {\n process.stdout.write(` next: ${diagnostic.suggestedAction}\\n`);\n }\n if (diagnostic.canAutoFix && diagnostic.fixCommand) {\n process.stdout.write(` autofix: ${diagnostic.fixCommand}\\n`);\n }\n }\n\n process.stdout.write(\" files:\\n\");\n for (const category of [\"project\", \"generated\", \"schema\"] as const) {\n process.stdout.write(` ${category}:\\n`);\n for (const check of report.checks.filter((entry) => entry.category === category)) {\n process.stdout.write(` ${check.ok ? \"OK\" : \"MISSING\"} ${check.path}\\n`);\n }\n }\n\n process.stdout.write(\" hub:\\n\");\n process.stdout.write(` ${report.hub.running ? \"OK\" : \"MISSING\"} ${report.hub.url}\\n`);\n if (options.verbose) {\n if (report.hub.dashboardUrl) {\n process.stdout.write(\n ` ${report.hub.dashboardRunning ? \"OK\" : \"MISSING\"} ${report.hub.dashboardUrl}\\n`\n );\n }\n if (report.hub.ports) {\n process.stdout.write(\n ` ports: dashboard=${report.hub.ports.dashboard} devtools=${report.hub.ports.devtools}\\n`\n );\n }\n }\n\n process.stdout.write(\" drift:\\n\");\n process.stdout.write(` state: ${report.drift.state}\\n`);\n process.stdout.write(\n ` current: ${report.drift.currentSchemaHash ?? \"unavailable\"} stored: ${report.drift.storedSchemaHash ?? \"none\"}\\n`\n );\n if (report.drift.details) {\n process.stdout.write(` ${report.drift.details}\\n`);\n }\n if (report.drift.destructiveChanges.length > 0) {\n process.stdout.write(` destructive: ${report.drift.destructiveChanges.join(\"; \")}\\n`);\n }\n if (report.projectTarget) {\n process.stdout.write(\" project target:\\n\");\n process.stdout.write(` db: ${report.projectTarget.databasePath}\\n`);\n process.stdout.write(` storage: ${report.projectTarget.storageDirectory}\\n`);\n } else if (options.verbose) {\n process.stdout.write(\" project target:\\n\");\n process.stdout.write(\" none\\n\");\n }\n\n process.stdout.write(\" targets:\\n\");\n if (report.targets.length === 0) {\n process.stdout.write(\" none\\n\");\n return;\n }\n for (const target of report.targets) {\n process.stdout.write(\n ` ${target.id} (${target.kind}) ${target.label} [${target.capabilities.join(\", \")}]\\n`\n );\n if (options.verbose && target.kind === \"client\") {\n process.stdout.write(\n ` platform=${target.platform} origin=${target.origin ?? \"unknown\"} storage=${target.storageProtocol ?? \"unknown\"} sessions=${target.connectedSessions}\\n`\n );\n process.stdout.write(\n ` runtimeIds=${target.runtimeIds.join(\", \")}\\n`\n );\n for (const runtime of target.runtimes) {\n process.stdout.write(\n ` runtime ${runtime.id} label=${runtime.label} origin=${runtime.origin ?? \"unknown\"} platform=${runtime.platform} status=online${runtime.primary ? \" primary=true\" : \"\"}\\n`\n );\n }\n }\n }\n\n if (report.runtimeSignals.recent.length > 0 && (options.verbose || report.status !== \"ready\")) {\n process.stdout.write(\" runtime signals:\\n\");\n for (const signal of report.runtimeSignals.recent) {\n process.stdout.write(\n ` ${new Date(signal.timestamp).toISOString()} ${signal.category} ${signal.targetId} ${signal.message}\\n`\n );\n }\n }\n}\n\nexport function printDevReadySummary(\n context: CliContext,\n options: {\n template: string;\n projectTargetConfigured: boolean;\n dashboardUrl: string;\n devtoolsUrl: string;\n targets: SyncoreTargetDescriptor[];\n codegenStatus?: string;\n driftStatus?: string;\n typecheckStatus?: string;\n }\n): void {\n const projectTarget = options.targets.find((target) => target.kind === \"project\");\n const clientTargets = options.targets.filter(\n (target): target is ClientTargetDescriptor => target.kind === \"client\"\n );\n\n process.stdout.write(\"\\nReady:\\n\");\n process.stdout.write(` template: ${options.template}\\n`);\n process.stdout.write(\n ` projectTarget: ${describeProjectTargetState(options.template, options.projectTargetConfigured)}\\n`\n );\n if (options.codegenStatus) {\n process.stdout.write(` codegen: ${options.codegenStatus}\\n`);\n }\n if (options.driftStatus) {\n process.stdout.write(` drift: ${options.driftStatus}\\n`);\n }\n if (options.typecheckStatus) {\n process.stdout.write(` typecheck: ${options.typecheckStatus}\\n`);\n }\n process.stdout.write(` dashboard: ${options.dashboardUrl}\\n`);\n process.stdout.write(` devtools: ${options.devtoolsUrl}\\n`);\n if (projectTarget && options.targets.length === 1) {\n process.stdout.write(\" default target: project\\n\");\n } else if (clientTargets.length > 0) {\n process.stdout.write(` targets: ${clientTargets.map((target) => target.id).join(\", \")}\\n`);\n } else {\n process.stdout.write(\" targets: waiting for client\\n\");\n }\n\n context.nextStep(\"Run `npx syncorejs targets` for detailed target inspection.\");\n}\n\nfunction describeProjectTargetState(\n template: string,\n projectTargetConfigured: boolean\n): string {\n if (projectTargetConfigured) {\n return \"configured\";\n }\n return templateUsesConnectedClients(template)\n ? \"client-managed\"\n : \"not configured\";\n}\n\nfunction isPersistedLogEntry(value: unknown): value is PersistedLogEntry {\n return Boolean(\n value &&\n typeof value === \"object\" &&\n \"eventType\" in value &&\n \"category\" in value &&\n \"message\" in value\n );\n}\n\nfunction formatLogEntry(entry: PersistedLogEntry): string {\n const timestamp = new Date(entry.timestamp).toISOString().slice(11, 19);\n const target = entry.targetId ?? \"all\";\n const runtime =\n entry.origin === \"dashboard\"\n ? \"dashboard\"\n : entry.publicRuntimeId && entry.runtimeLabel\n ? `${entry.publicRuntimeId} ${entry.runtimeLabel}`\n : entry.publicRuntimeId ?? entry.runtimeLabel ?? \"runtime\";\n const component =\n entry.owner === \"component\" && entry.componentPath\n ? ` component:${entry.componentPath}`\n : \"\";\n return `${timestamp} ${target} ${runtime}${component} ${entry.category} ${entry.message}`;\n}\n\nfunction sortDiagnostics(\n diagnostics: DoctorReport[\"diagnostics\"]\n): DoctorReport[\"diagnostics\"] {\n const order: Record<\"fail\" | \"warn\" | \"pass\", number> = {\n fail: 0,\n warn: 1,\n pass: 2\n };\n return [...diagnostics].sort((left, right) => {\n const statusDiff = order[left.status] - order[right.status];\n if (statusDiff !== 0) {\n return statusDiff;\n }\n return left.id.localeCompare(right.id);\n });\n}\n"],"mappings":"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"}
|
|
@@ -57,16 +57,17 @@ function resolveClientRuntime(target, requestedRuntime, options) {
|
|
|
57
57
|
requestedRuntime
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
|
-
|
|
60
|
+
const normalizedRuntimeId = requestedRuntime.trim().toUpperCase();
|
|
61
|
+
if (!/^[A-Z]\d{3}$/.test(normalizedRuntimeId)) throw new CliError(`Invalid runtime ${JSON.stringify(requestedRuntime)} for \`${options.command}\`.`, {
|
|
61
62
|
category: "target",
|
|
62
63
|
nextSteps: buildSelectTargetNextSteps(),
|
|
63
64
|
details: {
|
|
64
65
|
targetId: target.id,
|
|
65
66
|
requestedRuntime,
|
|
66
|
-
expected: "a
|
|
67
|
+
expected: "a runtime id like A123"
|
|
67
68
|
}
|
|
68
69
|
});
|
|
69
|
-
const runtime = target.runtimes.find((entry) => entry.id ===
|
|
70
|
+
const runtime = target.runtimes.find((entry) => entry.id === normalizedRuntimeId);
|
|
70
71
|
if (!runtime) throw new CliError(`Unknown runtime ${JSON.stringify(requestedRuntime)} for target ${JSON.stringify(target.id)}.`, {
|
|
71
72
|
category: "target",
|
|
72
73
|
nextSteps: buildSelectTargetNextSteps(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targets.mjs","names":[],"sources":["../src/targets.ts"],"sourcesContent":["import type { CliContext } from \"./context.js\";\nimport {\n listAvailableTargets,\n targetSupportsCapability,\n type ClientRuntimeDescriptor,\n type SyncoreTargetDescriptor,\n type TargetCapability\n} from \"./project.js\";\nimport { CliError } from \"./errors.js\";\nimport { buildNoTargetsNextSteps, buildSelectTargetNextSteps } from \"./messages.js\";\n\nexport interface ResolveOperationalTargetOptions {\n command: \"run\" | \"data\" | \"import\" | \"export\" | \"logs\";\n capability: TargetCapability;\n}\n\nexport async function resolveOperationalTarget(\n context: CliContext,\n requestedTarget: string | undefined,\n options: ResolveOperationalTargetOptions\n): Promise<SyncoreTargetDescriptor> {\n const allTargets = await listAvailableTargets(context.cwd);\n const targets = allTargets.filter((target) =>\n targetSupportsCapability(target, options.capability)\n );\n if (targets.length === 0) {\n throw new CliError(\n `No Syncore targets are available for \\`${options.command}\\`.`,\n {\n category: \"target\",\n nextSteps: buildNoTargetsNextSteps(),\n details: {\n command: options.command,\n capability: options.capability\n }\n }\n );\n }\n\n if (requestedTarget) {\n if (requestedTarget !== \"project\" && !/^\\d{5}$/.test(requestedTarget)) {\n throw new CliError(\n `Invalid target ${JSON.stringify(requestedTarget)} for \\`${options.command}\\`.`,\n {\n category: \"target\",\n nextSteps: buildSelectTargetNextSteps(),\n details: {\n requestedTarget,\n expected: \"project or a 5-digit target id\"\n }\n }\n );\n }\n const matchedTarget = targets.find((target) => target.id === requestedTarget);\n if (!matchedTarget) {\n throw new CliError(\n `Unknown target ${JSON.stringify(requestedTarget)} for \\`${options.command}\\`.`,\n {\n category: \"target\",\n nextSteps: buildSelectTargetNextSteps(),\n details: {\n requestedTarget,\n availableTargets: targets.map((target) => target.id)\n }\n }\n );\n }\n return matchedTarget;\n }\n\n if (targets.length === 1) {\n context.info(`Using target ${targets[0]!.id} automatically.`);\n return targets[0]!;\n }\n\n if (!context.interactive) {\n throw new CliError(\n `Multiple Syncore targets are available for \\`${options.command}\\`.`,\n {\n category: \"target\",\n nextSteps: buildSelectTargetNextSteps(),\n details: {\n availableTargets: targets.map((target) => target.id)\n }\n }\n );\n }\n\n return await context.select(\n \"Choose a Syncore target.\",\n targets.map((target) => ({\n label: `${target.id} - ${target.label}`,\n value: target,\n description:\n target.kind === \"project\"\n ? target.databasePath\n : `${target.platform}, ${target.connectedSessions} session(s), ${target.capabilities.join(\"/\")}`\n }))\n );\n}\n\nexport function resolveClientRuntime(\n target: SyncoreTargetDescriptor,\n requestedRuntime: string | undefined,\n options: {\n command: \"run\" | \"data\" | \"import\" | \"export\" | \"logs\";\n }\n): ClientRuntimeDescriptor | null {\n if (!requestedRuntime) {\n return target.kind === \"client\"\n ? target.runtimes.find((runtime) => runtime.primary) ?? target.runtimes[0] ?? null\n : null;\n }\n\n if (target.kind === \"project\") {\n throw new CliError(\n `\\`${options.command}\\` does not accept --runtime for the project target.`,\n {\n category: \"target\",\n nextSteps: buildSelectTargetNextSteps(),\n details: {\n targetId: target.id,\n requestedRuntime\n }\n }\n );\n }\n\n if (
|
|
1
|
+
{"version":3,"file":"targets.mjs","names":[],"sources":["../src/targets.ts"],"sourcesContent":["import type { CliContext } from \"./context.js\";\nimport {\n listAvailableTargets,\n targetSupportsCapability,\n type ClientRuntimeDescriptor,\n type SyncoreTargetDescriptor,\n type TargetCapability\n} from \"./project.js\";\nimport { CliError } from \"./errors.js\";\nimport { buildNoTargetsNextSteps, buildSelectTargetNextSteps } from \"./messages.js\";\n\nexport interface ResolveOperationalTargetOptions {\n command: \"run\" | \"data\" | \"import\" | \"export\" | \"logs\";\n capability: TargetCapability;\n}\n\nexport async function resolveOperationalTarget(\n context: CliContext,\n requestedTarget: string | undefined,\n options: ResolveOperationalTargetOptions\n): Promise<SyncoreTargetDescriptor> {\n const allTargets = await listAvailableTargets(context.cwd);\n const targets = allTargets.filter((target) =>\n targetSupportsCapability(target, options.capability)\n );\n if (targets.length === 0) {\n throw new CliError(\n `No Syncore targets are available for \\`${options.command}\\`.`,\n {\n category: \"target\",\n nextSteps: buildNoTargetsNextSteps(),\n details: {\n command: options.command,\n capability: options.capability\n }\n }\n );\n }\n\n if (requestedTarget) {\n if (requestedTarget !== \"project\" && !/^\\d{5}$/.test(requestedTarget)) {\n throw new CliError(\n `Invalid target ${JSON.stringify(requestedTarget)} for \\`${options.command}\\`.`,\n {\n category: \"target\",\n nextSteps: buildSelectTargetNextSteps(),\n details: {\n requestedTarget,\n expected: \"project or a 5-digit target id\"\n }\n }\n );\n }\n const matchedTarget = targets.find((target) => target.id === requestedTarget);\n if (!matchedTarget) {\n throw new CliError(\n `Unknown target ${JSON.stringify(requestedTarget)} for \\`${options.command}\\`.`,\n {\n category: \"target\",\n nextSteps: buildSelectTargetNextSteps(),\n details: {\n requestedTarget,\n availableTargets: targets.map((target) => target.id)\n }\n }\n );\n }\n return matchedTarget;\n }\n\n if (targets.length === 1) {\n context.info(`Using target ${targets[0]!.id} automatically.`);\n return targets[0]!;\n }\n\n if (!context.interactive) {\n throw new CliError(\n `Multiple Syncore targets are available for \\`${options.command}\\`.`,\n {\n category: \"target\",\n nextSteps: buildSelectTargetNextSteps(),\n details: {\n availableTargets: targets.map((target) => target.id)\n }\n }\n );\n }\n\n return await context.select(\n \"Choose a Syncore target.\",\n targets.map((target) => ({\n label: `${target.id} - ${target.label}`,\n value: target,\n description:\n target.kind === \"project\"\n ? target.databasePath\n : `${target.platform}, ${target.connectedSessions} session(s), ${target.capabilities.join(\"/\")}`\n }))\n );\n}\n\nexport function resolveClientRuntime(\n target: SyncoreTargetDescriptor,\n requestedRuntime: string | undefined,\n options: {\n command: \"run\" | \"data\" | \"import\" | \"export\" | \"logs\";\n }\n): ClientRuntimeDescriptor | null {\n if (!requestedRuntime) {\n return target.kind === \"client\"\n ? target.runtimes.find((runtime) => runtime.primary) ?? target.runtimes[0] ?? null\n : null;\n }\n\n if (target.kind === \"project\") {\n throw new CliError(\n `\\`${options.command}\\` does not accept --runtime for the project target.`,\n {\n category: \"target\",\n nextSteps: buildSelectTargetNextSteps(),\n details: {\n targetId: target.id,\n requestedRuntime\n }\n }\n );\n }\n\n const normalizedRuntimeId = requestedRuntime.trim().toUpperCase();\n if (!/^[A-Z]\\d{3}$/.test(normalizedRuntimeId)) {\n throw new CliError(\n `Invalid runtime ${JSON.stringify(requestedRuntime)} for \\`${options.command}\\`.`,\n {\n category: \"target\",\n nextSteps: buildSelectTargetNextSteps(),\n details: {\n targetId: target.id,\n requestedRuntime,\n expected: \"a runtime id like A123\"\n }\n }\n );\n }\n\n const runtime = target.runtimes.find((entry) => entry.id === normalizedRuntimeId);\n if (!runtime) {\n throw new CliError(\n `Unknown runtime ${JSON.stringify(requestedRuntime)} for target ${JSON.stringify(target.id)}.`,\n {\n category: \"target\",\n nextSteps: buildSelectTargetNextSteps(),\n details: {\n targetId: target.id,\n requestedRuntime,\n availableRuntimes: target.runtimes.map((entry) => ({\n id: entry.id,\n label: entry.label\n }))\n }\n }\n );\n }\n\n return runtime;\n}\n"],"mappings":";;;;AAgBA,eAAsB,yBACpB,SACA,iBACA,SACkC;CAElC,MAAM,WADa,MAAM,qBAAqB,QAAQ,IAAI,EAC/B,QAAQ,WACjC,yBAAyB,QAAQ,QAAQ,WAAW,CACrD;AACD,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,SACR,0CAA0C,QAAQ,QAAQ,MAC1D;EACE,UAAU;EACV,WAAW,yBAAyB;EACpC,SAAS;GACP,SAAS,QAAQ;GACjB,YAAY,QAAQ;GACrB;EACF,CACF;AAGH,KAAI,iBAAiB;AACnB,MAAI,oBAAoB,aAAa,CAAC,UAAU,KAAK,gBAAgB,CACnE,OAAM,IAAI,SACR,kBAAkB,KAAK,UAAU,gBAAgB,CAAC,SAAS,QAAQ,QAAQ,MAC3E;GACE,UAAU;GACV,WAAW,4BAA4B;GACvC,SAAS;IACP;IACA,UAAU;IACX;GACF,CACF;EAEH,MAAM,gBAAgB,QAAQ,MAAM,WAAW,OAAO,OAAO,gBAAgB;AAC7E,MAAI,CAAC,cACH,OAAM,IAAI,SACR,kBAAkB,KAAK,UAAU,gBAAgB,CAAC,SAAS,QAAQ,QAAQ,MAC3E;GACE,UAAU;GACV,WAAW,4BAA4B;GACvC,SAAS;IACP;IACA,kBAAkB,QAAQ,KAAK,WAAW,OAAO,GAAG;IACrD;GACF,CACF;AAEH,SAAO;;AAGT,KAAI,QAAQ,WAAW,GAAG;AACxB,UAAQ,KAAK,gBAAgB,QAAQ,GAAI,GAAG,iBAAiB;AAC7D,SAAO,QAAQ;;AAGjB,KAAI,CAAC,QAAQ,YACX,OAAM,IAAI,SACR,gDAAgD,QAAQ,QAAQ,MAChE;EACE,UAAU;EACV,WAAW,4BAA4B;EACvC,SAAS,EACP,kBAAkB,QAAQ,KAAK,WAAW,OAAO,GAAG,EACrD;EACF,CACF;AAGH,QAAO,MAAM,QAAQ,OACnB,4BACA,QAAQ,KAAK,YAAY;EACvB,OAAO,GAAG,OAAO,GAAG,KAAK,OAAO;EAChC,OAAO;EACP,aACE,OAAO,SAAS,YACZ,OAAO,eACP,GAAG,OAAO,SAAS,IAAI,OAAO,kBAAkB,eAAe,OAAO,aAAa,KAAK,IAAI;EACnG,EAAE,CACJ;;AAGH,SAAgB,qBACd,QACA,kBACA,SAGgC;AAChC,KAAI,CAAC,iBACH,QAAO,OAAO,SAAS,WACnB,OAAO,SAAS,MAAM,YAAY,QAAQ,QAAQ,IAAI,OAAO,SAAS,MAAM,OAC5E;AAGN,KAAI,OAAO,SAAS,UAClB,OAAM,IAAI,SACR,KAAK,QAAQ,QAAQ,uDACrB;EACE,UAAU;EACV,WAAW,4BAA4B;EACvC,SAAS;GACP,UAAU,OAAO;GACjB;GACD;EACF,CACF;CAGH,MAAM,sBAAsB,iBAAiB,MAAM,CAAC,aAAa;AACjE,KAAI,CAAC,eAAe,KAAK,oBAAoB,CAC3C,OAAM,IAAI,SACR,mBAAmB,KAAK,UAAU,iBAAiB,CAAC,SAAS,QAAQ,QAAQ,MAC7E;EACE,UAAU;EACV,WAAW,4BAA4B;EACvC,SAAS;GACP,UAAU,OAAO;GACjB;GACA,UAAU;GACX;EACF,CACF;CAGH,MAAM,UAAU,OAAO,SAAS,MAAM,UAAU,MAAM,OAAO,oBAAoB;AACjF,KAAI,CAAC,QACH,OAAM,IAAI,SACR,mBAAmB,KAAK,UAAU,iBAAiB,CAAC,cAAc,KAAK,UAAU,OAAO,GAAG,CAAC,IAC5F;EACE,UAAU;EACV,WAAW,4BAA4B;EACvC,SAAS;GACP,UAAU,OAAO;GACjB;GACA,mBAAmB,OAAO,SAAS,KAAK,WAAW;IACjD,IAAI,MAAM;IACV,OAAO,MAAM;IACd,EAAE;GACJ;EACF,CACF;AAGH,QAAO"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SyncoreFunctionRegistry } from "./runtime/runtime.mjs";
|
|
1
|
+
import { SyncoreFunctionRegistry, SyncoreResolvedComponents } from "./runtime/runtime.mjs";
|
|
2
2
|
import { index_d_exports } from "./index.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/cli.d.ts
|
|
@@ -11,7 +11,14 @@ interface SyncoreConfig {
|
|
|
11
11
|
databasePath?: string;
|
|
12
12
|
storageDirectory?: string;
|
|
13
13
|
}
|
|
14
|
+
interface DevHubSessionState {
|
|
15
|
+
dashboardUrl: string;
|
|
16
|
+
authenticatedDashboardUrl: string;
|
|
17
|
+
devtoolsUrl: string;
|
|
18
|
+
token: string;
|
|
19
|
+
}
|
|
14
20
|
type SyncoreTemplateName = "minimal" | "node" | "react-web" | "expo" | "electron" | "next";
|
|
21
|
+
declare function templateUsesConnectedClients(template: SyncoreTemplateName): boolean;
|
|
15
22
|
interface ScaffoldProjectOptions {
|
|
16
23
|
template: SyncoreTemplateName;
|
|
17
24
|
force?: boolean;
|
|
@@ -42,8 +49,11 @@ declare function importJsonlIntoProject(cwd: string, tableName: string, sourcePa
|
|
|
42
49
|
declare function resolveDefaultSeedFile(cwd: string, tableName: string): Promise<string | null>;
|
|
43
50
|
declare function resolveProjectTargetConfig(config: SyncoreConfig): SyncoreProjectTargetConfig | null;
|
|
44
51
|
declare function loadProjectConfig(cwd: string): Promise<SyncoreConfig>;
|
|
52
|
+
declare function loadProjectRootSchema(cwd: string): Promise<index_d_exports.SyncoreSchema<Record<string, index_d_exports.AnyTableDefinition>>>;
|
|
53
|
+
declare function loadProjectComponentsManifest(cwd: string): Promise<Record<string, unknown>>;
|
|
45
54
|
declare function loadProjectSchema(cwd: string): Promise<index_d_exports.SyncoreSchema<Record<string, index_d_exports.AnyTableDefinition>>>;
|
|
46
55
|
declare function loadProjectFunctions(cwd: string): Promise<SyncoreFunctionRegistry>;
|
|
56
|
+
declare function loadProjectResolvedComponents(cwd: string): Promise<SyncoreResolvedComponents>;
|
|
47
57
|
declare function readStoredSnapshot(cwd: string): Promise<index_d_exports.SchemaSnapshot | null>;
|
|
48
58
|
declare function writeStoredSnapshot(cwd: string, snapshot: index_d_exports.SchemaSnapshot): Promise<void>;
|
|
49
59
|
declare function getNextMigrationNumber(directory: string): Promise<number>;
|
|
@@ -55,9 +65,9 @@ declare function slugify(value: string): string;
|
|
|
55
65
|
declare function startDevHub(options: {
|
|
56
66
|
cwd: string;
|
|
57
67
|
template: SyncoreTemplateName;
|
|
58
|
-
}): Promise<
|
|
68
|
+
}): Promise<DevHubSessionState>;
|
|
59
69
|
declare function runDevProjectBootstrap(cwd: string, template: SyncoreTemplateName): Promise<void>;
|
|
60
70
|
declare function resolvePortFromEnv(environmentVariable: string, fallback: number): number;
|
|
61
71
|
//#endregion
|
|
62
|
-
export { SYNCORE_MIGRATION_SNAPSHOT_FILE_NAME, ScaffoldProjectOptions, ScaffoldProjectResult, SyncoreConfig, SyncoreProjectTargetConfig, SyncoreTemplateName, VALID_SYNCORE_TEMPLATES, applyProjectMigrations, detectProjectTemplate, fileExists, formatError, getNextMigrationNumber, hasSyncoreProject, importJsonlIntoProject, isLocalPortInUse, loadProjectConfig, loadProjectFunctions, loadProjectSchema, logScaffoldResult, readPackageJson, readStoredSnapshot, resolveDefaultSeedFile, resolvePortFromEnv, resolveProjectTargetConfig, resolveRequestedTemplate, runCodegen, runDevProjectBootstrap, runSyncoreCli, scaffoldProject, slugify, startDevHub, writeStoredSnapshot };
|
|
72
|
+
export { DevHubSessionState, SYNCORE_MIGRATION_SNAPSHOT_FILE_NAME, ScaffoldProjectOptions, ScaffoldProjectResult, SyncoreConfig, SyncoreProjectTargetConfig, SyncoreTemplateName, VALID_SYNCORE_TEMPLATES, applyProjectMigrations, detectProjectTemplate, fileExists, formatError, getNextMigrationNumber, hasSyncoreProject, importJsonlIntoProject, isLocalPortInUse, loadProjectComponentsManifest, loadProjectConfig, loadProjectFunctions, loadProjectResolvedComponents, loadProjectRootSchema, loadProjectSchema, logScaffoldResult, readPackageJson, readStoredSnapshot, resolveDefaultSeedFile, resolvePortFromEnv, resolveProjectTargetConfig, resolveRequestedTemplate, runCodegen, runDevProjectBootstrap, runSyncoreCli, scaffoldProject, slugify, startDevHub, templateUsesConnectedClients, writeStoredSnapshot };
|
|
63
73
|
//# sourceMappingURL=cli.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.mts","names":[],"sources":["../src/cli.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"cli.d.mts","names":[],"sources":["../src/cli.ts"],"mappings":";;;;UA+DiB,0BAAA;EACf,YAAA;EACA,gBAAA;AAAA;AAAA,UAGe,aAAA;EACf,aAAA,GAAgB,0BAAA;EAChB,YAAA;EACA,gBAAA;AAAA;AAAA,UAGe,kBAAA;EACf,YAAA;EACA,yBAAA;EACA,WAAA;EACA,KAAA;AAAA;AAAA,KAGU,mBAAA;AAAA,iBAQI,4BAAA,CACd,QAAA,EAAU,mBAAA;AAAA,UAgBK,sBAAA;EACf,QAAA,EAAU,mBAAA;EACV,KAAA;AAAA;AAAA,UAGe,qBAAA;EACf,QAAA,EAAU,mBAAA;EACV,OAAA;EACA,OAAA;EACA,OAAA;AAAA;AAAA,UAGQ,gBAAA;EACR,IAAA;EACA,OAAA,GAAU,MAAA;EACV,YAAA,GAAe,MAAA;EACf,eAAA,GAAkB,MAAA;AAAA;AAAA,cAYP,oCAAA;AAAA,cACA,uBAAA,EAAyB,mBAAA;AAAA,iBAsMhB,aAAA,CAAc,IAAA,cAAsB,OAAA;AAAA,iBAQpC,UAAA,CAAW,GAAA,WAAc,OAAA;AAAA,iBA0PzB,eAAA,CACpB,GAAA,UACA,OAAA,EAAS,sBAAA,GACR,OAAA,CAAQ,qBAAA;AAAA,iBAkQK,iBAAA,CACd,MAAA,EAAQ,qBAAA,EACR,OAAA;AAAA,iBA6BoB,iBAAA,CAAkB,GAAA,WAAc,OAAA;AAAA,iBAQhC,wBAAA,CACpB,GAAA,UACA,iBAAA,WACC,OAAA,CAAQ,mBAAA;AAAA,iBAgBW,qBAAA,CACpB,GAAA,WACC,OAAA,CAAQ,mBAAA;AAAA,iBA8BW,eAAA,CACpB,GAAA,WACC,OAAA,CAAQ,gBAAA;AAAA,iBAoJW,sBAAA,CACpB,GAAA,UACA,SAAA,UACA,UAAA,WACC,OAAA;AAAA,iBAkEmB,sBAAA,CACpB,GAAA,UACA,SAAA,WACC,OAAA;AAAA,iBA2Wa,0BAAA,CACd,MAAA,EAAQ,aAAA,GACP,0BAAA;AAAA,iBAuBmB,iBAAA,CAAkB,GAAA,WAAc,OAAA,CAAQ,aAAA;AAAA,iBAwBxC,qBAAA,CACpB,GAAA,WACC,OAAA,CAAQ,eAAA,CAAA,aAAA,CAAc,MAAA,SAAe,eAAA,CAAA,kBAAA;AAAA,iBAgBlB,6BAAA,CACpB,GAAA,WACC,OAAA,CAAQ,MAAA;AAAA,iBAeW,iBAAA,CACpB,GAAA,WACC,OAAA,CAAQ,eAAA,CAAA,aAAA,CAAc,MAAA,SAAe,eAAA,CAAA,kBAAA;AAAA,iBA0ElB,oBAAA,CACpB,GAAA,WACC,OAAA,CAAQ,uBAAA;AAAA,iBAiBW,6BAAA,CACpB,GAAA,WACC,OAAA,CAAQ,yBAAA;AAAA,iBAgWW,kBAAA,CACpB,GAAA,WACC,OAAA,CAAQ,eAAA,CAAA,cAAA;AAAA,iBAaW,mBAAA,CACpB,GAAA,UACA,QAAA,EAAU,eAAA,CAAA,cAAA,GACT,OAAA;AAAA,iBASmB,sBAAA,CACpB,SAAA,WACC,OAAA;AAAA,iBAemB,sBAAA,CACpB,GAAA,WACC,OAAA;AAAA,iBAoHmB,UAAA,CAAW,QAAA,WAAmB,OAAA;AAAA,iBA+CpC,WAAA,CAAY,KAAA;AAAA,iBAON,gBAAA,CAAiB,IAAA,WAAe,OAAA;AAAA,iBAatC,OAAA,CAAQ,KAAA;AAAA,iBAkCF,WAAA,CAAY,OAAA;EAChC,GAAA;EACA,QAAA,EAAU,mBAAA;AAAA,IACR,OAAA,CAAQ,kBAAA;AAAA,iBAokBU,sBAAA,CACpB,GAAA,UACA,QAAA,EAAU,mBAAA,GACT,OAAA;AAAA,iBAyKa,kBAAA,CACd,mBAAA,UACA,QAAA"}
|