@htmless/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/content-operations.d.ts +26 -0
- package/dist/ai/content-operations.d.ts.map +1 -0
- package/dist/ai/content-operations.js +75 -0
- package/dist/ai/content-operations.js.map +1 -0
- package/dist/ai/image-analyzer.d.ts +18 -0
- package/dist/ai/image-analyzer.d.ts.map +1 -0
- package/dist/ai/image-analyzer.js +457 -0
- package/dist/ai/image-analyzer.js.map +1 -0
- package/dist/ai/json-to-schema.d.ts +6 -0
- package/dist/ai/json-to-schema.d.ts.map +1 -0
- package/dist/ai/json-to-schema.js +155 -0
- package/dist/ai/json-to-schema.js.map +1 -0
- package/dist/ai/schema-generator.d.ts +34 -0
- package/dist/ai/schema-generator.d.ts.map +1 -0
- package/dist/ai/schema-generator.js +307 -0
- package/dist/ai/schema-generator.js.map +1 -0
- package/dist/api/cda/assets.d.ts +4 -0
- package/dist/api/cda/assets.d.ts.map +1 -0
- package/dist/api/cda/assets.js +82 -0
- package/dist/api/cda/assets.js.map +1 -0
- package/dist/api/cda/blocks.d.ts +4 -0
- package/dist/api/cda/blocks.d.ts.map +1 -0
- package/dist/api/cda/blocks.js +92 -0
- package/dist/api/cda/blocks.js.map +1 -0
- package/dist/api/cda/content.d.ts +4 -0
- package/dist/api/cda/content.d.ts.map +1 -0
- package/dist/api/cda/content.js +192 -0
- package/dist/api/cda/content.js.map +1 -0
- package/dist/api/cda/index.d.ts +4 -0
- package/dist/api/cda/index.d.ts.map +1 -0
- package/dist/api/cda/index.js +21 -0
- package/dist/api/cda/index.js.map +1 -0
- package/dist/api/cda/media.d.ts +4 -0
- package/dist/api/cda/media.d.ts.map +1 -0
- package/dist/api/cda/media.js +114 -0
- package/dist/api/cda/media.js.map +1 -0
- package/dist/api/cda/redirects.d.ts +4 -0
- package/dist/api/cda/redirects.d.ts.map +1 -0
- package/dist/api/cda/redirects.js +69 -0
- package/dist/api/cda/redirects.js.map +1 -0
- package/dist/api/cda/schemas.d.ts +4 -0
- package/dist/api/cda/schemas.d.ts.map +1 -0
- package/dist/api/cda/schemas.js +113 -0
- package/dist/api/cda/schemas.js.map +1 -0
- package/dist/api/cda/taxonomies.d.ts +4 -0
- package/dist/api/cda/taxonomies.d.ts.map +1 -0
- package/dist/api/cda/taxonomies.js +79 -0
- package/dist/api/cda/taxonomies.js.map +1 -0
- package/dist/api/cma/ai.d.ts +4 -0
- package/dist/api/cma/ai.d.ts.map +1 -0
- package/dist/api/cma/ai.js +458 -0
- package/dist/api/cma/ai.js.map +1 -0
- package/dist/api/cma/assets.d.ts +4 -0
- package/dist/api/cma/assets.d.ts.map +1 -0
- package/dist/api/cma/assets.js +166 -0
- package/dist/api/cma/assets.js.map +1 -0
- package/dist/api/cma/audit.d.ts +4 -0
- package/dist/api/cma/audit.d.ts.map +1 -0
- package/dist/api/cma/audit.js +74 -0
- package/dist/api/cma/audit.js.map +1 -0
- package/dist/api/cma/auth.d.ts +4 -0
- package/dist/api/cma/auth.d.ts.map +1 -0
- package/dist/api/cma/auth.js +123 -0
- package/dist/api/cma/auth.js.map +1 -0
- package/dist/api/cma/blocks.d.ts +4 -0
- package/dist/api/cma/blocks.d.ts.map +1 -0
- package/dist/api/cma/blocks.js +249 -0
- package/dist/api/cma/blocks.js.map +1 -0
- package/dist/api/cma/bulk.d.ts +4 -0
- package/dist/api/cma/bulk.d.ts.map +1 -0
- package/dist/api/cma/bulk.js +258 -0
- package/dist/api/cma/bulk.js.map +1 -0
- package/dist/api/cma/cache.d.ts +4 -0
- package/dist/api/cma/cache.d.ts.map +1 -0
- package/dist/api/cma/cache.js +99 -0
- package/dist/api/cma/cache.js.map +1 -0
- package/dist/api/cma/codegen.d.ts +4 -0
- package/dist/api/cma/codegen.d.ts.map +1 -0
- package/dist/api/cma/codegen.js +22 -0
- package/dist/api/cma/codegen.js.map +1 -0
- package/dist/api/cma/comments.d.ts +4 -0
- package/dist/api/cma/comments.d.ts.map +1 -0
- package/dist/api/cma/comments.js +164 -0
- package/dist/api/cma/comments.js.map +1 -0
- package/dist/api/cma/diff.d.ts +4 -0
- package/dist/api/cma/diff.d.ts.map +1 -0
- package/dist/api/cma/diff.js +88 -0
- package/dist/api/cma/diff.js.map +1 -0
- package/dist/api/cma/entries.d.ts +4 -0
- package/dist/api/cma/entries.d.ts.map +1 -0
- package/dist/api/cma/entries.js +736 -0
- package/dist/api/cma/entries.js.map +1 -0
- package/dist/api/cma/environments.d.ts +4 -0
- package/dist/api/cma/environments.d.ts.map +1 -0
- package/dist/api/cma/environments.js +160 -0
- package/dist/api/cma/environments.js.map +1 -0
- package/dist/api/cma/extensions.d.ts +4 -0
- package/dist/api/cma/extensions.d.ts.map +1 -0
- package/dist/api/cma/extensions.js +82 -0
- package/dist/api/cma/extensions.js.map +1 -0
- package/dist/api/cma/importexport.d.ts +4 -0
- package/dist/api/cma/importexport.d.ts.map +1 -0
- package/dist/api/cma/importexport.js +496 -0
- package/dist/api/cma/importexport.js.map +1 -0
- package/dist/api/cma/index.d.ts +4 -0
- package/dist/api/cma/index.d.ts.map +1 -0
- package/dist/api/cma/index.js +69 -0
- package/dist/api/cma/index.js.map +1 -0
- package/dist/api/cma/live.d.ts +4 -0
- package/dist/api/cma/live.d.ts.map +1 -0
- package/dist/api/cma/live.js +64 -0
- package/dist/api/cma/live.js.map +1 -0
- package/dist/api/cma/locales.d.ts +4 -0
- package/dist/api/cma/locales.d.ts.map +1 -0
- package/dist/api/cma/locales.js +117 -0
- package/dist/api/cma/locales.js.map +1 -0
- package/dist/api/cma/marketplace.d.ts +4 -0
- package/dist/api/cma/marketplace.d.ts.map +1 -0
- package/dist/api/cma/marketplace.js +550 -0
- package/dist/api/cma/marketplace.js.map +1 -0
- package/dist/api/cma/redirects.d.ts +4 -0
- package/dist/api/cma/redirects.d.ts.map +1 -0
- package/dist/api/cma/redirects.js +120 -0
- package/dist/api/cma/redirects.js.map +1 -0
- package/dist/api/cma/relationships.d.ts +4 -0
- package/dist/api/cma/relationships.d.ts.map +1 -0
- package/dist/api/cma/relationships.js +47 -0
- package/dist/api/cma/relationships.js.map +1 -0
- package/dist/api/cma/schemas.d.ts +4 -0
- package/dist/api/cma/schemas.d.ts.map +1 -0
- package/dist/api/cma/schemas.js +248 -0
- package/dist/api/cma/schemas.js.map +1 -0
- package/dist/api/cma/search.d.ts +4 -0
- package/dist/api/cma/search.d.ts.map +1 -0
- package/dist/api/cma/search.js +149 -0
- package/dist/api/cma/search.js.map +1 -0
- package/dist/api/cma/spaces.d.ts +4 -0
- package/dist/api/cma/spaces.d.ts.map +1 -0
- package/dist/api/cma/spaces.js +119 -0
- package/dist/api/cma/spaces.js.map +1 -0
- package/dist/api/cma/taxonomies.d.ts +4 -0
- package/dist/api/cma/taxonomies.d.ts.map +1 -0
- package/dist/api/cma/taxonomies.js +296 -0
- package/dist/api/cma/taxonomies.js.map +1 -0
- package/dist/api/cma/templates.d.ts +13 -0
- package/dist/api/cma/templates.d.ts.map +1 -0
- package/dist/api/cma/templates.js +312 -0
- package/dist/api/cma/templates.js.map +1 -0
- package/dist/api/cma/uploads.d.ts +4 -0
- package/dist/api/cma/uploads.d.ts.map +1 -0
- package/dist/api/cma/uploads.js +148 -0
- package/dist/api/cma/uploads.js.map +1 -0
- package/dist/api/cma/webhooks.d.ts +4 -0
- package/dist/api/cma/webhooks.d.ts.map +1 -0
- package/dist/api/cma/webhooks.js +175 -0
- package/dist/api/cma/webhooks.js.map +1 -0
- package/dist/api/cma/white-label.d.ts +4 -0
- package/dist/api/cma/white-label.d.ts.map +1 -0
- package/dist/api/cma/white-label.js +47 -0
- package/dist/api/cma/white-label.js.map +1 -0
- package/dist/api/graphql/index.d.ts +4 -0
- package/dist/api/graphql/index.d.ts.map +1 -0
- package/dist/api/graphql/index.js +57 -0
- package/dist/api/graphql/index.js.map +1 -0
- package/dist/api/graphql/introspection.d.ts +31 -0
- package/dist/api/graphql/introspection.d.ts.map +1 -0
- package/dist/api/graphql/introspection.js +90 -0
- package/dist/api/graphql/introspection.js.map +1 -0
- package/dist/api/graphql/parser.d.ts +14 -0
- package/dist/api/graphql/parser.d.ts.map +1 -0
- package/dist/api/graphql/parser.js +140 -0
- package/dist/api/graphql/parser.js.map +1 -0
- package/dist/api/graphql/resolver.d.ts +3 -0
- package/dist/api/graphql/resolver.d.ts.map +1 -0
- package/dist/api/graphql/resolver.js +138 -0
- package/dist/api/graphql/resolver.js.map +1 -0
- package/dist/api/preview/content.d.ts +4 -0
- package/dist/api/preview/content.d.ts.map +1 -0
- package/dist/api/preview/content.js +207 -0
- package/dist/api/preview/content.js.map +1 -0
- package/dist/api/preview/index.d.ts +4 -0
- package/dist/api/preview/index.d.ts.map +1 -0
- package/dist/api/preview/index.js +11 -0
- package/dist/api/preview/index.js.map +1 -0
- package/dist/api/preview/live.d.ts +4 -0
- package/dist/api/preview/live.d.ts.map +1 -0
- package/dist/api/preview/live.js +41 -0
- package/dist/api/preview/live.js.map +1 -0
- package/dist/audit/logger.d.ts +13 -0
- package/dist/audit/logger.d.ts.map +1 -0
- package/dist/audit/logger.js +21 -0
- package/dist/audit/logger.js.map +1 -0
- package/dist/audit/middleware.d.ts +7 -0
- package/dist/audit/middleware.d.ts.map +1 -0
- package/dist/audit/middleware.js +39 -0
- package/dist/audit/middleware.js.map +1 -0
- package/dist/auth/jwt.d.ts +9 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +15 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/middleware.d.ts +24 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +99 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/password.d.ts +3 -0
- package/dist/auth/password.d.ts.map +1 -0
- package/dist/auth/password.js +9 -0
- package/dist/auth/password.js.map +1 -0
- package/dist/auth/rate-limit.d.ts +19 -0
- package/dist/auth/rate-limit.d.ts.map +1 -0
- package/dist/auth/rate-limit.js +77 -0
- package/dist/auth/rate-limit.js.map +1 -0
- package/dist/auth/rbac.d.ts +10 -0
- package/dist/auth/rbac.d.ts.map +1 -0
- package/dist/auth/rbac.js +61 -0
- package/dist/auth/rbac.js.map +1 -0
- package/dist/blocks/core-blocks.d.ts +13 -0
- package/dist/blocks/core-blocks.d.ts.map +1 -0
- package/dist/blocks/core-blocks.js +113 -0
- package/dist/blocks/core-blocks.js.map +1 -0
- package/dist/blocks/renderer-sdk.d.ts +75 -0
- package/dist/blocks/renderer-sdk.d.ts.map +1 -0
- package/dist/blocks/renderer-sdk.js +112 -0
- package/dist/blocks/renderer-sdk.js.map +1 -0
- package/dist/blocks/seed-core-blocks.d.ts +6 -0
- package/dist/blocks/seed-core-blocks.d.ts.map +1 -0
- package/dist/blocks/seed-core-blocks.js +37 -0
- package/dist/blocks/seed-core-blocks.js.map +1 -0
- package/dist/blocks/validator.d.ts +10 -0
- package/dist/blocks/validator.d.ts.map +1 -0
- package/dist/blocks/validator.js +111 -0
- package/dist/blocks/validator.js.map +1 -0
- package/dist/cache/cdn-purge.d.ts +41 -0
- package/dist/cache/cdn-purge.d.ts.map +1 -0
- package/dist/cache/cdn-purge.js +180 -0
- package/dist/cache/cdn-purge.js.map +1 -0
- package/dist/cache/observability.d.ts +36 -0
- package/dist/cache/observability.d.ts.map +1 -0
- package/dist/cache/observability.js +110 -0
- package/dist/cache/observability.js.map +1 -0
- package/dist/cache/tags.d.ts +28 -0
- package/dist/cache/tags.d.ts.map +1 -0
- package/dist/cache/tags.js +94 -0
- package/dist/cache/tags.js.map +1 -0
- package/dist/cli/commands/codegen.d.ts +2 -0
- package/dist/cli/commands/codegen.d.ts.map +1 -0
- package/dist/cli/commands/codegen.js +73 -0
- package/dist/cli/commands/codegen.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +2 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +60 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/help.d.ts +2 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +32 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +90 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +2 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +27 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/seed.d.ts +2 -0
- package/dist/cli/commands/seed.d.ts.map +1 -0
- package/dist/cli/commands/seed.js +28 -0
- package/dist/cli/commands/seed.js.map +1 -0
- package/dist/cli/index.d.ts +16 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +120 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -0
- package/dist/content/advanced-query.d.ts +37 -0
- package/dist/content/advanced-query.d.ts.map +1 -0
- package/dist/content/advanced-query.js +162 -0
- package/dist/content/advanced-query.js.map +1 -0
- package/dist/content/cache.d.ts +27 -0
- package/dist/content/cache.d.ts.map +1 -0
- package/dist/content/cache.js +100 -0
- package/dist/content/cache.js.map +1 -0
- package/dist/content/diff.d.ts +13 -0
- package/dist/content/diff.d.ts.map +1 -0
- package/dist/content/diff.js +80 -0
- package/dist/content/diff.js.map +1 -0
- package/dist/content/localization.d.ts +13 -0
- package/dist/content/localization.d.ts.map +1 -0
- package/dist/content/localization.js +42 -0
- package/dist/content/localization.js.map +1 -0
- package/dist/content/materializer.d.ts +26 -0
- package/dist/content/materializer.d.ts.map +1 -0
- package/dist/content/materializer.js +175 -0
- package/dist/content/materializer.js.map +1 -0
- package/dist/content/relationships.d.ts +30 -0
- package/dist/content/relationships.d.ts.map +1 -0
- package/dist/content/relationships.js +123 -0
- package/dist/content/relationships.js.map +1 -0
- package/dist/db.d.ts +5 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +5 -0
- package/dist/db.js.map +1 -0
- package/dist/events/emitter.d.ts +16 -0
- package/dist/events/emitter.d.ts.map +1 -0
- package/dist/events/emitter.js +15 -0
- package/dist/events/emitter.js.map +1 -0
- package/dist/events/sse.d.ts +16 -0
- package/dist/events/sse.d.ts.map +1 -0
- package/dist/events/sse.js +37 -0
- package/dist/events/sse.js.map +1 -0
- package/dist/events/wire.d.ts +2 -0
- package/dist/events/wire.d.ts.map +1 -0
- package/dist/events/wire.js +27 -0
- package/dist/events/wire.js.map +1 -0
- package/dist/extensions/billing.d.ts +60 -0
- package/dist/extensions/billing.d.ts.map +1 -0
- package/dist/extensions/billing.js +98 -0
- package/dist/extensions/billing.js.map +1 -0
- package/dist/extensions/manifest.d.ts +43 -0
- package/dist/extensions/manifest.d.ts.map +1 -0
- package/dist/extensions/manifest.js +66 -0
- package/dist/extensions/manifest.js.map +1 -0
- package/dist/extensions/marketplace.d.ts +50 -0
- package/dist/extensions/marketplace.d.ts.map +1 -0
- package/dist/extensions/marketplace.js +676 -0
- package/dist/extensions/marketplace.js.map +1 -0
- package/dist/extensions/router.d.ts +4 -0
- package/dist/extensions/router.d.ts.map +1 -0
- package/dist/extensions/router.js +50 -0
- package/dist/extensions/router.js.map +1 -0
- package/dist/extensions/runtime.d.ts +29 -0
- package/dist/extensions/runtime.d.ts.map +1 -0
- package/dist/extensions/runtime.js +201 -0
- package/dist/extensions/runtime.js.map +1 -0
- package/dist/extensions/sdk.d.ts +146 -0
- package/dist/extensions/sdk.d.ts.map +1 -0
- package/dist/extensions/sdk.js +114 -0
- package/dist/extensions/sdk.js.map +1 -0
- package/dist/integrations/sheets.d.ts +41 -0
- package/dist/integrations/sheets.d.ts.map +1 -0
- package/dist/integrations/sheets.js +230 -0
- package/dist/integrations/sheets.js.map +1 -0
- package/dist/media/metadata.d.ts +9 -0
- package/dist/media/metadata.d.ts.map +1 -0
- package/dist/media/metadata.js +84 -0
- package/dist/media/metadata.js.map +1 -0
- package/dist/media/presets.d.ts +17 -0
- package/dist/media/presets.d.ts.map +1 -0
- package/dist/media/presets.js +21 -0
- package/dist/media/presets.js.map +1 -0
- package/dist/media/storage.d.ts +16 -0
- package/dist/media/storage.d.ts.map +1 -0
- package/dist/media/storage.js +39 -0
- package/dist/media/storage.js.map +1 -0
- package/dist/media/transforms-engine.d.ts +46 -0
- package/dist/media/transforms-engine.d.ts.map +1 -0
- package/dist/media/transforms-engine.js +91 -0
- package/dist/media/transforms-engine.js.map +1 -0
- package/dist/media/transforms.d.ts +15 -0
- package/dist/media/transforms.d.ts.map +1 -0
- package/dist/media/transforms.js +22 -0
- package/dist/media/transforms.js.map +1 -0
- package/dist/media/usage.d.ts +21 -0
- package/dist/media/usage.d.ts.map +1 -0
- package/dist/media/usage.js +105 -0
- package/dist/media/usage.js.map +1 -0
- package/dist/redis.d.ts +2 -0
- package/dist/redis.d.ts.map +1 -0
- package/dist/redis.js +9 -0
- package/dist/redis.js.map +1 -0
- package/dist/schema/codegen.d.ts +6 -0
- package/dist/schema/codegen.d.ts.map +1 -0
- package/dist/schema/codegen.js +95 -0
- package/dist/schema/codegen.js.map +1 -0
- package/dist/schema/json-schema.d.ts +42 -0
- package/dist/schema/json-schema.d.ts.map +1 -0
- package/dist/schema/json-schema.js +68 -0
- package/dist/schema/json-schema.js.map +1 -0
- package/dist/schema/validator.d.ts +14 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +103 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/sdk/client.d.ts +86 -0
- package/dist/sdk/client.d.ts.map +1 -0
- package/dist/sdk/client.js +117 -0
- package/dist/sdk/client.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +59 -0
- package/dist/server.js.map +1 -0
- package/dist/spaces/premium-templates.d.ts +37 -0
- package/dist/spaces/premium-templates.d.ts.map +1 -0
- package/dist/spaces/premium-templates.js +1603 -0
- package/dist/spaces/premium-templates.js.map +1 -0
- package/dist/spaces/provisioner.d.ts +16 -0
- package/dist/spaces/provisioner.d.ts.map +1 -0
- package/dist/spaces/provisioner.js +143 -0
- package/dist/spaces/provisioner.js.map +1 -0
- package/dist/spaces/template-registry.d.ts +34 -0
- package/dist/spaces/template-registry.d.ts.map +1 -0
- package/dist/spaces/template-registry.js +55 -0
- package/dist/spaces/template-registry.js.map +1 -0
- package/dist/spaces/templates.d.ts +44 -0
- package/dist/spaces/templates.d.ts.map +1 -0
- package/dist/spaces/templates.js +201 -0
- package/dist/spaces/templates.js.map +1 -0
- package/dist/spaces/white-label.d.ts +20 -0
- package/dist/spaces/white-label.d.ts.map +1 -0
- package/dist/spaces/white-label.js +32 -0
- package/dist/spaces/white-label.js.map +1 -0
- package/dist/utils/query-shaping.d.ts +27 -0
- package/dist/utils/query-shaping.d.ts.map +1 -0
- package/dist/utils/query-shaping.js +69 -0
- package/dist/utils/query-shaping.js.map +1 -0
- package/dist/utils/space.d.ts +4 -0
- package/dist/utils/space.d.ts.map +1 -0
- package/dist/utils/space.js +17 -0
- package/dist/utils/space.js.map +1 -0
- package/dist/webhooks/dispatcher.d.ts +9 -0
- package/dist/webhooks/dispatcher.d.ts.map +1 -0
- package/dist/webhooks/dispatcher.js +102 -0
- package/dist/webhooks/dispatcher.js.map +1 -0
- package/package.json +84 -0
- package/prisma/migrations/20260403025542_init/migration.sql +315 -0
- package/prisma/migrations/20260403034855_add_blocks_and_patterns/migration.sql +40 -0
- package/prisma/migrations/20260403041936_add_published_documents/migration.sql +30 -0
- package/prisma/migrations/20260403042809_add_locales_and_taxonomies/migration.sql +58 -0
- package/prisma/migrations/20260403043033_add_scheduled_unpublish_at/migration.sql +2 -0
- package/prisma/migrations/20260403052801_add_environments_and_whitelabel/migration.sql +65 -0
- package/prisma/migrations/20260403055920_add_marketplace_and_extension_config/migration.sql +73 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +530 -0
- package/prisma/seed.ts +154 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// ─── Publish-Time Document Materializer ─────────────────────────────
|
|
2
|
+
import { createHash } from 'crypto';
|
|
3
|
+
import { prisma } from '../db.js';
|
|
4
|
+
/**
|
|
5
|
+
* Materialize an entry into the `published_documents` read-model table.
|
|
6
|
+
* Called immediately after a successful publish transaction.
|
|
7
|
+
*
|
|
8
|
+
* Loads the entry with its published version and content type, resolves
|
|
9
|
+
* all reference/media fields by batch-loading referenced entries, then
|
|
10
|
+
* upserts into `published_documents` with the fully resolved JSON.
|
|
11
|
+
*/
|
|
12
|
+
export async function materializeEntry(entryId) {
|
|
13
|
+
const entry = await prisma.entry.findUnique({
|
|
14
|
+
where: { id: entryId },
|
|
15
|
+
include: {
|
|
16
|
+
contentType: {
|
|
17
|
+
include: { fields: true },
|
|
18
|
+
},
|
|
19
|
+
state: {
|
|
20
|
+
include: { publishedVersion: true },
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
if (!entry)
|
|
25
|
+
return;
|
|
26
|
+
if (!entry.state?.publishedVersion)
|
|
27
|
+
return;
|
|
28
|
+
const rawData = (entry.state.publishedVersion.data ?? {});
|
|
29
|
+
const fields = entry.contentType.fields;
|
|
30
|
+
// Resolve all reference and media fields
|
|
31
|
+
const resolvedData = await batchResolveReferences(rawData, fields, entry.spaceId);
|
|
32
|
+
// Generate etag from the resolved data
|
|
33
|
+
const etag = createHash('md5').update(JSON.stringify(resolvedData)).digest('hex');
|
|
34
|
+
await prisma.publishedDocument.upsert({
|
|
35
|
+
where: { entryId },
|
|
36
|
+
create: {
|
|
37
|
+
spaceId: entry.spaceId,
|
|
38
|
+
entryId,
|
|
39
|
+
contentTypeKey: entry.contentType.key,
|
|
40
|
+
slug: entry.slug,
|
|
41
|
+
data: JSON.parse(JSON.stringify(resolvedData)),
|
|
42
|
+
publishedAt: new Date(),
|
|
43
|
+
etag,
|
|
44
|
+
},
|
|
45
|
+
update: {
|
|
46
|
+
contentTypeKey: entry.contentType.key,
|
|
47
|
+
slug: entry.slug,
|
|
48
|
+
data: JSON.parse(JSON.stringify(resolvedData)),
|
|
49
|
+
publishedAt: new Date(),
|
|
50
|
+
etag,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Remove an entry from the published_documents table.
|
|
56
|
+
* Called after unpublishing an entry.
|
|
57
|
+
*/
|
|
58
|
+
export async function dematerializeEntry(entryId) {
|
|
59
|
+
await prisma.publishedDocument.deleteMany({
|
|
60
|
+
where: { entryId },
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Batch-resolve reference and media fields in the data object.
|
|
65
|
+
*
|
|
66
|
+
* 1. Scans the field definitions for reference/media types
|
|
67
|
+
* 2. Collects all referenced entry IDs and asset IDs from the data
|
|
68
|
+
* 3. Batch loads referenced entries (from published_documents) in ONE query
|
|
69
|
+
* 4. Batch loads referenced assets in ONE query
|
|
70
|
+
* 5. Replaces IDs with resolved objects and returns the enriched data
|
|
71
|
+
*/
|
|
72
|
+
export async function batchResolveReferences(data, fields, spaceId) {
|
|
73
|
+
const resolved = { ...data };
|
|
74
|
+
// Collect IDs by type
|
|
75
|
+
const referenceIds = [];
|
|
76
|
+
const assetIds = [];
|
|
77
|
+
const referenceFieldKeys = [];
|
|
78
|
+
const mediaFieldKeys = [];
|
|
79
|
+
for (const field of fields) {
|
|
80
|
+
const value = data[field.key];
|
|
81
|
+
if (value == null)
|
|
82
|
+
continue;
|
|
83
|
+
if (field.type === 'reference') {
|
|
84
|
+
referenceFieldKeys.push(field.key);
|
|
85
|
+
if (Array.isArray(value)) {
|
|
86
|
+
referenceIds.push(...value);
|
|
87
|
+
}
|
|
88
|
+
else if (typeof value === 'string') {
|
|
89
|
+
referenceIds.push(value);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else if (field.type === 'media') {
|
|
93
|
+
mediaFieldKeys.push(field.key);
|
|
94
|
+
if (Array.isArray(value)) {
|
|
95
|
+
assetIds.push(...value);
|
|
96
|
+
}
|
|
97
|
+
else if (typeof value === 'string') {
|
|
98
|
+
assetIds.push(value);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Nothing to resolve
|
|
103
|
+
if (referenceIds.length === 0 && assetIds.length === 0) {
|
|
104
|
+
return resolved;
|
|
105
|
+
}
|
|
106
|
+
// Batch load referenced entries from published_documents
|
|
107
|
+
const refMap = new Map();
|
|
108
|
+
if (referenceIds.length > 0) {
|
|
109
|
+
const uniqueRefIds = [...new Set(referenceIds)];
|
|
110
|
+
const refDocs = await prisma.publishedDocument.findMany({
|
|
111
|
+
where: {
|
|
112
|
+
spaceId,
|
|
113
|
+
entryId: { in: uniqueRefIds },
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
for (const doc of refDocs) {
|
|
117
|
+
refMap.set(doc.entryId, {
|
|
118
|
+
id: doc.entryId,
|
|
119
|
+
type: doc.contentTypeKey,
|
|
120
|
+
slug: doc.slug,
|
|
121
|
+
data: doc.data,
|
|
122
|
+
publishedAt: doc.publishedAt.toISOString(),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Batch load referenced assets
|
|
127
|
+
const assetMap = new Map();
|
|
128
|
+
if (assetIds.length > 0) {
|
|
129
|
+
const uniqueAssetIds = [...new Set(assetIds)];
|
|
130
|
+
const assets = await prisma.asset.findMany({
|
|
131
|
+
where: {
|
|
132
|
+
spaceId,
|
|
133
|
+
id: { in: uniqueAssetIds },
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
for (const asset of assets) {
|
|
137
|
+
assetMap.set(asset.id, {
|
|
138
|
+
id: asset.id,
|
|
139
|
+
filename: asset.filename,
|
|
140
|
+
mimeType: asset.mimeType,
|
|
141
|
+
bytes: asset.bytes,
|
|
142
|
+
width: asset.width,
|
|
143
|
+
height: asset.height,
|
|
144
|
+
alt: asset.alt,
|
|
145
|
+
caption: asset.caption,
|
|
146
|
+
storageKey: asset.storageKey,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Replace IDs with resolved objects in data
|
|
151
|
+
for (const key of referenceFieldKeys) {
|
|
152
|
+
const value = data[key];
|
|
153
|
+
if (value == null)
|
|
154
|
+
continue;
|
|
155
|
+
if (Array.isArray(value)) {
|
|
156
|
+
resolved[key] = value.map((id) => refMap.get(id) ?? { id, _missing: true });
|
|
157
|
+
}
|
|
158
|
+
else if (typeof value === 'string') {
|
|
159
|
+
resolved[key] = refMap.get(value) ?? { id: value, _missing: true };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
for (const key of mediaFieldKeys) {
|
|
163
|
+
const value = data[key];
|
|
164
|
+
if (value == null)
|
|
165
|
+
continue;
|
|
166
|
+
if (Array.isArray(value)) {
|
|
167
|
+
resolved[key] = value.map((id) => assetMap.get(id) ?? { id, _missing: true });
|
|
168
|
+
}
|
|
169
|
+
else if (typeof value === 'string') {
|
|
170
|
+
resolved[key] = assetMap.get(value) ?? { id: value, _missing: true };
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return resolved;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=materializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materializer.js","sourceRoot":"","sources":["../../src/content/materializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface OutboundReference {
|
|
2
|
+
fieldKey: string;
|
|
3
|
+
targetEntryId: string;
|
|
4
|
+
targetType: string;
|
|
5
|
+
}
|
|
6
|
+
export interface InboundReference {
|
|
7
|
+
sourceEntryId: string;
|
|
8
|
+
sourceType: string;
|
|
9
|
+
fieldKey: string;
|
|
10
|
+
}
|
|
11
|
+
export interface IntegrityCheckResult {
|
|
12
|
+
referencedBy: number;
|
|
13
|
+
safe: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Scans an entry's published data for reference fields and returns all
|
|
17
|
+
* outbound references (i.e. entries this entry points to).
|
|
18
|
+
*/
|
|
19
|
+
export declare function getReferencesFrom(entryId: string, spaceId: string): Promise<OutboundReference[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Finds all entries that reference the given entry (reverse lookup).
|
|
22
|
+
* Scans published_documents JSON data for the entry ID.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getReferencesTo(entryId: string, spaceId: string): Promise<InboundReference[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Checks if any entries reference this one before delete.
|
|
27
|
+
* Returns the count and whether it's safe to delete.
|
|
28
|
+
*/
|
|
29
|
+
export declare function checkReferentialIntegrity(entryId: string, spaceId: string): Promise<IntegrityCheckResult>;
|
|
30
|
+
//# sourceMappingURL=relationships.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../../src/content/relationships.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAwC9B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA8E7B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,CAAC,CAM/B"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// ─── Content Relationship Utilities ──────────────────────────────────
|
|
2
|
+
import { prisma } from '../db.js';
|
|
3
|
+
/**
|
|
4
|
+
* Scans an entry's published data for reference fields and returns all
|
|
5
|
+
* outbound references (i.e. entries this entry points to).
|
|
6
|
+
*/
|
|
7
|
+
export async function getReferencesFrom(entryId, spaceId) {
|
|
8
|
+
const entry = await prisma.entry.findFirst({
|
|
9
|
+
where: { id: entryId, spaceId },
|
|
10
|
+
include: {
|
|
11
|
+
contentType: { include: { fields: true } },
|
|
12
|
+
state: { include: { publishedVersion: true } },
|
|
13
|
+
versions: { orderBy: { createdAt: 'desc' }, take: 1 },
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
if (!entry)
|
|
17
|
+
return [];
|
|
18
|
+
// Prefer published data, fall back to latest draft
|
|
19
|
+
const data = (entry.state?.publishedVersion?.data ??
|
|
20
|
+
entry.versions[0]?.data ??
|
|
21
|
+
{});
|
|
22
|
+
const referenceFields = entry.contentType.fields.filter((f) => f.type === 'reference');
|
|
23
|
+
const results = [];
|
|
24
|
+
for (const field of referenceFields) {
|
|
25
|
+
const value = data[field.key];
|
|
26
|
+
if (value == null)
|
|
27
|
+
continue;
|
|
28
|
+
const targetType = field.referenceTarget ?? 'unknown';
|
|
29
|
+
const ids = Array.isArray(value) ? value : [value];
|
|
30
|
+
for (const targetEntryId of ids) {
|
|
31
|
+
if (typeof targetEntryId === 'string') {
|
|
32
|
+
results.push({ fieldKey: field.key, targetEntryId, targetType });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return results;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Finds all entries that reference the given entry (reverse lookup).
|
|
40
|
+
* Scans published_documents JSON data for the entry ID.
|
|
41
|
+
*/
|
|
42
|
+
export async function getReferencesTo(entryId, spaceId) {
|
|
43
|
+
// Load all published docs in this space — we scan their JSON data for
|
|
44
|
+
// references to the target entryId.
|
|
45
|
+
const docs = await prisma.publishedDocument.findMany({
|
|
46
|
+
where: { spaceId },
|
|
47
|
+
select: {
|
|
48
|
+
entryId: true,
|
|
49
|
+
contentTypeKey: true,
|
|
50
|
+
data: true,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
// Load content type field definitions for reference fields
|
|
54
|
+
const contentTypes = await prisma.contentType.findMany({
|
|
55
|
+
where: { spaceId },
|
|
56
|
+
include: { fields: { where: { type: 'reference' } } },
|
|
57
|
+
});
|
|
58
|
+
const fieldsByType = new Map();
|
|
59
|
+
for (const ct of contentTypes) {
|
|
60
|
+
fieldsByType.set(ct.key, ct.fields);
|
|
61
|
+
}
|
|
62
|
+
const results = [];
|
|
63
|
+
for (const doc of docs) {
|
|
64
|
+
// Skip the entry itself
|
|
65
|
+
if (doc.entryId === entryId)
|
|
66
|
+
continue;
|
|
67
|
+
const data = (doc.data ?? {});
|
|
68
|
+
const refFields = fieldsByType.get(doc.contentTypeKey) ?? [];
|
|
69
|
+
for (const field of refFields) {
|
|
70
|
+
const value = data[field.key];
|
|
71
|
+
if (value == null)
|
|
72
|
+
continue;
|
|
73
|
+
const ids = Array.isArray(value) ? value : [value];
|
|
74
|
+
if (ids.includes(entryId)) {
|
|
75
|
+
results.push({
|
|
76
|
+
sourceEntryId: doc.entryId,
|
|
77
|
+
sourceType: doc.contentTypeKey,
|
|
78
|
+
fieldKey: field.key,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Also scan raw data values for the entryId (catch resolved objects)
|
|
83
|
+
const jsonStr = JSON.stringify(data);
|
|
84
|
+
if (!jsonStr.includes(entryId))
|
|
85
|
+
continue;
|
|
86
|
+
// Check if we already found it via field definitions — avoid duplicates
|
|
87
|
+
const alreadyFound = results.some((r) => r.sourceEntryId === doc.entryId);
|
|
88
|
+
if (alreadyFound)
|
|
89
|
+
continue;
|
|
90
|
+
// Fallback: scan all string values in data
|
|
91
|
+
for (const [key, val] of Object.entries(data)) {
|
|
92
|
+
if (val == null)
|
|
93
|
+
continue;
|
|
94
|
+
if (typeof val === 'string' && val === entryId) {
|
|
95
|
+
results.push({
|
|
96
|
+
sourceEntryId: doc.entryId,
|
|
97
|
+
sourceType: doc.contentTypeKey,
|
|
98
|
+
fieldKey: key,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else if (Array.isArray(val) && val.includes(entryId)) {
|
|
102
|
+
results.push({
|
|
103
|
+
sourceEntryId: doc.entryId,
|
|
104
|
+
sourceType: doc.contentTypeKey,
|
|
105
|
+
fieldKey: key,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return results;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Checks if any entries reference this one before delete.
|
|
114
|
+
* Returns the count and whether it's safe to delete.
|
|
115
|
+
*/
|
|
116
|
+
export async function checkReferentialIntegrity(entryId, spaceId) {
|
|
117
|
+
const refs = await getReferencesTo(entryId, spaceId);
|
|
118
|
+
return {
|
|
119
|
+
referencedBy: refs.length,
|
|
120
|
+
safe: refs.length === 0,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=relationships.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships.js","sourceRoot":"","sources":["../../src/content/relationships.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
ADDED
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,eAAO,MAAM,MAAM;;0EAEjB,CAAC"}
|
package/dist/db.js
ADDED
package/dist/db.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;IACrC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;CAC5E,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
export type HtmlessEvent = 'entry.created' | 'entry.draftSaved' | 'entry.published' | 'entry.unpublished' | 'entry.deleted' | 'asset.created' | 'asset.updated' | 'asset.deleted' | 'schema.typeCreated' | 'schema.typeUpdated' | 'schema.typeDeleted' | 'user.login';
|
|
3
|
+
export interface EventPayload {
|
|
4
|
+
eventType: HtmlessEvent;
|
|
5
|
+
spaceId: string;
|
|
6
|
+
userId?: string;
|
|
7
|
+
data: Record<string, unknown>;
|
|
8
|
+
occurredAt: string;
|
|
9
|
+
}
|
|
10
|
+
declare class HtmlessEventBus extends EventEmitter {
|
|
11
|
+
emit(event: HtmlessEvent, payload: Omit<EventPayload, 'eventType' | 'occurredAt'>): boolean;
|
|
12
|
+
on(event: HtmlessEvent, listener: (payload: EventPayload) => void): this;
|
|
13
|
+
}
|
|
14
|
+
export declare const eventBus: HtmlessEventBus;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/events/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,kBAAkB,GAClB,iBAAiB,GACjB,mBAAmB,GACnB,eAAe,GACf,eAAe,GACf,eAAe,GACf,eAAe,GACf,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,YAAY,CAAC;AAEjB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,cAAM,eAAgB,SAAQ,YAAY;IACxC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,YAAY,CAAC,GAAG,OAAO;IAQ3F,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;CAGzE;AAED,eAAO,MAAM,QAAQ,iBAAwB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
class HtmlessEventBus extends EventEmitter {
|
|
3
|
+
emit(event, payload) {
|
|
4
|
+
return super.emit(event, {
|
|
5
|
+
...payload,
|
|
6
|
+
eventType: event,
|
|
7
|
+
occurredAt: new Date().toISOString(),
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
on(event, listener) {
|
|
11
|
+
return super.on(event, listener);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export const eventBus = new HtmlessEventBus();
|
|
15
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/events/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAwBtC,MAAM,eAAgB,SAAQ,YAAY;IACxC,IAAI,CAAC,KAAmB,EAAE,OAAuD;QAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE;YACvB,GAAG,OAAO;YACV,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACd,CAAC,CAAC;IAC5B,CAAC;IAED,EAAE,CAAC,KAAmB,EAAE,QAAyC;QAC/D,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Response } from 'express';
|
|
2
|
+
export interface SSEStream {
|
|
3
|
+
send: (event: string, data: object) => void;
|
|
4
|
+
close: () => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Set up an SSE (Server-Sent Events) stream on an Express response.
|
|
8
|
+
*
|
|
9
|
+
* Returns helpers to send typed events and to tear the stream down.
|
|
10
|
+
* A `:keepalive` comment is sent every 30 s so proxies don't close
|
|
11
|
+
* the connection. Cleanup (clearing the interval) happens
|
|
12
|
+
* automatically when the client disconnects **or** when `.close()`
|
|
13
|
+
* is called explicitly.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createSSEStream(res: Response): SSEStream;
|
|
16
|
+
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/events/sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,CA+BxD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Set up an SSE (Server-Sent Events) stream on an Express response.
|
|
3
|
+
*
|
|
4
|
+
* Returns helpers to send typed events and to tear the stream down.
|
|
5
|
+
* A `:keepalive` comment is sent every 30 s so proxies don't close
|
|
6
|
+
* the connection. Cleanup (clearing the interval) happens
|
|
7
|
+
* automatically when the client disconnects **or** when `.close()`
|
|
8
|
+
* is called explicitly.
|
|
9
|
+
*/
|
|
10
|
+
export function createSSEStream(res) {
|
|
11
|
+
res.writeHead(200, {
|
|
12
|
+
'Content-Type': 'text/event-stream',
|
|
13
|
+
'Cache-Control': 'no-cache',
|
|
14
|
+
Connection: 'keep-alive',
|
|
15
|
+
'X-Accel-Buffering': 'no', // nginx: disable proxy buffering
|
|
16
|
+
});
|
|
17
|
+
// Flush headers immediately
|
|
18
|
+
res.flushHeaders();
|
|
19
|
+
const keepalive = setInterval(() => {
|
|
20
|
+
res.write(':keepalive\n\n');
|
|
21
|
+
}, 30_000);
|
|
22
|
+
function cleanup() {
|
|
23
|
+
clearInterval(keepalive);
|
|
24
|
+
}
|
|
25
|
+
// Clean up when the client drops the connection
|
|
26
|
+
res.on('close', cleanup);
|
|
27
|
+
return {
|
|
28
|
+
send(event, data) {
|
|
29
|
+
res.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
|
|
30
|
+
},
|
|
31
|
+
close() {
|
|
32
|
+
cleanup();
|
|
33
|
+
res.end();
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/events/sse.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,GAAa;IAC3C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,mBAAmB;QACnC,eAAe,EAAE,UAAU;QAC3B,UAAU,EAAE,YAAY;QACxB,mBAAmB,EAAE,IAAI,EAAE,iCAAiC;KAC7D,CAAC,CAAC;IAEH,4BAA4B;IAC5B,GAAG,CAAC,YAAY,EAAE,CAAC;IAEnB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC9B,CAAC,EAAE,MAAM,CAAC,CAAC;IAEX,SAAS,OAAO;QACd,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IAED,gDAAgD;IAChD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAEzB,OAAO;QACL,IAAI,CAAC,KAAa,EAAE,IAAY;YAC9B,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClE,CAAC;QACD,KAAK;YACH,OAAO,EAAE,CAAC;YACV,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/events/wire.ts"],"names":[],"mappings":"AAiBA,wBAAgB,iBAAiB,IAAI,IAAI,CAWxC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { eventBus } from './emitter.js';
|
|
2
|
+
import { dispatchWebhooks } from '../webhooks/dispatcher.js';
|
|
3
|
+
// All events that should trigger webhook delivery
|
|
4
|
+
const WEBHOOK_EVENTS = [
|
|
5
|
+
'entry.created',
|
|
6
|
+
'entry.published',
|
|
7
|
+
'entry.unpublished',
|
|
8
|
+
'entry.deleted',
|
|
9
|
+
'asset.created',
|
|
10
|
+
'asset.updated',
|
|
11
|
+
'asset.deleted',
|
|
12
|
+
'schema.typeCreated',
|
|
13
|
+
'schema.typeUpdated',
|
|
14
|
+
'schema.typeDeleted',
|
|
15
|
+
];
|
|
16
|
+
export function wireEventHandlers() {
|
|
17
|
+
for (const event of WEBHOOK_EVENTS) {
|
|
18
|
+
eventBus.on(event, (payload) => {
|
|
19
|
+
// Fire-and-forget — don't block the request
|
|
20
|
+
dispatchWebhooks(payload).catch((err) => {
|
|
21
|
+
console.error(`Webhook dispatch error for ${event}:`, err);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
console.log(`Event bus wired: ${WEBHOOK_EVENTS.length} events → webhook dispatch`);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/events/wire.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAqB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,kDAAkD;AAClD,MAAM,cAAc,GAAmB;IACrC,eAAe;IACf,iBAAiB;IACjB,mBAAmB;IACnB,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;CACrB,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAC/B,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE;YAC7B,4CAA4C;YAC5C,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACtC,OAAO,CAAC,KAAK,CAAC,8BAA8B,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,cAAc,CAAC,MAAM,4BAA4B,CAAC,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export interface BillingRecord {
|
|
2
|
+
id: string;
|
|
3
|
+
extensionKey: string;
|
|
4
|
+
spaceId: string;
|
|
5
|
+
amount: number;
|
|
6
|
+
currency: 'USD';
|
|
7
|
+
period: string;
|
|
8
|
+
authorShare: number;
|
|
9
|
+
platformShare: number;
|
|
10
|
+
status: 'pending' | 'paid';
|
|
11
|
+
createdAt: string;
|
|
12
|
+
}
|
|
13
|
+
export interface RevenueReport {
|
|
14
|
+
extensionKey: string;
|
|
15
|
+
totalRevenue: number;
|
|
16
|
+
authorEarnings: number;
|
|
17
|
+
platformEarnings: number;
|
|
18
|
+
activeInstalls: number;
|
|
19
|
+
records: BillingRecord[];
|
|
20
|
+
}
|
|
21
|
+
export interface PlatformBillingSummary {
|
|
22
|
+
totalRevenue: number;
|
|
23
|
+
totalAuthorPayouts: number;
|
|
24
|
+
totalPlatformRevenue: number;
|
|
25
|
+
extensionCount: number;
|
|
26
|
+
extensions: {
|
|
27
|
+
extensionKey: string;
|
|
28
|
+
totalRevenue: number;
|
|
29
|
+
authorEarnings: number;
|
|
30
|
+
platformEarnings: number;
|
|
31
|
+
activeInstalls: number;
|
|
32
|
+
}[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Calculate revenue split between author and platform.
|
|
36
|
+
* @param priceMonthly — price in cents
|
|
37
|
+
* @param sharePercent — author share percentage (default 70)
|
|
38
|
+
*/
|
|
39
|
+
export declare function calculateRevenue(priceMonthly: number, sharePercent?: number): {
|
|
40
|
+
authorAmount: number;
|
|
41
|
+
platformAmount: number;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Record a billing event when a paid extension is installed.
|
|
45
|
+
* In production this would create a Stripe subscription or charge.
|
|
46
|
+
*/
|
|
47
|
+
export declare function recordInstallBilling(extensionKey: string, spaceId: string, priceMonthly: number): Promise<BillingRecord>;
|
|
48
|
+
/**
|
|
49
|
+
* Get a revenue report for a specific extension.
|
|
50
|
+
*/
|
|
51
|
+
export declare function getRevenueReport(extensionKey: string): Promise<RevenueReport>;
|
|
52
|
+
/**
|
|
53
|
+
* Get platform-wide billing summary.
|
|
54
|
+
*/
|
|
55
|
+
export declare function getPlatformBillingSummary(): Promise<PlatformBillingSummary>;
|
|
56
|
+
/**
|
|
57
|
+
* Get all billing records (for testing/admin).
|
|
58
|
+
*/
|
|
59
|
+
export declare function getAllBillingRecords(): BillingRecord[];
|
|
60
|
+
//# sourceMappingURL=billing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/extensions/billing.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;KACxB,EAAE,CAAC;CACL;AAaD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,YAAY,GAAE,MAAqC,GAClD;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAIlD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC,CA4BxB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAiBnF;AAED;;GAEG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAwBjF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,aAAa,EAAE,CAEtD"}
|