@vertebr/admin 0.9.0 → 0.11.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 (144) hide show
  1. package/dist/database/connector.d.ts.map +1 -1
  2. package/dist/database/connector.js +45 -2
  3. package/dist/database/connector.js.map +1 -1
  4. package/dist/database/types.d.ts +5 -0
  5. package/dist/database/types.d.ts.map +1 -1
  6. package/dist/index.d.ts +8 -5
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +10 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/runtime/api/adapters/express.d.ts +10 -0
  11. package/dist/runtime/api/adapters/express.d.ts.map +1 -0
  12. package/dist/runtime/api/adapters/express.js +86 -0
  13. package/dist/runtime/api/adapters/express.js.map +1 -0
  14. package/dist/runtime/api/adapters/fastify.d.ts +31 -0
  15. package/dist/runtime/api/adapters/fastify.d.ts.map +1 -0
  16. package/dist/runtime/api/adapters/fastify.js +85 -0
  17. package/dist/runtime/api/adapters/fastify.js.map +1 -0
  18. package/dist/runtime/api/adapters/hapi.d.ts +6 -0
  19. package/dist/runtime/api/adapters/hapi.d.ts.map +1 -0
  20. package/dist/runtime/api/adapters/hapi.js +45 -0
  21. package/dist/runtime/api/adapters/hapi.js.map +1 -0
  22. package/dist/runtime/api/adapters/shared.d.ts +17 -0
  23. package/dist/runtime/api/adapters/shared.d.ts.map +1 -0
  24. package/dist/runtime/api/adapters/shared.js +37 -0
  25. package/dist/runtime/api/adapters/shared.js.map +1 -0
  26. package/dist/runtime/api/audit.d.ts +8 -0
  27. package/dist/runtime/api/audit.d.ts.map +1 -0
  28. package/dist/runtime/api/audit.js +30 -0
  29. package/dist/runtime/api/audit.js.map +1 -0
  30. package/dist/runtime/api/catalog.d.ts +42 -2
  31. package/dist/runtime/api/catalog.d.ts.map +1 -1
  32. package/dist/runtime/api/catalog.js +142 -83
  33. package/dist/runtime/api/catalog.js.map +1 -1
  34. package/dist/runtime/api/configs.d.ts +16 -0
  35. package/dist/runtime/api/configs.d.ts.map +1 -1
  36. package/dist/runtime/api/configs.js +145 -5
  37. package/dist/runtime/api/configs.js.map +1 -1
  38. package/dist/runtime/api/health.d.ts +7 -0
  39. package/dist/runtime/api/health.d.ts.map +1 -0
  40. package/dist/runtime/api/health.js +21 -0
  41. package/dist/runtime/api/health.js.map +1 -0
  42. package/dist/runtime/api/jobs.d.ts +12 -0
  43. package/dist/runtime/api/jobs.d.ts.map +1 -0
  44. package/dist/runtime/api/jobs.js +34 -0
  45. package/dist/runtime/api/jobs.js.map +1 -0
  46. package/dist/runtime/api/metrics.d.ts.map +1 -1
  47. package/dist/runtime/api/metrics.js +2 -0
  48. package/dist/runtime/api/metrics.js.map +1 -1
  49. package/dist/runtime/api/public.d.ts.map +1 -1
  50. package/dist/runtime/api/public.js +2 -1
  51. package/dist/runtime/api/public.js.map +1 -1
  52. package/dist/runtime/api/resources.d.ts +29 -0
  53. package/dist/runtime/api/resources.d.ts.map +1 -1
  54. package/dist/runtime/api/resources.js +247 -7
  55. package/dist/runtime/api/resources.js.map +1 -1
  56. package/dist/runtime/api/revisions.d.ts +35 -0
  57. package/dist/runtime/api/revisions.d.ts.map +1 -0
  58. package/dist/runtime/api/revisions.js +174 -0
  59. package/dist/runtime/api/revisions.js.map +1 -0
  60. package/dist/runtime/api/routes.d.ts +2 -5
  61. package/dist/runtime/api/routes.d.ts.map +1 -1
  62. package/dist/runtime/api/routes.js +51 -40
  63. package/dist/runtime/api/routes.js.map +1 -1
  64. package/dist/runtime/api/sync.d.ts.map +1 -1
  65. package/dist/runtime/api/sync.js +32 -2
  66. package/dist/runtime/api/sync.js.map +1 -1
  67. package/dist/runtime/createAdmin.d.ts.map +1 -1
  68. package/dist/runtime/createAdmin.js +45 -1
  69. package/dist/runtime/createAdmin.js.map +1 -1
  70. package/dist/runtime/errors.d.ts +8 -0
  71. package/dist/runtime/errors.d.ts.map +1 -1
  72. package/dist/runtime/errors.js +17 -1
  73. package/dist/runtime/errors.js.map +1 -1
  74. package/dist/runtime/services/access.d.ts +14 -0
  75. package/dist/runtime/services/access.d.ts.map +1 -0
  76. package/dist/runtime/services/access.js +49 -0
  77. package/dist/runtime/services/access.js.map +1 -0
  78. package/dist/runtime/services/audit.d.ts +16 -0
  79. package/dist/runtime/services/audit.d.ts.map +1 -0
  80. package/dist/runtime/services/audit.js +43 -0
  81. package/dist/runtime/services/audit.js.map +1 -0
  82. package/dist/runtime/services/environment.d.ts +4 -1
  83. package/dist/runtime/services/environment.d.ts.map +1 -1
  84. package/dist/runtime/services/environment.js +16 -2
  85. package/dist/runtime/services/environment.js.map +1 -1
  86. package/dist/runtime/services/state.d.ts +11 -1
  87. package/dist/runtime/services/state.d.ts.map +1 -1
  88. package/dist/runtime/types/access.d.ts +28 -0
  89. package/dist/runtime/types/access.d.ts.map +1 -0
  90. package/dist/runtime/types/access.js +3 -0
  91. package/dist/runtime/types/access.js.map +1 -0
  92. package/dist/runtime/types/actions.d.ts +2 -0
  93. package/dist/runtime/types/actions.d.ts.map +1 -1
  94. package/dist/runtime/types/addon.d.ts +9 -1
  95. package/dist/runtime/types/addon.d.ts.map +1 -1
  96. package/dist/runtime/types/addon.js.map +1 -1
  97. package/dist/runtime/types/admin.d.ts +29 -0
  98. package/dist/runtime/types/admin.d.ts.map +1 -1
  99. package/dist/runtime/types/audit.d.ts +35 -0
  100. package/dist/runtime/types/audit.d.ts.map +1 -0
  101. package/dist/runtime/types/audit.js +3 -0
  102. package/dist/runtime/types/audit.js.map +1 -0
  103. package/dist/runtime/types/auth.d.ts +6 -0
  104. package/dist/runtime/types/auth.d.ts.map +1 -1
  105. package/dist/runtime/types/config.d.ts +27 -0
  106. package/dist/runtime/types/config.d.ts.map +1 -1
  107. package/dist/runtime/types/events.d.ts +63 -0
  108. package/dist/runtime/types/events.d.ts.map +1 -0
  109. package/dist/runtime/types/events.js +3 -0
  110. package/dist/runtime/types/events.js.map +1 -0
  111. package/dist/runtime/types/health.d.ts +18 -0
  112. package/dist/runtime/types/health.d.ts.map +1 -0
  113. package/dist/runtime/types/health.js +3 -0
  114. package/dist/runtime/types/health.js.map +1 -0
  115. package/dist/runtime/types/index.d.ts +10 -4
  116. package/dist/runtime/types/index.d.ts.map +1 -1
  117. package/dist/runtime/types/jobs.d.ts +21 -0
  118. package/dist/runtime/types/jobs.d.ts.map +1 -0
  119. package/dist/runtime/types/jobs.js +3 -0
  120. package/dist/runtime/types/jobs.js.map +1 -0
  121. package/dist/runtime/types/resource.d.ts +30 -1
  122. package/dist/runtime/types/resource.d.ts.map +1 -1
  123. package/dist/runtime/types/revisions.d.ts +38 -0
  124. package/dist/runtime/types/revisions.d.ts.map +1 -0
  125. package/dist/runtime/types/revisions.js +3 -0
  126. package/dist/runtime/types/revisions.js.map +1 -0
  127. package/dist/runtime/types/sync.d.ts +39 -0
  128. package/dist/runtime/types/sync.d.ts.map +1 -1
  129. package/dist/runtime/utils/resolveSchema.d.ts +11 -0
  130. package/dist/runtime/utils/resolveSchema.d.ts.map +1 -0
  131. package/dist/runtime/utils/resolveSchema.js +35 -0
  132. package/dist/runtime/utils/resolveSchema.js.map +1 -0
  133. package/dist/schema.d.ts +31 -1
  134. package/dist/schema.d.ts.map +1 -1
  135. package/dist/store.d.ts +6 -0
  136. package/dist/store.d.ts.map +1 -1
  137. package/dist/store.js +80 -0
  138. package/dist/store.js.map +1 -1
  139. package/package.json +4 -1
  140. package/static/assets/index-BWs25O1f.js +340 -0
  141. package/static/assets/index-Bmv5_kD9.css +1 -0
  142. package/static/index.html +2 -2
  143. package/static/assets/index-DdklZQ9o.js +0 -338
  144. package/static/assets/index-IVoZ2rM_.css +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/runtime/api/audit.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;GAwBzE"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.auditListHandler = auditListHandler;
