@heyo-sh/heyo-cms 0.1.0 → 0.2.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.
Files changed (147) hide show
  1. package/dist/adapters/astro.d.ts +12 -5
  2. package/dist/adapters/astro.d.ts.map +1 -1
  3. package/dist/adapters/astro.js +1 -1
  4. package/dist/adapters/deliver.d.ts +26 -0
  5. package/dist/adapters/deliver.d.ts.map +1 -0
  6. package/dist/adapters/next.d.ts +26 -12
  7. package/dist/adapters/next.d.ts.map +1 -1
  8. package/dist/adapters/next.js +1 -1
  9. package/dist/adapters/nuxt.d.ts +10 -6
  10. package/dist/adapters/nuxt.d.ts.map +1 -1
  11. package/dist/adapters/nuxt.js +1 -1
  12. package/dist/adapters/react-router.d.ts +12 -5
  13. package/dist/adapters/react-router.d.ts.map +1 -1
  14. package/dist/adapters/react-router.js +1 -1
  15. package/dist/adapters/sveltekit.d.ts +9 -5
  16. package/dist/adapters/sveltekit.d.ts.map +1 -1
  17. package/dist/adapters/sveltekit.js +1 -1
  18. package/dist/ai.js +1 -1
  19. package/dist/auth.js +1 -1
  20. package/dist/cli.js +2 -2
  21. package/dist/client/index.d.ts.map +1 -1
  22. package/dist/client/types.d.ts +24 -1
  23. package/dist/client/types.d.ts.map +1 -1
  24. package/dist/client.js +1 -1
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +1 -1
  27. package/dist/content.js +1 -1
  28. package/dist/db/d1.js +1 -1
  29. package/dist/db/mongodb.js +2 -2
  30. package/dist/db/postgres.js +1 -1
  31. package/dist/db/sql/dialect.d.ts +2 -0
  32. package/dist/db/sql/dialect.d.ts.map +1 -1
  33. package/dist/db/sqlite.d.ts +13 -2
  34. package/dist/db/sqlite.d.ts.map +1 -1
  35. package/dist/db/sqlite.js +1 -1
  36. package/dist/editor/builtin.d.ts.map +1 -1
  37. package/dist/editor/serialize.d.ts.map +1 -1
  38. package/dist/editor.d.ts +1 -1
  39. package/dist/editor.d.ts.map +1 -1
  40. package/dist/editor.js +1 -1
  41. package/dist/engine/engine.d.ts +19 -0
  42. package/dist/engine/engine.d.ts.map +1 -1
  43. package/dist/engine/slugs.d.ts +124 -0
  44. package/dist/engine/slugs.d.ts.map +1 -0
  45. package/dist/fields/builtin.d.ts +42 -15
  46. package/dist/fields/builtin.d.ts.map +1 -1
  47. package/dist/fields.d.ts +1 -0
  48. package/dist/fields.d.ts.map +1 -1
  49. package/dist/fields.js +1 -1
  50. package/dist/http/handler.d.ts.map +1 -1
  51. package/dist/http/rich-text.d.ts +12 -1
  52. package/dist/http/rich-text.d.ts.map +1 -1
  53. package/dist/http/routes/documents.d.ts.map +1 -1
  54. package/dist/http/routes/media.d.ts +30 -0
  55. package/dist/http/routes/media.d.ts.map +1 -1
  56. package/dist/http.js +1 -1
  57. package/dist/index-2ddk43me.js +2 -0
  58. package/dist/index-2prbs05k.js +2 -0
  59. package/dist/index-385ggnge.js +2 -0
  60. package/dist/{index-7k091gpe.js → index-466cwb0b.js} +2 -2
  61. package/dist/{index-b2ecggck.js → index-4qrep5f0.js} +6 -6
  62. package/dist/{index-k8wbg1dw.js → index-67e458ws.js} +2 -2
  63. package/dist/index-6m1kjq9g.js +2 -0
  64. package/dist/index-6w10rch0.js +3 -0
  65. package/dist/index-761dec5z.js +2 -0
  66. package/dist/{index-2kb5nbxx.js → index-8nzmqy0f.js} +2 -2
  67. package/dist/{index-vq2978e7.js → index-8x2em6c8.js} +8 -8
  68. package/dist/index-91fa1gzf.js +2 -0
  69. package/dist/index-a8jcwqsf.js +2 -0
  70. package/dist/index-abfzb1ve.js +2 -0
  71. package/dist/index-cv0hpz3d.js +2 -0
  72. package/dist/index-g041kfa5.js +18 -0
  73. package/dist/index-hbx67b20.js +7 -0
  74. package/dist/index-hpast878.js +40 -0
  75. package/dist/index-kc1j3h6z.js +2 -0
  76. package/dist/index-p2cqsmvw.js +2 -0
  77. package/dist/index-rg9tpg3p.js +5 -0
  78. package/dist/{index-cbwwtcm4.js → index-rw0hze6x.js} +2 -2
  79. package/dist/index-s9x07zb3.js +2 -0
  80. package/dist/index-sgdnp83t.js +2 -0
  81. package/dist/{index-34s342fz.js → index-szaq03qq.js} +2 -2
  82. package/dist/{index-9x1z3b85.js → index-vkwzdfte.js} +4 -4
  83. package/dist/{index-gpwcmmvr.js → index-vzhxn50e.js} +2 -2
  84. package/dist/index-y8kzzn94.js +2 -0
  85. package/dist/{index-7a231xfp.js → index-ypcmns0v.js} +2 -2
  86. package/dist/index.js +1 -1
  87. package/dist/jobs.js +1 -1
  88. package/dist/media/cloudflare.d.ts +58 -0
  89. package/dist/media/cloudflare.d.ts.map +1 -0
  90. package/dist/media/document.d.ts +7 -6
  91. package/dist/media/document.d.ts.map +1 -1
  92. package/dist/media/gc.d.ts.map +1 -1
  93. package/dist/media/pipeline.d.ts +19 -0
  94. package/dist/media/pipeline.d.ts.map +1 -1
  95. package/dist/media/service.d.ts.map +1 -1
  96. package/dist/media/urls.d.ts +77 -0
  97. package/dist/media/urls.d.ts.map +1 -0
  98. package/dist/media/usages.d.ts +9 -1
  99. package/dist/media/usages.d.ts.map +1 -1
  100. package/dist/media/variants.d.ts +11 -0
  101. package/dist/media/variants.d.ts.map +1 -1
  102. package/dist/migrations.js +1 -1
  103. package/dist/plugins/indexnow.d.ts +82 -0
  104. package/dist/plugins/indexnow.d.ts.map +1 -0
  105. package/dist/plugins.d.ts +9 -0
  106. package/dist/plugins.d.ts.map +1 -0
  107. package/dist/plugins.js +1 -0
  108. package/dist/query.js +1 -1
  109. package/dist/{run-3r72dwhs.js → run-bjge3v8e.js} +4 -4
  110. package/dist/schema/snapshot.d.ts +2 -0
  111. package/dist/schema/snapshot.d.ts.map +1 -1
  112. package/dist/schema/system.d.ts +9 -0
  113. package/dist/schema/system.d.ts.map +1 -1
  114. package/dist/schema.js +1 -1
  115. package/dist/slugify.d.ts +31 -0
  116. package/dist/slugify.d.ts.map +1 -0
  117. package/dist/telemetry.js +1 -1
  118. package/dist/types/api.d.ts +56 -0
  119. package/dist/types/api.d.ts.map +1 -1
  120. package/dist/types/config.d.ts +15 -0
  121. package/dist/types/config.d.ts.map +1 -1
  122. package/dist/types/editor.d.ts +26 -0
  123. package/dist/types/editor.d.ts.map +1 -1
  124. package/dist/types/media.d.ts +97 -0
  125. package/dist/types/media.d.ts.map +1 -1
  126. package/dist/types/plugin.d.ts +23 -1
  127. package/dist/types/plugin.d.ts.map +1 -1
  128. package/dist/uploads.d.ts +1 -0
  129. package/dist/uploads.d.ts.map +1 -1
  130. package/dist/uploads.js +4 -4
  131. package/dist/webhooks.js +1 -1
  132. package/package.json +9 -5
  133. package/dist/index-2757kej5.js +0 -2
  134. package/dist/index-2z1qe5mw.js +0 -2
  135. package/dist/index-5ngtc7gy.js +0 -2
  136. package/dist/index-9zqnf6gx.js +0 -23
  137. package/dist/index-hq05mc1n.js +0 -3
  138. package/dist/index-hy1x46nf.js +0 -2
  139. package/dist/index-kbsgt44t.js +0 -2
  140. package/dist/index-m82a0shw.js +0 -2
  141. package/dist/index-md79xr6h.js +0 -5
  142. package/dist/index-nvgwyykk.js +0 -40
  143. package/dist/index-ty698y02.js +0 -2
  144. package/dist/index-vxw0a03g.js +0 -2
  145. package/dist/index-wj8y1xcj.js +0 -2
  146. package/dist/index-y5mwknr9.js +0 -2
  147. package/dist/index-ymq6jsar.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/types/media.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/types/media.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { Actor } from "./actor";
2
2
  import type { CollectionDefinition } from "./config";
3
3
  import type { DatabaseAdapter } from "./database";
4
+ import type { AnyEventType, CmsEventListener } from "./events";
4
5
  import type { FieldsConfig } from "./fields";
5
6
  import type { CollectionDatabaseHooks, HookContext, HookOperation, HookResult, MaybePromise, ScopedDb } from "./hooks";
6
7
  import type { CmsInstance } from "./instance";
@@ -71,8 +72,19 @@ export interface OpenApiRouteSpec {
71
72
  }
