over-zero 0.0.10 → 0.0.13
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/dist/cjs/{build/schema.cjs → builder.cjs} +10 -7
- package/dist/cjs/{helpers/zeroEmitter.js → builder.js} +11 -7
- package/dist/cjs/builder.js.map +6 -0
- package/dist/cjs/builder.native.js +35 -0
- package/dist/cjs/builder.native.js.map +1 -0
- package/dist/cjs/cli.cjs +299 -0
- package/dist/cjs/cli.js +292 -0
- package/dist/cjs/cli.js.map +6 -0
- package/dist/cjs/cli.native.js +386 -0
- package/dist/cjs/cli.native.js.map +1 -0
- package/dist/cjs/createPermissions.cjs +22 -56
- package/dist/cjs/createPermissions.js +22 -64
- package/dist/cjs/createPermissions.js.map +1 -1
- package/dist/cjs/createPermissions.native.js +61 -87
- package/dist/cjs/createPermissions.native.js.map +1 -6
- package/dist/cjs/createZeroClient.cjs +41 -21
- package/dist/cjs/createZeroClient.js +23 -16
- package/dist/cjs/createZeroClient.js.map +1 -1
- package/dist/cjs/createZeroClient.native.js +139 -81
- package/dist/cjs/createZeroClient.native.js.map +1 -6
- package/dist/cjs/createZeroServer.cjs +40 -34
- package/dist/cjs/createZeroServer.js +35 -27
- package/dist/cjs/createZeroServer.js.map +2 -2
- package/dist/cjs/createZeroServer.native.js +119 -77
- package/dist/cjs/createZeroServer.native.js.map +1 -6
- package/dist/cjs/helpers/batchQuery.native.js +25 -18
- package/dist/cjs/helpers/batchQuery.native.js.map +1 -6
- package/dist/cjs/helpers/context.js.map +1 -1
- package/dist/cjs/helpers/context.native.js +20 -19
- package/dist/cjs/helpers/context.native.js.map +1 -6
- package/dist/cjs/helpers/createMutators.cjs +2 -2
- package/dist/cjs/helpers/createMutators.js +2 -2
- package/dist/cjs/helpers/createMutators.js.map +1 -1
- package/dist/cjs/helpers/createMutators.native.js +52 -41
- package/dist/cjs/helpers/createMutators.native.js.map +1 -6
- package/dist/cjs/helpers/didRunPermissionCheck.native.js +27 -22
- package/dist/cjs/helpers/didRunPermissionCheck.native.js.map +1 -6
- package/dist/cjs/helpers/ensureLoggedIn.cjs +2 -2
- package/dist/cjs/helpers/ensureLoggedIn.js +2 -2
- package/dist/cjs/helpers/ensureLoggedIn.js.map +1 -1
- package/dist/cjs/helpers/ensureLoggedIn.native.js +25 -18
- package/dist/cjs/helpers/ensureLoggedIn.native.js.map +1 -6
- package/dist/cjs/helpers/getQueryOrMutatorAuthData.cjs +30 -0
- package/dist/cjs/{build/schema.native.js → helpers/getQueryOrMutatorAuthData.js} +9 -13
- 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.native.js +102 -82
- package/dist/cjs/helpers/prettyFormatZeroQuery.native.js.map +1 -6
- package/dist/cjs/helpers/queryContext.cjs +40 -0
- package/dist/cjs/helpers/{getDidRunPermissionCheck.native.js → queryContext.js} +21 -13
- package/dist/cjs/helpers/queryContext.js.map +6 -0
- package/dist/cjs/helpers/queryContext.native.js +43 -0
- package/dist/cjs/helpers/queryContext.native.js.map +1 -0
- package/dist/cjs/helpers/queryOrMutatorAuthData.js +1 -0
- package/dist/cjs/helpers/queryOrMutatorAuthData.native.js +2 -0
- package/dist/cjs/helpers/queryOrMutatorContext.js +1 -0
- package/dist/cjs/helpers/queryOrMutatorContext.native.js +2 -0
- package/dist/cjs/helpers/useZeroDebug.native.js +63 -50
- package/dist/cjs/helpers/useZeroDebug.native.js.map +1 -6
- package/dist/cjs/index.cjs +3 -2
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.native.js +21 -26
- package/dist/cjs/index.native.js.map +1 -6
- package/dist/cjs/mutations.cjs +1 -1
- package/dist/cjs/mutations.js +1 -1
- package/dist/cjs/mutations.js.map +1 -1
- package/dist/cjs/mutations.native.js +33 -28
- package/dist/cjs/mutations.native.js.map +1 -6
- package/dist/cjs/query.cjs +34 -0
- package/dist/cjs/{helpers/zeroEmitter.native.js → query.js} +13 -11
- package/dist/cjs/query.js.map +6 -0
- package/dist/cjs/query.native.js +39 -0
- package/dist/cjs/query.native.js.map +1 -0
- package/dist/cjs/{helpers/getDidRunPermissionCheck.cjs → queryBuilder.cjs} +10 -6
- package/dist/cjs/{build/schema.js → queryBuilder.js} +11 -7
- package/dist/cjs/queryBuilder.js.map +6 -0
- package/dist/cjs/queryBuilder.native.js +35 -0
- package/dist/cjs/queryBuilder.native.js.map +1 -0
- package/dist/cjs/server.native.js +13 -12
- package/dist/cjs/server.native.js.map +1 -6
- package/dist/cjs/state.cjs +52 -0
- package/dist/cjs/state.js +40 -0
- package/dist/cjs/state.js.map +6 -0
- package/dist/cjs/state.native.js +55 -0
- package/dist/cjs/state.native.js.map +1 -0
- package/dist/cjs/types.native.js +9 -5
- package/dist/cjs/types.native.js.map +1 -6
- package/dist/cjs/where.cjs +9 -2
- package/dist/cjs/where.js +8 -2
- package/dist/cjs/where.js.map +2 -2
- package/dist/cjs/where.native.js +29 -19
- package/dist/cjs/where.native.js.map +1 -6
- package/dist/cjs/{helpers/zeroEmitter.cjs → zql.cjs} +10 -6
- package/dist/cjs/{helpers/getDidRunPermissionCheck.js → zql.js} +11 -6
- 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/builder.js +10 -0
- package/dist/esm/builder.js.map +6 -0
- package/dist/esm/builder.mjs +8 -0
- package/dist/esm/builder.mjs.map +1 -0
- package/dist/esm/builder.native.js +9 -0
- package/dist/esm/builder.native.js.map +1 -0
- package/dist/esm/cli.js +278 -0
- package/dist/esm/cli.js.map +6 -0
- package/dist/esm/cli.mjs +278 -0
- package/dist/esm/cli.mjs.map +1 -0
- package/dist/esm/cli.native.js +362 -0
- package/dist/esm/cli.native.js.map +1 -0
- package/dist/esm/createPermissions.js +21 -64
- package/dist/esm/createPermissions.js.map +1 -1
- package/dist/esm/createPermissions.mjs +20 -54
- package/dist/esm/createPermissions.mjs.map +1 -1
- package/dist/esm/createPermissions.native.js +26 -66
- package/dist/esm/createPermissions.native.js.map +1 -1
- package/dist/esm/createZeroClient.js +24 -16
- package/dist/esm/createZeroClient.js.map +1 -1
- package/dist/esm/createZeroClient.mjs +40 -20
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +56 -25
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroServer.js +36 -19
- package/dist/esm/createZeroServer.js.map +1 -1
- package/dist/esm/createZeroServer.mjs +35 -18
- package/dist/esm/createZeroServer.mjs.map +1 -1
- package/dist/esm/createZeroServer.native.js +43 -23
- package/dist/esm/createZeroServer.native.js.map +1 -1
- package/dist/esm/helpers/context.js.map +1 -1
- package/dist/esm/helpers/context.mjs.map +1 -1
- package/dist/esm/helpers/context.native.js.map +1 -1
- package/dist/esm/helpers/createMutators.js +1 -1
- package/dist/esm/helpers/createMutators.mjs +1 -1
- package/dist/esm/helpers/createMutators.native.js +1 -1
- package/dist/esm/helpers/ensureLoggedIn.js +2 -2
- package/dist/esm/helpers/ensureLoggedIn.js.map +1 -1
- package/dist/esm/helpers/ensureLoggedIn.mjs +2 -2
- package/dist/esm/helpers/ensureLoggedIn.mjs.map +1 -1
- package/dist/esm/helpers/ensureLoggedIn.native.js +2 -2
- package/dist/esm/helpers/ensureLoggedIn.native.js.map +1 -1
- 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/queryContext.js +20 -0
- package/dist/esm/helpers/queryContext.js.map +6 -0
- package/dist/esm/helpers/queryContext.mjs +15 -0
- package/dist/esm/helpers/queryContext.mjs.map +1 -0
- package/dist/esm/helpers/queryContext.native.js +15 -0
- package/dist/esm/helpers/queryContext.native.js.map +1 -0
- package/dist/esm/helpers/queryOrMutatorAuthData.js +1 -0
- package/dist/esm/helpers/queryOrMutatorAuthData.mjs +2 -0
- package/dist/esm/helpers/queryOrMutatorAuthData.native.js +2 -0
- package/dist/esm/helpers/queryOrMutatorContext.js +1 -0
- package/dist/esm/helpers/queryOrMutatorContext.mjs +2 -0
- package/dist/esm/helpers/queryOrMutatorContext.mjs.map +1 -0
- package/dist/esm/helpers/queryOrMutatorContext.native.js +2 -0
- package/dist/esm/helpers/queryOrMutatorContext.native.js.map +1 -0
- package/dist/esm/index.js +3 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +3 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +3 -2
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/mutations.js +1 -1
- package/dist/esm/mutations.js.map +1 -1
- package/dist/esm/mutations.mjs +1 -1
- package/dist/esm/mutations.mjs.map +1 -1
- package/dist/esm/mutations.native.js +1 -1
- package/dist/esm/mutations.native.js.map +1 -1
- package/dist/esm/query.js +13 -0
- package/dist/esm/query.js.map +6 -0
- package/dist/esm/query.mjs +11 -0
- package/dist/esm/query.mjs.map +1 -0
- package/dist/esm/query.native.js +13 -0
- package/dist/esm/query.native.js.map +1 -0
- package/dist/esm/queryBuilder.js +10 -0
- package/dist/esm/queryBuilder.js.map +6 -0
- package/dist/esm/queryBuilder.mjs +8 -0
- package/dist/esm/queryBuilder.mjs.map +1 -0
- package/dist/esm/queryBuilder.native.js +9 -0
- package/dist/esm/queryBuilder.native.js.map +1 -0
- package/dist/esm/state.js +24 -0
- package/dist/esm/state.js.map +6 -0
- package/dist/esm/state.mjs +25 -0
- package/dist/esm/state.mjs.map +1 -0
- package/dist/esm/state.native.js +25 -0
- package/dist/esm/state.native.js.map +1 -0
- package/dist/esm/where.js +9 -2
- package/dist/esm/where.js.map +2 -2
- package/dist/esm/where.mjs +9 -2
- package/dist/esm/where.mjs.map +1 -1
- package/dist/esm/where.native.js +10 -2
- package/dist/esm/where.native.js.map +1 -1
- 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 +13 -3
- package/readme.md +460 -13
- package/src/cli.ts +511 -0
- package/src/createPermissions.ts +21 -123
- package/src/createZeroClient.tsx +107 -23
- package/src/createZeroServer.ts +64 -29
- package/src/helpers/createMutators.ts +1 -1
- package/src/helpers/ensureLoggedIn.ts +2 -2
- package/src/helpers/getQueryOrMutatorAuthData.ts +11 -0
- package/src/helpers/{context.ts → mutatorContext.ts} +2 -6
- package/src/index.ts +3 -2
- package/src/mutations.ts +1 -1
- package/src/state.ts +32 -0
- package/src/types.ts +11 -5
- package/src/where.ts +33 -8
- package/src/zql.ts +9 -0
- package/types/builder.d.ts +3 -0
- package/types/builder.d.ts.map +1 -0
- package/types/cli.d.ts +3 -0
- package/types/cli.d.ts.map +1 -0
- package/types/createPermissions.d.ts +3 -27
- package/types/createPermissions.d.ts.map +1 -1
- package/types/createZeroClient.d.ts +16 -4
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/createZeroServer.d.ts +33 -6
- package/types/createZeroServer.d.ts.map +1 -1
- package/types/helpers/context.d.ts.map +1 -1
- 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/queryContext.d.ts +5 -0
- package/types/helpers/queryContext.d.ts.map +1 -0
- package/types/index.d.ts +3 -2
- package/types/index.d.ts.map +1 -1
- package/types/state.d.ts +8 -0
- package/types/state.d.ts.map +1 -0
- package/types/types.d.ts +5 -4
- package/types/types.d.ts.map +1 -1
- package/types/where.d.ts +3 -2
- package/types/where.d.ts.map +1 -1
- package/types/zql.d.ts +3 -0
- package/types/zql.d.ts.map +1 -0
- package/dist/cjs/build/readPermissions.cjs +0 -51
- package/dist/cjs/build/readPermissions.js +0 -48
- package/dist/cjs/build/readPermissions.js.map +0 -6
- package/dist/cjs/build/readPermissions.native.js +0 -56
- package/dist/cjs/build/readPermissions.native.js.map +0 -6
- package/dist/cjs/build/schema.js.map +0 -6
- package/dist/cjs/build/schema.native.js.map +0 -6
- package/dist/cjs/createClient.cjs +0 -89
- package/dist/cjs/createClient.js +0 -76
- package/dist/cjs/createClient.js.map +0 -6
- package/dist/cjs/createClient.native.js +0 -81
- package/dist/cjs/createClient.native.js.map +0 -6
- package/dist/cjs/createMutations.cjs +0 -50
- package/dist/cjs/createMutations.js +0 -43
- package/dist/cjs/createMutations.js.map +0 -6
- package/dist/cjs/createMutations.native.js +0 -50
- package/dist/cjs/createMutations.native.js.map +0 -6
- package/dist/cjs/createServer.cjs +0 -92
- package/dist/cjs/createServer.js +0 -71
- package/dist/cjs/createServer.js.map +0 -6
- package/dist/cjs/createServer.native.js +0 -75
- package/dist/cjs/createServer.native.js.map +0 -6
- package/dist/cjs/createZero.cjs +0 -128
- package/dist/cjs/createZero.js +0 -107
- package/dist/cjs/createZero.js.map +0 -6
- package/dist/cjs/createZero.native.js +0 -115
- package/dist/cjs/createZero.native.js.map +0 -6
- package/dist/cjs/helpers/clearZeroDatabase.cjs +0 -57
- package/dist/cjs/helpers/clearZeroDatabase.js +0 -57
- package/dist/cjs/helpers/clearZeroDatabase.js.map +0 -6
- package/dist/cjs/helpers/clearZeroDatabase.native.js +0 -71
- package/dist/cjs/helpers/clearZeroDatabase.native.js.map +0 -6
- package/dist/cjs/helpers/getAuthData.js +0 -1
- package/dist/cjs/helpers/getAuthData.native.js +0 -2
- package/dist/cjs/helpers/getDidRunPermissionCheck.js.map +0 -6
- package/dist/cjs/helpers/getDidRunPermissionCheck.native.js.map +0 -6
- package/dist/cjs/helpers/setupZeroClientGlobalEffects.cjs +0 -40
- package/dist/cjs/helpers/setupZeroClientGlobalEffects.js +0 -36
- package/dist/cjs/helpers/setupZeroClientGlobalEffects.js.map +0 -6
- package/dist/cjs/helpers/setupZeroClientGlobalEffects.native.js +0 -36
- package/dist/cjs/helpers/setupZeroClientGlobalEffects.native.js.map +0 -6
- package/dist/cjs/helpers/useAuthData.js +0 -1
- package/dist/cjs/helpers/useAuthData.native.js +0 -2
- package/dist/cjs/helpers/useZDB.cjs +0 -70
- package/dist/cjs/helpers/useZDB.js +0 -51
- package/dist/cjs/helpers/useZDB.js.map +0 -6
- package/dist/cjs/helpers/useZDB.native.js +0 -68
- package/dist/cjs/helpers/useZDB.native.js.map +0 -6
- package/dist/cjs/helpers/zeroEmitter.js.map +0 -6
- package/dist/cjs/helpers/zeroEmitter.native.js.map +0 -6
- package/dist/esm/build/readPermissions.js +0 -36
- package/dist/esm/build/readPermissions.js.map +0 -6
- package/dist/esm/build/readPermissions.mjs +0 -28
- package/dist/esm/build/readPermissions.mjs.map +0 -1
- package/dist/esm/build/readPermissions.native.js +0 -34
- package/dist/esm/build/readPermissions.native.js.map +0 -1
- package/dist/esm/build/schema.js +0 -7
- package/dist/esm/build/schema.js.map +0 -6
- package/dist/esm/build/schema.mjs +0 -4
- package/dist/esm/build/schema.mjs.map +0 -1
- package/dist/esm/build/schema.native.js +0 -4
- package/dist/esm/build/schema.native.js.map +0 -1
- package/dist/esm/createClient.js +0 -68
- package/dist/esm/createClient.js.map +0 -6
- package/dist/esm/createClient.mjs +0 -66
- package/dist/esm/createClient.mjs.map +0 -1
- package/dist/esm/createClient.native.js +0 -74
- package/dist/esm/createClient.native.js.map +0 -1
- package/dist/esm/createMutations.js +0 -27
- package/dist/esm/createMutations.js.map +0 -6
- package/dist/esm/createMutations.mjs +0 -27
- package/dist/esm/createMutations.mjs.map +0 -1
- package/dist/esm/createMutations.native.js +0 -29
- package/dist/esm/createMutations.native.js.map +0 -1
- package/dist/esm/createServer.js +0 -54
- package/dist/esm/createServer.js.map +0 -6
- package/dist/esm/createServer.mjs +0 -58
- package/dist/esm/createServer.mjs.map +0 -1
- package/dist/esm/createServer.native.js +0 -61
- package/dist/esm/createServer.native.js.map +0 -1
- package/dist/esm/createZero.js +0 -99
- package/dist/esm/createZero.js.map +0 -6
- package/dist/esm/createZero.mjs +0 -105
- package/dist/esm/createZero.mjs.map +0 -1
- package/dist/esm/createZero.native.js +0 -119
- package/dist/esm/createZero.native.js.map +0 -1
- package/dist/esm/helpers/clearZeroDatabase.js +0 -42
- package/dist/esm/helpers/clearZeroDatabase.js.map +0 -6
- package/dist/esm/helpers/clearZeroDatabase.mjs +0 -34
- package/dist/esm/helpers/clearZeroDatabase.mjs.map +0 -1
- package/dist/esm/helpers/clearZeroDatabase.native.js +0 -50
- package/dist/esm/helpers/clearZeroDatabase.native.js.map +0 -1
- package/dist/esm/helpers/getAuthData.js +0 -1
- package/dist/esm/helpers/getAuthData.js.map +0 -6
- package/dist/esm/helpers/getAuthData.mjs +0 -2
- package/dist/esm/helpers/getAuthData.native.js +0 -2
- package/dist/esm/helpers/getDidRunPermissionCheck.js +0 -5
- package/dist/esm/helpers/getDidRunPermissionCheck.js.map +0 -6
- package/dist/esm/helpers/getDidRunPermissionCheck.mjs +0 -4
- package/dist/esm/helpers/getDidRunPermissionCheck.mjs.map +0 -1
- package/dist/esm/helpers/getDidRunPermissionCheck.native.js +0 -6
- package/dist/esm/helpers/getDidRunPermissionCheck.native.js.map +0 -1
- package/dist/esm/helpers/setupZeroClientGlobalEffects.js +0 -40
- package/dist/esm/helpers/setupZeroClientGlobalEffects.js.map +0 -6
- package/dist/esm/helpers/setupZeroClientGlobalEffects.mjs +0 -41
- package/dist/esm/helpers/setupZeroClientGlobalEffects.mjs.map +0 -1
- package/dist/esm/helpers/setupZeroClientGlobalEffects.native.js +0 -41
- package/dist/esm/helpers/setupZeroClientGlobalEffects.native.js.map +0 -1
- package/dist/esm/helpers/useAuthData.js +0 -1
- package/dist/esm/helpers/useAuthData.js.map +0 -6
- package/dist/esm/helpers/useAuthData.mjs +0 -2
- package/dist/esm/helpers/useAuthData.native.js +0 -2
- package/dist/esm/helpers/useZDB.js +0 -38
- package/dist/esm/helpers/useZDB.js.map +0 -6
- package/dist/esm/helpers/useZDB.mjs +0 -47
- package/dist/esm/helpers/useZDB.mjs.map +0 -1
- package/dist/esm/helpers/useZDB.native.js +0 -55
- package/dist/esm/helpers/useZDB.native.js.map +0 -1
- package/dist/esm/helpers/zeroEmitter.js +0 -6
- package/dist/esm/helpers/zeroEmitter.js.map +0 -6
- package/dist/esm/helpers/zeroEmitter.mjs +0 -4
- package/dist/esm/helpers/zeroEmitter.mjs.map +0 -1
- package/dist/esm/helpers/zeroEmitter.native.js +0 -4
- package/dist/esm/helpers/zeroEmitter.native.js.map +0 -1
- /package/dist/cjs/helpers/{getAuthData.cjs → queryOrMutatorAuthData.cjs} +0 -0
- /package/dist/cjs/helpers/{getAuthData.js.map → queryOrMutatorAuthData.js.map} +0 -0
- /package/dist/{esm/helpers/getAuthData.mjs.map → cjs/helpers/queryOrMutatorAuthData.native.js.map} +0 -0
- /package/dist/cjs/helpers/{useAuthData.cjs → queryOrMutatorContext.cjs} +0 -0
- /package/dist/cjs/helpers/{getAuthData.native.js.map → queryOrMutatorContext.js.map} +0 -0
- /package/dist/{esm/helpers/getAuthData.native.js.map → cjs/helpers/queryOrMutatorContext.native.js.map} +0 -0
- /package/dist/{cjs/helpers/useAuthData.js.map → esm/helpers/queryOrMutatorAuthData.js.map} +0 -0
- /package/dist/esm/helpers/{useAuthData.mjs.map → queryOrMutatorAuthData.mjs.map} +0 -0
- /package/dist/esm/helpers/{useAuthData.native.js.map → queryOrMutatorAuthData.native.js.map} +0 -0
- /package/dist/{cjs/helpers/useAuthData.native.js.map → esm/helpers/queryOrMutatorContext.js.map} +0 -0
package/readme.md
CHANGED
|
@@ -1,20 +1,467 @@
|
|
|
1
1
|
# over-zero
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
few production apps.
|
|
3
|
+
<img src="./over-zero.svg" width="120" alt="over-zero" />
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
define each zero **table** alongside its **permissions** and **mutations** in an
|
|
8
|
-
intuitive and simple way.
|
|
5
|
+
helpers for building offline-first apps with [zero](https://zero.rocicorp.dev)
|
|
9
6
|
|
|
10
|
-
|
|
11
|
-
your that make a variety of common client and server patterns simpler.
|
|
7
|
+
## what it does
|
|
12
8
|
|
|
13
|
-
|
|
14
|
-
permissions defined using simple `where` and `mutations` helper functions. You
|
|
15
|
-
can then use your permissions in custom mutators with the `can` helper function.
|
|
9
|
+
over-zero provides three integrated systems on top of zero:
|
|
16
10
|
|
|
17
|
-
|
|
11
|
+
**queries** - plain functions that become synced queries **mutations** -
|
|
12
|
+
server-validated operations with auto-generated crud **permissions** -
|
|
13
|
+
composable access control checked at runtime
|
|
18
14
|
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
the package handles schema setup, type generation, and react integration. models
|
|
16
|
+
live alongside their permissions and mutations. queries are just functions that
|
|
17
|
+
use a global `zql` builder.
|
|
18
|
+
|
|
19
|
+
## queries
|
|
20
|
+
|
|
21
|
+
write plain functions. they become synced queries automatically.
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
// src/data/queries/notification.ts
|
|
25
|
+
import { zql, where } from 'over-zero'
|
|
26
|
+
|
|
27
|
+
const permission = where('notification', (q, auth) => {
|
|
28
|
+
return q.cmp('userId', auth?.id || '')
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
export const latestNotifications = (props: {
|
|
32
|
+
userId: string
|
|
33
|
+
serverId: string
|
|
34
|
+
}) => {
|
|
35
|
+
return zql.notification
|
|
36
|
+
.where(permission)
|
|
37
|
+
.where('userId', props.userId)
|
|
38
|
+
.where('serverId', props.serverId)
|
|
39
|
+
.orderBy('createdAt', 'desc')
|
|
40
|
+
.limit(20)
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
zql is just the normal Zero query builder based on your typed schema.
|
|
45
|
+
|
|
46
|
+
use them:
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
const [data, state] = useQuery(latestNotifications, { userId, serverId })
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
the function name becomes the query name. `useQuery` detects plain functions,
|
|
53
|
+
creates a cached `SyncedQuery` per function, and calls it with your params.
|
|
54
|
+
|
|
55
|
+
### query permissions
|
|
56
|
+
|
|
57
|
+
define permissions inline using `where()`:
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
const permission = where('channel', (q, auth) => {
|
|
61
|
+
if (auth?.role === 'admin') return true
|
|
62
|
+
|
|
63
|
+
return q.and(
|
|
64
|
+
q.cmp('deleted', '!=', true),
|
|
65
|
+
q.or(
|
|
66
|
+
q.cmp('private', false),
|
|
67
|
+
q.exists('role', (r) =>
|
|
68
|
+
r.whereExists('member', (m) => m.where('id', auth?.id))
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
)
|
|
72
|
+
})
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
then use in queries:
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
export const channelById = (props: { channelId: string }) => {
|
|
79
|
+
return zql.channel
|
|
80
|
+
.where(permission)
|
|
81
|
+
.where('id', props.channelId)
|
|
82
|
+
.one()
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
permissions execute server-side only. on the client they automatically pass.
|
|
87
|
+
the `where()` helper automatically accesses auth data from `queryContext()` or
|
|
88
|
+
`mutatorContext()` so you don't need to pass it manually.
|
|
89
|
+
|
|
90
|
+
## mutations
|
|
91
|
+
|
|
92
|
+
define schema, permissions, and mutations together:
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
// src/data/models/message.ts
|
|
96
|
+
import { table, mutations, where } from 'over-zero'
|
|
97
|
+
|
|
98
|
+
export const schema = table('message')
|
|
99
|
+
.columns({
|
|
100
|
+
id: string(),
|
|
101
|
+
content: string(),
|
|
102
|
+
authorId: string(),
|
|
103
|
+
channelId: string(),
|
|
104
|
+
createdAt: number(),
|
|
105
|
+
})
|
|
106
|
+
.primaryKey('id')
|
|
107
|
+
|
|
108
|
+
export const permissions = where('message', (q, auth) => {
|
|
109
|
+
return q.cmp('authorId', auth?.id || '')
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
// CRUD migrations with permissions by passing schema + permissions:
|
|
113
|
+
export const mutate = mutations(schema, permissions, {
|
|
114
|
+
async send(ctx, props: { content: string; channelId: string }) {
|
|
115
|
+
await ctx.can(permissions, props)
|
|
116
|
+
|
|
117
|
+
await ctx.tx.mutate.message.insert({
|
|
118
|
+
id: randomId(),
|
|
119
|
+
content: props.content,
|
|
120
|
+
channelId: props.channelId,
|
|
121
|
+
authorId: ctx.authData!.id,
|
|
122
|
+
createdAt: Date.now(),
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
if (ctx.server) {
|
|
126
|
+
ctx.server.asyncTasks.push(async () => {
|
|
127
|
+
await ctx.server.actions.sendNotification(props)
|
|
128
|
+
})
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
})
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
call mutations from react:
|
|
135
|
+
|
|
136
|
+
```tsx
|
|
137
|
+
await zero.mutate.message.send({ content: 'hello', channelId: 'ch-1' })
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
the second argument (`permissions`) enables auto-generated crud that checks
|
|
141
|
+
permissions:
|
|
142
|
+
|
|
143
|
+
```tsx
|
|
144
|
+
zero.mutate.message.insert(message)
|
|
145
|
+
zero.mutate.message.update(message)
|
|
146
|
+
zero.mutate.message.delete(message)
|
|
147
|
+
zero.mutate.message.upsert(message)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## permissions
|
|
151
|
+
|
|
152
|
+
permissions use the `where()` helper to create Zero `ExpressionBuilder` conditions:
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
export const permissions = where('channel', (q, auth) => {
|
|
156
|
+
if (auth?.role === 'admin') return true
|
|
157
|
+
|
|
158
|
+
return q.or(
|
|
159
|
+
q.cmp('public', true),
|
|
160
|
+
q.exists('members', (m) => m.where('userId', auth?.id)),
|
|
161
|
+
)
|
|
162
|
+
})
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
the `where()` helper automatically gets auth data from `queryContext()` or
|
|
166
|
+
`mutatorContext()`, so you don't manually pass it. permissions only execute
|
|
167
|
+
server-side - on the client they automatically pass.
|
|
168
|
+
|
|
169
|
+
**for queries:** define permissions inline as a constant in query files:
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
// src/data/queries/channel.ts
|
|
173
|
+
const permission = where('channel', (q, auth) => {
|
|
174
|
+
return q.cmp('userId', auth?.id || '')
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
export const myChannels = () => {
|
|
178
|
+
return zql.channel.where(permission)
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**for mutations:** define permissions in model files for CRUD operations:
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
// src/data/models/message.ts
|
|
186
|
+
export const permissions = where('message', (q, auth) => {
|
|
187
|
+
return q.cmp('authorId', auth?.id || '')
|
|
188
|
+
})
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
CRUD mutations automatically apply them, but for custom mutations use `can()`:
|
|
192
|
+
|
|
193
|
+
```ts
|
|
194
|
+
await ctx.can(permissions, messageId)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
check permissions in React with `usePermission()`:
|
|
198
|
+
|
|
199
|
+
```tsx
|
|
200
|
+
const canEdit = usePermission('message', messageId)
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## generation
|
|
204
|
+
|
|
205
|
+
`over-zero` has a CLI that auto-generates glue files that wire up your models,
|
|
206
|
+
queries, and types.
|
|
207
|
+
|
|
208
|
+
### cli commands
|
|
209
|
+
|
|
210
|
+
**`over-zero generate [dir]`**
|
|
211
|
+
|
|
212
|
+
generates all files needed to connect your models and queries:
|
|
213
|
+
|
|
214
|
+
- `models.ts` - aggregates all model files into a single import
|
|
215
|
+
- `types.ts` - generates TypeScript types from table schemas
|
|
216
|
+
- `tables.ts` - exports table schemas (separate to avoid circular types)
|
|
217
|
+
- `queries.ts` - generates synced query definitions with valibot validators
|
|
218
|
+
|
|
219
|
+
**options:**
|
|
220
|
+
|
|
221
|
+
- `dir` - base directory containing `models/` and `queries/` folders (default:
|
|
222
|
+
`src/data`)
|
|
223
|
+
- `--watch` - watch for changes and regenerate automatically
|
|
224
|
+
- `--after` - command to run after generation completes
|
|
225
|
+
|
|
226
|
+
**examples:**
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# generate once
|
|
230
|
+
bun over-zero generate
|
|
231
|
+
|
|
232
|
+
# generate and watch
|
|
233
|
+
bun over-zero generate --watch
|
|
234
|
+
|
|
235
|
+
# custom directory
|
|
236
|
+
bun over-zero generate ./app/data
|
|
237
|
+
|
|
238
|
+
# run linter after generation
|
|
239
|
+
bun over-zero generate --after "bun lint:fix"
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**`over-zero generate-queries <dir>`**
|
|
243
|
+
|
|
244
|
+
generates query validators from TypeScript query functions. this is included in
|
|
245
|
+
`generate` but can be run standalone.
|
|
246
|
+
|
|
247
|
+
- parses exported arrow functions from `.ts` files in the queries directory
|
|
248
|
+
- extracts parameter types using TypeScript compiler API
|
|
249
|
+
- generates valibot schemas using typebox-codegen
|
|
250
|
+
|
|
251
|
+
**example:**
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
bun over-zero generate-queries src/data/queries
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### what gets generated
|
|
258
|
+
|
|
259
|
+
**models.ts:**
|
|
260
|
+
|
|
261
|
+
```ts
|
|
262
|
+
import * as channel from '~/data/models/channel'
|
|
263
|
+
import * as message from '~/data/models/message'
|
|
264
|
+
|
|
265
|
+
export const models = {
|
|
266
|
+
channel,
|
|
267
|
+
message,
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
**types.ts:**
|
|
272
|
+
|
|
273
|
+
```ts
|
|
274
|
+
import type { TableInsertRow, TableUpdateRow } from 'over-zero'
|
|
275
|
+
import type * as schema from '../tables'
|
|
276
|
+
|
|
277
|
+
export type Channel = TableInsertRow<typeof schema.channel>
|
|
278
|
+
export type ChannelUpdate = TableUpdateRow<typeof schema.channel>
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**tables.ts:**
|
|
282
|
+
|
|
283
|
+
```ts
|
|
284
|
+
export { schema as channel } from '~/data/models/channel'
|
|
285
|
+
export { schema as message } from '~/data/models/message'
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**queries.ts:**
|
|
289
|
+
|
|
290
|
+
```ts
|
|
291
|
+
import * as v from 'valibot'
|
|
292
|
+
import { syncedQuery } from '@rocicorp/zero'
|
|
293
|
+
import * as messageQueries from '../queries/message'
|
|
294
|
+
|
|
295
|
+
export const latestMessages = syncedQuery(
|
|
296
|
+
'latestMessages',
|
|
297
|
+
v.parser(
|
|
298
|
+
v.tuple([
|
|
299
|
+
v.object({
|
|
300
|
+
channelId: v.string(),
|
|
301
|
+
limit: v.optional(v.number()),
|
|
302
|
+
}),
|
|
303
|
+
]),
|
|
304
|
+
),
|
|
305
|
+
(arg) => {
|
|
306
|
+
return messageQueries.latestMessages(arg)
|
|
307
|
+
},
|
|
308
|
+
)
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### how it works
|
|
312
|
+
|
|
313
|
+
the generator:
|
|
314
|
+
|
|
315
|
+
1. scans `models/` for files with `export const schema = table(...)`
|
|
316
|
+
2. scans `queries/` for exported arrow functions
|
|
317
|
+
3. parses TypeScript AST to extract parameter types
|
|
318
|
+
4. converts types to valibot schemas using typebox-codegen
|
|
319
|
+
5. wraps query functions in `syncedQuery()` with validators
|
|
320
|
+
6. handles special cases (void params, user → userPublic mapping)
|
|
321
|
+
7. groups query imports by source file
|
|
322
|
+
|
|
323
|
+
queries with no parameters get wrapped in `v.parser(v.tuple([]))` while queries
|
|
324
|
+
with params get validators like `v.parser(v.tuple([v.object({ ... })]))`.
|
|
325
|
+
|
|
326
|
+
exports named `permission` are automatically skipped during query generation.
|
|
327
|
+
|
|
328
|
+
## setup
|
|
329
|
+
|
|
330
|
+
client:
|
|
331
|
+
|
|
332
|
+
```tsx
|
|
333
|
+
import { createZeroClient } from 'over-zero'
|
|
334
|
+
import { schema } from './data/schema'
|
|
335
|
+
import { models } from './data/models'
|
|
336
|
+
|
|
337
|
+
export const { ProvideZero, useQuery, zero } = createZeroClient({
|
|
338
|
+
schema,
|
|
339
|
+
models,
|
|
340
|
+
})
|
|
341
|
+
|
|
342
|
+
// in your app root
|
|
343
|
+
<ProvideZero
|
|
344
|
+
server="http://localhost:4848"
|
|
345
|
+
userID={user.id}
|
|
346
|
+
auth={jwtToken}
|
|
347
|
+
authData={{ id: user.id, email: user.email, role: user.role }}
|
|
348
|
+
>
|
|
349
|
+
<App />
|
|
350
|
+
</ProvideZero>
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
server:
|
|
354
|
+
|
|
355
|
+
```ts
|
|
356
|
+
import { createZeroServer } from 'over-zero/server'
|
|
357
|
+
|
|
358
|
+
export const zeroServer = createZeroServer({
|
|
359
|
+
schema,
|
|
360
|
+
models,
|
|
361
|
+
database: process.env.DATABASE_URL,
|
|
362
|
+
createServerActions: () => ({
|
|
363
|
+
sendEmail: async (to, subject, body) => { ... }
|
|
364
|
+
})
|
|
365
|
+
})
|
|
366
|
+
|
|
367
|
+
// in your api endpoint
|
|
368
|
+
app.post('/api/zero/push', async (req) => {
|
|
369
|
+
const authData = await getAuthFromRequest(req)
|
|
370
|
+
const { response } = await zeroServer.handleMutationRequest({
|
|
371
|
+
authData,
|
|
372
|
+
request: req
|
|
373
|
+
})
|
|
374
|
+
return response
|
|
375
|
+
})
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
type augmentation:
|
|
379
|
+
|
|
380
|
+
```ts
|
|
381
|
+
// src/zero/types.ts
|
|
382
|
+
import type { schema } from '~/data/schema'
|
|
383
|
+
import type { AuthData } from './auth'
|
|
384
|
+
|
|
385
|
+
declare module 'over-zero' {
|
|
386
|
+
interface Config {
|
|
387
|
+
schema: typeof schema
|
|
388
|
+
authData: AuthData
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
## mutation context
|
|
394
|
+
|
|
395
|
+
every mutation receives `MutatorContext` as first argument:
|
|
396
|
+
|
|
397
|
+
```ts
|
|
398
|
+
type MutatorContext = {
|
|
399
|
+
tx: Transaction // database transaction
|
|
400
|
+
authData: AuthData | null // current user
|
|
401
|
+
environment: 'server' | 'client' // where executing
|
|
402
|
+
can: (where, obj) => Promise<void> // permission checker
|
|
403
|
+
server?: {
|
|
404
|
+
actions: ServerActions // async server functions
|
|
405
|
+
asyncTasks: AsyncAction[] // run after transaction
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
use it:
|
|
411
|
+
|
|
412
|
+
```ts
|
|
413
|
+
export const mutate = mutations(schema, permissions, {
|
|
414
|
+
async archive(ctx, { messageId }) {
|
|
415
|
+
await ctx.can(permissions, messageId)
|
|
416
|
+
await ctx.tx.mutate.message.update({ id: messageId, archived: true })
|
|
417
|
+
|
|
418
|
+
ctx.server?.asyncTasks.push(async () => {
|
|
419
|
+
await ctx.server.actions.indexForSearch(messageId)
|
|
420
|
+
})
|
|
421
|
+
},
|
|
422
|
+
})
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
## patterns
|
|
426
|
+
|
|
427
|
+
**client-side optimistic updates:**
|
|
428
|
+
|
|
429
|
+
```ts
|
|
430
|
+
zero.mutate.message.update(message).client
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
**wait for server confirmation:**
|
|
434
|
+
|
|
435
|
+
```ts
|
|
436
|
+
const result = await zero.mutate.message.update(message).server
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
**server-only mutations:**
|
|
440
|
+
|
|
441
|
+
```ts
|
|
442
|
+
await zeroServer.mutate(async (tx, mutators) => {
|
|
443
|
+
await mutators.user.insert(tx, user)
|
|
444
|
+
})
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
**one-off queries:**
|
|
448
|
+
|
|
449
|
+
```ts
|
|
450
|
+
const user = await zeroServer.query((q) => q.user.where('id', userId).one())
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
**batch processing:**
|
|
454
|
+
|
|
455
|
+
```ts
|
|
456
|
+
import { batchQuery } from 'over-zero'
|
|
457
|
+
|
|
458
|
+
await batchQuery(
|
|
459
|
+
zql.message.where('processed', false),
|
|
460
|
+
async (messages) => {
|
|
461
|
+
for (const msg of messages) {
|
|
462
|
+
await processMessage(msg)
|
|
463
|
+
}
|
|
464
|
+
},
|
|
465
|
+
{ chunk: 100, pause: 50 },
|
|
466
|
+
)
|
|
467
|
+
```
|