on-zero 0.6.14 → 0.6.16

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 (163) hide show
  1. package/dist/cjs/asyncTasks.cjs +51 -0
  2. package/dist/cjs/asyncTasks.native.js +84 -0
  3. package/dist/cjs/asyncTasks.native.js.map +1 -0
  4. package/dist/cjs/cli.cjs +8 -1
  5. package/dist/cjs/cli.native.js +8 -1
  6. package/dist/cjs/cli.native.js.map +1 -1
  7. package/dist/cjs/createSchemaFromDrizzle.cjs +4 -4
  8. package/dist/cjs/createSchemaFromDrizzle.native.js +4 -4
  9. package/dist/cjs/createSchemaFromDrizzle.native.js.map +1 -1
  10. package/dist/cjs/createZeroDirectServer.cjs +269 -0
  11. package/dist/cjs/createZeroDirectServer.native.js +287 -0
  12. package/dist/cjs/createZeroDirectServer.native.js.map +1 -0
  13. package/dist/cjs/createZeroSQLiteServer.cjs +8 -277
  14. package/dist/cjs/createZeroSQLiteServer.native.js +8 -390
  15. package/dist/cjs/createZeroSQLiteServer.native.js.map +1 -1
  16. package/dist/cjs/createZeroSQLiteServer.test.cjs +36 -9
  17. package/dist/cjs/createZeroSQLiteServer.test.native.js +37 -9
  18. package/dist/cjs/createZeroSQLiteServer.test.native.js.map +1 -1
  19. package/dist/cjs/createZeroServer.test.cjs +79 -1
  20. package/dist/cjs/createZeroServer.test.native.js +85 -1
  21. package/dist/cjs/createZeroServer.test.native.js.map +1 -1
  22. package/dist/cjs/createZeroServerCore.cjs +28 -208
  23. package/dist/cjs/createZeroServerCore.native.js +33 -218
  24. package/dist/cjs/createZeroServerCore.native.js.map +1 -1
  25. package/dist/cjs/generate.cjs +15 -5
  26. package/dist/cjs/generate.native.js +15 -5
  27. package/dist/cjs/generate.native.js.map +1 -1
  28. package/dist/cjs/generate.test.cjs +55 -0
  29. package/dist/cjs/generate.test.native.js +55 -0
  30. package/dist/cjs/generate.test.native.js.map +1 -1
  31. package/dist/cjs/helpers/createMutators.cjs +2 -2
  32. package/dist/cjs/helpers/createMutators.native.js +2 -2
  33. package/dist/cjs/helpers/createMutators.native.js.map +1 -1
  34. package/dist/cjs/index.cjs +1 -0
  35. package/dist/cjs/index.native.js +1 -0
  36. package/dist/cjs/index.native.js.map +1 -1
  37. package/dist/cjs/server.cjs +2 -1
  38. package/dist/cjs/sqliteRuntime.cjs +318 -0
  39. package/dist/cjs/sqliteRuntime.native.js +438 -0
  40. package/dist/cjs/sqliteRuntime.native.js.map +1 -0
  41. package/dist/cjs/syncHost.cjs +26 -12
  42. package/dist/cjs/syncHost.native.js +32 -16
  43. package/dist/cjs/syncHost.native.js.map +1 -1
  44. package/dist/cjs/syncHost.test.cjs +15 -4
  45. package/dist/cjs/syncHost.test.native.js +16 -4
  46. package/dist/cjs/syncHost.test.native.js.map +1 -1
  47. package/dist/cjs/vite-plugin.cjs +2 -1
  48. package/dist/cjs/vite-plugin.native.js +2 -1
  49. package/dist/cjs/vite-plugin.native.js.map +1 -1
  50. package/dist/esm/asyncTasks.mjs +26 -0
  51. package/dist/esm/asyncTasks.mjs.map +1 -0
  52. package/dist/esm/asyncTasks.native.js +56 -0
  53. package/dist/esm/asyncTasks.native.js.map +1 -0
  54. package/dist/esm/cli.mjs +8 -1
  55. package/dist/esm/cli.mjs.map +1 -1
  56. package/dist/esm/cli.native.js +8 -1
  57. package/dist/esm/cli.native.js.map +1 -1
  58. package/dist/esm/createSchemaFromDrizzle.mjs +2 -2
  59. package/dist/esm/createSchemaFromDrizzle.native.js +2 -2
  60. package/dist/esm/createZeroDirectServer.mjs +241 -0
  61. package/dist/esm/createZeroDirectServer.mjs.map +1 -0
  62. package/dist/esm/createZeroDirectServer.native.js +256 -0
  63. package/dist/esm/createZeroDirectServer.native.js.map +1 -0
  64. package/dist/esm/createZeroSQLiteServer.mjs +3 -272
  65. package/dist/esm/createZeroSQLiteServer.mjs.map +1 -1
  66. package/dist/esm/createZeroSQLiteServer.native.js +3 -385
  67. package/dist/esm/createZeroSQLiteServer.native.js.map +1 -1
  68. package/dist/esm/createZeroSQLiteServer.test.mjs +36 -9
  69. package/dist/esm/createZeroSQLiteServer.test.mjs.map +1 -1
  70. package/dist/esm/createZeroSQLiteServer.test.native.js +37 -9
  71. package/dist/esm/createZeroSQLiteServer.test.native.js.map +1 -1
  72. package/dist/esm/createZeroServer.test.mjs +80 -2
  73. package/dist/esm/createZeroServer.test.mjs.map +1 -1
  74. package/dist/esm/createZeroServer.test.native.js +86 -2
  75. package/dist/esm/createZeroServer.test.native.js.map +1 -1
  76. package/dist/esm/createZeroServerCore.mjs +26 -205
  77. package/dist/esm/createZeroServerCore.mjs.map +1 -1
  78. package/dist/esm/createZeroServerCore.native.js +32 -216
  79. package/dist/esm/createZeroServerCore.native.js.map +1 -1
  80. package/dist/esm/generate.mjs +15 -5
  81. package/dist/esm/generate.mjs.map +1 -1
  82. package/dist/esm/generate.native.js +15 -5
  83. package/dist/esm/generate.native.js.map +1 -1
  84. package/dist/esm/generate.test.mjs +55 -1
  85. package/dist/esm/generate.test.mjs.map +1 -1
  86. package/dist/esm/generate.test.native.js +55 -1
  87. package/dist/esm/generate.test.native.js.map +1 -1
  88. package/dist/esm/helpers/createMutators.mjs +2 -2
  89. package/dist/esm/helpers/createMutators.mjs.map +1 -1
  90. package/dist/esm/helpers/createMutators.native.js +2 -2
  91. package/dist/esm/helpers/createMutators.native.js.map +1 -1
  92. package/dist/esm/index.js +1 -0
  93. package/dist/esm/index.js.map +1 -1
  94. package/dist/esm/index.mjs +1 -0
  95. package/dist/esm/index.mjs.map +1 -1
  96. package/dist/esm/index.native.js +1 -0
  97. package/dist/esm/index.native.js.map +1 -1
  98. package/dist/esm/server.mjs +1 -0
  99. package/dist/esm/server.mjs.map +1 -1
  100. package/dist/esm/sqliteRuntime.mjs +289 -0
  101. package/dist/esm/sqliteRuntime.mjs.map +1 -0
  102. package/dist/esm/sqliteRuntime.native.js +406 -0
  103. package/dist/esm/sqliteRuntime.native.js.map +1 -0
  104. package/dist/esm/syncHost.mjs +24 -10
  105. package/dist/esm/syncHost.mjs.map +1 -1
  106. package/dist/esm/syncHost.native.js +30 -14
  107. package/dist/esm/syncHost.native.js.map +1 -1
  108. package/dist/esm/syncHost.test.mjs +15 -4
  109. package/dist/esm/syncHost.test.mjs.map +1 -1
  110. package/dist/esm/syncHost.test.native.js +16 -4
  111. package/dist/esm/syncHost.test.native.js.map +1 -1
  112. package/dist/esm/vite-plugin.mjs +2 -1
  113. package/dist/esm/vite-plugin.mjs.map +1 -1
  114. package/dist/esm/vite-plugin.native.js +2 -1
  115. package/dist/esm/vite-plugin.native.js.map +1 -1
  116. package/lint/ssr-guards.js +8 -7
  117. package/package.json +5 -6
  118. package/readme.md +13 -4
  119. package/src/asyncTasks.ts +33 -0
  120. package/src/cli.ts +7 -1
  121. package/src/createSchemaFromDrizzle.ts +2 -2
  122. package/src/createZeroDirectServer.ts +411 -0
  123. package/src/createZeroSQLiteServer.test.ts +28 -12
  124. package/src/createZeroSQLiteServer.ts +14 -481
  125. package/src/createZeroServer.test.ts +86 -2
  126. package/src/createZeroServerCore.ts +39 -343
  127. package/src/generate.test.ts +75 -1
  128. package/src/generate.ts +30 -4
  129. package/src/helpers/createMutators.ts +3 -3
  130. package/src/helpers/mutatorContext.ts +1 -1
  131. package/src/index.ts +1 -0
  132. package/src/server.ts +2 -0
  133. package/src/sqliteRuntime.ts +512 -0
  134. package/src/syncHost.test.ts +12 -5
  135. package/src/syncHost.ts +55 -16
  136. package/src/types.ts +21 -3
  137. package/src/vite-plugin.ts +1 -0
  138. package/test-fixtures/server-return-types.ts +20 -2
  139. package/types/asyncTasks.d.ts +7 -0
  140. package/types/asyncTasks.d.ts.map +1 -0
  141. package/types/createSchemaFromDrizzle.d.ts +2 -2
  142. package/types/createSchemaFromDrizzle.d.ts.map +1 -1
  143. package/types/createZeroDirectServer.d.ts +80 -0
  144. package/types/createZeroDirectServer.d.ts.map +1 -0
  145. package/types/createZeroSQLiteServer.d.ts +5 -30
  146. package/types/createZeroSQLiteServer.d.ts.map +1 -1
  147. package/types/createZeroServerCore.d.ts +30 -87
  148. package/types/createZeroServerCore.d.ts.map +1 -1
  149. package/types/generate.d.ts +2 -0
  150. package/types/generate.d.ts.map +1 -1
  151. package/types/helpers/createMutators.d.ts +3 -3
  152. package/types/helpers/createMutators.d.ts.map +1 -1
  153. package/types/index.d.ts +1 -0
  154. package/types/index.d.ts.map +1 -1
  155. package/types/server.d.ts +2 -0
  156. package/types/server.d.ts.map +1 -1
  157. package/types/sqliteRuntime.d.ts +71 -0
  158. package/types/sqliteRuntime.d.ts.map +1 -0
  159. package/types/syncHost.d.ts +10 -19
  160. package/types/syncHost.d.ts.map +1 -1
  161. package/types/types.d.ts +18 -2
  162. package/types/types.d.ts.map +1 -1
  163. package/types/vite-plugin.d.ts.map +1 -1
