on-zero 0.6.13 → 0.6.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/createSchemaFromDrizzle.cjs +4 -4
- package/dist/cjs/createSchemaFromDrizzle.native.js +4 -4
- package/dist/cjs/createSchemaFromDrizzle.native.js.map +1 -1
- package/dist/cjs/createZeroDirectServer.cjs +279 -0
- package/dist/cjs/createZeroDirectServer.native.js +292 -0
- package/dist/cjs/createZeroDirectServer.native.js.map +1 -0
- package/dist/cjs/createZeroSQLiteServer.cjs +8 -277
- package/dist/cjs/createZeroSQLiteServer.native.js +8 -390
- package/dist/cjs/createZeroSQLiteServer.native.js.map +1 -1
- package/dist/cjs/createZeroSQLiteServer.test.cjs +30 -3
- package/dist/cjs/createZeroSQLiteServer.test.native.js +31 -3
- package/dist/cjs/createZeroSQLiteServer.test.native.js.map +1 -1
- package/dist/cjs/createZeroServerCore.cjs +20 -205
- package/dist/cjs/createZeroServerCore.native.js +19 -213
- package/dist/cjs/createZeroServerCore.native.js.map +1 -1
- package/dist/cjs/generate.cjs +10 -3
- package/dist/cjs/generate.native.js +10 -3
- package/dist/cjs/generate.native.js.map +1 -1
- package/dist/cjs/generate.test.cjs +39 -0
- package/dist/cjs/generate.test.native.js +39 -0
- package/dist/cjs/generate.test.native.js.map +1 -1
- package/dist/cjs/sqliteRuntime.cjs +318 -0
- package/dist/cjs/sqliteRuntime.native.js +438 -0
- package/dist/cjs/sqliteRuntime.native.js.map +1 -0
- package/dist/cjs/syncHost.cjs +16 -9
- package/dist/cjs/syncHost.native.js +21 -12
- package/dist/cjs/syncHost.native.js.map +1 -1
- package/dist/cjs/syncHost.test.cjs +13 -2
- package/dist/cjs/syncHost.test.native.js +14 -2
- package/dist/cjs/syncHost.test.native.js.map +1 -1
- package/dist/esm/createSchemaFromDrizzle.mjs +2 -2
- package/dist/esm/createSchemaFromDrizzle.native.js +2 -2
- package/dist/esm/createZeroDirectServer.mjs +251 -0
- package/dist/esm/createZeroDirectServer.mjs.map +1 -0
- package/dist/esm/createZeroDirectServer.native.js +261 -0
- package/dist/esm/createZeroDirectServer.native.js.map +1 -0
- package/dist/esm/createZeroSQLiteServer.mjs +3 -272
- package/dist/esm/createZeroSQLiteServer.mjs.map +1 -1
- package/dist/esm/createZeroSQLiteServer.native.js +3 -385
- package/dist/esm/createZeroSQLiteServer.native.js.map +1 -1
- package/dist/esm/createZeroSQLiteServer.test.mjs +30 -3
- package/dist/esm/createZeroSQLiteServer.test.mjs.map +1 -1
- package/dist/esm/createZeroSQLiteServer.test.native.js +31 -3
- package/dist/esm/createZeroSQLiteServer.test.native.js.map +1 -1
- package/dist/esm/createZeroServerCore.mjs +18 -202
- package/dist/esm/createZeroServerCore.mjs.map +1 -1
- package/dist/esm/createZeroServerCore.native.js +18 -211
- package/dist/esm/createZeroServerCore.native.js.map +1 -1
- package/dist/esm/generate.mjs +10 -3
- package/dist/esm/generate.mjs.map +1 -1
- package/dist/esm/generate.native.js +10 -3
- package/dist/esm/generate.native.js.map +1 -1
- package/dist/esm/generate.test.mjs +39 -1
- package/dist/esm/generate.test.mjs.map +1 -1
- package/dist/esm/generate.test.native.js +39 -1
- package/dist/esm/generate.test.native.js.map +1 -1
- package/dist/esm/sqliteRuntime.mjs +289 -0
- package/dist/esm/sqliteRuntime.mjs.map +1 -0
- package/dist/esm/sqliteRuntime.native.js +406 -0
- package/dist/esm/sqliteRuntime.native.js.map +1 -0
- package/dist/esm/syncHost.mjs +14 -7
- package/dist/esm/syncHost.mjs.map +1 -1
- package/dist/esm/syncHost.native.js +19 -10
- package/dist/esm/syncHost.native.js.map +1 -1
- package/dist/esm/syncHost.test.mjs +13 -2
- package/dist/esm/syncHost.test.mjs.map +1 -1
- package/dist/esm/syncHost.test.native.js +14 -2
- package/dist/esm/syncHost.test.native.js.map +1 -1
- package/package.json +5 -6
- package/src/createSchemaFromDrizzle.ts +2 -2
- package/src/createZeroDirectServer.ts +427 -0
- package/src/createZeroSQLiteServer.test.ts +20 -5
- package/src/createZeroSQLiteServer.ts +14 -481
- package/src/createZeroServerCore.ts +32 -337
- package/src/generate.test.ts +57 -1
- package/src/generate.ts +23 -3
- package/src/sqliteRuntime.ts +512 -0
- package/src/syncHost.test.ts +10 -3
- package/src/syncHost.ts +49 -12
- package/test-fixtures/server-return-types.ts +8 -1
- package/types/createSchemaFromDrizzle.d.ts +2 -2
- package/types/createSchemaFromDrizzle.d.ts.map +1 -1
- package/types/createZeroDirectServer.d.ts +80 -0
- package/types/createZeroDirectServer.d.ts.map +1 -0
- package/types/createZeroSQLiteServer.d.ts +5 -30
- package/types/createZeroSQLiteServer.d.ts.map +1 -1
- package/types/createZeroServerCore.d.ts +30 -87
- package/types/createZeroServerCore.d.ts.map +1 -1
- package/types/generate.d.ts.map +1 -1
- package/types/sqliteRuntime.d.ts +71 -0
- package/types/sqliteRuntime.d.ts.map +1 -0
- package/types/syncHost.d.ts +10 -19
- package/types/syncHost.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DatabaseSync","defineQueries","defineQuery","v","afterEach","beforeEach","describe","expect","test","getScopedAuthData","zeroHttpFixtureSchema","createZeroSyncHostAdapter","zql","queries","project","byOwner","object","ownerId","string","args","where","db","executor","transaction","lastQueryFormat","exec","sql","params","prepare","run","query","all","queryAst","_ast","format","rows","singular","work","effects","value","defer","effect","
|
|
1
|
+
{"version":3,"names":["DatabaseSync","defineQueries","defineQuery","v","afterEach","beforeEach","describe","expect","test","getScopedAuthData","zeroHttpFixtureSchema","createZeroSyncHostAdapter","zql","queries","project","byOwner","object","ownerId","string","args","where","db","executor","transaction","lastQueryFormat","statements","exec","sql","params","metadata","push","result","prepare","run","changes","Number","query","all","queryAst","_ast","format","rows","singular","work","effects","value","defer","effect","error","close","effectAuthID","validatedAuthID","adapter","schema","models","mutate","create","authData","server","tx","id","toBe","insert","asyncTasks","createServerActions","validateMutation","Object","keys","mutators","toEqual","context","name","mutationContext","table","publicTable","kind","effectRuns","reject","Error","catch","caught","toMatchObject","message","details","q","one","resolves","relationships","validation","validateQuery","ast","resolveQuery","userID","role","JSON","stringify","toContain","queryName","claims","clientID","mutationID"],"sources":["../../src/syncHost.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -23,13 +23,20 @@ describe("createZeroSyncHostAdapter", function () {
|
|
|
23
23
|
var executor;
|
|
24
24
|
var transaction;
|
|
25
25
|
var lastQueryFormat;
|
|
26
|
+
var statements;
|
|
26
27
|
beforeEach(function () {
|
|
27
28
|
db = new DatabaseSync(":memory:");
|
|
28
29
|
db.exec("CREATE TABLE project (id TEXT PRIMARY KEY, ownerId TEXT NOT NULL, name TEXT NOT NULL)");
|
|
30
|
+
statements = [];
|
|
29
31
|
executor = {
|
|
30
32
|
exec(sql) {
|
|
31
|
-
var params = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : []
|
|
32
|
-
|
|
33
|
+
var params = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [],
|
|
34
|
+
metadata = arguments.length > 2 ? arguments[2] : void 0;
|
|
35
|
+
if (metadata) statements.push(metadata);
|
|
36
|
+
var result = db.prepare(sql).run(...params);
|
|
37
|
+
return {
|
|
38
|
+
changes: Number(result.changes)
|
|
39
|
+
};
|
|
33
40
|
},
|
|
34
41
|
query(sql) {
|
|
35
42
|
var params = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
|
|
@@ -134,6 +141,11 @@ describe("createZeroSyncHostAdapter", function () {
|
|
|
134
141
|
}]);
|
|
135
142
|
expect(validatedAuthID).toBe("u1");
|
|
136
143
|
expect(effectAuthID).toBe("u1");
|
|
144
|
+
expect(statements).toEqual([{
|
|
145
|
+
table: "project",
|
|
146
|
+
publicTable: "project",
|
|
147
|
+
kind: "insert"
|
|
148
|
+
}]);
|
|
137
149
|
});
|
|
138
150
|
test("returns a structural application error and drops rolled-back effects", async function () {
|
|
139
151
|
var effectRuns = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DatabaseSync","defineQueries","defineQuery","v","afterEach","beforeEach","describe","expect","test","getScopedAuthData","zeroHttpFixtureSchema","createZeroSyncHostAdapter","zql","queries","project","byOwner","object","ownerId","string","param","args","where","db","executor","transaction","lastQueryFormat","exec","sql","params","arguments","length","prepare","run","query","all","queryAst","_ast","format","rows","singular","work","effects","value","defer","effect2","
|
|
1
|
+
{"version":3,"names":["DatabaseSync","defineQueries","defineQuery","v","afterEach","beforeEach","describe","expect","test","getScopedAuthData","zeroHttpFixtureSchema","createZeroSyncHostAdapter","zql","queries","project","byOwner","object","ownerId","string","param","args","where","db","executor","transaction","lastQueryFormat","statements","exec","sql","params","arguments","length","metadata","push","result","prepare","run","changes","Number","query","all","queryAst","_ast","format","rows","singular","work","effects","value","defer","effect2","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","next","done","effect","err","return","error","close","effectAuthID","validatedAuthID","adapter","schema","models","mutate","create","authData","server","tx","id","toBe","insert","asyncTasks","_getScopedAuthData","createServerActions","validateMutation","Object","keys","mutators","toEqual","context","name","mutationContext","table","publicTable","kind","effectRuns","reject","Error","catch","caught","toMatchObject","message","details","q","one"],"sources":["../../src/syncHost.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "on-zero",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.15",
|
|
4
4
|
"description": "A typed layer over @rocicorp/zero with queries, mutations, and permissions",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"source": "src/index.ts",
|
|
@@ -99,16 +99,16 @@
|
|
|
99
99
|
}
|
|
100
100
|
},
|
|
101
101
|
"dependencies": {
|
|
102
|
-
"@take-out/helpers": "0.6.
|
|
102
|
+
"@take-out/helpers": "0.6.15",
|
|
103
103
|
"chokidar": "^4.0.3",
|
|
104
104
|
"citty": "^0.1.6",
|
|
105
105
|
"valibot": "^1.1.0"
|
|
106
106
|
},
|
|
107
107
|
"peerDependencies": {
|
|
108
|
-
"pg": ">=8.0.0",
|
|
109
108
|
"@rocicorp/zero": ">=1.5.0",
|
|
110
109
|
"drizzle-orm": ">=1.0.0-beta.0 <2",
|
|
111
|
-
"drizzle-zero": "
|
|
110
|
+
"drizzle-zero-sqlite": "^0.5.20",
|
|
111
|
+
"pg": ">=8.0.0",
|
|
112
112
|
"react": "*",
|
|
113
113
|
"react-native": "*"
|
|
114
114
|
},
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
"drizzle-orm": {
|
|
123
123
|
"optional": true
|
|
124
124
|
},
|
|
125
|
-
"drizzle-zero": {
|
|
125
|
+
"drizzle-zero-sqlite": {
|
|
126
126
|
"optional": true
|
|
127
127
|
}
|
|
128
128
|
},
|
|
@@ -131,7 +131,6 @@
|
|
|
131
131
|
"@types/node": "25.2.0",
|
|
132
132
|
"@types/pg": "^8.11.10",
|
|
133
133
|
"@types/react": "^19.0.0",
|
|
134
|
-
"drizzle-zero": "1.0.0-beta.0",
|
|
135
134
|
"jsdom": "29.1.1",
|
|
136
135
|
"oxfmt": "^0.16.0",
|
|
137
136
|
"oxlint": "^1.31.0",
|
|
@@ -1,3 +1,3 @@
|
|
|
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'
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { mustGetQuery } from '@rocicorp/zero'
|
|
2
|
+
|
|
3
|
+
import { createPermissions } from './createPermissions'
|
|
4
|
+
import { createMutators } from './helpers/createMutators'
|
|
5
|
+
import {
|
|
6
|
+
getScopedAuthData,
|
|
7
|
+
isInZeroMutation,
|
|
8
|
+
mutatorContext,
|
|
9
|
+
runWithAuthScope,
|
|
10
|
+
} from './helpers/mutatorContext'
|
|
11
|
+
import { runWithQueryContext } from './helpers/queryContext'
|
|
12
|
+
import { getMutationsPermissions } from './modelRegistry'
|
|
13
|
+
import { setCustomQueries } from './run'
|
|
14
|
+
import { getZQL, setEnvironment, setSchema } from './state'
|
|
15
|
+
import { setEvaluatingPermission } from './where'
|
|
16
|
+
import { setRunner } from './zeroRunner'
|
|
17
|
+
|
|
18
|
+
import type {
|
|
19
|
+
AdminRoleMode,
|
|
20
|
+
AsyncAction,
|
|
21
|
+
AuthData,
|
|
22
|
+
GenericModels,
|
|
23
|
+
MutatorContext,
|
|
24
|
+
QueryBuilder,
|
|
25
|
+
Transaction,
|
|
26
|
+
} from './types'
|
|
27
|
+
import type {
|
|
28
|
+
AnyQueryRegistry,
|
|
29
|
+
HumanReadable,
|
|
30
|
+
Query,
|
|
31
|
+
Schema as ZeroSchema,
|
|
32
|
+
} from '@rocicorp/zero'
|
|
33
|
+
import type { Database, TransactionProviderInput } from '@rocicorp/zero/server'
|
|
34
|
+
|
|
35
|
+
type MutateAuthData = Pick<AuthData, 'email' | 'id'> & Partial<AuthData>
|
|
36
|
+
|
|
37
|
+
export type MutateOptions = {
|
|
38
|
+
authData?: MutateAuthData
|
|
39
|
+
awaitEffects?: boolean
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export type ServerMutate<Models extends GenericModels> = {
|
|
43
|
+
[Key in keyof Models]: {
|
|
44
|
+
[K in keyof Models[Key]['mutate']]: Models[Key]['mutate'][K] extends (
|
|
45
|
+
ctx: MutatorContext,
|
|
46
|
+
arg: infer Arg,
|
|
47
|
+
) => any
|
|
48
|
+
? (arg: Arg, options?: MutateOptions) => Promise<void>
|
|
49
|
+
: (options?: MutateOptions) => Promise<void>
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export type ValidateQueryArgs = {
|
|
54
|
+
authData: AuthData | null
|
|
55
|
+
queryName: string
|
|
56
|
+
params: unknown
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export type ValidateMutationArgs = {
|
|
60
|
+
authData: AuthData | null
|
|
61
|
+
mutatorName: string
|
|
62
|
+
tableName: string
|
|
63
|
+
args: unknown
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export type ValidateQueryFn = (args: ValidateQueryArgs) => void
|
|
67
|
+
export type ValidateMutationFn = (args: ValidateMutationArgs) => void | Promise<void>
|
|
68
|
+
|
|
69
|
+
export type ServerQueryResolverOptions = {
|
|
70
|
+
authData: AuthData | null
|
|
71
|
+
name: string
|
|
72
|
+
args: unknown
|
|
73
|
+
queries: AnyQueryRegistry
|
|
74
|
+
permissions: ReturnType<typeof createPermissions>
|
|
75
|
+
validateQuery?: ValidateQueryFn
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function resolveServerQuery({
|
|
79
|
+
authData,
|
|
80
|
+
name,
|
|
81
|
+
args,
|
|
82
|
+
queries,
|
|
83
|
+
permissions,
|
|
84
|
+
validateQuery,
|
|
85
|
+
}: ServerQueryResolverOptions) {
|
|
86
|
+
if (name.startsWith('permission.')) {
|
|
87
|
+
const table = name.slice('permission.'.length)
|
|
88
|
+
const { objOrId } = args as {
|
|
89
|
+
objOrId: string | Record<string, any>
|
|
90
|
+
}
|
|
91
|
+
const permission = getMutationsPermissions(table)
|
|
92
|
+
if (!permission) {
|
|
93
|
+
throw new Error(`[permission] no permission defined for table: ${table}`)
|
|
94
|
+
}
|
|
95
|
+
setEvaluatingPermission(true)
|
|
96
|
+
try {
|
|
97
|
+
return (getZQL() as any)[table]
|
|
98
|
+
.where((eb: any) => {
|
|
99
|
+
return permissions.buildPermissionQuery(
|
|
100
|
+
authData,
|
|
101
|
+
eb,
|
|
102
|
+
permission,
|
|
103
|
+
objOrId,
|
|
104
|
+
table,
|
|
105
|
+
)
|
|
106
|
+
})
|
|
107
|
+
.one()
|
|
108
|
+
} finally {
|
|
109
|
+
setEvaluatingPermission(false)
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (validateQuery) {
|
|
114
|
+
validateQuery({ authData, queryName: name, params: args })
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const query = (mustGetQuery as any)(queries, name)
|
|
118
|
+
return query.fn({ args, ctx: authData })
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export type TransactionAttemptLifecycle = {
|
|
122
|
+
beginAttempt(): void
|
|
123
|
+
completeAttempt(): void
|
|
124
|
+
rollbackAttempt(): void
|
|
125
|
+
commitTransaction(): void
|
|
126
|
+
rollbackTransaction(): void
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export type ZeroServerDatabase = Database<Transaction>
|
|
130
|
+
|
|
131
|
+
export type ZeroServerCommonOptions<
|
|
132
|
+
Schema extends ZeroSchema,
|
|
133
|
+
Models extends GenericModels,
|
|
134
|
+
ServerActions extends Record<string, unknown>,
|
|
135
|
+
> = {
|
|
136
|
+
schema: Schema
|
|
137
|
+
models: Models
|
|
138
|
+
createServerActions: () => ServerActions
|
|
139
|
+
queries?: AnyQueryRegistry
|
|
140
|
+
/** generated validators keyed by model and mutation name */
|
|
141
|
+
mutations?: Record<string, Record<string, any>>
|
|
142
|
+
/** synchronous query authorization hook; throw to reject */
|
|
143
|
+
validateQuery?: ValidateQueryFn
|
|
144
|
+
/** mutation authorization hook; throw to reject */
|
|
145
|
+
validateMutation?: ValidateMutationFn
|
|
146
|
+
/** controls which operations the admin role bypasses */
|
|
147
|
+
defaultAllowAdminRole?: AdminRoleMode
|
|
148
|
+
/** auth data used by direct server mutations when no scope provides it */
|
|
149
|
+
defaultMutateAuthData?: MutateAuthData
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export type ZeroDirectServerOptions<
|
|
153
|
+
Schema extends ZeroSchema,
|
|
154
|
+
Models extends GenericModels,
|
|
155
|
+
ServerActions extends Record<string, unknown>,
|
|
156
|
+
> = ZeroServerCommonOptions<Schema, Models, ServerActions> & {
|
|
157
|
+
createDatabase: () => ZeroServerDatabase
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export type ZeroDirectServer<Schema extends ZeroSchema, Models extends GenericModels> = {
|
|
161
|
+
transaction: <
|
|
162
|
+
CB extends (tx: Transaction) => Promise<any>,
|
|
163
|
+
Returns extends CB extends (tx: Transaction) => Promise<infer X> ? X : never,
|
|
164
|
+
>(
|
|
165
|
+
query: CB,
|
|
166
|
+
) => Promise<Returns>
|
|
167
|
+
mutate: ServerMutate<Models>
|
|
168
|
+
query: <R>(
|
|
169
|
+
cb: (q: QueryBuilder) => Query<any, Schema, R>,
|
|
170
|
+
authData?: AuthData | null,
|
|
171
|
+
) => Promise<HumanReadable<R>>
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export function createAsyncTaskCollector() {
|
|
175
|
+
const committed: AsyncAction[] = []
|
|
176
|
+
let attempt: AsyncAction[] | undefined
|
|
177
|
+
let completedAttempt: AsyncAction[] | undefined
|
|
178
|
+
const current = () => attempt ?? committed
|
|
179
|
+
const queue = new Proxy([] as AsyncAction[], {
|
|
180
|
+
deleteProperty(_target, property) {
|
|
181
|
+
return Reflect.deleteProperty(current(), property)
|
|
182
|
+
},
|
|
183
|
+
get(_target, property) {
|
|
184
|
+
const target = current()
|
|
185
|
+
const value = Reflect.get(target, property, target)
|
|
186
|
+
return typeof value === 'function' ? value.bind(target) : value
|
|
187
|
+
},
|
|
188
|
+
getOwnPropertyDescriptor(_target, property) {
|
|
189
|
+
return Reflect.getOwnPropertyDescriptor(current(), property)
|
|
190
|
+
},
|
|
191
|
+
has(_target, property) {
|
|
192
|
+
return Reflect.has(current(), property)
|
|
193
|
+
},
|
|
194
|
+
ownKeys() {
|
|
195
|
+
return Reflect.ownKeys(current())
|
|
196
|
+
},
|
|
197
|
+
set(_target, property, value) {
|
|
198
|
+
return Reflect.set(current(), property, value)
|
|
199
|
+
},
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
const lifecycle: TransactionAttemptLifecycle = {
|
|
203
|
+
beginAttempt() {
|
|
204
|
+
attempt = []
|
|
205
|
+
completedAttempt = undefined
|
|
206
|
+
},
|
|
207
|
+
completeAttempt() {
|
|
208
|
+
completedAttempt = attempt
|
|
209
|
+
attempt = undefined
|
|
210
|
+
},
|
|
211
|
+
rollbackAttempt() {
|
|
212
|
+
attempt = undefined
|
|
213
|
+
completedAttempt = undefined
|
|
214
|
+
},
|
|
215
|
+
commitTransaction() {
|
|
216
|
+
if (completedAttempt) committed.push(...completedAttempt)
|
|
217
|
+
completedAttempt = undefined
|
|
218
|
+
},
|
|
219
|
+
rollbackTransaction() {
|
|
220
|
+
attempt = undefined
|
|
221
|
+
completedAttempt = undefined
|
|
222
|
+
},
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return { committed, lifecycle, queue }
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export function createZeroDirectServerRuntime<
|
|
229
|
+
Schema extends ZeroSchema,
|
|
230
|
+
Models extends GenericModels,
|
|
231
|
+
ServerActions extends Record<string, unknown>,
|
|
232
|
+
>({
|
|
233
|
+
createDatabase,
|
|
234
|
+
createServerActions,
|
|
235
|
+
defaultAllowAdminRole = 'all',
|
|
236
|
+
defaultMutateAuthData = {} as MutateAuthData,
|
|
237
|
+
models,
|
|
238
|
+
mutations: mutationValidators,
|
|
239
|
+
queries,
|
|
240
|
+
schema,
|
|
241
|
+
validateMutation,
|
|
242
|
+
validateQuery,
|
|
243
|
+
}: ZeroDirectServerOptions<Schema, Models, ServerActions>): {
|
|
244
|
+
permissions: ReturnType<typeof createPermissions<Schema>>
|
|
245
|
+
server: ZeroDirectServer<Schema, Models>
|
|
246
|
+
} {
|
|
247
|
+
setSchema(schema)
|
|
248
|
+
setEnvironment('server')
|
|
249
|
+
|
|
250
|
+
const permissions = createPermissions<Schema>({
|
|
251
|
+
environment: 'server',
|
|
252
|
+
schema,
|
|
253
|
+
adminRoleMode: defaultAllowAdminRole,
|
|
254
|
+
})
|
|
255
|
+
|
|
256
|
+
async function runTransaction<
|
|
257
|
+
CB extends (tx: Transaction) => Promise<any>,
|
|
258
|
+
Returns extends CB extends (tx: Transaction) => Promise<infer X> ? X : never,
|
|
259
|
+
>(database: ZeroServerDatabase, query: CB): Promise<Returns> {
|
|
260
|
+
try {
|
|
261
|
+
if (isInZeroMutation()) {
|
|
262
|
+
const { tx } = mutatorContext()
|
|
263
|
+
return await query(tx)
|
|
264
|
+
}
|
|
265
|
+
return (await database.transaction(query, dummyTransactionInput)) as Returns
|
|
266
|
+
} catch (err) {
|
|
267
|
+
if ((err as any)?.name !== 'PermissionError') {
|
|
268
|
+
console.error(`Error running transaction(): ${err}`)
|
|
269
|
+
}
|
|
270
|
+
throw err
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
async function transaction<
|
|
275
|
+
CB extends (tx: Transaction) => Promise<any>,
|
|
276
|
+
Returns extends CB extends (tx: Transaction) => Promise<infer X> ? X : never,
|
|
277
|
+
>(query: CB): Promise<Returns> {
|
|
278
|
+
return runTransaction(createDatabase(), query)
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
async function runMutate(
|
|
282
|
+
modelName: string,
|
|
283
|
+
mutatorName: string,
|
|
284
|
+
mutatorArg: unknown,
|
|
285
|
+
options?: MutateOptions,
|
|
286
|
+
) {
|
|
287
|
+
let authData = options?.authData
|
|
288
|
+
if (!authData) {
|
|
289
|
+
const scoped = getScopedAuthData()
|
|
290
|
+
if (scoped) authData = scoped as MutateAuthData
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const tasks = createAsyncTaskCollector()
|
|
294
|
+
const mutators = createMutators({
|
|
295
|
+
models,
|
|
296
|
+
environment: 'server',
|
|
297
|
+
asyncTasks: tasks.queue,
|
|
298
|
+
authData: {
|
|
299
|
+
...defaultMutateAuthData,
|
|
300
|
+
...authData,
|
|
301
|
+
},
|
|
302
|
+
createServerActions,
|
|
303
|
+
can: permissions.can,
|
|
304
|
+
validateMutation,
|
|
305
|
+
mutationValidators,
|
|
306
|
+
})
|
|
307
|
+
const modelMutators = mutators[modelName as keyof typeof mutators] as Record<
|
|
308
|
+
string,
|
|
309
|
+
(tx: Transaction, arg?: unknown) => Promise<void>
|
|
310
|
+
>
|
|
311
|
+
const mutator = modelMutators[mutatorName]
|
|
312
|
+
|
|
313
|
+
await runTransaction(
|
|
314
|
+
createDatabaseWithLifecycle(createDatabase(), tasks.lifecycle),
|
|
315
|
+
async (tx) => {
|
|
316
|
+
await mutator(tx, mutatorArg)
|
|
317
|
+
},
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
if (tasks.committed.length) {
|
|
321
|
+
const resolvedAuth = authData ?? null
|
|
322
|
+
const promise = Promise.all(
|
|
323
|
+
tasks.committed.map((task) => runWithAuthScope(resolvedAuth, task)),
|
|
324
|
+
)
|
|
325
|
+
if (options?.awaitEffects) {
|
|
326
|
+
await promise
|
|
327
|
+
} else {
|
|
328
|
+
promise.catch((err: unknown) => {
|
|
329
|
+
console.error('[mutate] async tasks failed', err)
|
|
330
|
+
})
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
const mutate = new Proxy({} as ServerMutate<Models>, {
|
|
336
|
+
get(_, modelName: string) {
|
|
337
|
+
return new Proxy(
|
|
338
|
+
{},
|
|
339
|
+
{
|
|
340
|
+
get(_, mutatorName: string) {
|
|
341
|
+
return (arg: unknown, options?: MutateOptions) =>
|
|
342
|
+
runMutate(modelName, mutatorName, arg, options)
|
|
343
|
+
},
|
|
344
|
+
},
|
|
345
|
+
)
|
|
346
|
+
},
|
|
347
|
+
})
|
|
348
|
+
|
|
349
|
+
function query<R>(
|
|
350
|
+
cb: (q: QueryBuilder) => Query<any, Schema, R>,
|
|
351
|
+
authData?: AuthData | null,
|
|
352
|
+
): Promise<HumanReadable<R>> {
|
|
353
|
+
const run = () =>
|
|
354
|
+
transaction(async (tx) => {
|
|
355
|
+
return tx.run(cb(getZQL()))
|
|
356
|
+
}) as any
|
|
357
|
+
|
|
358
|
+
if (authData !== undefined) {
|
|
359
|
+
return runWithQueryContext({ authData }, run)
|
|
360
|
+
}
|
|
361
|
+
return run()
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
if (queries) {
|
|
365
|
+
setCustomQueries(queries)
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
setRunner((queryObj) => {
|
|
369
|
+
return transaction(async (tx) => {
|
|
370
|
+
return tx.run(queryObj)
|
|
371
|
+
})
|
|
372
|
+
})
|
|
373
|
+
|
|
374
|
+
return {
|
|
375
|
+
permissions,
|
|
376
|
+
server: {
|
|
377
|
+
transaction,
|
|
378
|
+
mutate,
|
|
379
|
+
query,
|
|
380
|
+
},
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
export function createZeroDirectServer<
|
|
385
|
+
Schema extends ZeroSchema,
|
|
386
|
+
Models extends GenericModels,
|
|
387
|
+
ServerActions extends Record<string, unknown>,
|
|
388
|
+
>(
|
|
389
|
+
options: ZeroDirectServerOptions<Schema, Models, ServerActions>,
|
|
390
|
+
): ZeroDirectServer<Schema, Models> {
|
|
391
|
+
return createZeroDirectServerRuntime(options).server
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
function createDatabaseWithLifecycle(
|
|
395
|
+
database: ZeroServerDatabase,
|
|
396
|
+
lifecycle: TransactionAttemptLifecycle,
|
|
397
|
+
): ZeroServerDatabase {
|
|
398
|
+
return {
|
|
399
|
+
async transaction(callback, input) {
|
|
400
|
+
try {
|
|
401
|
+
const value = await database.transaction(async (tx, hooks) => {
|
|
402
|
+
lifecycle.beginAttempt()
|
|
403
|
+
try {
|
|
404
|
+
const result = await callback(tx, hooks)
|
|
405
|
+
lifecycle.completeAttempt()
|
|
406
|
+
return result
|
|
407
|
+
} catch (error) {
|
|
408
|
+
lifecycle.rollbackAttempt()
|
|
409
|
+
throw error
|
|
410
|
+
}
|
|
411
|
+
}, input)
|
|
412
|
+
lifecycle.commitTransaction()
|
|
413
|
+
return value
|
|
414
|
+
} catch (error) {
|
|
415
|
+
lifecycle.rollbackTransaction()
|
|
416
|
+
throw error
|
|
417
|
+
}
|
|
418
|
+
},
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
const dummyTransactionInput: TransactionProviderInput = {
|
|
423
|
+
clientGroupID: 'unused',
|
|
424
|
+
clientID: 'unused',
|
|
425
|
+
mutationID: 42,
|
|
426
|
+
upstreamSchema: 'unused',
|
|
427
|
+
}
|
|
@@ -8,6 +8,7 @@ import { createZeroSQLiteServer } from './createZeroSQLiteServer'
|
|
|
8
8
|
import { zeroHttpFixtureSchema } from './httpPull/fixtureSchema'
|
|
9
9
|
|
|
10
10
|
import type {
|
|
11
|
+
SqlStatementMetadata,
|
|
11
12
|
SQLiteTransactionExecutor,
|
|
12
13
|
SQLiteTransactionProvider,
|
|
13
14
|
} from './createZeroSQLiteServer'
|
|
@@ -115,6 +116,7 @@ describe('createZeroSQLiteServer', () => {
|
|
|
115
116
|
let db: DatabaseSync
|
|
116
117
|
let retryNextTransaction: boolean
|
|
117
118
|
let transactionProvider: SQLiteTransactionProvider
|
|
119
|
+
let statements: SqlStatementMetadata[]
|
|
118
120
|
|
|
119
121
|
beforeEach(() => {
|
|
120
122
|
db = new DatabaseSync(':memory:')
|
|
@@ -126,9 +128,12 @@ describe('createZeroSQLiteServer', () => {
|
|
|
126
128
|
)
|
|
127
129
|
|
|
128
130
|
retryNextTransaction = false
|
|
131
|
+
statements = []
|
|
129
132
|
const executor: SQLiteTransactionExecutor = {
|
|
130
|
-
async exec(sql, params = []) {
|
|
131
|
-
|
|
133
|
+
async exec(sql, params = [], metadata) {
|
|
134
|
+
if (metadata) statements.push(metadata)
|
|
135
|
+
const result = db.prepare(sql).run(...(params as SQLInputValue[]))
|
|
136
|
+
return { changes: Number(result.changes) }
|
|
132
137
|
},
|
|
133
138
|
async query<Row extends Record<string, unknown>>(sql, params = []) {
|
|
134
139
|
return db.prepare(sql).all(...(params as SQLInputValue[])) as Row[]
|
|
@@ -165,7 +170,9 @@ describe('createZeroSQLiteServer', () => {
|
|
|
165
170
|
return (format.singular ? rows[0] : rows) as Result
|
|
166
171
|
},
|
|
167
172
|
}
|
|
168
|
-
const run = async <R>(
|
|
173
|
+
const run = async <R>(
|
|
174
|
+
callback: (tx: SQLiteTransactionExecutor) => R | Promise<R>,
|
|
175
|
+
) => {
|
|
169
176
|
db.exec('BEGIN')
|
|
170
177
|
try {
|
|
171
178
|
const value = await callback(executor)
|
|
@@ -177,7 +184,7 @@ describe('createZeroSQLiteServer', () => {
|
|
|
177
184
|
}
|
|
178
185
|
}
|
|
179
186
|
transactionProvider = async <R>(
|
|
180
|
-
callback: (tx: SQLiteTransactionExecutor) => Promise<R>,
|
|
187
|
+
callback: (tx: SQLiteTransactionExecutor) => R | Promise<R>,
|
|
181
188
|
) => {
|
|
182
189
|
if (retryNextTransaction) {
|
|
183
190
|
retryNextTransaction = false
|
|
@@ -403,6 +410,12 @@ describe('createZeroSQLiteServer', () => {
|
|
|
403
410
|
|
|
404
411
|
await server.mutate.note.delete({ id: 'n1' })
|
|
405
412
|
expect(db.prepare('SELECT * FROM note_records').all()).toEqual([])
|
|
413
|
+
expect(statements).toEqual([
|
|
414
|
+
{ table: 'note_records', publicTable: 'note', kind: 'insert' },
|
|
415
|
+
{ table: 'note_records', publicTable: 'note', kind: 'upsert' },
|
|
416
|
+
{ table: 'note_records', publicTable: 'note', kind: 'update' },
|
|
417
|
+
{ table: 'note_records', publicTable: 'note', kind: 'delete' },
|
|
418
|
+
])
|
|
406
419
|
})
|
|
407
420
|
|
|
408
421
|
test('decodes destination rows through a hidden two-hop junction', async () => {
|
|
@@ -435,7 +448,9 @@ describe('createZeroSQLiteServer', () => {
|
|
|
435
448
|
}
|
|
436
449
|
let receivedQueryName: string | undefined
|
|
437
450
|
const hydratedExecutor = {
|
|
438
|
-
async exec() {
|
|
451
|
+
async exec() {
|
|
452
|
+
return { changes: 0 }
|
|
453
|
+
},
|
|
439
454
|
async query() {
|
|
440
455
|
return []
|
|
441
456
|
},
|