syncorejs 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +2 -1
  2. package/dist/_vendor/cli/app.d.mts.map +1 -1
  3. package/dist/_vendor/cli/app.mjs +323 -42
  4. package/dist/_vendor/cli/app.mjs.map +1 -1
  5. package/dist/_vendor/cli/context.mjs +27 -9
  6. package/dist/_vendor/cli/context.mjs.map +1 -1
  7. package/dist/_vendor/cli/doctor.mjs +513 -46
  8. package/dist/_vendor/cli/doctor.mjs.map +1 -1
  9. package/dist/_vendor/cli/messages.mjs +5 -4
  10. package/dist/_vendor/cli/messages.mjs.map +1 -1
  11. package/dist/_vendor/cli/project.mjs +110 -12
  12. package/dist/_vendor/cli/project.mjs.map +1 -1
  13. package/dist/_vendor/cli/render.mjs +57 -9
  14. package/dist/_vendor/cli/render.mjs.map +1 -1
  15. package/dist/_vendor/cli/targets.mjs +4 -3
  16. package/dist/_vendor/cli/targets.mjs.map +1 -1
  17. package/dist/_vendor/core/cli.d.mts +13 -3
  18. package/dist/_vendor/core/cli.d.mts.map +1 -1
  19. package/dist/_vendor/core/cli.mjs +242 -91
  20. package/dist/_vendor/core/cli.mjs.map +1 -1
  21. package/dist/_vendor/core/devtools-auth.mjs +60 -0
  22. package/dist/_vendor/core/devtools-auth.mjs.map +1 -0
  23. package/dist/_vendor/core/index.d.mts +5 -3
  24. package/dist/_vendor/core/index.mjs +22 -2
  25. package/dist/_vendor/core/index.mjs.map +1 -1
  26. package/dist/_vendor/core/runtime/components.d.mts +111 -0
  27. package/dist/_vendor/core/runtime/components.d.mts.map +1 -0
  28. package/dist/_vendor/core/runtime/components.mjs +186 -0
  29. package/dist/_vendor/core/runtime/components.mjs.map +1 -0
  30. package/dist/_vendor/core/runtime/devtools.d.mts +4 -4
  31. package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
  32. package/dist/_vendor/core/runtime/devtools.mjs +52 -41
  33. package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
  34. package/dist/_vendor/core/runtime/functions.d.mts +10 -10
  35. package/dist/_vendor/core/runtime/functions.d.mts.map +1 -1
  36. package/dist/_vendor/core/runtime/functions.mjs +2 -2
  37. package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
  38. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +77 -0
  39. package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -0
  40. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs +617 -0
  41. package/dist/_vendor/core/runtime/internal/engines/executionEngine.mjs.map +1 -0
  42. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +186 -0
  43. package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -0
  44. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs +220 -0
  45. package/dist/_vendor/core/runtime/internal/engines/schedulerEngine.mjs.map +1 -0
  46. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs +203 -0
  47. package/dist/_vendor/core/runtime/internal/engines/schemaEngine.mjs.map +1 -0
  48. package/dist/_vendor/core/runtime/internal/engines/shared.mjs +177 -0
  49. package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -0
  50. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +144 -0
  51. package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -0
  52. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +220 -0
  53. package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -0
  54. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs +32 -0
  55. package/dist/_vendor/core/runtime/internal/runtimeStatus.mjs.map +1 -0
  56. package/dist/_vendor/core/runtime/internal/systemMeta.mjs +61 -0
  57. package/dist/_vendor/core/runtime/internal/systemMeta.mjs.map +1 -0
  58. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs +37 -0
  59. package/dist/_vendor/core/runtime/internal/transactionCoordinator.mjs.map +1 -0
  60. package/dist/_vendor/core/runtime/runtime.d.mts +159 -205
  61. package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
  62. package/dist/_vendor/core/runtime/runtime.mjs +16 -1371
  63. package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
  64. package/dist/_vendor/core/transport.d.mts +111 -0
  65. package/dist/_vendor/core/transport.d.mts.map +1 -0
  66. package/dist/_vendor/core/transport.mjs +419 -0
  67. package/dist/_vendor/core/transport.mjs.map +1 -0
  68. package/dist/_vendor/devtools-protocol/index.d.ts +39 -1
  69. package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
  70. package/dist/_vendor/devtools-protocol/index.js +25 -9
  71. package/dist/_vendor/devtools-protocol/index.js.map +1 -1
  72. package/dist/_vendor/next/index.d.ts +1 -1
  73. package/dist/_vendor/next/index.d.ts.map +1 -1
  74. package/dist/_vendor/next/index.js +31 -13
  75. package/dist/_vendor/next/index.js.map +1 -1
  76. package/dist/_vendor/platform-expo/index.d.ts +12 -12
  77. package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
  78. package/dist/_vendor/platform-expo/index.js +4 -2
  79. package/dist/_vendor/platform-expo/index.js.map +1 -1
  80. package/dist/_vendor/platform-expo/react.d.ts.map +1 -1
  81. package/dist/_vendor/platform-expo/react.js +11 -10
  82. package/dist/_vendor/platform-expo/react.js.map +1 -1
  83. package/dist/_vendor/platform-node/index.d.mts +23 -19
  84. package/dist/_vendor/platform-node/index.d.mts.map +1 -1
  85. package/dist/_vendor/platform-node/index.mjs +13 -5
  86. package/dist/_vendor/platform-node/index.mjs.map +1 -1
  87. package/dist/_vendor/platform-node/ipc-react.d.mts.map +1 -1
  88. package/dist/_vendor/platform-node/ipc-react.mjs +15 -2
  89. package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
  90. package/dist/_vendor/platform-node/ipc.d.mts +11 -35
  91. package/dist/_vendor/platform-node/ipc.d.mts.map +1 -1
  92. package/dist/_vendor/platform-node/ipc.mjs +3 -273
  93. package/dist/_vendor/platform-node/ipc.mjs.map +1 -1
  94. package/dist/_vendor/platform-web/external-change.d.ts +2 -1
  95. package/dist/_vendor/platform-web/external-change.d.ts.map +1 -1
  96. package/dist/_vendor/platform-web/external-change.js +2 -1
  97. package/dist/_vendor/platform-web/external-change.js.map +1 -1
  98. package/dist/_vendor/platform-web/index.d.ts +21 -21
  99. package/dist/_vendor/platform-web/index.d.ts.map +1 -1
  100. package/dist/_vendor/platform-web/index.js +44 -7
  101. package/dist/_vendor/platform-web/index.js.map +1 -1
  102. package/dist/_vendor/platform-web/react.d.ts.map +1 -1
  103. package/dist/_vendor/platform-web/react.js +29 -13
  104. package/dist/_vendor/platform-web/react.js.map +1 -1
  105. package/dist/_vendor/platform-web/worker.d.ts +11 -35
  106. package/dist/_vendor/platform-web/worker.d.ts.map +1 -1
  107. package/dist/_vendor/platform-web/worker.js +3 -267
  108. package/dist/_vendor/platform-web/worker.js.map +1 -1
  109. package/dist/_vendor/react/index.d.ts +36 -20
  110. package/dist/_vendor/react/index.d.ts.map +1 -1
  111. package/dist/_vendor/react/index.js +279 -57
  112. package/dist/_vendor/react/index.js.map +1 -1
  113. package/dist/_vendor/schema/definition.d.ts +48 -63
  114. package/dist/_vendor/schema/definition.d.ts.map +1 -1
  115. package/dist/_vendor/schema/definition.js +22 -39
  116. package/dist/_vendor/schema/definition.js.map +1 -1
  117. package/dist/_vendor/schema/index.d.ts +4 -4
  118. package/dist/_vendor/schema/index.js +2 -2
  119. package/dist/_vendor/schema/planner.d.ts +19 -2
  120. package/dist/_vendor/schema/planner.d.ts.map +1 -1
  121. package/dist/_vendor/schema/planner.js +79 -3
  122. package/dist/_vendor/schema/planner.js.map +1 -1
  123. package/dist/_vendor/schema/validators.d.ts +141 -121
  124. package/dist/_vendor/schema/validators.d.ts.map +1 -1
  125. package/dist/_vendor/schema/validators.js +300 -42
  126. package/dist/_vendor/schema/validators.js.map +1 -1
  127. package/dist/_vendor/svelte/index.d.ts +47 -19
  128. package/dist/_vendor/svelte/index.d.ts.map +1 -1
  129. package/dist/_vendor/svelte/index.js +250 -20
  130. package/dist/_vendor/svelte/index.js.map +1 -1
  131. package/dist/components.d.ts +2 -0
  132. package/dist/components.js +2 -0
  133. package/dist/index.d.ts +3 -2
  134. package/dist/index.js +2 -1
  135. package/package.json +8 -3
