@aphexcms/cms-core 2.0.9 → 2.0.10

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 (169) hide show
  1. package/LICENSE +21 -0
  2. package/dist/api/api-keys.d.ts +4 -7
  3. package/dist/api/api-keys.d.ts.map +1 -1
  4. package/dist/api/assets.d.ts +7 -22
  5. package/dist/api/assets.d.ts.map +1 -1
  6. package/dist/api/assets.js +1 -10
  7. package/dist/api/documents.d.ts +17 -16
  8. package/dist/api/documents.d.ts.map +1 -1
  9. package/dist/api/documents.js +2 -2
  10. package/dist/api/organizations.d.ts +15 -35
  11. package/dist/api/organizations.d.ts.map +1 -1
  12. package/dist/api/schemas/api-keys.d.ts +16 -0
  13. package/dist/api/schemas/api-keys.d.ts.map +1 -0
  14. package/dist/api/schemas/api-keys.js +9 -0
  15. package/dist/api/schemas/assets.d.ts +174 -0
  16. package/dist/api/schemas/assets.d.ts.map +1 -0
  17. package/dist/api/schemas/assets.js +99 -0
  18. package/dist/api/schemas/documents.d.ts +325 -0
  19. package/dist/api/schemas/documents.d.ts.map +1 -0
  20. package/dist/api/schemas/documents.js +161 -0
  21. package/dist/api/schemas/organizations.d.ts +59 -0
  22. package/dist/api/schemas/organizations.d.ts.map +1 -0
  23. package/dist/api/schemas/organizations.js +45 -0
  24. package/dist/api/schemas/user.d.ts +10 -0
  25. package/dist/api/schemas/user.d.ts.map +1 -0
  26. package/dist/api/schemas/user.js +11 -0
  27. package/dist/api/user.d.ts +4 -6
  28. package/dist/api/user.d.ts.map +1 -1
  29. package/dist/auth/provider.d.ts +5 -0
  30. package/dist/auth/provider.d.ts.map +1 -1
  31. package/dist/cli/index.js +0 -0
  32. package/dist/client/index.d.ts +2 -0
  33. package/dist/client/index.d.ts.map +1 -1
  34. package/dist/client/index.js +3 -0
  35. package/dist/components/AdminApp.svelte +8 -4
  36. package/dist/components/AdminApp.svelte.d.ts.map +1 -1
  37. package/dist/components/admin/DocumentEditor.svelte +23 -18
  38. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
  39. package/dist/components/admin/DocumentVersionPanel.svelte +18 -31
  40. package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
  41. package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte +37 -0
  42. package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte.d.ts +19 -0
  43. package/dist/components/admin/confirm-dialog/ConfirmDialogHost.svelte.d.ts.map +1 -0
  44. package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts +16 -0
  45. package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts.map +1 -0
  46. package/dist/components/admin/confirm-dialog/confirm-dialog.svelte.js +29 -0
  47. package/dist/hooks.d.ts.map +1 -1
  48. package/dist/hooks.js +4 -0
  49. package/dist/lib/api/api-keys.d.ts +4 -7
  50. package/dist/lib/api/api-keys.d.ts.map +1 -1
  51. package/dist/lib/api/api-keys.js.map +1 -1
  52. package/dist/lib/api/assets.d.ts +7 -22
  53. package/dist/lib/api/assets.d.ts.map +1 -1
  54. package/dist/lib/api/assets.js +1 -10
  55. package/dist/lib/api/assets.js.map +1 -1
  56. package/dist/lib/api/documents.d.ts +17 -16
  57. package/dist/lib/api/documents.d.ts.map +1 -1
  58. package/dist/lib/api/documents.js +2 -2
  59. package/dist/lib/api/documents.js.map +1 -1
  60. package/dist/lib/api/organizations.d.ts +15 -35
  61. package/dist/lib/api/organizations.d.ts.map +1 -1
  62. package/dist/lib/api/organizations.js.map +1 -1
  63. package/dist/lib/api/schemas/api-keys.d.ts +16 -0
  64. package/dist/lib/api/schemas/api-keys.d.ts.map +1 -0
  65. package/dist/lib/api/schemas/api-keys.js +10 -0
  66. package/dist/lib/api/schemas/api-keys.js.map +1 -0
  67. package/dist/lib/api/schemas/assets.d.ts +174 -0
  68. package/dist/lib/api/schemas/assets.d.ts.map +1 -0
  69. package/dist/lib/api/schemas/assets.js +100 -0
  70. package/dist/lib/api/schemas/assets.js.map +1 -0
  71. package/dist/lib/api/schemas/documents.d.ts +325 -0
  72. package/dist/lib/api/schemas/documents.d.ts.map +1 -0
  73. package/dist/lib/api/schemas/documents.js +162 -0
  74. package/dist/lib/api/schemas/documents.js.map +1 -0
  75. package/dist/lib/api/schemas/organizations.d.ts +59 -0
  76. package/dist/lib/api/schemas/organizations.d.ts.map +1 -0
  77. package/dist/lib/api/schemas/organizations.js +46 -0
  78. package/dist/lib/api/schemas/organizations.js.map +1 -0
  79. package/dist/lib/api/schemas/user.d.ts +10 -0
  80. package/dist/lib/api/schemas/user.d.ts.map +1 -0
  81. package/dist/lib/api/schemas/user.js +12 -0
  82. package/dist/lib/api/schemas/user.js.map +1 -0
  83. package/dist/lib/api/user.d.ts +4 -6
  84. package/dist/lib/api/user.d.ts.map +1 -1
  85. package/dist/lib/api/user.js.map +1 -1
  86. package/dist/lib/auth/provider.d.ts +5 -0
  87. package/dist/lib/auth/provider.d.ts.map +1 -1
  88. package/dist/lib/client/index.d.ts +2 -0
  89. package/dist/lib/client/index.d.ts.map +1 -1
  90. package/dist/lib/client/index.js +3 -0
  91. package/dist/lib/client/index.js.map +1 -1
  92. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts +16 -0
  93. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.d.ts.map +1 -0
  94. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.js +30 -0
  95. package/dist/lib/components/admin/confirm-dialog/confirm-dialog.svelte.js.map +1 -0
  96. package/dist/lib/hooks.d.ts.map +1 -1
  97. package/dist/lib/hooks.js +4 -0
  98. package/dist/lib/hooks.js.map +1 -1
  99. package/dist/lib/routes/assets-bulk.d.ts.map +1 -1
  100. package/dist/lib/routes/assets-bulk.js +10 -3
  101. package/dist/lib/routes/assets-bulk.js.map +1 -1
  102. package/dist/lib/routes/assets-by-id.d.ts.map +1 -1
  103. package/dist/lib/routes/assets-by-id.js +11 -1
  104. package/dist/lib/routes/assets-by-id.js.map +1 -1
  105. package/dist/lib/routes/assets-references-counts.d.ts.map +1 -1
  106. package/dist/lib/routes/assets-references-counts.js +12 -2
  107. package/dist/lib/routes/assets-references-counts.js.map +1 -1
  108. package/dist/lib/routes/assets.d.ts.map +1 -1
  109. package/dist/lib/routes/assets.js +14 -13
  110. package/dist/lib/routes/assets.js.map +1 -1
  111. package/dist/lib/routes/document-versions.d.ts.map +1 -1
  112. package/dist/lib/routes/document-versions.js +16 -2
  113. package/dist/lib/routes/document-versions.js.map +1 -1
  114. package/dist/lib/routes/documents-by-id.d.ts.map +1 -1
  115. package/dist/lib/routes/documents-by-id.js +15 -3
  116. package/dist/lib/routes/documents-by-id.js.map +1 -1
  117. package/dist/lib/routes/documents-query.d.ts.map +1 -1
  118. package/dist/lib/routes/documents-query.js +13 -10
  119. package/dist/lib/routes/documents-query.js.map +1 -1
  120. package/dist/lib/routes/documents.d.ts.map +1 -1
  121. package/dist/lib/routes/documents.js +29 -26
  122. package/dist/lib/routes/documents.js.map +1 -1
  123. package/dist/lib/routes/organizations-by-id.d.ts.map +1 -1
  124. package/dist/lib/routes/organizations-by-id.js +11 -1
  125. package/dist/lib/routes/organizations-by-id.js.map +1 -1
  126. package/dist/lib/routes/organizations-invitations.d.ts.map +1 -1
  127. package/dist/lib/routes/organizations-invitations.js +32 -12
  128. package/dist/lib/routes/organizations-invitations.js.map +1 -1
  129. package/dist/lib/routes/organizations-members.d.ts.map +1 -1
  130. package/dist/lib/routes/organizations-members.js +14 -16
  131. package/dist/lib/routes/organizations-members.js.map +1 -1
  132. package/dist/lib/routes/organizations-switch.d.ts.map +1 -1
  133. package/dist/lib/routes/organizations-switch.js +7 -3
  134. package/dist/lib/routes/organizations-switch.js.map +1 -1
  135. package/dist/lib/routes/organizations.d.ts.map +1 -1
  136. package/dist/lib/routes/organizations.js +8 -5
  137. package/dist/lib/routes/organizations.js.map +1 -1
  138. package/dist/lib/routes/user-preferences.d.ts.map +1 -1
  139. package/dist/lib/routes/user-preferences.js +7 -13
  140. package/dist/lib/routes/user-preferences.js.map +1 -1
  141. package/dist/routes/assets-bulk.d.ts.map +1 -1
  142. package/dist/routes/assets-bulk.js +10 -3
  143. package/dist/routes/assets-by-id.d.ts.map +1 -1
  144. package/dist/routes/assets-by-id.js +11 -1
  145. package/dist/routes/assets-references-counts.d.ts.map +1 -1
  146. package/dist/routes/assets-references-counts.js +12 -2
  147. package/dist/routes/assets.d.ts.map +1 -1
  148. package/dist/routes/assets.js +14 -13
  149. package/dist/routes/document-versions.d.ts.map +1 -1
  150. package/dist/routes/document-versions.js +16 -2
  151. package/dist/routes/documents-by-id.d.ts.map +1 -1
  152. package/dist/routes/documents-by-id.js +15 -3
  153. package/dist/routes/documents-query.d.ts.map +1 -1
  154. package/dist/routes/documents-query.js +13 -10
  155. package/dist/routes/documents.d.ts.map +1 -1
  156. package/dist/routes/documents.js +29 -26
  157. package/dist/routes/organizations-by-id.d.ts.map +1 -1
  158. package/dist/routes/organizations-by-id.js +11 -1
  159. package/dist/routes/organizations-invitations.d.ts.map +1 -1
  160. package/dist/routes/organizations-invitations.js +32 -12
  161. package/dist/routes/organizations-members.d.ts.map +1 -1
  162. package/dist/routes/organizations-members.js +14 -16
  163. package/dist/routes/organizations-switch.d.ts.map +1 -1
  164. package/dist/routes/organizations-switch.js +7 -3
  165. package/dist/routes/organizations.d.ts.map +1 -1
  166. package/dist/routes/organizations.js +8 -5
  167. package/dist/routes/user-preferences.d.ts.map +1 -1
  168. package/dist/routes/user-preferences.js +7 -13
  169. package/package.json +138 -138
