on-zero 0.7.10 → 0.8.0
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/{readme.md → README.md} +172 -231
- package/dist/cjs/cli.cjs +5 -2
- package/dist/cjs/cli.native.js +5 -2
- package/dist/cjs/cli.native.js.map +1 -1
- package/dist/cjs/combineZeroClients.cjs +2 -2
- package/dist/cjs/combineZeroClients.native.js +6 -6
- package/dist/cjs/combineZeroClients.native.js.map +1 -1
- package/dist/cjs/config.cjs +30 -0
- package/dist/cjs/config.native.js +33 -0
- package/dist/cjs/config.native.js.map +1 -0
- package/dist/cjs/createPermissions.cjs +2 -2
- package/dist/cjs/createPermissions.native.js +17 -27
- package/dist/cjs/createPermissions.native.js.map +1 -1
- package/dist/cjs/createUseQuery.cjs +3 -3
- package/dist/cjs/createUseQuery.native.js +4 -4
- package/dist/cjs/createUseQuery.native.js.map +1 -1
- package/dist/cjs/createUseQueryDirect.cjs +4 -3
- package/dist/cjs/createUseQueryDirect.native.js +14 -18
- package/dist/cjs/createUseQueryDirect.native.js.map +1 -1
- package/dist/cjs/createZeroClient.cjs +29 -9
- package/dist/cjs/createZeroClient.connection.test.cjs +11 -0
- package/dist/cjs/createZeroClient.connection.test.native.js +14 -7
- package/dist/cjs/createZeroClient.connection.test.native.js.map +1 -1
- package/dist/cjs/createZeroClient.native.js +58 -32
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/createZeroClient.recovery.test.cjs +90 -3
- package/dist/cjs/createZeroClient.recovery.test.native.js +109 -19
- package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -1
- package/dist/cjs/generate-helpers.cjs +70 -17
- package/dist/cjs/generate-helpers.native.js +110 -23
- package/dist/cjs/generate-helpers.native.js.map +1 -1
- package/dist/cjs/generate-layout.cjs +586 -0
- package/dist/cjs/generate-layout.native.js +1275 -0
- package/dist/cjs/generate-layout.native.js.map +1 -0
- package/dist/cjs/generate-lite.cjs +295 -27
- package/dist/cjs/generate-lite.native.js +854 -102
- package/dist/cjs/generate-lite.native.js.map +1 -1
- package/dist/cjs/generate-lite.test.cjs +433 -41
- package/dist/cjs/generate-lite.test.native.js +446 -41
- package/dist/cjs/generate-lite.test.native.js.map +1 -1
- package/dist/cjs/generate.cjs +172 -94
- package/dist/cjs/generate.native.js +324 -148
- package/dist/cjs/generate.native.js.map +1 -1
- package/dist/cjs/generate.test.cjs +362 -45
- package/dist/cjs/generate.test.native.js +374 -45
- package/dist/cjs/generate.test.native.js.map +1 -1
- package/dist/cjs/helpers/NullToOptional.cjs +18 -0
- package/dist/cjs/helpers/NullToOptional.native.js +21 -0
- package/dist/cjs/helpers/NullToOptional.native.js.map +1 -0
- package/dist/cjs/helpers/asyncContext.cjs +128 -0
- package/dist/cjs/helpers/asyncContext.native.js +87 -0
- package/dist/cjs/helpers/asyncContext.native.js.map +1 -0
- package/dist/cjs/helpers/batchQuery.cjs +2 -2
- package/dist/cjs/helpers/batchQuery.native.js +2 -2
- package/dist/cjs/helpers/batchQuery.native.js.map +1 -1
- package/dist/cjs/helpers/createMutators.cjs +7 -4
- package/dist/cjs/helpers/createMutators.native.js +12 -9
- package/dist/cjs/helpers/createMutators.native.js.map +1 -1
- package/dist/cjs/helpers/createMutators.test.native.js +2 -2
- package/dist/cjs/helpers/createMutators.test.native.js.map +1 -1
- package/dist/cjs/helpers/ellipsis.cjs +35 -0
- package/dist/cjs/helpers/ellipsis.native.js +38 -0
- package/dist/cjs/helpers/ellipsis.native.js.map +1 -0
- package/dist/cjs/helpers/emitter.cjs +99 -0
- package/dist/cjs/helpers/emitter.native.js +125 -0
- package/dist/cjs/helpers/emitter.native.js.map +1 -0
- package/dist/cjs/helpers/ensure.cjs +33 -0
- package/dist/cjs/helpers/ensure.native.js +37 -0
- package/dist/cjs/helpers/ensure.native.js.map +1 -0
- package/dist/cjs/helpers/ensureLoggedIn.cjs +2 -2
- package/dist/cjs/helpers/ensureLoggedIn.native.js +3 -3
- package/dist/cjs/helpers/ensureLoggedIn.native.js.map +1 -1
- package/dist/cjs/helpers/errors.cjs +40 -0
- package/dist/cjs/helpers/errors.native.js +152 -0
- package/dist/cjs/helpers/errors.native.js.map +1 -0
- package/dist/cjs/helpers/getCurrentComponentStack.cjs +71 -0
- package/dist/cjs/helpers/getCurrentComponentStack.native.js +93 -0
- package/dist/cjs/helpers/getCurrentComponentStack.native.js.map +1 -0
- package/dist/cjs/helpers/globalValue.cjs +39 -0
- package/dist/cjs/helpers/globalValue.native.js +42 -0
- package/dist/cjs/helpers/globalValue.native.js.map +1 -0
- package/dist/cjs/helpers/mapObject.cjs +36 -0
- package/dist/cjs/helpers/mapObject.native.js +39 -0
- package/dist/cjs/helpers/mapObject.native.js.map +1 -0
- package/dist/cjs/helpers/mutationLifecycle.cjs +251 -0
- package/dist/cjs/helpers/mutationLifecycle.native.js +392 -0
- package/dist/cjs/helpers/mutationLifecycle.native.js.map +1 -0
- package/dist/cjs/helpers/mutationLifecycle.test.cjs +174 -0
- package/dist/cjs/helpers/mutationLifecycle.test.native.js +182 -0
- package/dist/cjs/helpers/mutationLifecycle.test.native.js.map +1 -0
- package/dist/cjs/helpers/mutatorContext.cjs +3 -3
- package/dist/cjs/helpers/mutatorContext.native.js +5 -5
- package/dist/cjs/helpers/mutatorContext.native.js.map +1 -1
- package/dist/cjs/helpers/platform.cjs +31 -0
- package/dist/cjs/helpers/platform.native.js +33 -0
- package/dist/cjs/helpers/platform.native.js.map +1 -0
- package/dist/cjs/helpers/prettyFormatZeroQuery.cjs +2 -2
- package/dist/cjs/helpers/prettyFormatZeroQuery.native.js +7 -7
- package/dist/cjs/helpers/prettyFormatZeroQuery.native.js.map +1 -1
- package/dist/cjs/helpers/queryContext.cjs +2 -2
- package/dist/cjs/helpers/queryContext.native.js +4 -4
- package/dist/cjs/helpers/queryContext.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.cjs +14 -15
- package/dist/cjs/helpers/recoverZeroClient.native.js +26 -23
- package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.test.cjs +10 -8
- package/dist/cjs/helpers/recoverZeroClient.test.native.js +17 -21
- package/dist/cjs/helpers/recoverZeroClient.test.native.js.map +1 -1
- package/dist/cjs/helpers/sleep.cjs +34 -0
- package/dist/cjs/helpers/sleep.native.js +39 -0
- package/dist/cjs/helpers/sleep.native.js.map +1 -0
- package/dist/cjs/helpers/time.cjs +47 -0
- package/dist/cjs/helpers/time.native.js +80 -0
- package/dist/cjs/helpers/time.native.js.map +1 -0
- package/dist/cjs/helpers/tuple.cjs +18 -0
- package/dist/cjs/helpers/tuple.native.js +21 -0
- package/dist/cjs/helpers/tuple.native.js.map +1 -0
- package/dist/cjs/helpers/useMutation.native.js +5 -5
- package/dist/cjs/helpers/useMutation.native.js.map +1 -1
- package/dist/cjs/helpers/useMutation.test.native.js +1 -1
- package/dist/cjs/helpers/useMutation.test.native.js.map +1 -1
- package/dist/cjs/helpers/useZeroDebug.cjs +2 -2
- package/dist/cjs/helpers/useZeroDebug.native.js +7 -8
- package/dist/cjs/helpers/useZeroDebug.native.js.map +1 -1
- package/dist/cjs/index.cjs +9 -1
- package/dist/cjs/index.native.js +8 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/instanceRegistry.cjs +16 -4
- package/dist/cjs/instanceRegistry.native.js +56 -6
- package/dist/cjs/instanceRegistry.native.js.map +1 -1
- package/dist/cjs/multi.cjs +34 -13
- package/dist/cjs/multi.native.js +39 -17
- package/dist/cjs/multi.native.js.map +1 -1
- package/dist/cjs/multiInstance.test.cjs +6 -2
- package/dist/cjs/multiInstance.test.native.js +13 -9
- package/dist/cjs/multiInstance.test.native.js.map +1 -1
- package/dist/cjs/multiInstanceNested.test.native.js +10 -10
- package/dist/cjs/multiInstanceNested.test.native.js.map +1 -1
- package/dist/cjs/multiPartition.test.cjs +85 -36
- package/dist/cjs/multiPartition.test.native.js +102 -39
- package/dist/cjs/multiPartition.test.native.js.map +1 -1
- package/dist/cjs/mutations.cjs +2 -2
- package/dist/cjs/mutations.native.js +4 -4
- package/dist/cjs/mutations.native.js.map +1 -1
- package/dist/cjs/mutations.test.native.js +3 -3
- package/dist/cjs/mutations.test.native.js.map +1 -1
- package/dist/cjs/provideZero.hydration.test.cjs +3 -3
- package/dist/cjs/provideZero.hydration.test.native.js +4 -4
- package/dist/cjs/provideZero.hydration.test.native.js.map +1 -1
- package/dist/cjs/run.cjs +1 -1
- package/dist/cjs/run.native.js +3 -3
- package/dist/cjs/run.native.js.map +1 -1
- package/dist/cjs/server.cjs +20 -16
- package/dist/cjs/server.native.js +50 -57
- package/dist/cjs/server.native.js.map +1 -1
- package/dist/cjs/server.test.cjs +129 -6
- package/dist/cjs/server.test.native.js +141 -10
- package/dist/cjs/server.test.native.js.map +1 -1
- package/dist/cjs/serverWhere.test.native.js +3 -3
- package/dist/cjs/serverWhere.test.native.js.map +1 -1
- package/dist/cjs/state.cjs +2 -2
- package/dist/cjs/state.native.js +10 -10
- package/dist/cjs/state.native.js.map +1 -1
- package/dist/cjs/usePermission.test.native.js +3 -3
- package/dist/cjs/usePermission.test.native.js.map +1 -1
- package/dist/cjs/useQuery.empty.test.cjs +3 -3
- package/dist/cjs/useQuery.empty.test.native.js +6 -6
- package/dist/cjs/useQuery.empty.test.native.js.map +1 -1
- package/dist/cjs/useQuery.ssr.test.native.js +2 -2
- package/dist/cjs/useQuery.ssr.test.native.js.map +1 -1
- package/dist/cjs/vite-plugin.cjs +7 -8
- package/dist/cjs/vite-plugin.native.js +11 -11
- package/dist/cjs/vite-plugin.native.js.map +1 -1
- package/dist/cjs/where.cjs +3 -3
- package/dist/cjs/where.native.js +4 -4
- package/dist/cjs/where.native.js.map +1 -1
- package/dist/esm/cli.mjs +6 -3
- package/dist/esm/cli.mjs.map +1 -1
- package/dist/esm/cli.native.js +6 -3
- package/dist/esm/cli.native.js.map +1 -1
- package/dist/esm/combineZeroClients.mjs +1 -1
- package/dist/esm/combineZeroClients.mjs.map +1 -1
- package/dist/esm/combineZeroClients.native.js +5 -5
- package/dist/esm/combineZeroClients.native.js.map +1 -1
- package/dist/esm/config.mjs +5 -0
- package/dist/esm/config.mjs.map +1 -0
- package/dist/esm/config.native.js +5 -0
- package/dist/esm/config.native.js.map +1 -0
- package/dist/esm/createPermissions.mjs +1 -1
- package/dist/esm/createPermissions.mjs.map +1 -1
- package/dist/esm/createPermissions.native.js +16 -26
- package/dist/esm/createPermissions.native.js.map +1 -1
- package/dist/esm/createUseQuery.mjs +2 -2
- package/dist/esm/createUseQuery.mjs.map +1 -1
- package/dist/esm/createUseQuery.native.js +3 -3
- package/dist/esm/createUseQuery.native.js.map +1 -1
- package/dist/esm/createUseQueryDirect.mjs +2 -1
- package/dist/esm/createUseQueryDirect.mjs.map +1 -1
- package/dist/esm/createUseQueryDirect.native.js +12 -16
- package/dist/esm/createUseQueryDirect.native.js.map +1 -1
- package/dist/esm/createZeroClient.connection.test.mjs +11 -0
- package/dist/esm/createZeroClient.connection.test.mjs.map +1 -1
- package/dist/esm/createZeroClient.connection.test.native.js +14 -7
- package/dist/esm/createZeroClient.connection.test.native.js.map +1 -1
- package/dist/esm/createZeroClient.mjs +25 -5
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +54 -28
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroClient.recovery.test.mjs +90 -3
- package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -1
- package/dist/esm/createZeroClient.recovery.test.native.js +109 -19
- package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -1
- package/dist/esm/generate-helpers.mjs +70 -18
- package/dist/esm/generate-helpers.mjs.map +1 -1
- package/dist/esm/generate-helpers.native.js +110 -24
- package/dist/esm/generate-helpers.native.js.map +1 -1
- package/dist/esm/generate-layout.mjs +560 -0
- package/dist/esm/generate-layout.mjs.map +1 -0
- package/dist/esm/generate-layout.native.js +1246 -0
- package/dist/esm/generate-layout.native.js.map +1 -0
- package/dist/esm/generate-lite.mjs +296 -28
- package/dist/esm/generate-lite.mjs.map +1 -1
- package/dist/esm/generate-lite.native.js +855 -103
- package/dist/esm/generate-lite.native.js.map +1 -1
- package/dist/esm/generate-lite.test.mjs +434 -42
- package/dist/esm/generate-lite.test.mjs.map +1 -1
- package/dist/esm/generate-lite.test.native.js +447 -42
- package/dist/esm/generate-lite.test.native.js.map +1 -1
- package/dist/esm/generate.mjs +172 -96
- package/dist/esm/generate.mjs.map +1 -1
- package/dist/esm/generate.native.js +324 -150
- package/dist/esm/generate.native.js.map +1 -1
- package/dist/esm/generate.test.mjs +366 -49
- package/dist/esm/generate.test.mjs.map +1 -1
- package/dist/esm/generate.test.native.js +378 -49
- package/dist/esm/generate.test.native.js.map +1 -1
- package/dist/esm/helpers/NullToOptional.mjs +2 -0
- package/dist/esm/helpers/NullToOptional.mjs.map +1 -0
- package/dist/esm/helpers/NullToOptional.native.js +2 -0
- package/dist/esm/helpers/NullToOptional.native.js.map +1 -0
- package/dist/esm/helpers/asyncContext.mjs +102 -0
- package/dist/esm/helpers/asyncContext.mjs.map +1 -0
- package/dist/esm/helpers/asyncContext.native.js +58 -0
- package/dist/esm/helpers/asyncContext.native.js.map +1 -0
- package/dist/esm/helpers/batchQuery.mjs +1 -1
- package/dist/esm/helpers/batchQuery.native.js +1 -1
- package/dist/esm/helpers/createMutators.mjs +5 -2
- package/dist/esm/helpers/createMutators.mjs.map +1 -1
- package/dist/esm/helpers/createMutators.native.js +10 -7
- package/dist/esm/helpers/createMutators.native.js.map +1 -1
- package/dist/esm/helpers/createMutators.test.native.js +2 -2
- package/dist/esm/helpers/createMutators.test.native.js.map +1 -1
- package/dist/esm/helpers/ellipsis.mjs +10 -0
- package/dist/esm/helpers/ellipsis.mjs.map +1 -0
- package/dist/esm/helpers/ellipsis.native.js +10 -0
- package/dist/esm/helpers/ellipsis.native.js.map +1 -0
- package/dist/esm/helpers/emitter.mjs +72 -0
- package/dist/esm/helpers/emitter.mjs.map +1 -0
- package/dist/esm/helpers/emitter.native.js +95 -0
- package/dist/esm/helpers/emitter.native.js.map +1 -0
- package/dist/esm/helpers/ensure.mjs +8 -0
- package/dist/esm/helpers/ensure.mjs.map +1 -0
- package/dist/esm/helpers/ensure.native.js +9 -0
- package/dist/esm/helpers/ensure.native.js.map +1 -0
- package/dist/esm/helpers/ensureLoggedIn.mjs +1 -1
- 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/errors.mjs +14 -0
- package/dist/esm/helpers/errors.mjs.map +1 -0
- package/dist/esm/helpers/errors.native.js +123 -0
- package/dist/esm/helpers/errors.native.js.map +1 -0
- package/dist/esm/helpers/getCurrentComponentStack.mjs +35 -0
- package/dist/esm/helpers/getCurrentComponentStack.mjs.map +1 -0
- package/dist/esm/helpers/getCurrentComponentStack.native.js +54 -0
- package/dist/esm/helpers/getCurrentComponentStack.native.js.map +1 -0
- package/dist/esm/helpers/globalValue.mjs +14 -0
- package/dist/esm/helpers/globalValue.mjs.map +1 -0
- package/dist/esm/helpers/globalValue.native.js +14 -0
- package/dist/esm/helpers/globalValue.native.js.map +1 -0
- package/dist/esm/helpers/mapObject.mjs +11 -0
- package/dist/esm/helpers/mapObject.mjs.map +1 -0
- package/dist/esm/helpers/mapObject.native.js +11 -0
- package/dist/esm/helpers/mapObject.native.js.map +1 -0
- package/dist/esm/helpers/mutationLifecycle.mjs +221 -0
- package/dist/esm/helpers/mutationLifecycle.mjs.map +1 -0
- package/dist/esm/helpers/mutationLifecycle.native.js +359 -0
- package/dist/esm/helpers/mutationLifecycle.native.js.map +1 -0
- package/dist/esm/helpers/mutationLifecycle.test.mjs +175 -0
- package/dist/esm/helpers/mutationLifecycle.test.mjs.map +1 -0
- package/dist/esm/helpers/mutationLifecycle.test.native.js +180 -0
- package/dist/esm/helpers/mutationLifecycle.test.native.js.map +1 -0
- package/dist/esm/helpers/mutatorContext.mjs +1 -1
- package/dist/esm/helpers/mutatorContext.native.js +4 -4
- package/dist/esm/helpers/mutatorContext.native.js.map +1 -1
- package/dist/esm/helpers/platform.mjs +5 -0
- package/dist/esm/helpers/platform.mjs.map +1 -0
- package/dist/esm/helpers/platform.native.js +4 -0
- package/dist/esm/helpers/platform.native.js.map +1 -0
- package/dist/esm/helpers/prettyFormatZeroQuery.mjs +1 -1
- package/dist/esm/helpers/prettyFormatZeroQuery.native.js +6 -6
- package/dist/esm/helpers/prettyFormatZeroQuery.native.js.map +1 -1
- package/dist/esm/helpers/queryContext.mjs +1 -1
- package/dist/esm/helpers/queryContext.native.js +3 -3
- package/dist/esm/helpers/queryContext.native.js.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.mjs +14 -15
- package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.native.js +26 -23
- package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.test.mjs +8 -6
- package/dist/esm/helpers/recoverZeroClient.test.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.test.native.js +15 -19
- package/dist/esm/helpers/recoverZeroClient.test.native.js.map +1 -1
- package/dist/esm/helpers/sleep.mjs +9 -0
- package/dist/esm/helpers/sleep.mjs.map +1 -0
- package/dist/esm/helpers/sleep.native.js +11 -0
- package/dist/esm/helpers/sleep.native.js.map +1 -0
- package/dist/esm/helpers/time.mjs +22 -0
- package/dist/esm/helpers/time.mjs.map +1 -0
- package/dist/esm/helpers/time.native.js +52 -0
- package/dist/esm/helpers/time.native.js.map +1 -0
- package/dist/esm/helpers/tuple.mjs +2 -0
- package/dist/esm/helpers/tuple.mjs.map +1 -0
- package/dist/esm/helpers/tuple.native.js +2 -0
- package/dist/esm/helpers/tuple.native.js.map +1 -0
- package/dist/esm/helpers/useMutation.native.js +5 -5
- package/dist/esm/helpers/useMutation.native.js.map +1 -1
- package/dist/esm/helpers/useMutation.test.native.js +1 -1
- package/dist/esm/helpers/useMutation.test.native.js.map +1 -1
- package/dist/esm/helpers/useZeroDebug.mjs +1 -1
- package/dist/esm/helpers/useZeroDebug.mjs.map +1 -1
- package/dist/esm/helpers/useZeroDebug.native.js +6 -7
- package/dist/esm/helpers/useZeroDebug.native.js.map +1 -1
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +3 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +3 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/instanceRegistry.mjs +13 -2
- package/dist/esm/instanceRegistry.mjs.map +1 -1
- package/dist/esm/instanceRegistry.native.js +53 -4
- package/dist/esm/instanceRegistry.native.js.map +1 -1
- package/dist/esm/multi.mjs +33 -12
- package/dist/esm/multi.mjs.map +1 -1
- package/dist/esm/multi.native.js +38 -16
- package/dist/esm/multi.native.js.map +1 -1
- package/dist/esm/multiInstance.test.mjs +5 -1
- package/dist/esm/multiInstance.test.mjs.map +1 -1
- package/dist/esm/multiInstance.test.native.js +12 -8
- package/dist/esm/multiInstance.test.native.js.map +1 -1
- package/dist/esm/multiInstanceNested.test.native.js +10 -10
- package/dist/esm/multiInstanceNested.test.native.js.map +1 -1
- package/dist/esm/multiPartition.test.mjs +86 -37
- package/dist/esm/multiPartition.test.mjs.map +1 -1
- package/dist/esm/multiPartition.test.native.js +103 -40
- package/dist/esm/multiPartition.test.native.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 +3 -3
- package/dist/esm/mutations.native.js.map +1 -1
- package/dist/esm/mutations.test.native.js +3 -3
- package/dist/esm/mutations.test.native.js.map +1 -1
- package/dist/esm/provideZero.hydration.test.mjs +1 -1
- package/dist/esm/provideZero.hydration.test.mjs.map +1 -1
- package/dist/esm/provideZero.hydration.test.native.js +2 -2
- package/dist/esm/provideZero.hydration.test.native.js.map +1 -1
- package/dist/esm/run.mjs +1 -1
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/run.native.js +3 -3
- package/dist/esm/run.native.js.map +1 -1
- package/dist/esm/server.mjs +20 -15
- package/dist/esm/server.mjs.map +1 -1
- package/dist/esm/server.native.js +50 -56
- package/dist/esm/server.native.js.map +1 -1
- package/dist/esm/server.test.mjs +130 -7
- package/dist/esm/server.test.mjs.map +1 -1
- package/dist/esm/server.test.native.js +142 -11
- package/dist/esm/server.test.native.js.map +1 -1
- package/dist/esm/serverWhere.test.mjs.map +1 -1
- package/dist/esm/serverWhere.test.native.js +3 -3
- package/dist/esm/serverWhere.test.native.js.map +1 -1
- package/dist/esm/state.mjs +1 -1
- package/dist/esm/state.mjs.map +1 -1
- package/dist/esm/state.native.js +9 -9
- package/dist/esm/state.native.js.map +1 -1
- package/dist/esm/usePermission.test.native.js +3 -3
- package/dist/esm/usePermission.test.native.js.map +1 -1
- package/dist/esm/useQuery.empty.test.mjs +1 -1
- package/dist/esm/useQuery.empty.test.mjs.map +1 -1
- package/dist/esm/useQuery.empty.test.native.js +4 -4
- package/dist/esm/useQuery.empty.test.native.js.map +1 -1
- package/dist/esm/useQuery.ssr.test.native.js +2 -2
- package/dist/esm/useQuery.ssr.test.native.js.map +1 -1
- package/dist/esm/vite-plugin.mjs +7 -8
- package/dist/esm/vite-plugin.mjs.map +1 -1
- package/dist/esm/vite-plugin.native.js +11 -11
- package/dist/esm/vite-plugin.native.js.map +1 -1
- package/dist/esm/where.mjs +1 -1
- package/dist/esm/where.mjs.map +1 -1
- package/dist/esm/where.native.js +2 -2
- package/dist/esm/where.native.js.map +1 -1
- package/package.json +18 -6
- package/src/cli.ts +11 -3
- package/src/combineZeroClients.tsx +18 -10
- package/src/config.ts +72 -0
- package/src/createPermissions.ts +3 -4
- package/src/createUseQuery.tsx +8 -8
- package/src/createUseQueryDirect.tsx +11 -10
- package/src/createZeroClient.authData.test.tsx +1 -1
- package/src/createZeroClient.connection.test.tsx +13 -2
- package/src/createZeroClient.recovery.test.tsx +100 -4
- package/src/createZeroClient.tsx +87 -30
- package/src/generate-helpers.ts +108 -31
- package/src/generate-layout.ts +841 -0
- package/src/generate-lite.test.ts +421 -42
- package/src/generate-lite.ts +479 -43
- package/src/generate.test.ts +552 -90
- package/src/generate.ts +360 -163
- package/src/helpers/NullToOptional.ts +5 -0
- package/src/helpers/asyncContext.native.ts +90 -0
- package/src/helpers/asyncContext.ts +159 -0
- package/src/helpers/batchQuery.ts +2 -2
- package/src/helpers/createMutators.ts +11 -8
- package/src/helpers/ellipsis.ts +9 -0
- package/src/helpers/emitter.tsx +106 -0
- package/src/helpers/ensure.ts +10 -0
- package/src/helpers/ensureLoggedIn.ts +1 -2
- package/src/helpers/errors.ts +13 -0
- package/src/helpers/getCurrentComponentStack.ts +56 -0
- package/src/helpers/globalValue.ts +40 -0
- package/src/helpers/mapObject.ts +14 -0
- package/src/helpers/mutationLifecycle.test.ts +180 -0
- package/src/helpers/mutationLifecycle.ts +313 -0
- package/src/helpers/mutatorContext.ts +3 -3
- package/src/helpers/platform.native.ts +2 -0
- package/src/helpers/platform.ts +16 -0
- package/src/helpers/prettyFormatZeroQuery.ts +2 -2
- package/src/helpers/queryContext.ts +2 -2
- package/src/helpers/recoverZeroClient.test.ts +23 -21
- package/src/helpers/recoverZeroClient.ts +56 -49
- package/src/helpers/sleep.ts +8 -0
- package/src/helpers/time.ts +51 -0
- package/src/helpers/tuple.ts +1 -0
- package/src/helpers/useMutation.tsx +3 -3
- package/src/helpers/useZeroDebug.ts +3 -3
- package/src/index.ts +13 -1
- package/src/instanceRegistry.ts +19 -6
- package/src/multi.ts +75 -31
- package/src/multiInstance.test.tsx +31 -13
- package/src/multiInstanceNested.test.tsx +2 -2
- package/src/multiPartition.test.ts +62 -27
- package/src/mutations.ts +10 -10
- package/src/provideZero.hydration.test.tsx +1 -1
- package/src/resolveQuery.ts +2 -2
- package/src/run.ts +7 -7
- package/src/server.test.ts +117 -18
- package/src/server.ts +70 -43
- package/src/serverWhere.ts +2 -2
- package/src/state.ts +2 -2
- package/src/types.ts +47 -6
- package/src/useQuery.empty.test.tsx +3 -3
- package/src/useQuery.ssr.test.ts +1 -1
- package/src/vite-plugin.ts +12 -9
- package/src/where.ts +6 -7
- package/src/zeroRunner.ts +2 -2
- package/types/combineZeroClients.d.ts +11 -5
- package/types/combineZeroClients.d.ts.map +1 -1
- package/types/config.d.ts +62 -0
- package/types/config.d.ts.map +1 -0
- package/types/createPermissions.d.ts.map +1 -1
- package/types/createUseQuery.d.ts.map +1 -1
- package/types/createUseQueryDirect.d.ts +1 -1
- package/types/createUseQueryDirect.d.ts.map +1 -1
- package/types/createZeroClient.d.ts +22 -12
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/createZeroClient.recovery.test.d.ts.map +1 -1
- package/types/generate-helpers.d.ts +17 -2
- package/types/generate-helpers.d.ts.map +1 -1
- package/types/generate-layout.d.ts +26 -0
- package/types/generate-layout.d.ts.map +1 -0
- package/types/generate-lite.d.ts +29 -1
- package/types/generate-lite.d.ts.map +1 -1
- package/types/generate.d.ts +20 -0
- package/types/generate.d.ts.map +1 -1
- package/types/helpers/NullToOptional.d.ts +6 -0
- package/types/helpers/NullToOptional.d.ts.map +1 -0
- package/types/helpers/asyncContext.d.ts +15 -0
- package/types/helpers/asyncContext.d.ts.map +1 -0
- package/types/helpers/asyncContext.native.d.ts +8 -0
- package/types/helpers/asyncContext.native.d.ts.map +1 -0
- package/types/helpers/createMutators.d.ts +2 -1
- package/types/helpers/createMutators.d.ts.map +1 -1
- package/types/helpers/ellipsis.d.ts +2 -0
- package/types/helpers/ellipsis.d.ts.map +1 -0
- package/types/helpers/emitter.d.ts +21 -0
- package/types/helpers/emitter.d.ts.map +1 -0
- package/types/helpers/ensure.d.ts +2 -0
- package/types/helpers/ensure.d.ts.map +1 -0
- package/types/helpers/ensureLoggedIn.d.ts.map +1 -1
- package/types/helpers/errors.d.ts +7 -0
- package/types/helpers/errors.d.ts.map +1 -0
- package/types/helpers/getCurrentComponentStack.d.ts +2 -0
- package/types/helpers/getCurrentComponentStack.d.ts.map +1 -0
- package/types/helpers/globalValue.d.ts +23 -0
- package/types/helpers/globalValue.d.ts.map +1 -0
- package/types/helpers/mapObject.d.ts +4 -0
- package/types/helpers/mapObject.d.ts.map +1 -0
- package/types/helpers/mutationLifecycle.d.ts +44 -0
- package/types/helpers/mutationLifecycle.d.ts.map +1 -0
- package/types/helpers/mutationLifecycle.test.d.ts +2 -0
- package/types/helpers/mutationLifecycle.test.d.ts.map +1 -0
- package/types/helpers/platform.d.ts +3 -0
- package/types/helpers/platform.d.ts.map +1 -0
- package/types/helpers/platform.native.d.ts +3 -0
- package/types/helpers/platform.native.d.ts.map +1 -0
- package/types/helpers/recoverZeroClient.d.ts +13 -9
- package/types/helpers/recoverZeroClient.d.ts.map +1 -1
- package/types/helpers/sleep.d.ts +2 -0
- package/types/helpers/sleep.d.ts.map +1 -0
- package/types/helpers/time.d.ts +28 -0
- package/types/helpers/time.d.ts.map +1 -0
- package/types/helpers/tuple.d.ts +2 -0
- package/types/helpers/tuple.d.ts.map +1 -0
- package/types/index.d.ts +3 -1
- package/types/index.d.ts.map +1 -1
- package/types/instanceRegistry.d.ts +1 -0
- package/types/instanceRegistry.d.ts.map +1 -1
- package/types/multi.d.ts +23 -1
- package/types/multi.d.ts.map +1 -1
- package/types/mutations.d.ts +1 -1
- package/types/mutations.d.ts.map +1 -1
- package/types/run.d.ts.map +1 -1
- package/types/server.d.ts +12 -8
- package/types/server.d.ts.map +1 -1
- package/types/state.d.ts +1 -1
- package/types/state.d.ts.map +1 -1
- package/types/types.d.ts +23 -1
- package/types/types.d.ts.map +1 -1
- package/types/vite-plugin.d.ts.map +1 -1
- package/types/where.d.ts.map +1 -1
- package/lint/ssr-guards.js +0 -165
- package/test-fixtures/server-return-types.ts +0 -58
- package/test-fixtures/tsconfig.json +0 -13
- package/tsconfig.json +0 -26
- package/vitest.config.ts +0 -8
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { createSchema, string, table } from '@rocicorp/zero'
|
|
2
|
-
import { createEmitter } from '@take-out/helpers'
|
|
3
2
|
import { describe, expect, test, vi } from 'vitest'
|
|
3
|
+
|
|
4
4
|
import { combineZeroClients } from './combineZeroClients'
|
|
5
5
|
import { createZeroClient } from './createZeroClient'
|
|
6
|
+
import { createEmitter } from './helpers/emitter'
|
|
6
7
|
import { runWithContext } from './helpers/mutatorContext'
|
|
7
8
|
import {
|
|
8
9
|
getInstanceForNamespace,
|
|
@@ -13,6 +14,7 @@ import { registerQuery } from './queryRegistry'
|
|
|
13
14
|
import { run } from './run'
|
|
14
15
|
import { setRunner, type ZeroRunner } from './zeroRunner'
|
|
15
16
|
import { zql } from './zql'
|
|
17
|
+
|
|
16
18
|
import type { ZeroEvent } from './types'
|
|
17
19
|
import type { AnyQueryRegistry, Query } from '@rocicorp/zero'
|
|
18
20
|
import type { ReactNode } from 'react'
|
|
@@ -107,8 +109,8 @@ describe('multi-instance namespace dispatch', () => {
|
|
|
107
109
|
can: async () => {},
|
|
108
110
|
tx: { run: txRun },
|
|
109
111
|
} as any,
|
|
110
|
-
() => run(byId, { id: '1' })
|
|
111
|
-
)
|
|
112
|
+
() => run(byId, { id: '1' })
|
|
113
|
+
)
|
|
112
114
|
).rejects.toThrow(/run\(namedQuery\) cannot be used inside a Zero mutation/)
|
|
113
115
|
|
|
114
116
|
expect(ownerRunner).not.toHaveBeenCalled()
|
|
@@ -129,8 +131,8 @@ describe('multi-instance namespace dispatch', () => {
|
|
|
129
131
|
can: async () => {},
|
|
130
132
|
tx: { run: txRun },
|
|
131
133
|
} as any,
|
|
132
|
-
() => run(byId, { id: '1' })
|
|
133
|
-
)
|
|
134
|
+
() => run(byId, { id: '1' })
|
|
135
|
+
)
|
|
134
136
|
).resolves.toEqual({ from: 'owner' })
|
|
135
137
|
|
|
136
138
|
expect(ownerRunner).toHaveBeenCalledTimes(1)
|
|
@@ -152,8 +154,8 @@ describe('multi-instance namespace dispatch', () => {
|
|
|
152
154
|
can: async () => {},
|
|
153
155
|
tx: { run: txRun },
|
|
154
156
|
} as any,
|
|
155
|
-
() => run(query)
|
|
156
|
-
)
|
|
157
|
+
() => run(query)
|
|
158
|
+
)
|
|
157
159
|
).resolves.toEqual({ from: 'tx' })
|
|
158
160
|
|
|
159
161
|
expect(txRun).toHaveBeenCalledWith(query, undefined)
|
|
@@ -195,7 +197,7 @@ describe('multi-instance namespace dispatch', () => {
|
|
|
195
197
|
models,
|
|
196
198
|
groupedQueries: {},
|
|
197
199
|
instanceName: 'mdl-b',
|
|
198
|
-
})
|
|
200
|
+
})
|
|
199
201
|
).toThrow(/already claimed/)
|
|
200
202
|
})
|
|
201
203
|
})
|
|
@@ -211,10 +213,18 @@ describe('multi-instance isolation', () => {
|
|
|
211
213
|
|
|
212
214
|
const seenByB: Array<ZeroEvent | null> = []
|
|
213
215
|
b.zeroEvents.listen((event) => seenByB.push(event))
|
|
214
|
-
a.zeroEvents.emit({
|
|
216
|
+
a.zeroEvents.emit({
|
|
217
|
+
type: 'error',
|
|
218
|
+
reasonKey: 'connection-error',
|
|
219
|
+
message: 'a-only',
|
|
220
|
+
})
|
|
215
221
|
|
|
216
222
|
expect(seenByB).toEqual([])
|
|
217
|
-
expect(a.zeroEvents.value).toEqual({
|
|
223
|
+
expect(a.zeroEvents.value).toEqual({
|
|
224
|
+
type: 'error',
|
|
225
|
+
reasonKey: 'connection-error',
|
|
226
|
+
message: 'a-only',
|
|
227
|
+
})
|
|
218
228
|
expect(b.zeroEvents.value).toBe(null)
|
|
219
229
|
})
|
|
220
230
|
|
|
@@ -345,7 +355,7 @@ describe('combineZeroClients facade', () => {
|
|
|
345
355
|
expect(b.useQuery).not.toHaveBeenCalled()
|
|
346
356
|
|
|
347
357
|
expect(() => combineZeroClients(a, b, { inner: 'nope' })).toThrow(
|
|
348
|
-
/not one of the passed clients
|
|
358
|
+
/not one of the passed clients/
|
|
349
359
|
)
|
|
350
360
|
})
|
|
351
361
|
|
|
@@ -357,8 +367,16 @@ describe('combineZeroClients facade', () => {
|
|
|
357
367
|
const seen: Array<ZeroEvent | null> = []
|
|
358
368
|
combined.zeroEvents.listen((event) => seen.push(event))
|
|
359
369
|
|
|
360
|
-
a.zeroEvents.emit({
|
|
361
|
-
|
|
370
|
+
a.zeroEvents.emit({
|
|
371
|
+
type: 'error',
|
|
372
|
+
reasonKey: 'connection-error',
|
|
373
|
+
message: 'from-a',
|
|
374
|
+
})
|
|
375
|
+
b.zeroEvents.emit({
|
|
376
|
+
type: 'error',
|
|
377
|
+
reasonKey: 'connection-error',
|
|
378
|
+
message: 'from-b',
|
|
379
|
+
})
|
|
362
380
|
|
|
363
381
|
const messageOf = (event: ZeroEvent | null) =>
|
|
364
382
|
event?.type === 'error' ? event.message : undefined
|
|
@@ -185,7 +185,7 @@ test('outer-instance query reads the OUTER store under nested providers', async
|
|
|
185
185
|
<project.ProvideZero server={null} userID="t1-prj">
|
|
186
186
|
<ControlUserProbe id="u1" />
|
|
187
187
|
</project.ProvideZero>
|
|
188
|
-
</control.ProvideZero
|
|
188
|
+
</control.ProvideZero>
|
|
189
189
|
)
|
|
190
190
|
await waitFor(() => probe.renders > 0, 'probe mount')
|
|
191
191
|
|
|
@@ -241,7 +241,7 @@ test('StrictMode: direct views survive the effect double-invoke', async () => {
|
|
|
241
241
|
<ControlUserProbe id="u4" />
|
|
242
242
|
</project.ProvideZero>
|
|
243
243
|
</control.ProvideZero>
|
|
244
|
-
</StrictMode
|
|
244
|
+
</StrictMode>
|
|
245
245
|
)
|
|
246
246
|
await waitFor(() => probe.renders > 0, 'probe mount')
|
|
247
247
|
|
|
@@ -1,38 +1,73 @@
|
|
|
1
|
+
import { createSchema, string, table } from '@rocicorp/zero'
|
|
1
2
|
import { describe, expect, test } from 'vitest'
|
|
2
3
|
|
|
3
|
-
import {
|
|
4
|
+
import { createZeroClients } from './multi'
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
const schema = createSchema({
|
|
7
|
+
tables: [table('message').columns({ id: string() }).primaryKey('id')],
|
|
8
|
+
})
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
{
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
describe('createZeroClients', () => {
|
|
11
|
+
test('builds generated partitions with default as the primary client', () => {
|
|
12
|
+
const instances = {
|
|
13
|
+
default: {
|
|
14
|
+
schema,
|
|
15
|
+
queries: { account: { current: () => ({}) as never } },
|
|
16
|
+
models: {},
|
|
17
|
+
tables: ['account'],
|
|
18
|
+
syncTables: ['account'],
|
|
19
|
+
supportTables: [],
|
|
20
|
+
scope: null,
|
|
21
|
+
defaultVisibility: null,
|
|
22
|
+
},
|
|
23
|
+
project: {
|
|
24
|
+
schema,
|
|
25
|
+
queries: { message: { all: () => ({}) as never } },
|
|
26
|
+
models: {},
|
|
27
|
+
tables: ['message'],
|
|
28
|
+
syncTables: ['message'],
|
|
29
|
+
supportTables: [],
|
|
30
|
+
scope: 'projectId',
|
|
31
|
+
defaultVisibility: (value: string) => ({ column: 'projectId', value }),
|
|
32
|
+
},
|
|
33
|
+
} as const
|
|
34
|
+
|
|
35
|
+
const result = createZeroClients(instances)
|
|
36
|
+
|
|
37
|
+
expect(Object.keys(result.clients)).toEqual(['project', 'default'])
|
|
38
|
+
expect(result.clients.default.instanceName).toBe('default')
|
|
39
|
+
expect(result.clients.project.instanceName).toBe('project')
|
|
40
|
+
expect(result.providers.default).toBe(result.clients.default.ProvideZero)
|
|
41
|
+
expect(result.providers.project).toBe(result.clients.project.ProvideZero)
|
|
42
|
+
expect(result.combined.run).toBeTypeOf('function')
|
|
17
43
|
})
|
|
18
44
|
|
|
19
|
-
test('
|
|
20
|
-
expect(() =>
|
|
21
|
-
assertZeroInstancePartition(
|
|
22
|
-
'query namespace',
|
|
23
|
-
{ user: {}, planGrant: {} },
|
|
24
|
-
{ control, project },
|
|
25
|
-
),
|
|
26
|
-
).toThrow(/planGrant.*missing from the instance partition/)
|
|
45
|
+
test('requires at least one generated instance', () => {
|
|
46
|
+
expect(() => createZeroClients({})).toThrow(/at least one instance/)
|
|
27
47
|
})
|
|
28
48
|
|
|
29
|
-
test('
|
|
49
|
+
test('replaces an existing partition atomically when a namespace moves', () => {
|
|
50
|
+
const entry = (queries: Record<string, Record<string, () => never>>) => ({
|
|
51
|
+
schema,
|
|
52
|
+
queries,
|
|
53
|
+
models: {},
|
|
54
|
+
tables: Object.keys(queries),
|
|
55
|
+
syncTables: Object.keys(queries),
|
|
56
|
+
supportTables: [],
|
|
57
|
+
scope: null,
|
|
58
|
+
defaultVisibility: null,
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
createZeroClients({
|
|
62
|
+
default: entry({ movedNamespace: { before: () => ({}) as never } }),
|
|
63
|
+
project: entry({ stableProject: { before: () => ({}) as never } }),
|
|
64
|
+
})
|
|
65
|
+
|
|
30
66
|
expect(() =>
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
{
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
).toThrow(/user.*more than one instance partition/)
|
|
67
|
+
createZeroClients({
|
|
68
|
+
default: entry({ stableDefault: { after: () => ({}) as never } }),
|
|
69
|
+
project: entry({ movedNamespace: { after: () => ({}) as never } }),
|
|
70
|
+
})
|
|
71
|
+
).not.toThrow()
|
|
37
72
|
})
|
|
38
73
|
})
|
package/src/mutations.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { IS_SERVER_RUNTIME } from '
|
|
1
|
+
import { IS_SERVER_RUNTIME } from './helpers/platform'
|
|
2
2
|
import { setMutationsPermissions } from './modelRegistry'
|
|
3
3
|
|
|
4
|
-
import type { TableBuilderWithColumns } from '@rocicorp/zero'
|
|
5
4
|
import type {
|
|
6
5
|
MutatorContext,
|
|
7
6
|
Schema,
|
|
@@ -10,6 +9,7 @@ import type {
|
|
|
10
9
|
TableUpdateRow,
|
|
11
10
|
Where,
|
|
12
11
|
} from './types'
|
|
12
|
+
import type { TableBuilderWithColumns } from '@rocicorp/zero'
|
|
13
13
|
|
|
14
14
|
// derive a TableBuilderWithColumns from the global schema by table name
|
|
15
15
|
type SchemaTableBuilder<TName extends TableName> = TableBuilderWithColumns<
|
|
@@ -37,7 +37,7 @@ function proxyRegistry(): Map<string, any> {
|
|
|
37
37
|
// returns the SAME proxy object on subsequent calls so HMR works
|
|
38
38
|
function getOrCreateMutationProxy<T extends Record<string, Function>>(
|
|
39
39
|
tableName: string,
|
|
40
|
-
implementations: T
|
|
40
|
+
implementations: T
|
|
41
41
|
): T {
|
|
42
42
|
// merge with any prior registration for this table: multiple modules may
|
|
43
43
|
// register mutators on the same table (a seed.ts alongside the table's own
|
|
@@ -47,7 +47,7 @@ function getOrCreateMutationProxy<T extends Record<string, Function>>(
|
|
|
47
47
|
const prior = mutationRegistry().get(tableName)
|
|
48
48
|
mutationRegistry().set(
|
|
49
49
|
tableName,
|
|
50
|
-
prior ? { ...prior, ...implementations } : implementations
|
|
50
|
+
prior ? { ...prior, ...implementations } : implementations
|
|
51
51
|
)
|
|
52
52
|
|
|
53
53
|
// return existing proxy if we have one (HMR case)
|
|
@@ -117,11 +117,11 @@ type MutationsWithCRUD<Table extends GenericTable, Mutations extends MutationBui
|
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
export function mutations<Mutations extends MutationBuilders>(
|
|
120
|
-
mutations: Mutations
|
|
120
|
+
mutations: Mutations
|
|
121
121
|
): Mutations
|
|
122
122
|
export function mutations<Table extends GenericTable, Permissions extends Where>(
|
|
123
123
|
table: Table,
|
|
124
|
-
permissions: Permissions
|
|
124
|
+
permissions: Permissions
|
|
125
125
|
): MutationsWithCRUD<Table, {}>
|
|
126
126
|
export function mutations<
|
|
127
127
|
Table extends GenericTable,
|
|
@@ -130,12 +130,12 @@ export function mutations<
|
|
|
130
130
|
>(
|
|
131
131
|
table: Table,
|
|
132
132
|
permissions: Permissions,
|
|
133
|
-
mutations: Mutations
|
|
133
|
+
mutations: Mutations
|
|
134
134
|
): MutationsWithCRUD<Table, Mutations>
|
|
135
135
|
// string-based overloads (for drizzle-zero derived schemas where table builders aren't available)
|
|
136
136
|
export function mutations<TName extends TableName, Permissions extends Where>(
|
|
137
137
|
tableName: TName,
|
|
138
|
-
permissions: Permissions
|
|
138
|
+
permissions: Permissions
|
|
139
139
|
): MutationsWithCRUD<SchemaTableBuilder<TName>, {}>
|
|
140
140
|
export function mutations<
|
|
141
141
|
TName extends TableName,
|
|
@@ -144,7 +144,7 @@ export function mutations<
|
|
|
144
144
|
>(
|
|
145
145
|
tableName: TName,
|
|
146
146
|
permissions: Permissions,
|
|
147
|
-
mutations: Mutations
|
|
147
|
+
mutations: Mutations
|
|
148
148
|
): MutationsWithCRUD<SchemaTableBuilder<TName>, Mutations>
|
|
149
149
|
export function mutations<
|
|
150
150
|
Table extends GenericTable,
|
|
@@ -152,7 +152,7 @@ export function mutations<
|
|
|
152
152
|
>(
|
|
153
153
|
table: Table | string | Mutations,
|
|
154
154
|
permissions?: Where,
|
|
155
|
-
mutations?: Mutations
|
|
155
|
+
mutations?: Mutations
|
|
156
156
|
): Mutations {
|
|
157
157
|
if (permissions) {
|
|
158
158
|
const tableName =
|
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
// stability is what keeps useId stable.
|
|
18
18
|
|
|
19
19
|
import { createSchema, string, table } from '@rocicorp/zero'
|
|
20
|
-
import { IS_SERVER, IS_SERVER_RUNTIME } from '@take-out/helpers'
|
|
21
20
|
import { useId, type ReactNode } from 'react'
|
|
22
21
|
import { renderToString } from 'react-dom/server'
|
|
23
22
|
import { expect, test } from 'vitest'
|
|
24
23
|
|
|
25
24
|
import { createZeroClient } from './createZeroClient'
|
|
25
|
+
import { IS_SERVER, IS_SERVER_RUNTIME } from './helpers/platform'
|
|
26
26
|
|
|
27
27
|
const todoTable = table('todo')
|
|
28
28
|
.columns({ id: string(), title: string() })
|
package/src/resolveQuery.ts
CHANGED
|
@@ -31,7 +31,7 @@ export function resolveQuery<Schema extends ZeroSchema>({
|
|
|
31
31
|
})
|
|
32
32
|
throw new Error(
|
|
33
33
|
`Query function '${fnName}' not registered. ` +
|
|
34
|
-
`Ensure it is exported from a queries file and passed to createZeroClient via groupedQueries
|
|
34
|
+
`Ensure it is exported from a queries file and passed to createZeroClient via groupedQueries.`
|
|
35
35
|
)
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -43,7 +43,7 @@ export function resolveQuery<Schema extends ZeroSchema>({
|
|
|
43
43
|
if (!customQuery) {
|
|
44
44
|
throw new Error(
|
|
45
45
|
`CustomQuery '${queryName}' not found. ` +
|
|
46
|
-
`Check that the query is exported and the namespace/name matches
|
|
46
|
+
`Check that the query is exported and the namespace/name matches.`
|
|
47
47
|
)
|
|
48
48
|
}
|
|
49
49
|
|
package/src/run.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { isInZeroMutation, mutatorContext } from './helpers/mutatorContext'
|
|
1
2
|
import { getInstanceForQueryFn } from './instanceRegistry'
|
|
2
3
|
import { resolveQuery, type PlainQueryFn } from './resolveQuery'
|
|
3
|
-
import { isInZeroMutation, mutatorContext } from './helpers/mutatorContext'
|
|
4
4
|
import { getAmbientRunner, getRunner } from './zeroRunner'
|
|
5
5
|
|
|
6
6
|
import type {
|
|
@@ -19,7 +19,7 @@ export function setCustomQueries(queries: AnyQueryRegistry) {
|
|
|
19
19
|
function getCustomQueries(): AnyQueryRegistry {
|
|
20
20
|
if (!customQueriesRef) {
|
|
21
21
|
throw new Error(
|
|
22
|
-
'Custom queries not initialized. Ensure client or server bindings have been created.'
|
|
22
|
+
'Custom queries not initialized. Ensure client or server bindings have been created.'
|
|
23
23
|
)
|
|
24
24
|
}
|
|
25
25
|
return customQueriesRef
|
|
@@ -33,7 +33,7 @@ export function run<
|
|
|
33
33
|
TReturn,
|
|
34
34
|
>(
|
|
35
35
|
query: Query<TTable, Schema, TReturn>,
|
|
36
|
-
mode?: 'complete'
|
|
36
|
+
mode?: 'complete'
|
|
37
37
|
): Promise<HumanReadable<TReturn>>
|
|
38
38
|
|
|
39
39
|
export function run<
|
|
@@ -44,7 +44,7 @@ export function run<
|
|
|
44
44
|
>(
|
|
45
45
|
fn: PlainQueryFn<TArg, Query<TTable, Schema, TReturn>>,
|
|
46
46
|
params: TArg,
|
|
47
|
-
mode?: 'complete'
|
|
47
|
+
mode?: 'complete'
|
|
48
48
|
): Promise<HumanReadable<TReturn>>
|
|
49
49
|
|
|
50
50
|
export function run<
|
|
@@ -53,13 +53,13 @@ export function run<
|
|
|
53
53
|
TReturn,
|
|
54
54
|
>(
|
|
55
55
|
fn: PlainQueryFn<void, Query<TTable, Schema, TReturn>>,
|
|
56
|
-
mode?: 'complete'
|
|
56
|
+
mode?: 'complete'
|
|
57
57
|
): Promise<HumanReadable<TReturn>>
|
|
58
58
|
|
|
59
59
|
export function run(
|
|
60
60
|
queryOrFn: any,
|
|
61
61
|
paramsOrMode?: any,
|
|
62
|
-
modeArg?: 'complete'
|
|
62
|
+
modeArg?: 'complete'
|
|
63
63
|
): Promise<any> {
|
|
64
64
|
const hasParams = modeArg !== undefined || (paramsOrMode && paramsOrMode !== 'complete')
|
|
65
65
|
const params = hasParams ? paramsOrMode : undefined
|
|
@@ -79,7 +79,7 @@ export function run(
|
|
|
79
79
|
const inMutation = isInZeroMutation()
|
|
80
80
|
if (inMutation && mutatorContext().environment === 'server') {
|
|
81
81
|
throw new Error(
|
|
82
|
-
'run(namedQuery) cannot be used inside a Zero mutation. Use tx.run(zql...) for transactional mutation reads.'
|
|
82
|
+
'run(namedQuery) cannot be used inside a Zero mutation. Use tx.run(zql...) for transactional mutation reads.'
|
|
83
83
|
)
|
|
84
84
|
}
|
|
85
85
|
|
package/src/server.test.ts
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { createSchema, defineQueries, defineQuery, string, table } from '@rocicorp/zero'
|
|
2
2
|
import * as v from 'valibot'
|
|
3
|
-
import { describe, expect, test } from 'vitest'
|
|
3
|
+
import { describe, expect, test, vi } from 'vitest'
|
|
4
4
|
|
|
5
|
+
import { getScopedAuthData } from './helpers/mutatorContext'
|
|
5
6
|
import {
|
|
6
|
-
authDataToClaims,
|
|
7
7
|
createZeroServerBindings,
|
|
8
8
|
type ZeroServerExecutor,
|
|
9
9
|
type ZeroServerMutatorRegistry,
|
|
10
10
|
type ZeroServerTransaction,
|
|
11
11
|
} from './server'
|
|
12
|
-
import { getScopedAuthData } from './helpers/mutatorContext'
|
|
13
12
|
import { zql } from './zql'
|
|
14
13
|
|
|
15
14
|
import type { AuthData, MutatorContext } from './types'
|
|
@@ -31,7 +30,7 @@ const schema = createSchema({
|
|
|
31
30
|
const queries = defineQueries({
|
|
32
31
|
project: {
|
|
33
32
|
byOwner: defineQuery(v.object({ ownerId: v.string() }), ({ args }) =>
|
|
34
|
-
zql.project.where('ownerId', args.ownerId)
|
|
33
|
+
zql.project.where('ownerId', args.ownerId)
|
|
35
34
|
),
|
|
36
35
|
},
|
|
37
36
|
})
|
|
@@ -40,9 +39,10 @@ type ProjectRow = { id: string; ownerId: string; name: string }
|
|
|
40
39
|
|
|
41
40
|
function createTestExecutor(
|
|
42
41
|
mutators: ZeroServerMutatorRegistry<typeof schema>,
|
|
43
|
-
rows: ProjectRow[]
|
|
42
|
+
rows: ProjectRow[]
|
|
44
43
|
) {
|
|
45
44
|
const scheduledBackground: Promise<void>[] = []
|
|
45
|
+
const queryClaims: unknown[] = []
|
|
46
46
|
const tx = {
|
|
47
47
|
mutate: {
|
|
48
48
|
project: {
|
|
@@ -78,12 +78,13 @@ function createTestExecutor(
|
|
|
78
78
|
async transaction(_claims, work) {
|
|
79
79
|
return work(tx)
|
|
80
80
|
},
|
|
81
|
-
async query(
|
|
81
|
+
async query(claims, work) {
|
|
82
|
+
queryClaims.push(claims)
|
|
82
83
|
return work(tx)
|
|
83
84
|
},
|
|
84
85
|
}
|
|
85
86
|
|
|
86
|
-
return { executor, scheduledBackground }
|
|
87
|
+
return { executor, queryClaims, scheduledBackground }
|
|
87
88
|
}
|
|
88
89
|
|
|
89
90
|
describe('createZeroServerBindings', () => {
|
|
@@ -114,7 +115,7 @@ describe('createZeroServerBindings', () => {
|
|
|
114
115
|
id: 'project-1',
|
|
115
116
|
ownerId: 'anon',
|
|
116
117
|
name: 'sneaky',
|
|
117
|
-
})
|
|
118
|
+
})
|
|
118
119
|
).rejects.toThrow('not authenticated')
|
|
119
120
|
expect(seenAuthData).toBe(null)
|
|
120
121
|
expect(rows).toEqual([])
|
|
@@ -136,7 +137,7 @@ describe('createZeroServerBindings', () => {
|
|
|
136
137
|
mutate: {
|
|
137
138
|
create: async (
|
|
138
139
|
{ authData, server, tx }: MutatorContext,
|
|
139
|
-
value: ProjectRow
|
|
140
|
+
value: ProjectRow
|
|
140
141
|
) => {
|
|
141
142
|
mutationRuns++
|
|
142
143
|
expect(authData?.id).toBe('user-1')
|
|
@@ -145,7 +146,7 @@ describe('createZeroServerBindings', () => {
|
|
|
145
146
|
async () => {
|
|
146
147
|
barrierRuns++
|
|
147
148
|
},
|
|
148
|
-
{ barrier: true }
|
|
149
|
+
{ barrier: true }
|
|
149
150
|
)
|
|
150
151
|
server?.enqueueTask(async () => {
|
|
151
152
|
backgroundRuns++
|
|
@@ -166,11 +167,14 @@ describe('createZeroServerBindings', () => {
|
|
|
166
167
|
})
|
|
167
168
|
|
|
168
169
|
expect(Object.keys(bindings.mutators)).toEqual(['project|create'])
|
|
169
|
-
const { executor, scheduledBackground } = createTestExecutor(
|
|
170
|
+
const { executor, queryClaims, scheduledBackground } = createTestExecutor(
|
|
171
|
+
bindings.mutators,
|
|
172
|
+
rows
|
|
173
|
+
)
|
|
170
174
|
const server = bindings.server(executor)
|
|
171
175
|
await server.mutate.project.create(
|
|
172
176
|
{ id: 'project-1', ownerId: 'user-1', name: 'first' },
|
|
173
|
-
{ authData: { id: 'user-1' } }
|
|
177
|
+
{ authData: { id: 'user-1' } }
|
|
174
178
|
)
|
|
175
179
|
|
|
176
180
|
expect(rows).toEqual([{ id: 'project-1', ownerId: 'user-1', name: 'first' }])
|
|
@@ -181,14 +185,109 @@ describe('createZeroServerBindings', () => {
|
|
|
181
185
|
expect(backgroundRuns).toBe(1)
|
|
182
186
|
expect(backgroundAuth).toBe('user-1')
|
|
183
187
|
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
[{ ownerId: 'user-1' }],
|
|
188
|
-
claims,
|
|
189
|
-
)
|
|
188
|
+
const ast = await bindings.resolveQuery('project|byOwner', [{ ownerId: 'user-1' }], {
|
|
189
|
+
id: 'user-1',
|
|
190
|
+
})
|
|
190
191
|
expect(JSON.stringify(ast)).toContain('ownerId')
|
|
191
192
|
expect(JSON.stringify(ast)).toContain('user-1')
|
|
192
193
|
expect(validatedQueryAuth).toBe('user-1')
|
|
194
|
+
|
|
195
|
+
await server.query({ id: 'user-1' }, () => zql.project)
|
|
196
|
+
expect(queryClaims).toEqual([{ userID: 'user-1', authData: { id: 'user-1' } }])
|
|
197
|
+
})
|
|
198
|
+
|
|
199
|
+
test('enqueues typed actions through the configured local executor', async () => {
|
|
200
|
+
type Action =
|
|
201
|
+
| { type: 'project.provisionNamespace'; projectId: string }
|
|
202
|
+
| { type: 'project.invalidateAccess'; projectId: string }
|
|
203
|
+
|
|
204
|
+
const executed: Action[] = []
|
|
205
|
+
let releaseBackground: () => void = () => {}
|
|
206
|
+
const backgroundGate = new Promise<void>((resolve) => {
|
|
207
|
+
releaseBackground = resolve
|
|
208
|
+
})
|
|
209
|
+
const bindings = createZeroServerBindings({
|
|
210
|
+
schema,
|
|
211
|
+
models: {
|
|
212
|
+
project: {
|
|
213
|
+
mutate: {
|
|
214
|
+
create: async ({ server }: MutatorContext, value: ProjectRow) => {
|
|
215
|
+
const enqueueAction = server?.enqueueAction as (
|
|
216
|
+
action: Action,
|
|
217
|
+
options?: { barrier?: boolean }
|
|
218
|
+
) => void
|
|
219
|
+
enqueueAction(
|
|
220
|
+
{ type: 'project.provisionNamespace', projectId: value.id },
|
|
221
|
+
{ barrier: true }
|
|
222
|
+
)
|
|
223
|
+
enqueueAction({ type: 'project.invalidateAccess', projectId: value.id })
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
createServerActions: () => ({}),
|
|
229
|
+
actions: {
|
|
230
|
+
async execute(action: Action) {
|
|
231
|
+
if (action.type === 'project.invalidateAccess') await backgroundGate
|
|
232
|
+
executed.push(action)
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
})
|
|
236
|
+
const { executor, scheduledBackground } = createTestExecutor(bindings.mutators, [])
|
|
237
|
+
|
|
238
|
+
await executor.execute(
|
|
239
|
+
'project|create',
|
|
240
|
+
{ id: 'project-1', ownerId: 'user-1', name: 'first' },
|
|
241
|
+
{ userID: 'user-1', authData: { id: 'user-1' } }
|
|
242
|
+
)
|
|
243
|
+
expect(executed).toEqual([
|
|
244
|
+
{ type: 'project.provisionNamespace', projectId: 'project-1' },
|
|
245
|
+
])
|
|
246
|
+
releaseBackground()
|
|
247
|
+
await Promise.all(scheduledBackground)
|
|
248
|
+
expect(executed).toEqual([
|
|
249
|
+
{ type: 'project.provisionNamespace', projectId: 'project-1' },
|
|
250
|
+
{ type: 'project.invalidateAccess', projectId: 'project-1' },
|
|
251
|
+
])
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
test('selects remote dispatch once and never falls back to local execution', async () => {
|
|
255
|
+
type Action = { type: 'durable.run'; operationId: string }
|
|
256
|
+
const execute = vi.fn(async (_action: Action) => {})
|
|
257
|
+
const dispatchRemote = vi.fn(async (_action: Action) => {
|
|
258
|
+
throw new Error('remote unavailable')
|
|
259
|
+
})
|
|
260
|
+
const bindings = createZeroServerBindings({
|
|
261
|
+
schema,
|
|
262
|
+
models: {
|
|
263
|
+
project: {
|
|
264
|
+
mutate: {
|
|
265
|
+
create: async ({ server }: MutatorContext) => {
|
|
266
|
+
const enqueueAction = server?.enqueueAction as (
|
|
267
|
+
action: Action,
|
|
268
|
+
options?: { barrier?: boolean }
|
|
269
|
+
) => void
|
|
270
|
+
enqueueAction(
|
|
271
|
+
{ type: 'durable.run', operationId: 'operation-1' },
|
|
272
|
+
{ barrier: true }
|
|
273
|
+
)
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
createServerActions: () => ({}),
|
|
279
|
+
actions: { execute, dispatchRemote },
|
|
280
|
+
})
|
|
281
|
+
const { executor } = createTestExecutor(bindings.mutators, [])
|
|
282
|
+
|
|
283
|
+
await expect(
|
|
284
|
+
executor.execute(
|
|
285
|
+
'project|create',
|
|
286
|
+
{ id: 'project-1', ownerId: 'user-1', name: 'first' },
|
|
287
|
+
{ userID: 'user-1', authData: { id: 'user-1' } }
|
|
288
|
+
)
|
|
289
|
+
).rejects.toThrow('remote unavailable')
|
|
290
|
+
expect(dispatchRemote).toHaveBeenCalledOnce()
|
|
291
|
+
expect(execute).not.toHaveBeenCalled()
|
|
193
292
|
})
|
|
194
293
|
})
|