over-zero 0.0.5 → 0.0.6
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/createPermissions.cjs +3 -3
- package/dist/cjs/createPermissions.js +3 -3
- package/dist/cjs/createPermissions.js.map +1 -1
- package/dist/cjs/createPermissions.native.js +6 -3
- package/dist/cjs/createPermissions.native.js.map +1 -1
- package/dist/cjs/createZeroClient.cjs +3 -8
- package/dist/cjs/createZeroClient.js +4 -6
- package/dist/cjs/createZeroClient.js.map +1 -1
- package/dist/cjs/createZeroClient.native.js +4 -6
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/createZeroServer.cjs +18 -16
- package/dist/cjs/createZeroServer.js +18 -14
- package/dist/cjs/createZeroServer.js.map +2 -2
- package/dist/cjs/createZeroServer.native.js +20 -14
- package/dist/cjs/createZeroServer.native.js.map +2 -2
- package/dist/cjs/helpers/createMutators.js.map +1 -1
- package/dist/cjs/mutations.js.map +1 -1
- package/dist/esm/createPermissions.js +3 -3
- package/dist/esm/createPermissions.js.map +1 -1
- package/dist/esm/createPermissions.mjs +3 -3
- package/dist/esm/createPermissions.mjs.map +1 -1
- package/dist/esm/createPermissions.native.js +6 -3
- package/dist/esm/createPermissions.native.js.map +1 -1
- package/dist/esm/createZeroClient.js +5 -7
- package/dist/esm/createZeroClient.js.map +1 -1
- package/dist/esm/createZeroClient.mjs +4 -9
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +4 -9
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroServer.js +18 -14
- package/dist/esm/createZeroServer.js.map +2 -2
- package/dist/esm/createZeroServer.mjs +18 -16
- package/dist/esm/createZeroServer.mjs.map +1 -1
- package/dist/esm/createZeroServer.native.js +20 -16
- package/dist/esm/createZeroServer.native.js.map +1 -1
- package/dist/esm/helpers/createMutators.js.map +1 -1
- package/dist/esm/helpers/createMutators.mjs.map +1 -1
- package/dist/esm/helpers/createMutators.native.js.map +1 -1
- package/dist/esm/mutations.js.map +1 -1
- package/dist/esm/mutations.mjs.map +1 -1
- package/dist/esm/mutations.native.js.map +1 -1
- package/package.json +2 -2
- package/src/createPermissions.ts +46 -39
- package/src/createZeroClient.tsx +7 -7
- package/src/createZeroServer.ts +28 -20
- package/src/helpers/createMutators.ts +4 -3
- package/src/mutations.ts +3 -6
- package/src/types.ts +19 -8
- package/types/createPermissions.d.ts +2 -2
- package/types/createPermissions.d.ts.map +1 -1
- package/types/createZeroServer.d.ts +1 -1
- package/types/createZeroServer.d.ts.map +1 -1
- package/types/helpers/createMutators.d.ts +2 -2
- package/types/helpers/createMutators.d.ts.map +1 -1
- package/types/mutations.d.ts +1 -1
- package/types/mutations.d.ts.map +1 -1
- package/types/types.d.ts +7 -4
- package/types/types.d.ts.map +1 -1
package/src/createPermissions.ts
CHANGED
|
@@ -8,7 +8,14 @@ import { ANYONE_CAN, definePermissions } from '@rocicorp/zero'
|
|
|
8
8
|
import { ensure, EnsureError, objectEntries } from '@vxrn/helpers'
|
|
9
9
|
import { runWithContext } from './helpers/context'
|
|
10
10
|
import { prettyFormatZeroQuery } from './helpers/prettyFormatZeroQuery'
|
|
11
|
-
import type {
|
|
11
|
+
import type {
|
|
12
|
+
AuthData,
|
|
13
|
+
MutatorContext,
|
|
14
|
+
TableName,
|
|
15
|
+
Transaction,
|
|
16
|
+
Where,
|
|
17
|
+
Can,
|
|
18
|
+
} from './types'
|
|
12
19
|
import { getWhereTableName } from './where'
|
|
13
20
|
|
|
14
21
|
export function createPermissions<Schema extends ZeroSchema>({
|
|
@@ -100,10 +107,7 @@ export function createPermissions<Schema extends ZeroSchema>({
|
|
|
100
107
|
return eb.and(permissionCondition, ...primaryKeyWheres)
|
|
101
108
|
}
|
|
102
109
|
|
|
103
|
-
async
|
|
104
|
-
PWhere extends PermissionsWhere,
|
|
105
|
-
Action extends keyof ReturnType<PWhere>,
|
|
106
|
-
>(where: PWhere, action: Action, obj: any) {
|
|
110
|
+
const can: Can = async (where, action, obj) => {
|
|
107
111
|
const ctx = getContext()
|
|
108
112
|
const tableName = getWhereTableName(where)
|
|
109
113
|
if (!tableName) {
|
|
@@ -171,41 +175,44 @@ export function createPermissions<Schema extends ZeroSchema>({
|
|
|
171
175
|
|
|
172
176
|
const readPermissions = definePermissions<AuthData, Schema>(schema, async () => {
|
|
173
177
|
const permissionsEntries = await Promise.all(
|
|
174
|
-
objectEntries(models)
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
178
|
+
objectEntries(models)
|
|
179
|
+
// non permissioned models dont turn into read permissions
|
|
180
|
+
.filter(([_, model]) => !!model.permissions)
|
|
181
|
+
.map(async ([key, model]) => {
|
|
182
|
+
return await runWithContext(
|
|
183
|
+
{
|
|
184
|
+
authData: { id: '', role: undefined, email: '' },
|
|
185
|
+
} as any,
|
|
186
|
+
() => {
|
|
187
|
+
return [
|
|
188
|
+
key,
|
|
189
|
+
{
|
|
190
|
+
row: {
|
|
191
|
+
select: [
|
|
192
|
+
(authData: AuthData, eb: ExpressionBuilder<any, any>) => {
|
|
193
|
+
const out = model.permissions(eb, authData).read
|
|
194
|
+
|
|
195
|
+
if (out === true) {
|
|
196
|
+
return eb.and()
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (out === false) {
|
|
200
|
+
return eb.cmpLit(true, '=', false)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return out
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
// we have permissions on these through our model system with custom mutators:
|
|
207
|
+
insert: ANYONE_CAN,
|
|
208
|
+
update: ANYONE_CAN,
|
|
209
|
+
delete: ANYONE_CAN,
|
|
210
|
+
},
|
|
203
211
|
},
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
)
|
|
208
|
-
})
|
|
212
|
+
]
|
|
213
|
+
}
|
|
214
|
+
)
|
|
215
|
+
})
|
|
209
216
|
)
|
|
210
217
|
|
|
211
218
|
const permissions = Object.fromEntries(permissionsEntries)
|
package/src/createZeroClient.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Row, Zero, ZeroOptions, Schema as ZeroSchema } from '@rocicorp/zero'
|
|
2
2
|
import { useZero, ZeroProvider, useQuery as zeroUseQuery } from '@rocicorp/zero/react'
|
|
3
|
-
import { createEmitter,
|
|
3
|
+
import { createEmitter, mapObject } from '@vxrn/helpers'
|
|
4
4
|
import { createContext, use, useMemo, type ReactNode } from 'react'
|
|
5
5
|
import { createPermissions } from './createPermissions'
|
|
6
6
|
import { context } from './helpers/context'
|
|
@@ -39,9 +39,9 @@ export function createZeroClient<
|
|
|
39
39
|
environment: 'client',
|
|
40
40
|
})
|
|
41
41
|
|
|
42
|
-
const permissionCache = createLocalStorage<string, boolean>('permissions-cache', {
|
|
43
|
-
|
|
44
|
-
})
|
|
42
|
+
// const permissionCache = createLocalStorage<string, boolean>('permissions-cache', {
|
|
43
|
+
// storageLimit: 24,
|
|
44
|
+
// })
|
|
45
45
|
|
|
46
46
|
const zeroEvents = createEmitter<ZeroEvent | null>('zero', null)
|
|
47
47
|
|
|
@@ -65,14 +65,14 @@ export function createZeroClient<
|
|
|
65
65
|
// we fallback to just table.action, to avoid flickers for now
|
|
66
66
|
const keyBase = `${String(table)}${action}`
|
|
67
67
|
const key = `${keyBase}${typeof objOrId === 'string' ? objOrId : JSON.stringify(objOrId)}`
|
|
68
|
-
const cacheVal = permissionCache.get(key) ?? permissionCache.get(keyBase)
|
|
68
|
+
// const cacheVal = permissionCache.get(key) ?? permissionCache.get(keyBase)
|
|
69
69
|
const authData = useAuthData()
|
|
70
70
|
const permission = modelPermissions[table]
|
|
71
71
|
|
|
72
72
|
const query = (() => {
|
|
73
73
|
let baseQuery = zero.query[table].one()
|
|
74
74
|
|
|
75
|
-
if (!enabled) {
|
|
75
|
+
if (!enabled || !permission) {
|
|
76
76
|
return baseQuery
|
|
77
77
|
}
|
|
78
78
|
|
|
@@ -88,7 +88,7 @@ export function createZeroClient<
|
|
|
88
88
|
})()
|
|
89
89
|
|
|
90
90
|
const [data, status] = useQuery(query, {
|
|
91
|
-
enabled: Boolean(enabled && authData && objOrId),
|
|
91
|
+
enabled: Boolean(enabled && permission && authData && objOrId),
|
|
92
92
|
})
|
|
93
93
|
|
|
94
94
|
if (debug) {
|
package/src/createZeroServer.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Schema as ZeroSchema } from '@rocicorp/zero'
|
|
1
|
+
import type { Query, Schema as ZeroSchema } from '@rocicorp/zero'
|
|
2
2
|
import type { TransactionProviderInput } from '@rocicorp/zero/pg'
|
|
3
3
|
import { PostgresJSConnection, PushProcessor } from '@rocicorp/zero/pg'
|
|
4
4
|
import { ZQLDatabase } from '@rocicorp/zero/server'
|
|
@@ -87,7 +87,7 @@ export function createZeroServer<
|
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
const
|
|
90
|
+
const mutate = async (
|
|
91
91
|
run: (tx: Transaction, mutators: GetZeroMutators<Models>) => Promise<void>,
|
|
92
92
|
authData?: Pick<AuthData, 'email' | 'id'> & Partial<AuthData>
|
|
93
93
|
) => {
|
|
@@ -107,26 +107,14 @@ export function createZeroServer<
|
|
|
107
107
|
can: permissions.can,
|
|
108
108
|
})
|
|
109
109
|
|
|
110
|
-
await
|
|
110
|
+
await transaction(async (tx) => {
|
|
111
111
|
await run(tx, mutators)
|
|
112
112
|
})
|
|
113
113
|
|
|
114
114
|
await Promise.all(asyncTasks.map((t) => t()))
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
|
|
118
|
-
// TODO should unwrap q.query
|
|
119
|
-
const serverQuery = serverTransaction
|
|
120
|
-
|
|
121
|
-
// This is needed temporarily and will be cleaned up in the future.
|
|
122
|
-
const dummyTransactionInput: TransactionProviderInput = {
|
|
123
|
-
clientGroupID: 'unused',
|
|
124
|
-
clientID: 'unused',
|
|
125
|
-
mutationID: 42,
|
|
126
|
-
upstreamSchema: 'unused',
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
async function serverTransaction<
|
|
117
|
+
async function transaction<
|
|
130
118
|
CB extends (tx: Transaction) => Promise<any>,
|
|
131
119
|
Returns extends CB extends (tx: Transaction) => Promise<infer X> ? X : never,
|
|
132
120
|
>(query: CB): Promise<Returns> {
|
|
@@ -139,15 +127,35 @@ export function createZeroServer<
|
|
|
139
127
|
const output = await zeroServerDatabase.transaction(query, dummyTransactionInput)
|
|
140
128
|
return output as any
|
|
141
129
|
} catch (err) {
|
|
142
|
-
console.error(`Error running
|
|
130
|
+
console.error(`Error running transaction(): ${err}`)
|
|
143
131
|
throw err
|
|
144
132
|
}
|
|
145
133
|
}
|
|
146
134
|
|
|
135
|
+
type ZeroQueryFn<Response extends Query<any, any>> = (
|
|
136
|
+
query: Transaction['query']
|
|
137
|
+
) => Promise<Response>
|
|
138
|
+
|
|
139
|
+
async function query<GetQuery extends ZeroQueryFn<any>>(
|
|
140
|
+
cb: GetQuery
|
|
141
|
+
): Promise<ReturnType<GetQuery>> {
|
|
142
|
+
return await transaction(async (tx) => {
|
|
143
|
+
return await cb(tx.query)
|
|
144
|
+
})
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// This is needed temporarily and will be cleaned up in the future.
|
|
148
|
+
const dummyTransactionInput: TransactionProviderInput = {
|
|
149
|
+
clientGroupID: 'unused',
|
|
150
|
+
clientID: 'unused',
|
|
151
|
+
mutationID: 42,
|
|
152
|
+
upstreamSchema: 'unused',
|
|
153
|
+
}
|
|
154
|
+
|
|
147
155
|
return {
|
|
148
156
|
handleMutationRequest,
|
|
149
|
-
transaction
|
|
150
|
-
mutate
|
|
151
|
-
query
|
|
157
|
+
transaction,
|
|
158
|
+
mutate,
|
|
159
|
+
query,
|
|
152
160
|
}
|
|
153
161
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { isClient, isServer, mapObject, time } from '@vxrn/helpers'
|
|
2
2
|
import type {
|
|
3
3
|
AuthData,
|
|
4
|
+
Can,
|
|
4
5
|
GenericModels,
|
|
5
6
|
GetZeroMutators,
|
|
7
|
+
MutatorContext,
|
|
6
8
|
Transaction,
|
|
7
|
-
Where,
|
|
8
9
|
} from '../types'
|
|
9
10
|
import { runWithContext } from './context'
|
|
10
11
|
|
|
@@ -18,7 +19,7 @@ export function createMutators<Models extends GenericModels>({
|
|
|
18
19
|
}: {
|
|
19
20
|
environment: 'server' | 'client'
|
|
20
21
|
authData: AuthData | null
|
|
21
|
-
can:
|
|
22
|
+
can: Can
|
|
22
23
|
models: Models
|
|
23
24
|
asyncTasks?: Array<() => Promise<void>>
|
|
24
25
|
createServerActions?: () => Record<string, any>
|
|
@@ -31,7 +32,7 @@ export function createMutators<Models extends GenericModels>({
|
|
|
31
32
|
|
|
32
33
|
function withContext<Args extends any[]>(fn: (...args: Args) => Promise<void>) {
|
|
33
34
|
return async (tx: Transaction, ...args: Args): Promise<void> => {
|
|
34
|
-
const mutationContext = {
|
|
35
|
+
const mutationContext: MutatorContext = {
|
|
35
36
|
tx,
|
|
36
37
|
authData,
|
|
37
38
|
environment,
|
package/src/mutations.ts
CHANGED
|
@@ -46,11 +46,13 @@ type MutationsWithCRUD<Table extends GenericTable, Mutations extends MutationBui
|
|
|
46
46
|
: never
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
export function mutations<Mutations extends MutationBuilders>(
|
|
50
|
+
mutations: Mutations
|
|
51
|
+
): Mutations
|
|
49
52
|
export function mutations<Table extends GenericTable, Permissions extends Where>(
|
|
50
53
|
table: Table,
|
|
51
54
|
permissions: Permissions
|
|
52
55
|
): MutationsWithCRUD<Table, {}>
|
|
53
|
-
|
|
54
56
|
export function mutations<
|
|
55
57
|
Table extends GenericTable,
|
|
56
58
|
Permissions extends Where,
|
|
@@ -60,11 +62,6 @@ export function mutations<
|
|
|
60
62
|
permissions: Permissions,
|
|
61
63
|
mutations: Mutations
|
|
62
64
|
): MutationsWithCRUD<Table, Mutations>
|
|
63
|
-
|
|
64
|
-
export function mutations<Mutations extends MutationBuilder>(
|
|
65
|
-
mutations: Mutations
|
|
66
|
-
): Mutations
|
|
67
|
-
|
|
68
65
|
// TODO we should enforece the CRUD mutations obj to the callier so they get it auto-typed
|
|
69
66
|
export function mutations<
|
|
70
67
|
Table extends GenericTable,
|
package/src/types.ts
CHANGED
|
@@ -32,6 +32,7 @@ export interface Config {}
|
|
|
32
32
|
interface DefaultConfig {
|
|
33
33
|
schema: ZeroSchema
|
|
34
34
|
authData: {}
|
|
35
|
+
serverActions: null
|
|
35
36
|
}
|
|
36
37
|
|
|
37
38
|
interface FinalConfig extends Omit<DefaultConfig, keyof Config>, Config {}
|
|
@@ -48,6 +49,10 @@ export type AuthData = FinalConfig['authData'] extends Record<string, unknown>
|
|
|
48
49
|
? FinalConfig['authData']
|
|
49
50
|
: Record<string, unknown>
|
|
50
51
|
|
|
52
|
+
export type ServerActions = FinalConfig['serverActions'] extends Record<string, unknown>
|
|
53
|
+
? FinalConfig['serverActions']
|
|
54
|
+
: Record<string, unknown>
|
|
55
|
+
|
|
51
56
|
/**
|
|
52
57
|
* ➗0️⃣ END OVERRIDDEN TYPES
|
|
53
58
|
*/
|
|
@@ -64,7 +69,7 @@ type GetModelMutators<Models extends GenericModels> = {
|
|
|
64
69
|
export type GenericModels = {
|
|
65
70
|
[key: string]: {
|
|
66
71
|
mutate: Record<string, (ctx: MutatorContext, obj?: any) => Promise<any>>
|
|
67
|
-
permissions
|
|
72
|
+
permissions?: Where
|
|
68
73
|
}
|
|
69
74
|
}
|
|
70
75
|
|
|
@@ -74,13 +79,24 @@ export type TransformMutators<T> = {
|
|
|
74
79
|
: never
|
|
75
80
|
}
|
|
76
81
|
|
|
82
|
+
export type Where<Table extends TableName = TableName, ReturnType = any> = (
|
|
83
|
+
expressionBuilder: ExpressionBuilder<Schema, Table>,
|
|
84
|
+
auth: AuthData | null
|
|
85
|
+
) => ReturnType
|
|
86
|
+
|
|
87
|
+
export type Can = <PWhere extends Where, Action extends keyof ReturnType<PWhere>>(
|
|
88
|
+
where: PWhere,
|
|
89
|
+
action: Action,
|
|
90
|
+
obj: string | Record<string, unknown>
|
|
91
|
+
) => Promise<void>
|
|
92
|
+
|
|
77
93
|
export type MutatorContext = {
|
|
78
94
|
tx: Transaction
|
|
79
95
|
authData: AuthData | null
|
|
80
96
|
environment: 'server' | 'client'
|
|
81
|
-
serverActions?:
|
|
97
|
+
serverActions?: ServerActions
|
|
82
98
|
asyncTasks?: Array<() => Promise<void>>
|
|
83
|
-
can:
|
|
99
|
+
can: Can
|
|
84
100
|
didCanPermissionsRun?: boolean
|
|
85
101
|
}
|
|
86
102
|
|
|
@@ -108,9 +124,4 @@ export type TablePrimaryKeys<TS extends GenericTable> = TupleToUnion<
|
|
|
108
124
|
GetTableSchema<TS>['primaryKey']
|
|
109
125
|
>
|
|
110
126
|
|
|
111
|
-
export type Where<Table extends TableName = TableName, ReturnType = any> = (
|
|
112
|
-
expressionBuilder: ExpressionBuilder<Schema, Table>,
|
|
113
|
-
auth: AuthData | null
|
|
114
|
-
) => ReturnType
|
|
115
|
-
|
|
116
127
|
export type ZeroEvent = { type: 'error'; message: string }
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { Condition, ExpressionBuilder, Schema as ZeroSchema } from '@rocicorp/zero';
|
|
2
|
-
import type { AuthData, MutatorContext, Where } from './types';
|
|
2
|
+
import type { AuthData, MutatorContext, Where, Can } from './types';
|
|
3
3
|
export declare function createPermissions<Schema extends ZeroSchema>({ environment, schema, models, getContext, }: {
|
|
4
4
|
environment: 'client' | 'server';
|
|
5
5
|
schema: Schema;
|
|
6
6
|
models: any;
|
|
7
7
|
getContext: () => MutatorContext;
|
|
8
8
|
}): {
|
|
9
|
-
can:
|
|
9
|
+
can: Can;
|
|
10
10
|
buildPermissionQuery: <PermissionWhere extends Where<string, Partial<Record<("read" | "write" | "insert" | "update" | "delete" | "select") | (string & {}), boolean | Condition>>>, Action extends string>(authData: AuthData | null, eb: ExpressionBuilder<any, any>, permissionWhere: PermissionWhere, action: Action, objOrId: Record<string, any> | string) => Condition;
|
|
11
11
|
readPermissions: Promise<{
|
|
12
12
|
tables: Record<string, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPermissions.d.ts","sourceRoot":"","sources":["../src/createPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EAEjB,MAAM,IAAI,UAAU,EACrB,MAAM,gBAAgB,CAAA;AAKvB,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"createPermissions.d.ts","sourceRoot":"","sources":["../src/createPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EAEjB,MAAM,IAAI,UAAU,EACrB,MAAM,gBAAgB,CAAA;AAKvB,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EAGd,KAAK,EACL,GAAG,EACJ,MAAM,SAAS,CAAA;AAGhB,wBAAgB,iBAAiB,CAAC,MAAM,SAAS,UAAU,EAAE,EAC3D,WAAW,EACX,MAAM,EACN,MAAM,EACN,UAAU,GACX,EAAE;IACD,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,GAAG,CAAA;IACX,UAAU,EAAE,MAAM,cAAc,CAAA;CACjC;;2BA2BG,eAAe,8IACf,MAAM,SAAS,MAAM,YAEX,QAAQ,GAAG,IAAI,MACrB,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,mBACd,eAAe,UACxB,MAAM,WAEL,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM;;;;sBAhB7B,CAAA;sBAOV,CAAD;sBAEkB,CAAC;+BAED,CAAC;gCAKhB,CADF;;sBAGW,CAAC;;;sBAMV,CAAC;sBAGuB,CAAC;sBAIO,CAAC;+BACjC,CAAA;gCAGuB,CAAC;;sBAGO,CAAC;;;;EA4InC"}
|
|
@@ -58,6 +58,6 @@ export declare function createZeroServer<Schema extends ZeroSchema, Models exten
|
|
|
58
58
|
}>;
|
|
59
59
|
transaction: <CB extends (tx: Transaction) => Promise<any>, Returns extends CB extends (tx: Transaction) => Promise<infer X> ? X : never>(query: CB) => Promise<Returns>;
|
|
60
60
|
mutate: (run: (tx: Transaction, mutators: GetZeroMutators<Models>) => Promise<void>, authData?: Pick<AuthData, "email" | "id"> & Partial<AuthData>) => Promise<void>;
|
|
61
|
-
query: <
|
|
61
|
+
query: <GetQuery extends (query: Transaction["query"]) => Promise<any>>(cb: GetQuery) => Promise<ReturnType<GetQuery>>;
|
|
62
62
|
};
|
|
63
63
|
//# sourceMappingURL=createZeroServer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createZeroServer.d.ts","sourceRoot":"","sources":["../src/createZeroServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"createZeroServer.d.ts","sourceRoot":"","sources":["../src/createZeroServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,MAAM,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAA;AASjE,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,aAAa,EACb,eAAe,EACf,WAAW,EACZ,MAAM,SAAS,CAAA;AAEhB,wBAAgB,gBAAgB,CAC9B,MAAM,SAAS,UAAU,EACzB,MAAM,SAAS,aAAa,EAC5B,aAAa,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,EACA,mBAAmB,EACnB,MAAM,EACN,MAAM,GACP,EAAE;IACD,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,mBAAmB,EAAE,MAAM,aAAa,CAAA;CACzC;oEAqBI;QACD,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;QACzB,OAAO,EAAE,OAAO,CAAA;QAChB,cAAc,CAAC,EAAE,OAAO,CAAA;KACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA+DC,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;YA+C1C,QAAQ,iBAHpB,WAAW,CAAC,OAAO,CAAC,uBAIvB,QAAQ,KACX,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;EAoBjC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { AuthData, GenericModels, GetZeroMutators
|
|
1
|
+
import type { AuthData, Can, GenericModels, GetZeroMutators } from '../types';
|
|
2
2
|
export declare function createMutators<Models extends GenericModels>({ environment, authData, createServerActions, asyncTasks, can, models, }: {
|
|
3
3
|
environment: 'server' | 'client';
|
|
4
4
|
authData: AuthData | null;
|
|
5
|
-
can:
|
|
5
|
+
can: Can;
|
|
6
6
|
models: Models;
|
|
7
7
|
asyncTasks?: Array<() => Promise<void>>;
|
|
8
8
|
createServerActions?: () => Record<string, any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMutators.d.ts","sourceRoot":"","sources":["../../src/helpers/createMutators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,eAAe,
|
|
1
|
+
{"version":3,"file":"createMutators.d.ts","sourceRoot":"","sources":["../../src/helpers/createMutators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,QAAQ,EACR,GAAG,EACH,aAAa,EACb,eAAe,EAGhB,MAAM,UAAU,CAAA;AAGjB,wBAAgB,cAAc,CAAC,MAAM,SAAS,aAAa,EAAE,EAC3D,WAAW,EACX,QAAQ,EACR,mBAAmB,EACnB,UAAe,EACf,GAAG,EACH,MAAM,GACP,EAAE;IACD,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAChC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;IACzB,GAAG,EAAE,GAAG,CAAA;IACR,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IACvC,mBAAmB,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAChD,GAAG,eAAe,CAAC,MAAM,CAAC,CAwG1B"}
|
package/types/mutations.d.ts
CHANGED
|
@@ -13,8 +13,8 @@ type CRUDNames = 'insert' | 'upsert' | 'update' | 'delete';
|
|
|
13
13
|
type MutationsWithCRUD<Table extends GenericTable, Mutations extends MutationBuilders> = {
|
|
14
14
|
[Key in CRUDNames | keyof Mutations]: Key extends keyof Mutations ? Mutations[Key] : Key extends keyof CRUDMutations<any> ? CRUDMutations<Table>[Key] : never;
|
|
15
15
|
};
|
|
16
|
+
export declare function mutations<Mutations extends MutationBuilders>(mutations: Mutations): Mutations;
|
|
16
17
|
export declare function mutations<Table extends GenericTable, Permissions extends Where>(table: Table, permissions: Permissions): MutationsWithCRUD<Table, {}>;
|
|
17
18
|
export declare function mutations<Table extends GenericTable, Permissions extends Where, Mutations extends MutationBuilders>(table: Table, permissions: Permissions, mutations: Mutations): MutationsWithCRUD<Table, Mutations>;
|
|
18
|
-
export declare function mutations<Mutations extends MutationBuilder>(mutations: Mutations): Mutations;
|
|
19
19
|
export {};
|
|
20
20
|
//# sourceMappingURL=mutations.d.ts.map
|
package/types/mutations.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutations.d.ts","sourceRoot":"","sources":["../src/mutations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAC7D,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EAEd,cAAc,EACd,KAAK,EACN,MAAM,SAAS,CAAA;AAMhB,KAAK,eAAe,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AACnF,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;AAevD,KAAK,YAAY,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAA;AAEhD,KAAK,aAAa,CAAC,KAAK,SAAS,YAAY,IAAI;IAC/C,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9C,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9C,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9C,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;CAC/C,CAAA;AAED,KAAK,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE1D,KAAK,iBAAiB,CAAC,KAAK,SAAS,YAAY,EAAE,SAAS,SAAS,gBAAgB,IAAI;KACtF,GAAG,IAAI,SAAS,GAAG,MAAM,SAAS,GAAG,GAAG,SAAS,MAAM,SAAS,GAC7D,SAAS,CAAC,GAAG,CAAC,GACd,GAAG,SAAS,MAAM,aAAa,CAAC,GAAG,CAAC,GAClC,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GACzB,KAAK;CACZ,CAAA;AAED,wBAAgB,SAAS,CAAC,KAAK,SAAS,YAAY,EAAE,WAAW,SAAS,KAAK,EAC7E,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,GACvB,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"mutations.d.ts","sourceRoot":"","sources":["../src/mutations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAC7D,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EAEd,cAAc,EACd,KAAK,EACN,MAAM,SAAS,CAAA;AAMhB,KAAK,eAAe,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AACnF,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;AAevD,KAAK,YAAY,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAA;AAEhD,KAAK,aAAa,CAAC,KAAK,SAAS,YAAY,IAAI;IAC/C,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9C,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9C,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9C,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;CAC/C,CAAA;AAED,KAAK,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE1D,KAAK,iBAAiB,CAAC,KAAK,SAAS,YAAY,EAAE,SAAS,SAAS,gBAAgB,IAAI;KACtF,GAAG,IAAI,SAAS,GAAG,MAAM,SAAS,GAAG,GAAG,SAAS,MAAM,SAAS,GAC7D,SAAS,CAAC,GAAG,CAAC,GACd,GAAG,SAAS,MAAM,aAAa,CAAC,GAAG,CAAC,GAClC,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GACzB,KAAK;CACZ,CAAA;AAED,wBAAgB,SAAS,CAAC,SAAS,SAAS,gBAAgB,EAC1D,SAAS,EAAE,SAAS,GACnB,SAAS,CAAA;AACZ,wBAAgB,SAAS,CAAC,KAAK,SAAS,YAAY,EAAE,WAAW,SAAS,KAAK,EAC7E,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,GACvB,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AAC/B,wBAAgB,SAAS,CACvB,KAAK,SAAS,YAAY,EAC1B,WAAW,SAAS,KAAK,EACzB,SAAS,SAAS,gBAAgB,EAElC,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,GACnB,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA"}
|
package/types/types.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export interface Config {
|
|
|
24
24
|
interface DefaultConfig {
|
|
25
25
|
schema: ZeroSchema;
|
|
26
26
|
authData: {};
|
|
27
|
+
serverActions: null;
|
|
27
28
|
}
|
|
28
29
|
interface FinalConfig extends Omit<DefaultConfig, keyof Config>, Config {
|
|
29
30
|
}
|
|
@@ -31,6 +32,7 @@ export type Schema = FinalConfig['schema'];
|
|
|
31
32
|
export type TableName = keyof Schema['tables'] extends string ? keyof Schema['tables'] : string;
|
|
32
33
|
export type Transaction = ZeroTransaction<Schema>;
|
|
33
34
|
export type AuthData = FinalConfig['authData'] extends Record<string, unknown> ? FinalConfig['authData'] : Record<string, unknown>;
|
|
35
|
+
export type ServerActions = FinalConfig['serverActions'] extends Record<string, unknown> ? FinalConfig['serverActions'] : Record<string, unknown>;
|
|
34
36
|
/**
|
|
35
37
|
* ➗0️⃣ END OVERRIDDEN TYPES
|
|
36
38
|
*/
|
|
@@ -43,19 +45,21 @@ type GetModelMutators<Models extends GenericModels> = {
|
|
|
43
45
|
export type GenericModels = {
|
|
44
46
|
[key: string]: {
|
|
45
47
|
mutate: Record<string, (ctx: MutatorContext, obj?: any) => Promise<any>>;
|
|
46
|
-
permissions
|
|
48
|
+
permissions?: Where;
|
|
47
49
|
};
|
|
48
50
|
};
|
|
49
51
|
export type TransformMutators<T> = {
|
|
50
52
|
[K in keyof T]: T[K] extends (ctx: MutatorContext, ...args: infer Args) => infer Return ? (tx: Transaction, ...args: Args) => Return extends unknown ? Promise<any> : Return : never;
|
|
51
53
|
};
|
|
54
|
+
export type Where<Table extends TableName = TableName, ReturnType = any> = (expressionBuilder: ExpressionBuilder<Schema, Table>, auth: AuthData | null) => ReturnType;
|
|
55
|
+
export type Can = <PWhere extends Where, Action extends keyof ReturnType<PWhere>>(where: PWhere, action: Action, obj: string | Record<string, unknown>) => Promise<void>;
|
|
52
56
|
export type MutatorContext = {
|
|
53
57
|
tx: Transaction;
|
|
54
58
|
authData: AuthData | null;
|
|
55
59
|
environment: 'server' | 'client';
|
|
56
|
-
serverActions?:
|
|
60
|
+
serverActions?: ServerActions;
|
|
57
61
|
asyncTasks?: Array<() => Promise<void>>;
|
|
58
|
-
can:
|
|
62
|
+
can: Can;
|
|
59
63
|
didCanPermissionsRun?: boolean;
|
|
60
64
|
};
|
|
61
65
|
export type AsyncAction = () => Promise<void>;
|
|
@@ -64,7 +68,6 @@ type GetTableSchema<TS extends GenericTable> = TS extends TableBuilderWithColumn
|
|
|
64
68
|
export type TableInsertRow<TS extends GenericTable> = NullToOptional<Row<GetTableSchema<TS>>>;
|
|
65
69
|
export type TableUpdateRow<TS extends GenericTable> = Pick<Row<GetTableSchema<TS>>, TablePrimaryKeys<TS>> & Partial<TableInsertRow<TS>>;
|
|
66
70
|
export type TablePrimaryKeys<TS extends GenericTable> = TupleToUnion<GetTableSchema<TS>['primaryKey']>;
|
|
67
|
-
export type Where<Table extends TableName = TableName, ReturnType = any> = (expressionBuilder: ExpressionBuilder<Schema, Table>, auth: AuthData | null) => ReturnType;
|
|
68
71
|
export type ZeroEvent = {
|
|
69
72
|
type: 'error';
|
|
70
73
|
message: string;
|
package/types/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,GAAG,EACH,uBAAuB,EACvB,MAAM,IAAI,UAAU,EACpB,WAAW,IAAI,eAAe,EAC/B,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjE;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,MAAM;CAAG;AAE1B,UAAU,aAAa;IACrB,MAAM,EAAE,UAAU,CAAA;IAClB,QAAQ,EAAE,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|