@@ -0,0 +1,45 @@
1
+ import { z } from 'zod';
2
+ // ---------- Shared ----------
3
+ export const organizationRoleSchema = z.enum(['owner', 'admin', 'editor', 'viewer']);
4
+ // Role used for new invitations — owners cannot be invited, only promoted.
5
+ export const invitableRoleSchema = z.enum(['admin', 'editor', 'viewer']);
6
+ const metadataSchema = z.record(z.string(), z.unknown());
7
+ // ---------- POST /organizations ----------
8
+ export const createOrganizationRequest = z.object({
9
+ name: z.string().min(1),
10
+ slug: z.string().min(1),
11
+ metadata: metadataSchema.nullable().optional(),
12
+ parentOrganizationId: z.string().optional()
13
+ });
14
+ // ---------- PATCH /organizations/[id] ----------
15
+ export const updateOrganizationRequest = z
16
+ .object({
17
+ name: z.string().min(1).optional(),
18
+ slug: z.string().min(1).optional(),
19
+ metadata: metadataSchema.nullable().optional()
20
+ })
21
+ .refine((v) => v.name !== undefined || v.slug !== undefined || v.metadata !== undefined, {
22
+ message: 'At least one field (name, slug, metadata) is required'
23
+ });
24
+ // ---------- POST /organizations/switch ----------
25
+ export const switchOrganizationRequest = z.object({
26
+ organizationId: z.string().min(1)
27
+ });
28
+ // ---------- POST /organizations/invitations ----------
29
+ export const inviteMemberRequest = z.object({
30
+ email: z.string().email(),
31
+ role: invitableRoleSchema
32
+ });
33
+ // ---------- DELETE /organizations/invitations ----------
34
+ export const cancelInvitationRequest = z.object({
35
+ invitationId: z.string().min(1)
36
+ });
37
+ // ---------- DELETE /organizations/members ----------
38
+ export const removeMemberRequest = z.object({
39
+ userId: z.string().min(1)
40
+ });
41
+ // ---------- PATCH /organizations/members ----------
42
+ export const updateMemberRoleRequest = z.object({
43
+ userId: z.string().min(1),
44
+ role: organizationRoleSchema
45
+ });
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ export declare const updateUserRequest: z.ZodObject<{
3
+ name: z.ZodString;
4
+ }, z.core.$strip>;
5
+ export declare const updateUserPreferencesRequest: z.ZodObject<{
6
+ includeChildOrganizations: z.ZodOptional<z.ZodBoolean>;
7
+ }, z.core.$strict>;
8
+ export type UpdateUserRequest = z.infer<typeof updateUserRequest>;
9
+ export type UpdateUserPreferencesRequest = z.infer<typeof updateUserPreferencesRequest>;
10
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/lib/api/schemas/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;iBAE5B,CAAC;AAIH,eAAO,MAAM,4BAA4B;;kBAI/B,CAAC;AAIX,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAClE,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ // ---------- PATCH /user ----------
3
+ export const updateUserRequest = z.object({
4
+ name: z.string().min(1)
5
+ });
6
+ // ---------- PATCH /user/cms-preference ----------
7
+ export const updateUserPreferencesRequest = z
8
+ .object({
9
+ includeChildOrganizations: z.boolean().optional()
10
+ })
11
+ .strict();
@@ -1,18 +1,16 @@
1
1
  import type { CMSUser } from '../types/user.js';
