syncorejs 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{core/src/cli.d.ts → _vendor/cli/app.d.mts} +4 -2
- package/dist/_vendor/cli/app.d.mts.map +1 -0
- package/dist/_vendor/cli/app.mjs +997 -0
- package/dist/_vendor/cli/app.mjs.map +1 -0
- package/dist/_vendor/cli/context.mjs +180 -0
- package/dist/_vendor/cli/context.mjs.map +1 -0
- package/dist/_vendor/cli/dev-session.mjs +49 -0
- package/dist/_vendor/cli/dev-session.mjs.map +1 -0
- package/dist/_vendor/cli/doctor.mjs +80 -0
- package/dist/_vendor/cli/doctor.mjs.map +1 -0
- package/dist/_vendor/cli/errors.mjs +22 -0
- package/dist/_vendor/cli/errors.mjs.map +1 -0
- package/dist/_vendor/cli/help.mjs +26 -0
- package/dist/_vendor/cli/help.mjs.map +1 -0
- package/dist/_vendor/cli/index.d.mts +2 -0
- package/dist/_vendor/cli/index.mjs +23 -0
- package/dist/_vendor/cli/index.mjs.map +1 -0
- package/dist/_vendor/cli/messages.mjs +32 -0
- package/dist/_vendor/cli/messages.mjs.map +1 -0
- package/dist/_vendor/cli/preflight.mjs +35 -0
- package/dist/_vendor/cli/preflight.mjs.map +1 -0
- package/dist/_vendor/cli/project.mjs +583 -0
- package/dist/_vendor/cli/project.mjs.map +1 -0
- package/dist/_vendor/cli/render.mjs +133 -0
- package/dist/_vendor/cli/render.mjs.map +1 -0
- package/dist/_vendor/cli/targets.mjs +87 -0
- package/dist/_vendor/cli/targets.mjs.map +1 -0
- package/dist/_vendor/core/cli.d.mts +59 -1
- package/dist/_vendor/core/cli.d.mts.map +1 -1
- package/dist/_vendor/core/cli.mjs +528 -75
- package/dist/_vendor/core/cli.mjs.map +1 -1
- package/dist/_vendor/core/index.d.mts +12 -4
- package/dist/_vendor/core/index.d.mts.map +1 -0
- package/dist/_vendor/core/index.mjs +4 -3
- package/dist/_vendor/core/index.mjs.map +1 -1
- package/dist/_vendor/core/runtime/devtools.d.mts +32 -6
- package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/devtools.mjs +397 -182
- package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
- package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
- package/dist/_vendor/core/runtime/runtime.d.mts +89 -7
- package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/runtime.mjs +303 -32
- package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
- package/dist/_vendor/devtools-protocol/index.d.ts +189 -82
- package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
- package/dist/_vendor/devtools-protocol/index.js +39 -0
- package/dist/_vendor/devtools-protocol/index.js.map +1 -0
- package/dist/_vendor/next/config.d.ts.map +1 -1
- package/dist/_vendor/next/config.js +2 -5
- package/dist/_vendor/next/config.js.map +1 -1
- package/dist/_vendor/platform-expo/index.d.ts +15 -5
- package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/index.js +33 -3
- package/dist/_vendor/platform-expo/index.js.map +1 -1
- package/dist/_vendor/platform-expo/react.js.map +1 -1
- package/dist/_vendor/platform-node/index.d.mts +10 -5
- package/dist/_vendor/platform-node/index.d.mts.map +1 -1
- package/dist/_vendor/platform-node/index.mjs +145 -35
- package/dist/_vendor/platform-node/index.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
- package/dist/_vendor/platform-web/external-change.d.ts +39 -0
- package/dist/_vendor/platform-web/external-change.d.ts.map +1 -0
- package/dist/_vendor/platform-web/external-change.js +61 -0
- package/dist/_vendor/platform-web/external-change.js.map +1 -0
- package/dist/_vendor/platform-web/index.d.ts +27 -5
- package/dist/_vendor/platform-web/index.d.ts.map +1 -1
- package/dist/_vendor/platform-web/index.js +310 -44
- package/dist/_vendor/platform-web/index.js.map +1 -1
- package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
- package/dist/_vendor/platform-web/opfs.js.map +1 -1
- package/dist/_vendor/platform-web/persistence.js.map +1 -1
- package/dist/_vendor/platform-web/react.js.map +1 -1
- package/dist/_vendor/platform-web/sqljs.js +22 -2
- package/dist/_vendor/platform-web/sqljs.js.map +1 -1
- package/dist/_vendor/schema/definition.js.map +1 -1
- package/dist/_vendor/schema/planner.js.map +1 -1
- package/dist/_vendor/schema/validators.js.map +1 -1
- package/dist/browser-react.d.ts +1 -1
- package/dist/browser-react.js +1 -1
- package/dist/browser.d.ts +6 -7
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +4 -5
- package/dist/browser.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +12 -3
- package/dist/cli.js.map +1 -1
- package/dist/expo-react.d.ts +1 -1
- package/dist/expo-react.js +1 -1
- package/dist/expo.d.ts +1 -2
- package/dist/expo.js +1 -2
- package/dist/index.d.ts +3 -7
- package/dist/index.js +3 -8
- package/dist/next-config.d.ts +1 -2
- package/dist/next-config.js +1 -2
- package/dist/next.d.ts +1 -3
- package/dist/next.js +1 -3
- package/dist/node-ipc-react.d.ts +1 -1
- package/dist/node-ipc-react.js +1 -1
- package/dist/node-ipc.d.ts +1 -2
- package/dist/node-ipc.js +1 -2
- package/dist/node.d.ts +1 -4
- package/dist/node.js +1 -3
- package/dist/react.d.ts +1 -2
- package/dist/react.js +1 -2
- package/dist/svelte.d.ts +1 -2
- package/dist/svelte.js +1 -2
- package/package.json +6 -3
- package/dist/core/src/cli.d.ts.map +0 -1
- package/dist/core/src/cli.js +0 -1196
- package/dist/core/src/cli.js.map +0 -1
- package/dist/core/src/index.js +0 -7
- package/dist/core/src/runtime/devtools.d.ts +0 -7
- package/dist/core/src/runtime/devtools.d.ts.map +0 -1
- package/dist/core/src/runtime/devtools.js +0 -300
- package/dist/core/src/runtime/devtools.js.map +0 -1
- package/dist/core/src/runtime/functions.d.ts +0 -123
- package/dist/core/src/runtime/functions.d.ts.map +0 -1
- package/dist/core/src/runtime/functions.js +0 -71
- package/dist/core/src/runtime/functions.js.map +0 -1
- package/dist/core/src/runtime/id.d.ts +0 -13
- package/dist/core/src/runtime/id.d.ts.map +0 -1
- package/dist/core/src/runtime/id.js +0 -28
- package/dist/core/src/runtime/id.js.map +0 -1
- package/dist/core/src/runtime/runtime.d.ts +0 -371
- package/dist/core/src/runtime/runtime.d.ts.map +0 -1
- package/dist/core/src/runtime/runtime.js +0 -1143
- package/dist/core/src/runtime/runtime.js.map +0 -1
- package/dist/devtools-protocol/src/index.d.ts +0 -201
- package/dist/devtools-protocol/src/index.d.ts.map +0 -1
- package/dist/next/src/config.d.ts +0 -17
- package/dist/next/src/config.d.ts.map +0 -1
- package/dist/next/src/config.js +0 -73
- package/dist/next/src/config.js.map +0 -1
- package/dist/next/src/index.d.ts +0 -80
- package/dist/next/src/index.d.ts.map +0 -1
- package/dist/next/src/index.js +0 -82
- package/dist/next/src/index.js.map +0 -1
- package/dist/platform-expo/src/index.d.ts +0 -96
- package/dist/platform-expo/src/index.d.ts.map +0 -1
- package/dist/platform-expo/src/index.js +0 -198
- package/dist/platform-expo/src/index.js.map +0 -1
- package/dist/platform-expo/src/react.d.ts +0 -26
- package/dist/platform-expo/src/react.d.ts.map +0 -1
- package/dist/platform-expo/src/react.js +0 -30
- package/dist/platform-expo/src/react.js.map +0 -1
- package/dist/platform-node/src/index.d.ts +0 -145
- package/dist/platform-node/src/index.d.ts.map +0 -1
- package/dist/platform-node/src/index.js +0 -407
- package/dist/platform-node/src/index.js.map +0 -1
- package/dist/platform-node/src/ipc-react.d.ts +0 -25
- package/dist/platform-node/src/ipc-react.d.ts.map +0 -1
- package/dist/platform-node/src/ipc-react.js +0 -21
- package/dist/platform-node/src/ipc-react.js.map +0 -1
- package/dist/platform-node/src/ipc.d.ts +0 -76
- package/dist/platform-node/src/ipc.d.ts.map +0 -1
- package/dist/platform-node/src/ipc.js +0 -344
- package/dist/platform-node/src/ipc.js.map +0 -1
- package/dist/platform-web/src/index.d.ts +0 -106
- package/dist/platform-web/src/index.d.ts.map +0 -1
- package/dist/platform-web/src/index.js +0 -311
- package/dist/platform-web/src/index.js.map +0 -1
- package/dist/platform-web/src/indexeddb.js +0 -125
- package/dist/platform-web/src/indexeddb.js.map +0 -1
- package/dist/platform-web/src/opfs.js +0 -146
- package/dist/platform-web/src/opfs.js.map +0 -1
- package/dist/platform-web/src/persistence.d.ts +0 -20
- package/dist/platform-web/src/persistence.d.ts.map +0 -1
- package/dist/platform-web/src/persistence.js +0 -23
- package/dist/platform-web/src/persistence.js.map +0 -1
- package/dist/platform-web/src/react.d.ts +0 -35
- package/dist/platform-web/src/react.d.ts.map +0 -1
- package/dist/platform-web/src/react.js +0 -42
- package/dist/platform-web/src/react.js.map +0 -1
- package/dist/platform-web/src/sqljs.js +0 -133
- package/dist/platform-web/src/sqljs.js.map +0 -1
- package/dist/platform-web/src/worker.d.ts +0 -79
- package/dist/platform-web/src/worker.d.ts.map +0 -1
- package/dist/platform-web/src/worker.js +0 -308
- package/dist/platform-web/src/worker.js.map +0 -1
- package/dist/react/src/index.d.ts +0 -59
- package/dist/react/src/index.d.ts.map +0 -1
- package/dist/react/src/index.js +0 -151
- package/dist/react/src/index.js.map +0 -1
- package/dist/schema/src/definition.d.ts +0 -98
- package/dist/schema/src/definition.d.ts.map +0 -1
- package/dist/schema/src/definition.js +0 -84
- package/dist/schema/src/definition.js.map +0 -1
- package/dist/schema/src/planner.d.ts +0 -42
- package/dist/schema/src/planner.d.ts.map +0 -1
- package/dist/schema/src/planner.js +0 -131
- package/dist/schema/src/planner.js.map +0 -1
- package/dist/schema/src/validators.d.ts +0 -194
- package/dist/schema/src/validators.d.ts.map +0 -1
- package/dist/schema/src/validators.js +0 -158
- package/dist/schema/src/validators.js.map +0 -1
- package/dist/svelte/src/index.d.ts +0 -44
- package/dist/svelte/src/index.d.ts.map +0 -1
- package/dist/svelte/src/index.js +0 -75
- package/dist/svelte/src/index.js.map +0 -1
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
//#region src/render.ts
|
|
2
|
+
function renderOutput(context, value, format) {
|
|
3
|
+
if (format === "json") {
|
|
4
|
+
context.printJson(value);
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
if (format === "jsonl") {
|
|
8
|
+
if (Array.isArray(value)) {
|
|
9
|
+
for (const entry of value) process.stdout.write(`${JSON.stringify(entry)}\n`);
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
process.stdout.write(`${JSON.stringify(value)}\n`);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(value) && value.every((entry) => isPersistedLogEntry(entry))) {
|
|
16
|
+
for (const entry of value) process.stdout.write(`${formatLogEntry(entry)}\n`);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (isPersistedLogEntry(value)) {
|
|
20
|
+
process.stdout.write(`${formatLogEntry(value)}\n`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (typeof value === "string") {
|
|
24
|
+
process.stdout.write(`${value}\n`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(value)) {
|
|
28
|
+
if (value.length === 0) {
|
|
29
|
+
process.stdout.write("[]\n");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
for (const [index, entry] of value.entries()) {
|
|
33
|
+
process.stdout.write(`${JSON.stringify(entry, null, 2)}\n`);
|
|
34
|
+
if (index < value.length - 1) process.stdout.write("\n");
|
|
35
|
+
}
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
39
|
+
}
|
|
40
|
+
function printTargetsTable(targets, options = {}) {
|
|
41
|
+
if (targets.length === 0) {
|
|
42
|
+
process.stdout.write(" No targets available.\n");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
process.stdout.write(" project:\n");
|
|
46
|
+
const projectTargets = targets.filter((target) => target.kind === "project");
|
|
47
|
+
if (projectTargets.length === 0) process.stdout.write(" none\n");
|
|
48
|
+
for (const target of projectTargets) {
|
|
49
|
+
process.stdout.write(` ${target.id} ${target.label} online ${target.capabilities.join(", ")}\n`);
|
|
50
|
+
process.stdout.write(` db: ${target.databasePath}\n`);
|
|
51
|
+
process.stdout.write(` storage: ${target.storageDirectory}\n`);
|
|
52
|
+
}
|
|
53
|
+
process.stdout.write(" clients:\n");
|
|
54
|
+
const clientTargets = targets.filter((target) => target.kind === "client");
|
|
55
|
+
if (clientTargets.length === 0) {
|
|
56
|
+
process.stdout.write(" none\n");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const target of clientTargets) {
|
|
60
|
+
process.stdout.write(` ${target.id} ${target.label} ${target.platform} ${target.connectedSessions} session(s)\n`);
|
|
61
|
+
process.stdout.write(` origin: ${target.origin ?? "unknown"} storage: ${target.storageProtocol ?? "unknown"} capabilities: ${target.capabilities.join(", ")}\n`);
|
|
62
|
+
for (const runtime of target.runtimes) {
|
|
63
|
+
process.stdout.write(` runtime ${runtime.id} ${runtime.label}${runtime.primary ? " primary" : ""}\n`);
|
|
64
|
+
process.stdout.write(` origin: ${runtime.origin ?? "unknown"} platform: ${runtime.platform} status: online\n`);
|
|
65
|
+
}
|
|
66
|
+
if (options.verbose) {
|
|
67
|
+
process.stdout.write(` runtimeIds: ${target.runtimeIds.join(", ")}\n`);
|
|
68
|
+
for (const runtime of target.runtimes) if (runtime.appName || runtime.sessionLabel || runtime.storageIdentity) process.stdout.write(` app: ${runtime.appName ?? "unknown"} session: ${runtime.sessionLabel ?? "unknown"} storageIdentity: ${runtime.storageIdentity ?? "unknown"}\n`);
|
|
69
|
+
process.stdout.write(` sessions: ${target.sessionLabels.join(", ") || "unknown"}\n`);
|
|
70
|
+
process.stdout.write(` storageIdentity: ${target.storageIdentity ?? "unknown"} database: ${target.databaseLabel ?? "unknown"}\n`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function printDoctorReport(report, options = {}) {
|
|
75
|
+
if (report.cwd) process.stdout.write(` cwd: ${report.cwd}\n`);
|
|
76
|
+
if (report.template) process.stdout.write(` template: ${report.template}\n`);
|
|
77
|
+
if (report.status) process.stdout.write(` status: ${report.status}\n`);
|
|
78
|
+
for (const category of [
|
|
79
|
+
"project",
|
|
80
|
+
"generated",
|
|
81
|
+
"schema"
|
|
82
|
+
]) {
|
|
83
|
+
process.stdout.write(` ${category}:\n`);
|
|
84
|
+
for (const check of report.checks.filter((entry) => entry.category === category)) process.stdout.write(` ${check.ok ? "OK" : "MISSING"} ${check.path}\n`);
|
|
85
|
+
}
|
|
86
|
+
process.stdout.write(" hub:\n");
|
|
87
|
+
process.stdout.write(` ${report.hub.running ? "OK" : "MISSING"} ${report.hub.url}\n`);
|
|
88
|
+
if (options.verbose) {
|
|
89
|
+
if (report.hub.dashboardUrl) process.stdout.write(` ${report.hub.dashboardRunning ? "OK" : "MISSING"} ${report.hub.dashboardUrl}\n`);
|
|
90
|
+
if (report.hub.ports) process.stdout.write(` ports: dashboard=${report.hub.ports.dashboard} devtools=${report.hub.ports.devtools}\n`);
|
|
91
|
+
process.stdout.write(" project target:\n");
|
|
92
|
+
if (report.projectTarget) {
|
|
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");
|
|
96
|
+
}
|
|
97
|
+
process.stdout.write(" targets:\n");
|
|
98
|
+
if (report.targets.length === 0) {
|
|
99
|
+
process.stdout.write(" none\n");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
for (const target of report.targets) {
|
|
103
|
+
process.stdout.write(` ${target.id} (${target.kind}) ${target.label} [${target.capabilities.join(", ")}]\n`);
|
|
104
|
+
if (options.verbose && target.kind === "client") {
|
|
105
|
+
process.stdout.write(` platform=${target.platform} origin=${target.origin ?? "unknown"} storage=${target.storageProtocol ?? "unknown"} sessions=${target.connectedSessions}\n`);
|
|
106
|
+
process.stdout.write(` runtimeIds=${target.runtimeIds.join(", ")}\n`);
|
|
107
|
+
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
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function printDevReadySummary(context, options) {
|
|
112
|
+
const projectTarget = options.targets.find((target) => target.kind === "project");
|
|
113
|
+
const clientTargets = options.targets.filter((target) => target.kind === "client");
|
|
114
|
+
process.stdout.write("\nReady:\n");
|
|
115
|
+
process.stdout.write(` template: ${options.template}\n`);
|
|
116
|
+
process.stdout.write(` projectTarget: ${options.projectTargetConfigured ? "configured" : "not configured"}\n`);
|
|
117
|
+
process.stdout.write(` dashboard: ${options.dashboardUrl}\n`);
|
|
118
|
+
process.stdout.write(` devtools: ${options.devtoolsUrl}\n`);
|
|
119
|
+
if (projectTarget && options.targets.length === 1) process.stdout.write(" default target: project\n");
|
|
120
|
+
else if (clientTargets.length > 0) process.stdout.write(` targets: ${clientTargets.map((target) => target.id).join(", ")}\n`);
|
|
121
|
+
else process.stdout.write(" targets: waiting for client\n");
|
|
122
|
+
context.nextStep("Run `npx syncorejs targets` for detailed target inspection.");
|
|
123
|
+
}
|
|
124
|
+
function isPersistedLogEntry(value) {
|
|
125
|
+
return Boolean(value && typeof value === "object" && "eventType" in value && "category" in value && "message" in value);
|
|
126
|
+
}
|
|
127
|
+
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}`;
|
|
129
|
+
}
|
|
130
|
+
//#endregion
|
|
131
|
+
export { printDevReadySummary, printDoctorReport, printTargetsTable, renderOutput };
|
|
132
|
+
|
|
133
|
+
//# sourceMappingURL=render.mjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { CliError } from "./errors.mjs";
|
|
2
|
+
import { listAvailableTargets, targetSupportsCapability } from "./project.mjs";
|
|
3
|
+
import { buildNoTargetsNextSteps, buildSelectTargetNextSteps } from "./messages.mjs";
|
|
4
|
+
//#region src/targets.ts
|
|
5
|
+
async function resolveOperationalTarget(context, requestedTarget, options) {
|
|
6
|
+
const targets = (await listAvailableTargets(context.cwd)).filter((target) => targetSupportsCapability(target, options.capability));
|
|
7
|
+
if (targets.length === 0) throw new CliError(`No Syncore targets are available for \`${options.command}\`.`, {
|
|
8
|
+
category: "target",
|
|
9
|
+
nextSteps: buildNoTargetsNextSteps(),
|
|
10
|
+
details: {
|
|
11
|
+
command: options.command,
|
|
12
|
+
capability: options.capability
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
if (requestedTarget) {
|
|
16
|
+
if (requestedTarget !== "project" && !/^\d{5}$/.test(requestedTarget)) throw new CliError(`Invalid target ${JSON.stringify(requestedTarget)} for \`${options.command}\`.`, {
|
|
17
|
+
category: "target",
|
|
18
|
+
nextSteps: buildSelectTargetNextSteps(),
|
|
19
|
+
details: {
|
|
20
|
+
requestedTarget,
|
|
21
|
+
expected: "project or a 5-digit target id"
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
const matchedTarget = targets.find((target) => target.id === requestedTarget);
|
|
25
|
+
if (!matchedTarget) throw new CliError(`Unknown target ${JSON.stringify(requestedTarget)} for \`${options.command}\`.`, {
|
|
26
|
+
category: "target",
|
|
27
|
+
nextSteps: buildSelectTargetNextSteps(),
|
|
28
|
+
details: {
|
|
29
|
+
requestedTarget,
|
|
30
|
+
availableTargets: targets.map((target) => target.id)
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return matchedTarget;
|
|
34
|
+
}
|
|
35
|
+
if (targets.length === 1) {
|
|
36
|
+
context.info(`Using target ${targets[0].id} automatically.`);
|
|
37
|
+
return targets[0];
|
|
38
|
+
}
|
|
39
|
+
if (!context.interactive) throw new CliError(`Multiple Syncore targets are available for \`${options.command}\`.`, {
|
|
40
|
+
category: "target",
|
|
41
|
+
nextSteps: buildSelectTargetNextSteps(),
|
|
42
|
+
details: { availableTargets: targets.map((target) => target.id) }
|
|
43
|
+
});
|
|
44
|
+
return await context.select("Choose a Syncore target.", targets.map((target) => ({
|
|
45
|
+
label: `${target.id} - ${target.label}`,
|
|
46
|
+
value: target,
|
|
47
|
+
description: target.kind === "project" ? target.databasePath : `${target.platform}, ${target.connectedSessions} session(s), ${target.capabilities.join("/")}`
|
|
48
|
+
})));
|
|
49
|
+
}
|
|
50
|
+
function resolveClientRuntime(target, requestedRuntime, options) {
|
|
51
|
+
if (!requestedRuntime) return target.kind === "client" ? target.runtimes.find((runtime) => runtime.primary) ?? target.runtimes[0] ?? null : null;
|
|
52
|
+
if (target.kind === "project") throw new CliError(`\`${options.command}\` does not accept --runtime for the project target.`, {
|
|
53
|
+
category: "target",
|
|
54
|
+
nextSteps: buildSelectTargetNextSteps(),
|
|
55
|
+
details: {
|
|
56
|
+
targetId: target.id,
|
|
57
|
+
requestedRuntime
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
if (!/^\d{5}$/.test(requestedRuntime)) throw new CliError(`Invalid runtime ${JSON.stringify(requestedRuntime)} for \`${options.command}\`.`, {
|
|
61
|
+
category: "target",
|
|
62
|
+
nextSteps: buildSelectTargetNextSteps(),
|
|
63
|
+
details: {
|
|
64
|
+
targetId: target.id,
|
|
65
|
+
requestedRuntime,
|
|
66
|
+
expected: "a 5-digit runtime id"
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
const runtime = target.runtimes.find((entry) => entry.id === requestedRuntime);
|
|
70
|
+
if (!runtime) throw new CliError(`Unknown runtime ${JSON.stringify(requestedRuntime)} for target ${JSON.stringify(target.id)}.`, {
|
|
71
|
+
category: "target",
|
|
72
|
+
nextSteps: buildSelectTargetNextSteps(),
|
|
73
|
+
details: {
|
|
74
|
+
targetId: target.id,
|
|
75
|
+
requestedRuntime,
|
|
76
|
+
availableRuntimes: target.runtimes.map((entry) => ({
|
|
77
|
+
id: entry.id,
|
|
78
|
+
label: entry.label
|
|
79
|
+
}))
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return runtime;
|
|
83
|
+
}
|
|
84
|
+
//#endregion
|
|
85
|
+
export { resolveClientRuntime, resolveOperationalTarget };
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=targets.mjs.map
|
|
@@ -0,0 +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 (!/^\\d{5}$/.test(requestedRuntime)) {\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 5-digit runtime id\"\n }\n }\n );\n }\n\n const runtime = target.runtimes.find((entry) => entry.id === requestedRuntime);\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;AAGH,KAAI,CAAC,UAAU,KAAK,iBAAiB,CACnC,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,iBAAiB;AAC9E,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,5 +1,63 @@
|
|
|
1
|
+
import { SyncoreFunctionRegistry } from "./runtime/runtime.mjs";
|
|
2
|
+
import { index_d_exports } from "./index.mjs";
|
|
3
|
+
|
|
1
4
|
//#region src/cli.d.ts
|
|
5
|
+
interface SyncoreProjectTargetConfig {
|
|
6
|
+
databasePath: string;
|
|
7
|
+
storageDirectory: string;
|
|
8
|
+
}
|
|
9
|
+
interface SyncoreConfig {
|
|
10
|
+
projectTarget?: SyncoreProjectTargetConfig;
|
|
11
|
+
databasePath?: string;
|
|
12
|
+
storageDirectory?: string;
|
|
13
|
+
}
|
|
14
|
+
type SyncoreTemplateName = "minimal" | "node" | "react-web" | "expo" | "electron" | "next";
|
|
15
|
+
interface ScaffoldProjectOptions {
|
|
16
|
+
template: SyncoreTemplateName;
|
|
17
|
+
force?: boolean;
|
|
18
|
+
}
|
|
19
|
+
interface ScaffoldProjectResult {
|
|
20
|
+
template: SyncoreTemplateName;
|
|
21
|
+
created: string[];
|
|
22
|
+
updated: string[];
|
|
23
|
+
skipped: string[];
|
|
24
|
+
}
|
|
25
|
+
interface PackageJsonShape {
|
|
26
|
+
name?: string;
|
|
27
|
+
scripts?: Record<string, string>;
|
|
28
|
+
dependencies?: Record<string, string>;
|
|
29
|
+
devDependencies?: Record<string, string>;
|
|
30
|
+
}
|
|
31
|
+
declare const SYNCORE_MIGRATION_SNAPSHOT_FILE_NAME = "_schema_snapshot.json";
|
|
32
|
+
declare const VALID_SYNCORE_TEMPLATES: SyncoreTemplateName[];
|
|
2
33
|
declare function runSyncoreCli(argv?: string[]): Promise<void>;
|
|
34
|
+
declare function runCodegen(cwd: string): Promise<void>;
|
|
35
|
+
declare function scaffoldProject(cwd: string, options: ScaffoldProjectOptions): Promise<ScaffoldProjectResult>;
|
|
36
|
+
declare function logScaffoldResult(result: ScaffoldProjectResult, heading: string): void;
|
|
37
|
+
declare function hasSyncoreProject(cwd: string): Promise<boolean>;
|
|
38
|
+
declare function resolveRequestedTemplate(cwd: string, requestedTemplate: string): Promise<SyncoreTemplateName>;
|
|
39
|
+
declare function detectProjectTemplate(cwd: string): Promise<SyncoreTemplateName>;
|
|
40
|
+
declare function readPackageJson(cwd: string): Promise<PackageJsonShape | null>;
|
|
41
|
+
declare function importJsonlIntoProject(cwd: string, tableName: string, sourcePath: string): Promise<number>;
|
|
42
|
+
declare function resolveDefaultSeedFile(cwd: string, tableName: string): Promise<string | null>;
|
|
43
|
+
declare function resolveProjectTargetConfig(config: SyncoreConfig): SyncoreProjectTargetConfig | null;
|
|
44
|
+
declare function loadProjectConfig(cwd: string): Promise<SyncoreConfig>;
|
|
45
|
+
declare function loadProjectSchema(cwd: string): Promise<index_d_exports.SyncoreSchema<Record<string, index_d_exports.AnyTableDefinition>>>;
|
|
46
|
+
declare function loadProjectFunctions(cwd: string): Promise<SyncoreFunctionRegistry>;
|
|
47
|
+
declare function readStoredSnapshot(cwd: string): Promise<index_d_exports.SchemaSnapshot | null>;
|
|
48
|
+
declare function writeStoredSnapshot(cwd: string, snapshot: index_d_exports.SchemaSnapshot): Promise<void>;
|
|
49
|
+
declare function getNextMigrationNumber(directory: string): Promise<number>;
|
|
50
|
+
declare function applyProjectMigrations(cwd: string): Promise<number>;
|
|
51
|
+
declare function fileExists(filePath: string): Promise<boolean>;
|
|
52
|
+
declare function formatError(error: unknown): string;
|
|
53
|
+
declare function isLocalPortInUse(port: number): Promise<boolean>;
|
|
54
|
+
declare function slugify(value: string): string;
|
|
55
|
+
declare function startDevHub(options: {
|
|
56
|
+
cwd: string;
|
|
57
|
+
template: SyncoreTemplateName;
|
|
58
|
+
}): Promise<void>;
|
|
59
|
+
declare function runDevProjectBootstrap(cwd: string, template: SyncoreTemplateName): Promise<void>;
|
|
60
|
+
declare function resolvePortFromEnv(environmentVariable: string, fallback: number): number;
|
|
3
61
|
//#endregion
|
|
4
|
-
export { runSyncoreCli };
|
|
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 };
|
|
5
63
|
//# 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":";;;;UAqDiB,0BAAA;EACf,YAAA;EACA,gBAAA;AAAA;AAAA,UAGe,aAAA;EACf,aAAA,GAAgB,0BAAA;EAChB,YAAA;EACA,gBAAA;AAAA;AAAA,KAGU,mBAAA;AAAA,UAaK,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,cAWP,oCAAA;AAAA,cACA,uBAAA,EAAyB,mBAAA;AAAA,iBAsMhB,aAAA,CAAc,IAAA,cAAsB,OAAA;AAAA,iBAQpC,UAAA,CAAW,GAAA,WAAc,OAAA;AAAA,iBAqNzB,eAAA,CACpB,GAAA,UACA,OAAA,EAAS,sBAAA,GACR,OAAA,CAAQ,qBAAA;AAAA,iBAiPK,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,iBA2Va,0BAAA,CACd,MAAA,EAAQ,aAAA,GACP,0BAAA;AAAA,iBAuBmB,iBAAA,CAAkB,GAAA,WAAc,OAAA,CAAQ,aAAA;AAAA,iBAwBxC,iBAAA,CACpB,GAAA,WACC,OAAA,CAAQ,eAAA,CAAA,aAAA,CAAc,MAAA,SAAe,eAAA,CAAA,kBAAA;AAAA,iBAqElB,oBAAA,CACpB,GAAA,WACC,OAAA,CAAQ,uBAAA;AAAA,iBAoVW,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;AAAA,iBA0ekB,sBAAA,CACpB,GAAA,UACA,QAAA,EAAU,mBAAA,GACT,OAAA;AAAA,iBAkKa,kBAAA,CACd,mBAAA,UACA,QAAA"}
|