syncorejs 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/README.md +30 -0
  2. package/dist/_vendor/core/_virtual/_rolldown/runtime.mjs +27 -0
  3. package/dist/_vendor/core/cli.d.mts +5 -0
  4. package/dist/_vendor/core/cli.d.mts.map +1 -0
  5. package/dist/_vendor/core/cli.mjs +1196 -0
  6. package/dist/_vendor/core/cli.mjs.map +1 -0
  7. package/dist/_vendor/core/index.d.mts +7 -0
  8. package/dist/_vendor/core/index.mjs +25 -0
  9. package/dist/_vendor/core/index.mjs.map +1 -0
  10. package/dist/_vendor/core/runtime/devtools.d.mts +15 -0
  11. package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -0
  12. package/dist/_vendor/core/runtime/devtools.mjs +300 -0
  13. package/dist/_vendor/core/runtime/devtools.mjs.map +1 -0
  14. package/dist/_vendor/core/runtime/functions.d.mts +123 -0
  15. package/dist/_vendor/core/runtime/functions.d.mts.map +1 -0
  16. package/dist/_vendor/core/runtime/functions.mjs +71 -0
  17. package/dist/_vendor/core/runtime/functions.mjs.map +1 -0
  18. package/dist/_vendor/core/runtime/id.d.mts +13 -0
  19. package/dist/_vendor/core/runtime/id.d.mts.map +1 -0
  20. package/dist/_vendor/core/runtime/id.mjs +28 -0
  21. package/dist/_vendor/core/runtime/id.mjs.map +1 -0
  22. package/dist/_vendor/core/runtime/runtime.d.mts +370 -0
  23. package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -0
  24. package/dist/_vendor/core/runtime/runtime.mjs +1143 -0
  25. package/dist/_vendor/core/runtime/runtime.mjs.map +1 -0
  26. package/dist/_vendor/devtools-protocol/index.d.ts +230 -0
  27. package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -0
  28. package/dist/_vendor/devtools-protocol/index.js +0 -0
  29. package/dist/_vendor/next/config.d.ts +17 -0
  30. package/dist/_vendor/next/config.d.ts.map +1 -0
  31. package/dist/_vendor/next/config.js +73 -0
  32. package/dist/_vendor/next/config.js.map +1 -0
  33. package/dist/_vendor/next/index.d.ts +80 -0
  34. package/dist/_vendor/next/index.d.ts.map +1 -0
  35. package/dist/_vendor/next/index.js +81 -0
  36. package/dist/_vendor/next/index.js.map +1 -0
  37. package/dist/_vendor/platform-expo/index.d.ts +97 -0
  38. package/dist/_vendor/platform-expo/index.d.ts.map +1 -0
  39. package/dist/_vendor/platform-expo/index.js +197 -0
  40. package/dist/_vendor/platform-expo/index.js.map +1 -0
  41. package/dist/_vendor/platform-expo/react.d.ts +26 -0
  42. package/dist/_vendor/platform-expo/react.d.ts.map +1 -0
  43. package/dist/_vendor/platform-expo/react.js +30 -0
  44. package/dist/_vendor/platform-expo/react.js.map +1 -0
  45. package/dist/_vendor/platform-node/index.d.mts +145 -0
  46. package/dist/_vendor/platform-node/index.d.mts.map +1 -0
  47. package/dist/_vendor/platform-node/index.mjs +405 -0
  48. package/dist/_vendor/platform-node/index.mjs.map +1 -0
  49. package/dist/_vendor/platform-node/ipc-react.d.mts +25 -0
  50. package/dist/_vendor/platform-node/ipc-react.d.mts.map +1 -0
  51. package/dist/_vendor/platform-node/ipc-react.mjs +21 -0
  52. package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -0
  53. package/dist/_vendor/platform-node/ipc.d.mts +75 -0
  54. package/dist/_vendor/platform-node/ipc.d.mts.map +1 -0
  55. package/dist/_vendor/platform-node/ipc.mjs +343 -0
  56. package/dist/_vendor/platform-node/ipc.mjs.map +1 -0
  57. package/dist/_vendor/platform-web/index.d.ts +123 -0
  58. package/dist/_vendor/platform-web/index.d.ts.map +1 -0
  59. package/dist/_vendor/platform-web/index.js +309 -0
  60. package/dist/_vendor/platform-web/index.js.map +1 -0
  61. package/dist/_vendor/platform-web/indexeddb.d.ts +25 -0
  62. package/dist/_vendor/platform-web/indexeddb.d.ts.map +1 -0
  63. package/dist/_vendor/platform-web/indexeddb.js +125 -0
  64. package/dist/_vendor/platform-web/indexeddb.js.map +1 -0
  65. package/dist/_vendor/platform-web/opfs.d.ts +27 -0
  66. package/dist/_vendor/platform-web/opfs.d.ts.map +1 -0
  67. package/dist/_vendor/platform-web/opfs.js +146 -0
  68. package/dist/_vendor/platform-web/opfs.js.map +1 -0
  69. package/dist/_vendor/platform-web/persistence.d.ts +27 -0
  70. package/dist/_vendor/platform-web/persistence.d.ts.map +1 -0
  71. package/dist/_vendor/platform-web/persistence.js +23 -0
  72. package/dist/_vendor/platform-web/persistence.js.map +1 -0
  73. package/dist/_vendor/platform-web/react.d.ts +35 -0
  74. package/dist/_vendor/platform-web/react.d.ts.map +1 -0
  75. package/dist/_vendor/platform-web/react.js +42 -0
  76. package/dist/_vendor/platform-web/react.js.map +1 -0
  77. package/dist/_vendor/platform-web/sqljs.js +133 -0
  78. package/dist/_vendor/platform-web/sqljs.js.map +1 -0
  79. package/dist/_vendor/platform-web/worker.d.ts +78 -0
  80. package/dist/_vendor/platform-web/worker.d.ts.map +1 -0
  81. package/dist/_vendor/platform-web/worker.js +307 -0
  82. package/dist/_vendor/platform-web/worker.js.map +1 -0
  83. package/dist/_vendor/react/index.d.ts +58 -0
  84. package/dist/_vendor/react/index.d.ts.map +1 -0
  85. package/dist/_vendor/react/index.js +151 -0
  86. package/dist/_vendor/react/index.js.map +1 -0
  87. package/dist/_vendor/schema/definition.d.ts +98 -0
  88. package/dist/_vendor/schema/definition.d.ts.map +1 -0
  89. package/dist/_vendor/schema/definition.js +84 -0
  90. package/dist/_vendor/schema/definition.js.map +1 -0
  91. package/dist/_vendor/schema/index.d.ts +4 -0
  92. package/dist/_vendor/schema/index.js +4 -0
  93. package/dist/_vendor/schema/planner.d.ts +42 -0
  94. package/dist/_vendor/schema/planner.d.ts.map +1 -0
  95. package/dist/_vendor/schema/planner.js +131 -0
  96. package/dist/_vendor/schema/planner.js.map +1 -0
  97. package/dist/_vendor/schema/validators.d.ts +194 -0
  98. package/dist/_vendor/schema/validators.d.ts.map +1 -0
  99. package/dist/_vendor/schema/validators.js +158 -0
  100. package/dist/_vendor/schema/validators.js.map +1 -0
  101. package/dist/_vendor/svelte/index.d.ts +43 -0
  102. package/dist/_vendor/svelte/index.d.ts.map +1 -0
  103. package/dist/_vendor/svelte/index.js +75 -0
  104. package/dist/_vendor/svelte/index.js.map +1 -0
  105. package/dist/browser-react.d.ts +2 -0
  106. package/dist/browser-react.js +2 -0
  107. package/dist/browser.d.ts +12 -0
  108. package/dist/browser.d.ts.map +1 -0
  109. package/dist/browser.js +10 -0
  110. package/dist/browser.js.map +1 -0
  111. package/dist/cli.d.ts +2 -0
  112. package/dist/cli.js +11 -0
  113. package/dist/cli.js.map +1 -0
  114. package/dist/core/src/cli.d.ts +5 -0
  115. package/dist/core/src/cli.d.ts.map +1 -0
  116. package/dist/core/src/cli.js +1196 -0
  117. package/dist/core/src/cli.js.map +1 -0
  118. package/dist/core/src/index.js +7 -0
  119. package/dist/core/src/runtime/devtools.d.ts +7 -0
  120. package/dist/core/src/runtime/devtools.d.ts.map +1 -0
  121. package/dist/core/src/runtime/devtools.js +300 -0
  122. package/dist/core/src/runtime/devtools.js.map +1 -0
  123. package/dist/core/src/runtime/functions.d.ts +123 -0
  124. package/dist/core/src/runtime/functions.d.ts.map +1 -0
  125. package/dist/core/src/runtime/functions.js +71 -0
  126. package/dist/core/src/runtime/functions.js.map +1 -0
  127. package/dist/core/src/runtime/id.d.ts +13 -0
  128. package/dist/core/src/runtime/id.d.ts.map +1 -0
  129. package/dist/core/src/runtime/id.js +28 -0
  130. package/dist/core/src/runtime/id.js.map +1 -0
  131. package/dist/core/src/runtime/runtime.d.ts +371 -0
  132. package/dist/core/src/runtime/runtime.d.ts.map +1 -0
  133. package/dist/core/src/runtime/runtime.js +1143 -0
  134. package/dist/core/src/runtime/runtime.js.map +1 -0
  135. package/dist/devtools-protocol/src/index.d.ts +201 -0
  136. package/dist/devtools-protocol/src/index.d.ts.map +1 -0
  137. package/dist/expo-react.d.ts +2 -0
  138. package/dist/expo-react.js +2 -0
  139. package/dist/expo.d.ts +2 -0
  140. package/dist/expo.js +2 -0
  141. package/dist/index.d.ts +7 -0
  142. package/dist/index.js +8 -0
  143. package/dist/next/src/config.d.ts +17 -0
  144. package/dist/next/src/config.d.ts.map +1 -0
  145. package/dist/next/src/config.js +73 -0
  146. package/dist/next/src/config.js.map +1 -0
  147. package/dist/next/src/index.d.ts +80 -0
  148. package/dist/next/src/index.d.ts.map +1 -0
  149. package/dist/next/src/index.js +82 -0
  150. package/dist/next/src/index.js.map +1 -0
  151. package/dist/next-config.d.ts +2 -0
  152. package/dist/next-config.js +2 -0
  153. package/dist/next.d.ts +3 -0
  154. package/dist/next.js +3 -0
  155. package/dist/node-ipc-react.d.ts +2 -0
  156. package/dist/node-ipc-react.js +2 -0
  157. package/dist/node-ipc.d.ts +2 -0
  158. package/dist/node-ipc.js +2 -0
  159. package/dist/node.d.ts +4 -0
  160. package/dist/node.js +3 -0
  161. package/dist/platform-expo/src/index.d.ts +96 -0
  162. package/dist/platform-expo/src/index.d.ts.map +1 -0
  163. package/dist/platform-expo/src/index.js +198 -0
  164. package/dist/platform-expo/src/index.js.map +1 -0
  165. package/dist/platform-expo/src/react.d.ts +26 -0
  166. package/dist/platform-expo/src/react.d.ts.map +1 -0
  167. package/dist/platform-expo/src/react.js +30 -0
  168. package/dist/platform-expo/src/react.js.map +1 -0
  169. package/dist/platform-node/src/index.d.ts +145 -0
  170. package/dist/platform-node/src/index.d.ts.map +1 -0
  171. package/dist/platform-node/src/index.js +407 -0
  172. package/dist/platform-node/src/index.js.map +1 -0
  173. package/dist/platform-node/src/ipc-react.d.ts +25 -0
  174. package/dist/platform-node/src/ipc-react.d.ts.map +1 -0
  175. package/dist/platform-node/src/ipc-react.js +21 -0
  176. package/dist/platform-node/src/ipc-react.js.map +1 -0
  177. package/dist/platform-node/src/ipc.d.ts +76 -0
  178. package/dist/platform-node/src/ipc.d.ts.map +1 -0
  179. package/dist/platform-node/src/ipc.js +344 -0
  180. package/dist/platform-node/src/ipc.js.map +1 -0
  181. package/dist/platform-web/src/index.d.ts +106 -0
  182. package/dist/platform-web/src/index.d.ts.map +1 -0
  183. package/dist/platform-web/src/index.js +311 -0
  184. package/dist/platform-web/src/index.js.map +1 -0
  185. package/dist/platform-web/src/indexeddb.js +125 -0
  186. package/dist/platform-web/src/indexeddb.js.map +1 -0
  187. package/dist/platform-web/src/opfs.js +146 -0
  188. package/dist/platform-web/src/opfs.js.map +1 -0
  189. package/dist/platform-web/src/persistence.d.ts +20 -0
  190. package/dist/platform-web/src/persistence.d.ts.map +1 -0
  191. package/dist/platform-web/src/persistence.js +23 -0
  192. package/dist/platform-web/src/persistence.js.map +1 -0
  193. package/dist/platform-web/src/react.d.ts +35 -0
  194. package/dist/platform-web/src/react.d.ts.map +1 -0
  195. package/dist/platform-web/src/react.js +42 -0
  196. package/dist/platform-web/src/react.js.map +1 -0
  197. package/dist/platform-web/src/sqljs.js +133 -0
  198. package/dist/platform-web/src/sqljs.js.map +1 -0
  199. package/dist/platform-web/src/worker.d.ts +79 -0
  200. package/dist/platform-web/src/worker.d.ts.map +1 -0
  201. package/dist/platform-web/src/worker.js +308 -0
  202. package/dist/platform-web/src/worker.js.map +1 -0
  203. package/dist/react/src/index.d.ts +59 -0
  204. package/dist/react/src/index.d.ts.map +1 -0
  205. package/dist/react/src/index.js +151 -0
  206. package/dist/react/src/index.js.map +1 -0
  207. package/dist/react.d.ts +2 -0
  208. package/dist/react.js +2 -0
  209. package/dist/schema/src/definition.d.ts +98 -0
  210. package/dist/schema/src/definition.d.ts.map +1 -0
  211. package/dist/schema/src/definition.js +84 -0
  212. package/dist/schema/src/definition.js.map +1 -0
  213. package/dist/schema/src/planner.d.ts +42 -0
  214. package/dist/schema/src/planner.d.ts.map +1 -0
  215. package/dist/schema/src/planner.js +131 -0
  216. package/dist/schema/src/planner.js.map +1 -0
  217. package/dist/schema/src/validators.d.ts +194 -0
  218. package/dist/schema/src/validators.d.ts.map +1 -0
  219. package/dist/schema/src/validators.js +158 -0
  220. package/dist/schema/src/validators.js.map +1 -0
  221. package/dist/svelte/src/index.d.ts +44 -0
  222. package/dist/svelte/src/index.d.ts.map +1 -0
  223. package/dist/svelte/src/index.js +75 -0
  224. package/dist/svelte/src/index.js.map +1 -0
  225. package/dist/svelte.d.ts +2 -0
  226. package/dist/svelte.js +2 -0
  227. package/package.json +152 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","names":[],"sources":["../../../../../core/src/runtime/runtime.ts"],"sourcesContent":["import { fromZonedTime, toZonedTime } from \"date-fns-tz\";\nimport type {\n SyncoreDevtoolsEvent,\n SyncoreDevtoolsSnapshot\n} from \"@syncore/devtools-protocol\";\nimport {\n createSchemaSnapshot,\n diffSchemaSnapshots,\n type InferDocument,\n type InferTableInput,\n parseSchemaSnapshot,\n renderCreateSearchIndexStatement,\n renderMigrationSql,\n searchIndexTableName,\n type SyncoreSchema,\n type TableDefinition,\n type Validator\n} from \"@syncore/schema\";\nimport {\n type FunctionArgsFromDefinition,\n type FunctionKindFromDefinition,\n type FunctionReference,\n type FunctionResultFromDefinition,\n type MisfirePolicy,\n type RecurringJobDefinition,\n type RecurringSchedule,\n type SyncoreFunctionKind,\n type SyncoreFunctionDefinition\n} from \"./functions.js\";\nimport { generateId } from \"./id.js\";\n\nconst DEFAULT_MISFIRE_POLICY: MisfirePolicy = { type: \"catch_up\" };\n\nexport interface RegisteredSyncoreFunction {\n kind: SyncoreFunctionKind;\n argsValidator: Validator<unknown>;\n returnsValidator?: Validator<unknown>;\n handler: RegisteredSyncoreHandler;\n}\n\nexport interface SyncoreFunctionRegistry {\n readonly [name: string]: RegisteredSyncoreFunction | undefined;\n}\nexport type RegisteredSyncoreHandler = {\n bivarianceHack(ctx: unknown, args: unknown): unknown;\n}[\"bivarianceHack\"];\n\nexport type JsonObject = Record<string, unknown>;\n\ntype DatabaseRow = {\n _id: string;\n _creationTime: number;\n _json: string;\n};\n\nexport type ComparisonOperator = \"=\" | \">\" | \">=\" | \"<\" | \"<=\";\n\nexport type QueryCondition = {\n field: string;\n operator: ComparisonOperator;\n value: unknown;\n};\n\nexport type QueryExpression =\n | { type: \"condition\"; condition: QueryCondition }\n | { type: \"and\"; expressions: QueryExpression[] }\n | { type: \"or\"; expressions: QueryExpression[] };\n\nexport type SearchQuery = {\n searchField: string;\n searchText: string;\n filters: QueryCondition[];\n};\n\ntype DependencyKey = string;\n\ntype ActiveQueryRecord = {\n id: string;\n functionName: string;\n args: JsonObject;\n listeners: Set<() => void>;\n consumers: number;\n dependencyKeys: Set<DependencyKey>;\n lastResult: unknown;\n lastError: Error | undefined;\n lastRunAt: number;\n};\n\ntype ScheduledJobRow = {\n id: string;\n function_name: string;\n function_kind: SyncoreFunctionKind;\n args_json: string;\n status: \"scheduled\" | \"completed\" | \"failed\" | \"cancelled\" | \"skipped\";\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};\n\ntype StorageMetadataRow = {\n _id: string;\n _creationTime: number;\n file_name: string | null;\n content_type: string | null;\n size: number;\n path: string;\n};\n\ntype StoragePendingRow = {\n _id: string;\n _creationTime: number;\n file_name: string | null;\n content_type: string | null;\n};\n\nexport interface RunResult {\n changes: number;\n lastInsertRowid?: number | string;\n}\n\nexport interface SyncoreSqlDriver {\n exec(sql: string): Promise<void>;\n run(sql: string, params?: unknown[]): Promise<RunResult>;\n get<T>(sql: string, params?: unknown[]): Promise<T | undefined>;\n all<T>(sql: string, params?: unknown[]): Promise<T[]>;\n withTransaction<T>(callback: () => Promise<T>): Promise<T>;\n withSavepoint<T>(name: string, callback: () => Promise<T>): Promise<T>;\n close?(): Promise<void>;\n}\n\n/**\n * The binary or text payload written through Syncore storage APIs.\n */\nexport interface StorageWriteInput {\n data: Uint8Array | ArrayBuffer | string;\n contentType?: string;\n fileName?: string;\n}\n\n/**\n * Metadata about an object stored through Syncore storage APIs.\n */\nexport interface StorageObject {\n id: string;\n path: string;\n size: number;\n contentType: string | null;\n}\n\nexport interface SyncoreStorageAdapter {\n put(id: string, input: StorageWriteInput): Promise<StorageObject>;\n get(id: string): Promise<StorageObject | null>;\n read(id: string): Promise<Uint8Array | null>;\n delete(id: string): Promise<void>;\n list?(): Promise<StorageObject[]>;\n}\n\nexport interface DevtoolsSink {\n emit(event: SyncoreDevtoolsEvent): void;\n}\n\nexport interface SchedulerOptions {\n pollIntervalMs?: number;\n recurringJobs?: RecurringJobDefinition[];\n}\n\nexport interface SyncoreCapabilities {\n [name: string]: unknown;\n}\n\nexport interface SyncoreExperimentalPluginContext<\n TSchema extends AnySyncoreSchema\n> {\n runtimeId: string;\n platform: string;\n schema: TSchema;\n driver: SyncoreSqlDriver;\n storage: SyncoreStorageAdapter;\n scheduler?: SchedulerOptions;\n devtools?: DevtoolsSink;\n emitDevtools(event: SyncoreDevtoolsEvent): void;\n}\n\nexport interface SyncoreExperimentalPlugin<TSchema extends AnySyncoreSchema> {\n name: string;\n capabilities?:\n | SyncoreCapabilities\n | ((\n context: SyncoreExperimentalPluginContext<TSchema>\n ) => SyncoreCapabilities | void);\n onStart?(\n context: SyncoreExperimentalPluginContext<TSchema>\n ): Promise<void> | void;\n onStop?(\n context: SyncoreExperimentalPluginContext<TSchema>\n ): Promise<void> | void;\n}\n\nexport interface SyncoreRuntimeOptions<TSchema extends AnySyncoreSchema> {\n schema: TSchema;\n functions: SyncoreFunctionRegistry;\n driver: SyncoreSqlDriver;\n storage: SyncoreStorageAdapter;\n capabilities?: SyncoreCapabilities;\n experimentalPlugins?: Array<SyncoreExperimentalPlugin<TSchema>>;\n platform?: string;\n devtools?: DevtoolsSink;\n scheduler?: SchedulerOptions;\n}\n\nexport interface PaginationOptions {\n cursor?: string | null;\n numItems: number;\n}\n\nexport interface PaginationResult<TItem> {\n /** The current page of results. */\n page: TItem[];\n\n /** The cursor to pass to the next page request, or `null` when finished. */\n cursor: string | null;\n\n /** Whether there are no more pages to read. */\n isDone: boolean;\n}\n\nexport interface SyncoreWatch<TValue> {\n /** Subscribe to updates for this query watch. */\n onUpdate(callback: () => void): () => void;\n\n /** Read the latest local query result, if one is available. */\n localQueryResult(): TValue | undefined;\n\n /** Read the latest local query error, if one is available. */\n localQueryError(): Error | undefined;\n\n /** Dispose the watch if the implementation exposes explicit cleanup. */\n dispose?(): void;\n}\n\nexport interface FilterBuilder {\n /** Match documents whose field is exactly equal to a value. */\n eq(field: string, value: unknown): QueryExpression;\n\n /** Match documents whose field is greater than a value. */\n gt(field: string, value: unknown): QueryExpression;\n\n /** Match documents whose field is greater than or equal to a value. */\n gte(field: string, value: unknown): QueryExpression;\n\n /** Match documents whose field is less than a value. */\n lt(field: string, value: unknown): QueryExpression;\n\n /** Match documents whose field is less than or equal to a value. */\n lte(field: string, value: unknown): QueryExpression;\n\n /** Combine several filter expressions with logical AND. */\n and(...expressions: QueryExpression[]): QueryExpression;\n\n /** Combine several filter expressions with logical OR. */\n or(...expressions: QueryExpression[]): QueryExpression;\n}\n\nexport interface IndexRangeBuilder {\n /** Constrain an indexed field to an exact value. */\n eq(field: string, value: unknown): IndexRangeBuilder;\n\n /** Constrain an indexed field to values greater than a value. */\n gt(field: string, value: unknown): IndexRangeBuilder;\n\n /** Constrain an indexed field to values greater than or equal to a value. */\n gte(field: string, value: unknown): IndexRangeBuilder;\n\n /** Constrain an indexed field to values less than a value. */\n lt(field: string, value: unknown): IndexRangeBuilder;\n\n /** Constrain an indexed field to values less than or equal to a value. */\n lte(field: string, value: unknown): IndexRangeBuilder;\n\n /** Finish building the index range. */\n build(): QueryCondition[];\n}\n\nexport interface SearchIndexBuilder {\n /** Set the text field and text to search for. */\n search(field: string, value: string): SearchIndexBuilder;\n\n /** Add an equality filter alongside the text search. */\n eq(field: string, value: unknown): SearchIndexBuilder;\n\n /** Finish building the search query. */\n build(): SearchQuery;\n}\n\n// SyncoreSchema is not practically expressible here without losing assignability\n// across concrete schema instances, so the public constraint stays intentionally broad.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnySyncoreSchema = SyncoreSchema<any>;\n\nexport type TableNames<TSchema extends AnySyncoreSchema> = Extract<\n keyof TSchema[\"tables\"],\n string\n>;\n\nexport type DocumentForTable<\n TSchema extends AnySyncoreSchema,\n TTableName extends TableNames<TSchema>\n> = InferDocument<TSchema[\"tables\"][TTableName]>;\n\nexport type InsertValueForTable<\n TSchema extends AnySyncoreSchema,\n TTableName extends TableNames<TSchema>\n> = InferTableInput<TSchema[\"tables\"][TTableName]>;\n\ntype OptionalArgsTuple<TArgs> =\n Record<never, never> extends TArgs ? [args?: TArgs] : [args: TArgs];\n\nexport interface SyncoreDatabaseReader<\n TSchema extends AnySyncoreSchema = AnySyncoreSchema\n> {\n /** Read a single document by table name and id. */\n get<TTableName extends TableNames<TSchema>>(\n table: TTableName,\n id: string\n ): Promise<DocumentForTable<TSchema, TTableName> | null>;\n\n /** Start building a table query. */\n query<TTableName extends TableNames<TSchema>>(\n table: TTableName\n ): QueryBuilder<DocumentForTable<TSchema, TTableName>>;\n\n /** Run raw SQL against the local Syncore database. */\n raw<TValue = unknown>(sql: string, params?: unknown[]): Promise<TValue[]>;\n}\n\nexport interface SyncoreDatabaseWriter<\n TSchema extends AnySyncoreSchema = AnySyncoreSchema\n> extends SyncoreDatabaseReader<TSchema> {\n /** Insert a new document into a table and return its generated id. */\n insert<TTableName extends TableNames<TSchema>>(\n table: TTableName,\n value: InsertValueForTable<TSchema, TTableName>\n ): Promise<string>;\n\n /** Apply a partial update to an existing document. */\n patch<TTableName extends TableNames<TSchema>>(\n table: TTableName,\n id: string,\n value: Partial<InsertValueForTable<TSchema, TTableName>>\n ): Promise<void>;\n\n /** Replace an existing document with a full new value. */\n replace<TTableName extends TableNames<TSchema>>(\n table: TTableName,\n id: string,\n value: InsertValueForTable<TSchema, TTableName>\n ): Promise<void>;\n\n /** Delete a document from a table. */\n delete<TTableName extends TableNames<TSchema>>(\n table: TTableName,\n id: string\n ): Promise<void>;\n}\n\n/**\n * The storage API exposed inside Syncore runtime contexts.\n */\nexport interface SyncoreStorageApi {\n /** Store a file-like payload locally and return its generated id. */\n put(input: StorageWriteInput): Promise<string>;\n\n /** Read metadata for a stored object. */\n get(id: string): Promise<StorageObject | null>;\n\n /** Read the stored bytes for an object. */\n read(id: string): Promise<Uint8Array | null>;\n\n /** Delete a stored object. */\n delete(id: string): Promise<void>;\n}\n\nexport interface SchedulerApi {\n /** Schedule a mutation or action to run after a delay. */\n runAfter<TArgs, TResult>(\n delayMs: number,\n functionReference: FunctionReference<\"mutation\" | \"action\", TArgs, TResult>,\n ...args: [...OptionalArgsTuple<TArgs>, misfirePolicy?: MisfirePolicy]\n ): Promise<string>;\n\n /** Schedule a mutation or action to run at a specific time. */\n runAt<TArgs, TResult>(\n timestamp: number | Date,\n functionReference: FunctionReference<\"mutation\" | \"action\", TArgs, TResult>,\n ...args: [...OptionalArgsTuple<TArgs>, misfirePolicy?: MisfirePolicy]\n ): Promise<string>;\n\n /** Cancel a previously scheduled job. */\n cancel(id: string): Promise<void>;\n}\n\n/**\n * The context object available inside Syncore queries.\n */\nexport interface QueryCtx<TSchema extends AnySyncoreSchema = AnySyncoreSchema> {\n /** Read-only database access for this query. */\n db: SyncoreDatabaseReader<TSchema>;\n\n /** Local file/blob storage for this runtime. */\n storage: SyncoreStorageApi;\n\n /** Optional adapter or plugin capabilities exposed by the runtime. */\n capabilities?: Readonly<SyncoreCapabilities>;\n\n /** Call another Syncore query from inside this query. */\n runQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult>;\n}\n\n/**\n * The context object available inside Syncore mutations.\n */\nexport interface MutationCtx<\n TSchema extends AnySyncoreSchema = AnySyncoreSchema\n> extends QueryCtx<TSchema> {\n db: SyncoreDatabaseWriter<TSchema>;\n\n /** Schedule future work from this mutation. */\n scheduler: SchedulerApi;\n\n /** Call another mutation from inside this mutation. */\n runMutation<TArgs, TResult>(\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult>;\n\n /** Call an action from this mutation. */\n runAction<TArgs, TResult>(\n reference: FunctionReference<\"action\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult>;\n}\n\n/**\n * The context object available inside Syncore actions.\n */\nexport interface ActionCtx<\n TSchema extends AnySyncoreSchema = AnySyncoreSchema\n> extends QueryCtx<TSchema> {\n /** Schedule future work from this action. */\n scheduler: SchedulerApi;\n\n /** Call a mutation from this action. */\n runMutation<TArgs, TResult>(\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult>;\n\n /** Call another action from this action. */\n runAction<TArgs, TResult>(\n reference: FunctionReference<\"action\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult>;\n}\n\n/**\n * The typed client API exposed by a Syncore runtime.\n */\nexport interface SyncoreClient {\n /** Fetch a query result once. */\n query<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult>;\n\n /** Execute a mutation. */\n mutation<TArgs, TResult>(\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult>;\n\n /** Execute an action. */\n action<TArgs, TResult>(\n reference: FunctionReference<\"action\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): Promise<TResult>;\n\n /** Subscribe to a query and receive reactive updates. */\n watchQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ): SyncoreWatch<TResult>;\n}\n\nclass RuntimeFilterBuilder implements FilterBuilder {\n eq(field: string, value: unknown): QueryExpression {\n return { type: \"condition\", condition: { field, operator: \"=\", value } };\n }\n\n gt(field: string, value: unknown): QueryExpression {\n return { type: \"condition\", condition: { field, operator: \">\", value } };\n }\n\n gte(field: string, value: unknown): QueryExpression {\n return { type: \"condition\", condition: { field, operator: \">=\", value } };\n }\n\n lt(field: string, value: unknown): QueryExpression {\n return { type: \"condition\", condition: { field, operator: \"<\", value } };\n }\n\n lte(field: string, value: unknown): QueryExpression {\n return { type: \"condition\", condition: { field, operator: \"<=\", value } };\n }\n\n and(...expressions: QueryExpression[]): QueryExpression {\n return { type: \"and\", expressions };\n }\n\n or(...expressions: QueryExpression[]): QueryExpression {\n return { type: \"or\", expressions };\n }\n}\n\nclass RuntimeIndexRangeBuilder implements IndexRangeBuilder {\n private readonly conditions: QueryCondition[] = [];\n\n eq(field: string, value: unknown): IndexRangeBuilder {\n this.conditions.push({ field, operator: \"=\", value });\n return this;\n }\n\n gt(field: string, value: unknown): IndexRangeBuilder {\n this.conditions.push({ field, operator: \">\", value });\n return this;\n }\n\n gte(field: string, value: unknown): IndexRangeBuilder {\n this.conditions.push({ field, operator: \">=\", value });\n return this;\n }\n\n lt(field: string, value: unknown): IndexRangeBuilder {\n this.conditions.push({ field, operator: \"<\", value });\n return this;\n }\n\n lte(field: string, value: unknown): IndexRangeBuilder {\n this.conditions.push({ field, operator: \"<=\", value });\n return this;\n }\n\n build(): QueryCondition[] {\n return [...this.conditions];\n }\n}\n\nclass RuntimeSearchIndexBuilder implements SearchIndexBuilder {\n private searchField: string | undefined;\n private searchText: string | undefined;\n private readonly filters: QueryCondition[] = [];\n\n search(field: string, value: string): SearchIndexBuilder {\n this.searchField = field;\n this.searchText = value;\n return this;\n }\n\n eq(field: string, value: unknown): SearchIndexBuilder {\n this.filters.push({ field, operator: \"=\", value });\n return this;\n }\n\n build(): SearchQuery {\n if (!this.searchField || !this.searchText) {\n throw new Error(\"Search queries require a search field and search text.\");\n }\n return {\n searchField: this.searchField,\n searchText: this.searchText,\n filters: [...this.filters]\n };\n }\n}\n\ntype QuerySource =\n | { type: \"table\" }\n | { type: \"index\"; name: string; range: QueryCondition[] }\n | { type: \"search\"; name: string; query: SearchQuery };\n\ntype ExecuteQueryBuilderOptions = {\n tableName: string;\n source: QuerySource;\n filterExpression: QueryExpression | undefined;\n orderDirection: \"asc\" | \"desc\";\n dependencyCollector?: Set<DependencyKey>;\n limit?: number;\n offset?: number;\n};\n\ntype RuntimeExecutionState = {\n mutationDepth: number;\n changedTables: Set<string>;\n dependencyCollector?: Set<DependencyKey>;\n};\n\n/**\n * A composable builder for Syncore table queries.\n */\nexport interface QueryBuilder<TDocument> {\n /** Query through a named index instead of scanning the whole table. */\n withIndex(\n indexName: string,\n builder?: (range: IndexRangeBuilder) => IndexRangeBuilder\n ): this;\n\n /** Query through a named search index for text search. */\n withSearchIndex(\n indexName: string,\n builder: (search: SearchIndexBuilder) => SearchIndexBuilder\n ): this;\n\n /** Set the result ordering. */\n order(order: \"asc\" | \"desc\"): this;\n\n /** Add a filter expression to the query. */\n filter(builder: (filter: FilterBuilder) => QueryExpression): this;\n\n /** Collect all matching documents. */\n collect(): Promise<TDocument[]>;\n\n /** Collect up to a fixed number of matching documents. */\n take(count: number): Promise<TDocument[]>;\n\n /** Return the first matching document, or `null` if none exist. */\n first(): Promise<TDocument | null>;\n\n /** Return one matching document and throw if multiple rows match. */\n unique(): Promise<TDocument | null>;\n\n /** Read a paginated slice of documents using a cursor. */\n paginate(options: PaginationOptions): Promise<PaginationResult<TDocument>>;\n}\n\nclass RuntimeQueryBuilder<TDocument> implements QueryBuilder<TDocument> {\n private orderDirection: \"asc\" | \"desc\" = \"asc\";\n private source: QuerySource = { type: \"table\" };\n private filterExpression: QueryExpression | undefined;\n\n constructor(\n private readonly executeQuery: (\n options: ExecuteQueryBuilderOptions\n ) => Promise<TDocument[]>,\n private readonly tableName: string,\n private readonly dependencyCollector?: Set<DependencyKey>\n ) {}\n\n withIndex(\n indexName: string,\n builder?: (range: IndexRangeBuilder) => IndexRangeBuilder\n ): this {\n const indexRange = builder?.(new RuntimeIndexRangeBuilder()).build() ?? [];\n this.source = { type: \"index\", name: indexName, range: indexRange };\n return this;\n }\n\n withSearchIndex(\n indexName: string,\n builder: (search: SearchIndexBuilder) => SearchIndexBuilder\n ): this {\n this.source = {\n type: \"search\",\n name: indexName,\n query: builder(new RuntimeSearchIndexBuilder()).build()\n };\n return this;\n }\n\n order(order: \"asc\" | \"desc\"): this {\n this.orderDirection = order;\n return this;\n }\n\n filter(builder: (filter: FilterBuilder) => QueryExpression): this {\n this.filterExpression = builder(new RuntimeFilterBuilder());\n return this;\n }\n\n async collect(): Promise<TDocument[]> {\n return this.execute();\n }\n\n async take(count: number): Promise<TDocument[]> {\n return this.execute({ limit: count });\n }\n\n async first(): Promise<TDocument | null> {\n const results = await this.execute({ limit: 1 });\n return results[0] ?? null;\n }\n\n async unique(): Promise<TDocument | null> {\n const results = await this.execute({ limit: 2 });\n if (results.length > 1) {\n throw new Error(\"Expected a unique result but found multiple rows.\");\n }\n return results[0] ?? null;\n }\n\n async paginate(\n options: PaginationOptions\n ): Promise<PaginationResult<TDocument>> {\n const offset = options.cursor ? Number.parseInt(options.cursor, 10) : 0;\n const page = await this.execute({ limit: options.numItems, offset });\n const nextCursor =\n page.length < options.numItems ? null : String(offset + page.length);\n return {\n page,\n cursor: nextCursor,\n isDone: nextCursor === null\n };\n }\n\n private async execute(options?: {\n limit?: number;\n offset?: number;\n }): Promise<TDocument[]> {\n this.dependencyCollector?.add(`table:${this.tableName}`);\n const queryOptions: ExecuteQueryBuilderOptions = {\n tableName: this.tableName,\n source: this.source,\n filterExpression: this.filterExpression,\n orderDirection: this.orderDirection\n };\n if (this.dependencyCollector) {\n queryOptions.dependencyCollector = this.dependencyCollector;\n }\n if (options?.limit !== undefined) {\n queryOptions.limit = options.limit;\n }\n if (options?.offset !== undefined) {\n queryOptions.offset = options.offset;\n }\n return this.executeQuery(queryOptions);\n }\n}\n\n/**\n * The local Syncore runtime that owns the database, storage, scheduler, and function execution.\n */\nexport class SyncoreRuntime<TSchema extends AnySyncoreSchema> {\n private readonly runtimeId = generateId();\n private readonly platform: string;\n private readonly capabilities: Readonly<SyncoreCapabilities>;\n private readonly experimentalPlugins: Array<\n SyncoreExperimentalPlugin<TSchema>\n >;\n private readonly activeQueries = new Map<string, ActiveQueryRecord>();\n private readonly disabledSearchIndexes = new Set<string>();\n private readonly recentEvents: SyncoreDevtoolsEvent[] = [];\n private schedulerTimer: ReturnType<typeof setInterval> | undefined;\n private readonly recurringJobs: RecurringJobDefinition[];\n private readonly schedulerPollIntervalMs: number;\n private started = false;\n\n constructor(private readonly options: SyncoreRuntimeOptions<TSchema>) {\n this.platform = options.platform ?? \"node\";\n this.experimentalPlugins = options.experimentalPlugins ?? [];\n this.recurringJobs = options.scheduler?.recurringJobs ?? [];\n this.schedulerPollIntervalMs = options.scheduler?.pollIntervalMs ?? 1000;\n this.capabilities = Object.freeze(this.buildCapabilities());\n }\n\n /**\n * Start the local Syncore runtime.\n */\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n await this.ensureSystemTables();\n await this.reconcileStorageState();\n await this.applySchema();\n await this.syncRecurringJobs();\n await this.runPluginHook(\"onStart\");\n this.schedulerTimer = setInterval(() => {\n void this.processDueJobs();\n }, this.schedulerPollIntervalMs);\n this.started = true;\n this.emitDevtools({\n type: \"runtime.connected\",\n runtimeId: this.runtimeId,\n platform: this.platform,\n timestamp: Date.now()\n });\n }\n\n /**\n * Stop the local Syncore runtime and release any open resources.\n */\n async stop(): Promise<void> {\n if (this.schedulerTimer) {\n clearInterval(this.schedulerTimer);\n this.schedulerTimer = undefined;\n }\n if (this.started) {\n await this.runPluginHook(\"onStop\");\n }\n await this.options.driver.close?.();\n if (this.started) {\n this.emitDevtools({\n type: \"runtime.disconnected\",\n runtimeId: this.runtimeId,\n timestamp: Date.now()\n });\n }\n this.started = false;\n }\n\n /**\n * Create a typed client for calling this runtime from the same process.\n */\n createClient(): SyncoreClient {\n return {\n query: (reference, ...args) =>\n this.runQuery(reference, normalizeOptionalArgs(args) as JsonObject),\n mutation: (reference, ...args) =>\n this.runMutation(reference, normalizeOptionalArgs(args) as JsonObject),\n action: (reference, ...args) =>\n this.runAction(reference, normalizeOptionalArgs(args) as JsonObject),\n watchQuery: (reference, ...args) =>\n this.watchQuery(reference, normalizeOptionalArgs(args) as JsonObject)\n };\n }\n\n getDevtoolsSnapshot(): SyncoreDevtoolsSnapshot {\n return {\n runtimeId: this.runtimeId,\n platform: this.platform,\n connectedAt: Date.now(),\n activeQueries: [...this.activeQueries.values()].map((query) => ({\n id: query.id,\n functionName: query.functionName,\n dependencyKeys: [...query.dependencyKeys],\n lastRunAt: query.lastRunAt\n })),\n pendingJobs: [],\n recentEvents: [...this.recentEvents]\n };\n }\n\n getRuntimeId(): string {\n return this.runtimeId;\n }\n\n async runQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n args: JsonObject = {}\n ): Promise<TResult> {\n const definition = this.resolveFunction(reference, \"query\");\n const dependencyCollector = new Set<DependencyKey>();\n const startedAt = Date.now();\n const result = await this.invokeFunction<TResult>(definition, args, {\n mutationDepth: 0,\n changedTables: new Set<string>(),\n dependencyCollector\n });\n\n this.emitDevtools({\n type: \"query.executed\",\n runtimeId: this.runtimeId,\n queryId: reference.name,\n functionName: reference.name,\n dependencies: [...dependencyCollector],\n durationMs: Date.now() - startedAt,\n timestamp: Date.now()\n });\n\n return result;\n }\n\n async runMutation<TArgs, TResult>(\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n args: JsonObject = {}\n ): Promise<TResult> {\n const definition = this.resolveFunction(reference, \"mutation\");\n const mutationId = generateId();\n const startedAt = Date.now();\n const changedTables = new Set<string>();\n\n const result = await this.options.driver.withTransaction(async () =>\n this.invokeFunction<TResult>(definition, args, {\n mutationDepth: 1,\n changedTables\n })\n );\n\n await this.refreshInvalidatedQueries(changedTables, mutationId);\n\n this.emitDevtools({\n type: \"mutation.committed\",\n runtimeId: this.runtimeId,\n mutationId,\n functionName: reference.name,\n changedTables: [...changedTables],\n durationMs: Date.now() - startedAt,\n timestamp: Date.now()\n });\n\n return result;\n }\n\n async runAction<TArgs, TResult>(\n reference: FunctionReference<\"action\", TArgs, TResult>,\n args: JsonObject = {}\n ): Promise<TResult> {\n const definition = this.resolveFunction(reference, \"action\");\n const actionId = generateId();\n const startedAt = Date.now();\n\n try {\n const result = await this.invokeFunction<TResult>(definition, args, {\n mutationDepth: 0,\n changedTables: new Set<string>()\n });\n this.emitDevtools({\n type: \"action.completed\",\n runtimeId: this.runtimeId,\n actionId,\n functionName: reference.name,\n durationMs: Date.now() - startedAt,\n timestamp: Date.now()\n });\n return result;\n } catch (error) {\n this.emitDevtools({\n type: \"action.completed\",\n runtimeId: this.runtimeId,\n actionId,\n functionName: reference.name,\n durationMs: Date.now() - startedAt,\n timestamp: Date.now(),\n error: error instanceof Error ? error.message : String(error)\n });\n throw error;\n }\n }\n\n watchQuery<TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n args: JsonObject = {}\n ): SyncoreWatch<TResult> {\n const key = this.createActiveQueryKey(reference.name, args);\n let record = this.activeQueries.get(key);\n\n if (!record) {\n record = {\n id: key,\n functionName: reference.name,\n args,\n listeners: new Set<() => void>(),\n consumers: 0,\n dependencyKeys: new Set<DependencyKey>(),\n lastResult: undefined,\n lastError: undefined,\n lastRunAt: 0\n };\n this.activeQueries.set(key, record);\n void this.rerunActiveQuery(record);\n }\n\n const activeRecord = record;\n activeRecord.consumers += 1;\n let disposed = false;\n const ownedListeners = new Set<() => void>();\n\n return {\n onUpdate: (callback) => {\n activeRecord.listeners.add(callback);\n ownedListeners.add(callback);\n queueMicrotask(callback);\n return () => {\n activeRecord.listeners.delete(callback);\n ownedListeners.delete(callback);\n };\n },\n localQueryResult: () => activeRecord.lastResult as TResult | undefined,\n localQueryError: () => activeRecord.lastError,\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n for (const callback of ownedListeners) {\n activeRecord.listeners.delete(callback);\n }\n ownedListeners.clear();\n activeRecord.consumers = Math.max(0, activeRecord.consumers - 1);\n if (activeRecord.consumers === 0) {\n this.activeQueries.delete(key);\n }\n }\n };\n }\n\n private async executeQueryBuilder<TDocument>(\n options: ExecuteQueryBuilderOptions\n ): Promise<TDocument[]> {\n const table = this.options.schema.getTable(\n options.tableName\n ) as TableDefinition<Validator<unknown>>;\n const params: unknown[] = [];\n const whereClauses: string[] = [];\n const orderClauses: string[] = [];\n let joinClause = \"\";\n const source = options.source;\n\n if (source.type === \"index\") {\n const index = table.indexes.find(\n (candidate) => candidate.name === source.name\n );\n if (!index) {\n throw new Error(\n `Unknown index \"${source.name}\" on table \"${options.tableName}\".`\n );\n }\n for (const condition of source.range) {\n whereClauses.push(this.renderCondition(\"t\", condition, params));\n }\n const primaryField = index.fields[0];\n if (primaryField) {\n orderClauses.push(\n `${fieldExpression(\"t\", primaryField)} ${options.orderDirection.toUpperCase()}`\n );\n }\n }\n\n if (source.type === \"search\") {\n const searchIndex = table.searchIndexes.find(\n (candidate) => candidate.name === source.name\n );\n if (!searchIndex) {\n throw new Error(\n `Unknown search index \"${source.name}\" on table \"${options.tableName}\".`\n );\n }\n if (searchIndex.searchField !== source.query.searchField) {\n throw new Error(\n `Search index \"${searchIndex.name}\" expects field \"${searchIndex.searchField}\".`\n );\n }\n const searchIndexKey = `${options.tableName}:${searchIndex.name}`;\n if (this.disabledSearchIndexes.has(searchIndexKey)) {\n whereClauses.push(\n `${fieldExpression(\"t\", searchIndex.searchField)} LIKE ?`\n );\n params.push(`%${source.query.searchText}%`);\n } else {\n const searchTableName = searchIndexTableName(\n options.tableName,\n searchIndex.name\n );\n joinClause = `JOIN ${quoteIdentifier(searchTableName)} s ON s._id = t._id`;\n whereClauses.push(`s.search_value MATCH ?`);\n params.push(source.query.searchText);\n }\n for (const condition of source.query.filters) {\n whereClauses.push(this.renderCondition(\"t\", condition, params));\n }\n }\n\n if (options.filterExpression) {\n whereClauses.push(\n this.renderExpression(\"t\", options.filterExpression, params)\n );\n }\n\n if (orderClauses.length === 0) {\n orderClauses.push(\n `t._creationTime ${options.orderDirection.toUpperCase()}`\n );\n }\n orderClauses.push(`t._id ${options.orderDirection.toUpperCase()}`);\n\n const sql = [\n `SELECT t._id, t._creationTime, t._json FROM ${quoteIdentifier(options.tableName)} t`,\n joinClause,\n whereClauses.length > 0 ? `WHERE ${whereClauses.join(\" AND \")}` : \"\",\n `ORDER BY ${orderClauses.join(\", \")}`,\n options.limit !== undefined ? `LIMIT ${options.limit}` : \"\",\n options.offset !== undefined ? `OFFSET ${options.offset}` : \"\"\n ]\n .filter(Boolean)\n .join(\" \");\n\n const rows = await this.options.driver.all<DatabaseRow>(sql, params);\n return rows.map((row) =>\n this.deserializeDocument<TDocument>(options.tableName, row)\n );\n }\n\n private async invokeFunction<TResult>(\n definition: SyncoreFunctionDefinition<\n SyncoreFunctionKind,\n unknown,\n unknown,\n unknown\n >,\n rawArgs: JsonObject,\n state: RuntimeExecutionState\n ): Promise<TResult> {\n const args = definition.argsValidator.parse(rawArgs) as JsonObject;\n const ctx = this.createContext(definition.kind, state);\n const result = (await definition.handler(ctx, args)) as TResult;\n if (definition.returnsValidator) {\n return definition.returnsValidator.parse(result) as TResult;\n }\n return result;\n }\n\n private createContext(\n kind: SyncoreFunctionKind,\n state: RuntimeExecutionState\n ): QueryCtx<TSchema> | MutationCtx<TSchema> | ActionCtx<TSchema> {\n const db =\n kind === \"mutation\"\n ? this.createDatabaseWriter(state)\n : this.createDatabaseReader(state);\n const storage = this.createStorageApi();\n const scheduler = this.createSchedulerApi();\n\n return {\n db,\n storage,\n capabilities: this.capabilities,\n scheduler,\n runQuery: <TArgs, TResult>(\n reference: FunctionReference<\"query\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ) => this.runQuery(reference, normalizeOptionalArgs(args) as JsonObject),\n runMutation: <TArgs, TResult>(\n reference: FunctionReference<\"mutation\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ) => {\n const normalizedArgs = normalizeOptionalArgs(args);\n if (kind === \"mutation\") {\n return this.options.driver.withSavepoint(\n `sp_${generateId().replace(/-/g, \"_\")}`,\n () =>\n this.invokeFunction<TResult>(\n this.resolveFunction(reference, \"mutation\"),\n normalizedArgs as JsonObject,\n {\n mutationDepth: state.mutationDepth + 1,\n changedTables: state.changedTables\n }\n )\n );\n }\n return this.runMutation(reference, normalizedArgs as JsonObject);\n },\n runAction: <TArgs, TResult>(\n reference: FunctionReference<\"action\", TArgs, TResult>,\n ...args: OptionalArgsTuple<TArgs>\n ) => this.runAction(reference, normalizeOptionalArgs(args) as JsonObject)\n } as QueryCtx<TSchema> | MutationCtx<TSchema> | ActionCtx<TSchema>;\n }\n\n private createDatabaseReader(\n state: RuntimeExecutionState\n ): SyncoreDatabaseReader<TSchema> {\n return {\n get: async <TTableName extends TableNames<TSchema>>(\n tableName: TTableName,\n id: string\n ) => {\n state.dependencyCollector?.add(`table:${tableName}`);\n state.dependencyCollector?.add(`row:${tableName}:${id}`);\n const row = await this.options.driver.get<DatabaseRow>(\n `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(tableName)} WHERE _id = ?`,\n [id]\n );\n return row\n ? this.deserializeDocument<DocumentForTable<TSchema, TTableName>>(\n tableName,\n row\n )\n : null;\n },\n query: <TTableName extends TableNames<TSchema>>(tableName: TTableName) =>\n new RuntimeQueryBuilder<DocumentForTable<TSchema, TTableName>>(\n (options) =>\n this.executeQueryBuilder<DocumentForTable<TSchema, TTableName>>(\n options\n ),\n tableName,\n state.dependencyCollector\n ),\n raw: <TValue>(sql: string, params?: unknown[]) =>\n this.options.driver.all<TValue>(sql, params)\n };\n }\n\n private createDatabaseWriter(\n state: RuntimeExecutionState\n ): SyncoreDatabaseWriter<TSchema> {\n const reader = this.createDatabaseReader(state);\n\n return {\n ...reader,\n insert: async <TTableName extends TableNames<TSchema>>(\n tableName: TTableName,\n value: InsertValueForTable<TSchema, TTableName>\n ) => {\n const validated = this.validateDocument(tableName, value as JsonObject);\n const id = generateId();\n const creationTime = Date.now();\n const json = stableStringify(validated);\n await this.options.driver.run(\n `INSERT INTO ${quoteIdentifier(tableName)} (_id, _creationTime, _json) VALUES (?, ?, ?)`,\n [id, creationTime, json]\n );\n await this.syncSearchIndexes(tableName, {\n _id: id,\n _creationTime: creationTime,\n _json: json\n });\n state.changedTables.add(tableName);\n return id;\n },\n patch: async <TTableName extends TableNames<TSchema>>(\n tableName: TTableName,\n id: string,\n value: Partial<InsertValueForTable<TSchema, TTableName>>\n ) => {\n const current = await reader.get(tableName, id);\n if (!current) {\n throw new Error(`Document \"${id}\" does not exist in \"${tableName}\".`);\n }\n const merged: JsonObject = { ...omitSystemFields(current), ...value };\n for (const key of Object.keys(merged)) {\n if (merged[key] === undefined) {\n delete merged[key];\n }\n }\n const validated = this.validateDocument(tableName, merged);\n await this.options.driver.run(\n `UPDATE ${quoteIdentifier(tableName)} SET _json = ? WHERE _id = ?`,\n [stableStringify(validated), id]\n );\n const row = await this.options.driver.get<DatabaseRow>(\n `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(tableName)} WHERE _id = ?`,\n [id]\n );\n if (row) {\n await this.syncSearchIndexes(tableName, row);\n }\n state.changedTables.add(tableName);\n },\n replace: async <TTableName extends TableNames<TSchema>>(\n tableName: TTableName,\n id: string,\n value: InsertValueForTable<TSchema, TTableName>\n ) => {\n const validated = this.validateDocument(tableName, value as JsonObject);\n await this.options.driver.run(\n `UPDATE ${quoteIdentifier(tableName)} SET _json = ? WHERE _id = ?`,\n [stableStringify(validated), id]\n );\n const row = await this.options.driver.get<DatabaseRow>(\n `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(tableName)} WHERE _id = ?`,\n [id]\n );\n if (!row) {\n throw new Error(`Document \"${id}\" does not exist in \"${tableName}\".`);\n }\n await this.syncSearchIndexes(tableName, row);\n state.changedTables.add(tableName);\n },\n delete: async <TTableName extends TableNames<TSchema>>(\n tableName: TTableName,\n id: string\n ) => {\n await this.options.driver.run(\n `DELETE FROM ${quoteIdentifier(tableName)} WHERE _id = ?`,\n [id]\n );\n await this.removeSearchIndexes(tableName, id);\n state.changedTables.add(tableName);\n }\n };\n }\n\n private createStorageApi(): SyncoreStorageApi {\n return {\n put: async (input) => {\n const id = generateId();\n const createdAt = Date.now();\n await this.options.driver.run(\n `INSERT OR REPLACE INTO \"_storage_pending\" (_id, _creationTime, file_name, content_type) VALUES (?, ?, ?, ?)`,\n [id, createdAt, input.fileName ?? null, input.contentType ?? null]\n );\n const object = await this.options.storage.put(id, input);\n await this.options.driver.withTransaction(async () => {\n await this.options.driver.run(\n `INSERT OR REPLACE INTO \"_storage\" (_id, _creationTime, file_name, content_type, size, path) VALUES (?, ?, ?, ?, ?, ?)`,\n [\n id,\n createdAt,\n input.fileName ?? null,\n object.contentType,\n object.size,\n object.path\n ]\n );\n await this.options.driver.run(\n `DELETE FROM \"_storage_pending\" WHERE _id = ?`,\n [id]\n );\n });\n this.emitDevtools({\n type: \"storage.updated\",\n runtimeId: this.runtimeId,\n storageId: id,\n operation: \"put\",\n timestamp: Date.now()\n });\n return id;\n },\n get: async (id) => {\n const row = await this.options.driver.get<StorageMetadataRow>(\n `SELECT _id, _creationTime, file_name, content_type, size, path FROM \"_storage\" WHERE _id = ?`,\n [id]\n );\n if (!row) {\n return null;\n }\n return {\n id: row._id,\n path: row.path,\n size: row.size,\n contentType: row.content_type\n };\n },\n read: async (id) => {\n const row = await this.options.driver.get<\n Pick<StorageMetadataRow, \"_id\">\n >(`SELECT _id FROM \"_storage\" WHERE _id = ?`, [id]);\n if (!row) {\n return null;\n }\n return this.options.storage.read(id);\n },\n delete: async (id) => {\n await this.options.storage.delete(id);\n await this.options.driver.withTransaction(async () => {\n await this.options.driver.run(\n `DELETE FROM \"_storage\" WHERE _id = ?`,\n [id]\n );\n await this.options.driver.run(\n `DELETE FROM \"_storage_pending\" WHERE _id = ?`,\n [id]\n );\n });\n this.emitDevtools({\n type: \"storage.updated\",\n runtimeId: this.runtimeId,\n storageId: id,\n operation: \"delete\",\n timestamp: Date.now()\n });\n }\n };\n }\n\n private createSchedulerApi(): SchedulerApi {\n return {\n runAfter: async (delayMs, reference, ...args) => {\n const schedulerArgs = splitSchedulerArgs(args);\n const functionArgs = schedulerArgs[0];\n const misfirePolicy = schedulerArgs[1] ?? DEFAULT_MISFIRE_POLICY;\n return this.scheduleJob(\n Date.now() + delayMs,\n reference,\n functionArgs,\n misfirePolicy\n );\n },\n runAt: async (timestamp, reference, ...args) => {\n const schedulerArgs = splitSchedulerArgs(args);\n const functionArgs = schedulerArgs[0];\n const misfirePolicy = schedulerArgs[1] ?? DEFAULT_MISFIRE_POLICY;\n const value =\n timestamp instanceof Date ? timestamp.getTime() : timestamp;\n return this.scheduleJob(value, reference, functionArgs, misfirePolicy);\n },\n cancel: async (id) => {\n await this.options.driver.run(\n `UPDATE \"_scheduled_functions\" SET status = 'cancelled', updated_at = ? WHERE id = ?`,\n [Date.now(), id]\n );\n }\n };\n }\n\n private async ensureSystemTables(): Promise<void> {\n await this.options.driver.exec(`\n CREATE TABLE IF NOT EXISTS \"_syncore_migrations\" (\n id TEXT PRIMARY KEY,\n applied_at INTEGER NOT NULL,\n sql TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS \"_syncore_schema_state\" (\n id TEXT PRIMARY KEY,\n schema_hash TEXT NOT NULL,\n schema_json TEXT NOT NULL,\n updated_at INTEGER NOT NULL\n );\n CREATE TABLE IF NOT EXISTS \"_storage\" (\n _id TEXT PRIMARY KEY,\n _creationTime INTEGER NOT NULL,\n file_name TEXT,\n content_type TEXT,\n size INTEGER NOT NULL,\n path TEXT NOT NULL\n );\n CREATE TABLE IF NOT EXISTS \"_storage_pending\" (\n _id TEXT PRIMARY KEY,\n _creationTime INTEGER NOT NULL,\n file_name TEXT,\n content_type TEXT\n );\n CREATE TABLE IF NOT EXISTS \"_scheduled_functions\" (\n id TEXT PRIMARY KEY,\n function_name TEXT NOT NULL,\n function_kind TEXT NOT NULL,\n args_json TEXT NOT NULL,\n status TEXT NOT NULL,\n run_at INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n recurring_name TEXT,\n schedule_json TEXT,\n timezone TEXT,\n misfire_policy TEXT NOT NULL,\n last_run_at INTEGER,\n window_ms INTEGER\n );\n `);\n try {\n await this.options.driver.exec(\n `ALTER TABLE \"_syncore_schema_state\" ADD COLUMN schema_json TEXT NOT NULL DEFAULT '{}'`\n );\n } catch {\n // Column already exists.\n }\n }\n\n private async reconcileStorageState(): Promise<void> {\n const pendingRows = await this.options.driver.all<StoragePendingRow>(\n `SELECT _id, _creationTime, file_name, content_type FROM \"_storage_pending\"`\n );\n\n for (const pendingRow of pendingRows) {\n const committed = await this.options.driver.get<\n Pick<StorageMetadataRow, \"_id\">\n >(`SELECT _id FROM \"_storage\" WHERE _id = ?`, [pendingRow._id]);\n if (!committed) {\n await this.options.storage.delete(pendingRow._id);\n this.emitDevtools({\n type: \"log\",\n runtimeId: this.runtimeId,\n level: \"warn\",\n message: `Recovered interrupted storage write ${pendingRow._id}.`,\n timestamp: Date.now()\n });\n }\n await this.options.driver.run(\n `DELETE FROM \"_storage_pending\" WHERE _id = ?`,\n [pendingRow._id]\n );\n }\n\n if (!this.options.storage.list) {\n return;\n }\n\n const storedRows = await this.options.driver.all<\n Pick<StorageMetadataRow, \"_id\">\n >(`SELECT _id FROM \"_storage\"`);\n const knownIds = new Set(storedRows.map((row) => row._id));\n const physicalObjects = await this.options.storage.list();\n for (const object of physicalObjects) {\n if (knownIds.has(object.id)) {\n continue;\n }\n await this.options.storage.delete(object.id);\n this.emitDevtools({\n type: \"log\",\n runtimeId: this.runtimeId,\n level: \"warn\",\n message: `Removed orphaned storage object ${object.id}.`,\n timestamp: Date.now()\n });\n }\n }\n\n private async applySchema(): Promise<void> {\n const nextSnapshot = createSchemaSnapshot(this.options.schema);\n const stateRow = await this.options.driver.get<{\n schema_hash: string;\n schema_json: string;\n }>(\n `SELECT schema_hash, schema_json FROM \"_syncore_schema_state\" WHERE id = 'current'`\n );\n let previousSnapshot = null;\n if (stateRow?.schema_json && stateRow.schema_json !== \"{}\") {\n try {\n previousSnapshot = parseSchemaSnapshot(stateRow.schema_json);\n } catch {\n previousSnapshot = null;\n }\n }\n const plan = diffSchemaSnapshots(previousSnapshot, nextSnapshot);\n\n if (plan.destructiveChanges.length > 0) {\n throw new Error(\n `Syncore detected destructive schema changes that require a manual migration:\\n${plan.destructiveChanges.join(\n \"\\n\"\n )}`\n );\n }\n\n for (const warning of plan.warnings) {\n this.emitDevtools({\n type: \"log\",\n runtimeId: this.runtimeId,\n level: \"warn\",\n message: warning,\n timestamp: Date.now()\n });\n }\n\n for (const statement of plan.statements) {\n const searchKey = this.findSearchIndexKeyForStatement(statement);\n try {\n await this.options.driver.exec(statement);\n } catch (error) {\n if (searchKey) {\n this.disabledSearchIndexes.add(searchKey);\n this.emitDevtools({\n type: \"log\",\n runtimeId: this.runtimeId,\n level: \"warn\",\n message: `FTS5 unavailable for ${searchKey}; falling back to LIKE search.`,\n timestamp: Date.now()\n });\n continue;\n }\n throw error;\n }\n }\n\n if (plan.statements.length > 0 || plan.warnings.length > 0) {\n const migrationSql = renderMigrationSql(plan, {\n title: \"Syncore automatic schema reconciliation\"\n });\n await this.options.driver.run(\n `INSERT OR REPLACE INTO \"_syncore_migrations\" (id, applied_at, sql) VALUES (?, ?, ?)`,\n [nextSnapshot.hash, Date.now(), migrationSql]\n );\n }\n\n await this.options.driver.run(\n `INSERT INTO \"_syncore_schema_state\" (id, schema_hash, schema_json, updated_at)\n VALUES ('current', ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET schema_hash = excluded.schema_hash, schema_json = excluded.schema_json, updated_at = excluded.updated_at`,\n [nextSnapshot.hash, stableStringify(nextSnapshot), Date.now()]\n );\n\n for (const tableName of this.options.schema.tableNames()) {\n const table = this.getTableDefinition(tableName);\n for (const searchIndex of table.searchIndexes) {\n const searchKey = `${tableName}:${searchIndex.name}`;\n try {\n await this.options.driver.exec(\n renderCreateSearchIndexStatement(tableName, searchIndex)\n );\n this.disabledSearchIndexes.delete(searchKey);\n } catch {\n const alreadyDisabled = this.disabledSearchIndexes.has(searchKey);\n this.disabledSearchIndexes.add(searchKey);\n if (!alreadyDisabled) {\n this.emitDevtools({\n type: \"log\",\n runtimeId: this.runtimeId,\n level: \"warn\",\n message: `FTS5 unavailable for ${searchKey}; falling back to LIKE search.`,\n timestamp: Date.now()\n });\n }\n }\n }\n }\n }\n\n private async scheduleJob(\n runAt: number,\n reference: FunctionReference<\"mutation\" | \"action\", unknown, unknown>,\n args: JsonObject,\n misfirePolicy: MisfirePolicy\n ): Promise<string> {\n const id = generateId();\n const now = Date.now();\n await this.options.driver.run(\n `INSERT INTO \"_scheduled_functions\"\n (id, function_name, function_kind, args_json, status, run_at, created_at, updated_at, recurring_name, schedule_json, timezone, misfire_policy, last_run_at, window_ms)\n VALUES (?, ?, ?, ?, 'scheduled', ?, ?, ?, NULL, NULL, NULL, ?, NULL, ?)`,\n [\n id,\n reference.name,\n reference.kind,\n stableStringify(args),\n runAt,\n now,\n now,\n misfirePolicy.type,\n misfirePolicy.type === \"windowed\" ? misfirePolicy.windowMs : null\n ]\n );\n return id;\n }\n\n private async syncRecurringJobs(): Promise<void> {\n for (const job of this.recurringJobs) {\n const id = `recurring:${job.name}`;\n const existing = await this.options.driver.get<ScheduledJobRow>(\n `SELECT * FROM \"_scheduled_functions\" WHERE id = ?`,\n [id]\n );\n if (existing) {\n continue;\n }\n const nextRunAt = computeNextRun(job.schedule, Date.now());\n await this.options.driver.run(\n `INSERT INTO \"_scheduled_functions\"\n (id, function_name, function_kind, args_json, status, run_at, created_at, updated_at, recurring_name, schedule_json, timezone, misfire_policy, last_run_at, window_ms)\n VALUES (?, ?, ?, ?, 'scheduled', ?, ?, ?, ?, ?, ?, ?, NULL, ?)`,\n [\n id,\n job.function.name,\n job.function.kind,\n stableStringify(job.args),\n nextRunAt,\n Date.now(),\n Date.now(),\n job.name,\n stableStringify(job.schedule),\n \"timezone\" in job.schedule ? (job.schedule.timezone ?? null) : null,\n job.misfirePolicy.type,\n job.misfirePolicy.type === \"windowed\"\n ? job.misfirePolicy.windowMs\n : null\n ]\n );\n }\n }\n\n private async processDueJobs(): Promise<void> {\n const now = Date.now();\n const dueJobs = await this.options.driver.all<ScheduledJobRow>(\n `SELECT * FROM \"_scheduled_functions\" WHERE status = 'scheduled' AND run_at <= ? ORDER BY run_at ASC`,\n [now]\n );\n const executedJobIds: string[] = [];\n\n for (const job of dueJobs) {\n const misfirePolicy = parseMisfirePolicy(\n job.misfire_policy,\n job.window_ms\n );\n if (!shouldRunMissedJob(job.run_at, now, misfirePolicy)) {\n await this.advanceOrFinalizeJob(job, \"skipped\", now);\n continue;\n }\n\n try {\n if (job.function_kind === \"mutation\") {\n await this.runMutation(\n { kind: \"mutation\", name: job.function_name },\n JSON.parse(job.args_json) as JsonObject\n );\n } else {\n await this.runAction(\n { kind: \"action\", name: job.function_name },\n JSON.parse(job.args_json) as JsonObject\n );\n }\n executedJobIds.push(job.id);\n await this.advanceOrFinalizeJob(job, \"completed\", now);\n } catch (error) {\n await this.options.driver.run(\n `UPDATE \"_scheduled_functions\" SET status = 'failed', updated_at = ? WHERE id = ?`,\n [Date.now(), job.id]\n );\n this.emitDevtools({\n type: \"log\",\n runtimeId: this.runtimeId,\n level: \"error\",\n message: `Scheduled job ${job.id} failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n timestamp: Date.now()\n });\n }\n }\n\n if (executedJobIds.length > 0) {\n this.emitDevtools({\n type: \"scheduler.tick\",\n runtimeId: this.runtimeId,\n executedJobIds,\n timestamp: Date.now()\n });\n }\n }\n\n private async advanceOrFinalizeJob(\n job: ScheduledJobRow,\n terminalStatus: ScheduledJobRow[\"status\"],\n executedAt: number\n ): Promise<void> {\n if (!job.recurring_name || !job.schedule_json) {\n await this.options.driver.run(\n `UPDATE \"_scheduled_functions\" SET status = ?, updated_at = ?, last_run_at = ? WHERE id = ?`,\n [terminalStatus, executedAt, executedAt, job.id]\n );\n return;\n }\n\n const schedule = JSON.parse(job.schedule_json) as RecurringSchedule;\n const nextRunAt = computeNextRun(schedule, executedAt + 1);\n await this.options.driver.run(\n `UPDATE \"_scheduled_functions\"\n SET status = 'scheduled', run_at = ?, updated_at = ?, last_run_at = ?\n WHERE id = ?`,\n [nextRunAt, executedAt, executedAt, job.id]\n );\n }\n\n private async refreshInvalidatedQueries(\n changedTables: Set<string>,\n mutationId: string\n ): Promise<void> {\n for (const query of this.activeQueries.values()) {\n const needsRefresh = [...changedTables].some((tableName) =>\n query.dependencyKeys.has(`table:${tableName}`)\n );\n if (!needsRefresh) {\n continue;\n }\n this.emitDevtools({\n type: \"query.invalidated\",\n runtimeId: this.runtimeId,\n queryId: query.id,\n reason: `Mutation ${mutationId} changed ${[...changedTables].join(\", \")}`,\n timestamp: Date.now()\n });\n await this.rerunActiveQuery(query);\n }\n }\n\n private async rerunActiveQuery(record: ActiveQueryRecord): Promise<void> {\n record.dependencyKeys.clear();\n try {\n const result = await this.runQuery(\n { kind: \"query\", name: record.functionName },\n record.args\n );\n record.lastResult = result;\n record.lastError = undefined;\n record.lastRunAt = Date.now();\n const dependencies = await this.collectQueryDependencies(\n record.functionName,\n record.args\n );\n record.dependencyKeys = dependencies;\n } catch (error) {\n record.lastError = error as Error;\n }\n for (const listener of record.listeners) {\n listener();\n }\n }\n\n private async collectQueryDependencies(\n functionName: string,\n args: JsonObject\n ): Promise<Set<DependencyKey>> {\n const definition = this.resolveFunction(\n { kind: \"query\", name: functionName },\n \"query\"\n );\n const dependencyCollector = new Set<DependencyKey>();\n await this.invokeFunction(definition, args, {\n mutationDepth: 0,\n changedTables: new Set<string>(),\n dependencyCollector\n });\n return dependencyCollector;\n }\n\n private resolveFunction<TKind extends SyncoreFunctionKind>(\n reference: FunctionReference<TKind, unknown, unknown>,\n expectedKind: TKind\n ): SyncoreFunctionDefinition<TKind, unknown, unknown, unknown> {\n const definition = this.options.functions[reference.name];\n if (!definition) {\n throw new Error(`Unknown function \"${reference.name}\".`);\n }\n if (definition.kind !== expectedKind) {\n throw new Error(\n `Function \"${reference.name}\" is a ${definition.kind}, expected ${expectedKind}.`\n );\n }\n return definition as SyncoreFunctionDefinition<\n TKind,\n unknown,\n unknown,\n unknown\n >;\n }\n\n private validateDocument(tableName: string, value: JsonObject): JsonObject {\n const validator = this.getTableDefinition(tableName).validator;\n return validator.parse(value) as JsonObject;\n }\n\n private deserializeDocument<TDocument>(\n tableName: string,\n row: DatabaseRow\n ): TDocument {\n const payload = JSON.parse(row._json) as JsonObject;\n const document = {\n ...payload,\n _id: row._id,\n _creationTime: row._creationTime\n };\n this.getTableDefinition(tableName).validator.parse(payload);\n return document as TDocument;\n }\n\n private async syncSearchIndexes(\n tableName: string,\n row: DatabaseRow\n ): Promise<void> {\n const table = this.getTableDefinition(tableName);\n if (table.searchIndexes.length === 0) {\n return;\n }\n const payload = JSON.parse(row._json) as JsonObject;\n for (const searchIndex of table.searchIndexes) {\n if (this.disabledSearchIndexes.has(`${tableName}:${searchIndex.name}`)) {\n continue;\n }\n await this.options.driver.run(\n `DELETE FROM ${quoteIdentifier(searchIndexTableName(tableName, searchIndex.name))} WHERE _id = ?`,\n [row._id]\n );\n await this.options.driver.run(\n `INSERT INTO ${quoteIdentifier(\n searchIndexTableName(tableName, searchIndex.name)\n )} (_id, search_value) VALUES (?, ?)`,\n [row._id, toSearchValue(payload[searchIndex.searchField])]\n );\n }\n }\n\n private async removeSearchIndexes(\n tableName: string,\n id: string\n ): Promise<void> {\n const table = this.getTableDefinition(tableName);\n for (const searchIndex of table.searchIndexes) {\n if (this.disabledSearchIndexes.has(`${tableName}:${searchIndex.name}`)) {\n continue;\n }\n await this.options.driver.run(\n `DELETE FROM ${quoteIdentifier(searchIndexTableName(tableName, searchIndex.name))} WHERE _id = ?`,\n [id]\n );\n }\n }\n\n private renderExpression(\n tableAlias: string,\n expression: QueryExpression,\n params: unknown[]\n ): string {\n if (expression.type === \"condition\") {\n return this.renderCondition(tableAlias, expression.condition, params);\n }\n const separator = expression.type === \"and\" ? \" AND \" : \" OR \";\n return `(${expression.expressions\n .map((child) => this.renderExpression(tableAlias, child, params))\n .join(separator)})`;\n }\n\n private renderCondition(\n tableAlias: string,\n condition: QueryCondition,\n params: unknown[]\n ): string {\n params.push(condition.value);\n return `${fieldExpression(tableAlias, condition.field)} ${condition.operator} ?`;\n }\n\n private createActiveQueryKey(name: string, args: JsonObject): string {\n return `${name}:${stableStringify(args)}`;\n }\n\n private emitDevtools(event: SyncoreDevtoolsEvent): void {\n this.recentEvents.unshift(event);\n this.recentEvents.splice(24);\n this.options.devtools?.emit(event);\n }\n\n private createPluginContext(): SyncoreExperimentalPluginContext<TSchema> {\n return {\n runtimeId: this.runtimeId,\n platform: this.platform,\n schema: this.options.schema,\n driver: this.options.driver,\n storage: this.options.storage,\n ...(this.options.scheduler ? { scheduler: this.options.scheduler } : {}),\n ...(this.options.devtools ? { devtools: this.options.devtools } : {}),\n emitDevtools: (event) => {\n this.emitDevtools(event);\n }\n };\n }\n\n private buildCapabilities(): SyncoreCapabilities {\n const capabilities: SyncoreCapabilities = {\n ...(this.options.capabilities ?? {})\n };\n\n for (const plugin of this.experimentalPlugins) {\n if (!plugin.capabilities) {\n continue;\n }\n const contributed =\n typeof plugin.capabilities === \"function\"\n ? plugin.capabilities(this.createPluginContext())\n : plugin.capabilities;\n if (!contributed) {\n continue;\n }\n Object.assign(capabilities, contributed);\n }\n\n return capabilities;\n }\n\n private async runPluginHook(hook: \"onStart\" | \"onStop\"): Promise<void> {\n const context = this.createPluginContext();\n for (const plugin of this.experimentalPlugins) {\n const handler = plugin[hook];\n if (!handler) {\n continue;\n }\n await handler(context);\n }\n }\n\n private findSearchIndexKeyForStatement(statement: string): string | null {\n for (const tableName of this.options.schema.tableNames()) {\n const table = this.getTableDefinition(tableName);\n for (const searchIndex of table.searchIndexes) {\n if (\n statement === renderCreateSearchIndexStatement(tableName, searchIndex)\n ) {\n return `${tableName}:${searchIndex.name}`;\n }\n }\n }\n return null;\n }\n\n private getTableDefinition(\n tableName: string\n ): TableDefinition<Validator<unknown>> {\n return this.options.schema.getTable(\n tableName as TableNames<TSchema>\n ) as TableDefinition<Validator<unknown>>;\n }\n}\n\nfunction fieldExpression(tableAlias: string, field: string): string {\n const prefix = tableAlias ? `${tableAlias}.` : \"\";\n return `json_extract(${prefix}_json, '$.${field}')`;\n}\n\nfunction quoteIdentifier(identifier: string): string {\n return `\"${identifier.replaceAll('\"', '\"\"')}\"`;\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortValue(value));\n}\n\nfunction sortValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortValue);\n }\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, nested]) => [key, sortValue(nested)])\n );\n }\n return value;\n}\n\nfunction omitSystemFields<TDocument extends object>(\n document: TDocument\n): JsonObject {\n const clone = { ...(document as Record<string, unknown>) };\n delete clone._id;\n delete clone._creationTime;\n return clone;\n}\n\nfunction toSearchValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value === null || value === undefined) {\n return \"\";\n }\n if (\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"bigint\"\n ) {\n return String(value);\n }\n return stableStringify(value);\n}\n\nfunction parseMisfirePolicy(\n type: string,\n windowMs: number | null\n): MisfirePolicy {\n if (type === \"windowed\") {\n return { type, windowMs: windowMs ?? 0 };\n }\n if (type === \"skip\" || type === \"run_once_if_missed\") {\n return { type };\n }\n return { type: \"catch_up\" };\n}\n\nfunction shouldRunMissedJob(\n scheduledAt: number,\n now: number,\n policy: MisfirePolicy\n): boolean {\n if (scheduledAt >= now) {\n return true;\n }\n switch (policy.type) {\n case \"catch_up\":\n return true;\n case \"run_once_if_missed\":\n return true;\n case \"skip\":\n return false;\n case \"windowed\":\n return now - scheduledAt <= policy.windowMs;\n }\n}\n\nfunction computeNextRun(\n schedule: RecurringSchedule,\n fromTimestamp: number\n): number {\n switch (schedule.type) {\n case \"interval\":\n return fromTimestamp + intervalToMs(schedule);\n case \"daily\":\n return nextDailyOccurrence(fromTimestamp, schedule);\n case \"weekly\":\n return nextWeeklyOccurrence(fromTimestamp, schedule);\n }\n}\n\nfunction intervalToMs(schedule: {\n seconds?: number;\n minutes?: number;\n hours?: number;\n}): number {\n if (schedule.seconds) {\n return schedule.seconds * 1000;\n }\n if (schedule.minutes) {\n return schedule.minutes * 60 * 1000;\n }\n return (schedule.hours ?? 1) * 60 * 60 * 1000;\n}\n\nfunction nextDailyOccurrence(\n fromTimestamp: number,\n schedule: Extract<RecurringSchedule, { type: \"daily\" }>\n): number {\n const timezone = schedule.timezone ?? \"UTC\";\n const now = new Date(fromTimestamp);\n const zonedNow = toZonedTime(now, timezone);\n const zoned = new Date(zonedNow.getTime());\n zoned.setHours(schedule.hour, schedule.minute, 0, 0);\n if (zoned.getTime() <= zonedNow.getTime()) {\n zoned.setDate(zoned.getDate() + 1);\n }\n return fromZonedTime(zoned, timezone).getTime();\n}\n\nfunction nextWeeklyOccurrence(\n fromTimestamp: number,\n schedule: Extract<RecurringSchedule, { type: \"weekly\" }>\n): number {\n const timezone = schedule.timezone ?? \"UTC\";\n const now = new Date(fromTimestamp);\n const zonedNow = toZonedTime(now, timezone);\n const targetDay = [\n \"sunday\",\n \"monday\",\n \"tuesday\",\n \"wednesday\",\n \"thursday\",\n \"friday\",\n \"saturday\"\n ].indexOf(schedule.dayOfWeek);\n const zoned = new Date(zonedNow.getTime());\n const delta = (targetDay - zonedNow.getDay() + 7) % 7;\n zoned.setDate(zoned.getDate() + delta);\n zoned.setHours(schedule.hour, schedule.minute, 0, 0);\n if (zoned.getTime() <= zonedNow.getTime()) {\n zoned.setDate(zoned.getDate() + 7);\n }\n return fromZonedTime(zoned, timezone).getTime();\n}\n\nexport function createFunctionReference<\n TKind extends SyncoreFunctionKind,\n TArgs = Record<never, never>,\n TResult = unknown\n>(kind: TKind, name: string): FunctionReference<TKind, TArgs, TResult> {\n return { kind, name };\n}\n\n/**\n * Create a typed function reference from a concrete Syncore function definition.\n *\n * Generated code uses this helper to preserve function arg and result inference.\n */\nexport function createFunctionReferenceFor<\n TDefinition extends {\n kind: SyncoreFunctionKind;\n argsValidator: Validator<unknown>;\n returnsValidator?: Validator<unknown>;\n }\n>(\n kind: FunctionKindFromDefinition<TDefinition>,\n name: string\n): FunctionReference<\n FunctionKindFromDefinition<TDefinition>,\n FunctionArgsFromDefinition<TDefinition>,\n FunctionResultFromDefinition<TDefinition>\n> {\n return { kind, name };\n}\n\nfunction normalizeOptionalArgs<TArgs>(\n args: [] | [TArgs] | readonly unknown[]\n): TArgs {\n return (args[0] ?? {}) as TArgs;\n}\n\nfunction splitSchedulerArgs(\n args: readonly unknown[]\n): [JsonObject, MisfirePolicy | undefined] {\n if (args.length === 0) {\n return [{}, undefined];\n }\n if (args.length === 1) {\n const [first] = args;\n if (isMisfirePolicy(first)) {\n return [{}, first];\n }\n return [(first ?? {}) as JsonObject, undefined];\n }\n return [(args[0] ?? {}) as JsonObject, args[1] as MisfirePolicy | undefined];\n}\n\nfunction isMisfirePolicy(value: unknown): value is MisfirePolicy {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"type\" in value &&\n typeof (value as { type?: unknown }).type === \"string\"\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ //#region ../devtools-protocol/src/index.d.ts