package/src/syncHost.ts CHANGED
@@ -1,19 +1,29 @@
1
1
  import { asQueryInternals } from '@rocicorp/zero/bindings'
2
2
 
3
3
  import { createPermissions } from './createPermissions'
4
- import { resolveServerQuery, type ZeroServerCommonOptions } from './createZeroServerCore'
5
4
  import {
6
- createZeroSQLiteServer,
5
+ createZeroDirectServer,
6
+ resolveServerQuery,
7
+ type ZeroDirectServer,
8
+ type ZeroServerCommonOptions,
9
+ } from './createZeroDirectServer'
10
+ import {
11
+ createSQLiteDatabase,
7
12
  createZeroSQLiteTransaction,
13
+ defaultLedgerTables,
14
+ encodeSQLiteValue,
15
+ type SqlStatementMetadata,
16
+ type SQLiteExecResult,
8
17
  type SQLiteTransactionExecutor,
18
+ type SQLiteTransactionProvider,
9
19
  type ZeroSQLiteTransactionOptions,
10
- } from './createZeroSQLiteServer'
20
+ } from './sqliteRuntime'
11
21
  import { createMutators } from './helpers/createMutators'
12
22
  import { runWithAuthScope } from './helpers/mutatorContext'
13
23
  import { runWithQueryContext } from './helpers/queryContext'