4
+ const errors_1 = require("../errors");
5
+ const access_1 = require("../services/access");
6
+ const environment_1 = require("../services/environment");
7
+ const http_1 = require("../utils/http");
8
+ async function auditListHandler(state, request) {
9
+ return (0, environment_1.withEnvContext)(state, request, async (ctx) => {
10
+ (0, access_1.assertCapability)(ctx, "audit.read");
11
+ if (!state.auditDef) {
12
+ throw new errors_1.VertebrNotFoundError("Audit is not configured");
13
+ }
14
+ const query = (0, http_1.requestQuery)(request);
15
+ const limit = query.limit ? Number(query.limit) : undefined;
16
+ const result = await state.auditDef.list({
17
+ ...(limit && Number.isFinite(limit) ? { limit } : {}),
18
+ ...(query.cursor ? { cursor: query.cursor } : {}),
19
+ ...(query.targetType ? { targetType: query.targetType } : {}),
20
+ ...(query.targetId ? { targetId: query.targetId } : {}),
21
+ }, ctx);
22
+ return {
23
+ ok: true,
24
+ environment: ctx.env,
25
+ items: result.items,
26
+ ...(result.cursor ? { cursor: result.cursor } : {}),
27
+ };
28
+ });
29
+ }
30
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/runtime/api/audit.ts"],"names":[],"mappings":";;AAMA,4CAwBC;AA9BD,sCAAiD;AACjD,+CAAsD;AACtD,yDAAyD;AAEzD,wCAA6C;AAEtC,KAAK,UAAU,gBAAgB,CAAC,KAAiB,EAAE,OAAgB;IACxE,OAAO,IAAA,4BAAc,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAClD,IAAA,yBAAgB,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,6BAAoB,CAAC,yBAAyB,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,KAAK,GAAG,IAAA,mBAAY,EAAC,OAAO,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CACtC;YACE,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,EACD,GAAG,CACJ,CAAC;QACF,OAAO;YACL,EAAE,EAAE,IAAI;YACR,WAAW,EAAE,GAAG,CAAC,GAAG;YACpB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import type { AdminState } from "../services/state";
2
- import type { AddonMeta } from "../types/addon";
3
2
  export declare function bootstrapHandler(state: AdminState): Promise<{
4
3
  defaultEnvironment: string;
5
4
  environments: {
@@ -8,6 +7,12 @@ export declare function bootstrapHandler(state: AdminState): Promise<{
8
7
  tone: "neutral" | "warn" | "danger";
9
8
  auth: import("../types").EnvironmentAuthPublic;
10
9
  }[];
10
+ features: {
11
+ audit: boolean;
12
+ revisions: boolean;
13
+ jobs: boolean;
14
+ health: boolean;
15
+ };
11
16
  appearance?: {
12
17
  hostLogoUrl?: string | undefined;
13
18
  hostName?: string | undefined;
@@ -24,7 +29,15 @@ export declare function catalogHandler(state: AdminState, request: unknown): Pro
24
29
  auth: import("../types").EnvironmentAuthPublic;
25
30
  }[];
26
31
  defaultEnvironment: string;
32
+ capabilities: string[];
33
+ features: {
34
+ audit: boolean;
35
+ revisions: boolean;
36
+ jobs: boolean;
37
+ health: boolean;
38
+ };
27
39
  resources: {
40
+ listQuery?: boolean | Record<string, import("../../schema").FieldSchema> | undefined;
28
41
  id: string;
29
42
  label: string;
30
43
  group: string;
@@ -33,6 +46,10 @@ export declare function catalogHandler(state: AdminState, request: unknown): Pro
33
46
  uploads: Record<string, import("../../schema").ResourceUploadMeta> | undefined;
34
47
  }[];
35
48
  configs: {
49
+ relatedAddons?: {
50
+ id: string;
51
+ label: string;
52
+ }[] | undefined;
36
53
  previewPath?: string | undefined;
37
54
  id: string;
38
55
  label: string;
@@ -40,7 +57,16 @@ export declare function catalogHandler(state: AdminState, request: unknown): Pro
40
57
  section: string;
41
58
  group: string;
42
59
  }[];
43
- addons: AddonMeta[];
60
+ addons: {
61
+ schema: Record<string, import("../../schema").FieldSchema>;
62
+ id: string;
63
+ label: string;
64
+ description?: string;
65
+ category?: import("../types/addon").AddonCategory;
66
+ group: string;
67
+ previewPath?: string;
68
+ previewPathRules?: import("../types/config").PreviewPathRule[];
69
+ }[];
44
70
  metrics: {
45
71
  id: string;
46
72
  label: string;
@@ -69,6 +95,20 @@ export declare function catalogHandler(state: AdminState, request: unknown): Pro
69
95
  group: string;
70
96
  canSchedule: boolean;
71
97
  } | null;
98
+ audit: {
99
+ id: string;
100
+ label: string;
101
+ group: string;
102
+ } | null;
103
+ health: {
104
+ id: string;
105
+ label: string;
106
+ } | null;
107
+ jobs: {
108
+ id: string;
109
+ label: string;
110
+ } | null;
111
+ revisionsEnabled: boolean;
72
112
  sync?: {
73
113
  enabled: true;
74
114
  defaultFrom: string;
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/runtime/api/catalog.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA8BhD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU;;;;;;;;;;;;;;GAcvD;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4FvE"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/runtime/api/catalog.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAqCpD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;GAevD;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoKvE"}
@@ -3,11 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.bootstrapHandler = bootstrapHandler;
4
4
  exports.catalogHandler = catalogHandler;
5
5
  const constants_1 = require("../constants");
6
+ const access_1 = require("../services/access");
6
7
  const environment_1 = require("../services/environment");
7
8
  const auth_1 = require("../utils/auth");
8
9
  const uploads_1 = require("../utils/uploads");
9
10
  const sidebar_1 = require("../utils/sidebar");
10
11
  const sync_1 = require("./sync");
12
+ const resolveSchema_1 = require("../utils/resolveSchema");
11
13
  function publicAddons(state) {
12
14
  return state.configs
13
15
  .filter((config) => config.section === "addon")
@@ -20,6 +22,9 @@ function publicAddons(state) {
20
22
  category: meta?.category,
21
23
  group: (0, sidebar_1.sidebarGroup)(config.group, "Add-ons"),
22
24
  ...(config.previewPath ? { previewPath: config.previewPath } : {}),
25
+ ...(config.previewPathRules?.length
26
+ ? { previewPathRules: config.previewPathRules }
27
+ : {}),
23
28
  schema: config.schema,
24
29
  };
25
30
  });
@@ -46,93 +51,147 @@ async function bootstrapHandler(state) {
46
51
  tone: env.tone ?? "neutral",
47
52
  auth: (0, auth_1.publicAuth)(env),
48
53
  })),
