@aphexcms/cms-core 8.0.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/dist/api/api-keys.d.ts +8 -3
  2. package/dist/api/api-keys.d.ts.map +1 -1
  3. package/dist/api/schemas/assets.js +1 -1
  4. package/dist/api/schemas/documents.d.ts +0 -2
  5. package/dist/api/schemas/documents.d.ts.map +1 -1
  6. package/dist/api/schemas/documents.js +2 -8
  7. package/dist/api/schemas/instance.d.ts +6 -0
  8. package/dist/api/schemas/instance.d.ts.map +1 -0
  9. package/dist/api/schemas/instance.js +7 -0
  10. package/dist/api/schemas/user.js +1 -1
  11. package/dist/auth/auth-hooks.d.ts.map +1 -1
  12. package/dist/auth/auth-hooks.js +9 -3
  13. package/dist/cli/generate-types.d.ts.map +1 -1
  14. package/dist/cli/generate-types.js +1 -3
  15. package/dist/cli/generate-types.js.map +1 -1
  16. package/dist/components/AdminApp.svelte +43 -19
  17. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  18. package/dist/components/admin/DocumentEditor.svelte +47 -49
  19. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  20. package/dist/components/admin/MediaBrowser.svelte +7 -7
  21. package/dist/components/admin/fields/ArrayField.svelte +4 -2
  22. package/dist/components/admin/fields/FileField.svelte +1 -1
  23. package/dist/components/admin/fields/ImageField.svelte +1 -1
  24. package/dist/components/admin/fields/ReferenceField.svelte +5 -3
  25. package/dist/components/layout/OrganizationSwitcher.svelte +1 -1
  26. package/dist/components/layout/sidebar/NavMain.svelte +9 -1
  27. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -1
  28. package/dist/db/interfaces/asset.d.ts +2 -4
  29. package/dist/db/interfaces/asset.d.ts.map +1 -1
  30. package/dist/db/interfaces/organization.d.ts +1 -1
  31. package/dist/db/interfaces/organization.d.ts.map +1 -1
  32. package/dist/field-access.d.ts.map +1 -1
  33. package/dist/field-access.js +5 -1
  34. package/dist/graphql/depth-limit.d.ts +8 -0
  35. package/dist/graphql/depth-limit.d.ts.map +1 -0
  36. package/dist/graphql/depth-limit.js +79 -0
  37. package/dist/graphql/index.d.ts.map +1 -1
  38. package/dist/graphql/index.js +12 -1
  39. package/dist/graphql/resolvers.d.ts.map +1 -1
  40. package/dist/graphql/resolvers.js +9 -11
  41. package/dist/hooks.d.ts +2 -0
  42. package/dist/hooks.d.ts.map +1 -1
  43. package/dist/hooks.js +5 -2
  44. package/dist/lib/api/api-keys.d.ts +8 -3
  45. package/dist/lib/api/api-keys.d.ts.map +1 -1
  46. package/dist/lib/api/api-keys.js.map +1 -1
  47. package/dist/lib/api/schemas/assets.js +1 -1
  48. package/dist/lib/api/schemas/assets.js.map +1 -1
  49. package/dist/lib/api/schemas/documents.d.ts +0 -2
  50. package/dist/lib/api/schemas/documents.d.ts.map +1 -1
  51. package/dist/lib/api/schemas/documents.js +2 -8
  52. package/dist/lib/api/schemas/documents.js.map +1 -1
  53. package/dist/lib/api/schemas/instance.d.ts +6 -0
  54. package/dist/lib/api/schemas/instance.d.ts.map +1 -0
  55. package/dist/lib/api/schemas/instance.js +8 -0
  56. package/dist/lib/api/schemas/instance.js.map +1 -0
  57. package/dist/lib/api/schemas/user.js +1 -1
  58. package/dist/lib/auth/auth-hooks.d.ts.map +1 -1
  59. package/dist/lib/auth/auth-hooks.js +9 -3
  60. package/dist/lib/auth/auth-hooks.js.map +1 -1
  61. package/dist/lib/db/interfaces/asset.d.ts +2 -4
  62. package/dist/lib/db/interfaces/asset.d.ts.map +1 -1
  63. package/dist/lib/db/interfaces/organization.d.ts +1 -1
  64. package/dist/lib/db/interfaces/organization.d.ts.map +1 -1
  65. package/dist/lib/field-access.d.ts.map +1 -1
  66. package/dist/lib/field-access.js +5 -1
  67. package/dist/lib/field-access.js.map +1 -1
  68. package/dist/lib/graphql/depth-limit.d.ts +8 -0
  69. package/dist/lib/graphql/depth-limit.d.ts.map +1 -0
  70. package/dist/lib/graphql/depth-limit.js +80 -0
  71. package/dist/lib/graphql/depth-limit.js.map +1 -0
  72. package/dist/lib/graphql/index.d.ts.map +1 -1
  73. package/dist/lib/graphql/index.js +12 -1
  74. package/dist/lib/graphql/index.js.map +1 -1
  75. package/dist/lib/graphql/resolvers.d.ts.map +1 -1
  76. package/dist/lib/graphql/resolvers.js +9 -11
  77. package/dist/lib/graphql/resolvers.js.map +1 -1
  78. package/dist/lib/hooks.d.ts +2 -0
  79. package/dist/lib/hooks.d.ts.map +1 -1
  80. package/dist/lib/hooks.js +5 -2
  81. package/dist/lib/hooks.js.map +1 -1
  82. package/dist/lib/local-api/collection-api.d.ts.map +1 -1
  83. package/dist/lib/local-api/collection-api.js +7 -9
  84. package/dist/lib/local-api/collection-api.js.map +1 -1
  85. package/dist/lib/local-api/index.d.ts +5 -1
  86. package/dist/lib/local-api/index.d.ts.map +1 -1
  87. package/dist/lib/local-api/index.js +12 -4
  88. package/dist/lib/local-api/index.js.map +1 -1
  89. package/dist/lib/routes/assets-cdn.d.ts.map +1 -1
  90. package/dist/lib/routes/assets-cdn.js +8 -3
  91. package/dist/lib/routes/assets-cdn.js.map +1 -1
  92. package/dist/lib/server/api/index.d.ts.map +1 -1
  93. package/dist/lib/server/api/index.js +18 -0
  94. package/dist/lib/server/api/index.js.map +1 -1
  95. package/dist/lib/server/api/routes/assets-bulk.d.ts.map +1 -1
  96. package/dist/lib/server/api/routes/assets-bulk.js +4 -0
  97. package/dist/lib/server/api/routes/assets-bulk.js.map +1 -1
  98. package/dist/lib/server/api/routes/assets-by-id.d.ts.map +1 -1
  99. package/dist/lib/server/api/routes/assets-by-id.js +7 -0
  100. package/dist/lib/server/api/routes/assets-by-id.js.map +1 -1
  101. package/dist/lib/server/api/routes/assets.d.ts.map +1 -1
  102. package/dist/lib/server/api/routes/assets.js +18 -9
  103. package/dist/lib/server/api/routes/assets.js.map +1 -1
  104. package/dist/lib/server/api/routes/document-versions.d.ts.map +1 -1
  105. package/dist/lib/server/api/routes/document-versions.js +8 -0
  106. package/dist/lib/server/api/routes/document-versions.js.map +1 -1
  107. package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -1
  108. package/dist/lib/server/api/routes/documents-by-id.js +3 -3
  109. package/dist/lib/server/api/routes/documents-by-id.js.map +1 -1
  110. package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -1
  111. package/dist/lib/server/api/routes/documents-publish.js +2 -2
  112. package/dist/lib/server/api/routes/documents-publish.js.map +1 -1
  113. package/dist/lib/server/api/routes/documents-query.d.ts.map +1 -1
  114. package/dist/lib/server/api/routes/documents-query.js +2 -3
  115. package/dist/lib/server/api/routes/documents-query.js.map +1 -1
  116. package/dist/lib/server/api/routes/documents.d.ts.map +1 -1
  117. package/dist/lib/server/api/routes/documents.js +3 -5
  118. package/dist/lib/server/api/routes/documents.js.map +1 -1
  119. package/dist/lib/server/api/routes/organizations-invitations.d.ts.map +1 -1
  120. package/dist/lib/server/api/routes/organizations-invitations.js +1 -1
  121. package/dist/lib/server/api/routes/organizations-invitations.js.map +1 -1
  122. package/dist/lib/server/api/routes/organizations-members.d.ts.map +1 -1
  123. package/dist/lib/server/api/routes/organizations-members.js.map +1 -1
  124. package/dist/lib/server/index.d.ts +1 -0
  125. package/dist/lib/server/index.d.ts.map +1 -1
  126. package/dist/lib/server/index.js +2 -0
  127. package/dist/lib/server/index.js.map +1 -1
  128. package/dist/lib/services/asset-service.d.ts.map +1 -1
  129. package/dist/lib/services/asset-service.js +4 -2
  130. package/dist/lib/services/asset-service.js.map +1 -1
  131. package/dist/lib/services/references-service.d.ts.map +1 -1
  132. package/dist/lib/services/references-service.js.map +1 -1
  133. package/dist/lib/storage/adapters/local-storage-adapter.d.ts +4 -0
  134. package/dist/lib/storage/adapters/local-storage-adapter.d.ts.map +1 -1
  135. package/dist/lib/storage/adapters/local-storage-adapter.js +28 -6
  136. package/dist/lib/storage/adapters/local-storage-adapter.js.map +1 -1
  137. package/dist/lib/types/capabilities.d.ts +1 -0
  138. package/dist/lib/types/capabilities.d.ts.map +1 -1
  139. package/dist/lib/types/capabilities.js +3 -0
  140. package/dist/lib/types/capabilities.js.map +1 -1
  141. package/dist/lib/types/config.d.ts +16 -1
  142. package/dist/lib/types/config.d.ts.map +1 -1
  143. package/dist/lib/utils/logger.d.ts +8 -6
  144. package/dist/lib/utils/logger.d.ts.map +1 -1
  145. package/dist/lib/utils/logger.js +11 -2
  146. package/dist/lib/utils/logger.js.map +1 -1
  147. package/dist/lib/utils/mime-detect.d.ts.map +1 -1
  148. package/dist/lib/utils/mime-detect.js +21 -6
  149. package/dist/lib/utils/mime-detect.js.map +1 -1
  150. package/dist/lib/utils/reference-walk.js +4 -0
  151. package/dist/lib/utils/reference-walk.js.map +1 -1
  152. package/dist/lib/vite/index.d.ts.map +1 -1
  153. package/dist/lib/vite/index.js +4 -5
  154. package/dist/lib/vite/index.js.map +1 -1
  155. package/dist/local-api/collection-api.d.ts.map +1 -1
  156. package/dist/local-api/collection-api.js +7 -9
  157. package/dist/local-api/index.d.ts +5 -1
  158. package/dist/local-api/index.d.ts.map +1 -1
  159. package/dist/local-api/index.js +12 -4
  160. package/dist/routes/assets-cdn.d.ts.map +1 -1
  161. package/dist/routes/assets-cdn.js +8 -3
  162. package/dist/server/api/index.d.ts.map +1 -1
  163. package/dist/server/api/index.js +18 -0
  164. package/dist/server/api/routes/assets-bulk.d.ts.map +1 -1
  165. package/dist/server/api/routes/assets-bulk.js +4 -0
  166. package/dist/server/api/routes/assets-by-id.d.ts.map +1 -1
  167. package/dist/server/api/routes/assets-by-id.js +7 -0
  168. package/dist/server/api/routes/assets.d.ts.map +1 -1
  169. package/dist/server/api/routes/assets.js +18 -9
  170. package/dist/server/api/routes/document-versions.d.ts.map +1 -1
  171. package/dist/server/api/routes/document-versions.js +8 -0
  172. package/dist/server/api/routes/documents-by-id.d.ts.map +1 -1
  173. package/dist/server/api/routes/documents-by-id.js +3 -3
  174. package/dist/server/api/routes/documents-publish.d.ts.map +1 -1
  175. package/dist/server/api/routes/documents-publish.js +2 -2
  176. package/dist/server/api/routes/documents-query.d.ts.map +1 -1
  177. package/dist/server/api/routes/documents-query.js +2 -3
  178. package/dist/server/api/routes/documents.d.ts.map +1 -1
  179. package/dist/server/api/routes/documents.js +3 -5
  180. package/dist/server/api/routes/organizations-invitations.d.ts.map +1 -1
  181. package/dist/server/api/routes/organizations-invitations.js +1 -1
  182. package/dist/server/api/routes/organizations-members.d.ts.map +1 -1
  183. package/dist/server/index.d.ts +1 -0
  184. package/dist/server/index.d.ts.map +1 -1
  185. package/dist/server/index.js +2 -0
  186. package/dist/services/asset-service.d.ts.map +1 -1
  187. package/dist/services/asset-service.js +4 -2
  188. package/dist/services/references-service.d.ts.map +1 -1
  189. package/dist/storage/adapters/local-storage-adapter.d.ts +4 -0
  190. package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -1
  191. package/dist/storage/adapters/local-storage-adapter.js +28 -6
  192. package/dist/types/capabilities.d.ts +1 -0
  193. package/dist/types/capabilities.d.ts.map +1 -1
  194. package/dist/types/capabilities.js +3 -0
  195. package/dist/types/config.d.ts +16 -1
  196. package/dist/types/config.d.ts.map +1 -1
  197. package/dist/utils/logger.d.ts +8 -6
  198. package/dist/utils/logger.d.ts.map +1 -1
  199. package/dist/utils/logger.js +11 -2
  200. package/dist/utils/mime-detect.d.ts.map +1 -1
  201. package/dist/utils/mime-detect.js +21 -6
  202. package/dist/utils/reference-walk.js +4 -0
  203. package/dist/vite/index.d.ts.map +1 -1
  204. package/dist/vite/index.js +4 -5
  205. package/package.json +4 -5