@@ -1,10 +1,11 @@
1
+ import { parseCanonicalComponentFunctionName, parseComponentScopedIdentifier, safeReadRecurringSchedule } from "./internal/engines/shared.mjs";
1
2
  import { createFunctionReference } from "./runtime.mjs";
2
3
  import { describeValidator } from "../../schema/index.js";
3
4
  //#region src/runtime/devtools.ts
4
5
  function createDevtoolsCommandHandler(deps) {
5
- const { driver, runtime, sql } = deps;
6
+ const { driver, admin, sql } = deps;
6
7
  return async (payload) => {
7
- await runtime.prepareForDirectAccess();
8
+ await admin.prepareForDirectAccess();
8
9
  switch (payload.kind) {
9
10
  case "fn.run": {
10
11
  const start = performance.now();
@@ -12,13 +13,13 @@ function createDevtoolsCommandHandler(deps) {
12
13
  let result;
13
14
  switch (payload.functionType) {
14
15
  case "query":
15
- result = await runtime.runQuery(createFunctionReference("query", payload.functionName), payload.args, { origin: "dashboard" });
16
+ result = await admin.runQuery(createFunctionReference("query", payload.functionName), payload.args, { origin: "dashboard" });
16
17
  break;
17
18
  case "mutation":
18
- result = await runtime.runMutation(createFunctionReference("mutation", payload.functionName), payload.args, { origin: "dashboard" });
19
+ result = await admin.runMutation(createFunctionReference("mutation", payload.functionName), payload.args, { origin: "dashboard" });
19
20
  break;
20
21
  case "action":
21
- result = await runtime.runAction(createFunctionReference("action", payload.functionName), payload.args, { origin: "dashboard" });
22
+ result = await admin.runAction(createFunctionReference("action", payload.functionName), payload.args, { origin: "dashboard" });
22
23
  break;
23
24
  }
24
25
  return {
@@ -38,7 +39,7 @@ function createDevtoolsCommandHandler(deps) {
38
39
  return {
39
40
  kind: "data.mutate.result",
40
41
  success: true,
41
- id: await runDevtoolsMutation(runtime, async (ctx) => ctx.db.insert(payload.table, payload.document), { origin: "dashboard" })
42
+ id: await runDevtoolsMutation(admin, async (ctx) => ctx.db.insert(payload.table, payload.document), { origin: "dashboard" })
42
43
  };
43
44
  } catch (error) {
44
45
  return {
@@ -48,7 +49,7 @@ function createDevtoolsCommandHandler(deps) {
48
49
  };
49
50
  }
50
51
  case "data.patch": try {
51
- await runDevtoolsMutation(runtime, async (ctx) => {
52
+ await runDevtoolsMutation(admin, async (ctx) => {
52
53
  await ctx.db.patch(payload.table, payload.id, payload.fields);
53
54
  return null;
54
55
  }, { origin: "dashboard" });
@@ -65,7 +66,7 @@ function createDevtoolsCommandHandler(deps) {
65
66
  };
66
67
  }
67
68
  case "data.delete": try {
68
- await runDevtoolsMutation(runtime, async (ctx) => {
69
+ await runDevtoolsMutation(admin, async (ctx) => {
69
70
  await ctx.db.delete(payload.table, payload.id);
70
71
  return null;
71
72
  }, { origin: "dashboard" });
@@ -82,7 +83,7 @@ function createDevtoolsCommandHandler(deps) {
82
83
  }
83
84
  case "sql.read": try {
84
85
  const sqlSupport = requireDevtoolsSqlSupport(sql);
85
- const databasePath = runtime.getDriverDatabasePath();
86
+ const databasePath = admin.getDriverDatabasePath();
86
87
  if (!databasePath) throw new Error("SQL Read requires a file-backed database path.");
87
88
  const { columns, rows } = sqlSupport.runReadonlyQuery(databasePath, payload.query);
88
89
  return {
@@ -102,8 +103,8 @@ function createDevtoolsCommandHandler(deps) {
102
103
  const analysis = requireDevtoolsSqlSupport(sql).analyzeSqlStatement(payload.query);
103
104
  if (analysis.mode === "read") throw new Error("Use SQL Read or SQL Live for read-only statements.");
104
105
  const result = await driver.run(payload.query);
105
- runtime.notifyDevtoolsScopes(analysis.observedScopes);
106
- await runtime.forceRefreshDevtools("SQL write executed from devtools dashboard.", { origin: "dashboard" });
106
+ admin.notifyDevtoolsScopes(analysis.observedScopes);
107
+ await admin.forceRefreshDevtools("SQL write executed from devtools dashboard.", analysis.observedScopes.flatMap((scope) => scope === "all" ? [] : [scope]), { origin: "dashboard" });
107
108
  return {
108
109
  kind: "sql.write.result",
109
110
  rowsAffected: result.changes,
@@ -121,7 +122,7 @@ function createDevtoolsCommandHandler(deps) {
121
122
  return {
122
123
  kind: "scheduler.cancel.result",
123
124
  success: true,
124
- cancelled: await runtime.cancelScheduledJob(payload.jobId)
125
+ cancelled: await admin.cancelScheduledJob(payload.jobId)
125
126
  };
126
127
  } catch (error) {
127
128
  return {
@@ -132,7 +133,7 @@ function createDevtoolsCommandHandler(deps) {
132
133
  };
133
134
  }
134
135
  case "scheduler.update": try {
135
- const updated = await runtime.updateScheduledJob({
136
+ const updated = await admin.updateScheduledJob({
136
137
  id: payload.jobId,
137
138
  schedule: payload.schedule,
138
139
  args: payload.args,
@@ -162,14 +163,14 @@ function createDevtoolsCommandHandler(deps) {
162
163
  };
163
164
  }
164
165
  function createDevtoolsSubscriptionHost(deps) {
165
- const { driver, schema, functions, runtime } = deps;
166
+ const { driver, schema, functions, admin } = deps;
166
167
  const subscriptions = /* @__PURE__ */ new Map();
167
168
  const emit = async (payload, listener) => {
168
169
  listener(await resolveSubscriptionPayload(payload, {
169
170
  driver,
170
171
  schema,
171
172
  functions,
172
- runtime,
173
+ admin,
173
174
  ...deps.sql ? { sql: deps.sql } : {}
174
175
  }));
175
176
  };
@@ -190,7 +191,7 @@ function createDevtoolsSubscriptionHost(deps) {
190
191
  });
191
192
  return;
192
193
  }
193
- const watch = runtime.createClient().watchQuery(createFunctionReference("query", payload.functionName), payload.args);
194
+ const watch = admin.createClient().watchQuery(createFunctionReference("query", payload.functionName), payload.args);
194
195
  const emitWatchResult = () => {
195
196
  const error = watch.localQueryError();
196
197
  listener({
@@ -211,10 +212,10 @@ function createDevtoolsSubscriptionHost(deps) {
211
212
  emitWatchResult();
212
213
  return;
213
214
  }
214
- const unsubscribeRuntime = runtime.subscribeToDevtoolsInvalidations((scopes) => {
215
+ const unsubscribeRuntime = admin.subscribeToDevtoolsInvalidations((scopes) => {
215
216
  handleInvalidation(scopes);
216
217
  });
217
- const unsubscribeEvents = runtime.subscribeToDevtoolsEvents((event) => {
218
+ const unsubscribeEvents = admin.subscribeToDevtoolsEvents((event) => {
218
219
  if (event.type === "runtime.disconnected") emit(payload, listener);
219
220
  });
220
221
  subscriptions.set(subscriptionId, {
@@ -243,22 +244,22 @@ function createDevtoolsSubscriptionHost(deps) {
243
244
  };
244
245
  }
245
246
  async function resolveSubscriptionPayload(payload, deps) {
246
- const { driver, schema, functions, runtime } = deps;
247
- await runtime.prepareForDirectAccess();
247
+ const { driver, schema, functions, admin } = deps;
248
+ await admin.prepareForDirectAccess();
248
249
  switch (payload.kind) {
249
250
  case "runtime.summary": return {
250
251
  kind: "runtime.summary.result",
251
- summary: runtime.getRuntimeSummary()
252
+ summary: admin.getRuntimeSummary()
252
253
  };
253
254
  case "runtime.activeQueries": return {
254
255
  kind: "runtime.activeQueries.result",
255
- activeQueries: runtime.getActiveQueryInfos()
256
+ activeQueries: admin.getActiveQueryInfos()
256
257
  };
257
258
  case "fn.watch": throw new Error("Function watches are pushed incrementally and have no snapshot payload.");
258
259
  case "schema.tables": {
259
260
  const tables = await getSchemaTables(driver, schema);
260
261
  console.debug("[devtools] schema.tables", {
261
- runtimeId: runtime.getRuntimeId(),
262
+ runtimeId: admin.getRuntimeId(),
262
263
  tables: tables.map((table) => ({
263
264
  name: table.name,
264
265
  documentCount: table.documentCount
@@ -272,7 +273,7 @@ async function resolveSubscriptionPayload(payload, deps) {
272
273
  case "data.table": {
273
274
  const result = await queryTable(driver, payload.table, payload.filters, payload.limit);
274
275
  console.debug("[devtools] data.table", {
275
- runtimeId: runtime.getRuntimeId(),
276
+ runtimeId: admin.getRuntimeId(),
276
277
  table: payload.table,
277
278
  filters: payload.filters ?? [],
278
279
  limit: payload.limit,
@@ -297,7 +298,7 @@ async function resolveSubscriptionPayload(payload, deps) {
297
298
  };
298
299
  case "sql.watch": {
299
300
  const sqlSupport = requireDevtoolsSqlSupport(deps.sql);
300
- const databasePath = runtime.getDriverDatabasePath();
301
+ const databasePath = admin.getDriverDatabasePath();
301
302
  if (!databasePath) throw new Error("SQL Live requires a file-backed database path.");
302
303
  const { columns, rows, observedTables } = sqlSupport.runReadonlyQuery(databasePath, payload.query);
303
304
  return {
@@ -332,12 +333,11 @@ async function getSchemaTables(driver, schema) {
332
333
  const table = schema.getTable(name);
333
334
  const validatorDesc = describeValidator(table.validator);
334
335
  const fields = validatorDesc.kind === "object" ? Object.entries(validatorDesc.shape).map(([fieldName, fieldDesc]) => {
335
- const desc = fieldDesc;
336
- const optional = desc.kind === "optional";
336
+ const field = fieldDesc;
337
337
  return {
338
338
  name: fieldName,
339
- type: optional ? desc.inner?.kind ?? "any" : desc.kind,
340
- optional
339
+ type: field.validator.kind,
340
+ optional: field.optional
341
341
  };
342
342
  }) : [];
343
343
  fields.unshift({
@@ -357,6 +357,10 @@ async function getSchemaTables(driver, schema) {
357
357
  }
358
358
  return {
359
359
  name,
360
+ ...table.options.tableName ? { displayName: table.options.tableName } : {},
361
+ owner: table.options.componentPath ? "component" : "root",
362
+ ...table.options.componentPath ? { componentPath: table.options.componentPath } : {},
363
+ ...table.options.componentName ? { componentName: table.options.componentName } : {},
360
364
  fields,
361
365
  indexes: table.indexes.map((index) => ({
362
366
  name: index.name,
@@ -370,11 +374,15 @@ async function getSchemaTables(driver, schema) {
370
374
  async function listSchedulerJobs(driver) {
371
375
  try {
372
376
  return (await driver.all(`SELECT * FROM "_scheduled_functions" ORDER BY run_at DESC LIMIT 200`)).map((row) => {
373
- const schedule = safeReadSchedule(row.schedule_json);
377
+ const schedule = safeReadRecurringSchedule(row.schedule_json);
374
378
  const scheduleLabel = schedule ? formatScheduleLabel(schedule) : void 0;
379
+ const functionComponent = parseCanonicalComponentFunctionName(row.function_name);
380
+ const idComponent = parseComponentScopedIdentifier(row.id);
375
381
  return {
376
382
  id: row.id,
377
383
  functionName: row.function_name,
384
+ owner: functionComponent || idComponent ? "component" : "root",
385
+ ...functionComponent ? { componentPath: functionComponent.componentPath } : idComponent ? { componentPath: idComponent.componentPath } : {},
378
386
  args: JSON.parse(row.args_json),
379
387
  scheduledAt: row.created_at,
380
388
  runAt: row.run_at,
@@ -398,10 +406,17 @@ async function listSchedulerJobs(driver) {
398
406
  }
399
407
  function listFunctions(functions) {
400
408
  return Object.entries(functions).filter((entry) => entry[1] !== void 0).map(([name, fn]) => {
409
+ const componentFunction = parseCanonicalComponentFunctionName(name);
401
410
  const descriptor = {
402
411
  name,
403
412
  type: fn.kind,
404
- file: inferFileFromFunctionName(name)
413
+ file: inferFileFromFunctionName(name),
414
+ owner: componentFunction ? "component" : "root",
415
+ ...componentFunction ? {
416
+ componentPath: componentFunction.componentPath,
417
+ visibility: componentFunction.visibility,
418
+ localName: componentFunction.localName
419
+ } : {}
405
420
  };
406
421
  const argsDesc = describeValidator(fn.argsValidator);
407
422
  if (argsDesc.kind === "object") descriptor.args = argsDesc.shape;
@@ -409,6 +424,8 @@ function listFunctions(functions) {
409
424
  });
410
425
  }
411
426
  function inferFileFromFunctionName(name) {
427
+ const componentFunction = parseCanonicalComponentFunctionName(name);
428
+ if (componentFunction) return `components/${componentFunction.componentPath}`;
412
429
  const parts = name.split(":");
413
430
  if (parts.length > 1) return `${parts[0]}.ts`;
414
431
  return "unknown";
@@ -443,14 +460,6 @@ function mapJobStatus(status) {
443
460
  default: return "pending";
444
461
  }
445
462
  }
446
- function safeReadSchedule(scheduleJson) {
447
- if (!scheduleJson) return;
448
- try {
449
- return JSON.parse(scheduleJson);
450
- } catch {
451
- return;
452
- }
453
- }
454
463
  function formatScheduleLabel(schedule) {
455
464
  switch (schedule.type) {
456
465
  case "interval": {
@@ -462,6 +471,7 @@ function formatScheduleLabel(schedule) {
462
471
  }
463
472
  case "daily": return `Daily ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : ""}`;
464
473
  case "weekly": return `Weekly ${capitalize(schedule.dayOfWeek)} ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : ""}`;
474
+ default: return "Recurring";
465
475
  }
466
476
  }
467
477
  function readMisfirePolicy(type, windowMs) {
@@ -478,8 +488,8 @@ function padNumber(value) {
478
488
  function capitalize(value) {
479
489
  return value.slice(0, 1).toUpperCase() + value.slice(1);
480
490
  }
481
- async function runDevtoolsMutation(runtime, callback, meta) {
482
- return runtime.runDevtoolsMutation(callback, meta);
491
+ async function runDevtoolsMutation(admin, callback, meta) {
492
+ return admin.runDevtoolsMutation(callback, meta);
483
493
  }
484
494
  function scopesForSubscription(payload, sql) {
485
495
  switch (payload.kind) {
@@ -498,6 +508,7 @@ function scopesForSubscription(payload, sql) {
498
508
  } catch {
499
509
  return new Set(["all"]);
500
510
  }
511
+ default: return new Set(["all"]);
501
512
  }
502
513
  }
503
514
  function intersects(a, b) {
@@ -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 { TableDefinition, Validator } from \"@syncore/schema\";\nimport type {\n AnySyncoreSchema,\n DevtoolsLiveQueryScope,\n SyncoreRuntimeOptions,\n SyncoreSqlDriver\n} from \"./runtime.js\";\nimport { createFunctionReference } from \"./runtime.js\";\nimport type { SyncoreRuntime } from \"./runtime.js\";\n\nexport interface DevtoolsCommandHandlerDeps {\n driver: SyncoreSqlDriver;\n schema: AnySyncoreSchema;\n functions: SyncoreRuntimeOptions<AnySyncoreSchema>[\"functions\"];\n runtime: SyncoreRuntime<AnySyncoreSchema>;\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, runtime, sql } = deps;\n\n return async (payload): Promise<SyncoreDevtoolsCommandResultPayload> => {\n await runtime.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 runtime.runQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"mutation\":\n result = await runtime.runMutation(\n createFunctionReference(\"mutation\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"action\":\n result = await runtime.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(runtime, 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(runtime, 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(runtime, 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 = runtime.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 runtime.notifyDevtoolsScopes(analysis.observedScopes);\n await runtime.forceRefreshDevtools(\n \"SQL write executed from devtools dashboard.\",\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 runtime.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 runtime.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, runtime } = 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 runtime,\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 = runtime.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 = runtime.subscribeToDevtoolsInvalidations(\n (scopes) => {\n void handleInvalidation(scopes);\n }\n );\n const unsubscribeEvents = runtime.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, runtime } = deps;\n await runtime.prepareForDirectAccess();\n\n switch (payload.kind) {\n case \"runtime.summary\":\n return {\n kind: \"runtime.summary.result\",\n summary: runtime.getRuntimeSummary()\n };\n case \"runtime.activeQueries\":\n return {\n kind: \"runtime.activeQueries.result\",\n activeQueries: runtime.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: runtime.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: runtime.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 = runtime.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: AnySyncoreSchema\n): Promise<TableSchema[]> {\n return Promise.all(\n schema.tableNames().map(async (name) => {\n const table = schema.getTable(name) as TableDefinition<\n Validator<unknown>\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 desc = fieldDesc as {\n kind: string;\n inner?: { kind: string };\n };\n const optional = desc.kind === \"optional\";\n return {\n name: fieldName,\n type: optional ? (desc.inner?.kind ?? \"any\") : desc.kind,\n 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 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 = safeReadSchedule(row.schedule_json);\n const scheduleLabel = schedule ? formatScheduleLabel(schedule) : undefined;\n return {\n id: row.id,\n functionName: row.function_name,\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<AnySyncoreSchema>[\"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 descriptor: {\n name: string;\n type: \"query\" | \"mutation\" | \"action\";\n file: string;\n args?: Record<string, unknown>;\n } = {\n name,\n type: fn.kind,\n file: inferFileFromFunctionName(name)\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 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 safeReadSchedule(\n scheduleJson: string | null\n): SchedulerRecurringSchedule | undefined {\n if (!scheduleJson) {\n return undefined;\n }\n try {\n return JSON.parse(scheduleJson) as SchedulerRecurringSchedule;\n } catch {\n return undefined;\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 }\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 runtime: SyncoreRuntime<AnySyncoreSchema>,\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 runtime.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 }\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 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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"}
@@ -16,8 +16,8 @@ interface FunctionReference<TKind extends SyncoreFunctionKind = SyncoreFunctionK
16
16
  }
17
17
  interface SyncoreFunctionDefinition<TKind extends SyncoreFunctionKind, TContext, TArgs, TResult> {
18
18
  kind: TKind;
19
- argsValidator: Validator<TArgs>;
20
- returnsValidator?: Validator<TResult>;
19
+ argsValidator: Validator<TArgs, TArgs, string>;
20
+ returnsValidator?: Validator<TResult, TResult, string>;
21
21
  handler: (ctx: TContext, args: TArgs) => Promise<TResult> | TResult;
22
22
  }
23
23
  type FunctionArgs<TReference> = TReference extends FunctionReference<SyncoreFunctionKind, infer TArgs, unknown> ? TArgs : never;
@@ -26,24 +26,24 @@ type FunctionKindFromDefinition<TDefinition> = TDefinition extends {
26
26
  kind: infer TKind;
27
27
  } ? Extract<TKind, SyncoreFunctionKind> : never;
28
28
  type FunctionArgsFromDefinition<TDefinition> = TDefinition extends {
29
- argsValidator: Validator<infer TArgs>;
29
+ argsValidator: Validator<infer TArgs, unknown, string>;
30
30
  } ? TArgs : never;
31
31
  type FunctionResultFromDefinition<TDefinition> = TDefinition extends {
32
- returnsValidator?: Validator<infer TResult>;
32
+ returnsValidator?: Validator<infer TResult, unknown, string>;
33
33
  } ? TResult : never;
34
34
  type FunctionReferenceFor<TDefinition> = FunctionKindFromDefinition<TDefinition> extends never ? never : FunctionReference<FunctionKindFromDefinition<TDefinition>, FunctionArgsFromDefinition<TDefinition>, FunctionResultFromDefinition<TDefinition>>;
35
35
  interface FunctionConfig<TContext, TArgs, TResult> {
36
- args: Validator<TArgs> | ValidatorMap;
37
- returns?: Validator<TResult>;
36
+ args: Validator<TArgs, TArgs, string> | ValidatorMap;
37
+ returns?: Validator<TResult, TResult, string>;
38
38
  handler: (ctx: TContext, args: TArgs) => Promise<TResult> | TResult;
39
39
  }
40
- type InferArgs<TArgs extends Validator<unknown> | ValidatorMap> = TArgs extends Validator<unknown> ? Infer<TArgs> : TArgs extends ValidatorMap ? { [TKey in keyof TArgs]: Infer<TArgs[TKey]> } : never;
40
+ type InferArgs<TArgs extends Validator<unknown, unknown, string> | ValidatorMap> = TArgs extends Validator<unknown, unknown, string> ? Infer<TArgs> : TArgs extends ValidatorMap ? { [TKey in keyof TArgs]: Infer<TArgs[TKey]> } : never;
41
41
  /**
42
42
  * Define a Syncore query.
43
43
  *
44
44
  * Queries can read local Syncore state and are available to clients.
45
45
  */
46
- declare function query<TContext = unknown, TValidator extends Validator<unknown> = Validator<unknown>, TResult = unknown>(config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {
46
+ declare function query<TContext = unknown, TValidator extends Validator<unknown, unknown, string> = Validator<unknown, unknown, string>, TResult = unknown>(config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {
47
47
  args: TValidator;
48
48
  }): SyncoreFunctionDefinition<"query", TContext, Infer<TValidator>, TResult>;
49
49
  declare function query<TContext = unknown, TArgsShape extends ValidatorMap = ValidatorMap, TResult = unknown>(config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {
@@ -54,7 +54,7 @@ declare function query<TContext = unknown, TArgsShape extends ValidatorMap = Val
54
54
  *
55
55
  * Mutations can modify local Syncore state and are available to clients.
56
56
  */
57
- declare function mutation<TContext = unknown, TValidator extends Validator<unknown> = Validator<unknown>, TResult = unknown>(config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {
57
+ declare function mutation<TContext = unknown, TValidator extends Validator<unknown, unknown, string> = Validator<unknown, unknown, string>, TResult = unknown>(config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {
58
58
  args: TValidator;
59
59
  }): SyncoreFunctionDefinition<"mutation", TContext, Infer<TValidator>, TResult>;
60
60
  declare function mutation<TContext = unknown, TArgsShape extends ValidatorMap = ValidatorMap, TResult = unknown>(config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {
@@ -65,7 +65,7 @@ declare function mutation<TContext = unknown, TArgsShape extends ValidatorMap =
65
65
  *
66
66
  * Actions can run arbitrary JavaScript and may call other Syncore functions.
67
67
  */
68
- declare function action<TContext = unknown, TValidator extends Validator<unknown> = Validator<unknown>, TResult = unknown>(config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {
68
+ declare function action<TContext = unknown, TValidator extends Validator<unknown, unknown, string> = Validator<unknown, unknown, string>, TResult = unknown>(config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {
69
69
  args: TValidator;
70
70
  }): SyncoreFunctionDefinition<"action", TContext, Infer<TValidator>, TResult>;
71
71
  declare function action<TContext = unknown, TArgsShape extends ValidatorMap = ValidatorMap, TResult = unknown>(config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {
@@ -1 +1 @@
1
- {"version":3,"file":"functions.d.mts","names":[],"sources":["../../src/runtime/functions.ts"],"mappings":"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"}
1
+ {"version":3,"file":"functions.d.mts","names":[],"sources":["../../src/runtime/functions.ts"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { ensureObjectValidator } from "../../schema/index.js";
1
+ import { ensureObjectValidator, isValidator } from "../../schema/index.js";
2
2
  //#region src/runtime/functions.ts
3
3
  function createFunctionDefinition(kind, config) {
4
4
  return {
5
5
  kind,
6
- argsValidator: ensureObjectValidator(config.args),
6
+ argsValidator: isValidator(config.args) ? config.args : ensureObjectValidator(config.args),
7
7
  ...config.returns ? { returnsValidator: config.returns } : {},
8
8
  handler: config.handler
9
9
  };
@@ -1 +1 @@
1
- {"version":3,"file":"functions.mjs","names":[],"sources":["../../src/runtime/functions.ts"],"sourcesContent":["import {\n ensureObjectValidator,\n type Infer,\n type Validator,\n type ValidatorMap\n} from \"@syncore/schema\";\n\nexport type SyncoreFunctionKind = \"query\" | \"mutation\" | \"action\";\nexport type EmptyArgs = Record<never, never>;\n\n/**\n * A typed reference to a Syncore function.\n *\n * Most app code gets these references from the generated `api` object.\n */\nexport interface FunctionReference<\n TKind extends SyncoreFunctionKind = SyncoreFunctionKind,\n TArgs = EmptyArgs,\n TResult = unknown\n> {\n kind: TKind;\n name: string;\n readonly __args?: TArgs;\n readonly __result?: TResult;\n}\n\nexport interface SyncoreFunctionDefinition<\n TKind extends SyncoreFunctionKind,\n TContext,\n TArgs,\n TResult\n> {\n kind: TKind;\n argsValidator: Validator<TArgs>;\n returnsValidator?: Validator<TResult>;\n handler: (ctx: TContext, args: TArgs) => Promise<TResult> | TResult;\n}\n\nexport type FunctionArgs<TReference> =\n TReference extends FunctionReference<\n SyncoreFunctionKind,\n infer TArgs,\n unknown\n >\n ? TArgs\n : never;\n\nexport type FunctionResult<TReference> =\n TReference extends FunctionReference<\n SyncoreFunctionKind,\n unknown,\n infer TResult\n >\n ? TResult\n : never;\n\nexport type FunctionKindFromDefinition<TDefinition> = TDefinition extends {\n kind: infer TKind;\n}\n ? Extract<TKind, SyncoreFunctionKind>\n : never;\n\nexport type FunctionArgsFromDefinition<TDefinition> = TDefinition extends {\n argsValidator: Validator<infer TArgs>;\n}\n ? TArgs\n : never;\n\nexport type FunctionResultFromDefinition<TDefinition> = TDefinition extends {\n returnsValidator?: Validator<infer TResult>;\n}\n ? TResult\n : never;\n\nexport type FunctionReferenceFor<TDefinition> =\n FunctionKindFromDefinition<TDefinition> extends never\n ? never\n : FunctionReference<\n FunctionKindFromDefinition<TDefinition>,\n FunctionArgsFromDefinition<TDefinition>,\n FunctionResultFromDefinition<TDefinition>\n >;\n\nexport interface FunctionConfig<TContext, TArgs, TResult> {\n args: Validator<TArgs> | ValidatorMap;\n returns?: Validator<TResult>;\n handler: (ctx: TContext, args: TArgs) => Promise<TResult> | TResult;\n}\n\nexport type InferArgs<TArgs extends Validator<unknown> | ValidatorMap> =\n TArgs extends Validator<unknown>\n ? Infer<TArgs>\n : TArgs extends ValidatorMap\n ? {\n [TKey in keyof TArgs]: Infer<TArgs[TKey]>;\n }\n : never;\n\nfunction createFunctionDefinition<\n TKind extends SyncoreFunctionKind,\n TContext,\n TArgsShape extends Validator<unknown> | ValidatorMap,\n TResult\n>(\n kind: TKind,\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<TKind, TContext, InferArgs<TArgsShape>, TResult> {\n return {\n kind,\n argsValidator: ensureObjectValidator(config.args) as Validator<\n InferArgs<TArgsShape>\n >,\n ...(config.returns ? { returnsValidator: config.returns } : {}),\n handler: config.handler\n };\n}\n\n/**\n * Define a Syncore query.\n *\n * Queries can read local Syncore state and are available to clients.\n */\nexport function query<\n TContext = unknown,\n TValidator extends Validator<unknown> = Validator<unknown>,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"query\", TContext, Infer<TValidator>, TResult>;\nexport function query<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\"query\", TContext, InferArgs<TArgsShape>, TResult>;\nexport function query<\n TContext = unknown,\n TArgsShape extends Validator<unknown> | ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"query\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"query\", config);\n}\n\n/**\n * Define a Syncore mutation.\n *\n * Mutations can modify local Syncore state and are available to clients.\n */\nexport function mutation<\n TContext = unknown,\n TValidator extends Validator<unknown> = Validator<unknown>,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"mutation\", TContext, Infer<TValidator>, TResult>;\nexport function mutation<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"mutation\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n>;\nexport function mutation<\n TContext = unknown,\n TArgsShape extends Validator<unknown> | ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"mutation\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"mutation\", config);\n}\n\n/**\n * Define a Syncore action.\n *\n * Actions can run arbitrary JavaScript and may call other Syncore functions.\n */\nexport function action<\n TContext = unknown,\n TValidator extends Validator<unknown> = Validator<unknown>,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"action\", TContext, Infer<TValidator>, TResult>;\nexport function action<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"action\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n>;\nexport function action<\n TContext = unknown,\n TArgsShape extends Validator<unknown> | ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"action\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"action\", config);\n}\n\nexport interface RecurringIntervalSchedule {\n type: \"interval\";\n seconds?: number;\n minutes?: number;\n hours?: number;\n}\n\nexport interface RecurringDailySchedule {\n type: \"daily\";\n hour: number;\n minute: number;\n timezone?: string;\n}\n\nexport interface RecurringWeeklySchedule {\n type: \"weekly\";\n dayOfWeek:\n | \"sunday\"\n | \"monday\"\n | \"tuesday\"\n | \"wednesday\"\n | \"thursday\"\n | \"friday\"\n | \"saturday\";\n hour: number;\n minute: number;\n timezone?: string;\n}\n\nexport type RecurringSchedule =\n | RecurringIntervalSchedule\n | RecurringDailySchedule\n | RecurringWeeklySchedule;\n\nexport type MisfirePolicy =\n | { type: \"catch_up\" }\n | { type: \"skip\" }\n | { type: \"run_once_if_missed\" }\n | { type: \"windowed\"; windowMs: number };\n\nexport interface RecurringJobDefinition {\n name: string;\n schedule: RecurringSchedule;\n function: FunctionReference<\"mutation\" | \"action\">;\n args: Record<string, unknown>;\n misfirePolicy: MisfirePolicy;\n}\n\nexport class CronJobs {\n readonly jobs: RecurringJobDefinition[] = [];\n\n interval(\n name: string,\n schedule: Omit<RecurringIntervalSchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"interval\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n\n daily(\n name: string,\n schedule: Omit<RecurringDailySchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"daily\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n\n weekly(\n name: string,\n schedule: Omit<RecurringWeeklySchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"weekly\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n}\n\n/**\n * Create a recurring job registry for Syncore scheduler definitions.\n */\nexport function cronJobs(): CronJobs {\n return new CronJobs();\n}\n"],"mappings":";;AAkGA,SAAS,yBAMP,MACA,QAG4E;AAC5E,QAAO;EACL;EACA,eAAe,sBAAsB,OAAO,KAAK;EAGjD,GAAI,OAAO,UAAU,EAAE,kBAAkB,OAAO,SAAS,GAAG,EAAE;EAC9D,SAAS,OAAO;EACjB;;AA0BH,SAAgB,MAKd,QAQA;AACA,QAAO,yBAAyB,SAAS,OAAO;;AA+BlD,SAAgB,SAKd,QAQA;AACA,QAAO,yBAAyB,YAAY,OAAO;;AA+BrD,SAAgB,OAKd,QAQA;AACA,QAAO,yBAAyB,UAAU,OAAO;;AAmDnD,IAAa,WAAb,MAAsB;CACpB,OAA0C,EAAE;CAE5C,SACE,MACA,UACA,mBACA,OAAgC,EAAE,EAClC,gBAA+B,EAAE,MAAM,YAAY,EAC7C;AACN,OAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAY,GAAG;IAAU;GAC3C,UAAU;GACV;GACA;GACD,CAAC;AACF,SAAO;;CAGT,MACE,MACA,UACA,mBACA,OAAgC,EAAE,EAClC,gBAA+B,EAAE,MAAM,YAAY,EAC7C;AACN,OAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAS,GAAG;IAAU;GACxC,UAAU;GACV;GACA;GACD,CAAC;AACF,SAAO;;CAGT,OACE,MACA,UACA,mBACA,OAAgC,EAAE,EAClC,gBAA+B,EAAE,MAAM,YAAY,EAC7C;AACN,OAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAU,GAAG;IAAU;GACzC,UAAU;GACV;GACA;GACD,CAAC;AACF,SAAO;;;;;;AAOX,SAAgB,WAAqB;AACnC,QAAO,IAAI,UAAU"}
1
+ {"version":3,"file":"functions.mjs","names":[],"sources":["../../src/runtime/functions.ts"],"sourcesContent":["import {\n ensureObjectValidator,\n isValidator,\n type Infer,\n type Validator,\n type ValidatorMap\n} from \"@syncore/schema\";\n\nexport type SyncoreFunctionKind = \"query\" | \"mutation\" | \"action\";\nexport type EmptyArgs = Record<never, never>;\n\n/**\n * A typed reference to a Syncore function.\n *\n * Most app code gets these references from the generated `api` object.\n */\nexport interface FunctionReference<\n TKind extends SyncoreFunctionKind = SyncoreFunctionKind,\n TArgs = EmptyArgs,\n TResult = unknown\n> {\n kind: TKind;\n name: string;\n readonly __args?: TArgs;\n readonly __result?: TResult;\n}\n\nexport interface SyncoreFunctionDefinition<\n TKind extends SyncoreFunctionKind,\n TContext,\n TArgs,\n TResult\n> {\n kind: TKind;\n argsValidator: Validator<TArgs, TArgs, string>;\n returnsValidator?: Validator<TResult, TResult, string>;\n handler: (ctx: TContext, args: TArgs) => Promise<TResult> | TResult;\n}\n\nexport type FunctionArgs<TReference> =\n TReference extends FunctionReference<\n SyncoreFunctionKind,\n infer TArgs,\n unknown\n >\n ? TArgs\n : never;\n\nexport type FunctionResult<TReference> =\n TReference extends FunctionReference<\n SyncoreFunctionKind,\n unknown,\n infer TResult\n >\n ? TResult\n : never;\n\nexport type FunctionKindFromDefinition<TDefinition> = TDefinition extends {\n kind: infer TKind;\n}\n ? Extract<TKind, SyncoreFunctionKind>\n : never;\n\nexport type FunctionArgsFromDefinition<TDefinition> = TDefinition extends {\n argsValidator: Validator<infer TArgs, unknown, string>;\n}\n ? TArgs\n : never;\n\nexport type FunctionResultFromDefinition<TDefinition> = TDefinition extends {\n returnsValidator?: Validator<infer TResult, unknown, string>;\n}\n ? TResult\n : never;\n\nexport type FunctionReferenceFor<TDefinition> =\n FunctionKindFromDefinition<TDefinition> extends never\n ? never\n : FunctionReference<\n FunctionKindFromDefinition<TDefinition>,\n FunctionArgsFromDefinition<TDefinition>,\n FunctionResultFromDefinition<TDefinition>\n >;\n\nexport interface FunctionConfig<TContext, TArgs, TResult> {\n args: Validator<TArgs, TArgs, string> | ValidatorMap;\n returns?: Validator<TResult, TResult, string>;\n handler: (ctx: TContext, args: TArgs) => Promise<TResult> | TResult;\n}\n\nexport type InferArgs<\n TArgs extends Validator<unknown, unknown, string> | ValidatorMap\n> = TArgs extends Validator<unknown, unknown, string>\n ? Infer<TArgs>\n : TArgs extends ValidatorMap\n ? {\n [TKey in keyof TArgs]: Infer<TArgs[TKey]>;\n }\n : never;\n\nfunction createFunctionDefinition<\n TKind extends SyncoreFunctionKind,\n TContext,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap,\n TResult\n>(\n kind: TKind,\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<TKind, TContext, InferArgs<TArgsShape>, TResult> {\n const argsValidator = isValidator(config.args)\n ? (config.args as Validator<\n InferArgs<TArgsShape>,\n InferArgs<TArgsShape>,\n string\n >)\n : (ensureObjectValidator(config.args as ValidatorMap) as unknown as Validator<\n InferArgs<TArgsShape>,\n InferArgs<TArgsShape>,\n string\n >);\n\n return {\n kind,\n argsValidator,\n ...(config.returns ? { returnsValidator: config.returns } : {}),\n handler: config.handler\n };\n}\n\n/**\n * Define a Syncore query.\n *\n * Queries can read local Syncore state and are available to clients.\n */\nexport function query<\n TContext = unknown,\n TValidator extends Validator<unknown, unknown, string> = Validator<\n unknown,\n unknown,\n string\n >,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"query\", TContext, Infer<TValidator>, TResult>;\nexport function query<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\"query\", TContext, InferArgs<TArgsShape>, TResult>;\nexport function query<\n TContext = unknown,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap =\n ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"query\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"query\", config);\n}\n\n/**\n * Define a Syncore mutation.\n *\n * Mutations can modify local Syncore state and are available to clients.\n */\nexport function mutation<\n TContext = unknown,\n TValidator extends Validator<unknown, unknown, string> = Validator<\n unknown,\n unknown,\n string\n >,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"mutation\", TContext, Infer<TValidator>, TResult>;\nexport function mutation<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"mutation\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n>;\nexport function mutation<\n TContext = unknown,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap =\n ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"mutation\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"mutation\", config);\n}\n\n/**\n * Define a Syncore action.\n *\n * Actions can run arbitrary JavaScript and may call other Syncore functions.\n */\nexport function action<\n TContext = unknown,\n TValidator extends Validator<unknown, unknown, string> = Validator<\n unknown,\n unknown,\n string\n >,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"action\", TContext, Infer<TValidator>, TResult>;\nexport function action<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"action\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n>;\nexport function action<\n TContext = unknown,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap =\n ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"action\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"action\", config);\n}\n\nexport interface RecurringIntervalSchedule {\n type: \"interval\";\n seconds?: number;\n minutes?: number;\n hours?: number;\n}\n\nexport interface RecurringDailySchedule {\n type: \"daily\";\n hour: number;\n minute: number;\n timezone?: string;\n}\n\nexport interface RecurringWeeklySchedule {\n type: \"weekly\";\n dayOfWeek:\n | \"sunday\"\n | \"monday\"\n | \"tuesday\"\n | \"wednesday\"\n | \"thursday\"\n | \"friday\"\n | \"saturday\";\n hour: number;\n minute: number;\n timezone?: string;\n}\n\nexport type RecurringSchedule =\n | RecurringIntervalSchedule\n | RecurringDailySchedule\n | RecurringWeeklySchedule;\n\nexport type MisfirePolicy =\n | { type: \"catch_up\" }\n | { type: \"skip\" }\n | { type: \"run_once_if_missed\" }\n | { type: \"windowed\"; windowMs: number };\n\nexport interface RecurringJobDefinition {\n name: string;\n schedule: RecurringSchedule;\n function: FunctionReference<\"mutation\" | \"action\">;\n args: Record<string, unknown>;\n misfirePolicy: MisfirePolicy;\n}\n\nexport class CronJobs {\n readonly jobs: RecurringJobDefinition[] = [];\n\n interval(\n name: string,\n schedule: Omit<RecurringIntervalSchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"interval\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n\n daily(\n name: string,\n schedule: Omit<RecurringDailySchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"daily\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n\n weekly(\n name: string,\n schedule: Omit<RecurringWeeklySchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"weekly\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n}\n\n/**\n * Create a recurring job registry for Syncore scheduler definitions.\n */\nexport function cronJobs(): CronJobs {\n return new CronJobs();\n}\n"],"mappings":";;AAoGA,SAAS,yBAMP,MACA,QAG4E;AAa5E,QAAO;EACL;EACA,eAdoB,YAAY,OAAO,KAAK,GACzC,OAAO,OAKP,sBAAsB,OAAO,KAAqB;EASrD,GAAI,OAAO,UAAU,EAAE,kBAAkB,OAAO,SAAS,GAAG,EAAE;EAC9D,SAAS,OAAO;EACjB;;AA8BH,SAAgB,MAMd,QAQA;AACA,QAAO,yBAAyB,SAAS,OAAO;;AAmClD,SAAgB,SAMd,QAQA;AACA,QAAO,yBAAyB,YAAY,OAAO;;AAmCrD,SAAgB,OAMd,QAQA;AACA,QAAO,yBAAyB,UAAU,OAAO;;AAmDnD,IAAa,WAAb,MAAsB;CACpB,OAA0C,EAAE;CAE5C,SACE,MACA,UACA,mBACA,OAAgC,EAAE,EAClC,gBAA+B,EAAE,MAAM,YAAY,EAC7C;AACN,OAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAY,GAAG;IAAU;GAC3C,UAAU;GACV;GACA;GACD,CAAC;AACF,SAAO;;CAGT,MACE,MACA,UACA,mBACA,OAAgC,EAAE,EAClC,gBAA+B,EAAE,MAAM,YAAY,EAC7C;AACN,OAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAS,GAAG;IAAU;GACxC,UAAU;GACV;GACA;GACD,CAAC;AACF,SAAO;;CAGT,OACE,MACA,UACA,mBACA,OAAgC,EAAE,EAClC,gBAA+B,EAAE,MAAM,YAAY,EAC7C;AACN,OAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAU,GAAG;IAAU;GACzC,UAAU;GACV;GACA;GACD,CAAC;AACF,SAAO;;;;;;AAOX,SAAgB,WAAqB;AACnC,QAAO,IAAI,UAAU"}