@kywi-software/core 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -2
- package/dist/admin/app.d.ts +10 -1
- package/dist/admin/app.d.ts.map +1 -1
- package/dist/admin/app.js +2 -2
- package/dist/admin/app.js.map +1 -1
- package/dist/admin/approval-queue.d.ts +3 -1
- package/dist/admin/approval-queue.d.ts.map +1 -1
- package/dist/admin/approval-queue.js +2 -2
- package/dist/admin/approval-queue.js.map +1 -1
- package/dist/admin/audience-list.d.ts.map +1 -1
- package/dist/admin/audience-list.js +9 -1
- package/dist/admin/audience-list.js.map +1 -1
- package/dist/admin/chrome.d.ts +7 -1
- package/dist/admin/chrome.d.ts.map +1 -1
- package/dist/admin/chrome.js +2 -1
- package/dist/admin/chrome.js.map +1 -1
- package/dist/admin/content-editor-api.d.ts +27 -1
- package/dist/admin/content-editor-api.d.ts.map +1 -1
- package/dist/admin/content-editor-api.js +60 -2
- package/dist/admin/content-editor-api.js.map +1 -1
- package/dist/admin/content-form.d.ts +62 -6
- package/dist/admin/content-form.d.ts.map +1 -1
- package/dist/admin/content-form.js +118 -13
- package/dist/admin/content-form.js.map +1 -1
- package/dist/admin/content-permissions-tab.d.ts +13 -0
- package/dist/admin/content-permissions-tab.d.ts.map +1 -0
- package/dist/admin/content-permissions-tab.js +90 -0
- package/dist/admin/content-permissions-tab.js.map +1 -0
- package/dist/admin/context.d.ts +8 -0
- package/dist/admin/context.d.ts.map +1 -1
- package/dist/admin/context.js.map +1 -1
- package/dist/admin/feed-builder.d.ts.map +1 -1
- package/dist/admin/feed-builder.js +20 -1
- package/dist/admin/feed-builder.js.map +1 -1
- package/dist/admin/field-components.d.ts.map +1 -1
- package/dist/admin/field-components.js +26 -1
- package/dist/admin/field-components.js.map +1 -1
- package/dist/admin/form-builder.js +6 -1
- package/dist/admin/form-builder.js.map +1 -1
- package/dist/admin/form-helpers.d.ts.map +1 -1
- package/dist/admin/form-helpers.js +2 -0
- package/dist/admin/form-helpers.js.map +1 -1
- package/dist/admin/layout-editor/component-actions.d.ts +18 -0
- package/dist/admin/layout-editor/component-actions.d.ts.map +1 -1
- package/dist/admin/layout-editor/component-actions.js +19 -0
- package/dist/admin/layout-editor/component-actions.js.map +1 -1
- package/dist/admin/layout-editor/component-picker-field.d.ts +20 -0
- package/dist/admin/layout-editor/component-picker-field.d.ts.map +1 -0
- package/dist/admin/layout-editor/component-picker-field.js +16 -0
- package/dist/admin/layout-editor/component-picker-field.js.map +1 -0
- package/dist/admin/layout-editor/drag-utils.d.ts +48 -0
- package/dist/admin/layout-editor/drag-utils.d.ts.map +1 -1
- package/dist/admin/layout-editor/drag-utils.js +43 -0
- package/dist/admin/layout-editor/drag-utils.js.map +1 -1
- package/dist/admin/layout-editor/editor-canvas.d.ts +9 -1
- package/dist/admin/layout-editor/editor-canvas.d.ts.map +1 -1
- package/dist/admin/layout-editor/editor-canvas.js +41 -15
- package/dist/admin/layout-editor/editor-canvas.js.map +1 -1
- package/dist/admin/layout-editor/editor-state.d.ts +9 -1
- package/dist/admin/layout-editor/editor-state.d.ts.map +1 -1
- package/dist/admin/layout-editor/editor-state.js +34 -0
- package/dist/admin/layout-editor/editor-state.js.map +1 -1
- package/dist/admin/layout-editor/editor.css +83 -0
- package/dist/admin/layout-editor/form-picker-field.d.ts +17 -0
- package/dist/admin/layout-editor/form-picker-field.d.ts.map +1 -0
- package/dist/admin/layout-editor/form-picker-field.js +35 -0
- package/dist/admin/layout-editor/form-picker-field.js.map +1 -0
- package/dist/admin/layout-editor/layout-editor.d.ts.map +1 -1
- package/dist/admin/layout-editor/layout-editor.js +95 -28
- package/dist/admin/layout-editor/layout-editor.js.map +1 -1
- package/dist/admin/layout-editor/mode-toggle.d.ts.map +1 -1
- package/dist/admin/layout-editor/mode-toggle.js +1 -1
- package/dist/admin/layout-editor/mode-toggle.js.map +1 -1
- package/dist/admin/layout-editor/module-overlay.d.ts +10 -1
- package/dist/admin/layout-editor/module-overlay.d.ts.map +1 -1
- package/dist/admin/layout-editor/module-overlay.js +3 -3
- package/dist/admin/layout-editor/module-overlay.js.map +1 -1
- package/dist/admin/layout-editor/props-panel.d.ts +10 -1
- package/dist/admin/layout-editor/props-panel.d.ts.map +1 -1
- package/dist/admin/layout-editor/props-panel.js +25 -2
- package/dist/admin/layout-editor/props-panel.js.map +1 -1
- package/dist/admin/layout-editor/section-insert-line.d.ts.map +1 -1
- package/dist/admin/layout-editor/section-insert-line.js +1 -1
- package/dist/admin/layout-editor/section-insert-line.js.map +1 -1
- package/dist/admin/layout-editor/section-overlay.d.ts.map +1 -1
- package/dist/admin/layout-editor/section-overlay.js +1 -1
- package/dist/admin/layout-editor/section-overlay.js.map +1 -1
- package/dist/admin/layout-editor/section-template-picker.d.ts +9 -1
- package/dist/admin/layout-editor/section-template-picker.d.ts.map +1 -1
- package/dist/admin/layout-editor/section-template-picker.js +45 -2
- package/dist/admin/layout-editor/section-template-picker.js.map +1 -1
- package/dist/admin/registry.d.ts.map +1 -1
- package/dist/admin/registry.js +11 -0
- package/dist/admin/registry.js.map +1 -1
- package/dist/admin/server.d.ts +15 -2
- package/dist/admin/server.d.ts.map +1 -1
- package/dist/admin/server.js +37 -1
- package/dist/admin/server.js.map +1 -1
- package/dist/admin/styles/admin.css +16 -4
- package/dist/admin/surface-matcher.d.ts +27 -0
- package/dist/admin/surface-matcher.d.ts.map +1 -1
- package/dist/admin/surface-matcher.js +11 -0
- package/dist/admin/surface-matcher.js.map +1 -1
- package/dist/admin/surfaces/approvals/approvals-data.d.ts +29 -9
- package/dist/admin/surfaces/approvals/approvals-data.d.ts.map +1 -1
- package/dist/admin/surfaces/approvals/approvals-data.js +65 -22
- package/dist/admin/surfaces/approvals/approvals-data.js.map +1 -1
- package/dist/admin/surfaces/approvals/approvals-index.d.ts.map +1 -1
- package/dist/admin/surfaces/approvals/approvals-index.js +47 -14
- package/dist/admin/surfaces/approvals/approvals-index.js.map +1 -1
- package/dist/admin/surfaces/content/content-edit.d.ts.map +1 -1
- package/dist/admin/surfaces/content/content-edit.js +34 -8
- package/dist/admin/surfaces/content/content-edit.js.map +1 -1
- package/dist/admin/surfaces/content/content-index.d.ts.map +1 -1
- package/dist/admin/surfaces/content/content-index.js +29 -2
- package/dist/admin/surfaces/content/content-index.js.map +1 -1
- package/dist/admin/surfaces/content/content-new.d.ts.map +1 -1
- package/dist/admin/surfaces/content/content-new.js +6 -4
- package/dist/admin/surfaces/content/content-new.js.map +1 -1
- package/dist/admin/surfaces/contentTree/content-tree.d.ts.map +1 -1
- package/dist/admin/surfaces/contentTree/content-tree.js +25 -2
- package/dist/admin/surfaces/contentTree/content-tree.js.map +1 -1
- package/dist/admin/surfaces/contentTypes/content-types-designer.d.ts.map +1 -1
- package/dist/admin/surfaces/contentTypes/content-types-designer.js +78 -47
- package/dist/admin/surfaces/contentTypes/content-types-designer.js.map +1 -1
- package/dist/admin/surfaces/feeds/feed-editor.d.ts.map +1 -1
- package/dist/admin/surfaces/feeds/feed-editor.js +21 -4
- package/dist/admin/surfaces/feeds/feed-editor.js.map +1 -1
- package/dist/admin/surfaces/layouts/layout-editor-client.d.ts.map +1 -1
- package/dist/admin/surfaces/layouts/layout-editor-client.js +7 -4
- package/dist/admin/surfaces/layouts/layout-editor-client.js.map +1 -1
- package/dist/admin/surfaces/media/media-client.d.ts.map +1 -1
- package/dist/admin/surfaces/media/media-client.js +10 -2
- package/dist/admin/surfaces/media/media-client.js.map +1 -1
- package/dist/admin/surfaces/settings/settings-site.d.ts.map +1 -1
- package/dist/admin/surfaces/settings/settings-site.js +39 -2
- package/dist/admin/surfaces/settings/settings-site.js.map +1 -1
- package/dist/admin/surfaces/settings/settings-sites.js +18 -0
- package/dist/admin/surfaces/settings/settings-sites.js.map +1 -1
- package/dist/admin/surfaces/trash/trash-index.d.ts.map +1 -1
- package/dist/admin/surfaces/trash/trash-index.js +45 -8
- package/dist/admin/surfaces/trash/trash-index.js.map +1 -1
- package/dist/admin/surfaces/users/users-data.d.ts +11 -0
- package/dist/admin/surfaces/users/users-data.d.ts.map +1 -1
- package/dist/admin/surfaces/users/users-data.js +20 -1
- package/dist/admin/surfaces/users/users-data.js.map +1 -1
- package/dist/admin/surfaces/webServices/web-services-data.d.ts +11 -1
- package/dist/admin/surfaces/webServices/web-services-data.d.ts.map +1 -1
- package/dist/admin/surfaces/webServices/web-services-data.js +13 -0
- package/dist/admin/surfaces/webServices/web-services-data.js.map +1 -1
- package/dist/admin/surfaces/webServices/webhooks.d.ts +3 -0
- package/dist/admin/surfaces/webServices/webhooks.d.ts.map +1 -0
- package/dist/admin/surfaces/webServices/webhooks.js +69 -0
- package/dist/admin/surfaces/webServices/webhooks.js.map +1 -0
- package/dist/admin/webhook-manager.d.ts +32 -0
- package/dist/admin/webhook-manager.d.ts.map +1 -0
- package/dist/admin/webhook-manager.js +62 -0
- package/dist/admin/webhook-manager.js.map +1 -0
- package/dist/api/admin-features-routes.d.ts.map +1 -1
- package/dist/api/admin-features-routes.js +30 -0
- package/dist/api/admin-features-routes.js.map +1 -1
- package/dist/api/api-key-routes.d.ts.map +1 -1
- package/dist/api/api-key-routes.js +6 -1
- package/dist/api/api-key-routes.js.map +1 -1
- package/dist/api/auth.d.ts +8 -0
- package/dist/api/auth.d.ts.map +1 -1
- package/dist/api/auth.js +11 -1
- package/dist/api/auth.js.map +1 -1
- package/dist/api/comment-routes.d.ts.map +1 -1
- package/dist/api/comment-routes.js +102 -47
- package/dist/api/comment-routes.js.map +1 -1
- package/dist/api/config-routes.d.ts +10 -2
- package/dist/api/config-routes.d.ts.map +1 -1
- package/dist/api/config-routes.js +46 -25
- package/dist/api/config-routes.js.map +1 -1
- package/dist/api/content-routes.d.ts.map +1 -1
- package/dist/api/content-routes.js +41 -0
- package/dist/api/content-routes.js.map +1 -1
- package/dist/api/content-schemas.d.ts.map +1 -1
- package/dist/api/content-schemas.js +34 -1
- package/dist/api/content-schemas.js.map +1 -1
- package/dist/api/content-type-routes.d.ts.map +1 -1
- package/dist/api/content-type-routes.js +58 -3
- package/dist/api/content-type-routes.js.map +1 -1
- package/dist/api/feed-routes.d.ts +180 -0
- package/dist/api/feed-routes.d.ts.map +1 -1
- package/dist/api/feed-routes.js +10 -2
- package/dist/api/feed-routes.js.map +1 -1
- package/dist/api/form-routes.d.ts +6 -0
- package/dist/api/form-routes.d.ts.map +1 -1
- package/dist/api/form-routes.js +93 -14
- package/dist/api/form-routes.js.map +1 -1
- package/dist/api/graphql/resolvers.d.ts +4 -4
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +12 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/media-routes.d.ts.map +1 -1
- package/dist/api/media-routes.js +18 -1
- package/dist/api/media-routes.js.map +1 -1
- package/dist/api/webhook-routes.d.ts.map +1 -1
- package/dist/api/webhook-routes.js +19 -2
- package/dist/api/webhook-routes.js.map +1 -1
- package/dist/api/workflow-routes.d.ts.map +1 -1
- package/dist/api/workflow-routes.js +163 -4
- package/dist/api/workflow-routes.js.map +1 -1
- package/dist/auth/roles.d.ts +28 -0
- package/dist/auth/roles.d.ts.map +1 -1
- package/dist/auth/roles.js +49 -0
- package/dist/auth/roles.js.map +1 -1
- package/dist/config/reserved-field-names.d.ts +29 -0
- package/dist/config/reserved-field-names.d.ts.map +1 -0
- package/dist/config/reserved-field-names.js +59 -0
- package/dist/config/reserved-field-names.js.map +1 -0
- package/dist/config/types.d.ts +31 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/db/analytics-queries.d.ts +1 -1
- package/dist/db/api-key-queries.d.ts +7 -2
- package/dist/db/api-key-queries.d.ts.map +1 -1
- package/dist/db/api-key-queries.js +8 -2
- package/dist/db/api-key-queries.js.map +1 -1
- package/dist/db/apply-snapshot.d.ts +58 -0
- package/dist/db/apply-snapshot.d.ts.map +1 -0
- package/dist/db/apply-snapshot.js +142 -0
- package/dist/db/apply-snapshot.js.map +1 -0
- package/dist/db/audit-queries.d.ts +3 -3
- package/dist/db/category-queries.d.ts +3 -3
- package/dist/db/changeset-audit-queries.d.ts +2 -2
- package/dist/db/changeset-queries.d.ts +5 -5
- package/dist/db/changeset-queries.d.ts.map +1 -1
- package/dist/db/changeset-queries.js +24 -7
- package/dist/db/changeset-queries.js.map +1 -1
- package/dist/db/content-queries.d.ts +6 -0
- package/dist/db/content-queries.d.ts.map +1 -1
- package/dist/db/content-queries.js +8 -0
- package/dist/db/content-queries.js.map +1 -1
- package/dist/db/content-type-queries.d.ts +30 -0
- package/dist/db/content-type-queries.d.ts.map +1 -1
- package/dist/db/content-type-queries.js +98 -1
- package/dist/db/content-type-queries.js.map +1 -1
- package/dist/db/dashboard-queries.d.ts.map +1 -1
- package/dist/db/dashboard-queries.js +5 -1
- package/dist/db/dashboard-queries.js.map +1 -1
- package/dist/db/dynamic-schema.d.ts.map +1 -1
- package/dist/db/dynamic-schema.js +2 -0
- package/dist/db/dynamic-schema.js.map +1 -1
- package/dist/db/extension-queries.d.ts +8 -8
- package/dist/db/feed-queries.d.ts +3 -3
- package/dist/db/index.d.ts +3 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/media-queries.d.ts +31 -7
- package/dist/db/media-queries.d.ts.map +1 -1
- package/dist/db/media-queries.js +13 -1
- package/dist/db/media-queries.js.map +1 -1
- package/dist/db/membership-dedupe.d.ts +26 -0
- package/dist/db/membership-dedupe.d.ts.map +1 -0
- package/dist/db/membership-dedupe.js +68 -0
- package/dist/db/membership-dedupe.js.map +1 -0
- package/dist/db/revision-queries.d.ts +122 -0
- package/dist/db/revision-queries.d.ts.map +1 -0
- package/dist/db/revision-queries.js +213 -0
- package/dist/db/revision-queries.js.map +1 -0
- package/dist/db/schema-apply.d.ts +8 -0
- package/dist/db/schema-apply.d.ts.map +1 -1
- package/dist/db/schema-apply.js +17 -0
- package/dist/db/schema-apply.js.map +1 -1
- package/dist/db/schema-field-queries.d.ts +2 -0
- package/dist/db/schema-field-queries.d.ts.map +1 -1
- package/dist/db/schema-field-queries.js +4 -0
- package/dist/db/schema-field-queries.js.map +1 -1
- package/dist/db/site-plugin-queries.d.ts +2 -2
- package/dist/db/user-queries.d.ts +12 -0
- package/dist/db/user-queries.d.ts.map +1 -1
- package/dist/db/user-queries.js +18 -4
- package/dist/db/user-queries.js.map +1 -1
- package/dist/db/version-queries.d.ts +37 -0
- package/dist/db/version-queries.d.ts.map +1 -1
- package/dist/db/version-queries.js +36 -0
- package/dist/db/version-queries.js.map +1 -1
- package/dist/db/webhook-queries.d.ts +27 -5
- package/dist/db/webhook-queries.d.ts.map +1 -1
- package/dist/db/webhook-queries.js +17 -0
- package/dist/db/webhook-queries.js.map +1 -1
- package/dist/db/workflow-queries.d.ts +2 -2
- package/dist/experiments/schema.d.ts +1 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/webhook-retry.d.ts +22 -1
- package/dist/hooks/webhook-retry.d.ts.map +1 -1
- package/dist/hooks/webhook-retry.js +38 -1
- package/dist/hooks/webhook-retry.js.map +1 -1
- package/dist/host/index.d.ts +28 -0
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +56 -1
- package/dist/host/index.js.map +1 -1
- package/dist/layout/comments-module.d.ts +18 -0
- package/dist/layout/comments-module.d.ts.map +1 -0
- package/dist/layout/comments-module.js +130 -0
- package/dist/layout/comments-module.js.map +1 -0
- package/dist/layout/feed-hydration.d.ts +75 -0
- package/dist/layout/feed-hydration.d.ts.map +1 -0
- package/dist/layout/feed-hydration.js +158 -0
- package/dist/layout/feed-hydration.js.map +1 -0
- package/dist/layout/index.d.ts +2 -1
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +2 -1
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/module-render-context.d.ts +13 -0
- package/dist/layout/module-render-context.d.ts.map +1 -0
- package/dist/layout/module-render-context.js +15 -0
- package/dist/layout/module-render-context.js.map +1 -0
- package/dist/layout/modules-extended.d.ts.map +1 -1
- package/dist/layout/modules-extended.js +92 -13
- package/dist/layout/modules-extended.js.map +1 -1
- package/dist/layout/registry.d.ts.map +1 -1
- package/dist/layout/registry.js +22 -6
- package/dist/layout/registry.js.map +1 -1
- package/dist/layout/renderer.d.ts +17 -1
- package/dist/layout/renderer.d.ts.map +1 -1
- package/dist/layout/renderer.js +11 -4
- package/dist/layout/renderer.js.map +1 -1
- package/dist/nav/index.d.ts +1 -0
- package/dist/nav/index.d.ts.map +1 -1
- package/dist/nav/index.js +4 -0
- package/dist/nav/index.js.map +1 -1
- package/dist/nav/url-resolver.d.ts +10 -2
- package/dist/nav/url-resolver.d.ts.map +1 -1
- package/dist/nav/url-resolver.js +17 -3
- package/dist/nav/url-resolver.js.map +1 -1
- package/dist/schema/base.d.ts +37 -1
- package/dist/schema/base.d.ts.map +1 -1
- package/dist/schema/base.js +20 -2
- package/dist/schema/base.js.map +1 -1
- package/dist/schema/generate.d.ts +8 -0
- package/dist/schema/generate.d.ts.map +1 -1
- package/dist/schema/generate.js +7 -4
- package/dist/schema/generate.js.map +1 -1
- package/dist/schema/mapper.d.ts.map +1 -1
- package/dist/schema/mapper.js +2 -0
- package/dist/schema/mapper.js.map +1 -1
- package/dist/schema/mysql-tables.d.ts +34 -0
- package/dist/schema/mysql-tables.d.ts.map +1 -1
- package/dist/schema/mysql-tables.js +14 -2
- package/dist/schema/mysql-tables.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -0
- package/dist/server.js.map +1 -1
- package/dist/site/styles.css +384 -0
- package/package.json +2 -1
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { KywiDb } from './client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Default per-content version retention. There is no configurable retention
|
|
4
|
+
* concept in the engine (checked: no config field, no schema column), so every
|
|
5
|
+
* save/publish that snapshots a version (see recordContentVersion) keeps at most
|
|
6
|
+
* this many rows per content item and prunes the oldest beyond it. Chosen high
|
|
7
|
+
* enough to cover normal editorial rollback needs without unbounded growth on
|
|
8
|
+
* hot pages. Callers may override per-call.
|
|
9
|
+
*/
|
|
10
|
+
export declare const DEFAULT_VERSION_RETENTION = 50;
|
|
2
11
|
export declare function createVersion(db: KywiDb, data: {
|
|
3
12
|
contentId: string;
|
|
4
13
|
siteId: string;
|
|
@@ -47,4 +56,32 @@ export declare function getVersionById(db: KywiDb, versionId: string): Promise<{
|
|
|
47
56
|
*/
|
|
48
57
|
export declare function deleteContentVersion(db: KywiDb, contentId: string, versionId: string): Promise<boolean>;
|
|
49
58
|
export declare function getLatestVersionNumber(db: KywiDb, contentId: string): Promise<number>;
|
|
59
|
+
/**
|
|
60
|
+
* Snapshot a content item as its next version and prune history to the retention
|
|
61
|
+
* cap. This is the single entry point for the "every save/publish writes a
|
|
62
|
+
* version" path (#44): the admin editor's direct PUT/PATCH/publish/unpublish had
|
|
63
|
+
* no rollback safety net because only workflow transitions ever created versions.
|
|
64
|
+
*
|
|
65
|
+
* The version number is derived (latest + 1); pass the RESULTING content state as
|
|
66
|
+
* `snapshot`/`status`. After inserting, history is capped to `retention` most
|
|
67
|
+
* recent versions per content item. Returns the created version row.
|
|
68
|
+
*/
|
|
69
|
+
export declare function recordContentVersion(db: KywiDb, data: {
|
|
70
|
+
contentId: string;
|
|
71
|
+
siteId: string;
|
|
72
|
+
snapshot: Record<string, unknown>;
|
|
73
|
+
status: string;
|
|
74
|
+
changeNote?: string | undefined;
|
|
75
|
+
createdBy: string | null;
|
|
76
|
+
}, retention?: number): Promise<{
|
|
77
|
+
id: string;
|
|
78
|
+
siteId: string;
|
|
79
|
+
status: string;
|
|
80
|
+
createdAt: Date;
|
|
81
|
+
createdBy: string | null;
|
|
82
|
+
contentId: string;
|
|
83
|
+
version: number;
|
|
84
|
+
snapshot: unknown;
|
|
85
|
+
changeNote: string | null;
|
|
86
|
+
}>;
|
|
50
87
|
//# sourceMappingURL=version-queries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-queries.d.ts","sourceRoot":"","sources":["../../src/db/version-queries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"version-queries.d.ts","sourceRoot":"","sources":["../../src/db/version-queries.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAA;AAE3C,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;;;;;;;;;;GAkBF;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK;;;;;;;;;;KAO3E;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;UAOjE;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,EACD,SAAS,GAAE,MAAkC;;;;;;;;;;GAgB9C"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import { eq, desc, and } from 'drizzle-orm';
|
|
2
2
|
import { kywiContentVersions } from '../schema/base.js';
|
|
3
|
+
import { clearOldVersions } from '../versioning/version-management.js';
|
|
4
|
+
/**
|
|
5
|
+
* Default per-content version retention. There is no configurable retention
|
|
6
|
+
* concept in the engine (checked: no config field, no schema column), so every
|
|
7
|
+
* save/publish that snapshots a version (see recordContentVersion) keeps at most
|
|
8
|
+
* this many rows per content item and prunes the oldest beyond it. Chosen high
|
|
9
|
+
* enough to cover normal editorial rollback needs without unbounded growth on
|
|
10
|
+
* hot pages. Callers may override per-call.
|
|
11
|
+
*/
|
|
12
|
+
export const DEFAULT_VERSION_RETENTION = 50;
|
|
3
13
|
export async function createVersion(db, data) {
|
|
4
14
|
const values = {
|
|
5
15
|
contentId: data.contentId,
|
|
@@ -55,4 +65,30 @@ export async function getLatestVersionNumber(db, contentId) {
|
|
|
55
65
|
.limit(1);
|
|
56
66
|
return row?.version ?? 0;
|
|
57
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Snapshot a content item as its next version and prune history to the retention
|
|
70
|
+
* cap. This is the single entry point for the "every save/publish writes a
|
|
71
|
+
* version" path (#44): the admin editor's direct PUT/PATCH/publish/unpublish had
|
|
72
|
+
* no rollback safety net because only workflow transitions ever created versions.
|
|
73
|
+
*
|
|
74
|
+
* The version number is derived (latest + 1); pass the RESULTING content state as
|
|
75
|
+
* `snapshot`/`status`. After inserting, history is capped to `retention` most
|
|
76
|
+
* recent versions per content item. Returns the created version row.
|
|
77
|
+
*/
|
|
78
|
+
export async function recordContentVersion(db, data, retention = DEFAULT_VERSION_RETENTION) {
|
|
79
|
+
const latest = await getLatestVersionNumber(db, data.contentId);
|
|
80
|
+
const created = await createVersion(db, {
|
|
81
|
+
contentId: data.contentId,
|
|
82
|
+
siteId: data.siteId,
|
|
83
|
+
version: latest + 1,
|
|
84
|
+
snapshot: data.snapshot,
|
|
85
|
+
status: data.status,
|
|
86
|
+
createdBy: data.createdBy,
|
|
87
|
+
...(data.changeNote !== undefined ? { changeNote: data.changeNote } : {}),
|
|
88
|
+
});
|
|
89
|
+
if (retention > 0) {
|
|
90
|
+
await clearOldVersions(db, data.contentId, retention);
|
|
91
|
+
}
|
|
92
|
+
return created;
|
|
93
|
+
}
|
|
58
94
|
//# sourceMappingURL=version-queries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-queries.js","sourceRoot":"","sources":["../../src/db/version-queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"version-queries.js","sourceRoot":"","sources":["../../src/db/version-queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,11 +9,11 @@ export declare function createEndpoint(db: KywiDb, data: {
|
|
|
9
9
|
id: string;
|
|
10
10
|
siteId: string;
|
|
11
11
|
updatedAt: Date;
|
|
12
|
-
url: string;
|
|
13
12
|
createdAt: Date;
|
|
14
13
|
createdBy: string | null;
|
|
15
14
|
isActive: boolean;
|
|
16
15
|
secret: string;
|
|
16
|
+
url: string;
|
|
17
17
|
events: unknown;
|
|
18
18
|
}>;
|
|
19
19
|
export declare function updateEndpoint(db: KywiDb, id: string, data: PartialUndefined<{
|
|
@@ -36,33 +36,33 @@ export declare function listEndpoints(db: KywiDb, siteId: string): Promise<{
|
|
|
36
36
|
id: string;
|
|
37
37
|
siteId: string;
|
|
38
38
|
updatedAt: Date;
|
|
39
|
-
url: string;
|
|
40
39
|
createdAt: Date;
|
|
41
40
|
createdBy: string | null;
|
|
42
41
|
isActive: boolean;
|
|
43
42
|
secret: string;
|
|
43
|
+
url: string;
|
|
44
44
|
events: unknown;
|
|
45
45
|
}[]>;
|
|
46
46
|
export declare function getEndpointById(db: KywiDb, id: string): Promise<{
|
|
47
47
|
id: string;
|
|
48
48
|
siteId: string;
|
|
49
49
|
updatedAt: Date;
|
|
50
|
-
url: string;
|
|
51
50
|
createdAt: Date;
|
|
52
51
|
createdBy: string | null;
|
|
53
52
|
isActive: boolean;
|
|
54
53
|
secret: string;
|
|
54
|
+
url: string;
|
|
55
55
|
events: unknown;
|
|
56
56
|
} | null>;
|
|
57
57
|
export declare function listEndpointsForEvent(db: KywiDb, siteId: string, event: string): Promise<{
|
|
58
58
|
id: string;
|
|
59
59
|
siteId: string;
|
|
60
60
|
updatedAt: Date;
|
|
61
|
-
url: string;
|
|
62
61
|
createdAt: Date;
|
|
63
62
|
createdBy: string | null;
|
|
64
63
|
isActive: boolean;
|
|
65
64
|
secret: string;
|
|
65
|
+
url: string;
|
|
66
66
|
events: unknown;
|
|
67
67
|
}[]>;
|
|
68
68
|
export declare function createDelivery(db: KywiDb, data: {
|
|
@@ -72,8 +72,8 @@ export declare function createDelivery(db: KywiDb, data: {
|
|
|
72
72
|
}): Promise<{
|
|
73
73
|
id: string;
|
|
74
74
|
status: string;
|
|
75
|
-
event: string;
|
|
76
75
|
createdAt: Date;
|
|
76
|
+
event: string;
|
|
77
77
|
payload: unknown;
|
|
78
78
|
endpointId: string;
|
|
79
79
|
httpStatus: number | null;
|
|
@@ -102,8 +102,30 @@ export declare function updateDeliveryStatus(db: KywiDb, id: string, data: {
|
|
|
102
102
|
export declare function listDeliveries(db: KywiDb, endpointId: string, limit?: number): Promise<{
|
|
103
103
|
id: string;
|
|
104
104
|
status: string;
|
|
105
|
+
createdAt: Date;
|
|
105
106
|
event: string;
|
|
107
|
+
payload: unknown;
|
|
108
|
+
endpointId: string;
|
|
109
|
+
httpStatus: number | null;
|
|
110
|
+
responseBody: string | null;
|
|
111
|
+
attempts: number;
|
|
112
|
+
nextRetryAt: Date | null;
|
|
113
|
+
}[]>;
|
|
114
|
+
/**
|
|
115
|
+
* Deliveries due for a retry: `failed`, with a `nextRetryAt` that has come due,
|
|
116
|
+
* and still under the attempt cap. Ordered oldest-due first and bounded by
|
|
117
|
+
* `limit` so one sweep can't fan out unboundedly. Deliveries that exhaust
|
|
118
|
+
* `maxAttempts` simply stop matching (they are abandoned, not retried forever).
|
|
119
|
+
* The retry worker (`createWebhookRetryWorker`) consumes this.
|
|
120
|
+
*/
|
|
121
|
+
export declare function listPendingRetries(db: KywiDb, opts?: {
|
|
122
|
+
maxAttempts?: number;
|
|
123
|
+
limit?: number;
|
|
124
|
+
}): Promise<{
|
|
125
|
+
id: string;
|
|
126
|
+
status: string;
|
|
106
127
|
createdAt: Date;
|
|
128
|
+
event: string;
|
|
107
129
|
payload: unknown;
|
|
108
130
|
endpointId: string;
|
|
109
131
|
httpStatus: number | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-queries.d.ts","sourceRoot":"","sources":["../../src/db/webhook-queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAI3D,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;;;;;;;;;;GAaF;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,gBAAgB,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;;;;;;;;;;UAQ7E;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM7E;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;KAK7D;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;UAO3D;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM;;;;;;;;;;KAYd;AAID,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;;;;;;;;;;;GAWF;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CAC1B;;;;;;;;;;;UAcF;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;KAYf"}
|
|
1
|
+
{"version":3,"file":"webhook-queries.d.ts","sourceRoot":"","sources":["../../src/db/webhook-queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAI3D,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;;;;;;;;;;GAaF;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,gBAAgB,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;;;;;;;;;;UAQ7E;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM7E;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;KAK7D;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;UAO3D;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM;;;;;;;;;;KAYd;AAID,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;;;;;;;;;;;GAWF;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CAC1B;;;;;;;;;;;UAcF;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM;;;;;;;;;;;KAYf;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,EACV,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;KAiBhD"}
|
|
@@ -86,4 +86,21 @@ export async function listDeliveries(db, endpointId, limit) {
|
|
|
86
86
|
}
|
|
87
87
|
return query;
|
|
88
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Deliveries due for a retry: `failed`, with a `nextRetryAt` that has come due,
|
|
91
|
+
* and still under the attempt cap. Ordered oldest-due first and bounded by
|
|
92
|
+
* `limit` so one sweep can't fan out unboundedly. Deliveries that exhaust
|
|
93
|
+
* `maxAttempts` simply stop matching (they are abandoned, not retried forever).
|
|
94
|
+
* The retry worker (`createWebhookRetryWorker`) consumes this.
|
|
95
|
+
*/
|
|
96
|
+
export async function listPendingRetries(db, opts) {
|
|
97
|
+
const maxAttempts = opts?.maxAttempts ?? 10;
|
|
98
|
+
const limit = opts?.limit ?? 100;
|
|
99
|
+
return db
|
|
100
|
+
.select()
|
|
101
|
+
.from(kywiWebhookDeliveries)
|
|
102
|
+
.where(and(eq(kywiWebhookDeliveries.status, 'failed'), sql `${kywiWebhookDeliveries.nextRetryAt} IS NOT NULL`, sql `${kywiWebhookDeliveries.nextRetryAt} <= NOW()`, sql `${kywiWebhookDeliveries.attempts} < ${maxAttempts}`))
|
|
103
|
+
.orderBy(kywiWebhookDeliveries.nextRetryAt)
|
|
104
|
+
.limit(limit);
|
|
105
|
+
}
|
|
89
106
|
//# sourceMappingURL=webhook-queries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-queries.js","sourceRoot":"","sources":["../../src/db/webhook-queries.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webhook-queries.js","sourceRoot":"","sources":["../../src/db/webhook-queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -114,10 +114,10 @@ export declare function recordApprovalAction(db: KywiDb, data: {
|
|
|
114
114
|
comment?: string;
|
|
115
115
|
}): Promise<{
|
|
116
116
|
id: string;
|
|
117
|
-
action: string;
|
|
118
117
|
createdAt: Date;
|
|
119
118
|
contentId: string;
|
|
120
119
|
userId: string;
|
|
120
|
+
action: string;
|
|
121
121
|
chainId: string;
|
|
122
122
|
stepIndex: number;
|
|
123
123
|
comment: string | null;
|
|
@@ -127,10 +127,10 @@ export declare function recordApprovalAction(db: KywiDb, data: {
|
|
|
127
127
|
*/
|
|
128
128
|
export declare function getApprovalActions(db: KywiDb, chainId: string, contentId: string): Promise<{
|
|
129
129
|
id: string;
|
|
130
|
-
action: string;
|
|
131
130
|
createdAt: Date;
|
|
132
131
|
contentId: string;
|
|
133
132
|
userId: string;
|
|
133
|
+
action: string;
|
|
134
134
|
chainId: string;
|
|
135
135
|
stepIndex: number;
|
|
136
136
|
comment: string | null;
|
|
@@ -126,7 +126,7 @@ export declare const kywiExperiments: import("drizzle-orm/pg-core").PgTableWithC
|
|
|
126
126
|
tableName: "kywi_experiments";
|
|
127
127
|
dataType: "string";
|
|
128
128
|
columnType: "PgText";
|
|
129
|
-
data: "
|
|
129
|
+
data: "container" | "page";
|
|
130
130
|
driverParam: string;
|
|
131
131
|
notNull: true;
|
|
132
132
|
hasDefault: true;
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -4,6 +4,6 @@ export { KywiValidationError } from './errors.js';
|
|
|
4
4
|
export { loadPluginHooks, loadAllPluginHooks, loadAllPlugins, collectPluginContributions, resolvePluginModule, resolvePluginScopeExtensions, pluginKeyOf, pluginRuntimeConfig, type PluginDefinition, type PluginLoadResult, type PluginRuntimeContext, type PluginHookFn, type PluginActivationChecker, type LoadPluginOptions, type LoadAllPluginsOptions, type AdminExtensions, type AdminNavItem, } from './plugin-loader.js';
|
|
5
5
|
export { createPluginActivationRegistry, type PluginActivationRegistry } from './plugin-activation.js';
|
|
6
6
|
export { createApiResponseHookDispatcher, emitLifecycleHook, type ApiResponseHookDispatcher, type LifecycleEvent } from './dispatch.js';
|
|
7
|
-
export { createWebhookRetryWorker, type WebhookRetryWorker } from './webhook-retry.js';
|
|
7
|
+
export { createWebhookRetryWorker, startWebhookRetryWorker, type WebhookRetryWorker, type WebhookRetryHandle } from './webhook-retry.js';
|
|
8
8
|
export { wireAxInvalidation } from './ax-invalidation.js';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3H,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,4BAA4B,EAC5B,WAAW,EACX,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,8BAA8B,EAAE,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACtG,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAE,KAAK,yBAAyB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACvI,OAAO,EAAE,wBAAwB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3H,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,4BAA4B,EAC5B,WAAW,EACX,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,8BAA8B,EAAE,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACtG,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAE,KAAK,yBAAyB,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACvI,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACxI,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -4,6 +4,6 @@ export { KywiValidationError } from './errors.js';
|
|
|
4
4
|
export { loadPluginHooks, loadAllPluginHooks, loadAllPlugins, collectPluginContributions, resolvePluginModule, resolvePluginScopeExtensions, pluginKeyOf, pluginRuntimeConfig, } from './plugin-loader.js';
|
|
5
5
|
export { createPluginActivationRegistry } from './plugin-activation.js';
|
|
6
6
|
export { createApiResponseHookDispatcher, emitLifecycleHook } from './dispatch.js';
|
|
7
|
-
export { createWebhookRetryWorker } from './webhook-retry.js';
|
|
7
|
+
export { createWebhookRetryWorker, startWebhookRetryWorker } from './webhook-retry.js';
|
|
8
8
|
export { wireAxInvalidation } from './ax-invalidation.js';
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAuC,MAAM,eAAe,CAAA;AAC3H,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,4BAA4B,EAC5B,WAAW,EACX,mBAAmB,GAUpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,8BAA8B,EAAiC,MAAM,wBAAwB,CAAA;AACtG,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAuD,MAAM,eAAe,CAAA;AACvI,OAAO,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAuC,MAAM,eAAe,CAAA;AAC3H,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,4BAA4B,EAC5B,WAAW,EACX,mBAAmB,GAUpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,8BAA8B,EAAiC,MAAM,wBAAwB,CAAA;AACtG,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAuD,MAAM,eAAe,CAAA;AACvI,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAoD,MAAM,oBAAoB,CAAA;AACxI,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
@@ -3,7 +3,7 @@ interface WebhookDelivery {
|
|
|
3
3
|
id: string;
|
|
4
4
|
endpointId: string;
|
|
5
5
|
event: string;
|
|
6
|
-
payload:
|
|
6
|
+
payload: unknown;
|
|
7
7
|
status: string;
|
|
8
8
|
attempts: number;
|
|
9
9
|
nextRetryAt: Date | null;
|
|
@@ -22,5 +22,26 @@ export interface WebhookRetryWorker {
|
|
|
22
22
|
tick(): Promise<void>;
|
|
23
23
|
}
|
|
24
24
|
export declare function createWebhookRetryWorker(db: KywiDb, deps: RetryDeps): WebhookRetryWorker;
|
|
25
|
+
export interface WebhookRetryHandle {
|
|
26
|
+
/** Stop the interval runner. */
|
|
27
|
+
stop(): void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Start an in-process interval runner that re-dispatches due webhook retries
|
|
31
|
+
* every `intervalSeconds`, wiring the real DB deps (`listPendingRetries` /
|
|
32
|
+
* `getEndpointById`) into {@link createWebhookRetryWorker}. Mirrors
|
|
33
|
+
* `startScheduler`: overlapping ticks are skipped (a slow sweep never piles up),
|
|
34
|
+
* the timer is `unref()`d so it never keeps the process alive on its own, and
|
|
35
|
+
* one failed sweep routes to `onError` instead of crashing the host. Returns a
|
|
36
|
+
* handle whose `stop()` clears the interval.
|
|
37
|
+
*
|
|
38
|
+
* This is the missing runtime call site for the retry model (#57): before this,
|
|
39
|
+
* `createWebhookRetryWorker` was dead code and failed deliveries never retried.
|
|
40
|
+
*/
|
|
41
|
+
export declare function startWebhookRetryWorker(db: KywiDb, opts: {
|
|
42
|
+
intervalSeconds: number;
|
|
43
|
+
onError?: (err: unknown) => void;
|
|
44
|
+
maxAttempts?: number;
|
|
45
|
+
}): WebhookRetryHandle;
|
|
25
46
|
export {};
|
|
26
47
|
//# sourceMappingURL=webhook-retry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-retry.d.ts","sourceRoot":"","sources":["../../src/hooks/webhook-retry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"webhook-retry.d.ts","sourceRoot":"","sources":["../../src/hooks/webhook-retry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IAEb,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;CACzB;AAED,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,UAAU,SAAS;IACjB,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IAC9D,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAA;CAC7E;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACtB;AASD,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,SAAS,GACd,kBAAkB,CAwBpB;AAED,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,IAAI,IAAI,IAAI,CAAA;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACxF,kBAAkB,CA0BpB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHmac } from 'node:crypto';
|
|
2
|
-
import { updateDeliveryStatus } from '../db/webhook-queries.js';
|
|
2
|
+
import { updateDeliveryStatus, listPendingRetries, getEndpointById } from '../db/webhook-queries.js';
|
|
3
3
|
// Exponential backoff: 1min, 5min, 15min, 60min, ...
|
|
4
4
|
function computeNextRetryDelay(attempts) {
|
|
5
5
|
const base = 60_000; // 1 minute
|
|
@@ -22,6 +22,43 @@ export function createWebhookRetryWorker(db, deps) {
|
|
|
22
22
|
},
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Start an in-process interval runner that re-dispatches due webhook retries
|
|
27
|
+
* every `intervalSeconds`, wiring the real DB deps (`listPendingRetries` /
|
|
28
|
+
* `getEndpointById`) into {@link createWebhookRetryWorker}. Mirrors
|
|
29
|
+
* `startScheduler`: overlapping ticks are skipped (a slow sweep never piles up),
|
|
30
|
+
* the timer is `unref()`d so it never keeps the process alive on its own, and
|
|
31
|
+
* one failed sweep routes to `onError` instead of crashing the host. Returns a
|
|
32
|
+
* handle whose `stop()` clears the interval.
|
|
33
|
+
*
|
|
34
|
+
* This is the missing runtime call site for the retry model (#57): before this,
|
|
35
|
+
* `createWebhookRetryWorker` was dead code and failed deliveries never retried.
|
|
36
|
+
*/
|
|
37
|
+
export function startWebhookRetryWorker(db, opts) {
|
|
38
|
+
const worker = createWebhookRetryWorker(db, {
|
|
39
|
+
listPendingRetries: (d) => listPendingRetries(d, opts.maxAttempts !== undefined ? { maxAttempts: opts.maxAttempts } : {}),
|
|
40
|
+
getEndpointById: (d, id) => getEndpointById(d, id),
|
|
41
|
+
});
|
|
42
|
+
const ms = Math.max(1, opts.intervalSeconds) * 1000;
|
|
43
|
+
const onError = opts.onError ?? ((err) => console.warn('[kywi:webhooks] retry sweep failed:', err));
|
|
44
|
+
let running = false;
|
|
45
|
+
const timer = setInterval(() => {
|
|
46
|
+
if (running)
|
|
47
|
+
return;
|
|
48
|
+
running = true;
|
|
49
|
+
void worker.tick()
|
|
50
|
+
.catch(onError)
|
|
51
|
+
.finally(() => {
|
|
52
|
+
running = false;
|
|
53
|
+
});
|
|
54
|
+
}, ms);
|
|
55
|
+
// Do not hold the event loop open for the retry worker alone.
|
|
56
|
+
if (typeof timer.unref === 'function') {
|
|
57
|
+
;
|
|
58
|
+
timer.unref();
|
|
59
|
+
}
|
|
60
|
+
return { stop: () => clearInterval(timer) };
|
|
61
|
+
}
|
|
25
62
|
async function retryDeliver(url, secret, event, payload, deliveryId, previousAttempts, db) {
|
|
26
63
|
const body = JSON.stringify({ event, data: payload, timestamp: Date.now() });
|
|
27
64
|
const signature = createHmac('sha256', secret).update(body).digest('hex');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-retry.js","sourceRoot":"","sources":["../../src/hooks/webhook-retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"webhook-retry.js","sourceRoot":"","sources":["../../src/hooks/webhook-retry.ts"],"names":[],"mappings":"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"}
|
package/dist/host/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { assertProductionAuthSecret, isDevFallbackSecret, DEV_FALLBACK_SECRETS, } from '../auth/auth-secret.js';
|
|
2
|
+
export { canAccessContent, hasMinRole, type ContentAction, type KywiRole, } from '../auth/roles.js';
|
|
2
3
|
/** httpOnly cookie holding the short-lived access JWT (type=access). */
|
|
3
4
|
export declare const ACCESS_COOKIE = "kywi_access_token";
|
|
4
5
|
/** httpOnly cookie holding the long-lived refresh JWT (type=refresh). */
|
|
@@ -31,6 +32,33 @@ export type AccessTokenStatus =
|
|
|
31
32
|
* because it expired is still refreshable ('stale'); anything else is 'invalid'.
|
|
32
33
|
*/
|
|
33
34
|
export declare function classifyAccessToken(token: string | undefined, secret: string): Promise<AccessTokenStatus>;
|
|
35
|
+
/** The non-sensitive claims carried by a signature-verified access token. */
|
|
36
|
+
export interface SessionClaims {
|
|
37
|
+
/** The authenticated user's id (token `sub`). */
|
|
38
|
+
sub: string;
|
|
39
|
+
/** The user's role — feeds the content-permission gates (see canAccessContent). */
|
|
40
|
+
role: string;
|
|
41
|
+
/** The user's group ids (empty when the token carries none). */
|
|
42
|
+
groups: string[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Verify an access-token cookie against the host's auth secret and return its
|
|
46
|
+
* non-sensitive claims (sub / role / groups), or null when the token is missing,
|
|
47
|
+
* malformed, the wrong type, or its signature does not match `secret`.
|
|
48
|
+
*
|
|
49
|
+
* A token whose signature verified but has merely EXPIRED still yields its
|
|
50
|
+
* claims: a public (site) route is NOT in the middleware's refresh matcher, so
|
|
51
|
+
* an actively-signed-in admin's short-lived access cookie may have lapsed by the
|
|
52
|
+
* time they open a page with `?kywi-edit=1`. These claims only gate a client-side
|
|
53
|
+
* edit AFFORDANCE (the front-of-site overlay); every real mutation still flows
|
|
54
|
+
* through /api/v1, which the middleware refreshes and which re-checks auth. So
|
|
55
|
+
* surfacing the overlay for a signature-valid-but-stale admin is safe and correct
|
|
56
|
+
* UX. Anything whose signature does not verify returns null.
|
|
57
|
+
*
|
|
58
|
+
* Intended for a host's public render to decide whether to mount the overlay for
|
|
59
|
+
* the current visitor — pair it with the re-exported `canAccessContent`.
|
|
60
|
+
*/
|
|
61
|
+
export declare function readSessionClaims(token: string | undefined, secret: string): Promise<SessionClaims | null>;
|
|
34
62
|
/**
|
|
35
63
|
* Pull the access/refresh tokens out of a token-issuing endpoint's JSON body
|
|
36
64
|
* (`{ data: { accessToken, refreshToken } }`). Missing/non-string fields and
|
package/dist/host/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AA8BA,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AA8BA,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAM/B,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,KAAK,aAAa,EAClB,KAAK,QAAQ,GACd,MAAM,kBAAkB,CAAA;AAEzB,wEAAwE;AACxE,eAAO,MAAM,aAAa,sBAAsB,CAAA;AAChD,yEAAyE;AACzE,eAAO,MAAM,cAAc,uBAAuB,CAAA;AAGlD,eAAO,MAAM,kBAAkB,QAAU,CAAA;AACzC,eAAO,MAAM,mBAAmB,QAAmB,CAAA;AAEnD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,MAAM,CAAA;AAEtC;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAMlD,CAAA;AAEF,MAAM,MAAM,iBAAiB;AAC3B,wEAAwE;AACtE,OAAO;AACT,2EAA2E;GACzE,OAAO;AACT,yEAAyE;GACvE,SAAS,CAAA;AAcb;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,CAAC,CAa5B;AAED,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAA;IACX,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAA;IACZ,gEAAgE;IAChE,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAaD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAiB/B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACpD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAUA;AAED;oCACoC;AACpC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,KAAK,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAA;KAAE,CAAA;CACvF;AAkBD,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,MAAM,SAAqB,GAAG,oBAAoB,CAErF;AAED,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,MAAM,SAAsB,GAAG,oBAAoB,CAEvF;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAExE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEzE;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAG7D"}
|
package/dist/host/index.js
CHANGED
|
@@ -22,12 +22,17 @@
|
|
|
22
22
|
* them. The security-critical crypto (JWT verify, token classification, cookie
|
|
23
23
|
* options) lives here once; the two host files carry only framework wiring.
|
|
24
24
|
*/
|
|
25
|
-
import { jwtVerify } from 'jose';
|
|
25
|
+
import { jwtVerify, decodeJwt } from 'jose';
|
|
26
26
|
// Re-export the AUTH_SECRET production guard so a generated app can call it at
|
|
27
27
|
// module scope (in middleware.ts / kywi.config.ts) and refuse to build/start in
|
|
28
28
|
// production with a missing or dev-fallback secret. Shares its policy with the
|
|
29
29
|
// CLI/app env-guard, so both agree on what an insecure secret is.
|
|
30
30
|
export { assertProductionAuthSecret, isDevFallbackSecret, DEV_FALLBACK_SECRETS, } from '../auth/auth-secret.js';
|
|
31
|
+
// Re-export the pure role → content-permission helpers so a host's public (site)
|
|
32
|
+
// render can decide, from a verified token's role, whether to surface the
|
|
33
|
+
// front-of-site edit overlay (see readSessionClaims). Both are dependency-free,
|
|
34
|
+
// so this adds nothing to the edge bundle beyond the constants they close over.
|
|
35
|
+
export { canAccessContent, hasMinRole, } from '../auth/roles.js';
|
|
31
36
|
/** httpOnly cookie holding the short-lived access JWT (type=access). */
|
|
32
37
|
export const ACCESS_COOKIE = 'kywi_access_token';
|
|
33
38
|
/** httpOnly cookie holding the long-lived refresh JWT (type=refresh). */
|
|
@@ -88,6 +93,56 @@ export async function classifyAccessToken(token, secret) {
|
|
|
88
93
|
return 'invalid';
|
|
89
94
|
}
|
|
90
95
|
}
|
|
96
|
+
function claimsFromPayload(payload) {
|
|
97
|
+
if (payload['type'] !== 'access')
|
|
98
|
+
return null;
|
|
99
|
+
const sub = typeof payload['sub'] === 'string' ? payload['sub'] : null;
|
|
100
|
+
const role = typeof payload['role'] === 'string' ? payload['role'] : null;
|
|
101
|
+
if (!sub || !role)
|
|
102
|
+
return null;
|
|
103
|
+
const groups = Array.isArray(payload['groups'])
|
|
104
|
+
? payload['groups'].filter((g) => typeof g === 'string')
|
|
105
|
+
: [];
|
|
106
|
+
return { sub, role, groups };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Verify an access-token cookie against the host's auth secret and return its
|
|
110
|
+
* non-sensitive claims (sub / role / groups), or null when the token is missing,
|
|
111
|
+
* malformed, the wrong type, or its signature does not match `secret`.
|
|
112
|
+
*
|
|
113
|
+
* A token whose signature verified but has merely EXPIRED still yields its
|
|
114
|
+
* claims: a public (site) route is NOT in the middleware's refresh matcher, so
|
|
115
|
+
* an actively-signed-in admin's short-lived access cookie may have lapsed by the
|
|
116
|
+
* time they open a page with `?kywi-edit=1`. These claims only gate a client-side
|
|
117
|
+
* edit AFFORDANCE (the front-of-site overlay); every real mutation still flows
|
|
118
|
+
* through /api/v1, which the middleware refreshes and which re-checks auth. So
|
|
119
|
+
* surfacing the overlay for a signature-valid-but-stale admin is safe and correct
|
|
120
|
+
* UX. Anything whose signature does not verify returns null.
|
|
121
|
+
*
|
|
122
|
+
* Intended for a host's public render to decide whether to mount the overlay for
|
|
123
|
+
* the current visitor — pair it with the re-exported `canAccessContent`.
|
|
124
|
+
*/
|
|
125
|
+
export async function readSessionClaims(token, secret) {
|
|
126
|
+
if (!token)
|
|
127
|
+
return null;
|
|
128
|
+
try {
|
|
129
|
+
const { payload } = await jwtVerify(token, keyFor(secret), { algorithms: ['HS256'] });
|
|
130
|
+
return claimsFromPayload(payload);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
// jose verifies the signature BEFORE the exp claim, so ERR_JWT_EXPIRED means
|
|
134
|
+
// the signature was valid — decode the (unverified) claims to read the role.
|
|
135
|
+
if (err.code === 'ERR_JWT_EXPIRED') {
|
|
136
|
+
try {
|
|
137
|
+
return claimsFromPayload(decodeJwt(token));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
91
146
|
/**
|
|
92
147
|
* Pull the access/refresh tokens out of a token-issuing endpoint's JSON body
|
|
93
148
|
* (`{ data: { accessToken, refreshToken } }`). Missing/non-string fields and
|
package/dist/host/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comments layout module (#29). Renders the approved-comment list for the
|
|
3
|
+
* current content plus a public submission form. New comments POST to the
|
|
4
|
+
* collection endpoint `POST /api/v1/comments` and always land in the moderation
|
|
5
|
+
* queue as `pending`; they only appear here once an editor approves them (the
|
|
6
|
+
* list reads `GET /api/v1/comments?contentId=…&status=approved`, which the API
|
|
7
|
+
* only ever returns approved rows for).
|
|
8
|
+
*
|
|
9
|
+
* Inside the layout-editor canvas it renders a non-interactive preview (no live
|
|
10
|
+
* `<form>`), matching the Form module's editor behaviour (kywi-cms#36).
|
|
11
|
+
*/
|
|
12
|
+
interface ModuleProps {
|
|
13
|
+
props: Record<string, unknown>;
|
|
14
|
+
style?: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export declare function CommentsModule({ props }: ModuleProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=comments-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments-module.d.ts","sourceRoot":"","sources":["../../src/layout/comments-module.tsx"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AAEH,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AA2OD,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,2CAmBpD"}
|