72
73
  export interface RouteDefinition {
73
74
  method: RouteMethod;
74
- /** Relative to `basePath`, e.g. `/analytics/pageviews`. */
75
+ /** Relative to `basePath`, e.g. `/analytics/pageviews`; absolute with `root`. */
75
76
  path: string;
77
+ /**
78
+ * Matched against the whole URL path instead of below `basePath`.
79
+ *
80
+ * For the files a site has to serve at a fixed address — a verification
81
+ * file at `/<key>.txt`, the public media path — which a crawler fetches
82
+ * from the root and nothing can move. The application mounts the CMS
83
+ * handler on that path too; a request that never reaches the handler is
84
+ * never answered. Root routes are public: no actor is resolved and the
85
+ * HTTP hooks do not run, because they serve files, not the API.
86
+ */
87
+ root?: boolean;
76
88
  handler: (context: RouteContext) => Response | Promise<Response>;
77
89
  middleware?: ((context: RouteContext, next: () => Promise<Response>) => Promise<Response>)[];
78
90
  openapi?: OpenApiRouteSpec;
@@ -164,6 +176,16 @@ export interface CmsPlugin<Ext = Record<string, never>> {
164
176
  migrations?: PluginMigration[];
165
177
  extendCollections?: (context: PluginContext) => CollectionPatch[];
166
178
  hooks?: HookRegistration[];
179
+ /**
180
+ * Listeners for committed events, as `cms.on()` would register them.
181
+ *
182
+ * The place for a side effect that must not happen unless the write did:
183
+ * a ping to a search engine, a cache purge, a message. Delivered from the
184
+ * outbox after the commit — never for a rolled back write, retried with
185
+ * backoff when a listener throws — so a listener must tolerate seeing an
186
+ * event twice (`event.id` is stable). `"*"` receives every event.
187
+ */
188
+ events?: Partial<Record<AnyEventType, CmsEventListener>>;
167
189
  /** Registered under `basePath` automatically, exactly like core routes. */
168
190
  routes?: RouteDefinition[];
169
191
  client?: ClientExtension<Ext>;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"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"}
package/dist/uploads.d.ts CHANGED
@@ -15,6 +15,7 @@ export { azure, gcs, r2, s3, type AzureStorageOptions, type GcsStorageOptions, t
15
15
  export { encodeKey, httpStorage, type FetchLike, type HttpStorageOptions, type SignableRequest, } from "./storage/http";
16
16
  export { signAwsV4, signAzure, type AwsCredentials, type AwsSignRequest, type AzureSignRequest, } from "./storage/sign";
17
17
  export { sharpImages, type SharpImagesOptions } from "./media/sharp";
18
+ export { cloudflareImages, type CloudflareImageOutput, type CloudflareImagesBinding, type CloudflareImagesSource, type CloudflareImageTransformer, } from "./media/cloudflare";
18
19
  export { extensionFor, imageContentType, probeImage, stripImageMetadata, } from "./media/index";
19
20
  export type { ObjectMeta, SignedUrlOptions, StorageAdapter, StorageAdapterFactory, StorageConfig, StoredObject, } from "./types/storage";
20
21
  export type { CropRect, FocalPoint, ImageFormat, ImageInfo, ImageProcessor, ImageTransform, MediaDocument, MediaStatus, MediaUsage, ProcessedImage, } from "./types/media";
@@ -1 +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"}
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,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,GAChC,MAAM,oBAAoB,CAAC;AAC5B,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 CHANGED
@@ -1,9 +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(`
1
+ import"./index-sgdnp83t.js";import"./index-abfzb1ve.js";import"./index-6m1kjq9g.js";import{xo,Ee,Me,xe,wt,Ve,Yn,vt,Ge}from"./index-kc1j3h6z.js";import"./index-g4crf47y.js";import"./index-91fa1gzf.js";import{w}from"./index-rw0hze6x.js";import{x}from"./index-2ddk43me.js";import{e,n}from"./index-x72d1hzh.js";function j(t={}){let r=new Map,i=x(t.baseUrl??"memory://media");return{id:"memory",async put(s,a,o){r.set(s,{body:await xe(a),meta:o,lastModified:new Date})},async get(s){let a=r.get(s);if(!a)return null;return wt(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 L(t){let r=x(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 xe(a))},async get(s){let{readFile:a}=await import("node:fs/promises");try{let o=await a(await i(s));return wt(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 I(t){let r=t.fetch??((...a)=>fetch(...a)),i=async(a,o,c={})=>{let g=t.endpoint(o),d=c.body,u=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:u,...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 xe(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}:{},...E(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 E(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 h(t){return t.split("/").map((r)=>encodeURIComponent(r)).join("/")}var P="UNSIGNED-PAYLOAD";async function A(t){let i=(t.now??new Date).toISOString().replace(/[-:]/g,"").replace(/\.\d{3}/,""),s=i.slice(0,8),a=t.payload===P?P:Ve(await vt(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(([m,y])=>[m.toLowerCase(),y.trim().replace(/\s+/g," ")]).sort((m,y)=>m[0]<y[0]?-1:m[0]>y[0]?1:0),g=c.map(([m])=>m).join(";"),d=[t.method.toUpperCase(),_(t.url.pathname),B(t.url),`${c.map(([m,y])=>`${m}:${y}`).join(`
2
2
  `)}
3
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(`
4
+ `),u=`${s}/${t.region}/${t.service}/aws4_request`,l=["AWS4-HMAC-SHA256",i,u,Ve(await vt(d))].join(`
5
+ `),p=await z(t.credentials.secretAccessKey,s,t.region,t.service),T=Ve(await S(p,l));return{...o,authorization:`AWS4-HMAC-SHA256 Credential=${t.credentials.accessKeyId}/${u}, SignedHeaders=${g}, Signature=${T}`}}async function O(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,u])=>[d.toLowerCase(),u.trim()]).filter(([d])=>d.startsWith("x-ms-")).sort((d,u)=>d[0]<u[0]?-1:1).map(([d,u])=>`${d}:${u}`).join(`
6
6
  `),a=[...t.url.searchParams.keys()].map((d)=>d.toLowerCase()).sort().map((d)=>`${d}:${t.url.searchParams.getAll(d).sort().join(",")}`).join(`
7
7
  `),o=`/${t.account}${decodeURIComponent(t.url.pathname)}`+(a?`
8
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};
9
+ `),g=Yn(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 _(t){return t.split("/").map((r)=>R(decodeURIComponent(r))).join("/")}function B(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 F(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)w(t.signedUrls.expiresIn,"uploads.storage.signedUrls");return()=>C("s3",t,"s3")}function H(t){if(Y(t))return()=>G(t);let r=t;if(!r.accountId)throw new n("uploads.storage","r2() needs an accountId, or an R2 bucket binding");return()=>C("r2",{...r,region:"auto",endpoint:`https://${r.accountId}.r2.cloudflarestorage.com`,forcePathStyle:!0},"s3")}function v(t){if(!t.bucket)throw new n("uploads.storage","gcs() needs a bucket");return()=>C("gcs",{...t,region:t.region??"auto",endpoint:"https://storage.googleapis.com",forcePathStyle:!0},"s3")}function W(t){if(!t.account||!t.container)throw new n("uploads.storage","azure() needs an account and a container");return()=>{let r=U(t.accountKey??b("AZURE_STORAGE_KEY"),"azure()","an account key","AZURE_STORAGE_KEY"),i=`https://${t.account}.blob.core.windows.net/${t.container}`,s=x(t.publicUrl??i);return I({id:"azure",...t.fetch===void 0?{}:{fetch:t.fetch},...t.prefix===void 0?{}:{prefix:t.prefix},endpoint:(a)=>new URL(`${i}/${h(a)}`),publicUrl:(a)=>`${s}/${h(a)}`,defaultHeaders:{"x-ms-blob-type":"BlockBlob"},sign:(a)=>O({method:a.method,url:a.url,headers:a.headers,account:t.account,key:r,contentLength:a.contentLength})})}}function C(t,r,i){let s={accessKeyId:U(r.accessKeyId??b("AWS_ACCESS_KEY_ID"),`${t}()`,"an access key id","AWS_ACCESS_KEY_ID"),secretAccessKey:U(r.secretAccessKey??b("AWS_SECRET_ACCESS_KEY"),`${t}()`,"a secret access key","AWS_SECRET_ACCESS_KEY"),...r.sessionToken??b("AWS_SESSION_TOKEN")?{sessionToken:r.sessionToken??b("AWS_SESSION_TOKEN")}:{}},a=r.region??"us-east-1",o=r.forcePathStyle===!0||Boolean(r.endpoint),c=r.endpoint?x(r.endpoint):`https://s3.${a}.amazonaws.com`,g=o?`${c}/${r.bucket}`:X(c,r.bucket),d=x(r.publicUrl??g),u=()=>Math.floor(w(r.signedUrls?.expiresIn??D)/1000);return I({id:t,...r.fetch===void 0?{}:{fetch:r.fetch},...r.prefix===void 0?{}:{prefix:r.prefix},endpoint:(l)=>new URL(`${g}/${h(l)}`),publicUrl:(l)=>`${d}/${h(l)}`,...r.acl===void 0?{}:{defaultHeaders:{"x-amz-acl":r.acl}},sign:(l)=>A({method:l.method,url:l.url,headers:l.headers,payload:l.payload,region:a,service:i,credentials:s}),signedUrl:(l,p)=>N({url:new URL(`${g}/${h(l)}`),region:a,service:i,credentials:s,expiresIn:V(p?.expiresIn)??u(),...p?.download===!0?{disposition:`attachment${p.filename?`; filename="${p.filename}"`:""}`}:{}})})}async function N(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 A({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 G(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 Y(t){return typeof t==="object"&&t!==null&&typeof t.get==="function"&&typeof t.put==="function"&&typeof t.head==="function"}function X(t,r){let i=new URL(t);return i.host=`${r}.${i.host}`,i.toString().replace(/\/+$/,"")}function b(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 V(t){if(t===void 0)return;return typeof t==="number"?t:Math.floor(w(t)/1000)}var Z=new Set(["image/jpeg","image/png","image/webp","image/avif","image/gif","image/tiff"]),k;async function Q(){return k??=(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"})}})(),k}function J(t={}){return{id:"sharp",supports:(r)=>Z.has(r.toLowerCase()),async transform(r,i,s){let o=(await Q())(r,{...t.limitInputPixels===void 0?{}:{limitInputPixels:t.limitInputPixels}});if(t.autoOrient!==!1)o=o.rotate();let{width:c,height:g}=s,d=M(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 u=i.format??te(s.contentType);if(o=o.toFormat(u,{...i.quality===void 0?{}:{quality:i.quality}}),i.stripMetadata===!1)o=o.keepMetadata();let l=await o.toBuffer({resolveWithObject:!0});return{data:l.data,contentType:`image/${l.info.format}`,width:l.info.width,height:l.info.height}}}}function M(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?f(Math.round(r*i),1,t):t,c=a>i?r:f(Math.round(t/i),1,r);if(o>=t&&c>=r)return null;return{left:f(Math.round(s.x*t-o/2),0,t-o),top:f(Math.round(s.y*r-c/2),0,r-c),width:o,height:c}}function ee(t,r,i){let s=f(Math.round(t.x),0,Math.max(r-1,0)),a=f(Math.round(t.y),0,Math.max(i-1,0)),o=f(Math.round(t.width),1,r-s),c=f(Math.round(t.height),1,i-a);if(o<=0||c<=0)return null;return{left:s,top:a,width:o,height:c}}function f(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}var ne=new Set(["image/jpeg","image/png","image/gif","image/webp"]);function re(t){return{id:"cloudflare-images",supports:(r)=>ne.has(r.toLowerCase()),async transform(r,i,s){let a=typeof t==="function"?await t():t;if(!a)throw new e('cloudflareImages() has no Images binding: add `"images": { "binding": "IMAGES" }` to wrangler.json and pass the binding (or a function returning it) to cloudflareImages().',{status:500,code:"image_processor_missing"});let o=ie(s,i),c=a.input(oe(r));if(o.options)c=c.transform(o.options);let g=await c.output({format:i.format?`image/${i.format}`:ae(s.contentType),...i.quality===void 0?{}:{quality:i.quality}}),d=new Uint8Array(await new Response(g.image()).arrayBuffer()),u=Ee(d);return{data:d,contentType:g.contentType(),width:u?.width??o.width,height:u?.height??o.height}}}}function ie(t,r){let i={},s=M(t.width,t.height,r),a=s?.width??t.width,o=s?.height??t.height;if(s)i.trim={top:s.top,left:s.left,width:s.width,height:s.height};let c=a,g=o,{width:d,height:u}=r,l=r.fit??"inside";if(d!==void 0||u!==void 0)if(l==="cover"&&d!==void 0&&u!==void 0){let p=Math.max(d/a,u/o);c=p>1?Math.max(1,Math.round(d/p)):d,g=p>1?Math.max(1,Math.round(u/p)):u,Object.assign(i,{width:c,height:g,fit:"cover"})}else if(l==="contain"&&d!==void 0&&u!==void 0)c=d,g=u,Object.assign(i,{width:c,height:g,fit:"pad"});else if(l==="outside"){let p=Math.min(1,Math.max(d===void 0?0:d/a,u===void 0?0:u/o));c=Math.max(1,Math.round(a*p)),g=Math.max(1,Math.round(o*p)),Object.assign(i,{width:c,height:g,fit:"scale-down"})}else{let p=Math.min(d===void 0?1/0:d/a,u===void 0?1/0:u/o,1);c=Math.max(1,Math.round(a*p)),g=Math.max(1,Math.round(o*p)),Object.assign(i,{...d===void 0?{}:{width:d},...u===void 0?{}:{height:u},fit:"scale-down"})}return{options:Object.keys(i).length>0?i:null,width:c,height:g}}function ae(t){let r=t.toLowerCase().split(";")[0]?.trim()??"";return r==="image/jpg"?"image/jpeg":r}function oe(t){return new ReadableStream({start(r){r.enqueue(t),r.close()}})}export{W as azure,re as cloudflareImages,h as encodeKey,Me as extensionFor,v as gcs,I as httpStorage,xo as imageContentType,L as local,j as memory,Ee as probeImage,H as r2,F as s3,J as sharpImages,A as signAwsV4,O as signAzure,Ge as stripImageMetadata};
package/dist/webhooks.js CHANGED
@@ -1 +1 @@
1
- import{be,we,wn}from"./index-7k091gpe.js";export{we as signPayload,be as signatureHeader,wn as verifySignature};
1
+ import{Ae,ke,Cn}from"./index-466cwb0b.js";export{ke as signPayload,Ae as signatureHeader,Cn as verifySignature};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heyo-sh/heyo-cms",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Framework-agnostic, TypeScript-first headless CMS with its own panel, RBAC, i18n, native AI and first-class media.",
5
5
  "keywords": [
6
6
  "cms",
@@ -35,8 +35,8 @@
35
35
  "access": "public"
36
36
  },
37
37
  "dependencies": {
38
- "typebox": "1.3.30",
39
- "zod": "4.6.5"
38
+ "typebox": "1.4.2",
39
+ "zod": "4.6.7"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "@mariozechner/pi-agent-core": "^0.73.0",
@@ -63,7 +63,7 @@
63
63
  }
64
64
  },
65
65
  "devDependencies": {
66
- "@electric-sql/pglite": "0.5.8",
66
+ "@electric-sql/pglite": "0.5.10",
67
67
  "@mariozechner/pi-agent-core": "0.73.1",
68
68
  "@mariozechner/pi-ai": "0.73.1",
69
69
  "pg": "8.16.3"
@@ -153,6 +153,10 @@
153
153
  "types": "./dist/webhooks.d.ts",
154
154
  "default": "./dist/webhooks.js"
155
155
  },
156
+ "./plugins": {
157
+ "types": "./dist/plugins.d.ts",
158
+ "default": "./dist/plugins.js"
159
+ },
156
160
  "./jobs": {
157
161
  "types": "./dist/jobs.d.ts",
158
162
  "default": "./dist/jobs.js"
@@ -177,7 +181,7 @@
177
181
  "scripts": {
178
182
  "dev": "bun run build --watch",
179
183
  "build": "rm -rf dist && bun run build:core && bun run build:types",
180
- "build:core": "bun build src/index.ts src/types.ts src/config.ts src/fields.ts src/schema.ts src/query.ts src/migrations.ts src/auth.ts src/uploads.ts src/editor.ts src/ai.ts src/webhooks.ts src/jobs.ts src/http.ts src/client.ts src/content.ts src/telemetry.ts src/cli.ts src/adapters/next.ts src/adapters/astro.ts src/adapters/react-router.ts src/adapters/sveltekit.ts src/adapters/nuxt.ts src/db/postgres.ts src/db/sqlite.ts src/db/d1.ts src/db/mongodb.ts --outdir dist --root src --target node --production --splitting --external zod --external pg --external mongodb --external sharp --external @mariozechner/pi-ai --external @mariozechner/pi-agent-core --external typebox",
184
+ "build:core": "bun build src/index.ts src/types.ts src/config.ts src/fields.ts src/schema.ts src/query.ts src/migrations.ts src/auth.ts src/uploads.ts src/editor.ts src/ai.ts src/webhooks.ts src/plugins.ts src/jobs.ts src/http.ts src/client.ts src/content.ts src/telemetry.ts src/cli.ts src/adapters/next.ts src/adapters/astro.ts src/adapters/react-router.ts src/adapters/sveltekit.ts src/adapters/nuxt.ts src/db/postgres.ts src/db/sqlite.ts src/db/d1.ts src/db/mongodb.ts --outdir dist --root src --target node --production --splitting --external zod --external pg --external mongodb --external sharp --external @mariozechner/pi-ai --external @mariozechner/pi-agent-core --external typebox",
181
185
  "build:types": "tsc -p tsconfig.build.json",
182
186
  "typecheck": "tsc -p tsconfig.json",
183
187
  "test": "bun test"
@@ -1,2 +0,0 @@
1
- var me="/api/heyo-cms",He="/admin",Be="./migrations";
2
- export{me,He,Be};
@@ -1,2 +0,0 @@
1
- import{e}from"./index-x72d1hzh.js";var so="*";function Rt(t,n){return`${t}:${n}`}function m(t){if(t==="*")return["*","*"];let n=t.indexOf(":");if(n===-1)return[t,"*"];return[t.slice(0,n),t.slice(n+1)]}function y(t,n){return t==="*"||t===n}function Ln(t,n){let[o,r]=m(t),[i,s]=m(n);return y(o,i)&&y(r,s)}function P(t,n){if(!t)return!1;return t.permissions.some((o)=>Ln(o,n))}function Ge(t,n){let o=new Set;for(let r of t)for(let i of n[r]??[])o.add(i);return[...o].sort()}function Ct(t,n){let o=new Set;for(let r of t){let[i,s]=m(r);for(let a of n){let[l,u]=m(a),f=j(i,l),d=j(s,u);if(f===null||d===null)continue;o.add(f==="*"&&d==="*"?"*":`${f}:${d}`)}}return[...o].sort()}function j(t,n){if(t==="*")return n;if(n==="*")return t;return t===n?t:null}function Tt(t){let n=new Set;for(let o of t){if(o==="*"||o.includes(":")){n.add(o);continue}switch(o){case"read":n.add("*:read");break;case"write":n.add("*:read"),n.add("*:create"),n.add("*:update");break;case"delete":n.add("*:delete");break;default:break}}return[...n].sort()}function Re(t){if(t==="*")return!0;if(["read","write","delete"].includes(t))return!0;return/^[a-z0-9_*-]+:[a-z0-9_*-]+$/.test(t)}function S(t,n={}){let o=n.locale??t.i18n.defaultLocale;return{locale:o,chain:[o,...h(t,o,n)]}}function h(t,n,o){if(o.fallbackLocale===!1)return[];if(typeof o.fallbackLocale==="string")return o.fallbackLocale===n?[]:[o.fallbackLocale];let r=t.i18n.defaultLocale;return r===n?[]:[r]}function rn(t,n){let o=O(t)?t:{};for(let r of n.chain){let i=o[r];if(i!==void 0&&i!==null)return{value:i,from:r}}return{value:null,from:null}}function J(t,n,o){let r=O(t)?{...t}:{};return r[n]=o,r}function O(t){return typeof t==="object"&&t!==null&&!Array.isArray(t)}var C=["id","revision","createdAt","updatedAt","updatedBy","deletedAt","purgeAfter","scheduledAt","scheduledPatch","_fallback","_localeFields"],V=new Set(C);function A(t,n,o){let r=p(t.data),i={},s={},a=[];for(let[l,u]of Object.entries(n.fields)){if(u.localized){let d=r[l];if(d&&typeof d==="object"&&!Array.isArray(d)&&Object.hasOwn(d,o.locale))a.push(l);let g=rn(d,o);if(i[l]=g.value??b(u),g.from!==null&&g.from!==o.locale)s[l]=g.from;continue}let f=r[l];i[l]=f===void 0?b(u):f}if(Object.values(n.fields).some((l)=>l.localized))i._localeFields=a;if(i.id=String(t.id),i.revision=sn(t.revision),i.createdAt=c(t.created_at),i.updatedAt=c(t.updated_at),i.updatedBy=t.updated_by===void 0?null:t.updated_by,i.deletedAt=c(t.deleted_at),i.purgeAfter=c(t.purge_after),i.scheduledAt=c(t.scheduled_at),i.scheduledPatch=Te(t)?.data??null,Object.keys(s).length>0)i._fallback=s;return i}function Ce(t,n,o,r){v(t,n);let i=r===void 0,s={...r??{}},a=[];for(let[l,u]of Object.entries(t.fields)){let f=n[l];if(f!==void 0){s[l]=u.localized?J(s[l],o.locale,f):f,a.push(l);continue}if(!i)continue;let d=b(u);if(s[l]=u.localized?d===null?{}:{[o.locale]:d}:d,d!==null)a.push(l)}return{data:s,touched:a}}function Ie(t,n,o,r){let i={};for(let s of r){let a=t.fields[s];if(!a)continue;let l=a.localized?p(n[s])[o.locale]??null:n[s]??null;if(l===null&&a.required){i[s]="is required";continue}let u=a.schema.safeParse(l);if(!u.success)i[s]=u.error.issues[0]?.message??"is invalid"}if(Object.keys(i).length>0)throw e.validation(`${t.name}: ${Object.entries(i).map(([s,a])=>`${s} ${a}`).join(", ")}`,{fields:i})}function ao(t,n,o){return Object.keys(t.fields).filter((r)=>!L(n[r],o[r]))}function co(t){let n={};for(let[o,r]of Object.entries(t))n[R(o)]=r instanceof Date?r.toISOString():r instanceof Uint8Array?null:r;return n}function Te(t){let n=t.scheduled_patch;if(n===null||n===void 0)return null;let o=p(n),r=p(o.data),i=typeof o.locale==="string"?o.locale:null;if(i===null)return null;return{data:r,locale:i,actor:w(o.actor)}}function w(t){if(typeof t!=="object"||t===null||Array.isArray(t))return null;let n=t;if(typeof n.id!=="string")return null;return{id:n.id,source:n.source==="api-key"?"api-key":"session",roles:x(n.roles),permissions:x(n.permissions)}}function x(t){return Array.isArray(t)?t.filter((n)=>typeof n==="string"):[]}function sn(t){let n=Number(t??1);return Number.isFinite(n)&&n>0?Math.trunc(n):1}function c(t){if(t===void 0||t===null)return null;if(t instanceof Date)return t.toISOString();return String(t)}function p(t){return typeof t==="object"&&t!==null&&!Array.isArray(t)?t:{}}function b(t){let n=t.defaultValue??t.column.default;return n===void 0?null:n}function v(t,n){let o=Object.keys(n).filter((r)=>!(r in t.fields)&&!V.has(r));if(o.length>0)throw e.validation(`${t.name} has no field ${o.map((r)=>`"${r}"`).join(", ")}`,{unknown:o})}function L(t,n){if(t===n)return!0;if(t===void 0||n===void 0)return!1;if(typeof t!=="object"||typeof n!=="object")return!1;return JSON.stringify(t)===JSON.stringify(n)}function R(t){return t.replace(/_([a-z0-9])/g,(n,o)=>o.toUpperCase())}
2
- export{so,Rt,Ln,P,Ge,Ct,Tt,Re,S,rn,A,Ce,Ie,ao,co,Te,sn,c,p};
@@ -1,2 +0,0 @@
1
- import{s,k,t,U,te,u}from"./index-vxw0a03g.js";import{so,Ge,Ct,Tt,c,p}from"./index-2z1qe5mw.js";import{ke,nn,he,Q,io}from"./index-kbsgt44t.js";import{b}from"./index-cbwwtcm4.js";import{O}from"./index-m82a0shw.js";import{w}from"./index-2kb5nbxx.js";import{e}from"./index-x72d1hzh.js";var Dn={github:{id:"github",endpoints:{authorization:"https://github.com/login/oauth/authorize",token:"https://github.com/login/oauth/access_token",userinfo:"https://api.github.com/user"},scope:"read:user user:email",pkce:!1,async profile(l,m){let f=await we(m,"https://api.github.com/user",l.accessToken),g=typeof f.email==="string"?f.email:await Me(m,l.accessToken);return{id:String(f.id??""),email:g,name:q(f.name)??q(f.login),avatarUrl:q(f.avatar_url),claims:f}}},google:{id:"google",endpoints:{authorization:"https://accounts.google.com/o/oauth2/v2/auth",token:"https://oauth2.googleapis.com/token",userinfo:"https://openidconnect.googleapis.com/v1/userinfo"},scope:"openid email profile",pkce:!0,async profile(l,m){let f=l.idToken?kt(l.idToken):await we(m,"https://openidconnect.googleapis.com/v1/userinfo",l.accessToken);return Z(f)}},microsoft:{id:"microsoft",endpoints:{authorization:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",token:"https://login.microsoftonline.com/common/oauth2/v2.0/token",userinfo:"https://graph.microsoft.com/oidc/userinfo"},scope:"openid email profile",pkce:!0,async profile(l,m){let f=l.idToken?kt(l.idToken):await we(m,"https://graph.microsoft.com/oidc/userinfo",l.accessToken);return Z(f)}}};function Z(l){return{id:String(l.sub??""),email:q(l.email),name:q(l.name)??q(l.preferred_username),avatarUrl:q(l.picture),claims:l}}function kt(l){let m=l.split(".")[1];if(!m)return{};let f=m.replaceAll("-","+").replaceAll("_","/");try{let g=atob(f.padEnd(Math.ceil(f.length/4)*4,"=")),A=Uint8Array.from(g,(v)=>v.charCodeAt(0));return JSON.parse(new TextDecoder().decode(A))}catch{return{}}}var pe=new Map;function Ce(l,m){let f=`${O(l)}/.well-known/openid-configuration`,g=pe.get(f);if(g)return g;let A=(async()=>{let v=await m(f,{headers:{accept:"application/json"}});if(!v.ok)throw new e(`OIDC discovery failed for ${l} (${v.status})`,{status:502,code:"oidc_discovery_failed"});let P=await v.json();return{authorization:String(P.authorization_endpoint??""),token:String(P.token_endpoint??""),...typeof P.userinfo_endpoint==="string"?{userinfo:P.userinfo_endpoint}:{}}})();return pe.set(f,A),A.catch(()=>pe.delete(f)),A}function Ue(l){let m=new URL(l.endpoints.authorization);if(m.searchParams.set("response_type","code"),m.searchParams.set("client_id",l.clientId),m.searchParams.set("redirect_uri",l.redirectUri),m.searchParams.set("scope",l.scope),m.searchParams.set("state",l.state),l.codeChallenge)m.searchParams.set("code_challenge",l.codeChallenge),m.searchParams.set("code_challenge_method","S256");for(let[f,g]of Object.entries(l.extra??{}))m.searchParams.set(f,g);return m.toString()}async function Oe(l){return{verifier:l,challenge:await io(l)}}async function xe(l){let m=new URLSearchParams({grant_type:"authorization_code",code:l.code,redirect_uri:l.redirectUri,client_id:l.clientId,client_secret:l.clientSecret});if(l.codeVerifier)m.set("code_verifier",l.codeVerifier);let f=await l.fetchImpl(l.endpoints.token,{method:"POST",headers:{accept:"application/json","content-type":"application/x-www-form-urlencoded"},body:m.toString()}),g=await f.json().catch(()=>({}));if(!f.ok||typeof g.access_token!=="string"){let A=q(g.error_description)??q(g.error)??`HTTP ${f.status}`;throw new e(`OAuth token exchange failed: ${A}`,{status:401,code:"oauth_exchange_failed"})}return{accessToken:g.access_token,...typeof g.id_token==="string"?{idToken:g.id_token}:{},...typeof g.token_type==="string"?{tokenType:g.token_type}:{}}}async function we(l,m,f){let g=await l(m,{headers:{authorization:`Bearer ${f}`,accept:"application/json","user-agent":"heyo-cms"}});if(!g.ok)throw new e(`OAuth profile request failed (${g.status})`,{status:502,code:"oauth_profile_failed"});return await g.json()}async function Me(l,m){let f=await l("https://api.github.com/user/emails",{headers:{authorization:`Bearer ${m}`,accept:"application/json","user-agent":"heyo-cms"}});if(!f.ok)return null;let g=await f.json();return(g.find((v)=>v.primary&&v.verified)??g.find((v)=>v.verified))?.email??null}function q(l){return typeof l==="string"&&l.length>0?l:null}function Mn(){return qe(crypto.getRandomValues(new Uint8Array(20)))}function qn(l){let m=`${encodeURIComponent(l.issuer)}:${encodeURIComponent(l.account)}`,f=new URLSearchParams({secret:l.secret,issuer:l.issuer,algorithm:"SHA1",digits:String(6),period:String(30)});return`otpauth://totp/${m}?${f.toString()}`}async function Wo(l,m=Date.now()){return De(l,Math.floor(m/1000/30))}async function Xt(l,m,f={}){if(!l)return!1;let g=m.replaceAll(/\s/g,"");if(!/^\d{6}$/.test(g))return!1;let A=Math.floor((f.at??Date.now())/1000/30),v=f.window??1;for(let P=-v;P<=v;P+=1){let C=await De(l,A+P),x=0;for(let F=0;F<C.length;F+=1)x|=C.charCodeAt(F)^g.charCodeAt(F);if(x===0)return!0}return!1}async function De(l,m){let f=await crypto.subtle.importKey("raw",Ne(l),{name:"HMAC",hash:"SHA-1"},!1,["sign"]),g=new Uint8Array(8),A=m;for(let x=7;x>=0;x-=1)g[x]=A&255,A=Math.floor(A/256);let v=new Uint8Array(await crypto.subtle.sign("HMAC",f,g)),P=(v[v.length-1]??0)&15,C=((v[P]??0)&127)<<24|((v[P+1]??0)&255)<<16|((v[P+2]??0)&255)<<8|(v[P+3]??0)&255;return String(C%1e6).padStart(6,"0")}function qe(l){let m=0,f=0,g="";for(let A of l){f=f<<8|A,m+=8;while(m>=5)g+="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"[f>>>m-5&31],m-=5}if(m>0)g+="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"[f<<5-m&31];return g}function Ne(l){let m=l.replaceAll("=","").replaceAll(/\s/g,"").toUpperCase(),f=[],g=0,A=0;for(let v of m){let P="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567".indexOf(v);if(P===-1)continue;if(A=A<<5|P,g+=5,g>=8)f.push(A>>>g-8&255),g-=8}return new Uint8Array(f)}var T="cms_users",L="cms_sessions",N="cms_tokens",ge="cms_accounts",V="cms_api_keys",J="cms_roles",fe="heyo_cms_session",en="hck_",Je={session:"7d",invite:"7d",magicLink:"15m",passwordReset:"1h",twoFactor:"10m",oauth:"10m"},Be=8,$e=5,Ke=/^[^@\s]+@[^@\s.]+\.[^@\s]+$/,He=/^[a-z][a-z0-9_-]*$/,Ve=1e4;function tn(l){let{config:m}=l,f=l.fetch??((...n)=>fetch(...n)),g,A=()=>g??=ke(he(16)),v,P=!1,C=()=>m.admin.auth,x=(n,i)=>b(i??Je[n]),F=(n)=>{let i=C();if(!i||!i.methods.includes(n))throw new e(`The "${n}" sign-in method is not enabled; add it to admin.auth.methods`,{status:400,code:"method_not_enabled"});return i};async function y(n){let i=await l.database();return i.transaction((r)=>n(r,i))}async function D(n,i,r,o){return(await i.query(n,{table:r,where:o,limit:1}))[0]??null}async function K(n,i,r,o){let d=(await i.mutate(n,{kind:"insert",table:r,values:o})).rows[0];if(!d)throw new e(`Insert into ${r} returned no row.`,{status:500,code:"insert_without_row"});return d}async function I(n,i,r,o,a){return(await i.mutate(n,{kind:"update",table:r,where:o,set:a,returning:!1})).count}async function j(n,i,r,o){return(await i.mutate(n,{kind:"delete",table:r,where:o})).count}async function z(n,i,r,o=null){let a={type:i,data:r,previous:null},d={actor:o};await l.emit(n,[a],d)}async function le(){let n=m.rbac?.roles??{};if(m.rbac?.customRoles!==!0)return n;let i=Date.now();if(v&&i-v.at<Ve)return v.map;let r=await y((d,h)=>h.query(d,{table:J})),o={};for(let d of r)o[String(d.name)]=B(d.permissions);let a={...o,...n};return v={at:i,map:a},a}async function ee(n){let i=n.roles.length>0?n.roles:m.rbac?.defaultRole?[m.rbac.defaultRole]:[];return{id:n.id,source:"session",roles:i,permissions:Ge(i,await le())}}async function Y(n,i,r){let o=r.token??he(),a=new Date(Date.now()+r.ttlMs);return await K(n,i,N,{id:w("tok"),type:r.type,user_id:r.userId??null,email:r.email??null,token_hash:await Q(o),data:r.data??null,expires_at:a,consumed_at:null,created_at:new Date}),{token:o,expiresAt:a}}async function be(n,i,r,o){let a=await D(n,i,N,s(t("token_hash",await Q(o)),t("type",r)));if(!a||_e(a.expires_at))throw e.unauthorized("This link is invalid or has expired");if(a.consumed_at!==null)throw e.unauthorized("This link has already been used");return a}async function ve(n,i,r){if(await I(n,i,N,s(t("id",String(r.id)),t("consumed_at",null)),{consumed_at:new Date})!==1)throw e.unauthorized("This link has already been used")}async function ne(n,i,r,o){let a=await be(n,i,r,o);return await ve(n,i,a),a}async function se(n,i,r,o){let a=he(),d=new Date,h=new Date(d.getTime()+x("session",C()?.session?.expiresIn)),_=await K(n,i,L,{id:w("ses"),user_id:r.id,token_hash:await Q(a),ip:o.ip??null,user_agent:o.userAgent??null,expires_at:h,created_at:d});return await I(n,i,T,t("id",r.id),{last_login_at:d}),{status:"signed-in",token:a,expiresAt:h.toISOString(),session:ye(_),user:{...r,lastLoginAt:d.toISOString()},actor:await ee(r)}}async function ie(n,i,r,o){if(!r.twoFactorEnabled)return se(n,i,r,o);let a=await Y(n,i,{type:"two-factor",ttlMs:x("twoFactor",void 0),userId:r.id,email:r.email});return{status:"two-factor-required",challenge:a.token,expiresAt:a.expiresAt.toISOString(),userId:r.id}}async function E(n,i,r){let o=await D(n,i,T,t("id",r));return o?W(o):null}async function H(n,i,r){let o=await D(n,i,T,t("email",ce(r)));return o?{user:W(o),row:o}:null}function re(n){if(n.status==="disabled")throw e.forbidden("This account has been disabled")}async function Ae(n){let i=C();if(n==="oidc"){let a=i?.sso;if(!a)throw new e("SSO is not configured; set admin.auth.sso",{status:400,code:"method_not_enabled"});let d=await Ce(a.issuer,f),h=Te("oidc",{...a.clientId===void 0?{}:{clientId:a.clientId},...a.clientSecret===void 0?{}:{clientSecret:a.clientSecret}});return{id:"oidc",endpoints:d,scope:a.scope??"openid email profile",pkce:!0,...h,provision:a.provision!==!1,...a.mapRoles?{mapRoles:a.mapRoles}:{},profile:async(_)=>_.idToken?Z(kt(_.idToken)):Z(await je(d,_.accessToken))}}F(n);let r=Dn[n];if(!r)throw new e(`Unknown OAuth provider "${n}"`,{status:400,code:"unknown_provider"});let o=Te(n);return{id:n,endpoints:r.endpoints,scope:i?.providers?.[n]?.scope??r.scope,pkce:r.pkce,...o,provision:!1,profile:r.profile}}async function je(n,i){if(!n.userinfo)return{};let r=await f(n.userinfo,{headers:{authorization:`Bearer ${i}`,accept:"application/json"}});if(!r.ok)return{};return await r.json()}function Te(n,i={}){let r=C()?.providers?.[n],o=n.toUpperCase(),a=i.clientId??r?.clientId??ue(`HEYO_CMS_${o}_CLIENT_ID`)??ue(`${o}_CLIENT_ID`),d=i.clientSecret??r?.clientSecret??ue(`HEYO_CMS_${o}_CLIENT_SECRET`)??ue(`${o}_CLIENT_SECRET`);if(!a||!d)throw new e(`No credentials for "${n}": set admin.auth.providers.${n} or ${o}_CLIENT_ID and ${o}_CLIENT_SECRET`,{status:500,code:"provider_not_configured"});return{clientId:a,clientSecret:d}}async function ze(n,i,r,o){let a=await D(n,i,ge,s(t("provider",r.id),t("provider_account_id",o.id)));if(a){let S=await E(n,i,String(a.user_id));if(!S)throw e.unauthorized("The linked account no longer exists");return Pe(n,i,r,o,S)}let d=o.email?ce(o.email):null;if(!d)throw new e(`${r.id} did not return a verified email address, so the account cannot be matched`,{status:400,code:"oauth_without_email"});let _=(await H(n,i,d))?.user??null;if(!_){if(!r.provision)throw e.forbidden(`No CMS account for ${d}. An administrator has to invite this address first.`);_=await oe(n,i,{email:d,...o.name?{name:o.name}:{},roles:r.mapRoles?r.mapRoles(o.claims):m.rbac?.defaultRole?[m.rbac.defaultRole]:[],status:"active"}),await z(n,"user.joined",{userId:_.id,email:d,provider:r.id,provisioned:!0})}else if(_.status==="invited")await I(n,i,T,t("id",_.id),{status:"active",updated_at:new Date}),_={..._,status:"active"},await z(n,"user.joined",{userId:_.id,email:_.email});return await K(n,i,ge,{id:w("acc"),user_id:_.id,provider:r.id,provider_account_id:o.id,email:d,created_at:new Date,updated_at:new Date}),Pe(n,i,r,o,_)}async function Pe(n,i,r,o,a){if(!r.mapRoles)return a;let d=r.mapRoles(o.claims);if(Fe(d,a.roles))return a;return await I(n,i,T,t("id",a.id),{roles:d,updated_at:new Date}),await z(n,"role.changed",{userId:a.id,roles:d,previous:a.roles,source:r.id}),{...a,roles:d}}async function oe(n,i,r){let o=ce(r.email);if(await D(n,i,T,t("email",o)))throw e.conflict(`A user with the email ${o} already exists`);if(r.password!==void 0)G(r.password);let d=new Date,h=await K(n,i,T,{id:w("usr"),email:o,name:r.name??null,password_hash:r.password===void 0?null:await ke(r.password),two_factor_secret:null,two_factor_enabled:!1,status:r.status??"active",roles:r.roles??[],avatar_url:null,locale:r.locale??null,last_login_at:null,created_at:d,updated_at:d});return W(h)}function G(n){let i=C()?.password?.minLength??Be;if(n.length<i)throw e.validation(`The password must be at least ${i} characters`)}function Se(){let n=C();if(!n||!n.methods.includes("password"))return null;let i=n.firstUser??!0;if(i===!1)return null;if(i!==!0&&i.roles)return i.roles;let r=m.rbac?.roles;if(!r||"admin"in r)return["admin"];let o=Object.entries(r).find(([,a])=>a.includes(so));return o?[o[0]]:["admin"]}async function ae(n){if(n.length===0||!m.rbac)return;let i=await le(),r=n.filter((o)=>!(o in i));if(r.length>0)throw e.validation(`Unknown role ${r.map((o)=>`"${o}"`).join(", ")}`)}let X={async actorFromRequest(n){let i=n.headers.get("authorization"),o=(i?.toLowerCase().startsWith("bearer ")?i.slice(7).trim():null)??We(n,fe);return o?X.actorFromToken(o):null},async actorFromToken(n){if(n.startsWith(en))return X.apiKeys.verify(n);return(await X.sessions.verify(n))?.actor??null},actorForUser:ee,users:{async list(n={}){let i=[];if(n.status)i.push(t("status",n.status));if(n.search){let o=`%${n.search}%`;i.push(k(te("email",o,!0),te("name",o,!0)))}return(await y((o,a)=>a.query(o,{table:T,...i.length>0?{where:s(...i)}:{},orderBy:[u("created_at","asc"),u("id","asc")],limit:n.limit??50,...n.offset===void 0?{}:{offset:n.offset}}))).map(W)},async get(n){return y((i,r)=>E(i,r,n))},async byEmail(n){return y(async(i,r)=>(await H(i,r,n))?.user??null)},async count(){let n=await y((i,r)=>r.query(i,{table:T,count:!0}));return Number(n[0]?.count??0)},async create(n){return await ae(n.roles??[]),y((i,r)=>oe(i,r,n))},async update(n,i){if(i.roles)await ae(i.roles);let r=await y(async(o,a)=>{let d=await E(o,a,n);if(!d)throw e.notFound(`No user with id "${n}"`);let h={updated_at:new Date};if(i.name!==void 0)h.name=i.name;if(i.status!==void 0)h.status=i.status;if(i.locale!==void 0)h.locale=i.locale;if(i.avatarUrl!==void 0)h.avatar_url=i.avatarUrl;if(i.roles!==void 0)h.roles=i.roles;if(await I(o,a,T,t("id",n),h),i.roles&&!Fe(i.roles,d.roles))await z(o,"role.changed",{userId:n,roles:i.roles,previous:d.roles},i.actor??null);if(i.status==="disabled")await j(o,a,L,t("user_id",n));return await E(o,a,n)});return l.deliver(),r},async remove(n,i={}){await y(async(r,o)=>{let a=await E(r,o,n);if(!a)throw e.notFound(`No user with id "${n}"`);for(let d of[L,N,ge,V])await j(r,o,d,t("user_id",n));await j(r,o,T,t("id",n)),await z(r,"user.removed",{userId:n,email:a.email},i.actor??null)}),l.deliver()},async setPassword(n,i){G(i),await y(async(r,o)=>{let a=await ke(i);if(await I(r,o,T,t("id",n),{password_hash:a,updated_at:new Date})===0)throw e.notFound(`No user with id "${n}"`);await j(r,o,L,t("user_id",n))})},async invite(n){await ae(n.roles??[]);let i=await y(async(r,o)=>{let a=ce(n.email),d=await H(r,o,a);if(d&&d.user.status==="active")throw e.conflict(`${a} is already an active user`);let h=d?.user??await oe(r,o,{email:a,...n.name?{name:n.name}:{},roles:n.roles??(m.rbac?.defaultRole?[m.rbac.defaultRole]:[]),status:"invited"}),_=await Y(r,o,{type:"invite",ttlMs:x("invite",C()?.invites?.expiresIn),userId:h.id,email:a});return await z(r,"user.invited",{userId:h.id,email:a,roles:h.roles},n.actor??null),{user:h,token:_.token,expiresAt:_.expiresAt.toISOString(),userId:h.id,email:a}});return l.deliver(),i},async acceptInvite(n){let i=await y(async(r,o)=>{let a=await ne(r,o,"invite",n.token),d=await E(r,o,String(a.user_id));if(!d)throw e.unauthorized("This invitation is no longer valid");let h={status:"active",updated_at:new Date};if(n.password!==void 0)G(n.password),h.password_hash=await ke(n.password);if(n.name!==void 0)h.name=n.name;await I(r,o,T,t("id",d.id),h);let _={...d,status:"active",...n.name===void 0?{}:{name:n.name}};return await z(r,"user.joined",{userId:d.id,email:d.email}),se(r,o,_,n)});return l.deliver(),i}},setup:{async required(){if(Se()===null)return!1;if(P)return!1;let n=await X.users.count();if(n>0)P=!0;return n===0},async claim(n){let i=Se();if(i===null)throw e.forbidden("This deployment does not accept a first account over HTTP; use heyo-cms create-admin");try{await ae(i)}catch(o){if(o instanceof e&&o.code==="validation_failed")throw e.validation(`The first account would be given the role ${i.map((a)=>`"${a}"`).join(", ")}, which rbac.roles does not define; set admin.auth.firstUser.roles`);throw o}G(n.password);let r=await y(async(o,a)=>{let d=await a.query(o,{table:T,count:!0});if(Number(d[0]?.count??0)>0)throw e.conflict("This CMS already has an account; sign in instead");let h=await oe(o,a,{email:n.email,password:n.password,roles:i,status:"active",...n.name===void 0?{}:{name:n.name}});return await z(o,"user.joined",{userId:h.id,email:h.email,first:!0}),se(o,a,h,n)});return P=!0,l.deliver(),r}},sessions:{async verify(n){return y(async(i,r)=>{let o=await D(i,r,L,t("token_hash",await Q(n)));if(!o||_e(o.expires_at))return null;let a=await E(i,r,String(o.user_id));if(!a||a.status!=="active")return null;return{status:"signed-in",token:n,expiresAt:c(o.expires_at)??"",session:ye(o),user:a,actor:await ee(a)}})},async list(n){return(await y((r,o)=>o.query(r,{table:L,where:t("user_id",n),orderBy:[u("created_at","desc")]}))).map(ye)},async revoke(n){let i=await Q(n);return await y((o,a)=>j(o,a,L,t("token_hash",i)))>0},async revokeById(n){return await y((r,o)=>j(r,o,L,t("id",n)))>0},async revokeAll(n){return y((i,r)=>j(i,r,L,t("user_id",n)))},async cleanup(){let n=new Date;return y(async(i,r)=>{let o=await j(i,r,L,U("expires_at",n));return await j(i,r,N,U("expires_at",n)),o})}},password:{async signIn(n){F("password");let i=await y(async(r,o)=>{let a=await H(r,o,n.email),d=a?a.row.password_hash:await A(),h=await nn(n.password,d);if(!a||!h)throw e.unauthorized("Invalid email or password");if(re(a.user),a.user.status==="invited")throw e.forbidden("This invitation has not been accepted yet");return ie(r,o,a.user,n)});return l.deliver(),i},async requestReset(n){return F("password"),y(async(i,r)=>{let o=await H(i,r,n.email);if(!o||o.user.status==="disabled")return null;let a=await Y(i,r,{type:"password-reset",ttlMs:x("passwordReset",C()?.passwordReset?.expiresIn),userId:o.user.id,email:o.user.email});return{token:a.token,expiresAt:a.expiresAt.toISOString(),userId:o.user.id,email:o.user.email}})},async reset(n){return F("password"),G(n.password),y(async(i,r)=>{let o=await ne(i,r,"password-reset",n.token),a=String(o.user_id);await I(i,r,T,t("id",a),{password_hash:await ke(n.password),status:"active",updated_at:new Date}),await j(i,r,L,t("user_id",a));let d=await E(i,r,a);if(!d)throw e.unauthorized("This link is no longer valid");return d})}},magicLink:{async request(n){return F("magic-link"),y(async(i,r)=>{let o=await H(i,r,n.email);if(!o||o.user.status==="disabled")return null;let a=await Y(i,r,{type:"magic-link",ttlMs:x("magicLink",C()?.magicLink?.expiresIn),userId:o.user.id,email:o.user.email});return{token:a.token,expiresAt:a.expiresAt.toISOString(),userId:o.user.id,email:o.user.email}})},async verify(n){F("magic-link");let i=await y(async(r,o)=>{let a=await ne(r,o,"magic-link",n.token),d=await E(r,o,String(a.user_id));if(!d)throw e.unauthorized("This link is no longer valid");if(re(d),d.status==="invited")return await I(r,o,T,t("id",d.id),{status:"active",updated_at:new Date}),await z(r,"user.joined",{userId:d.id,email:d.email}),ie(r,o,{...d,status:"active"},n);return ie(r,o,d,n)});return l.deliver(),i}},oauth:{async authorize(n){let i=await Ae(n.provider),r=he(24),o=he(),a=i.pkce?(await Oe(o)).challenge:void 0;return await y((d,h)=>Y(d,h,{type:"oauth",ttlMs:x("oauth",void 0),token:r,data:{provider:i.id,redirectUri:n.redirectUri,verifier:o,redirectTo:n.redirectTo??null}})),{url:Ue({endpoints:i.endpoints,clientId:i.clientId,redirectUri:n.redirectUri,scope:i.scope,state:r,...a===void 0?{}:{codeChallenge:a}}),state:r}},async callback(n){let i=await Ae(n.provider),r=await y(async(o,a)=>{let d=await ne(o,a,"oauth",n.state),h=p(d.data);if(h.provider!==i.id)throw e.unauthorized("This sign-in request does not match");if(h.redirectUri!==n.redirectUri)throw e.unauthorized("The redirect URI does not match");let _=await xe({endpoints:i.endpoints,clientId:i.clientId,clientSecret:i.clientSecret,code:n.code,redirectUri:n.redirectUri,...i.pkce&&typeof h.verifier==="string"?{codeVerifier:h.verifier}:{},fetchImpl:f}),S=await i.profile(_,f),R=await ze(o,a,i,S);return re(R),{...await ie(o,a,R,n),redirectTo:typeof h.redirectTo==="string"?h.redirectTo:null}});return l.deliver(),r}},twoFactor:{async begin(n){let i=Mn();return y(async(r,o)=>{let a=await E(r,o,n);if(!a)throw e.notFound(`No user with id "${n}"`);if(a.twoFactorEnabled)throw e.conflict("Disable the existing authenticator before enrolling another.");return await I(r,o,T,t("id",n),{two_factor_secret:i,updated_at:new Date}),{secret:i,uri:qn({secret:i,account:a.email,issuer:m.admin.title??"Heyo CMS"})}})},async enable(n){return y(async(i,r)=>{let o=await D(i,r,T,t("id",n.userId));if(!o)throw e.notFound(`No user with id "${n.userId}"`);let a=o.two_factor_secret;if(!a)throw e.validation("Start the setup before enabling it");if(!await Xt(a,n.code))throw e.unauthorized("That code is not valid");return await I(i,r,T,t("id",n.userId),{two_factor_enabled:!0,updated_at:new Date}),{...W(o),twoFactorEnabled:!0}})},async disable(n){return y(async(i,r)=>{if(await I(i,r,T,t("id",n),{two_factor_enabled:!1,two_factor_secret:null,updated_at:new Date})===0)throw e.notFound(`No user with id "${n}"`);return await E(i,r,n)})},async complete(n){let i=await y(async(r,o)=>{let a=await be(r,o,"two-factor",n.challenge),d=await D(r,o,T,t("id",String(a.user_id)));if(!d)throw e.unauthorized("This challenge is no longer valid");if(!await Xt(d.two_factor_secret,n.code)){let S=a;for(let R=0;R<$e;R+=1){let M=p(S.data).attempts,Ie=typeof M==="number"?M:null,Re=Number(Ie??0)+1;if(await I(r,o,N,s(t("id",String(S.id)),t("consumed_at",null),t("data.attempts",Ie)),{data:{...p(S.data),attempts:Re},...Re>=$e?{consumed_at:new Date}:{}})===1)break;let me=await D(r,o,N,t("id",String(S.id)));if(!me||me.consumed_at!==null)break;S=me}return null}await ve(r,o,a);let _=W(d);return re(_),se(r,o,_,n)});if(i===null)throw e.unauthorized("That code is not valid");return l.deliver(),i}},apiKeys:{async create(n){let i=C()?.apiKeys;if(!i?.enabled)throw new e("API keys are not enabled; set admin.auth.apiKeys.enabled",{status:400,code:"method_not_enabled"});let r=n.scopes??i.scopes??["read"],o=i.scopes;if(o){let S=r.filter((R)=>!o.includes(R));if(S.length>0)throw e.validation(`Scope ${S.map((R)=>`"${R}"`).join(", ")} is not in admin.auth.apiKeys.scopes`)}let a=`${en}${he()}`,d=n.expiresIn??i.expiresIn,h=d?new Date(Date.now()+b(d)):null,_=await y(async(S,R)=>{let M=await K(S,R,V,{id:w("key"),name:n.name,user_id:n.userId??null,key_hash:await Q(a),prefix:a.slice(0,en.length+6),scopes:r,last_used_at:null,expires_at:h,revoked_at:null,created_at:new Date});return await z(S,"apikey.created",{id:String(M.id),name:n.name,scopes:r,userId:n.userId??null},n.actor??null),Ee(M)});return l.deliver(),{..._,key:a}},async list(n={}){return(await y((r,o)=>o.query(r,{table:V,...n.userId?{where:t("user_id",n.userId)}:{},orderBy:[u("created_at","desc")]}))).map(Ee)},async revoke(n,i={}){let r=await y(async(o,a)=>{let d=await I(o,a,V,s(t("id",n),t("revoked_at",null)),{revoked_at:new Date});if(d>0)await z(o,"apikey.revoked",{id:n},i.actor??null);return d>0});return l.deliver(),r},async verify(n){return y(async(i,r)=>{let o=await D(i,r,V,t("key_hash",await Q(n)));if(!o)return null;if(o.revoked_at!==null)return null;if(o.expires_at!==null&&_e(o.expires_at))return null;let a=B(o.scopes),d=Tt(a),h=[],_=d,S=String(o.id);if(o.user_id!==null&&o.user_id!==void 0){let R=await E(i,r,String(o.user_id));if(!R||R.status!=="active")return null;let M=await ee(R);h=M.roles,_=Ct(M.permissions,d),S=R.id}return await I(i,r,V,t("id",String(o.id)),{last_used_at:new Date}),{id:S,source:"api-key",roles:h,permissions:_}})}},roles:{async list(){let n=Object.entries(m.rbac?.roles??{}).map(([a,d])=>({name:a,label:null,permissions:d,source:"config"}));if(m.rbac?.customRoles!==!0)return n;let i=await y((a,d)=>d.query(a,{table:J,orderBy:[u("name")]})),r=new Set(n.map((a)=>a.name)),o=i.filter((a)=>!r.has(String(a.name))).map((a)=>({name:String(a.name),label:a.label??null,permissions:B(a.permissions),source:"database"}));return[...n,...o].sort((a,d)=>a.name.localeCompare(d.name))},async create(n){if(de(),Le(n.name),m.rbac?.roles[n.name])throw e.conflict(`"${n.name}" is defined in the configuration; change it there`);let i=await y(async(r,o)=>{if(await D(r,o,J,t("name",n.name)))throw e.conflict(`The role "${n.name}" already exists`);return K(r,o,J,{id:w("rol"),name:n.name,label:n.label??null,permissions:n.permissions,created_at:new Date,updated_at:new Date})});return v=void 0,{name:String(i.name),label:i.label??null,permissions:B(i.permissions),source:"database"}},async update(n,i){de();let r=await y(async(o,a)=>{let d={updated_at:new Date};if(i.permissions)d.permissions=i.permissions;if(i.label!==void 0)d.label=i.label;if(await I(o,a,J,t("name",n),d)===0)throw e.notFound(`No role named "${n}"`);return D(o,a,J,t("name",n))});return v=void 0,{name:n,label:r?.label??null,permissions:B(r?.permissions),source:"database"}},async remove(n){de();let i=await y((r,o)=>j(r,o,J,t("name",n)));return v=void 0,i>0},async permissionsFor(n){return Ge(n,await le())}}};function de(){if(m.rbac?.customRoles!==!0)throw new e("Roles are defined in the configuration; set rbac.customRoles to manage them in the panel",{status:400,code:"custom_roles_disabled"})}function Le(n){if(!He.test(n))throw e.validation(`"${n}" is not a role name; use lowercase letters, digits, dashes and underscores`)}return X}function W(l){return{id:String(l.id),email:String(l.email),name:l.name??null,status:l.status??"active",roles:B(l.roles),avatarUrl:l.avatar_url??null,locale:l.locale??null,twoFactorEnabled:l.two_factor_enabled===!0,lastLoginAt:c(l.last_login_at),createdAt:c(l.created_at)??"",updatedAt:c(l.updated_at)??""}}function ye(l){return{id:String(l.id),userId:String(l.user_id),expiresAt:c(l.expires_at)??"",createdAt:c(l.created_at)??"",ip:l.ip??null,userAgent:l.user_agent??null}}function Ee(l){return{id:String(l.id),name:String(l.name),prefix:String(l.prefix),userId:l.user_id??null,scopes:B(l.scopes),lastUsedAt:c(l.last_used_at),expiresAt:c(l.expires_at),revokedAt:c(l.revoked_at),createdAt:c(l.created_at)??""}}function B(l){if(!Array.isArray(l))return[];return l.filter((m)=>typeof m==="string")}function _e(l){if(l===null||l===void 0)return!1;return(l instanceof Date?l:new Date(String(l))).getTime()<=Date.now()}function ce(l){let m=l.trim().toLowerCase();if(!Ke.test(m))throw e.validation(`"${l}" is not an email address`);return m}function Fe(l,m){if(l.length!==m.length)return!1;let f=[...m].sort();return[...l].sort().every((g,A)=>g===f[A])}function We(l,m){let f=l.headers.get("cookie");if(!f)return null;for(let g of f.split(";")){let A=g.indexOf("=");if(A===-1)continue;if(g.slice(0,A).trim()!==m)continue;return decodeURIComponent(g.slice(A+1).trim())}return null}function ue(l){return globalThis.process?.env?.[l]}
2
- export{Dn,kt,Mn,qn,Wo,Xt,fe,en,tn};
@@ -1,23 +0,0 @@
1
- import{n}from"./index-x72d1hzh.js";var u=new Map,m=new Map;function x(t){if(!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(t.name))throw new n(`editor.nodes.${t.name}`,"a node name must be letters, digits and underscores, starting with a letter");if(typeof t.toHtml!=="function")throw new n(`editor.nodes.${t.name}`,"needs a toHtml serialiser; a node that cannot render as HTML is a node the REST API cannot answer with");if(typeof t.toMarkdown!=="function")throw new n(`editor.nodes.${t.name}`,"needs a toMarkdown serialiser; Markdown is what exports and AI prompts speak");let e=u.get(t.name);if(e&&e!==t)throw new n(`editor.nodes.${t.name}`,"a different node with this name is already registered");return u.set(t.name,t),t}function Y(t){if(typeof t.toHtml!=="function"||typeof t.toMarkdown!=="function")throw new n(`editor.marks.${t.name}`,"needs both a toHtml and a toMarkdown serialiser");let e=m.get(t.name);if(e&&e!==t)throw new n(`editor.marks.${t.name}`,"a different mark with this name is already registered");return m.set(t.name,t),t}function Ne(t){return u.get(t)}function wt(t){return m.get(t)}function Tn(){return[...u.keys()].sort()}function Sn(){return[...m.keys()].sort()}function de(){return{nodes:[...u.values()].sort((t,e)=>t.name.localeCompare(e.name)).map((t)=>({name:t.name,...t.group===void 0?{}:{group:t.group},...t.content===void 0?{}:{content:t.content},inline:t.inline===!0,atom:t.atom===!0,attrs:t.attrs??{},...t.marks===void 0?{}:{marks:t.marks},component:t.Component!==void 0})),marks:[...m.values()].sort((t,e)=>t.name.localeCompare(e.name)).map((t)=>({name:t.name,attrs:t.attrs??{}}))}}function ue(t,e){if(!D(t))return"";let r=w(t,{format:e.format,index:0,depth:0,...e.mediaUrl===void 0?{}:{mediaUrl:e.mediaUrl}});return e.format==="html"?r:r.trim()}function On(t,e={}){return ue(t,{...e,format:"html"})}function J(t,e={}){return ue(t,{...e,format:"markdown"})}function _n(t,e={}){return ue(t,{...e,format:"text"})}function w(t,e){let{format:r}=e;if(t.type==="text")return E(t.text??"",t.marks??[],r);let i=t.content??[],o=i.map((l,c)=>w(l,{...e,index:c,depth:e.depth+1})),a=y(i,o,r),s=Ne(t.type);if(!s)return a;return(r==="html"?s.toHtml:r==="markdown"?s.toMarkdown:s.toText??((l)=>l.children))({node:t,children:a,childStrings:o,childNodes:i,depth:e.depth,index:e.index,...e.mediaUrl===void 0?{}:{mediaUrl:e.mediaUrl}})}function y(t,e,r){if(r==="html")return e.join("");if(!t.some((a)=>T(a)))return e.join("");let o=r==="markdown"?`
2
-
3
- `:`
4
- `;return e.filter((a)=>a.length>0).join(o)}function T(t){if(t.type==="text")return!1;let e=Ne(t.type);if(!e)return!0;return e.inline!==!0}function E(t,e,r){let i=e.some((a)=>a.type==="code"),o=r==="html"?Ue(t):r==="markdown"&&!i?oo(t):t;if(r==="text")return o;for(let a of e){let s=wt(a.type);if(!s)continue;o=(r==="html"?s.toHtml:s.toMarkdown)({mark:a,text:o})}return o}function Ue(t){return t.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;")}function oo(t){return t.replace(/([\\`*_[\]])/g,"\\$1")}function We(t){let e=[];for(let[r,i]of Object.entries(t)){if(i===void 0||i===null||i===!1)continue;if(i===!0){e.push(` ${r}`);continue}e.push(` ${r}="${Ue(String(i))}"`)}return e.join("")}function vt(t,e){let r=" ".repeat(e);return t.split(`
5
- `).join(`
6
- ${r}`)}function R(t,e){return t.attrs?.[e]}function Z(t,e){let r=R(t,e);return typeof r==="string"?r:void 0}function D(t){return typeof t==="object"&&t!==null&&typeof t.type==="string"}var yo=x({name:"doc",content:"block+",toHtml:({children:t})=>t,toMarkdown:({children:t})=>t}),bo=x({name:"paragraph",group:"block",content:"inline*",toHtml:({children:t})=>`<p>${t}</p>`,toMarkdown:({children:t})=>t}),wo=x({name:"heading",group:"block",content:"inline*",attrs:{level:{default:1}},toHtml:({node:t,children:e})=>{let r=b(t.attrs?.level);return`<h${r}>${e}</h${r}>`},toMarkdown:({node:t,children:e})=>`${"#".repeat(b(t.attrs?.level))} ${e}`}),vo=x({name:"blockquote",group:"block",content:"block+",toHtml:({children:t})=>`<blockquote>${t}</blockquote>`,toMarkdown:({children:t})=>t.split(`
7
- `).map((e)=>e.length===0?">":`> ${e}`).join(`
8
- `)}),Ao=x({name:"bulletList",group:"block",content:"listItem+",toHtml:({children:t})=>`<ul>${t}</ul>`,toMarkdown:({childStrings:t})=>t.map((e)=>`- ${vt(e,2)}`).join(`
9
- `)}),xo=x({name:"orderedList",group:"block",content:"listItem+",attrs:{start:{default:1}},toHtml:({node:t,children:e})=>{let r=typeof t.attrs?.start==="number"?t.attrs.start:1;return`<ol${r===1?"":` start="${r}"`}>${e}</ol>`},toMarkdown:({node:t,childStrings:e})=>{let r=typeof t.attrs?.start==="number"?t.attrs.start:1;return e.map((i,o)=>{let a=`${r+o}. `;return`${a}${vt(i,a.length)}`}).join(`
10
- `)}}),ko=x({name:"listItem",content:"paragraph block*",toHtml:({children:t})=>`<li>${t}</li>`,toMarkdown:({children:t})=>t}),Ro=x({name:"taskList",group:"block",content:"taskItem+",toHtml:({children:t})=>`<ul data-type="taskList">${t}</ul>`,toMarkdown:({childStrings:t})=>t.join(`
11
- `)}),Co=x({name:"taskItem",content:"paragraph block*",attrs:{checked:{default:!1}},toHtml:({node:t,children:e})=>`<li data-type="taskItem"${We({"data-checked":t.attrs?.checked===!0})}>${e}</li>`,toMarkdown:({node:t,children:e})=>`- [${t.attrs?.checked===!0?"x":" "}] ${vt(e,6)}`}),To=x({name:"codeBlock",group:"block",content:"text*",marks:"",attrs:{language:{default:null}},toHtml:({node:t,childNodes:e})=>{let r=Z(t,"language"),i=Ue(h(e));return`<pre><code${r?` class="language-${Ue(r)}"`:""}>${i}</code></pre>`},toMarkdown:({node:t,childNodes:e})=>{let r=Z(t,"language")??"",i=h(e),o=Math.max(0,...[...i.matchAll(/`+/g)].map((s)=>s[0].length)),a="`".repeat(Math.max(3,o+1));return`${a}${r}
12
- ${i}
13
- ${a}`},toText:({childNodes:t})=>h(t)}),So=x({name:"horizontalRule",group:"block",atom:!0,toHtml:()=>"<hr>",toMarkdown:()=>"---",toText:()=>""}),Oo=x({name:"hardBreak",group:"inline",inline:!0,atom:!0,toHtml:()=>"<br>",toMarkdown:()=>`
14
- `,toText:()=>`
15
- `}),_o=x({name:"image",group:"block",atom:!0,attrs:{src:{default:null},alt:{default:null},title:{default:null},mediaId:{default:null}},toHtml:({node:t,mediaUrl:e})=>{let r=M(t.attrs,e);return`<img${We({src:r,alt:Z(t,"alt")??"",title:Z(t,"title"),"data-media-id":Z(t,"mediaId")})}>`},toMarkdown:({node:t,mediaUrl:e})=>{let r=M(t.attrs,e)??"",i=Z(t,"alt")??"",o=Z(t,"title");return`![${i}](${r}${o?` "${o}"`:""})`},toText:({node:t})=>Z(t,"alt")??""}),Po=x({name:"table",group:"block",content:"tableRow+",toHtml:({children:t})=>`<table><tbody>${t}</tbody></table>`,toMarkdown:({childStrings:t})=>{let[e,...r]=t;if(e===void 0)return"";let i=e.split(" | ").length,o=`| ${Array.from({length:i},()=>"---").join(" | ")} |`;return[`| ${e} |`,o,...r.map((a)=>`| ${a} |`)].join(`
16
- `)}}),$o=x({name:"tableRow",content:"(tableCell | tableHeader)*",toHtml:({children:t})=>`<tr>${t}</tr>`,toMarkdown:({childStrings:t})=>t.map((e)=>e.replaceAll(`
17
- `," ")).join(" | ")}),jo=x({name:"tableHeader",content:"block+",attrs:{colspan:{default:1},rowspan:{default:1},colwidth:{default:null}},toHtml:({node:t,children:e})=>`<th${N(t.attrs)}>${e}</th>`,toMarkdown:({children:t})=>t}),Io=x({name:"tableCell",content:"block+",attrs:{colspan:{default:1},rowspan:{default:1},colwidth:{default:null}},toHtml:({node:t,children:e})=>`<td${N(t.attrs)}>${e}</td>`,toMarkdown:({children:t})=>t}),Eo=Y({name:"bold",toHtml:({text:t})=>`<strong>${t}</strong>`,toMarkdown:({text:t})=>`**${t}**`}),Do=Y({name:"italic",toHtml:({text:t})=>`<em>${t}</em>`,toMarkdown:({text:t})=>`*${t}*`}),Mo=Y({name:"underline",toHtml:({text:t})=>`<u>${t}</u>`,toMarkdown:({text:t})=>`<u>${t}</u>`}),qo=Y({name:"strike",toHtml:({text:t})=>`<s>${t}</s>`,toMarkdown:({text:t})=>`~~${t}~~`}),Lo=Y({name:"code",toHtml:({text:t})=>`<code>${t}</code>`,toMarkdown:({text:t})=>`\`${t}\``}),Fo=Y({name:"link",attrs:{href:{default:null},target:{default:null},rel:{default:null}},toHtml:({mark:t,text:e})=>`<a${We({href:t.attrs?.href??"",target:t.attrs?.target,rel:t.attrs?.rel})}>${e}</a>`,toMarkdown:({mark:t,text:e})=>`[${e}](${String(t.attrs?.href??"")})`});function b(t){let e=typeof t==="number"?Math.trunc(t):1;return Math.min(6,Math.max(1,e))}function h(t){return t.map((e)=>e.text??"").join("")}function N(t){let e=t?.colspan,r=t?.rowspan;return We({colspan:typeof e==="number"&&e>1?e:void 0,rowspan:typeof r==="number"&&r>1?r:void 0})}function M(t,e){let r=t?.mediaId;if(typeof r==="string"&&e){let o=e(r);if(o)return o}let i=t?.src;return typeof i==="string"?i:void 0}function pe(t){let e=t.replaceAll(`\r
18
- `,`
19
- `).split(`
20
- `),r=g(e);return{type:"doc",content:r.length>0?r:[{type:"paragraph"}]}}function Pn(t){let e=t.replaceAll(`\r
21
- `,`
22
- `).split(/\n{2,}/).map((r)=>r.trim()).filter((r)=>r.length>0);return{type:"doc",content:e.length===0?[{type:"paragraph"}]:e.map((r)=>({type:"paragraph",content:[{type:"text",text:r}]}))}}function g(t){let e=[],r=0;while(r<t.length){let i=t[r]??"";if(i.trim().length===0){r+=1;continue}let o=/^\s*(`{3,})(.*)$/.exec(i);if(o){let d=o[1],l=(o[2]??"").trim(),c=[];r+=1;while(r<t.length&&!(t[r]??"").startsWith(d))c.push(t[r]??""),r+=1;r+=1,e.push({type:"codeBlock",...l.length>0?{attrs:{language:l}}:{},...c.length>0?{content:[{type:"text",text:c.join(`
23
- `)}]}:{}});continue}let a=/^(#{1,6})\s+(.*)$/.exec(i);if(a){e.push({type:"heading",attrs:{level:a[1].length},content:k(a[2].trim())}),r+=1;continue}if(/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(i)){e.push({type:"horizontalRule"}),r+=1;continue}if(/^\s*>/.test(i)){let d=[];while(r<t.length&&/^\s*>/.test(t[r]??""))d.push((t[r]??"").replace(/^\s*>\s?/,"")),r+=1;e.push({type:"blockquote",content:g(d)});continue}if(p(i)){let[d,l]=H(t,r);e.push(d),r=l;continue}let s=[];while(r<t.length){let d=t[r]??"";if(d.trim().length===0||p(d)||/^(#{1,6})\s/.test(d)||/^\s*>/.test(d)||/^\s*`{3,}/.test(d))break;s.push(d.trim()),r+=1}e.push({type:"paragraph",content:k(s.join(" "))})}return e}function p(t){let e=/^(\s*)[-*+]\s+(\[([ xX])\]\s+)?(.*)$/.exec(t);if(e){let i=e[3];return{ordered:!1,task:i===void 0?null:i.toLowerCase()==="x",indent:(e[1]??"").length,text:e[4]??"",start:1}}let r=/^(\s*)(\d+)[.)]\s+(.*)$/.exec(t);if(r)return{ordered:!0,task:null,indent:(r[1]??"").length,text:r[3]??"",start:Number(r[2]??1)};return null}function H(t,e){let r=p(t[e]??"");if(!r)return[{type:"paragraph"},e+1];let i=[],o=e;while(o<t.length){let s=p(t[o]??"");if(!s||s.indent!==r.indent)break;if(s.ordered!==r.ordered)break;if(s.task===null!==(r.task===null))break;let d=[s.text];o+=1;while(o<t.length){let l=t[o]??"";if(l.trim().length===0)break;let c=p(l);if(c&&c.indent<=r.indent)break;if(!c&&l.search(/\S/)<=r.indent)break;d.push(l.slice(r.indent+2)),o+=1}i.push({type:r.task===null?"listItem":"taskItem",...s.task===null?{}:{attrs:{checked:s.task}},content:g(d)})}let a=r.task!==null?"taskList":r.ordered?"orderedList":"bulletList";return[{type:a,...a==="orderedList"&&r.start!==1?{attrs:{start:r.start}}:{},content:i},o]}function k(t){let e=[],r="",i=()=>{if(r.length===0)return;e.push({type:"text",text:r}),r=""},o=0;while(o<t.length){let a=t.slice(o);if(a.startsWith("\\")&&a.length>1){r+=a[1],o+=2;continue}let s=/^\[([^\]]*)\]\(([^)\s]*)(?:\s+"([^"]*)")?\)/.exec(a);if(s){if(i(),o>0&&t[o-1]==="!"){e.push({type:"image",attrs:{src:s[2]??"",alt:s[1]??""}});let f=e.at(-2);if(f?.type==="text"&&f.text?.endsWith("!"))f.text=f.text.slice(0,-1)}else e.push({type:"text",text:s[1]??"",marks:[{type:"link",attrs:{href:s[2]??""}}]});o+=s[0].length;continue}let d=A(a);if(d){i();for(let c of k(d.inner))e.push(L(c,d.mark));o+=d.length;continue}let l=/^`([^`]+)`/.exec(a);if(l){i(),e.push({type:"text",text:l[1]??"",marks:[{type:"code"}]}),o+=l[0].length;continue}r+=t[o],o+=1}return i(),e}function A(t){let e=[[/^\*\*\*([^*]+)\*\*\*/,{type:"bold"}],[/^\*\*([^*]+)\*\*/,{type:"bold"}],[/^__([^_]+)__/,{type:"bold"}],[/^~~([^~]+)~~/,{type:"strike"}],[/^\*([^*]+)\*/,{type:"italic"}],[/^_([^_]+)_/,{type:"italic"}]];for(let[r,i]of e){let o=r.exec(t);if(o)return{mark:i,inner:o[1]??"",length:o[0].length}}return null}function L(t,e){if(t.type!=="text")return t;return{...t,marks:[...t.marks??[],e]}}export{x,Y,Ne,wt,Tn,Sn,de,ue,On,J,_n,Ue,oo,We,vt,Z,yo,bo,wo,vo,Ao,xo,ko,Ro,Co,To,So,Oo,_o,Po,$o,jo,Io,Eo,Do,Mo,qo,Lo,Fo,pe,Pn};
@@ -1,3 +0,0 @@
1
- import{J}from"./index-9zqnf6gx.js";import{z,$e,bt,C,_}from"./index-vq2978e7.js";import{c}from"./index-2z1qe5mw.js";import{t}from"./index-vxw0a03g.js";import{d}from"./index-9g2n7xa6.js";import{X,on}from"./index-kbsgt44t.js";import{w}from"./index-2kb5nbxx.js";import{e}from"./index-x72d1hzh.js";var L="v1",ee=12;async function V(n){if(n.length<16)throw new e("ai.storage.secret must be at least 16 characters; it encrypts provider keys.",{status:500,code:"ai_secret_too_short"});let i=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(n));return crypto.subtle.importKey("raw",i,{name:"AES-GCM"},!1,["encrypt","decrypt"])}async function I(n,i){let r=await V(i),a=crypto.getRandomValues(new Uint8Array(ee)),l=await crypto.subtle.encrypt({name:"AES-GCM",iv:a},r,new TextEncoder().encode(n));return[L,X(a),X(new Uint8Array(l))].join(".")}async function j(n,i){let[r,a,l]=n.split(".");if(r!==L||!a||!l)throw new e("A stored provider key is not in a format this version can read.",{status:500,code:"ai_credential_unreadable"});let s=await V(i);try{let f=await crypto.subtle.decrypt({name:"AES-GCM",iv:on(a)},s,on(l));return new TextDecoder().decode(f)}catch{throw new e("A stored provider key could not be decrypted; ai.storage.secret has probably changed. Re-enter the key in the panel.",{status:500,code:"ai_credential_unreadable"})}}function E(n){return n.length<=4?"****":`…${n.slice(-4)}`}var U;async function F(){return U??=import("@mariozechner/pi-ai").catch(()=>{throw new e('AI needs "@mariozechner/pi-ai". Install it, or set ai.complete to your own implementation.',{status:500,code:"ai_runtime_missing"})}),U}async function hn(n){let{getModel:i}=await F(),r;try{r=i(n.provider,n.model)}catch{r=void 0}if(r)return r;throw await yn(n.provider,n.model),new e(`pi could not resolve ${n.provider}/${n.model}.`,{status:500,code:"ai_unknown_model"})}function B(n,i){let r=gn(n);if(r.includes(i.type))return;throw new e(`The provider "${n}" needs ${r.map((a)=>`"${a}"`).join(" or ")} credentials.`,{status:500,code:"ai_auth_mismatch"})}async function Vn(n,i){switch(B(n,i),i.type){case"api-key":return{getApiKey:()=>i.token};case"oauth":return{getApiKey:()=>i.getAccessToken()};case"aws":{let{streamSimple:r}=await F();return{streamFn:(a,l,s)=>r(a,l,{...s,region:i.region,...i.accessKeyId===void 0?{}:{accessKeyId:i.accessKeyId},...i.secretAccessKey===void 0?{}:{secretAccessKey:i.secretAccessKey}})}}}}var te=new Set(["github-copilot","openai-codex"]);function gn(n){if(n==="amazon-bedrock")return["aws"];if(te.has(n))return["oauth"];return["api-key"]}async function yn(n,i){let{getModel:r,getProviders:a}=await F();try{if(r(n,i))return}catch{}if(!a().includes(n))throw new e(`The AI provider "${n}" is not in pi's catalogue.`,{status:400,code:"ai_unknown_provider"});throw new e(`The provider "${n}" has no model called "${i}".`,{status:400,code:"ai_unknown_model"})}async function Gn(n){try{let{getModels:i}=await F();return i(n).map((r)=>r.id)}catch{return[]}}var Le=async(n)=>{let{complete:i,stream:r}=await F(),{model:a,auth:l}=n;B(a.provider,l);let s=await hn(a),f={systemPrompt:n.system,messages:[{role:"user",content:[{type:"text",text:n.prompt},...(n.images??[]).map((u)=>({type:"image",data:ne(u.data),mimeType:u.contentType}))],timestamp:Date.now()}]},m={...n.maxTokens===void 0?{}:{maxTokens:n.maxTokens},...n.signal===void 0?{}:{signal:n.signal},...l.type==="api-key"?{apiKey:l.token}:{},...l.type==="oauth"?{apiKey:await l.getAccessToken()}:{},...l.type==="aws"?{region:l.region,...l.accessKeyId===void 0?{}:{accessKeyId:l.accessKeyId},...l.secretAccessKey===void 0?{}:{secretAccessKey:l.secretAccessKey}}:{}},g=await i(s,f,m);if(g.stopReason==="error"||g.errorMessage)throw new e(g.errorMessage??"The model returned an error.",{status:502,code:"ai_provider_error"});return{text:g.content.filter((u)=>u.type==="text").map((u)=>u.text).join(""),usage:bn(g.usage)}};function bn(n){return{input:n.input??0,output:n.output??0,total:n.totalTokens??(n.input??0)+(n.output??0),cost:n.cost?.total??0}}function ne(n){let i="";for(let r of n)i+=String.fromCharCode(r);return btoa(i)}async function q(n){let i={input:0,output:0,total:0,cost:0},r=async(s)=>{if(!s.trim())return s;let f=await n.complete({system:"Translate CMS text. Answer with the translation only, without quotes or a preamble. Keep names, placeholders and URLs intact.",prompt:`Translate from ${n.sourceLocale} to ${n.locale}. This text belongs to the ${n.fieldName} field:
2
-
3
- ${s}`,...n.signal===void 0?{}:{signal:n.signal}});i.input+=f.usage.input,i.output+=f.usage.output,i.total+=f.usage.total,i.cost+=f.usage.cost;let m=f.text.trim();if(!m)throw Error(`AI returned an empty translation for ${n.fieldName}.`);let g=s.slice(0,s.length-s.trimStart().length),o=s.slice(s.trimEnd().length);return`${g}${m}${o}`},a=async(s)=>{if(Array.isArray(s)){let m=[];for(let g of s)m.push(await a(g));return m}if(!s||typeof s!=="object")return s;let f={...s};if(s.type==="text"&&typeof s.text==="string")f.text=await r(s.text);if(s.type==="image"&&s.attrs&&typeof s.attrs==="object"&&!Array.isArray(s.attrs)){let m={...s.attrs};for(let g of["alt","title"])if(typeof m[g]==="string")m[g]=await r(m[g]);f.attrs=m}if(Array.isArray(s.content))f.content=await a(s.content);return f},l=await a(n.value);return{value:l,preview:J(l),usage:i}}var k="cms_ai_credentials";function ht(n){let{config:i}=n,r=i.ai?.complete??Le,a=async(o)=>{try{return await r(o)}catch(u){if(u instanceof e)throw u;if(o.signal?.aborted)throw new e("The request was cancelled.",{status:499,code:"ai_aborted",cause:u});let p=u instanceof Error?u.message:"The AI provider could not complete the request.";throw new e(p,{status:502,code:"ai_provider_error",cause:u})}},l=()=>{let o=i.ai;if(!o)throw new e("This deployment has no `ai` section, so AI is switched off.",{status:501,code:"ai_disabled"});return o},s=(o)=>{let u={...i.collections,...i.globals},p=u[o];if(p)return p;let y=Object.values(u).find((h)=>h.slug===o);if(y)return y;throw e.notFound(`No collection called "${o}".`)},f=async(o)=>{let u=l(),p=await ie(n,o);if(p)return{type:"api-key",token:p};let y=u.auth?.[o];if(y)return y;throw new e(`No credentials for the AI provider "${o}". Add them to ai.auth or store them in the panel.`,{status:500,code:"ai_credentials_missing"})},m=async(o)=>{if(!i.uploads)return null;try{let u=await n.cms().media.variant({id:o});if(!u||!u.contentType.startsWith("image/"))return null;let p=new Uint8Array(await new Response(u.body).arrayBuffer());return{contentType:u.contentType,data:p}}catch{return null}},g=async(o,u,p,y)=>{await(await n.database()).transaction((A)=>n.emit(A,[{type:o,data:y===void 0?u:{...u,error:y instanceof Error?y.message:String(y)},previous:null}],{actor:p,...typeof u.collection==="string"?{collection:u.collection}:{},...typeof u.documentId==="string"?{documentId:u.documentId}:{}})),n.deliver()};return{get enabled(){return i.ai!==void 0},get assistantEnabled(){return i.ai!==void 0&&i.ai.assistant?.enabled!==!1},actions(o){return $e(o)},async run(o){let u=l(),p=s(o.collection),y=o.actor??null,h=o.locale??i.i18n.defaultLocale,A=p.fields[o.field];if(!A)throw e.notFound(`"${o.field}" is not a field of ${p.name}.`);let x=o.action==="generate"&&A.aiGenerate!==void 0?A.aiGenerate:A.ai?.[o.action],T=o.variantTranslation===!0&&o.action==="translate"&&A.localized&&["text","textarea","richText","email","url"].includes(A.type);if(x===void 0&&!T)throw e.notFound(`"${o.action}" is not configured on ${p.name}.${o.field}.`);let R=x===void 0||x===!0?{}:x,S=z(o.action)??bt(o.action,R.prompt??"");if(S.requiresLocalized&&!A.localized)throw e.validation(`"${o.action}" needs a localized field; ${p.name}.${o.field} stores one value for every language.`);let P=o.sourceLocale??(S.requiresLocalized?i.i18n.defaultLocale:h),{document:O,stored:D}=await N(n,p,o,h),H=S.requiresLocalized&&P!==h?(await N(n,p,o,P,o.variantTranslation===!0)).document:O;await C(p,{actor:y,operation:"update",locale:h,rbac:i.rbac,...D===void 0?{}:{record:D}}),_(p,{[o.field]:null},y,h);let W=oe(p,y,h),Q=(R.context??[]).filter((b)=>{if(!(b in p.fields))throw e.validation(`ai.context names "${b}", which is not a field of ${p.name}.`);return W.has(b)}),v=R.model??u.defaultModel,Y=await f(v.provider),K={action:o.action,value:H[o.field]??null,field:A,fieldName:o.field,collection:p,context:Object.fromEntries(Q.map((b)=>[b,O[b]??null])),document:O,locale:h,sourceLocale:P,options:R,model:v,actor:y,loadImage:m,complete:(b)=>a({...b,model:v,auth:Y}),...o.signal===void 0?{}:{signal:o.signal}},Z=Date.now();try{let b=T&&A.type==="richText"?await q(K):await S.run(K);return await g("ai.task.completed",{collection:p.name,field:o.field,action:o.action,locale:h,provider:v.provider,model:v.model,usage:b.usage,durationMs:Date.now()-Z,...o.id===void 0?{}:{documentId:o.id}},y),{collection:p.name,field:o.field,action:o.action,value:b.value,preview:b.preview,model:v,usage:b.usage}}catch(b){throw await g("ai.task.failed",{collection:p.name,field:o.field,action:o.action,locale:h,provider:v.provider,model:v.model,...o.id===void 0?{}:{documentId:o.id}},y,b),b}},runAssistant(o){return async function*(){let{runAssistant:u}=await import("./run-3r72dwhs.js");yield*u({args:o,config:i,cms:n.cms(),database:()=>n.database(),authFor:f,record:g})}()},approveAssistantPlan(o){return import("./run-3r72dwhs.js").then(({approvePlan:u})=>u({args:o,config:i,cms:n.cms(),database:()=>n.database(),record:g}))},async providers(){let o=i.ai,u=new Map;for(let[y,h]of Object.entries(o?.auth??{}))u.set(y,{provider:y,configured:!0,source:"config",type:h.type,hint:null,updatedAt:null});if(o?.storage?.secret){let y=await n.database(),h=await y.transaction((A)=>y.query(A,{table:k}));for(let A of h)u.set(String(A.provider),{provider:String(A.provider),configured:!0,source:"database",type:"api-key",hint:A.hint===null||A.hint===void 0?null:String(A.hint),updatedAt:c(A.updated_at)})}let p=o?.defaultModel.provider;if(p&&!u.has(p))u.set(p,{provider:p,configured:!1,source:null,type:null,hint:null,updatedAt:null});return[...u.values()].sort((y,h)=>y.provider.localeCompare(h.provider))},async setCredential(o){let p=l().storage?.secret;if(!p)throw new e("Set ai.storage.secret to store provider keys in the database; without it keys can only come from ai.auth.",{status:501,code:"ai_storage_disabled"});let y=o.token.trim();if(y.length===0)throw e.validation("A provider key cannot be empty.");let h=await n.database(),A=new Date,x=await I(y,p),T=E(y);return await h.transaction(async(S)=>{let P=d(h,S);if(await P.findOne(k,t("provider",o.provider)))await P.update(k,t("provider",o.provider),{secret:x,hint:T,updated_at:A});else await P.insert(k,{id:w("aic"),provider:o.provider,auth_type:"api-key",secret:x,hint:T,created_at:A,updated_at:A});return{provider:o.provider,configured:!0,source:"database",type:"api-key",hint:T,updatedAt:A.toISOString()}})},async removeCredential(o){l();let u=await n.database();return u.transaction(async(p)=>await d(u,p).delete(k,t("provider",o.provider))>0)}}}async function ie(n,i){let r=n.config.ai?.storage?.secret;if(!r)return null;let a=await n.database(),l=await a.transaction(async(s)=>d(a,s).findOne(k,t("provider",i)));if(!l||typeof l.secret!=="string")return null;return j(l.secret,r)}async function N(n,i,r,a,l=!1){let s=n.cms(),f=r.actor??null,m;if(i.kind==="global"){let o=s.globals[i.name];if(o)m=await o.get({actor:f,locale:a,...l?{fallbackLocale:!1}:{}})}else if(r.id){let g=s.api[i.name],o=g?await g.findById(r.id,{actor:f,locale:a,...l?{fallbackLocale:!1}:{}}):null;if(!o)throw e.notFound(`No ${i.name} with id "${r.id}", or it is not readable.`);m=o}return{document:{...m??{},...r.document??{}},stored:m}}function oe(n,i,r){let a=new Set;for(let[l,s]of Object.entries(n.fields)){let f=s.access?.read;if(f&&!f({actor:i,locale:r}))continue;a.add(l)}return a}function pt(n,i,r){let a=n.i18n.defaultLocale,l=Object.values(n.collections).map((m)=>G(m,i,a)).filter((m)=>m!==null),s=Object.values(n.globals).map((m)=>G(m,i,a)).filter((m)=>m!==null),f={collections:l,globals:s,defaultLocale:a,locales:r,media:n.uploads!==void 0,trash:n.trash.enabled};return{...f,fingerprint:se(f)}}function G(n,i,r){if(!M(n,"read",i,r))return null;let a=[];for(let[l,s]of Object.entries(n.fields)){let f=s.access?.read;if(f&&!f({actor:i,locale:r}))continue;a.push(re(l,s,n,i,r))}return{name:n.name,slug:n.slug,label:n.label,kind:n.kind,titleField:ft(n),fields:a,can:{read:!0,create:n.kind==="collection"&&M(n,"create",i,r),update:M(n,"update",i,r),delete:n.kind==="collection"&&M(n,"delete",i,r)}}}function re(n,i,r,a,l){let s=i.options,f=Array.isArray(s.options)?s.options.map((m)=>typeof m==="string"?m:typeof m==="object"&&m!==null?String(m.value??""):"").filter((m)=>m.length>0):void 0;return{name:n,type:i.type,label:typeof s.label==="string"?s.label:n,required:i.required,localized:i.localized===!0,...f&&f.length>0?{options:f}:{},...i.relationTo===void 0?{}:{relationTo:i.relationTo},writable:mt(r,n,a,l)}}function mt(n,i,r,a){let l=n.fields[i];if(!l)return!1;if(l.options.readOnly===!0)return!1;try{return _(n,{[i]:null},r,a),!0}catch{return!1}}function Vt(n,i,r,a){let l=n.fields[i]?.access?.read;return l?l({actor:r,locale:a})===!0:!0}function M(n,i,r,a){let l=n.access[i];if(!l)return!0;try{let s=l({actor:r,operation:i,locale:a});if(s instanceof Promise)return!0;return s!==!1}catch{return!0}}function ft(n){let i=n.admin?.useAsTitle;if(i!==void 0&&n.fields[i])return i;for(let a of["title","name","label"])if(n.fields[a])return a;return Object.entries(n.fields).find(([,a])=>a.type==="text")?.[0]??null}function se(n){let i=JSON.stringify(n),r=2166136261;for(let a=0;a<i.length;a+=1)r^=i.charCodeAt(a),r=Math.imul(r,16777619)>>>0;return r.toString(16).padStart(8,"0")}export{hn,Vn,gn,yn,Gn,Le,bn,pt,mt,Vt,ft,ht};
@@ -1,2 +0,0 @@
1
- import{b}from"./index-cbwwtcm4.js";async function Qe(o,r={}){let{drainEvents:t=!0,...s}=r,i=await o.jobs.run(s);if(t)await o.drainEvents();return i}function ln(o){let{cms:r,interval:t=60000,immediate:s=!0,onReport:i,onError:e,signal:f,...R}=o,v=typeof t==="number"?t:b(t),a=!1,p=null,u,c=async()=>{let n=Qe(r,R);p=n;try{let m=await n;return i?.(m),m}finally{p=null}},l=()=>{if(a)return;u=setTimeout(()=>{c().catch((n)=>{if(e)e(n);else console.error("[heyo-cms] job sweep failed:",n)}).finally(l)},v),u.unref?.()},d={runNow:()=>c(),async stop(){if(a=!0,u)clearTimeout(u);await p?.catch(()=>{return})},get running(){return!a}};if(f?.addEventListener("abort",()=>void d.stop(),{once:!0}),s)c().catch((n)=>{if(e)e(n);else console.error("[heyo-cms] job sweep failed:",n)}).finally(l);else l();return d}function dn(o,r={}){return async(t,s,i)=>{let e=Qe(o,r);i?.waitUntil?.(e),await e}}
2
- export{Qe,ln,dn};
@@ -1,2 +0,0 @@
1
- async function ke(e){let t=crypto.getRandomValues(new Uint8Array(16)),n=await o(e,t,1e5);return["pbkdf2-sha256",1e5,X(t),X(n)].join("$")}async function nn(e,t){if(!t)return!1;let[n,r,s,i]=t.split("$");if(n!=="pbkdf2-sha256"||!r||!s||!i)return!1;let a=await o(e,on(s),Number(r));return c(X(a),i)}async function o(e,t,n){let r=await crypto.subtle.importKey("raw",new TextEncoder().encode(e),"PBKDF2",!1,["deriveBits"]),s=await crypto.subtle.deriveBits({name:"PBKDF2",salt:t,iterations:n,hash:"SHA-256"},r,256);return new Uint8Array(s)}function he(e=32){return X(crypto.getRandomValues(new Uint8Array(e)))}async function Q(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));return l(new Uint8Array(t))}function c(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r+=1)n|=e.charCodeAt(r)^t.charCodeAt(r);return n===0}function X(e){let t="";for(let n of e)t+=String.fromCharCode(n);return btoa(t).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function on(e){let t=e.replaceAll("-","+").replaceAll("_","/"),n=atob(t.padEnd(Math.ceil(t.length/4)*4,"=")),r=new Uint8Array(n.length);for(let s=0;s<n.length;s+=1)r[s]=n.charCodeAt(s);return r}function l(e){let t="";for(let n of e)t+=n.toString(16).padStart(2,"0");return t}async function io(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));return X(new Uint8Array(t))}
2
- export{ke,nn,he,Q,X,on,io};
@@ -1,2 +0,0 @@
1
- function O(t){let n=t.length;while(n>0&&t.charCodeAt(n-1)===47)n--;return n===t.length?t:t.slice(0,n)}
2
- export{O};
@@ -1,5 +0,0 @@
1
- import{c,p}from"./index-2z1qe5mw.js";import{s,t,Ke,I}from"./index-vxw0a03g.js";import{V,it}from"./index-ty698y02.js";import{g}from"./index-ymq6jsar.js";var Ze="heyo-cms/export",Ee=1;function Un(n,e){let o;try{o=JSON.parse(n)}catch{throw Error(`Line ${e} is not JSON.`)}if(!h(o)||typeof o.kind!=="string")throw Error(`Line ${e} has no "kind".`);if(!["header","document","global"].includes(o.kind))throw Error(`Line ${e} has an unknown kind: ${o.kind}.`);if(o.kind==="header"){if(typeof o.format!=="string"||!Number.isInteger(o.version))throw Error(`Line ${e} has an invalid export header.`)}else{let r=o.kind==="document"?o.collection:o.global;if(typeof r!=="string"||r.length===0||!h(o.data))throw Error(`Line ${e} needs a collection/global name and an object "data".`);if(o.kind==="document"&&(typeof o.id!=="string"||o.id.length===0))throw Error(`Line ${e} needs a non-empty document "id".`)}return o}async function*Pt(n){let e=0;for await(let o of n){e+=1;let r=o.trim();if(r.length===0)continue;yield Un(r,e)}}async function*$t(n){let e="";for await(let o of n){e+=o;let r=e.indexOf(`
2
- `);while(r!==-1)yield e.slice(0,r),e=e.slice(r+1),r=e.indexOf(`
3
- `)}if(e.length>0)yield e}function jt(n){return`${JSON.stringify(n)}
4
- `}function h(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}async function*It(n,e={}){let o=n._config,r=w(o.collections,e.collections,"collection"),a=w(o.globals,e.globals,"global"),l=await n.database();yield{kind:"header",format:Ze,version:Ee,exportedAt:new Date().toISOString(),database:l.id,defaultLocale:o.i18n.defaultLocale,collections:r.map((d)=>d.name),globals:a.map((d)=>d.name)};let i=Math.max(1,e.batchSize??200);for(let d of r){let f;for(;;){let m=await y(n,{where:s(t("collection",d.slug),e.includeTrashed?void 0:t("deleted_at",null),f===void 0?void 0:Ke("id",f)),limit:i});if(m.length===0)break;for(let b of m)yield k(d,b,e);if(f=String(m[m.length-1]?.id),m.length<i)break}}if(a.length>0){let d=await y(n,{where:I("id",a.map((m)=>V(m))),limit:a.length}),f=new Map(d.map((m)=>[String(m.id),m]));for(let m of a){let b=f.get(V(m));yield{kind:"global",global:m.name,data:b?p(b.data):{},updatedAt:b?c(b.updated_at):null}}}}function k(n,e,o){let r={kind:"document",collection:n.name,id:String(e.id),data:p(e.data),createdAt:c(e.created_at),updatedAt:c(e.updated_at)};if(o.includeTrashed)r.deletedAt=c(e.deleted_at);let a=c(e.scheduled_at);if(a!==null)r.scheduledAt=a,r.scheduledPatch=p(e.scheduled_patch).data??null;return r}async function y(n,e){let o=await n.database();return o.transaction((r)=>o.query(r,{table:g,...e.where===void 0?{}:{where:e.where},orderBy:[{path:"id",direction:"asc"}],limit:e.limit}))}function w(n,e,o){if(!e)return Object.values(n);return e.map((r)=>{let a=n[r];if(!a){let l=Object.keys(n).join(", ")||"none";throw Error(`Unknown ${o}: ${r}. Declared: ${l}.`)}return a})}async function Et(n,e,o={}){let r={documents:{created:0,updated:0,skipped:0},globals:{updated:0,skipped:0},errors:[]},a=o.actor===void 0?it():o.actor,l=o.onConflict??"skip",u=!1;for await(let i of e){if(i.kind==="header"){A(i.format,i.version),u=!0;continue}if(!u)throw Error("The file does not start with an export header. Was it produced by `heyo-cms export`?");try{if(i.kind==="document")await x(n,i,{actor:a,onConflict:l,...o},r);else await O(n,i,{actor:a,...o},r)}catch(d){let f=i.kind==="document"?`${i.collection}/${i.id}`:`globals/${i.global}`;if(r.errors.push(`${f}: ${J(d)}`),i.kind==="document")r.documents.skipped+=1;else r.globals.skipped+=1}}if(!u)throw Error("The file is empty.");if(!o.dryRun)await n.drainEvents();return r}async function x(n,e,o,r){let a=n._config.collections[e.collection];if(!a)throw Error(`no collection named "${e.collection}" is declared`);if(e.deletedAt){r.documents.skipped+=1;return}let l=C(n,e.collection),u=await l.findById(e.id,{actor:o.actor??null,includeTrashed:!0});if(u&&o.onConflict==="fail")throw Error("a document with this id is already here");if(u&&o.onConflict==="skip"){r.documents.skipped+=1;return}if(o.dryRun){if(u)r.documents.updated+=1;else r.documents.created+=1;return}let i=cn(a,e.data,n._config.i18n.defaultLocale);if(u){if(await l.update({id:e.id,data:i.base,actor:o.actor??null,source:"cli"})===null){r.documents.skipped+=1;return}r.documents.updated+=1}else{if(await l.create({id:e.id,data:i.base,actor:o.actor??null,source:"cli"})===null){r.documents.skipped+=1;return}r.documents.created+=1}for(let[d,f]of Object.entries(i.translations))await l.update({id:e.id,data:f,locale:d,actor:o.actor??null,source:"cli"});if(e.scheduledAt&&R(e.scheduledPatch))await l.schedule({id:e.id,at:e.scheduledAt,data:e.scheduledPatch,actor:o.actor??null,source:"cli"})}async function O(n,e,o,r){let a=n._config.globals[e.global];if(!a)throw Error(`no global named "${e.global}" is declared`);if(o.dryRun){r.globals.updated+=1;return}let l=j(n,e.global),u=cn(a,e.data,n._config.i18n.defaultLocale);await l.update({data:u.base,actor:o.actor??null,source:"cli"});for(let[i,d]of Object.entries(u.translations))await l.update({data:d,locale:i,actor:o.actor??null,source:"cli"});r.globals.updated+=1}function cn(n,e,o){let r=Object.create(null),a=Object.create(null);for(let[l,u]of Object.entries(n.fields)){let i=e[l];if(i===void 0)continue;if(!u.localized){r[l]=i;continue}if(!R(i)){r[l]=i;continue}for(let[d,f]of Object.entries(i)){if(f===void 0)continue;if(d===o){r[l]=f;continue}(a[d]??=Object.create(null))[l]=f}}return{base:r,translations:a}}function A(n,e){if(n!==Ze)throw Error(`Unknown export format: ${n}.`);if(!Number.isInteger(e)||e<1)throw Error(`Invalid export version: ${e}.`);if(e>Ee)throw Error(`This file is version ${e}; this CMS reads up to ${Ee}. Upgrade @heyo-sh/heyo-cms.`)}function C(n,e){return n.api[e]}function j(n,e){return n.globals[e]}function R(n){return typeof n==="object"&&n!==null&&!Array.isArray(n)}function J(n){return n instanceof Error?n.message:String(n)}
5
- export{Ze,Ee,Un,Pt,$t,jt,It,Et,cn};