@heyo-sh/heyo-cms 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +44 -2
- package/dist/access/index.d.ts +9 -0
- package/dist/access/index.d.ts.map +1 -0
- package/dist/access/permissions.d.ts +54 -0
- package/dist/access/permissions.d.ts.map +1 -0
- package/dist/adapters/astro.d.ts +38 -0
- package/dist/adapters/astro.d.ts.map +1 -0
- package/dist/adapters/astro.js +1 -0
- package/dist/adapters/next.d.ts +31 -0
- package/dist/adapters/next.d.ts.map +1 -0
- package/dist/adapters/next.js +1 -0
- package/dist/adapters/nuxt.d.ts +47 -0
- package/dist/adapters/nuxt.d.ts.map +1 -0
- package/dist/adapters/nuxt.js +1 -0
- package/dist/adapters/react-router.d.ts +29 -0
- package/dist/adapters/react-router.d.ts.map +1 -0
- package/dist/adapters/react-router.js +1 -0
- package/dist/adapters/sveltekit.d.ts +37 -0
- package/dist/adapters/sveltekit.d.ts.map +1 -0
- package/dist/adapters/sveltekit.js +1 -0
- package/dist/ai/assistant/context.d.ts +64 -0
- package/dist/ai/assistant/context.d.ts.map +1 -0
- package/dist/ai/assistant/limits.d.ts +10 -0
- package/dist/ai/assistant/limits.d.ts.map +1 -0
- package/dist/ai/assistant/plans.d.ts +83 -0
- package/dist/ai/assistant/plans.d.ts.map +1 -0
- package/dist/ai/assistant/prompt.d.ts +22 -0
- package/dist/ai/assistant/prompt.d.ts.map +1 -0
- package/dist/ai/assistant/run.d.ts +59 -0
- package/dist/ai/assistant/run.d.ts.map +1 -0
- package/dist/ai/assistant/runtime.d.ts +35 -0
- package/dist/ai/assistant/runtime.d.ts.map +1 -0
- package/dist/ai/assistant/schema.d.ts +66 -0
- package/dist/ai/assistant/schema.d.ts.map +1 -0
- package/dist/ai/assistant/tools.d.ts +41 -0
- package/dist/ai/assistant/tools.d.ts.map +1 -0
- package/dist/ai/assistant/values.d.ts +33 -0
- package/dist/ai/assistant/values.d.ts.map +1 -0
- package/dist/ai/crypto.d.ts +12 -0
- package/dist/ai/crypto.d.ts.map +1 -0
- package/dist/ai/index.d.ts +19 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/pi.d.ts +89 -0
- package/dist/ai/pi.d.ts.map +1 -0
- package/dist/ai/registry.d.ts +66 -0
- package/dist/ai/registry.d.ts.map +1 -0
- package/dist/ai/service.d.ts +31 -0
- package/dist/ai/service.d.ts.map +1 -0
- package/dist/ai/variant-translation.d.ts +6 -0
- package/dist/ai/variant-translation.d.ts.map +1 -0
- package/dist/ai.d.ts +12 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +1 -0
- package/dist/auth/config.d.ts +65 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/crypto.d.ts +44 -0
- package/dist/auth/crypto.d.ts.map +1 -0
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/oauth.d.ts +93 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/service.d.ts +38 -0
- package/dist/auth/service.d.ts.map +1 -0
- package/dist/auth/totp.d.ts +34 -0
- package/dist/auth/totp.d.ts.map +1 -0
- package/dist/auth.d.ts +9 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +30 -0
- package/dist/client/index.d.ts +51 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/types.d.ts +340 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client.d.ts +46 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1 -0
- package/dist/config.d.ts +31 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +1 -0
- package/dist/content/export.d.ts +28 -0
- package/dist/content/export.d.ts.map +1 -0
- package/dist/content/import.d.ts +65 -0
- package/dist/content/import.d.ts.map +1 -0
- package/dist/content/records.d.ts +73 -0
- package/dist/content/records.d.ts.map +1 -0
- package/dist/content.d.ts +12 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +1 -0
- package/dist/db/d1.d.ts +29 -0
- package/dist/db/d1.d.ts.map +1 -0
- package/dist/db/d1.js +1 -0
- package/dist/db/mongodb.d.ts +128 -0
- package/dist/db/mongodb.d.ts.map +1 -0
- package/dist/db/mongodb.js +2 -0
- package/dist/db/postgres.d.ts +37 -0
- package/dist/db/postgres.d.ts.map +1 -0
- package/dist/db/postgres.js +1 -0
- package/dist/db/sql/adapter.d.ts +57 -0
- package/dist/db/sql/adapter.d.ts.map +1 -0
- package/dist/db/sql/compile.d.ts +50 -0
- package/dist/db/sql/compile.d.ts.map +1 -0
- package/dist/db/sql/ddl.d.ts +34 -0
- package/dist/db/sql/ddl.d.ts.map +1 -0
- package/dist/db/sql/dialect.d.ts +35 -0
- package/dist/db/sql/dialect.d.ts.map +1 -0
- package/dist/db/sql/driver.d.ts +34 -0
- package/dist/db/sql/driver.d.ts.map +1 -0
- package/dist/db/sql/introspect.d.ts +15 -0
- package/dist/db/sql/introspect.d.ts.map +1 -0
- package/dist/db/sqlite.d.ts +39 -0
- package/dist/db/sqlite.d.ts.map +1 -0
- package/dist/db/sqlite.js +1 -0
- package/dist/defaults.d.ts +5 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/duration.d.ts +12 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/editor/builtin.d.ts +45 -0
- package/dist/editor/builtin.d.ts.map +1 -0
- package/dist/editor/index.d.ts +14 -0
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/editor/markdown.d.ts +19 -0
- package/dist/editor/markdown.d.ts.map +1 -0
- package/dist/editor/registry.d.ts +30 -0
- package/dist/editor/registry.d.ts.map +1 -0
- package/dist/editor/serialize.d.ts +41 -0
- package/dist/editor/serialize.d.ts.map +1 -0
- package/dist/editor.d.ts +10 -0
- package/dist/editor.d.ts.map +1 -0
- package/dist/editor.js +1 -0
- package/dist/engine/access.d.ts +33 -0
- package/dist/engine/access.d.ts.map +1 -0
- package/dist/engine/activity.d.ts +16 -0
- package/dist/engine/activity.d.ts.map +1 -0
- package/dist/engine/cursor.d.ts +19 -0
- package/dist/engine/cursor.d.ts.map +1 -0
- package/dist/engine/documents.d.ts +81 -0
- package/dist/engine/documents.d.ts.map +1 -0
- package/dist/engine/engine.d.ts +276 -0
- package/dist/engine/engine.d.ts.map +1 -0
- package/dist/engine/field-access.d.ts +21 -0
- package/dist/engine/field-access.d.ts.map +1 -0
- package/dist/engine/hooks.d.ts +58 -0
- package/dist/engine/hooks.d.ts.map +1 -0
- package/dist/engine/index.d.ts +20 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/jobs.d.ts +63 -0
- package/dist/engine/jobs.d.ts.map +1 -0
- package/dist/engine/locales.d.ts +40 -0
- package/dist/engine/locales.d.ts.map +1 -0
- package/dist/engine/outbox.d.ts +81 -0
- package/dist/engine/outbox.d.ts.map +1 -0
- package/dist/engine/relations.d.ts +60 -0
- package/dist/engine/relations.d.ts.map +1 -0
- package/dist/engine/scoped-db.d.ts +13 -0
- package/dist/engine/scoped-db.d.ts.map +1 -0
- package/dist/engine/trash.d.ts +25 -0
- package/dist/engine/trash.d.ts.map +1 -0
- package/dist/errors.d.ts +42 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/fields/builtin.d.ts +142 -0
- package/dist/fields/builtin.d.ts.map +1 -0
- package/dist/fields/index.d.ts +3 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/registry.d.ts +35 -0
- package/dist/fields/registry.d.ts.map +1 -0
- package/dist/fields.d.ts +8 -0
- package/dist/fields.d.ts.map +1 -0
- package/dist/fields.js +1 -0
- package/dist/http/guard.d.ts +45 -0
- package/dist/http/guard.d.ts.map +1 -0
- package/dist/http/handler.d.ts +31 -0
- package/dist/http/handler.d.ts.map +1 -0
- package/dist/http/index.d.ts +13 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/openapi.d.ts +5 -0
- package/dist/http/openapi.d.ts.map +1 -0
- package/dist/http/params.d.ts +32 -0
- package/dist/http/params.d.ts.map +1 -0
- package/dist/http/request-db.d.ts +19 -0
- package/dist/http/request-db.d.ts.map +1 -0
- package/dist/http/respond.d.ts +48 -0
- package/dist/http/respond.d.ts.map +1 -0
- package/dist/http/rich-text.d.ts +30 -0
- package/dist/http/rich-text.d.ts.map +1 -0
- package/dist/http/router.d.ts +55 -0
- package/dist/http/router.d.ts.map +1 -0
- package/dist/http/routes/access.d.ts +13 -0
- package/dist/http/routes/access.d.ts.map +1 -0
- package/dist/http/routes/admin.d.ts +28 -0
- package/dist/http/routes/admin.d.ts.map +1 -0
- package/dist/http/routes/ai.d.ts +26 -0
- package/dist/http/routes/ai.d.ts.map +1 -0
- package/dist/http/routes/auth.d.ts +13 -0
- package/dist/http/routes/auth.d.ts.map +1 -0
- package/dist/http/routes/documents.d.ts +24 -0
- package/dist/http/routes/documents.d.ts.map +1 -0
- package/dist/http/routes/generate.d.ts +5 -0
- package/dist/http/routes/generate.d.ts.map +1 -0
- package/dist/http/routes/media.d.ts +28 -0
- package/dist/http/routes/media.d.ts.map +1 -0
- package/dist/http/routes/panel.d.ts +20 -0
- package/dist/http/routes/panel.d.ts.map +1 -0
- package/dist/http/routes/system.d.ts +25 -0
- package/dist/http/routes/system.d.ts.map +1 -0
- package/dist/http/routes/webhooks.d.ts +17 -0
- package/dist/http/routes/webhooks.d.ts.map +1 -0
- package/dist/http/spec.d.ts +28 -0
- package/dist/http/spec.d.ts.map +1 -0
- package/dist/http.d.ts +17 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +1 -0
- package/dist/i18n/index.d.ts +12 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/names.d.ts +25 -0
- package/dist/i18n/names.d.ts.map +1 -0
- package/dist/ids.d.ts +28 -0
- package/dist/ids.d.ts.map +1 -0
- package/dist/index-2757kej5.js +2 -0
- package/dist/index-2kb5nbxx.js +2 -0
- package/dist/index-2z1qe5mw.js +2 -0
- package/dist/index-34s342fz.js +2 -0
- package/dist/index-5ngtc7gy.js +2 -0
- package/dist/index-7a231xfp.js +2 -0
- package/dist/index-7k091gpe.js +2 -0
- package/dist/index-9g2n7xa6.js +2 -0
- package/dist/index-9x1z3b85.js +5 -0
- package/dist/index-9zqnf6gx.js +23 -0
- package/dist/index-b2ecggck.js +26 -0
- package/dist/index-cbwwtcm4.js +2 -0
- package/dist/index-ebtj6ebd.js +0 -0
- package/dist/index-g4crf47y.js +0 -0
- package/dist/index-gpwcmmvr.js +2 -0
- package/dist/index-hq05mc1n.js +3 -0
- package/dist/index-hy1x46nf.js +2 -0
- package/dist/index-k8wbg1dw.js +2 -0
- package/dist/index-kbsgt44t.js +2 -0
- package/dist/index-m82a0shw.js +2 -0
- package/dist/index-md79xr6h.js +5 -0
- package/dist/index-nvgwyykk.js +40 -0
- package/dist/index-ty698y02.js +2 -0
- package/dist/index-vq2978e7.js +14 -0
- package/dist/index-vxw0a03g.js +2 -0
- package/dist/index-wj8y1xcj.js +2 -0
- package/dist/index-x72d1hzh.js +2 -0
- package/dist/index-y5mwknr9.js +2 -0
- package/dist/index-ymq6jsar.js +2 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/jobs/runner.d.ts +77 -0
- package/dist/jobs/runner.d.ts.map +1 -0
- package/dist/jobs.d.ts +11 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +1 -0
- package/dist/media/document.d.ts +28 -0
- package/dist/media/document.d.ts.map +1 -0
- package/dist/media/gc.d.ts +46 -0
- package/dist/media/gc.d.ts.map +1 -0
- package/dist/media/index.d.ts +20 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/pipeline.d.ts +36 -0
- package/dist/media/pipeline.d.ts.map +1 -0
- package/dist/media/probe.d.ts +6 -0
- package/dist/media/probe.d.ts.map +1 -0
- package/dist/media/service.d.ts +26 -0
- package/dist/media/service.d.ts.map +1 -0
- package/dist/media/sharp.d.ts +28 -0
- package/dist/media/sharp.d.ts.map +1 -0
- package/dist/media/strip.d.ts +16 -0
- package/dist/media/strip.d.ts.map +1 -0
- package/dist/media/usages.d.ts +69 -0
- package/dist/media/usages.d.ts.map +1 -0
- package/dist/media/variants.d.ts +50 -0
- package/dist/media/variants.d.ts.map +1 -0
- package/dist/migrations.d.ts +115 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +1 -0
- package/dist/panel.d.ts +31 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/query.d.ts +40 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +1 -0
- package/dist/run-3r72dwhs.js +6 -0
- package/dist/schema/describe.d.ts +19 -0
- package/dist/schema/describe.d.ts.map +1 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/plan.d.ts +20 -0
- package/dist/schema/plan.d.ts.map +1 -0
- package/dist/schema/snapshot.d.ts +22 -0
- package/dist/schema/snapshot.d.ts.map +1 -0
- package/dist/schema/system.d.ts +22 -0
- package/dist/schema/system.d.ts.map +1 -0
- package/dist/schema.d.ts +7 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +1 -0
- package/dist/storage/bytes.d.ts +17 -0
- package/dist/storage/bytes.d.ts.map +1 -0
- package/dist/storage/http.d.ts +43 -0
- package/dist/storage/http.d.ts.map +1 -0
- package/dist/storage/local.d.ts +31 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/providers.d.ts +95 -0
- package/dist/storage/providers.d.ts.map +1 -0
- package/dist/storage/sign.d.ts +53 -0
- package/dist/storage/sign.d.ts.map +1 -0
- package/dist/strings.d.ts +13 -0
- package/dist/strings.d.ts.map +1 -0
- package/dist/telemetry.d.ts +137 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +1 -0
- package/dist/types/activity.d.ts +68 -0
- package/dist/types/activity.d.ts.map +1 -0
- package/dist/types/actor.d.ts +26 -0
- package/dist/types/actor.d.ts.map +1 -0
- package/dist/types/ai.d.ts +357 -0
- package/dist/types/ai.d.ts.map +1 -0
- package/dist/types/api.d.ts +212 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/auth.d.ts +310 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/config.d.ts +632 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/database.d.ts +75 -0
- package/dist/types/database.d.ts.map +1 -0
- package/dist/types/editor.d.ts +140 -0
- package/dist/types/editor.d.ts.map +1 -0
- package/dist/types/events.d.ts +72 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/fields.d.ts +142 -0
- package/dist/types/fields.d.ts.map +1 -0
- package/dist/types/hooks.d.ts +142 -0
- package/dist/types/hooks.d.ts.map +1 -0
- package/dist/types/index.d.ts +25 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/instance.d.ts +263 -0
- package/dist/types/instance.d.ts.map +1 -0
- package/dist/types/jobs.d.ts +78 -0
- package/dist/types/jobs.d.ts.map +1 -0
- package/dist/types/json.d.ts +24 -0
- package/dist/types/json.d.ts.map +1 -0
- package/dist/types/locales.d.ts +30 -0
- package/dist/types/locales.d.ts.map +1 -0
- package/dist/types/media.d.ts +245 -0
- package/dist/types/media.d.ts.map +1 -0
- package/dist/types/panel.d.ts +249 -0
- package/dist/types/panel.d.ts.map +1 -0
- package/dist/types/plugin.d.ts +172 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/query.d.ts +101 -0
- package/dist/types/query.d.ts.map +1 -0
- package/dist/types/schema.d.ts +203 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/storage.d.ts +61 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/telemetry.d.ts +14 -0
- package/dist/types/telemetry.d.ts.map +1 -0
- package/dist/types/trash.d.ts +42 -0
- package/dist/types/trash.d.ts.map +1 -0
- package/dist/types/webhooks.d.ts +133 -0
- package/dist/types/webhooks.d.ts.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/uploads.d.ts +21 -0
- package/dist/uploads.d.ts.map +1 -0
- package/dist/uploads.js +9 -0
- package/dist/webhooks/index.d.ts +10 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/job.d.ts +17 -0
- package/dist/webhooks/job.d.ts.map +1 -0
- package/dist/webhooks/service.d.ts +53 -0
- package/dist/webhooks/service.d.ts.map +1 -0
- package/dist/webhooks/sign.d.ts +26 -0
- package/dist/webhooks/sign.d.ts.map +1 -0
- package/dist/webhooks.d.ts +10 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +1 -0
- package/package.json +183 -4
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import type { JsonPrimitive, JsonValue } from "./json";
|
|
2
|
+
/**
|
|
3
|
+
* The storage types every supported engine can express.
|
|
4
|
+
*
|
|
5
|
+
* The list is deliberately short. A type that only Postgres understands would
|
|
6
|
+
* force the MongoDB and SQLite adapters to invent a translation, and the field
|
|
7
|
+
* registry would start encoding engine differences that the plan puts behind
|
|
8
|
+
* the adapter boundary (section 12).
|
|
9
|
+
*/
|
|
10
|
+
export type ColumnType = "text" | "integer" | "bigint" | "real" | "boolean" | "timestamp" | "json" | "blob";
|
|
11
|
+
/** What a foreign key points at, and what happens when the target goes away. */
|
|
12
|
+
export interface ForeignKeyDefinition {
|
|
13
|
+
table: string;
|
|
14
|
+
column: string;
|
|
15
|
+
onDelete?: "cascade" | "set-null" | "restrict";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Where a value physically lives.
|
|
19
|
+
*
|
|
20
|
+
* `document` means "inside the JSON body of the row". Content fields use it,
|
|
21
|
+
* which is what lets a new locale or a new field ship without a table
|
|
22
|
+
* rewrite (sections 9 and 12). System collections use `column`, because they
|
|
23
|
+
* are queried by the engine itself on every request.
|
|
24
|
+
*/
|
|
25
|
+
export type ColumnStorage = "column" | "document";
|
|
26
|
+
/**
|
|
27
|
+
* What a field type asks the storage layer for.
|
|
28
|
+
*
|
|
29
|
+
* Returned by `FieldType.column()`. For content fields only `type`, `nullable`,
|
|
30
|
+
* `array`, `unique`, `index` and `default` are meaningful: the value lands in
|
|
31
|
+
* the document body, and `unique`/`index` become expression indexes over the
|
|
32
|
+
* JSON path rather than table columns.
|
|
33
|
+
*/
|
|
34
|
+
export interface ColumnDefinition {
|
|
35
|
+
type: ColumnType;
|
|
36
|
+
nullable?: boolean;
|
|
37
|
+
/** Literal default. Non-literal defaults belong in a hook, not in DDL. */
|
|
38
|
+
default?: JsonPrimitive;
|
|
39
|
+
unique?: boolean;
|
|
40
|
+
index?: boolean;
|
|
41
|
+
/** Multi-value field: stored as a JSON array, never as a native array type. */
|
|
42
|
+
array?: boolean;
|
|
43
|
+
references?: ForeignKeyDefinition;
|
|
44
|
+
storage?: ColumnStorage;
|
|
45
|
+
}
|
|
46
|
+
/** A column as it exists in a snapshot: a definition that knows its name. */
|
|
47
|
+
export interface ColumnSnapshot extends ColumnDefinition {
|
|
48
|
+
name: string;
|
|
49
|
+
nullable: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* An index target.
|
|
53
|
+
*
|
|
54
|
+
* `json` targets are what make content queryable without promoting fields to
|
|
55
|
+
* columns: Postgres indexes the `data ->> 'slug'` expression, SQLite indexes
|
|
56
|
+
* `json_extract(data, '$.slug')`, MongoDB indexes `data.slug`. Same snapshot,
|
|
57
|
+
* three renderings, decided inside the adapter.
|
|
58
|
+
*/
|
|
59
|
+
export type IndexTarget = {
|
|
60
|
+
kind: "column";
|
|
61
|
+
column: string;
|
|
62
|
+
} | {
|
|
63
|
+
kind: "json";
|
|
64
|
+
column: string;
|
|
65
|
+
path: string[];
|
|
66
|
+
type: ColumnType;
|
|
67
|
+
};
|
|
68
|
+
export interface IndexSnapshot {
|
|
69
|
+
name: string;
|
|
70
|
+
table: string;
|
|
71
|
+
targets: IndexTarget[];
|
|
72
|
+
unique: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* A partial-index predicate, restricted to one equality on purpose.
|
|
75
|
+
*
|
|
76
|
+
* Every content collection shares the `documents` table, so an index for
|
|
77
|
+
* `posts.slug` has to exclude the other collections' rows. One equality is
|
|
78
|
+
* all that requires, and it is the only predicate all three engines express
|
|
79
|
+
* identically (`WHERE`, `WHERE`, `partialFilterExpression`).
|
|
80
|
+
*/
|
|
81
|
+
where?: {
|
|
82
|
+
column: string;
|
|
83
|
+
equals: string;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export interface TableSnapshot {
|
|
87
|
+
name: string;
|
|
88
|
+
/** Sorted by name so two runs of `generate` cannot disagree on ordering. */
|
|
89
|
+
columns: ColumnSnapshot[];
|
|
90
|
+
primaryKey: string[];
|
|
91
|
+
indexes: IndexSnapshot[];
|
|
92
|
+
/**
|
|
93
|
+
* The collection this table stores, when it is a content table. Backfill
|
|
94
|
+
* steps need it to scope an update to one collection inside `documents`.
|
|
95
|
+
*/
|
|
96
|
+
documentColumn?: string;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* A content field as the migration layer sees it.
|
|
100
|
+
*
|
|
101
|
+
* Content lives in a JSON body, so most field changes move no DDL at all.
|
|
102
|
+
* They still have to be recorded: adding a field with a default is a
|
|
103
|
+
* backfill, removing one is a cleanup, and marking one unique is an index.
|
|
104
|
+
* Without this logical layer the diff would see two identical `documents`
|
|
105
|
+
* tables and generate nothing.
|
|
106
|
+
*/
|
|
107
|
+
export interface FieldSnapshot {
|
|
108
|
+
name: string;
|
|
109
|
+
type: string;
|
|
110
|
+
localized: boolean;
|
|
111
|
+
required: boolean;
|
|
112
|
+
unique: boolean;
|
|
113
|
+
index: boolean;
|
|
114
|
+
default?: JsonValue;
|
|
115
|
+
relationTo?: string;
|
|
116
|
+
column: ColumnDefinition;
|
|
117
|
+
}
|
|
118
|
+
export interface CollectionSnapshot {
|
|
119
|
+
name: string;
|
|
120
|
+
slug: string;
|
|
121
|
+
kind: "collection" | "global";
|
|
122
|
+
/** The physical table; `documents` for everything the user declares. */
|
|
123
|
+
table: string;
|
|
124
|
+
documentColumn: string;
|
|
125
|
+
/** Sorted by name. */
|
|
126
|
+
fields: FieldSnapshot[];
|
|
127
|
+
}
|
|
128
|
+
export interface SchemaSnapshot {
|
|
129
|
+
version: 1;
|
|
130
|
+
/** Sorted by name. Determinism is the whole point of the snapshot. */
|
|
131
|
+
tables: TableSnapshot[];
|
|
132
|
+
/** Sorted by name. The logical layer behind the JSON document body. */
|
|
133
|
+
collections: CollectionSnapshot[];
|
|
134
|
+
}
|
|
135
|
+
/** Which attributes of a column a migration has to alter. */
|
|
136
|
+
export type ColumnChange = "type" | "nullable" | "default" | "references";
|
|
137
|
+
/**
|
|
138
|
+
* A neutral migration step.
|
|
139
|
+
*
|
|
140
|
+
* `plan()` produces these from two snapshots and nothing else, so the same
|
|
141
|
+
* diff drives a `.sql` file on Postgres, a `.sql` file on SQLite and an index
|
|
142
|
+
* plus backfill program on MongoDB. No SQL is constructed outside an adapter.
|
|
143
|
+
*/
|
|
144
|
+
export type MigrationStep = {
|
|
145
|
+
kind: "create_table";
|
|
146
|
+
table: TableSnapshot;
|
|
147
|
+
} | {
|
|
148
|
+
kind: "drop_table";
|
|
149
|
+
table: string;
|
|
150
|
+
} | {
|
|
151
|
+
kind: "add_column";
|
|
152
|
+
table: string;
|
|
153
|
+
column: ColumnSnapshot;
|
|
154
|
+
} | {
|
|
155
|
+
kind: "drop_column";
|
|
156
|
+
table: string;
|
|
157
|
+
column: string;
|
|
158
|
+
} | {
|
|
159
|
+
kind: "alter_column";
|
|
160
|
+
table: string;
|
|
161
|
+
column: ColumnSnapshot;
|
|
162
|
+
previous: ColumnSnapshot;
|
|
163
|
+
changes: ColumnChange[];
|
|
164
|
+
} | {
|
|
165
|
+
kind: "create_index";
|
|
166
|
+
index: IndexSnapshot;
|
|
167
|
+
} | {
|
|
168
|
+
kind: "drop_index";
|
|
169
|
+
table: string;
|
|
170
|
+
index: string;
|
|
171
|
+
} | {
|
|
172
|
+
/** Writes a default into documents that predate the field. */
|
|
173
|
+
kind: "set_document_field";
|
|
174
|
+
table: string;
|
|
175
|
+
collection: string;
|
|
176
|
+
documentColumn: string;
|
|
177
|
+
path: string[];
|
|
178
|
+
value: JsonValue;
|
|
179
|
+
} | {
|
|
180
|
+
/** Removes a field that left the collection, so reads stop seeing it. */
|
|
181
|
+
kind: "unset_document_field";
|
|
182
|
+
table: string;
|
|
183
|
+
collection: string;
|
|
184
|
+
documentColumn: string;
|
|
185
|
+
path: string[];
|
|
186
|
+
};
|
|
187
|
+
/**
|
|
188
|
+
* A migration as it is written into the repository.
|
|
189
|
+
*
|
|
190
|
+
* SQL engines get `.sql` a human can read in a pull request; MongoDB has no
|
|
191
|
+
* DDL, so it gets the step list itself — index creations, uniqueness changes
|
|
192
|
+
* and backfills — as data the adapter replays. Both are reviewed the same way,
|
|
193
|
+
* numbered the same way and applied by the same CLI.
|
|
194
|
+
*/
|
|
195
|
+
export interface MigrationArtifact {
|
|
196
|
+
/** `0003_add_posts_slug_index` — numbered, ordered, stable. */
|
|
197
|
+
id: string;
|
|
198
|
+
extension: "sql" | "json";
|
|
199
|
+
content: string;
|
|
200
|
+
/** One line per step, printed by `heyo-cms generate`. */
|
|
201
|
+
summary: string[];
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/types/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** Everything the storage layer records about an object it is given. */
|
|
2
|
+
export interface ObjectMeta {
|
|
3
|
+
contentType: string;
|
|
4
|
+
size?: number;
|
|
5
|
+
cacheControl?: string;
|
|
6
|
+
contentDisposition?: string;
|
|
7
|
+
/** Provider-side user metadata. Never trusted for access decisions. */
|
|
8
|
+
metadata?: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
export interface SignedUrlOptions {
|
|
11
|
+
/** Seconds, or a duration string such as `1h`. */
|
|
12
|
+
expiresIn?: number | string;
|
|
13
|
+
download?: boolean;
|
|
14
|
+
filename?: string;
|
|
15
|
+
}
|
|
16
|
+
/** What `head()` reports for an object that exists. */
|
|
17
|
+
export interface StoredObject {
|
|
18
|
+
key: string;
|
|
19
|
+
size: number;
|
|
20
|
+
contentType: string;
|
|
21
|
+
lastModified?: Date;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The whole storage contract.
|
|
25
|
+
*
|
|
26
|
+
* Four required methods is the point: a bespoke adapter for an in-house object
|
|
27
|
+
* store should be a short afternoon, not a project. `head` is optional because
|
|
28
|
+
* media garbage collection can fall back to the size recorded in the database.
|
|
29
|
+
*/
|
|
30
|
+
export interface StorageAdapter {
|
|
31
|
+
/** `local`, `s3`, `r2`, `gcs`, `azure`. Printed by `cms.inspect()`. */
|
|
32
|
+
readonly id: string;
|
|
33
|
+
put(key: string, body: ReadableStream | Uint8Array, meta: ObjectMeta): Promise<void>;
|
|
34
|
+
get(key: string): Promise<ReadableStream | null>;
|
|
35
|
+
delete(keys: string[]): Promise<void>;
|
|
36
|
+
url(key: string, options?: SignedUrlOptions): string;
|
|
37
|
+
head?(key: string): Promise<StoredObject | null>;
|
|
38
|
+
/**
|
|
39
|
+
* A time-limited URL for a bucket that is not public.
|
|
40
|
+
*
|
|
41
|
+
* Separate from `url()` and asynchronous because signing is cryptography:
|
|
42
|
+
* making `url()` async instead would make the common case — a public file
|
|
43
|
+
* on a CDN — pay for a feature it does not use, in every template that
|
|
44
|
+
* renders an image.
|
|
45
|
+
*/
|
|
46
|
+
signedUrl?(key: string, options?: SignedUrlOptions): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* Where new objects should live, given the file being stored.
|
|
49
|
+
*
|
|
50
|
+
* The adapter decides because the layout belongs to the bucket: a lifecycle
|
|
51
|
+
* rule that archives `2024/` only works if the adapter that was configured
|
|
52
|
+
* with it is the one choosing prefixes (section 6).
|
|
53
|
+
*/
|
|
54
|
+
readonly prefix?: (file: {
|
|
55
|
+
id: string;
|
|
56
|
+
filename: string;
|
|
57
|
+
}) => string;
|
|
58
|
+
}
|
|
59
|
+
export type StorageAdapterFactory = () => StorageAdapter | Promise<StorageAdapter>;
|
|
60
|
+
export type StorageConfig = StorageAdapter | StorageAdapterFactory;
|
|
61
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/types/storage.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,IAAI,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,GAAG,CACD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,cAAc,GAAG,UAAU,EACjC,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;IACrD,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACjD;;;;;;;OAOG;IACH,SAAS,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrE;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;CACtE;AAED,MAAM,MAAM,qBAAqB,GAAG,MAClC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What `heyoCms({ telemetry })` accepts.
|
|
3
|
+
*
|
|
4
|
+
* The behaviour, and the list of everything that is ever sent, is documented
|
|
5
|
+
* on the module that implements it: `@heyo-sh/heyo-cms/telemetry`. In short —
|
|
6
|
+
* the CLI reports, a deployment never does, and `{ enabled: false }` here is
|
|
7
|
+
* one of three ways to turn even that off.
|
|
8
|
+
*/
|
|
9
|
+
export interface TelemetryConfig {
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
/** For a self-hosted collector. */
|
|
12
|
+
endpoint?: string;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/types/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { OperationArgs } from "./api";
|
|
2
|
+
import type { JsonObject } from "./json";
|
|
3
|
+
/**
|
|
4
|
+
* The trash, across every collection at once.
|
|
5
|
+
*
|
|
6
|
+
* The per-collection API already has `restore` and `purge`; this exists
|
|
7
|
+
* because the panel's trash screen and `GET /trash` (section 10) are one list
|
|
8
|
+
* of everything an editor deleted, and building that by asking every
|
|
9
|
+
* collection in turn would page wrongly and count wrongly.
|
|
10
|
+
*/
|
|
11
|
+
export interface TrashListArgs extends OperationArgs {
|
|
12
|
+
/** Collection name. Omitted means every collection the actor may read. */
|
|
13
|
+
collection?: string;
|
|
14
|
+
limit?: number;
|
|
15
|
+
cursor?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface TrashedEntry {
|
|
18
|
+
collection: string;
|
|
19
|
+
id: string;
|
|
20
|
+
deletedAt: string | null;
|
|
21
|
+
/** When the purge job will remove it; `null` when retention is off. */
|
|
22
|
+
purgeAfter: string | null;
|
|
23
|
+
/** The document itself, with field-level read access already applied. */
|
|
24
|
+
document: JsonObject;
|
|
25
|
+
}
|
|
26
|
+
export interface TrashPage {
|
|
27
|
+
entries: TrashedEntry[];
|
|
28
|
+
limit: number;
|
|
29
|
+
hasNextPage: boolean;
|
|
30
|
+
cursor: string | null;
|
|
31
|
+
}
|
|
32
|
+
export interface TrashTargetArgs extends OperationArgs {
|
|
33
|
+
collection: string;
|
|
34
|
+
id: string;
|
|
35
|
+
}
|
|
36
|
+
export interface CmsTrash {
|
|
37
|
+
/** Newest deletion first. Keyset-paged, like every other list. */
|
|
38
|
+
list(args?: TrashListArgs): Promise<TrashPage>;
|
|
39
|
+
restore(args: TrashTargetArgs): Promise<JsonObject | null>;
|
|
40
|
+
purge(args: TrashTargetArgs): Promise<JsonObject | null>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=trash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trash.d.ts","sourceRoot":"","sources":["../../src/types/trash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC;;;;;;;GAOG;AACH,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uEAAuE;IACvE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,QAAQ,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,QAAQ;IACvB,kEAAkE;IAClE,IAAI,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;CAC1D"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { Actor, OperationSource } from "./actor";
|
|
2
|
+
import type { AnyEventType, CmsEvent } from "./events";
|
|
3
|
+
import type { JsonObject } from "./json";
|
|
4
|
+
/**
|
|
5
|
+
* Webhooks (stage 9, section 7).
|
|
6
|
+
*
|
|
7
|
+
* The delivery half of the outbox. An event is written inside the
|
|
8
|
+
* transaction that caused it and delivered afterwards, so a rolled back
|
|
9
|
+
* write sends nothing and a committed one sends even if the process dies a
|
|
10
|
+
* line later — and a subscriber that is down does not slow a save down, it
|
|
11
|
+
* accumulates retries.
|
|
12
|
+
*/
|
|
13
|
+
export interface WebhookFilters {
|
|
14
|
+
collections?: string[];
|
|
15
|
+
locales?: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface WebhookSubscription {
|
|
18
|
+
id: string;
|
|
19
|
+
url: string;
|
|
20
|
+
/** Event types, or prefixes: `document.*`, or `*` for everything. */
|
|
21
|
+
events: string[];
|
|
22
|
+
filters: WebhookFilters | null;
|
|
23
|
+
headers: Record<string, string> | null;
|
|
24
|
+
/** Whether this subscription signs with its own secret rather than the global one. */
|
|
25
|
+
hasSecret: boolean;
|
|
26
|
+
active: boolean;
|
|
27
|
+
createdAt: string | null;
|
|
28
|
+
updatedAt: string | null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* One attempt to hand one event to one subscriber.
|
|
32
|
+
*
|
|
33
|
+
* `pending` is waiting or being retried, `delivered` succeeded, `failed` is
|
|
34
|
+
* out of attempts — the dead-letter queue is a status rather than a second
|
|
35
|
+
* table, because a replay has to be able to put the same row back in flight.
|
|
36
|
+
*/
|
|
37
|
+
export type WebhookDeliveryStatus = "pending" | "delivered" | "failed";
|
|
38
|
+
export interface WebhookDelivery {
|
|
39
|
+
id: string;
|
|
40
|
+
webhookId: string;
|
|
41
|
+
eventId: string;
|
|
42
|
+
eventType: string;
|
|
43
|
+
status: WebhookDeliveryStatus;
|
|
44
|
+
attempt: number;
|
|
45
|
+
responseStatus: number | null;
|
|
46
|
+
responseBody: string | null;
|
|
47
|
+
error: string | null;
|
|
48
|
+
nextAttemptAt: string | null;
|
|
49
|
+
deliveredAt: string | null;
|
|
50
|
+
createdAt: string | null;
|
|
51
|
+
/** The exact body that was signed and sent. Present when asked for. */
|
|
52
|
+
requestBody?: JsonObject | null;
|
|
53
|
+
}
|
|
54
|
+
export interface WebhookCreateArgs {
|
|
55
|
+
url: string;
|
|
56
|
+
events: string[];
|
|
57
|
+
filters?: WebhookFilters;
|
|
58
|
+
headers?: Record<string, string>;
|
|
59
|
+
/** Overrides `webhooks.signing.secret` for this subscription. */
|
|
60
|
+
secret?: string;
|
|
61
|
+
active?: boolean;
|
|
62
|
+
actor?: Actor | null;
|
|
63
|
+
source?: OperationSource;
|
|
64
|
+
}
|
|
65
|
+
export interface WebhookUpdateArgs extends Partial<WebhookCreateArgs> {
|
|
66
|
+
id: string;
|
|
67
|
+
}
|
|
68
|
+
export interface WebhookListArgs {
|
|
69
|
+
/** Includes inactive subscriptions. They are included by default. */
|
|
70
|
+
active?: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface WebhookDeliveryListArgs {
|
|
73
|
+
webhookId?: string;
|
|
74
|
+
status?: WebhookDeliveryStatus;
|
|
75
|
+
eventId?: string;
|
|
76
|
+
limit?: number;
|
|
77
|
+
cursor?: string;
|
|
78
|
+
/** Includes the request body, which can be large. */
|
|
79
|
+
includeBody?: boolean;
|
|
80
|
+
}
|
|
81
|
+
export interface WebhookDeliveryPage {
|
|
82
|
+
entries: WebhookDelivery[];
|
|
83
|
+
limit: number;
|
|
84
|
+
hasNextPage: boolean;
|
|
85
|
+
cursor: string | null;
|
|
86
|
+
}
|
|
87
|
+
export interface WebhookTestArgs {
|
|
88
|
+
id: string;
|
|
89
|
+
actor?: Actor | null;
|
|
90
|
+
}
|
|
91
|
+
export interface WebhookRetryArgs {
|
|
92
|
+
/** A delivery id. The replay is a new attempt carrying the same event id. */
|
|
93
|
+
id: string;
|
|
94
|
+
actor?: Actor | null;
|
|
95
|
+
}
|
|
96
|
+
/** What one sweep of the retry queue did. */
|
|
97
|
+
export interface WebhookDispatchReport {
|
|
98
|
+
attempted: number;
|
|
99
|
+
delivered: number;
|
|
100
|
+
failed: number;
|
|
101
|
+
}
|
|
102
|
+
export interface CmsWebhooks {
|
|
103
|
+
readonly enabled: boolean;
|
|
104
|
+
list(args?: WebhookListArgs): Promise<WebhookSubscription[]>;
|
|
105
|
+
get(id: string): Promise<WebhookSubscription | null>;
|
|
106
|
+
create(args: WebhookCreateArgs): Promise<WebhookSubscription>;
|
|
107
|
+
update(args: WebhookUpdateArgs): Promise<WebhookSubscription>;
|
|
108
|
+
remove(args: {
|
|
109
|
+
id: string;
|
|
110
|
+
actor?: Actor | null;
|
|
111
|
+
}): Promise<boolean>;
|
|
112
|
+
deliveries(args?: WebhookDeliveryListArgs): Promise<WebhookDeliveryPage>;
|
|
113
|
+
/** Sends a synthetic `webhook.test` event to one subscription, now. */
|
|
114
|
+
test(args: WebhookTestArgs): Promise<WebhookDelivery>;
|
|
115
|
+
/** Replays a delivery: same event, new attempt, new row. */
|
|
116
|
+
retry(args: WebhookRetryArgs): Promise<WebhookDelivery>;
|
|
117
|
+
/**
|
|
118
|
+
* Fans one committed event out to its subscribers.
|
|
119
|
+
*
|
|
120
|
+
* Called by the outbox worker after the commit. It never throws: a
|
|
121
|
+
* subscriber that is down is a retry, not a failed event — making the
|
|
122
|
+
* outbox row fail would replay the event to every *other* subscriber too.
|
|
123
|
+
*/
|
|
124
|
+
dispatch(event: CmsEvent): Promise<void>;
|
|
125
|
+
/** The `webhook-retries` sweep, also registered in `cms.jobs`. */
|
|
126
|
+
drain(args?: {
|
|
127
|
+
now?: Date;
|
|
128
|
+
limit?: number;
|
|
129
|
+
}): Promise<WebhookDispatchReport>;
|
|
130
|
+
/** Whether any active subscription wants this event type. */
|
|
131
|
+
wants(type: AnyEventType): Promise<boolean>;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=webhooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/types/webhooks.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The frozen contracts: every type the engine, the adapters and the plugins
|
|
3
|
+
* agree on. Implementations live elsewhere; this entry point is importable
|
|
4
|
+
* from anywhere, including a Worker that only needs the shapes.
|
|
5
|
+
*/
|
|
6
|
+
export type * from "./types/index";
|
|
7
|
+
export { CmsError, CmsConfigError } from "./errors";
|
|
8
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,mBAAmB,eAAe,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{e,n}from"./index-x72d1hzh.js";export{n as CmsConfigError,e as CmsError};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@heyo-sh/heyo-cms/uploads`.
|
|
3
|
+
*
|
|
4
|
+
* Storage adapters, the image processor contract, and the two pieces of image
|
|
5
|
+
* work the engine does without a codec. Separate from the main entry point so
|
|
6
|
+
* a Worker bundle that never touches a file does not carry any of it.
|
|
7
|
+
*
|
|
8
|
+
* The lifecycle itself — reference counting, orphaning, collection — is not
|
|
9
|
+
* here: it is part of the engine, because it happens inside the transaction
|
|
10
|
+
* that saves a document (section 6).
|
|
11
|
+
*/
|
|
12
|
+
export { local, memory } from "./storage/local";
|
|
13
|
+
export type { LocalStorageOptions, MemoryStorageOptions } from "./storage/local";
|
|
14
|
+
export { azure, gcs, r2, s3, type AzureStorageOptions, type GcsStorageOptions, type R2Binding, type R2StorageOptions, type S3StorageOptions, } from "./storage/providers";
|
|
15
|
+
export { encodeKey, httpStorage, type FetchLike, type HttpStorageOptions, type SignableRequest, } from "./storage/http";
|
|
16
|
+
export { signAwsV4, signAzure, type AwsCredentials, type AwsSignRequest, type AzureSignRequest, } from "./storage/sign";
|
|
17
|
+
export { sharpImages, type SharpImagesOptions } from "./media/sharp";
|
|
18
|
+
export { extensionFor, imageContentType, probeImage, stripImageMetadata, } from "./media/index";
|
|
19
|
+
export type { ObjectMeta, SignedUrlOptions, StorageAdapter, StorageAdapterFactory, StorageConfig, StoredObject, } from "./types/storage";
|
|
20
|
+
export type { CropRect, FocalPoint, ImageFormat, ImageInfo, ImageProcessor, ImageTransform, MediaDocument, MediaStatus, MediaUsage, ProcessedImage, } from "./types/media";
|
|
21
|
+
//# sourceMappingURL=uploads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../src/uploads.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EACL,KAAK,EACL,GAAG,EACH,EAAE,EACF,EAAE,EACF,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,SAAS,EACT,WAAW,EACX,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,SAAS,EACT,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,QAAQ,EACR,UAAU,EACV,WAAW,EACX,SAAS,EACT,cAAc,EACd,cAAc,EACd,aAAa,EACb,WAAW,EACX,UAAU,EACV,cAAc,GACf,MAAM,eAAe,CAAC"}
|
package/dist/uploads.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import"./index-2z1qe5mw.js";import"./index-vxw0a03g.js";import{mo,st,at,ye,ct,qe,zn,dt,ut}from"./index-wj8y1xcj.js";import"./index-g4crf47y.js";import{b}from"./index-cbwwtcm4.js";import{O}from"./index-m82a0shw.js";import{e,n}from"./index-x72d1hzh.js";function j(t={}){let r=new Map,i=O(t.baseUrl??"memory://media");return{id:"memory",async put(s,a,o){r.set(s,{body:await ye(a),meta:o,lastModified:new Date})},async get(s){let a=r.get(s);if(!a)return null;return ct(a.body)},async delete(s){for(let a of s)r.delete(a)},url(s){return`${i}/${s}`},async head(s){let a=r.get(s);if(!a)return null;return{key:s,size:a.body.byteLength,contentType:a.meta.contentType,lastModified:a.lastModified}}}}function T(t){let r=O(t.baseUrl??"/media"),i=async(s)=>{let{join:a,normalize:o,resolve:c}=await import("node:path"),g=c(t.directory),d=c(a(g,o(s)));if(d!==g&&!d.startsWith(`${g}/`))throw new e(`Refusing to write outside the storage root: ${s}`,{status:400,code:"invalid_storage_key"});return d};return{id:"local",...t.prefix===void 0?{}:{prefix:t.prefix},async put(s,a){let{mkdir:o,writeFile:c}=await import("node:fs/promises"),{dirname:g}=await import("node:path"),d=await i(s);await o(g(d),{recursive:!0}),await c(d,await ye(a))},async get(s){let{readFile:a}=await import("node:fs/promises");try{let o=await a(await i(s));return ct(new Uint8Array(o))}catch{return null}},async delete(s){let{rm:a}=await import("node:fs/promises");for(let o of s)await a(await i(o),{force:!0})},url(s){return`${r}/${s}`},async head(s){let{stat:a}=await import("node:fs/promises");try{let o=await a(await i(s));return{key:s,size:o.size,contentType:"application/octet-stream",lastModified:o.mtime}}catch{return null}}}}function A(t){let r=t.fetch??((...a)=>fetch(...a)),i=async(a,o,c={})=>{let g=t.endpoint(o),d=c.body,p=await t.sign({method:a,url:g,headers:{...t.defaultHeaders,...c.headers},payload:d??new Uint8Array(0),contentLength:d?.byteLength??0});return r(g,{method:a,headers:p,...d===void 0?{}:{body:d}})},s=async(a,o,c)=>{let g=(await a.text().catch(()=>"")).slice(0,512);throw new e(`${t.id}: could not ${o} "${c}" (${a.status})${g?`: ${g}`:""}`,{status:502,code:"storage_request_failed"})};return{id:t.id,...t.prefix===void 0?{}:{prefix:t.prefix},async put(a,o,c){let g=await ye(o),d=await i("PUT",a,{body:g,headers:{"content-type":c.contentType,"content-length":String(g.byteLength),...c.cacheControl?{"cache-control":c.cacheControl}:{},...c.contentDisposition?{"content-disposition":c.contentDisposition}:{},...L(t.id,c.metadata)}});if(!d.ok)await s(d,"store",a)},async get(a){let o=await i("GET",a);if(o.status===404)return null;if(!o.ok)await s(o,"read",a);return o.body},async delete(a){for(let o of a){let c=await i("DELETE",o);if(!c.ok&&c.status!==404)await s(c,"delete",o)}},url(a){return t.publicUrl(a)},...t.signedUrl===void 0?{}:{signedUrl:t.signedUrl.bind(t)},async head(a){let o=await i("HEAD",a);if(o.status===404)return null;if(!o.ok)await s(o,"stat",a);let c=o.headers.get("last-modified");return{key:a,size:Number(o.headers.get("content-length")??0),contentType:o.headers.get("content-type")??"application/octet-stream",...c?{lastModified:new Date(c)}:{}}}}}function L(t,r){if(!r)return{};let i=t==="azure"?"x-ms-meta-":"x-amz-meta-";return Object.fromEntries(Object.entries(r).map(([s,a])=>[`${i}${s.toLowerCase()}`,a]))}function f(t){return t.split("/").map((r)=>encodeURIComponent(r)).join("/")}var k="UNSIGNED-PAYLOAD";async function x(t){let i=(t.now??new Date).toISOString().replace(/[-:]/g,"").replace(/\.\d{3}/,""),s=i.slice(0,8),a=t.payload===k?k:qe(await dt(t.payload)),o={...t.headers,host:t.url.host,"x-amz-date":i,"x-amz-content-sha256":a,...t.credentials.sessionToken?{"x-amz-security-token":t.credentials.sessionToken}:{}},c=Object.entries(o).map(([l,y])=>[l.toLowerCase(),y.trim().replace(/\s+/g," ")]).sort((l,y)=>l[0]<y[0]?-1:l[0]>y[0]?1:0),g=c.map(([l])=>l).join(";"),d=[t.method.toUpperCase(),E(t.url.pathname),_(t.url),`${c.map(([l,y])=>`${l}:${y}`).join(`
|
|
2
|
+
`)}
|
|
3
|
+
`,g,a].join(`
|
|
4
|
+
`),p=`${s}/${t.region}/${t.service}/aws4_request`,u=["AWS4-HMAC-SHA256",i,p,qe(await dt(d))].join(`
|
|
5
|
+
`),h=await z(t.credentials.secretAccessKey,s,t.region,t.service),M=qe(await S(h,u));return{...o,authorization:`AWS4-HMAC-SHA256 Credential=${t.credentials.accessKeyId}/${p}, SignedHeaders=${g}, Signature=${M}`}}async function I(t){let r=t.now??new Date,i={...t.headers,"x-ms-date":r.toUTCString(),"x-ms-version":"2021-08-06"},s=Object.entries(i).map(([d,p])=>[d.toLowerCase(),p.trim()]).filter(([d])=>d.startsWith("x-ms-")).sort((d,p)=>d[0]<p[0]?-1:1).map(([d,p])=>`${d}:${p}`).join(`
|
|
6
|
+
`),a=[...t.url.searchParams.keys()].map((d)=>d.toLowerCase()).sort().map((d)=>`${d}:${t.url.searchParams.getAll(d).sort().join(",")}`).join(`
|
|
7
|
+
`),o=`/${t.account}${decodeURIComponent(t.url.pathname)}`+(a?`
|
|
8
|
+
${a}`:""),c=[t.method.toUpperCase(),i["content-encoding"]??"",i["content-language"]??"",t.contentLength?String(t.contentLength):"",i["content-md5"]??"",i["content-type"]??"","","","","","","",s,o].join(`
|
|
9
|
+
`),g=zn(await S(K(t.key),c));return{...i,authorization:`SharedKey ${t.account}:${g}`}}async function z(t,r,i,s){let o=await S(new TextEncoder().encode(`AWS4${t}`),r);return o=await S(o,i),o=await S(o,s),S(o,"aws4_request")}async function S(t,r){let i=await crypto.subtle.importKey("raw",t,{name:"HMAC",hash:"SHA-256"},!1,["sign"]),s=await crypto.subtle.sign("HMAC",i,new TextEncoder().encode(r));return new Uint8Array(s)}function E(t){return t.split("/").map((r)=>R(decodeURIComponent(r))).join("/")}function _(t){return[...t.searchParams.entries()].map(([r,i])=>[R(r),R(i)]).sort((r,i)=>r[0]<i[0]?-1:1).map(([r,i])=>`${r}=${i}`).join("&")}function R(t){return encodeURIComponent(t).replace(/[!'()*]/g,(r)=>`%${r.charCodeAt(0).toString(16).toUpperCase()}`)}function K(t){let r=atob(t);return Uint8Array.from(r,(i)=>i.charCodeAt(0))}var D="1h";function B(t){if(!t.bucket)throw new n("uploads.storage","s3() needs a bucket");if(!t.region&&!t.endpoint)throw new n("uploads.storage","s3() needs a region, or an endpoint for an S3-compatible service");if(t.signedUrls?.expiresIn)b(t.signedUrls.expiresIn,"uploads.storage.signedUrls");return()=>P("s3",t,"s3")}function F(t){if(G(t))return()=>N(t);let r=t;if(!r.accountId)throw new n("uploads.storage","r2() needs an accountId, or an R2 bucket binding");return()=>P("r2",{...r,region:"auto",endpoint:`https://${r.accountId}.r2.cloudflarestorage.com`,forcePathStyle:!0},"s3")}function H(t){if(!t.bucket)throw new n("uploads.storage","gcs() needs a bucket");return()=>P("gcs",{...t,region:t.region??"auto",endpoint:"https://storage.googleapis.com",forcePathStyle:!0},"s3")}function v(t){if(!t.account||!t.container)throw new n("uploads.storage","azure() needs an account and a container");return()=>{let r=U(t.accountKey??w("AZURE_STORAGE_KEY"),"azure()","an account key","AZURE_STORAGE_KEY"),i=`https://${t.account}.blob.core.windows.net/${t.container}`,s=O(t.publicUrl??i);return A({id:"azure",...t.fetch===void 0?{}:{fetch:t.fetch},...t.prefix===void 0?{}:{prefix:t.prefix},endpoint:(a)=>new URL(`${i}/${f(a)}`),publicUrl:(a)=>`${s}/${f(a)}`,defaultHeaders:{"x-ms-blob-type":"BlockBlob"},sign:(a)=>I({method:a.method,url:a.url,headers:a.headers,account:t.account,key:r,contentLength:a.contentLength})})}}function P(t,r,i){let s={accessKeyId:U(r.accessKeyId??w("AWS_ACCESS_KEY_ID"),`${t}()`,"an access key id","AWS_ACCESS_KEY_ID"),secretAccessKey:U(r.secretAccessKey??w("AWS_SECRET_ACCESS_KEY"),`${t}()`,"a secret access key","AWS_SECRET_ACCESS_KEY"),...r.sessionToken??w("AWS_SESSION_TOKEN")?{sessionToken:r.sessionToken??w("AWS_SESSION_TOKEN")}:{}},a=r.region??"us-east-1",o=r.forcePathStyle===!0||Boolean(r.endpoint),c=r.endpoint?O(r.endpoint):`https://s3.${a}.amazonaws.com`,g=o?`${c}/${r.bucket}`:Y(c,r.bucket),d=O(r.publicUrl??g),p=()=>Math.floor(b(r.signedUrls?.expiresIn??D)/1000);return A({id:t,...r.fetch===void 0?{}:{fetch:r.fetch},...r.prefix===void 0?{}:{prefix:r.prefix},endpoint:(u)=>new URL(`${g}/${f(u)}`),publicUrl:(u)=>`${d}/${f(u)}`,...r.acl===void 0?{}:{defaultHeaders:{"x-amz-acl":r.acl}},sign:(u)=>x({method:u.method,url:u.url,headers:u.headers,payload:u.payload,region:a,service:i,credentials:s}),signedUrl:(u,h)=>W({url:new URL(`${g}/${f(u)}`),region:a,service:i,credentials:s,expiresIn:X(h?.expiresIn)??p(),...h?.download===!0?{disposition:`attachment${h.filename?`; filename="${h.filename}"`:""}`}:{}})})}async function W(t){let r=new Date,i=r.toISOString().replace(/[-:]/g,"").replace(/\.\d{3}/,""),s=`${i.slice(0,8)}/${t.region}/${t.service}/aws4_request`,a=new URL(t.url.toString());if(a.searchParams.set("X-Amz-Algorithm","AWS4-HMAC-SHA256"),a.searchParams.set("X-Amz-Credential",`${t.credentials.accessKeyId}/${s}`),a.searchParams.set("X-Amz-Date",i),a.searchParams.set("X-Amz-Expires",String(t.expiresIn)),a.searchParams.set("X-Amz-SignedHeaders","host"),t.credentials.sessionToken)a.searchParams.set("X-Amz-Security-Token",t.credentials.sessionToken);if(t.disposition)a.searchParams.set("response-content-disposition",t.disposition);let o=await x({method:"GET",url:a,headers:{},payload:"UNSIGNED-PAYLOAD",region:t.region,service:t.service,credentials:{...t.credentials,sessionToken:void 0},now:r}),c=/Signature=([a-f0-9]+)/.exec(o.authorization??"")?.[1];return a.searchParams.set("X-Amz-Signature",c??""),a.toString()}function N(t){return{id:"r2",async put(r,i,s){await t.put(r,i,{httpMetadata:{contentType:s.contentType,...s.cacheControl?{cacheControl:s.cacheControl}:{}},...s.metadata?{customMetadata:s.metadata}:{}})},async get(r){let i=await t.get(r);return i?i.body:null},async delete(r){if(r.length>0)await t.delete(r)},url(r){return`/${r}`},async head(r){let i=await t.head(r);if(!i)return null;return{key:r,size:i.size,contentType:i.httpMetadata?.contentType??"application/octet-stream",...i.uploaded?{lastModified:i.uploaded}:{}}}}}function G(t){return typeof t==="object"&&t!==null&&typeof t.get==="function"&&typeof t.put==="function"&&typeof t.head==="function"}function Y(t,r){let i=new URL(t);return i.host=`${r}.${i.host}`,i.toString().replace(/\/+$/,"")}function w(t){return globalThis.process?.env?.[t]}function U(t,r,i,s){if(t)return t;throw new e(`${r} needs ${i}; pass it in the configuration or set ${s}`,{status:500,code:"storage_credentials_missing"})}function X(t){if(t===void 0)return;return typeof t==="number"?t:Math.floor(b(t)/1000)}var V=new Set(["image/jpeg","image/png","image/webp","image/avif","image/gif","image/tiff"]),C;async function Z(){return C??=(async()=>{try{let r=await import("sharp");return r.default??r}catch{throw new e("sharpImages() needs the optional `sharp` package; install it, or configure uploads.images without transformations.",{status:500,code:"image_processor_missing"})}})(),C}function Q(t={}){return{id:"sharp",supports:(r)=>V.has(r.toLowerCase()),async transform(r,i,s){let o=(await Z())(r,{...t.limitInputPixels===void 0?{}:{limitInputPixels:t.limitInputPixels}});if(t.autoOrient!==!1)o=o.rotate();let{width:c,height:g}=s,d=J(c,g,i);if(d)o=o.extract(d),c=d.width,g=d.height;if(i.width!==void 0||i.height!==void 0)o=o.resize({...i.width===void 0?{}:{width:i.width},...i.height===void 0?{}:{height:i.height},fit:i.fit??"inside",withoutEnlargement:!0});let p=i.format??te(s.contentType);if(o=o.toFormat(p,{...i.quality===void 0?{}:{quality:i.quality}}),i.stripMetadata===!1)o=o.keepMetadata();let u=await o.toBuffer({resolveWithObject:!0});return{data:u.data,contentType:`image/${u.info.format}`,width:u.info.width,height:u.info.height}}}}function J(t,r,i){if(t<=0||r<=0)return null;let s=i.crop&&ee(i.crop,t,r),a=s||{left:0,top:0,width:t,height:r},o=i.fit==="cover"&&i.position&&i.width&&i.height?q(a.width,a.height,i.width/i.height,{x:(i.position.x*t-a.left)/a.width,y:(i.position.y*r-a.top)/a.height}):null;if(!o)return s||null;return{left:a.left+o.left,top:a.top+o.top,width:o.width,height:o.height}}function q(t,r,i,s){if(t<=0||r<=0||!Number.isFinite(i)||i<=0)return null;let a=t/r,o=a>i?m(Math.round(r*i),1,t):t,c=a>i?r:m(Math.round(t/i),1,r);if(o>=t&&c>=r)return null;return{left:m(Math.round(s.x*t-o/2),0,t-o),top:m(Math.round(s.y*r-c/2),0,r-c),width:o,height:c}}function ee(t,r,i){let s=m(Math.round(t.x),0,Math.max(r-1,0)),a=m(Math.round(t.y),0,Math.max(i-1,0)),o=m(Math.round(t.width),1,r-s),c=m(Math.round(t.height),1,i-a);if(o<=0||c<=0)return null;return{left:s,top:a,width:o,height:c}}function m(t,r,i){return Math.min(Math.max(t,r),Math.max(r,i))}function te(t){let r=t.split("/")[1]??"jpeg";return r==="jpg"?"jpeg":r}export{v as azure,f as encodeKey,at as extensionFor,H as gcs,A as httpStorage,mo as imageContentType,T as local,j as memory,st as probeImage,F as r2,B as s3,Q as sharpImages,x as signAwsV4,I as signAzure,ut as stripImageMetadata};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook delivery (section 7).
|
|
3
|
+
*
|
|
4
|
+
* The outbox decides *that* an event happened; this directory decides who
|
|
5
|
+
* hears about it and keeps trying until they do.
|
|
6
|
+
*/
|
|
7
|
+
export { createWebhooks, type WebhookRuntime } from "./service";
|
|
8
|
+
export { webhookRetryJob } from "./job";
|
|
9
|
+
export { signatureHeader, signPayload, verifySignature } from "./sign";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webhooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { JobDefinition } from "../engine/jobs";
|
|
2
|
+
import type { WebhookRuntime } from "./service";
|
|
3
|
+
/**
|
|
4
|
+
* The retry sweep.
|
|
5
|
+
*
|
|
6
|
+
* Registered in `cms.jobs` only when webhooks are enabled, so
|
|
7
|
+
* `cms.inspect().jobs` lists what will actually run. The first attempt
|
|
8
|
+
* happens inline, right after the commit: this is for the ones that did not
|
|
9
|
+
* land, and it is the reason an outage at a subscriber costs them a delay
|
|
10
|
+
* rather than the event.
|
|
11
|
+
*
|
|
12
|
+
* `exists` next to `lte` for the same reason the scheduled-change sweep needs
|
|
13
|
+
* it: on MongoDB a missing `next_attempt_at` compares below a date, so a
|
|
14
|
+
* delivery that has never been attempted would look due on every pass.
|
|
15
|
+
*/
|
|
16
|
+
export declare function webhookRetryJob(webhooks: WebhookRuntime): JobDefinition;
|
|
17
|
+
//# sourceMappingURL=job.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../src/webhooks/job.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAW,MAAM,gBAAgB,CAAC;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,CAgCvE"}
|