@antelopejs/interface-dms 0.10.3 → 0.12.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/CHANGELOG.md +47 -0
- package/README.md +21 -10
- package/dist/attachments.d.ts +15 -2
- package/dist/attachments.js +14 -1
- package/dist/attachments.js.map +1 -1
- package/dist/auth/db/models/sessions.model.d.ts +7 -5
- package/dist/auth/db/models/sessions.model.js +2 -9
- package/dist/auth/db/models/sessions.model.js.map +1 -1
- package/dist/auth/db/models/userExternalIdentities.model.d.ts +7 -5
- package/dist/auth/db/models/users.model.d.ts +7 -5
- package/dist/auth/db/tables/users.table.d.ts +4 -2
- package/dist/auth/db/tables/users.table.js.map +1 -1
- package/dist/auth/index.d.ts +4 -4
- package/dist/auth/internal/jwt-auth-decorator.d.ts +1 -1
- package/dist/auth/internal/jwt-auth-decorator.js +6 -3
- package/dist/auth/internal/jwt-auth-decorator.js.map +1 -1
- package/dist/auth/internal/request-authenticators.d.ts +12 -0
- package/dist/auth/internal/request-authenticators.js +53 -10
- package/dist/auth/internal/request-authenticators.js.map +1 -1
- package/dist/base/activity-feed.d.ts +34 -32
- package/dist/base/activity-feed.js +2 -0
- package/dist/base/activity-feed.js.map +1 -1
- package/dist/base/banner.d.ts +12 -10
- package/dist/base/banner.js +2 -0
- package/dist/base/banner.js.map +1 -1
- package/dist/base/block-registry/internal/describe.js +3 -9
- package/dist/base/block-registry/internal/describe.js.map +1 -1
- package/dist/base/block-registry/internal/ui.js +1 -1
- package/dist/base/block-registry/internal/ui.js.map +1 -1
- package/dist/base/card.d.ts +11 -9
- package/dist/base/card.js +2 -0
- package/dist/base/card.js.map +1 -1
- package/dist/base/chart-card.d.ts +4 -2
- package/dist/base/chart-card.js +2 -0
- package/dist/base/chart-card.js.map +1 -1
- package/dist/base/chart-schemas.d.ts +148 -148
- package/dist/base/chart.d.ts +65 -0
- package/dist/base/chart.js +65 -0
- package/dist/base/chart.js.map +1 -1
- package/dist/base/code-block.d.ts +5 -3
- package/dist/base/code-block.js +2 -0
- package/dist/base/code-block.js.map +1 -1
- package/dist/base/custom.d.ts +5 -0
- package/dist/base/custom.js +5 -0
- package/dist/base/custom.js.map +1 -1
- package/dist/base/data-types/default/address.d.ts +5 -0
- package/dist/base/data-types/default/address.js +5 -0
- package/dist/base/data-types/default/address.js.map +1 -1
- package/dist/base/data-types/default/choices.d.ts +20 -0
- package/dist/base/data-types/default/choices.js +20 -0
- package/dist/base/data-types/default/choices.js.map +1 -1
- package/dist/base/data-types/default/files.d.ts +22 -5
- package/dist/base/data-types/default/files.js +20 -0
- package/dist/base/data-types/default/files.js.map +1 -1
- package/dist/base/data-types/default/numbers.d.ts +15 -0
- package/dist/base/data-types/default/numbers.js +25 -9
- package/dist/base/data-types/default/numbers.js.map +1 -1
- package/dist/base/data-types/default/relations.d.ts +10 -2
- package/dist/base/data-types/default/relations.js +9 -6
- package/dist/base/data-types/default/relations.js.map +1 -1
- package/dist/base/data-types/default/strings.d.ts +25 -0
- package/dist/base/data-types/default/strings.js +25 -0
- package/dist/base/data-types/default/strings.js.map +1 -1
- package/dist/base/data-types/default-types.d.ts +1 -1
- package/dist/base/data-types/field-types.d.ts +10 -0
- package/dist/base/data-types/field-types.js +10 -0
- package/dist/base/data-types/field-types.js.map +1 -1
- package/dist/base/data-types/internal/relation-endpoints.js +1 -0
- package/dist/base/data-types/internal/relation-endpoints.js.map +1 -1
- package/dist/base/data-types/status-type.d.ts +5 -0
- package/dist/base/data-types/status-type.js +5 -0
- package/dist/base/data-types/status-type.js.map +1 -1
- package/dist/base/display.d.ts +6 -6
- package/dist/base/empty-state.d.ts +15 -13
- package/dist/base/empty-state.js +2 -0
- package/dist/base/empty-state.js.map +1 -1
- package/dist/base/form-block-schema.d.ts +50 -50
- package/dist/base/form-schema.d.ts +2 -0
- package/dist/base/form-schema.js +2 -0
- package/dist/base/form-schema.js.map +1 -1
- package/dist/base/grid.d.ts +4 -0
- package/dist/base/grid.js +4 -0
- package/dist/base/grid.js.map +1 -1
- package/dist/base/guard.d.ts +30 -28
- package/dist/base/guard.js +2 -0
- package/dist/base/guard.js.map +1 -1
- package/dist/base/helpers/archive-mode-helpers.d.ts +1 -1
- package/dist/base/helpers/file-refs.js +15 -15
- package/dist/base/helpers/file-refs.js.map +1 -1
- package/dist/base/internal/form-schema-validation.js +7 -1
- package/dist/base/internal/form-schema-validation.js.map +1 -1
- package/dist/base/internal/realtime-topics.js.map +1 -1
- package/dist/base/internal/searchable.d.ts +2 -1
- package/dist/base/internal/searchable.js +1 -3
- package/dist/base/internal/searchable.js.map +1 -1
- package/dist/base/key-value-list.d.ts +21 -19
- package/dist/base/key-value-list.js +2 -0
- package/dist/base/key-value-list.js.map +1 -1
- package/dist/base/kpi-card.d.ts +4 -2
- package/dist/base/kpi-card.js +2 -0
- package/dist/base/kpi-card.js.map +1 -1
- package/dist/base/live-toggle.d.ts +2 -0
- package/dist/base/live-toggle.js +2 -0
- package/dist/base/live-toggle.js.map +1 -1
- package/dist/base/meter.d.ts +23 -21
- package/dist/base/meter.js +2 -0
- package/dist/base/meter.js.map +1 -1
- package/dist/base/nav-card-grid.d.ts +24 -19
- package/dist/base/nav-card-grid.js +5 -0
- package/dist/base/nav-card-grid.js.map +1 -1
- package/dist/base/page-toolbar.d.ts +2 -0
- package/dist/base/page-toolbar.js +2 -0
- package/dist/base/page-toolbar.js.map +1 -1
- package/dist/base/period-selector.d.ts +3 -1
- package/dist/base/period-selector.js +2 -0
- package/dist/base/period-selector.js.map +1 -1
- package/dist/base/placeholder.d.ts +2 -0
- package/dist/base/placeholder.js +2 -0
- package/dist/base/placeholder.js.map +1 -1
- package/dist/base/resource-form-schema.d.ts +2 -2
- package/dist/base/searchable.d.ts +3 -2
- package/dist/base/searchable.js +2 -2
- package/dist/base/searchable.js.map +1 -1
- package/dist/base/section.d.ts +6 -2
- package/dist/base/section.js +4 -0
- package/dist/base/section.js.map +1 -1
- package/dist/base/stack.d.ts +6 -0
- package/dist/base/stack.js +6 -0
- package/dist/base/stack.js.map +1 -1
- package/dist/base/stat-group.d.ts +16 -14
- package/dist/base/stat-group.js +2 -0
- package/dist/base/stat-group.js.map +1 -1
- package/dist/base/tab.d.ts +10 -8
- package/dist/base/tab.js +2 -0
- package/dist/base/tab.js.map +1 -1
- package/dist/base/table-view/column-display.d.ts +1 -1
- package/dist/base/table-view/column-display.js.map +1 -1
- package/dist/base/table-view/data-functions.d.ts +10 -4
- package/dist/base/table-view/data-functions.js.map +1 -1
- package/dist/base/table-view/factory.d.ts +5 -0
- package/dist/base/table-view/factory.js +8 -4
- package/dist/base/table-view/factory.js.map +1 -1
- package/dist/base/table-view/internal/auth.d.ts +17 -3
- package/dist/base/table-view/internal/auth.js +26 -5
- package/dist/base/table-view/internal/auth.js.map +1 -1
- package/dist/base/table-view/internal/column-conditions.d.ts +8 -1
- package/dist/base/table-view/internal/column-conditions.js +25 -13
- package/dist/base/table-view/internal/column-conditions.js.map +1 -1
- package/dist/base/table-view/internal/column-display.d.ts +1 -2
- package/dist/base/table-view/internal/column-display.js +3 -9
- package/dist/base/table-view/internal/column-display.js.map +1 -1
- package/dist/base/table-view/internal/factory-helpers.d.ts +1 -1
- package/dist/base/table-view/internal/factory-helpers.js +17 -14
- package/dist/base/table-view/internal/factory-helpers.js.map +1 -1
- package/dist/base/table-view/internal/factory-lifecycle-created.d.ts +2 -3
- package/dist/base/table-view/internal/factory-lifecycle-created.js +5 -5
- package/dist/base/table-view/internal/factory-lifecycle-created.js.map +1 -1
- package/dist/base/table-view/internal/factory-lifecycle-filter.d.ts +2 -2
- package/dist/base/table-view/internal/factory-private-actions.d.ts +2 -2
- package/dist/base/table-view/internal/files.d.ts +2 -1
- package/dist/base/table-view/internal/files.js +14 -5
- package/dist/base/table-view/internal/files.js.map +1 -1
- package/dist/base/table-view/internal/footer.d.ts +3 -3
- package/dist/base/table-view/internal/footer.js +16 -15
- package/dist/base/table-view/internal/footer.js.map +1 -1
- package/dist/base/table-view/internal/guards.d.ts +27 -5
- package/dist/base/table-view/internal/guards.js +127 -49
- package/dist/base/table-view/internal/guards.js.map +1 -1
- package/dist/base/table-view/internal/meta-helpers.d.ts +1 -1
- package/dist/base/table-view/internal/meta-helpers.js +3 -4
- package/dist/base/table-view/internal/meta-helpers.js.map +1 -1
- package/dist/base/table-view/internal/meta.js +2 -3
- package/dist/base/table-view/internal/meta.js.map +1 -1
- package/dist/base/table-view/internal/option-contract.d.ts +1 -1
- package/dist/base/table-view/internal/option-footer.d.ts +2 -2
- package/dist/base/table-view/internal/option-row-actions.d.ts +1 -1
- package/dist/base/table-view/internal/realtime.d.ts +52 -11
- package/dist/base/table-view/internal/realtime.js +23 -16
- package/dist/base/table-view/internal/realtime.js.map +1 -1
- package/dist/base/table-view/internal/resource-form.d.ts +1 -1
- package/dist/base/table-view/internal/resource-form.js +1 -1
- package/dist/base/table-view/internal/resource-form.js.map +1 -1
- package/dist/base/table-view/internal/row-actions-schema.d.ts +12 -12
- package/dist/base/table-view/internal/row-rule-shape.d.ts +11 -5
- package/dist/base/table-view/internal/row-rule-shape.js +60 -30
- package/dist/base/table-view/internal/row-rule-shape.js.map +1 -1
- package/dist/base/table-view/internal/row-rules.d.ts +28 -1
- package/dist/base/table-view/internal/row-rules.js +8 -19
- package/dist/base/table-view/internal/row-rules.js.map +1 -1
- package/dist/base/table-view/internal/tabs.d.ts +1 -1
- package/dist/base/table-view/internal/tabs.js +1 -4
- package/dist/base/table-view/internal/tabs.js.map +1 -1
- package/dist/base/table-view/internal/validation.d.ts +2 -2
- package/dist/base/table-view/internal/validation.js +7 -7
- package/dist/base/table-view/internal/validation.js.map +1 -1
- package/dist/base/table-view/meta.d.ts +7 -6
- package/dist/base/table-view/meta.js +12 -7
- package/dist/base/table-view/meta.js.map +1 -1
- package/dist/base/table-view/resource-form.d.ts +3 -1
- package/dist/base/table-view/resource-form.js +2 -0
- package/dist/base/table-view/resource-form.js.map +1 -1
- package/dist/base/table-view/routes.d.ts +73 -21
- package/dist/base/table-view/routes.js +13 -10
- package/dist/base/table-view/routes.js.map +1 -1
- package/dist/base/table-view/schema.d.ts +152 -152
- package/dist/base/table-view/source.js +4 -1
- package/dist/base/table-view/source.js.map +1 -1
- package/dist/base/table-view.d.ts +1 -1
- package/dist/base/table-view.js.map +1 -1
- package/dist/base/top-list-card.d.ts +35 -33
- package/dist/base/top-list-card.js +2 -0
- package/dist/base/top-list-card.js.map +1 -1
- package/dist/base/types/error.js +5 -2
- package/dist/base/types/error.js.map +1 -1
- package/dist/base/types/guards.d.ts +4 -4
- package/dist/base/types/json.d.ts +1 -10
- package/dist/base/types/row-action.d.ts +7 -7
- package/dist/component-options/confirm-dialog.d.ts +2 -0
- package/dist/component-options/confirm-dialog.js.map +1 -1
- package/dist/component-options/data-type.d.ts +2 -2
- package/dist/component-options/data-type.js +7 -7
- package/dist/component-options/data-type.js.map +1 -1
- package/dist/component-options/row-action.d.ts +14 -9
- package/dist/component-slots.d.ts +11 -2
- package/dist/component-slots.js +1 -0
- package/dist/component-slots.js.map +1 -1
- package/dist/component.d.ts +7 -8
- package/dist/component.js +17 -25
- package/dist/component.js.map +1 -1
- package/dist/data-controllers/members.d.ts +11 -7
- package/dist/data-controllers/members.js +1 -1
- package/dist/data-controllers/members.js.map +1 -1
- package/dist/data-controllers/roles.d.ts +32 -10
- package/dist/db/internal/exportJobs.model.d.ts +7 -5
- package/dist/db/internal/inviteResolutions.model.d.ts +7 -5
- package/dist/db/internal/tenantLifecycle.model.d.ts +7 -5
- package/dist/db/models/roles.model.d.ts +7 -5
- package/dist/db/models/tenantMembers.model.d.ts +7 -5
- package/dist/db/models/tenants.model.d.ts +7 -5
- package/dist/db/models/user_invites.model.d.ts +7 -5
- package/dist/db/tables/tenants.table.d.ts +9 -0
- package/dist/db/tables/tenants.table.js +4 -0
- package/dist/db/tables/tenants.table.js.map +1 -1
- package/dist/guards.d.ts +1 -1
- package/dist/hooks.d.ts +10 -9
- package/dist/hooks.js +42 -33
- package/dist/hooks.js.map +1 -1
- package/dist/internal/attachments.d.ts +2 -2
- package/dist/internal/component-builder.js +2 -1
- package/dist/internal/component-builder.js.map +1 -1
- package/dist/internal/component-serialization.d.ts +2 -4
- package/dist/internal/component-serialization.js +4 -3
- package/dist/internal/component-serialization.js.map +1 -1
- package/dist/internal/component-slots.d.ts +19 -2
- package/dist/internal/component-slots.js +35 -12
- package/dist/internal/component-slots.js.map +1 -1
- package/dist/internal/component-watch-filter.d.ts +11 -0
- package/dist/internal/component-watch-filter.js +22 -0
- package/dist/internal/component-watch-filter.js.map +1 -0
- package/dist/internal/component-watches.js +0 -1
- package/dist/internal/component-watches.js.map +1 -1
- package/dist/internal/own-entry.d.ts +7 -0
- package/dist/internal/own-entry.js +13 -0
- package/dist/internal/own-entry.js.map +1 -0
- package/dist/invite-extension-payloads.d.ts +14 -2
- package/dist/invite-extensions/internal/delivery.js +1 -2
- package/dist/invite-extensions/internal/delivery.js.map +1 -1
- package/dist/invite-extensions/internal/edit.d.ts +2 -1
- package/dist/invite-extensions/internal/edit.js +8 -9
- package/dist/invite-extensions/internal/edit.js.map +1 -1
- package/dist/invite-extensions/internal/form-slot.js +8 -15
- package/dist/invite-extensions/internal/form-slot.js.map +1 -1
- package/dist/invite-extensions/internal/payload-slices.d.ts +33 -3
- package/dist/invite-extensions/internal/payload-slices.js +84 -19
- package/dist/invite-extensions/internal/payload-slices.js.map +1 -1
- package/dist/invite-extensions/internal/types.d.ts +10 -1
- package/dist/invite-resolution.js +6 -4
- package/dist/invite-resolution.js.map +1 -1
- package/dist/json.d.ts +10 -0
- package/dist/json.js +3 -0
- package/dist/json.js.map +1 -0
- package/dist/layout-banners.d.ts +5 -2
- package/dist/layout-banners.js.map +1 -1
- package/dist/page/controllers.d.ts +2 -2
- package/dist/page/internal/extension-validation.js +3 -2
- package/dist/page/internal/extension-validation.js.map +1 -1
- package/dist/page/internal/metadata-layout.js +1 -1
- package/dist/page/internal/metadata-layout.js.map +1 -1
- package/dist/page/internal/metadata-publish.js +3 -2
- package/dist/page/internal/metadata-publish.js.map +1 -1
- package/dist/page/internal/metadata-registration.js +5 -4
- package/dist/page/internal/metadata-registration.js.map +1 -1
- package/dist/page/internal/metadata-upload-registration.d.ts +3 -1
- package/dist/page/internal/metadata-upload-registration.js +9 -0
- package/dist/page/internal/metadata-upload-registration.js.map +1 -1
- package/dist/page/internal/metadata-uploads.d.ts +18 -5
- package/dist/page/internal/metadata-uploads.js +7 -8
- package/dist/page/internal/metadata-uploads.js.map +1 -1
- package/dist/page/internal/page-record.d.ts +2 -3
- package/dist/page/internal/page-record.js +19 -14
- package/dist/page/internal/page-record.js.map +1 -1
- package/dist/page/layout-filter.js +17 -6
- package/dist/page/layout-filter.js.map +1 -1
- package/dist/page/metadata.js +5 -7
- package/dist/page/metadata.js.map +1 -1
- package/dist/request-tenant.d.ts +10 -4
- package/dist/request-tenant.js +16 -34
- package/dist/request-tenant.js.map +1 -1
- package/dist/tenant-export.d.ts +2 -1
- package/dist/tenant-lifecycle.d.ts +13 -4
- package/dist/tenant-lifecycle.js +51 -18
- package/dist/tenant-lifecycle.js.map +1 -1
- package/dist/types.d.ts +20 -0
- package/dist/uploads.js +42 -59
- package/dist/uploads.js.map +1 -1
- package/dist/utils/fire-and-forget.js.map +1 -1
- package/dist/utils/internal/decorated-class.d.ts +14 -0
- package/dist/utils/internal/decorated-class.js +37 -0
- package/dist/utils/internal/decorated-class.js.map +1 -0
- package/dist/utils/internal/type-check.d.ts +9 -0
- package/dist/utils/internal/type-check.js +13 -5
- package/dist/utils/internal/type-check.js.map +1 -1
- package/dist/utils/internal/value-parser.d.ts +1 -1
- package/dist/utils/internal/value-parser.js +22 -9
- package/dist/utils/internal/value-parser.js.map +1 -1
- package/dist/watch-actions.d.ts +1 -1
- package/docs/1.core/1.introduction.md +82 -77
- package/docs/1.core/10.layout-banners.md +57 -45
- package/docs/1.core/11.modules-and-dynamic-menus.md +178 -0
- package/docs/1.core/12.frontend-modules-and-request-helpers.md +155 -0
- package/docs/1.core/13.tenant-data-export.md +120 -0
- package/docs/1.core/2.pages-and-modules.md +140 -367
- package/docs/1.core/3.components.md +21 -22
- package/docs/1.core/4.permissions.md +92 -71
- package/docs/1.core/5.tenancy.md +112 -86
- package/docs/1.core/6.invites.md +90 -65
- package/docs/1.core/7.hooks.md +96 -166
- package/docs/1.core/8.realtime.md +44 -45
- package/docs/1.core/9.quick-actions.md +37 -30
- package/docs/2.auth/1.introduction.md +33 -35
- package/docs/2.auth/2.authentication.md +60 -38
- package/docs/2.auth/3.tokens-and-sessions.md +56 -55
- package/docs/2.auth/4.users.md +82 -52
- package/docs/2.auth/5.external-identities.md +25 -26
- package/docs/3.base/1.introduction.md +64 -60
- package/docs/3.base/10.display-blocks.md +15 -16
- package/docs/3.base/11.page-layouts.md +273 -0
- package/docs/3.base/12.table-row-actions.md +122 -0
- package/docs/3.base/13.table-filters-and-forms.md +104 -0
- package/docs/3.base/14.table-events-and-helpers.md +114 -0
- package/docs/3.base/15.table-sources-and-gates.md +24 -0
- package/docs/3.base/2.types.md +44 -41
- package/docs/3.base/3.forms.md +27 -28
- package/docs/3.base/4.tables.md +34 -367
- package/docs/3.base/5.charts-and-widgets.md +28 -29
- package/docs/3.base/6.layout.md +21 -270
- package/docs/3.base/8.data-types.md +39 -40
- package/docs/3.base/9.helpers.md +36 -38
- package/docs/4.notifications/1.introduction.md +22 -26
- package/docs/4.notifications/2.categories-and-subjects.md +58 -55
- package/docs/4.notifications/3.sending.md +72 -68
- package/docs/5.html-render/1.introduction.md +119 -81
- package/docs/5.html-render/2.built-in-emails.md +71 -51
- package/docs/index.md +18 -29
- package/docs/tsconfig.json +4 -0
- package/package.json +12 -12
- package/docs/images/emails-admin-invite.png +0 -0
- package/docs/images/emails-change-notice.png +0 -0
- package/docs/images/emails-change-verification.png +0 -0
- package/docs/images/emails-digest-logo-dark.png +0 -0
- package/docs/images/emails-digest-logo-light.png +0 -0
- package/docs/images/emails-digest.png +0 -0
- package/docs/images/emails-export-partial.png +0 -0
- package/docs/images/emails-export-ready.png +0 -0
- package/docs/images/emails-reset-password.png +0 -0
- package/docs/images/emails-two-factor.png +0 -0
- package/docs/images/emails-user-validation.png +0 -0
package/dist/hooks.js
CHANGED
|
@@ -56,13 +56,15 @@ var Hook;
|
|
|
56
56
|
* cleaned up along with the workspace, and make it idempotent so a retried
|
|
57
57
|
* signup does not double it.
|
|
58
58
|
*
|
|
59
|
-
* It fires
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
59
|
+
* It fires when a tenant is created, through `ProvisionTenant`
|
|
60
|
+
* (`@antelopejs/interface-dms/tenant-provisioning`): by the DMS for the
|
|
61
|
+
* `default` tenant, once every module has started, on the replica holding its
|
|
62
|
+
* provisioning lease; by the signup flow of a SaaS module for each workspace
|
|
63
|
+
* it creates. It is where a module writes the default data a tenant starts
|
|
64
|
+
* with: once it succeeded, that data belongs to the tenant and nothing writes
|
|
65
|
+
* it again on a later start. The `default` tenant's handlers run again after
|
|
66
|
+
* an attempt that failed or whose process died, so a handler skips what it
|
|
67
|
+
* already wrote.
|
|
66
68
|
*/
|
|
67
69
|
Hook["TENANT_BEING_PROVISIONED"] = "tenant:being-provisioned";
|
|
68
70
|
Hook["TENANT_DELETED"] = "tenant:deleted";
|
|
@@ -90,34 +92,40 @@ var Hook;
|
|
|
90
92
|
*/
|
|
91
93
|
Hook["USER_DELETED"] = "user:deleted";
|
|
92
94
|
})(Hook || (exports.Hook = Hook = {}));
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const existing = hooksRegistry.get(name);
|
|
97
|
-
if (existing)
|
|
98
|
-
return existing;
|
|
99
|
-
const hooks = new owned_registry_1.OwnedRegistry();
|
|
100
|
-
hooksRegistry.set(name, hooks);
|
|
101
|
-
return hooks;
|
|
102
|
-
}
|
|
103
|
-
function logHookFailure(name, error) {
|
|
104
|
-
logging_1.Logging.Error(`Hook '${name}' execution failed:`, error);
|
|
95
|
+
class HookState {
|
|
96
|
+
handlers = new owned_registry_1.OwnedRegistry();
|
|
97
|
+
settled = new owned_registry_1.OwnedRegistry();
|
|
105
98
|
}
|
|
106
|
-
|
|
107
|
-
|
|
99
|
+
const hookStates = {
|
|
100
|
+
[Hook.DATABASE_INITIALIZED]: new HookState(),
|
|
101
|
+
[Hook.TENANT_BEING_PROVISIONED]: new HookState(),
|
|
102
|
+
[Hook.TENANT_DELETED]: new HookState(),
|
|
103
|
+
[Hook.TENANT_DATA_EXPORT]: new HookState(),
|
|
104
|
+
[Hook.INVITE_BEING_CREATED]: new HookState(),
|
|
105
|
+
[Hook.INVITE_CREATED]: new HookState(),
|
|
106
|
+
[Hook.INVITE_DELETED]: new HookState(),
|
|
107
|
+
[Hook.MEMBER_BEING_ADDED]: new HookState(),
|
|
108
|
+
[Hook.MEMBER_BEING_CHANGED]: new HookState(),
|
|
109
|
+
[Hook.MEMBER_ADDED]: new HookState(),
|
|
110
|
+
[Hook.MEMBER_REMOVED]: new HookState(),
|
|
111
|
+
[Hook.USER_DELETED]: new HookState(),
|
|
112
|
+
[Hook.USER_REGISTERED]: new HookState(),
|
|
113
|
+
};
|
|
114
|
+
function getHooks(name) {
|
|
115
|
+
return hookStates[name].handlers;
|
|
108
116
|
}
|
|
109
117
|
/**
|
|
110
118
|
* Runs a handler registered after its hook settled, without blocking the
|
|
111
119
|
* registration: the registering module's `construct()` or `start()` neither
|
|
112
120
|
* waits for it nor sees its failure.
|
|
113
121
|
*/
|
|
114
|
-
function runLateHandler(settled, callback, owner) {
|
|
122
|
+
function runLateHandler(name, settled, callback, owner) {
|
|
115
123
|
const run = async () => callback(...settled.args);
|
|
116
124
|
const runAsOwner = async () => owner ? (0, interface_core_1.RunWithResponsibleModule)(owner, run) : run();
|
|
117
125
|
void Promise.resolve()
|
|
118
126
|
.then(runAsOwner)
|
|
119
127
|
.catch((error) => {
|
|
120
|
-
logging_1.Logging.Error(`Hook '${
|
|
128
|
+
logging_1.Logging.Error(`Hook '${name}' handler of module '${owner ?? "unknown"}' failed:`, error);
|
|
121
129
|
});
|
|
122
130
|
}
|
|
123
131
|
/**
|
|
@@ -138,9 +146,9 @@ function RegisterHook(name, callback, options) {
|
|
|
138
146
|
callback,
|
|
139
147
|
moduleId: options?.moduleId ?? owner,
|
|
140
148
|
});
|
|
141
|
-
const settled =
|
|
149
|
+
const [settled] = hookStates[name].settled.values();
|
|
142
150
|
if (settled)
|
|
143
|
-
runLateHandler(settled, callback, owner);
|
|
151
|
+
runLateHandler(name, settled, callback, owner);
|
|
144
152
|
}
|
|
145
153
|
/**
|
|
146
154
|
* Drop a handler registered with {@link RegisterHook}, for a module that stops
|
|
@@ -173,7 +181,7 @@ function RegisterTenantDataExportContributor(moduleId, handler) {
|
|
|
173
181
|
}
|
|
174
182
|
async function ExecuteHooks(name, ...args) {
|
|
175
183
|
for (const hook of getHooks(name).values()) {
|
|
176
|
-
await hook.callback(...args);
|
|
184
|
+
await Promise.resolve(hook.callback(...args));
|
|
177
185
|
}
|
|
178
186
|
}
|
|
179
187
|
/**
|
|
@@ -191,32 +199,33 @@ async function SettleHook(name, ...args) {
|
|
|
191
199
|
while (pending.length > 0) {
|
|
192
200
|
for (const hook of pending) {
|
|
193
201
|
ran.add(hook);
|
|
194
|
-
await hook.callback(...args);
|
|
202
|
+
await Promise.resolve(hook.callback(...args));
|
|
195
203
|
}
|
|
196
204
|
pending = getHooks(name)
|
|
197
205
|
.values()
|
|
198
206
|
.filter((hook) => !ran.has(hook));
|
|
199
207
|
}
|
|
200
|
-
|
|
208
|
+
hookStates[name].settled.add({ args });
|
|
201
209
|
}
|
|
202
210
|
/**
|
|
203
211
|
* End what {@link SettleHook} started: later registrations wait for the hook
|
|
204
212
|
* to be settled again.
|
|
205
213
|
*/
|
|
206
214
|
function UnsettleHook(name) {
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
215
|
+
const { settled } = hookStates[name];
|
|
216
|
+
const always = () => true;
|
|
217
|
+
while (settled.has(always))
|
|
218
|
+
settled.remove(always);
|
|
210
219
|
}
|
|
211
220
|
async function CollectHooks(name, ...args) {
|
|
212
221
|
const results = [];
|
|
213
222
|
for (const hook of getHooks(name).values()) {
|
|
214
223
|
try {
|
|
215
|
-
const value = await hook.callback(...args);
|
|
224
|
+
const value = await Promise.resolve(hook.callback(...args));
|
|
216
225
|
results.push(value);
|
|
217
226
|
}
|
|
218
227
|
catch (error) {
|
|
219
|
-
|
|
228
|
+
logging_1.Logging.Error(`Hook '${name}' execution failed:`, error);
|
|
220
229
|
}
|
|
221
230
|
}
|
|
222
231
|
return results;
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { RequestContext } from "@antelopejs/interface-api";
|
|
2
|
-
import type { DataControllerCallback } from "@antelopejs/interface-data-api";
|
|
2
|
+
import type { DataControllerCallback, DataControllerInstance } from "@antelopejs/interface-data-api";
|
|
3
3
|
/**
|
|
4
4
|
* Trusted inputs used to wrap a table-view attachment write.
|
|
5
5
|
*
|
|
6
6
|
* @internal
|
|
7
7
|
*/
|
|
8
8
|
export interface TableViewAttachmentSaveRequest {
|
|
9
|
-
controller:
|
|
9
|
+
controller: DataControllerInstance;
|
|
10
10
|
route: DataControllerCallback;
|
|
11
11
|
context: RequestContext;
|
|
12
12
|
params: unknown;
|
|
@@ -8,6 +8,7 @@ exports.warnUnknownChild = warnUnknownChild;
|
|
|
8
8
|
exports.setButton = setButton;
|
|
9
9
|
/** @internal */
|
|
10
10
|
const logging_1 = require("@antelopejs/interface-core/logging");
|
|
11
|
+
const own_entry_1 = require("./own-entry");
|
|
11
12
|
/** @internal */
|
|
12
13
|
function mergeBuilderOptions(options, update, partial) {
|
|
13
14
|
const state = {
|
|
@@ -50,7 +51,7 @@ function warnUnknownChild(children, childId, name) {
|
|
|
50
51
|
}
|
|
51
52
|
/** @internal */
|
|
52
53
|
function setButton(buttons, name, id, info) {
|
|
53
|
-
if (buttons()
|
|
54
|
+
if ((0, own_entry_1.ownEntry)(buttons(), id)) {
|
|
54
55
|
logging_1.Logging.Warn(`Duplicate button id "${id}" in component "${name()}"`);
|
|
55
56
|
}
|
|
56
57
|
buttons()[id] = { id, ...info };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-builder.js","sourceRoot":"","sources":["../../src/internal/component-builder.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"component-builder.js","sourceRoot":"","sources":["../../src/internal/component-builder.ts"],"names":[],"mappings":";;AAWA,kDAeC;AAGD,kCAIC;AAGD,kCAUC;AAGD,kCAeC;AAGD,4CAUC;AAGD,8BAUC;AA1FD,gBAAgB;AAChB,gEAA6D;AAC7D,2CAAuC;AAQvC,gBAAgB;AAChB,SAAgB,mBAAmB,CACjC,OAA8C,EAC9C,MAAwD,EACxD,OAAyB;IAEzB,MAAM,KAAK,GAAG;QACZ,IAAI,OAAO;YACT,OAAO,OAAO,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,iBAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IACD,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,gBAAgB;AAChB,SAAgB,WAAW,CACzB,aAAqB;IAErB,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACpE,CAAC;AAED,gBAAgB;AAChB,SAAgB,WAAW,CACzB,aAAqB,EACrB,OAAsB,EACtB,QAAgD;IAEhD,OAAO;QACL,aAAa;QACb,OAAO;QACP,QAAQ,EAAE,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;KACzD,CAAC;AACJ,CAAC;AAED,gBAAgB;AAChB,SAAgB,WAAW,CACzB,QAA6C,EAC7C,IAAkB,EAClB,KAIC;IAED,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACtD,iBAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,mBAAmB,IAAI,EAAE,GAAG,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,eAAe,EAAE,GAAG,QAAQ,IAAI,EAAE,CAAC;IACpD,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,eAAe,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,gBAAgB;AAChB,SAAgB,gBAAgB,CAC9B,QAAuC,EACvC,OAAe,EACf,IAAkB;IAElB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;QACpD,iBAAO,CAAC,IAAI,CACV,8BAA8B,OAAO,mBAAmB,IAAI,EAAE,iCAAiC,CAChG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,gBAAgB;AAChB,SAAgB,SAAS,CACvB,OAA2C,EAC3C,IAAkB,EAClB,EAAU,EACV,IAA+C;IAE/C,IAAI,IAAA,oBAAQ,EAAC,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAC5B,iBAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,mBAAmB,IAAI,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
/** @internal */
|
|
2
|
-
import type {
|
|
2
|
+
import type { ComponentAnchor, ComponentInfoPromise, ComponentInfoSerialized } from "../component";
|
|
3
3
|
/** @internal */
|
|
4
4
|
export declare function normalizeComponentAnchor(anchor: ComponentAnchor): readonly string[];
|
|
5
5
|
/** @internal */
|
|
6
|
-
export declare function serializedInfo<T>(componentInfo: Awaited<ComponentInfoPromise<T>>, options: T | undefined
|
|
7
|
-
/** @internal */
|
|
8
|
-
export declare function serializeChild(child: NonNullable<Awaited<ComponentInfoPromise>["children"]>[number]): Promise<ChildSerialized>;
|
|
6
|
+
export declare function serializedInfo<T>(componentInfo: Awaited<ComponentInfoPromise<T>>, options: T | undefined): Promise<ComponentInfoSerialized<T>>;
|
|
9
7
|
/** @internal */
|
|
10
8
|
export declare function serializeInfoSync<T>(info: ComponentInfoPromise<T>): ComponentInfoSerialized<T>;
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.normalizeComponentAnchor = normalizeComponentAnchor;
|
|
4
4
|
exports.serializedInfo = serializedInfo;
|
|
5
|
-
exports.serializeChild = serializeChild;
|
|
6
5
|
exports.serializeInfoSync = serializeInfoSync;
|
|
7
6
|
/** @internal */
|
|
8
7
|
function normalizeComponentAnchor(anchor) {
|
|
@@ -10,10 +9,12 @@ function normalizeComponentAnchor(anchor) {
|
|
|
10
9
|
return typeof anchor === "string" ? anchor.split(".") : [...anchor];
|
|
11
10
|
}
|
|
12
11
|
/** @internal */
|
|
13
|
-
function serializedInfo(componentInfo, options
|
|
12
|
+
async function serializedInfo(componentInfo, options) {
|
|
13
|
+
const children = componentInfo.children
|
|
14
|
+
? await Promise.all(componentInfo.children.map(serializeChild))
|
|
15
|
+
: undefined;
|
|
14
16
|
return { ...componentInfo, options, children: children ?? [] };
|
|
15
17
|
}
|
|
16
|
-
/** @internal */
|
|
17
18
|
async function serializeChild(child) {
|
|
18
19
|
const { id, component, ...additionalProps } = child;
|
|
19
20
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-serialization.js","sourceRoot":"","sources":["../../src/internal/component-serialization.ts"],"names":[],"mappings":";;AAUA,4DAKC;AAGD,
|
|
1
|
+
{"version":3,"file":"component-serialization.js","sourceRoot":"","sources":["../../src/internal/component-serialization.ts"],"names":[],"mappings":";;AAUA,4DAKC;AAGD,wCAQC;AAcD,8CAiBC;AAhDD,gBAAgB;AAChB,SAAgB,wBAAwB,CACtC,MAAuB;IAEvB,uIAAuI;IACvI,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,gBAAgB;AACT,KAAK,UAAU,cAAc,CAClC,aAA+C,EAC/C,OAAsB;IAEtB,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ;QACrC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC/D,CAAC,CAAC,SAAS,CAAC;IACd,OAAO,EAAE,GAAG,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,KAAqE;IAErE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,GAAG,KAAK,CAAC;IACpD,OAAO;QACL,EAAE;QACF,SAAS,EAAE,MAAM,SAAS,CAAC,SAAS,EAAE;QACtC,GAAG,eAAe;KACnB,CAAC;AACJ,CAAC;AAED,gBAAgB;AAChB,SAAgB,iBAAiB,CAC/B,IAA6B;IAE7B,8NAA8N;IAC9N,MAAM,aAAa,GAAG,IAAwB,CAAC;IAC/C,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC3B,MAAM,kBAAkB,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC9D,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,eAAe,EAAE,GAAG,KAAK,CAAC;YACpD,OAAO;gBACL,EAAE;gBACF,SAAS,EAAE,SAAS,CAAC,aAAa,EAAE;gBACpC,GAAG,eAAe;aACnB,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,GAAG,aAAa,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,EAAE,GAAG,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MaybePromise } from "../types";
|
|
2
|
+
import type { WatchAction } from "../watch-actions";
|
|
2
3
|
/**
|
|
3
4
|
* Property a serialized component's options carry to open an extension point.
|
|
4
5
|
* A component that declares one says "whoever owns this slot may rewrite my
|
|
@@ -13,8 +14,23 @@ import type { ComponentSlotResolver } from "../component-slots";
|
|
|
13
14
|
* @internal
|
|
14
15
|
*/
|
|
15
16
|
export declare const COMPONENT_SLOT_KEY = "slotId";
|
|
17
|
+
/**
|
|
18
|
+
* What the walker checks of a form's options before it hands them to a
|
|
19
|
+
* resolver: a `fields` array and, on the node it resolves, a registered slot
|
|
20
|
+
* id. `SlotOptions` is the full contract a resolver sees.
|
|
21
|
+
*/
|
|
22
|
+
interface SlotFormInput {
|
|
23
|
+
slotId?: string;
|
|
24
|
+
fields: unknown[];
|
|
25
|
+
}
|
|
26
|
+
/** What a resolver answers: a form's options, with its watch actions. */
|
|
27
|
+
interface SlotFormOptions extends SlotFormInput {
|
|
28
|
+
watchActions?: WatchAction[];
|
|
29
|
+
}
|
|
30
|
+
/** @internal */
|
|
31
|
+
export type SlotFormResolver = (options: SlotFormInput) => MaybePromise<SlotFormOptions>;
|
|
16
32
|
/** @internal */
|
|
17
|
-
export declare const slotResolvers: Map<string,
|
|
33
|
+
export declare const slotResolvers: Map<string, SlotFormResolver>;
|
|
18
34
|
/**
|
|
19
35
|
* Resolve every registered slot found in a serialized options tree.
|
|
20
36
|
*
|
|
@@ -25,3 +41,4 @@ export declare const slotResolvers: Map<string, ComponentSlotResolver>;
|
|
|
25
41
|
* @internal
|
|
26
42
|
*/
|
|
27
43
|
export declare function ResolveComponentSlots<T>(options: T): Promise<T>;
|
|
44
|
+
export {};
|
|
@@ -17,21 +17,42 @@ const logging_1 = require("@antelopejs/interface-core/logging");
|
|
|
17
17
|
* @internal
|
|
18
18
|
*/
|
|
19
19
|
exports.COMPONENT_SLOT_KEY = "slotId";
|
|
20
|
+
/**
|
|
21
|
+
* The component name `Form` serializes under. A copy: the form's own module
|
|
22
|
+
* sits above this one in the layering, and the walker tests resolve forms built
|
|
23
|
+
* by `Form`, so the two cannot drift apart.
|
|
24
|
+
*/
|
|
25
|
+
const SLOT_FORM_COMPONENT_NAME = "dms-form";
|
|
20
26
|
/** @internal */
|
|
21
27
|
exports.slotResolvers = new Map();
|
|
22
|
-
function
|
|
28
|
+
function isSlotFormOptions(options) {
|
|
29
|
+
if (typeof options !== "object" || options === null)
|
|
30
|
+
return false;
|
|
31
|
+
if (!("fields" in options) || !Array.isArray(options.fields))
|
|
32
|
+
return false;
|
|
33
|
+
return (exports.COMPONENT_SLOT_KEY in options &&
|
|
34
|
+
typeof options[exports.COMPONENT_SLOT_KEY] === "string" &&
|
|
35
|
+
exports.slotResolvers.has(options[exports.COMPONENT_SLOT_KEY]));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The options of a serialized form that opens a slot someone owns. Only a
|
|
39
|
+
* form declares `slotId`, and it always serializes a `fields` array, so a node
|
|
40
|
+
* that is anything else is left alone, whatever its options say.
|
|
41
|
+
*/
|
|
42
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- Takes one node of the serialized options tree ResolveComponentSlots walks over a page's cached layout, any primitive, array or object, and narrows it with Array.isArray and typeof before reading it.
|
|
43
|
+
function slotFormOptionsOf(node) {
|
|
23
44
|
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- Serialized option trees contain primitives and arrays as well as slot-bearing objects.
|
|
24
45
|
if (!node || typeof node !== "object" || Array.isArray(node)) {
|
|
25
46
|
return undefined;
|
|
26
47
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- A serialized slot id must be a registered string; other option values remain ordinary data.
|
|
30
|
-
if (typeof slotId !== "string" || !exports.slotResolvers.has(slotId)) {
|
|
48
|
+
if (!("componentName" in node) ||
|
|
49
|
+
node.componentName !== SLOT_FORM_COMPONENT_NAME) {
|
|
31
50
|
return undefined;
|
|
32
51
|
}
|
|
33
|
-
|
|
52
|
+
const options = "options" in node ? node.options : undefined;
|
|
53
|
+
return isSlotFormOptions(options) ? options : undefined;
|
|
34
54
|
}
|
|
55
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- Takes one node of the serialized options tree ResolveComponentSlots walks over a page's cached layout, any primitive, array or object, and narrows it with Array.isArray and typeof before reading it.
|
|
35
56
|
function hasResolvableSlot(node) {
|
|
36
57
|
if (Array.isArray(node)) {
|
|
37
58
|
return node.some(hasResolvableSlot);
|
|
@@ -40,7 +61,7 @@ function hasResolvableSlot(node) {
|
|
|
40
61
|
if (!node || typeof node !== "object") {
|
|
41
62
|
return false;
|
|
42
63
|
}
|
|
43
|
-
if (
|
|
64
|
+
if (slotFormOptionsOf(node)) {
|
|
44
65
|
return true;
|
|
45
66
|
}
|
|
46
67
|
return Object.values(node).some(hasResolvableSlot);
|
|
@@ -50,6 +71,7 @@ function hasResolvableSlot(node) {
|
|
|
50
71
|
* what a resolver contributes is never walked again, which would let a
|
|
51
72
|
* contribution declaring the slot it was contributed to loop forever.
|
|
52
73
|
*/
|
|
74
|
+
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- Takes one node of the serialized options tree ResolveComponentSlots walks over a page's cached layout, any primitive, array or object, and narrows it with Array.isArray and typeof before reading it.
|
|
53
75
|
async function resolveNode(node) {
|
|
54
76
|
if (Array.isArray(node)) {
|
|
55
77
|
for (const item of node)
|
|
@@ -62,18 +84,19 @@ async function resolveNode(node) {
|
|
|
62
84
|
}
|
|
63
85
|
for (const value of Object.values(node))
|
|
64
86
|
await resolveNode(value);
|
|
65
|
-
const
|
|
66
|
-
|
|
87
|
+
const target = slotFormOptionsOf(node);
|
|
88
|
+
if (!target)
|
|
89
|
+
return;
|
|
90
|
+
const { slotId } = target;
|
|
91
|
+
const resolver = exports.slotResolvers.get(slotId);
|
|
67
92
|
if (!resolver)
|
|
68
93
|
return;
|
|
69
|
-
// SAFETY: node is a non-null object and SlotOptions imposes no value constraint on its keys.
|
|
70
|
-
const target = node;
|
|
71
94
|
try {
|
|
72
95
|
const resolved = await resolver(target);
|
|
73
96
|
if (resolved === target)
|
|
74
97
|
return;
|
|
75
98
|
for (const key of Object.keys(target))
|
|
76
|
-
|
|
99
|
+
Reflect.deleteProperty(target, key);
|
|
77
100
|
Object.assign(target, resolved);
|
|
78
101
|
}
|
|
79
102
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-slots.js","sourceRoot":"","sources":["../../src/internal/component-slots.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"component-slots.js","sourceRoot":"","sources":["../../src/internal/component-slots.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { WatchAction } from "../watch-actions";
|
|
2
|
+
import type { MaybePromise } from "../types";
|
|
3
|
+
/** @internal The callback `ComponentBuilder.watchFilter` installs. */
|
|
4
|
+
export type WatchFilter = (permissions: Set<string>, watches: WatchAction[], permissionId: string) => MaybePromise<WatchAction[]>;
|
|
5
|
+
/**
|
|
6
|
+
* `options` with its `watchActions` narrowed by `filter`; untouched when there
|
|
7
|
+
* is no filter or the options declare no watch.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export declare function applyWatchFilter<O, R>(owner: R, filter: ((this: R, ...args: Parameters<WatchFilter>) => ReturnType<WatchFilter>) | undefined, permissions: Set<string>, options: O, permissionId: string): Promise<O>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyWatchFilter = applyWatchFilter;
|
|
4
|
+
const component_watches_1 = require("./component-watches");
|
|
5
|
+
/**
|
|
6
|
+
* `options` with its `watchActions` narrowed by `filter`; untouched when there
|
|
7
|
+
* is no filter or the options declare no watch.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
async function applyWatchFilter(owner, filter, permissions, options, permissionId) {
|
|
12
|
+
if (!options || !filter) {
|
|
13
|
+
return options;
|
|
14
|
+
}
|
|
15
|
+
const watches = (0, component_watches_1.readWatchActions)(options);
|
|
16
|
+
if (watches.length === 0) {
|
|
17
|
+
return options;
|
|
18
|
+
}
|
|
19
|
+
const filtered = await filter.call(owner, permissions, watches, permissionId);
|
|
20
|
+
return { ...options, watchActions: filtered };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=component-watch-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-watch-filter.js","sourceRoot":"","sources":["../../src/internal/component-watch-filter.ts"],"names":[],"mappings":";;AAiBA,4CAkBC;AAjCD,2DAAuD;AASvD;;;;;GAKG;AACI,KAAK,UAAU,gBAAgB,CACpC,KAAQ,EACR,MAEa,EACb,WAAwB,EACxB,OAAU,EACV,YAAoB;IAEpB,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,OAAO,GAAG,IAAA,oCAAgB,EAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAC9E,OAAO,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -49,7 +49,6 @@ function buildWatchAction(event, functionId, opts) {
|
|
|
49
49
|
functionId,
|
|
50
50
|
};
|
|
51
51
|
if (opts?.params !== undefined) {
|
|
52
|
-
// oxlint-disable-next-line anti-slop/require-safety-comment-for-type-assertion -- Consumer declaration merging can supply watch parameter interfaces without dictionary index signatures; transport preserves those values without parsing.
|
|
53
52
|
watch.params = opts.params;
|
|
54
53
|
}
|
|
55
54
|
if (opts?.onParam !== undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-watches.js","sourceRoot":"","sources":["../../src/internal/component-watches.ts"],"names":[],"mappings":";;AAWA,8CAwBC;AAGD,4CAGC;AAGD,4CAQC;AAGD,
|
|
1
|
+
{"version":3,"file":"component-watches.js","sourceRoot":"","sources":["../../src/internal/component-watches.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The entry `table` holds under `key` itself. A key `Object.prototype`
|
|
3
|
+
* supplies (`constructor`, `toString`) is not an entry.
|
|
4
|
+
*
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export declare function ownEntry<Entry>(table: Readonly<Record<string, Entry>>, key: string): Entry | undefined;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ownEntry = ownEntry;
|
|
4
|
+
/**
|
|
5
|
+
* The entry `table` holds under `key` itself. A key `Object.prototype`
|
|
6
|
+
* supplies (`constructor`, `toString`) is not an entry.
|
|
7
|
+
*
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
function ownEntry(table, key) {
|
|
11
|
+
return Object.hasOwn(table, key) ? table[key] : undefined;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=own-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"own-entry.js","sourceRoot":"","sources":["../../src/internal/own-entry.ts"],"names":[],"mappings":";;AAMA,4BAKC;AAXD;;;;;GAKG;AACH,SAAgB,QAAQ,CACtB,KAAsC,EACtC,GAAW;IAEX,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC"}
|
|
@@ -1,2 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import type { JsonPrimitive } from "./json";
|
|
2
|
+
/**
|
|
3
|
+
* A JSON value an invitation stores for an extension. It is only read back, so
|
|
4
|
+
* read-only arrays and objects are accepted where it is passed in.
|
|
5
|
+
*/
|
|
6
|
+
export type InviteExtensionJson = JsonPrimitive | readonly InviteExtensionJson[] | {
|
|
7
|
+
readonly [key: string]: InviteExtensionJson;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Payloads stored on an invitation, keyed by extension key: the JSON an admin
|
|
11
|
+
* submitted for each extension's fields, kept as submitted until the
|
|
12
|
+
* extension's own schema runs at delivery.
|
|
13
|
+
*/
|
|
14
|
+
export type InviteExtensionPayloads = Record<string, InviteExtensionJson>;
|
|
@@ -27,8 +27,7 @@ const registry_1 = require("./registry");
|
|
|
27
27
|
function CollectInviteExtensionPayloads(
|
|
28
28
|
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- The published submission boundary accepts arbitrary bodies; each extension slice is validated below without replacing its stored input.
|
|
29
29
|
body) {
|
|
30
|
-
|
|
31
|
-
const source = (body ?? {});
|
|
30
|
+
const source = (0, payload_slices_1.isInviteFieldValues)(body) ? body : {};
|
|
32
31
|
const payloads = {};
|
|
33
32
|
for (const info of (0, registry_1.listInviteExtensions)()) {
|
|
34
33
|
const slice = (0, payload_slices_1.sliceOf)(info.key, source);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/invite-extensions/internal/delivery.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/invite-extensions/internal/delivery.ts"],"names":[],"mappings":";;AAkCA,wEAcC;AAWD,0DAmBC;AAYD,0DAoBC;AA7GD,qDAK0B;AAC1B,yCAA6E;AAQ7E;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,8BAA8B;AAC5C,sMAAsM;AACtM,IAAa;IAEb,MAAM,MAAM,GAAG,IAAA,oCAAmB,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAE7C,KAAK,MAAM,IAAI,IAAI,IAAA,+BAAoB,GAAE,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAA,wBAAO,EAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACxC,IAAA,iCAAgB,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,uBAAuB,CAC3C,QAAoD,EACpD,MAAoB,EACpB,OAA+B,EAC/B,UAAiC,EAAE;IAEnC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,IAAA,+BAAoB,GAAE,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,4BAAW,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,oCAAyB,EAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAClE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,IAAI,QAAQ,CAAC,MAAM;QAC3C,MAAM,IAAI,cAAc,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;;;GASG;AACI,KAAK,UAAU,uBAAuB,CAC3C,QAAoD,EACpD,OAA6B,EAC7B,UAAiC,EAAE;IAEnC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,IAAA,+BAAoB,GAAE,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,SAAS;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAClB,IAAA,4BAAW,EAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,KAAK,EAC3C,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,oCAAyB,EAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC;YACpE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,IAAI,QAAQ,CAAC,MAAM;QAC3C,MAAM,IAAI,cAAc,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { InviteExtensionContext, InviteExtensionPayloads } from "../types";
|
|
2
|
+
import type { InviteFieldValues } from "./types";
|
|
2
3
|
/**
|
|
3
4
|
* The payloads stored on a pending invitation as values of its edit form: each
|
|
4
5
|
* registered extension's stored slice, under the prefixed ids its fields carry
|
|
@@ -7,7 +8,7 @@ import type { InviteExtensionContext, InviteExtensionPayloads } from "../types";
|
|
|
7
8
|
*
|
|
8
9
|
* @internal
|
|
9
10
|
*/
|
|
10
|
-
export declare function ReadInviteExtensionFields(payloads: InviteExtensionPayloads | null | undefined):
|
|
11
|
+
export declare function ReadInviteExtensionFields(payloads: InviteExtensionPayloads | null | undefined): InviteFieldValues;
|
|
11
12
|
/**
|
|
12
13
|
* Pull the slices an admin changed out of the edit form of a pending
|
|
13
14
|
* invitation, each validated against its extension's schema.
|
|
@@ -5,11 +5,11 @@ exports.CollectInviteExtensionEdits = CollectInviteExtensionEdits;
|
|
|
5
5
|
exports.NotifyInviteExtensionUpdates = NotifyInviteExtensionUpdates;
|
|
6
6
|
const node_util_1 = require("node:util");
|
|
7
7
|
const field_ids_1 = require("./field-ids");
|
|
8
|
+
const type_check_1 = require("../../utils/internal/type-check");
|
|
8
9
|
const payload_slices_1 = require("./payload-slices");
|
|
9
10
|
const registry_1 = require("./registry");
|
|
10
|
-
function
|
|
11
|
-
|
|
12
|
-
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
11
|
+
function isStoredSlice(value) {
|
|
12
|
+
return (0, type_check_1.isObject)(value) && !(0, type_check_1.isNull)(value) && !Array.isArray(value);
|
|
13
13
|
}
|
|
14
14
|
function isSamePayload(a, b) {
|
|
15
15
|
return (0, node_util_1.isDeepStrictEqual)(JSON.parse(JSON.stringify(a ?? null)), JSON.parse(JSON.stringify(b ?? null)));
|
|
@@ -25,14 +25,13 @@ function isSamePayload(a, b) {
|
|
|
25
25
|
function ReadInviteExtensionFields(payloads) {
|
|
26
26
|
const values = {};
|
|
27
27
|
for (const info of (0, registry_1.listInviteExtensions)()) {
|
|
28
|
-
const stored = payloads
|
|
29
|
-
if (!
|
|
28
|
+
const stored = (0, payload_slices_1.payloadOf)(payloads, info.key);
|
|
29
|
+
if (!isStoredSlice(stored))
|
|
30
30
|
continue;
|
|
31
31
|
for (const [fieldId, value] of Object.entries(stored)) {
|
|
32
32
|
values[(0, field_ids_1.inviteExtensionFieldId)(info.key, fieldId)] = value;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
// oxlint-disable-next-line anti-slop/no-known-value-widening -- Preserve the published raw-field dictionary return contract rather than narrow the stored extension values.
|
|
36
35
|
return values;
|
|
37
36
|
}
|
|
38
37
|
/**
|
|
@@ -52,7 +51,7 @@ function ReadInviteExtensionFields(payloads) {
|
|
|
52
51
|
function CollectInviteExtensionEdits(
|
|
53
52
|
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- This published submission boundary accepts arbitrary bodies and validates each present slice with its extension schema.
|
|
54
53
|
body) {
|
|
55
|
-
const source =
|
|
54
|
+
const source = (0, payload_slices_1.isInviteFieldValues)(body) ? body : {};
|
|
56
55
|
const edits = {};
|
|
57
56
|
for (const info of (0, registry_1.listInviteExtensions)()) {
|
|
58
57
|
if (info.editable === false)
|
|
@@ -68,9 +67,9 @@ body) {
|
|
|
68
67
|
async function notifyUpdate(info, previous, edits, context) {
|
|
69
68
|
if (!info.onUpdate)
|
|
70
69
|
return;
|
|
71
|
-
if (!(info.key
|
|
70
|
+
if (!Object.hasOwn(edits, info.key))
|
|
72
71
|
return;
|
|
73
|
-
if (isSamePayload(previous
|
|
72
|
+
if (isSamePayload((0, payload_slices_1.payloadOf)(previous, info.key), (0, payload_slices_1.payloadOf)(edits, info.key)))
|
|
74
73
|
return;
|
|
75
74
|
const payload = (0, payload_slices_1.readPayload)(info, edits, {});
|
|
76
75
|
if (!payload)
|