@venizia/ignis 0.4.7-0 → 0.4.7-2

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 (177) hide show
  1. package/LICENSE.md +1 -4
  2. package/README.md +2 -2
  3. package/dist/esm/base/applications/base.d.ts.map +1 -1
  4. package/dist/esm/base/applications/base.js +25 -18
  5. package/dist/esm/base/applications/base.js.map +1 -1
  6. package/dist/esm/base/applications/common/index.d.ts +1 -0
  7. package/dist/esm/base/applications/common/index.d.ts.map +1 -1
  8. package/dist/esm/base/applications/common/index.js +1 -0
  9. package/dist/esm/base/applications/common/index.js.map +1 -1
  10. package/dist/esm/base/applications/common/logger-startup.d.ts +11 -0
  11. package/dist/esm/base/applications/common/logger-startup.d.ts.map +1 -0
  12. package/dist/esm/base/applications/common/logger-startup.js +29 -0
  13. package/dist/esm/base/applications/common/logger-startup.js.map +1 -0
  14. package/dist/esm/base/applications/server.d.ts +14 -9
  15. package/dist/esm/base/applications/server.d.ts.map +1 -1
  16. package/dist/esm/base/applications/server.js +36 -29
  17. package/dist/esm/base/applications/server.js.map +1 -1
  18. package/dist/esm/common/constants.d.ts.map +1 -1
  19. package/dist/esm/common/constants.js +2 -2
  20. package/dist/esm/common/constants.js.map +1 -1
  21. package/dist/esm/components/auth/authenticate/component.js +2 -2
  22. package/dist/esm/components/auth/authenticate/component.js.map +1 -1
  23. package/dist/esm/components/auth/authenticate/controllers/factory.d.ts +139 -136
  24. package/dist/esm/components/auth/authenticate/controllers/factory.d.ts.map +1 -1
  25. package/dist/esm/components/auth/authenticate/controllers/factory.js +175 -172
  26. package/dist/esm/components/auth/authenticate/controllers/factory.js.map +1 -1
  27. package/dist/esm/components/auth/authenticate/controllers/jwks/definitions.js +2 -2
  28. package/dist/esm/components/auth/authenticate/controllers/jwks/definitions.js.map +1 -1
  29. package/dist/esm/components/auth/authenticate/controllers/service-certs/definitions.js +2 -2
  30. package/dist/esm/components/auth/authenticate/controllers/service-certs/definitions.js.map +1 -1
  31. package/dist/esm/components/auth/authorize/adapters/base-filtered.js +2 -2
  32. package/dist/esm/components/auth/authorize/adapters/base-filtered.js.map +1 -1
  33. package/dist/esm/components/auth/authorize/adapters/custom-grant-expander.d.ts.map +1 -1
  34. package/dist/esm/components/auth/authorize/adapters/custom-grant-expander.js +2 -2
  35. package/dist/esm/components/auth/authorize/adapters/custom-grant-expander.js.map +1 -1
  36. package/dist/esm/components/auth/models/entities/columns.d.ts +99 -0
  37. package/dist/esm/components/auth/models/entities/columns.d.ts.map +1 -0
  38. package/dist/esm/components/auth/models/entities/columns.js +133 -0
  39. package/dist/esm/components/auth/models/entities/columns.js.map +1 -0
  40. package/dist/esm/components/auth/models/entities/index.d.ts +1 -2
  41. package/dist/esm/components/auth/models/entities/index.d.ts.map +1 -1
  42. package/dist/esm/components/auth/models/entities/index.js +1 -2
  43. package/dist/esm/components/auth/models/entities/index.js.map +1 -1
  44. package/dist/esm/components/auth/models/entities/permission.model.d.ts +1 -12
  45. package/dist/esm/components/auth/models/entities/permission.model.d.ts.map +1 -1
  46. package/dist/esm/components/auth/models/entities/permission.model.js +1 -36
  47. package/dist/esm/components/auth/models/entities/permission.model.js.map +1 -1
  48. package/dist/esm/components/auth/models/entities/policy-definition.model.d.ts +1 -49
  49. package/dist/esm/components/auth/models/entities/policy-definition.model.d.ts.map +1 -1
  50. package/dist/esm/components/auth/models/entities/policy-definition.model.js +1 -69
  51. package/dist/esm/components/auth/models/entities/policy-definition.model.js.map +1 -1
  52. package/dist/esm/components/controller/grpc/grpc.component.js +2 -2
  53. package/dist/esm/components/controller/grpc/grpc.component.js.map +1 -1
  54. package/dist/esm/components/health-check/controller.js +5 -5
  55. package/dist/esm/components/health-check/controller.js.map +1 -1
  56. package/dist/esm/components/index.d.ts +0 -1
  57. package/dist/esm/components/index.d.ts.map +1 -1
  58. package/dist/esm/components/index.js +0 -1
  59. package/dist/esm/components/index.js.map +1 -1
  60. package/dist/esm/components/mail/helpers/transporters/amazon-ses-transporter.helper.d.ts.map +1 -1
  61. package/dist/esm/components/mail/helpers/transporters/amazon-ses-transporter.helper.js +13 -9
  62. package/dist/esm/components/mail/helpers/transporters/amazon-ses-transporter.helper.js.map +1 -1
  63. package/dist/esm/components/mail/helpers/transporters/mailgun-transporter.helper.d.ts.map +1 -1
  64. package/dist/esm/components/mail/helpers/transporters/mailgun-transporter.helper.js +5 -3
  65. package/dist/esm/components/mail/helpers/transporters/mailgun-transporter.helper.js.map +1 -1
  66. package/dist/esm/components/mail/helpers/transporters/nodemail-transporter.helper.d.ts.map +1 -1
  67. package/dist/esm/components/mail/helpers/transporters/nodemail-transporter.helper.js +5 -5
  68. package/dist/esm/components/mail/helpers/transporters/nodemail-transporter.helper.js.map +1 -1
  69. package/dist/esm/components/mail/services/generators/verification-data.d.ts.map +1 -1
  70. package/dist/esm/components/mail/services/generators/verification-data.js +7 -3
  71. package/dist/esm/components/mail/services/generators/verification-data.js.map +1 -1
  72. package/dist/esm/components/mail/services/mail.service.js +7 -7
  73. package/dist/esm/components/mail/services/mail.service.js.map +1 -1
  74. package/dist/esm/components/mail/utilities/address.utility.d.ts +12 -8
  75. package/dist/esm/components/mail/utilities/address.utility.d.ts.map +1 -1
  76. package/dist/esm/components/mail/utilities/address.utility.js +30 -27
  77. package/dist/esm/components/mail/utilities/address.utility.js.map +1 -1
  78. package/dist/esm/components/mail/utilities/attachment.utility.d.ts +31 -29
  79. package/dist/esm/components/mail/utilities/attachment.utility.d.ts.map +1 -1
  80. package/dist/esm/components/mail/utilities/attachment.utility.js +97 -86
  81. package/dist/esm/components/mail/utilities/attachment.utility.js.map +1 -1
  82. package/dist/esm/components/mail/utilities/body.utility.d.ts +6 -4
  83. package/dist/esm/components/mail/utilities/body.utility.d.ts.map +1 -1
  84. package/dist/esm/components/mail/utilities/body.utility.js +14 -12
  85. package/dist/esm/components/mail/utilities/body.utility.js.map +1 -1
  86. package/dist/esm/components/mail/utilities/mime.utility.d.ts +23 -17
  87. package/dist/esm/components/mail/utilities/mime.utility.d.ts.map +1 -1
  88. package/dist/esm/components/mail/utilities/mime.utility.js +109 -102
  89. package/dist/esm/components/mail/utilities/mime.utility.js.map +1 -1
  90. package/dist/esm/components/mail/utilities/verification.utility.d.ts +8 -2
  91. package/dist/esm/components/mail/utilities/verification.utility.d.ts.map +1 -1
  92. package/dist/esm/components/mail/utilities/verification.utility.js +7 -5
  93. package/dist/esm/components/mail/utilities/verification.utility.js.map +1 -1
  94. package/dist/esm/components/socket-io/component.js +3 -3
  95. package/dist/esm/components/socket-io/component.js.map +1 -1
  96. package/dist/esm/components/socket-io/handlers/bun.handler.d.ts +13 -11
  97. package/dist/esm/components/socket-io/handlers/bun.handler.d.ts.map +1 -1
  98. package/dist/esm/components/socket-io/handlers/bun.handler.js +32 -30
  99. package/dist/esm/components/socket-io/handlers/bun.handler.js.map +1 -1
  100. package/dist/esm/components/static-asset/common/commit-token.d.ts +21 -16
  101. package/dist/esm/components/static-asset/common/commit-token.d.ts.map +1 -1
  102. package/dist/esm/components/static-asset/common/commit-token.js +35 -28
  103. package/dist/esm/components/static-asset/common/commit-token.js.map +1 -1
  104. package/dist/esm/components/static-asset/common/constants.d.ts +0 -2
  105. package/dist/esm/components/static-asset/common/constants.d.ts.map +1 -1
  106. package/dist/esm/components/static-asset/common/constants.js +1 -3
  107. package/dist/esm/components/static-asset/common/constants.js.map +1 -1
  108. package/dist/esm/components/static-asset/common/types.d.ts +0 -4
  109. package/dist/esm/components/static-asset/common/types.d.ts.map +1 -1
  110. package/dist/esm/components/static-asset/common/types.js.map +1 -1
  111. package/dist/esm/components/static-asset/component.js +2 -2
  112. package/dist/esm/components/static-asset/component.js.map +1 -1
  113. package/dist/esm/components/static-asset/controller/base.definition.d.ts +6 -6
  114. package/dist/esm/components/static-asset/controller/base.definition.d.ts.map +1 -1
  115. package/dist/esm/components/static-asset/controller/base.definition.js +224 -224
  116. package/dist/esm/components/static-asset/controller/base.definition.js.map +1 -1
  117. package/dist/esm/components/static-asset/controller/factory.d.ts +23 -23
  118. package/dist/esm/components/static-asset/controller/factory.d.ts.map +1 -1
  119. package/dist/esm/components/static-asset/controller/factory.js +105 -76
  120. package/dist/esm/components/static-asset/controller/factory.js.map +1 -1
  121. package/dist/esm/components/static-asset/controller/key-scope.d.ts +28 -26
  122. package/dist/esm/components/static-asset/controller/key-scope.d.ts.map +1 -1
  123. package/dist/esm/components/static-asset/controller/key-scope.js +34 -30
  124. package/dist/esm/components/static-asset/controller/key-scope.js.map +1 -1
  125. package/dist/esm/components/static-asset/controller/meta-link.d.ts +37 -33
  126. package/dist/esm/components/static-asset/controller/meta-link.d.ts.map +1 -1
  127. package/dist/esm/components/static-asset/controller/meta-link.js +86 -84
  128. package/dist/esm/components/static-asset/controller/meta-link.js.map +1 -1
  129. package/dist/esm/components/static-asset/controller/route-options.d.ts +18 -16
  130. package/dist/esm/components/static-asset/controller/route-options.d.ts.map +1 -1
  131. package/dist/esm/components/static-asset/controller/route-options.js +28 -26
  132. package/dist/esm/components/static-asset/controller/route-options.js.map +1 -1
  133. package/dist/esm/components/static-asset/models/base.model.js +3 -3
  134. package/dist/esm/components/static-asset/models/base.model.js.map +1 -1
  135. package/dist/esm/components/websocket/component.js +2 -2
  136. package/dist/esm/components/websocket/component.js.map +1 -1
  137. package/dist/esm/components/websocket/handlers/bun.handler.d.ts +6 -4
  138. package/dist/esm/components/websocket/handlers/bun.handler.d.ts.map +1 -1
  139. package/dist/esm/components/websocket/handlers/bun.handler.js +21 -19
  140. package/dist/esm/components/websocket/handlers/bun.handler.js.map +1 -1
  141. package/dist/esm/testing/assert-application-boots.d.ts +6 -1
  142. package/dist/esm/testing/assert-application-boots.d.ts.map +1 -1
  143. package/dist/esm/testing/assert-application-boots.js +139 -136
  144. package/dist/esm/testing/assert-application-boots.js.map +1 -1
  145. package/dist/esm/utilities/drizzle-result.utility.d.ts +6 -8
  146. package/dist/esm/utilities/drizzle-result.utility.d.ts.map +1 -1
  147. package/dist/esm/utilities/drizzle-result.utility.js +23 -49
  148. package/dist/esm/utilities/drizzle-result.utility.js.map +1 -1
  149. package/dist/esm/utilities/network.utility.d.ts.map +1 -1
  150. package/dist/esm/utilities/network.utility.js +2 -2
  151. package/dist/esm/utilities/network.utility.js.map +1 -1
  152. package/dist/presets/app/files/src/boot.test.ts +2 -2
  153. package/dist/presets/app/files/src/controllers/hello.controller.ts +2 -2
  154. package/dist/presets/app/preset.json +4 -4
  155. package/dist/presets/lib/preset.json +4 -4
  156. package/dist/presets/shared/files/.configs/formatters/.ignore +4 -0
  157. package/dist/presets/shared/files/.configs/lints/.ignore +4 -0
  158. package/dist/presets/shared/files/.configs/lints/eslint.config.mjs +4 -0
  159. package/dist/presets/shared/files/.configs/lints/oxlint.config.mts +4 -0
  160. package/dist/presets/shared/files/README.md +15 -0
  161. package/dist/presets/shared/files/src/index.test.ts +8 -0
  162. package/dist/presets/shared/files/src/index.ts +8 -0
  163. package/dist/presets/shared/files/tsconfig.json +20 -0
  164. package/dist/presets/shared/preset.json +35 -0
  165. package/package.json +11 -11
  166. package/dist/esm/components/auth/models/entities/role.model.d.ts +0 -10
  167. package/dist/esm/components/auth/models/entities/role.model.d.ts.map +0 -1
  168. package/dist/esm/components/auth/models/entities/role.model.js +0 -15
  169. package/dist/esm/components/auth/models/entities/role.model.js.map +0 -1
  170. package/dist/esm/components/auth/models/entities/user.model.d.ts +0 -28
  171. package/dist/esm/components/auth/models/entities/user.model.d.ts.map +0 -1
  172. package/dist/esm/components/auth/models/entities/user.model.js +0 -17
  173. package/dist/esm/components/auth/models/entities/user.model.js.map +0 -1
  174. package/dist/esm/components/controller/index.d.ts +0 -2
  175. package/dist/esm/components/controller/index.d.ts.map +0 -1
  176. package/dist/esm/components/controller/index.js +0 -7
  177. package/dist/esm/components/controller/index.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { errorResponses, jsonResponse } from '@venizia/ignis-kernel';
