@mano8/astro-media-m8 0.1.0-alpha.1

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 (188) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +203 -0
  3. package/dist/src/integration.d.ts +57 -0
  4. package/dist/src/integration.d.ts.map +1 -0
  5. package/dist/src/integration.js +87 -0
  6. package/dist/src/integration.js.map +1 -0
  7. package/dist/src/lib/csp.d.ts +27 -0
  8. package/dist/src/lib/csp.d.ts.map +1 -0
  9. package/dist/src/lib/csp.js +54 -0
  10. package/dist/src/lib/csp.js.map +1 -0
  11. package/dist/src/middleware.d.ts +4 -0
  12. package/dist/src/middleware.d.ts.map +1 -0
  13. package/dist/src/middleware.js +24 -0
  14. package/dist/src/middleware.js.map +1 -0
  15. package/dist/src/runtime/api/admin.d.ts +22 -0
  16. package/dist/src/runtime/api/admin.d.ts.map +1 -0
  17. package/dist/src/runtime/api/admin.js +115 -0
  18. package/dist/src/runtime/api/admin.js.map +1 -0
  19. package/dist/src/runtime/api/categories.d.ts +12 -0
  20. package/dist/src/runtime/api/categories.d.ts.map +1 -0
  21. package/dist/src/runtime/api/categories.js +56 -0
  22. package/dist/src/runtime/api/categories.js.map +1 -0
  23. package/dist/src/runtime/api/dashboard.d.ts +5 -0
  24. package/dist/src/runtime/api/dashboard.d.ts.map +1 -0
  25. package/dist/src/runtime/api/dashboard.js +22 -0
  26. package/dist/src/runtime/api/dashboard.js.map +1 -0
  27. package/dist/src/runtime/api/index.d.ts +72 -0
  28. package/dist/src/runtime/api/index.d.ts.map +1 -0
  29. package/dist/src/runtime/api/index.js +74 -0
  30. package/dist/src/runtime/api/index.js.map +1 -0
  31. package/dist/src/runtime/api/internal.server.d.ts +19 -0
  32. package/dist/src/runtime/api/internal.server.d.ts.map +1 -0
  33. package/dist/src/runtime/api/internal.server.js +64 -0
  34. package/dist/src/runtime/api/internal.server.js.map +1 -0
  35. package/dist/src/runtime/api/objects.d.ts +7 -0
  36. package/dist/src/runtime/api/objects.d.ts.map +1 -0
  37. package/dist/src/runtime/api/objects.js +71 -0
  38. package/dist/src/runtime/api/objects.js.map +1 -0
  39. package/dist/src/runtime/api/presets.d.ts +6 -0
  40. package/dist/src/runtime/api/presets.d.ts.map +1 -0
  41. package/dist/src/runtime/api/presets.js +31 -0
  42. package/dist/src/runtime/api/presets.js.map +1 -0
  43. package/dist/src/runtime/api/shares.d.ts +10 -0
  44. package/dist/src/runtime/api/shares.d.ts.map +1 -0
  45. package/dist/src/runtime/api/shares.js +38 -0
  46. package/dist/src/runtime/api/shares.js.map +1 -0
  47. package/dist/src/runtime/api/uploads.d.ts +5 -0
  48. package/dist/src/runtime/api/uploads.d.ts.map +1 -0
  49. package/dist/src/runtime/api/uploads.js +28 -0
  50. package/dist/src/runtime/api/uploads.js.map +1 -0
  51. package/dist/src/runtime/api/variants.d.ts +18 -0
  52. package/dist/src/runtime/api/variants.d.ts.map +1 -0
  53. package/dist/src/runtime/api/variants.js +61 -0
  54. package/dist/src/runtime/api/variants.js.map +1 -0
  55. package/dist/src/runtime/authAdapter.d.ts +48 -0
  56. package/dist/src/runtime/authAdapter.d.ts.map +1 -0
  57. package/dist/src/runtime/authAdapter.js +62 -0
  58. package/dist/src/runtime/authAdapter.js.map +1 -0
  59. package/dist/src/runtime/client.d.ts +24 -0
  60. package/dist/src/runtime/client.d.ts.map +1 -0
  61. package/dist/src/runtime/client.js +87 -0
  62. package/dist/src/runtime/client.js.map +1 -0
  63. package/dist/src/runtime/compatibility.d.ts +32 -0
  64. package/dist/src/runtime/compatibility.d.ts.map +1 -0
  65. package/dist/src/runtime/compatibility.js +101 -0
  66. package/dist/src/runtime/compatibility.js.map +1 -0
  67. package/dist/src/runtime/config.d.ts +27 -0
  68. package/dist/src/runtime/config.d.ts.map +1 -0
  69. package/dist/src/runtime/config.js +32 -0
  70. package/dist/src/runtime/config.js.map +1 -0
  71. package/dist/src/runtime/errors.d.ts +23 -0
  72. package/dist/src/runtime/errors.d.ts.map +1 -0
  73. package/dist/src/runtime/errors.js +50 -0
  74. package/dist/src/runtime/errors.js.map +1 -0
  75. package/dist/src/runtime/hooks/index.d.ts +8 -0
  76. package/dist/src/runtime/hooks/index.d.ts.map +1 -0
  77. package/dist/src/runtime/hooks/index.js +8 -0
  78. package/dist/src/runtime/hooks/index.js.map +1 -0
  79. package/dist/src/runtime/hooks/useDownloadUrl.d.ts +12 -0
  80. package/dist/src/runtime/hooks/useDownloadUrl.d.ts.map +1 -0
  81. package/dist/src/runtime/hooks/useDownloadUrl.js +40 -0
  82. package/dist/src/runtime/hooks/useDownloadUrl.js.map +1 -0
  83. package/dist/src/runtime/hooks/useMediaAdmin.d.ts +30 -0
  84. package/dist/src/runtime/hooks/useMediaAdmin.d.ts.map +1 -0
  85. package/dist/src/runtime/hooks/useMediaAdmin.js +145 -0
  86. package/dist/src/runtime/hooks/useMediaAdmin.js.map +1 -0
  87. package/dist/src/runtime/hooks/useMediaObject.d.ts +17 -0
  88. package/dist/src/runtime/hooks/useMediaObject.d.ts.map +1 -0
  89. package/dist/src/runtime/hooks/useMediaObject.js +62 -0
  90. package/dist/src/runtime/hooks/useMediaObject.js.map +1 -0
  91. package/dist/src/runtime/hooks/useMediaObjects.d.ts +12 -0
  92. package/dist/src/runtime/hooks/useMediaObjects.d.ts.map +1 -0
  93. package/dist/src/runtime/hooks/useMediaObjects.js +76 -0
  94. package/dist/src/runtime/hooks/useMediaObjects.js.map +1 -0
  95. package/dist/src/runtime/hooks/useMediaPresets.d.ts +24 -0
  96. package/dist/src/runtime/hooks/useMediaPresets.d.ts.map +1 -0
  97. package/dist/src/runtime/hooks/useMediaPresets.js +55 -0
  98. package/dist/src/runtime/hooks/useMediaPresets.js.map +1 -0
  99. package/dist/src/runtime/hooks/useMediaUpload.d.ts +11 -0
  100. package/dist/src/runtime/hooks/useMediaUpload.d.ts.map +1 -0
  101. package/dist/src/runtime/hooks/useMediaUpload.js +34 -0
  102. package/dist/src/runtime/hooks/useMediaUpload.js.map +1 -0
  103. package/dist/src/runtime/hooks/useMediaVariants.d.ts +18 -0
  104. package/dist/src/runtime/hooks/useMediaVariants.d.ts.map +1 -0
  105. package/dist/src/runtime/hooks/useMediaVariants.js +78 -0
  106. package/dist/src/runtime/hooks/useMediaVariants.js.map +1 -0
  107. package/dist/src/runtime/listParams.d.ts +27 -0
  108. package/dist/src/runtime/listParams.d.ts.map +1 -0
  109. package/dist/src/runtime/listParams.js +66 -0
  110. package/dist/src/runtime/listParams.js.map +1 -0
  111. package/dist/src/runtime/queryKeys.d.ts +18 -0
  112. package/dist/src/runtime/queryKeys.d.ts.map +1 -0
  113. package/dist/src/runtime/queryKeys.js +23 -0
  114. package/dist/src/runtime/queryKeys.js.map +1 -0
  115. package/dist/src/runtime/react/AdminMediaPanel.d.ts +2 -0
  116. package/dist/src/runtime/react/AdminMediaPanel.d.ts.map +1 -0
  117. package/dist/src/runtime/react/AdminMediaPanel.js +14 -0
  118. package/dist/src/runtime/react/AdminMediaPanel.js.map +1 -0
  119. package/dist/src/runtime/react/MediaLibrary.d.ts +6 -0
  120. package/dist/src/runtime/react/MediaLibrary.d.ts.map +1 -0
  121. package/dist/src/runtime/react/MediaLibrary.js +138 -0
  122. package/dist/src/runtime/react/MediaLibrary.js.map +1 -0
  123. package/dist/src/runtime/react/MediaProvider.d.ts +18 -0
  124. package/dist/src/runtime/react/MediaProvider.d.ts.map +1 -0
  125. package/dist/src/runtime/react/MediaProvider.js +79 -0
  126. package/dist/src/runtime/react/MediaProvider.js.map +1 -0
  127. package/dist/src/runtime/react/MediaQueryProvider.d.ts +8 -0
  128. package/dist/src/runtime/react/MediaQueryProvider.d.ts.map +1 -0
  129. package/dist/src/runtime/react/MediaQueryProvider.js +11 -0
  130. package/dist/src/runtime/react/MediaQueryProvider.js.map +1 -0
  131. package/dist/src/runtime/react/MediaUploadDropzone.d.ts +8 -0
  132. package/dist/src/runtime/react/MediaUploadDropzone.d.ts.map +1 -0
  133. package/dist/src/runtime/react/MediaUploadDropzone.js +34 -0
  134. package/dist/src/runtime/react/MediaUploadDropzone.js.map +1 -0
  135. package/dist/src/runtime/react/ObjectDetail.d.ts +5 -0
  136. package/dist/src/runtime/react/ObjectDetail.d.ts.map +1 -0
  137. package/dist/src/runtime/react/ObjectDetail.js +34 -0
  138. package/dist/src/runtime/react/ObjectDetail.js.map +1 -0
  139. package/dist/src/runtime/react/PresetEditor.d.ts +3 -0
  140. package/dist/src/runtime/react/PresetEditor.d.ts.map +1 -0
  141. package/dist/src/runtime/react/PresetEditor.js +36 -0
  142. package/dist/src/runtime/react/PresetEditor.js.map +1 -0
  143. package/dist/src/runtime/react/RequireSuperuser.d.ts +7 -0
  144. package/dist/src/runtime/react/RequireSuperuser.d.ts.map +1 -0
  145. package/dist/src/runtime/react/RequireSuperuser.js +10 -0
  146. package/dist/src/runtime/react/RequireSuperuser.js.map +1 -0
  147. package/dist/src/runtime/react/VariantPicker.d.ts +5 -0
  148. package/dist/src/runtime/react/VariantPicker.d.ts.map +1 -0
  149. package/dist/src/runtime/react/VariantPicker.js +28 -0
  150. package/dist/src/runtime/react/VariantPicker.js.map +1 -0
  151. package/dist/src/runtime/react/default-ui/index.d.ts +25 -0
  152. package/dist/src/runtime/react/default-ui/index.d.ts.map +1 -0
  153. package/dist/src/runtime/react/default-ui/index.js +33 -0
  154. package/dist/src/runtime/react/default-ui/index.js.map +1 -0
  155. package/dist/src/runtime/react/index.d.ts +10 -0
  156. package/dist/src/runtime/react/index.d.ts.map +1 -0
  157. package/dist/src/runtime/react/index.js +10 -0
  158. package/dist/src/runtime/react/index.js.map +1 -0
  159. package/dist/src/runtime/routes.d.ts +19 -0
  160. package/dist/src/runtime/routes.d.ts.map +1 -0
  161. package/dist/src/runtime/routes.js +35 -0
  162. package/dist/src/runtime/routes.js.map +1 -0
  163. package/dist/src/runtime/schemas.d.ts +812 -0
  164. package/dist/src/runtime/schemas.d.ts.map +1 -0
  165. package/dist/src/runtime/schemas.js +427 -0
  166. package/dist/src/runtime/schemas.js.map +1 -0
  167. package/dist/src/runtime/upload/index.d.ts +2 -0
  168. package/dist/src/runtime/upload/index.d.ts.map +1 -0
  169. package/dist/src/runtime/upload/index.js +2 -0
  170. package/dist/src/runtime/upload/index.js.map +1 -0
  171. package/dist/src/runtime/upload/uploadController.d.ts +71 -0
  172. package/dist/src/runtime/upload/uploadController.d.ts.map +1 -0
  173. package/dist/src/runtime/upload/uploadController.js +217 -0
  174. package/dist/src/runtime/upload/uploadController.js.map +1 -0
  175. package/package.json +97 -0
  176. package/registry/r/admin-media-dashboard.json +23 -0
  177. package/registry/r/data-table.json +23 -0
  178. package/registry/r/media-dashboard-overview.json +26 -0
  179. package/registry/r/media-maintenance-panel.json +23 -0
  180. package/registry/r/media-storage-chart.json +21 -0
  181. package/registry/r/registry.json +37 -0
  182. package/registry.json +92 -0
  183. package/src/routes/admin/media.astro +12 -0
  184. package/src/routes/library.astro +12 -0
  185. package/src/routes/object/[id].astro +14 -0
  186. package/src/routes/presets.astro +12 -0
  187. package/src/routes/upload.astro +12 -0
  188. package/src/scaffold/styles/media.css +208 -0