54
+ features: (0, access_1.accessFeatures)(state),
49
55
  };
50
56
  }
51
57
  async function catalogHandler(state, request) {
52
58
  const appearance = publicAppearance(state);
53
59
  const sync = (0, sync_1.publicSyncCatalog)(state);
54
- return (0, environment_1.withEnvContext)(state, request, async (ctx) => ({
55
- ok: true,
56
- brand: "Vertebr",
57
- ...(appearance ? { appearance } : {}),
58
- ...(sync ? { sync } : {}),
59
- environment: ctx.env,
60
- environments: state.environments.map((env) => ({
61
- id: env.id,
62
- label: env.label,
63
- tone: env.tone ?? "neutral",
64
- auth: (0, auth_1.publicAuth)(env),
65
- })),
66
- defaultEnvironment: state.defaultEnvironment,
67
- resources: await Promise.all(state.resources.map(async (resource) => ({
68
- id: resource.id,
69
- label: resource.label,
70
- group: (0, sidebar_1.sidebarGroup)(resource.group, "Resources"),
71
- schema: resource.schema,
72
- permissions: resource.resolvePermissions
73
- ? await resource.resolvePermissions(ctx)
74
- : {
75
- create: resource.permissions?.create ?? Boolean(resource.create),
76
- update: resource.permissions?.update ?? Boolean(resource.update),
77
- delete: resource.permissions?.delete ?? Boolean(resource.remove),
78
- },
79
- uploads: (0, uploads_1.publicUploads)(resource),
80
- }))),
81
- configs: state.configs
82
- .filter((config) => config.section !== "addon")
83
- .map((config) => ({
84
- id: config.id,
85
- label: config.label,
86
- schema: config.schema,
87
- section: config.section === "page"
88
- ? "page"
89
- : config.section === "addon"
90
- ? "addon"
91
- : "config",
92
- group: (0, sidebar_1.sidebarGroup)(config.group, config.section === "page" ? "Pages" : "Config"),
93
- ...(config.previewPath ? { previewPath: config.previewPath } : {}),
94
- })),
95
- addons: publicAddons(state),
96
- metrics: state.metricsDef
97
- ? {
98
- id: state.metricsDef.id ?? "overview",
99
- label: state.metricsDef.label ?? "Overview",
100
- group: (0, sidebar_1.sidebarGroup)(state.metricsDef.group, "Analytics"),
101
- }
102
- : null,
103
- gallery: state.galleryDef
104
- ? {
105
- id: state.galleryDef.id ?? "gallery",
106
- label: state.galleryDef.label ?? "Gallery",
107
- group: (0, sidebar_1.sidebarGroup)(state.galleryDef.group, "Resources"),
108
- accept: state.galleryDef.accept?.length
109
- ? state.galleryDef.accept
110
- : constants_1.DEFAULT_UPLOAD_ACCEPT,
111
- maxBytes: state.galleryDef.maxBytes ?? constants_1.DEFAULT_UPLOAD_MAX_BYTES,
112
- canDelete: Boolean(state.galleryDef.remove),
113
- }
114
- : null,
115
- fontLibrary: state.fontLibraryDef
116
- ? {
117
- id: state.fontLibraryDef.id ?? "fonts",
118
- label: state.fontLibraryDef.label ?? "Font Library",
119
- group: (0, sidebar_1.sidebarGroup)(state.fontLibraryDef.group, "Resources"),
120
- accept: state.fontLibraryDef.accept?.length
121
- ? state.fontLibraryDef.accept
122
- : constants_1.DEFAULT_FONT_ACCEPT,
123
- maxBytes: state.fontLibraryDef.maxBytes ?? constants_1.DEFAULT_FONT_MAX_BYTES,
124
- canDelete: Boolean(state.fontLibraryDef.remove),
125
- canImportGoogle: Boolean(state.fontLibraryDef.importGoogle),
126
- }
127
- : null,
128
- emails: state.mailDef
129
- ? {
130
- id: "emails",
131
- label: state.mailDef.label ?? "Emails",
132
- group: (0, sidebar_1.sidebarGroup)(state.mailDef.group, "Growth"),
133
- canSchedule: Boolean(state.mailDef.campaigns?.schedule),
134
- }
135
- : null,
136
- }));
60
+ const features = (0, access_1.accessFeatures)(state);
61
+ return (0, environment_1.withEnvContext)(state, request, async (ctx) => {
62
+ const caps = ctx.capabilities ?? ["*"];
63
+ const can = (cap) => (0, access_1.hasCapability)(caps, cap);
64
+ const resources = can("resource.read")
65
+ ? await Promise.all(state.resources.map(async (resource) => ({
66
+ id: resource.id,
67
+ label: resource.label,
68
+ group: (0, sidebar_1.sidebarGroup)(resource.group, "Resources"),
69
+ schema: resource.schema,
70
+ permissions: resource.resolvePermissions
71
+ ? await resource.resolvePermissions(ctx)
72
+ : {
73
+ create: resource.permissions?.create ?? Boolean(resource.create),
74
+ update: resource.permissions?.update ?? Boolean(resource.update),
75
+ delete: resource.permissions?.delete ?? Boolean(resource.remove),
76
+ },
77
+ uploads: (0, uploads_1.publicUploads)(resource),
78
+ ...(resource.listQuery != null
79
+ ? {
80
+ listQuery: resource.listQuery === true ? true : resource.listQuery,
81
+ }
82
+ : {}),
83
+ })))
84
+ : [];
85
+ const configs = can("config.read") || can("addon.read")
86
+ ? await Promise.all(state.configs
87
+ .filter((config) => config.section !== "addon")
88
+ .filter(() => can("config.read"))
89
+ .map(async (config) => ({
90
+ id: config.id,
91
+ label: config.label,
92
+ schema: await (0, resolveSchema_1.resolveSchemaFields)(config.schema, ctx),
93
+ section: config.section === "page"
94
+ ? "page"
95
+ : config.section === "addon"
96
+ ? "addon"
97
+ : "config",
98
+ group: (0, sidebar_1.sidebarGroup)(config.group, config.section === "page" ? "Pages" : "Config"),
99
+ ...(config.previewPath ? { previewPath: config.previewPath } : {}),
100
+ ...(config.relatedAddons?.length
101
+ ? {
102
+ relatedAddons: config.relatedAddons.map((item) => ({
103
+ id: item.id,
104
+ label: item.label?.trim() || item.id,
105
+ })),
106
+ }
107
+ : {}),
108
+ })))
109
+ : [];
110
+ const addons = can("addon.read")
111
+ ? await Promise.all(publicAddons(state).map(async (addon) => ({
112
+ ...addon,
113
+ schema: await (0, resolveSchema_1.resolveSchemaFields)(addon.schema, ctx),
114
+ })))
115
+ : [];
116
+ return {
117
+ ok: true,
118
+ brand: "Vertebr",
119
+ ...(appearance ? { appearance } : {}),
120
+ ...(sync && can("sync.run") ? { sync } : {}),
121
+ environment: ctx.env,
122
+ environments: state.environments.map((env) => ({
123
+ id: env.id,
124
+ label: env.label,
125
+ tone: env.tone ?? "neutral",
126
+ auth: (0, auth_1.publicAuth)(env),
127
+ })),
128
+ defaultEnvironment: state.defaultEnvironment,
129
+ capabilities: caps,
130
+ features,
131
+ resources,
132
+ configs,
133
+ addons,
134
+ metrics: state.metricsDef && can("overview.read")
135
+ ? {
136
+ id: state.metricsDef.id ?? "overview",
137
+ label: state.metricsDef.label ?? "Overview",
138
+ group: (0, sidebar_1.sidebarGroup)(state.metricsDef.group, "Analytics"),
139
+ }
140
+ : null,
141
+ gallery: state.galleryDef && can("gallery.read")
142
+ ? {
143
+ id: state.galleryDef.id ?? "gallery",
144
+ label: state.galleryDef.label ?? "Gallery",
145
+ group: (0, sidebar_1.sidebarGroup)(state.galleryDef.group, "Resources"),
146
+ accept: state.galleryDef.accept?.length
147
+ ? state.galleryDef.accept
148
+ : constants_1.DEFAULT_UPLOAD_ACCEPT,
149
+ maxBytes: state.galleryDef.maxBytes ?? constants_1.DEFAULT_UPLOAD_MAX_BYTES,
150
+ canDelete: Boolean(state.galleryDef.remove),
151
+ }
152
+ : null,
153
+ fontLibrary: state.fontLibraryDef && can("fonts.read")
154
+ ? {
155
+ id: state.fontLibraryDef.id ?? "fonts",
156
+ label: state.fontLibraryDef.label ?? "Font Library",
157
+ group: (0, sidebar_1.sidebarGroup)(state.fontLibraryDef.group, "Resources"),
158
+ accept: state.fontLibraryDef.accept?.length
159
+ ? state.fontLibraryDef.accept
160
+ : constants_1.DEFAULT_FONT_ACCEPT,
161
+ maxBytes: state.fontLibraryDef.maxBytes ?? constants_1.DEFAULT_FONT_MAX_BYTES,
162
+ canDelete: Boolean(state.fontLibraryDef.remove),
163
+ canImportGoogle: Boolean(state.fontLibraryDef.importGoogle),
164
+ }
165
+ : null,
166
+ emails: state.mailDef && can("emails.read")
167
+ ? {
168
+ id: "emails",
169
+ label: state.mailDef.label ?? "Emails",
170
+ group: (0, sidebar_1.sidebarGroup)(state.mailDef.group, "Growth"),
171
+ canSchedule: Boolean(state.mailDef.campaigns?.schedule),
172
+ }
173
+ : null,
174
+ audit: state.auditDef && can("audit.read")
175
+ ? {
176
+ id: "audit",
177
+ label: "Audit",
178
+ group: (0, sidebar_1.sidebarGroup)(undefined, "Analytics"),
179
+ }
180
+ : null,
181
+ health: state.healthDef && can("health.read")
182
+ ? {
183
+ id: "health",
184
+ label: "Health",
185
+ }
186
+ : null,
187
+ jobs: state.jobsDef && can("jobs.read")
188
+ ? {
189
+ id: "jobs",
190
+ label: "Jobs",
191
+ }
192
+ : null,
193
+ revisionsEnabled: Boolean(state.revisionDef),
194
+ };
195
+ });
137
196
  }