14
24
  import { setEnvironment, setSchema } from './state'
15
25
 
16
- import type { AuthData, GenericModels } from './types'
26
+ import type { AsyncTaskEntry, AuthData, GenericModels } from './types'
17
27
  import type { Schema as ZeroSchema } from '@rocicorp/zero'
18
28
 
19
29
  export type SyncHostJsonValue =
@@ -34,14 +44,18 @@ export type SyncHostTransactionContext = {
34
44
  }
35
45
 
36
46
  export type SyncHostTransactionExecutor = {
37
- exec(sql: string, params?: readonly unknown[]): void | Promise<void>
47
+ exec(
48
+ sql: string,
49
+ params?: readonly unknown[],
50
+ metadata?: SqlStatementMetadata,
51
+ ): SQLiteExecResult | Promise<SQLiteExecResult>
38
52
  query<Row extends Record<string, unknown> = Record<string, unknown>>(
39
53
  sql: string,
40
54
  params?: readonly unknown[],
41
55
  ): Row[] | Promise<Row[]>
42
56
  queryAst<Result = unknown>(
43
57
  ast: SyncHostJsonValue,
44
- format: import('./createZeroSQLiteServer').SQLiteQueryFormat,
58
+ format: import('./sqliteRuntime').SQLiteQueryFormat,
45
59
  queryName?: string,
46
60
  ): Result | Promise<Result>
47
61
  }
