@shapio/cms 0.5.5 → 0.5.6

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 (156) hide show
  1. package/dist/admin/assets/{AssetTile-CaYPqR_F.js → AssetTile-_qRYsivK.js} +2 -2
  2. package/dist/admin/assets/{AssetTile-CaYPqR_F.js.map → AssetTile-_qRYsivK.js.map} +1 -1
  3. package/dist/admin/assets/{AssistError-drmpXSbS.js → AssistError-CMXQWiQo.js} +2 -2
  4. package/dist/admin/assets/{AssistError-drmpXSbS.js.map → AssistError-CMXQWiQo.js.map} +1 -1
  5. package/dist/admin/assets/{BlockMenuItems-D-jZ0oaU.js → BlockMenuItems-WIrbyv1a.js} +2 -2
  6. package/dist/admin/assets/{BlockMenuItems-D-jZ0oaU.js.map → BlockMenuItems-WIrbyv1a.js.map} +1 -1
  7. package/dist/admin/assets/{Body-Gn_z2KPN.js → Body-BYc1IVsQ.js} +2 -2
  8. package/dist/admin/assets/{Body-Gn_z2KPN.js.map → Body-BYc1IVsQ.js.map} +1 -1
  9. package/dist/admin/assets/Builder-CwHpRhZN.js +2 -0
  10. package/dist/admin/assets/Builder-CwHpRhZN.js.map +1 -0
  11. package/dist/admin/assets/{CodeEditor-CzRU6och.js → CodeEditor-NMvrWgxT.js} +2 -2
  12. package/dist/admin/assets/{CodeEditor-CzRU6och.js.map → CodeEditor-NMvrWgxT.js.map} +1 -1
  13. package/dist/admin/assets/{ConfirmDialog-DZRJfdvH.js → ConfirmDialog-Rd6WDt6q.js} +2 -2
  14. package/dist/admin/assets/{ConfirmDialog-DZRJfdvH.js.map → ConfirmDialog-Rd6WDt6q.js.map} +1 -1
  15. package/dist/admin/assets/{CopyButton-h4HYhnYp.js → CopyButton-B0RuxynJ.js} +2 -2
  16. package/dist/admin/assets/{CopyButton-h4HYhnYp.js.map → CopyButton-B0RuxynJ.js.map} +1 -1
  17. package/dist/admin/assets/{CursorPager-H4SpVYw7.js → CursorPager-CQZsKNxR.js} +2 -2
  18. package/dist/admin/assets/{CursorPager-H4SpVYw7.js.map → CursorPager-CQZsKNxR.js.map} +1 -1
  19. package/dist/admin/assets/{FocalPoint-CSeKI4Iw.js → FocalPoint-BYu2fOTb.js} +2 -2
  20. package/dist/admin/assets/{FocalPoint-CSeKI4Iw.js.map → FocalPoint-BYu2fOTb.js.map} +1 -1
  21. package/dist/admin/assets/{Form-DF_YmR1G.js → Form-CiZUsLPp.js} +2 -2
  22. package/dist/admin/assets/{Form-DF_YmR1G.js.map → Form-CiZUsLPp.js.map} +1 -1
  23. package/dist/admin/assets/{FormCheckboxGroup-V3IKrvzc.js → FormCheckboxGroup-Bz8KERs1.js} +2 -2
  24. package/dist/admin/assets/{FormCheckboxGroup-V3IKrvzc.js.map → FormCheckboxGroup-Bz8KERs1.js.map} +1 -1
  25. package/dist/admin/assets/{FormRadioGroup-DIv-MYgn.js → FormRadioGroup-c-wyx7dq.js} +2 -2
  26. package/dist/admin/assets/{FormRadioGroup-DIv-MYgn.js.map → FormRadioGroup-c-wyx7dq.js.map} +1 -1
  27. package/dist/admin/assets/{FormSelectField-CUhaPIMY.js → FormSelectField-ijG9qPpb.js} +2 -2
  28. package/dist/admin/assets/{FormSelectField-CUhaPIMY.js.map → FormSelectField-ijG9qPpb.js.map} +1 -1
  29. package/dist/admin/assets/{FormSwitchField-DW8ysyk_.js → FormSwitchField-Bp3hNpeP.js} +2 -2
  30. package/dist/admin/assets/{FormSwitchField-DW8ysyk_.js.map → FormSwitchField-Bp3hNpeP.js.map} +1 -1
  31. package/dist/admin/assets/{FormTextareaField-DbqZ-MwI.js → FormTextareaField-BSKMqHcW.js} +2 -2
  32. package/dist/admin/assets/{FormTextareaField-DbqZ-MwI.js.map → FormTextareaField-BSKMqHcW.js.map} +1 -1
  33. package/dist/admin/assets/{HintedLabel-BlLtqVVz.js → HintedLabel-BrLH4NQW.js} +2 -2
  34. package/dist/admin/assets/{HintedLabel-BlLtqVVz.js.map → HintedLabel-BrLH4NQW.js.map} +1 -1
  35. package/dist/admin/assets/{InfoHint-bYMd_t0J.js → InfoHint-Dyzyf59c.js} +2 -2
  36. package/dist/admin/assets/{InfoHint-bYMd_t0J.js.map → InfoHint-Dyzyf59c.js.map} +1 -1
  37. package/dist/admin/assets/{InsertMenuItem-D2HGERzb.js → InsertMenuItem-BvRDuXtd.js} +2 -2
  38. package/dist/admin/assets/{InsertMenuItem-D2HGERzb.js.map → InsertMenuItem-BvRDuXtd.js.map} +1 -1
  39. package/dist/admin/assets/{Match-GDx_orOH.js → Match-Bixf1ygj.js} +2 -2
  40. package/dist/admin/assets/{Match-GDx_orOH.js.map → Match-Bixf1ygj.js.map} +1 -1
  41. package/dist/admin/assets/{QueryView-UBO-U5Wo.js → QueryView--_vvV7dC.js} +2 -2
  42. package/dist/admin/assets/{QueryView-UBO-U5Wo.js.map → QueryView--_vvV7dC.js.map} +1 -1
  43. package/dist/admin/assets/{RadioTile-CJbIIV8t.js → RadioTile-BCp6auUz.js} +2 -2
  44. package/dist/admin/assets/{RadioTile-CJbIIV8t.js.map → RadioTile-BCp6auUz.js.map} +1 -1
  45. package/dist/admin/assets/{RichTextField-M7HyUhYF.js → RichTextField-fWNjndUc.js} +2 -2
  46. package/dist/admin/assets/{RichTextField-M7HyUhYF.js.map → RichTextField-fWNjndUc.js.map} +1 -1
  47. package/dist/admin/assets/{RowTitle-DoxDM1XL.js → RowTitle-B4CE8tt7.js} +2 -2
  48. package/dist/admin/assets/{RowTitle-DoxDM1XL.js.map → RowTitle-B4CE8tt7.js.map} +1 -1
  49. package/dist/admin/assets/{SecretReveal-kCkLH5jg.js → SecretReveal-BhSqdWqh.js} +2 -2
  50. package/dist/admin/assets/{SecretReveal-kCkLH5jg.js.map → SecretReveal-BhSqdWqh.js.map} +1 -1
  51. package/dist/admin/assets/{SharedGlyph-D1OMHXPf.js → SharedGlyph-71FTypoi.js} +2 -2
  52. package/dist/admin/assets/{SharedGlyph-D1OMHXPf.js.map → SharedGlyph-71FTypoi.js.map} +1 -1
  53. package/dist/admin/assets/StepList-CZJmwy9e.js +2 -0
  54. package/dist/admin/assets/StepList-CZJmwy9e.js.map +1 -0
  55. package/dist/admin/assets/Structure-Dk87778W.js +2 -0
  56. package/dist/admin/assets/{Structure-CO4aJZVP.js.map → Structure-Dk87778W.js.map} +1 -1
  57. package/dist/admin/assets/{SuggestAltButton-CbRUxD5s.js → SuggestAltButton-CxS8IR6m.js} +2 -2
  58. package/dist/admin/assets/{SuggestAltButton-CbRUxD5s.js.map → SuggestAltButton-CxS8IR6m.js.map} +1 -1
  59. package/dist/admin/assets/{Thumbnail-D1XuDElk.js → Thumbnail-BwbCNpgQ.js} +2 -2
  60. package/dist/admin/assets/{Thumbnail-D1XuDElk.js.map → Thumbnail-BwbCNpgQ.js.map} +1 -1
  61. package/dist/admin/assets/{UnsavedChangesGuard-C1n7egF6.js → UnsavedChangesGuard-C6nD55Fn.js} +2 -2
  62. package/dist/admin/assets/{UnsavedChangesGuard-C1n7egF6.js.map → UnsavedChangesGuard-C6nD55Fn.js.map} +1 -1
  63. package/dist/admin/assets/{UserAvatar-Bl32IpG_.js → UserAvatar-D7IbSpsP.js} +2 -2
  64. package/dist/admin/assets/{UserAvatar-Bl32IpG_.js.map → UserAvatar-D7IbSpsP.js.map} +1 -1
  65. package/dist/admin/assets/{badge-ydvfgE8a.js → badge-vLiQczOd.js} +2 -2
  66. package/dist/admin/assets/{badge-ydvfgE8a.js.map → badge-vLiQczOd.js.map} +1 -1
  67. package/dist/admin/assets/{changeSets-DgfCKja3.js → changeSets-D5VevASj.js} +2 -2
  68. package/dist/admin/assets/{changeSets-DgfCKja3.js.map → changeSets-D5VevASj.js.map} +1 -1
  69. package/dist/admin/assets/{constants-esJAnNTh.js → constants-CKGh8uwT.js} +2 -2
  70. package/dist/admin/assets/{constants-esJAnNTh.js.map → constants-CKGh8uwT.js.map} +1 -1
  71. package/dist/admin/assets/{content-DsMSB6Wb.js → content-Cbavyq0x.js} +3 -3
  72. package/dist/admin/assets/{content-DsMSB6Wb.js.map → content-Cbavyq0x.js.map} +1 -1
  73. package/dist/admin/assets/{contentTypes-C-AKiYu1.js → contentTypes-DzQ_0v36.js} +2 -2
  74. package/dist/admin/assets/{contentTypes-C-AKiYu1.js.map → contentTypes-DzQ_0v36.js.map} +1 -1
  75. package/dist/admin/assets/{develop-DL-2W9jv.js → develop-BDqMOEql.js} +2 -2
  76. package/dist/admin/assets/{develop-DL-2W9jv.js.map → develop-BDqMOEql.js.map} +1 -1
  77. package/dist/admin/assets/{dropdown-menu-C53v9ioW.js → dropdown-menu-CVAnm22s.js} +2 -2
  78. package/dist/admin/assets/{dropdown-menu-C53v9ioW.js.map → dropdown-menu-CVAnm22s.js.map} +1 -1
  79. package/dist/admin/assets/es2015-BKfbx3rz.js +42 -0
  80. package/dist/admin/assets/es2015-BKfbx3rz.js.map +1 -0
  81. package/dist/admin/assets/{field-W1dB_h6d.js → field-Bg-JRgsB.js} +2 -2
  82. package/dist/admin/assets/{field-W1dB_h6d.js.map → field-Bg-JRgsB.js.map} +1 -1
  83. package/dist/admin/assets/{fileRoute-DzWMBrRx.js → fileRoute-DQCI1nMN.js} +2 -2
  84. package/dist/admin/assets/{fileRoute-DzWMBrRx.js.map → fileRoute-DQCI1nMN.js.map} +1 -1
  85. package/dist/admin/assets/{followPlural-D-5ZJqJF.js → followPlural-D0bENI5E.js} +2 -2
  86. package/dist/admin/assets/{followPlural-D-5ZJqJF.js.map → followPlural-D0bENI5E.js.map} +1 -1
  87. package/dist/admin/assets/{inbox-DUqOrFEA.js → inbox-Dfy4YBZ2.js} +2 -2
  88. package/dist/admin/assets/{inbox-DUqOrFEA.js.map → inbox-Dfy4YBZ2.js.map} +1 -1
  89. package/dist/admin/assets/{index-D03RZB7e.js → index-M4TUI1dl.js} +4 -4
  90. package/dist/admin/assets/{index-D03RZB7e.js.map → index-M4TUI1dl.js.map} +1 -1
  91. package/dist/admin/assets/{labels-CHE0gg1n.js → labels-BrwwGWnv.js} +2 -2
  92. package/dist/admin/assets/{labels-CHE0gg1n.js.map → labels-BrwwGWnv.js.map} +1 -1
  93. package/dist/admin/assets/{media-BUUEsWxd.js → media-DBdx-UmR.js} +2 -2
  94. package/dist/admin/assets/{media-BUUEsWxd.js.map → media-DBdx-UmR.js.map} +1 -1
  95. package/dist/admin/assets/{network-Bolr2lmf.js → network-BpbMYp6D.js} +2 -2
  96. package/dist/admin/assets/{network-Bolr2lmf.js.map → network-BpbMYp6D.js.map} +1 -1
  97. package/dist/admin/assets/{publishing-ClNjPLQ9.js → publishing-CpSDO3M7.js} +2 -2
  98. package/dist/admin/assets/{publishing-ClNjPLQ9.js.map → publishing-CpSDO3M7.js.map} +1 -1
  99. package/dist/admin/assets/{radio-group-rFxn7cz2.js → radio-group-DQ3sC1ol.js} +2 -2
  100. package/dist/admin/assets/{radio-group-rFxn7cz2.js.map → radio-group-DQ3sC1ol.js.map} +1 -1
  101. package/dist/admin/assets/{searchSchemas-C4qp-vCa.js → searchSchemas-D4S2ceA0.js} +2 -2
  102. package/dist/admin/assets/{searchSchemas-C4qp-vCa.js.map → searchSchemas-D4S2ceA0.js.map} +1 -1
  103. package/dist/admin/assets/{sections-C7Z6Xd8r.js → sections-Cl1LrzqH.js} +2 -2
  104. package/dist/admin/assets/{sections-C7Z6Xd8r.js.map → sections-Cl1LrzqH.js.map} +1 -1
  105. package/dist/admin/assets/{select-DUhL27UN.js → select-DjCAH45V.js} +2 -2
  106. package/dist/admin/assets/{select-DUhL27UN.js.map → select-DjCAH45V.js.map} +1 -1
  107. package/dist/admin/assets/{seo-l1ZORjtv.js → seo-DJ4k3LtY.js} +2 -2
  108. package/dist/admin/assets/{seo-l1ZORjtv.js.map → seo-DJ4k3LtY.js.map} +1 -1
  109. package/dist/admin/assets/{settings-DgoG3H8C.js → settings-DRZ33PTg.js} +2 -2
  110. package/dist/admin/assets/{settings-DgoG3H8C.js.map → settings-DRZ33PTg.js.map} +1 -1
  111. package/dist/admin/assets/{shapes-BZ87ap5s.js → shapes-BJe3IMuj.js} +5 -5
  112. package/dist/admin/assets/{shapes-BZ87ap5s.js.map → shapes-BJe3IMuj.js.map} +1 -1
  113. package/dist/admin/assets/{skeleton-Dyi_b1wq.js → skeleton-D4eOLKLY.js} +2 -2
  114. package/dist/admin/assets/{skeleton-Dyi_b1wq.js.map → skeleton-D4eOLKLY.js.map} +1 -1
  115. package/dist/admin/assets/src-DUpL-qwG.js +7 -0
  116. package/dist/admin/assets/src-DUpL-qwG.js.map +1 -0
  117. package/dist/admin/assets/{switch-C3dDDUIk.js → switch-B2R13aVU.js} +2 -2
  118. package/dist/admin/assets/{switch-C3dDDUIk.js.map → switch-B2R13aVU.js.map} +1 -1
  119. package/dist/admin/assets/{theme-DPe080iG.js → theme-X-qeg74W.js} +2 -2
  120. package/dist/admin/assets/{theme-DPe080iG.js.map → theme-X-qeg74W.js.map} +1 -1
  121. package/dist/admin/assets/{titles-C5PaMgFJ.js → titles-CLh5ftA2.js} +2 -2
  122. package/dist/admin/assets/{titles-C5PaMgFJ.js.map → titles-CLh5ftA2.js.map} +1 -1
  123. package/dist/admin/assets/{tooltip-BEaZkRPK.js → tooltip-u2epXfJF.js} +2 -2
  124. package/dist/admin/assets/{tooltip-BEaZkRPK.js.map → tooltip-u2epXfJF.js.map} +1 -1
  125. package/dist/admin/assets/{useContentSchema-wLDa2L3f.js → useContentSchema-DaQHlL19.js} +2 -2
  126. package/dist/admin/assets/{useContentSchema-wLDa2L3f.js.map → useContentSchema-DaQHlL19.js.map} +1 -1
  127. package/dist/admin/assets/{useDiscardGuard-WTUINqD5.js → useDiscardGuard-BVJGUCiH.js} +2 -2
  128. package/dist/admin/assets/{useDiscardGuard-WTUINqD5.js.map → useDiscardGuard-BVJGUCiH.js.map} +1 -1
  129. package/dist/admin/assets/{useMediaPickerDialog-CFN9ZKfe.js → useMediaPickerDialog-C23eOHQR.js} +2 -2
  130. package/dist/admin/assets/{useMediaPickerDialog-CFN9ZKfe.js.map → useMediaPickerDialog-C23eOHQR.js.map} +1 -1
  131. package/dist/admin/assets/{useMediaUploader-B42H_CMG.js → useMediaUploader-CTViR0LX.js} +2 -2
  132. package/dist/admin/assets/{useMediaUploader-B42H_CMG.js.map → useMediaUploader-CTViR0LX.js.map} +1 -1
  133. package/dist/admin/assets/{useResolvedScheme-aV0QDPi3.js → useResolvedScheme-Cg8TdO85.js} +2 -2
  134. package/dist/admin/assets/{useResolvedScheme-aV0QDPi3.js.map → useResolvedScheme-Cg8TdO85.js.map} +1 -1
  135. package/dist/admin/assets/{zod-C-k48Hnc.js → zod-D5i60ErJ.js} +2 -2
  136. package/dist/admin/assets/{zod-C-k48Hnc.js.map → zod-D5i60ErJ.js.map} +1 -1
  137. package/dist/admin/index.html +27 -27
  138. package/dist/cli.js +10 -3
  139. package/dist/cli.js.map +1 -1
  140. package/dist/index.d.ts +7 -2
  141. package/dist/index.js +1 -1
  142. package/dist/{s3Adapter-sL1zP4Zl.js → s3Adapter-CtPzkzf0.js} +2 -2
  143. package/dist/{s3Adapter-sL1zP4Zl.js.map → s3Adapter-CtPzkzf0.js.map} +1 -1
  144. package/dist/{worker-DMES6pqh.js → worker-DRCCGGjl.js} +3823 -3719
  145. package/dist/worker-DRCCGGjl.js.map +1 -0
  146. package/package.json +5 -5
  147. package/dist/admin/assets/Builder-DyCcikfS.js +0 -2
  148. package/dist/admin/assets/Builder-DyCcikfS.js.map +0 -1
  149. package/dist/admin/assets/StepList-BIQjDaWQ.js +0 -2
  150. package/dist/admin/assets/StepList-BIQjDaWQ.js.map +0 -1
  151. package/dist/admin/assets/Structure-CO4aJZVP.js +0 -2
  152. package/dist/admin/assets/es2015-DrAA1N2V.js +0 -42
  153. package/dist/admin/assets/es2015-DrAA1N2V.js.map +0 -1
  154. package/dist/admin/assets/src-BcLeD2-K.js +0 -7
  155. package/dist/admin/assets/src-BcLeD2-K.js.map +0 -1
  156. package/dist/worker-DMES6pqh.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -734,12 +734,17 @@ type ContentMigrationPort = {
734
734
  type StepImpact = {
735
735
  affectedHeads: number;
736
736
  invalidHeads?: number;
737
+ /** A type change Shapio cannot convert: live entries holding a value it drops (absent inside components). */
738
+ droppedEntries?: number;
737
739
  };
738
740
  type ContentImpactSource = {
739
741
  /** Heads (every locale and state) of these models. */
740
742
  countHeads: (modelIds: readonly string[]) => Promise<number>;
741
- /** How many heads a step would touch and, where cheap to know, how many would fail it. */
742
- assess: (step: ContentStep) => Promise<StepImpact>;
743
+ /**
744
+ * How many heads a step would touch and, where cheap to know, how many would fail it or lose their value.
745
+ * `steps` are the plan's content steps (a check's outcome can depend on another step, e.g. a dropped value).
746
+ */
747
+ assess: (step: ContentStep, steps: readonly ContentStep[]) => Promise<StepImpact>;
743
748
  /** Heads stored in one locale (impact of deleting it). */
744
749
  countLocaleHeads: (code: string) => Promise<number>;
745
750
  };
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { a as loadConfig, f as SHAPIO_VERSION, n as startServer, s as buildApp, t as startDedicatedWorker } from "./worker-DMES6pqh.js";
1
+ import { a as loadConfig, f as SHAPIO_VERSION, n as startServer, s as buildApp, t as startDedicatedWorker } from "./worker-DRCCGGjl.js";
2
2
  import { EXTENSION_CONTRACT_VERSION, HookError, defineConfig, isHookError } from "./config.js";
3
3
  export { EXTENSION_CONTRACT_VERSION, HookError, SHAPIO_VERSION, buildApp, defineConfig, isHookError, loadConfig, startDedicatedWorker, startServer };
@@ -1,4 +1,4 @@
1
- import { M as isValidStorageKey, c as bucketContentDisposition, h as ObjectNotFoundError, j as encodeKeyPath, l as contentDisposition, m as InvalidStorageKeyError } from "./worker-DMES6pqh.js";
1
+ import { M as isValidStorageKey, c as bucketContentDisposition, h as ObjectNotFoundError, j as encodeKeyPath, l as contentDisposition, m as InvalidStorageKeyError } from "./worker-DRCCGGjl.js";
2
2
  import { DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, PutObjectCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
3
3
  import { createPresignedPost } from "@aws-sdk/s3-presigned-post";
4
4
  import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
@@ -122,4 +122,4 @@ const createS3Adapter = ({ config, publicBaseUrl, client }) => {
122
122
  //#endregion
123
123
  export { createS3Adapter };
124
124
 
125
- //# sourceMappingURL=s3Adapter-sL1zP4Zl.js.map
125
+ //# sourceMappingURL=s3Adapter-CtPzkzf0.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"s3Adapter-sL1zP4Zl.js","names":[],"sources":["../src/media/s3Adapter.ts"],"sourcesContent":["import type { Readable } from 'node:stream';\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n PutObjectCommand,\n S3Client,\n S3ServiceException,\n} from '@aws-sdk/client-s3';\nimport { createPresignedPost } from '@aws-sdk/s3-presigned-post';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport type { S3StorageConfig } from '../config/index.js';\nimport { bucketContentDisposition, contentDisposition } from './contentDisposition.js';\nimport { InvalidStorageKeyError, ObjectNotFoundError } from './errors.js';\nimport { encodeKeyPath, isValidStorageKey } from './keys.js';\nimport type { StorageAdapter } from './types.js';\n\n/** R2 accepts any region name (\"auto\" by convention); AWS needs the bucket's real region. */\nconst DEFAULT_REGION = 'us-east-1';\n\nconst isNotFound = (error: unknown): boolean =>\n error instanceof S3ServiceException &&\n (error.$metadata.httpStatusCode === 404 || error.name === 'NotFound' || error.name === 'NoSuchKey');\n\nexport const createS3Client = (config: S3StorageConfig): S3Client =>\n new S3Client({\n region: config.region ?? DEFAULT_REGION,\n ...(config.endpoint ? { endpoint: config.endpoint } : {}),\n forcePathStyle: config.forcePathStyle,\n ...(config.accessKeyId && config.secretAccessKey\n ? { credentials: { accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey } }\n : {}),\n // Only send/validate checksums when an operation requires them: several S3-compatible services\n // (R2, B2 and other gateways) reject the SDK's default streaming CRC32 trailers.\n requestChecksumCalculation: 'WHEN_REQUIRED',\n responseChecksumValidation: 'WHEN_REQUIRED',\n });\n\nexport type S3AdapterOptions = {\n config: S3StorageConfig;\n publicBaseUrl: string | undefined;\n /** Injected in tests; created from `config` otherwise. */\n client?: S3Client;\n};\n\n/**\n * Any S3-compatible service (AWS S3, Cloudflare R2, B2, Spaces, Wasabi, versitygw). Private objects are read\n * through presigned GET URLs; browsers upload straight to the bucket with a presigned POST whose policy\n * limits size and content type, so Shapio never streams upload bytes.\n */\nexport const createS3Adapter = ({ config, publicBaseUrl, client }: S3AdapterOptions): StorageAdapter => {\n const s3 = client ?? createS3Client(config);\n const Bucket = config.bucket;\n const checkKey = (key: string) => {\n if (!isValidStorageKey(key)) {\n throw new InvalidStorageKeyError(key);\n }\n return key;\n };\n\n const head = async (key: string) => {\n try {\n const result = await s3.send(new HeadObjectCommand({ Bucket, Key: checkKey(key) }));\n return { size: result.ContentLength ?? 0, contentType: result.ContentType };\n } catch (error) {\n if (isNotFound(error)) {\n return undefined;\n }\n throw error;\n }\n };\n\n return {\n driver: 's3',\n put: async (key, body, { contentType, contentLength }) => {\n await s3.send(\n new PutObjectCommand({\n Bucket,\n Key: checkKey(key),\n Body: body,\n ContentType: contentType,\n ContentLength: Buffer.isBuffer(body) ? body.length : contentLength,\n ContentDisposition: bucketContentDisposition(contentType),\n }),\n );\n },\n getStream: async (key, range) => {\n try {\n const result = await s3.send(\n new GetObjectCommand({\n Bucket,\n Key: checkKey(key),\n ...(range ? { Range: `bytes=${range.start}-${range.end}` } : {}),\n }),\n );\n if (!result.Body) {\n throw new ObjectNotFoundError(key);\n }\n return result.Body as Readable;\n } catch (error) {\n throw isNotFound(error) ? new ObjectNotFoundError(key, { cause: error }) : error;\n }\n },\n head,\n exists: async (key) => (await head(key)) !== undefined,\n delete: async (key) => {\n await s3.send(new DeleteObjectCommand({ Bucket, Key: checkKey(key) }));\n },\n signedGetUrl: async (key, { expiresInSeconds, filename, contentType }) =>\n getSignedUrl(\n s3,\n new GetObjectCommand({\n Bucket,\n Key: checkKey(key),\n ResponseContentType: contentType,\n ResponseContentDisposition: contentDisposition(filename),\n }),\n { expiresIn: expiresInSeconds },\n ),\n publicUrl: (key) => (publicBaseUrl ? `${publicBaseUrl}/${encodeKeyPath(checkKey(key))}` : undefined),\n presignedUpload: async ({ key, contentType, maxSizeBytes, expiresInSeconds }) => {\n const disposition = bucketContentDisposition(contentType);\n const { url, fields } = await createPresignedPost(s3, {\n Bucket,\n Key: checkKey(key),\n Conditions: [\n ['content-length-range', 1, maxSizeBytes],\n ['eq', '$Content-Type', contentType],\n ...(disposition ? [['eq', '$Content-Disposition', disposition] as ['eq', string, string]] : []),\n ],\n Fields: {\n 'Content-Type': contentType,\n ...(disposition ? { 'Content-Disposition': disposition } : {}),\n },\n Expires: expiresInSeconds,\n });\n return { url, fields };\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"s3Adapter-CtPzkzf0.js","names":[],"sources":["../src/media/s3Adapter.ts"],"sourcesContent":["import type { Readable } from 'node:stream';\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadObjectCommand,\n PutObjectCommand,\n S3Client,\n S3ServiceException,\n} from '@aws-sdk/client-s3';\nimport { createPresignedPost } from '@aws-sdk/s3-presigned-post';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport type { S3StorageConfig } from '../config/index.js';\nimport { bucketContentDisposition, contentDisposition } from './contentDisposition.js';\nimport { InvalidStorageKeyError, ObjectNotFoundError } from './errors.js';\nimport { encodeKeyPath, isValidStorageKey } from './keys.js';\nimport type { StorageAdapter } from './types.js';\n\n/** R2 accepts any region name (\"auto\" by convention); AWS needs the bucket's real region. */\nconst DEFAULT_REGION = 'us-east-1';\n\nconst isNotFound = (error: unknown): boolean =>\n error instanceof S3ServiceException &&\n (error.$metadata.httpStatusCode === 404 || error.name === 'NotFound' || error.name === 'NoSuchKey');\n\nexport const createS3Client = (config: S3StorageConfig): S3Client =>\n new S3Client({\n region: config.region ?? DEFAULT_REGION,\n ...(config.endpoint ? { endpoint: config.endpoint } : {}),\n forcePathStyle: config.forcePathStyle,\n ...(config.accessKeyId && config.secretAccessKey\n ? { credentials: { accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey } }\n : {}),\n // Only send/validate checksums when an operation requires them: several S3-compatible services\n // (R2, B2 and other gateways) reject the SDK's default streaming CRC32 trailers.\n requestChecksumCalculation: 'WHEN_REQUIRED',\n responseChecksumValidation: 'WHEN_REQUIRED',\n });\n\nexport type S3AdapterOptions = {\n config: S3StorageConfig;\n publicBaseUrl: string | undefined;\n /** Injected in tests; created from `config` otherwise. */\n client?: S3Client;\n};\n\n/**\n * Any S3-compatible service (AWS S3, Cloudflare R2, B2, Spaces, Wasabi, versitygw). Private objects are read\n * through presigned GET URLs; browsers upload straight to the bucket with a presigned POST whose policy\n * limits size and content type, so Shapio never streams upload bytes.\n */\nexport const createS3Adapter = ({ config, publicBaseUrl, client }: S3AdapterOptions): StorageAdapter => {\n const s3 = client ?? createS3Client(config);\n const Bucket = config.bucket;\n const checkKey = (key: string) => {\n if (!isValidStorageKey(key)) {\n throw new InvalidStorageKeyError(key);\n }\n return key;\n };\n\n const head = async (key: string) => {\n try {\n const result = await s3.send(new HeadObjectCommand({ Bucket, Key: checkKey(key) }));\n return { size: result.ContentLength ?? 0, contentType: result.ContentType };\n } catch (error) {\n if (isNotFound(error)) {\n return undefined;\n }\n throw error;\n }\n };\n\n return {\n driver: 's3',\n put: async (key, body, { contentType, contentLength }) => {\n await s3.send(\n new PutObjectCommand({\n Bucket,\n Key: checkKey(key),\n Body: body,\n ContentType: contentType,\n ContentLength: Buffer.isBuffer(body) ? body.length : contentLength,\n ContentDisposition: bucketContentDisposition(contentType),\n }),\n );\n },\n getStream: async (key, range) => {\n try {\n const result = await s3.send(\n new GetObjectCommand({\n Bucket,\n Key: checkKey(key),\n ...(range ? { Range: `bytes=${range.start}-${range.end}` } : {}),\n }),\n );\n if (!result.Body) {\n throw new ObjectNotFoundError(key);\n }\n return result.Body as Readable;\n } catch (error) {\n throw isNotFound(error) ? new ObjectNotFoundError(key, { cause: error }) : error;\n }\n },\n head,\n exists: async (key) => (await head(key)) !== undefined,\n delete: async (key) => {\n await s3.send(new DeleteObjectCommand({ Bucket, Key: checkKey(key) }));\n },\n signedGetUrl: async (key, { expiresInSeconds, filename, contentType }) =>\n getSignedUrl(\n s3,\n new GetObjectCommand({\n Bucket,\n Key: checkKey(key),\n ResponseContentType: contentType,\n ResponseContentDisposition: contentDisposition(filename),\n }),\n { expiresIn: expiresInSeconds },\n ),\n publicUrl: (key) => (publicBaseUrl ? `${publicBaseUrl}/${encodeKeyPath(checkKey(key))}` : undefined),\n presignedUpload: async ({ key, contentType, maxSizeBytes, expiresInSeconds }) => {\n const disposition = bucketContentDisposition(contentType);\n const { url, fields } = await createPresignedPost(s3, {\n Bucket,\n Key: checkKey(key),\n Conditions: [\n ['content-length-range', 1, maxSizeBytes],\n ['eq', '$Content-Type', contentType],\n ...(disposition ? [['eq', '$Content-Disposition', disposition] as ['eq', string, string]] : []),\n ],\n Fields: {\n 'Content-Type': contentType,\n ...(disposition ? { 'Content-Disposition': disposition } : {}),\n },\n Expires: expiresInSeconds,\n });\n return { url, fields };\n },\n };\n};\n"],"mappings":"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"}