2
+ type SyncoreDevtoolsEvent = {
3
+ type: "runtime.connected";
4
+ runtimeId: string;
5
+ platform: string;
6
+ timestamp: number;
7
+ } | {
8
+ type: "runtime.disconnected";
9
+ runtimeId: string;
10
+ timestamp: number;
11
+ } | {
12
+ type: "query.executed";
13
+ runtimeId: string;
14
+ queryId: string;
15
+ functionName: string;
16
+ dependencies: string[];
17
+ durationMs: number;
18
+ timestamp: number;
19
+ } | {
20
+ type: "query.invalidated";
21
+ runtimeId: string;
22
+ queryId: string;
23
+ reason: string;
24
+ timestamp: number;
25
+ } | {
26
+ type: "mutation.committed";
27
+ runtimeId: string;
28
+ mutationId: string;
29
+ functionName: string;
30
+ changedTables: string[];
31
+ durationMs: number;
32
+ timestamp: number;
33
+ } | {
34
+ type: "action.completed";
35
+ runtimeId: string;
36
+ actionId: string;
37
+ functionName: string;
38
+ durationMs: number;
39
+ timestamp: number;
40
+ error?: string;
41
+ } | {
42
+ type: "scheduler.tick";
43
+ runtimeId: string;
44
+ executedJobIds: string[];
45
+ timestamp: number;
46
+ } | {
47
+ type: "storage.updated";
48
+ runtimeId: string;
49
+ storageId: string;
50
+ operation: "put" | "delete";
51
+ timestamp: number;
52
+ } | {
53
+ type: "log";
54
+ runtimeId: string;
55
+ level: "info" | "warn" | "error";
56
+ message: string;
57
+ timestamp: number;
58
+ };
59
+ interface SyncoreDevtoolsSnapshot {
60
+ runtimeId: string;
61
+ platform: string;
62
+ appName?: string;
63
+ origin?: string;
64
+ sessionLabel?: string;
65
+ connectedAt: number;
66
+ activeQueries: Array<{
67
+ id: string;
68
+ functionName: string;
69
+ dependencyKeys: string[];
70
+ lastRunAt: number;
71
+ }>;
72
+ pendingJobs: Array<{
73
+ id: string;
74
+ functionName: string;
75
+ runAt: number;
76
+ status: string;
77
+ }>;
78
+ recentEvents: SyncoreDevtoolsEvent[];
79
+ }
80
+ type SyncoreRequestPayload = {
81
+ kind: "fn.list";
82
+ } | {
83
+ kind: "fn.run";
84
+ functionName: string;
85
+ functionType: "query" | "mutation" | "action";
86
+ args: Record<string, unknown>;
87
+ } | {
88
+ kind: "data.query";
89
+ table: string;
90
+ filters?: DataFilter[];
91
+ limit?: number;
92
+ cursor?: string;
93
+ } | {
94
+ kind: "data.insert";
95
+ table: string;
96
+ document: Record<string, unknown>;
97
+ } | {
98
+ kind: "data.patch";
99
+ table: string;
100
+ id: string;
101
+ fields: Record<string, unknown>;
102
+ } | {
103
+ kind: "data.delete";
104
+ table: string;
105
+ id: string;
106
+ } | {
107
+ kind: "schema.get";
108
+ } | {
109
+ kind: "sql.execute";
110
+ query: string;
111
+ } | {
112
+ kind: "scheduler.list";
113
+ } | {
114
+ kind: "scheduler.cancel";
115
+ jobId: string;
116
+ };
117
+ interface DataFilter {
118
+ field: string;
119
+ operator: "eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "contains" | "startsWith";
120
+ value: unknown;
121
+ }
122
+ type SyncoreResponsePayload = {
123
+ kind: "fn.list.result";
124
+ functions: FunctionDefinition[];
125
+ } | {
126
+ kind: "fn.run.result";
127
+ result?: unknown;
128
+ error?: string;
129
+ durationMs: number;
130
+ } | {
131
+ kind: "data.result";
132
+ rows: Record<string, unknown>[];
133
+ totalCount: number;
134
+ cursor?: string;
135
+ } | {
136
+ kind: "data.mutate.result";
137
+ success: boolean;
138
+ id?: string;
139
+ error?: string;
140
+ } | {
141
+ kind: "schema.result";
142
+ tables: TableSchema[];
143
+ } | {
144
+ kind: "sql.result";
145
+ columns: string[];
146
+ rows: unknown[][];
147
+ rowsAffected: number;
148
+ error?: string;
149
+ } | {
150
+ kind: "scheduler.list.result";
151
+ jobs: SchedulerJob[];
152
+ } | {
153
+ kind: "scheduler.cancel.result";
154
+ success: boolean;
155
+ error?: string;
156
+ } | {
157
+ kind: "error";
158
+ message: string;
159
+ };
160
+ interface FunctionDefinition {
161
+ name: string;
162
+ type: "query" | "mutation" | "action";
163
+ file: string;
164
+ /** Argument validator schema (JSON Schema-like), if available */
165
+ args?: Record<string, unknown>;
166
+ /** Return validator schema, if available */
167
+ returns?: Record<string, unknown>;
168
+ }
169
+ interface TableSchema {
170
+ name: string;
171
+ fields: TableField[];
172
+ indexes: TableIndex[];
173
+ documentCount: number;
174
+ }
175
+ interface TableField {
176
+ name: string;
177
+ type: string;
178
+ optional: boolean;
179
+ }
180
+ interface TableIndex {
181
+ name: string;
182
+ fields: string[];
183
+ unique: boolean;
184
+ }
185
+ interface SchedulerJob {
186
+ id: string;
187
+ functionName: string;
188
+ args: Record<string, unknown>;
189
+ scheduledAt: number;
190
+ runAt: number;
191
+ status: "pending" | "running" | "completed" | "failed" | "cancelled";
192
+ completedAt?: number;
193
+ result?: unknown;
194
+ error?: string;
195
+ durationMs?: number;
196
+ /** If set, this is a recurring cron job */
197
+ cronSchedule?: string;
198
+ }
199
+ //#endregion
200
+ export { SyncoreDevtoolsEvent, SyncoreDevtoolsSnapshot, SyncoreRequestPayload, SyncoreResponsePayload };
201
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../../devtools-protocol/src/index.ts"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { SyncoreExpoProvider, SyncoreExpoProviderProps } from "./platform-expo/src/react.js";
2
+ export { SyncoreExpoProvider, type SyncoreExpoProviderProps };
@@ -0,0 +1,2 @@
1
+ import { SyncoreExpoProvider } from "./platform-expo/src/react.js";
2
+ export { SyncoreExpoProvider };
package/dist/expo.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import { CreateExpoRuntimeOptions, ExpoFileStorageAdapter, ExpoSqliteDriver, ExpoSyncoreBootstrap, ExpoSyncoreSchema, createExpoSyncoreBootstrap, createExpoSyncoreClient, createExpoSyncoreRuntime } from "./platform-expo/src/index.js";
2
+ export { CreateExpoRuntimeOptions, ExpoFileStorageAdapter, ExpoSqliteDriver, ExpoSyncoreBootstrap, ExpoSyncoreSchema, createExpoSyncoreBootstrap, createExpoSyncoreClient, createExpoSyncoreRuntime };
package/dist/expo.js ADDED
@@ -0,0 +1,2 @@
1
+ import { ExpoFileStorageAdapter, ExpoSqliteDriver, createExpoSyncoreBootstrap, createExpoSyncoreClient, createExpoSyncoreRuntime } from "./platform-expo/src/index.js";
2
+ export { ExpoFileStorageAdapter, ExpoSqliteDriver, createExpoSyncoreBootstrap, createExpoSyncoreClient, createExpoSyncoreRuntime };
@@ -0,0 +1,7 @@
1
+ import { AnyValidator, ArrayValidator, BooleanValidator, IdValidator, Infer, LiteralValidator, NullValidator, NumberValidator, ObjectValidator, ObjectValidatorShape, OptionalValidator, StringValidator, Validator, ValidatorBuilderApi, ValidatorDescription, ValidatorKind, ValidatorMap, describeValidator, ensureObjectValidator, v } from "./schema/src/validators.js";
2
+ import { AnyTableDefinition, IndexDefinition, InferDocument, InferTableInput, SearchIndexDefinition, SyncoreSchema, SyncoreSchemaDefinition, TableDefinition, TableDefinitionOptions, TableDocumentSystemFields, defineSchema, defineTable } from "./schema/src/definition.js";
3
+ import { SchemaMigrationPlan, SchemaSnapshot, TableSnapshot, createSchemaSnapshot, diffSchemaSnapshots, parseSchemaSnapshot, renderCreateIndexStatement, renderCreateSearchIndexStatement, renderCreateTableStatement, renderMigrationSql, searchIndexTableName } from "./schema/src/planner.js";
4
+ import { CronJobs, EmptyArgs, FunctionArgs, FunctionArgsFromDefinition, FunctionConfig, FunctionKindFromDefinition, FunctionReference, FunctionReferenceFor, FunctionResult, FunctionResultFromDefinition, InferArgs, MisfirePolicy, RecurringDailySchedule, RecurringIntervalSchedule, RecurringJobDefinition, RecurringSchedule, RecurringWeeklySchedule, SyncoreFunctionDefinition, SyncoreFunctionKind, action, cronJobs, mutation, query } from "./core/src/runtime/functions.js";
5
+ import { ActionCtx, AnySyncoreSchema, ComparisonOperator, DevtoolsSink, DocumentForTable, FilterBuilder, IndexRangeBuilder, InsertValueForTable, JsonObject, MutationCtx, PaginationOptions, PaginationResult, QueryBuilder, QueryCondition, QueryCtx, QueryExpression, RegisteredSyncoreFunction, RegisteredSyncoreHandler, RunResult, SchedulerApi, SchedulerOptions, SearchIndexBuilder, SearchQuery, StorageObject, StorageWriteInput, SyncoreCapabilities, SyncoreClient, SyncoreDatabaseReader, SyncoreDatabaseWriter, SyncoreExperimentalPlugin, SyncoreExperimentalPluginContext, SyncoreFunctionRegistry, SyncoreRuntime, SyncoreRuntimeOptions, SyncoreSqlDriver, SyncoreStorageAdapter, SyncoreStorageApi, SyncoreWatch, TableNames, createFunctionReference, createFunctionReferenceFor } from "./core/src/runtime/runtime.js";
6
+ import { generateId } from "./core/src/runtime/id.js";
7
+ export { type ActionCtx, type AnySyncoreSchema, AnyTableDefinition, AnyValidator, ArrayValidator, BooleanValidator, type ComparisonOperator, type CronJobs, type DevtoolsSink, type DocumentForTable, type EmptyArgs, type FilterBuilder, type FunctionArgs, type FunctionArgsFromDefinition, type FunctionConfig, type FunctionKindFromDefinition, type FunctionReference, type FunctionReferenceFor, type FunctionResult, type FunctionResultFromDefinition, IdValidator, IndexDefinition, type IndexRangeBuilder, Infer, type InferArgs, InferDocument, InferTableInput, type InsertValueForTable, type JsonObject, LiteralValidator, type MisfirePolicy, type MutationCtx, NullValidator, NumberValidator, ObjectValidator, ObjectValidatorShape, OptionalValidator, type PaginationOptions, type PaginationResult, type QueryBuilder, type QueryCondition, type QueryCtx, type QueryExpression, type RecurringDailySchedule, type RecurringIntervalSchedule, type RecurringJobDefinition, type RecurringSchedule, type RecurringWeeklySchedule, type RegisteredSyncoreFunction, type RegisteredSyncoreHandler, type RunResult, type SchedulerApi, type SchedulerOptions, SchemaMigrationPlan, SchemaSnapshot, type SearchIndexBuilder, SearchIndexDefinition, type SearchQuery, type StorageObject, type StorageWriteInput, StringValidator, type SyncoreCapabilities, type SyncoreClient, type SyncoreDatabaseReader, type SyncoreDatabaseWriter, type SyncoreExperimentalPlugin, type SyncoreExperimentalPluginContext, type SyncoreFunctionDefinition, type SyncoreFunctionKind, type SyncoreFunctionRegistry, SyncoreRuntime, type SyncoreRuntimeOptions, SyncoreSchema, SyncoreSchemaDefinition, type SyncoreSqlDriver, type SyncoreStorageAdapter, type SyncoreStorageApi, type SyncoreWatch, TableDefinition, TableDefinitionOptions, TableDocumentSystemFields, type TableNames, TableSnapshot, Validator, ValidatorBuilderApi, ValidatorDescription, ValidatorKind, ValidatorMap, action, createFunctionReference, createFunctionReferenceFor, createSchemaSnapshot, cronJobs, defineSchema, defineTable, describeValidator, diffSchemaSnapshots, ensureObjectValidator, generateId, mutation, parseSchemaSnapshot, query, renderCreateIndexStatement, renderCreateSearchIndexStatement, renderCreateTableStatement, renderMigrationSql, searchIndexTableName, v };
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ import { AnyValidator, ArrayValidator, BooleanValidator, IdValidator, LiteralValidator, NullValidator, NumberValidator, ObjectValidator, OptionalValidator, StringValidator, describeValidator, ensureObjectValidator, v } from "./schema/src/validators.js";
2
+ import { SyncoreSchema, TableDefinition, defineSchema, defineTable } from "./schema/src/definition.js";
3
+ import { createSchemaSnapshot, diffSchemaSnapshots, parseSchemaSnapshot, renderCreateIndexStatement, renderCreateSearchIndexStatement, renderCreateTableStatement, renderMigrationSql, searchIndexTableName } from "./schema/src/planner.js";
4
+ import { generateId } from "./core/src/runtime/id.js";
5
+ import { SyncoreRuntime, createFunctionReference, createFunctionReferenceFor } from "./core/src/runtime/runtime.js";
6
+ import { action, cronJobs, mutation, query } from "./core/src/runtime/functions.js";
7
+ import "./core/src/index.js";
8
+ export { AnyValidator, ArrayValidator, BooleanValidator, IdValidator, LiteralValidator, NullValidator, NumberValidator, ObjectValidator, OptionalValidator, StringValidator, SyncoreRuntime, SyncoreSchema, TableDefinition, action, createFunctionReference, createFunctionReferenceFor, createSchemaSnapshot, cronJobs, defineSchema, defineTable, describeValidator, diffSchemaSnapshots, ensureObjectValidator, generateId, mutation, parseSchemaSnapshot, query, renderCreateIndexStatement, renderCreateSearchIndexStatement, renderCreateTableStatement, renderMigrationSql, searchIndexTableName, v };
@@ -0,0 +1,17 @@
1
+ //#region ../next/src/config.d.ts
2
+ /**
3
+ * Wrap a Next config with the settings Syncore needs for SQL.js and worker assets.
4
+ *
5
+ * This enables async WebAssembly support and, for non-exported apps, adds a
6
+ * long-lived cache header for `sql-wasm.wasm`. It also configures webpack to
7
+ * bundle the syncore worker as a separate entry point.
8
+ */
9
+ declare function withSyncoreNext<TConfig extends Record<string, unknown>>(config: TConfig): TConfig;
10
+ declare function getSyncoreWorkerUrl(): string;
11
+ /**
12
+ * Create the default worker URL used by the Next integration.
13
+ */
14
+ declare function createSyncoreNextWorkerUrl(relativePath?: string): URL;
15
+ //#endregion
16
+ export { createSyncoreNextWorkerUrl, getSyncoreWorkerUrl, withSyncoreNext };
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","names":[],"sources":["../../../../next/src/config.ts"],"mappings":";;AAaA;;;;;;iBAAgB,eAAA,iBAAgC,MAAA,kBAAA,CAC9C,MAAA,EAAQ,OAAA,GACP,OAAA;AAAA,iBA4Fa,mBAAA,CAAA;;;;iBAOA,0BAAA,CACd,YAAA,YAAoC,GAAA"}
@@ -0,0 +1,73 @@
1
+ //#region ../next/src/config.ts
2
+ const WORKER_NAME = "syncore-worker";
3
+ function joinAppWorkerPath(dir) {
4
+ return `${dir.replace(/[\\/]$/, "")}/app/syncore.worker.js`;
5
+ }
6
+ /**
7
+ * Wrap a Next config with the settings Syncore needs for SQL.js and worker assets.
8
+ *
9
+ * This enables async WebAssembly support and, for non-exported apps, adds a
10
+ * long-lived cache header for `sql-wasm.wasm`. It also configures webpack to
11
+ * bundle the syncore worker as a separate entry point.
12
+ */
13
+ function withSyncoreNext(config) {
14
+ const baseConfig = config;
15
+ const isStaticExport = baseConfig.output === "export";
16
+ const headers = baseConfig.headers ?? [];
17
+ const userWebpack = typeof baseConfig.webpack === "function" ? baseConfig.webpack : void 0;
18
+ const userHeaders = typeof baseConfig.headers === "function" ? baseConfig.headers : void 0;
19
+ const syncoreHeaders = {
20
+ source: "/sql-wasm.wasm",
21
+ headers: [{
22
+ key: "Cache-Control",
23
+ value: "public, max-age=31536000, immutable"
24
+ }]
25
+ };
26
+ const nextConfig = {
27
+ ...config,
28
+ webpack(currentConfig, context) {
29
+ const nextConfig = { ...currentConfig };
30
+ nextConfig.experiments = {
31
+ ...nextConfig.experiments ?? {},
32
+ asyncWebAssembly: true
33
+ };
34
+ const ctx = context;
35
+ if (isStaticExport && ctx && !ctx.dev && !ctx.isServer && ctx.nextRuntime !== "edge") {
36
+ const entry = nextConfig.entry ?? (async () => ({}));
37
+ const workerPath = joinAppWorkerPath(ctx.dir);
38
+ nextConfig.entry = async () => {
39
+ const entries = await entry();
40
+ const mainAppEntry = entries["main-app"];
41
+ return {
42
+ ...entries,
43
+ ...mainAppEntry && !entries.main ? { main: mainAppEntry } : {},
44
+ [WORKER_NAME]: {
45
+ import: workerPath,
46
+ filename: "static/chunks/[name].js"
47
+ }
48
+ };
49
+ };
50
+ }
51
+ if (userWebpack) return userWebpack(nextConfig, context);
52
+ return nextConfig;
53
+ }
54
+ };
55
+ if (!isStaticExport || userHeaders) nextConfig.headers = async () => {
56
+ const resolvedHeaders = userHeaders ? await userHeaders() : headers;
57
+ return isStaticExport ? resolvedHeaders : [...resolvedHeaders, syncoreHeaders];
58
+ };
59
+ return nextConfig;
60
+ }
61
+ function getSyncoreWorkerUrl() {
62
+ return `/_next/static/chunks/${WORKER_NAME}.js`;
63
+ }
64
+ /**
65
+ * Create the default worker URL used by the Next integration.
66
+ */
67
+ function createSyncoreNextWorkerUrl(relativePath = "./syncore.worker.js") {
68
+ return new URL(relativePath, import.meta.url);
69
+ }
70
+ //#endregion
71
+ export { createSyncoreNextWorkerUrl, getSyncoreWorkerUrl, withSyncoreNext };
72
+
73
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","names":[],"sources":["../../../../next/src/config.ts"],"sourcesContent":["const WORKER_NAME = \"syncore-worker\";\n\nfunction joinAppWorkerPath(dir: string) {\n return `${dir.replace(/[\\\\/]$/, \"\")}/app/syncore.worker.js`;\n}\n\n/**\n * Wrap a Next config with the settings Syncore needs for SQL.js and worker assets.\n *\n * This enables async WebAssembly support and, for non-exported apps, adds a\n * long-lived cache header for `sql-wasm.wasm`. It also configures webpack to\n * bundle the syncore worker as a separate entry point.\n */\nexport function withSyncoreNext<TConfig extends Record<string, unknown>>(\n config: TConfig\n): TConfig {\n const baseConfig = config as Record<string, unknown>;\n const isStaticExport = baseConfig.output === \"export\";\n const headers = (baseConfig.headers ?? []) as Array<Record<string, unknown>>;\n const userWebpack =\n typeof baseConfig.webpack === \"function\"\n ? (baseConfig.webpack as (\n config: Record<string, unknown>,\n context: unknown\n ) => Record<string, unknown>)\n : undefined;\n const userHeaders =\n typeof baseConfig.headers === \"function\"\n ? (baseConfig.headers as () =>\n | Array<Record<string, unknown>>\n | Promise<Array<Record<string, unknown>>>)\n : undefined;\n const syncoreHeaders = {\n source: \"/sql-wasm.wasm\",\n headers: [\n {\n key: \"Cache-Control\",\n value: \"public, max-age=31536000, immutable\"\n }\n ]\n };\n\n const nextConfig: Record<string, unknown> = {\n ...config,\n webpack(currentConfig: Record<string, unknown>, context: unknown) {\n const nextConfig = { ...currentConfig };\n const experiments = (nextConfig.experiments ?? {}) as Record<\n string,\n unknown\n >;\n nextConfig.experiments = {\n ...experiments,\n asyncWebAssembly: true\n };\n\n type WebpackContext = {\n dev?: boolean;\n isServer: boolean;\n nextRuntime?: string;\n dir: string;\n };\n const ctx = context as WebpackContext | undefined;\n if (\n isStaticExport &&\n ctx &&\n !ctx.dev &&\n !ctx.isServer &&\n ctx.nextRuntime !== \"edge\"\n ) {\n const entry =\n (nextConfig.entry as () => Promise<Record<string, unknown>>) ??\n (async () => ({}));\n const workerPath = joinAppWorkerPath(ctx.dir);\n nextConfig.entry = async () => {\n const entries = await entry();\n const mainAppEntry = entries[\"main-app\"];\n return {\n ...entries,\n ...(mainAppEntry && !entries.main ? { main: mainAppEntry } : {}),\n [WORKER_NAME]: {\n import: workerPath,\n filename: \"static/chunks/[name].js\"\n }\n };\n };\n }\n\n if (userWebpack) {\n return userWebpack(nextConfig, context);\n }\n\n return nextConfig;\n }\n };\n\n if (!isStaticExport || userHeaders) {\n nextConfig.headers = async () => {\n const resolvedHeaders = userHeaders ? await userHeaders() : headers;\n return isStaticExport\n ? resolvedHeaders\n : [...resolvedHeaders, syncoreHeaders];\n };\n }\n\n return nextConfig as TConfig;\n}\n\nexport function getSyncoreWorkerUrl(): string {\n return `/_next/static/chunks/${WORKER_NAME}.js`;\n}\n\n/**\n * Create the default worker URL used by the Next integration.\n */\nexport function createSyncoreNextWorkerUrl(\n relativePath = \"./syncore.worker.js\"\n) {\n return new URL(relativePath, import.meta.url);\n}\n"],"mappings":";AAAA,MAAM,cAAc;AAEpB,SAAS,kBAAkB,KAAa;AACtC,QAAO,GAAG,IAAI,QAAQ,UAAU,GAAG,CAAC;;;;;;;;;AAUtC,SAAgB,gBACd,QACS;CACT,MAAM,aAAa;CACnB,MAAM,iBAAiB,WAAW,WAAW;CAC7C,MAAM,UAAW,WAAW,WAAW,EAAE;CACzC,MAAM,cACJ,OAAO,WAAW,YAAY,aACzB,WAAW,UAIZ,KAAA;CACN,MAAM,cACJ,OAAO,WAAW,YAAY,aACzB,WAAW,UAGZ,KAAA;CACN,MAAM,iBAAiB;EACrB,QAAQ;EACR,SAAS,CACP;GACE,KAAK;GACL,OAAO;GACR,CACF;EACF;CAED,MAAM,aAAsC;EAC1C,GAAG;EACH,QAAQ,eAAwC,SAAkB;GAChE,MAAM,aAAa,EAAE,GAAG,eAAe;AAKvC,cAAW,cAAc;IACvB,GALmB,WAAW,eAAe,EAAE;IAM/C,kBAAkB;IACnB;GAQD,MAAM,MAAM;AACZ,OACE,kBACA,OACA,CAAC,IAAI,OACL,CAAC,IAAI,YACL,IAAI,gBAAgB,QACpB;IACA,MAAM,QACH,WAAW,UACX,aAAa,EAAE;IAClB,MAAM,aAAa,kBAAkB,IAAI,IAAI;AAC7C,eAAW,QAAQ,YAAY;KAC7B,MAAM,UAAU,MAAM,OAAO;KAC7B,MAAM,eAAe,QAAQ;AAC7B,YAAO;MACL,GAAG;MACH,GAAI,gBAAgB,CAAC,QAAQ,OAAO,EAAE,MAAM,cAAc,GAAG,EAAE;OAC9D,cAAc;OACb,QAAQ;OACR,UAAU;OACX;MACF;;;AAIL,OAAI,YACF,QAAO,YAAY,YAAY,QAAQ;AAGzC,UAAO;;EAEV;AAED,KAAI,CAAC,kBAAkB,YACrB,YAAW,UAAU,YAAY;EAC/B,MAAM,kBAAkB,cAAc,MAAM,aAAa,GAAG;AAC5D,SAAO,iBACH,kBACA,CAAC,GAAG,iBAAiB,eAAe;;AAI5C,QAAO;;AAGT,SAAgB,sBAA8B;AAC5C,QAAO,wBAAwB,YAAY;;;;;AAM7C,SAAgB,2BACd,eAAe,uBACf;AACA,QAAO,IAAI,IAAI,cAAc,OAAO,KAAK,IAAI"}