@mszr/idb-dux 1.0.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/LICENSE +194 -0
- package/README.md +84 -0
- package/dist/commonjs/admin/index.d.ts +18 -0
- package/dist/commonjs/admin/index.d.ts.map +1 -0
- package/dist/commonjs/admin/index.js +31 -0
- package/dist/commonjs/admin/index.js.map +1 -0
- package/dist/commonjs/admin/init.d.ts +67 -0
- package/dist/commonjs/admin/init.d.ts.map +1 -0
- package/dist/commonjs/admin/init.js +86 -0
- package/dist/commonjs/admin/init.js.map +1 -0
- package/dist/commonjs/admin/query.d.ts +21 -0
- package/dist/commonjs/admin/query.d.ts.map +1 -0
- package/dist/commonjs/admin/query.js +46 -0
- package/dist/commonjs/admin/query.js.map +1 -0
- package/dist/commonjs/admin/types.d.ts +124 -0
- package/dist/commonjs/admin/types.d.ts.map +1 -0
- package/dist/commonjs/admin/types.js +3 -0
- package/dist/commonjs/admin/types.js.map +1 -0
- package/dist/commonjs/admin/webhooks.d.ts +11 -0
- package/dist/commonjs/admin/webhooks.d.ts.map +1 -0
- package/dist/commonjs/admin/webhooks.js +8 -0
- package/dist/commonjs/admin/webhooks.js.map +1 -0
- package/dist/commonjs/errors.d.ts +13 -0
- package/dist/commonjs/errors.d.ts.map +1 -0
- package/dist/commonjs/errors.js +19 -0
- package/dist/commonjs/errors.js.map +1 -0
- package/dist/commonjs/index.d.ts +13 -0
- package/dist/commonjs/index.d.ts.map +1 -0
- package/dist/commonjs/index.js +29 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/nuxt/defineAuthSyncHandler.d.ts +15 -0
- package/dist/commonjs/nuxt/defineAuthSyncHandler.d.ts.map +1 -0
- package/dist/commonjs/nuxt/defineAuthSyncHandler.js +44 -0
- package/dist/commonjs/nuxt/defineAuthSyncHandler.js.map +1 -0
- package/dist/commonjs/nuxt/defineServerKit.d.ts +5 -0
- package/dist/commonjs/nuxt/defineServerKit.d.ts.map +1 -0
- package/dist/commonjs/nuxt/defineServerKit.js +49 -0
- package/dist/commonjs/nuxt/defineServerKit.js.map +1 -0
- package/dist/commonjs/nuxt/defineWebhookHandler.d.ts +17 -0
- package/dist/commonjs/nuxt/defineWebhookHandler.d.ts.map +1 -0
- package/dist/commonjs/nuxt/defineWebhookHandler.js +24 -0
- package/dist/commonjs/nuxt/defineWebhookHandler.js.map +1 -0
- package/dist/commonjs/nuxt/index.d.ts +15 -0
- package/dist/commonjs/nuxt/index.d.ts.map +1 -0
- package/dist/commonjs/nuxt/index.js +24 -0
- package/dist/commonjs/nuxt/index.js.map +1 -0
- package/dist/commonjs/nuxt/types.d.ts +54 -0
- package/dist/commonjs/nuxt/types.d.ts.map +1 -0
- package/dist/commonjs/nuxt/types.js +3 -0
- package/dist/commonjs/nuxt/types.js.map +1 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/commonjs/perms/ast.d.ts +98 -0
- package/dist/commonjs/perms/ast.d.ts.map +1 -0
- package/dist/commonjs/perms/ast.js +148 -0
- package/dist/commonjs/perms/ast.js.map +1 -0
- package/dist/commonjs/perms/builder.d.ts +18 -0
- package/dist/commonjs/perms/builder.d.ts.map +1 -0
- package/dist/commonjs/perms/builder.js +260 -0
- package/dist/commonjs/perms/builder.js.map +1 -0
- package/dist/commonjs/perms/context.d.ts +27 -0
- package/dist/commonjs/perms/context.d.ts.map +1 -0
- package/dist/commonjs/perms/context.js +96 -0
- package/dist/commonjs/perms/context.js.map +1 -0
- package/dist/commonjs/perms/index.d.ts +13 -0
- package/dist/commonjs/perms/index.d.ts.map +1 -0
- package/dist/commonjs/perms/index.js +6 -0
- package/dist/commonjs/perms/index.js.map +1 -0
- package/dist/commonjs/perms/types.d.ts +353 -0
- package/dist/commonjs/perms/types.d.ts.map +1 -0
- package/dist/commonjs/perms/types.js +3 -0
- package/dist/commonjs/perms/types.js.map +1 -0
- package/dist/commonjs/perms/validate.d.ts +31 -0
- package/dist/commonjs/perms/validate.d.ts.map +1 -0
- package/dist/commonjs/perms/validate.js +66 -0
- package/dist/commonjs/perms/validate.js.map +1 -0
- package/dist/commonjs/query/constants.d.ts +13 -0
- package/dist/commonjs/query/constants.d.ts.map +1 -0
- package/dist/commonjs/query/constants.js +16 -0
- package/dist/commonjs/query/constants.js.map +1 -0
- package/dist/commonjs/query/defineQuery.d.ts +33 -0
- package/dist/commonjs/query/defineQuery.d.ts.map +1 -0
- package/dist/commonjs/query/defineQuery.js +28 -0
- package/dist/commonjs/query/defineQuery.js.map +1 -0
- package/dist/commonjs/query/index.d.ts +9 -0
- package/dist/commonjs/query/index.d.ts.map +1 -0
- package/dist/commonjs/query/index.js +16 -0
- package/dist/commonjs/query/index.js.map +1 -0
- package/dist/commonjs/query/keys.d.ts +33 -0
- package/dist/commonjs/query/keys.d.ts.map +1 -0
- package/dist/commonjs/query/keys.js +3 -0
- package/dist/commonjs/query/keys.js.map +1 -0
- package/dist/commonjs/query/shapeResult.d.ts +36 -0
- package/dist/commonjs/query/shapeResult.d.ts.map +1 -0
- package/dist/commonjs/query/shapeResult.js +173 -0
- package/dist/commonjs/query/shapeResult.js.map +1 -0
- package/dist/commonjs/query/types.d.ts +187 -0
- package/dist/commonjs/query/types.d.ts.map +1 -0
- package/dist/commonjs/query/types.js +3 -0
- package/dist/commonjs/query/types.js.map +1 -0
- package/dist/commonjs/query/validation.d.ts +61 -0
- package/dist/commonjs/query/validation.d.ts.map +1 -0
- package/dist/commonjs/query/validation.js +3 -0
- package/dist/commonjs/query/validation.js.map +1 -0
- package/dist/commonjs/query/wire.d.ts +13 -0
- package/dist/commonjs/query/wire.d.ts.map +1 -0
- package/dist/commonjs/query/wire.js +77 -0
- package/dist/commonjs/query/wire.js.map +1 -0
- package/dist/commonjs/schema/defineSchema.d.ts +110 -0
- package/dist/commonjs/schema/defineSchema.d.ts.map +1 -0
- package/dist/commonjs/schema/defineSchema.js +72 -0
- package/dist/commonjs/schema/defineSchema.js.map +1 -0
- package/dist/commonjs/schema/fields.d.ts +33 -0
- package/dist/commonjs/schema/fields.d.ts.map +1 -0
- package/dist/commonjs/schema/fields.js +3 -0
- package/dist/commonjs/schema/fields.js.map +1 -0
- package/dist/commonjs/schema/index.d.ts +9 -0
- package/dist/commonjs/schema/index.d.ts.map +1 -0
- package/dist/commonjs/schema/index.js +10 -0
- package/dist/commonjs/schema/index.js.map +1 -0
- package/dist/commonjs/schema/namespace.d.ts +82 -0
- package/dist/commonjs/schema/namespace.d.ts.map +1 -0
- package/dist/commonjs/schema/namespace.js +37 -0
- package/dist/commonjs/schema/namespace.js.map +1 -0
- package/dist/commonjs/schema/register.d.ts +37 -0
- package/dist/commonjs/schema/register.d.ts.map +1 -0
- package/dist/commonjs/schema/register.js +3 -0
- package/dist/commonjs/schema/register.js.map +1 -0
- package/dist/commonjs/schema/singularize.d.ts +45 -0
- package/dist/commonjs/schema/singularize.d.ts.map +1 -0
- package/dist/commonjs/schema/singularize.js +47 -0
- package/dist/commonjs/schema/singularize.js.map +1 -0
- package/dist/commonjs/schema/types.d.ts +39 -0
- package/dist/commonjs/schema/types.d.ts.map +1 -0
- package/dist/commonjs/schema/types.js +3 -0
- package/dist/commonjs/schema/types.js.map +1 -0
- package/dist/commonjs/schema/util.d.ts +11 -0
- package/dist/commonjs/schema/util.d.ts.map +1 -0
- package/dist/commonjs/schema/util.js +3 -0
- package/dist/commonjs/schema/util.js.map +1 -0
- package/dist/commonjs/tx/index.d.ts +4 -0
- package/dist/commonjs/tx/index.d.ts.map +1 -0
- package/dist/commonjs/tx/index.js +11 -0
- package/dist/commonjs/tx/index.js.map +1 -0
- package/dist/commonjs/tx/typedTx.d.ts +15 -0
- package/dist/commonjs/tx/typedTx.d.ts.map +1 -0
- package/dist/commonjs/tx/typedTx.js +54 -0
- package/dist/commonjs/tx/typedTx.js.map +1 -0
- package/dist/commonjs/tx/types.d.ts +104 -0
- package/dist/commonjs/tx/types.d.ts.map +1 -0
- package/dist/commonjs/tx/types.js +3 -0
- package/dist/commonjs/tx/types.js.map +1 -0
- package/dist/commonjs/vue/baseline/InstantDuxDatabase.d.ts +52 -0
- package/dist/commonjs/vue/baseline/InstantDuxDatabase.d.ts.map +1 -0
- package/dist/commonjs/vue/baseline/InstantDuxDatabase.js +157 -0
- package/dist/commonjs/vue/baseline/InstantDuxDatabase.js.map +1 -0
- package/dist/commonjs/vue/baseline/InstantDuxRoom.d.ts +72 -0
- package/dist/commonjs/vue/baseline/InstantDuxRoom.d.ts.map +1 -0
- package/dist/commonjs/vue/baseline/InstantDuxRoom.js +211 -0
- package/dist/commonjs/vue/baseline/InstantDuxRoom.js.map +1 -0
- package/dist/commonjs/vue/baseline/components/Cursor.d.ts +15 -0
- package/dist/commonjs/vue/baseline/components/Cursor.d.ts.map +1 -0
- package/dist/commonjs/vue/baseline/components/Cursor.js +39 -0
- package/dist/commonjs/vue/baseline/components/Cursor.js.map +1 -0
- package/dist/commonjs/vue/baseline/components/Cursors.d.ts +65 -0
- package/dist/commonjs/vue/baseline/components/Cursors.d.ts.map +1 -0
- package/dist/commonjs/vue/baseline/components/Cursors.js +113 -0
- package/dist/commonjs/vue/baseline/components/Cursors.js.map +1 -0
- package/dist/commonjs/vue/baseline/components/auth.d.ts +37 -0
- package/dist/commonjs/vue/baseline/components/auth.d.ts.map +1 -0
- package/dist/commonjs/vue/baseline/components/auth.js +27 -0
- package/dist/commonjs/vue/baseline/components/auth.js.map +1 -0
- package/dist/commonjs/vue/baseline/index.d.ts +11 -0
- package/dist/commonjs/vue/baseline/index.d.ts.map +1 -0
- package/dist/commonjs/vue/baseline/index.js +29 -0
- package/dist/commonjs/vue/baseline/index.js.map +1 -0
- package/dist/commonjs/vue/baseline/useInfiniteQuery.d.ts +19 -0
- package/dist/commonjs/vue/baseline/useInfiniteQuery.d.ts.map +1 -0
- package/dist/commonjs/vue/baseline/useInfiniteQuery.js +65 -0
- package/dist/commonjs/vue/baseline/useInfiniteQuery.js.map +1 -0
- package/dist/commonjs/vue/baseline/utils.d.ts +9 -0
- package/dist/commonjs/vue/baseline/utils.d.ts.map +1 -0
- package/dist/commonjs/vue/baseline/utils.js +29 -0
- package/dist/commonjs/vue/baseline/utils.js.map +1 -0
- package/dist/commonjs/vue/baseline/version.d.ts +3 -0
- package/dist/commonjs/vue/baseline/version.d.ts.map +1 -0
- package/dist/commonjs/vue/baseline/version.js +6 -0
- package/dist/commonjs/vue/baseline/version.js.map +1 -0
- package/dist/commonjs/vue/index.d.ts +21 -0
- package/dist/commonjs/vue/index.d.ts.map +1 -0
- package/dist/commonjs/vue/index.js +31 -0
- package/dist/commonjs/vue/index.js.map +1 -0
- package/dist/commonjs/vue/overlay/db.d.ts +106 -0
- package/dist/commonjs/vue/overlay/db.d.ts.map +1 -0
- package/dist/commonjs/vue/overlay/db.js +105 -0
- package/dist/commonjs/vue/overlay/db.js.map +1 -0
- package/dist/commonjs/vue/overlay/defineDb.d.ts +34 -0
- package/dist/commonjs/vue/overlay/defineDb.d.ts.map +1 -0
- package/dist/commonjs/vue/overlay/defineDb.js +48 -0
- package/dist/commonjs/vue/overlay/defineDb.js.map +1 -0
- package/dist/commonjs/vue/overlay/result.d.ts +29 -0
- package/dist/commonjs/vue/overlay/result.d.ts.map +1 -0
- package/dist/commonjs/vue/overlay/result.js +75 -0
- package/dist/commonjs/vue/overlay/result.js.map +1 -0
- package/dist/commonjs/vue/overlay/rooms/index.d.ts +79 -0
- package/dist/commonjs/vue/overlay/rooms/index.d.ts.map +1 -0
- package/dist/commonjs/vue/overlay/rooms/index.js +28 -0
- package/dist/commonjs/vue/overlay/rooms/index.js.map +1 -0
- package/dist/commonjs/vue/overlay/types.d.ts +73 -0
- package/dist/commonjs/vue/overlay/types.d.ts.map +1 -0
- package/dist/commonjs/vue/overlay/types.js +3 -0
- package/dist/commonjs/vue/overlay/types.js.map +1 -0
- package/dist/commonjs/webhooks/defineWebhookHandlers.d.ts +27 -0
- package/dist/commonjs/webhooks/defineWebhookHandlers.d.ts.map +1 -0
- package/dist/commonjs/webhooks/defineWebhookHandlers.js +33 -0
- package/dist/commonjs/webhooks/defineWebhookHandlers.js.map +1 -0
- package/dist/commonjs/webhooks/index.d.ts +15 -0
- package/dist/commonjs/webhooks/index.d.ts.map +1 -0
- package/dist/commonjs/webhooks/index.js +21 -0
- package/dist/commonjs/webhooks/index.js.map +1 -0
- package/dist/commonjs/webhooks/init.d.ts +13 -0
- package/dist/commonjs/webhooks/init.d.ts.map +1 -0
- package/dist/commonjs/webhooks/init.js +39 -0
- package/dist/commonjs/webhooks/init.js.map +1 -0
- package/dist/commonjs/webhooks/types.d.ts +136 -0
- package/dist/commonjs/webhooks/types.d.ts.map +1 -0
- package/dist/commonjs/webhooks/types.js +3 -0
- package/dist/commonjs/webhooks/types.js.map +1 -0
- package/dist/esm/admin/index.d.ts +18 -0
- package/dist/esm/admin/index.d.ts.map +1 -0
- package/dist/esm/admin/index.js +21 -0
- package/dist/esm/admin/index.js.map +1 -0
- package/dist/esm/admin/init.d.ts +67 -0
- package/dist/esm/admin/init.d.ts.map +1 -0
- package/dist/esm/admin/init.js +81 -0
- package/dist/esm/admin/init.js.map +1 -0
- package/dist/esm/admin/query.d.ts +21 -0
- package/dist/esm/admin/query.d.ts.map +1 -0
- package/dist/esm/admin/query.js +42 -0
- package/dist/esm/admin/query.js.map +1 -0
- package/dist/esm/admin/types.d.ts +124 -0
- package/dist/esm/admin/types.d.ts.map +1 -0
- package/dist/esm/admin/types.js +2 -0
- package/dist/esm/admin/types.js.map +1 -0
- package/dist/esm/admin/webhooks.d.ts +11 -0
- package/dist/esm/admin/webhooks.d.ts.map +1 -0
- package/dist/esm/admin/webhooks.js +5 -0
- package/dist/esm/admin/webhooks.js.map +1 -0
- package/dist/esm/errors.d.ts +13 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +16 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +13 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/nuxt/defineAuthSyncHandler.d.ts +15 -0
- package/dist/esm/nuxt/defineAuthSyncHandler.d.ts.map +1 -0
- package/dist/esm/nuxt/defineAuthSyncHandler.js +41 -0
- package/dist/esm/nuxt/defineAuthSyncHandler.js.map +1 -0
- package/dist/esm/nuxt/defineServerKit.d.ts +5 -0
- package/dist/esm/nuxt/defineServerKit.d.ts.map +1 -0
- package/dist/esm/nuxt/defineServerKit.js +46 -0
- package/dist/esm/nuxt/defineServerKit.js.map +1 -0
- package/dist/esm/nuxt/defineWebhookHandler.d.ts +17 -0
- package/dist/esm/nuxt/defineWebhookHandler.d.ts.map +1 -0
- package/dist/esm/nuxt/defineWebhookHandler.js +21 -0
- package/dist/esm/nuxt/defineWebhookHandler.js.map +1 -0
- package/dist/esm/nuxt/index.d.ts +15 -0
- package/dist/esm/nuxt/index.d.ts.map +1 -0
- package/dist/esm/nuxt/index.js +17 -0
- package/dist/esm/nuxt/index.js.map +1 -0
- package/dist/esm/nuxt/types.d.ts +54 -0
- package/dist/esm/nuxt/types.d.ts.map +1 -0
- package/dist/esm/nuxt/types.js +2 -0
- package/dist/esm/nuxt/types.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/perms/ast.d.ts +98 -0
- package/dist/esm/perms/ast.d.ts.map +1 -0
- package/dist/esm/perms/ast.js +140 -0
- package/dist/esm/perms/ast.js.map +1 -0
- package/dist/esm/perms/builder.d.ts +18 -0
- package/dist/esm/perms/builder.d.ts.map +1 -0
- package/dist/esm/perms/builder.js +257 -0
- package/dist/esm/perms/builder.js.map +1 -0
- package/dist/esm/perms/context.d.ts +27 -0
- package/dist/esm/perms/context.d.ts.map +1 -0
- package/dist/esm/perms/context.js +93 -0
- package/dist/esm/perms/context.js.map +1 -0
- package/dist/esm/perms/index.d.ts +13 -0
- package/dist/esm/perms/index.d.ts.map +1 -0
- package/dist/esm/perms/index.js +2 -0
- package/dist/esm/perms/index.js.map +1 -0
- package/dist/esm/perms/types.d.ts +353 -0
- package/dist/esm/perms/types.d.ts.map +1 -0
- package/dist/esm/perms/types.js +2 -0
- package/dist/esm/perms/types.js.map +1 -0
- package/dist/esm/perms/validate.d.ts +31 -0
- package/dist/esm/perms/validate.d.ts.map +1 -0
- package/dist/esm/perms/validate.js +61 -0
- package/dist/esm/perms/validate.js.map +1 -0
- package/dist/esm/query/constants.d.ts +13 -0
- package/dist/esm/query/constants.d.ts.map +1 -0
- package/dist/esm/query/constants.js +13 -0
- package/dist/esm/query/constants.js.map +1 -0
- package/dist/esm/query/defineQuery.d.ts +33 -0
- package/dist/esm/query/defineQuery.d.ts.map +1 -0
- package/dist/esm/query/defineQuery.js +24 -0
- package/dist/esm/query/defineQuery.js.map +1 -0
- package/dist/esm/query/index.d.ts +9 -0
- package/dist/esm/query/index.d.ts.map +1 -0
- package/dist/esm/query/index.js +5 -0
- package/dist/esm/query/index.js.map +1 -0
- package/dist/esm/query/keys.d.ts +33 -0
- package/dist/esm/query/keys.d.ts.map +1 -0
- package/dist/esm/query/keys.js +2 -0
- package/dist/esm/query/keys.js.map +1 -0
- package/dist/esm/query/shapeResult.d.ts +36 -0
- package/dist/esm/query/shapeResult.d.ts.map +1 -0
- package/dist/esm/query/shapeResult.js +168 -0
- package/dist/esm/query/shapeResult.js.map +1 -0
- package/dist/esm/query/types.d.ts +187 -0
- package/dist/esm/query/types.d.ts.map +1 -0
- package/dist/esm/query/types.js +2 -0
- package/dist/esm/query/types.js.map +1 -0
- package/dist/esm/query/validation.d.ts +61 -0
- package/dist/esm/query/validation.d.ts.map +1 -0
- package/dist/esm/query/validation.js +2 -0
- package/dist/esm/query/validation.js.map +1 -0
- package/dist/esm/query/wire.d.ts +13 -0
- package/dist/esm/query/wire.d.ts.map +1 -0
- package/dist/esm/query/wire.js +74 -0
- package/dist/esm/query/wire.js.map +1 -0
- package/dist/esm/schema/defineSchema.d.ts +110 -0
- package/dist/esm/schema/defineSchema.d.ts.map +1 -0
- package/dist/esm/schema/defineSchema.js +69 -0
- package/dist/esm/schema/defineSchema.js.map +1 -0
- package/dist/esm/schema/fields.d.ts +33 -0
- package/dist/esm/schema/fields.d.ts.map +1 -0
- package/dist/esm/schema/fields.js +2 -0
- package/dist/esm/schema/fields.js.map +1 -0
- package/dist/esm/schema/index.d.ts +9 -0
- package/dist/esm/schema/index.d.ts.map +1 -0
- package/dist/esm/schema/index.js +4 -0
- package/dist/esm/schema/index.js.map +1 -0
- package/dist/esm/schema/namespace.d.ts +82 -0
- package/dist/esm/schema/namespace.d.ts.map +1 -0
- package/dist/esm/schema/namespace.js +34 -0
- package/dist/esm/schema/namespace.js.map +1 -0
- package/dist/esm/schema/register.d.ts +37 -0
- package/dist/esm/schema/register.d.ts.map +1 -0
- package/dist/esm/schema/register.js +2 -0
- package/dist/esm/schema/register.js.map +1 -0
- package/dist/esm/schema/singularize.d.ts +45 -0
- package/dist/esm/schema/singularize.d.ts.map +1 -0
- package/dist/esm/schema/singularize.js +44 -0
- package/dist/esm/schema/singularize.js.map +1 -0
- package/dist/esm/schema/types.d.ts +39 -0
- package/dist/esm/schema/types.d.ts.map +1 -0
- package/dist/esm/schema/types.js +2 -0
- package/dist/esm/schema/types.js.map +1 -0
- package/dist/esm/schema/util.d.ts +11 -0
- package/dist/esm/schema/util.d.ts.map +1 -0
- package/dist/esm/schema/util.js +2 -0
- package/dist/esm/schema/util.js.map +1 -0
- package/dist/esm/tx/index.d.ts +4 -0
- package/dist/esm/tx/index.d.ts.map +1 -0
- package/dist/esm/tx/index.js +5 -0
- package/dist/esm/tx/index.js.map +1 -0
- package/dist/esm/tx/typedTx.d.ts +15 -0
- package/dist/esm/tx/typedTx.d.ts.map +1 -0
- package/dist/esm/tx/typedTx.js +51 -0
- package/dist/esm/tx/typedTx.js.map +1 -0
- package/dist/esm/tx/types.d.ts +104 -0
- package/dist/esm/tx/types.d.ts.map +1 -0
- package/dist/esm/tx/types.js +2 -0
- package/dist/esm/tx/types.js.map +1 -0
- package/dist/esm/vue/baseline/InstantDuxDatabase.d.ts +52 -0
- package/dist/esm/vue/baseline/InstantDuxDatabase.d.ts.map +1 -0
- package/dist/esm/vue/baseline/InstantDuxDatabase.js +149 -0
- package/dist/esm/vue/baseline/InstantDuxDatabase.js.map +1 -0
- package/dist/esm/vue/baseline/InstantDuxRoom.d.ts +72 -0
- package/dist/esm/vue/baseline/InstantDuxRoom.d.ts.map +1 -0
- package/dist/esm/vue/baseline/InstantDuxRoom.js +202 -0
- package/dist/esm/vue/baseline/InstantDuxRoom.js.map +1 -0
- package/dist/esm/vue/baseline/components/Cursor.d.ts +15 -0
- package/dist/esm/vue/baseline/components/Cursor.d.ts.map +1 -0
- package/dist/esm/vue/baseline/components/Cursor.js +36 -0
- package/dist/esm/vue/baseline/components/Cursor.js.map +1 -0
- package/dist/esm/vue/baseline/components/Cursors.d.ts +65 -0
- package/dist/esm/vue/baseline/components/Cursors.d.ts.map +1 -0
- package/dist/esm/vue/baseline/components/Cursors.js +107 -0
- package/dist/esm/vue/baseline/components/Cursors.js.map +1 -0
- package/dist/esm/vue/baseline/components/auth.d.ts +37 -0
- package/dist/esm/vue/baseline/components/auth.d.ts.map +1 -0
- package/dist/esm/vue/baseline/components/auth.js +24 -0
- package/dist/esm/vue/baseline/components/auth.js.map +1 -0
- package/dist/esm/vue/baseline/index.d.ts +11 -0
- package/dist/esm/vue/baseline/index.d.ts.map +1 -0
- package/dist/esm/vue/baseline/index.js +10 -0
- package/dist/esm/vue/baseline/index.js.map +1 -0
- package/dist/esm/vue/baseline/useInfiniteQuery.d.ts +19 -0
- package/dist/esm/vue/baseline/useInfiniteQuery.d.ts.map +1 -0
- package/dist/esm/vue/baseline/useInfiniteQuery.js +62 -0
- package/dist/esm/vue/baseline/useInfiniteQuery.js.map +1 -0
- package/dist/esm/vue/baseline/utils.d.ts +9 -0
- package/dist/esm/vue/baseline/utils.d.ts.map +1 -0
- package/dist/esm/vue/baseline/utils.js +25 -0
- package/dist/esm/vue/baseline/utils.js.map +1 -0
- package/dist/esm/vue/baseline/version.d.ts +3 -0
- package/dist/esm/vue/baseline/version.d.ts.map +1 -0
- package/dist/esm/vue/baseline/version.js +4 -0
- package/dist/esm/vue/baseline/version.js.map +1 -0
- package/dist/esm/vue/index.d.ts +21 -0
- package/dist/esm/vue/index.d.ts.map +1 -0
- package/dist/esm/vue/index.js +18 -0
- package/dist/esm/vue/index.js.map +1 -0
- package/dist/esm/vue/overlay/db.d.ts +106 -0
- package/dist/esm/vue/overlay/db.d.ts.map +1 -0
- package/dist/esm/vue/overlay/db.js +101 -0
- package/dist/esm/vue/overlay/db.js.map +1 -0
- package/dist/esm/vue/overlay/defineDb.d.ts +34 -0
- package/dist/esm/vue/overlay/defineDb.d.ts.map +1 -0
- package/dist/esm/vue/overlay/defineDb.js +44 -0
- package/dist/esm/vue/overlay/defineDb.js.map +1 -0
- package/dist/esm/vue/overlay/result.d.ts +29 -0
- package/dist/esm/vue/overlay/result.d.ts.map +1 -0
- package/dist/esm/vue/overlay/result.js +71 -0
- package/dist/esm/vue/overlay/result.js.map +1 -0
- package/dist/esm/vue/overlay/rooms/index.d.ts +79 -0
- package/dist/esm/vue/overlay/rooms/index.d.ts.map +1 -0
- package/dist/esm/vue/overlay/rooms/index.js +25 -0
- package/dist/esm/vue/overlay/rooms/index.js.map +1 -0
- package/dist/esm/vue/overlay/types.d.ts +73 -0
- package/dist/esm/vue/overlay/types.d.ts.map +1 -0
- package/dist/esm/vue/overlay/types.js +2 -0
- package/dist/esm/vue/overlay/types.js.map +1 -0
- package/dist/esm/webhooks/defineWebhookHandlers.d.ts +27 -0
- package/dist/esm/webhooks/defineWebhookHandlers.d.ts.map +1 -0
- package/dist/esm/webhooks/defineWebhookHandlers.js +30 -0
- package/dist/esm/webhooks/defineWebhookHandlers.js.map +1 -0
- package/dist/esm/webhooks/index.d.ts +15 -0
- package/dist/esm/webhooks/index.d.ts.map +1 -0
- package/dist/esm/webhooks/index.js +14 -0
- package/dist/esm/webhooks/index.js.map +1 -0
- package/dist/esm/webhooks/init.d.ts +13 -0
- package/dist/esm/webhooks/init.d.ts.map +1 -0
- package/dist/esm/webhooks/init.js +36 -0
- package/dist/esm/webhooks/init.js.map +1 -0
- package/dist/esm/webhooks/types.d.ts +136 -0
- package/dist/esm/webhooks/types.d.ts.map +1 -0
- package/dist/esm/webhooks/types.js +2 -0
- package/dist/esm/webhooks/types.js.map +1 -0
- package/package.json +149 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shapeResult.js","sourceRoot":"","sources":["../../../src/query/shapeResult.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The one place result-shaping logic exists. `/vue` wraps it reactively,\n * `/admin` applies it post-`await` — both deliver identical shapes for the\n * same query by construction. The type-level mirror is `IdbQueryData`\n * (`types.ts`); the two derive from the same schema source so the runtime key\n * and the TypeScript key always match.\n *\n * Shaping per scope:\n * - top-level namespaces normalize to `Entity[]` — never `undefined`\n * - `$only` picks element 0, `$at: n` picks position n (negative from the\n * end); both rename the scope key to its singular form per the schema\n * - `$as` renames explicitly and always wins\n * - `$m` adds labeled sibling keys (`indexBy` / `groupBy` / `at`) computed in\n * a single pass over the scope's data, leaving the original key untouched\n * - nested link scopes shape recursively inside each entity; untouched\n * subtrees are returned by reference, never copied\n */\n\nimport type { IdbSchema } from '../schema/defineSchema.js'\nimport { singularize } from '../schema/singularize.js'\n\ntype AnyRecord = Record<string, any>\n\ninterface MTransform {\n indexBy?: string\n groupBy?: string\n at?: number\n}\n\n/**\n * The top-level keys a shaped result will carry for a query — the resolved\n * scope keys plus every `$m` sibling label — derived from the query structure\n * alone, no data needed. The client overlay uses this to expose one reactive\n * ref per scope for destructuring.\n */\nexport function resultKeys(query: AnyRecord, schema: IdbSchema): string[] {\n const keys: string[] = []\n for (const [key, node] of Object.entries(query)) {\n if (key === '$$ruleParams')\n continue\n const dollar: AnyRecord = (node as AnyRecord)?.$ ?? {}\n const pick = dollar.$only === true || typeof dollar.$at === 'number'\n keys.push(\n typeof dollar.$as === 'string'\n ? dollar.$as\n : pick\n ? resolveSingularKey(key, null, schema)\n : key,\n )\n const m = (node as AnyRecord)?.$m\n if (m)\n keys.push(...Object.keys(m))\n }\n return keys\n}\n\n/**\n * A schema with a usable `$dux` projection for runtime shaping — the real\n * schema when one is registered, a permissive stub otherwise (singularize\n * 'auto', no declared singulars, no link metadata). Both clients reach for it\n * so a query with no schema still shapes consistently.\n */\nexport function shapingSchema(schema: IdbSchema | undefined): IdbSchema {\n if (schema)\n return schema\n return {\n entities: {},\n links: {},\n rooms: {},\n $dux: { namespaces: {}, linkSingulars: {}, options: { singularize: 'auto' } },\n } as unknown as IdbSchema\n}\n\nexport function shapeResult(\n rawData: AnyRecord | undefined,\n query: AnyRecord,\n schema: IdbSchema,\n): AnyRecord {\n const out: AnyRecord = {}\n for (const [key, node] of Object.entries(query)) {\n // `$`-prefixed namespaces ($users, …) are data; only the internal\n // ruleParams envelope is not a scope.\n if (key === '$$ruleParams')\n continue\n shapeScopeInto(out, rawData?.[key] ?? [], key, node ?? {}, null, key, schema)\n }\n return out\n}\n\n/**\n * Shapes one scope into `out`: the resolved scope key, plus any `$m` sibling\n * keys. `parentNs` is the namespace the scope key sits on (`null` for\n * top-level scopes); `ns` is the namespace the scope's entities belong to.\n */\nfunction shapeScopeInto(\n out: AnyRecord,\n raw: unknown,\n key: string,\n node: AnyRecord,\n parentNs: string | null,\n ns: string,\n schema: IdbSchema,\n): void {\n const dollar: AnyRecord = node.$ ?? {}\n const value = shapeChildren(raw, node, ns, schema)\n\n if (node.$m && Array.isArray(value))\n applyMSiblings(out, value, node.$m as Record<string, MTransform>)\n\n const pick = dollar.$only === true ? 0 : typeof dollar.$at === 'number' ? dollar.$at : null\n const picked = pick !== null && Array.isArray(value) ? value.at(pick) : value\n const outputKey = typeof dollar.$as === 'string'\n ? dollar.$as\n : pick !== null\n ? resolveSingularKey(key, parentNs, schema)\n : key\n out[outputKey] = picked\n}\n\n/**\n * Recursively shapes the nested link scopes inside each entity of a scope\n * whose entities belong to `ns`. Entities are copied only along paths that\n * actually change.\n */\nfunction shapeChildren(\n raw: unknown,\n node: AnyRecord,\n ns: string,\n schema: IdbSchema,\n): unknown {\n const childKeys = Object.keys(node).filter(k => k !== '$' && k !== '$m')\n if (childKeys.length === 0 || !childKeys.some(k => subtreeReshapes(node[k])))\n return raw\n\n const shapeEntity = (entity: unknown): unknown => {\n if (entity === null || typeof entity !== 'object')\n return entity\n const copy: AnyRecord = { ...entity }\n for (const childKey of childKeys) {\n const childRaw = copy[childKey]\n delete copy[childKey]\n const childNs = linkTarget(schema, ns, childKey)\n shapeScopeInto(copy, childRaw, childKey, node[childKey] ?? {}, ns, childNs, schema)\n }\n return copy\n }\n\n return Array.isArray(raw) ? raw.map(shapeEntity) : shapeEntity(raw)\n}\n\n/** The namespace a link label on `ns` points to, via the enriched entity defs. */\nfunction linkTarget(schema: IdbSchema, ns: string, label: string): string {\n return schema.entities[ns]?.links?.[label]?.entityName ?? label\n}\n\n/** Whether a subtree contains any directive that changes the data shape. */\nfunction subtreeReshapes(node: unknown): boolean {\n if (node === null || typeof node !== 'object')\n return false\n const record = node as AnyRecord\n if (record.$m !== undefined)\n return true\n const dollar = record.$\n if (dollar && (dollar.$only !== undefined || dollar.$at !== undefined || dollar.$as !== undefined))\n return true\n return Object.keys(record).some(k => k !== '$' && k !== '$m' && subtreeReshapes(record[k]))\n}\n\n/** All `$m` projections for one scope, computed in a single pass. */\nfunction applyMSiblings(\n out: AnyRecord,\n entities: AnyRecord[],\n transforms: Record<string, MTransform>,\n): void {\n const labels = Object.entries(transforms)\n for (const [label, transform] of labels) {\n out[label] = typeof transform.at === 'number'\n ? entities.at(transform.at)\n : {}\n }\n for (const entity of entities) {\n for (const [label, transform] of labels) {\n if (transform.indexBy !== undefined) {\n const indexValue = entity[transform.indexBy]\n if (indexValue !== null && indexValue !== undefined)\n out[label][String(indexValue)] = entity\n }\n else if (transform.groupBy !== undefined) {\n const groupValue = entity[transform.groupBy]\n if (groupValue !== null && groupValue !== undefined)\n (out[label][String(groupValue)] ??= []).push(entity)\n }\n }\n }\n}\n\n/**\n * The singular form of a scope key — declared `singular` first (namespace\n * `singular` for top-level keys, link label `singular` for nested keys), the\n * shared algorithm as the `'auto'` fallback, honoring `options.singularize`.\n */\nfunction resolveSingularKey(\n key: string,\n parentNs: string | null,\n schema: IdbSchema,\n): string {\n const meta = schema.$dux\n const mode = meta.options.singularize\n if (mode === 'off')\n return key\n const declared = parentNs === null\n ? meta.namespaces[key]?.singular\n : meta.linkSingulars[parentNs]?.[key]\n if (declared !== undefined)\n return declared\n return mode === 'auto' ? singularize(key) : key\n}\n"]}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The query-domain types: the authoring shape (`IdbQuery` and its node
|
|
3
|
+
* types — also the completion source for `q`/`useQuery` literals), the
|
|
4
|
+
* type-level shaping mirror (`IdbQueryData`, `IdbQueryEntity`), and the
|
|
5
|
+
* renamed official types (`IdbQueryPageInfo`, `IdbQueryOptions`, …).
|
|
6
|
+
*/
|
|
7
|
+
import type { Cursor, DataAttrDef, PageInfoResponse, ResolveAttrs } from '@instantdb/core';
|
|
8
|
+
import type { IdbSchema } from '../schema/defineSchema.js';
|
|
9
|
+
import type { AttrsOf, AttrValue, FieldKeys, IndexedFieldKeys, LinkCardinality, LinkLabels, LinkTarget, PrimitiveFieldKeys, UniqueFieldKeys, WireValue } from '../schema/fields.js';
|
|
10
|
+
import type { IdbRegisteredSchema } from '../schema/register.js';
|
|
11
|
+
import type { IdbNamespaceName } from '../schema/types.js';
|
|
12
|
+
import type { Expand, UnionToIntersection } from '../schema/util.js';
|
|
13
|
+
import type { HasPick, ResolvedScopeKey } from './keys.js';
|
|
14
|
+
export type { FieldKeys, IndexedFieldKeys, LinkLabels, LinkTarget, UniqueFieldKeys, WireValue, } from '../schema/fields.js';
|
|
15
|
+
type Depth = readonly unknown[];
|
|
16
|
+
export type MaxHops = 3;
|
|
17
|
+
export type NextHop<D extends Depth> = D['length'] extends MaxHops ? D : [...D, unknown];
|
|
18
|
+
/**
|
|
19
|
+
* The operator object for one field. Every operator is present so the
|
|
20
|
+
* completion list and the diagnostic are both intentional: operators the
|
|
21
|
+
* field doesn't support are typed as the `QERR_*` message explaining why.
|
|
22
|
+
*/
|
|
23
|
+
export interface IdbWhereOps<V, _IsRequired, IsIndexed> {
|
|
24
|
+
$in?: readonly WireValue<V>[];
|
|
25
|
+
$not?: WireValue<V>;
|
|
26
|
+
$ne?: WireValue<V>;
|
|
27
|
+
$gt?: ComparableValue<V, IsIndexed, '$gt'>;
|
|
28
|
+
$lt?: ComparableValue<V, IsIndexed, '$lt'>;
|
|
29
|
+
$gte?: ComparableValue<V, IsIndexed, '$gte'>;
|
|
30
|
+
$lte?: ComparableValue<V, IsIndexed, '$lte'>;
|
|
31
|
+
$like?: StringPattern<V, IsIndexed, '$like'>;
|
|
32
|
+
$ilike?: StringPattern<V, IsIndexed, '$ilike'>;
|
|
33
|
+
$isNull?: boolean;
|
|
34
|
+
}
|
|
35
|
+
type ComparableValue<V, IsIndexed, Op extends string> = [V] extends [
|
|
36
|
+
string | number | boolean | Date
|
|
37
|
+
] ? IsIndexed extends true ? WireValue<V> : `QERR_WHERE_OPERATOR_INVALID: Operator ${Op} is only available for indexed fields with a checked type.` : `QERR_WHERE_OPERATOR_INVALID: Operator ${Op} is only available for indexed fields with a checked type.`;
|
|
38
|
+
type StringPattern<V, IsIndexed, Op extends string> = [V] extends [string] ? IsIndexed extends true ? string : `QERR_WHERE_OPERATOR_INVALID: Operator ${Op} is only available for indexed string fields.` : `QERR_WHERE_OPERATOR_INVALID: Operator ${Op} is only available for indexed string fields.`;
|
|
39
|
+
type FieldWhereValue<A> = A extends DataAttrDef<infer V, infer R, infer I, any> ? WireValue<V> | IdbWhereOps<V, R, I> | undefined : never;
|
|
40
|
+
type IdAttr = DataAttrDef<string, false, true, true>;
|
|
41
|
+
/**
|
|
42
|
+
* The where shape: fields, `id`, link labels (matching the linked entity's
|
|
43
|
+
* id), one enumerated hop of `label.field` dot-paths, and `and`/`or`.
|
|
44
|
+
* Deeper dot-paths (up to 3 hops) are accepted via validation rather than
|
|
45
|
+
* enumerated here. `undefined` values (`$skip`) drop the clause.
|
|
46
|
+
*/
|
|
47
|
+
export type IdbWhereShape<S extends IdbSchema, NS extends string> = {
|
|
48
|
+
[F in FieldKeys<S, NS>]?: FieldWhereValue<AttrsOf<S, NS>[F]>;
|
|
49
|
+
} & {
|
|
50
|
+
[L in LinkLabels<S, NS>]?: FieldWhereValue<IdAttr>;
|
|
51
|
+
} & {
|
|
52
|
+
[P in DotPathsOneHop<S, NS>]?: FieldWhereValue<WhereKeyAttr<S, NS, P>>;
|
|
53
|
+
} & {
|
|
54
|
+
id?: FieldWhereValue<IdAttr>;
|
|
55
|
+
and?: readonly IdbWhereShape<S, NS>[];
|
|
56
|
+
or?: readonly IdbWhereShape<S, NS>[];
|
|
57
|
+
};
|
|
58
|
+
type DotPathsOneHop<S extends IdbSchema, NS extends string> = {
|
|
59
|
+
[L in LinkLabels<S, NS>]: `${L}.${FieldKeys<S, LinkTarget<S, NS, L>> | 'id'}`;
|
|
60
|
+
}[LinkLabels<S, NS>];
|
|
61
|
+
/** Resolve the attr def a where key addresses — fields, id, labels, dot-paths ≤ 3 hops. */
|
|
62
|
+
export type WhereKeyAttr<S extends IdbSchema, NS extends string, K extends string, D extends Depth = []> = K extends FieldKeys<S, NS> ? AttrsOf<S, NS>[K] : K extends 'id' ? IdAttr : K extends `${infer L}.${infer Rest}` ? L extends LinkLabels<S, NS> ? D['length'] extends MaxHops ? never : WhereKeyAttr<S, LinkTarget<S, NS, L>, Rest, NextHop<D>> : never : K extends LinkLabels<S, NS> ? IdAttr : never;
|
|
63
|
+
/** Direct indexed fields and `serverCreatedAt` — ordering never traverses links. */
|
|
64
|
+
export type IdbOrderShape<S extends IdbSchema, NS extends string> = {
|
|
65
|
+
[K in IndexedFieldKeys<S, NS> | 'serverCreatedAt']?: 'asc' | 'desc';
|
|
66
|
+
};
|
|
67
|
+
/** The `fields` array type for a namespace. */
|
|
68
|
+
export type IdbQueryFields<NS extends IdbNamespaceName<S>, S extends IdbSchema = IdbRegisteredSchema> = (FieldKeys<S, NS> | 'id')[];
|
|
69
|
+
/**
|
|
70
|
+
* One `$m` transform:
|
|
71
|
+
* - `indexBy` — a unique field (or `id`); yields `Record<string, Entity>`
|
|
72
|
+
* - `groupBy` — a primitive field; yields `Record<string, Entity[]>`
|
|
73
|
+
* - `at` — a position (negative from the end); yields `Entity | undefined`
|
|
74
|
+
*/
|
|
75
|
+
export type IdbMTransform<S extends IdbSchema, NS extends string> = {
|
|
76
|
+
indexBy: UniqueFieldKeys<S, NS> | 'id';
|
|
77
|
+
} | {
|
|
78
|
+
groupBy: PrimitiveFieldKeys<S, NS>;
|
|
79
|
+
} | {
|
|
80
|
+
at: number;
|
|
81
|
+
};
|
|
82
|
+
export type IdbMBlock<S extends IdbSchema, NS extends string> = Record<string, IdbMTransform<S, NS>>;
|
|
83
|
+
interface IdbDuxDollarKeys {
|
|
84
|
+
/** Coerce this scope to `Entity | undefined` and singularize its key. */
|
|
85
|
+
$only?: true;
|
|
86
|
+
/** Pick the element at this position (negative from the end); singularizes the key. */
|
|
87
|
+
$at?: number;
|
|
88
|
+
/** Rename this scope's result key explicitly — always wins. */
|
|
89
|
+
$as?: string;
|
|
90
|
+
}
|
|
91
|
+
interface IdbPaginationKeys {
|
|
92
|
+
last?: number;
|
|
93
|
+
first?: number;
|
|
94
|
+
offset?: number;
|
|
95
|
+
after?: Cursor;
|
|
96
|
+
afterInclusive?: boolean;
|
|
97
|
+
before?: Cursor;
|
|
98
|
+
beforeInclusive?: boolean;
|
|
99
|
+
}
|
|
100
|
+
export type IdbDollar<S extends IdbSchema, NS extends string, TopLevel extends boolean> = {
|
|
101
|
+
where?: IdbWhereShape<S, NS>;
|
|
102
|
+
order?: IdbOrderShape<S, NS>;
|
|
103
|
+
fields?: readonly (FieldKeys<S, NS> | 'id')[];
|
|
104
|
+
limit?: number;
|
|
105
|
+
} & IdbDuxDollarKeys & (TopLevel extends true ? IdbPaginationKeys : {});
|
|
106
|
+
/** One scope of a query: `$`, `$m`, and nested link labels (3 hops, then open). */
|
|
107
|
+
export type IdbQueryNode<S extends IdbSchema, NS extends string, D extends Depth = [], TopLevel extends boolean = false> = D['length'] extends MaxHops ? Record<string, any> : {
|
|
108
|
+
$?: IdbDollar<S, NS, TopLevel>;
|
|
109
|
+
$m?: IdbMBlock<S, NS>;
|
|
110
|
+
} & {
|
|
111
|
+
[L in LinkLabels<S, NS>]?: IdbQueryNode<S, LinkTarget<S, NS, L>, NextHop<D>>;
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* The valid-query-object type — handy for function params. Authoring
|
|
115
|
+
* completions for `q`/`useQuery` literals come from this shape; per-call
|
|
116
|
+
* validation is `IdbValidQuery` (`validation.ts`).
|
|
117
|
+
*/
|
|
118
|
+
export type IdbQuery<S extends IdbSchema = IdbRegisteredSchema> = {
|
|
119
|
+
[NS in IdbNamespaceName<S>]?: IdbQueryNode<S, NS, [], true>;
|
|
120
|
+
};
|
|
121
|
+
/** The subquery shape for one namespace — what `IdbQueryEntity` accepts. */
|
|
122
|
+
export type IdbQuerySubquery<NS extends IdbNamespaceName<S>, S extends IdbSchema = IdbRegisteredSchema> = IdbQueryNode<S, NS>;
|
|
123
|
+
type EntityFields<S extends IdbSchema, NS extends string, Node> = Node extends {
|
|
124
|
+
$: {
|
|
125
|
+
fields: infer F extends readonly string[];
|
|
126
|
+
};
|
|
127
|
+
} ? Pick<ResolveAttrs<S['entities'], NS, false>, Exclude<F[number], 'id'> & keyof ResolveAttrs<S['entities'], NS, false>> : ResolveAttrs<S['entities'], NS, false>;
|
|
128
|
+
type ChildKeys<Node> = Exclude<keyof Node & string, '$' | '$m'>;
|
|
129
|
+
type ShapedChildren<S extends IdbSchema, NS extends string, Node> = {
|
|
130
|
+
[L in ChildKeys<Node> as L extends LinkLabels<S, NS> ? ResolvedScopeKey<S, NS, L, Node[L]> : never]: L extends LinkLabels<S, NS> ? ChildData<S, NS, L, Node[L]> : never;
|
|
131
|
+
};
|
|
132
|
+
type ChildData<S extends IdbSchema, NS extends string, L extends LinkLabels<S, NS>, Node> = HasPick<Node> extends true ? ShapedEntity<S, LinkTarget<S, NS, L>, Node> | undefined : LinkCardinality<S, NS, L> extends 'one' ? ShapedEntity<S, LinkTarget<S, NS, L>, Node> | undefined : ShapedEntity<S, LinkTarget<S, NS, L>, Node>[];
|
|
133
|
+
type MValue<T, E> = T extends {
|
|
134
|
+
indexBy: any;
|
|
135
|
+
} ? Record<string, E> : T extends {
|
|
136
|
+
groupBy: any;
|
|
137
|
+
} ? Record<string, E[]> : T extends {
|
|
138
|
+
at: number;
|
|
139
|
+
} ? E | undefined : never;
|
|
140
|
+
/** The `$m` sibling keys a scope contributes beside its own result key. */
|
|
141
|
+
type MSiblings<S extends IdbSchema, NS extends string, Node> = Node extends {
|
|
142
|
+
$m: infer M;
|
|
143
|
+
} ? {
|
|
144
|
+
-readonly [Label in keyof M]: MValue<M[Label], ShapedEntity<S, NS, Node>>;
|
|
145
|
+
} : {};
|
|
146
|
+
type ChildrenMSiblings<S extends IdbSchema, NS extends string, Node> = [
|
|
147
|
+
ChildKeys<Node>
|
|
148
|
+
] extends [never] ? {} : UnionToIntersection<{
|
|
149
|
+
[L in ChildKeys<Node>]: L extends LinkLabels<S, NS> ? MSiblings<S, LinkTarget<S, NS, L>, Node[L]> : {};
|
|
150
|
+
}[ChildKeys<Node>]>;
|
|
151
|
+
type ShapedEntity<S extends IdbSchema, NS extends string, Node> = Expand<{
|
|
152
|
+
id: string;
|
|
153
|
+
} & EntityFields<S, NS, Node> & ShapedChildren<S, NS, Node> & ChildrenMSiblings<S, NS, Node>>;
|
|
154
|
+
/**
|
|
155
|
+
* An entity shaped by query syntax — `$` and `$m` fully supported, including
|
|
156
|
+
* `$: { fields }`.
|
|
157
|
+
*/
|
|
158
|
+
export type IdbQueryEntity<NS extends IdbNamespaceName<S>, Subquery = {}, S extends IdbSchema = IdbRegisteredSchema> = ShapedEntity<S, NS, Subquery>;
|
|
159
|
+
type TopScopeData<S extends IdbSchema, NS extends string, Node> = HasPick<Node> extends true ? ShapedEntity<S, NS, Node> | undefined : ShapedEntity<S, NS, Node>[];
|
|
160
|
+
type TopMSiblings<Q, S extends IdbSchema> = [keyof Q] extends [never] ? {} : UnionToIntersection<{
|
|
161
|
+
[K in keyof Q & string]: K extends IdbNamespaceName<S> ? MSiblings<S, K, Q[K]> : {};
|
|
162
|
+
}[keyof Q & string]>;
|
|
163
|
+
/**
|
|
164
|
+
* The shaped data for a query — the exact shape `useQuery`, `queryOnce`, and
|
|
165
|
+
* `adminDb.query` deliver: normalized arrays, `$only`/`$at` coercion,
|
|
166
|
+
* singularized/`$as` keys, `$m` siblings.
|
|
167
|
+
*/
|
|
168
|
+
export type IdbQueryData<Q, S extends IdbSchema = IdbRegisteredSchema> = Expand<{
|
|
169
|
+
[K in keyof Q & string as K extends IdbNamespaceName<S> ? ResolvedScopeKey<S, null, K, Q[K]> : never]: K extends IdbNamespaceName<S> ? TopScopeData<S, K, Q[K]> : never;
|
|
170
|
+
} & TopMSiblings<Q, S>>;
|
|
171
|
+
type NamespaceRuleParams<RP> = RP extends Record<string, DataAttrDef<any, any, any, any>> ? {
|
|
172
|
+
[K in keyof RP]?: AttrValue<RP[K]>;
|
|
173
|
+
} : {};
|
|
174
|
+
/**
|
|
175
|
+
* Every rule param declared in the schema, merged and optional — the
|
|
176
|
+
* query-level companion to the per-namespace tx typing.
|
|
177
|
+
*/
|
|
178
|
+
export type IdbSchemaRuleParams<S extends IdbSchema = IdbRegisteredSchema> = Expand<UnionToIntersection<{
|
|
179
|
+
[NS in keyof S['$dux']['namespaces']]: NamespaceRuleParams<S['$dux']['namespaces'][NS]['ruleParams']>;
|
|
180
|
+
}[keyof S['$dux']['namespaces']]>>;
|
|
181
|
+
/** Per-call query options — `ruleParams` typed from the schema. */
|
|
182
|
+
export interface IdbQueryOptions<S extends IdbSchema = IdbRegisteredSchema> {
|
|
183
|
+
ruleParams: IdbSchemaRuleParams<S>;
|
|
184
|
+
}
|
|
185
|
+
/** Pagination cursors, keyed by the query's top-level namespace keys. */
|
|
186
|
+
export type IdbQueryPageInfo<Q = Record<string, unknown>> = PageInfoResponse<Q>;
|
|
187
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/query/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/query/types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * The query-domain types: the authoring shape (`IdbQuery` and its node\n * types — also the completion source for `q`/`useQuery` literals), the\n * type-level shaping mirror (`IdbQueryData`, `IdbQueryEntity`), and the\n * renamed official types (`IdbQueryPageInfo`, `IdbQueryOptions`, …).\n */\nimport type {\n Cursor,\n DataAttrDef,\n PageInfoResponse,\n ResolveAttrs,\n} from '@instantdb/core'\nimport type { IdbSchema } from '../schema/defineSchema.js'\nimport type {\n AttrsOf,\n AttrValue,\n FieldKeys,\n IndexedFieldKeys,\n LinkCardinality,\n LinkLabels,\n LinkTarget,\n PrimitiveFieldKeys,\n UniqueFieldKeys,\n WireValue,\n} from '../schema/fields.js'\nimport type { IdbRegisteredSchema } from '../schema/register.js'\nimport type { IdbNamespaceName } from '../schema/types.js'\nimport type { Expand, UnionToIntersection } from '../schema/util.js'\nimport type { HasPick, ResolvedScopeKey } from './keys.js'\n\nexport type {\n FieldKeys,\n IndexedFieldKeys,\n LinkLabels,\n LinkTarget,\n UniqueFieldKeys,\n WireValue,\n} from '../schema/fields.js'\n\n// ==========\n// hop counting — validation and completions stop at 3 hops (matches core)\n\ntype Depth = readonly unknown[]\nexport type MaxHops = 3\nexport type NextHop<D extends Depth> = D['length'] extends MaxHops ? D : [...D, unknown]\n\n// ==========\n// where authoring\n\n/**\n * The operator object for one field. Every operator is present so the\n * completion list and the diagnostic are both intentional: operators the\n * field doesn't support are typed as the `QERR_*` message explaining why.\n */\nexport interface IdbWhereOps<V, _IsRequired, IsIndexed> {\n $in?: readonly WireValue<V>[]\n $not?: WireValue<V>\n $ne?: WireValue<V>\n $gt?: ComparableValue<V, IsIndexed, '$gt'>\n $lt?: ComparableValue<V, IsIndexed, '$lt'>\n $gte?: ComparableValue<V, IsIndexed, '$gte'>\n $lte?: ComparableValue<V, IsIndexed, '$lte'>\n $like?: StringPattern<V, IsIndexed, '$like'>\n $ilike?: StringPattern<V, IsIndexed, '$ilike'>\n $isNull?: boolean\n}\n\ntype ComparableValue<V, IsIndexed, Op extends string> = [V] extends [\n string | number | boolean | Date,\n]\n ? IsIndexed extends true\n ? WireValue<V>\n : `QERR_WHERE_OPERATOR_INVALID: Operator ${Op} is only available for indexed fields with a checked type.`\n : `QERR_WHERE_OPERATOR_INVALID: Operator ${Op} is only available for indexed fields with a checked type.`\n\ntype StringPattern<V, IsIndexed, Op extends string> = [V] extends [string]\n ? IsIndexed extends true\n ? string\n : `QERR_WHERE_OPERATOR_INVALID: Operator ${Op} is only available for indexed string fields.`\n : `QERR_WHERE_OPERATOR_INVALID: Operator ${Op} is only available for indexed string fields.`\n\ntype FieldWhereValue<A> = A extends DataAttrDef<infer V, infer R, infer I, any>\n ? WireValue<V> | IdbWhereOps<V, R, I> | undefined\n : never\n\ntype IdAttr = DataAttrDef<string, false, true, true>\n\n/**\n * The where shape: fields, `id`, link labels (matching the linked entity's\n * id), one enumerated hop of `label.field` dot-paths, and `and`/`or`.\n * Deeper dot-paths (up to 3 hops) are accepted via validation rather than\n * enumerated here. `undefined` values (`$skip`) drop the clause.\n */\nexport type IdbWhereShape<S extends IdbSchema, NS extends string> = {\n [F in FieldKeys<S, NS>]?: FieldWhereValue<AttrsOf<S, NS>[F]>\n} & {\n [L in LinkLabels<S, NS>]?: FieldWhereValue<IdAttr>\n} & {\n [P in DotPathsOneHop<S, NS>]?: FieldWhereValue<WhereKeyAttr<S, NS, P>>\n} & {\n id?: FieldWhereValue<IdAttr>\n and?: readonly IdbWhereShape<S, NS>[]\n or?: readonly IdbWhereShape<S, NS>[]\n}\n\ntype DotPathsOneHop<S extends IdbSchema, NS extends string> = {\n [L in LinkLabels<S, NS>]: `${L}.${FieldKeys<S, LinkTarget<S, NS, L>> | 'id'}`\n}[LinkLabels<S, NS>]\n\n/** Resolve the attr def a where key addresses — fields, id, labels, dot-paths ≤ 3 hops. */\nexport type WhereKeyAttr<\n S extends IdbSchema,\n NS extends string,\n K extends string,\n D extends Depth = [],\n> = K extends FieldKeys<S, NS>\n ? AttrsOf<S, NS>[K]\n : K extends 'id'\n ? IdAttr\n : K extends `${infer L}.${infer Rest}`\n ? L extends LinkLabels<S, NS>\n ? D['length'] extends MaxHops\n ? never\n : WhereKeyAttr<S, LinkTarget<S, NS, L>, Rest, NextHop<D>>\n : never\n : K extends LinkLabels<S, NS>\n ? IdAttr\n : never\n\n// ==========\n// order, fields, $m authoring\n\n/** Direct indexed fields and `serverCreatedAt` — ordering never traverses links. */\nexport type IdbOrderShape<S extends IdbSchema, NS extends string> = {\n [K in IndexedFieldKeys<S, NS> | 'serverCreatedAt']?: 'asc' | 'desc'\n}\n\n/** The `fields` array type for a namespace. */\nexport type IdbQueryFields<\n NS extends IdbNamespaceName<S>,\n S extends IdbSchema = IdbRegisteredSchema,\n> = (FieldKeys<S, NS> | 'id')[]\n\n/**\n * One `$m` transform:\n * - `indexBy` — a unique field (or `id`); yields `Record<string, Entity>`\n * - `groupBy` — a primitive field; yields `Record<string, Entity[]>`\n * - `at` — a position (negative from the end); yields `Entity | undefined`\n */\nexport type IdbMTransform<S extends IdbSchema, NS extends string>\n = | { indexBy: UniqueFieldKeys<S, NS> | 'id' }\n | { groupBy: PrimitiveFieldKeys<S, NS> }\n | { at: number }\n\nexport type IdbMBlock<S extends IdbSchema, NS extends string> = Record<\n string,\n IdbMTransform<S, NS>\n>\n\n// ==========\n// the authoring shape\n\ninterface IdbDuxDollarKeys {\n /** Coerce this scope to `Entity | undefined` and singularize its key. */\n $only?: true\n /** Pick the element at this position (negative from the end); singularizes the key. */\n $at?: number\n /** Rename this scope's result key explicitly — always wins. */\n $as?: string\n}\n\ninterface IdbPaginationKeys {\n last?: number\n first?: number\n offset?: number\n after?: Cursor\n afterInclusive?: boolean\n before?: Cursor\n beforeInclusive?: boolean\n}\n\nexport type IdbDollar<\n S extends IdbSchema,\n NS extends string,\n TopLevel extends boolean,\n> = {\n where?: IdbWhereShape<S, NS>\n order?: IdbOrderShape<S, NS>\n fields?: readonly (FieldKeys<S, NS> | 'id')[]\n limit?: number\n} & IdbDuxDollarKeys\n& (TopLevel extends true ? IdbPaginationKeys : {})\n\n/** One scope of a query: `$`, `$m`, and nested link labels (3 hops, then open). */\nexport type IdbQueryNode<\n S extends IdbSchema,\n NS extends string,\n D extends Depth = [],\n TopLevel extends boolean = false,\n> = D['length'] extends MaxHops\n ? Record<string, any>\n : {\n $?: IdbDollar<S, NS, TopLevel>\n $m?: IdbMBlock<S, NS>\n } & {\n [L in LinkLabels<S, NS>]?: IdbQueryNode<S, LinkTarget<S, NS, L>, NextHop<D>>\n }\n\n/**\n * The valid-query-object type — handy for function params. Authoring\n * completions for `q`/`useQuery` literals come from this shape; per-call\n * validation is `IdbValidQuery` (`validation.ts`).\n */\nexport type IdbQuery<S extends IdbSchema = IdbRegisteredSchema> = {\n [NS in IdbNamespaceName<S>]?: IdbQueryNode<S, NS, [], true>\n}\n\n/** The subquery shape for one namespace — what `IdbQueryEntity` accepts. */\nexport type IdbQuerySubquery<\n NS extends IdbNamespaceName<S>,\n S extends IdbSchema = IdbRegisteredSchema,\n> = IdbQueryNode<S, NS>\n\n// ==========\n// the shaping mirror — must agree with shapeResult.ts by construction\n\ntype EntityFields<S extends IdbSchema, NS extends string, Node> = Node extends {\n $: { fields: infer F extends readonly string[] }\n}\n ? Pick<\n ResolveAttrs<S['entities'], NS, false>,\n Exclude<F[number], 'id'> & keyof ResolveAttrs<S['entities'], NS, false>\n >\n : ResolveAttrs<S['entities'], NS, false>\n\ntype ChildKeys<Node> = Exclude<keyof Node & string, '$' | '$m'>\n\ntype ShapedChildren<S extends IdbSchema, NS extends string, Node> = {\n [L in ChildKeys<Node> as L extends LinkLabels<S, NS>\n ? ResolvedScopeKey<S, NS, L, Node[L]>\n : never]: L extends LinkLabels<S, NS> ? ChildData<S, NS, L, Node[L]> : never\n}\n\ntype ChildData<\n S extends IdbSchema,\n NS extends string,\n L extends LinkLabels<S, NS>,\n Node,\n> = HasPick<Node> extends true\n ? ShapedEntity<S, LinkTarget<S, NS, L>, Node> | undefined\n : LinkCardinality<S, NS, L> extends 'one'\n ? ShapedEntity<S, LinkTarget<S, NS, L>, Node> | undefined\n : ShapedEntity<S, LinkTarget<S, NS, L>, Node>[]\n\ntype MValue<T, E> = T extends { indexBy: any }\n ? Record<string, E>\n : T extends { groupBy: any }\n ? Record<string, E[]>\n : T extends { at: number }\n ? E | undefined\n : never\n\n/** The `$m` sibling keys a scope contributes beside its own result key. */\ntype MSiblings<S extends IdbSchema, NS extends string, Node> = Node extends {\n $m: infer M\n}\n ? { -readonly [Label in keyof M]: MValue<M[Label], ShapedEntity<S, NS, Node>> }\n : {}\n\ntype ChildrenMSiblings<S extends IdbSchema, NS extends string, Node> = [\n ChildKeys<Node>,\n] extends [never]\n ? {}\n : UnionToIntersection<\n {\n [L in ChildKeys<Node>]: L extends LinkLabels<S, NS>\n ? MSiblings<S, LinkTarget<S, NS, L>, Node[L]>\n : {}\n }[ChildKeys<Node>]\n >\n\ntype ShapedEntity<S extends IdbSchema, NS extends string, Node> = Expand<\n { id: string } & EntityFields<S, NS, Node>\n & ShapedChildren<S, NS, Node>\n & ChildrenMSiblings<S, NS, Node>\n>\n\n/**\n * An entity shaped by query syntax — `$` and `$m` fully supported, including\n * `$: { fields }`.\n */\nexport type IdbQueryEntity<\n NS extends IdbNamespaceName<S>,\n Subquery = {},\n S extends IdbSchema = IdbRegisteredSchema,\n> = ShapedEntity<S, NS, Subquery>\n\ntype TopScopeData<S extends IdbSchema, NS extends string, Node>\n = HasPick<Node> extends true\n ? ShapedEntity<S, NS, Node> | undefined\n : ShapedEntity<S, NS, Node>[]\n\ntype TopMSiblings<Q, S extends IdbSchema> = [keyof Q] extends [never]\n ? {}\n : UnionToIntersection<\n {\n [K in keyof Q & string]: K extends IdbNamespaceName<S>\n ? MSiblings<S, K, Q[K]>\n : {}\n }[keyof Q & string]\n >\n\n/**\n * The shaped data for a query — the exact shape `useQuery`, `queryOnce`, and\n * `adminDb.query` deliver: normalized arrays, `$only`/`$at` coercion,\n * singularized/`$as` keys, `$m` siblings.\n */\nexport type IdbQueryData<Q, S extends IdbSchema = IdbRegisteredSchema> = Expand<\n {\n [K in keyof Q & string as K extends IdbNamespaceName<S>\n ? ResolvedScopeKey<S, null, K, Q[K]>\n : never]: K extends IdbNamespaceName<S> ? TopScopeData<S, K, Q[K]> : never\n } & TopMSiblings<Q, S>\n>\n\n// ==========\n// options + pageInfo\n\ntype NamespaceRuleParams<RP> = RP extends Record<string, DataAttrDef<any, any, any, any>>\n ? { [K in keyof RP]?: AttrValue<RP[K]> }\n : {}\n\n/**\n * Every rule param declared in the schema, merged and optional — the\n * query-level companion to the per-namespace tx typing.\n */\nexport type IdbSchemaRuleParams<S extends IdbSchema = IdbRegisteredSchema> = Expand<\n UnionToIntersection<\n {\n [NS in keyof S['$dux']['namespaces']]: NamespaceRuleParams<\n S['$dux']['namespaces'][NS]['ruleParams']\n >\n }[keyof S['$dux']['namespaces']]\n >\n>\n\n/** Per-call query options — `ruleParams` typed from the schema. */\nexport interface IdbQueryOptions<S extends IdbSchema = IdbRegisteredSchema> {\n ruleParams: IdbSchemaRuleParams<S>\n}\n\n/** Pagination cursors, keyed by the query's top-level namespace keys. */\nexport type IdbQueryPageInfo<Q = Record<string, unknown>> = PageInfoResponse<Q>\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one validation surface — applied by `q`, `defineQuery`, and every
|
|
3
|
+
* query-accepting API on `/vue` and `/admin`.
|
|
4
|
+
*
|
|
5
|
+
* `IdbValidQuery<Q, S>` is an intersection of two arms:
|
|
6
|
+
*
|
|
7
|
+
* 1. the input-independent authoring shape (`IdbQuery<S>`, `types.ts`) —
|
|
8
|
+
* completions and structural/value checking;
|
|
9
|
+
* 2. an input-mapped arm that re-walks the *user's* keys and types each
|
|
10
|
+
* violation as a `QERR_*` message string, so the error lands on the
|
|
11
|
+
* offending key and carries an actionable, stable-coded message.
|
|
12
|
+
*
|
|
13
|
+
* Valid positions in arm 2 resolve to `unknown` (the intersection identity),
|
|
14
|
+
* so it adds nothing where the query is fine.
|
|
15
|
+
*
|
|
16
|
+
* The `QERR_*` codes: ROOT_KEY_UNKNOWN, NESTED_KEY_UNKNOWN, OPTION_UNKNOWN,
|
|
17
|
+
* OPTION_TOP_LEVEL_ONLY, WHERE_KEY_UNKNOWN, WHERE_VALUE_TYPE,
|
|
18
|
+
* WHERE_OPERATOR_INVALID (lives in the ops shape, `types.ts`),
|
|
19
|
+
* ORDER_KEY_INVALID, M_LABEL_COLLISION, M_TRANSFORM_UNKNOWN,
|
|
20
|
+
* M_INDEXBY_NOT_UNIQUE, M_GROUPBY_NOT_PRIMITIVE.
|
|
21
|
+
*/
|
|
22
|
+
import type { DataAttrDef } from '@instantdb/core';
|
|
23
|
+
import type { IdbSchema } from '../schema/defineSchema.js';
|
|
24
|
+
import type { IdbNamespaceName } from '../schema/types.js';
|
|
25
|
+
import type { ResolvedScopeKey } from './keys.js';
|
|
26
|
+
import type { FieldKeys, IdbQuery, IndexedFieldKeys, LinkLabels, LinkTarget, MaxHops, NextHop, UniqueFieldKeys, WhereKeyAttr, WireValue } from './types.js';
|
|
27
|
+
type Depth = readonly unknown[];
|
|
28
|
+
type TypeName<V> = V extends string ? 'string' : V extends number ? 'number' : V extends boolean ? 'boolean' : V extends Date ? 'date' : 'json';
|
|
29
|
+
type SharedDollarKeys = 'where' | 'order' | 'fields' | 'limit' | '$only' | '$at' | '$as';
|
|
30
|
+
type PaginationKeys = 'last' | 'first' | 'offset' | 'after' | 'afterInclusive' | 'before' | 'beforeInclusive';
|
|
31
|
+
type ValidDollar<Dollar, S extends IdbSchema, NS extends string, TopLevel extends boolean> = Dollar extends object ? {
|
|
32
|
+
[K in keyof Dollar & string]: K extends 'where' ? ValidWhere<Dollar[K], S, NS> : K extends 'order' ? ValidOrder<Dollar[K], S, NS> : K extends SharedDollarKeys ? unknown : K extends PaginationKeys ? TopLevel extends true ? unknown : `QERR_QUERY_OPTION_TOP_LEVEL_ONLY: ${K} is only available on top-level scopes` : `QERR_QUERY_OPTION_UNKNOWN: ${K} is not a valid query option`;
|
|
33
|
+
} : unknown;
|
|
34
|
+
type ValidWhere<W, S extends IdbSchema, NS extends string> = W extends object ? {
|
|
35
|
+
[K in keyof W & string]: K extends 'and' | 'or' ? ValidWhereList<W[K], S, NS> : [WhereKeyAttr<S, NS, K>] extends [never] ? `QERR_WHERE_KEY_UNKNOWN: ${K} is not a valid where key on ${NS}` : WhereKeyAttr<S, NS, K> extends DataAttrDef<infer V, any, any, any> ? ValidWhereValue<W[K], V, K> : `QERR_WHERE_KEY_UNKNOWN: ${K} is not a valid where key on ${NS}`;
|
|
36
|
+
} : unknown;
|
|
37
|
+
type ValidWhereList<L, S extends IdbSchema, NS extends string> = L extends readonly any[] ? {
|
|
38
|
+
[I in keyof L]: ValidWhere<L[I], S, NS>;
|
|
39
|
+
} : unknown;
|
|
40
|
+
type ValidWhereValue<Input, V, K extends string> = Input extends undefined ? unknown : Input extends WireValue<V> ? unknown : Input extends object ? unknown : `QERR_WHERE_VALUE_TYPE: Type '${TypeName<Input>}' is not assignable to field '${K}' of type ${TypeName<V>}`;
|
|
41
|
+
type ValidOrder<O, S extends IdbSchema, NS extends string> = O extends object ? {
|
|
42
|
+
[K in keyof O & string]: K extends IndexedFieldKeys<S, NS> | 'serverCreatedAt' ? unknown : `QERR_ORDER_KEY_INVALID: ${K} is not orderable — order accepts indexed fields and serverCreatedAt`;
|
|
43
|
+
} : unknown;
|
|
44
|
+
type ValidM<M, S extends IdbSchema, NS extends string, OwnKey extends string> = M extends object ? {
|
|
45
|
+
[Label in keyof M & string]: Label extends OwnKey ? `QERR_M_LABEL_COLLISION: ${Label} collides with the scope's own result key` : ValidMTransform<M[Label], S, NS>;
|
|
46
|
+
} : unknown;
|
|
47
|
+
type ValidMTransform<T, S extends IdbSchema, NS extends string> = T extends object ? {
|
|
48
|
+
[K in keyof T & string]: K extends 'indexBy' ? T[K] extends UniqueFieldKeys<S, NS> | 'id' ? unknown : `QERR_M_INDEXBY_NOT_UNIQUE: indexBy requires a unique field on ${NS}` : K extends 'groupBy' ? T[K] extends FieldKeys<S, NS> ? unknown : `QERR_M_GROUPBY_NOT_PRIMITIVE: groupBy requires a string, number, or boolean field on ${NS}` : K extends 'at' ? unknown : `QERR_M_TRANSFORM_UNKNOWN: ${K} is not a valid $m transform — use indexBy, groupBy, or at`;
|
|
49
|
+
} : unknown;
|
|
50
|
+
type ValidNode<Node, S extends IdbSchema, NS extends string, ParentNS extends string | null, Key extends string, D extends Depth, TopLevel extends boolean> = Node extends object ? {
|
|
51
|
+
[K in keyof Node & string]: K extends '$' ? ValidDollar<Node[K], S, NS, TopLevel> : K extends '$m' ? ValidM<Node[K], S, NS, ResolvedScopeKey<S, ParentNS, Key, Node>> : K extends LinkLabels<S, NS> ? ValidNode<Node[K], S, LinkTarget<S, NS, K>, NS, K, NextHop<D>, false> : D['length'] extends MaxHops ? unknown : `QERR_QUERY_NESTED_KEY_UNKNOWN: ${K} is not a valid nested key on ${NS}`;
|
|
52
|
+
} : unknown;
|
|
53
|
+
/**
|
|
54
|
+
* The per-call validating type. Use as a self-referential constraint:
|
|
55
|
+
* `<Q extends IdbValidQuery<Q, S>>(query: Q)`.
|
|
56
|
+
*/
|
|
57
|
+
export type IdbValidQuery<Q, S extends IdbSchema> = IdbQuery<S> & {
|
|
58
|
+
[K in keyof Q & string]: K extends IdbNamespaceName<S> ? ValidNode<Q[K], S, K, null, K, [], true> : `QERR_QUERY_ROOT_KEY_UNKNOWN: ${K} is not a valid top-level namespace`;
|
|
59
|
+
};
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/query/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/query/validation.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * The one validation surface — applied by `q`, `defineQuery`, and every\n * query-accepting API on `/vue` and `/admin`.\n *\n * `IdbValidQuery<Q, S>` is an intersection of two arms:\n *\n * 1. the input-independent authoring shape (`IdbQuery<S>`, `types.ts`) —\n * completions and structural/value checking;\n * 2. an input-mapped arm that re-walks the *user's* keys and types each\n * violation as a `QERR_*` message string, so the error lands on the\n * offending key and carries an actionable, stable-coded message.\n *\n * Valid positions in arm 2 resolve to `unknown` (the intersection identity),\n * so it adds nothing where the query is fine.\n *\n * The `QERR_*` codes: ROOT_KEY_UNKNOWN, NESTED_KEY_UNKNOWN, OPTION_UNKNOWN,\n * OPTION_TOP_LEVEL_ONLY, WHERE_KEY_UNKNOWN, WHERE_VALUE_TYPE,\n * WHERE_OPERATOR_INVALID (lives in the ops shape, `types.ts`),\n * ORDER_KEY_INVALID, M_LABEL_COLLISION, M_TRANSFORM_UNKNOWN,\n * M_INDEXBY_NOT_UNIQUE, M_GROUPBY_NOT_PRIMITIVE.\n */\nimport type { DataAttrDef } from '@instantdb/core'\nimport type { IdbSchema } from '../schema/defineSchema.js'\nimport type { IdbNamespaceName } from '../schema/types.js'\nimport type { ResolvedScopeKey } from './keys.js'\nimport type {\n FieldKeys,\n IdbQuery,\n IndexedFieldKeys,\n LinkLabels,\n LinkTarget,\n MaxHops,\n NextHop,\n UniqueFieldKeys,\n WhereKeyAttr,\n WireValue,\n} from './types.js'\n\ntype Depth = readonly unknown[]\n\ntype TypeName<V> = V extends string\n ? 'string'\n : V extends number\n ? 'number'\n : V extends boolean\n ? 'boolean'\n : V extends Date\n ? 'date'\n : 'json'\n\n// ==========\n// $ validation\n\ntype SharedDollarKeys = 'where' | 'order' | 'fields' | 'limit' | '$only' | '$at' | '$as'\ntype PaginationKeys\n = | 'last'\n | 'first'\n | 'offset'\n | 'after'\n | 'afterInclusive'\n | 'before'\n | 'beforeInclusive'\n\ntype ValidDollar<\n Dollar,\n S extends IdbSchema,\n NS extends string,\n TopLevel extends boolean,\n> = Dollar extends object\n ? {\n [K in keyof Dollar & string]: K extends 'where'\n ? ValidWhere<Dollar[K], S, NS>\n : K extends 'order'\n ? ValidOrder<Dollar[K], S, NS>\n : K extends SharedDollarKeys\n ? unknown\n : K extends PaginationKeys\n ? TopLevel extends true\n ? unknown\n : `QERR_QUERY_OPTION_TOP_LEVEL_ONLY: ${K} is only available on top-level scopes`\n : `QERR_QUERY_OPTION_UNKNOWN: ${K} is not a valid query option`\n }\n : unknown\n\n// ==========\n// where validation\n\ntype ValidWhere<W, S extends IdbSchema, NS extends string> = W extends object\n ? {\n [K in keyof W & string]: K extends 'and' | 'or'\n ? ValidWhereList<W[K], S, NS>\n : [WhereKeyAttr<S, NS, K>] extends [never]\n ? `QERR_WHERE_KEY_UNKNOWN: ${K} is not a valid where key on ${NS}`\n : WhereKeyAttr<S, NS, K> extends DataAttrDef<infer V, any, any, any>\n ? ValidWhereValue<W[K], V, K>\n : `QERR_WHERE_KEY_UNKNOWN: ${K} is not a valid where key on ${NS}`\n }\n : unknown\n\ntype ValidWhereList<L, S extends IdbSchema, NS extends string> = L extends readonly any[]\n ? { [I in keyof L]: ValidWhere<L[I], S, NS> }\n : unknown\n\ntype ValidWhereValue<Input, V, K extends string> = Input extends undefined\n ? unknown // $skip — the clause is dropped\n : Input extends WireValue<V>\n ? unknown\n : Input extends object\n ? unknown // operator objects are validated by the authoring shape\n : `QERR_WHERE_VALUE_TYPE: Type '${TypeName<Input>}' is not assignable to field '${K}' of type ${TypeName<V>}`\n\n// ==========\n// order validation\n\ntype ValidOrder<O, S extends IdbSchema, NS extends string> = O extends object\n ? {\n [K in keyof O & string]: K extends IndexedFieldKeys<S, NS> | 'serverCreatedAt'\n ? unknown\n : `QERR_ORDER_KEY_INVALID: ${K} is not orderable — order accepts indexed fields and serverCreatedAt`\n }\n : unknown\n\n// ==========\n// $m validation\n\ntype ValidM<\n M,\n S extends IdbSchema,\n NS extends string,\n OwnKey extends string,\n> = M extends object\n ? {\n [Label in keyof M & string]: Label extends OwnKey\n ? `QERR_M_LABEL_COLLISION: ${Label} collides with the scope's own result key`\n : ValidMTransform<M[Label], S, NS>\n }\n : unknown\n\ntype ValidMTransform<T, S extends IdbSchema, NS extends string> = T extends object\n ? {\n [K in keyof T & string]: K extends 'indexBy'\n ? T[K] extends UniqueFieldKeys<S, NS> | 'id'\n ? unknown\n : `QERR_M_INDEXBY_NOT_UNIQUE: indexBy requires a unique field on ${NS}`\n : K extends 'groupBy'\n ? T[K] extends FieldKeys<S, NS>\n ? unknown\n : `QERR_M_GROUPBY_NOT_PRIMITIVE: groupBy requires a string, number, or boolean field on ${NS}`\n : K extends 'at'\n ? unknown\n : `QERR_M_TRANSFORM_UNKNOWN: ${K} is not a valid $m transform — use indexBy, groupBy, or at`\n }\n : unknown\n\n// ==========\n// node + query validation\n\ntype ValidNode<\n Node,\n S extends IdbSchema,\n NS extends string,\n ParentNS extends string | null,\n Key extends string,\n D extends Depth,\n TopLevel extends boolean,\n> = Node extends object\n ? {\n [K in keyof Node & string]: K extends '$'\n ? ValidDollar<Node[K], S, NS, TopLevel>\n : K extends '$m'\n ? ValidM<Node[K], S, NS, ResolvedScopeKey<S, ParentNS, Key, Node>>\n : K extends LinkLabels<S, NS>\n ? ValidNode<Node[K], S, LinkTarget<S, NS, K>, NS, K, NextHop<D>, false>\n : D['length'] extends MaxHops\n ? unknown\n : `QERR_QUERY_NESTED_KEY_UNKNOWN: ${K} is not a valid nested key on ${NS}`\n }\n : unknown\n\n/**\n * The per-call validating type. Use as a self-referential constraint:\n * `<Q extends IdbValidQuery<Q, S>>(query: Q)`.\n */\nexport type IdbValidQuery<Q, S extends IdbSchema> = IdbQuery<S> & {\n [K in keyof Q & string]: K extends IdbNamespaceName<S>\n ? ValidNode<Q[K], S, K, null, K, [], true>\n : `QERR_QUERY_ROOT_KEY_UNKNOWN: ${K} is not a valid top-level namespace`\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wire boundary: everything dux-only is stripped here, so what leaves the
|
|
3
|
+
* process is always a query instaql already accepts. Consumed by `/vue` and
|
|
4
|
+
* `/admin` right before the query reaches core — authoring keeps the dux keys
|
|
5
|
+
* (shaping needs them).
|
|
6
|
+
*
|
|
7
|
+
* Strips, without mutating the input:
|
|
8
|
+
* - the dux-only `$` keys (`$only`, `$at`, `$as`)
|
|
9
|
+
* - `$m` projection blocks
|
|
10
|
+
* - `where` clauses whose value is `undefined` (`$skip`)
|
|
11
|
+
*/
|
|
12
|
+
export declare function toWireQuery<Q extends Record<string, any>>(query: Q): Q;
|
|
13
|
+
//# sourceMappingURL=wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../../src/query/wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAKtE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The wire boundary: everything dux-only is stripped here, so what leaves the
|
|
4
|
+
* process is always a query instaql already accepts. Consumed by `/vue` and
|
|
5
|
+
* `/admin` right before the query reaches core — authoring keeps the dux keys
|
|
6
|
+
* (shaping needs them).
|
|
7
|
+
*
|
|
8
|
+
* Strips, without mutating the input:
|
|
9
|
+
* - the dux-only `$` keys (`$only`, `$at`, `$as`)
|
|
10
|
+
* - `$m` projection blocks
|
|
11
|
+
* - `where` clauses whose value is `undefined` (`$skip`)
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.toWireQuery = toWireQuery;
|
|
15
|
+
const DUX_DOLLAR_KEYS = ['$only', '$at', '$as'];
|
|
16
|
+
function toWireQuery(query) {
|
|
17
|
+
// `$`-prefixed namespaces ($users, …) are scopes like any other; only the
|
|
18
|
+
// internal ruleParams envelope passes through untouched.
|
|
19
|
+
return mapValues(query, (node, key) => key === '$$ruleParams' ? node : wireNode(node));
|
|
20
|
+
}
|
|
21
|
+
function wireNode(node) {
|
|
22
|
+
if (node === null || typeof node !== 'object')
|
|
23
|
+
return node;
|
|
24
|
+
const out = {};
|
|
25
|
+
for (const [key, value] of Object.entries(node)) {
|
|
26
|
+
if (key === '$m')
|
|
27
|
+
continue;
|
|
28
|
+
if (key === '$') {
|
|
29
|
+
const dollar = wireDollar(value);
|
|
30
|
+
if (dollar !== undefined)
|
|
31
|
+
out[key] = dollar;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
out[key] = wireNode(value);
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
function wireDollar(dollar) {
|
|
39
|
+
if (dollar === null || typeof dollar !== 'object')
|
|
40
|
+
return dollar;
|
|
41
|
+
const out = {};
|
|
42
|
+
for (const [key, value] of Object.entries(dollar)) {
|
|
43
|
+
if (DUX_DOLLAR_KEYS.includes(key))
|
|
44
|
+
continue;
|
|
45
|
+
if (key === 'where') {
|
|
46
|
+
const where = wireWhere(value);
|
|
47
|
+
if (where !== undefined)
|
|
48
|
+
out[key] = where;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
out[key] = value;
|
|
52
|
+
}
|
|
53
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
54
|
+
}
|
|
55
|
+
function wireWhere(where) {
|
|
56
|
+
if (where === null || typeof where !== 'object')
|
|
57
|
+
return where;
|
|
58
|
+
const out = {};
|
|
59
|
+
for (const [key, value] of Object.entries(where)) {
|
|
60
|
+
if (value === undefined) // $skip — drop the clause
|
|
61
|
+
continue;
|
|
62
|
+
if (key === 'and' || key === 'or') {
|
|
63
|
+
if (Array.isArray(value)) {
|
|
64
|
+
const kept = value.map(wireWhere).filter(clause => clause !== undefined);
|
|
65
|
+
if (kept.length > 0)
|
|
66
|
+
out[key] = kept;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
out[key] = value;
|
|
71
|
+
}
|
|
72
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
73
|
+
}
|
|
74
|
+
function mapValues(obj, fn) {
|
|
75
|
+
return Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, fn(value, key)]));
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/query/wire.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The wire boundary: everything dux-only is stripped here, so what leaves the\n * process is always a query instaql already accepts. Consumed by `/vue` and\n * `/admin` right before the query reaches core — authoring keeps the dux keys\n * (shaping needs them).\n *\n * Strips, without mutating the input:\n * - the dux-only `$` keys (`$only`, `$at`, `$as`)\n * - `$m` projection blocks\n * - `where` clauses whose value is `undefined` (`$skip`)\n */\n\nconst DUX_DOLLAR_KEYS = ['$only', '$at', '$as'] as const\n\nexport function toWireQuery<Q extends Record<string, any>>(query: Q): Q {\n // `$`-prefixed namespaces ($users, …) are scopes like any other; only the\n // internal ruleParams envelope passes through untouched.\n return mapValues(query, (node, key) =>\n key === '$$ruleParams' ? node : wireNode(node)) as Q\n}\n\nfunction wireNode(node: unknown): unknown {\n if (node === null || typeof node !== 'object')\n return node\n const out: Record<string, any> = {}\n for (const [key, value] of Object.entries(node)) {\n if (key === '$m')\n continue\n if (key === '$') {\n const dollar = wireDollar(value)\n if (dollar !== undefined)\n out[key] = dollar\n continue\n }\n out[key] = wireNode(value)\n }\n return out\n}\n\nfunction wireDollar(dollar: unknown): unknown {\n if (dollar === null || typeof dollar !== 'object')\n return dollar\n const out: Record<string, any> = {}\n for (const [key, value] of Object.entries(dollar)) {\n if ((DUX_DOLLAR_KEYS as readonly string[]).includes(key))\n continue\n if (key === 'where') {\n const where = wireWhere(value)\n if (where !== undefined)\n out[key] = where\n continue\n }\n out[key] = value\n }\n return Object.keys(out).length > 0 ? out : undefined\n}\n\nfunction wireWhere(where: unknown): unknown {\n if (where === null || typeof where !== 'object')\n return where\n const out: Record<string, any> = {}\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined) // $skip — drop the clause\n continue\n if (key === 'and' || key === 'or') {\n if (Array.isArray(value)) {\n const kept = value.map(wireWhere).filter(clause => clause !== undefined)\n if (kept.length > 0)\n out[key] = kept\n continue\n }\n }\n out[key] = value\n }\n return Object.keys(out).length > 0 ? out : undefined\n}\n\nfunction mapValues(\n obj: Record<string, any>,\n fn: (value: any, key: string) => any,\n): Record<string, any> {\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [key, fn(value, key)]),\n )\n}\n"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { CardinalityKind, EntitiesWithLinks, InstantSchemaDef as InstantSchemaDefType, LinksDef, RoomsDef } from '@instantdb/core';
|
|
2
|
+
import type { IdbNamespaceMeta, IdbNamespacesDef } from './namespace.js';
|
|
3
|
+
import type { Expand } from './util.js';
|
|
4
|
+
interface IdbLinkSide<On extends string> {
|
|
5
|
+
on: On;
|
|
6
|
+
label: string;
|
|
7
|
+
has: CardinalityKind;
|
|
8
|
+
/**
|
|
9
|
+
* The singular form of this label — governs the output key when `$only`/
|
|
10
|
+
* `$at` is applied to the nested link. Defaults to the built-in English
|
|
11
|
+
* algorithm when omitted. Stripped from the wire projection.
|
|
12
|
+
*/
|
|
13
|
+
singular?: string;
|
|
14
|
+
onDelete?: 'cascade';
|
|
15
|
+
}
|
|
16
|
+
export interface IdbLinkDef<On extends string> {
|
|
17
|
+
forward: IdbLinkSide<On> & {
|
|
18
|
+
required?: boolean;
|
|
19
|
+
};
|
|
20
|
+
reverse: IdbLinkSide<On>;
|
|
21
|
+
}
|
|
22
|
+
export type IdbLinksDef<Namespaces> = Record<string, IdbLinkDef<keyof Namespaces & string>>;
|
|
23
|
+
export interface IdbSchemaOptions {
|
|
24
|
+
/**
|
|
25
|
+
* How `$only`/`$at` result keys are singularized, inherited by every dux
|
|
26
|
+
* init from the schema:
|
|
27
|
+
*
|
|
28
|
+
* - `'auto'` (default) — the schema's `singular` if declared, otherwise the
|
|
29
|
+
* built-in English algorithm
|
|
30
|
+
* - `'explicit'` — the schema's `singular` if declared, otherwise the key
|
|
31
|
+
* stays as-is (`$as` required for unregistered plurals)
|
|
32
|
+
* - `'off'` — never singularize; keys keep their names (`$as` to rename)
|
|
33
|
+
*/
|
|
34
|
+
singularize?: 'auto' | 'off' | 'explicit';
|
|
35
|
+
}
|
|
36
|
+
interface ResolveOptions<Options extends IdbSchemaOptions> {
|
|
37
|
+
singularize: Options['singularize'] extends 'off' | 'explicit' ? Options['singularize'] : 'auto';
|
|
38
|
+
}
|
|
39
|
+
/** The loose shape of a schema's `$dux` meta — the constraint side. */
|
|
40
|
+
export interface IdbSchemaMetaShape {
|
|
41
|
+
readonly namespaces: Record<string, IdbNamespaceMeta>;
|
|
42
|
+
/** namespace → link label → declared singular (declared labels only). */
|
|
43
|
+
readonly linkSingulars: Record<string, Record<string, string>>;
|
|
44
|
+
readonly options: {
|
|
45
|
+
readonly singularize: 'auto' | 'off' | 'explicit';
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
type SideSingulars<Links, NS, Dir extends 'forward' | 'reverse'> = {
|
|
49
|
+
[K in keyof Links as Links[K] extends Record<Dir, {
|
|
50
|
+
on: NS;
|
|
51
|
+
label: infer L extends string;
|
|
52
|
+
singular: string;
|
|
53
|
+
}> ? L : never]: Links[K] extends Record<Dir, {
|
|
54
|
+
singular: infer Sg extends string;
|
|
55
|
+
}> ? Sg : never;
|
|
56
|
+
};
|
|
57
|
+
type LinkSingularsOf<Namespaces, Links> = {
|
|
58
|
+
[NS in keyof Namespaces]: Expand<SideSingulars<Links, NS, 'forward'> & SideSingulars<Links, NS, 'reverse'>>;
|
|
59
|
+
};
|
|
60
|
+
type MetaOfNamespace<Def> = Def extends {
|
|
61
|
+
readonly $dux: infer Meta extends IdbNamespaceMeta;
|
|
62
|
+
} ? Meta : IdbNamespaceMeta<undefined, undefined>;
|
|
63
|
+
/** The computed `$dux` meta of a schema, as `defineSchema` derives it. */
|
|
64
|
+
export interface IdbSchemaMeta<Namespaces extends IdbNamespacesDef, Links, Options extends IdbSchemaOptions> {
|
|
65
|
+
readonly namespaces: {
|
|
66
|
+
[K in keyof Namespaces]: MetaOfNamespace<Namespaces[K]>;
|
|
67
|
+
};
|
|
68
|
+
readonly linkSingulars: LinkSingularsOf<Namespaces, Links>;
|
|
69
|
+
readonly options: ResolveOptions<Options>;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Every dux schema: a real official `InstantSchemaDef` instance whose
|
|
73
|
+
* enumerable projection is exactly what Instant's tooling consumes, with dux
|
|
74
|
+
* metadata riding along non-enumerably under `$dux`. The official rename is
|
|
75
|
+
* `IdbSchema` — this is the parameterized form behind it.
|
|
76
|
+
*/
|
|
77
|
+
export type IdbSchemaDef<Entities extends Record<string, any>, Rooms extends RoomsDef, Meta extends IdbSchemaMetaShape> = InstantSchemaDefType<Entities, LinksDef<any>, Rooms> & {
|
|
78
|
+
readonly $dux: Meta;
|
|
79
|
+
};
|
|
80
|
+
/** The schema type — what `defineSchema` returns, loosely. */
|
|
81
|
+
export type IdbSchema = IdbSchemaDef<any, any, IdbSchemaMetaShape>;
|
|
82
|
+
export interface IdbSchemaConfig<Namespaces extends IdbNamespacesDef, Links extends IdbLinksDef<Namespaces>, Rooms extends RoomsDef, Options extends IdbSchemaOptions> {
|
|
83
|
+
namespaces: Namespaces;
|
|
84
|
+
links?: Links;
|
|
85
|
+
rooms?: Rooms;
|
|
86
|
+
options?: Options;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The schema authority: namespaces, fields, links, rooms, ruleParams,
|
|
90
|
+
* options — the single home for everything that describes your data.
|
|
91
|
+
*
|
|
92
|
+
* Returns an actual official `InstantSchemaDef` instance (CLI push and the
|
|
93
|
+
* platform API consume it as-is); dux metadata rides along non-enumerably.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* export const schema = defineSchema({
|
|
97
|
+
* namespaces: {
|
|
98
|
+
* tasks: i.namespace({
|
|
99
|
+
* fields: { title: i.string().indexed() },
|
|
100
|
+
* }),
|
|
101
|
+
* },
|
|
102
|
+
* })
|
|
103
|
+
*
|
|
104
|
+
* declare module '@mszr/idb-dux' {
|
|
105
|
+
* interface IdbRegister { schema: typeof schema }
|
|
106
|
+
* }
|
|
107
|
+
*/
|
|
108
|
+
export declare function defineSchema<Namespaces extends IdbNamespacesDef, const Links extends IdbLinksDef<Namespaces> = {}, Rooms extends RoomsDef = {}, const Options extends IdbSchemaOptions = {}>(config: IdbSchemaConfig<Namespaces, Links, Rooms, Options>): IdbSchemaDef<EntitiesWithLinks<Namespaces, Links>, Rooms, IdbSchemaMeta<Namespaces, Links, Options>>;
|
|
109
|
+
export {};
|
|
110
|
+
//# sourceMappingURL=defineSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineSchema.d.ts","sourceRoot":"","sources":["../../../src/schema/defineSchema.ts"],"names":[],"mappings":"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"}
|