on-zero 0.0.1
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/LICENSE +21 -0
- package/cli.cjs +3 -0
- package/dist/cjs/cli.cjs +405 -0
- package/dist/cjs/cli.js +397 -0
- package/dist/cjs/cli.js.map +6 -0
- package/dist/cjs/cli.native.js +505 -0
- package/dist/cjs/cli.native.js.map +1 -0
- package/dist/cjs/constants.cjs +28 -0
- package/dist/cjs/constants.js +22 -0
- package/dist/cjs/constants.js.map +6 -0
- package/dist/cjs/constants.native.js +31 -0
- package/dist/cjs/constants.native.js.map +1 -0
- package/dist/cjs/createPermissions.cjs +82 -0
- package/dist/cjs/createPermissions.js +77 -0
- package/dist/cjs/createPermissions.js.map +6 -0
- package/dist/cjs/createPermissions.native.js +107 -0
- package/dist/cjs/createPermissions.native.js.map +1 -0
- package/dist/cjs/createUseQuery.cjs +59 -0
- package/dist/cjs/createUseQuery.js +34 -0
- package/dist/cjs/createUseQuery.js.map +6 -0
- package/dist/cjs/createUseQuery.native.js +70 -0
- package/dist/cjs/createUseQuery.native.js.map +1 -0
- package/dist/cjs/createZeroClient.cjs +162 -0
- package/dist/cjs/createZeroClient.js +126 -0
- package/dist/cjs/createZeroClient.js.map +6 -0
- package/dist/cjs/createZeroClient.native.js +214 -0
- package/dist/cjs/createZeroClient.native.js.map +1 -0
- package/dist/cjs/createZeroServer.cjs +148 -0
- package/dist/cjs/createZeroServer.js +126 -0
- package/dist/cjs/createZeroServer.js.map +6 -0
- package/dist/cjs/createZeroServer.native.js +170 -0
- package/dist/cjs/createZeroServer.native.js.map +1 -0
- package/dist/cjs/helpers/batchQuery.cjs +49 -0
- package/dist/cjs/helpers/batchQuery.js +38 -0
- package/dist/cjs/helpers/batchQuery.js.map +6 -0
- package/dist/cjs/helpers/batchQuery.native.js +49 -0
- package/dist/cjs/helpers/batchQuery.native.js.map +1 -0
- package/dist/cjs/helpers/createMutators.cjs +90 -0
- package/dist/cjs/helpers/createMutators.js +85 -0
- package/dist/cjs/helpers/createMutators.js.map +6 -0
- package/dist/cjs/helpers/createMutators.native.js +132 -0
- package/dist/cjs/helpers/createMutators.native.js.map +1 -0
- package/dist/cjs/helpers/didRunPermissionCheck.cjs +30 -0
- package/dist/cjs/helpers/didRunPermissionCheck.js +26 -0
- package/dist/cjs/helpers/didRunPermissionCheck.js.map +6 -0
- package/dist/cjs/helpers/didRunPermissionCheck.native.js +39 -0
- package/dist/cjs/helpers/didRunPermissionCheck.native.js.map +1 -0
- package/dist/cjs/helpers/ensureLoggedIn.cjs +33 -0
- package/dist/cjs/helpers/ensureLoggedIn.js +25 -0
- package/dist/cjs/helpers/ensureLoggedIn.js.map +6 -0
- package/dist/cjs/helpers/ensureLoggedIn.native.js +36 -0
- package/dist/cjs/helpers/ensureLoggedIn.native.js.map +1 -0
- package/dist/cjs/helpers/getQueryOrMutatorAuthData.cjs +30 -0
- package/dist/cjs/helpers/getQueryOrMutatorAuthData.js +24 -0
- package/dist/cjs/helpers/getQueryOrMutatorAuthData.js.map +6 -0
- package/dist/cjs/helpers/getQueryOrMutatorAuthData.native.js +33 -0
- package/dist/cjs/helpers/getQueryOrMutatorAuthData.native.js.map +1 -0
- package/dist/cjs/helpers/mutatorContext.cjs +40 -0
- package/dist/cjs/helpers/mutatorContext.js +36 -0
- package/dist/cjs/helpers/mutatorContext.js.map +6 -0
- package/dist/cjs/helpers/mutatorContext.native.js +43 -0
- package/dist/cjs/helpers/mutatorContext.native.js.map +1 -0
- package/dist/cjs/helpers/prettyFormatZeroQuery.cjs +107 -0
- package/dist/cjs/helpers/prettyFormatZeroQuery.js +92 -0
- package/dist/cjs/helpers/prettyFormatZeroQuery.js.map +6 -0
- package/dist/cjs/helpers/prettyFormatZeroQuery.native.js +119 -0
- package/dist/cjs/helpers/prettyFormatZeroQuery.native.js.map +1 -0
- package/dist/cjs/helpers/useZeroDebug.cjs +68 -0
- package/dist/cjs/helpers/useZeroDebug.js +49 -0
- package/dist/cjs/helpers/useZeroDebug.js.map +6 -0
- package/dist/cjs/helpers/useZeroDebug.native.js +81 -0
- package/dist/cjs/helpers/useZeroDebug.native.js.map +1 -0
- package/dist/cjs/index.cjs +42 -0
- package/dist/cjs/index.js +35 -0
- package/dist/cjs/index.js.map +6 -0
- package/dist/cjs/index.native.js +45 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/mutations.cjs +51 -0
- package/dist/cjs/mutations.js +44 -0
- package/dist/cjs/mutations.js.map +6 -0
- package/dist/cjs/mutations.native.js +56 -0
- package/dist/cjs/mutations.native.js.map +1 -0
- package/dist/cjs/queryRegistry.cjs +33 -0
- package/dist/cjs/queryRegistry.js +28 -0
- package/dist/cjs/queryRegistry.js.map +6 -0
- package/dist/cjs/queryRegistry.native.js +36 -0
- package/dist/cjs/queryRegistry.native.js.map +1 -0
- package/dist/cjs/resolveQuery.cjs +41 -0
- package/dist/cjs/resolveQuery.js +40 -0
- package/dist/cjs/resolveQuery.js.map +6 -0
- package/dist/cjs/resolveQuery.native.js +46 -0
- package/dist/cjs/resolveQuery.native.js.map +1 -0
- package/dist/cjs/run.cjs +48 -0
- package/dist/cjs/run.js +37 -0
- package/dist/cjs/run.js.map +6 -0
- package/dist/cjs/run.native.js +52 -0
- package/dist/cjs/run.native.js.map +1 -0
- package/dist/cjs/server.cjs +18 -0
- package/dist/cjs/server.js +15 -0
- package/dist/cjs/server.js.map +6 -0
- package/dist/cjs/server.native.js +21 -0
- package/dist/cjs/server.native.js.map +1 -0
- package/dist/cjs/serverWhere.cjs +29 -0
- package/dist/cjs/serverWhere.js +24 -0
- package/dist/cjs/serverWhere.js.map +6 -0
- package/dist/cjs/serverWhere.native.js +32 -0
- package/dist/cjs/serverWhere.native.js.map +1 -0
- package/dist/cjs/state.cjs +49 -0
- package/dist/cjs/state.js +37 -0
- package/dist/cjs/state.js.map +6 -0
- package/dist/cjs/state.native.js +54 -0
- package/dist/cjs/state.native.js.map +1 -0
- package/dist/cjs/types.cjs +16 -0
- package/dist/cjs/types.js +14 -0
- package/dist/cjs/types.js.map +6 -0
- package/dist/cjs/types.native.js +19 -0
- package/dist/cjs/types.native.js.map +1 -0
- package/dist/cjs/where.cjs +41 -0
- package/dist/cjs/where.js +35 -0
- package/dist/cjs/where.js.map +6 -0
- package/dist/cjs/where.native.js +46 -0
- package/dist/cjs/where.native.js.map +1 -0
- package/dist/cjs/zeroRunner.cjs +34 -0
- package/dist/cjs/zeroRunner.js +32 -0
- package/dist/cjs/zeroRunner.js.map +6 -0
- package/dist/cjs/zeroRunner.native.js +37 -0
- package/dist/cjs/zeroRunner.native.js.map +1 -0
- package/dist/cjs/zql.cjs +31 -0
- package/dist/cjs/zql.js +26 -0
- package/dist/cjs/zql.js.map +6 -0
- package/dist/cjs/zql.native.js +35 -0
- package/dist/cjs/zql.native.js.map +1 -0
- package/dist/esm/cli.js +383 -0
- package/dist/esm/cli.js.map +6 -0
- package/dist/esm/cli.mjs +384 -0
- package/dist/esm/cli.mjs.map +1 -0
- package/dist/esm/cli.native.js +481 -0
- package/dist/esm/cli.native.js.map +1 -0
- package/dist/esm/constants.js +6 -0
- package/dist/esm/constants.js.map +6 -0
- package/dist/esm/constants.mjs +4 -0
- package/dist/esm/constants.mjs.map +1 -0
- package/dist/esm/constants.native.js +4 -0
- package/dist/esm/constants.native.js.map +1 -0
- package/dist/esm/createPermissions.js +66 -0
- package/dist/esm/createPermissions.js.map +6 -0
- package/dist/esm/createPermissions.mjs +59 -0
- package/dist/esm/createPermissions.mjs.map +1 -0
- package/dist/esm/createPermissions.native.js +81 -0
- package/dist/esm/createPermissions.native.js.map +1 -0
- package/dist/esm/createUseQuery.js +21 -0
- package/dist/esm/createUseQuery.js.map +6 -0
- package/dist/esm/createUseQuery.mjs +36 -0
- package/dist/esm/createUseQuery.mjs.map +1 -0
- package/dist/esm/createUseQuery.native.js +44 -0
- package/dist/esm/createUseQuery.native.js.map +1 -0
- package/dist/esm/createZeroClient.js +135 -0
- package/dist/esm/createZeroClient.js.map +6 -0
- package/dist/esm/createZeroClient.mjs +139 -0
- package/dist/esm/createZeroClient.mjs.map +1 -0
- package/dist/esm/createZeroClient.native.js +188 -0
- package/dist/esm/createZeroClient.native.js.map +1 -0
- package/dist/esm/createZeroServer.js +121 -0
- package/dist/esm/createZeroServer.js.map +6 -0
- package/dist/esm/createZeroServer.mjs +125 -0
- package/dist/esm/createZeroServer.mjs.map +1 -0
- package/dist/esm/createZeroServer.native.js +144 -0
- package/dist/esm/createZeroServer.native.js.map +1 -0
- package/dist/esm/helpers/batchQuery.js +22 -0
- package/dist/esm/helpers/batchQuery.js.map +6 -0
- package/dist/esm/helpers/batchQuery.mjs +26 -0
- package/dist/esm/helpers/batchQuery.mjs.map +1 -0
- package/dist/esm/helpers/batchQuery.native.js +23 -0
- package/dist/esm/helpers/batchQuery.native.js.map +1 -0
- package/dist/esm/helpers/createMutators.js +71 -0
- package/dist/esm/helpers/createMutators.js.map +6 -0
- package/dist/esm/helpers/createMutators.mjs +67 -0
- package/dist/esm/helpers/createMutators.mjs.map +1 -0
- package/dist/esm/helpers/createMutators.native.js +106 -0
- package/dist/esm/helpers/createMutators.native.js.map +1 -0
- package/dist/esm/helpers/didRunPermissionCheck.js +10 -0
- package/dist/esm/helpers/didRunPermissionCheck.js.map +6 -0
- package/dist/esm/helpers/didRunPermissionCheck.mjs +6 -0
- package/dist/esm/helpers/didRunPermissionCheck.mjs.map +1 -0
- package/dist/esm/helpers/didRunPermissionCheck.native.js +12 -0
- package/dist/esm/helpers/didRunPermissionCheck.native.js.map +1 -0
- package/dist/esm/helpers/ensureLoggedIn.js +10 -0
- package/dist/esm/helpers/ensureLoggedIn.js.map +6 -0
- package/dist/esm/helpers/ensureLoggedIn.mjs +10 -0
- package/dist/esm/helpers/ensureLoggedIn.mjs.map +1 -0
- package/dist/esm/helpers/ensureLoggedIn.native.js +10 -0
- package/dist/esm/helpers/ensureLoggedIn.native.js.map +1 -0
- package/dist/esm/helpers/getQueryOrMutatorAuthData.js +9 -0
- package/dist/esm/helpers/getQueryOrMutatorAuthData.js.map +6 -0
- package/dist/esm/helpers/getQueryOrMutatorAuthData.mjs +7 -0
- package/dist/esm/helpers/getQueryOrMutatorAuthData.mjs.map +1 -0
- package/dist/esm/helpers/getQueryOrMutatorAuthData.native.js +7 -0
- package/dist/esm/helpers/getQueryOrMutatorAuthData.native.js.map +1 -0
- package/dist/esm/helpers/mutatorContext.js +20 -0
- package/dist/esm/helpers/mutatorContext.js.map +6 -0
- package/dist/esm/helpers/mutatorContext.mjs +15 -0
- package/dist/esm/helpers/mutatorContext.mjs.map +1 -0
- package/dist/esm/helpers/mutatorContext.native.js +15 -0
- package/dist/esm/helpers/mutatorContext.native.js.map +1 -0
- package/dist/esm/helpers/prettyFormatZeroQuery.js +76 -0
- package/dist/esm/helpers/prettyFormatZeroQuery.js.map +6 -0
- package/dist/esm/helpers/prettyFormatZeroQuery.mjs +84 -0
- package/dist/esm/helpers/prettyFormatZeroQuery.mjs.map +1 -0
- package/dist/esm/helpers/prettyFormatZeroQuery.native.js +93 -0
- package/dist/esm/helpers/prettyFormatZeroQuery.native.js.map +1 -0
- package/dist/esm/helpers/useZeroDebug.js +35 -0
- package/dist/esm/helpers/useZeroDebug.js.map +6 -0
- package/dist/esm/helpers/useZeroDebug.mjs +45 -0
- package/dist/esm/helpers/useZeroDebug.mjs.map +1 -0
- package/dist/esm/helpers/useZeroDebug.native.js +55 -0
- package/dist/esm/helpers/useZeroDebug.native.js.map +1 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/index.js.map +6 -0
- package/dist/esm/index.mjs +17 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +17 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/esm/mutations.js +28 -0
- package/dist/esm/mutations.js.map +6 -0
- package/dist/esm/mutations.mjs +28 -0
- package/dist/esm/mutations.mjs.map +1 -0
- package/dist/esm/mutations.native.js +30 -0
- package/dist/esm/mutations.native.js.map +1 -0
- package/dist/esm/queryRegistry.js +12 -0
- package/dist/esm/queryRegistry.js.map +6 -0
- package/dist/esm/queryRegistry.mjs +9 -0
- package/dist/esm/queryRegistry.mjs.map +1 -0
- package/dist/esm/queryRegistry.native.js +9 -0
- package/dist/esm/queryRegistry.native.js.map +1 -0
- package/dist/esm/resolveQuery.js +24 -0
- package/dist/esm/resolveQuery.js.map +6 -0
- package/dist/esm/resolveQuery.mjs +18 -0
- package/dist/esm/resolveQuery.mjs.map +1 -0
- package/dist/esm/resolveQuery.native.js +20 -0
- package/dist/esm/resolveQuery.native.js.map +1 -0
- package/dist/esm/run.js +22 -0
- package/dist/esm/run.js.map +6 -0
- package/dist/esm/run.mjs +24 -0
- package/dist/esm/run.mjs.map +1 -0
- package/dist/esm/run.native.js +25 -0
- package/dist/esm/run.native.js.map +1 -0
- package/dist/esm/server.js +2 -0
- package/dist/esm/server.js.map +6 -0
- package/dist/esm/server.mjs +2 -0
- package/dist/esm/server.mjs.map +1 -0
- package/dist/esm/server.native.js +2 -0
- package/dist/esm/server.native.js.map +1 -0
- package/dist/esm/serverWhere.js +8 -0
- package/dist/esm/serverWhere.js.map +6 -0
- package/dist/esm/serverWhere.mjs +6 -0
- package/dist/esm/serverWhere.mjs.map +1 -0
- package/dist/esm/serverWhere.native.js +6 -0
- package/dist/esm/serverWhere.native.js.map +1 -0
- package/dist/esm/state.js +21 -0
- package/dist/esm/state.js.map +6 -0
- package/dist/esm/state.mjs +22 -0
- package/dist/esm/state.mjs.map +1 -0
- package/dist/esm/state.native.js +24 -0
- package/dist/esm/state.native.js.map +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/types.js.map +6 -0
- package/dist/esm/types.mjs +2 -0
- package/dist/esm/types.mjs.map +1 -0
- package/dist/esm/types.native.js +2 -0
- package/dist/esm/types.native.js.map +1 -0
- package/dist/esm/where.js +20 -0
- package/dist/esm/where.js.map +6 -0
- package/dist/esm/where.mjs +17 -0
- package/dist/esm/where.mjs.map +1 -0
- package/dist/esm/where.native.js +19 -0
- package/dist/esm/where.native.js.map +1 -0
- package/dist/esm/zeroRunner.js +16 -0
- package/dist/esm/zeroRunner.js.map +6 -0
- package/dist/esm/zeroRunner.mjs +10 -0
- package/dist/esm/zeroRunner.mjs.map +1 -0
- package/dist/esm/zeroRunner.native.js +10 -0
- package/dist/esm/zeroRunner.native.js.map +1 -0
- package/dist/esm/zql.js +10 -0
- package/dist/esm/zql.js.map +6 -0
- package/dist/esm/zql.mjs +8 -0
- package/dist/esm/zql.mjs.map +1 -0
- package/dist/esm/zql.native.js +9 -0
- package/dist/esm/zql.native.js.map +1 -0
- package/package.json +98 -0
- package/readme.md +594 -0
- package/src/cli.ts +626 -0
- package/src/constants.native.ts +3 -0
- package/src/constants.ts +3 -0
- package/src/createPermissions.ts +131 -0
- package/src/createUseQuery.tsx +82 -0
- package/src/createZeroClient.tsx +301 -0
- package/src/createZeroServer.ts +226 -0
- package/src/helpers/batchQuery.ts +46 -0
- package/src/helpers/createMutators.ts +138 -0
- package/src/helpers/didRunPermissionCheck.ts +16 -0
- package/src/helpers/ensureLoggedIn.ts +11 -0
- package/src/helpers/getQueryOrMutatorAuthData.ts +12 -0
- package/src/helpers/mutatorContext.ts +25 -0
- package/src/helpers/prettyFormatZeroQuery.ts +167 -0
- package/src/helpers/useZeroDebug.ts +102 -0
- package/src/index.ts +18 -0
- package/src/mutations.ts +133 -0
- package/src/queryRegistry.ts +12 -0
- package/src/resolveQuery.ts +44 -0
- package/src/run.ts +62 -0
- package/src/server.ts +1 -0
- package/src/serverWhere.ts +21 -0
- package/src/state.ts +32 -0
- package/src/types.ts +136 -0
- package/src/where.ts +58 -0
- package/src/zeroRunner.ts +28 -0
- package/src/zql.ts +10 -0
- package/types/cli.d.ts +3 -0
- package/types/cli.d.ts.map +1 -0
- package/types/constants.d.ts +3 -0
- package/types/constants.d.ts.map +1 -0
- package/types/constants.native.d.ts +3 -0
- package/types/constants.native.d.ts.map +1 -0
- package/types/createPermissions.d.ts +10 -0
- package/types/createPermissions.d.ts.map +1 -0
- package/types/createUseQuery.d.ts +20 -0
- package/types/createUseQuery.d.ts.map +1 -0
- package/types/createZeroClient.d.ts +35 -0
- package/types/createZeroClient.d.ts.map +1 -0
- package/types/createZeroServer.d.ts +146 -0
- package/types/createZeroServer.d.ts.map +1 -0
- package/types/helpers/batchQuery.d.ts +7 -0
- package/types/helpers/batchQuery.d.ts.map +1 -0
- package/types/helpers/createMutators.d.ts +10 -0
- package/types/helpers/createMutators.d.ts.map +1 -0
- package/types/helpers/didRunPermissionCheck.d.ts +4 -0
- package/types/helpers/didRunPermissionCheck.d.ts.map +1 -0
- package/types/helpers/ensureLoggedIn.d.ts +3 -0
- package/types/helpers/ensureLoggedIn.d.ts.map +1 -0
- package/types/helpers/getQueryOrMutatorAuthData.d.ts +3 -0
- package/types/helpers/getQueryOrMutatorAuthData.d.ts.map +1 -0
- package/types/helpers/mutatorContext.d.ts +5 -0
- package/types/helpers/mutatorContext.d.ts.map +1 -0
- package/types/helpers/prettyFormatZeroQuery.d.ts +3 -0
- package/types/helpers/prettyFormatZeroQuery.d.ts.map +1 -0
- package/types/helpers/useZeroDebug.d.ts +3 -0
- package/types/helpers/useZeroDebug.d.ts.map +1 -0
- package/types/index.d.ts +17 -0
- package/types/index.d.ts.map +1 -0
- package/types/mutations.d.ts +20 -0
- package/types/mutations.d.ts.map +1 -0
- package/types/queryRegistry.d.ts +3 -0
- package/types/queryRegistry.d.ts.map +1 -0
- package/types/resolveQuery.d.ts +11 -0
- package/types/resolveQuery.d.ts.map +1 -0
- package/types/run.d.ts +7 -0
- package/types/run.d.ts.map +1 -0
- package/types/server.d.ts +2 -0
- package/types/server.d.ts.map +1 -0
- package/types/serverWhere.d.ts +5 -0
- package/types/serverWhere.d.ts.map +1 -0
- package/types/state.d.ts +8 -0
- package/types/state.d.ts.map +1 -0
- package/types/types.d.ts +78 -0
- package/types/types.d.ts.map +1 -0
- package/types/where.d.ts +6 -0
- package/types/where.d.ts.map +1 -0
- package/types/zeroRunner.d.ts +6 -0
- package/types/zeroRunner.d.ts.map +1 -0
- package/types/zql.d.ts +3 -0
- package/types/zql.d.ts.map +1 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { getCurrentComponentStack } from '@take-out/helpers'
|
|
2
|
+
import { useEffect, useId } from 'react'
|
|
3
|
+
|
|
4
|
+
import { prettyFormatZeroQuery } from './prettyFormatZeroQuery'
|
|
5
|
+
|
|
6
|
+
import type { Query } from '@rocicorp/zero'
|
|
7
|
+
|
|
8
|
+
const activeQueries = new Map<string, number>()
|
|
9
|
+
|
|
10
|
+
// AST change tracking
|
|
11
|
+
interface AstHistory {
|
|
12
|
+
asts: string[]
|
|
13
|
+
changeCount: number
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const astHistoryByComponent = new Map<string, AstHistory>()
|
|
17
|
+
|
|
18
|
+
// control what is logged here:
|
|
19
|
+
const filterLogs = (table: string): boolean => false
|
|
20
|
+
|
|
21
|
+
const COLLAPSED = true
|
|
22
|
+
const AST_CHANGE_THRESHOLD = 4
|
|
23
|
+
const MAX_AST_HISTORY = 10
|
|
24
|
+
|
|
25
|
+
// short name because otherwise it often forces multiple lines in chrome devtools
|
|
26
|
+
// due to showing the filename next to log lines
|
|
27
|
+
export const useZeroDebug = (query: Query<any, any, any>, options: any, results: any) => {
|
|
28
|
+
const astObject = query['_completeAst']?.() ?? query['ast']
|
|
29
|
+
const table = astObject?.table ?? 'unknown'
|
|
30
|
+
const ast = JSON.stringify(astObject, null, 2)
|
|
31
|
+
const queryDisabled = !options || options?.enabled === false
|
|
32
|
+
const enabled = !queryDisabled && filterLogs(table)
|
|
33
|
+
const stack = new Error().stack
|
|
34
|
+
const isPermissionQuery = stack?.includes(`usePermission.ts`)
|
|
35
|
+
const id = useId()
|
|
36
|
+
|
|
37
|
+
// log here not in effect so we can breakpoint and find the query
|
|
38
|
+
const num = activeQueries.get(ast) || 0
|
|
39
|
+
const shouldLog = enabled && num === 0
|
|
40
|
+
if (enabled) {
|
|
41
|
+
activeQueries.set(ast, num + 1)
|
|
42
|
+
if (shouldLog) {
|
|
43
|
+
if (COLLAPSED) {
|
|
44
|
+
console.groupCollapsed(
|
|
45
|
+
`${isPermissionQuery ? `👮♂️` : `✨`}${prettyFormatZeroQuery(query, 'minimal')}`
|
|
46
|
+
)
|
|
47
|
+
console.info(id, prettyFormatZeroQuery(query, 'full'))
|
|
48
|
+
console.info('cached result', results)
|
|
49
|
+
console.trace()
|
|
50
|
+
console.groupEnd()
|
|
51
|
+
} else {
|
|
52
|
+
console.info(`✨`, prettyFormatZeroQuery(query, 'full'))
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// track AST changes per component
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
if (!enabled) return
|
|
60
|
+
const history = astHistoryByComponent.get(id) || { asts: [], changeCount: 0 }
|
|
61
|
+
const currentAst = ast
|
|
62
|
+
const lastAst = history.asts[history.asts.length - 1]
|
|
63
|
+
|
|
64
|
+
if (currentAst !== lastAst) {
|
|
65
|
+
history.asts.push(currentAst)
|
|
66
|
+
if (history.asts.length > MAX_AST_HISTORY) {
|
|
67
|
+
history.asts.shift()
|
|
68
|
+
}
|
|
69
|
+
history.changeCount++
|
|
70
|
+
astHistoryByComponent.set(id, history)
|
|
71
|
+
|
|
72
|
+
if (history.changeCount > AST_CHANGE_THRESHOLD) {
|
|
73
|
+
console.warn(
|
|
74
|
+
`⚠️ AST changed ${history.changeCount} times for component.
|
|
75
|
+
- id: ${id}
|
|
76
|
+
- stack: ${getCurrentComponentStack('short')}
|
|
77
|
+
- table: ${table}`,
|
|
78
|
+
{
|
|
79
|
+
componentId: id,
|
|
80
|
+
table,
|
|
81
|
+
changeCount: history.changeCount,
|
|
82
|
+
recentAsts: history.asts,
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}, [id, ast, table, enabled])
|
|
88
|
+
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
if (!enabled) return
|
|
91
|
+
return () => {
|
|
92
|
+
activeQueries.set(ast, activeQueries.get(ast)! - 1)
|
|
93
|
+
}
|
|
94
|
+
}, [ast, enabled])
|
|
95
|
+
|
|
96
|
+
// cleanup AST history on unmount
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
return () => {
|
|
99
|
+
astHistoryByComponent.delete(id)
|
|
100
|
+
}
|
|
101
|
+
}, [id])
|
|
102
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from './createPermissions'
|
|
2
|
+
export * from './queryRegistry'
|
|
3
|
+
export * from './helpers/batchQuery'
|
|
4
|
+
export * from './helpers/createMutators'
|
|
5
|
+
export * from './helpers/ensureLoggedIn'
|
|
6
|
+
export * from './helpers/mutatorContext'
|
|
7
|
+
|
|
8
|
+
export * from './createZeroClient'
|
|
9
|
+
export * from './createUseQuery'
|
|
10
|
+
export * from './resolveQuery'
|
|
11
|
+
export { run } from './run'
|
|
12
|
+
export { setRunner, type ZeroRunner } from './zeroRunner'
|
|
13
|
+
export * from './mutations'
|
|
14
|
+
export * from './where'
|
|
15
|
+
export * from './serverWhere'
|
|
16
|
+
export * from './zql'
|
|
17
|
+
|
|
18
|
+
export type * from './types'
|
package/src/mutations.ts
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { getDidRunPermissionCheck } from './helpers/didRunPermissionCheck'
|
|
2
|
+
|
|
3
|
+
import type {
|
|
4
|
+
MutatorContext,
|
|
5
|
+
TableInsertRow,
|
|
6
|
+
TableName,
|
|
7
|
+
TableUpdateRow,
|
|
8
|
+
Where,
|
|
9
|
+
} from './types'
|
|
10
|
+
import type { TableBuilderWithColumns } from '@rocicorp/zero'
|
|
11
|
+
|
|
12
|
+
// two ways to use it:
|
|
13
|
+
// - mutations({}) which doesn't add the "allowed" helper or add CRUD
|
|
14
|
+
// - mutation('tableName', permissions) adds CRUD with permissions, adds allowed
|
|
15
|
+
|
|
16
|
+
type MutationBuilder<Obj = any> = (ctx: MutatorContext, obj?: Obj) => Promise<void>
|
|
17
|
+
type MutationBuilders = Record<string, MutationBuilder>
|
|
18
|
+
|
|
19
|
+
// start of adding custom can.write(message) style
|
|
20
|
+
|
|
21
|
+
// type PermissionedMutationBuilder<Permissions extends PermissionsWhere, Obj = any> = (
|
|
22
|
+
// ctx: MutatorContext & {
|
|
23
|
+
// can: any
|
|
24
|
+
// },
|
|
25
|
+
// obj?: Obj
|
|
26
|
+
// ) => Promise<void>
|
|
27
|
+
// type PermissionedMutationBuilders<Permissions extends PermissionsWhere> = Record<
|
|
28
|
+
// string,
|
|
29
|
+
// PermissionedMutationBuilder<Permissions>
|
|
30
|
+
// >
|
|
31
|
+
|
|
32
|
+
type GenericTable = TableBuilderWithColumns<any>
|
|
33
|
+
|
|
34
|
+
type CRUDMutations<Table extends GenericTable> = {
|
|
35
|
+
insert: MutationBuilder<TableInsertRow<Table>>
|
|
36
|
+
upsert: MutationBuilder<TableInsertRow<Table>>
|
|
37
|
+
update: MutationBuilder<TableUpdateRow<Table>>
|
|
38
|
+
delete: MutationBuilder<TableUpdateRow<Table>>
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
type CRUDNames = 'insert' | 'upsert' | 'update' | 'delete'
|
|
42
|
+
|
|
43
|
+
type MutationsWithCRUD<Table extends GenericTable, Mutations extends MutationBuilders> = {
|
|
44
|
+
[Key in CRUDNames | keyof Mutations]: Key extends keyof Mutations
|
|
45
|
+
? Mutations[Key]
|
|
46
|
+
: Key extends keyof CRUDMutations<any>
|
|
47
|
+
? CRUDMutations<Table>[Key]
|
|
48
|
+
: never
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function mutations<Mutations extends MutationBuilders>(
|
|
52
|
+
mutations: Mutations
|
|
53
|
+
): Mutations
|
|
54
|
+
export function mutations<Table extends GenericTable, Permissions extends Where>(
|
|
55
|
+
table: Table,
|
|
56
|
+
permissions: Permissions
|
|
57
|
+
): MutationsWithCRUD<Table, {}>
|
|
58
|
+
export function mutations<
|
|
59
|
+
Table extends GenericTable,
|
|
60
|
+
Permissions extends Where,
|
|
61
|
+
Mutations extends MutationBuilders,
|
|
62
|
+
>(
|
|
63
|
+
table: Table,
|
|
64
|
+
permissions: Permissions,
|
|
65
|
+
mutations: Mutations
|
|
66
|
+
): MutationsWithCRUD<Table, Mutations>
|
|
67
|
+
// TODO we should enforece the CRUD mutations obj to the callier so they get it auto-typed
|
|
68
|
+
export function mutations<
|
|
69
|
+
Table extends GenericTable,
|
|
70
|
+
Mutations extends Record<string, MutationBuilder>,
|
|
71
|
+
>(table: Table | Mutations, permissions?: Where, mutations?: Mutations): Mutations {
|
|
72
|
+
if (permissions) {
|
|
73
|
+
const tableName = (table as Table).schema.name as TableName
|
|
74
|
+
|
|
75
|
+
const createCRUDMutation = (action: CRUDNames) => {
|
|
76
|
+
return async (ctx: MutatorContext, obj: any) => {
|
|
77
|
+
/**
|
|
78
|
+
* CRUD mutations have permissions handled automatically using `can`:
|
|
79
|
+
* - `can` throws an error if it fails
|
|
80
|
+
* - zero catches error and rolls back transaction
|
|
81
|
+
* - zero returns error to client when you await zero.mutate.x.z().server
|
|
82
|
+
* - for INSERT: check runs after insert completes
|
|
83
|
+
* - for the rest: check runs before mutation
|
|
84
|
+
*/
|
|
85
|
+
const runServerPermissionCheck = async () => {
|
|
86
|
+
if (getDidRunPermissionCheck(ctx)) {
|
|
87
|
+
// if the user-defined CRUD mutation runs their own "can", we avoid running ours
|
|
88
|
+
return
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// only validate on the server
|
|
92
|
+
if (process.env.VITE_ENVIRONMENT === 'ssr') {
|
|
93
|
+
await ctx.can(permissions, obj)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (action !== 'insert') {
|
|
98
|
+
await runServerPermissionCheck()
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// if user defines insert run theirs, if not run plain zero:
|
|
102
|
+
const existing = mutations?.[action]
|
|
103
|
+
|
|
104
|
+
if (existing) {
|
|
105
|
+
await existing(ctx, obj)
|
|
106
|
+
} else {
|
|
107
|
+
type TableName = keyof typeof ctx.tx.mutate // weird type foo because we declare this module and then type check
|
|
108
|
+
await ctx.tx.mutate[tableName as TableName]
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (action === 'insert') {
|
|
112
|
+
await runServerPermissionCheck()
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const crudMutations: CRUDMutations<any> = {
|
|
118
|
+
insert: createCRUDMutation('insert'),
|
|
119
|
+
update: createCRUDMutation('update'),
|
|
120
|
+
delete: createCRUDMutation('delete'),
|
|
121
|
+
upsert: createCRUDMutation('upsert'),
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
...mutations,
|
|
126
|
+
// overwrite regular mutations but call them if they are defined by user
|
|
127
|
+
...crudMutations,
|
|
128
|
+
} as any as Mutations
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// no schema/permissions don't add CRUD
|
|
132
|
+
return table as any
|
|
133
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// registry for query functions to their stable names
|
|
2
|
+
// this allows minification while preserving query identity
|
|
3
|
+
|
|
4
|
+
const queryNameRegistry = new WeakMap<Function, string>()
|
|
5
|
+
|
|
6
|
+
export function registerQuery(fn: Function, name: string) {
|
|
7
|
+
queryNameRegistry.set(fn, name)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function getQueryName(fn: Function): string | undefined {
|
|
11
|
+
return queryNameRegistry.get(fn)
|
|
12
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getQueryName } from './queryRegistry'
|
|
2
|
+
|
|
3
|
+
import type { AnyQueryRegistry, Query, Schema as ZeroSchema } from '@rocicorp/zero'
|
|
4
|
+
|
|
5
|
+
export type PlainQueryFn<
|
|
6
|
+
TArg = any,
|
|
7
|
+
TReturn extends Query<any, any, any> = Query<any, any, any>,
|
|
8
|
+
> = (args: TArg) => TReturn
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* resolves a plain query function to a QueryRequest using the customQueries registry
|
|
12
|
+
*/
|
|
13
|
+
export function resolveQuery<Schema extends ZeroSchema>({
|
|
14
|
+
customQueries,
|
|
15
|
+
fn,
|
|
16
|
+
params,
|
|
17
|
+
}: {
|
|
18
|
+
customQueries: AnyQueryRegistry
|
|
19
|
+
fn: PlainQueryFn<any, Query<any, Schema, any>>
|
|
20
|
+
params?: any
|
|
21
|
+
}) {
|
|
22
|
+
const queryName = getQueryName(fn)
|
|
23
|
+
if (!queryName) {
|
|
24
|
+
const fnName = fn?.name || 'anonymous'
|
|
25
|
+
throw new Error(
|
|
26
|
+
`Query function '${fnName}' not registered. ` +
|
|
27
|
+
`Ensure it is exported from a queries file and passed to createZeroClient via groupedQueries.`
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// look up the CustomQuery from the shared registry
|
|
32
|
+
// queryName is "namespace.name" format, e.g., "user.userById"
|
|
33
|
+
const [namespace, name] = queryName.split('.', 2)
|
|
34
|
+
const customQuery = (customQueries as any)[namespace]?.[name]
|
|
35
|
+
|
|
36
|
+
if (!customQuery) {
|
|
37
|
+
throw new Error(
|
|
38
|
+
`CustomQuery '${queryName}' not found. ` +
|
|
39
|
+
`Check that the query is exported and the namespace/name matches.`
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return params !== undefined ? customQuery(params) : customQuery()
|
|
44
|
+
}
|
package/src/run.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { resolveQuery, type PlainQueryFn } from './resolveQuery'
|
|
2
|
+
import { getRunner, type RunOptions } from './zeroRunner'
|
|
3
|
+
|
|
4
|
+
import type {
|
|
5
|
+
AnyQueryRegistry,
|
|
6
|
+
HumanReadable,
|
|
7
|
+
Query,
|
|
8
|
+
Schema as ZeroSchema,
|
|
9
|
+
} from '@rocicorp/zero'
|
|
10
|
+
|
|
11
|
+
let customQueriesRef: AnyQueryRegistry | null = null
|
|
12
|
+
|
|
13
|
+
export function setCustomQueries(queries: AnyQueryRegistry) {
|
|
14
|
+
customQueriesRef = queries
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function getCustomQueries(): AnyQueryRegistry {
|
|
18
|
+
if (!customQueriesRef) {
|
|
19
|
+
throw new Error(
|
|
20
|
+
'Custom queries not initialized. Ensure createZeroClient or createZeroServer has been called.'
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
return customQueriesRef
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// run a query once and return results (non-reactive)
|
|
27
|
+
export function run<
|
|
28
|
+
Schema extends ZeroSchema,
|
|
29
|
+
TArg,
|
|
30
|
+
TTable extends keyof Schema['tables'] & string,
|
|
31
|
+
TReturn,
|
|
32
|
+
>(
|
|
33
|
+
fn: PlainQueryFn<TArg, Query<TTable, Schema, TReturn>>,
|
|
34
|
+
params: TArg,
|
|
35
|
+
options?: RunOptions
|
|
36
|
+
): Promise<HumanReadable<TReturn>>
|
|
37
|
+
|
|
38
|
+
export function run<
|
|
39
|
+
Schema extends ZeroSchema,
|
|
40
|
+
TTable extends keyof Schema['tables'] & string,
|
|
41
|
+
TReturn,
|
|
42
|
+
>(
|
|
43
|
+
fn: PlainQueryFn<void, Query<TTable, Schema, TReturn>>,
|
|
44
|
+
options?: RunOptions
|
|
45
|
+
): Promise<HumanReadable<TReturn>>
|
|
46
|
+
|
|
47
|
+
export function run(
|
|
48
|
+
fnArg: any,
|
|
49
|
+
paramsOrOptions?: any,
|
|
50
|
+
optionsArg?: RunOptions
|
|
51
|
+
): Promise<any> {
|
|
52
|
+
const hasParams =
|
|
53
|
+
optionsArg !== undefined || (paramsOrOptions && !('type' in paramsOrOptions))
|
|
54
|
+
const params = hasParams ? paramsOrOptions : undefined
|
|
55
|
+
const options = hasParams ? optionsArg : paramsOrOptions
|
|
56
|
+
|
|
57
|
+
const customQueries = getCustomQueries()
|
|
58
|
+
const queryRequest = resolveQuery({ customQueries, fn: fnArg, params })
|
|
59
|
+
const runner = getRunner()
|
|
60
|
+
|
|
61
|
+
return runner(queryRequest as any, options)
|
|
62
|
+
}
|
package/src/server.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './createZeroServer'
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { where } from './where'
|
|
2
|
+
|
|
3
|
+
import type { TableName, Where } from './types'
|
|
4
|
+
import type { Condition } from '@rocicorp/zero'
|
|
5
|
+
|
|
6
|
+
export function serverWhere<Table extends TableName, Builder extends Where<Table>>(
|
|
7
|
+
tableName: Table,
|
|
8
|
+
builder: Builder
|
|
9
|
+
): Where<Table, Condition>
|
|
10
|
+
|
|
11
|
+
export function serverWhere<
|
|
12
|
+
Table extends TableName,
|
|
13
|
+
Builder extends Where = Where<Table>,
|
|
14
|
+
>(builder: Builder): Where<Table, Condition>
|
|
15
|
+
|
|
16
|
+
export function serverWhere<Table extends TableName, Builder extends Where<Table>>(
|
|
17
|
+
a: Table | Builder,
|
|
18
|
+
b?: Builder
|
|
19
|
+
): Where<Table, any> | Builder {
|
|
20
|
+
return where(a as any, b as any, true)
|
|
21
|
+
}
|
package/src/state.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createBuilder, type Schema } from '@rocicorp/zero'
|
|
2
|
+
|
|
3
|
+
import type { AuthData, QueryBuilder } from './types'
|
|
4
|
+
|
|
5
|
+
let schema: Schema | null = null
|
|
6
|
+
let zql: QueryBuilder | null = null
|
|
7
|
+
let authData: AuthData | null | undefined
|
|
8
|
+
|
|
9
|
+
const errMessage = `Haven't called createZeroClient or createZeroServer yet!`
|
|
10
|
+
|
|
11
|
+
export const getZQL = () => {
|
|
12
|
+
if (!zql) throw new Error(errMessage)
|
|
13
|
+
return zql
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const getSchema = () => {
|
|
17
|
+
if (!schema) throw new Error(errMessage)
|
|
18
|
+
return schema
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const setSchema = (_: Schema) => {
|
|
22
|
+
schema = _
|
|
23
|
+
zql = createBuilder(_) as QueryBuilder
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const getAuthData = () => {
|
|
27
|
+
return authData || null
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const setAuthData = (_: AuthData) => {
|
|
31
|
+
authData = _
|
|
32
|
+
}
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
Condition,
|
|
3
|
+
ExpressionBuilder,
|
|
4
|
+
Row,
|
|
5
|
+
SchemaQuery,
|
|
6
|
+
TableBuilderWithColumns,
|
|
7
|
+
Schema as ZeroSchema,
|
|
8
|
+
Transaction as ZeroTransaction,
|
|
9
|
+
} from '@rocicorp/zero'
|
|
10
|
+
import type { NullToOptional, TupleToUnion } from '@take-out/helpers'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* ➗0️⃣ START OVERRIDDEN TYPES
|
|
14
|
+
*
|
|
15
|
+
* To get types, put the following in a .ts file that's included by your tsconfig:
|
|
16
|
+
*
|
|
17
|
+
* export type Schema = typeof schema
|
|
18
|
+
*
|
|
19
|
+
* declare module 'on-zero' {
|
|
20
|
+
* interface Config {
|
|
21
|
+
* schema: Schema
|
|
22
|
+
* authData: AuthData
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* on-zero is overridden by consumers of this library to get types which is
|
|
27
|
+
* needed to allow co-locating certain typed helpers like where() and
|
|
28
|
+
* mutations() alongside table() because table is later used to create the Zero
|
|
29
|
+
* schema, which is then needed for where/mutations
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
export interface Config {}
|
|
33
|
+
|
|
34
|
+
interface DefaultConfig {
|
|
35
|
+
schema: ZeroSchema
|
|
36
|
+
authData: {}
|
|
37
|
+
serverActions: null
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface FinalConfig extends Omit<DefaultConfig, keyof Config>, Config {}
|
|
41
|
+
|
|
42
|
+
export type Schema = FinalConfig['schema']
|
|
43
|
+
|
|
44
|
+
export type TableName = keyof Schema['tables'] extends string
|
|
45
|
+
? keyof Schema['tables']
|
|
46
|
+
: string
|
|
47
|
+
|
|
48
|
+
export type Transaction = ZeroTransaction<Schema>
|
|
49
|
+
|
|
50
|
+
export type AuthData =
|
|
51
|
+
FinalConfig['authData'] extends Record<string, unknown>
|
|
52
|
+
? FinalConfig['authData']
|
|
53
|
+
: Record<string, unknown>
|
|
54
|
+
|
|
55
|
+
export type ServerActions =
|
|
56
|
+
FinalConfig['serverActions'] extends Record<string, unknown>
|
|
57
|
+
? FinalConfig['serverActions']
|
|
58
|
+
: Record<string, unknown>
|
|
59
|
+
|
|
60
|
+
export type QueryBuilder = SchemaQuery<Schema>
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* ➗0️⃣ END OVERRIDDEN TYPES
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
// the first argument passed to every mutation:
|
|
67
|
+
export type MutatorContext = {
|
|
68
|
+
tx: Transaction
|
|
69
|
+
authData: AuthData | null
|
|
70
|
+
environment: 'server' | 'client'
|
|
71
|
+
server?: {
|
|
72
|
+
actions: ServerActions
|
|
73
|
+
asyncTasks: Array<() => Promise<void>>
|
|
74
|
+
}
|
|
75
|
+
can: Can
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// turns our mutators with custom context into zero mutators
|
|
79
|
+
export type GetZeroMutators<Models extends GenericModels> = {
|
|
80
|
+
[Key in keyof Models]: TransformMutators<GetModelMutators<Models>[Key]>
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
type GetModelMutators<Models extends GenericModels> = {
|
|
84
|
+
[Key in keyof Models]: Models[Key]['mutate']
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type GenericModels = {
|
|
88
|
+
[key: string]: {
|
|
89
|
+
mutate: Record<string, (ctx: MutatorContext, obj?: any) => Promise<any>>
|
|
90
|
+
permissions?: Where<any, Condition | boolean>
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export type TransformMutators<T> = {
|
|
95
|
+
[K in keyof T]: T[K] extends (ctx: MutatorContext, ...args: infer Args) => infer Return
|
|
96
|
+
? (tx: Transaction, ...args: Args) => Return extends unknown ? Promise<any> : Return
|
|
97
|
+
: never
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export type Where<
|
|
101
|
+
Table extends TableName = TableName,
|
|
102
|
+
ReturnType extends Condition | boolean = Condition | boolean,
|
|
103
|
+
> = (
|
|
104
|
+
expressionBuilder: ExpressionBuilder<Table, Schema>,
|
|
105
|
+
auth?: AuthData | null
|
|
106
|
+
) => ReturnType
|
|
107
|
+
|
|
108
|
+
export type Can = <PWhere extends Where>(
|
|
109
|
+
where: PWhere,
|
|
110
|
+
obj: string | Record<string, unknown>
|
|
111
|
+
) => Promise<void>
|
|
112
|
+
|
|
113
|
+
export type AsyncAction = () => Promise<void>
|
|
114
|
+
|
|
115
|
+
type GenericTable = TableBuilderWithColumns<any>
|
|
116
|
+
|
|
117
|
+
type GetTableSchema<TS extends GenericTable> =
|
|
118
|
+
TS extends TableBuilderWithColumns<infer S> ? S : never
|
|
119
|
+
|
|
120
|
+
// all non-optional keys required (but optional can be undefined)
|
|
121
|
+
export type TableInsertRow<TS extends GenericTable> = NullToOptional<
|
|
122
|
+
Row<GetTableSchema<TS>>
|
|
123
|
+
>
|
|
124
|
+
|
|
125
|
+
// only primary keys required
|
|
126
|
+
export type TableUpdateRow<TS extends GenericTable> = Pick<
|
|
127
|
+
Row<GetTableSchema<TS>>,
|
|
128
|
+
TablePrimaryKeys<TS>
|
|
129
|
+
> &
|
|
130
|
+
Partial<TableInsertRow<TS>>
|
|
131
|
+
|
|
132
|
+
export type TablePrimaryKeys<TS extends GenericTable> = TupleToUnion<
|
|
133
|
+
GetTableSchema<TS>['primaryKey']
|
|
134
|
+
>
|
|
135
|
+
|
|
136
|
+
export type ZeroEvent = { type: 'error'; message: string }
|
package/src/where.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
|
|
2
|
+
import { getQueryOrMutatorAuthData } from './helpers/getQueryOrMutatorAuthData'
|
|
3
|
+
|
|
4
|
+
import type { Condition, ExpressionBuilder } from '@rocicorp/zero'
|
|
5
|
+
import { isServer } from './constants'
|
|
6
|
+
import type { TableName, Where } from './types'
|
|
7
|
+
|
|
8
|
+
export function where<Table extends TableName, Builder extends Where<Table>>(
|
|
9
|
+
tableName: Table,
|
|
10
|
+
builder: Builder,
|
|
11
|
+
isServerOnly?: boolean
|
|
12
|
+
): Where<Table, Condition>
|
|
13
|
+
|
|
14
|
+
export function where<Table extends TableName, Builder extends Where = Where<Table>>(
|
|
15
|
+
builder: Builder
|
|
16
|
+
): Where<Table, Condition>
|
|
17
|
+
|
|
18
|
+
export function where<Table extends TableName, Builder extends Where<Table>>(
|
|
19
|
+
a: Table | Builder,
|
|
20
|
+
b?: Builder,
|
|
21
|
+
isServerOnly = false
|
|
22
|
+
): Where<Table, any> | Builder {
|
|
23
|
+
const whereFn = (b || a) as any
|
|
24
|
+
|
|
25
|
+
const wrappedWhereFn = ((
|
|
26
|
+
a: ExpressionBuilder<any, any>,
|
|
27
|
+
b = getQueryOrMutatorAuthData()
|
|
28
|
+
) => {
|
|
29
|
+
if (!isServer && isServerOnly) {
|
|
30
|
+
// on client (web or native) where conditions always pass
|
|
31
|
+
return a.and()
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const result = whereFn(a, b)
|
|
35
|
+
if (typeof result === 'boolean') {
|
|
36
|
+
if (result) {
|
|
37
|
+
return a.cmpLit(0, '=', 0)
|
|
38
|
+
} else {
|
|
39
|
+
return a.cmpLit(1, '=', 0)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return result
|
|
43
|
+
}) as Builder
|
|
44
|
+
|
|
45
|
+
if (b) {
|
|
46
|
+
WhereTableNameMap.set(wrappedWhereFn, a as Table)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return wrappedWhereFn
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// permissions where:
|
|
53
|
+
|
|
54
|
+
const WhereTableNameMap = new WeakMap<Where, TableName>()
|
|
55
|
+
|
|
56
|
+
export function getWhereTableName(where: Where) {
|
|
57
|
+
return WhereTableNameMap.get(where)
|
|
58
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
HumanReadable,
|
|
3
|
+
Query,
|
|
4
|
+
RunOptions,
|
|
5
|
+
Schema as ZeroSchema,
|
|
6
|
+
} from '@rocicorp/zero'
|
|
7
|
+
|
|
8
|
+
export type { RunOptions }
|
|
9
|
+
|
|
10
|
+
export type ZeroRunner = <TReturn>(
|
|
11
|
+
query: Query<any, ZeroSchema, TReturn>,
|
|
12
|
+
options?: RunOptions
|
|
13
|
+
) => Promise<HumanReadable<TReturn>>
|
|
14
|
+
|
|
15
|
+
let runner: ZeroRunner | null = null
|
|
16
|
+
|
|
17
|
+
export function setRunner(r: ZeroRunner) {
|
|
18
|
+
runner = r
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function getRunner(): ZeroRunner {
|
|
22
|
+
if (!runner) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
'Zero runner not initialized. Ensure ProvideZero is mounted (client) or createZeroServer is called (server).'
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
return runner
|
|
28
|
+
}
|
package/src/zql.ts
ADDED
package/types/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,QAAQ,SAAgC,CAAA;AACrD,eAAO,MAAM,SAAS,SAAY,CAAA"}
|