@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":"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,74 @@
|
|
|
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
|
+
const DUX_DOLLAR_KEYS = ['$only', '$at', '$as'];
|
|
13
|
+
export function toWireQuery(query) {
|
|
14
|
+
// `$`-prefixed namespaces ($users, …) are scopes like any other; only the
|
|
15
|
+
// internal ruleParams envelope passes through untouched.
|
|
16
|
+
return mapValues(query, (node, key) => key === '$$ruleParams' ? node : wireNode(node));
|
|
17
|
+
}
|
|
18
|
+
function wireNode(node) {
|
|
19
|
+
if (node === null || typeof node !== 'object')
|
|
20
|
+
return node;
|
|
21
|
+
const out = {};
|
|
22
|
+
for (const [key, value] of Object.entries(node)) {
|
|
23
|
+
if (key === '$m')
|
|
24
|
+
continue;
|
|
25
|
+
if (key === '$') {
|
|
26
|
+
const dollar = wireDollar(value);
|
|
27
|
+
if (dollar !== undefined)
|
|
28
|
+
out[key] = dollar;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
out[key] = wireNode(value);
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
function wireDollar(dollar) {
|
|
36
|
+
if (dollar === null || typeof dollar !== 'object')
|
|
37
|
+
return dollar;
|
|
38
|
+
const out = {};
|
|
39
|
+
for (const [key, value] of Object.entries(dollar)) {
|
|
40
|
+
if (DUX_DOLLAR_KEYS.includes(key))
|
|
41
|
+
continue;
|
|
42
|
+
if (key === 'where') {
|
|
43
|
+
const where = wireWhere(value);
|
|
44
|
+
if (where !== undefined)
|
|
45
|
+
out[key] = where;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
out[key] = value;
|
|
49
|
+
}
|
|
50
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
51
|
+
}
|
|
52
|
+
function wireWhere(where) {
|
|
53
|
+
if (where === null || typeof where !== 'object')
|
|
54
|
+
return where;
|
|
55
|
+
const out = {};
|
|
56
|
+
for (const [key, value] of Object.entries(where)) {
|
|
57
|
+
if (value === undefined) // $skip — drop the clause
|
|
58
|
+
continue;
|
|
59
|
+
if (key === 'and' || key === 'or') {
|
|
60
|
+
if (Array.isArray(value)) {
|
|
61
|
+
const kept = value.map(wireWhere).filter(clause => clause !== undefined);
|
|
62
|
+
if (kept.length > 0)
|
|
63
|
+
out[key] = kept;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
out[key] = value;
|
|
68
|
+
}
|
|
69
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
70
|
+
}
|
|
71
|
+
function mapValues(obj, fn) {
|
|
72
|
+
return Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, fn(value, key)]));
|
|
73
|
+
}
|
|
74
|
+
//# 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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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { i as officialI } from '@instantdb/core';
|
|
2
|
+
// ==========
|
|
3
|
+
// defineSchema
|
|
4
|
+
/**
|
|
5
|
+
* The schema authority: namespaces, fields, links, rooms, ruleParams,
|
|
6
|
+
* options — the single home for everything that describes your data.
|
|
7
|
+
*
|
|
8
|
+
* Returns an actual official `InstantSchemaDef` instance (CLI push and the
|
|
9
|
+
* platform API consume it as-is); dux metadata rides along non-enumerably.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* export const schema = defineSchema({
|
|
13
|
+
* namespaces: {
|
|
14
|
+
* tasks: i.namespace({
|
|
15
|
+
* fields: { title: i.string().indexed() },
|
|
16
|
+
* }),
|
|
17
|
+
* },
|
|
18
|
+
* })
|
|
19
|
+
*
|
|
20
|
+
* declare module '@mszr/idb-dux' {
|
|
21
|
+
* interface IdbRegister { schema: typeof schema }
|
|
22
|
+
* }
|
|
23
|
+
*/
|
|
24
|
+
export function defineSchema(config) {
|
|
25
|
+
const links = config.links ?? {};
|
|
26
|
+
// The official schema constructor builds the enriched entity defs and the
|
|
27
|
+
// canonical instance; dux only prepares official-dialect inputs for it, so
|
|
28
|
+
// the projection matches `i.schema` output by construction.
|
|
29
|
+
const schema = officialI.schema({
|
|
30
|
+
entities: config.namespaces,
|
|
31
|
+
links: stripDialect(links),
|
|
32
|
+
rooms: config.rooms ?? {},
|
|
33
|
+
});
|
|
34
|
+
Object.defineProperty(schema, '$dux', {
|
|
35
|
+
value: {
|
|
36
|
+
namespaces: Object.fromEntries(Object.entries(config.namespaces).map(([name, def]) => [
|
|
37
|
+
name,
|
|
38
|
+
def.$dux
|
|
39
|
+
?? { singular: undefined, ruleParams: undefined },
|
|
40
|
+
])),
|
|
41
|
+
linkSingulars: collectLinkSingulars(links),
|
|
42
|
+
options: { singularize: config.options?.singularize ?? 'auto' },
|
|
43
|
+
},
|
|
44
|
+
enumerable: false,
|
|
45
|
+
});
|
|
46
|
+
return schema;
|
|
47
|
+
}
|
|
48
|
+
/** Remove dux-only keys so `schema.links` is wire-clean official dialect. */
|
|
49
|
+
function stripDialect(links) {
|
|
50
|
+
return Object.fromEntries(Object.entries(links).map(([name, { forward, reverse }]) => {
|
|
51
|
+
const { singular: _f, ...forwardRest } = forward;
|
|
52
|
+
const { singular: _r, ...reverseRest } = reverse;
|
|
53
|
+
return [name, { forward: forwardRest, reverse: reverseRest }];
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
/** Hoist declared label singulars into `$dux.linkSingulars[namespace][label]`. */
|
|
57
|
+
function collectLinkSingulars(links) {
|
|
58
|
+
const result = {};
|
|
59
|
+
for (const { forward, reverse } of Object.values(links)) {
|
|
60
|
+
for (const side of [forward, reverse]) {
|
|
61
|
+
if (side.singular === undefined)
|
|
62
|
+
continue;
|
|
63
|
+
const labels = (result[side.on] ??= {});
|
|
64
|
+
labels[side.label] = side.singular;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=defineSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineSchema.js","sourceRoot":"","sources":["../../../src/schema/defineSchema.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,CAAC,IAAI,SAAS,EAAE,MAAM,iBAAiB,CAAA;AA2HhD,aAAa;AACb,eAAe;AAEf;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,YAAY,CAM1B,MAA0D;IAM1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAK,EAAY,CAAA;IAE3C,0EAA0E;IAC1E,2EAA2E;IAC3E,4DAA4D;IAC5D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAC9B,QAAQ,EAAE,MAAM,CAAC,UAAU;QAC3B,KAAK,EAAE,YAAY,CAAC,KAAK,CAAkB;QAC3C,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;KAC1B,CAAC,CAAA;IAEF,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE;QACpC,KAAK,EAAE;YACL,UAAU,EAAE,MAAM,CAAC,WAAW,CAC5B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;gBACrD,IAAI;gBACH,GAAgC,CAAC,IAAI;uBACnC,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE;aAClD,CAAC,CACH;YACD,aAAa,EAAE,oBAAoB,CAAC,KAAK,CAAC;YAC1C,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,IAAI,MAAM,EAAE;SAChE;QACD,UAAU,EAAE,KAAK;KAClB,CAAC,CAAA;IAEF,OAAO,MAIN,CAAA;AACH,CAAC;AAED,6EAA6E;AAC7E,SAAS,YAAY,CAAC,KAAuB;IAC3C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAA;QAChD,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAA;QAChD,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;IAC/D,CAAC,CAAC,CACH,CAAA;AACH,CAAC;AAED,kFAAkF;AAClF,SAAS,oBAAoB,CAC3B,KAAuB;IAEvB,MAAM,MAAM,GAA2C,EAAE,CAAA;IACzD,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;gBAC7B,SAAQ;YACV,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAA;YACvC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAA;QACpC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["import type {\n CardinalityKind,\n EntitiesWithLinks,\n InstantSchemaDef as InstantSchemaDefType,\n LinksDef,\n RoomsDef,\n} from '@instantdb/core'\nimport type { IdbNamespaceDef, IdbNamespaceMeta, IdbNamespacesDef } from './namespace.js'\nimport type { Expand } from './util.js'\nimport { i as officialI } from '@instantdb/core'\n\n// ==========\n// links\n\ninterface IdbLinkSide<On extends string> {\n on: On\n label: string\n has: CardinalityKind\n /**\n * The singular form of this label — governs the output key when `$only`/\n * `$at` is applied to the nested link. Defaults to the built-in English\n * algorithm when omitted. Stripped from the wire projection.\n */\n singular?: string\n onDelete?: 'cascade'\n}\n\nexport interface IdbLinkDef<On extends string> {\n forward: IdbLinkSide<On> & { required?: boolean }\n reverse: IdbLinkSide<On>\n}\n\nexport type IdbLinksDef<Namespaces> = Record<\n string,\n IdbLinkDef<keyof Namespaces & string>\n>\n\n// ==========\n// options\n\nexport interface IdbSchemaOptions {\n /**\n * How `$only`/`$at` result keys are singularized, inherited by every dux\n * init from the schema:\n *\n * - `'auto'` (default) — the schema's `singular` if declared, otherwise the\n * built-in English algorithm\n * - `'explicit'` — the schema's `singular` if declared, otherwise the key\n * stays as-is (`$as` required for unregistered plurals)\n * - `'off'` — never singularize; keys keep their names (`$as` to rename)\n */\n singularize?: 'auto' | 'off' | 'explicit'\n}\n\ninterface ResolveOptions<Options extends IdbSchemaOptions> {\n singularize: Options['singularize'] extends 'off' | 'explicit'\n ? Options['singularize']\n : 'auto'\n}\n\n// ==========\n// schema meta\n\n/** The loose shape of a schema's `$dux` meta — the constraint side. */\nexport interface IdbSchemaMetaShape {\n readonly namespaces: Record<string, IdbNamespaceMeta>\n /** namespace → link label → declared singular (declared labels only). */\n readonly linkSingulars: Record<string, Record<string, string>>\n readonly options: { readonly singularize: 'auto' | 'off' | 'explicit' }\n}\n\ntype SideSingulars<Links, NS, Dir extends 'forward' | 'reverse'> = {\n [K in keyof Links as Links[K] extends Record<Dir, { on: NS, label: infer L extends string, singular: string }>\n ? L\n : never]: Links[K] extends Record<Dir, { singular: infer Sg extends string }>\n ? Sg\n : never\n}\n\ntype LinkSingularsOf<Namespaces, Links> = {\n [NS in keyof Namespaces]: Expand<\n SideSingulars<Links, NS, 'forward'> & SideSingulars<Links, NS, 'reverse'>\n >\n}\n\ntype MetaOfNamespace<Def> = Def extends { readonly $dux: infer Meta extends IdbNamespaceMeta }\n ? Meta\n : IdbNamespaceMeta<undefined, undefined>\n\n/** The computed `$dux` meta of a schema, as `defineSchema` derives it. */\nexport interface IdbSchemaMeta<\n Namespaces extends IdbNamespacesDef,\n Links,\n Options extends IdbSchemaOptions,\n> {\n readonly namespaces: { [K in keyof Namespaces]: MetaOfNamespace<Namespaces[K]> }\n readonly linkSingulars: LinkSingularsOf<Namespaces, Links>\n readonly options: ResolveOptions<Options>\n}\n\n// ==========\n// the schema type\n\n/**\n * Every dux schema: a real official `InstantSchemaDef` instance whose\n * enumerable projection is exactly what Instant's tooling consumes, with dux\n * metadata riding along non-enumerably under `$dux`. The official rename is\n * `IdbSchema` — this is the parameterized form behind it.\n */\nexport type IdbSchemaDef<\n Entities extends Record<string, any>,\n Rooms extends RoomsDef,\n Meta extends IdbSchemaMetaShape,\n> = InstantSchemaDefType<Entities, LinksDef<any>, Rooms> & {\n readonly $dux: Meta\n}\n\n/** The schema type — what `defineSchema` returns, loosely. */\nexport type IdbSchema = IdbSchemaDef<any, any, IdbSchemaMetaShape>\n\nexport interface IdbSchemaConfig<\n Namespaces extends IdbNamespacesDef,\n Links extends IdbLinksDef<Namespaces>,\n Rooms extends RoomsDef,\n Options extends IdbSchemaOptions,\n> {\n namespaces: Namespaces\n links?: Links\n rooms?: Rooms\n options?: Options\n}\n\n// ==========\n// defineSchema\n\n/**\n * The schema authority: namespaces, fields, links, rooms, ruleParams,\n * options — the single home for everything that describes your data.\n *\n * Returns an actual official `InstantSchemaDef` instance (CLI push and the\n * platform API consume it as-is); dux metadata rides along non-enumerably.\n *\n * @example\n * export const schema = defineSchema({\n * namespaces: {\n * tasks: i.namespace({\n * fields: { title: i.string().indexed() },\n * }),\n * },\n * })\n *\n * declare module '@mszr/idb-dux' {\n * interface IdbRegister { schema: typeof schema }\n * }\n */\nexport function defineSchema<\n Namespaces extends IdbNamespacesDef,\n const Links extends IdbLinksDef<Namespaces> = {},\n Rooms extends RoomsDef = {},\n const Options extends IdbSchemaOptions = {},\n>(\n config: IdbSchemaConfig<Namespaces, Links, Rooms, Options>,\n): IdbSchemaDef<\n EntitiesWithLinks<Namespaces, Links>,\n Rooms,\n IdbSchemaMeta<Namespaces, Links, Options>\n> {\n const links = config.links ?? ({} as Links)\n\n // The official schema constructor builds the enriched entity defs and the\n // canonical instance; dux only prepares official-dialect inputs for it, so\n // the projection matches `i.schema` output by construction.\n const schema = officialI.schema({\n entities: config.namespaces,\n links: stripDialect(links) as LinksDef<any>,\n rooms: config.rooms ?? {},\n })\n\n Object.defineProperty(schema, '$dux', {\n value: {\n namespaces: Object.fromEntries(\n Object.entries(config.namespaces).map(([name, def]) => [\n name,\n (def as Partial<IdbNamespaceDef>).$dux\n ?? { singular: undefined, ruleParams: undefined },\n ]),\n ),\n linkSingulars: collectLinkSingulars(links),\n options: { singularize: config.options?.singularize ?? 'auto' },\n },\n enumerable: false,\n })\n\n return schema as unknown as IdbSchemaDef<\n EntitiesWithLinks<Namespaces, Links>,\n Rooms,\n IdbSchemaMeta<Namespaces, Links, Options>\n >\n}\n\n/** Remove dux-only keys so `schema.links` is wire-clean official dialect. */\nfunction stripDialect(links: IdbLinksDef<any>): IdbLinksDef<any> {\n return Object.fromEntries(\n Object.entries(links).map(([name, { forward, reverse }]) => {\n const { singular: _f, ...forwardRest } = forward\n const { singular: _r, ...reverseRest } = reverse\n return [name, { forward: forwardRest, reverse: reverseRest }]\n }),\n )\n}\n\n/** Hoist declared label singulars into `$dux.linkSingulars[namespace][label]`. */\nfunction collectLinkSingulars(\n links: IdbLinksDef<any>,\n): Record<string, Record<string, string>> {\n const result: Record<string, Record<string, string>> = {}\n for (const { forward, reverse } of Object.values(links)) {\n for (const side of [forward, reverse]) {\n if (side.singular === undefined)\n continue\n const labels = (result[side.on] ??= {})\n labels[side.label] = side.singular\n }\n }\n return result\n}\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-derived field and link helpers, shared by the query and tx layers.
|
|
3
|
+
* Internal — the public surface exposes them only through `Idb*` types.
|
|
4
|
+
*
|
|
5
|
+
* Field-subset keys are detected by inferring the relevant `DataAttrDef`
|
|
6
|
+
* type param (core's UniqueKeys/IndexedKeys pattern) — `IsUnique`/`IsIndexed`
|
|
7
|
+
* are not structural properties, so assignability tests cannot see them.
|
|
8
|
+
*/
|
|
9
|
+
import type { DataAttrDef } from '@instantdb/core';
|
|
10
|
+
import type { IdbSchema } from './defineSchema.js';
|
|
11
|
+
export type AttrsOf<S extends IdbSchema, NS extends string> = S['entities'][NS]['attrs'];
|
|
12
|
+
export type LinksOf<S extends IdbSchema, NS extends string> = S['entities'][NS]['links'];
|
|
13
|
+
export type FieldKeys<S extends IdbSchema, NS extends string> = keyof AttrsOf<S, NS> & string;
|
|
14
|
+
export type LinkLabels<S extends IdbSchema, NS extends string> = keyof LinksOf<S, NS> & string;
|
|
15
|
+
export type LinkTarget<S extends IdbSchema, NS extends string, L extends string> = LinksOf<S, NS>[L] extends {
|
|
16
|
+
entityName: infer T extends string;
|
|
17
|
+
} ? T : never;
|
|
18
|
+
export type LinkCardinality<S extends IdbSchema, NS extends string, L extends string> = LinksOf<S, NS>[L] extends {
|
|
19
|
+
cardinality: infer C;
|
|
20
|
+
} ? C : never;
|
|
21
|
+
export type AttrValue<A> = A extends DataAttrDef<infer V, any, any, any> ? V : never;
|
|
22
|
+
/** The wire form of a field value — `i.date()` fields travel as string | number. */
|
|
23
|
+
export type WireValue<V> = V extends Date ? string | number | Date : V;
|
|
24
|
+
export type IndexedFieldKeys<S extends IdbSchema, NS extends string> = {
|
|
25
|
+
[K in keyof AttrsOf<S, NS>]: AttrsOf<S, NS>[K] extends DataAttrDef<any, any, infer I, any> ? I extends true ? K & string : never : never;
|
|
26
|
+
}[keyof AttrsOf<S, NS>];
|
|
27
|
+
export type UniqueFieldKeys<S extends IdbSchema, NS extends string> = {
|
|
28
|
+
[K in keyof AttrsOf<S, NS>]: AttrsOf<S, NS>[K] extends DataAttrDef<any, any, any, infer U> ? U extends true ? K & string : never : never;
|
|
29
|
+
}[keyof AttrsOf<S, NS>];
|
|
30
|
+
export type PrimitiveFieldKeys<S extends IdbSchema, NS extends string> = {
|
|
31
|
+
[K in keyof AttrsOf<S, NS>]: AttrsOf<S, NS>[K] extends DataAttrDef<infer V, any, any, any> ? [V] extends [string | number | boolean] ? K & string : never : never;
|
|
32
|
+
}[keyof AttrsOf<S, NS>];
|
|
33
|
+
//# sourceMappingURL=fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../../src/schema/fields.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../src/schema/fields.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Schema-derived field and link helpers, shared by the query and tx layers.\n * Internal — the public surface exposes them only through `Idb*` types.\n *\n * Field-subset keys are detected by inferring the relevant `DataAttrDef`\n * type param (core's UniqueKeys/IndexedKeys pattern) — `IsUnique`/`IsIndexed`\n * are not structural properties, so assignability tests cannot see them.\n */\nimport type { DataAttrDef } from '@instantdb/core'\nimport type { IdbSchema } from './defineSchema.js'\n\nexport type AttrsOf<S extends IdbSchema, NS extends string> = S['entities'][NS]['attrs']\nexport type LinksOf<S extends IdbSchema, NS extends string> = S['entities'][NS]['links']\n\nexport type FieldKeys<S extends IdbSchema, NS extends string> = keyof AttrsOf<S, NS> & string\nexport type LinkLabels<S extends IdbSchema, NS extends string> = keyof LinksOf<S, NS> & string\n\nexport type LinkTarget<\n S extends IdbSchema,\n NS extends string,\n L extends string,\n> = LinksOf<S, NS>[L] extends { entityName: infer T extends string } ? T : never\n\nexport type LinkCardinality<\n S extends IdbSchema,\n NS extends string,\n L extends string,\n> = LinksOf<S, NS>[L] extends { cardinality: infer C } ? C : never\n\nexport type AttrValue<A> = A extends DataAttrDef<infer V, any, any, any> ? V : never\n\n/** The wire form of a field value — `i.date()` fields travel as string | number. */\nexport type WireValue<V> = V extends Date ? string | number | Date : V\n\nexport type IndexedFieldKeys<S extends IdbSchema, NS extends string> = {\n [K in keyof AttrsOf<S, NS>]: AttrsOf<S, NS>[K] extends DataAttrDef<any, any, infer I, any>\n ? I extends true\n ? K & string\n : never\n : never\n}[keyof AttrsOf<S, NS>]\n\nexport type UniqueFieldKeys<S extends IdbSchema, NS extends string> = {\n [K in keyof AttrsOf<S, NS>]: AttrsOf<S, NS>[K] extends DataAttrDef<any, any, any, infer U>\n ? U extends true\n ? K & string\n : never\n : never\n}[keyof AttrsOf<S, NS>]\n\nexport type PrimitiveFieldKeys<S extends IdbSchema, NS extends string> = {\n [K in keyof AttrsOf<S, NS>]: AttrsOf<S, NS>[K] extends DataAttrDef<infer V, any, any, any>\n ? [V] extends [string | number | boolean]\n ? K & string\n : never\n : never\n}[keyof AttrsOf<S, NS>]\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { IdbLinkDef, IdbLinksDef, IdbSchema, IdbSchemaConfig, IdbSchemaDef, IdbSchemaMeta, IdbSchemaMetaShape, IdbSchemaOptions, } from './defineSchema.js';
|
|
2
|
+
export { defineSchema } from './defineSchema.js';
|
|
3
|
+
export type { IdbNamespaceConfig, IdbNamespaceDef, IdbNamespaceMeta, IdbNamespacesDef, } from './namespace.js';
|
|
4
|
+
export { i } from './namespace.js';
|
|
5
|
+
export type { IdbRegister, IdbRegisteredSchema, IdbUnknownSchema, } from './register.js';
|
|
6
|
+
export { singularize } from './singularize.js';
|
|
7
|
+
export type { Singularize } from './singularize.js';
|
|
8
|
+
export type { IdbEntity, IdbEntityWithLinks, IdbNamespaceName, IdbRoomName, IdbRoomPresence, IdbRooms, IdbRoomTopics, } from './types.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/schema/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,WAAW,EACX,SAAS,EACT,eAAe,EACf,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,CAAC,EAAE,MAAM,gBAAgB,CAAA;AAClC,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,QAAQ,EACR,aAAa,GACd,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schema/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAOhD,OAAO,EAAE,CAAC,EAAE,MAAM,gBAAgB,CAAA;AAMlC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA","sourcesContent":["export type {\n IdbLinkDef,\n IdbLinksDef,\n IdbSchema,\n IdbSchemaConfig,\n IdbSchemaDef,\n IdbSchemaMeta,\n IdbSchemaMetaShape,\n IdbSchemaOptions,\n} from './defineSchema.js'\nexport { defineSchema } from './defineSchema.js'\nexport type {\n IdbNamespaceConfig,\n IdbNamespaceDef,\n IdbNamespaceMeta,\n IdbNamespacesDef,\n} from './namespace.js'\nexport { i } from './namespace.js'\nexport type {\n IdbRegister,\n IdbRegisteredSchema,\n IdbUnknownSchema,\n} from './register.js'\nexport { singularize } from './singularize.js'\nexport type { Singularize } from './singularize.js'\nexport type {\n IdbEntity,\n IdbEntityWithLinks,\n IdbNamespaceName,\n IdbRoomName,\n IdbRoomPresence,\n IdbRooms,\n IdbRoomTopics,\n} from './types.js'\n"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { AttrsDefs, DataAttrDef, EntityDef as EntityDefType } from '@instantdb/core';
|
|
2
|
+
/**
|
|
3
|
+
* The dux metadata a namespace declaration carries into `defineSchema`,
|
|
4
|
+
* where it is hoisted onto the schema's own (non-enumerable) `$dux` meta.
|
|
5
|
+
*/
|
|
6
|
+
export interface IdbNamespaceMeta<Singular extends string | undefined = string | undefined, RuleParams extends AttrsDefs | undefined = AttrsDefs | undefined> {
|
|
7
|
+
readonly singular: Singular;
|
|
8
|
+
readonly ruleParams: RuleParams;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* What `i.namespace()` returns: a real official `EntityDef` (so the schema's
|
|
12
|
+
* enumerable projection stays exactly what Instant's tooling consumes), with
|
|
13
|
+
* the dux metadata riding along non-enumerably under `$dux`.
|
|
14
|
+
*/
|
|
15
|
+
export type IdbNamespaceDef<Fields extends AttrsDefs = AttrsDefs, Singular extends string | undefined = string | undefined, RuleParams extends AttrsDefs | undefined = AttrsDefs | undefined> = EntityDefType<Fields, {}, void> & {
|
|
16
|
+
readonly $dux: IdbNamespaceMeta<Singular, RuleParams>;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The constraint for `defineSchema`'s `namespaces` block. Deliberately the
|
|
20
|
+
* official* `EntityDef` shape, without the `$dux` slot: a generic constraint
|
|
21
|
+
* doubles as the contextual type of the config literal, and a contextual
|
|
22
|
+
* `$dux: IdbNamespaceMeta<any, any>` would poison `i.namespace`'s inference
|
|
23
|
+
* (literal singulars widen, ruleParams collapse to `any`). The meta is
|
|
24
|
+
* extracted conditionally where it's needed instead.
|
|
25
|
+
*/
|
|
26
|
+
export type IdbNamespacesDef = Record<string, EntityDefType<any, any, any>>;
|
|
27
|
+
/**
|
|
28
|
+
* The validation arm for `fields`/`ruleParams`: non-builder members carry
|
|
29
|
+
* the diagnostic on the offending key; valid members contribute nothing.
|
|
30
|
+
*/
|
|
31
|
+
type ValidFieldBuilders<F> = {
|
|
32
|
+
[K in keyof F]: F[K] extends DataAttrDef<any, any, any, any> ? unknown : `QERR_SCHEMA_FIELD_INVALID: ${K & string} must be a field builder (i.string(), i.number(), …)`;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* `Fields` and `RuleParams` are deliberately unconstrained: a generic's
|
|
36
|
+
* constraint becomes the contextual type of the matching config property, and
|
|
37
|
+
* an `AttrsDefs` context degrades unchained builder calls (a bare
|
|
38
|
+
* `i.string()`) to `DataAttrDef<any, …>`. Validation rides in a parallel
|
|
39
|
+
* intersection arm instead, and the return type re-tightens via `Extract`.
|
|
40
|
+
*/
|
|
41
|
+
export interface IdbNamespaceConfig<Fields, Singular, RuleParams> {
|
|
42
|
+
/**
|
|
43
|
+
* The singular form of the namespace name — the single source of truth for
|
|
44
|
+
* auto-singularization of `$only`/`$at` result keys. Defaults to the
|
|
45
|
+
* built-in English algorithm when omitted.
|
|
46
|
+
*/
|
|
47
|
+
singular?: Singular;
|
|
48
|
+
/** The namespace's local data attributes. */
|
|
49
|
+
fields: Fields & ValidFieldBuilders<Fields>;
|
|
50
|
+
/**
|
|
51
|
+
* The namespace's rule params, declared once and typed end-to-end: in the
|
|
52
|
+
* tx chain, in query options, and in perms.
|
|
53
|
+
*/
|
|
54
|
+
ruleParams?: RuleParams & ValidFieldBuilders<RuleParams>;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The namespace constructor — the single home for everything that describes
|
|
58
|
+
* a namespace: its fields, its singular name, and its rule params.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* workspaces: i.namespace({
|
|
62
|
+
* fields: { name: i.string().indexed() },
|
|
63
|
+
* ruleParams: { inviteCode: i.string() },
|
|
64
|
+
* }),
|
|
65
|
+
*/
|
|
66
|
+
declare function namespace<Fields, const Singular extends string | undefined = undefined, RuleParams = undefined>(config: IdbNamespaceConfig<Fields, Singular, RuleParams>): IdbNamespaceDef<Extract<Fields, AttrsDefs>, Singular, Extract<RuleParams, AttrsDefs | undefined>>;
|
|
67
|
+
/**
|
|
68
|
+
* dux's authoring dialect: `i.namespace` plus the official field builders.
|
|
69
|
+
* There is no `i.entity` / `i.schema` / `i.graph` — one dialect, one
|
|
70
|
+
* vocabulary; the builders themselves are the official implementations.
|
|
71
|
+
*/
|
|
72
|
+
export declare const i: {
|
|
73
|
+
namespace: typeof namespace;
|
|
74
|
+
string: <StringEnum extends string = string>() => DataAttrDef<StringEnum, true, false>;
|
|
75
|
+
number: () => DataAttrDef<number, true, false>;
|
|
76
|
+
boolean: () => DataAttrDef<boolean, true, false>;
|
|
77
|
+
date: () => DataAttrDef<Date, true, false>;
|
|
78
|
+
json: <T = any>() => DataAttrDef<T, true, false>;
|
|
79
|
+
any: () => DataAttrDef<any, true, false>;
|
|
80
|
+
};
|
|
81
|
+
export {};
|
|
82
|
+
//# sourceMappingURL=namespace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../src/schema/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAGzF;;;GAGG;AACH,MAAM,WAAW,gBAAgB,CAC/B,QAAQ,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EACxD,UAAU,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS;IAEhE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAChC;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,CACzB,MAAM,SAAS,SAAS,GAAG,SAAS,EACpC,QAAQ,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EACxD,UAAU,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,IAC9D,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG;IACpC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;CACtD,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AAE3E;;;GAGG;AACH,KAAK,kBAAkB,CAAC,CAAC,IAAI;KAC1B,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GACxD,OAAO,GACP,8BAA8B,CAAC,GAAG,MAAM,sDAAsD;CACnG,CAAA;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU;IAC9D;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAC3C;;;OAGG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;CACzD;AAED;;;;;;;;;GASG;AACH,iBAAS,SAAS,CAChB,MAAM,EACN,KAAK,CAAC,QAAQ,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EACrD,UAAU,GAAG,SAAS,EAEtB,MAAM,EAAE,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,GACvD,eAAe,CAChB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,QAAQ,EACR,OAAO,CAAC,UAAU,EAAE,SAAS,GAAG,SAAS,CAAC,CAC3C,CAWA;AAED;;;;GAIG;AACH,eAAO,MAAM,CAAC;;;;;;;;CAQb,CAAA"}
|