1
+ import { OpenApiResponses } from '@venizia/ignis-kernel';
2
2
  import { z } from '@hono/zod-openapi';
3
3
  import { HTTP } from '@venizia/ignis-helpers/common';
4
4
  import { MetaLinkRecreateActions } from '../common/constants.js';
@@ -50,256 +50,256 @@ const fileStreamResponses = () => ({
50
50
  },
51
51
  },
52
52
  },
53
- ...errorResponses(),
53
+ ...OpenApiResponses.errorResponses(),
54
54
  });
55
55
  /**
56
56
  * Builds the route configs of one asset controller.
57
57
  * `hasConfiguredBucket` drops `/buckets/{bucketName}` and its param from every object route.
58
58
  * `rawObjectPath` appends the `{.+}` catch-all, the spelling `@hono/zod-openapi` translates.
59
59
  */
60
- export const buildAssetDefinitions = (opts) => {
61
- const { hasConfiguredBucket = false, rawObjectPath = false } = opts;
62
- const bucketPrefix = hasConfiguredBucket ? '' : '/buckets/{bucketName}';
63
- // `{objectName}` is ONE segment: a folder path travels percent-encoded (`photos%2F2024%2Ff.jpg`).
64
- // The catch-all also matches a RAW nested path; the encoded form keeps working either way.
65
- const objectSegment = rawObjectPath ? '{objectName}{.+}' : '{objectName}';
66
- // A configured bucket is never in the URL, so a route whose only param was `bucketName` carries none.
67
- const bucketRequest = () => hasConfiguredBucket ? {} : { params: z.object({ bucketName: bucketNameParam() }) };
68
- const objectRequest = () => ({
69
- params: hasConfiguredBucket
70
- ? z.object({ objectName: objectNameParam() })
71
- : z.object({ bucketName: bucketNameParam(), objectName: objectNameParam() }),
72
- });
73
- return {
74
- GET_BUCKETS: {
75
- method: 'get',
76
- path: '/buckets',
77
- responses: jsonResponse({
78
- schema: z.array(z.object({
79
- name: z.string(),
80
- creationDate: z.iso.datetime(),
81
- })),
82
- }),
83
- },
84
- GET_BUCKET_BY_NAME: {
85
- method: 'get',
86
- path: bucketPrefix,
87
- request: {
88
- params: z.object({ bucketName: bucketNameParam() }),
60
+ export class AssetDefinitionBuilder {
61
+ static build(opts) {
62
+ const { hasConfiguredBucket = false, rawObjectPath = false } = opts;
63
+ const bucketPrefix = hasConfiguredBucket ? '' : '/buckets/{bucketName}';
64
+ // `{objectName}` is ONE segment: a folder path travels percent-encoded (`photos%2F2024%2Ff.jpg`).
65
+ // The catch-all also matches a RAW nested path; the encoded form keeps working either way.
66
+ const objectSegment = rawObjectPath ? '{objectName}{.+}' : '{objectName}';
67
+ // A configured bucket is never in the URL, so a route whose only param was `bucketName` carries none.
68
+ const bucketRequest = () => hasConfiguredBucket ? {} : { params: z.object({ bucketName: bucketNameParam() }) };
69
+ const objectRequest = () => ({
70
+ params: hasConfiguredBucket
71
+ ? z.object({ objectName: objectNameParam() })
72
+ : z.object({ bucketName: bucketNameParam(), objectName: objectNameParam() }),
73
+ });
74
+ return {
75
+ GET_BUCKETS: {
76
+ method: 'get',
77
+ path: '/buckets',
78
+ responses: OpenApiResponses.jsonResponse({
79
+ schema: z.array(z.object({
80
+ name: z.string(),
81
+ creationDate: z.iso.datetime(),
82
+ })),
83
+ }),
89
84
  },
90
- responses: jsonResponse({
91
- schema: z
92
- .object({
93
- name: z.string(),
94
- creationDate: z.iso.datetime(),
95
- })
96
- .nullable(),
97
- }),
98
- },
99
- CREATE_BUCKET: {
100
- method: 'post',
101
- path: bucketPrefix,
102
- request: {
103
- params: z.object({ bucketName: bucketNameParam() }),
85
+ GET_BUCKET_BY_NAME: {
86
+ method: 'get',
87
+ path: bucketPrefix,
88
+ request: {
89
+ params: z.object({ bucketName: bucketNameParam() }),
90
+ },
91
+ responses: OpenApiResponses.jsonResponse({
92
+ schema: z
93
+ .object({
94
+ name: z.string(),
95
+ creationDate: z.iso.datetime(),
96
+ })
97
+ .nullable(),
98
+ }),
104
99
  },
105
- responses: jsonResponse({
106
- schema: z
107
- .object({
108
- name: z.string(),
109
- creationDate: z.iso.datetime(),
110
- })
111
- .nullable(),
112
- }),
113
- },
114
- DELETE_BUCKET: {
115
- method: 'delete',
116
- path: bucketPrefix,
117
- request: {
118
- params: z.object({ bucketName: bucketNameParam() }),
100
+ CREATE_BUCKET: {
101
+ method: 'post',
102
+ path: bucketPrefix,
103
+ request: {
104
+ params: z.object({ bucketName: bucketNameParam() }),
105
+ },
106
+ responses: OpenApiResponses.jsonResponse({
107
+ schema: z
108
+ .object({
109
+ name: z.string(),
110
+ creationDate: z.iso.datetime(),
111
+ })
112
+ .nullable(),
113
+ }),
119
114
  },
120
- responses: jsonResponse({
121
- schema: z.object({
122
- isDeleted: z.boolean(),
115
+ DELETE_BUCKET: {
116
+ method: 'delete',
117
+ path: bucketPrefix,
118
+ request: {
119
+ params: z.object({ bucketName: bucketNameParam() }),
120
+ },
121
+ responses: OpenApiResponses.jsonResponse({
122
+ schema: z.object({
123
+ isDeleted: z.boolean(),
124
+ }),
123
125
  }),
124
- }),
125
- },
126
- GET_OBJECT_BY_NAME: {
127
- method: 'get',
128
- path: `${bucketPrefix}/objects/${objectSegment}`,
129
- request: objectRequest(),
130
- responses: fileStreamResponses(),
131
- },
132
- DOWNLOAD_OBJECT_BY_NAME: {
133
- method: 'get',
134
- path: `${bucketPrefix}/download/${objectSegment}`,
135
- request: objectRequest(),
136
- responses: fileStreamResponses(),
137
- },
138
- UPLOAD_POLICY: {
139
- method: 'post',
140
- path: `${bucketPrefix}/upload-policy`,
141
- request: {
142
- body: {
143
- content: {
144
- 'application/json': {
145
- schema: z.object({
146
- files: z.array(z.object({
147
- fileName: z.string().min(1),
148
- contentType: z.string().optional(),
149
- size: z.number().int().nonnegative().optional(),
150
- })),
151
- }),
126
+ },
127
+ GET_OBJECT_BY_NAME: {
128
+ method: 'get',
129
+ path: `${bucketPrefix}/objects/${objectSegment}`,
130
+ request: objectRequest(),
131
+ responses: fileStreamResponses(),
132
+ },
133
+ DOWNLOAD_OBJECT_BY_NAME: {
134
+ method: 'get',
135
+ path: `${bucketPrefix}/download/${objectSegment}`,
136
+ request: objectRequest(),
137
+ responses: fileStreamResponses(),
138
+ },
139
+ UPLOAD_POLICY: {
140
+ method: 'post',
141
+ path: `${bucketPrefix}/upload-policy`,
142
+ request: {
143
+ body: {
144
+ content: {
145
+ 'application/json': {
146
+ schema: z.object({
147
+ files: z.array(z.object({
148
+ fileName: z.string().min(1),
149
+ contentType: z.string().optional(),
150
+ size: z.number().int().nonnegative().optional(),
151
+ })),
152
+ }),
153
+ },
152
154
  },
153
155
  },
154
156
  },
157
+ responses: OpenApiResponses.jsonResponse({
158
+ schema: z.array(z.object({
159
+ postURL: z.string(),
160
+ formData: z.record(z.string(), z.string()),
161
+ objectName: z.string(),
162
+ commitToken: z.string(),
163
+ expiresAt: z.string(),
164
+ })),
165
+ description: 'One signed POST policy per file, plus the token its commit is claimed with',
166
+ }),
155
167
  },
156
- responses: jsonResponse({
157
- schema: z.array(z.object({
158
- postURL: z.string(),
159
- formData: z.record(z.string(), z.string()),
160
- objectName: z.string(),
161
- commitToken: z.string(),
162
- expiresAt: z.string(),
163
- })),
164
- description: 'One signed POST policy per file, plus the token its commit is claimed with',
165
- }),
166
- },
167
- UPLOAD_COMMIT: {
168
- method: 'post',
169
- path: `${bucketPrefix}/upload-commit`,
170
- request: {
171
- body: {
172
- content: {
173
- 'application/json': {
174
- // The labels sit beside the token, not inside it: the token is an HMAC over
175
- // { bucket, key, expiresAt } and deliberately carries no business fields.
176
- schema: z.object({ commitToken: z.string().min(1), ...uploadLabels() }),
168
+ UPLOAD_COMMIT: {
169
+ method: 'post',
170
+ path: `${bucketPrefix}/upload-commit`,
171
+ request: {
172
+ body: {
173
+ content: {
174
+ 'application/json': {
175
+ // The labels sit beside the token, not inside it: the token is an HMAC over
176
+ // { bucket, key, expiresAt } and deliberately carries no business fields.
177
+ schema: z.object({ commitToken: z.string().min(1), ...uploadLabels() }),
178
+ },
177
179
  },
178
180
  },
179
181
  },
180
- },
181
- responses: jsonResponse({
182
- schema: z.object({
183
- bucket: z.object({ name: z.string() }),
184
- object: z.object({ key: z.string() }),
185
- link: z.string(),
186
- metaLink: z
187
- .union([z.object({ data: z.any() }), z.object({ error: z.string() })])
188
- .optional(),
182
+ responses: OpenApiResponses.jsonResponse({
183
+ schema: z.object({
184
+ bucket: z.object({ name: z.string() }),
185
+ object: z.object({ key: z.string() }),
186
+ link: z.string(),
187
+ metaLink: z
188
+ .union([z.object({ data: z.any() }), z.object({ error: z.string() })])
189
+ .optional(),
190
+ }),
191
+ description: 'The object at its final key, copied out of the pending prefix',
189
192
  }),
190
- description: 'The object at its final key, copied out of the pending prefix',
191
- }),
192
- },
193
- UPLOAD: {
194
- method: 'post',
195
- path: `${bucketPrefix}/objects`,
196
- request: {
197
- ...bucketRequest(),
198
- body: {
199
- content: {
200
- 'multipart/form-data': {
201
- schema: MultipartBodySchema,
193
+ },
194
+ UPLOAD: {
195
+ method: 'post',
196
+ path: `${bucketPrefix}/objects`,
197
+ request: {
198
+ ...bucketRequest(),
199
+ body: {
200
+ content: {
201
+ 'multipart/form-data': {
202
+ schema: MultipartBodySchema,
203
+ },
202
204
  },
203
205
  },
204
206
  },
207
+ responses: OpenApiResponses.jsonResponse({
208
+ schema: z.array(z.object({
209
+ bucket: z.object({ name: z.string() }),
210
+ object: z.object({
211
+ key: z.string(),
212
+ size: z.number(),
213
+ contentType: z.string(),
214
+ }),
215
+ link: z.string(),
216
+ metaLink: z
217
+ .union([z.object({ data: z.any() }), z.object({ error: z.string() })])
218
+ .optional(),
219
+ })),
220
+ }),
205
221
  },
206
- responses: jsonResponse({
207
- schema: z.array(z.object({
208
- bucket: z.object({ name: z.string() }),
209
- object: z.object({
210
- key: z.string(),
211
- size: z.number(),
212
- contentType: z.string(),
222
+ DELETE_OBJECT: {
223
+ method: 'delete',
224
+ path: `${bucketPrefix}/objects/${objectSegment}`,
225
+ request: objectRequest(),
226
+ responses: OpenApiResponses.jsonResponse({
227
+ schema: z.object({
228
+ success: z.boolean(),
213
229
  }),
214
- link: z.string(),
215
- metaLink: z
216
- .union([z.object({ data: z.any() }), z.object({ error: z.string() })])
217
- .optional(),
218
- })),
219
- }),
220
- },
221
- DELETE_OBJECT: {
222
- method: 'delete',
223
- path: `${bucketPrefix}/objects/${objectSegment}`,
224
- request: objectRequest(),
225
- responses: jsonResponse({
226
- schema: z.object({
227
- success: z.boolean(),
228
230
  }),
229
- }),
230
- },
231
- LIST_OBJECTS: {
232
- method: 'get',
233
- path: `${bucketPrefix}/objects`,
234
- request: {
235
- ...bucketRequest(),
236
- query: z.object({
237
- prefix: z
238
- .string()
239
- .optional()
240
- .openapi({
241
- param: {
242
- name: 'prefix',
243
- in: 'query',
244
- description: 'Filter objects by prefix',
245
- },
246
- example: 'folder/',
247
- }),
248
- recursive: z
249
- .string()
250
- .optional()
251
- .openapi({
252
- param: {
253
- name: 'recursive',
254
- in: 'query',
255
- description: 'Recursive listing',
256
- },
257
- example: 'true',
258
- }),
259
- maxKeys: z
260
- .string()
261
- .optional()
262
- .openapi({
263
- param: {
264
- name: 'maxKeys',
265
- in: 'query',
266
- description: 'Maximum number of objects to return',
267
- },
268
- example: '100',
231
+ },
232
+ LIST_OBJECTS: {
233
+ method: 'get',
234
+ path: `${bucketPrefix}/objects`,
235
+ request: {
236
+ ...bucketRequest(),
237
+ query: z.object({
238
+ prefix: z
239
+ .string()
240
+ .optional()
241
+ .openapi({
242
+ param: {
243
+ name: 'prefix',
244
+ in: 'query',
245
+ description: 'Filter objects by prefix',
246
+ },
247
+ example: 'folder/',
248
+ }),
249
+ recursive: z
250
+ .string()
251
+ .optional()
252
+ .openapi({
253
+ param: {
254
+ name: 'recursive',
255
+ in: 'query',
256
+ description: 'Recursive listing',
257
+ },
258
+ example: 'true',
259
+ }),
260
+ maxKeys: z
261
+ .string()
262
+ .optional()
263
+ .openapi({
264
+ param: {
265
+ name: 'maxKeys',
266
+ in: 'query',
267
+ description: 'Maximum number of objects to return',
268
+ },
269
+ example: '100',
270
+ }),
269
271
  }),
272
+ },
273
+ responses: OpenApiResponses.jsonResponse({
274
+ schema: z.array(z.object({
275
+ name: z.string().optional(),
276
+ size: z.number().optional(),
277
+ lastModified: z.iso.datetime().optional(),
278
+ etag: z.string().optional(),
279
+ prefix: z.string().optional(),
280
+ })),
270
281
  }),
271
282
  },
272
- responses: jsonResponse({
273
- schema: z.array(z.object({
274
- name: z.string().optional(),
275
- size: z.number().optional(),
276
- lastModified: z.iso.datetime().optional(),
277
- etag: z.string().optional(),
278
- prefix: z.string().optional(),
279
- })),
280
- }),
281
- },
282
- RECREATE_METALINK: {
283
- method: 'put',
284
- path: `${bucketPrefix}/meta-links/${objectSegment}`,
285
- request: objectRequest(),
286
- responses: jsonResponse({
287
- schema: z.object({
288
- success: z.boolean(),
289
- action: z
290
- .enum([MetaLinkRecreateActions.REFRESHED, MetaLinkRecreateActions.CREATED])
291
- .openapi({
292
- description: '`refreshed` when rows for the object existed, `created` when none did',
293
- example: 'refreshed',
283
+ RECREATE_METALINK: {
284
+ method: 'put',
285
+ path: `${bucketPrefix}/meta-links/${objectSegment}`,
286
+ request: objectRequest(),
287
+ responses: OpenApiResponses.jsonResponse({
288
+ schema: z.object({
289
+ success: z.boolean(),
290
+ action: z
291
+ .enum([MetaLinkRecreateActions.REFRESHED, MetaLinkRecreateActions.CREATED])
292
+ .openapi({
293
+ description: '`refreshed` when rows for the object existed, `created` when none did',
294
+ example: 'refreshed',
295
+ }),
296
+ count: z.number().openapi({ description: 'Rows refreshed or created' }),
297
+ metaLink: z.any().optional().openapi({ description: 'The first of `metaLinks`' }),
298
+ metaLinks: z.array(z.any()),
294
299
  }),
295
- count: z.number().openapi({ description: 'Rows refreshed or created' }),
296
- metaLink: z.any().optional().openapi({ description: 'The first of `metaLinks`' }),
297
- metaLinks: z.array(z.any()),
298
300
  }),
299
- }),
300
- },
301
- };
302
- };
303
- /** The bucket-in-path shape, unchanged - every existing importer keeps working. */
304
- export const StaticAssetDefinitions = buildAssetDefinitions({});
301
+ },
302
+ };
303
+ }
304
+ }
305
305
  //# sourceMappingURL=base.definition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.definition.js","sourceRoot":"","sources":["../../../../../src/components/static-asset/controller/base.definition.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IAuthRouteConfig } from '@/base';\nimport { errorResponses, jsonResponse } from '@venizia/ignis-kernel';\nimport { z } from '@hono/zod-openapi';\nimport { HTTP } from '@venizia/ignis-helpers/common';\nimport { MetaLinkRecreateActions } from '../common/constants';\n\ntype TRouteRequest = NonNullable<IAuthRouteConfig['request']>;\n\n/** The labels both upload paths take. They ride the BODY, not the URL - an identifier in a query string lands in every access log between the client and here. */\nconst uploadLabels = () => ({\n principalType: z.string().optional(),\n principalId: z.string().or(z.number()).optional(),\n variant: z.string().optional(),\n sequence: z.coerce.number().int().optional(),\n});\n\nconst MultipartBodySchema = z.object({\n files: z.union([z.instanceof(File), z.array(z.instanceof(File))]).openapi({\n type: 'array',\n items: {\n type: 'string',\n format: 'binary',\n },\n }),\n ...uploadLabels(),\n folderPath: z.string().optional().openapi({\n description: 'Target folder path for uploaded files (e.g., \"photos/2024\")',\n example: 'photos/2024',\n }),\n});\n\nconst bucketNameParam = () =>\n z.string().openapi({\n param: {\n name: 'bucketName',\n in: 'path',\n },\n example: 'images',\n });\n\nconst objectNameParam = () =>\n z.string().openapi({\n param: {\n name: 'objectName',\n in: 'path',\n description: 'Object name or path (e.g., \"photo.jpg\" or \"photos/2024/photo.jpg\")',\n },\n example: 'photos/2024/photo.jpg',\n });\n\nconst fileStreamResponses = (): IAuthRouteConfig['responses'] => ({\n [HTTP.ResultCodes.RS_2.Ok]: {\n description: 'File stream response',\n content: {\n 'application/octet-stream': {\n schema: {\n type: 'string',\n format: 'binary',\n },\n },\n },\n },\n ...errorResponses(),\n});\n\n/** The ten built-in asset routes. Only `path` and `request.params` differ between option combinations. */\nexport interface IAssetDefinitions {\n GET_BUCKETS: IAuthRouteConfig;\n GET_BUCKET_BY_NAME: IAuthRouteConfig;\n CREATE_BUCKET: IAuthRouteConfig;\n DELETE_BUCKET: IAuthRouteConfig;\n GET_OBJECT_BY_NAME: IAuthRouteConfig;\n DOWNLOAD_OBJECT_BY_NAME: IAuthRouteConfig;\n UPLOAD_POLICY: IAuthRouteConfig;\n UPLOAD_COMMIT: IAuthRouteConfig;\n UPLOAD: IAuthRouteConfig;\n DELETE_OBJECT: IAuthRouteConfig;\n LIST_OBJECTS: IAuthRouteConfig;\n RECREATE_METALINK: IAuthRouteConfig;\n}\n\n/**\n * Builds the route configs of one asset controller.\n * `hasConfiguredBucket` drops `/buckets/{bucketName}` and its param from every object route.\n * `rawObjectPath` appends the `{.+}` catch-all, the spelling `@hono/zod-openapi` translates.\n */\nexport const buildAssetDefinitions = (opts: {\n hasConfiguredBucket?: boolean;\n rawObjectPath?: boolean;\n}): IAssetDefinitions => {\n const { hasConfiguredBucket = false, rawObjectPath = false } = opts;\n\n const bucketPrefix = hasConfiguredBucket ? '' : '/buckets/{bucketName}';\n\n // `{objectName}` is ONE segment: a folder path travels percent-encoded (`photos%2F2024%2Ff.jpg`).\n // The catch-all also matches a RAW nested path; the encoded form keeps working either way.\n const objectSegment = rawObjectPath ? '{objectName}{.+}' : '{objectName}';\n\n // A configured bucket is never in the URL, so a route whose only param was `bucketName` carries none.\n const bucketRequest = (): Pick<TRouteRequest, 'params'> =>\n hasConfiguredBucket ? {} : { params: z.object({ bucketName: bucketNameParam() }) };\n\n const objectRequest = (): TRouteRequest => ({\n params: hasConfiguredBucket\n ? z.object({ objectName: objectNameParam() })\n : z.object({ bucketName: bucketNameParam(), objectName: objectNameParam() }),\n });\n\n return {\n GET_BUCKETS: {\n method: 'get',\n path: '/buckets',\n responses: jsonResponse({\n schema: z.array(\n z.object({\n name: z.string(),\n creationDate: z.iso.datetime(),\n }),\n ),\n }),\n },\n GET_BUCKET_BY_NAME: {\n method: 'get',\n path: bucketPrefix,\n request: {\n params: z.object({ bucketName: bucketNameParam() }),\n },\n responses: jsonResponse({\n schema: z\n .object({\n name: z.string(),\n creationDate: z.iso.datetime(),\n })\n .nullable(),\n }),\n },\n CREATE_BUCKET: {\n method: 'post',\n path: bucketPrefix,\n request: {\n params: z.object({ bucketName: bucketNameParam() }),\n },\n responses: jsonResponse({\n schema: z\n .object({\n name: z.string(),\n creationDate: z.iso.datetime(),\n })\n .nullable(),\n }),\n },\n DELETE_BUCKET: {\n method: 'delete',\n path: bucketPrefix,\n request: {\n params: z.object({ bucketName: bucketNameParam() }),\n },\n responses: jsonResponse({\n schema: z.object({\n isDeleted: z.boolean(),\n }),\n }),\n },\n GET_OBJECT_BY_NAME: {\n method: 'get',\n path: `${bucketPrefix}/objects/${objectSegment}`,\n request: objectRequest(),\n responses: fileStreamResponses(),\n },\n DOWNLOAD_OBJECT_BY_NAME: {\n method: 'get',\n path: `${bucketPrefix}/download/${objectSegment}`,\n request: objectRequest(),\n responses: fileStreamResponses(),\n },\n UPLOAD_POLICY: {\n method: 'post',\n path: `${bucketPrefix}/upload-policy`,\n request: {\n body: {\n content: {\n 'application/json': {\n schema: z.object({\n files: z.array(\n z.object({\n fileName: z.string().min(1),\n contentType: z.string().optional(),\n size: z.number().int().nonnegative().optional(),\n }),\n ),\n }),\n },\n },\n },\n },\n responses: jsonResponse({\n schema: z.array(\n z.object({\n postURL: z.string(),\n formData: z.record(z.string(), z.string()),\n objectName: z.string(),\n commitToken: z.string(),\n expiresAt: z.string(),\n }),\n ),\n description: 'One signed POST policy per file, plus the token its commit is claimed with',\n }),\n },\n UPLOAD_COMMIT: {\n method: 'post',\n path: `${bucketPrefix}/upload-commit`,\n request: {\n body: {\n content: {\n 'application/json': {\n // The labels sit beside the token, not inside it: the token is an HMAC over\n // { bucket, key, expiresAt } and deliberately carries no business fields.\n schema: z.object({ commitToken: z.string().min(1), ...uploadLabels() }),\n },\n },\n },\n },\n responses: jsonResponse({\n schema: z.object({\n bucket: z.object({ name: z.string() }),\n object: z.object({ key: z.string() }),\n link: z.string(),\n metaLink: z\n .union([z.object({ data: z.any() }), z.object({ error: z.string() })])\n .optional(),\n }),\n description: 'The object at its final key, copied out of the pending prefix',\n }),\n },\n UPLOAD: {\n method: 'post',\n path: `${bucketPrefix}/objects`,\n request: {\n ...bucketRequest(),\n body: {\n content: {\n 'multipart/form-data': {\n schema: MultipartBodySchema,\n },\n },\n },\n },\n responses: jsonResponse({\n schema: z.array(\n z.object({\n bucket: z.object({ name: z.string() }),\n object: z.object({\n key: z.string(),\n size: z.number(),\n contentType: z.string(),\n }),\n link: z.string(),\n metaLink: z\n .union([z.object({ data: z.any() }), z.object({ error: z.string() })])\n .optional(),\n }),\n ),\n }),\n },\n DELETE_OBJECT: {\n method: 'delete',\n path: `${bucketPrefix}/objects/${objectSegment}`,\n request: objectRequest(),\n responses: jsonResponse({\n schema: z.object({\n success: z.boolean(),\n }),\n }),\n },\n LIST_OBJECTS: {\n method: 'get',\n path: `${bucketPrefix}/objects`,\n request: {\n ...bucketRequest(),\n query: z.object({\n prefix: z\n .string()\n .optional()\n .openapi({\n param: {\n name: 'prefix',\n in: 'query',\n description: 'Filter objects by prefix',\n },\n example: 'folder/',\n }),\n recursive: z\n .string()\n .optional()\n .openapi({\n param: {\n name: 'recursive',\n in: 'query',\n description: 'Recursive listing',\n },\n example: 'true',\n }),\n maxKeys: z\n .string()\n .optional()\n .openapi({\n param: {\n name: 'maxKeys',\n in: 'query',\n description: 'Maximum number of objects to return',\n },\n example: '100',\n }),\n }),\n },\n responses: jsonResponse({\n schema: z.array(\n z.object({\n name: z.string().optional(),\n size: z.number().optional(),\n lastModified: z.iso.datetime().optional(),\n etag: z.string().optional(),\n prefix: z.string().optional(),\n }),\n ),\n }),\n },\n RECREATE_METALINK: {\n method: 'put',\n path: `${bucketPrefix}/meta-links/${objectSegment}`,\n request: objectRequest(),\n responses: jsonResponse({\n schema: z.object({\n success: z.boolean(),\n action: z\n .enum([MetaLinkRecreateActions.REFRESHED, MetaLinkRecreateActions.CREATED])\n .openapi({\n description: '`refreshed` when rows for the object existed, `created` when none did',\n example: 'refreshed',\n }),\n count: z.number().openapi({ description: 'Rows refreshed or created' }),\n metaLink: z.any().optional().openapi({ description: 'The first of `metaLinks`' }),\n metaLinks: z.array(z.any()),\n }),\n }),\n },\n };\n};\n\n/** The bucket-in-path shape, unchanged - every existing importer keeps working. */\nexport const StaticAssetDefinitions = buildAssetDefinitions({});\n"]}
1
+ {"version":3,"file":"base.definition.js","sourceRoot":"","sources":["../../../../../src/components/static-asset/controller/base.definition.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IAuthRouteConfig } from '@/base';\nimport { OpenApiResponses } from '@venizia/ignis-kernel';\nimport { z } from '@hono/zod-openapi';\nimport { HTTP } from '@venizia/ignis-helpers/common';\nimport { MetaLinkRecreateActions } from '../common/constants';\n\ntype TRouteRequest = NonNullable<IAuthRouteConfig['request']>;\n\n/** The labels both upload paths take. They ride the BODY, not the URL - an identifier in a query string lands in every access log between the client and here. */\nconst uploadLabels = () => ({\n principalType: z.string().optional(),\n principalId: z.string().or(z.number()).optional(),\n variant: z.string().optional(),\n sequence: z.coerce.number().int().optional(),\n});\n\nconst MultipartBodySchema = z.object({\n files: z.union([z.instanceof(File), z.array(z.instanceof(File))]).openapi({\n type: 'array',\n items: {\n type: 'string',\n format: 'binary',\n },\n }),\n ...uploadLabels(),\n folderPath: z.string().optional().openapi({\n description: 'Target folder path for uploaded files (e.g., \"photos/2024\")',\n example: 'photos/2024',\n }),\n});\n\nconst bucketNameParam = () =>\n z.string().openapi({\n param: {\n name: 'bucketName',\n in: 'path',\n },\n example: 'images',\n });\n\nconst objectNameParam = () =>\n z.string().openapi({\n param: {\n name: 'objectName',\n in: 'path',\n description: 'Object name or path (e.g., \"photo.jpg\" or \"photos/2024/photo.jpg\")',\n },\n example: 'photos/2024/photo.jpg',\n });\n\nconst fileStreamResponses = (): IAuthRouteConfig['responses'] => ({\n [HTTP.ResultCodes.RS_2.Ok]: {\n description: 'File stream response',\n content: {\n 'application/octet-stream': {\n schema: {\n type: 'string',\n format: 'binary',\n },\n },\n },\n },\n ...OpenApiResponses.errorResponses(),\n});\n\n/** The ten built-in asset routes. Only `path` and `request.params` differ between option combinations. */\nexport interface IAssetDefinitions {\n GET_BUCKETS: IAuthRouteConfig;\n GET_BUCKET_BY_NAME: IAuthRouteConfig;\n CREATE_BUCKET: IAuthRouteConfig;\n DELETE_BUCKET: IAuthRouteConfig;\n GET_OBJECT_BY_NAME: IAuthRouteConfig;\n DOWNLOAD_OBJECT_BY_NAME: IAuthRouteConfig;\n UPLOAD_POLICY: IAuthRouteConfig;\n UPLOAD_COMMIT: IAuthRouteConfig;\n UPLOAD: IAuthRouteConfig;\n DELETE_OBJECT: IAuthRouteConfig;\n LIST_OBJECTS: IAuthRouteConfig;\n RECREATE_METALINK: IAuthRouteConfig;\n}\n\n/**\n * Builds the route configs of one asset controller.\n * `hasConfiguredBucket` drops `/buckets/{bucketName}` and its param from every object route.\n * `rawObjectPath` appends the `{.+}` catch-all, the spelling `@hono/zod-openapi` translates.\n */\nexport class AssetDefinitionBuilder {\n static build(opts: {\n hasConfiguredBucket?: boolean;\n rawObjectPath?: boolean;\n }): IAssetDefinitions {\n const { hasConfiguredBucket = false, rawObjectPath = false } = opts;\n\n const bucketPrefix = hasConfiguredBucket ? '' : '/buckets/{bucketName}';\n\n // `{objectName}` is ONE segment: a folder path travels percent-encoded (`photos%2F2024%2Ff.jpg`).\n // The catch-all also matches a RAW nested path; the encoded form keeps working either way.\n const objectSegment = rawObjectPath ? '{objectName}{.+}' : '{objectName}';\n\n // A configured bucket is never in the URL, so a route whose only param was `bucketName` carries none.\n const bucketRequest = (): Pick<TRouteRequest, 'params'> =>\n hasConfiguredBucket ? {} : { params: z.object({ bucketName: bucketNameParam() }) };\n\n const objectRequest = (): TRouteRequest => ({\n params: hasConfiguredBucket\n ? z.object({ objectName: objectNameParam() })\n : z.object({ bucketName: bucketNameParam(), objectName: objectNameParam() }),\n });\n\n return {\n GET_BUCKETS: {\n method: 'get',\n path: '/buckets',\n responses: OpenApiResponses.jsonResponse({\n schema: z.array(\n z.object({\n name: z.string(),\n creationDate: z.iso.datetime(),\n }),\n ),\n }),\n },\n GET_BUCKET_BY_NAME: {\n method: 'get',\n path: bucketPrefix,\n request: {\n params: z.object({ bucketName: bucketNameParam() }),\n },\n responses: OpenApiResponses.jsonResponse({\n schema: z\n .object({\n name: z.string(),\n creationDate: z.iso.datetime(),\n })\n .nullable(),\n }),\n },\n CREATE_BUCKET: {\n method: 'post',\n path: bucketPrefix,\n request: {\n params: z.object({ bucketName: bucketNameParam() }),\n },\n responses: OpenApiResponses.jsonResponse({\n schema: z\n .object({\n name: z.string(),\n creationDate: z.iso.datetime(),\n })\n .nullable(),\n }),\n },\n DELETE_BUCKET: {\n method: 'delete',\n path: bucketPrefix,\n request: {\n params: z.object({ bucketName: bucketNameParam() }),\n },\n responses: OpenApiResponses.jsonResponse({\n schema: z.object({\n isDeleted: z.boolean(),\n }),\n }),\n },\n GET_OBJECT_BY_NAME: {\n method: 'get',\n path: `${bucketPrefix}/objects/${objectSegment}`,\n request: objectRequest(),\n responses: fileStreamResponses(),\n },\n DOWNLOAD_OBJECT_BY_NAME: {\n method: 'get',\n path: `${bucketPrefix}/download/${objectSegment}`,\n request: objectRequest(),\n responses: fileStreamResponses(),\n },\n UPLOAD_POLICY: {\n method: 'post',\n path: `${bucketPrefix}/upload-policy`,\n request: {\n body: {\n content: {\n 'application/json': {\n schema: z.object({\n files: z.array(\n z.object({\n fileName: z.string().min(1),\n contentType: z.string().optional(),\n size: z.number().int().nonnegative().optional(),\n }),\n ),\n }),\n },\n },\n },\n },\n responses: OpenApiResponses.jsonResponse({\n schema: z.array(\n z.object({\n postURL: z.string(),\n formData: z.record(z.string(), z.string()),\n objectName: z.string(),\n commitToken: z.string(),\n expiresAt: z.string(),\n }),\n ),\n description: 'One signed POST policy per file, plus the token its commit is claimed with',\n }),\n },\n UPLOAD_COMMIT: {\n method: 'post',\n path: `${bucketPrefix}/upload-commit`,\n request: {\n body: {\n content: {\n 'application/json': {\n // The labels sit beside the token, not inside it: the token is an HMAC over\n // { bucket, key, expiresAt } and deliberately carries no business fields.\n schema: z.object({ commitToken: z.string().min(1), ...uploadLabels() }),\n },\n },\n },\n },\n responses: OpenApiResponses.jsonResponse({\n schema: z.object({\n bucket: z.object({ name: z.string() }),\n object: z.object({ key: z.string() }),\n link: z.string(),\n metaLink: z\n .union([z.object({ data: z.any() }), z.object({ error: z.string() })])\n .optional(),\n }),\n description: 'The object at its final key, copied out of the pending prefix',\n }),\n },\n UPLOAD: {\n method: 'post',\n path: `${bucketPrefix}/objects`,\n request: {\n ...bucketRequest(),\n body: {\n content: {\n 'multipart/form-data': {\n schema: MultipartBodySchema,\n },\n },\n },\n },\n responses: OpenApiResponses.jsonResponse({\n schema: z.array(\n z.object({\n bucket: z.object({ name: z.string() }),\n object: z.object({\n key: z.string(),\n size: z.number(),\n contentType: z.string(),\n }),\n link: z.string(),\n metaLink: z\n .union([z.object({ data: z.any() }), z.object({ error: z.string() })])\n .optional(),\n }),\n ),\n }),\n },\n DELETE_OBJECT: {\n method: 'delete',\n path: `${bucketPrefix}/objects/${objectSegment}`,\n request: objectRequest(),\n responses: OpenApiResponses.jsonResponse({\n schema: z.object({\n success: z.boolean(),\n }),\n }),\n },\n LIST_OBJECTS: {\n method: 'get',\n path: `${bucketPrefix}/objects`,\n request: {\n ...bucketRequest(),\n query: z.object({\n prefix: z\n .string()\n .optional()\n .openapi({\n param: {\n name: 'prefix',\n in: 'query',\n description: 'Filter objects by prefix',\n },\n example: 'folder/',\n }),\n recursive: z\n .string()\n .optional()\n .openapi({\n param: {\n name: 'recursive',\n in: 'query',\n description: 'Recursive listing',\n },\n example: 'true',\n }),\n maxKeys: z\n .string()\n .optional()\n .openapi({\n param: {\n name: 'maxKeys',\n in: 'query',\n description: 'Maximum number of objects to return',\n },\n example: '100',\n }),\n }),\n },\n responses: OpenApiResponses.jsonResponse({\n schema: z.array(\n z.object({\n name: z.string().optional(),\n size: z.number().optional(),\n lastModified: z.iso.datetime().optional(),\n etag: z.string().optional(),\n prefix: z.string().optional(),\n }),\n ),\n }),\n },\n RECREATE_METALINK: {\n method: 'put',\n path: `${bucketPrefix}/meta-links/${objectSegment}`,\n request: objectRequest(),\n responses: OpenApiResponses.jsonResponse({\n schema: z.object({\n success: z.boolean(),\n action: z\n .enum([MetaLinkRecreateActions.REFRESHED, MetaLinkRecreateActions.CREATED])\n .openapi({\n description:\n '`refreshed` when rows for the object existed, `created` when none did',\n example: 'refreshed',\n }),\n count: z.number().openapi({ description: 'Rows refreshed or created' }),\n metaLink: z.any().optional().openapi({ description: 'The first of `metaLinks`' }),\n metaLinks: z.array(z.any()),\n }),\n }),\n },\n };\n }\n}\n"]}