over-zero 0.0.33 → 0.0.34

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 (41) hide show
  1. package/dist/cjs/cli.cjs +38 -57
  2. package/dist/cjs/cli.js +38 -54
  3. package/dist/cjs/cli.js.map +1 -1
  4. package/dist/cjs/cli.native.js +42 -69
  5. package/dist/cjs/cli.native.js.map +1 -1
  6. package/dist/cjs/createZeroClient.cjs +2 -2
  7. package/dist/cjs/createZeroClient.js +2 -2
  8. package/dist/cjs/createZeroClient.js.map +1 -1
  9. package/dist/cjs/createZeroClient.native.js +2 -2
  10. package/dist/cjs/createZeroClient.native.js.map +1 -1
  11. package/dist/cjs/createZeroServer.cjs +5 -4
  12. package/dist/cjs/createZeroServer.js +8 -3
  13. package/dist/cjs/createZeroServer.js.map +1 -1
  14. package/dist/cjs/createZeroServer.native.js +39 -5
  15. package/dist/cjs/createZeroServer.native.js.map +1 -1
  16. package/dist/esm/cli.js +38 -54
  17. package/dist/esm/cli.js.map +1 -1
  18. package/dist/esm/cli.mjs +38 -57
  19. package/dist/esm/cli.mjs.map +1 -1
  20. package/dist/esm/cli.native.js +42 -69
  21. package/dist/esm/cli.native.js.map +1 -1
  22. package/dist/esm/createZeroClient.js +2 -2
  23. package/dist/esm/createZeroClient.js.map +1 -1
  24. package/dist/esm/createZeroClient.mjs +2 -2
  25. package/dist/esm/createZeroClient.mjs.map +1 -1
  26. package/dist/esm/createZeroClient.native.js +2 -2
  27. package/dist/esm/createZeroClient.native.js.map +1 -1
  28. package/dist/esm/createZeroServer.js +8 -3
  29. package/dist/esm/createZeroServer.js.map +1 -1
  30. package/dist/esm/createZeroServer.mjs +5 -4
  31. package/dist/esm/createZeroServer.mjs.map +1 -1
  32. package/dist/esm/createZeroServer.native.js +39 -5
  33. package/dist/esm/createZeroServer.native.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/cli.ts +79 -102
  36. package/src/createZeroClient.tsx +6 -5
  37. package/src/createZeroServer.ts +16 -7
  38. package/types/createZeroClient.d.ts +3 -3
  39. package/types/createZeroClient.d.ts.map +1 -1
  40. package/types/createZeroServer.d.ts +3 -3
  41. package/types/createZeroServer.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"names":["handleGetQueriesRequest","PushProcessor","zeroNodePg","assertString","randomId","Pool","createPermissions","createMutators","isInZeroMutation","mutatorContext","setAuthData","setSchema","createZeroServer","param","createServerActions","database","schema","models","serverQueries","dbString","zeroDb","connectionString","permissions","environment","processor","handleMutationRequest","param2","authData","request","skipAsyncTasks","asyncTasks","mutators","can","response","process","length","id","console","info","Promise","all","map","task","then","catch","err","error","handleQueryRequest","getQuery","name","args","_serverQueries_namespace","namespace","queryName","split","q","Error","query","mutate","run","email","role","transaction","tx","t","query2","output","dummyTransactionInput","cb","clientGroupID","clientID","mutationID","upstreamSchema"],"sources":["../../src/createZeroServer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["handleGetQueriesRequest","PushProcessor","zeroNodePg","assertString","randomId","Pool","createPermissions","createMutators","isInZeroMutation","mutatorContext","setAuthData","setSchema","createZeroServer","param","createServerActions","database","schema","models","syncedQueries","dbString","zeroDb","connectionString","permissions","environment","processor","handleMutationRequest","param2","authData","request","skipAsyncTasks","asyncTasks","mutators","can","response","process","length","id","console","info","Promise","all","map","task","then","catch","err","error","queryLookup","Map","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Object","entries","Symbol","iterator","_step","next","done","namespace","queries","value","_iteratorNormalCompletion1","_didIteratorError1","_iteratorError1","_iterator1","_step1","queryName","syncedQuery","set","return","handleQueryRequest","getQuery","name","args","q","get","Error","query","mutate","run","email","role","transaction","tx","t","query2","output","dummyTransactionInput"],"sources":["../../src/createZeroServer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "over-zero",
3
- "version": "0.0.33",
3
+ "version": "0.0.34",
4
4
  "sideEffects": false,
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/cjs",
package/src/cli.ts CHANGED
@@ -274,23 +274,23 @@ const generate = defineCommand({
274
274
  )
275
275
 
276
276
  const allQueries = queryResults.flat()
277
- const clientQueriesOutput = generateClientQueriesFile(allQueries)
278
- const serverQueriesOutput = generateServerQueriesFile(allQueries)
277
+ const groupedQueriesOutput = generateGroupedQueriesFile(allQueries)
278
+ const syncedQueriesOutput = generateSyncedQueriesFile(allQueries)
279
279
 
280
- const clientChanged = writeFileIfChanged(
281
- resolve(generatedDir, 'queries.client.ts'),
282
- clientQueriesOutput
280
+ const groupedChanged = writeFileIfChanged(
281
+ resolve(generatedDir, 'groupedQueries.ts'),
282
+ groupedQueriesOutput
283
283
  )
284
- const serverChanged = writeFileIfChanged(
285
- resolve(generatedDir, 'queries.server.ts'),
286
- serverQueriesOutput
284
+ const syncedChanged = writeFileIfChanged(
285
+ resolve(generatedDir, 'syncedQueries.ts'),
286
+ syncedQueriesOutput
287
287
  )
288
288
 
289
- if (clientChanged) {
290
- console.info(` 📝 Updated queries.client.ts`)
289
+ if (groupedChanged) {
290
+ console.info(` 📝 Updated groupedQueries.ts`)
291
291
  }
292
- if (serverChanged) {
293
- console.info(` 📝 Updated queries.server.ts`)
292
+ if (syncedChanged) {
293
+ console.info(` 📝 Updated syncedQueries.ts`)
294
294
  }
295
295
 
296
296
  console.info(
@@ -405,7 +405,7 @@ function generateTablesFile(modelFiles: string[]) {
405
405
  return `// auto-generated by: over-zero generate\n// this is separate from models as otherwise you end up with circular types :/\n\n${exports}\n`
406
406
  }
407
407
 
408
- function generateClientQueriesFile(
408
+ function generateGroupedQueriesFile(
409
409
  queries: Array<{
410
410
  name: string
411
411
  params: string
@@ -416,30 +416,23 @@ function generateClientQueriesFile(
416
416
  // get unique source files sorted
417
417
  const sortedFiles = [...new Set(queries.map((q) => q.sourceFile))].sort()
418
418
 
419
- // generate imports
420
- const imports = sortedFiles
421
- .map((file) => `import * as ${file}Queries from '../queries/${file}'`)
419
+ // generate re-exports
420
+ const exports = sortedFiles
421
+ .map((file) => `export * as ${file} from '../queries/${file}'`)
422
422
  .join('\n')
423
423
 
424
- // generate namespaced export object
425
- const namespaces = sortedFiles.map((file) => ` ${file}: ${file}Queries,`).join('\n')
426
-
427
424
  return `/**
428
425
  * auto-generated by: over-zero generate
429
426
  *
430
- * client-side query references for minification-safe query identity.
427
+ * grouped query re-exports for minification-safe query identity.
431
428
  * this file re-exports all query modules - while this breaks tree-shaking,
432
429
  * queries are typically small and few in number even in larger apps.
433
430
  */
434
- ${imports}
435
-
436
- export const clientQueries = {
437
- ${namespaces}
438
- }
431
+ ${exports}
439
432
  `
440
433
  }
441
434
 
442
- function generateServerQueriesFile(
435
+ function generateSyncedQueriesFile(
443
436
  queries: Array<{
444
437
  name: string
445
438
  params: string
@@ -459,95 +452,79 @@ function generateServerQueriesFile(
459
452
  // sort file names for consistent output
460
453
  const sortedFiles = Array.from(queryByFile.keys()).sort()
461
454
 
462
- // generate imports
463
- const queryImports = sortedFiles
464
- .map((file) => `import * as ${file}Queries from '../queries/${file}'`)
465
- .join('\n')
466
-
467
455
  const imports = `// auto-generated by: over-zero generate
468
456
  // server-side syncedQuery wrappers with validators
469
457
  import { syncedQuery } from '@rocicorp/zero'
470
458
  import * as v from 'valibot'
471
- ${queryImports}
459
+ import * as Queries from './groupedQueries'
472
460
  `
473
461
 
474
- // generate synced queries grouped by namespace
475
- const sortedQueries = [...queries].sort((a, b) => a.name.localeCompare(b.name))
462
+ // generate grouped exports by namespace
463
+ const namespaceExports = sortedFiles
464
+ .map((file) => {
465
+ const fileQueries = queryByFile
466
+ .get(file)!
467
+ .sort((a, b) => a.name.localeCompare(b.name))
476
468
 
477
- const syncedQueryDefs = sortedQueries
478
- .map((q) => {
479
- // extract validator schema
480
- const lines = q.valibotCode.split('\n').filter((l) => l.trim())
481
- const schemaLineIndex = lines.findIndex((l) =>
482
- l.startsWith('export const QueryParams')
483
- )
469
+ const queryDefs = fileQueries
470
+ .map((q) => {
471
+ // extract validator schema
472
+ const lines = q.valibotCode.split('\n').filter((l) => l.trim())
473
+ const schemaLineIndex = lines.findIndex((l) =>
474
+ l.startsWith('export const QueryParams')
475
+ )
484
476
 
485
- let validatorDef = 'v.void()'
486
- if (schemaLineIndex !== -1) {
487
- const schemaLines: string[] = []
488
- let openBraces = 0
489
- let started = false
490
-
491
- for (let i = schemaLineIndex; i < lines.length; i++) {
492
- const line = lines[i]!
493
- const cleaned = started ? line : line.replace('export const QueryParams = ', '')
494
- schemaLines.push(cleaned)
495
- started = true
496
-
497
- openBraces += (cleaned.match(/\{/g) || []).length
498
- openBraces -= (cleaned.match(/\}/g) || []).length
499
- openBraces += (cleaned.match(/\(/g) || []).length
500
- openBraces -= (cleaned.match(/\)/g) || []).length
501
-
502
- if (openBraces === 0 && schemaLines.length > 0) {
503
- break
477
+ let validatorDef = 'v.void()'
478
+ if (schemaLineIndex !== -1) {
479
+ const schemaLines: string[] = []
480
+ let openBraces = 0
481
+ let started = false
482
+
483
+ for (let i = schemaLineIndex; i < lines.length; i++) {
484
+ const line = lines[i]!
485
+ const cleaned = started
486
+ ? line
487
+ : line.replace('export const QueryParams = ', '')
488
+ schemaLines.push(cleaned)
489
+ started = true
490
+
491
+ openBraces += (cleaned.match(/\{/g) || []).length
492
+ openBraces -= (cleaned.match(/\}/g) || []).length
493
+ openBraces += (cleaned.match(/\(/g) || []).length
494
+ openBraces -= (cleaned.match(/\)/g) || []).length
495
+
496
+ if (openBraces === 0 && schemaLines.length > 0) {
497
+ break
498
+ }
499
+ }
500
+ validatorDef = schemaLines.join('\n')
504
501
  }
505
- }
506
- validatorDef = schemaLines.join('\n')
507
- }
508
502
 
509
- // wrap validator in v.parser(v.tuple([...]))
510
- const wrappedValidator =
511
- validatorDef === 'v.void()'
512
- ? 'v.parser(v.tuple([]))'
513
- : `v.parser(v.tuple([${validatorDef}]))`
514
-
515
- // namespaced query name: file.queryName
516
- const namespacedName = `${q.sourceFile}.${q.name}`
517
-
518
- // for void queries, no arg parameter
519
- const queryFn =
520
- validatorDef === 'v.void()'
521
- ? `() => {
522
- return ${q.sourceFile}Queries.${q.name}()
523
- }`
524
- : `(arg) => {
525
- return ${q.sourceFile}Queries.${q.name}(arg)
526
- }`
527
-
528
- return `const ${q.name}Synced = syncedQuery('${namespacedName}', ${wrappedValidator}, ${queryFn})`
529
- })
530
- .join('\n\n')
503
+ // wrap validator in v.parser(v.tuple([...]))
504
+ const wrappedValidator =
505
+ validatorDef === 'v.void()'
506
+ ? 'v.parser(v.tuple([]))'
507
+ : `v.parser(v.tuple([${validatorDef}]))`
531
508
 
532
- // generate namespaced export object
533
- const namespaces = sortedFiles
534
- .map((file) => {
535
- const fileQueries = queryByFile
536
- .get(file)!
537
- .sort((a, b) => a.name.localeCompare(b.name))
538
- const queryEntries = fileQueries
539
- .map((q) => ` ${q.name}: ${q.name}Synced,`)
509
+ // namespaced query name: file.queryName
510
+ const namespacedName = `${q.sourceFile}.${q.name}`
511
+
512
+ // for void queries, no arg parameter
513
+ const queryFn =
514
+ validatorDef === 'v.void()'
515
+ ? `() => Queries.${file}.${q.name}()`
516
+ : `(arg) => Queries.${file}.${q.name}(arg)`
517
+
518
+ return ` ${q.name}: syncedQuery('${namespacedName}', ${wrappedValidator}, ${queryFn}),`
519
+ })
540
520
  .join('\n')
541
- return ` ${file}: {\n${queryEntries}\n },`
521
+
522
+ return `export const ${file} = {\n${queryDefs}\n}`
542
523
  })
543
- .join('\n')
524
+ .join('\n\n')
544
525
 
545
526
  return `${imports}
546
- ${syncedQueryDefs}
547
-
548
- export const serverQueries = {
549
- ${namespaces}
550
- }
527
+ ${namespaceExports}
551
528
  `
552
529
  }
553
530
 
@@ -561,8 +538,8 @@ this folder is auto-generated by over-zero. do not edit files here directly.
561
538
  - \`models.ts\` - exports all models from ../models
562
539
  - \`types.ts\` - typescript types derived from table schemas
563
540
  - \`tables.ts\` - exports table schemas for type inference
564
- - \`queries.client.ts\` - namespaced query references for client setup
565
- - \`queries.server.ts\` - namespaced syncedQuery wrappers for server setup
541
+ - \`groupedQueries.ts\` - namespaced query re-exports for client setup
542
+ - \`syncedQueries.ts\` - namespaced syncedQuery wrappers for server setup
566
543
 
567
544
  ## usage guidelines
568
545
 
@@ -22,8 +22,9 @@ import type {
22
22
  Schema as ZeroSchema,
23
23
  } from '@rocicorp/zero'
24
24
 
25
+ // grouped queries: { namespace: { queryName: queryFn } }
25
26
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
- export type ClientQueries = Record<string, Record<string, (...args: any[]) => any>>
27
+ export type GroupedQueries = Record<string, Record<string, (...args: any[]) => any>>
27
28
 
28
29
  export function createZeroClient<
29
30
  Schema extends ZeroSchema,
@@ -31,11 +32,11 @@ export function createZeroClient<
31
32
  >({
32
33
  schema,
33
34
  models,
34
- clientQueries,
35
+ groupedQueries,
35
36
  }: {
36
37
  schema: Schema
37
38
  models: Models
38
- clientQueries: ClientQueries
39
+ groupedQueries: GroupedQueries
39
40
  }) {
40
41
  type ZeroMutators = GetZeroMutators<Models>
41
42
  type ZeroInstance = Zero<Schema, ZeroMutators>
@@ -43,8 +44,8 @@ export function createZeroClient<
43
44
 
44
45
  setSchema(schema)
45
46
 
46
- // build query registry from namespaced clientQueries
47
- for (const [namespace, queries] of Object.entries(clientQueries)) {
47
+ // build query registry from grouped queries
48
+ for (const [namespace, queries] of Object.entries(groupedQueries)) {
48
49
  for (const [name, fn] of Object.entries(queries)) {
49
50
  registerQuery(fn, `${namespace}.${name}`)
50
51
  }
@@ -24,8 +24,8 @@ import type {
24
24
  } from '@rocicorp/zero'
25
25
  import type { TransactionProviderInput } from '@rocicorp/zero/pg'
26
26
 
27
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
- export type ServerQueries = Record<
27
+ // grouped synced queries: { namespace: { queryName: SyncedQuery } }
28
+ export type SyncedQueries = Record<
29
29
  string,
30
30
  Record<string, SyncedQuery<any, any, any, any, any>>
31
31
  >
@@ -34,12 +34,13 @@ export function createZeroServer<
34
34
  Schema extends ZeroSchema,
35
35
  Models extends GenericModels,
36
36
  ServerActions extends Record<string, unknown>,
37
+ Queries extends SyncedQueries = Record<string, never>,
37
38
  >({
38
39
  createServerActions,
39
40
  database,
40
41
  schema,
41
42
  models,
42
- serverQueries,
43
+ syncedQueries,
43
44
  }: {
44
45
  /**
45
46
  * The DB connection string, same as ZERO_UPSTREAM_DB
@@ -48,7 +49,7 @@ export function createZeroServer<
48
49
  schema: Schema
49
50
  models: Models
50
51
  createServerActions: () => ServerActions
51
- serverQueries?: ServerQueries
52
+ syncedQueries?: Queries
52
53
  }) {
53
54
  setSchema(schema)
54
55
 
@@ -111,6 +112,16 @@ export function createZeroServer<
111
112
  }
112
113
  }
113
114
 
115
+ // build flat lookup map from grouped syncedQueries: "namespace.queryName" => SyncedQuery
116
+ const queryLookup = new Map<string, SyncedQuery<any, any, any, any, any>>()
117
+ if (syncedQueries) {
118
+ for (const [namespace, queries] of Object.entries(syncedQueries)) {
119
+ for (const [queryName, syncedQuery] of Object.entries(queries)) {
120
+ queryLookup.set(`${namespace}.${queryName}`, syncedQuery)
121
+ }
122
+ }
123
+ }
124
+
114
125
  const handleQueryRequest = async ({
115
126
  authData,
116
127
  request,
@@ -119,9 +130,7 @@ export function createZeroServer<
119
130
  request: Request
120
131
  }) => {
121
132
  function getQuery(name: string, args: readonly ReadonlyJSONValue[]) {
122
- // name format: "namespace.queryName" (e.g. "post.allPosts")
123
- const [namespace, queryName] = name.split('.')
124
- const q = serverQueries?.[namespace!]?.[queryName!]
133
+ const q = queryLookup.get(name)
125
134
  if (!q) {
126
135
  throw new Error(`No such query: ${name}`)
127
136
  }
@@ -1,11 +1,11 @@
1
1
  import { type ReactNode } from 'react';
2
2
  import type { AuthData, GenericModels, GetZeroMutators, ZeroEvent } from './types';
3
3
  import type { HumanReadable, Query, Row, SyncedQuery, Zero, ZeroOptions, Schema as ZeroSchema } from '@rocicorp/zero';
4
- export type ClientQueries = Record<string, Record<string, (...args: any[]) => any>>;
5
- export declare function createZeroClient<Schema extends ZeroSchema, Models extends GenericModels>({ schema, models, clientQueries, }: {
4
+ export type GroupedQueries = Record<string, Record<string, (...args: any[]) => any>>;
5
+ export declare function createZeroClient<Schema extends ZeroSchema, Models extends GenericModels>({ schema, models, groupedQueries, }: {
6
6
  schema: Schema;
7
7
  models: Models;
8
- clientQueries: ClientQueries;
8
+ groupedQueries: GroupedQueries;
9
9
  }): {
10
10
  zeroEvents: import("@vxrn/helpers").Emitter<ZeroEvent | null>;
11
11
  ProvideZero: ({ children, authData: authDataIn, disable, ...props }: Omit<ZeroOptions<Schema, GetZeroMutators<Models>>, "schema" | "mutators"> & {
@@ -1 +1 @@
1
- {"version":3,"file":"createZeroClient.d.ts","sourceRoot":"","sources":["../src/createZeroClient.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AASnE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAClF,OAAO,KAAK,EACV,aAAa,EACb,KAAK,EAEL,GAAG,EACH,WAAW,EACX,IAAI,EACJ,WAAW,EACX,MAAM,IAAI,UAAU,EACrB,MAAM,gBAAgB,CAAA;AAGvB,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;AAEnF,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,UAAU,EACzB,MAAM,SAAS,aAAa,EAC5B,EACA,MAAM,EACN,MAAM,EACN,aAAa,GACd,EAAE;IACD,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,aAAa,CAAA;CAC7B;;yEAyMI,IAAI,CAAC,WAAW,CAAC,MAAM,0BAAe,EAAE,QAAQ,GAAG,UAAU,CAAC,GAAG;QAClE,QAAQ,EAAE,SAAS,CAAA;QACnB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;QAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;KAClB;;SAxFiB,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,SAEnE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAC9B,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,YACzD;sBAhBA,OAAO,GAAG,SAAS;kBACvB,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS;YAejB,OAAO;SAInB,IAAI,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,8DAErE,IAAI,YACF;sBAvBA,OAAO,GAAG,SAAS;kBACvB,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS;YAsBjB,OAAO;SAInB,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,gEAE7D;sBA7BA,OAAO,GAAG,SAAS;kBACvB,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS;YA4BjB,OAAO;;oBAtFd,CAAC,iDACf,CAAC,WACC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,yCAG9D,OAAO,GAAG,IAAI;;EAwNlB"}
1
+ {"version":3,"file":"createZeroClient.d.ts","sourceRoot":"","sources":["../src/createZeroClient.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AASnE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAClF,OAAO,KAAK,EACV,aAAa,EACb,KAAK,EAEL,GAAG,EACH,WAAW,EACX,IAAI,EACJ,WAAW,EACX,MAAM,IAAI,UAAU,EACrB,MAAM,gBAAgB,CAAA;AAIvB,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;AAEpF,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,UAAU,EACzB,MAAM,SAAS,aAAa,EAC5B,EACA,MAAM,EACN,MAAM,EACN,cAAc,GACf,EAAE;IACD,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,cAAc,CAAA;CAC/B;;yEAyMI,IAAI,CAAC,WAAW,CAAC,MAAM,0BAAe,EAAE,QAAQ,GAAG,UAAU,CAAC,GAAG;QAClE,QAAQ,EAAE,SAAS,CAAA;QACnB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;QAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;KAClB;;SAxFiB,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,SAEnE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GAC9B,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,YACzD;sBAhBA,OAAO,GAAG,SAAS;kBACvB,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS;YAejB,OAAO;SAInB,IAAI,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,8DAErE,IAAI,YACF;sBAvBA,OAAO,GAAG,SAAS;kBACvB,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS;YAsBjB,OAAO;SAInB,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,gEAE7D;sBA7BA,OAAO,GAAG,SAAS;kBACvB,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS;YA4BjB,OAAO;;oBAtFd,CAAC,iDACf,CAAC,WACC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,yCAG9D,OAAO,GAAG,IAAI;;EAwNlB"}
@@ -1,7 +1,7 @@
1
1
  import type { AsyncAction, AuthData, GenericModels, GetZeroMutators, Transaction } from './types';
2
2
  import type { HumanReadable, Query, ReadonlyJSONValue, SyncedQuery, Schema as ZeroSchema } from '@rocicorp/zero';
3
- export type ServerQueries = Record<string, Record<string, SyncedQuery<any, any, any, any, any>>>;
4
- export declare function createZeroServer<Schema extends ZeroSchema, Models extends GenericModels, ServerActions extends Record<string, unknown>>({ createServerActions, database, schema, models, serverQueries, }: {
3
+ export type SyncedQueries = Record<string, Record<string, SyncedQuery<any, any, any, any, any>>>;
4
+ export declare function createZeroServer<Schema extends ZeroSchema, Models extends GenericModels, ServerActions extends Record<string, unknown>, Queries extends SyncedQueries = Record<string, never>>({ createServerActions, database, schema, models, syncedQueries, }: {
5
5
  /**
6
6
  * The DB connection string, same as ZERO_UPSTREAM_DB
7
7
  */
@@ -9,7 +9,7 @@ export declare function createZeroServer<Schema extends ZeroSchema, Models exten
9
9
  schema: Schema;
10
10
  models: Models;
11
11
  createServerActions: () => ServerActions;
12
- serverQueries?: ServerQueries;
12
+ syncedQueries?: Queries;
13
13
  }): {
14
14
  handleMutationRequest: ({ authData, request, skipAsyncTasks, }: {
15
15
  authData: AuthData | null;
@@ -1 +1 @@
1
- {"version":3,"file":"createZeroServer.d.ts","sourceRoot":"","sources":["../src/createZeroServer.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,aAAa,EACb,eAAe,EACf,WAAW,EACZ,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EACV,aAAa,EACb,KAAK,EACL,iBAAiB,EACjB,WAAW,EACX,MAAM,IAAI,UAAU,EACrB,MAAM,gBAAgB,CAAA;AAIvB,MAAM,MAAM,aAAa,GAAG,MAAM,CAChC,MAAM,EACN,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CACrD,CAAA;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,UAAU,EACzB,MAAM,SAAS,aAAa,EAC5B,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,EACA,mBAAmB,EACnB,QAAQ,EACR,MAAM,EACN,MAAM,EACN,aAAa,GACd,EAAE;IACD;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,mBAAmB,EAAE,MAAM,aAAa,CAAA;IACxC,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;oEAuBI;QACD,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;QACzB,OAAO,EAAE,OAAO,CAAA;QAChB,cAAc,CAAC,EAAE,OAAO,CAAA;KACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDAsCE;QACD,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;QACzB,OAAO,EAAE,OAAO,CAAA;KACjB;;;;;;;;;;;;;;;;;;;;;;;kBAmDC,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,GAAG,CAAC,EAC5C,OAAO,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,SACrE,EAAE,KAAG,OAAO,CAAC,OAAO,CAAC;kBA7BvB,CAAC,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,aAC/D,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;YA2ChD,CAAC,MACV,CAAC,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,KACrD,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;EAqB7B"}
1
+ {"version":3,"file":"createZeroServer.d.ts","sourceRoot":"","sources":["../src/createZeroServer.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,aAAa,EACb,eAAe,EACf,WAAW,EACZ,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EACV,aAAa,EACb,KAAK,EACL,iBAAiB,EACjB,WAAW,EACX,MAAM,IAAI,UAAU,EACrB,MAAM,gBAAgB,CAAA;AAIvB,MAAM,MAAM,aAAa,GAAG,MAAM,CAChC,MAAM,EACN,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CACrD,CAAA;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,UAAU,EACzB,MAAM,SAAS,aAAa,EAC5B,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,OAAO,SAAS,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACrD,EACA,mBAAmB,EACnB,QAAQ,EACR,MAAM,EACN,MAAM,EACN,aAAa,GACd,EAAE;IACD;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,mBAAmB,EAAE,MAAM,aAAa,CAAA;IACxC,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;oEAuBI;QACD,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;QACzB,OAAO,EAAE,OAAO,CAAA;QAChB,cAAc,CAAC,EAAE,OAAO,CAAA;KACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDAgDE;QACD,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;QACzB,OAAO,EAAE,OAAO,CAAA;KACjB;;;;;;;;;;;;;;;;;;;;;;;kBAiDC,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,GAAG,CAAC,EAC5C,OAAO,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,SACrE,EAAE,KAAG,OAAO,CAAC,OAAO,CAAC;kBA7BvB,CAAC,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,aAC/D,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;YA2ChD,CAAC,MACV,CAAC,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,KACrD,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;EAqB7B"}