@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,149 @@
|
|
|
1
|
+
import { coerceQuery, init as core_init, InstantError, txInit, weakHash, } from '@instantdb/core';
|
|
2
|
+
import { computed, ref, shallowRef, toValue, watch } from 'vue';
|
|
3
|
+
import { InstantDuxRoom, rooms } from './InstantDuxRoom.js';
|
|
4
|
+
import { useInfiniteQuery } from './useInfiniteQuery.js';
|
|
5
|
+
import { isClient, tryOnScopeDispose } from './utils.js';
|
|
6
|
+
import version from './version.js';
|
|
7
|
+
export class InstantDuxDatabase {
|
|
8
|
+
tx = txInit();
|
|
9
|
+
auth;
|
|
10
|
+
storage;
|
|
11
|
+
streams;
|
|
12
|
+
core;
|
|
13
|
+
constructor(core) {
|
|
14
|
+
this.core = core;
|
|
15
|
+
this.auth = this.core.auth;
|
|
16
|
+
this.storage = this.core.storage;
|
|
17
|
+
this.streams = this.core.streams;
|
|
18
|
+
}
|
|
19
|
+
getLocalId = (name) => {
|
|
20
|
+
return this.core.getLocalId(name);
|
|
21
|
+
};
|
|
22
|
+
transact = (chunks) => {
|
|
23
|
+
return this.core.transact(chunks);
|
|
24
|
+
};
|
|
25
|
+
getAuth() {
|
|
26
|
+
return this.core.getAuth();
|
|
27
|
+
}
|
|
28
|
+
queryOnce = (query, opts) => {
|
|
29
|
+
return this.core.queryOnce(query, opts);
|
|
30
|
+
};
|
|
31
|
+
// -----------
|
|
32
|
+
// Vue reactive hooks
|
|
33
|
+
useQuery = (query, opts) => {
|
|
34
|
+
const isLoading = ref(true);
|
|
35
|
+
const data = shallowRef(undefined);
|
|
36
|
+
const pageInfo = shallowRef(undefined);
|
|
37
|
+
const error = shallowRef(undefined);
|
|
38
|
+
const resolvedQuery = computed(() => {
|
|
39
|
+
const q = toValue(query);
|
|
40
|
+
if (!q)
|
|
41
|
+
return null;
|
|
42
|
+
const o = toValue(opts);
|
|
43
|
+
const withParams = o && 'ruleParams' in o
|
|
44
|
+
? { $$ruleParams: o.ruleParams, ...q }
|
|
45
|
+
: q;
|
|
46
|
+
return coerceQuery(withParams);
|
|
47
|
+
});
|
|
48
|
+
const queryHash = computed(() => weakHash(resolvedQuery.value));
|
|
49
|
+
const stop = watch(queryHash, (_, __, onCleanup) => {
|
|
50
|
+
const q = resolvedQuery.value;
|
|
51
|
+
// DUX-DELTA(ssr): inert state on the server — never read the cache or
|
|
52
|
+
// open a subscription. The client path below is the official one.
|
|
53
|
+
if (!isClient()) {
|
|
54
|
+
isLoading.value = !!q;
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// END DUX-DELTA
|
|
58
|
+
const cached = q ? this.core._reactor.getPreviousResult(q) : null;
|
|
59
|
+
isLoading.value = !cached;
|
|
60
|
+
data.value = cached?.data;
|
|
61
|
+
pageInfo.value = cached?.pageInfo;
|
|
62
|
+
error.value = cached?.error;
|
|
63
|
+
if (!q)
|
|
64
|
+
return;
|
|
65
|
+
const unsub = this.core.subscribeQuery(q, (r) => {
|
|
66
|
+
isLoading.value = false;
|
|
67
|
+
data.value = r.data;
|
|
68
|
+
pageInfo.value = r.pageInfo;
|
|
69
|
+
error.value = r.error;
|
|
70
|
+
});
|
|
71
|
+
onCleanup(unsub);
|
|
72
|
+
}, { immediate: true });
|
|
73
|
+
tryOnScopeDispose(stop);
|
|
74
|
+
return { isLoading, data, pageInfo, error };
|
|
75
|
+
};
|
|
76
|
+
useInfiniteQuery = (query, opts) => {
|
|
77
|
+
return useInfiniteQuery(this.core, query, opts);
|
|
78
|
+
};
|
|
79
|
+
useAuth = () => {
|
|
80
|
+
const cached = this.core._reactor._currentUserCached;
|
|
81
|
+
const isLoading = ref(cached?.isLoading ?? true);
|
|
82
|
+
const user = shallowRef(cached?.user);
|
|
83
|
+
const error = shallowRef(cached?.error);
|
|
84
|
+
// DUX-DELTA(ssr): no auth subscription on the server — inert loading state.
|
|
85
|
+
if (!isClient())
|
|
86
|
+
return { isLoading, user, error };
|
|
87
|
+
// END DUX-DELTA
|
|
88
|
+
const unsub = this.core.subscribeAuth((auth) => {
|
|
89
|
+
isLoading.value = false;
|
|
90
|
+
user.value = auth.user ?? null;
|
|
91
|
+
error.value = auth.error;
|
|
92
|
+
});
|
|
93
|
+
tryOnScopeDispose(unsub);
|
|
94
|
+
return { isLoading, user, error };
|
|
95
|
+
};
|
|
96
|
+
useUser = () => {
|
|
97
|
+
const { user } = this.useAuth();
|
|
98
|
+
return computed(() => {
|
|
99
|
+
if (!user.value) {
|
|
100
|
+
throw new InstantError('useUser must be used within an auth-protected route');
|
|
101
|
+
}
|
|
102
|
+
return user.value;
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
useConnectionStatus = () => {
|
|
106
|
+
const status = ref(this.core._reactor.status);
|
|
107
|
+
// DUX-DELTA(ssr): no connection subscription on the server.
|
|
108
|
+
if (!isClient())
|
|
109
|
+
return status;
|
|
110
|
+
// END DUX-DELTA
|
|
111
|
+
const unsub = this.core.subscribeConnectionStatus((newStatus) => {
|
|
112
|
+
status.value = newStatus;
|
|
113
|
+
});
|
|
114
|
+
tryOnScopeDispose(unsub);
|
|
115
|
+
return status;
|
|
116
|
+
};
|
|
117
|
+
useLocalId = (name) => {
|
|
118
|
+
const localId = ref(null);
|
|
119
|
+
// DUX-DELTA(ssr): localId is a client-storage concern — inert on server.
|
|
120
|
+
if (!isClient())
|
|
121
|
+
return localId;
|
|
122
|
+
// END DUX-DELTA
|
|
123
|
+
const stop = watch(() => toValue(name), (currentName) => {
|
|
124
|
+
this.getLocalId(currentName).then((id) => {
|
|
125
|
+
// Drop a late resolve if `name` has since changed.
|
|
126
|
+
if (toValue(name) === currentName) {
|
|
127
|
+
localId.value = id;
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}, { immediate: true });
|
|
131
|
+
tryOnScopeDispose(stop);
|
|
132
|
+
return localId;
|
|
133
|
+
};
|
|
134
|
+
room(type, id) {
|
|
135
|
+
const _type = computed(() => (toValue(type) ?? '_defaultRoomType'));
|
|
136
|
+
const _id = computed(() => toValue(id) ?? '_defaultRoomId');
|
|
137
|
+
return new InstantDuxRoom(this.core, _type, _id);
|
|
138
|
+
}
|
|
139
|
+
rooms = rooms;
|
|
140
|
+
}
|
|
141
|
+
// -----------
|
|
142
|
+
// init
|
|
143
|
+
export function init(config) {
|
|
144
|
+
const coreDb = core_init(config, undefined, undefined, {
|
|
145
|
+
'@mszr/idb-dux': version,
|
|
146
|
+
});
|
|
147
|
+
return new InstantDuxDatabase(coreDb);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=InstantDuxDatabase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstantDuxDatabase.js","sourceRoot":"","sources":["../../../../src/vue/baseline/InstantDuxDatabase.ts"],"names":[],"mappings":"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","sourcesContent":["// Vendored from @instantdb/vue/src/InstantVueDatabase.ts — see UPSTREAM.md.\n// Deltas: class rename (InstantVueDatabase → InstantDuxDatabase), the SSR\n// floor guards on every reactive hook, and the framework version tag.\nimport type {\n Auth,\n AuthState,\n ConnectionStatus,\n IInstantDatabase,\n InstantConfig,\n InstantCoreDatabase,\n InstantSchemaDef,\n InstaQLOptions,\n InstaQLResponse,\n PageInfoResponse,\n RoomSchemaShape,\n RoomsOf,\n Storage,\n Streams,\n TransactionChunk,\n User,\n ValidQuery,\n} from '@instantdb/core'\nimport type { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from 'vue'\nimport type { InfiniteQueryResult } from './useInfiniteQuery.js'\nimport {\n coerceQuery,\n init as core_init,\n InstantError,\n txInit,\n weakHash,\n} from '@instantdb/core'\nimport { computed, ref, shallowRef, toValue, watch } from 'vue'\nimport { InstantDuxRoom, rooms } from './InstantDuxRoom.js'\nimport { useInfiniteQuery } from './useInfiniteQuery.js'\nimport { isClient, tryOnScopeDispose } from './utils.js'\nimport version from './version.js'\n\n// ------\n// Types\n\nexport interface UseQueryReturn<\n Schema extends InstantSchemaDef<any, any, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> {\n isLoading: Ref<boolean>\n data: ShallowRef<InstaQLResponse<Schema, Q, UseDates> | undefined>\n pageInfo: ShallowRef<PageInfoResponse<Q> | undefined>\n error: ShallowRef<{ message: string } | undefined>\n}\n\nexport interface UseAuthReturn {\n isLoading: Ref<boolean>\n user: ShallowRef<User | null | undefined>\n error: ShallowRef<{ message: string } | undefined>\n}\n\nexport class InstantDuxDatabase<\n Schema extends InstantSchemaDef<any, any, any>,\n UseDates extends boolean = false,\n Rooms extends RoomSchemaShape = RoomsOf<Schema>,\n> implements IInstantDatabase<Schema> {\n public tx = txInit<Schema>()\n\n public auth: Auth\n public storage: Storage\n public streams: Streams\n public core: InstantCoreDatabase<Schema, UseDates>\n\n constructor(core: InstantCoreDatabase<Schema, UseDates>) {\n this.core = core\n this.auth = this.core.auth\n this.storage = this.core.storage\n this.streams = this.core.streams\n }\n\n getLocalId = (name: string): Promise<string> => {\n return this.core.getLocalId(name)\n }\n\n transact = (\n chunks: TransactionChunk<any, any> | TransactionChunk<any, any>[],\n ) => {\n return this.core.transact(chunks)\n }\n\n getAuth(): Promise<User | null> {\n return this.core.getAuth()\n }\n\n queryOnce = <Q extends ValidQuery<Q, Schema>>(\n query: Q,\n opts?: InstaQLOptions,\n ): Promise<{\n data: InstaQLResponse<Schema, Q, UseDates>\n pageInfo: PageInfoResponse<Q>\n }> => {\n return this.core.queryOnce(query, opts)\n }\n\n // -----------\n // Vue reactive hooks\n\n useQuery = <Q extends ValidQuery<Q, Schema>>(\n query: MaybeRefOrGetter<Q | null>,\n opts?: MaybeRefOrGetter<InstaQLOptions | null | undefined>,\n ): UseQueryReturn<Schema, Q, UseDates> => {\n const isLoading = ref(true)\n const data = shallowRef<InstaQLResponse<Schema, Q, UseDates> | undefined>(\n undefined,\n )\n const pageInfo = shallowRef<PageInfoResponse<Q> | undefined>(undefined)\n const error = shallowRef<{ message: string } | undefined>(undefined)\n\n const resolvedQuery = computed(() => {\n const q = toValue(query)\n if (!q)\n return null\n const o = toValue(opts)\n const withParams\n = o && 'ruleParams' in o\n ? ({ $$ruleParams: (o as any).ruleParams, ...q } as Q)\n : q\n return coerceQuery(withParams)\n })\n\n const queryHash = computed(() => weakHash(resolvedQuery.value))\n\n const stop = watch(\n queryHash,\n (_, __, onCleanup) => {\n const q = resolvedQuery.value\n\n // DUX-DELTA(ssr): inert state on the server — never read the cache or\n // open a subscription. The client path below is the official one.\n if (!isClient()) {\n isLoading.value = !!q\n return\n }\n // END DUX-DELTA\n\n const cached: any = q ? this.core._reactor.getPreviousResult(q) : null\n isLoading.value = !cached\n data.value = cached?.data\n pageInfo.value = cached?.pageInfo\n error.value = cached?.error\n\n if (!q)\n return\n\n const unsub = this.core.subscribeQuery<Q, UseDates>(q, (r: any) => {\n isLoading.value = false\n data.value = r.data\n pageInfo.value = r.pageInfo\n error.value = r.error\n })\n onCleanup(unsub)\n },\n { immediate: true },\n )\n\n tryOnScopeDispose(stop)\n\n return { isLoading, data, pageInfo, error } as UseQueryReturn<\n Schema,\n Q,\n UseDates\n >\n }\n\n useInfiniteQuery = <Q extends ValidQuery<Q, Schema>>(\n query: MaybeRefOrGetter<Q | null>,\n opts?: MaybeRefOrGetter<InstaQLOptions | undefined>,\n ): InfiniteQueryResult<Schema, Q, UseDates> => {\n return useInfiniteQuery<Schema, Q, UseDates>(this.core, query, opts)\n }\n\n useAuth = (): UseAuthReturn => {\n const cached = this.core._reactor._currentUserCached as\n | AuthState\n | undefined\n\n const isLoading = ref(cached?.isLoading ?? true)\n const user = shallowRef<User | null | undefined>(cached?.user)\n const error = shallowRef<{ message: string } | undefined>(cached?.error)\n\n // DUX-DELTA(ssr): no auth subscription on the server — inert loading state.\n if (!isClient())\n return { isLoading, user, error }\n // END DUX-DELTA\n\n const unsub = this.core.subscribeAuth((auth: any) => {\n isLoading.value = false\n user.value = auth.user ?? null\n error.value = auth.error\n })\n\n tryOnScopeDispose(unsub)\n\n return { isLoading, user, error }\n }\n\n useUser = (): ComputedRef<User> => {\n const { user } = this.useAuth()\n return computed(() => {\n if (!user.value) {\n throw new InstantError(\n 'useUser must be used within an auth-protected route',\n )\n }\n return user.value\n })\n }\n\n useConnectionStatus = (): Ref<ConnectionStatus> => {\n const status = ref<ConnectionStatus>(\n this.core._reactor.status as ConnectionStatus,\n )\n\n // DUX-DELTA(ssr): no connection subscription on the server.\n if (!isClient())\n return status\n // END DUX-DELTA\n\n const unsub = this.core.subscribeConnectionStatus((newStatus) => {\n status.value = newStatus\n })\n\n tryOnScopeDispose(unsub)\n\n return status\n }\n\n useLocalId = (name: MaybeRefOrGetter<string>): Ref<string | null> => {\n const localId = ref<string | null>(null)\n\n // DUX-DELTA(ssr): localId is a client-storage concern — inert on server.\n if (!isClient())\n return localId\n // END DUX-DELTA\n\n const stop = watch(\n () => toValue(name),\n (currentName) => {\n this.getLocalId(currentName).then((id) => {\n // Drop a late resolve if `name` has since changed.\n if (toValue(name) === currentName) {\n localId.value = id\n }\n })\n },\n { immediate: true },\n )\n\n tryOnScopeDispose(stop)\n return localId\n }\n\n room<RoomType extends string & keyof Rooms>(\n type?: MaybeRefOrGetter<RoomType | undefined>,\n id?: MaybeRefOrGetter<string | undefined>,\n ) {\n const _type = computed(\n () => (toValue(type) ?? '_defaultRoomType') as RoomType,\n )\n const _id = computed(() => toValue(id) ?? '_defaultRoomId')\n return new InstantDuxRoom<Schema, Rooms, RoomType>(this.core, _type, _id)\n }\n\n rooms = rooms\n}\n\n// -----------\n// init\n\nexport function init<\n Schema extends InstantSchemaDef<any, any, any>,\n UseDates extends boolean = false,\n>(\n config: Omit<InstantConfig<Schema, UseDates>, 'useDateObjects'> & {\n useDateObjects?: UseDates\n },\n): InstantDuxDatabase<Schema, UseDates> {\n const coreDb = core_init<Schema, UseDates>(config, undefined, undefined, {\n '@mszr/idb-dux': version,\n })\n return new InstantDuxDatabase<Schema, UseDates>(coreDb)\n}\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { InstantCoreDatabase, InstantSchemaDef, PresenceOpts, PresenceResponse, RoomSchemaShape } from '@instantdb/core';
|
|
2
|
+
import type { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from 'vue';
|
|
3
|
+
export type PresenceHandle<PresenceShape, Keys extends keyof PresenceShape> = {
|
|
4
|
+
[K in keyof PresenceResponse<PresenceShape, Keys>]: ShallowRef<PresenceResponse<PresenceShape, Keys>[K]>;
|
|
5
|
+
} & {
|
|
6
|
+
publishPresence: (data: Partial<PresenceShape>) => void;
|
|
7
|
+
};
|
|
8
|
+
export interface TypingIndicatorOpts {
|
|
9
|
+
timeout?: number | null;
|
|
10
|
+
stopOnEnter?: boolean;
|
|
11
|
+
writeOnly?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface TypingIndicatorHandle<PresenceShape> {
|
|
14
|
+
active: Ref<PresenceShape[]>;
|
|
15
|
+
setActive: (active: boolean) => void;
|
|
16
|
+
/**
|
|
17
|
+
* Listener keys are lowercased (`onKeydown`, not `onKeyDown`) so that
|
|
18
|
+
* Vue's `v-bind` spread hyphenates them correctly to native DOM events
|
|
19
|
+
* (`keydown`). With camelCase Vue would emit a non-existent `key-down`
|
|
20
|
+
* listener and the indicator would never fire.
|
|
21
|
+
*/
|
|
22
|
+
inputProps: {
|
|
23
|
+
onKeydown: (e: KeyboardEvent) => void;
|
|
24
|
+
onBlur: () => void;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export declare const defaultActivityStopTimeout = 1000;
|
|
28
|
+
/**
|
|
29
|
+
* Listen for broadcasted events given a room and topic.
|
|
30
|
+
*
|
|
31
|
+
* @see https://instantdb.com/docs/presence-and-topics
|
|
32
|
+
*/
|
|
33
|
+
export declare function useTopicEffect<RoomSchema extends RoomSchemaShape, RoomType extends keyof RoomSchema, TopicType extends keyof RoomSchema[RoomType]['topics']>(room: InstantDuxRoom<any, RoomSchema, RoomType>, topic: TopicType, onEvent: (event: RoomSchema[RoomType]['topics'][TopicType], peer: RoomSchema[RoomType]['presence']) => any): void;
|
|
34
|
+
/**
|
|
35
|
+
* Broadcast an event to a room.
|
|
36
|
+
*
|
|
37
|
+
* @see https://instantdb.com/docs/presence-and-topics
|
|
38
|
+
*/
|
|
39
|
+
export declare function usePublishTopic<RoomSchema extends RoomSchemaShape, RoomType extends keyof RoomSchema, TopicType extends keyof RoomSchema[RoomType]['topics']>(room: InstantDuxRoom<any, RoomSchema, RoomType>, topic: TopicType): (data: RoomSchema[RoomType]['topics'][TopicType]) => void;
|
|
40
|
+
/**
|
|
41
|
+
* Listen for peer's presence data in a room, and publish the current user's
|
|
42
|
+
* presence.
|
|
43
|
+
*
|
|
44
|
+
* @see https://instantdb.com/docs/presence-and-topics
|
|
45
|
+
*/
|
|
46
|
+
export declare function usePresence<RoomSchema extends RoomSchemaShape, RoomType extends keyof RoomSchema, Keys extends keyof RoomSchema[RoomType]['presence']>(room: InstantDuxRoom<any, RoomSchema, RoomType>, opts?: PresenceOpts<RoomSchema[RoomType]['presence'], Keys>): PresenceHandle<RoomSchema[RoomType]['presence'], Keys>;
|
|
47
|
+
/**
|
|
48
|
+
* Publishes presence data to a room.
|
|
49
|
+
*
|
|
50
|
+
* @see https://instantdb.com/docs/presence-and-topics
|
|
51
|
+
*/
|
|
52
|
+
export declare function useSyncPresence<RoomSchema extends RoomSchemaShape, RoomType extends keyof RoomSchema>(room: InstantDuxRoom<any, RoomSchema, RoomType>, data: MaybeRefOrGetter<Partial<RoomSchema[RoomType]['presence']>>): void;
|
|
53
|
+
/**
|
|
54
|
+
* Manage typing indicator state.
|
|
55
|
+
*
|
|
56
|
+
* @see https://instantdb.com/docs/presence-and-topics
|
|
57
|
+
*/
|
|
58
|
+
export declare function useTypingIndicator<RoomSchema extends RoomSchemaShape, RoomType extends keyof RoomSchema>(room: InstantDuxRoom<any, RoomSchema, RoomType>, inputName: string, opts?: TypingIndicatorOpts): TypingIndicatorHandle<RoomSchema[RoomType]['presence']>;
|
|
59
|
+
export declare const rooms: {
|
|
60
|
+
useTopicEffect: typeof useTopicEffect;
|
|
61
|
+
usePublishTopic: typeof usePublishTopic;
|
|
62
|
+
usePresence: typeof usePresence;
|
|
63
|
+
useSyncPresence: typeof useSyncPresence;
|
|
64
|
+
useTypingIndicator: typeof useTypingIndicator;
|
|
65
|
+
};
|
|
66
|
+
export declare class InstantDuxRoom<Schema extends InstantSchemaDef<any, any, any>, RoomSchema extends RoomSchemaShape, RoomType extends keyof RoomSchema> {
|
|
67
|
+
core: InstantCoreDatabase<Schema, boolean>;
|
|
68
|
+
type: ComputedRef<RoomType> | RoomType;
|
|
69
|
+
id: ComputedRef<string> | string;
|
|
70
|
+
constructor(core: InstantCoreDatabase<Schema, boolean>, type: ComputedRef<RoomType> | RoomType, id: ComputedRef<string> | string);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=InstantDuxRoom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstantDuxRoom.d.ts","sourceRoot":"","sources":["../../../../src/vue/baseline/InstantDuxRoom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { shallowRef, toValue, watchEffect } from 'vue';
|
|
2
|
+
import { isClient, tryOnScopeDispose } from './utils.js';
|
|
3
|
+
export const defaultActivityStopTimeout = 1_000;
|
|
4
|
+
// ------
|
|
5
|
+
// Topics
|
|
6
|
+
/**
|
|
7
|
+
* Listen for broadcasted events given a room and topic.
|
|
8
|
+
*
|
|
9
|
+
* @see https://instantdb.com/docs/presence-and-topics
|
|
10
|
+
*/
|
|
11
|
+
export function useTopicEffect(room, topic, onEvent) {
|
|
12
|
+
watchEffect((onCleanup) => {
|
|
13
|
+
// DUX-DELTA(ssr): no topic subscription on the server.
|
|
14
|
+
if (!isClient())
|
|
15
|
+
return;
|
|
16
|
+
// END DUX-DELTA
|
|
17
|
+
const type = toValue(room.type);
|
|
18
|
+
const id = toValue(room.id);
|
|
19
|
+
const unsub = room.core._reactor.subscribeTopic(type, id, topic, (event, peer) => {
|
|
20
|
+
onEvent(event, peer);
|
|
21
|
+
});
|
|
22
|
+
onCleanup(unsub);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Broadcast an event to a room.
|
|
27
|
+
*
|
|
28
|
+
* @see https://instantdb.com/docs/presence-and-topics
|
|
29
|
+
*/
|
|
30
|
+
export function usePublishTopic(room, topic) {
|
|
31
|
+
watchEffect((onCleanup) => {
|
|
32
|
+
// DUX-DELTA(ssr): no room join on the server.
|
|
33
|
+
if (!isClient())
|
|
34
|
+
return;
|
|
35
|
+
// END DUX-DELTA
|
|
36
|
+
const type = toValue(room.type);
|
|
37
|
+
const id = toValue(room.id);
|
|
38
|
+
const unsub = room.core._reactor.joinRoom(type, id);
|
|
39
|
+
onCleanup(unsub);
|
|
40
|
+
});
|
|
41
|
+
return (data) => {
|
|
42
|
+
room.core._reactor.publishTopic({
|
|
43
|
+
roomType: toValue(room.type),
|
|
44
|
+
roomId: toValue(room.id),
|
|
45
|
+
topic,
|
|
46
|
+
data,
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// ---------
|
|
51
|
+
// Presence
|
|
52
|
+
/**
|
|
53
|
+
* Listen for peer's presence data in a room, and publish the current user's
|
|
54
|
+
* presence.
|
|
55
|
+
*
|
|
56
|
+
* @see https://instantdb.com/docs/presence-and-topics
|
|
57
|
+
*/
|
|
58
|
+
export function usePresence(room, opts = {}) {
|
|
59
|
+
const initial = (room.core._reactor.getPresence(toValue(room.type), toValue(room.id), opts) ?? {
|
|
60
|
+
peers: {},
|
|
61
|
+
isLoading: true,
|
|
62
|
+
});
|
|
63
|
+
const peers = shallowRef(initial.peers);
|
|
64
|
+
const isLoading = shallowRef(initial.isLoading);
|
|
65
|
+
const user = shallowRef(initial.user);
|
|
66
|
+
const error = shallowRef(initial.error);
|
|
67
|
+
watchEffect((onCleanup) => {
|
|
68
|
+
// DUX-DELTA(ssr): no presence subscription on the server.
|
|
69
|
+
if (!isClient())
|
|
70
|
+
return;
|
|
71
|
+
// END DUX-DELTA
|
|
72
|
+
const type = toValue(room.type);
|
|
73
|
+
const id = toValue(room.id);
|
|
74
|
+
const unsub = room.core._reactor.subscribePresence(type, id, opts, (data) => {
|
|
75
|
+
peers.value = data.peers;
|
|
76
|
+
isLoading.value = data.isLoading;
|
|
77
|
+
if ('user' in data)
|
|
78
|
+
user.value = data.user;
|
|
79
|
+
if ('error' in data)
|
|
80
|
+
error.value = data.error;
|
|
81
|
+
});
|
|
82
|
+
onCleanup(unsub);
|
|
83
|
+
});
|
|
84
|
+
return {
|
|
85
|
+
peers,
|
|
86
|
+
isLoading,
|
|
87
|
+
user,
|
|
88
|
+
error,
|
|
89
|
+
publishPresence: (data) => {
|
|
90
|
+
room.core._reactor.publishPresence(toValue(room.type), toValue(room.id), data);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Publishes presence data to a room.
|
|
96
|
+
*
|
|
97
|
+
* @see https://instantdb.com/docs/presence-and-topics
|
|
98
|
+
*/
|
|
99
|
+
export function useSyncPresence(room, data) {
|
|
100
|
+
watchEffect((onCleanup) => {
|
|
101
|
+
// DUX-DELTA(ssr): no room join on the server.
|
|
102
|
+
if (!isClient())
|
|
103
|
+
return;
|
|
104
|
+
// END DUX-DELTA
|
|
105
|
+
const type = toValue(room.type);
|
|
106
|
+
const id = toValue(room.id);
|
|
107
|
+
const unsub = room.core._reactor.joinRoom(type, id, toValue(data));
|
|
108
|
+
onCleanup(unsub);
|
|
109
|
+
});
|
|
110
|
+
watchEffect(() => {
|
|
111
|
+
// DUX-DELTA(ssr): no presence publish on the server.
|
|
112
|
+
if (!isClient())
|
|
113
|
+
return;
|
|
114
|
+
// END DUX-DELTA
|
|
115
|
+
room.core._reactor.publishPresence(toValue(room.type), toValue(room.id), toValue(data));
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// -----------------
|
|
119
|
+
// Typing Indicator
|
|
120
|
+
/**
|
|
121
|
+
* Manage typing indicator state.
|
|
122
|
+
*
|
|
123
|
+
* @see https://instantdb.com/docs/presence-and-topics
|
|
124
|
+
*/
|
|
125
|
+
export function useTypingIndicator(room, inputName, opts = {}) {
|
|
126
|
+
let timeoutId = null;
|
|
127
|
+
const presence = usePresence(room, {
|
|
128
|
+
keys: [inputName],
|
|
129
|
+
});
|
|
130
|
+
const active = shallowRef([]);
|
|
131
|
+
watchEffect(() => {
|
|
132
|
+
if (opts?.writeOnly) {
|
|
133
|
+
active.value = [];
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Track peers so we re-run when presence updates
|
|
137
|
+
void presence.peers.value;
|
|
138
|
+
const snapshot = room.core._reactor.getPresence(toValue(room.type), toValue(room.id));
|
|
139
|
+
active.value = Object.values(snapshot?.peers ?? {}).filter((p) => p[inputName] === true);
|
|
140
|
+
});
|
|
141
|
+
const setActive = (isActive) => {
|
|
142
|
+
room.core._reactor.publishPresence(toValue(room.type), toValue(room.id), {
|
|
143
|
+
[inputName]: isActive ? true : null,
|
|
144
|
+
});
|
|
145
|
+
if (timeoutId) {
|
|
146
|
+
clearTimeout(timeoutId);
|
|
147
|
+
timeoutId = null;
|
|
148
|
+
}
|
|
149
|
+
if (!isActive)
|
|
150
|
+
return;
|
|
151
|
+
if (opts?.timeout === null || opts?.timeout === 0)
|
|
152
|
+
return;
|
|
153
|
+
timeoutId = setTimeout(() => {
|
|
154
|
+
room.core._reactor.publishPresence(toValue(room.type), toValue(room.id), {
|
|
155
|
+
[inputName]: null,
|
|
156
|
+
});
|
|
157
|
+
}, opts?.timeout ?? defaultActivityStopTimeout);
|
|
158
|
+
};
|
|
159
|
+
tryOnScopeDispose(() => {
|
|
160
|
+
if (timeoutId) {
|
|
161
|
+
clearTimeout(timeoutId);
|
|
162
|
+
timeoutId = null;
|
|
163
|
+
}
|
|
164
|
+
// Clear sticky typing state on unmount, even when timeout is disabled.
|
|
165
|
+
setActive(false);
|
|
166
|
+
});
|
|
167
|
+
const onKeydown = (e) => {
|
|
168
|
+
const isEnter = opts?.stopOnEnter && e.key === 'Enter';
|
|
169
|
+
const isActive = !isEnter;
|
|
170
|
+
setActive(isActive);
|
|
171
|
+
};
|
|
172
|
+
const onBlur = () => {
|
|
173
|
+
setActive(false);
|
|
174
|
+
};
|
|
175
|
+
return {
|
|
176
|
+
active,
|
|
177
|
+
setActive,
|
|
178
|
+
inputProps: { onKeydown, onBlur },
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// --------------
|
|
182
|
+
// Hooks namespace
|
|
183
|
+
export const rooms = {
|
|
184
|
+
useTopicEffect,
|
|
185
|
+
usePublishTopic,
|
|
186
|
+
usePresence,
|
|
187
|
+
useSyncPresence,
|
|
188
|
+
useTypingIndicator,
|
|
189
|
+
};
|
|
190
|
+
// ------------
|
|
191
|
+
// Class
|
|
192
|
+
export class InstantDuxRoom {
|
|
193
|
+
core;
|
|
194
|
+
type;
|
|
195
|
+
id;
|
|
196
|
+
constructor(core, type, id) {
|
|
197
|
+
this.core = core;
|
|
198
|
+
this.type = type;
|
|
199
|
+
this.id = id;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=InstantDuxRoom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstantDuxRoom.js","sourceRoot":"","sources":["../../../../src/vue/baseline/InstantDuxRoom.ts"],"names":[],"mappings":"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","sourcesContent":["// Vendored from @instantdb/vue/src/InstantVueRoom.ts — see UPSTREAM.md.\n// Deltas: class/handle rename (InstantVueRoom → InstantDuxRoom) and the SSR\n// floor guards on each reactor subscription.\nimport type {\n InstantCoreDatabase,\n InstantSchemaDef,\n PresenceOpts,\n PresenceResponse,\n RoomSchemaShape,\n} from '@instantdb/core'\nimport type { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from 'vue'\nimport { shallowRef, toValue, watchEffect } from 'vue'\n\nimport { isClient, tryOnScopeDispose } from './utils.js'\n\n// ------\n// Types\n\nexport type PresenceHandle<PresenceShape, Keys extends keyof PresenceShape> = {\n [K in keyof PresenceResponse<PresenceShape, Keys>]: ShallowRef<\n PresenceResponse<PresenceShape, Keys>[K]\n >\n} & {\n publishPresence: (data: Partial<PresenceShape>) => void\n}\n\nexport interface TypingIndicatorOpts {\n timeout?: number | null\n stopOnEnter?: boolean\n // Perf opt - `active` will always be an empty array\n writeOnly?: boolean\n}\n\nexport interface TypingIndicatorHandle<PresenceShape> {\n active: Ref<PresenceShape[]>\n setActive: (active: boolean) => void\n /**\n * Listener keys are lowercased (`onKeydown`, not `onKeyDown`) so that\n * Vue's `v-bind` spread hyphenates them correctly to native DOM events\n * (`keydown`). With camelCase Vue would emit a non-existent `key-down`\n * listener and the indicator would never fire.\n */\n inputProps: {\n onKeydown: (e: KeyboardEvent) => void\n onBlur: () => void\n }\n}\n\nexport const defaultActivityStopTimeout = 1_000\n\n// ------\n// Topics\n\n/**\n * Listen for broadcasted events given a room and topic.\n *\n * @see https://instantdb.com/docs/presence-and-topics\n */\nexport function useTopicEffect<\n RoomSchema extends RoomSchemaShape,\n RoomType extends keyof RoomSchema,\n TopicType extends keyof RoomSchema[RoomType]['topics'],\n>(\n room: InstantDuxRoom<any, RoomSchema, RoomType>,\n topic: TopicType,\n onEvent: (\n event: RoomSchema[RoomType]['topics'][TopicType],\n peer: RoomSchema[RoomType]['presence'],\n ) => any,\n): void {\n watchEffect((onCleanup) => {\n // DUX-DELTA(ssr): no topic subscription on the server.\n if (!isClient())\n return\n // END DUX-DELTA\n const type = toValue(room.type)\n const id = toValue(room.id)\n const unsub = room.core._reactor.subscribeTopic(\n type,\n id,\n topic,\n (event: any, peer: any) => {\n onEvent(event, peer)\n },\n )\n onCleanup(unsub)\n })\n}\n\n/**\n * Broadcast an event to a room.\n *\n * @see https://instantdb.com/docs/presence-and-topics\n */\nexport function usePublishTopic<\n RoomSchema extends RoomSchemaShape,\n RoomType extends keyof RoomSchema,\n TopicType extends keyof RoomSchema[RoomType]['topics'],\n>(\n room: InstantDuxRoom<any, RoomSchema, RoomType>,\n topic: TopicType,\n): (data: RoomSchema[RoomType]['topics'][TopicType]) => void {\n watchEffect((onCleanup) => {\n // DUX-DELTA(ssr): no room join on the server.\n if (!isClient())\n return\n // END DUX-DELTA\n const type = toValue(room.type) as string\n const id = toValue(room.id)\n const unsub = room.core._reactor.joinRoom(type, id)\n onCleanup(unsub)\n })\n\n return (data: RoomSchema[RoomType]['topics'][TopicType]) => {\n room.core._reactor.publishTopic({\n roomType: toValue(room.type),\n roomId: toValue(room.id),\n topic,\n data,\n })\n }\n}\n\n// ---------\n// Presence\n\n/**\n * Listen for peer's presence data in a room, and publish the current user's\n * presence.\n *\n * @see https://instantdb.com/docs/presence-and-topics\n */\nexport function usePresence<\n RoomSchema extends RoomSchemaShape,\n RoomType extends keyof RoomSchema,\n Keys extends keyof RoomSchema[RoomType]['presence'],\n>(\n room: InstantDuxRoom<any, RoomSchema, RoomType>,\n opts: PresenceOpts<RoomSchema[RoomType]['presence'], Keys> = {},\n): PresenceHandle<RoomSchema[RoomType]['presence'], Keys> {\n const initial = (room.core._reactor.getPresence(\n toValue(room.type),\n toValue(room.id),\n opts,\n ) ?? {\n peers: {},\n isLoading: true,\n }) as PresenceResponse<RoomSchema[RoomType]['presence'], Keys>\n\n const peers = shallowRef(initial.peers)\n const isLoading = shallowRef(initial.isLoading)\n const user = shallowRef<any>((initial as any).user)\n const error = shallowRef<any>((initial as any).error)\n\n watchEffect((onCleanup) => {\n // DUX-DELTA(ssr): no presence subscription on the server.\n if (!isClient())\n return\n // END DUX-DELTA\n const type = toValue(room.type)\n const id = toValue(room.id)\n const unsub = room.core._reactor.subscribePresence(\n type,\n id,\n opts,\n (data: any) => {\n peers.value = data.peers\n isLoading.value = data.isLoading\n if ('user' in data)\n user.value = data.user\n if ('error' in data)\n error.value = data.error\n },\n )\n onCleanup(unsub)\n })\n\n return {\n peers,\n isLoading,\n user,\n error,\n publishPresence: (data: Partial<RoomSchema[RoomType]['presence']>) => {\n room.core._reactor.publishPresence(\n toValue(room.type),\n toValue(room.id),\n data,\n )\n },\n } as PresenceHandle<RoomSchema[RoomType]['presence'], Keys>\n}\n\n/**\n * Publishes presence data to a room.\n *\n * @see https://instantdb.com/docs/presence-and-topics\n */\nexport function useSyncPresence<\n RoomSchema extends RoomSchemaShape,\n RoomType extends keyof RoomSchema,\n>(\n room: InstantDuxRoom<any, RoomSchema, RoomType>,\n data: MaybeRefOrGetter<Partial<RoomSchema[RoomType]['presence']>>,\n): void {\n watchEffect((onCleanup) => {\n // DUX-DELTA(ssr): no room join on the server.\n if (!isClient())\n return\n // END DUX-DELTA\n const type = toValue(room.type) as string\n const id = toValue(room.id)\n const unsub = room.core._reactor.joinRoom(type, id, toValue(data))\n onCleanup(unsub)\n })\n\n watchEffect(() => {\n // DUX-DELTA(ssr): no presence publish on the server.\n if (!isClient())\n return\n // END DUX-DELTA\n room.core._reactor.publishPresence(\n toValue(room.type),\n toValue(room.id),\n toValue(data),\n )\n })\n}\n\n// -----------------\n// Typing Indicator\n\n/**\n * Manage typing indicator state.\n *\n * @see https://instantdb.com/docs/presence-and-topics\n */\nexport function useTypingIndicator<\n RoomSchema extends RoomSchemaShape,\n RoomType extends keyof RoomSchema,\n>(\n room: InstantDuxRoom<any, RoomSchema, RoomType>,\n inputName: string,\n opts: TypingIndicatorOpts = {},\n): TypingIndicatorHandle<RoomSchema[RoomType]['presence']> {\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n\n const presence = usePresence(room, {\n keys: [inputName] as (keyof RoomSchema[RoomType]['presence'])[],\n })\n\n const active = shallowRef<RoomSchema[RoomType]['presence'][]>([])\n\n watchEffect(() => {\n if (opts?.writeOnly) {\n active.value = []\n return\n }\n // Track peers so we re-run when presence updates\n void presence.peers.value\n const snapshot = room.core._reactor.getPresence(\n toValue(room.type),\n toValue(room.id),\n )\n active.value = Object.values(snapshot?.peers ?? {}).filter(\n (p: any) => p[inputName] === true,\n )\n })\n\n const setActive = (isActive: boolean) => {\n room.core._reactor.publishPresence(toValue(room.type), toValue(room.id), {\n [inputName]: isActive ? true : null,\n } as Partial<RoomSchema[RoomType]['presence']>)\n\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n\n if (!isActive)\n return\n if (opts?.timeout === null || opts?.timeout === 0)\n return\n\n timeoutId = setTimeout(() => {\n room.core._reactor.publishPresence(toValue(room.type), toValue(room.id), {\n [inputName]: null,\n } as Partial<RoomSchema[RoomType]['presence']>)\n }, opts?.timeout ?? defaultActivityStopTimeout)\n }\n\n tryOnScopeDispose(() => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n timeoutId = null\n }\n // Clear sticky typing state on unmount, even when timeout is disabled.\n setActive(false)\n })\n\n const onKeydown = (e: KeyboardEvent) => {\n const isEnter = opts?.stopOnEnter && e.key === 'Enter'\n const isActive = !isEnter\n setActive(isActive)\n }\n\n const onBlur = () => {\n setActive(false)\n }\n\n return {\n active,\n setActive,\n inputProps: { onKeydown, onBlur },\n }\n}\n\n// --------------\n// Hooks namespace\n\nexport const rooms = {\n useTopicEffect,\n usePublishTopic,\n usePresence,\n useSyncPresence,\n useTypingIndicator,\n}\n\n// ------------\n// Class\n\nexport class InstantDuxRoom<\n Schema extends InstantSchemaDef<any, any, any>,\n RoomSchema extends RoomSchemaShape,\n RoomType extends keyof RoomSchema,\n> {\n core: InstantCoreDatabase<Schema, boolean>\n type: ComputedRef<RoomType> | RoomType\n id: ComputedRef<string> | string\n\n constructor(\n core: InstantCoreDatabase<Schema, boolean>,\n type: ComputedRef<RoomType> | RoomType,\n id: ComputedRef<string> | string,\n ) {\n this.core = core\n this.type = type\n this.id = id\n }\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const Cursor: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
2
|
+
color: {
|
|
3
|
+
type: StringConstructor;
|
|
4
|
+
required: true;
|
|
5
|
+
};
|
|
6
|
+
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
9
|
+
color: {
|
|
10
|
+
type: StringConstructor;
|
|
11
|
+
required: true;
|
|
12
|
+
};
|
|
13
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
14
|
+
export default Cursor;
|
|
15
|
+
//# sourceMappingURL=Cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cursor.d.ts","sourceRoot":"","sources":["../../../../../src/vue/baseline/components/Cursor.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,MAAM;;;;;;;;;;;;iGAmCjB,CAAA;AAEF,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Vendored from @instantdb/vue/src/components/Cursor.vue — see UPSTREAM.md.
|
|
2
|
+
// DUX-DELTA(components): shipped as a `.ts` render function rather than a
|
|
3
|
+
// `.vue` SFC, so the library needs no SFC compile step and the boundary lint
|
|
4
|
+
// can see the source. Behavior matches the SFC.
|
|
5
|
+
import { defineComponent, h } from 'vue';
|
|
6
|
+
const paths = [
|
|
7
|
+
{ fill: 'rgba(0,0,0,.2)', useColor: false },
|
|
8
|
+
{ fill: 'white', useColor: false },
|
|
9
|
+
{ fill: null, useColor: true },
|
|
10
|
+
];
|
|
11
|
+
export const Cursor = defineComponent({
|
|
12
|
+
name: 'Cursor',
|
|
13
|
+
props: { color: { type: String, required: true } },
|
|
14
|
+
setup(props) {
|
|
15
|
+
return () => h('svg', {
|
|
16
|
+
style: { height: '35px', width: '35px' },
|
|
17
|
+
viewBox: '0 0 35 35',
|
|
18
|
+
fill: 'none',
|
|
19
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
|
20
|
+
}, paths.map((layer, index) => h('g', {
|
|
21
|
+
key: index,
|
|
22
|
+
fill: layer.useColor ? props.color || 'black' : layer.fill,
|
|
23
|
+
transform: 'matrix(1, 0, 0, 1, -11.999999046325684, -8.406899452209473)',
|
|
24
|
+
}, index === 2
|
|
25
|
+
? [
|
|
26
|
+
h('path', { d: 'm19.751 24.4155-1.844.774-3.1-7.374 1.841-.775z' }),
|
|
27
|
+
h('path', { d: 'm13 10.814v11.188l2.969-2.866.428-.139h4.768z' }),
|
|
28
|
+
]
|
|
29
|
+
: [
|
|
30
|
+
h('path', { d: 'm12 24.4219v-16.015l11.591 11.619h-6.781l-.411.124z' }),
|
|
31
|
+
h('path', { d: 'm21.0845 25.0962-3.605 1.535-4.682-11.089 3.686-1.553z' }),
|
|
32
|
+
])));
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
export default Cursor;
|
|
36
|
+
//# sourceMappingURL=Cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cursor.js","sourceRoot":"","sources":["../../../../../src/vue/baseline/components/Cursor.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,0EAA0E;AAC1E,6EAA6E;AAC7E,gDAAgD;AAChD,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAExC,MAAM,KAAK,GAAG;IACZ,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE;IAC3C,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;IAClC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;CACtB,CAAA;AAEV,MAAM,CAAC,MAAM,MAAM,GAAG,eAAe,CAAC;IACpC,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;IAClD,KAAK,CAAC,KAAK;QACT,OAAO,GAAG,EAAE,CACV,CAAC,CACC,KAAK,EACL;YACE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;YACxC,OAAO,EAAE,WAAW;YACpB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,4BAA4B;SACpC,EACD,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACzB,CAAC,CACC,GAAG,EACH;YACE,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;YAC1D,SAAS,EACP,6DAA6D;SAChE,EACD,KAAK,KAAK,CAAC;YACT,CAAC,CAAC;gBACE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,iDAAiD,EAAE,CAAC;gBACnE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,+CAA+C,EAAE,CAAC;aAClE;YACH,CAAC,CAAC;gBACE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,qDAAqD,EAAE,CAAC;gBACvE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,wDAAwD,EAAE,CAAC;aAC3E,CACN,CACF,CACF,CAAA;IACL,CAAC;CACF,CAAC,CAAA;AAEF,eAAe,MAAM,CAAA","sourcesContent":["// Vendored from @instantdb/vue/src/components/Cursor.vue — see UPSTREAM.md.\n// DUX-DELTA(components): shipped as a `.ts` render function rather than a\n// `.vue` SFC, so the library needs no SFC compile step and the boundary lint\n// can see the source. Behavior matches the SFC.\nimport { defineComponent, h } from 'vue'\n\nconst paths = [\n { fill: 'rgba(0,0,0,.2)', useColor: false },\n { fill: 'white', useColor: false },\n { fill: null, useColor: true },\n] as const\n\nexport const Cursor = defineComponent({\n name: 'Cursor',\n props: { color: { type: String, required: true } },\n setup(props) {\n return () =>\n h(\n 'svg',\n {\n style: { height: '35px', width: '35px' },\n viewBox: '0 0 35 35',\n fill: 'none',\n xmlns: 'http://www.w3.org/2000/svg',\n },\n paths.map((layer, index) =>\n h(\n 'g',\n {\n key: index,\n fill: layer.useColor ? props.color || 'black' : layer.fill,\n transform:\n 'matrix(1, 0, 0, 1, -11.999999046325684, -8.406899452209473)',\n },\n index === 2\n ? [\n h('path', { d: 'm19.751 24.4155-1.844.774-3.1-7.374 1.841-.775z' }),\n h('path', { d: 'm13 10.814v11.188l2.969-2.866.428-.139h4.768z' }),\n ]\n : [\n h('path', { d: 'm12 24.4219v-16.015l11.591 11.619h-6.781l-.411.124z' }),\n h('path', { d: 'm21.0845 25.0962-3.605 1.535-4.682-11.089 3.686-1.553z' }),\n ],\n ),\n ),\n )\n },\n})\n\nexport default Cursor\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { ComputedRef, PropType } from 'vue';
|
|
2
|
+
interface GenericRoom {
|
|
3
|
+
type: ComputedRef<string> | string;
|
|
4
|
+
id: ComputedRef<string> | string;
|
|
5
|
+
core: any;
|
|
6
|
+
}
|
|
7
|
+
export declare const Cursors: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
8
|
+
room: {
|
|
9
|
+
type: PropType<GenericRoom>;
|
|
10
|
+
required: true;
|
|
11
|
+
};
|
|
12
|
+
spaceId: {
|
|
13
|
+
type: StringConstructor;
|
|
14
|
+
required: false;
|
|
15
|
+
};
|
|
16
|
+
as: {
|
|
17
|
+
type: StringConstructor;
|
|
18
|
+
default: string;
|
|
19
|
+
};
|
|
20
|
+
userCursorColor: {
|
|
21
|
+
type: StringConstructor;
|
|
22
|
+
required: false;
|
|
23
|
+
};
|
|
24
|
+
propagate: {
|
|
25
|
+
type: BooleanConstructor;
|
|
26
|
+
default: boolean;
|
|
27
|
+
};
|
|
28
|
+
zIndex: {
|
|
29
|
+
type: NumberConstructor;
|
|
30
|
+
default: number;
|
|
31
|
+
};
|
|
32
|
+
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
33
|
+
[key: string]: any;
|
|
34
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
35
|
+
room: {
|
|
36
|
+
type: PropType<GenericRoom>;
|
|
37
|
+
required: true;
|
|
38
|
+
};
|
|
39
|
+
spaceId: {
|
|
40
|
+
type: StringConstructor;
|
|
41
|
+
required: false;
|
|
42
|
+
};
|
|
43
|
+
as: {
|
|
44
|
+
type: StringConstructor;
|
|
45
|
+
default: string;
|
|
46
|
+
};
|
|
47
|
+
userCursorColor: {
|
|
48
|
+
type: StringConstructor;
|
|
49
|
+
required: false;
|
|
50
|
+
};
|
|
51
|
+
propagate: {
|
|
52
|
+
type: BooleanConstructor;
|
|
53
|
+
default: boolean;
|
|
54
|
+
};
|
|
55
|
+
zIndex: {
|
|
56
|
+
type: NumberConstructor;
|
|
57
|
+
default: number;
|
|
58
|
+
};
|
|
59
|
+
}>> & Readonly<{}>, {
|
|
60
|
+
as: string;
|
|
61
|
+
propagate: boolean;
|
|
62
|
+
zIndex: number;
|
|
63
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
64
|
+
export default Cursors;
|
|
65
|
+
//# sourceMappingURL=Cursors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cursors.d.ts","sourceRoot":"","sources":["../../../../../src/vue/baseline/components/Cursors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AAyBhD,UAAU,WAAW;IACnB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;IAClC,EAAE,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;IAChC,IAAI,EAAE,GAAG,CAAA;CACV;AAED,eAAO,MAAM,OAAO;;cAGQ,QAAQ,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;cAArB,QAAQ,CAAC,WAAW,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;4EA8H/C,CAAA;AAEF,eAAe,OAAO,CAAA"}
|