syncorejs 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_vendor/cli/app.d.mts.map +1 -1
- package/dist/_vendor/cli/app.mjs +8 -5
- package/dist/_vendor/cli/app.mjs.map +1 -1
- package/dist/_vendor/cli/context.mjs.map +1 -1
- package/dist/_vendor/cli/dev-session.mjs.map +1 -1
- package/dist/_vendor/cli/doctor.mjs.map +1 -1
- package/dist/_vendor/cli/errors.mjs.map +1 -1
- package/dist/_vendor/cli/help.mjs.map +1 -1
- package/dist/_vendor/cli/index.mjs +9 -2
- package/dist/_vendor/cli/index.mjs.map +1 -1
- package/dist/_vendor/cli/messages.mjs.map +1 -1
- package/dist/_vendor/cli/preflight.mjs.map +1 -1
- package/dist/_vendor/cli/project.mjs +20 -20
- package/dist/_vendor/cli/project.mjs.map +1 -1
- package/dist/_vendor/cli/render.mjs.map +1 -1
- package/dist/_vendor/cli/targets.mjs.map +1 -1
- package/dist/_vendor/core/cli.d.mts +8 -2
- package/dist/_vendor/core/cli.d.mts.map +1 -1
- package/dist/_vendor/core/cli.mjs +238 -64
- package/dist/_vendor/core/cli.mjs.map +1 -1
- package/dist/_vendor/core/devtools-auth.mjs.map +1 -1
- package/dist/_vendor/core/runtime/components.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/components.mjs.map +1 -1
- package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/devtools.mjs +130 -23
- package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
- package/dist/_vendor/core/runtime/functions.d.mts +388 -6
- package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/functions.mjs +72 -1
- package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
- package/dist/_vendor/core/runtime/id.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/id.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +11 -5
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +123 -20
- package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +56 -8
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +49 -14
- package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +4 -7
- package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs +76 -1
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +1 -0
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +4 -3
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +4 -0
- package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -1
- package/dist/_vendor/core/runtime/runtime.d.mts +1040 -9
- package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/runtime.mjs +63 -0
- package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
- package/dist/_vendor/core/transport.d.mts +2 -0
- package/dist/_vendor/core/transport.d.mts.map +1 -1
- package/dist/_vendor/core/transport.mjs +33 -24
- package/dist/_vendor/core/transport.mjs.map +1 -1
- package/dist/_vendor/devtools-protocol/index.d.ts +149 -4
- package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
- package/dist/_vendor/devtools-protocol/index.js.map +1 -1
- package/dist/_vendor/next/config.d.ts +3 -4
- package/dist/_vendor/next/config.d.ts.map +1 -1
- package/dist/_vendor/next/config.js +37 -19
- package/dist/_vendor/next/config.js.map +1 -1
- package/dist/_vendor/next/index.d.ts +109 -29
- package/dist/_vendor/next/index.d.ts.map +1 -1
- package/dist/_vendor/next/index.js +77 -17
- package/dist/_vendor/next/index.js.map +1 -1
- package/dist/_vendor/platform-expo/index.d.ts +146 -27
- package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/index.js +76 -10
- package/dist/_vendor/platform-expo/index.js.map +1 -1
- package/dist/_vendor/platform-expo/react.js.map +1 -1
- package/dist/_vendor/platform-expo/web-sqljs-wasm.js +16 -0
- package/dist/_vendor/platform-expo/web-sqljs-wasm.js.map +1 -0
- package/dist/_vendor/platform-node/index.d.mts +173 -9
- package/dist/_vendor/platform-node/index.d.mts.map +1 -1
- package/dist/_vendor/platform-node/index.mjs +225 -94
- 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-node/ipc.d.mts.map +1 -1
- package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
- package/dist/_vendor/platform-web/external-change.d.ts +41 -0
- package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
- package/dist/_vendor/platform-web/external-change.js +30 -0
- package/dist/_vendor/platform-web/external-change.js.map +1 -1
- package/dist/_vendor/platform-web/index.d.ts +307 -35
- package/dist/_vendor/platform-web/index.d.ts.map +1 -1
- package/dist/_vendor/platform-web/index.js +189 -23
- package/dist/_vendor/platform-web/index.js.map +1 -1
- package/dist/_vendor/platform-web/indexeddb.d.ts +12 -0
- package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -1
- package/dist/_vendor/platform-web/indexeddb.js +10 -0
- package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
- package/dist/_vendor/platform-web/opfs.d.ts +13 -0
- package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
- package/dist/_vendor/platform-web/opfs.js +12 -0
- package/dist/_vendor/platform-web/opfs.js.map +1 -1
- package/dist/_vendor/platform-web/persistence.d.ts +54 -0
- package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
- package/dist/_vendor/platform-web/persistence.js +15 -0
- package/dist/_vendor/platform-web/persistence.js.map +1 -1
- package/dist/_vendor/platform-web/react.d.ts +1 -2
- package/dist/_vendor/platform-web/react.d.ts.map +1 -1
- package/dist/_vendor/platform-web/react.js +2 -4
- package/dist/_vendor/platform-web/react.js.map +1 -1
- package/dist/_vendor/platform-web/sqljs.js +10 -1
- package/dist/_vendor/platform-web/sqljs.js.map +1 -1
- package/dist/_vendor/platform-web/web-sqljs-wasm.js +8 -0
- package/dist/_vendor/platform-web/web-sqljs-wasm.js.map +1 -0
- package/dist/_vendor/platform-web/worker.d.ts +60 -9
- package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
- package/dist/_vendor/platform-web/worker.js +37 -4
- package/dist/_vendor/platform-web/worker.js.map +1 -1
- package/dist/_vendor/react/index.d.ts +196 -13
- package/dist/_vendor/react/index.d.ts.map +1 -1
- package/dist/_vendor/react/index.js +208 -17
- package/dist/_vendor/react/index.js.map +1 -1
- package/dist/_vendor/schema/definition.d.ts +129 -0
- package/dist/_vendor/schema/definition.d.ts.map +1 -1
- package/dist/_vendor/schema/definition.js +99 -0
- package/dist/_vendor/schema/definition.js.map +1 -1
- package/dist/_vendor/schema/planner.d.ts.map +1 -1
- package/dist/_vendor/schema/planner.js.map +1 -1
- package/dist/_vendor/schema/validators.d.ts +180 -4
- package/dist/_vendor/schema/validators.d.ts.map +1 -1
- package/dist/_vendor/schema/validators.js +35 -1
- package/dist/_vendor/schema/validators.js.map +1 -1
- package/dist/_vendor/svelte/index.d.ts +205 -7
- package/dist/_vendor/svelte/index.d.ts.map +1 -1
- package/dist/_vendor/svelte/index.js +199 -6
- package/dist/_vendor/svelte/index.js.map +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +24 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.mjs","names":[],"sources":["../../src/runtime/devtools.ts"],"sourcesContent":["import type {\n SchedulerMisfirePolicy,\n SchedulerJob,\n SchedulerRecurringSchedule,\n SyncoreDevtoolsCommandPayload,\n SyncoreDevtoolsCommandResultPayload,\n SyncoreDevtoolsSubscriptionPayload,\n SyncoreDevtoolsSubscriptionResultPayload,\n TableSchema\n} from \"@syncore/devtools-protocol\";\nimport { describeValidator } from \"@syncore/schema\";\nimport type {\n TableDefinition,\n Validator\n} from \"@syncore/schema\";\nimport type {\n DevtoolsLiveQueryScope,\n ImpactScope,\n SyncoreDataModel,\n SyncoreRuntimeAdmin,\n SyncoreRuntimeOptions,\n SyncoreSqlDriver\n} from \"./runtime.js\";\nimport { createFunctionReference } from \"./runtime.js\";\nimport {\n parseCanonicalComponentFunctionName,\n parseComponentScopedIdentifier,\n safeReadRecurringSchedule\n} from \"./internal/engines/shared.js\";\n\nexport interface DevtoolsCommandHandlerDeps {\n driver: SyncoreSqlDriver;\n schema: SyncoreDataModel;\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"];\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>;\n sql?: DevtoolsSqlSupport;\n}\n\nexport type DevtoolsSqlMode = \"read\" | \"write\" | \"ddl\";\n\nexport interface DevtoolsSqlAnalysis {\n mode: DevtoolsSqlMode;\n readTables: string[];\n writeTables: string[];\n schemaChanged: boolean;\n observedScopes: DevtoolsLiveQueryScope[];\n}\n\nexport interface DevtoolsSqlReadResult {\n columns: string[];\n rows: unknown[][];\n observedTables: string[];\n}\n\nexport interface DevtoolsSqlSupport {\n analyzeSqlStatement(query: string): DevtoolsSqlAnalysis;\n ensureSqlMode(\n analysis: DevtoolsSqlAnalysis,\n expected: DevtoolsSqlMode | \"watch\"\n ): void;\n runReadonlyQuery(databasePath: string, query: string): DevtoolsSqlReadResult;\n}\n\nexport type DevtoolsCommandHandler = (\n payload: SyncoreDevtoolsCommandPayload\n) => Promise<SyncoreDevtoolsCommandResultPayload>;\n\nexport type DevtoolsSubscriptionListener = (\n payload: SyncoreDevtoolsSubscriptionResultPayload\n) => void;\n\nexport interface DevtoolsSubscriptionHost {\n subscribe(\n subscriptionId: string,\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ): Promise<void>;\n unsubscribe(subscriptionId: string): void;\n dispose(): void;\n}\n\ntype DevtoolsInvalidationScope = DevtoolsLiveQueryScope;\n\ninterface SubscriptionRecord {\n payload: SyncoreDevtoolsSubscriptionPayload;\n listener: DevtoolsSubscriptionListener;\n unsubscribeRuntime: () => void;\n scopes: Set<DevtoolsInvalidationScope>;\n}\n\nexport function createDevtoolsCommandHandler(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsCommandHandler {\n const { driver, admin, sql } = deps;\n\n return async (payload): Promise<SyncoreDevtoolsCommandResultPayload> => {\n await admin.prepareForDirectAccess();\n switch (payload.kind) {\n case \"fn.run\": {\n const start = performance.now();\n try {\n let result: unknown;\n switch (payload.functionType) {\n case \"query\":\n result = await admin.runQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"mutation\":\n result = await admin.runMutation(\n createFunctionReference(\"mutation\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"action\":\n result = await admin.runAction(\n createFunctionReference(\"action\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n }\n return {\n kind: \"fn.run.result\",\n result,\n durationMs: performance.now() - start\n };\n } catch (error) {\n return {\n kind: \"fn.run.result\",\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - start\n };\n }\n }\n\n case \"data.insert\": {\n try {\n const id = await runDevtoolsMutation(admin, async (ctx) =>\n ctx.db.insert(payload.table as never, payload.document as never)\n , { origin: \"dashboard\" });\n return { kind: \"data.mutate.result\", success: true, id };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.patch\": {\n try {\n await runDevtoolsMutation(admin, async (ctx) => {\n await ctx.db.patch(\n payload.table as never,\n payload.id,\n payload.fields as never\n );\n return null;\n }, { origin: \"dashboard\" });\n return {\n kind: \"data.mutate.result\",\n success: true,\n id: payload.id\n };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.delete\": {\n try {\n await runDevtoolsMutation(admin, async (ctx) => {\n await ctx.db.delete(payload.table as never, payload.id);\n return null;\n }, { origin: \"dashboard\" });\n return { kind: \"data.mutate.result\", success: true };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.read\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Read requires a file-backed database path.\");\n }\n const { columns, rows } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.read.result\",\n columns,\n rows\n };\n } catch (error) {\n return {\n kind: \"sql.read.result\",\n columns: [],\n rows: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.write\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n if (analysis.mode === \"read\") {\n throw new Error(\n \"Use SQL Read or SQL Live for read-only statements.\"\n );\n }\n const result = await driver.run(payload.query);\n admin.notifyDevtoolsScopes(analysis.observedScopes);\n await admin.forceRefreshDevtools(\n \"SQL write executed from devtools dashboard.\",\n analysis.observedScopes.flatMap((scope) =>\n scope === \"all\" ? [] : ([scope] as ImpactScope[])\n ),\n { origin: \"dashboard\" }\n );\n return {\n kind: \"sql.write.result\",\n rowsAffected: result.changes,\n invalidationScopes: [...analysis.observedScopes]\n };\n } catch (error) {\n return {\n kind: \"sql.write.result\",\n rowsAffected: 0,\n invalidationScopes: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.cancel\": {\n try {\n const cancelled = await admin.cancelScheduledJob(payload.jobId);\n return {\n kind: \"scheduler.cancel.result\",\n success: true,\n cancelled\n };\n } catch (error) {\n return {\n kind: \"scheduler.cancel.result\",\n success: false,\n cancelled: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.update\": {\n try {\n const updated = await admin.updateScheduledJob({\n id: payload.jobId,\n schedule: payload.schedule,\n args: payload.args,\n misfirePolicy: payload.misfirePolicy,\n ...(payload.runAt !== undefined ? { runAt: payload.runAt } : {})\n });\n const jobs = updated ? await listSchedulerJobs(driver) : [];\n const updatedJob = jobs.find((job) => job.id === payload.jobId);\n return {\n kind: \"scheduler.update.result\",\n success: true,\n updated,\n ...(updated && updatedJob ? { job: updatedJob } : {})\n };\n } catch (error) {\n return {\n kind: \"scheduler.update.result\",\n success: false,\n updated: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n default:\n return {\n kind: \"error\",\n message: `Unknown devtools command: ${(payload as { kind: string }).kind}`\n };\n }\n };\n}\n\nexport function createDevtoolsSubscriptionHost(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsSubscriptionHost {\n const { driver, schema, functions, admin } = deps;\n const subscriptions = new Map<string, SubscriptionRecord>();\n\n const emit = async (\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ) => {\n listener(\n await resolveSubscriptionPayload(payload, {\n driver,\n schema,\n functions,\n admin,\n ...(deps.sql ? { sql: deps.sql } : {})\n })\n );\n };\n\n const handleInvalidation = async (scopes: Set<DevtoolsInvalidationScope>) => {\n for (const record of subscriptions.values()) {\n if (!intersects(scopes, record.scopes)) {\n continue;\n }\n await emit(record.payload, record.listener);\n }\n };\n\n return {\n async subscribe(subscriptionId, payload, listener) {\n if (payload.kind === \"fn.watch\") {\n const definition = functions[payload.functionName];\n if (!definition || definition.kind !== \"query\") {\n listener({\n kind: \"fn.watch.result\",\n error: `Unknown query function: ${payload.functionName}`\n });\n return;\n }\n const client = admin.createClient();\n const watch = client.watchQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args\n );\n const emitWatchResult = () => {\n const error = watch.localQueryError();\n listener({\n kind: \"fn.watch.result\",\n ...(error\n ? {\n error: error.message\n }\n : {\n result: watch.localQueryResult()\n })\n });\n };\n const unsubscribeUpdates = watch.onUpdate(emitWatchResult);\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeUpdates();\n watch.dispose?.();\n },\n scopes: new Set<DevtoolsInvalidationScope>([\"all\"])\n });\n emitWatchResult();\n return;\n }\n\n const unsubscribeRuntime = admin.subscribeToDevtoolsInvalidations(\n (scopes) => {\n void handleInvalidation(scopes);\n }\n );\n const unsubscribeEvents = admin.subscribeToDevtoolsEvents((event) => {\n if (event.type === \"runtime.disconnected\") {\n void emit(payload, listener);\n }\n });\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeRuntime();\n unsubscribeEvents();\n },\n scopes: scopesForSubscription(payload, deps.sql)\n });\n await emit(payload, listener);\n },\n unsubscribe(subscriptionId) {\n const record = subscriptions.get(subscriptionId);\n if (!record) {\n return;\n }\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n },\n dispose() {\n for (const [subscriptionId, record] of subscriptions) {\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n }\n }\n };\n}\n\nasync function resolveSubscriptionPayload(\n payload: SyncoreDevtoolsSubscriptionPayload,\n deps: DevtoolsCommandHandlerDeps\n): Promise<SyncoreDevtoolsSubscriptionResultPayload> {\n const { driver, schema, functions, admin } = deps;\n await admin.prepareForDirectAccess();\n\n switch (payload.kind) {\n case \"runtime.summary\":\n return {\n kind: \"runtime.summary.result\",\n summary: admin.getRuntimeSummary()\n };\n case \"runtime.activeQueries\":\n return {\n kind: \"runtime.activeQueries.result\",\n activeQueries: admin.getActiveQueryInfos()\n };\n case \"fn.watch\":\n throw new Error(\"Function watches are pushed incrementally and have no snapshot payload.\");\n case \"schema.tables\": {\n const tables = await getSchemaTables(driver, schema);\n console.debug(\"[devtools] schema.tables\", {\n runtimeId: admin.getRuntimeId(),\n tables: tables.map((table) => ({\n name: table.name,\n documentCount: table.documentCount\n }))\n });\n return {\n kind: \"schema.tables.result\",\n tables\n };\n }\n case \"data.table\": {\n const result = await queryTable(\n driver,\n payload.table,\n payload.filters,\n payload.limit\n );\n console.debug(\"[devtools] data.table\", {\n runtimeId: admin.getRuntimeId(),\n table: payload.table,\n filters: payload.filters ?? [],\n limit: payload.limit,\n totalCount: result.totalCount,\n rowCount: result.rows.length,\n firstRow: result.rows[0] ?? null\n });\n return {\n kind: \"data.table.result\",\n rows: result.rows,\n totalCount: result.totalCount,\n ...(result.cursor ? { cursor: result.cursor } : {})\n };\n }\n case \"scheduler.jobs\":\n return {\n kind: \"scheduler.jobs.result\",\n jobs: await listSchedulerJobs(driver)\n };\n case \"functions.catalog\":\n return {\n kind: \"functions.catalog.result\",\n functions: listFunctions(functions)\n };\n case \"sql.watch\": {\n const sqlSupport = requireDevtoolsSqlSupport(deps.sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Live requires a file-backed database path.\");\n }\n const { columns, rows, observedTables } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.watch.result\",\n columns,\n rows,\n observedTables\n };\n }\n }\n}\n\nasync function queryTable(\n driver: SyncoreSqlDriver,\n table: string,\n filters?: Array<{\n field: string;\n operator: string;\n value: unknown;\n }>,\n limit?: number\n): Promise<{\n rows: Record<string, unknown>[];\n totalCount: number;\n cursor?: string;\n}> {\n let sql = `SELECT _id, _creationTime, _json FROM \"${table}\"`;\n const params: unknown[] = [];\n\n if (filters && filters.length > 0) {\n sql += ` WHERE ${filters\n .map((filter) => {\n params.push(normalizeFilterValue(filter));\n return `json_extract(_json, '$.${filter.field}') ${filterOperatorToSql(filter.operator)} ?`;\n })\n .join(\" AND \")}`;\n }\n\n sql += \" ORDER BY _creationTime DESC\";\n if (limit) {\n sql += ` LIMIT ${limit}`;\n }\n\n const rawRows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(sql, params);\n const rows = rawRows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }));\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM \"${table}\"`\n );\n\n return {\n rows,\n totalCount: countRow?.count ?? 0\n };\n}\n\nasync function getSchemaTables(\n driver: SyncoreSqlDriver,\n schema: SyncoreDataModel\n): Promise<TableSchema[]> {\n return Promise.all(\n schema.tableNames().map(async (name) => {\n const table = schema.getTable(name) as TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >;\n const validatorDesc = describeValidator(table.validator);\n const fields =\n validatorDesc.kind === \"object\"\n ? Object.entries(validatorDesc.shape).map(\n ([fieldName, fieldDesc]) => {\n const field = fieldDesc as {\n validator: { kind: string };\n optional: boolean;\n };\n return {\n name: fieldName,\n type: field.validator.kind,\n optional: field.optional\n };\n }\n )\n : [];\n\n fields.unshift(\n { name: \"_id\", type: \"string\", optional: false },\n { name: \"_creationTime\", type: \"number\", optional: false }\n );\n\n let documentCount = 0;\n try {\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM \"${name}\"`\n );\n documentCount = countRow?.count ?? 0;\n } catch {\n documentCount = 0;\n }\n\n return {\n name,\n ...(table.options.tableName ? { displayName: table.options.tableName } : {}),\n owner: table.options.componentPath ? (\"component\" as const) : (\"root\" as const),\n ...(table.options.componentPath\n ? { componentPath: table.options.componentPath }\n : {}),\n ...(table.options.componentName\n ? { componentName: table.options.componentName }\n : {}),\n fields,\n indexes: table.indexes.map((index) => ({\n name: index.name,\n fields: index.fields,\n unique: false\n })),\n documentCount\n };\n })\n );\n}\n\nasync function listSchedulerJobs(\n driver: SyncoreSqlDriver\n): Promise<SchedulerJob[]> {\n try {\n const rows = await driver.all<{\n id: string;\n function_name: string;\n args_json: string;\n status: string;\n run_at: number;\n created_at: number;\n updated_at: number;\n recurring_name: string | null;\n schedule_json: string | null;\n timezone: string | null;\n misfire_policy: string;\n last_run_at: number | null;\n window_ms: number | null;\n }>(`SELECT * FROM \"_scheduled_functions\" ORDER BY run_at DESC LIMIT 200`);\n\n return rows.map((row) => {\n const schedule = safeReadRecurringSchedule(row.schedule_json);\n const scheduleLabel = schedule ? formatScheduleLabel(schedule) : undefined;\n const functionComponent = parseCanonicalComponentFunctionName(\n row.function_name\n );\n const idComponent = parseComponentScopedIdentifier(row.id);\n return {\n id: row.id,\n functionName: row.function_name,\n owner:\n functionComponent || idComponent ? (\"component\" as const) : (\"root\" as const),\n ...(functionComponent\n ? {\n componentPath: functionComponent.componentPath\n }\n : idComponent\n ? {\n componentPath: idComponent.componentPath\n }\n : {}),\n args: JSON.parse(row.args_json) as Record<string, unknown>,\n scheduledAt: row.created_at,\n runAt: row.run_at,\n status: mapJobStatus(row.status),\n ...(row.status === \"completed\" || row.status === \"failed\"\n ? { completedAt: row.updated_at }\n : {}),\n ...(row.recurring_name ? { recurringName: row.recurring_name } : {}),\n ...(schedule ? { schedule } : {}),\n ...(scheduleLabel ? { scheduleLabel, cronSchedule: scheduleLabel } : {}),\n ...(row.timezone ? { timezone: row.timezone } : {}),\n ...(row.last_run_at !== null ? { lastRunAt: row.last_run_at } : {}),\n ...(row.updated_at ? { updatedAt: row.updated_at } : {}),\n misfirePolicy: readMisfirePolicy(row.misfire_policy, row.window_ms)\n };\n });\n } catch {\n return [];\n }\n}\n\nfunction listFunctions(\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"]\n) {\n return Object.entries(functions)\n .filter(\n (entry): entry is [string, NonNullable<(typeof entry)[1]>] =>\n entry[1] !== undefined\n )\n .map(([name, fn]) => {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n const descriptor: {\n name: string;\n type: \"query\" | \"mutation\" | \"action\";\n file: string;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n visibility?: \"public\" | \"internal\";\n localName?: string;\n args?: Record<string, unknown>;\n } = {\n name,\n type: fn.kind,\n file: inferFileFromFunctionName(name),\n owner: componentFunction ? \"component\" : \"root\",\n ...(componentFunction\n ? {\n componentPath: componentFunction.componentPath,\n visibility: componentFunction.visibility,\n localName: componentFunction.localName\n }\n : {})\n };\n const argsDesc = describeValidator(fn.argsValidator);\n if (argsDesc.kind === \"object\") {\n descriptor.args = argsDesc.shape as Record<string, unknown>;\n }\n return descriptor;\n });\n}\n\nfunction inferFileFromFunctionName(name: string): string {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n if (componentFunction) {\n return `components/${componentFunction.componentPath}`;\n }\n const parts = name.split(\":\");\n if (parts.length > 1) {\n return `${parts[0]}.ts`;\n }\n return \"unknown\";\n}\n\nfunction normalizeFilterValue(filter: {\n operator: string;\n value: unknown;\n}): unknown {\n switch (filter.operator) {\n case \"contains\":\n return `%${String(filter.value)}%`;\n case \"startsWith\":\n return `${String(filter.value)}%`;\n default:\n return filter.value;\n }\n}\n\nfunction filterOperatorToSql(operator: string): string {\n switch (operator) {\n case \"eq\":\n return \"=\";\n case \"neq\":\n return \"!=\";\n case \"gt\":\n return \">\";\n case \"gte\":\n return \">=\";\n case \"lt\":\n return \"<\";\n case \"lte\":\n return \"<=\";\n case \"contains\":\n case \"startsWith\":\n return \"LIKE\";\n default:\n return \"=\";\n }\n}\n\nfunction mapJobStatus(\n status: string\n): \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\" {\n switch (status) {\n case \"scheduled\":\n return \"pending\";\n case \"completed\":\n return \"completed\";\n case \"failed\":\n return \"failed\";\n case \"cancelled\":\n case \"skipped\":\n return \"cancelled\";\n default:\n return \"pending\";\n }\n}\n\nfunction formatScheduleLabel(schedule: SchedulerRecurringSchedule): string {\n switch (schedule.type) {\n case \"interval\": {\n const parts: string[] = [];\n if (schedule.hours) {\n parts.push(`${schedule.hours}h`);\n }\n if (schedule.minutes) {\n parts.push(`${schedule.minutes}m`);\n }\n if (schedule.seconds) {\n parts.push(`${schedule.seconds}s`);\n }\n return parts.length > 0 ? `Every ${parts.join(\" \")}` : \"Recurring\";\n }\n case \"daily\":\n return `Daily ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n case \"weekly\":\n return `Weekly ${capitalize(schedule.dayOfWeek)} ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n default:\n return \"Recurring\";\n }\n}\n\nfunction readMisfirePolicy(\n type: string,\n windowMs: number | null\n): SchedulerMisfirePolicy {\n if (type === \"windowed\") {\n return {\n type,\n windowMs: windowMs ?? 0\n };\n }\n if (type === \"skip\" || type === \"run_once_if_missed\") {\n return { type };\n }\n return { type: \"catch_up\" };\n}\n\nfunction padNumber(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nfunction capitalize(value: string): string {\n return value.slice(0, 1).toUpperCase() + value.slice(1);\n}\n\nasync function runDevtoolsMutation<TResult>(\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>,\n callback: (ctx: {\n db: {\n insert(\n tableName: string,\n value: Record<string, unknown>\n ): Promise<string>;\n patch(\n tableName: string,\n id: string,\n value: Record<string, unknown>\n ): Promise<void>;\n delete(tableName: string, id: string): Promise<void>;\n };\n }) => Promise<TResult>,\n meta?: { origin?: \"dashboard\" }\n ): Promise<TResult> {\n return admin.runDevtoolsMutation(callback as never, meta);\n }\n\nfunction scopesForSubscription(\n payload: SyncoreDevtoolsSubscriptionPayload,\n sql?: DevtoolsSqlSupport\n): Set<DevtoolsInvalidationScope> {\n switch (payload.kind) {\n case \"runtime.summary\":\n return new Set([\"runtime.summary\"]);\n case \"runtime.activeQueries\":\n return new Set([\"runtime.activeQueries\"]);\n case \"fn.watch\":\n return new Set([\"all\"]);\n case \"schema.tables\":\n return new Set([\"schema.tables\"]);\n case \"data.table\":\n return new Set<DevtoolsInvalidationScope>([`table:${payload.table}`]);\n case \"scheduler.jobs\":\n return new Set([\"scheduler.jobs\"]);\n case \"functions.catalog\":\n return new Set([\"all\"]);\n case \"sql.watch\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n sqlSupport.ensureSqlMode(analysis, \"watch\");\n return new Set<DevtoolsInvalidationScope>(analysis.observedScopes);\n } catch {\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n }\n default:\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n}\n\nfunction intersects(\n a: Set<DevtoolsInvalidationScope>,\n b: Set<DevtoolsInvalidationScope>\n): boolean {\n if (a.has(\"all\") || b.has(\"all\")) {\n return true;\n }\n for (const value of a) {\n if (b.has(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction requireDevtoolsSqlSupport(\n sql?: DevtoolsSqlSupport\n): DevtoolsSqlSupport {\n if (!sql) {\n throw new Error(\"SQL devtools are only available in Node-hosted runtimes.\");\n }\n return sql;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"devtools.mjs","names":[],"sources":["../../src/runtime/devtools.ts"],"sourcesContent":["import type {\n SchedulerMisfirePolicy,\n SchedulerJob,\n SchedulerRecurringSchedule,\n SyncoreDevtoolsCommandPayload,\n SyncoreDevtoolsCommandResultPayload,\n SyncoreDevtoolsSubscriptionPayload,\n SyncoreDevtoolsSubscriptionResultPayload,\n TableSchema\n} from \"@syncore/devtools-protocol\";\nimport { describeValidator } from \"@syncore/schema\";\nimport type {\n TableDefinition,\n Validator\n} from \"@syncore/schema\";\nimport type {\n DevtoolsLiveQueryScope,\n ImpactScope,\n SyncoreDataModel,\n SyncoreRuntimeAdmin,\n SyncoreRuntimeOptions,\n SyncoreSqlDriver\n} from \"./runtime.js\";\nimport { createFunctionReference } from \"./runtime.js\";\nimport {\n parseCanonicalComponentFunctionName,\n parseComponentScopedIdentifier,\n quoteIdentifier,\n safeReadRecurringSchedule\n} from \"./internal/engines/shared.js\";\n\nexport interface DevtoolsCommandHandlerDeps {\n driver: SyncoreSqlDriver;\n schema: SyncoreDataModel;\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"];\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>;\n sql?: DevtoolsSqlSupport;\n}\n\nexport type DevtoolsSqlMode = \"read\" | \"write\" | \"ddl\";\n\nexport interface DevtoolsSqlAnalysis {\n mode: DevtoolsSqlMode;\n readTables: string[];\n writeTables: string[];\n schemaChanged: boolean;\n observedScopes: DevtoolsLiveQueryScope[];\n}\n\nexport interface DevtoolsSqlReadResult {\n columns: string[];\n rows: unknown[][];\n observedTables: string[];\n}\n\nexport interface DevtoolsSqlSupport {\n analyzeSqlStatement(query: string): DevtoolsSqlAnalysis;\n ensureSqlMode(\n analysis: DevtoolsSqlAnalysis,\n expected: DevtoolsSqlMode | \"watch\"\n ): void;\n runReadonlyQuery(databasePath: string, query: string): DevtoolsSqlReadResult;\n}\n\nexport type DevtoolsCommandHandler = (\n payload: SyncoreDevtoolsCommandPayload\n) => Promise<SyncoreDevtoolsCommandResultPayload>;\n\nexport type DevtoolsSubscriptionListener = (\n payload: SyncoreDevtoolsSubscriptionResultPayload\n) => void;\n\nexport interface DevtoolsSubscriptionHost {\n subscribe(\n subscriptionId: string,\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ): Promise<void>;\n unsubscribe(subscriptionId: string): void;\n dispose(): void;\n}\n\ntype DevtoolsInvalidationScope = DevtoolsLiveQueryScope;\n\ninterface SubscriptionRecord {\n payload: SyncoreDevtoolsSubscriptionPayload;\n listener: DevtoolsSubscriptionListener;\n unsubscribeRuntime: () => void;\n scopes: Set<DevtoolsInvalidationScope>;\n}\n\nexport function createDevtoolsCommandHandler(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsCommandHandler {\n const { driver, admin, sql } = deps;\n\n return async (payload): Promise<SyncoreDevtoolsCommandResultPayload> => {\n await admin.prepareForDirectAccess();\n switch (payload.kind) {\n case \"fn.run\": {\n const start = performance.now();\n try {\n let result: unknown;\n switch (payload.functionType) {\n case \"query\":\n result = await admin.runQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"mutation\":\n result = await admin.runMutation(\n createFunctionReference(\"mutation\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"action\":\n result = await admin.runAction(\n createFunctionReference(\"action\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n }\n return {\n kind: \"fn.run.result\",\n result,\n durationMs: performance.now() - start\n };\n } catch (error) {\n return {\n kind: \"fn.run.result\",\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - start\n };\n }\n }\n\n case \"data.insert\": {\n try {\n const id = await runDevtoolsMutation(admin, async (ctx) =>\n ctx.db.insert(payload.table as never, payload.document as never)\n , { origin: \"dashboard\" });\n notifyDataMutationScopes(admin, payload.table);\n return { kind: \"data.mutate.result\", success: true, id };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.patch\": {\n try {\n await runDevtoolsMutation(admin, async (ctx) => {\n await ctx.db.patch(\n payload.table as never,\n payload.id,\n payload.fields as never\n );\n return null;\n }, { origin: \"dashboard\" });\n notifyDataMutationScopes(admin, payload.table);\n return {\n kind: \"data.mutate.result\",\n success: true,\n id: payload.id\n };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.delete\": {\n try {\n await runDevtoolsMutation(admin, async (ctx) => {\n await ctx.db.delete(payload.table as never, payload.id);\n return null;\n }, { origin: \"dashboard\" });\n notifyDataMutationScopes(admin, payload.table);\n return { kind: \"data.mutate.result\", success: true };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.export\": {\n try {\n const requestedTables =\n payload.tables && payload.tables.length > 0\n ? payload.tables\n : deps.schema.tableNames();\n const tables = await Promise.all(\n requestedTables.map(async (name) => {\n const result = await queryTable(driver, name);\n return {\n name,\n rows: result.rows,\n totalCount: result.totalCount\n };\n })\n );\n return {\n kind: \"data.export.result\",\n tables\n };\n } catch (error) {\n return {\n kind: \"data.export.result\",\n tables: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.referenceOptions\": {\n const limit = Math.min(Math.max(payload.limit ?? 100, 1), 200);\n const offset = Math.max(payload.offset ?? 0, 0);\n try {\n const result = await queryReferenceOptions(\n driver,\n payload.table,\n payload.search,\n limit,\n offset\n );\n return {\n kind: \"data.referenceOptions.result\",\n table: payload.table,\n rows: result.rows,\n totalCount: result.totalCount,\n offset,\n hasMore: offset + result.rows.length < result.totalCount\n };\n } catch (error) {\n return {\n kind: \"data.referenceOptions.result\",\n table: payload.table,\n rows: [],\n totalCount: 0,\n offset,\n hasMore: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.read\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Read requires a file-backed database path.\");\n }\n const { columns, rows } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.read.result\",\n columns,\n rows\n };\n } catch (error) {\n return {\n kind: \"sql.read.result\",\n columns: [],\n rows: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.write\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n if (analysis.mode === \"read\") {\n throw new Error(\n \"Use SQL Read or SQL Live for read-only statements.\"\n );\n }\n const result = await driver.run(payload.query);\n admin.notifyDevtoolsScopes(analysis.observedScopes);\n await admin.forceRefreshDevtools(\n \"SQL write executed from devtools dashboard.\",\n analysis.observedScopes.flatMap((scope) =>\n scope === \"all\" ? [] : ([scope] as ImpactScope[])\n ),\n { origin: \"dashboard\" }\n );\n return {\n kind: \"sql.write.result\",\n rowsAffected: result.changes,\n invalidationScopes: [...analysis.observedScopes]\n };\n } catch (error) {\n return {\n kind: \"sql.write.result\",\n rowsAffected: 0,\n invalidationScopes: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.cancel\": {\n try {\n const cancelled = await admin.cancelScheduledJob(payload.jobId);\n return {\n kind: \"scheduler.cancel.result\",\n success: true,\n cancelled\n };\n } catch (error) {\n return {\n kind: \"scheduler.cancel.result\",\n success: false,\n cancelled: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.update\": {\n try {\n const updated = await admin.updateScheduledJob({\n id: payload.jobId,\n args: payload.args,\n ...(payload.schedule ? { schedule: payload.schedule } : {}),\n ...(payload.misfirePolicy\n ? { misfirePolicy: payload.misfirePolicy }\n : {}),\n ...(payload.runAt !== undefined ? { runAt: payload.runAt } : {})\n });\n const jobs = updated ? await listSchedulerJobs(driver) : [];\n const updatedJob = jobs.find((job) => job.id === payload.jobId);\n return {\n kind: \"scheduler.update.result\",\n success: true,\n updated,\n ...(updated && updatedJob ? { job: updatedJob } : {})\n };\n } catch (error) {\n return {\n kind: \"scheduler.update.result\",\n success: false,\n updated: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n default:\n return {\n kind: \"error\",\n message: `Unknown devtools command: ${(payload as { kind: string }).kind}`\n };\n }\n };\n}\n\nexport function createDevtoolsSubscriptionHost(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsSubscriptionHost {\n const { driver, schema, functions, admin } = deps;\n const subscriptions = new Map<string, SubscriptionRecord>();\n\n const emit = async (\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ) => {\n listener(\n await resolveSubscriptionPayload(payload, {\n driver,\n schema,\n functions,\n admin,\n ...(deps.sql ? { sql: deps.sql } : {})\n })\n );\n };\n\n const handleInvalidation = async (scopes: Set<DevtoolsInvalidationScope>) => {\n for (const record of subscriptions.values()) {\n if (!intersects(scopes, record.scopes)) {\n continue;\n }\n await emit(record.payload, record.listener);\n }\n };\n\n return {\n async subscribe(subscriptionId, payload, listener) {\n if (payload.kind === \"fn.watch\") {\n const definition = functions[payload.functionName];\n if (!definition || definition.kind !== \"query\") {\n listener({\n kind: \"fn.watch.result\",\n error: `Unknown query function: ${payload.functionName}`\n });\n return;\n }\n const client = admin.createClient();\n const watch = client.watchQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args\n );\n const emitWatchResult = () => {\n const error = watch.localQueryError();\n listener({\n kind: \"fn.watch.result\",\n ...(error\n ? {\n error: error.message\n }\n : {\n result: watch.localQueryResult()\n })\n });\n };\n const unsubscribeUpdates = watch.onUpdate(emitWatchResult);\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeUpdates();\n watch.dispose?.();\n },\n scopes: new Set<DevtoolsInvalidationScope>([\"all\"])\n });\n emitWatchResult();\n return;\n }\n\n const unsubscribeRuntime = admin.subscribeToDevtoolsInvalidations(\n (scopes) => {\n void handleInvalidation(scopes);\n }\n );\n const unsubscribeEvents = admin.subscribeToDevtoolsEvents((event) => {\n if (event.type === \"runtime.disconnected\") {\n void emit(payload, listener);\n }\n });\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeRuntime();\n unsubscribeEvents();\n },\n scopes: scopesForSubscription(payload, deps.sql)\n });\n await emit(payload, listener);\n },\n unsubscribe(subscriptionId) {\n const record = subscriptions.get(subscriptionId);\n if (!record) {\n return;\n }\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n },\n dispose() {\n for (const [subscriptionId, record] of subscriptions) {\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n }\n }\n };\n}\n\nasync function resolveSubscriptionPayload(\n payload: SyncoreDevtoolsSubscriptionPayload,\n deps: DevtoolsCommandHandlerDeps\n): Promise<SyncoreDevtoolsSubscriptionResultPayload> {\n const { driver, schema, functions, admin } = deps;\n await admin.prepareForDirectAccess();\n\n switch (payload.kind) {\n case \"runtime.summary\":\n return {\n kind: \"runtime.summary.result\",\n summary: admin.getRuntimeSummary()\n };\n case \"runtime.activeQueries\":\n return {\n kind: \"runtime.activeQueries.result\",\n activeQueries: admin.getActiveQueryInfos()\n };\n case \"fn.watch\":\n throw new Error(\"Function watches are pushed incrementally and have no snapshot payload.\");\n case \"schema.tables\": {\n const tables = await getSchemaTables(driver, schema);\n console.debug(\"[devtools] schema.tables\", {\n runtimeId: admin.getRuntimeId(),\n tables: tables.map((table) => ({\n name: table.name,\n documentCount: table.documentCount\n }))\n });\n return {\n kind: \"schema.tables.result\",\n tables\n };\n }\n case \"data.table\": {\n const result = await queryTable(\n driver,\n payload.table,\n payload.filters,\n payload.limit\n );\n console.debug(\"[devtools] data.table\", {\n runtimeId: admin.getRuntimeId(),\n table: payload.table,\n filters: payload.filters ?? [],\n limit: payload.limit,\n totalCount: result.totalCount,\n rowCount: result.rows.length,\n firstRow: result.rows[0] ?? null\n });\n return {\n kind: \"data.table.result\",\n rows: result.rows,\n totalCount: result.totalCount,\n ...(result.cursor ? { cursor: result.cursor } : {})\n };\n }\n case \"scheduler.jobs\":\n return {\n kind: \"scheduler.jobs.result\",\n jobs: await listSchedulerJobs(driver)\n };\n case \"functions.catalog\":\n return {\n kind: \"functions.catalog.result\",\n functions: listFunctions(functions)\n };\n case \"sql.watch\": {\n const sqlSupport = requireDevtoolsSqlSupport(deps.sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Live requires a file-backed database path.\");\n }\n const { columns, rows, observedTables } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.watch.result\",\n columns,\n rows,\n observedTables\n };\n }\n }\n}\n\nasync function queryTable(\n driver: SyncoreSqlDriver,\n table: string,\n filters?: Array<{\n field: string;\n operator: string;\n value: unknown;\n }>,\n limit?: number\n): Promise<{\n rows: Record<string, unknown>[];\n totalCount: number;\n cursor?: string;\n}> {\n let sql = `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(table)}`;\n const params: unknown[] = [];\n const whereClauses: string[] = [];\n\n if (filters && filters.length > 0) {\n for (const filter of filters) {\n whereClauses.push(filterToSql(filter));\n params.push(normalizeFilterValue(filter));\n }\n sql += ` WHERE ${whereClauses.join(\" AND \")}`;\n }\n\n sql += \" ORDER BY _creationTime DESC\";\n if (limit) {\n sql += ` LIMIT ${limit}`;\n }\n\n const rawRows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(sql, params);\n const rows = rawRows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }));\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${quoteIdentifier(table)}${\n whereClauses.length > 0 ? ` WHERE ${whereClauses.join(\" AND \")}` : \"\"\n }`,\n params\n );\n\n return {\n rows,\n totalCount: countRow?.count ?? 0\n };\n}\n\nasync function queryReferenceOptions(\n driver: SyncoreSqlDriver,\n table: string,\n search: string | undefined,\n limit: number,\n offset: number\n): Promise<{\n rows: Record<string, unknown>[];\n totalCount: number;\n}> {\n let sql = `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(table)}`;\n const params: unknown[] = [];\n const trimmedSearch = search?.trim();\n const whereClause = trimmedSearch\n ? \" WHERE _id LIKE ? OR _json LIKE ?\"\n : \"\";\n if (trimmedSearch) {\n const like = `%${trimmedSearch}%`;\n params.push(like, like);\n }\n\n sql += `${whereClause} ORDER BY _creationTime DESC LIMIT ? OFFSET ?`;\n const rawRows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(sql, [...params, limit, offset]);\n const rows = rawRows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }));\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${quoteIdentifier(table)}${whereClause}`,\n params\n );\n return {\n rows,\n totalCount: countRow?.count ?? 0\n };\n}\n\nasync function getSchemaTables(\n driver: SyncoreSqlDriver,\n schema: SyncoreDataModel\n): Promise<TableSchema[]> {\n return Promise.all(\n schema.tableNames().map(async (name) => {\n const table = schema.getTable(name) as TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >;\n const validatorDesc = describeValidator(table.validator);\n const fields =\n validatorDesc.kind === \"object\"\n ? Object.entries(validatorDesc.shape).map(\n ([fieldName, fieldDesc]) => {\n const field = fieldDesc as {\n validator: { kind: string; tableName?: string };\n optional: boolean;\n };\n return {\n name: fieldName,\n type: field.validator.kind,\n optional: field.optional,\n ...(field.validator.kind === \"id\" && field.validator.tableName\n ? { referenceTable: field.validator.tableName }\n : {})\n };\n }\n )\n : [];\n\n fields.unshift(\n { name: \"_id\", type: \"string\", optional: false },\n { name: \"_creationTime\", type: \"number\", optional: false }\n );\n\n const documentCount = await driver\n .get<{ count: number }>(`SELECT COUNT(*) as count FROM \"${name}\"`)\n .then((countRow) => countRow?.count ?? 0)\n .catch(() => 0);\n\n return {\n name,\n ...(table.options.tableName ? { displayName: table.options.tableName } : {}),\n owner: table.options.componentPath ? (\"component\" as const) : (\"root\" as const),\n ...(table.options.componentPath\n ? { componentPath: table.options.componentPath }\n : {}),\n ...(table.options.componentName\n ? { componentName: table.options.componentName }\n : {}),\n fields,\n indexes: table.indexes.map((index) => ({\n name: index.name,\n fields: index.fields,\n unique: false\n })),\n documentCount\n };\n })\n );\n}\n\nasync function listSchedulerJobs(\n driver: SyncoreSqlDriver\n): Promise<SchedulerJob[]> {\n try {\n const rows = await driver.all<{\n id: string;\n function_name: string;\n args_json: string;\n status: string;\n run_at: number;\n created_at: number;\n updated_at: number;\n recurring_name: string | null;\n schedule_json: string | null;\n timezone: string | null;\n misfire_policy: string;\n last_run_at: number | null;\n window_ms: number | null;\n }>(`SELECT * FROM \"_scheduled_functions\" ORDER BY run_at DESC LIMIT 200`);\n\n return rows.map((row) => {\n const schedule = safeReadRecurringSchedule(row.schedule_json);\n const scheduleLabel = schedule ? formatScheduleLabel(schedule) : undefined;\n const functionComponent = parseCanonicalComponentFunctionName(\n row.function_name\n );\n const idComponent = parseComponentScopedIdentifier(row.id);\n return {\n id: row.id,\n functionName: row.function_name,\n owner:\n functionComponent || idComponent ? (\"component\" as const) : (\"root\" as const),\n ...(functionComponent\n ? {\n componentPath: functionComponent.componentPath\n }\n : idComponent\n ? {\n componentPath: idComponent.componentPath\n }\n : {}),\n args: JSON.parse(row.args_json) as Record<string, unknown>,\n scheduledAt: row.created_at,\n runAt: row.run_at,\n status: mapJobStatus(row.status),\n ...(row.status === \"completed\" || row.status === \"failed\"\n ? { completedAt: row.updated_at }\n : {}),\n ...(row.recurring_name ? { recurringName: row.recurring_name } : {}),\n ...(schedule ? { schedule } : {}),\n ...(scheduleLabel ? { scheduleLabel, cronSchedule: scheduleLabel } : {}),\n ...(row.timezone ? { timezone: row.timezone } : {}),\n ...(row.last_run_at !== null ? { lastRunAt: row.last_run_at } : {}),\n ...(row.updated_at ? { updatedAt: row.updated_at } : {}),\n misfirePolicy: readMisfirePolicy(row.misfire_policy, row.window_ms)\n };\n });\n } catch {\n return [];\n }\n}\n\nfunction listFunctions(\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"]\n) {\n return Object.entries(functions)\n .filter(\n (entry): entry is [string, NonNullable<(typeof entry)[1]>] =>\n entry[1] !== undefined\n )\n .map(([name, fn]) => {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n const descriptor: {\n name: string;\n type: \"query\" | \"mutation\" | \"action\";\n file?: string;\n modulePath?: string;\n namespace?: string;\n metadataAvailable?: boolean;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n visibility?: \"public\" | \"internal\";\n localName?: string;\n args?: Record<string, unknown>;\n } = {\n name,\n type: fn.kind,\n owner: componentFunction ? \"component\" : \"root\",\n namespace: inferFunctionNamespace(name),\n metadataAvailable: componentFunction !== null || name.includes(\":\"),\n ...(componentFunction\n ? {\n file: `components/${componentFunction.componentPath}`,\n modulePath: componentFunction.componentPath,\n componentPath: componentFunction.componentPath,\n visibility: componentFunction.visibility,\n localName: componentFunction.localName\n }\n : inferFileFromFunctionName(name)\n ? {\n file: inferFileFromFunctionName(name),\n modulePath: inferFunctionNamespace(name)\n }\n : {})\n };\n const argsDesc = describeValidator(fn.argsValidator);\n if (argsDesc.kind === \"object\") {\n descriptor.args = argsDesc.shape as Record<string, unknown>;\n }\n return descriptor;\n });\n}\n\nfunction inferFileFromFunctionName(name: string): string {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n if (componentFunction) {\n return `components/${componentFunction.componentPath}`;\n }\n const parts = name.split(\":\");\n if (parts.length > 1) {\n return `${parts[0]}.ts`;\n }\n return \"\";\n}\n\nfunction inferFunctionNamespace(name: string): string {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n if (componentFunction) {\n return componentFunction.componentPath;\n }\n if (name.includes(\":\")) {\n return name.split(\":\")[0] ?? \"root\";\n }\n if (name.includes(\"/\")) {\n return name.split(\"/\")[0] ?? \"root\";\n }\n return \"root\";\n}\n\nfunction normalizeFilterValue(filter: {\n operator: string;\n value: unknown;\n}): unknown {\n const value = coerceFilterValue(filter.value);\n switch (filter.operator) {\n case \"contains\":\n return `%${String(value)}%`;\n case \"startsWith\":\n return `${String(value)}%`;\n default:\n return value;\n }\n}\n\nfunction filterToSql(filter: { field: string; operator: string }): string {\n const operator = filterOperatorToSql(filter.operator);\n if (filter.field === \"_id\") {\n return `_id ${operator} ?`;\n }\n if (filter.field === \"_creationTime\") {\n return `_creationTime ${operator} ?`;\n }\n return `json_extract(_json, ${JSON.stringify(`$.${filter.field}`)}) ${operator} ?`;\n}\n\nfunction coerceFilterValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n const trimmed = value.trim();\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\") return null;\n if (/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)) {\n const numberValue = Number(trimmed);\n if (Number.isFinite(numberValue)) {\n return numberValue;\n }\n }\n return value;\n}\n\nfunction filterOperatorToSql(operator: string): string {\n switch (operator) {\n case \"eq\":\n return \"=\";\n case \"neq\":\n return \"!=\";\n case \"gt\":\n return \">\";\n case \"gte\":\n return \">=\";\n case \"lt\":\n return \"<\";\n case \"lte\":\n return \"<=\";\n case \"contains\":\n case \"startsWith\":\n return \"LIKE\";\n default:\n return \"=\";\n }\n}\n\nfunction mapJobStatus(\n status: string\n): \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\" {\n switch (status) {\n case \"scheduled\":\n return \"pending\";\n case \"completed\":\n return \"completed\";\n case \"failed\":\n return \"failed\";\n case \"cancelled\":\n case \"skipped\":\n return \"cancelled\";\n default:\n return \"pending\";\n }\n}\n\nfunction formatScheduleLabel(schedule: SchedulerRecurringSchedule): string {\n switch (schedule.type) {\n case \"interval\": {\n const parts: string[] = [];\n if (schedule.hours) {\n parts.push(`${schedule.hours}h`);\n }\n if (schedule.minutes) {\n parts.push(`${schedule.minutes}m`);\n }\n if (schedule.seconds) {\n parts.push(`${schedule.seconds}s`);\n }\n return parts.length > 0 ? `Every ${parts.join(\" \")}` : \"Recurring\";\n }\n case \"daily\":\n return `Daily ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n case \"weekly\":\n return `Weekly ${capitalize(schedule.dayOfWeek)} ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n default:\n return \"Recurring\";\n }\n}\n\nfunction readMisfirePolicy(\n type: string,\n windowMs: number | null\n): SchedulerMisfirePolicy {\n if (type === \"windowed\") {\n return {\n type,\n windowMs: windowMs ?? 0\n };\n }\n if (type === \"skip\" || type === \"run_once_if_missed\") {\n return { type };\n }\n return { type: \"catch_up\" };\n}\n\nfunction padNumber(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nfunction capitalize(value: string): string {\n return value.slice(0, 1).toUpperCase() + value.slice(1);\n}\n\nasync function runDevtoolsMutation<TResult>(\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>,\n callback: (ctx: {\n db: {\n insert(\n tableName: string,\n value: Record<string, unknown>\n ): Promise<string>;\n patch(\n tableName: string,\n id: string,\n value: Record<string, unknown>\n ): Promise<void>;\n delete(tableName: string, id: string): Promise<void>;\n };\n }) => Promise<TResult>,\n meta?: { origin?: \"dashboard\" }\n ): Promise<TResult> {\n return admin.runDevtoolsMutation(callback as never, meta);\n }\n\nfunction notifyDataMutationScopes(\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>,\n tableName: string\n): void {\n admin.notifyDevtoolsScopes([\"schema.tables\", `table:${tableName}`]);\n}\n\nfunction scopesForSubscription(\n payload: SyncoreDevtoolsSubscriptionPayload,\n sql?: DevtoolsSqlSupport\n): Set<DevtoolsInvalidationScope> {\n switch (payload.kind) {\n case \"runtime.summary\":\n return new Set([\"runtime.summary\"]);\n case \"runtime.activeQueries\":\n return new Set([\"runtime.activeQueries\"]);\n case \"fn.watch\":\n return new Set([\"all\"]);\n case \"schema.tables\":\n return new Set([\"schema.tables\"]);\n case \"data.table\":\n return new Set<DevtoolsInvalidationScope>([`table:${payload.table}`]);\n case \"scheduler.jobs\":\n return new Set([\"scheduler.jobs\"]);\n case \"functions.catalog\":\n return new Set([\"all\"]);\n case \"sql.watch\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n sqlSupport.ensureSqlMode(analysis, \"watch\");\n return new Set<DevtoolsInvalidationScope>(analysis.observedScopes);\n } catch {\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n }\n default:\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n}\n\nfunction intersects(\n a: Set<DevtoolsInvalidationScope>,\n b: Set<DevtoolsInvalidationScope>\n): boolean {\n if (a.has(\"all\") || b.has(\"all\")) {\n return true;\n }\n for (const value of a) {\n if (b.has(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction requireDevtoolsSqlSupport(\n sql?: DevtoolsSqlSupport\n): DevtoolsSqlSupport {\n if (!sql) {\n throw new Error(\"SQL Console is not available for this runtime.\");\n }\n return sql;\n}\n"],"mappings":"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"}
|