@vertebr/admin 0.8.1 → 0.10.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 (148) 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 -4
  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 +80 -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 +56 -4
  31. package/dist/runtime/api/catalog.d.ts.map +1 -1
  32. package/dist/runtime/api/catalog.js +155 -74
  33. package/dist/runtime/api/catalog.js.map +1 -1
  34. package/dist/runtime/api/configs.d.ts +14 -0
  35. package/dist/runtime/api/configs.d.ts.map +1 -1
  36. package/dist/runtime/api/configs.js +128 -2
  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 +12 -4
  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 +62 -40
  63. package/dist/runtime/api/routes.js.map +1 -1
  64. package/dist/runtime/api/sync.d.ts +19 -0
  65. package/dist/runtime/api/sync.d.ts.map +1 -0
  66. package/dist/runtime/api/sync.js +213 -0
  67. package/dist/runtime/api/sync.js.map +1 -0
  68. package/dist/runtime/createAdmin.d.ts.map +1 -1
  69. package/dist/runtime/createAdmin.js +82 -2
  70. package/dist/runtime/createAdmin.js.map +1 -1
  71. package/dist/runtime/errors.d.ts +8 -0
  72. package/dist/runtime/errors.d.ts.map +1 -1
  73. package/dist/runtime/errors.js +17 -1
  74. package/dist/runtime/errors.js.map +1 -1
  75. package/dist/runtime/services/access.d.ts +14 -0
  76. package/dist/runtime/services/access.d.ts.map +1 -0
  77. package/dist/runtime/services/access.js +49 -0
  78. package/dist/runtime/services/access.js.map +1 -0
  79. package/dist/runtime/services/audit.d.ts +16 -0
  80. package/dist/runtime/services/audit.d.ts.map +1 -0
  81. package/dist/runtime/services/audit.js +43 -0
  82. package/dist/runtime/services/audit.js.map +1 -0
  83. package/dist/runtime/services/environment.d.ts +4 -1
  84. package/dist/runtime/services/environment.d.ts.map +1 -1
  85. package/dist/runtime/services/environment.js +16 -2
  86. package/dist/runtime/services/environment.js.map +1 -1
  87. package/dist/runtime/services/state.d.ts +17 -0
  88. package/dist/runtime/services/state.d.ts.map +1 -1
  89. package/dist/runtime/types/access.d.ts +28 -0
  90. package/dist/runtime/types/access.d.ts.map +1 -0
  91. package/dist/runtime/types/access.js +3 -0
  92. package/dist/runtime/types/access.js.map +1 -0
  93. package/dist/runtime/types/actions.d.ts +2 -0
  94. package/dist/runtime/types/actions.d.ts.map +1 -1
  95. package/dist/runtime/types/addon.d.ts +31 -0
  96. package/dist/runtime/types/addon.d.ts.map +1 -0
  97. package/dist/runtime/types/addon.js +9 -0
  98. package/dist/runtime/types/addon.js.map +1 -0
  99. package/dist/runtime/types/admin.d.ts +50 -0
  100. package/dist/runtime/types/admin.d.ts.map +1 -1
  101. package/dist/runtime/types/audit.d.ts +35 -0
  102. package/dist/runtime/types/audit.d.ts.map +1 -0
  103. package/dist/runtime/types/audit.js +3 -0
  104. package/dist/runtime/types/audit.js.map +1 -0
  105. package/dist/runtime/types/auth.d.ts +6 -0
  106. package/dist/runtime/types/auth.d.ts.map +1 -1
  107. package/dist/runtime/types/config.d.ts +1 -1
  108. package/dist/runtime/types/config.d.ts.map +1 -1
  109. package/dist/runtime/types/events.d.ts +63 -0
  110. package/dist/runtime/types/events.d.ts.map +1 -0
  111. package/dist/runtime/types/events.js +3 -0
  112. package/dist/runtime/types/events.js.map +1 -0
  113. package/dist/runtime/types/health.d.ts +18 -0
  114. package/dist/runtime/types/health.d.ts.map +1 -0
  115. package/dist/runtime/types/health.js +3 -0
  116. package/dist/runtime/types/health.js.map +1 -0
  117. package/dist/runtime/types/index.d.ts +10 -2
  118. package/dist/runtime/types/index.d.ts.map +1 -1
  119. package/dist/runtime/types/jobs.d.ts +21 -0
  120. package/dist/runtime/types/jobs.d.ts.map +1 -0
  121. package/dist/runtime/types/jobs.js +3 -0
  122. package/dist/runtime/types/jobs.js.map +1 -0
  123. package/dist/runtime/types/resource.d.ts +30 -1
  124. package/dist/runtime/types/resource.d.ts.map +1 -1
  125. package/dist/runtime/types/revisions.d.ts +33 -0
  126. package/dist/runtime/types/revisions.d.ts.map +1 -0
  127. package/dist/runtime/types/revisions.js +3 -0
  128. package/dist/runtime/types/revisions.js.map +1 -0
  129. package/dist/runtime/types/sync.d.ts +99 -0
  130. package/dist/runtime/types/sync.d.ts.map +1 -0
  131. package/dist/runtime/types/sync.js +3 -0
  132. package/dist/runtime/types/sync.js.map +1 -0
  133. package/dist/runtime/utils/http.d.ts +2 -0
  134. package/dist/runtime/utils/http.d.ts.map +1 -1
  135. package/dist/runtime/utils/http.js +24 -0
  136. package/dist/runtime/utils/http.js.map +1 -1
  137. package/dist/schema.d.ts +20 -1
  138. package/dist/schema.d.ts.map +1 -1
  139. package/dist/store.d.ts +6 -0
  140. package/dist/store.d.ts.map +1 -1
  141. package/dist/store.js +74 -0
  142. package/dist/store.js.map +1 -1
  143. package/package.json +1 -1
  144. package/static/assets/index-DIdeXSPR.js +340 -0
  145. package/static/assets/index-oaieFDp4.css +1 -0
  146. package/static/index.html +2 -2
  147. package/static/assets/index-D5BVgGQP.js +0 -337
  148. package/static/assets/index-DORD_jLa.css +0 -1