@@ -79,6 +93,19 @@ export type CreateZeroSyncHostAdapterOptions<
79
93
  defaultMutateAuthData?: Pick<AuthData, 'email' | 'id'> & Partial<AuthData>
80
94
  }
81
95
 
96
+ export type ZeroSyncHostAdapter<
97
+ Schema extends ZeroSchema,
98
+ Models extends GenericModels,
99
+ > = {
100
+ mutators: Readonly<Record<string, SyncHostRegisteredMutator>>
101
+ resolveQuery(
102
+ name: string,
103
+ args: readonly SyncHostJsonValue[],
104
+ claims: SyncHostClaims,
105
+ ): Promise<SyncHostJsonValue>
106
+ server: ZeroDirectServer<Schema, Models>
107
+ }
108
+
82
109
  export class MutationApplicationError extends Error {
83
110
  constructor(
84
111
  readonly details: string,
@@ -98,7 +125,10 @@ export function createZeroSyncHostAdapter<
98
125
  mapAuthData = defaultMapAuthData,
99
126
  transaction,
100
127
  ...options
101
- }: CreateZeroSyncHostAdapterOptions<Schema, Models, ServerActions>) {
128
+ }: CreateZeroSyncHostAdapterOptions<Schema, Models, ServerActions>): ZeroSyncHostAdapter<
129
+ Schema,
130
+ Models
131
+ > {
102
132
  setSchema(options.schema)
103
133
  setEnvironment('server')
104
134
 
@@ -117,9 +147,11 @@ export function createZeroSyncHostAdapter<
117
147
  for (const mutatorName of Object.keys(model.mutate ?? {})) {
118
148
  mutators[`${modelName}|${mutatorName}`] = async (executor, args, context) => {
119
149
  const authData = mapAuthData(context.claims)
120
- const asyncTasks: Array<() => Promise<void>> = []
150
+ const asyncTaskEntries: AsyncTaskEntry[] = []
121
151
  const modelMutators = createMutators({
122
- asyncTasks,
152
+ enqueueTask(task, opts) {
153
+ asyncTaskEntries.push({ task, barrier: opts?.barrier === true })
154
+ },
123
155
  authData,
124
156
  can: permissions.can,
125
157
  createServerActions: options.createServerActions,
@@ -151,7 +183,7 @@ export function createZeroSyncHostAdapter<
151
183
  } catch (error) {
152
184
  throw asMutationApplicationError(error)
153
185
  }
154
- for (const task of asyncTasks) {
186
+ for (const { task } of asyncTaskEntries) {
155
187
  context.defer(() => runWithAuthScope(authData, task))
156
188
  }
157
189
  }
@@ -163,11 +195,18 @@ export function createZeroSyncHostAdapter<
163
195
  // creating a second on-zero cleanup ledger.
164
196
  mutators._zero_cleanupResults = async () => {}
165
197
 
166
- const direct = createZeroSQLiteServer({
198
+ const transactionProvider: SQLiteTransactionProvider = (work) =>
199
+ transaction((executor) => work(toSQLiteExecutor(executor)))
200
+ const directDatabaseOptions = {
201
+ encodeValue: encodeValue ?? encodeSQLiteValue,
202
+ initializedLedgers: new Set<string>(),
203
+ ledgerTables: defaultLedgerTables,
204
+ schema: options.schema,
205
+ transactionProvider,
206
+ }
207
+ const direct = createZeroDirectServer({
167
208
  ...options,
168
- encodeValue,
169
- transactionProvider: (work) =>
170
- transaction((executor) => work(toSQLiteExecutor(executor))),
209
+ createDatabase: () => createSQLiteDatabase(directDatabaseOptions),
171
210
  })
172
211
 
173
212
  return {
@@ -214,8 +253,8 @@ function toSQLiteExecutor(
214
253
  executor: SyncHostTransactionExecutor,
215
254
  ): SQLiteTransactionExecutor {
216
255
  return {
217
- exec(sql, params) {
218
- return executor.exec(sql, params)
256
+ exec(sql, params, metadata) {
257
+ return executor.exec(sql, params, metadata)
219
258
  },
220
259
  query<Row extends Record<string, unknown>>(sql: string, params?: readonly unknown[]) {
221
260
  return executor.query<Row>(sql, params)
package/src/types.ts CHANGED
@@ -60,6 +60,17 @@ export type ServerActions =
60
60
 
61
61
  export type QueryBuilder = SchemaQuery<Schema>
62
62
 
63
+ export type AsyncTask = () => Promise<void>
64
+
65
+ export type AsyncTaskOptions = {
66
+ barrier?: boolean
67
+ }
68
+
69
+ export type AsyncTaskEntry = {
70
+ task: AsyncTask
71
+ barrier: boolean
72
+ }
73
+
63
74
  /**
64
75
  * ➗0️⃣ END OVERRIDDEN TYPES
65
76
  */
@@ -71,7 +82,16 @@ export type MutatorContext = {
71
82
  environment: 'server' | 'client'
72
83
  server?: {
73
84
  actions: ServerActions
74
- asyncTasks: Array<() => Promise<void>>
85
+ /**
86
+ * Schedules work after the mutation transaction commits. Tasks run in the
87
+ * background by default, following Zero's async task model, so they do not
88
+ * block the push response.
89
+ *
90
+ * Set `barrier: true` only when the client's next writes depend on the
91
+ * effect, such as provisioning a namespace before the client writes
92
+ * through a new instance. Barrier tasks finish before the push response.
93
+ */
94
+ enqueueTask(task: AsyncTask, opts?: AsyncTaskOptions): void
75
95
  }
76
96
  can: Can
77
97
  }
@@ -112,8 +132,6 @@ export type Can = <PWhere extends Where>(
112
132
  obj: string | Record<string, unknown>,
113
133
  ) => Promise<void>
114
134
 
115
- export type AsyncAction = () => Promise<void>
116
-
117
135
  type GenericTable = TableBuilderWithColumns<any>
118
136
 
119
137
  type GetTableSchema<TS extends GenericTable> =
@@ -62,6 +62,7 @@ export function onZeroPlugin(options: OnZeroPluginOptions = {}): Plugin[] {
62
62
  dir: dataDir,
63
63
  after: options.after,
64
64
  silent,
65
+ force: options.force,
65
66
  })
66
67
 
67
68
  return [
@@ -1,5 +1,9 @@
1
- import { createZeroServer } from 'on-zero/server'
2
- import { createZeroSQLiteServer } from 'on-zero/sqlite'
1
+ import {
2
+ createZeroServer,
3
+ runAsyncTaskEntries,
4
+ type AsyncTaskEntry,
5
+ } from 'on-zero/server'
6
+ import { createZeroSQLiteServer, type SqlStatementMetadata } from 'on-zero/sqlite'
3
7
 
4
8
  import type { Config, MutatorContext } from 'on-zero'
5
9
  import type { Schema as ZeroSchema } from '@rocicorp/zero'
@@ -30,6 +34,7 @@ type SQLiteServer = ReturnType<typeof createZeroSQLiteServer<ZeroSchema, Models,
30
34
 
31
35
  declare const postgresServer: PostgresServer
32
36
  declare const sqliteServer: SQLiteServer
37
+ declare const taskEntries: AsyncTaskEntry[]
33
38
 
34
39
  const authData: Config['authData'] = {
35
40
  email: 'admin@example.com',
@@ -37,6 +42,19 @@ const authData: Config['authData'] = {
37
42
  role: 'admin',
38
43
  }
39
44
 
45
+ const sqliteWrite: SqlStatementMetadata = {
46
+ table: 'project_records',
47
+ publicTable: 'project',
48
+ kind: 'upsert',
49
+ }
50
+ void sqliteWrite
51
+
52
+ void runAsyncTaskEntries(taskEntries, {
53
+ background(promise) {
54
+ void promise
55
+ },
56
+ })
57
+
40
58
  postgresServer.mutate.project.create(
41
59
  { id: 'pg' },
42
60
  { authData: { email: authData.email, id: authData.id, role: authData.role } },
@@ -0,0 +1,7 @@
1
+ import type { AsyncTaskEntry } from './types';
2
+ export type RunAsyncTaskEntriesOptions = {
3
+ /** Receives the background-task promise. Omit this to await all entries. */
4
+ background?: (promise: Promise<void>) => void;
5
+ };
6
+ export declare function runAsyncTaskEntries(entries: readonly AsyncTaskEntry[], { background }?: RunAsyncTaskEntriesOptions): Promise<void>;
7
+ //# sourceMappingURL=asyncTasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncTasks.d.ts","sourceRoot":"","sources":["../src/asyncTasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,MAAM,MAAM,0BAA0B,GAAG;IACvC,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAA;CAC9C,CAAA;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,SAAS,cAAc,EAAE,EAClC,EAAE,UAAU,EAAE,GAAE,0BAA+B,GAC9C,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -1,4 +1,4 @@
1
- export { drizzleZeroConfig as createSchemaFromDrizzle } from 'drizzle-zero';
2
- export { createZeroTableBuilder } from 'drizzle-zero';
1
+ export { drizzleZeroConfig as createSchemaFromDrizzle } from 'drizzle-zero-sqlite';
2
+ export { createZeroTableBuilder } from 'drizzle-zero-sqlite';
3
3
  export { generateDrizzleSchemaFile } from './generate';
4
4
  //# sourceMappingURL=createSchemaFromDrizzle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSchemaFromDrizzle.d.ts","sourceRoot":"","sources":["../src/createSchemaFromDrizzle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"createSchemaFromDrizzle.d.ts","sourceRoot":"","sources":["../src/createSchemaFromDrizzle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,80 @@
1
+ import { createPermissions } from './createPermissions';
2
+ import type { AdminRoleMode, AsyncTask, AsyncTaskEntry, AsyncTaskOptions, AuthData, GenericModels, MutatorContext, QueryBuilder, Transaction } from './types';
3
+ import type { AnyQueryRegistry, HumanReadable, Query, Schema as ZeroSchema } from '@rocicorp/zero';
4
+ import type { Database } from '@rocicorp/zero/server';
5
+ type MutateAuthData = Pick<AuthData, 'email' | 'id'> & Partial<AuthData>;
6
+ export type MutateOptions = {
7
+ authData?: MutateAuthData;
8
+ awaitEffects?: boolean;
9
+ };
10
+ export type ServerMutate<Models extends GenericModels> = {
11
+ [Key in keyof Models]: {
12
+ [K in keyof Models[Key]['mutate']]: Models[Key]['mutate'][K] extends (ctx: MutatorContext, arg: infer Arg) => any ? (arg: Arg, options?: MutateOptions) => Promise<void> : (options?: MutateOptions) => Promise<void>;
13
+ };
14
+ };
15
+ export type ValidateQueryArgs = {
16
+ authData: AuthData | null;
17
+ queryName: string;
18
+ params: unknown;
19
+ };
20
+ export type ValidateMutationArgs = {
21
+ authData: AuthData | null;
22
+ mutatorName: string;
23
+ tableName: string;
24
+ args: unknown;
25
+ };
26
+ export type ValidateQueryFn = (args: ValidateQueryArgs) => void;
27
+ export type ValidateMutationFn = (args: ValidateMutationArgs) => void | Promise<void>;
28
+ export type ServerQueryResolverOptions = {
29
+ authData: AuthData | null;
30
+ name: string;
31
+ args: unknown;
32
+ queries: AnyQueryRegistry;
33
+ permissions: ReturnType<typeof createPermissions>;
34
+ validateQuery?: ValidateQueryFn;
35
+ };
36
+ export declare function resolveServerQuery({ authData, name, args, queries, permissions, validateQuery, }: ServerQueryResolverOptions): any;
37
+ export type TransactionAttemptLifecycle = {
38
+ beginAttempt(): void;
39
+ completeAttempt(): void;
40
+ rollbackAttempt(): void;
41
+ commitTransaction(): void;
42
+ rollbackTransaction(): void;
43
+ };
44
+ export type ZeroServerDatabase = Database<Transaction>;
45
+ export type ZeroServerCommonOptions<Schema extends ZeroSchema, Models extends GenericModels, ServerActions extends Record<string, unknown>> = {
46
+ schema: Schema;
47
+ models: Models;
48
+ createServerActions: () => ServerActions;
49
+ queries?: AnyQueryRegistry;
50
+ /** generated validators keyed by model and mutation name */
51
+ mutations?: Record<string, Record<string, any>>;
52
+ /** synchronous query authorization hook; throw to reject */
53
+ validateQuery?: ValidateQueryFn;
54
+ /** mutation authorization hook; throw to reject */
55
+ validateMutation?: ValidateMutationFn;
56
+ /** controls which operations the admin role bypasses */
57
+ defaultAllowAdminRole?: AdminRoleMode;
58
+ /** auth data used by direct server mutations when no scope provides it */
59
+ defaultMutateAuthData?: MutateAuthData;
60
+ };
61
+ export type ZeroDirectServerOptions<Schema extends ZeroSchema, Models extends GenericModels, ServerActions extends Record<string, unknown>> = ZeroServerCommonOptions<Schema, Models, ServerActions> & {
62
+ createDatabase: () => ZeroServerDatabase;
63
+ };
64
+ export type ZeroDirectServer<Schema extends ZeroSchema, Models extends GenericModels> = {
65
+ transaction: <CB extends (tx: Transaction) => Promise<any>, Returns extends CB extends (tx: Transaction) => Promise<infer X> ? X : never>(query: CB) => Promise<Returns>;
66
+ mutate: ServerMutate<Models>;
67
+ query: <R>(cb: (q: QueryBuilder) => Query<any, Schema, R>, authData?: AuthData | null) => Promise<HumanReadable<R>>;
68
+ };
69
+ export declare function createAsyncTaskCollector(): {
70
+ committed: AsyncTaskEntry[];
71
+ enqueueTask: (task: AsyncTask, opts?: AsyncTaskOptions) => void;
72
+ lifecycle: TransactionAttemptLifecycle;
73
+ };
74
+ export declare function createZeroDirectServerRuntime<Schema extends ZeroSchema, Models extends GenericModels, ServerActions extends Record<string, unknown>>({ createDatabase, createServerActions, defaultAllowAdminRole, defaultMutateAuthData, models, mutations: mutationValidators, queries, schema, validateMutation, validateQuery, }: ZeroDirectServerOptions<Schema, Models, ServerActions>): {
75
+ permissions: ReturnType<typeof createPermissions<Schema>>;
76
+ server: ZeroDirectServer<Schema, Models>;
77
+ };
78
+ export declare function createZeroDirectServer<Schema extends ZeroSchema, Models extends GenericModels, ServerActions extends Record<string, unknown>>(options: ZeroDirectServerOptions<Schema, Models, ServerActions>): ZeroDirectServer<Schema, Models>;
79
+ export {};
80
+ //# sourceMappingURL=createZeroDirectServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createZeroDirectServer.d.ts","sourceRoot":"","sources":["../src/createZeroDirectServer.ts"],"names":[],"mappings":"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"}
@@ -1,37 +1,12 @@
1
- import { type ZeroServer, type ZeroServerCommonOptions } from './createZeroServerCore';
2
- import type { GenericModels, Transaction } from './types';
3
- import type { AST, Schema as ZeroSchema } from '@rocicorp/zero';
4
- import type { TransactionProviderInput } from '@rocicorp/zero/server';
5
- export type SQLiteTransactionExecutor = {
6
- exec(sql: string, params?: readonly unknown[]): void | Promise<void>;
7
- query<Row extends Record<string, unknown> = Record<string, unknown>>(sql: string, params?: readonly unknown[]): Row[] | Promise<Row[]>;
8
- queryAst<Result = unknown>(ast: AST, format: SQLiteQueryFormat, queryName?: string): Result | Promise<Result>;
9
- };
10
- export type SQLiteQueryFormat = {
11
- relationships: Record<string, SQLiteQueryFormat>;
12
- singular: boolean;
13
- };
14
- export type SQLiteTransactionProvider = <R>(callback: (tx: SQLiteTransactionExecutor) => Promise<R>) => Promise<R>;
15
- type SQLiteColumn = ZeroSchema['tables'][string]['columns'][string];
16
- export type SQLiteValueContext = {
17
- column: SQLiteColumn;
18
- columnName: string;
19
- tableName: string;
20
- };
21
- export type ZeroSQLiteTransactionOptions<Schema extends ZeroSchema> = {
22
- schema: Schema;
23
- encodeValue?: (value: unknown, context: SQLiteValueContext) => unknown;
24
- };
25
- export type SQLiteLedgerTables = {
26
- clients: string;
27
- mutations: string;
28
- };
1
+ import { type SQLiteLedgerTables, type SQLiteTransactionProvider, type SQLiteValueContext } from './sqliteRuntime';
2
+ import type { ZeroServer, ZeroServerCommonOptions } from './createZeroServerCore';
3
+ import type { GenericModels } from './types';
4
+ import type { Schema as ZeroSchema } from '@rocicorp/zero';
29
5
  export type CreateZeroSQLiteServerOptions<Schema extends ZeroSchema, Models extends GenericModels, ServerActions extends Record<string, unknown>> = ZeroServerCommonOptions<Schema, Models, ServerActions> & {
30
6
  transactionProvider: SQLiteTransactionProvider;
31
7
  ledgerTables?: (upstreamSchema: string) => SQLiteLedgerTables;
32
8
  encodeValue?: (value: unknown, context: SQLiteValueContext) => unknown;
33
9
  };
34
10
  export declare function createZeroSQLiteServer<Schema extends ZeroSchema, Models extends GenericModels, ServerActions extends Record<string, unknown>>({ encodeValue, ledgerTables, transactionProvider, ...options }: CreateZeroSQLiteServerOptions<Schema, Models, ServerActions>): ZeroServer<Schema, Models, ServerActions>;
35
- export declare function createZeroSQLiteTransaction<Schema extends ZeroSchema>(options: ZeroSQLiteTransactionOptions<Schema>, executor: SQLiteTransactionExecutor, input?: TransactionProviderInput): Transaction;
36
- export {};
11
+ export * from './sqliteRuntime';
37
12
  //# sourceMappingURL=createZeroSQLiteServer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createZeroSQLiteServer.d.ts","sourceRoot":"","sources":["../src/createZeroSQLiteServer.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,uBAAuB,EAE7B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACzD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC/D,OAAO,KAAK,EAEV,wBAAwB,EACzB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpE,KAAK,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAC1B,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACzB,QAAQ,CAAC,MAAM,GAAG,OAAO,EACvB,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,iBAAiB,EACzB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IAChD,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,EACxC,QAAQ,EAAE,CAAC,EAAE,EAAE,yBAAyB,KAAK,OAAO,CAAC,CAAC,CAAC,KACpD,OAAO,CAAC,CAAC,CAAC,CAAA;AAEf,KAAK,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,YAAY,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,4BAA4B,CAAC,MAAM,SAAS,UAAU,IAAI;IACpE,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAA;CACvE,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,6BAA6B,CACvC,MAAM,SAAS,UAAU,EACzB,MAAM,SAAS,aAAa,EAC5B,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC3C,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG;IAC3D,mBAAmB,EAAE,yBAAyB,CAAA;IAC9C,YAAY,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,kBAAkB,CAAA;IAC7D,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAA;CACvE,CAAA;AAED,wBAAgB,sBAAsB,CACpC,MAAM,SAAS,UAAU,EACzB,MAAM,SAAS,aAAa,EAC5B,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,EACA,WAA+B,EAC/B,YAAkC,EAClC,mBAAmB,EACnB,GAAG,OAAO,EACX,EAAE,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG,UAAU,CAC1E,MAAM,EACN,MAAM,EACN,aAAa,CACd,CAeA;AAmDD,wBAAgB,2BAA2B,CAAC,MAAM,SAAS,UAAU,EACnE,OAAO,EAAE,4BAA4B,CAAC,MAAM,CAAC,EAC7C,QAAQ,EAAE,yBAAyB,EACnC,KAAK,CAAC,EAAE,wBAAwB,GAC/B,WAAW,CA2Db"}
1
+ {"version":3,"file":"createZeroSQLiteServer.d.ts","sourceRoot":"","sources":["../src/createZeroSQLiteServer.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AACjF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE1D,MAAM,MAAM,6BAA6B,CACvC,MAAM,SAAS,UAAU,EACzB,MAAM,SAAS,aAAa,EAC5B,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC3C,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG;IAC3D,mBAAmB,EAAE,yBAAyB,CAAA;IAC9C,YAAY,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,kBAAkB,CAAA;IAC7D,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAA;CACvE,CAAA;AAED,wBAAgB,sBAAsB,CACpC,MAAM,SAAS,UAAU,EACzB,MAAM,SAAS,aAAa,EAC5B,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,EACA,WAA+B,EAC/B,YAAkC,EAClC,mBAAmB,EACnB,GAAG,OAAO,EACX,EAAE,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG,UAAU,CAC1E,MAAM,EACN,MAAM,EACN,aAAa,CACd,CAeA;AAED,cAAc,iBAAiB,CAAA"}