@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
|
@@ -20,8 +20,38 @@ export declare function rowToContentType(row: ContentTypeRow): ContentTypeConfig
|
|
|
20
20
|
export declare function loadAdminTypes(db: KywiDb): Promise<Array<ContentTypeConfig & {
|
|
21
21
|
source: 'admin';
|
|
22
22
|
}>>;
|
|
23
|
+
/**
|
|
24
|
+
* Load every admin-created content type with its persisted fields merged in —
|
|
25
|
+
* the schema-generation view of the runtime registry. This is the single lookup
|
|
26
|
+
* the CLI's `migrate:generate` uses so drizzle-kit's generated schema reflects
|
|
27
|
+
* the FULL content model (config + admin), and admin-created `kywi_ct_*` tables
|
|
28
|
+
* are never treated as droppable orphans (#38). Mirrors the admin-type merge in
|
|
29
|
+
* `createKywiApiHandler`'s `rebuildSchemaMaps`.
|
|
30
|
+
*
|
|
31
|
+
* MUST tolerate databases whose schema predates the running package version:
|
|
32
|
+
* `kywi migrate` calls this BEFORE the migration that adds new columns (e.g.
|
|
33
|
+
* 0.3.0's `title_required` / `related_type`), so a drizzle `select()` over the
|
|
34
|
+
* current table objects would throw undefined_column, get mistaken for "DB not
|
|
35
|
+
* reachable", and regenerate the exact unprotected schema #38 exists to prevent.
|
|
36
|
+
* Columns are therefore probed via information_schema and selected explicitly;
|
|
37
|
+
* missing new columns fall back to their defaults. A database with no
|
|
38
|
+
* `kywi_content_types` table at all (fresh install, pre-first-migration)
|
|
39
|
+
* returns [] — there is nothing to protect yet.
|
|
40
|
+
*/
|
|
41
|
+
export declare function loadAdminContentTypes(db: KywiDb): Promise<Array<ContentTypeConfig & {
|
|
42
|
+
source: 'admin';
|
|
43
|
+
}>>;
|
|
23
44
|
/** Create an admin content type. Throws on a duplicate name (unique constraint). */
|
|
24
45
|
export declare function saveAdminType(db: KywiDb, input: AdminTypeInput): Promise<void>;
|
|
25
46
|
/** Delete an admin content type by name. Returns true if a row was removed. */
|
|
26
47
|
export declare function deleteAdminType(db: KywiDb, name: string): Promise<boolean>;
|
|
48
|
+
export interface AdminTypeSettingsInput {
|
|
49
|
+
titleRequired?: boolean | undefined;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Update type-level settings for an admin-created content type (kywi-cms#12).
|
|
53
|
+
* Only the settings explicitly present in `input` are changed. Returns true
|
|
54
|
+
* when a row was updated.
|
|
55
|
+
*/
|
|
56
|
+
export declare function updateAdminTypeSettings(db: KywiDb, name: string, input: AdminTypeSettingsInput): Promise<boolean>;
|
|
27
57
|
//# sourceMappingURL=content-type-queries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-type-queries.d.ts","sourceRoot":"","sources":["../../src/db/content-type-queries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAY,iBAAiB,
|
|
1
|
+
{"version":3,"file":"content-type-queries.d.ts","sourceRoot":"","sources":["../../src/db/content-type-queries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAY,iBAAiB,EAAoC,MAAM,oBAAoB,CAAA;AAGvG,MAAM,MAAM,cAAc,GAAG,OAAO,gBAAgB,CAAC,YAAY,CAAA;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,iBAAiB,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAY7F;AAED,sFAAsF;AACtF,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAGxG;AAcD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,KAAK,CAAC,iBAAiB,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAoDzD;AAQD,oFAAoF;AACpF,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpF;AAED,+EAA+E;AAC/E,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMhF;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACpC;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAUlB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { eq } from 'drizzle-orm';
|
|
1
|
+
import { eq, sql } from 'drizzle-orm';
|
|
2
2
|
import { kywiContentTypes } from '../schema/base.js';
|
|
3
3
|
/**
|
|
4
4
|
* Map an admin content-type row to a ContentTypeConfig. Fields are always empty
|
|
@@ -11,6 +11,9 @@ export function rowToContentType(row) {
|
|
|
11
11
|
label: row.label,
|
|
12
12
|
baseType: row.baseType,
|
|
13
13
|
...(row.icon ? { icon: row.icon } : {}),
|
|
14
|
+
// Older rows predate the column (mocked test fixtures, etc.) — default true,
|
|
15
|
+
// matching the DB column's own default (kywi-cms#12).
|
|
16
|
+
titleRequired: row.titleRequired ?? true,
|
|
14
17
|
fields: [],
|
|
15
18
|
source: 'admin',
|
|
16
19
|
};
|
|
@@ -20,6 +23,84 @@ export async function loadAdminTypes(db) {
|
|
|
20
23
|
const rows = await db.select().from(kywiContentTypes).orderBy(kywiContentTypes.name);
|
|
21
24
|
return rows.map(rowToContentType);
|
|
22
25
|
}
|
|
26
|
+
/** Column names present on a table, per information_schema. Empty set = table absent. */
|
|
27
|
+
async function existingColumns(db, table) {
|
|
28
|
+
const result = await db.execute(sql `
|
|
29
|
+
SELECT column_name FROM information_schema.columns
|
|
30
|
+
WHERE table_schema = 'public' AND table_name = ${table}
|
|
31
|
+
`);
|
|
32
|
+
const rows = Array.isArray(result)
|
|
33
|
+
? result
|
|
34
|
+
: (result.rows ?? []);
|
|
35
|
+
return new Set(rows.map(r => String(r.column_name)));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Load every admin-created content type with its persisted fields merged in —
|
|
39
|
+
* the schema-generation view of the runtime registry. This is the single lookup
|
|
40
|
+
* the CLI's `migrate:generate` uses so drizzle-kit's generated schema reflects
|
|
41
|
+
* the FULL content model (config + admin), and admin-created `kywi_ct_*` tables
|
|
42
|
+
* are never treated as droppable orphans (#38). Mirrors the admin-type merge in
|
|
43
|
+
* `createKywiApiHandler`'s `rebuildSchemaMaps`.
|
|
44
|
+
*
|
|
45
|
+
* MUST tolerate databases whose schema predates the running package version:
|
|
46
|
+
* `kywi migrate` calls this BEFORE the migration that adds new columns (e.g.
|
|
47
|
+
* 0.3.0's `title_required` / `related_type`), so a drizzle `select()` over the
|
|
48
|
+
* current table objects would throw undefined_column, get mistaken for "DB not
|
|
49
|
+
* reachable", and regenerate the exact unprotected schema #38 exists to prevent.
|
|
50
|
+
* Columns are therefore probed via information_schema and selected explicitly;
|
|
51
|
+
* missing new columns fall back to their defaults. A database with no
|
|
52
|
+
* `kywi_content_types` table at all (fresh install, pre-first-migration)
|
|
53
|
+
* returns [] — there is nothing to protect yet.
|
|
54
|
+
*/
|
|
55
|
+
export async function loadAdminContentTypes(db) {
|
|
56
|
+
const [typeCols, fieldCols] = await Promise.all([
|
|
57
|
+
existingColumns(db, 'kywi_content_types'),
|
|
58
|
+
existingColumns(db, 'kywi_content_type_fields'),
|
|
59
|
+
]);
|
|
60
|
+
if (typeCols.size === 0)
|
|
61
|
+
return [];
|
|
62
|
+
const hasTitleRequired = typeCols.has('title_required');
|
|
63
|
+
const typeRows = await db.execute(sql.raw(`SELECT name, label, base_type, icon${hasTitleRequired ? ', title_required' : ''}
|
|
64
|
+
FROM kywi_content_types ORDER BY name`));
|
|
65
|
+
const types = rowsOf(typeRows).map(r => ({
|
|
66
|
+
name: String(r['name']),
|
|
67
|
+
label: String(r['label']),
|
|
68
|
+
baseType: String(r['base_type']),
|
|
69
|
+
...(r['icon'] ? { icon: String(r['icon']) } : {}),
|
|
70
|
+
titleRequired: hasTitleRequired ? Boolean(r['title_required'] ?? true) : true,
|
|
71
|
+
fields: [],
|
|
72
|
+
source: 'admin',
|
|
73
|
+
}));
|
|
74
|
+
if (fieldCols.size === 0)
|
|
75
|
+
return types;
|
|
76
|
+
const hasRelatedType = fieldCols.has('related_type');
|
|
77
|
+
const fieldRows = await db.execute(sql.raw(`SELECT content_type_name, name, type, label, options, required, validation,
|
|
78
|
+
sort_order${hasRelatedType ? ', related_type' : ''}
|
|
79
|
+
FROM kywi_content_type_fields ORDER BY sort_order`));
|
|
80
|
+
const fieldMap = new Map();
|
|
81
|
+
for (const r of rowsOf(fieldRows)) {
|
|
82
|
+
const def = {
|
|
83
|
+
name: String(r['name']),
|
|
84
|
+
type: String(r['type']),
|
|
85
|
+
label: String(r['label']),
|
|
86
|
+
required: Boolean(r['required']),
|
|
87
|
+
...(r['options'] != null && { options: r['options'] }),
|
|
88
|
+
...(r['validation'] != null && { validation: r['validation'] }),
|
|
89
|
+
...(hasRelatedType && r['related_type'] != null && { relatedType: String(r['related_type']) }),
|
|
90
|
+
source: 'admin',
|
|
91
|
+
};
|
|
92
|
+
const key = String(r['content_type_name']);
|
|
93
|
+
const existing = fieldMap.get(key) ?? [];
|
|
94
|
+
existing.push(def);
|
|
95
|
+
fieldMap.set(key, existing);
|
|
96
|
+
}
|
|
97
|
+
return types.map(t => ({ ...t, fields: fieldMap.get(t.name) ?? [] }));
|
|
98
|
+
}
|
|
99
|
+
function rowsOf(result) {
|
|
100
|
+
return Array.isArray(result)
|
|
101
|
+
? result
|
|
102
|
+
: (result.rows ?? []);
|
|
103
|
+
}
|
|
23
104
|
/** Create an admin content type. Throws on a duplicate name (unique constraint). */
|
|
24
105
|
export async function saveAdminType(db, input) {
|
|
25
106
|
await db.insert(kywiContentTypes).values({
|
|
@@ -37,4 +118,20 @@ export async function deleteAdminType(db, name) {
|
|
|
37
118
|
.returning();
|
|
38
119
|
return result.length > 0;
|
|
39
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Update type-level settings for an admin-created content type (kywi-cms#12).
|
|
123
|
+
* Only the settings explicitly present in `input` are changed. Returns true
|
|
124
|
+
* when a row was updated.
|
|
125
|
+
*/
|
|
126
|
+
export async function updateAdminTypeSettings(db, name, input) {
|
|
127
|
+
const result = await db
|
|
128
|
+
.update(kywiContentTypes)
|
|
129
|
+
.set({
|
|
130
|
+
...(input.titleRequired !== undefined ? { titleRequired: input.titleRequired } : {}),
|
|
131
|
+
updatedAt: new Date(),
|
|
132
|
+
})
|
|
133
|
+
.where(eq(kywiContentTypes.name, name))
|
|
134
|
+
.returning();
|
|
135
|
+
return result.length > 0;
|
|
136
|
+
}
|
|
40
137
|
//# sourceMappingURL=content-type-queries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-type-queries.js","sourceRoot":"","sources":["../../src/db/content-type-queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"content-type-queries.js","sourceRoot":"","sources":["../../src/db/content-type-queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-queries.d.ts","sourceRoot":"","sources":["../../src/db/dashboard-queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,qBAAqB,CAAA;IAC7B,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,mBAAmB,EAAE,CAAA;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC,GACtD,qBAAqB,CAUvB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"dashboard-queries.d.ts","sourceRoot":"","sources":["../../src/db/dashboard-queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,qBAAqB,CAAA;IAC7B,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,mBAAmB,EAAE,CAAA;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC,GACtD,qBAAqB,CAUvB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA0D3F"}
|
|
@@ -63,8 +63,12 @@ export async function getDashboardStats(db, siteId) {
|
|
|
63
63
|
.select({ count: sql `count(*)::int` })
|
|
64
64
|
.from(kywiMedia)
|
|
65
65
|
.where(and(eq(kywiMedia.siteId, siteId), sql `${kywiMedia.deletedAt} IS NULL`)),
|
|
66
|
+
// #40: count(DISTINCT userId), not count(*) — kywi_site_memberships has no
|
|
67
|
+
// uniqueness constraint on (userId, siteId), so a user with a duplicate
|
|
68
|
+
// membership row for this site was counted twice, inflating the dashboard
|
|
69
|
+
// "Users" tile (mirrors the same fan-out fixed in listUsers, user-queries.ts).
|
|
66
70
|
db
|
|
67
|
-
.select({ count: sql `count(
|
|
71
|
+
.select({ count: sql `count(DISTINCT ${kywiUsers.id})::int` })
|
|
68
72
|
.from(kywiUsers)
|
|
69
73
|
.innerJoin(kywiSiteMemberships, eq(kywiSiteMemberships.userId, kywiUsers.id))
|
|
70
74
|
.where(eq(kywiSiteMemberships.siteId, siteId)),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-queries.js","sourceRoot":"","sources":["../../src/db/dashboard-queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AA2B1F;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAuD;IAEvD,MAAM,MAAM,GAA0B,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAA;IACtF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAA;QACjB,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW;YAAE,MAAM,CAAC,SAAS,IAAI,CAAC,CAAA;aAChD,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO;YAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAA;aAC7C,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAAE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAA;IACxD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAU,EAAE,MAAc;IAChE,MAAM,iBAAiB,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,CAAA,GAAG,WAAW,CAAC,SAAS,UAAU,CAAC,CAAA;IAEpG,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtE,EAAE;aACC,MAAM,CAAC;YACN,WAAW,EAAE,WAAW,CAAC,eAAe;YACxC,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,KAAK,EAAE,GAAG,CAAQ,eAAe;SAClC,CAAC;aACD,IAAI,CAAC,WAAW,CAAC;aACjB,KAAK,CAAC,iBAAiB,CAAC;aACxB,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC;QAC3D,EAAE;aACC,MAAM,CAAC;YACN,EAAE,EAAE,WAAW,CAAC,EAAE;YAClB,IAAI,EAAE,WAAW,CAAC,eAAe;YACjC,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,SAAS,EAAE,WAAW,CAAC,SAAS;SACjC,CAAC;aACD,IAAI,CAAC,WAAW,CAAC;aACjB,KAAK,CAAC,iBAAiB,CAAC;aACxB,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;aACpC,KAAK,CAAC,CAAC,CAAC;QACX,EAAE;aACC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAQ,eAAe,EAAE,CAAC;aAC7C,IAAI,CAAC,SAAS,CAAC;aACf,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,CAAA,GAAG,SAAS,CAAC,SAAS,UAAU,CAAC,CAAC;QAChF,EAAE;aACC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAQ,
|
|
1
|
+
{"version":3,"file":"dashboard-queries.js","sourceRoot":"","sources":["../../src/db/dashboard-queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-schema.d.ts","sourceRoot":"","sources":["../../src/db/dynamic-schema.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"dynamic-schema.d.ts","sourceRoot":"","sources":["../../src/db/dynamic-schema.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,oBAAoB,CAAA;AAyC5E,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,iBAAiB,GAC7B,kBAAkB,CAAC,GAAG,CAAC,CAazB"}
|
|
@@ -6,9 +6,11 @@ function fieldToColumn(field) {
|
|
|
6
6
|
case 'text':
|
|
7
7
|
case 'richText':
|
|
8
8
|
case 'textarea':
|
|
9
|
+
case 'url':
|
|
9
10
|
return text(colName);
|
|
10
11
|
case 'select':
|
|
11
12
|
case 'slug':
|
|
13
|
+
case 'email':
|
|
12
14
|
return varchar(colName, { length: 255 });
|
|
13
15
|
case 'color':
|
|
14
16
|
return varchar(colName, { length: 7 });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-schema.js","sourceRoot":"","sources":["../../src/db/dynamic-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,OAAO,EACP,OAAO,EACP,KAAK,EACL,SAAS,GACV,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE1E,SAAS,aAAa,CAAC,KAAsB;IAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAExC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,UAAU;
|
|
1
|
+
{"version":3,"file":"dynamic-schema.js","sourceRoot":"","sources":["../../src/db/dynamic-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,OAAO,EACP,OAAO,EACP,KAAK,EACL,SAAS,GACV,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE1E,SAAS,aAAa,CAAC,KAAsB;IAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAExC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,UAAU,CAAC;QAChB,KAAK,KAAK;YACR,OAAO,IAAI,CAAC,OAAO,CAAC,CAAA;QACtB,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC1C,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;QACxC,KAAK,aAAa,CAAC;QACnB,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,OAAO,CAAC,CAAA;QACvB,KAAK,cAAc,CAAC;QACpB,KAAK,OAAO,CAAC;QACb,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,OAAO,CAAC,CAAA;QACtB,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;QACnD,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,QAAQ,KAAK,KAAK;gBAC7B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;gBAClB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC/C,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC,OAAO,CAAC,CAAA;QACzB,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,KAAK,CAAC,IAAI,CAAA;YACrC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,WAA8B;IAE9B,MAAM,SAAS,GAAG,sBAAsB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAE1D,MAAM,OAAO,GAAwB;QACnC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;QAC3B,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;KAClC,CAAA;IAED,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AACpC,CAAC"}
|
|
@@ -8,9 +8,9 @@ export declare function createSubtype(db: KywiDb, data: {
|
|
|
8
8
|
}): Promise<{
|
|
9
9
|
id: string;
|
|
10
10
|
name: string;
|
|
11
|
-
description: string | null;
|
|
12
11
|
createdAt: Date;
|
|
13
12
|
isActive: boolean;
|
|
13
|
+
description: string | null;
|
|
14
14
|
baseContentType: string;
|
|
15
15
|
}>;
|
|
16
16
|
export declare function updateSubtype(db: KywiDb, id: string, data: PartialUndefined<{
|
|
@@ -30,9 +30,9 @@ export declare function deleteSubtype(db: KywiDb, id: string): Promise<boolean>;
|
|
|
30
30
|
export declare function listSubtypes(db: KywiDb): Promise<{
|
|
31
31
|
id: string;
|
|
32
32
|
name: string;
|
|
33
|
-
description: string | null;
|
|
34
33
|
createdAt: Date;
|
|
35
34
|
isActive: boolean;
|
|
35
|
+
description: string | null;
|
|
36
36
|
baseContentType: string;
|
|
37
37
|
}[]>;
|
|
38
38
|
export declare function createAttributeSet(db: KywiDb, data: {
|
|
@@ -80,12 +80,12 @@ export declare function createAttribute(db: KywiDb, data: {
|
|
|
80
80
|
}): Promise<{
|
|
81
81
|
id: string;
|
|
82
82
|
sortOrder: number;
|
|
83
|
-
|
|
83
|
+
validation: unknown;
|
|
84
84
|
type: string;
|
|
85
|
+
label: string;
|
|
85
86
|
name: string;
|
|
86
|
-
defaultValue: string | null;
|
|
87
|
-
validation: unknown;
|
|
88
87
|
createdAt: Date;
|
|
88
|
+
defaultValue: string | null;
|
|
89
89
|
setId: string;
|
|
90
90
|
}>;
|
|
91
91
|
export declare function updateAttribute(db: KywiDb, id: string, data: PartialUndefined<{
|
|
@@ -110,12 +110,12 @@ export declare function deleteAttribute(db: KywiDb, id: string): Promise<boolean
|
|
|
110
110
|
export declare function listAttributes(db: KywiDb, setId: string): Promise<{
|
|
111
111
|
id: string;
|
|
112
112
|
sortOrder: number;
|
|
113
|
-
|
|
113
|
+
validation: unknown;
|
|
114
114
|
type: string;
|
|
115
|
+
label: string;
|
|
115
116
|
name: string;
|
|
116
|
-
defaultValue: string | null;
|
|
117
|
-
validation: unknown;
|
|
118
117
|
createdAt: Date;
|
|
118
|
+
defaultValue: string | null;
|
|
119
119
|
setId: string;
|
|
120
120
|
}[]>;
|
|
121
121
|
/**
|
|
@@ -5,10 +5,10 @@ export declare function listFeeds(db: KywiDb, siteId: string): Promise<{
|
|
|
5
5
|
siteId: string;
|
|
6
6
|
slug: string;
|
|
7
7
|
updatedAt: Date;
|
|
8
|
-
query: unknown;
|
|
9
8
|
name: string;
|
|
10
9
|
createdAt: Date;
|
|
11
10
|
createdBy: string | null;
|
|
11
|
+
query: unknown;
|
|
12
12
|
cacheTtl: number | null;
|
|
13
13
|
}[]>;
|
|
14
14
|
export declare function getFeedBySlug(db: KywiDb, slug: string, siteId: string): Promise<{
|
|
@@ -16,10 +16,10 @@ export declare function getFeedBySlug(db: KywiDb, slug: string, siteId: string):
|
|
|
16
16
|
siteId: string;
|
|
17
17
|
slug: string;
|
|
18
18
|
updatedAt: Date;
|
|
19
|
-
query: unknown;
|
|
20
19
|
name: string;
|
|
21
20
|
createdAt: Date;
|
|
22
21
|
createdBy: string | null;
|
|
22
|
+
query: unknown;
|
|
23
23
|
cacheTtl: number | null;
|
|
24
24
|
} | null>;
|
|
25
25
|
export declare function createFeed(db: KywiDb, data: {
|
|
@@ -34,10 +34,10 @@ export declare function createFeed(db: KywiDb, data: {
|
|
|
34
34
|
siteId: string;
|
|
35
35
|
slug: string;
|
|
36
36
|
updatedAt: Date;
|
|
37
|
-
query: unknown;
|
|
38
37
|
name: string;
|
|
39
38
|
createdAt: Date;
|
|
40
39
|
createdBy: string | null;
|
|
40
|
+
query: unknown;
|
|
41
41
|
cacheTtl: number | null;
|
|
42
42
|
}>;
|
|
43
43
|
export declare function updateFeed(db: KywiDb, slug: string, siteId: string, data: Partial<{
|
package/dist/db/index.d.ts
CHANGED
|
@@ -32,4 +32,7 @@ export * from './category-path-queries.js';
|
|
|
32
32
|
export * from './changeset-queries.js';
|
|
33
33
|
export * from './lock-queries.js';
|
|
34
34
|
export * from './env-guard.js';
|
|
35
|
+
export { loadAdminContentTypes } from './content-type-queries.js';
|
|
36
|
+
export { listCustomContentTables } from './schema-apply.js';
|
|
37
|
+
export { dedupeMembershipRows } from './membership-dedupe.js';
|
|
35
38
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/db/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA;AACtC,cAAc,mCAAmC,CAAA;AACjD,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA;AACtC,cAAc,mCAAmC,CAAA;AACjD,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAG9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAG3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA"}
|
package/dist/db/index.js
CHANGED
|
@@ -32,4 +32,11 @@ export * from './category-path-queries.js';
|
|
|
32
32
|
export * from './changeset-queries.js';
|
|
33
33
|
export * from './lock-queries.js';
|
|
34
34
|
export * from './env-guard.js';
|
|
35
|
+
// Registry read helpers surfaced for tooling (the CLI's migrate:generate reads
|
|
36
|
+
// admin-created types + their dynamic tables so it never drops them — #38).
|
|
37
|
+
export { loadAdminContentTypes } from './content-type-queries.js';
|
|
38
|
+
export { listCustomContentTables } from './schema-apply.js';
|
|
39
|
+
// One-time duplicate-membership cleanup the CLI runs before applying the #40
|
|
40
|
+
// uniqueness constraints to a pre-existing database.
|
|
41
|
+
export { dedupeMembershipRows } from './membership-dedupe.js';
|
|
35
42
|
//# sourceMappingURL=index.js.map
|
package/dist/db/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA;AACtC,cAAc,mCAAmC,CAAA;AACjD,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,wBAAwB,CAAA;AACtC,cAAc,mCAAmC,CAAA;AACjD,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,+EAA+E;AAC/E,4EAA4E;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,6EAA6E;AAC7E,qDAAqD;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA"}
|
|
@@ -3,18 +3,42 @@ export declare function listMedia(db: KywiDb, siteId: string): Promise<{
|
|
|
3
3
|
id: string;
|
|
4
4
|
siteId: string;
|
|
5
5
|
updatedAt: Date;
|
|
6
|
-
caption: string | null;
|
|
7
6
|
width: number | null;
|
|
7
|
+
createdAt: Date;
|
|
8
|
+
deletedAt: Date | null;
|
|
9
|
+
filename: string;
|
|
10
|
+
mimeType: string;
|
|
11
|
+
fileSize: number;
|
|
8
12
|
height: number | null;
|
|
13
|
+
duration: number | null;
|
|
14
|
+
originalFilename: string;
|
|
15
|
+
altText: string | null;
|
|
16
|
+
caption: string | null;
|
|
9
17
|
tags: unknown;
|
|
18
|
+
uploadedBy: string | null;
|
|
19
|
+
storageKey: string;
|
|
20
|
+
}[]>;
|
|
21
|
+
/**
|
|
22
|
+
* List soft-deleted media for a site, newest-deleted first (#23 — the Trash
|
|
23
|
+
* surface's media tab). Mirrors `listDeletedContent`'s shape/ordering
|
|
24
|
+
* (`db/content-restore.ts`) so the two trash sources merge predictably.
|
|
25
|
+
*/
|
|
26
|
+
export declare function listDeletedMedia(db: KywiDb, siteId: string): Promise<{
|
|
27
|
+
id: string;
|
|
28
|
+
siteId: string;
|
|
29
|
+
updatedAt: Date;
|
|
30
|
+
width: number | null;
|
|
10
31
|
createdAt: Date;
|
|
11
32
|
deletedAt: Date | null;
|
|
12
33
|
filename: string;
|
|
13
34
|
mimeType: string;
|
|
14
35
|
fileSize: number;
|
|
36
|
+
height: number | null;
|
|
15
37
|
duration: number | null;
|
|
16
38
|
originalFilename: string;
|
|
17
39
|
altText: string | null;
|
|
40
|
+
caption: string | null;
|
|
41
|
+
tags: unknown;
|
|
18
42
|
uploadedBy: string | null;
|
|
19
43
|
storageKey: string;
|
|
20
44
|
}[]>;
|
|
@@ -22,18 +46,18 @@ export declare function getMediaById(db: KywiDb, id: string, siteId?: string): P
|
|
|
22
46
|
id: string;
|
|
23
47
|
siteId: string;
|
|
24
48
|
updatedAt: Date;
|
|
25
|
-
caption: string | null;
|
|
26
49
|
width: number | null;
|
|
27
|
-
height: number | null;
|
|
28
|
-
tags: unknown;
|
|
29
50
|
createdAt: Date;
|
|
30
51
|
deletedAt: Date | null;
|
|
31
52
|
filename: string;
|
|
32
53
|
mimeType: string;
|
|
33
54
|
fileSize: number;
|
|
55
|
+
height: number | null;
|
|
34
56
|
duration: number | null;
|
|
35
57
|
originalFilename: string;
|
|
36
58
|
altText: string | null;
|
|
59
|
+
caption: string | null;
|
|
60
|
+
tags: unknown;
|
|
37
61
|
uploadedBy: string | null;
|
|
38
62
|
storageKey: string;
|
|
39
63
|
} | null>;
|
|
@@ -51,18 +75,18 @@ export declare function createMediaRecord(db: KywiDb, data: {
|
|
|
51
75
|
id: string;
|
|
52
76
|
siteId: string;
|
|
53
77
|
updatedAt: Date;
|
|
54
|
-
caption: string | null;
|
|
55
78
|
width: number | null;
|
|
56
|
-
height: number | null;
|
|
57
|
-
tags: unknown;
|
|
58
79
|
createdAt: Date;
|
|
59
80
|
deletedAt: Date | null;
|
|
60
81
|
filename: string;
|
|
61
82
|
mimeType: string;
|
|
62
83
|
fileSize: number;
|
|
84
|
+
height: number | null;
|
|
63
85
|
duration: number | null;
|
|
64
86
|
originalFilename: string;
|
|
65
87
|
altText: string | null;
|
|
88
|
+
caption: string | null;
|
|
89
|
+
tags: unknown;
|
|
66
90
|
uploadedBy: string | null;
|
|
67
91
|
storageKey: string;
|
|
68
92
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-queries.d.ts","sourceRoot":"","sources":["../../src/db/media-queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;KAEzD;AAOD,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;UAMzE;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IACxD,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAC7E,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChI;;;;;;;;;;;;;;;;;;GAGA;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM/F;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5F;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAC7D,MAAM,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;UAUhB;AAED,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAO1H"}
|
|
1
|
+
{"version":3,"file":"media-queries.d.ts","sourceRoot":"","sources":["../../src/db/media-queries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;KAEzD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;KAMhE;AAOD,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;UAMzE;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IACxD,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAC7E,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChI;;;;;;;;;;;;;;;;;;GAGA;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM/F;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO5F;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAC7D,MAAM,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;UAUhB;AAED,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAO1H"}
|
package/dist/db/media-queries.js
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
|
-
import { eq, and, sql } from 'drizzle-orm';
|
|
1
|
+
import { eq, and, sql, desc } from 'drizzle-orm';
|
|
2
2
|
import { kywiMedia } from '../schema/base.js';
|
|
3
3
|
export async function listMedia(db, siteId) {
|
|
4
4
|
return db.select().from(kywiMedia).where(and(eq(kywiMedia.siteId, siteId), sql `${kywiMedia.deletedAt} IS NULL`));
|
|
5
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* List soft-deleted media for a site, newest-deleted first (#23 — the Trash
|
|
8
|
+
* surface's media tab). Mirrors `listDeletedContent`'s shape/ordering
|
|
9
|
+
* (`db/content-restore.ts`) so the two trash sources merge predictably.
|
|
10
|
+
*/
|
|
11
|
+
export async function listDeletedMedia(db, siteId) {
|
|
12
|
+
return db
|
|
13
|
+
.select()
|
|
14
|
+
.from(kywiMedia)
|
|
15
|
+
.where(and(eq(kywiMedia.siteId, siteId), sql `${kywiMedia.deletedAt} IS NOT NULL`))
|
|
16
|
+
.orderBy(desc(kywiMedia.deletedAt));
|
|
17
|
+
}
|
|
6
18
|
// Item-level queries take an OPTIONAL siteId scope. Callers with a site context
|
|
7
19
|
// (every API route) MUST pass it: kywi_media rows are addressable by UUID, so a
|
|
8
20
|
// query with no siteId predicate lets an admin scoped to one site fetch/mutate
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media-queries.js","sourceRoot":"","sources":["../../src/db/media-queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"media-queries.js","sourceRoot":"","sources":["../../src/db/media-queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { KywiDb } from './client.js';
|
|
2
|
+
/**
|
|
3
|
+
* One-time cleanup for databases that predate the composite uniqueness
|
|
4
|
+
* constraints on `kywi_user_groups(user_id, group_id)` and
|
|
5
|
+
* `kywi_site_memberships(user_id, site_id)` (kywi-cms#40).
|
|
6
|
+
*
|
|
7
|
+
* Before those constraints existed, the New User flow could write the same
|
|
8
|
+
* membership twice (`onConflictDoNothing()` had no constraint to conflict
|
|
9
|
+
* against), fanning users out across every membership JOIN. Applying the new
|
|
10
|
+
* constraints via `kywi migrate` fails outright on a table that still holds
|
|
11
|
+
* duplicates — so `kywi migrate` runs this first.
|
|
12
|
+
*
|
|
13
|
+
* Keep-row policy per duplicate set:
|
|
14
|
+
* - `kywi_user_groups`: rows are identical; keep an arbitrary one.
|
|
15
|
+
* - `kywi_site_memberships`: keep the row carrying the most `groups` data,
|
|
16
|
+
* then the newest `created_at` (the duplicate written by the implicit
|
|
17
|
+
* default-site grant is typically the empty/older one).
|
|
18
|
+
*
|
|
19
|
+
* Postgres-only (uses ctid + jsonb): callers should skip for other providers.
|
|
20
|
+
* Missing tables (fresh database) are treated as zero duplicates.
|
|
21
|
+
*/
|
|
22
|
+
export declare function dedupeMembershipRows(db: KywiDb): Promise<{
|
|
23
|
+
userGroups: number;
|
|
24
|
+
siteMemberships: number;
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=membership-dedupe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership-dedupe.d.ts","sourceRoot":"","sources":["../../src/db/membership-dedupe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC,CA+C1D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm';
|
|
2
|
+
/**
|
|
3
|
+
* One-time cleanup for databases that predate the composite uniqueness
|
|
4
|
+
* constraints on `kywi_user_groups(user_id, group_id)` and
|
|
5
|
+
* `kywi_site_memberships(user_id, site_id)` (kywi-cms#40).
|
|
6
|
+
*
|
|
7
|
+
* Before those constraints existed, the New User flow could write the same
|
|
8
|
+
* membership twice (`onConflictDoNothing()` had no constraint to conflict
|
|
9
|
+
* against), fanning users out across every membership JOIN. Applying the new
|
|
10
|
+
* constraints via `kywi migrate` fails outright on a table that still holds
|
|
11
|
+
* duplicates — so `kywi migrate` runs this first.
|
|
12
|
+
*
|
|
13
|
+
* Keep-row policy per duplicate set:
|
|
14
|
+
* - `kywi_user_groups`: rows are identical; keep an arbitrary one.
|
|
15
|
+
* - `kywi_site_memberships`: keep the row carrying the most `groups` data,
|
|
16
|
+
* then the newest `created_at` (the duplicate written by the implicit
|
|
17
|
+
* default-site grant is typically the empty/older one).
|
|
18
|
+
*
|
|
19
|
+
* Postgres-only (uses ctid + jsonb): callers should skip for other providers.
|
|
20
|
+
* Missing tables (fresh database) are treated as zero duplicates.
|
|
21
|
+
*/
|
|
22
|
+
export async function dedupeMembershipRows(db) {
|
|
23
|
+
const counts = { userGroups: 0, siteMemberships: 0 };
|
|
24
|
+
const runCount = async (query) => {
|
|
25
|
+
try {
|
|
26
|
+
const result = (await db.execute(query));
|
|
27
|
+
const row = Array.isArray(result) ? result[0] : result.rows?.[0];
|
|
28
|
+
return Number(row?.deleted ?? 0);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
// 42P01 undefined_table: fresh DB, nothing to dedupe.
|
|
32
|
+
if (err?.code === '42P01')
|
|
33
|
+
return 0;
|
|
34
|
+
throw err;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
counts.userGroups = await runCount(sql `
|
|
38
|
+
WITH deleted AS (
|
|
39
|
+
DELETE FROM kywi_user_groups a
|
|
40
|
+
USING kywi_user_groups b
|
|
41
|
+
WHERE a.user_id = b.user_id
|
|
42
|
+
AND a.group_id = b.group_id
|
|
43
|
+
AND a.ctid < b.ctid
|
|
44
|
+
RETURNING 1
|
|
45
|
+
)
|
|
46
|
+
SELECT count(*)::int AS deleted FROM deleted
|
|
47
|
+
`);
|
|
48
|
+
counts.siteMemberships = await runCount(sql `
|
|
49
|
+
WITH deleted AS (
|
|
50
|
+
DELETE FROM kywi_site_memberships a
|
|
51
|
+
USING kywi_site_memberships b
|
|
52
|
+
WHERE a.user_id = b.user_id
|
|
53
|
+
AND a.site_id = b.site_id
|
|
54
|
+
AND (
|
|
55
|
+
jsonb_array_length(a.groups) < jsonb_array_length(b.groups)
|
|
56
|
+
OR (jsonb_array_length(a.groups) = jsonb_array_length(b.groups)
|
|
57
|
+
AND a.created_at < b.created_at)
|
|
58
|
+
OR (jsonb_array_length(a.groups) = jsonb_array_length(b.groups)
|
|
59
|
+
AND a.created_at = b.created_at
|
|
60
|
+
AND a.ctid < b.ctid)
|
|
61
|
+
)
|
|
62
|
+
RETURNING 1
|
|
63
|
+
)
|
|
64
|
+
SELECT count(*)::int AS deleted FROM deleted
|
|
65
|
+
`);
|
|
66
|
+
return counts;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=membership-dedupe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"membership-dedupe.js","sourceRoot":"","sources":["../../src/db/membership-dedupe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAGjC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,EAAU;IAEV,MAAM,MAAM,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAAA;IAEpD,MAAM,QAAQ,GAAG,KAAK,EAAE,KAA6B,EAAmB,EAAE;QACxE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAA2C,CAAA;YAClF,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,MAAiD,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC5G,OAAO,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC,CAAA;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,sDAAsD;YACtD,IAAK,GAAyB,EAAE,IAAI,KAAK,OAAO;gBAAE,OAAO,CAAC,CAAA;YAC1D,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC,CAAA;IAED,MAAM,CAAC,UAAU,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAA;;;;;;;;;;GAUrC,CAAC,CAAA;IAEF,MAAM,CAAC,eAAe,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;GAiB1C,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC"}
|