@@ -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,7 +1,6 @@
1
1
  import type { AdminState } from "../services/state";
2
+ import type { AddonMeta } from "../types/addon";
2
3
  export declare function bootstrapHandler(state: AdminState): Promise<{
3
- ok: boolean;
4
- brand: string;
5
4
  defaultEnvironment: string;
6
5
  environments: {
7
6
  id: string;
@@ -9,10 +8,20 @@ export declare function bootstrapHandler(state: AdminState): Promise<{
9
8
  tone: "neutral" | "warn" | "danger";
10
9
  auth: import("../types").EnvironmentAuthPublic;
11
10
  }[];
12
- }>;
13
- export declare function catalogHandler(state: AdminState, request: unknown): Promise<{
11
+ features: {
12
+ audit: boolean;
13
+ revisions: boolean;
14
+ jobs: boolean;
15
+ health: boolean;
16
+ };
17
+ appearance?: {
18
+ hostLogoUrl?: string | undefined;
19
+ hostName?: string | undefined;
20
+ } | undefined;
14
21
  ok: boolean;
15
22
  brand: string;
23
+ }>;
24
+ export declare function catalogHandler(state: AdminState, request: unknown): Promise<{
16
25
  environment: string;
17
26
  environments: {
18
27
  id: string;
@@ -21,7 +30,15 @@ export declare function catalogHandler(state: AdminState, request: unknown): Pro
21
30
  auth: import("../types").EnvironmentAuthPublic;
22
31
  }[];
23
32
  defaultEnvironment: string;
33
+ capabilities: string[];
34
+ features: {
35
+ audit: boolean;
36
+ revisions: boolean;
37
+ jobs: boolean;
38
+ health: boolean;
39
+ };
24
40
  resources: {
41
+ listQuery?: boolean | Record<string, import("../../schema").FieldSchema> | undefined;
25
42
  id: string;
26
43
  label: string;
27
44
  group: string;
@@ -37,6 +54,7 @@ export declare function catalogHandler(state: AdminState, request: unknown): Pro
37
54
  section: string;
38
55
  group: string;
39
56
  }[];
57
+ addons: AddonMeta[];
40
58
  metrics: {
41
59
  id: string;
42
60
  label: string;
@@ -65,5 +83,39 @@ export declare function catalogHandler(state: AdminState, request: unknown): Pro
65
83
  group: string;
66
84
  canSchedule: boolean;
67
85
  } | null;
86
+ audit: {
87
+ id: string;
88
+ label: string;
89
+ group: string;
90
+ } | null;
91
+ health: {
92
+ id: string;
93
+ label: string;
94
+ } | null;
95
+ jobs: {
96
+ id: string;
97
+ label: string;
98
+ } | null;
99
+ revisionsEnabled: boolean;
100
+ sync?: {
101
+ enabled: true;
102
+ defaultFrom: string;
103
+ defaultTo: string[];
104
+ targets: {
105
+ id: string;
106
+ label: string;
107
+ description: string | undefined;
108
+ group: string | undefined;
109
+ defaultSelected: boolean;
110
+ risk: import("../types").SyncTargetRisk;
111
+ }[];
112
+ excluded: import("../types").EnvironmentSyncExcluded[];
113
+ } | undefined;
114
+ appearance?: {
115
+ hostLogoUrl?: string | undefined;
116
+ hostName?: string | undefined;
117
+ } | undefined;
118
+ ok: boolean;
119
+ brand: string;
68
120
  }>;
69
121
  //# sourceMappingURL=catalog.d.ts.map
@@ -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;AAKpD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU;;;;;;;;;;GAYvD;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgFvE"}
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;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AA8BhD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU;;;;;;;;;;;;;;;;;;;;GAevD;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmJvE"}
@@ -3,14 +3,43 @@ 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");
11
+ const sync_1 = require("./sync");
12
+ function publicAddons(state) {
13
+ return state.configs
14
+ .filter((config) => config.section === "addon")
15
+ .map((config) => {
16
+ const meta = state.controlMeta.get(config.id);
17
+ return {
18
+ id: config.id,
19
+ label: config.label,
20
+ description: meta?.description,
21
+ category: meta?.category,
22
+ group: (0, sidebar_1.sidebarGroup)(config.group, "Add-ons"),
23
+ ...(config.previewPath ? { previewPath: config.previewPath } : {}),
24
+ schema: config.schema,
25
+ };
26
+ });
27
+ }
28
+ function publicAppearance(state) {
29
+ const appearance = state.options.appearance;
30
+ if (!appearance?.hostName && !appearance?.hostLogoUrl)
31
+ return undefined;
32
+ return {
33
+ ...(appearance.hostName ? { hostName: appearance.hostName } : {}),
34
+ ...(appearance.hostLogoUrl ? { hostLogoUrl: appearance.hostLogoUrl } : {}),
35
+ };
36
+ }
10
37
  async function bootstrapHandler(state) {
38
+ const appearance = publicAppearance(state);
11
39
  return {
12
40
  ok: true,
13
41
  brand: "Vertebr",
42
+ ...(appearance ? { appearance } : {}),
14
43
  defaultEnvironment: state.defaultEnvironment,
15
44
  environments: state.environments.map((env) => ({
16
45
  id: env.id,
@@ -18,82 +47,134 @@ async function bootstrapHandler(state) {
18
47
  tone: env.tone ?? "neutral",
19
48
  auth: (0, auth_1.publicAuth)(env),
20
49
  })),
50
+ features: (0, access_1.accessFeatures)(state),
21
51
  };
22
52
  }
23
53
  async function catalogHandler(state, request) {
24
- return (0, environment_1.withEnvContext)(state, request, async (ctx) => ({
25
- ok: true,
26
- brand: "Vertebr",
27
- environment: ctx.env,
28
- environments: state.environments.map((env) => ({
29
- id: env.id,
30
- label: env.label,
31
- tone: env.tone ?? "neutral",
32
- auth: (0, auth_1.publicAuth)(env),
33
- })),
34
- defaultEnvironment: state.defaultEnvironment,
35
- resources: await Promise.all(state.resources.map(async (resource) => ({
36
- id: resource.id,
37
- label: resource.label,
38
- group: (0, sidebar_1.sidebarGroup)(resource.group, "Resources"),
39
- schema: resource.schema,
40
- permissions: resource.resolvePermissions
41
- ? await resource.resolvePermissions(ctx)
42
- : {
43
- create: resource.permissions?.create ?? Boolean(resource.create),
44
- update: resource.permissions?.update ?? Boolean(resource.update),
45
- delete: resource.permissions?.delete ?? Boolean(resource.remove),
46
- },
47
- uploads: (0, uploads_1.publicUploads)(resource),
48
- }))),
49
- configs: state.configs.map((config) => ({
50
- id: config.id,
51
- label: config.label,
52
- schema: config.schema,
53
- section: config.section === "page" ? "page" : "config",
54
- group: (0, sidebar_1.sidebarGroup)(config.group, config.section === "page" ? "Pages" : "Config"),
55
- ...(config.previewPath ? { previewPath: config.previewPath } : {}),
56
- })),
57
- metrics: state.metricsDef
58
- ? {
59
- id: state.metricsDef.id ?? "overview",
60
- label: state.metricsDef.label ?? "Overview",
61
- group: (0, sidebar_1.sidebarGroup)(state.metricsDef.group, "Analytics"),
62
- }
63
- : null,
64
- gallery: state.galleryDef
65
- ? {
66
- id: state.galleryDef.id ?? "gallery",
67
- label: state.galleryDef.label ?? "Gallery",
68
- group: (0, sidebar_1.sidebarGroup)(state.galleryDef.group, "Resources"),
69
- accept: state.galleryDef.accept?.length
70
- ? state.galleryDef.accept
71
- : constants_1.DEFAULT_UPLOAD_ACCEPT,
72
- maxBytes: state.galleryDef.maxBytes ?? constants_1.DEFAULT_UPLOAD_MAX_BYTES,
73
- canDelete: Boolean(state.galleryDef.remove),
74
- }
75
- : null,
76
- fontLibrary: state.fontLibraryDef
77
- ? {
78
- id: state.fontLibraryDef.id ?? "fonts",
79
- label: state.fontLibraryDef.label ?? "Font Library",
80
- group: (0, sidebar_1.sidebarGroup)(state.fontLibraryDef.group, "Resources"),
81
- accept: state.fontLibraryDef.accept?.length
82
- ? state.fontLibraryDef.accept
83
- : constants_1.DEFAULT_FONT_ACCEPT,
84
- maxBytes: state.fontLibraryDef.maxBytes ?? constants_1.DEFAULT_FONT_MAX_BYTES,
85
- canDelete: Boolean(state.fontLibraryDef.remove),
86
- canImportGoogle: Boolean(state.fontLibraryDef.importGoogle),
87
- }
88
- : null,
89
- emails: state.mailDef
90
- ? {
91
- id: "emails",
92
- label: state.mailDef.label ?? "Emails",
93
- group: (0, sidebar_1.sidebarGroup)(state.mailDef.group, "Growth"),
94
- canSchedule: Boolean(state.mailDef.campaigns?.schedule),
95
- }
96
- : null,
97
- }));
54
+ const appearance = publicAppearance(state);
55
+ const sync = (0, sync_1.publicSyncCatalog)(state);
56
+ const features = (0, access_1.accessFeatures)(state);
57
+ return (0, environment_1.withEnvContext)(state, request, async (ctx) => {
58
+ const caps = ctx.capabilities ?? ["*"];
59
+ const can = (cap) => (0, access_1.hasCapability)(caps, cap);
60
+ const resources = can("resource.read")
61
+ ? await Promise.all(state.resources.map(async (resource) => ({
62
+ id: resource.id,
63
+ label: resource.label,
64
+ group: (0, sidebar_1.sidebarGroup)(resource.group, "Resources"),
65
+ schema: resource.schema,
66
+ permissions: resource.resolvePermissions
67
+ ? await resource.resolvePermissions(ctx)
68
+ : {
69
+ create: resource.permissions?.create ?? Boolean(resource.create),
70
+ update: resource.permissions?.update ?? Boolean(resource.update),
71
+ delete: resource.permissions?.delete ?? Boolean(resource.remove),
72
+ },
73
+ uploads: (0, uploads_1.publicUploads)(resource),
74
+ ...(resource.listQuery != null
75
+ ? {
76
+ listQuery: resource.listQuery === true ? true : resource.listQuery,
77
+ }
78
+ : {}),
79
+ })))
80
+ : [];
81
+ const configs = can("config.read") || can("addon.read")
82
+ ? state.configs
83
+ .filter((config) => config.section !== "addon")
84
+ .filter(() => can("config.read"))
85
+ .map((config) => ({
86
+ id: config.id,
87
+ label: config.label,
88
+ schema: config.schema,
89
+ section: config.section === "page"
90
+ ? "page"
91
+ : config.section === "addon"
92
+ ? "addon"
93
+ : "config",
94
+ group: (0, sidebar_1.sidebarGroup)(config.group, config.section === "page" ? "Pages" : "Config"),
95
+ ...(config.previewPath ? { previewPath: config.previewPath } : {}),
96
+ }))
97
+ : [];
98
+ const addons = can("addon.read") ? publicAddons(state) : [];
99
+ return {
100
+ ok: true,
101
+ brand: "Vertebr",
102
+ ...(appearance ? { appearance } : {}),
103
+ ...(sync && can("sync.run") ? { sync } : {}),
104
+ environment: ctx.env,
105
+ environments: state.environments.map((env) => ({
106
+ id: env.id,
107
+ label: env.label,
108
+ tone: env.tone ?? "neutral",
109
+ auth: (0, auth_1.publicAuth)(env),
110
+ })),
111
+ defaultEnvironment: state.defaultEnvironment,
112
+ capabilities: caps,
113
+ features,
114
+ resources,
115
+ configs,
116
+ addons,
117
+ metrics: state.metricsDef && can("overview.read")
118
+ ? {
119
+ id: state.metricsDef.id ?? "overview",
120
+ label: state.metricsDef.label ?? "Overview",
121
+ group: (0, sidebar_1.sidebarGroup)(state.metricsDef.group, "Analytics"),
122
+ }
123
+ : null,
124
+ gallery: state.galleryDef && can("gallery.read")
125
+ ? {
126
+ id: state.galleryDef.id ?? "gallery",
127
+ label: state.galleryDef.label ?? "Gallery",
128
+ group: (0, sidebar_1.sidebarGroup)(state.galleryDef.group, "Resources"),
129
+ accept: state.galleryDef.accept?.length
130
+ ? state.galleryDef.accept
131
+ : constants_1.DEFAULT_UPLOAD_ACCEPT,
132
+ maxBytes: state.galleryDef.maxBytes ?? constants_1.DEFAULT_UPLOAD_MAX_BYTES,
133
+ canDelete: Boolean(state.galleryDef.remove),
134
+ }
135
+ : null,
136
+ fontLibrary: state.fontLibraryDef && can("fonts.read")
137
+ ? {
138
+ id: state.fontLibraryDef.id ?? "fonts",
139
+ label: state.fontLibraryDef.label ?? "Font Library",
140
+ group: (0, sidebar_1.sidebarGroup)(state.fontLibraryDef.group, "Resources"),
141
+ accept: state.fontLibraryDef.accept?.length
142
+ ? state.fontLibraryDef.accept
143
+ : constants_1.DEFAULT_FONT_ACCEPT,
144
+ maxBytes: state.fontLibraryDef.maxBytes ?? constants_1.DEFAULT_FONT_MAX_BYTES,
145
+ canDelete: Boolean(state.fontLibraryDef.remove),
146
+ canImportGoogle: Boolean(state.fontLibraryDef.importGoogle),
147
+ }
148
+ : null,
149
+ emails: state.mailDef && can("emails.read")
150
+ ? {
151
+ id: "emails",
152
+ label: state.mailDef.label ?? "Emails",
153
+ group: (0, sidebar_1.sidebarGroup)(state.mailDef.group, "Growth"),
154
+ canSchedule: Boolean(state.mailDef.campaigns?.schedule),
155
+ }
156
+ : null,
157
+ audit: state.auditDef && can("audit.read")
158
+ ? {
159
+ id: "audit",
160
+ label: "Audit",
161
+ group: (0, sidebar_1.sidebarGroup)(undefined, "Analytics"),
162
+ }
163
+ : null,
164
+ health: state.healthDef && can("health.read")
165
+ ? {
166
+ id: "health",
167
+ label: "Health",
168
+ }
169
+ : null,
170
+ jobs: state.jobsDef && can("jobs.read")
171
+ ? {
172
+ id: "jobs",
173
+ label: "Jobs",
174
+ }
175
+ : null,
176
+ revisionsEnabled: Boolean(state.revisionDef),
177
+ };
178
+ });
98
179
  }
99
180
  //# 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,8 @@
1
1
  import type { AdminState } from "../services/state";
2
2
  export declare function getConfigHandler(state: AdminState, request: unknown): Promise<{
3
+ revisionsEnabled: boolean;
4
+ draftRevisionId?: string | undefined;
5
+ etag?: string | undefined;
3
6
  id: string;
4
7
  label: string;
5
8
  schema: Record<string, import("../..").FieldSchema>;
@@ -13,5 +16,16 @@ export declare function setConfigHandler(state: AdminState, request: unknown): P
13
16
  schema: Record<string, import("../..").FieldSchema>;
14
17
  environment: string;
15
18
  value: Record<string, unknown>;
19
+ revision: import("../types").Revision;
20
+ revisionsEnabled: boolean;
21
+ } | {
22
+ ok: boolean;
23
+ id: string;
24
+ label: string;
25
+ schema: Record<string, import("../..").FieldSchema>;
26
+ environment: string;
27
+ value: Record<string, unknown>;
28
+ revisionsEnabled: boolean;
29
+ revision?: undefined;
16
30
  }>;
17
31
  //# 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;AA2BpD,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;;;;;GAkCzE;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;GAqIzE"}
@@ -3,23 +3,57 @@ 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
+ function isAddon(state, id) {
13
+ return state.controlMeta.get(id)?.addon === true;
14
+ }
15
+ function readCap(state, id) {
16
+ return isAddon(state, id) ? "addon.read" : "config.read";
17
+ }
18
+ function writeCap(state, id) {
19
+ return isAddon(state, id) ? "addon.write" : "config.write";
20
+ }
21
+ function publishCap(state, id) {
22
+ return isAddon(state, id) ? "addon.publish" : "config.publish";
23
+ }
9
24
  async function getConfigHandler(state, request) {
10
25
  return (0, environment_1.withEnvContext)(state, request, async (ctx) => {
11
26
  const id = (0, request_1.requestParam)(request, "id");
12
27
  if (!id) {
13
28
  throw new errors_1.VertebrNotFoundError("Missing config id");
14
29
  }
30
+ (0, access_1.assertCapability)(ctx, readCap(state, id));
15
31
  const config = (0, registry_1.findConfig)(state, id);
16
32
  const value = await config.get(ctx);
33
+ let etag;
34
+ let draftRevisionId;
35
+ if (state.revisionDef) {
36
+ if (state.revisionDef.liveEtag) {
37
+ etag = (await state.revisionDef.liveEtag(id, ctx.env, ctx)) ?? undefined;
38
+ }
39
+ const revisions = await state.revisionDef.list(id, ctx.env, ctx);
40
+ const draft = revisions.find((r) => r.status === "draft");
41
+ if (draft)
42
+ draftRevisionId = draft.id;
43
+ if (!etag) {
44
+ const published = revisions.find((r) => r.status === "published");
45
+ etag = published?.id;
46
+ }
47
+ }
17
48
  return {
18
49
  id: config.id,
19
50
  label: config.label,
20
51
  schema: config.schema,
21
52
  environment: ctx.env,
22
53
  value,
54
+ ...(etag ? { etag } : {}),
55
+ ...(draftRevisionId ? { draftRevisionId } : {}),
56
+ revisionsEnabled: Boolean(state.revisionDef),
23
57
  };
24
58
  });
25
59
  }
@@ -31,9 +65,100 @@ async function setConfigHandler(state, request) {
31
65
  }
32
66
  const config = (0, registry_1.findConfig)(state, id);
33
67
  const value = (0, request_1.requestObjectPayload)(request);
34
- await config.set(value, ctx);
68
+ const query = (0, http_1.requestQuery)(request);
69
+ const publishNow = query.publish === "1" ||
70
+ query.publish === "true" ||
71
+ value.publish === true;
72
+ const payload = value.value && typeof value.value === "object" && !Array.isArray(value.value)
73
+ ? value.value
74
+ : (() => {
75
+ const { publish: _p, baseRevisionId: _b, label: _l, ...rest } = value;
76
+ return rest;
77
+ })();
78
+ const ifMatch = (0, http_1.headerValue)((0, request_1.asRequest)(request).headers, "if-match") ??
79
+ (typeof value.baseRevisionId === "string"
80
+ ? value.baseRevisionId
81
+ : undefined);
82
+ if (state.revisionDef) {
83
+ if (ifMatch && state.revisionDef.liveEtag) {
84
+ const etag = await state.revisionDef.liveEtag(id, ctx.env, ctx);
85
+ if (etag && etag !== ifMatch) {
86
+ throw new errors_1.VertebrConflictError(`Config was modified (etag ${etag}). Reload and try again.`);
87
+ }
88
+ }
89
+ (0, access_1.assertCapability)(ctx, writeCap(state, id));
90
+ const label = typeof value.label === "string" ? value.label : undefined;
91
+ const revision = await state.revisionDef.save(id, ctx.env, { value: payload, ...(label ? { label } : {}) }, ctx);
92
+ if (publishNow) {
93
+ (0, access_1.assertCapability)(ctx, publishCap(state, id));
94
+ const published = await state.revisionDef.publish(id, ctx.env, revision.id, ctx);
95
+ await config.set(published.value, ctx);
96
+ await (0, audit_1.afterMutation)(state, ctx, {
97
+ audit: {
98
+ action: "config.publish",
99
+ targetType: "config",
100
+ targetId: id,
101
+ summary: `Published revision ${published.id}`,
102
+ meta: { revisionId: published.id },
103
+ },
104
+ event: {
105
+ type: "config.published",
106
+ controlId: id,
107
+ env: ctx.env,
108
+ actor: (0, audit_1.eventActor)(ctx),
109
+ revisionId: published.id,
110
+ },
111
+ });
112
+ }
113
+ else {
114
+ await (0, audit_1.afterMutation)(state, ctx, {
115
+ audit: {
116
+ action: "config.revision.save",
117
+ targetType: "config",
118
+ targetId: id,
119
+ summary: `Saved draft revision ${revision.id}`,
120
+ meta: { revisionId: revision.id },
121
+ },
122
+ event: {
123
+ type: "config.saved",
124
+ controlId: id,
125
+ env: ctx.env,
126
+ actor: (0, audit_1.eventActor)(ctx),
127
+ revisionId: revision.id,
128
+ published: false,
129
+ },
130
+ });
131
+ }
132
+ const nextValue = await config.get(ctx);
133
+ return {
134
+ ok: true,
135
+ id: config.id,
136
+ label: config.label,
137
+ schema: config.schema,
138
+ environment: ctx.env,
139
+ value: nextValue,
140
+ revision,
141
+ revisionsEnabled: true,
142
+ };
143
+ }
144
+ (0, access_1.assertCapability)(ctx, writeCap(state, id));
145
+ await config.set(payload, ctx);
35
146
  const nextValue = await config.get(ctx);
36
- // Full ConfigResponse so clients can cache without a follow-up GET.
147
+ await (0, audit_1.afterMutation)(state, ctx, {
148
+ audit: {
149
+ action: "config.set",
150
+ targetType: "config",
151
+ targetId: id,
152
+ summary: `Updated ${config.label}`,
153
+ },
154
+ event: {
155
+ type: "config.saved",
156
+ controlId: id,
157
+ env: ctx.env,
158
+ actor: (0, audit_1.eventActor)(ctx),
159
+ published: true,
160
+ },
161
+ });
37
162
  return {
38
163
  ok: true,
39
164
  id: config.id,
@@ -41,6 +166,7 @@ async function setConfigHandler(state, request) {
41
166
  schema: config.schema,
42
167
  environment: ctx.env,
43
168
  value: nextValue,
169
+ revisionsEnabled: false,
44
170
  };
45
171
  });
46
172
  }