@@ -1,6 +1,6 @@
1
1
  // Pure local file system storage adapter - no database operations
2
2
  import { writeFile, mkdir, unlink, stat, readdir } from 'fs/promises';
3
- import { join, dirname } from 'path';
3
+ import { join, dirname, resolve, basename } from 'path';
4
4
  import { cmsLogger } from '../../utils/logger.js';
5
5
  const DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
6
6
  /**
@@ -17,12 +17,19 @@ export class LocalStorageAdapter {
17
17
  options: config.options || {}
18
18
  };
19
19
  }
20
+ /**
21
+ * Strip path traversal sequences, keeping only the base filename.
22
+ */
23
+ sanitizeFilename(filename) {
24
+ return basename(filename).replace(/^\.+/, '_');
25
+ }
20
26
  /**
21
27
  * Generate unique filename preserving original name
22
28
  */
23
29
  async generateUniqueFilename(originalFilename) {
24
- const { name, ext } = this.parseFilename(originalFilename);
25
- let filename = originalFilename;
30
+ const safe = this.sanitizeFilename(originalFilename);
31
+ const { name, ext } = this.parseFilename(safe);
32
+ let filename = safe;
26
33
  let counter = 1;
27
34
  // Check if file exists on disk
28
35
  while (await this.fileExistsOnDisk(filename)) {
@@ -92,15 +99,25 @@ export class LocalStorageAdapter {
92
99
  * Used by API endpoint to serve files
93
100
  */
94
101
  async getObject(path) {
102
+ const resolved = resolve(path);
103
+ const base = resolve(this.config.basePath);
104
+ if (!resolved.startsWith(base + '/') && resolved !== base) {
105
+ throw new Error('Access denied: path outside storage directory');
106
+ }
95
107
  const { readFile } = await import('fs/promises');
96
- return await readFile(path);
108
+ return await readFile(resolved);
97
109
  }
98
110
  /**
99
111
  * Delete a file from storage
100
112
  */
101
113
  async delete(path) {
102
114
  try {
103
- await unlink(path);
115
+ const resolved = resolve(path);
116
+ const base = resolve(this.config.basePath);
117
+ if (!resolved.startsWith(base + '/') && resolved !== base) {
118
+ throw new Error('Access denied: path outside storage directory');
119
+ }
120
+ await unlink(resolved);
104
121
  return true;
105
122
  }
106
123
  catch (error) {
@@ -113,7 +130,12 @@ export class LocalStorageAdapter {
113
130
  */
114
131
  async exists(path) {
115
132
  try {
116
- await stat(path);
133
+ const resolved = resolve(path);
134
+ const base = resolve(this.config.basePath);
135
+ if (!resolved.startsWith(base + '/') && resolved !== base) {
136
+ return false;
137
+ }
138
+ await stat(resolved);
117
139
  return true;
118
140
  }
119
141
  catch {
@@ -61,6 +61,7 @@ export interface NewRole {
61
61
  * Used by migration, org-creation, and the runtime seeder.
62
62
  */
63
63
  export declare function buildBuiltinRoleRows(organizationId: string): NewRole[];
64
+ export declare function isInstanceRole(auth: Auth): boolean;
64
65
  /**
65
66
  * Check whether an Auth already has a capability.
66
67
  *
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/lib/types/capabilities.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAEnB,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,oBAAoB,GAEpB,YAAY,GACZ,cAAc,GACd,cAAc,GAEd,eAAe,GACf,eAAe,GACf,mBAAmB,GACnB,eAAe,GACf,aAAa,GACb,cAAc,CAAC;AAMlB;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,UAAU,EAgBxC,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,gBAAgB,EAKzD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACrC,gBAAgB,EAChB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,CA4C5D,CAAC;AAeF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,CAK/E;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,EAAE,CAQtE;AAWD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAEzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,CAoCvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAInE;AAID;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC3B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,0EAA0E;IAC1E,YAAY,EAAE,UAAU,EAAE,CAAC;CAC3B"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/lib/types/capabilities.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAEnB,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,oBAAoB,GAEpB,YAAY,GACZ,cAAc,GACd,cAAc,GAEd,eAAe,GACf,eAAe,GACf,mBAAmB,GACnB,eAAe,GACf,aAAa,GACb,cAAc,CAAC;AAMlB;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,UAAU,EAgBxC,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,gBAAgB,EAKzD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CACrC,gBAAgB,EAChB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,CA4C5D,CAAC;AAeF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,CAK/E;AAED;;GAEG;AACH,MAAM,WAAW,IAAI;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,EAAE,CAQtE;AAWD,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAEzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,CAoCvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAInE;AAID;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC3B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,0EAA0E;IAC1E,YAAY,EAAE,UAAU,EAAE,CAAC;CAC3B"}
@@ -143,6 +143,9 @@ export function buildBuiltinRoleRows(organizationId) {
143
143
  * even if an admin accidentally locks their own role down.
144
144
  */
145
145
  const INSTANCE_ROLE_OVERRIDES = new Set(['super_admin', 'admin']);
146
+ export function isInstanceRole(auth) {
147
+ return auth.type === 'session' && INSTANCE_ROLE_OVERRIDES.has(auth.user.role);
148
+ }
146
149
  /**
147
150
  * Check whether an Auth already has a capability.
148
151
  *
@@ -7,6 +7,7 @@ import type { EmailAdapter } from '../email/index.js';
7
7
  import type { GraphQLConfig } from '../graphql/index.js';
8
8
  import type { AphexEnv } from '../server/api/index.js';
9
9
  import type { SchemaType } from './schemas.js';
10
+ import type { Logger } from '../utils/logger.js';
10
11
  export type { GraphQLConfig };
11
12
  export interface CMSConfig {
12
13
  schemaTypes: SchemaType[];
@@ -32,9 +33,23 @@ export interface CMSConfig {
32
33
  */
33
34
  graphql?: boolean | GraphQLConfig;
34
35
  /**
35
- * Log level for CMS output. Defaults to 'debug' in dev, 'warn' in production.
36
+ * Log level for the built-in console logger. Defaults to 'debug' in dev, 'warn' in production.
37
+ * Ignored when a custom `logger` is provided.
36
38
  */
37
39
  logLevel?: 'debug' | 'info' | 'warn' | 'error' | 'none';
40
+ /**
41
+ * Custom logger instance (e.g. pino). Must implement debug/info/warn/error.
42
+ * When provided, replaces the built-in console logger entirely.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * import pino from 'pino';
47
+ * export default createCMSConfig({
48
+ * logger: pino({ level: 'info' }),
49
+ * });
50
+ * ```
51
+ */
52
+ logger?: Logger;
38
53
  auth?: {
39
54
  provider: AuthProvider;
40
55
  loginUrl?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/types/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,WAAW,SAAS;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE;QACf,QAAQ,CAAC,EAAE;YACV,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,KAAK,CAAC,EAAE;YACP,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SAC/B,CAAC;KACF,CAAC;IACF;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACxD,IAAI,CAAC,EAAE;QACN,QAAQ,EAAE,YAAY,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;;;OAIG;IACH,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE;QACZ,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,EAAE;QACV;;;;WAIG;QACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;CACpC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/types/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,WAAW,SAAS;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE;QACf,QAAQ,CAAC,EAAE;YACV,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,KAAK,CAAC,EAAE;YACP,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SAC/B,CAAC;KACF,CAAC;IACF;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACxD;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE;QACN,QAAQ,EAAE,YAAY,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;;;OAIG;IACH,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE;QACZ,WAAW,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,EAAE;QACV;;;;WAIG;QACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;CACpC"}
@@ -1,9 +1,11 @@
1
1
  export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';
2
+ export interface Logger {
3
+ debug(...args: any[]): void;
4
+ info(...args: any[]): void;
5
+ warn(...args: any[]): void;
6
+ error(...args: any[]): void;
7
+ }
2
8
  export declare function setLogLevel(level: LogLevel): void;
3
- export declare const cmsLogger: {
4
- debug: (...args: any[]) => void;
5
- info: (...args: any[]) => void;
6
- warn: (...args: any[]) => void;
7
- error: (...args: any[]) => void;
8
- };
9
+ export declare function setLogger(logger: Logger): void;
10
+ export declare const cmsLogger: Logger;
9
11
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAQpE,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,QAE1C;AAoBD,eAAO,MAAM,SAAS;qBAjBJ,GAAG,EAAE;oBAAL,GAAG,EAAE;oBAAL,GAAG,EAAE;qBAAL,GAAG,EAAE;CAsBtB,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpE,MAAM,WAAW,MAAM;IACtB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;CAC5B;AAOD,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,QAE1C;AA6BD,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,QAEvC;AAED,eAAO,MAAM,SAAS,EAAE,MAKvB,CAAC"}
@@ -1,5 +1,4 @@
1
1
  const LEVELS = { debug: 0, info: 1, warn: 2, error: 3, none: 4 };
2
- // Default based on environment; overridden by CMSConfig.logLevel via setLogLevel()
3
2
  let currentLevel = typeof process !== 'undefined' && process.env?.NODE_ENV === 'production' ? 'warn' : 'debug';
4
3
  export function setLogLevel(level) {
5
4
  currentLevel = level;
@@ -21,9 +20,19 @@ function createMethod(level, consoleFn) {
21
20
  }
22
21
  };
23
22
  }
24
- export const cmsLogger = {
23
+ const defaultLogger = {
25
24
  debug: createMethod('debug', console.log),
26
25
  info: createMethod('info', console.log),
27
26
  warn: createMethod('warn', console.warn),
28
27
  error: createMethod('error', console.error)
29
28
  };
29
+ let activeLogger = defaultLogger;
30
+ export function setLogger(logger) {
31
+ activeLogger = logger;
32
+ }
33
+ export const cmsLogger = {
34
+ debug: (...args) => activeLogger.debug(...args),
35
+ info: (...args) => activeLogger.info(...args),
36
+ warn: (...args) => activeLogger.warn(...args),
37
+ error: (...args) => activeLogger.error(...args)
38
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"mime-detect.d.ts","sourceRoot":"","sources":["../../src/lib/utils/mime-detect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAuG5D;AAgED,MAAM,WAAW,qBAAqB;IACrC,oHAAoH;IACpH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,qBAA0B,GACjC,oBAAoB,CA8EtB"}
1
+ {"version":3,"file":"mime-detect.d.ts","sourceRoot":"","sources":["../../src/lib/utils/mime-detect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAuG5D;AA2ED,MAAM,WAAW,qBAAqB;IACrC,oHAAoH;IACpH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC3B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,qBAA0B,GACjC,oBAAoB,CAkFtB"}
@@ -110,7 +110,11 @@ const BLOCKED_MIME_TYPES = new Set([
110
110
  'application/x-shellscript',
111
111
  'application/wasm',
112
112
  'application/x-msdos-program',
113
- 'application/x-msdownload'
113
+ 'application/x-msdownload',
114
+ 'text/html',
115
+ 'application/xhtml+xml',
116
+ 'text/xml',
117
+ 'application/xml'
114
118
  ]);
115
119
  /**
116
120
  * Blocked file extensions (regardless of MIME type).
@@ -144,18 +148,29 @@ const BLOCKED_EXTENSIONS = new Set([
144
148
  '.reg',
145
149
  '.inf',
146
150
  '.hta',
147
- '.wasm'
151
+ '.wasm',
152
+ '.html',
153
+ '.htm',
154
+ '.xhtml',
155
+ '.shtml',
156
+ '.xml',
157
+ '.xsl',
158
+ '.mhtml'
148
159
  ]);
149
160
  /**
150
161
  * Validate an uploaded file's actual content against allowed types.
151
162
  * Checks magic bytes, not just the client-provided MIME type.
152
163
  */
153
164
  export function validateFile(buffer, filename, clientMimeType, options = {}) {
154
- const ext = filename.toLowerCase().substring(filename.lastIndexOf('.'));
165
+ const lowerName = filename.toLowerCase();
166
+ const ext = lowerName.substring(lowerName.lastIndexOf('.'));
155
167
  const detectedMimeType = detectMimeType(buffer);
156
- // 1. Block dangerous extensions
157
- if (BLOCKED_EXTENSIONS.has(ext)) {
158
- return { valid: false, error: `File type "${ext}" is not allowed`, detectedMimeType };
168
+ // 1. Block dangerous extensions (check all extensions to prevent double-extension bypass)
169
+ const allExts = lowerName.match(/\.[^.]+/g) || [];
170
+ for (const e of allExts) {
171
+ if (BLOCKED_EXTENSIONS.has(e)) {
172
+ return { valid: false, error: `File type "${e}" is not allowed`, detectedMimeType };
173
+ }
159
174
  }
160
175
  // 2. Block dangerous MIME types (detected from actual content)
161
176
  if (detectedMimeType && BLOCKED_MIME_TYPES.has(detectedMimeType)) {
@@ -30,6 +30,10 @@ function walk(value, ids) {
30
30
  ids.add(obj._ref);
31
31
  return;
32
32
  }
33
+ // Image/file fields store asset refs ({ _type:'image', asset:{_type:'reference', _ref} })
34
+ // that point to the assets table, not documents — skip them.
35
+ if (obj._type === 'image' || obj._type === 'file')
36
+ return;
33
37
  for (const key of Object.keys(obj)) {
34
38
  if (key.startsWith('_'))
35
39
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/vite/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAElD,MAAM,WAAW,eAAe;IAC/B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC5B,8DAA8D;IAC9D,GAAG,CAAC,EAAE,eAAe,GAAG,KAAK,CAAC;IAC9B,4CAA4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,MAAM,CAiF9D;AAiJD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,MAAM,EAAE,CAoB1D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/vite/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAElD,MAAM,WAAW,eAAe;IAC/B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC5B,8DAA8D;IAC9D,GAAG,CAAC,EAAE,eAAe,GAAG,KAAK,CAAC;IAC9B,4CAA4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAID;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,MAAM,CAiF9D;AAgJD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,MAAM,EAAE,CAoB1D"}
@@ -105,7 +105,9 @@ function aphexDayjsAlias() {
105
105
  name: 'aphex:dayjs-alias',
106
106
  config() {
107
107
  const dayjsEsm = require.resolve('dayjs/esm/index.js');
108
- const dayjsEsmPluginDir = dayjsEsm.replace(/\/index\.js$/, '/plugin');
108
+ const dayjsEsmPluginDir = dayjsEsm
109
+ .replace(/\\index\.js$/, '\\plugin')
110
+ .replace(/\/index\.js$/, '/plugin');
109
111
  return {
110
112
  resolve: {
111
113
  alias: [
@@ -219,10 +221,7 @@ function aphexWatchUnfilter() {
219
221
  return {
220
222
  server: {
221
223
  watch: {
222
- ignored: [
223
- '!**/node_modules/@aphexcms/cms-core/**',
224
- '!**/node_modules/@aphexcms/ui/**'
225
- ]
224
+ ignored: ['!**/node_modules/@aphexcms/cms-core/**', '!**/node_modules/@aphexcms/ui/**']
226
225
  }
227
226
  }
228
227
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aphexcms/cms-core",
3
- "version": "8.0.0",
3
+ "version": "9.0.0",
4
4
  "description": "Aphex CMS Core - A Sanity-style CMS with ports and adapters architecture",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -81,7 +81,7 @@
81
81
  "svelte": "^5.44.0",
82
82
  "tailwind-merge": "^3.4.0",
83
83
  "tailwind-variants": "^3.2.2",
84
- "@aphexcms/ui": "0.7.0"
84
+ "@aphexcms/ui": "^0.8.0"
85
85
  },
86
86
  "peerDependenciesMeta": {
87
87
  "graphql": {
@@ -107,7 +107,6 @@
107
107
  "esbuild": "^0.27.0",
108
108
  "hono": "^4.12.15",
109
109
  "picocolors": "^1.1.1",
110
- "s3mini": "^0.7.0",
111
110
  "sharp": "^0.34.5",
112
111
  "svelte-sonner": "^1.0.7",
113
112
  "tsx": "^4.20.6",
@@ -118,7 +117,7 @@
118
117
  "@eslint/js": "^9.39.1",
119
118
  "@internationalized/date": "^3.10.0",
120
119
  "@sveltejs/adapter-auto": "^7.0.0",
121
- "@sveltejs/kit": "^2.49.0",
120
+ "@sveltejs/kit": "^2.59.1",
122
121
  "@sveltejs/package": "^2.5.6",
123
122
  "@sveltejs/vite-plugin-svelte": "^6.2.1",
124
123
  "@tailwindcss/vite": "^4.1.17",
@@ -135,7 +134,7 @@
135
134
  "tailwindcss": "^4.1.17",
136
135
  "typescript": "^5.9.3",
137
136
  "typescript-eslint": "^8.48.0",
138
- "vite": "^7.2.4"
137
+ "vite": "^7.3.3"
139
138
  },
140
139
  "scripts": {
141
140
  "build": "svelte-package && tsc && node ../../scripts/fix-imports.js ./dist",