canopycms 0.0.57 → 0.0.59

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 (250) hide show
  1. package/dist/ai/json-to-markdown.js +74 -3
  2. package/dist/ai/json-to-markdown.js.map +1 -1
  3. package/dist/api/__test__/mock-client.d.ts +9 -5
  4. package/dist/api/__test__/mock-client.d.ts.map +1 -1
  5. package/dist/api/__test__/mock-client.js +15 -7
  6. package/dist/api/__test__/mock-client.js.map +1 -1
  7. package/dist/api/assets.d.ts +100 -36
  8. package/dist/api/assets.d.ts.map +1 -1
  9. package/dist/api/assets.js +338 -51
  10. package/dist/api/assets.js.map +1 -1
  11. package/dist/api/client.d.ts +16 -5
  12. package/dist/api/client.d.ts.map +1 -1
  13. package/dist/api/client.js +24 -6
  14. package/dist/api/client.js.map +1 -1
  15. package/dist/api/entries.d.ts +4 -4
  16. package/dist/api/index.d.ts +1 -1
  17. package/dist/api/index.d.ts.map +1 -1
  18. package/dist/api/index.js.map +1 -1
  19. package/dist/api/route-builder.d.ts +9 -0
  20. package/dist/api/route-builder.d.ts.map +1 -1
  21. package/dist/api/route-builder.js +1 -0
  22. package/dist/api/route-builder.js.map +1 -1
  23. package/dist/api/schema.d.ts +4 -4
  24. package/dist/api/types.d.ts +11 -1
  25. package/dist/api/types.d.ts.map +1 -1
  26. package/dist/assets/asset-prefixes.d.ts +31 -0
  27. package/dist/assets/asset-prefixes.d.ts.map +1 -0
  28. package/dist/assets/asset-prefixes.js +20 -0
  29. package/dist/assets/asset-prefixes.js.map +1 -0
  30. package/dist/assets/asset-src.d.ts +23 -0
  31. package/dist/assets/asset-src.d.ts.map +1 -0
  32. package/dist/assets/asset-src.js +28 -0
  33. package/dist/assets/asset-src.js.map +1 -0
  34. package/dist/assets/asset-url.d.ts +35 -0
  35. package/dist/assets/asset-url.d.ts.map +1 -0
  36. package/dist/assets/asset-url.js +77 -0
  37. package/dist/assets/asset-url.js.map +1 -0
  38. package/dist/assets/factory.d.ts +18 -0
  39. package/dist/assets/factory.d.ts.map +1 -0
  40. package/dist/assets/factory.js +42 -0
  41. package/dist/assets/factory.js.map +1 -0
  42. package/dist/assets/finalize.d.ts +36 -0
  43. package/dist/assets/finalize.d.ts.map +1 -0
  44. package/dist/assets/finalize.js +72 -0
  45. package/dist/assets/finalize.js.map +1 -0
  46. package/dist/assets/index.d.ts +20 -0
  47. package/dist/assets/index.d.ts.map +1 -0
  48. package/dist/assets/index.js +19 -0
  49. package/dist/assets/index.js.map +1 -0
  50. package/dist/assets/keys.d.ts +56 -0
  51. package/dist/assets/keys.d.ts.map +1 -0
  52. package/dist/assets/keys.js +88 -0
  53. package/dist/assets/keys.js.map +1 -0
  54. package/dist/assets/pipeline.d.ts +50 -0
  55. package/dist/assets/pipeline.d.ts.map +1 -0
  56. package/dist/assets/pipeline.js +202 -0
  57. package/dist/assets/pipeline.js.map +1 -0
  58. package/dist/assets/store-local.d.ts +84 -0
  59. package/dist/assets/store-local.d.ts.map +1 -0
  60. package/dist/assets/store-local.js +254 -0
  61. package/dist/assets/store-local.js.map +1 -0
  62. package/dist/assets/store-s3.d.ts +71 -0
  63. package/dist/assets/store-s3.d.ts.map +1 -0
  64. package/dist/assets/store-s3.js +183 -0
  65. package/dist/assets/store-s3.js.map +1 -0
  66. package/dist/assets/svg-sanitizer.d.ts +37 -0
  67. package/dist/assets/svg-sanitizer.d.ts.map +1 -0
  68. package/dist/assets/svg-sanitizer.js +222 -0
  69. package/dist/assets/svg-sanitizer.js.map +1 -0
  70. package/dist/assets/transform-directives.d.ts +97 -0
  71. package/dist/assets/transform-directives.d.ts.map +1 -0
  72. package/dist/assets/transform-directives.js +267 -0
  73. package/dist/assets/transform-directives.js.map +1 -0
  74. package/dist/assets/transform.d.ts +51 -0
  75. package/dist/assets/transform.d.ts.map +1 -0
  76. package/dist/assets/transform.js +190 -0
  77. package/dist/assets/transform.js.map +1 -0
  78. package/dist/assets/types.d.ts +82 -0
  79. package/dist/assets/types.d.ts.map +1 -0
  80. package/dist/assets/types.js +10 -0
  81. package/dist/assets/types.js.map +1 -0
  82. package/dist/authorization/groups/schema.d.ts +2 -2
  83. package/dist/authorization/permissions/schema.d.ts +2 -2
  84. package/dist/branch-workspace.d.ts.map +1 -1
  85. package/dist/branch-workspace.js +1 -0
  86. package/dist/branch-workspace.js.map +1 -1
  87. package/dist/cli/cli.d.ts +20 -0
  88. package/dist/cli/cli.d.ts.map +1 -1
  89. package/dist/cli/cli.js +9561 -246
  90. package/dist/cli/cli.js.map +1 -1
  91. package/dist/cli/generate-ai-content.js +175 -16
  92. package/dist/cli/init.d.ts.map +1 -1
  93. package/dist/cli/init.js +29 -5
  94. package/dist/cli/init.js.map +1 -1
  95. package/dist/cli/template-files/Dockerfile.cms.template +33 -1
  96. package/dist/cli/template-files/deploy-cms.yml.template +9 -1
  97. package/dist/cli/template-files/dockerignore.template +13 -0
  98. package/dist/cli/template-files/middleware-clerk.ts.template +12 -5
  99. package/dist/cli/template-files/middleware.ts.template +10 -5
  100. package/dist/cli/templates.d.ts +1 -0
  101. package/dist/cli/templates.d.ts.map +1 -1
  102. package/dist/cli/templates.js +3 -0
  103. package/dist/cli/templates.js.map +1 -1
  104. package/dist/config/helpers.d.ts.map +1 -1
  105. package/dist/config/helpers.js +2 -1
  106. package/dist/config/helpers.js.map +1 -1
  107. package/dist/config/index.d.ts +2 -2
  108. package/dist/config/index.d.ts.map +1 -1
  109. package/dist/config/index.js +1 -1
  110. package/dist/config/index.js.map +1 -1
  111. package/dist/config/schemas/config.d.ts +23 -1
  112. package/dist/config/schemas/config.d.ts.map +1 -1
  113. package/dist/config/schemas/config.js +14 -1
  114. package/dist/config/schemas/config.js.map +1 -1
  115. package/dist/config/schemas/field.d.ts +38 -3
  116. package/dist/config/schemas/field.d.ts.map +1 -1
  117. package/dist/config/schemas/field.js +18 -0
  118. package/dist/config/schemas/field.js.map +1 -1
  119. package/dist/config/schemas/media.d.ts +8 -0
  120. package/dist/config/schemas/media.d.ts.map +1 -1
  121. package/dist/config/schemas/media.js +9 -0
  122. package/dist/config/schemas/media.js.map +1 -1
  123. package/dist/config/types.d.ts +63 -3
  124. package/dist/config/types.d.ts.map +1 -1
  125. package/dist/config/types.js +4 -1
  126. package/dist/config/types.js.map +1 -1
  127. package/dist/editor/CanopyEditor.d.ts.map +1 -1
  128. package/dist/editor/CanopyEditor.js +1 -1
  129. package/dist/editor/CanopyEditor.js.map +1 -1
  130. package/dist/editor/Editor.d.ts +2 -0
  131. package/dist/editor/Editor.d.ts.map +1 -1
  132. package/dist/editor/Editor.js +82 -80
  133. package/dist/editor/Editor.js.map +1 -1
  134. package/dist/editor/FormRenderer.d.ts.map +1 -1
  135. package/dist/editor/FormRenderer.js +9 -0
  136. package/dist/editor/FormRenderer.js.map +1 -1
  137. package/dist/editor/components/EditorSidebar.d.ts +6 -1
  138. package/dist/editor/components/EditorSidebar.d.ts.map +1 -1
  139. package/dist/editor/components/EditorSidebar.js +4 -3
  140. package/dist/editor/components/EditorSidebar.js.map +1 -1
  141. package/dist/editor/context/AssetContext.d.ts +25 -0
  142. package/dist/editor/context/AssetContext.d.ts.map +1 -0
  143. package/dist/editor/context/AssetContext.js +26 -0
  144. package/dist/editor/context/AssetContext.js.map +1 -0
  145. package/dist/editor/context/index.d.ts +1 -0
  146. package/dist/editor/context/index.d.ts.map +1 -1
  147. package/dist/editor/context/index.js +1 -0
  148. package/dist/editor/context/index.js.map +1 -1
  149. package/dist/editor/fields/ImageField.d.ts +22 -0
  150. package/dist/editor/fields/ImageField.d.ts.map +1 -0
  151. package/dist/editor/fields/ImageField.js +100 -0
  152. package/dist/editor/fields/ImageField.js.map +1 -0
  153. package/dist/editor/fields/MarkdownField.d.ts.map +1 -1
  154. package/dist/editor/fields/MarkdownField.js +30 -4
  155. package/dist/editor/fields/MarkdownField.js.map +1 -1
  156. package/dist/editor/fields/MdxImageDialog.d.ts +16 -0
  157. package/dist/editor/fields/MdxImageDialog.d.ts.map +1 -0
  158. package/dist/editor/fields/MdxImageDialog.js +73 -0
  159. package/dist/editor/fields/MdxImageDialog.js.map +1 -0
  160. package/dist/editor/media/AssetCard.d.ts +21 -0
  161. package/dist/editor/media/AssetCard.d.ts.map +1 -0
  162. package/dist/editor/media/AssetCard.js +41 -0
  163. package/dist/editor/media/AssetCard.js.map +1 -0
  164. package/dist/editor/media/CropStep.d.ts +26 -0
  165. package/dist/editor/media/CropStep.d.ts.map +1 -0
  166. package/dist/editor/media/CropStep.js +38 -0
  167. package/dist/editor/media/CropStep.js.map +1 -0
  168. package/dist/editor/media/MediaLibrary.d.ts +22 -0
  169. package/dist/editor/media/MediaLibrary.d.ts.map +1 -0
  170. package/dist/editor/media/MediaLibrary.js +17 -0
  171. package/dist/editor/media/MediaLibrary.js.map +1 -0
  172. package/dist/editor/media/MediaLibraryBody.d.ts +17 -0
  173. package/dist/editor/media/MediaLibraryBody.d.ts.map +1 -0
  174. package/dist/editor/media/MediaLibraryBody.js +133 -0
  175. package/dist/editor/media/MediaLibraryBody.js.map +1 -0
  176. package/dist/editor/media/crop-math.d.ts +37 -0
  177. package/dist/editor/media/crop-math.d.ts.map +1 -0
  178. package/dist/editor/media/crop-math.js +62 -0
  179. package/dist/editor/media/crop-math.js.map +1 -0
  180. package/dist/editor/media/upload-asset.d.ts +31 -0
  181. package/dist/editor/media/upload-asset.d.ts.map +1 -0
  182. package/dist/editor/media/upload-asset.js +56 -0
  183. package/dist/editor/media/upload-asset.js.map +1 -0
  184. package/dist/editor/media/upload-constants.d.ts +27 -0
  185. package/dist/editor/media/upload-constants.d.ts.map +1 -0
  186. package/dist/editor/media/upload-constants.js +40 -0
  187. package/dist/editor/media/upload-constants.js.map +1 -0
  188. package/dist/editor/media/useAssetUpload.d.ts +19 -0
  189. package/dist/editor/media/useAssetUpload.d.ts.map +1 -0
  190. package/dist/editor/media/useAssetUpload.js +53 -0
  191. package/dist/editor/media/useAssetUpload.js.map +1 -0
  192. package/dist/editor/media/xhr-upload.d.ts +20 -0
  193. package/dist/editor/media/xhr-upload.d.ts.map +1 -0
  194. package/dist/editor/media/xhr-upload.js +42 -0
  195. package/dist/editor/media/xhr-upload.js.map +1 -0
  196. package/dist/editor/theme.d.ts +2 -1
  197. package/dist/editor/theme.d.ts.map +1 -1
  198. package/dist/editor/theme.js +1 -0
  199. package/dist/editor/theme.js.map +1 -1
  200. package/dist/entry-schema.d.ts +19 -0
  201. package/dist/entry-schema.d.ts.map +1 -1
  202. package/dist/entry-schema.js.map +1 -1
  203. package/dist/git-manager.d.ts +39 -0
  204. package/dist/git-manager.d.ts.map +1 -1
  205. package/dist/git-manager.js +98 -8
  206. package/dist/git-manager.js.map +1 -1
  207. package/dist/http/handler.d.ts +5 -2
  208. package/dist/http/handler.d.ts.map +1 -1
  209. package/dist/http/handler.js +13 -4
  210. package/dist/http/handler.js.map +1 -1
  211. package/dist/http/index.d.ts +2 -2
  212. package/dist/http/index.d.ts.map +1 -1
  213. package/dist/http/index.js +1 -1
  214. package/dist/http/index.js.map +1 -1
  215. package/dist/http/router.d.ts +14 -1
  216. package/dist/http/router.d.ts.map +1 -1
  217. package/dist/http/router.js +4 -1
  218. package/dist/http/router.js.map +1 -1
  219. package/dist/http/types.d.ts +40 -0
  220. package/dist/http/types.d.ts.map +1 -1
  221. package/dist/http/types.js +9 -0
  222. package/dist/http/types.js.map +1 -1
  223. package/dist/index.d.ts +3 -0
  224. package/dist/index.d.ts.map +1 -1
  225. package/dist/index.js +4 -0
  226. package/dist/index.js.map +1 -1
  227. package/dist/schema/schema-store.d.ts +2 -2
  228. package/dist/server.d.ts +45 -0
  229. package/dist/server.d.ts.map +1 -1
  230. package/dist/server.js +41 -0
  231. package/dist/server.js.map +1 -1
  232. package/dist/settings-workspace.d.ts.map +1 -1
  233. package/dist/settings-workspace.js +1 -0
  234. package/dist/settings-workspace.js.map +1 -1
  235. package/dist/utils/git.d.ts +19 -0
  236. package/dist/utils/git.d.ts.map +1 -1
  237. package/dist/utils/git.js +47 -0
  238. package/dist/utils/git.js.map +1 -1
  239. package/dist/validation/entry-validator.d.ts.map +1 -1
  240. package/dist/validation/entry-validator.js +56 -1
  241. package/dist/validation/entry-validator.js.map +1 -1
  242. package/dist/worker/cms-worker.d.ts +28 -0
  243. package/dist/worker/cms-worker.d.ts.map +1 -1
  244. package/dist/worker/cms-worker.js +100 -20
  245. package/dist/worker/cms-worker.js.map +1 -1
  246. package/package.json +13 -1
  247. package/dist/asset-store.d.ts +0 -32
  248. package/dist/asset-store.d.ts.map +0 -1
  249. package/dist/asset-store.js +0 -85
  250. package/dist/asset-store.js.map +0 -1
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Pure math for the ImageField crop step: converting between react-easy-crop's
3
+ * percentage-based `Area` shape and CanopyCMS's normalized 0..1 `CropRect`
4
+ * (the same shape stored in `ImageFieldValue.crop` and accepted by the `c=`
5
+ * transform directive - see assets/transform-directives.ts). Kept dependency-free
6
+ * (no react-easy-crop import) so it's trivially unit-testable and reusable
7
+ * without pulling in the cropper UI library.
8
+ */
9
+ import { type CropRect } from '../../assets/transform-directives';
10
+ /** react-easy-crop's `Area` shape, expressed in percentages (0..100). */
11
+ export interface CropAreaPercent {
12
+ x: number;
13
+ y: number;
14
+ width: number;
15
+ height: number;
16
+ }
17
+ /**
18
+ * Convert react-easy-crop's `onCropComplete(croppedArea, croppedAreaPixels)`
19
+ * percentage area into a normalized `CropRect`, rounded to 4 decimals and
20
+ * clamped to fit within bounds. Rounding can push `x+w`/`y+h` a hair over 1
21
+ * (e.g. x=0.6667, w=0.3334 -> 1.0001) - shrink the extent to the remaining
22
+ * space rather than reject a rect that was valid before rounding.
23
+ *
24
+ * Returns `null` if the input can't be coerced into a valid rect (e.g. a
25
+ * zero-area selection).
26
+ */
27
+ export declare function cropAreaPercentToRect(area: CropAreaPercent): CropRect | null;
28
+ /**
29
+ * Inverse of `cropAreaPercentToRect` - used to seed react-easy-crop's
30
+ * `initialCroppedAreaPercentages` when re-opening the crop step for an
31
+ * already-cropped image, so the user sees their previous selection instead
32
+ * of starting over.
33
+ */
34
+ export declare function cropRectToAreaPercent(rect: CropRect): CropAreaPercent;
35
+ /** "W:H" -> the numeric aspect ratio react-easy-crop's `aspect` prop expects. Mirrors config/schemas/field.ts's ASPECT_RATIO_RE; returns undefined for anything malformed rather than throwing (defensive - the field config was already validated at schema-parse time). */
36
+ export declare function parseAspectRatio(aspect: string | undefined): number | undefined;
37
+ //# sourceMappingURL=crop-math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crop-math.d.ts","sourceRoot":"","sources":["../../../src/editor/media/crop-math.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,mCAAmC,CAAA;AAElF,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAeD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,eAAe,GAAG,QAAQ,GAAG,IAAI,CAW5E;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,eAAe,CAErE;AAED,6QAA6Q;AAC7Q,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAK/E"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Pure math for the ImageField crop step: converting between react-easy-crop's
3
+ * percentage-based `Area` shape and CanopyCMS's normalized 0..1 `CropRect`
4
+ * (the same shape stored in `ImageFieldValue.crop` and accepted by the `c=`
5
+ * transform directive - see assets/transform-directives.ts). Kept dependency-free
6
+ * (no react-easy-crop import) so it's trivially unit-testable and reusable
7
+ * without pulling in the cropper UI library.
8
+ */
9
+ import { isValidCropRect } from '../../assets/transform-directives.js';
10
+ /** Matches transform-directives.ts's CROP_PRECISION so a crop rect round-trips through the URL directive unchanged. */
11
+ const CROP_PRECISION = 4;
12
+ function roundTo(value, decimals) {
13
+ const factor = 10 ** decimals;
14
+ return Math.round(value * factor) / factor;
15
+ }
16
+ function clamp01(value) {
17
+ if (!Number.isFinite(value))
18
+ return 0;
19
+ return Math.min(1, Math.max(0, value));
20
+ }
21
+ /**
22
+ * Convert react-easy-crop's `onCropComplete(croppedArea, croppedAreaPixels)`
23
+ * percentage area into a normalized `CropRect`, rounded to 4 decimals and
24
+ * clamped to fit within bounds. Rounding can push `x+w`/`y+h` a hair over 1
25
+ * (e.g. x=0.6667, w=0.3334 -> 1.0001) - shrink the extent to the remaining
26
+ * space rather than reject a rect that was valid before rounding.
27
+ *
28
+ * Returns `null` if the input can't be coerced into a valid rect (e.g. a
29
+ * zero-area selection).
30
+ */
31
+ export function cropAreaPercentToRect(area) {
32
+ const x = roundTo(clamp01(area.x / 100), CROP_PRECISION);
33
+ const y = roundTo(clamp01(area.y / 100), CROP_PRECISION);
34
+ let w = roundTo(clamp01(area.width / 100), CROP_PRECISION);
35
+ let h = roundTo(clamp01(area.height / 100), CROP_PRECISION);
36
+ if (x + w > 1)
37
+ w = roundTo(1 - x, CROP_PRECISION);
38
+ if (y + h > 1)
39
+ h = roundTo(1 - y, CROP_PRECISION);
40
+ if (!isValidCropRect(x, y, w, h))
41
+ return null;
42
+ return { x, y, w, h };
43
+ }
44
+ /**
45
+ * Inverse of `cropAreaPercentToRect` - used to seed react-easy-crop's
46
+ * `initialCroppedAreaPercentages` when re-opening the crop step for an
47
+ * already-cropped image, so the user sees their previous selection instead
48
+ * of starting over.
49
+ */
50
+ export function cropRectToAreaPercent(rect) {
51
+ return { x: rect.x * 100, y: rect.y * 100, width: rect.w * 100, height: rect.h * 100 };
52
+ }
53
+ /** "W:H" -> the numeric aspect ratio react-easy-crop's `aspect` prop expects. Mirrors config/schemas/field.ts's ASPECT_RATIO_RE; returns undefined for anything malformed rather than throwing (defensive - the field config was already validated at schema-parse time). */
54
+ export function parseAspectRatio(aspect) {
55
+ if (!aspect)
56
+ return undefined;
57
+ const match = /^([1-9][0-9]*):([1-9][0-9]*)$/.exec(aspect);
58
+ if (!match)
59
+ return undefined;
60
+ return Number(match[1]) / Number(match[2]);
61
+ }
62
+ //# sourceMappingURL=crop-math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crop-math.js","sourceRoot":"","sources":["../../../src/editor/media/crop-math.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAiB,MAAM,mCAAmC,CAAA;AAUlF,uHAAuH;AACvH,MAAM,cAAc,GAAG,CAAC,CAAA;AAExB,SAAS,OAAO,CAAC,KAAa,EAAE,QAAgB;IAC9C,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAA;IAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAAA;AAC5C,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IACrC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;AACxC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAqB;IACzD,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,cAAc,CAAC,CAAA;IACxD,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,cAAc,CAAC,CAAA;IACxD,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE,cAAc,CAAC,CAAA;IAC1D,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,cAAc,CAAC,CAAA;IAE3D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,CAAA;IACjD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,CAAA;IAEjD,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7C,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAc;IAClD,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAA;AACxF,CAAC;AAED,6QAA6Q;AAC7Q,MAAM,UAAU,gBAAgB,CAAC,MAA0B;IACzD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAC7B,MAAM,KAAK,GAAG,+BAA+B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Shared upload state machine: presign -> transport -> finalize. Used by
3
+ * every asset-upload entry point in the editor (MediaLibrary's dropzone,
4
+ * ImageField's empty-state dropzone, the MDX image dialog's Upload tab, and
5
+ * MDXEditor's own drag/drop/paste `imageUploadHandler`) so the flow (and its
6
+ * 415/413 pipeline-rejection error surfacing) lives in exactly one place.
7
+ *
8
+ * Framework-agnostic (no React) so `MarkdownField`'s `imageUploadHandler`
9
+ * prop - a plain `(file: File) => Promise<string>` function required by
10
+ * MDXEditor's `imagePlugin`, called outside of any component render - can
11
+ * call it directly. `useAssetUpload.ts` wraps this with React state for
12
+ * callers that want progress/error UI.
13
+ */
14
+ import type { ApiClient } from '../context';
15
+ import type { AssetRecord } from '../../api';
16
+ /**
17
+ * Upload `file` through the asset pipeline and return the finalized
18
+ * `AssetRecord`. `onProgress` receives a 0..1 fraction while the transport is
19
+ * underway for direct-upload stores (S3 presigned POST); it is never called
20
+ * for proxied stores (no XHR involved - `client.assets.uploadProxied` uses
21
+ * `fetch`, which exposes no upload progress) or during the (fast) finalize
22
+ * step, so callers should show an indeterminate indicator whenever they
23
+ * aren't actively receiving progress calls.
24
+ *
25
+ * Throws an `Error` (message = the server's `error` string when available)
26
+ * on any failure - a rejected presign (415 unsupported type, 413 too large),
27
+ * a failed transport, or a rejected finalize (e.g. a magic-byte sniff
28
+ * mismatch or SVG sanitization failure).
29
+ */
30
+ export declare function uploadAsset(client: ApiClient, file: File, onProgress?: (fraction: number) => void): Promise<AssetRecord>;
31
+ //# sourceMappingURL=upload-asset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-asset.d.ts","sourceRoot":"","sources":["../../../src/editor/media/upload-asset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAG5C;;;;;;;;;;;;;GAaG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,IAAI,EACV,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GACtC,OAAO,CAAC,WAAW,CAAC,CA6BtB"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Shared upload state machine: presign -> transport -> finalize. Used by
3
+ * every asset-upload entry point in the editor (MediaLibrary's dropzone,
4
+ * ImageField's empty-state dropzone, the MDX image dialog's Upload tab, and
5
+ * MDXEditor's own drag/drop/paste `imageUploadHandler`) so the flow (and its
6
+ * 415/413 pipeline-rejection error surfacing) lives in exactly one place.
7
+ *
8
+ * Framework-agnostic (no React) so `MarkdownField`'s `imageUploadHandler`
9
+ * prop - a plain `(file: File) => Promise<string>` function required by
10
+ * MDXEditor's `imagePlugin`, called outside of any component render - can
11
+ * call it directly. `useAssetUpload.ts` wraps this with React state for
12
+ * callers that want progress/error UI.
13
+ */
14
+ import { uploadToPresignedPost } from './xhr-upload.js';
15
+ /**
16
+ * Upload `file` through the asset pipeline and return the finalized
17
+ * `AssetRecord`. `onProgress` receives a 0..1 fraction while the transport is
18
+ * underway for direct-upload stores (S3 presigned POST); it is never called
19
+ * for proxied stores (no XHR involved - `client.assets.uploadProxied` uses
20
+ * `fetch`, which exposes no upload progress) or during the (fast) finalize
21
+ * step, so callers should show an indeterminate indicator whenever they
22
+ * aren't actively receiving progress calls.
23
+ *
24
+ * Throws an `Error` (message = the server's `error` string when available)
25
+ * on any failure - a rejected presign (415 unsupported type, 413 too large),
26
+ * a failed transport, or a rejected finalize (e.g. a magic-byte sniff
27
+ * mismatch or SVG sanitization failure).
28
+ */
29
+ export async function uploadAsset(client, file, onProgress) {
30
+ const presignResult = await client.assets.presign({
31
+ filename: file.name,
32
+ contentType: file.type || 'application/octet-stream',
33
+ size: file.size,
34
+ });
35
+ if (!presignResult.ok || !presignResult.data) {
36
+ throw new Error(presignResult.error || 'Failed to start upload');
37
+ }
38
+ const { upload } = presignResult.data;
39
+ if (upload.mode === 'direct') {
40
+ await uploadToPresignedPost(upload, file, onProgress);
41
+ const finalizeResult = await client.assets.finalize({
42
+ stagingKey: upload.stagingKey,
43
+ filename: file.name,
44
+ });
45
+ if (!finalizeResult.ok || !finalizeResult.data) {
46
+ throw new Error(finalizeResult.error || 'Failed to finalize upload');
47
+ }
48
+ return finalizeResult.data.asset;
49
+ }
50
+ const uploadResult = await client.assets.uploadProxied(file);
51
+ if (!uploadResult.ok || !uploadResult.data) {
52
+ throw new Error(uploadResult.error || 'Failed to upload');
53
+ }
54
+ return uploadResult.data.asset;
55
+ }
56
+ //# sourceMappingURL=upload-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-asset.js","sourceRoot":"","sources":["../../../src/editor/media/upload-asset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAiB,EACjB,IAAU,EACV,UAAuC;IAEvC,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QAChD,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,WAAW,EAAE,IAAI,CAAC,IAAI,IAAI,0BAA0B;QACpD,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAA;IACF,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI,wBAAwB,CAAC,CAAA;IAClE,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAA;IAErC,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;QACrD,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;YAClD,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,IAAI,CAAC,IAAI;SACpB,CAAC,CAAA;QACF,IAAI,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,KAAK,IAAI,2BAA2B,CAAC,CAAA;QACtE,CAAC;QACD,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAA;IAClC,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IAC5D,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,kBAAkB,CAAC,CAAA;IAC3D,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAA;AAChC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Client-side upload UX constants. Deliberately duplicated from
3
+ * assets/pipeline.ts's `ALLOWED_UPLOAD_CONTENT_TYPES`/size caps rather than
4
+ * imported from it: pipeline.ts is server-only (pulls in `file-type` and
5
+ * `image-size`) and must never reach a browser bundle. These are UX-only
6
+ * (Dropzone's `accept`/`maxSize` props reject bad files before an upload even
7
+ * starts) - the server-side finalize pipeline is the actual source of truth
8
+ * and re-validates independently.
9
+ */
10
+ /**
11
+ * Mirrors assets/pipeline.ts's RASTER_MIME_TYPES + SVG_MIME_TYPE + PDF_MIME_TYPE.
12
+ * A plain (not `readonly`/`as const`) `string[]` - `@mantine/dropzone`'s
13
+ * `accept` prop takes `string[] | Accept`, neither of which accepts a
14
+ * readonly tuple.
15
+ */
16
+ export declare const ACCEPTED_ASSET_MIME_TYPES: string[];
17
+ /**
18
+ * Image-only subset of `ACCEPTED_ASSET_MIME_TYPES` (raster + svg, no PDF) -
19
+ * for contexts that only ever want an image out: the ImageField/MDX-image
20
+ * dropzones, and MediaLibraryBody's `picker` mode (used exclusively by those
21
+ * two - see MediaLibrary.tsx's doc comment). The general MediaLibrary
22
+ * (`manage` mode) keeps accepting the full set, PDF included.
23
+ */
24
+ export declare const ACCEPTED_IMAGE_MIME_TYPES: string[];
25
+ /** Mirrors store-local.ts/store-s3.ts's DEFAULT_MAX_UPLOAD_BYTES. The real limit is enforced by the presigned target's `maxBytes` (S3 content-length-range or the local store's own cap); this only avoids a doomed upload attempt. */
26
+ export declare const MAX_UPLOAD_BYTES: number;
27
+ //# sourceMappingURL=upload-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-constants.d.ts","sourceRoot":"","sources":["../../../src/editor/media/upload-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,EAO7C,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,EAAE,MAAM,EAM7C,CAAA;AAED,uOAAuO;AACvO,eAAO,MAAM,gBAAgB,QAAmB,CAAA"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Client-side upload UX constants. Deliberately duplicated from
3
+ * assets/pipeline.ts's `ALLOWED_UPLOAD_CONTENT_TYPES`/size caps rather than
4
+ * imported from it: pipeline.ts is server-only (pulls in `file-type` and
5
+ * `image-size`) and must never reach a browser bundle. These are UX-only
6
+ * (Dropzone's `accept`/`maxSize` props reject bad files before an upload even
7
+ * starts) - the server-side finalize pipeline is the actual source of truth
8
+ * and re-validates independently.
9
+ */
10
+ /**
11
+ * Mirrors assets/pipeline.ts's RASTER_MIME_TYPES + SVG_MIME_TYPE + PDF_MIME_TYPE.
12
+ * A plain (not `readonly`/`as const`) `string[]` - `@mantine/dropzone`'s
13
+ * `accept` prop takes `string[] | Accept`, neither of which accepts a
14
+ * readonly tuple.
15
+ */
16
+ export const ACCEPTED_ASSET_MIME_TYPES = [
17
+ 'image/png',
18
+ 'image/jpeg',
19
+ 'image/webp',
20
+ 'image/gif',
21
+ 'image/svg+xml',
22
+ 'application/pdf',
23
+ ];
24
+ /**
25
+ * Image-only subset of `ACCEPTED_ASSET_MIME_TYPES` (raster + svg, no PDF) -
26
+ * for contexts that only ever want an image out: the ImageField/MDX-image
27
+ * dropzones, and MediaLibraryBody's `picker` mode (used exclusively by those
28
+ * two - see MediaLibrary.tsx's doc comment). The general MediaLibrary
29
+ * (`manage` mode) keeps accepting the full set, PDF included.
30
+ */
31
+ export const ACCEPTED_IMAGE_MIME_TYPES = [
32
+ 'image/png',
33
+ 'image/jpeg',
34
+ 'image/webp',
35
+ 'image/gif',
36
+ 'image/svg+xml',
37
+ ];
38
+ /** Mirrors store-local.ts/store-s3.ts's DEFAULT_MAX_UPLOAD_BYTES. The real limit is enforced by the presigned target's `maxBytes` (S3 content-length-range or the local store's own cap); this only avoids a doomed upload attempt. */
39
+ export const MAX_UPLOAD_BYTES = 50 * 1024 * 1024;
40
+ //# sourceMappingURL=upload-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-constants.js","sourceRoot":"","sources":["../../../src/editor/media/upload-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAa;IACjD,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,eAAe;IACf,iBAAiB;CAClB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAa;IACjD,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,eAAe;CAChB,CAAA;AAED,uOAAuO;AACvO,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAA"}
@@ -0,0 +1,19 @@
1
+ import type { AssetRecord } from '../../api';
2
+ export interface UseAssetUploadResult {
3
+ uploading: boolean;
4
+ /** 0..1 fraction while a direct-upload transport is in flight; `null` when indeterminate (proxied stores, or the finalize step). */
5
+ progress: number | null;
6
+ error: string | null;
7
+ /** Upload `file`, returning the finalized AssetRecord, or `null` if the upload failed (see `error`). */
8
+ upload: (file: File) => Promise<AssetRecord | null>;
9
+ reset: () => void;
10
+ }
11
+ /**
12
+ * React state wrapper around `uploadAsset` for UI that shows upload
13
+ * progress/errors (MediaLibrary's dropzone, ImageField's empty state, the MDX
14
+ * image dialog's Upload tab). Uses `useApiClient()` (context DI) rather than
15
+ * `createApiClient()` so tests can inject a mock client via
16
+ * `ApiClientProvider`.
17
+ */
18
+ export declare function useAssetUpload(): UseAssetUploadResult;
19
+ //# sourceMappingURL=useAssetUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssetUpload.d.ts","sourceRoot":"","sources":["../../../src/editor/media/useAssetUpload.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAK5C,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,OAAO,CAAA;IAClB,oIAAoI;IACpI,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,wGAAwG;IACxG,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IACnD,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,IAAI,oBAAoB,CAyCrD"}
@@ -0,0 +1,53 @@
1
+ 'use client';
2
+ import { useCallback, useRef, useState } from 'react';
3
+ import { getErrorMessage } from '../../utils/error.js';
4
+ import { useApiClient } from '../context/index.js';
5
+ import { uploadAsset } from './upload-asset.js';
6
+ /**
7
+ * React state wrapper around `uploadAsset` for UI that shows upload
8
+ * progress/errors (MediaLibrary's dropzone, ImageField's empty state, the MDX
9
+ * image dialog's Upload tab). Uses `useApiClient()` (context DI) rather than
10
+ * `createApiClient()` so tests can inject a mock client via
11
+ * `ApiClientProvider`.
12
+ */
13
+ export function useAssetUpload() {
14
+ const client = useApiClient();
15
+ const [uploading, setUploading] = useState(false);
16
+ const [progress, setProgress] = useState(null);
17
+ const [error, setError] = useState(null);
18
+ // Guards against a progress/state update landing after the component that
19
+ // owns this hook has moved on to a different upload (or unmounted) -
20
+ // avoids a stale "uploading" flicker if a slow upload resolves after a
21
+ // newer one already started.
22
+ const uploadIdRef = useRef(0);
23
+ const upload = useCallback(async (file) => {
24
+ const uploadId = ++uploadIdRef.current;
25
+ setUploading(true);
26
+ setProgress(0);
27
+ setError(null);
28
+ try {
29
+ const asset = await uploadAsset(client, file, (fraction) => {
30
+ if (uploadIdRef.current === uploadId)
31
+ setProgress(fraction);
32
+ });
33
+ return asset;
34
+ }
35
+ catch (err) {
36
+ if (uploadIdRef.current === uploadId)
37
+ setError(getErrorMessage(err));
38
+ return null;
39
+ }
40
+ finally {
41
+ if (uploadIdRef.current === uploadId) {
42
+ setUploading(false);
43
+ setProgress(null);
44
+ }
45
+ }
46
+ }, [client]);
47
+ const reset = useCallback(() => {
48
+ setError(null);
49
+ setProgress(null);
50
+ }, []);
51
+ return { uploading, progress, error, upload, reset };
52
+ }
53
+ //# sourceMappingURL=useAssetUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssetUpload.js","sourceRoot":"","sources":["../../../src/editor/media/useAssetUpload.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAGrD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAY5C;;;;;;GAMG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;IAC7B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACjD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IAC7D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAA;IACvD,0EAA0E;IAC1E,qEAAqE;IACrE,uEAAuE;IACvE,6BAA6B;IAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IAE7B,MAAM,MAAM,GAAG,WAAW,CACxB,KAAK,EAAE,IAAU,EAA+B,EAAE;QAChD,MAAM,QAAQ,GAAG,EAAE,WAAW,CAAC,OAAO,CAAA;QACtC,YAAY,CAAC,IAAI,CAAC,CAAA;QAClB,WAAW,CAAC,CAAC,CAAC,CAAA;QACd,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACzD,IAAI,WAAW,CAAC,OAAO,KAAK,QAAQ;oBAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;YAC7D,CAAC,CAAC,CAAA;YACF,OAAO,KAAK,CAAA;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,WAAW,CAAC,OAAO,KAAK,QAAQ;gBAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;YACpE,OAAO,IAAI,CAAA;QACb,CAAC;gBAAS,CAAC;YACT,IAAI,WAAW,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACrC,YAAY,CAAC,KAAK,CAAC,CAAA;gBACnB,WAAW,CAAC,IAAI,CAAC,CAAA;YACnB,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAA;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,WAAW,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AACtD,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Raw XHR POST for S3 presigned-POST direct uploads. Deliberately bypasses
3
+ * the API client's `request()` (which always does `fetch` + `response.json()`)
4
+ * for two reasons: this posts to the presigned `upload.url` (not our own API),
5
+ * and XHR is the only fetch-adjacent browser API that exposes upload progress
6
+ * events.
7
+ */
8
+ export interface PresignedPostTarget {
9
+ url: string;
10
+ fields: Record<string, string>;
11
+ }
12
+ /**
13
+ * POST `file` to a presigned-POST target. S3 requires the `file` field to be
14
+ * the LAST field in the multipart body - fields from the presign response
15
+ * are appended first, `file` last. Resolves on any 2xx response; rejects with
16
+ * a descriptive Error otherwise (S3 error bodies are XML and not parsed here -
17
+ * the status code is enough to surface a "something went wrong" message).
18
+ */
19
+ export declare function uploadToPresignedPost(target: PresignedPostTarget, file: File, onProgress?: (fraction: number) => void): Promise<void>;
20
+ //# sourceMappingURL=xhr-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xhr-upload.d.ts","sourceRoot":"","sources":["../../../src/editor/media/xhr-upload.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE,IAAI,EACV,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GACtC,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Raw XHR POST for S3 presigned-POST direct uploads. Deliberately bypasses
3
+ * the API client's `request()` (which always does `fetch` + `response.json()`)
4
+ * for two reasons: this posts to the presigned `upload.url` (not our own API),
5
+ * and XHR is the only fetch-adjacent browser API that exposes upload progress
6
+ * events.
7
+ */
8
+ /**
9
+ * POST `file` to a presigned-POST target. S3 requires the `file` field to be
10
+ * the LAST field in the multipart body - fields from the presign response
11
+ * are appended first, `file` last. Resolves on any 2xx response; rejects with
12
+ * a descriptive Error otherwise (S3 error bodies are XML and not parsed here -
13
+ * the status code is enough to surface a "something went wrong" message).
14
+ */
15
+ export function uploadToPresignedPost(target, file, onProgress) {
16
+ return new Promise((resolve, reject) => {
17
+ const formData = new FormData();
18
+ for (const [key, value] of Object.entries(target.fields)) {
19
+ formData.append(key, value);
20
+ }
21
+ formData.append('file', file);
22
+ const xhr = new XMLHttpRequest();
23
+ xhr.upload.onprogress = (event) => {
24
+ if (onProgress && event.lengthComputable && event.total > 0) {
25
+ onProgress(event.loaded / event.total);
26
+ }
27
+ };
28
+ xhr.onload = () => {
29
+ if (xhr.status >= 200 && xhr.status < 300) {
30
+ resolve();
31
+ }
32
+ else {
33
+ reject(new Error(`Upload failed (HTTP ${xhr.status})`));
34
+ }
35
+ };
36
+ xhr.onerror = () => reject(new Error('Upload failed: network error'));
37
+ xhr.onabort = () => reject(new Error('Upload cancelled'));
38
+ xhr.open('POST', target.url);
39
+ xhr.send(formData);
40
+ });
41
+ }
42
+ //# sourceMappingURL=xhr-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xhr-upload.js","sourceRoot":"","sources":["../../../src/editor/media/xhr-upload.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA2B,EAC3B,IAAU,EACV,UAAuC;IAEvC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;QAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACzD,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC7B,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAE7B,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAA;QAChC,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,KAAK,EAAE,EAAE;YAChC,IAAI,UAAU,IAAI,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC5D,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;YACxC,CAAC;QACH,CAAC,CAAA;QACD,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;YAChB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC1C,OAAO,EAAE,CAAA;YACX,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YACzD,CAAC;QACH,CAAC,CAAA;QACD,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAA;QACrE,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAA;QACzD,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;QAC5B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { type MantineColorScheme, type MantineColorsTuple, type MantineThemeOverride } from '@mantine/core';
3
3
  import '@mantine/core/styles.css';