138
197
  //# sourceMappingURL=catalog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/runtime/api/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/runtime/api/catalog.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,9 @@
1
1
  import type { AdminState } from "../services/state";
2
2
  export declare function getConfigHandler(state: AdminState, request: unknown): Promise<{
3
+ revisionsEnabled: boolean;
4
+ activeRevisionId?: string | undefined;
5
+ draftRevisionId?: string | undefined;
6
+ etag?: string | undefined;
3
7
  id: string;
4
8
  label: string;
5
9
  schema: Record<string, import("../..").FieldSchema>;
@@ -7,11 +11,23 @@ export declare function getConfigHandler(state: AdminState, request: unknown): P
7
11
  value: Record<string, unknown>;
8
12
  }>;
9
13
  export declare function setConfigHandler(state: AdminState, request: unknown): Promise<{
14
+ activeRevisionId: string;
15
+ revisionsEnabled: boolean;
16
+ draftRevisionId?: string | undefined;
10
17
  ok: boolean;
11
18
  id: string;
12
19
  label: string;
13
20
  schema: Record<string, import("../..").FieldSchema>;
14
21
  environment: string;
15
22
  value: Record<string, unknown>;
23
+ revision: import("../types").Revision;
24
+ } | {
25
+ ok: boolean;
26
+ id: string;
27
+ label: string;
28
+ schema: Record<string, import("../..").FieldSchema>;
29
+ environment: string;
30
+ value: Record<string, unknown>;
31
+ revisionsEnabled: boolean;
16
32
  }>;