@@ -1 +1 @@
1
- {"version":3,"file":"configs.js","sourceRoot":"","sources":["../../../src/runtime/api/configs.ts"],"names":[],"mappings":";;AAMA,4CAgBC;AAED,4CAoBC;AA5CD,sCAAiD;AACjD,yDAAyD;AACzD,mDAAkD;AAElD,uCAA+D;AAExD,KAAK,UAAU,gBAAgB,CAAC,KAAiB,EAAE,OAAgB;IACxE,OAAO,IAAA,4BAAc,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAClD,MAAM,EAAE,GAAG,IAAA,sBAAY,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,6BAAoB,CAAC,mBAAmB,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,qBAAU,EAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE,GAAG,CAAC,GAAG;YACpB,KAAK;SACN,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,gBAAgB,CAAC,KAAiB,EAAE,OAAgB;IACxE,OAAO,IAAA,4BAAc,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAClD,MAAM,EAAE,GAAG,IAAA,sBAAY,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,6BAAoB,CAAC,mBAAmB,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,qBAAU,EAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,IAAA,8BAAoB,EAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,oEAAoE;QACpE,OAAO;YACL,EAAE,EAAE,IAAI;YACR,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE,GAAG,CAAC,GAAG;YACpB,KAAK,EAAE,SAAS;SACjB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"configs.js","sourceRoot":"","sources":["../../../src/runtime/api/configs.ts"],"names":[],"mappings":"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"}