4
4
  import '@mantine/notifications/styles.css';
5
+ import '@mantine/dropzone/styles.css';
5
6
  import '@mdxeditor/editor/style.css';
6
7
  export type CanopyColorInput = MantineColorsTuple | string;
7
8
  export interface CanopyColorConfig {
@@ -53,7 +54,7 @@ export declare const createCanopyTheme: (options?: Pick<CanopyThemeOptions, "col
53
54
  headings?: {
54
55
  fontFamily?: string | undefined;
55
56
  fontWeight?: string | undefined;
56
- textWrap?: "wrap" | "balance" | "nowrap" | "stable" | "pretty" | undefined;
57
+ textWrap?: "wrap" | "nowrap" | "balance" | "stable" | "pretty" | undefined;
57
58
  sizes?: {
58
59
  h1?: {
59
60
  fontSize?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/editor/theme.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAEtC,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAE1B,MAAM,eAAe,CAAA;AAKtB,OAAO,0BAA0B,CAAA;AACjC,OAAO,mCAAmC,CAAA;AAC1C,OAAO,6BAA6B,CAAA;AAEpC,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,MAAM,CAAA;AAE1D,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,gBAAgB,CAAA;IACxB,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,aAAa,CAAC,EAAE,oBAAoB,CAAA;IACpC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AASD,eAAO,MAAM,qBAAqB,6BAAsB,CAAA;AA4BxD,eAAO,MAAM,iBAAiB,GAC5B,UAAU,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuB/D,CAAA;AAED,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAiB9D,CAAA"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/editor/theme.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAkB,MAAM,OAAO,CAAA;AAEtC,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAE1B,MAAM,eAAe,CAAA;AAKtB,OAAO,0BAA0B,CAAA;AACjC,OAAO,mCAAmC,CAAA;AAC1C,OAAO,8BAA8B,CAAA;AACrC,OAAO,6BAA6B,CAAA;AAEpC,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,MAAM,CAAA;AAE1D,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,gBAAgB,CAAA;IACxB,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,aAAa,CAAC,EAAE,oBAAoB,CAAA;IACpC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AASD,eAAO,MAAM,qBAAqB,6BAAsB,CAAA;AA4BxD,eAAO,MAAM,iBAAiB,GAC5B,UAAU,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuB/D,CAAA;AAED,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAiB9D,CAAA"}
@@ -7,6 +7,7 @@ import { ModalsProvider } from '@mantine/modals';
7
7
  import { generateColors } from '@mantine/colors-generator';
8
8
  import '@mantine/core/styles.css';
9
9
  import '@mantine/notifications/styles.css';
10
+ import '@mantine/dropzone/styles.css';
10
11
  import '@mdxeditor/editor/style.css';
11
12
  const defaultCanopyColors = {
12
13
  brand: '#3b82f6',
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/editor/theme.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/editor/theme.tsx"],"names":[],"mappings":"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"}
@@ -56,6 +56,23 @@ type BlockValue<F extends InferableField & {
56
56
  fields: readonly InferableField[];
57
57
  }>;
58
58
  }> = RequiredValue<F, Array<DistributeBlockTemplate<F['templates'][number]>>>;
59
+ /**
60
+ * Structural mirror of `ImageFieldValue` (config/types.ts). Kept inline
61
+ * rather than imported so this module stays free of a FieldConfig import
62
+ * (see the module doc comment: "importing FieldConfig is not required").
63
+ */
64
+ type ImageValue = {
65
+ src: string;
66
+ alt: string;
67
+ width?: number;
68
+ height?: number;
69
+ crop?: {
70
+ x: number;
71
+ y: number;
72
+ w: number;
73
+ h: number;
74
+ };
75
+ };
59
76
  type FieldValue<F extends InferableField> = F extends {
60
77
  type: 'object';
61
78
  fields: infer Fields;
@@ -77,6 +94,8 @@ type FieldValue<F extends InferableField> = F extends {
77
94
  } ? ScalarValue<F, InferContentShape<Extract<S, readonly InferableField[]>> | null> : F extends {
78
95
  type: 'reference';
79
96
  } ? ScalarValue<F, string | null> : F extends {
97
+ type: 'image';
98
+ } ? ScalarValue<F, ImageValue> : F extends {
80
99
  type: 'boolean';
81
100
  } ? ScalarValue<F, boolean> : F extends {
82
101
  type: 'number';
@@ -1 +1 @@
1
- {"version":3,"file":"entry-schema.d.ts","sourceRoot":"","sources":["../src/entry-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entry-schema.d.ts","sourceRoot":"","sources":["../src/entry-schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"entry-schema.js","sourceRoot":"","sources":["../src/entry-schema.ts"],"names":[],"mappings":"AA2GA;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAA4C,MAAS,EAAK,EAAE,CAAC,MAAM,CAAA;AA0CpG;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAQpC,KAAQ,EACwB,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAC,CAAA;AAE3E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAGpC,KAAQ,EACyB,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAC,CAAA;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAQjC,QAAW,EACR,EAAE,CAAC,QAAQ,CAAA"}
1
+ {"version":3,"file":"entry-schema.js","sourceRoot":"","sources":["../src/entry-schema.ts"],"names":[],"mappings":"AA0HA;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAA4C,MAAS,EAAK,EAAE,CAAC,MAAM,CAAA;AA0CpG;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAQpC,KAAQ,EACwB,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAC,CAAA;AAE3E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAGpC,KAAQ,EACyB,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAC,CAAA;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAQjC,QAAW,EACR,EAAE,CAAC,QAAQ,CAAA"}
@@ -1,5 +1,7 @@
1
1
  import { type SimpleGitOptions, type StatusResult } from 'simple-git';
2
2
  import type { OperatingMode } from './operating-mode';
3
+ /** @internal — exported for tests only. */
4
+ export declare function gitChildEnv(overrides: Record<string, string>): Record<string, string>;
3
5
  /**
4
6
  * Add a pattern to a repo's .git/info/exclude (a per-repository gitignore that
5
7
  * never gets committed) so runtime metadata like .canopy-meta/ can't be staged
@@ -30,6 +32,12 @@ export interface ResolveRemoteUrlOptions {
30
32
  defaultRemoteUrl?: string;
31
33
  baseBranch: string;
32
34
  sourceRoot?: string;
35
+ /**
36
+ * Escape hatch: allow a resolved NETWORK remote URL (from remoteUrl/
37
+ * defaultRemoteUrl/the strategy env var) in prod mode. See CanopyConfig's
38
+ * `allowNetworkRemoteInProd` doc comment. Has no effect in dev mode.
39
+ */
40
+ allowNetworkRemoteInProd?: boolean;
33
41
  }
34
42
  export interface InitializeWorkspaceOptions {
35
43
  workspacePath: string;
@@ -40,6 +48,12 @@ export interface InitializeWorkspaceOptions {
40
48
  defaultRemoteUrl?: string;
41
49
  remoteUrl?: string;
42
50
  remoteName?: string;
51
+ /**
52
+ * Escape hatch: allow a resolved NETWORK remote URL in prod mode. Threaded
53
+ * through to `resolveRemoteUrl` — see its option of the same name and
54
+ * CanopyConfig's `allowNetworkRemoteInProd` doc comment.
55
+ */
56
+ allowNetworkRemoteInProd?: boolean;
43
57
  branchType: 'content' | 'orphan';
44
58
  /** Git author name for internal commits (e.g., orphan branch init). */
45
59
  gitBotAuthorName: string;
@@ -118,6 +132,26 @@ export declare class GitManager {
118
132
  * @throws Error if git repo doesn't exist
119
133
  */
120
134
  static validateGitRepoExists(repoPath: string): Promise<void>;
135
+ /**
136
+ * Guards prod mode against pointing git operations at a NETWORK remote
137
+ * (http(s)://, ssh://, git://, or scp-like `user@host:path`).
138
+ *
139
+ * In the intended prod architecture the CMS Lambda has no internet access:
140
+ * all git network I/O happens on the EC2 worker against the EFS-local bare
141
+ * repo `{workspace}/remote.git`, which the Lambda reaches via auto-detect
142
+ * (see `resolveRemoteUrl`'s auto-detect step, which always yields a local
143
+ * path by construction — never checked here). A network URL supplied via
144
+ * any of the three resolvable sources (explicit param, config, env var) is
145
+ * almost always a misconfiguration: the internet-less Lambda would try to
146
+ * clone/fetch/push it directly and hang until timeout.
147
+ *
148
+ * Dev mode is never restricted here — this only fires for `mode === 'prod'`.
149
+ * `file://` URLs and plain filesystem paths are LOCAL and always allowed.
150
+ *
151
+ * @param source - Human-readable description of where `url` came from, used
152
+ * only in the thrown error message (e.g. "config.defaultRemoteUrl").
153
+ */
154
+ private static assertRemoteUrlAllowedInMode;
121
155
  /**
122
156
  * Resolves the remote URL for git operations following the priority:
123
157
  * 1. Explicit remoteUrl parameter
@@ -127,6 +161,11 @@ export declare class GitManager {
127
161
  *
128
162
  * Uses strategy flags to determine behavior, GitManager executes the logic.
129
163
  *
164
+ * In prod mode, a resolved network URL from any of the first three sources
165
+ * is rejected unless `options.allowNetworkRemoteInProd` is set — see
166
+ * `assertRemoteUrlAllowedInMode`. Auto-detect/auto-init (source 4) are never
167
+ * checked: they always yield a local filesystem path by construction.
168
+ *
130
169
  * @param options.sourceRoot - Optional source directory for monorepos. When provided,
131
170
  * this directory (relative to git root) is used as the source for the simulated remote.
132
171
  * Defaults to process.cwd().