17
33
  //# sourceMappingURL=configs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"configs.d.ts","sourceRoot":"","sources":["../../../src/runtime/api/configs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;;GAgBzE;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;;;GAoBzE"}
1
+ {"version":3,"file":"configs.d.ts","sourceRoot":"","sources":["../../../src/runtime/api/configs.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA4BpD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;;;;;;GA2CzE;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;;GAyIzE"}
@@ -3,23 +3,67 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getConfigHandler = getConfigHandler;
4
4
  exports.setConfigHandler = setConfigHandler;
5
5
  const errors_1 = require("../errors");
6
+ const access_1 = require("../services/access");
7
+ const audit_1 = require("../services/audit");
6
8
  const environment_1 = require("../services/environment");
7
9
  const registry_1 = require("../services/registry");
10
+ const http_1 = require("../utils/http");
8
11
  const request_1 = require("./request");
12
+ const resolveSchema_1 = require("../utils/resolveSchema");
13
+ function isAddon(state, id) {
14
+ return state.controlMeta.get(id)?.addon === true;
15
+ }
16
+ function readCap(state, id) {
17
+ return isAddon(state, id) ? "addon.read" : "config.read";
18
+ }
19
+ function writeCap(state, id) {
20
+ return isAddon(state, id) ? "addon.write" : "config.write";
21
+ }
22
+ function publishCap(state, id) {
23
+ return isAddon(state, id) ? "addon.publish" : "config.publish";
24
+ }
9
25
  async function getConfigHandler(state, request) {
10
26
  return (0, environment_1.withEnvContext)(state, request, async (ctx) => {
11
27
  const id = (0, request_1.requestParam)(request, "id");
12
28
  if (!id) {
13
29
  throw new errors_1.VertebrNotFoundError("Missing config id");
14
30
  }
31
+ (0, access_1.assertCapability)(ctx, readCap(state, id));
15
32
  const config = (0, registry_1.findConfig)(state, id);
16
- const value = await config.get(ctx);
33
+ let value = await config.get(ctx);
34
+ let etag;
35
+ let draftRevisionId;
36
+ let activeRevisionId;
37
+ if (state.revisionDef) {
38
+ if (state.revisionDef.liveEtag) {
39
+ etag = (await state.revisionDef.liveEtag(id, ctx.env, ctx)) ?? undefined;
40
+ }
41
+ const revisions = await state.revisionDef.list(id, ctx.env, ctx);
42
+ const active = revisions.find((r) => r.active) ??
43
+ revisions.find((r) => r.status === "draft");
44
+ if (active) {
45
+ activeRevisionId = active.id;
46
+ if (active.status === "draft")
47
+ draftRevisionId = active.id;
48
+ const full = await state.revisionDef.get(id, ctx.env, active.id, ctx);
49
+ if (full)
50
+ value = full.value;
51
+ }
52
+ if (!etag) {
53
+ const published = revisions.find((r) => r.status === "published");
54
+ etag = published?.id;
55
+ }
56
+ }
17
57
  return {
18
58
  id: config.id,
19
59
  label: config.label,
20
- schema: config.schema,
60
+ schema: await (0, resolveSchema_1.resolveSchemaFields)(config.schema, ctx),
21
61
  environment: ctx.env,
22
62
  value,
63
+ ...(etag ? { etag } : {}),
64
+ ...(draftRevisionId ? { draftRevisionId } : {}),
65
+ ...(activeRevisionId ? { activeRevisionId } : {}),
66
+ revisionsEnabled: Boolean(state.revisionDef),
23
67
  };
24
68
  });
25
69
  }
@@ -31,16 +75,112 @@ async function setConfigHandler(state, request) {
31
75
  }
32
76
  const config = (0, registry_1.findConfig)(state, id);
33
77
  const value = (0, request_1.requestObjectPayload)(request);
34
- await config.set(value, ctx);
78
+ const query = (0, http_1.requestQuery)(request);
79
+ const publishNow = query.publish === "1" ||
80
+ query.publish === "true" ||
81
+ value.publish === true;
82
+ const payload = value.value && typeof value.value === "object" && !Array.isArray(value.value)
83
+ ? value.value
84
+ : (() => {
85
+ const { publish: _p, baseRevisionId: _b, label: _l, ...rest } = value;
86
+ return rest;
87
+ })();
88
+ const ifMatch = (0, http_1.headerValue)((0, request_1.asRequest)(request).headers, "if-match") ??
89
+ (typeof value.baseRevisionId === "string"
90
+ ? value.baseRevisionId
91
+ : undefined);
92
+ if (state.revisionDef) {
93
+ if (ifMatch && state.revisionDef.liveEtag) {
94
+ const etag = await state.revisionDef.liveEtag(id, ctx.env, ctx);
95
+ if (etag && etag !== ifMatch) {
96
+ throw new errors_1.VertebrConflictError(`Config was modified (etag ${etag}). Reload and try again.`);
97
+ }
98
+ }
99
+ (0, access_1.assertCapability)(ctx, writeCap(state, id));
100
+ const label = typeof value.label === "string" ? value.label : undefined;
101
+ const revision = await state.revisionDef.save(id, ctx.env, { value: payload, ...(label ? { label } : {}) }, ctx);
102
+ let resultRevision = revision;
103
+ if (publishNow) {
104
+ (0, access_1.assertCapability)(ctx, publishCap(state, id));
105
+ resultRevision = await state.revisionDef.publish(id, ctx.env, revision.id, ctx);
106
+ await config.set(resultRevision.value, ctx);
107
+ await (0, audit_1.afterMutation)(state, ctx, {
108
+ audit: {
109
+ action: "config.publish",
110
+ targetType: "config",
111
+ targetId: id,
112
+ summary: `Published revision ${resultRevision.id}`,
113
+ meta: { revisionId: resultRevision.id },
114
+ },
115
+ event: {
116
+ type: "config.published",
117
+ controlId: id,
118
+ env: ctx.env,
119
+ actor: (0, audit_1.eventActor)(ctx),
120
+ revisionId: resultRevision.id,
121
+ },
122
+ });
123
+ }
124
+ else {
125
+ await (0, audit_1.afterMutation)(state, ctx, {
126
+ audit: {
127
+ action: "config.revision.save",
128
+ targetType: "config",
129
+ targetId: id,
130
+ summary: `Saved draft revision ${revision.id}`,
131
+ meta: { revisionId: revision.id },
132
+ },
133
+ event: {
134
+ type: "config.saved",
135
+ controlId: id,
136
+ env: ctx.env,
137
+ actor: (0, audit_1.eventActor)(ctx),
138
+ revisionId: revision.id,
139
+ published: false,
140
+ },
141
+ });
142
+ }
143
+ return {
144
+ ok: true,
145
+ id: config.id,
146
+ label: config.label,
147
+ schema: await (0, resolveSchema_1.resolveSchemaFields)(config.schema, ctx),
148
+ environment: ctx.env,
149
+ value: resultRevision.value,
150
+ revision: resultRevision,
151
+ ...(resultRevision.status === "draft"
152
+ ? { draftRevisionId: resultRevision.id }
153
+ : {}),
154
+ activeRevisionId: resultRevision.id,
155
+ revisionsEnabled: true,
156
+ };
157
+ }
158
+ (0, access_1.assertCapability)(ctx, writeCap(state, id));
159
+ await config.set(payload, ctx);
35
160
  const nextValue = await config.get(ctx);
36
- // Full ConfigResponse so clients can cache without a follow-up GET.
161
+ await (0, audit_1.afterMutation)(state, ctx, {
162
+ audit: {
163
+ action: "config.set",
164
+ targetType: "config",
165
+ targetId: id,
166
+ summary: `Updated ${config.label}`,
167
+ },
168
+ event: {
169
+ type: "config.saved",
170
+ controlId: id,
171
+ env: ctx.env,
172
+ actor: (0, audit_1.eventActor)(ctx),
173
+ published: true,
174
+ },
175
+ });
37
176
  return {
38
177
  ok: true,
39
178
  id: config.id,
40
179
  label: config.label,
41
- schema: config.schema,
180
+ schema: await (0, resolveSchema_1.resolveSchemaFields)(config.schema, ctx),
42
181
  environment: ctx.env,
43
182
  value: nextValue,
183
+ revisionsEnabled: false,
44
184
  };
45
185
  });
46
186
  }