2
- import type { UserSessionPreferences } from '../types/organization.js';
3
2
  import type { ApiResponse } from './types.js';
4
- export interface UpdateProfileData {
5
- name?: string;
6
- }
3
+ import type { UpdateUserRequest, UpdateUserPreferencesRequest } from './schemas/user.js';
4
+ export type UpdateProfileData = UpdateUserRequest;
7
5
  export declare class UserApi {
8
6
  /**
9
7
  * Update user profile
10
8
  */
11
- static updateProfile(data: UpdateProfileData): Promise<ApiResponse<CMSUser>>;
9
+ static updateProfile(data: UpdateUserRequest): Promise<ApiResponse<CMSUser>>;
12
10
  /**
13
11
  * Update CMS preferences (e.g. includeChildOrganizations)
14
12
  */
15
- static updatePreferences(prefs: Partial<UserSessionPreferences>): Promise<ApiResponse<{
13
+ static updatePreferences(prefs: UpdateUserPreferencesRequest): Promise<ApiResponse<{
16
14
  success: boolean;
17
15
  }>>;
18
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/lib/api/user.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,WAAW,iBAAiB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,OAAO;IACnB;;OAEG;WACU,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAIlF;;OAEG;WACU,iBAAiB,CAC7B,KAAK,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACpC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAG7C;AAED,eAAO,MAAM,IAAI;;;CAGhB,CAAC"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/lib/api/user.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAItF,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAElD,qBAAa,OAAO;IACnB;;OAEG;WACU,aAAa,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAIlF;;OAEG;WACU,iBAAiB,CAC7B,KAAK,EAAE,4BAA4B,GACjC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAG7C;AAED,eAAO,MAAM,IAAI;;;CAGhB,CAAC"}
@@ -10,6 +10,11 @@ export interface AuthProvider {
10
10
  name?: string;
11
11
  email: string;
12
12
  } | null>;
13
+ getUserByEmail(email: string): Promise<{
14
+ id: string;
15
+ name?: string;
16
+ email: string;
17
+ } | null>;
13
18
  changeUserName(userId: string, name: string): Promise<void>;
14
19
  requestPasswordReset(email: string, redirectTo?: string): Promise<void>;
15
20
  resetPassword(token: string, newPassword: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/lib/auth/provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,WAAW,YAAY;IAE5B,UAAU,CACT,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,eAAe,GACjB,OAAO,CAAC,WAAW,GAAG,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACpD,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAG5E,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAClF,aAAa,CACZ,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,eAAe,EACnB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAC3B,OAAO,CAAC,UAAU,CAAC,CAAC;IAGvB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC1F,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5D,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/lib/auth/provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,WAAW,YAAY;IAE5B,UAAU,CACT,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,eAAe,GACjB,OAAO,CAAC,WAAW,GAAG,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACpD,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAG5E,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAClF,aAAa,CACZ,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,eAAe,EACnB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAC3B,OAAO,CAAC,UAAU,CAAC,CAAC;IAGvB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC1F,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC5F,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAG5D,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE"}
package/dist/cli/index.js CHANGED
File without changes
@@ -22,4 +22,6 @@ export * from '../utils/index.js';
22
22
  export * from '../api/index.js';
23
23
  export type { ApiResponse } from '../api/index.js';
24
24
  export { toast } from 'svelte-sonner';
25
+ export { confirmDialog, type ConfirmDialogOptions } from '../components/admin/confirm-dialog/confirm-dialog.svelte';
26
+ export { default as ConfirmDialogHost } from '../components/admin/confirm-dialog/ConfirmDialogHost.svelte';
25
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/client/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGlG,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAG1C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG9E,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kDAAkD,CAAC;AAG7F,cAAc,gBAAgB,CAAC;AAE/B,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/client/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGlG,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAG1C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG9E,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kDAAkD,CAAC;AAG7F,cAAc,gBAAgB,CAAC;AAE/B,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAGtC,OAAO,EACN,aAAa,EACb,KAAK,oBAAoB,EACzB,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,6DAA6D,CAAC"}
@@ -31,3 +31,6 @@ export * from '../utils/index.js';
31
31
  export * from '../api/index.js';
32
32
  // Toast notifications (re-exported from svelte-sonner for convenience)
33
33
  export { toast } from 'svelte-sonner';
34
+ // Confirm dialog (imperative API backed by a mounted host)
35
+ export { confirmDialog } from '../components/admin/confirm-dialog/confirm-dialog.svelte';
36
+ export { default as ConfirmDialogHost } from '../components/admin/confirm-dialog/ConfirmDialogHost.svelte';
@@ -17,6 +17,7 @@
17
17
  import DocumentVersionPanel from './admin/DocumentVersionPanel.svelte';
18
18
  import DocumentsSkeleton from './admin/DocumentsSkeleton.svelte';
19
19
  import MediaBrowser from './admin/MediaBrowser.svelte';
20
+ import ConfirmDialogHost from './admin/confirm-dialog/ConfirmDialogHost.svelte';
20
21
  import { documents, organizations } from '../api/index';
21
22
  import {
22
23
  FileText,
@@ -34,6 +35,7 @@
34
35
  import { cmsLogger } from '../utils/logger';
35
36
  import { pluralize } from '../utils/pluralize';
36
37
  import { toast } from 'svelte-sonner';
38
+ import { resolve } from '$app/paths';
37
39
 
38
40
  interface Props {
39
41
  schemas: SchemaType[];
@@ -983,7 +985,7 @@
983
985
  title="Click to expand documents list"
984
986
  >
985
987
  <div class="flex flex-1 items-start justify-center p-2 pt-8 text-left">
986
- <div class="text-foreground rotate-90 transform text-sm font-medium">
988
+ <div class="mt-4 text-foreground rotate-90 transform text-md font-medium whitespace-nowrap">
987
989
  {pluralize(documentTypes.find((t) => t.name === selectedDocumentType)?.title ||
988
990
  selectedDocumentType)}
989
991
  </div>
@@ -1384,9 +1386,9 @@
1384
1386
  onBack={() => handleCloseStackedEditor(index)}
1385
1387
  onOpenReference={handleOpenReference}
1386
1388
  onOpenVersionHistory={handleOpenVersionHistory}
1387
- onSaved={async (_) => {}}
1389
+ onSaved={async () => {}}
1388
1390
  onAutoSaved={() => {}}
1389
- onPublished={async (_) => {}}
1391
+ onPublished={async () => {}}
1390
1392
  onDeleted={async () => {
1391
1393
  handleCloseStackedEditor(index);
1392
1394
  }}
@@ -1465,7 +1467,7 @@
1465
1467
  <p class="text-muted-foreground mb-4">Query your CMS data with the GraphQL API</p>
1466
1468
 
1467
1469
  <a
1468
- href={graphqlSettings.endpoint}
1470
+ href={resolve(graphqlSettings.endpoint, {})}
1469
1471
  target="_blank"
1470
1472
  class="bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-2 rounded-md px-4 py-2 transition-colors"
1471
1473
  >
@@ -1492,3 +1494,5 @@
1492
1494
  </Tabs.Root>
1493
1495
  </div>
1494
1496
  </div>
1497
+
1498
+ <ConfirmDialogHost />
@@ -1 +1 @@
1
- {"version":3,"file":"AdminApp.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/AdminApp.svelte.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAwBnE,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAA;KAAE,CAAC;IACxD,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAChD;AA8wCF,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"AdminApp.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/components/AdminApp.svelte.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AA0BnE,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAA;KAAE,CAAC;IACxD,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAChD;AAkxCF,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
@@ -11,10 +11,10 @@
11
11
  import { hasUnpublishedChanges } from '../../utils/content-hash';
12
12
  import { setSchemaContext } from '../../schema-context.svelte';
13
13
  import { getDefaultValueForFieldType } from '../../utils/field-defaults';
14
- import elementEvents from '../../utils/element-events';
15
14
  import { cmsLogger } from '../../utils/logger';
16
15
  import { toast } from 'svelte-sonner';
17
- import { History, EyeOff, Trash2, Ellipsis, Search, Code } from '@lucide/svelte';
16
+ import { confirmDialog } from './confirm-dialog/confirm-dialog.svelte';
17
+ import { History, Trash2, Ellipsis, Code } from '@lucide/svelte';
18
18
 
19
19
  interface Props {
20
20
  schemas: SchemaType[];
@@ -136,9 +136,6 @@
136
136
 
137
137
  const savedAgoText = $derived(lastSaved ? `Saved ${timeAgo(lastSaved)}` : null);
138
138
 
139
- // Menu dropdown state
140
- let showDropdown = $state(false);
141
-
142
139
  // Auto-save functionality (every 2 seconds when there are changes)
143
140
  let hasUnsavedChanges = $state(false);
144
141
  let autoSaveTimer: ReturnType<typeof setTimeout> | null = null;
@@ -293,8 +290,8 @@
293
290
 
294
291
  // With LocalAPI, data is flattened at top level (not in draftData)
295
292
  // Extract all fields except id and _meta
296
- // @ts-expect-error
297
- const { id, _meta, ...data } = response.data;
293
+ const { id: _id, _meta, ...data } = response.data;
294
+ cmsLogger.debug('[Document Editor', '📄 Full response.data:', _id)
298
295
  cmsLogger.debug('[Document Editor]', '📄 Full response.data:', response.data);
299
296
  cmsLogger.debug('[Document Editor]', '📄 Extracted data (after destructuring):', data);
300
297
  cmsLogger.debug('[Document Editor]', '📄 Keys in extracted data:', Object.keys(data));
@@ -507,7 +504,6 @@
507
504
  // instead of what the server returned, in case server adds extra metadata
508
505
  if (response?.success && response.data) {
509
506
  cmsLogger.debug('[Document Editor]', 'meta response data:', response.data);
510
- // @ts-expect-error
511
507
  const { id: responseId, _meta } = response.data;
512
508
  // Reconstruct fullDocument using the data we sent (documentData)
513
509
  // plus the id and _meta from the response
@@ -632,7 +628,13 @@
632
628
  async function unpublishDocument() {
633
629
  if (!documentId || saving) return;
634
630
 
635
- const confirmUnpublish = confirm('Unpublish this document? It will be removed from published queries but the data is preserved.');
631
+ const confirmUnpublish = await confirmDialog({
632
+ title: 'Unpublish this document?',
633
+ description:
634
+ 'It will be removed from published queries, but the data is preserved and you can re-publish anytime.',
635
+ confirmText: 'Unpublish',
636
+ variant: 'destructive'
637
+ });
636
638
  if (!confirmUnpublish) return;
637
639
 
638
640
  saving = true;
@@ -643,7 +645,6 @@
643
645
  if (response.success) {
644
646
  fullDocument = { ...fullDocument, _meta: { ...fullDocument?._meta, status: 'unpublished' } };
645
647
  toast.success('Document unpublished — you can re-publish anytime');
646
- showDropdown = false;
647
648
  } else {
648
649
  throw new Error(response.error || 'Failed to unpublish');
649
650
  }
@@ -695,9 +696,12 @@
695
696
  async function deleteDocument() {
696
697
  if (!documentId || saving) return;
697
698
 
698
- const confirmDelete = confirm(
699
- `Are you sure you want to delete this document? This action cannot be undone.`
700
- );
699
+ const confirmDelete = await confirmDialog({
700
+ title: 'Delete this document?',
701
+ description: 'This action cannot be undone.',
702
+ confirmText: 'Delete',
703
+ variant: 'destructive'
704
+ });
701
705
  if (!confirmDelete) return;
702
706
 
703
707
  saving = true;
@@ -803,7 +807,7 @@
803
807
  {#if fullDocument?.createdBy}
804
808
  <span class="text-muted-foreground hidden text-xs sm:inline">
805
809
  • Created by {typeof fullDocument.createdBy === 'string'
806
- ? fullDocument.createdBy
810
+ ? (fullDocument.createdBy.startsWith('apikey:') ? 'API Key' : fullDocument.createdBy)
807
811
  : fullDocument.createdBy.name || fullDocument.createdBy.email}
808
812
  </span>
809
813
  {/if}
@@ -1193,7 +1197,7 @@
1193
1197
  if (res.success && res.data) {
1194
1198
  previewingVersion = {
1195
1199
  versionNumber: version.versionNumber,
1196
- data: res.data.data,
1200
+ data: res.data.data ?? {},
1197
1201
  eventType: version.eventType
1198
1202
  };
1199
1203
  }
@@ -1209,7 +1213,7 @@
1209
1213
  </Badge>
1210
1214
  </div>
1211
1215
  <p class="text-muted-foreground text-[11px]">
1212
- {new Date(version.createdAt).toLocaleString()}
1216
+ {version.createdAt ? new Date(version.createdAt).toLocaleString() : ''}
1213
1217
  </p>
1214
1218
  </button>
1215
1219
  {/each}
@@ -1238,14 +1242,15 @@
1238
1242
  <div>
1239
1243
  <h3 class="text-sm font-semibold">Inspecting <em>{getPreviewTitle()}</em></h3>
1240
1244
  </div>
1241
- <button
1245
+ <Button
1246
+ variant="ghost"
1242
1247
  class="hover:bg-muted rounded p-1 transition-colors"
1243
1248
  onclick={() => (showInspect = false)}
1244
1249
  >
1245
1250
  <svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
1246
1251
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
1247
1252
  </svg>
1248
- </button>
1253
+ </Button>
1249
1254
  </div>
1250
1255
 
1251
1256
  <!-- Tabs -->
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWxD,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5H,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAkrCF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWxD,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC5H,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAsrCF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -12,6 +12,7 @@
12
12
  }
13
13
 
14
14
  let { documentId, onClose, onRestored, onPreviewVersion }: Props = $props();
15
+ void onRestored;
15
16
 
16
17
  let versions = $state<any[]>([]);
17
18
  let loading = $state(true);
@@ -44,12 +45,12 @@
44
45
  try {
45
46
  const res = await documents.getVersion(documentId, version.versionNumber);
46
47
  if (res.success && res.data) {
47
- previewVersion = { ...version, data: res.data.data };
48
+ previewVersion = { ...version, data: res.data.data ?? {} };
48
49
  onPreviewVersion?.({
49
50
  versionNumber: version.versionNumber,
50
- data: res.data.data,
51
+ data: res.data.data ?? {},
51
52
  eventType: version.eventType,
52
- createdAt: version.createdAt
53
+ createdAt: version.createdAt ?? undefined
53
54
  });
54
55
  }
55
56
  } catch {
@@ -57,48 +58,33 @@
57
58
  }
58
59
  }
59
60
 
60
- function clearPreview() {
61
- previewVersion = null;
62
- onPreviewVersion?.(null);
63
- }
64
-
65
- async function restoreVersion() {
66
- if (!previewVersion) return;
67
- try {
68
- await documents.restoreVersion(documentId, previewVersion.versionNumber);
69
- toast.success(`Restored to v${previewVersion.versionNumber}`);
70
- clearPreview();
71
- onRestored?.();
72
- await loadVersions();
73
- } catch {
74
- toast.error('Failed to restore');
75
- }
76
- }
77
61
  </script>
78
62
 
79
63
  <div class="flex h-full flex-col">
80
64
  <!-- Header -->
81
65
  <div class="border-border bg-background flex h-14 items-center justify-between border-b px-3">
82
66
  <h3 class="text-sm font-medium">History</h3>
83
- <button
67
+ <Button
84
68
  class="hover:bg-muted rounded p-1 transition-colors"
69
+ variant="ghost"
85
70
  onclick={onClose}
86
71
  >
87
72
  <svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
88
73
  <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
89
74
  </svg>
90
- </button>
75
+ </Button>
91
76
  </div>
92
77
 
93
78
  <!-- Filter tabs -->
94
79
  <div class="border-border flex border-b">
95
80
  {#each [{ value: 'all', label: 'All' }, { value: 'publish', label: 'Published' }, { value: 'draft', label: 'Drafts' }] as tab}
96
- <button
97
- class="flex-1 px-2 py-2 text-xs font-medium transition-colors {filter === tab.value ? 'border-b-2 border-primary text-foreground' : 'text-muted-foreground hover:text-foreground'}"
81
+ <Button
82
+ variant="ghost"
83
+ class="rounded-none flex-1 px-2 py-2 text-xs font-medium transition-colors {filter === tab.value ? 'border-b-2 border-primary text-foreground' : 'text-muted-foreground hover:text-foreground'}"
98
84
  onclick={() => { filter = tab.value as any; }}
99
85
  >
100
86
  {tab.label}
101
- </button>
87
+ </Button>
102
88
  {/each}
103
89
  </div>
104
90
 
@@ -113,9 +99,10 @@
113
99
  <span class="text-muted-foreground text-xs">No {filter === 'all' ? '' : filter} versions</span>
114
100
  </div>
115
101
  {:else}
116
- {#each filteredVersions as version}
117
- <button
118
- class="w-full border-b px-3 py-2.5 text-left transition-colors hover:bg-muted {previewVersion?.versionNumber === version.versionNumber ? 'bg-muted border-l-2 border-l-primary' : ''}"
102
+ {#each filteredVersions as version, i}
103
+ <div
104
+ data-version-id={i}
105
+ class="w-full border-b cursor-pointer px-3 py-2.5 text-left transition-colors hover:bg-muted {previewVersion?.versionNumber === version.versionNumber ? 'bg-muted border-l-2 border-l-primary' : ''}"
119
106
  onclick={() => previewVersionData(version)}
120
107
  >
121
108
  <div class="flex items-center justify-between">
@@ -126,12 +113,12 @@
126
113
  {version.eventType}
127
114
  </Badge>
128
115
  </div>
129
- {#if version.createdByName || version.createdBy}
116
+ {#if version.createdByName}
130
117
  <p class="text-muted-foreground mt-0.5 truncate text-[10px]">
131
- {version.createdByName || version.createdBy}
118
+ {version.createdByName}
132
119
  </p>
133
120
  {/if}
134
- </button>
121
+ </div>
135
122
  {/each}
136
123
  {/if}
137
124
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentVersionPanel.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentVersionPanel.svelte.ts"],"names":[],"mappings":"AASC,UAAU,KAAK;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CACzI;AA+HF,QAAA,MAAM,oBAAoB,2CAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"DocumentVersionPanel.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentVersionPanel.svelte.ts"],"names":[],"mappings":"AASC,UAAU,KAAK;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CACzI;AA+GF,QAAA,MAAM,oBAAoB,2CAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,37 @@
1
+ <script lang="ts">
2
+ import * as AlertDialog from '@aphexcms/ui/shadcn/alert-dialog';
3
+ import { buttonVariants } from '@aphexcms/ui/shadcn/button';
4
+ import { confirmDialogState, resolveConfirmDialog } from './confirm-dialog.svelte';
5
+
6
+ function handleOpenChange(open: boolean) {
7
+ if (!open && confirmDialogState.open) {
8
+ resolveConfirmDialog(false);
9
+ }
10
+ }
11
+ </script>
12
+
13
+ <AlertDialog.Root bind:open={confirmDialogState.open} onOpenChange={handleOpenChange}>
14
+ <AlertDialog.Content>
15
+ <AlertDialog.Header>
16
+ <AlertDialog.Title>{confirmDialogState.title}</AlertDialog.Title>
17
+ {#if confirmDialogState.description}
18
+ <AlertDialog.Description>
19
+ {confirmDialogState.description}
20
+ </AlertDialog.Description>
21
+ {/if}
22
+ </AlertDialog.Header>
23
+ <AlertDialog.Footer>
24
+ <AlertDialog.Cancel onclick={() => resolveConfirmDialog(false)}>
25
+ {confirmDialogState.cancelText}
26
+ </AlertDialog.Cancel>
27
+ <AlertDialog.Action
28
+ class={buttonVariants({
29
+ variant: confirmDialogState.variant === 'destructive' ? 'destructive' : 'default'
30
+ })}
31
+ onclick={() => resolveConfirmDialog(true)}
32
+ >
33
+ {confirmDialogState.confirmText}
34
+ </AlertDialog.Action>
35
+ </AlertDialog.Footer>
36
+ </AlertDialog.Content>
37
+ </AlertDialog.Root>
@@ -0,0 +1,19 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const ConfirmDialogHost: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type ConfirmDialogHost = InstanceType<typeof ConfirmDialogHost>;
18
+ export default ConfirmDialogHost;
19
+ //# sourceMappingURL=ConfirmDialogHost.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialogHost.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/confirm-dialog/ConfirmDialogHost.svelte.ts"],"names":[],"mappings":"AA4CA,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,iBAAiB;;kBAA+E,CAAC;AACrF,KAAK,iBAAiB,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAClE,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface ConfirmDialogOptions {
2
+ title: string;
3
+ description?: string;
4
+ confirmText?: string;
5
+ cancelText?: string;
6
+ variant?: 'default' | 'destructive';
7
+ }
8
+ interface ConfirmDialogState extends ConfirmDialogOptions {
9
+ open: boolean;
10
+ resolve: ((value: boolean) => void) | null;
11
+ }
12
+ export declare const confirmDialogState: ConfirmDialogState;
13
+ export declare function confirmDialog(options: ConfirmDialogOptions): Promise<boolean>;
14
+ export declare function resolveConfirmDialog(value: boolean): void;
15
+ export {};
16
+ //# sourceMappingURL=confirm-dialog.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-dialog.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/confirm-dialog/confirm-dialog.svelte.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAC;CACpC;AAED,UAAU,kBAAmB,SAAQ,oBAAoB;IACxD,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,eAAO,MAAM,kBAAkB,oBAQ7B,CAAC;AAEH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAa7E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,QAKlD"}
@@ -0,0 +1,29 @@
1
+ export const confirmDialogState = $state({
2
+ open: false,
3
+ title: '',
4
+ description: undefined,
5
+ confirmText: 'Confirm',
6
+ cancelText: 'Cancel',
7
+ variant: 'default',
8
+ resolve: null
9
+ });
10
+ export function confirmDialog(options) {
11
+ return new Promise((resolve) => {
12
+ if (confirmDialogState.resolve) {
13
+ confirmDialogState.resolve(false);
14
+ }
15
+ confirmDialogState.title = options.title;
16
+ confirmDialogState.description = options.description;
17
+ confirmDialogState.confirmText = options.confirmText ?? 'Confirm';
18
+ confirmDialogState.cancelText = options.cancelText ?? 'Cancel';
19
+ confirmDialogState.variant = options.variant ?? 'default';
20
+ confirmDialogState.resolve = resolve;
21
+ confirmDialogState.open = true;
22
+ });
23
+ }
24
+ export function resolveConfirmDialog(value) {
25
+ const r = confirmDialogState.resolve;
26
+ confirmDialogState.resolve = null;
27
+ confirmDialogState.open = false;
28
+ r?.(value);
29
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAA8B,MAAM,eAAe,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKvD,OAAO,EAAa,SAAS,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlE,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,YAAY,CAAC,EAAE,GAAG,CACjB,MAAM,EACN;QAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAC7E,CAAC;CACF;AAiFD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAiLvD"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAA8B,MAAM,eAAe,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKvD,OAAO,EAAa,SAAS,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlE,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,YAAY,CAAC,EAAE,GAAG,CACjB,MAAM,EACN;QAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAC7E,CAAC;CACF;AAiFD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAuLvD"}
package/dist/hooks.js CHANGED
@@ -71,6 +71,10 @@ async function resolvePlugin(pluginConfig) {
71
71
  throw new Error(`Invalid plugin configuration: ${JSON.stringify(pluginConfig)}`);
72
72
  }
73
73
  export function createCMSHook(config) {
74
+ if (!config) {
75
+ throw new Error('[CMS] createCMSHook received an undefined config. ' +
76
+ 'If this happens during HMR, the config module may not have re-executed yet.');
77
+ }
74
78
  // Apply log level from config (if provided)
75
79
  if (config.logLevel)
76
80
  setLogLevel(config.logLevel);
@@ -1,18 +1,15 @@
1
1
  import type { ApiResponse } from './types.js';
2
+ import type { ApiKeyPermission, CreateApiKeyRequest } from './schemas/api-keys.js';
2
3
  export interface ApiKey {
3
4
  id: string;
4
5
  name: string | null;
5
6
  key?: string;
6
- permissions: ('read' | 'write')[];
7
+ permissions: ApiKeyPermission[];
7
8
  createdAt: Date | null;
8
9
  lastRequest: Date | null;
9
10
  expiresAt: Date | null;
10
11
  }
11
- export interface CreateApiKeyData {
12
- name: string;
13
- permissions: ('read' | 'write')[];
14
- expiresInDays?: number;
15
- }
12
+ export type CreateApiKeyData = CreateApiKeyRequest;
16
13
  export interface CreateApiKeyResponse {
17
14
  apiKey: ApiKey & {
18
15
  key: string;
@@ -22,7 +19,7 @@ export declare class ApiKeysApi {
22
19
  /**
23
20
  * Create a new API key
24
21
  */
25
- static create(data: CreateApiKeyData): Promise<ApiResponse<CreateApiKeyResponse>>;
22
+ static create(data: CreateApiKeyRequest): Promise<ApiResponse<CreateApiKeyResponse>>;
26
23
  /**
27
24
  * Delete an API key
28
25
  */
@@ -1 +1 @@
1
- {"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../../src/lib/api/api-keys.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,WAAW,MAAM;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IAClC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC;AAED,qBAAa,UAAU;IACtB;;OAEG;WACU,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAIvF;;OAEG;WACU,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAG3E;AAED,eAAO,MAAM,OAAO;;;CAGnB,CAAC"}
1
+ {"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../../src/lib/api/api-keys.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,MAAM,WAAW,MAAM;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACvB;AAID,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC;AAED,qBAAa,UAAU;IACtB;;OAEG;WACU,MAAM,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAI1F;;OAEG;WACU,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAG3E;AAED,eAAO,MAAM,OAAO;;;CAGnB,CAAC"}