@@ -0,0 +1,6 @@
1
+ import { type ImagePresetCreate, type ImagePresetPublic, type ImagePresetUpdate } from "../schemas.js";
2
+ export declare function listPresets(): Promise<ImagePresetPublic[]>;
3
+ export declare function createPreset(body: ImagePresetCreate): Promise<ImagePresetPublic>;
4
+ export declare function updatePreset(presetId: string, body: ImagePresetUpdate): Promise<ImagePresetPublic>;
5
+ export declare function deletePreset(presetId: string): Promise<void>;
6
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../../src/runtime/api/presets.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAEvB,wBAAgB,WAAW,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAE1D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAQhF;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAQ5B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5D"}
@@ -0,0 +1,31 @@
1
+ import { request } from "../client.js";
2
+ import { ImagePresetListSchema, ImagePresetPublicSchema } from "../schemas.js";
3
+ export function listPresets() {
4
+ return request({ method: "GET", path: "/presets", schema: ImagePresetListSchema, auth: true });
5
+ }
6
+ export function createPreset(body) {
7
+ return request({
8
+ method: "POST",
9
+ path: "/presets",
10
+ body,
11
+ schema: ImagePresetPublicSchema,
12
+ auth: true
13
+ });
14
+ }
15
+ export function updatePreset(presetId, body) {
16
+ return request({
17
+ method: "PATCH",
18
+ path: `/presets/${encodeURIComponent(presetId)}`,
19
+ body,
20
+ schema: ImagePresetPublicSchema,
21
+ auth: true
22
+ });
23
+ }
24
+ export function deletePreset(presetId) {
25
+ return request({
26
+ method: "DELETE",
27
+ path: `/presets/${encodeURIComponent(presetId)}`,
28
+ auth: true
29
+ });
30
+ }
31
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../../src/runtime/api/presets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EAIxB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,qBAAqB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAuB;IAClD,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,UAAU;QAChB,IAAI;QACJ,MAAM,EAAE,uBAAuB;QAC/B,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,IAAuB;IAEvB,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,EAAE;QAChD,IAAI;QACJ,MAAM,EAAE,uBAAuB;QAC/B,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,EAAE;QAChD,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type DownloadUrlResponse, type ShareTokenCreate, type ShareTokenListResponse, type ShareTokenPublic } from "../schemas.js";
2
+ export declare function createShare(objectId: string, body?: ShareTokenCreate): Promise<ShareTokenPublic>;
3
+ export declare function listShares(objectId: string): Promise<ShareTokenListResponse>;
4
+ export declare function revokeShare(tokenId: string): Promise<void>;
5
+ /**
6
+ * Resolve a public share token to a presigned download URL. This route is
7
+ * public on the service, so no bearer token is attached.
8
+ */
9
+ export declare function resolveShare(token: string): Promise<DownloadUrlResponse>;
10
+ //# sourceMappingURL=shares.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shares.d.ts","sourceRoot":"","sources":["../../../../src/runtime/api/shares.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAEvB,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAQ3B;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAO5E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAMxE"}
@@ -0,0 +1,38 @@
1
+ import { request } from "../client.js";
2
+ import { DownloadUrlResponseSchema, ShareTokenListResponseSchema, ShareTokenPublicSchema } from "../schemas.js";
3
+ export function createShare(objectId, body = {}) {
4
+ return request({
5
+ method: "POST",
6
+ path: `/objects/${encodeURIComponent(objectId)}/shares`,
7
+ body,
8
+ schema: ShareTokenPublicSchema,
9
+ auth: true
10
+ });
11
+ }
12
+ export function listShares(objectId) {
13
+ return request({
14
+ method: "GET",
15
+ path: `/objects/${encodeURIComponent(objectId)}/shares`,
16
+ schema: ShareTokenListResponseSchema,
17
+ auth: true
18
+ });
19
+ }
20
+ export function revokeShare(tokenId) {
21
+ return request({
22
+ method: "DELETE",
23
+ path: `/shares/${encodeURIComponent(tokenId)}`,
24
+ auth: true
25
+ });
26
+ }
27
+ /**
28
+ * Resolve a public share token to a presigned download URL. This route is
29
+ * public on the service, so no bearer token is attached.
30
+ */
31
+ export function resolveShare(token) {
32
+ return request({
33
+ method: "GET",
34
+ path: `/shares/${encodeURIComponent(token)}`,
35
+ schema: DownloadUrlResponseSchema
36
+ });
37
+ }
38
+ //# sourceMappingURL=shares.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shares.js","sourceRoot":"","sources":["../../../../src/runtime/api/shares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EAKvB,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,OAAyB,EAAE;IAE3B,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,SAAS;QACvD,IAAI;QACJ,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,SAAS;QACvD,MAAM,EAAE,4BAA4B;QACpC,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,WAAW,kBAAkB,CAAC,OAAO,CAAC,EAAE;QAC9C,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,WAAW,kBAAkB,CAAC,KAAK,CAAC,EAAE;QAC5C,MAAM,EAAE,yBAAyB;KAClC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type UploadCompleteRequest, type UploadCompleteResponse, type UploadInitiateRequest, type UploadInitiateResponse } from "../schemas.js";
2
+ export declare function initiateUpload(body: UploadInitiateRequest): Promise<UploadInitiateResponse>;
3
+ export declare function completeUpload(sessionId: string, body?: UploadCompleteRequest): Promise<UploadCompleteResponse>;
4
+ export declare function abortUpload(sessionId: string): Promise<void>;
5
+ //# sourceMappingURL=uploads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../../../src/runtime/api/uploads.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC5B,MAAM,eAAe,CAAC;AAEvB,wBAAgB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAQ3F;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAQjC;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM5D"}
@@ -0,0 +1,28 @@
1
+ import { request } from "../client.js";
2
+ import { UploadCompleteResponseSchema, UploadInitiateResponseSchema } from "../schemas.js";
3
+ export function initiateUpload(body) {
4
+ return request({
5
+ method: "POST",
6
+ path: "/uploads/initiate",
7
+ body,
8
+ schema: UploadInitiateResponseSchema,
9
+ auth: true
10
+ });
11
+ }
12
+ export function completeUpload(sessionId, body = {}) {
13
+ return request({
14
+ method: "POST",
15
+ path: `/uploads/${encodeURIComponent(sessionId)}/complete`,
16
+ body,
17
+ schema: UploadCompleteResponseSchema,
18
+ auth: true
19
+ });
20
+ }
21
+ export function abortUpload(sessionId) {
22
+ return request({
23
+ method: "POST",
24
+ path: `/uploads/${encodeURIComponent(sessionId)}/abort`,
25
+ auth: true
26
+ });
27
+ }
28
+ //# sourceMappingURL=uploads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../../../src/runtime/api/uploads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAK7B,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,cAAc,CAAC,IAA2B;IACxD,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,mBAAmB;QACzB,IAAI;QACJ,MAAM,EAAE,4BAA4B;QACpC,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,OAA8B,EAAE;IAEhC,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,YAAY,kBAAkB,CAAC,SAAS,CAAC,WAAW;QAC1D,IAAI;QACJ,MAAM,EAAE,4BAA4B;QACpC,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,YAAY,kBAAkB,CAAC,SAAS,CAAC,QAAQ;QACvD,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type VariantGenerateRequest, type VariantJobPublic, type VariantListResponse } from "../schemas.js";
2
+ export declare function generateVariants(objectId: string, body: VariantGenerateRequest): Promise<VariantJobPublic>;
3
+ export declare function listVariants(objectId: string): Promise<VariantListResponse>;
4
+ export declare function getVariantJob(objectId: string, jobId: string): Promise<VariantJobPublic>;
5
+ export declare function deleteVariant(objectId: string, variantId: string): Promise<void>;
6
+ export type WaitForVariantJobOptions = {
7
+ intervalMs?: number;
8
+ timeoutMs?: number;
9
+ signal?: AbortSignal;
10
+ onUpdate?: (job: VariantJobPublic) => void;
11
+ };
12
+ /**
13
+ * Poll a variant job until it reaches a terminal state (`completed`/`failed`),
14
+ * the timeout elapses, or the supplied signal aborts. Intervals/timeout default
15
+ * to the runtime polling config.
16
+ */
17
+ export declare function waitForVariantJob(objectId: string, jobId: string, options?: WaitForVariantJobOptions): Promise<VariantJobPublic>;
18
+ //# sourceMappingURL=variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../../../src/runtime/api/variants.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EAErB,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC;AAEvB,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAS3B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAO3E;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAOxF;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF;AAID,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,gBAAgB,CAAC,CAgB3B"}
@@ -0,0 +1,61 @@
1
+ import { request } from "../client.js";
2
+ import { getMediaConfig } from "../config.js";
3
+ import { VariantJobPublicSchema, VariantListResponseSchema } from "../schemas.js";
4
+ export function generateVariants(objectId, body) {
5
+ return request({
6
+ method: "POST",
7
+ // Action sub-resource: the literal ":generate" suffix is part of the route.
8
+ path: `/objects/${encodeURIComponent(objectId)}/variants:generate`,
9
+ body,
10
+ schema: VariantJobPublicSchema,
11
+ auth: true
12
+ });
13
+ }
14
+ export function listVariants(objectId) {
15
+ return request({
16
+ method: "GET",
17
+ path: `/objects/${encodeURIComponent(objectId)}/variants`,
18
+ schema: VariantListResponseSchema,
19
+ auth: true
20
+ });
21
+ }
22
+ export function getVariantJob(objectId, jobId) {
23
+ return request({
24
+ method: "GET",
25
+ path: `/objects/${encodeURIComponent(objectId)}/variants/jobs/${encodeURIComponent(jobId)}`,
26
+ schema: VariantJobPublicSchema,
27
+ auth: true
28
+ });
29
+ }
30
+ export function deleteVariant(objectId, variantId) {
31
+ return request({
32
+ method: "DELETE",
33
+ path: `/objects/${encodeURIComponent(objectId)}/variants/${encodeURIComponent(variantId)}`,
34
+ auth: true
35
+ });
36
+ }
37
+ const TERMINAL_JOB_STATES = new Set(["completed", "failed"]);
38
+ /**
39
+ * Poll a variant job until it reaches a terminal state (`completed`/`failed`),
40
+ * the timeout elapses, or the supplied signal aborts. Intervals/timeout default
41
+ * to the runtime polling config.
42
+ */
43
+ export async function waitForVariantJob(objectId, jobId, options = {}) {
44
+ const polling = getMediaConfig().polling;
45
+ const intervalMs = options.intervalMs ?? polling.variantJobMs;
46
+ const timeoutMs = options.timeoutMs ?? polling.timeoutMs;
47
+ const deadline = Date.now() + timeoutMs;
48
+ for (;;) {
49
+ if (options.signal?.aborted)
50
+ throw new Error("Variant job polling aborted");
51
+ const job = await getVariantJob(objectId, jobId);
52
+ options.onUpdate?.(job);
53
+ if (TERMINAL_JOB_STATES.has(job.status))
54
+ return job;
55
+ if (Date.now() + intervalMs >= deadline) {
56
+ throw new Error("Timed out waiting for variant job to finish");
57
+ }
58
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
59
+ }
60
+ }
61
+ //# sourceMappingURL=variants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variants.js","sourceRoot":"","sources":["../../../../src/runtime/api/variants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EAK1B,MAAM,eAAe,CAAC;AAEvB,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,IAA4B;IAE5B,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,MAAM;QACd,4EAA4E;QAC5E,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,oBAAoB;QAClE,IAAI;QACJ,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,WAAW;QACzD,MAAM,EAAE,yBAAyB;QACjC,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,KAAa;IAC3D,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,kBAAkB,kBAAkB,CAAC,KAAK,CAAC,EAAE;QAC3F,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,SAAiB;IAC/D,OAAO,OAAO,CAAC;QACb,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,YAAY,kBAAkB,CAAC,QAAQ,CAAC,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE;QAC1F,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,mBAAmB,GAAkC,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;AAS5F;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,KAAa,EACb,UAAoC,EAAE;IAEtC,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC,OAAO,CAAC;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,SAAS,CAAC;QACR,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,GAAG,CAAC;QACpD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,IAAI,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Narrow runtime contract the media plugin consumes for authentication.
3
+ *
4
+ * The media plugin never owns token storage or refresh logic; it delegates to
5
+ * whatever the host stack provides. `@fa-m8/astro-auth-m8` is the official
6
+ * provider, but any object that satisfies this shape works.
7
+ */
8
+ export type MediaAuthAdapter = {
9
+ getAccessToken(): string | null | Promise<string | null>;
10
+ refresh?(): Promise<string | null>;
11
+ getUser?(): unknown | Promise<unknown>;
12
+ requireUser?(): Promise<unknown>;
13
+ isSuperuser?(user?: unknown): boolean;
14
+ hasRole?(role: string, user?: unknown): boolean;
15
+ onUnauthenticated?(reason: unknown): void;
16
+ };
17
+ export type InMemoryAuthAdapter = MediaAuthAdapter & {
18
+ /** Set or clear the in-memory access token (never persisted). */
19
+ setAccessToken(token: string | null): void;
20
+ };
21
+ /**
22
+ * Best-effort superuser detection that does not depend on a specific user
23
+ * shape: honours an explicit `is_superuser` flag, the configured admin role,
24
+ * or a `roles` array containing it.
25
+ */
26
+ export declare function defaultIsSuperuser(user: unknown, adminRole?: string): boolean;
27
+ /** A self-contained adapter that holds the token in memory only. */
28
+ export declare function createInMemoryAuthAdapter(initialToken?: string | null): InMemoryAuthAdapter;
29
+ export type FaAuthBindings = {
30
+ getToken: () => string | null;
31
+ refreshToken?: () => Promise<{
32
+ access_token?: string;
33
+ } | string | null | undefined>;
34
+ getUser?: () => unknown | Promise<unknown>;
35
+ isSuperuser?: (user?: unknown) => boolean;
36
+ hasRole?: (role: string, user?: unknown) => boolean;
37
+ onUnauthenticated?: (reason: unknown) => void;
38
+ };
39
+ /**
40
+ * Build the official adapter from `@fa-m8/astro-auth-m8` bindings. The bindings
41
+ * are injected by the consumer so the media plugin keeps the auth plugin as an
42
+ * optional peer and never statically imports it.
43
+ */
44
+ export declare function createFaAuthAdapter(bindings: FaAuthBindings): MediaAuthAdapter;
45
+ export declare function setMediaAuthAdapter(next: MediaAuthAdapter): MediaAuthAdapter;
46
+ export declare function getMediaAuthAdapter(): MediaAuthAdapter;
47
+ export declare function resetMediaAuthAdapter(): void;
48
+ //# sourceMappingURL=authAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authAdapter.d.ts","sourceRoot":"","sources":["../../../src/runtime/authAdapter.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,IAAI,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzD,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,WAAW,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IACtC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAChD,iBAAiB,CAAC,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IACnD,iEAAiE;IACjE,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CAC5C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,SAA6B,GAAG,OAAO,CAQjG;AAED,oEAAoE;AACpE,wBAAgB,yBAAyB,CAAC,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,mBAAmB,CASjG;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACpF,OAAO,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IACpD,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,gBAAgB,CAc9E;AAID,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAG5E;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
@@ -0,0 +1,62 @@
1
+ import { getMediaConfig } from "./config.js";
2
+ /**
3
+ * Best-effort superuser detection that does not depend on a specific user
4
+ * shape: honours an explicit `is_superuser` flag, the configured admin role,
5
+ * or a `roles` array containing it.
6
+ */
7
+ export function defaultIsSuperuser(user, adminRole = getMediaConfig().adminRole) {
8
+ if (!user || typeof user !== "object")
9
+ return false;
10
+ const record = user;
11
+ if (record.is_superuser === true)
12
+ return true;
13
+ if (adminRole !== "is_superuser" && typeof record.role === "string" && record.role === adminRole) {
14
+ return true;
15
+ }
16
+ return Array.isArray(record.roles) && record.roles.includes(adminRole);
17
+ }
18
+ /** A self-contained adapter that holds the token in memory only. */
19
+ export function createInMemoryAuthAdapter(initialToken = null) {
20
+ let token = initialToken;
21
+ return {
22
+ getAccessToken: () => token,
23
+ setAccessToken: (next) => {
24
+ token = next;
25
+ },
26
+ isSuperuser: (user) => defaultIsSuperuser(user)
27
+ };
28
+ }
29
+ /**
30
+ * Build the official adapter from `@fa-m8/astro-auth-m8` bindings. The bindings
31
+ * are injected by the consumer so the media plugin keeps the auth plugin as an
32
+ * optional peer and never statically imports it.
33
+ */
34
+ export function createFaAuthAdapter(bindings) {
35
+ return {
36
+ getAccessToken: () => bindings.getToken(),
37
+ refresh: async () => {
38
+ if (!bindings.refreshToken)
39
+ return null;
40
+ const result = await bindings.refreshToken();
41
+ if (!result)
42
+ return null;
43
+ return typeof result === "string" ? result : result.access_token ?? null;
44
+ },
45
+ getUser: bindings.getUser,
46
+ isSuperuser: (user) => (bindings.isSuperuser ? bindings.isSuperuser(user) : defaultIsSuperuser(user)),
47
+ hasRole: bindings.hasRole,
48
+ onUnauthenticated: bindings.onUnauthenticated
49
+ };
50
+ }
51
+ let adapter = createInMemoryAuthAdapter();
52
+ export function setMediaAuthAdapter(next) {
53
+ adapter = next;
54
+ return adapter;
55
+ }
56
+ export function getMediaAuthAdapter() {
57
+ return adapter;
58
+ }
59
+ export function resetMediaAuthAdapter() {
60
+ adapter = createInMemoryAuthAdapter();
61
+ }
62
+ //# sourceMappingURL=authAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authAdapter.js","sourceRoot":"","sources":["../../../src/runtime/authAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAwB7C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa,EAAE,SAAS,GAAG,cAAc,EAAE,CAAC,SAAS;IACtF,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,MAAM,GAAG,IAA+B,CAAC;IAC/C,IAAI,MAAM,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,SAAS,KAAK,cAAc,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AACzE,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,yBAAyB,CAAC,eAA8B,IAAI;IAC1E,IAAI,KAAK,GAAG,YAAY,CAAC;IACzB,OAAO;QACL,cAAc,EAAE,GAAG,EAAE,CAAC,KAAK;QAC3B,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;YACvB,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QACD,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC;KAChD,CAAC;AACJ,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAwB;IAC1D,OAAO;QACL,cAAc,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACzC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,YAAY;gBAAE,OAAO,IAAI,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC7C,IAAI,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YACzB,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACrG,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;KAC9C,CAAC;AACJ,CAAC;AAED,IAAI,OAAO,GAAqB,yBAAyB,EAAE,CAAC;AAE5D,MAAM,UAAU,mBAAmB,CAAC,IAAsB;IACxD,OAAO,GAAG,IAAI,CAAC;IACf,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,GAAG,yBAAyB,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ export * from "./api/index.js";
3
+ export type MediaRequestBase = "v1" | "legacy" | "absolute";
4
+ export type MediaRequestOptions<T> = {
5
+ method: "GET" | "POST" | "PATCH" | "PUT" | "DELETE";
6
+ base?: MediaRequestBase;
7
+ path: string;
8
+ query?: Record<string, string | number | boolean | null | undefined>;
9
+ body?: unknown;
10
+ headers?: Record<string, string>;
11
+ schema?: z.ZodType<T>;
12
+ auth?: boolean;
13
+ admin?: boolean;
14
+ skipRefresh?: boolean;
15
+ };
16
+ /**
17
+ * Resolve a request path against the configured bases. Most media routes live
18
+ * under `apiBase + v1Base`; dashboard/category live under `apiBase + legacyBase`.
19
+ * `absolute` is escaped for already-fully-qualified URLs. The protocol is pinned
20
+ * to http(s) so a crafted `path` can never smuggle in `javascript:`/`data:`.
21
+ */
22
+ export declare function mediaUrl(base: MediaRequestBase, path: string): string;
23
+ export declare function request<T>(options: MediaRequestOptions<T>): Promise<T>;
24
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/runtime/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,cAAc,gBAAgB,CAAC;AAE/B,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE5D,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;IACpD,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACrE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAYrE;AAED,wBAAsB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAmE5E"}
@@ -0,0 +1,87 @@
1
+ import { getMediaConfig } from "./config.js";
2
+ import { getMediaAuthAdapter } from "./authAdapter.js";
3
+ import { ApiError, ForbiddenError, messageFromDetail, normalizeFastApiError, UnauthenticatedError } from "./errors.js";
4
+ export * from "./api/index.js";
5
+ /**
6
+ * Resolve a request path against the configured bases. Most media routes live
7
+ * under `apiBase + v1Base`; dashboard/category live under `apiBase + legacyBase`.
8
+ * `absolute` is escaped for already-fully-qualified URLs. The protocol is pinned
9
+ * to http(s) so a crafted `path` can never smuggle in `javascript:`/`data:`.
10
+ */
11
+ export function mediaUrl(base, path) {
12
+ const config = getMediaConfig();
13
+ const origin = typeof window === "undefined" ? "http://localhost" : window.location.origin;
14
+ const full = base === "absolute"
15
+ ? path
16
+ : `${config.apiBase}${base === "legacy" ? config.legacyBase : config.v1Base}${path}`;
17
+ const url = new URL(full, origin);
18
+ if (!["http:", "https:"].includes(url.protocol)) {
19
+ throw new Error("Unsupported media API protocol");
20
+ }
21
+ return url.toString();
22
+ }
23
+ export async function request(options) {
24
+ const config = getMediaConfig();
25
+ const adapter = getMediaAuthAdapter();
26
+ // Guard admin calls before they hit the network when the user is known, so a
27
+ // non-superuser never even emits the request.
28
+ if (options.admin && adapter.getUser && adapter.isSuperuser) {
29
+ const user = await adapter.getUser();
30
+ if (user != null && !adapter.isSuperuser(user)) {
31
+ throw new ForbiddenError();
32
+ }
33
+ }
34
+ const url = new URL(mediaUrl(options.base ?? "v1", options.path));
35
+ for (const [key, value] of Object.entries(options.query ?? {})) {
36
+ if (value != null)
37
+ url.searchParams.set(key, String(value));
38
+ }
39
+ const headers = new Headers({
40
+ [config.csrfHeader]: "XMLHttpRequest",
41
+ ...options.headers
42
+ });
43
+ if (options.auth) {
44
+ const token = await adapter.getAccessToken();
45
+ if (token)
46
+ headers.set("Authorization", `Bearer ${token}`);
47
+ }
48
+ let body;
49
+ if (options.body !== undefined) {
50
+ headers.set("Content-Type", "application/json");
51
+ body = JSON.stringify(options.body);
52
+ }
53
+ const execute = () => fetch(url.toString(), { method: options.method, headers, body, credentials: "include" });
54
+ let response = await execute();
55
+ if (response.status === 401 && !options.skipRefresh) {
56
+ const refreshed = adapter.refresh ? await adapter.refresh() : null;
57
+ if (refreshed) {
58
+ headers.set("Authorization", `Bearer ${refreshed}`);
59
+ response = await execute();
60
+ }
61
+ else {
62
+ adapter.onUnauthenticated?.("refresh-failed");
63
+ throw new UnauthenticatedError("Session expired. Please sign in again.");
64
+ }
65
+ }
66
+ if (!response.ok) {
67
+ if (response.status === 401) {
68
+ adapter.onUnauthenticated?.("unauthenticated");
69
+ throw new UnauthenticatedError();
70
+ }
71
+ let detail;
72
+ try {
73
+ detail = normalizeFastApiError(await response.clone().json());
74
+ }
75
+ catch {
76
+ detail = await response.text();
77
+ }
78
+ if (response.status === 403 && options.admin) {
79
+ throw new ForbiddenError(messageFromDetail(detail));
80
+ }
81
+ throw new ApiError(response.status, detail);
82
+ }
83
+ if (response.status === 204 || !options.schema)
84
+ return undefined;
85
+ return options.schema.parse(await response.json());
86
+ }
87
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/runtime/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export declare const MEDIA_SERVICE_M8_CONTRACT_ID = "media-service-m8";
2
+ export declare const MEDIA_SERVICE_M8_CONTRACT_VERSION = "0.0";
3
+ export declare const MEDIA_SERVICE_M8_CONTRACT: "media-service-m8@0.0";
4
+ export declare const MEDIA_SERVICE_M8_TESTED_SERVICE_VERSION = "0.0.10";
5
+ export declare const MEDIA_SERVICE_M8_MIN_SERVICE_VERSION = "0.0.10";
6
+ export declare const MEDIA_SERVICE_M8_MAX_SERVICE_VERSION_EXCLUSIVE = "0.1.0";
7
+ export declare const MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE = ">=0.0.10 <0.1.0";
8
+ export type MediaServiceM8CompatibilityStatus = "compatible" | "incompatible" | "unknown";
9
+ export type MediaServiceM8VersionMetadata = {
10
+ contract?: unknown;
11
+ contract_version?: unknown;
12
+ media_contract?: unknown;
13
+ media_contract_version?: unknown;
14
+ media_service_m8_contract?: unknown;
15
+ version?: unknown;
16
+ service_version?: unknown;
17
+ media_service_m8_version?: unknown;
18
+ service?: unknown;
19
+ api_version?: unknown;
20
+ };
21
+ export type MediaServiceM8Compatibility = {
22
+ status: MediaServiceM8CompatibilityStatus;
23
+ expectedContract: typeof MEDIA_SERVICE_M8_CONTRACT;
24
+ expectedServiceVersionRange: typeof MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE;
25
+ contractVersion?: string;
26
+ serviceVersion?: string;
27
+ reason?: string;
28
+ };
29
+ export declare function isMediaServiceM8ServiceVersionCompatible(version: string): boolean;
30
+ export declare function getMediaServiceM8Compatibility(metadata?: MediaServiceM8VersionMetadata): MediaServiceM8Compatibility;
31
+ export declare function assertMediaServiceM8Compatibility(metadata: MediaServiceM8VersionMetadata, requireKnown?: boolean): MediaServiceM8Compatibility;
32
+ //# sourceMappingURL=compatibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.d.ts","sourceRoot":"","sources":["../../../src/runtime/compatibility.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,qBAAqB,CAAC;AAG/D,eAAO,MAAM,iCAAiC,QAAQ,CAAC;AACvD,eAAO,MAAM,yBAAyB,wBAAkF,CAAC;AAGzH,eAAO,MAAM,uCAAuC,WAAW,CAAC;AAChE,eAAO,MAAM,oCAAoC,WAAW,CAAC;AAC7D,eAAO,MAAM,8CAA8C,UAAU,CAAC;AACtE,eAAO,MAAM,sCAAsC,oBAAiG,CAAC;AAErJ,MAAM,MAAM,iCAAiC,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC;AAE1F,MAAM,MAAM,6BAA6B,GAAG;IAG1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAEnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,EAAE,iCAAiC,CAAC;IAC1C,gBAAgB,EAAE,OAAO,yBAAyB,CAAC;IACnD,2BAA2B,EAAE,OAAO,sCAAsC,CAAC;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AA+BF,wBAAgB,wCAAwC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIjF;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,GAAE,6BAAkC,GAC3C,2BAA2B,CAuD7B;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,6BAA6B,EACvC,YAAY,UAAO,GAClB,2BAA2B,CAM7B"}
@@ -0,0 +1,101 @@
1
+ export const MEDIA_SERVICE_M8_CONTRACT_ID = "media-service-m8";
2
+ // Pre-1.0 contract: tracks the service package major.minor (0.0.x), not an
3
+ // aspirational 1.0 — kept in lockstep with media-service-m8's CONTRACT_VERSION.
4
+ export const MEDIA_SERVICE_M8_CONTRACT_VERSION = "0.0";
5
+ export const MEDIA_SERVICE_M8_CONTRACT = `${MEDIA_SERVICE_M8_CONTRACT_ID}@${MEDIA_SERVICE_M8_CONTRACT_VERSION}`;
6
+ // 0.0.10 is the first media-service-m8 release supporting the media library's
7
+ // filename/category/status server-side sorting contract.
8
+ export const MEDIA_SERVICE_M8_TESTED_SERVICE_VERSION = "0.0.10";
9
+ export const MEDIA_SERVICE_M8_MIN_SERVICE_VERSION = "0.0.10";
10
+ export const MEDIA_SERVICE_M8_MAX_SERVICE_VERSION_EXCLUSIVE = "0.1.0";
11
+ export const MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE = `>=${MEDIA_SERVICE_M8_MIN_SERVICE_VERSION} <${MEDIA_SERVICE_M8_MAX_SERVICE_VERSION_EXCLUSIVE}`;
12
+ function stringValue(value) {
13
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
14
+ }
15
+ // Read ``contract.version`` from the GET /meta nested contract object.
16
+ function contractObjectVersion(value) {
17
+ if (typeof value === "object" && value !== null) {
18
+ return stringValue(value.version);
19
+ }
20
+ return undefined;
21
+ }
22
+ function parseSemver(version) {
23
+ const match = /^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/.exec(version);
24
+ if (!match)
25
+ return undefined;
26
+ return [Number(match[1]), Number(match[2]), Number(match[3])];
27
+ }
28
+ function compareSemver(left, right) {
29
+ const parsedLeft = parseSemver(left);
30
+ const parsedRight = parseSemver(right);
31
+ if (!parsedLeft || !parsedRight)
32
+ return undefined;
33
+ for (let index = 0; index < parsedLeft.length; index += 1) {
34
+ if (parsedLeft[index] > parsedRight[index])
35
+ return 1;
36
+ if (parsedLeft[index] < parsedRight[index])
37
+ return -1;
38
+ }
39
+ return 0;
40
+ }
41
+ export function isMediaServiceM8ServiceVersionCompatible(version) {
42
+ const aboveMin = compareSemver(version, MEDIA_SERVICE_M8_MIN_SERVICE_VERSION);
43
+ const belowMax = compareSemver(version, MEDIA_SERVICE_M8_MAX_SERVICE_VERSION_EXCLUSIVE);
44
+ return aboveMin !== undefined && belowMax !== undefined && aboveMin >= 0 && belowMax < 0;
45
+ }
46
+ export function getMediaServiceM8Compatibility(metadata = {}) {
47
+ const contractVersion = stringValue(metadata.media_contract_version) ??
48
+ stringValue(metadata.contract_version) ??
49
+ stringValue(metadata.media_service_m8_contract) ??
50
+ stringValue(metadata.media_contract) ??
51
+ contractObjectVersion(metadata.contract) ??
52
+ stringValue(metadata.contract);
53
+ const serviceVersion = stringValue(metadata.media_service_m8_version) ??
54
+ stringValue(metadata.service_version) ??
55
+ stringValue(metadata.version);
56
+ if (contractVersion &&
57
+ contractVersion !== MEDIA_SERVICE_M8_CONTRACT_VERSION &&
58
+ contractVersion !== MEDIA_SERVICE_M8_CONTRACT) {
59
+ return {
60
+ status: "incompatible",
61
+ expectedContract: MEDIA_SERVICE_M8_CONTRACT,
62
+ expectedServiceVersionRange: MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE,
63
+ contractVersion,
64
+ serviceVersion,
65
+ reason: `Expected ${MEDIA_SERVICE_M8_CONTRACT}, received ${contractVersion}`
66
+ };
67
+ }
68
+ if (serviceVersion && !isMediaServiceM8ServiceVersionCompatible(serviceVersion)) {
69
+ return {
70
+ status: "incompatible",
71
+ expectedContract: MEDIA_SERVICE_M8_CONTRACT,
72
+ expectedServiceVersionRange: MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE,
73
+ contractVersion,
74
+ serviceVersion,
75
+ reason: `Expected media-service-m8 service version ${MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE}, received ${serviceVersion}`
76
+ };
77
+ }
78
+ if (contractVersion || serviceVersion) {
79
+ return {
80
+ status: "compatible",
81
+ expectedContract: MEDIA_SERVICE_M8_CONTRACT,
82
+ expectedServiceVersionRange: MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE,
83
+ contractVersion,
84
+ serviceVersion
85
+ };
86
+ }
87
+ return {
88
+ status: "unknown",
89
+ expectedContract: MEDIA_SERVICE_M8_CONTRACT,
90
+ expectedServiceVersionRange: MEDIA_SERVICE_M8_SERVICE_VERSION_RANGE,
91
+ reason: "No media-service-m8 contract or service version metadata was provided"
92
+ };
93
+ }
94
+ export function assertMediaServiceM8Compatibility(metadata, requireKnown = true) {
95
+ const compatibility = getMediaServiceM8Compatibility(metadata);
96
+ if (compatibility.status === "incompatible" || (requireKnown && compatibility.status === "unknown")) {
97
+ throw new Error(compatibility.reason);
98
+ }
99
+ return compatibility;
100
+ }
101
+ //# sourceMappingURL=compatibility.js.map