@vertebr/admin 0.3.0 → 0.5.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 (182) hide show
  1. package/dist/api/catalog.d.ts +59 -0
  2. package/dist/api/catalog.d.ts.map +1 -0
  3. package/dist/api/catalog.js +85 -0
  4. package/dist/api/catalog.js.map +1 -0
  5. package/dist/api/configs.d.ts +15 -0
  6. package/dist/api/configs.d.ts.map +1 -0
  7. package/dist/api/configs.js +43 -0
  8. package/dist/api/configs.js.map +1 -0
  9. package/dist/api/emails.d.ts +85 -0
  10. package/dist/api/emails.d.ts.map +1 -0
  11. package/dist/api/emails.js +520 -0
  12. package/dist/api/emails.js.map +1 -0
  13. package/dist/api/gallery.d.ts +28 -0
  14. package/dist/api/gallery.d.ts.map +1 -0
  15. package/dist/api/gallery.js +91 -0
  16. package/dist/api/gallery.js.map +1 -0
  17. package/dist/api/metrics.d.ts +22 -0
  18. package/dist/api/metrics.d.ts.map +1 -0
  19. package/dist/api/metrics.js +38 -0
  20. package/dist/api/metrics.js.map +1 -0
  21. package/dist/api/public.d.ts +22 -0
  22. package/dist/api/public.d.ts.map +1 -0
  23. package/dist/api/public.js +69 -0
  24. package/dist/api/public.js.map +1 -0
  25. package/dist/api/request.d.ts +26 -0
  26. package/dist/api/request.d.ts.map +1 -0
  27. package/dist/api/request.js +38 -0
  28. package/dist/api/request.js.map +1 -0
  29. package/dist/api/resources.d.ts +85 -0
  30. package/dist/api/resources.d.ts.map +1 -0
  31. package/dist/api/resources.js +263 -0
  32. package/dist/api/resources.js.map +1 -0
  33. package/dist/api/routes.d.ts +8 -0
  34. package/dist/api/routes.d.ts.map +1 -0
  35. package/dist/api/routes.js +202 -0
  36. package/dist/api/routes.js.map +1 -0
  37. package/dist/api/spa.d.ts +2 -0
  38. package/dist/api/spa.d.ts.map +1 -0
  39. package/dist/api/spa.js +34 -0
  40. package/dist/api/spa.js.map +1 -0
  41. package/dist/connectors/payments/connector.d.ts +30 -0
  42. package/dist/connectors/payments/connector.d.ts.map +1 -0
  43. package/dist/connectors/payments/connector.js +226 -0
  44. package/dist/connectors/payments/connector.js.map +1 -0
  45. package/dist/connectors/payments/index.d.ts +4 -0
  46. package/dist/connectors/payments/index.d.ts.map +1 -0
  47. package/dist/connectors/payments/index.js +10 -0
  48. package/dist/connectors/payments/index.js.map +1 -0
  49. package/dist/connectors/payments/stripe.d.ts +99 -0
  50. package/dist/connectors/payments/stripe.d.ts.map +1 -0
  51. package/dist/connectors/payments/stripe.js +189 -0
  52. package/dist/connectors/payments/stripe.js.map +1 -0
  53. package/dist/connectors/payments/types.d.ts +67 -0
  54. package/dist/connectors/payments/types.d.ts.map +1 -0
  55. package/dist/connectors/payments/types.js +16 -0
  56. package/dist/connectors/payments/types.js.map +1 -0
  57. package/dist/connectors/stripe.d.ts +19 -0
  58. package/dist/connectors/stripe.d.ts.map +1 -0
  59. package/dist/connectors/stripe.js +26 -0
  60. package/dist/connectors/stripe.js.map +1 -0
  61. package/dist/constants.d.ts +5 -0
  62. package/dist/constants.d.ts.map +1 -0
  63. package/dist/constants.js +8 -0
  64. package/dist/constants.js.map +1 -0
  65. package/dist/createAdmin.d.ts +3 -0
  66. package/dist/createAdmin.d.ts.map +1 -0
  67. package/dist/createAdmin.js +152 -0
  68. package/dist/createAdmin.js.map +1 -0
  69. package/dist/database/connector.d.ts +1 -1
  70. package/dist/database/connector.d.ts.map +1 -1
  71. package/dist/database/connector.js +43 -6
  72. package/dist/database/connector.js.map +1 -1
  73. package/dist/database/types.d.ts +25 -5
  74. package/dist/database/types.d.ts.map +1 -1
  75. package/dist/errors.d.ts +17 -0
  76. package/dist/errors.d.ts.map +1 -0
  77. package/dist/errors.js +36 -0
  78. package/dist/errors.js.map +1 -0
  79. package/dist/index.d.ts +9 -229
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +23 -889
  82. package/dist/index.js.map +1 -1
  83. package/dist/mail.d.ts +23 -0
  84. package/dist/mail.d.ts.map +1 -0
  85. package/dist/mail.js +248 -0
  86. package/dist/mail.js.map +1 -0
  87. package/dist/schema.d.ts +8 -0
  88. package/dist/schema.d.ts.map +1 -1
  89. package/dist/services/environment.d.ts +8 -0
  90. package/dist/services/environment.d.ts.map +1 -0
  91. package/dist/services/environment.js +78 -0
  92. package/dist/services/environment.js.map +1 -0
  93. package/dist/services/registry.d.ts +6 -0
  94. package/dist/services/registry.d.ts.map +1 -0
  95. package/dist/services/registry.js +32 -0
  96. package/dist/services/registry.js.map +1 -0
  97. package/dist/services/state.d.ts +25 -0
  98. package/dist/services/state.d.ts.map +1 -0
  99. package/dist/services/state.js +3 -0
  100. package/dist/services/state.js.map +1 -0
  101. package/dist/types/actions.d.ts +15 -0
  102. package/dist/types/actions.d.ts.map +1 -0
  103. package/dist/types/actions.js +3 -0
  104. package/dist/types/actions.js.map +1 -0
  105. package/dist/types/admin.d.ts +83 -0
  106. package/dist/types/admin.d.ts.map +1 -0
  107. package/dist/types/admin.js +3 -0
  108. package/dist/types/admin.js.map +1 -0
  109. package/dist/types/auth.d.ts +67 -0
  110. package/dist/types/auth.d.ts.map +1 -0
  111. package/dist/types/auth.js +3 -0
  112. package/dist/types/auth.js.map +1 -0
  113. package/dist/types/config.d.ts +39 -0
  114. package/dist/types/config.d.ts.map +1 -0
  115. package/dist/types/config.js +3 -0
  116. package/dist/types/config.js.map +1 -0
  117. package/dist/types/index.d.ts +15 -0
  118. package/dist/types/index.d.ts.map +1 -0
  119. package/dist/types/index.js +7 -0
  120. package/dist/types/index.js.map +1 -0
  121. package/dist/types/layout.d.ts +29 -0
  122. package/dist/types/layout.d.ts.map +1 -0
  123. package/dist/types/layout.js +3 -0
  124. package/dist/types/layout.js.map +1 -0
  125. package/dist/types/mail/catalog.d.ts +104 -0
  126. package/dist/types/mail/catalog.d.ts.map +1 -0
  127. package/dist/types/mail/catalog.js +3 -0
  128. package/dist/types/mail/catalog.js.map +1 -0
  129. package/dist/types/mail/definition.d.ts +68 -0
  130. package/dist/types/mail/definition.d.ts.map +1 -0
  131. package/dist/types/mail/definition.js +3 -0
  132. package/dist/types/mail/definition.js.map +1 -0
  133. package/dist/types/mail/index.d.ts +4 -0
  134. package/dist/types/mail/index.d.ts.map +1 -0
  135. package/dist/types/mail/index.js +3 -0
  136. package/dist/types/mail/index.js.map +1 -0
  137. package/dist/types/mail/message.d.ts +45 -0
  138. package/dist/types/mail/message.d.ts.map +1 -0
  139. package/dist/types/mail/message.js +3 -0
  140. package/dist/types/mail/message.js.map +1 -0
  141. package/dist/types/metrics.d.ts +46 -0
  142. package/dist/types/metrics.d.ts.map +1 -0
  143. package/dist/types/metrics.js +3 -0
  144. package/dist/types/metrics.js.map +1 -0
  145. package/dist/types/resource.d.ts +41 -0
  146. package/dist/types/resource.d.ts.map +1 -0
  147. package/dist/types/resource.js +3 -0
  148. package/dist/types/resource.js.map +1 -0
  149. package/dist/utils/auth.d.ts +4 -0
  150. package/dist/utils/auth.d.ts.map +1 -0
  151. package/dist/utils/auth.js +29 -0
  152. package/dist/utils/auth.js.map +1 -0
  153. package/dist/utils/config.d.ts +4 -0
  154. package/dist/utils/config.d.ts.map +1 -0
  155. package/dist/utils/config.js +14 -0
  156. package/dist/utils/config.js.map +1 -0
  157. package/dist/utils/http.d.ts +7 -0
  158. package/dist/utils/http.d.ts.map +1 -0
  159. package/dist/utils/http.js +61 -0
  160. package/dist/utils/http.js.map +1 -0
  161. package/dist/utils/metricsRange.d.ts +34 -0
  162. package/dist/utils/metricsRange.d.ts.map +1 -0
  163. package/dist/utils/metricsRange.js +121 -0
  164. package/dist/utils/metricsRange.js.map +1 -0
  165. package/dist/utils/sidebar.d.ts +2 -0
  166. package/dist/utils/sidebar.d.ts.map +1 -0
  167. package/dist/utils/sidebar.js +8 -0
  168. package/dist/utils/sidebar.js.map +1 -0
  169. package/dist/utils/staticDir.d.ts +2 -0
  170. package/dist/utils/staticDir.d.ts.map +1 -0
  171. package/dist/utils/staticDir.js +16 -0
  172. package/dist/utils/staticDir.js.map +1 -0
  173. package/dist/utils/uploads.d.ts +6 -0
  174. package/dist/utils/uploads.d.ts.map +1 -0
  175. package/dist/utils/uploads.js +66 -0
  176. package/dist/utils/uploads.js.map +1 -0
  177. package/package.json +1 -1
  178. package/static/assets/index-DKyVvFeT.js +332 -0
  179. package/static/assets/index-DUwFg1bw.css +1 -0
  180. package/static/index.html +2 -2
  181. package/static/assets/index-BpfDn_4i.css +0 -1
  182. package/static/assets/index-DAjD2ShU.js +0 -329
@@ -0,0 +1,46 @@
1
+ import type { HandlerContext } from "../schema";
2
+ /** Dashboard KPI card returned by `metrics()`. */
3
+ export type MetricCard = {
4
+ id: string;
5
+ label: string;
6
+ value: string | number;
7
+ hint?: string;
8
+ tone?: "neutral" | "ok" | "warn" | "danger";
9
+ /** Percent change vs the previous window (e.g. 12.5). */
10
+ delta?: number;
11
+ /** Sparkline, oldest first. */
12
+ series?: number[];
13
+ /** Section heading on the overview board. */
14
+ section?: string;
15
+ /** Promote to the top KPI row. */
16
+ featured?: boolean;
17
+ };
18
+ export type MetricChartPoint = {
19
+ label: string;
20
+ value: number;
21
+ };
22
+ export type MetricChart = {
23
+ id: string;
24
+ label: string;
25
+ /** `usd` formats the axis as currency. */
26
+ unit?: "usd" | "count";
27
+ points: MetricChartPoint[];
28
+ /** Previous-period overlay, aligned to `points`. */
29
+ comparePoints?: MetricChartPoint[];
30
+ };
31
+ export type MetricsPayload = {
32
+ metrics: MetricCard[];
33
+ charts?: MetricChart[];
34
+ /** e.g. `"Aug 2 – Aug 15 vs Jul 19 – Aug 1"`. */
35
+ windowLabel?: string;
36
+ /** e.g. `"Previous period"`. */
37
+ compareLabel?: string;
38
+ };
39
+ export type MetricsDefinition = {
40
+ id?: string;
41
+ label?: string;
42
+ /** Sidebar heading. Defaults to `"Analytics"`. */
43
+ group?: string;
44
+ load: (ctx: HandlerContext) => Promise<MetricCard[] | MetricsPayload> | MetricCard[] | MetricsPayload;
45
+ };
46
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/types/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,kDAAkD;AAClD,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC5C,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;IACvB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,oDAAoD;IACpD,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CACJ,GAAG,EAAE,cAAc,KAEjB,OAAO,CAAC,UAAU,EAAE,GAAG,cAAc,CAAC,GACtC,UAAU,EAAE,GACZ,cAAc,CAAC;CACpB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/types/metrics.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import type { FieldSchema, HandlerContext, ResourceUploadDefinition } from "../schema";
2
+ import type { CollectionWideAction, ResourceAction } from "./actions";
3
+ import type { ResourceMailConfig } from "./mail";
4
+ export type ResourcePermissions = {
5
+ create?: boolean;
6
+ update?: boolean;
7
+ delete?: boolean;
8
+ };
9
+ export type ResourceDefinition<T = unknown> = {
10
+ id: string;
11
+ label: string;
12
+ schema: Record<string, FieldSchema>;
13
+ list?: (ctx: HandlerContext) => Promise<T[]> | T[];
14
+ get?: (id: string, ctx: HandlerContext) => Promise<T | undefined> | T | undefined;
15
+ create?: (input: Partial<T>, ctx: HandlerContext) => Promise<T> | T;
16
+ update?: (id: string, input: Partial<T>, ctx: HandlerContext) => Promise<T> | T;
17
+ remove?: (id: string, ctx: HandlerContext) => Promise<void> | void;
18
+ actions?: Record<string, ResourceAction<T>>;
19
+ /**
20
+ * Host mail templates to expose as row actions (Email, Promo, …).
21
+ * Requires `admin.mail({ send, templates })`.
22
+ */
23
+ mail?: ResourceMailConfig;
24
+ collectionActions?: Record<string, CollectionWideAction> | ((ctx: HandlerContext) => Record<string, CollectionWideAction> | Promise<Record<string, CollectionWideAction>>);
25
+ /**
26
+ * Field-keyed upload handlers. Keys must match schema fields
27
+ * (typically image URL strings).
28
+ */
29
+ uploads?: Record<string, ResourceUploadDefinition>;
30
+ permissions?: ResourcePermissions;
31
+ resolvePermissions?: (ctx: HandlerContext) => ResourcePermissions | Promise<ResourcePermissions>;
32
+ /**
33
+ * When true, storefront can list this resource via
34
+ * `/api/public/resources/{id}` (no auth). Rows with `active: false`
35
+ * are omitted.
36
+ */
37
+ public?: boolean;
38
+ /** Sidebar heading. Defaults to `"Resources"`. */
39
+ group?: string;
40
+ };
41
+ //# sourceMappingURL=resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../src/types/resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,wBAAwB,EACzB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAEjD,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,IAAI;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACnD,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAClF,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpE,MAAM,CAAC,EAAE,CACP,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EACjB,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C;;;OAGG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,iBAAiB,CAAC,EACd,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GACpC,CAAC,CACC,GAAG,EAAE,cAAc,KAEjB,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,GACpC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC;IACvD;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,kBAAkB,CAAC,EAAE,CACnB,GAAG,EAAE,cAAc,KAChB,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACxD;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../src/types/resource.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { AdminEnvironment, EnvironmentAuthPublic } from "../types";
2
+ export declare function publicAuth(env: AdminEnvironment): EnvironmentAuthPublic;
3
+ export declare function claimSatisfied(claims: Record<string, unknown> | undefined, key: string, expected: string): boolean;
4
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,UAAU,CAAC;AAElB,wBAAgB,UAAU,CAAC,GAAG,EAAE,gBAAgB,GAAG,qBAAqB,CAOvE;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC3C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAgBT"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.publicAuth = publicAuth;
4
+ exports.claimSatisfied = claimSatisfied;
5
+ function publicAuth(env) {
6
+ return {
7
+ required: Boolean(env.auth?.required),
8
+ ...(env.auth?.claimKey ? { claimKey: env.auth.claimKey } : {}),
9
+ ...(env.auth?.roles?.length ? { roles: [...env.auth.roles] } : {}),
10
+ ...(env.auth?.client ? { client: env.auth.client } : {}),
11
+ };
12
+ }
13
+ function claimSatisfied(claims, key, expected) {
14
+ const value = claims?.[key];
15
+ if (value == null)
16
+ return false;
17
+ if (Array.isArray(value)) {
18
+ return value.map(String).includes(expected);
19
+ }
20
+ if (typeof value === "string") {
21
+ return (value === expected ||
22
+ value
23
+ .split(",")
24
+ .map((part) => part.trim())
25
+ .includes(expected));
26
+ }
27
+ return false;
28
+ }
29
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":";;AAKA,gCAOC;AAED,wCAoBC;AA7BD,SAAgB,UAAU,CAAC,GAAqB;IAC9C,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC;QACrC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAC5B,MAA2C,EAC3C,GAAW,EACX,QAAgB;IAEhB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CACL,KAAK,KAAK,QAAQ;YAClB,KAAK;iBACF,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1B,QAAQ,CAAC,QAAQ,CAAC,CACtB,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FieldSchema } from "../schema";
2
+ import type { ControlDefinition } from "../types";
3
+ export declare function resolveDefaults(schema: Record<string, FieldSchema>, defaults: ControlDefinition["defaults"] | undefined, env: string): Record<string, unknown>;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACnC,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,GAAG,SAAS,EACnD,GAAG,EAAE,MAAM,GACV,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveDefaults = resolveDefaults;
4
+ function resolveDefaults(schema, defaults, env) {
5
+ const fromSchema = {};
6
+ for (const [key, field] of Object.entries(schema)) {
7
+ if (field.default !== undefined) {
8
+ fromSchema[key] = field.default;
9
+ }
10
+ }
11
+ const fromDef = typeof defaults === "function" ? defaults(env) : (defaults ?? {});
12
+ return { ...fromSchema, ...fromDef };
13
+ }
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;AAGA,0CAcC;AAdD,SAAgB,eAAe,CAC7B,MAAmC,EACnC,QAAmD,EACnD,GAAW;IAEX,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QAClC,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GACX,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACpE,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC;AACvC,CAAC"}
@@ -0,0 +1,7 @@
1
+ type HeaderMap = Record<string, string | string[] | undefined>;
2
+ export declare function headerValue(headers: HeaderMap | undefined, name: string): string | undefined;
3
+ /** Flatten Hapi/Express query values to a string map. */
4
+ export declare function requestQuery(request: unknown): Record<string, string>;
5
+ export declare function contentTypeFor(filePath: string): string;
6
+ export {};
7
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAEA,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAE/D,wBAAgB,WAAW,CACzB,OAAO,EAAE,SAAS,GAAG,SAAS,EAC9B,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAKpB;AASD,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASrE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoBvD"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.headerValue = headerValue;
7
+ exports.requestQuery = requestQuery;
8
+ exports.contentTypeFor = contentTypeFor;
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ function headerValue(headers, name) {
11
+ if (!headers)
12
+ return undefined;
13
+ const raw = headers[name] ?? headers[name.toLowerCase()];
14
+ if (Array.isArray(raw))
15
+ return raw[0];
16
+ return typeof raw === "string" ? raw : undefined;
17
+ }
18
+ function queryValue(value) {
19
+ if (typeof value === "string")
20
+ return value;
21
+ if (typeof value === "number" && Number.isFinite(value))
22
+ return String(value);
23
+ if (Array.isArray(value) && value.length > 0)
24
+ return queryValue(value[0]);
25
+ return undefined;
26
+ }
27
+ /** Flatten Hapi/Express query values to a string map. */
28
+ function requestQuery(request) {
29
+ const raw = request.query;
30
+ if (!raw || typeof raw !== "object")
31
+ return {};
32
+ const query = {};
33
+ for (const [key, value] of Object.entries(raw)) {
34
+ const parsed = queryValue(value);
35
+ if (parsed != null)
36
+ query[key] = parsed;
37
+ }
38
+ return query;
39
+ }
40
+ function contentTypeFor(filePath) {
41
+ const ext = node_path_1.default.extname(filePath).toLowerCase();
42
+ switch (ext) {
43
+ case ".html":
44
+ return "text/html; charset=utf-8";
45
+ case ".js":
46
+ return "text/javascript; charset=utf-8";
47
+ case ".css":
48
+ return "text/css; charset=utf-8";
49
+ case ".svg":
50
+ return "image/svg+xml";
51
+ case ".json":
52
+ return "application/json";
53
+ case ".png":
54
+ return "image/png";
55
+ case ".woff2":
56
+ return "font/woff2";
57
+ default:
58
+ return "application/octet-stream";
59
+ }
60
+ }
61
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":";;;;;AAIA,kCAQC;AAUD,oCASC;AAED,wCAoBC;AArDD,0DAA6B;AAI7B,SAAgB,WAAW,CACzB,OAA8B,EAC9B,IAAY;IAEZ,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yDAAyD;AACzD,SAAgB,YAAY,CAAC,OAAgB;IAC3C,MAAM,GAAG,GAAI,OAA+C,CAAC,KAAK,CAAC;IACnE,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,MAAM,IAAI,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,cAAc,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,0BAA0B,CAAC;QACpC,KAAK,KAAK;YACR,OAAO,gCAAgC,CAAC;QAC1C,KAAK,MAAM;YACT,OAAO,yBAAyB,CAAC;QACnC,KAAK,MAAM;YACT,OAAO,eAAe,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,kBAAkB,CAAC;QAC5B,KAAK,MAAM;YACT,OAAO,WAAW,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC;QACtB;YACE,OAAO,0BAA0B,CAAC;IACtC,CAAC;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ export declare const METRICS_RANGES: readonly [{
2
+ readonly id: "7d";
3
+ readonly label: "Last 7 days";
4
+ }, {
5
+ readonly id: "14d";
6
+ readonly label: "Last 14 days";
7
+ }, {
8
+ readonly id: "30d";
9
+ readonly label: "Last 30 days";
10
+ }, {
11
+ readonly id: "this_month";
12
+ readonly label: "This month";
13
+ }, {
14
+ readonly id: "last_month";
15
+ readonly label: "Last month";
16
+ }];
17
+ export type MetricsRangeId = (typeof METRICS_RANGES)[number]["id"];
18
+ export type ResolvedMetricsRange = {
19
+ id: MetricsRangeId;
20
+ label: string;
21
+ currentKeys: string[];
22
+ /** Same length as `currentKeys`; `null` when the prior month has no matching day. */
23
+ previousKeys: Array<string | null>;
24
+ previousStartMs: number;
25
+ windowLabel: string;
26
+ compareLabel: string;
27
+ };
28
+ export declare function parseMetricsRange(raw: unknown): MetricsRangeId;
29
+ export declare function utcDayKey(ms: number): string;
30
+ export declare function keysFrom(startMs: number, count: number): string[];
31
+ /** Same calendar day in another month, or `null` if that month is shorter. */
32
+ export declare function correspondingDay(isoDay: string, deltaMonths: number): string | null;
33
+ export declare function resolveMetricsRange(range: MetricsRangeId, now?: Date): ResolvedMetricsRange;
34
+ //# sourceMappingURL=metricsRange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metricsRange.d.ts","sourceRoot":"","sources":["../../src/utils/metricsRange.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;EAMjB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAInE,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,cAAc,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qFAAqF;IACrF,YAAY,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAK9D;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAIjE;AA4BD,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAYf;AAMD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,cAAc,EACrB,GAAG,OAAa,GACf,oBAAoB,CAiDtB"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.METRICS_RANGES = void 0;
4
+ exports.parseMetricsRange = parseMetricsRange;
5
+ exports.utcDayKey = utcDayKey;
6
+ exports.keysFrom = keysFrom;
7
+ exports.correspondingDay = correspondingDay;
8
+ exports.resolveMetricsRange = resolveMetricsRange;
9
+ const DAY_MS = 86_400_000;
10
+ exports.METRICS_RANGES = [
11
+ { id: "7d", label: "Last 7 days" },
12
+ { id: "14d", label: "Last 14 days" },
13
+ { id: "30d", label: "Last 30 days" },
14
+ { id: "this_month", label: "This month" },
15
+ { id: "last_month", label: "Last month" },
16
+ ];
17
+ const RANGE_IDS = new Set(exports.METRICS_RANGES.map((item) => item.id));
18
+ function parseMetricsRange(raw) {
19
+ if (typeof raw === "string" && RANGE_IDS.has(raw)) {
20
+ return raw;
21
+ }
22
+ return "14d";
23
+ }
24
+ function utcDayKey(ms) {
25
+ return new Date(ms).toISOString().slice(0, 10);
26
+ }
27
+ function keysFrom(startMs, count) {
28
+ return Array.from({ length: Math.max(0, count) }, (_, index) => utcDayKey(startMs + index * DAY_MS));
29
+ }
30
+ function utcMidnight(ms) {
31
+ const date = new Date(ms);
32
+ return Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
33
+ }
34
+ function daysInMonth(year, monthIndex) {
35
+ return new Date(Date.UTC(year, monthIndex + 1, 0)).getUTCDate();
36
+ }
37
+ function shortDayLabel(isoDay) {
38
+ return new Date(`${isoDay}T00:00:00Z`).toLocaleDateString("en-US", {
39
+ month: "short",
40
+ day: "numeric",
41
+ timeZone: "UTC",
42
+ });
43
+ }
44
+ function shortRange(keys) {
45
+ const first = keys[0];
46
+ const last = keys[keys.length - 1];
47
+ if (!first || !last)
48
+ return "";
49
+ const a = shortDayLabel(first);
50
+ const b = shortDayLabel(last);
51
+ return a === b ? a : `${a} – ${b}`;
52
+ }
53
+ /** Same calendar day in another month, or `null` if that month is shorter. */
54
+ function correspondingDay(isoDay, deltaMonths) {
55
+ const [yearRaw, monthRaw, dayRaw] = isoDay.split("-");
56
+ const year = Number(yearRaw);
57
+ const month = Number(monthRaw) - 1;
58
+ const day = Number(dayRaw);
59
+ if (!Number.isFinite(year) || !Number.isFinite(month) || !Number.isFinite(day)) {
60
+ return null;
61
+ }
62
+ const probe = new Date(Date.UTC(year, month + deltaMonths, 1));
63
+ const last = daysInMonth(probe.getUTCFullYear(), probe.getUTCMonth());
64
+ if (day > last)
65
+ return null;
66
+ return utcDayKey(Date.UTC(probe.getUTCFullYear(), probe.getUTCMonth(), day));
67
+ }
68
+ function rangeLabel(id) {
69
+ return exports.METRICS_RANGES.find((item) => item.id === id)?.label ?? "Last 14 days";
70
+ }
71
+ function resolveMetricsRange(range, now = new Date()) {
72
+ const label = rangeLabel(range);
73
+ const today = utcMidnight(now.getTime());
74
+ const tomorrow = today + DAY_MS;
75
+ let currentKeys;
76
+ let previousKeys;
77
+ let previousStartMs;
78
+ if (range === "7d" || range === "14d" || range === "30d") {
79
+ const days = range === "7d" ? 7 : range === "30d" ? 30 : 14;
80
+ const currentStart = tomorrow - days * DAY_MS;
81
+ currentKeys = keysFrom(currentStart, days);
82
+ previousStartMs = currentStart - days * DAY_MS;
83
+ previousKeys = keysFrom(previousStartMs, days);
84
+ }
85
+ else if (range === "this_month") {
86
+ const year = now.getUTCFullYear();
87
+ const month = now.getUTCMonth();
88
+ const day = now.getUTCDate();
89
+ const currentStart = Date.UTC(year, month, 1);
90
+ currentKeys = keysFrom(currentStart, day);
91
+ previousKeys = currentKeys.map((key) => correspondingDay(key, -1));
92
+ const firstPrev = previousKeys.find((key) => key != null);
93
+ previousStartMs = firstPrev
94
+ ? Date.parse(`${firstPrev}T00:00:00Z`)
95
+ : currentStart - day * DAY_MS;
96
+ }
97
+ else {
98
+ const year = now.getUTCFullYear();
99
+ const month = now.getUTCMonth();
100
+ const currentStart = Date.UTC(year, month - 1, 1);
101
+ const start = new Date(currentStart);
102
+ const count = daysInMonth(start.getUTCFullYear(), start.getUTCMonth());
103
+ currentKeys = keysFrom(currentStart, count);
104
+ previousKeys = currentKeys.map((key) => correspondingDay(key, -1));
105
+ const firstPrev = previousKeys.find((key) => key != null);
106
+ previousStartMs = firstPrev
107
+ ? Date.parse(`${firstPrev}T00:00:00Z`)
108
+ : Date.UTC(year, month - 2, 1);
109
+ }
110
+ const previousLabelKeys = previousKeys.filter((key) => key != null);
111
+ return {
112
+ id: range,
113
+ label,
114
+ currentKeys,
115
+ previousKeys,
116
+ previousStartMs,
117
+ windowLabel: `${shortRange(currentKeys)} vs ${shortRange(previousLabelKeys)}`,
118
+ compareLabel: "Previous period",
119
+ };
120
+ }
121
+ //# sourceMappingURL=metricsRange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metricsRange.js","sourceRoot":"","sources":["../../src/utils/metricsRange.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function sidebarGroup(value: string | undefined, fallback: string): string;
2
+ //# sourceMappingURL=sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/utils/sidebar.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,QAAQ,EAAE,MAAM,GACf,MAAM,CAGR"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sidebarGroup = sidebarGroup;
4
+ function sidebarGroup(value, fallback) {
5
+ const trimmed = value?.trim();
6
+ return trimmed || fallback;
7
+ }
8
+ //# sourceMappingURL=sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../../src/utils/sidebar.ts"],"names":[],"mappings":";;AAAA,oCAMC;AAND,SAAgB,YAAY,CAC1B,KAAyB,EACzB,QAAgB;IAEhB,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,OAAO,OAAO,IAAI,QAAQ,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function defaultStaticDir(): string | undefined;
2
+ //# sourceMappingURL=staticDir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticDir.d.ts","sourceRoot":"","sources":["../../src/utils/staticDir.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAMrD"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.defaultStaticDir = defaultStaticDir;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ function defaultStaticDir() {
10
+ const candidate = node_path_1.default.join(__dirname, "..", "..", "static");
11
+ if (node_fs_1.default.existsSync(node_path_1.default.join(candidate, "index.html"))) {
12
+ return candidate;
13
+ }
14
+ return undefined;
15
+ }
16
+ //# sourceMappingURL=staticDir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticDir.js","sourceRoot":"","sources":["../../src/utils/staticDir.ts"],"names":[],"mappings":";;;;;AAGA,4CAMC;AATD,sDAAyB;AACzB,0DAA6B;AAE7B,SAAgB,gBAAgB;IAC9B,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7D,IAAI,iBAAE,CAAC,UAAU,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ResourceUploadFile, ResourceUploadMeta } from "../schema";
2
+ import type { ResourceDefinition } from "../types";
3
+ export declare function publicUploads(resource: ResourceDefinition): Record<string, ResourceUploadMeta> | undefined;
4
+ export declare function mimeAllowed(type: string, accept: string[]): boolean;
5
+ export declare function decodeUploadPayload(entry: unknown): ResourceUploadFile;
6
+ //# sourceMappingURL=uploads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/utils/uploads.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,kBAAkB,GAC3B,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,SAAS,CAahD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAWnE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CA4BtE"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.publicUploads = publicUploads;
4
+ exports.mimeAllowed = mimeAllowed;
5
+ exports.decodeUploadPayload = decodeUploadPayload;
6
+ const constants_1 = require("../constants");
7
+ const errors_1 = require("../errors");
8
+ function publicUploads(resource) {
9
+ if (!resource.uploads)
10
+ return undefined;
11
+ const entries = Object.entries(resource.uploads).map(([field, def]) => [
12
+ field,
13
+ {
14
+ field,
15
+ accept: def.accept?.length ? def.accept : constants_1.DEFAULT_UPLOAD_ACCEPT,
16
+ maxBytes: def.maxBytes ?? constants_1.DEFAULT_UPLOAD_MAX_BYTES,
17
+ },
18
+ ]);
19
+ return entries.length > 0
20
+ ? Object.fromEntries(entries)
21
+ : undefined;
22
+ }
23
+ function mimeAllowed(type, accept) {
24
+ if (accept.length === 0)
25
+ return true;
26
+ const normalized = type.toLowerCase() || "application/octet-stream";
27
+ return accept.some((rule) => {
28
+ const pattern = rule.toLowerCase().trim();
29
+ if (!pattern || pattern === "*/*")
30
+ return true;
31
+ if (pattern.endsWith("/*")) {
32
+ return normalized.startsWith(pattern.slice(0, -1));
33
+ }
34
+ return normalized === pattern;
35
+ });
36
+ }
37
+ function decodeUploadPayload(entry) {
38
+ if (!entry || typeof entry !== "object") {
39
+ throw new errors_1.VertebrBadRequestError("Invalid upload payload");
40
+ }
41
+ const body = entry;
42
+ const name = typeof body.name === "string" ? body.name.trim() : "";
43
+ const type = typeof body.type === "string" && body.type.trim()
44
+ ? body.type.trim()
45
+ : "application/octet-stream";
46
+ const data = typeof body.data === "string" ? body.data : "";
47
+ if (!name) {
48
+ throw new errors_1.VertebrBadRequestError("Upload is missing a file name");
49
+ }
50
+ if (!data) {
51
+ throw new errors_1.VertebrBadRequestError("Upload is missing file data");
52
+ }
53
+ const base64 = data.includes(",") ? data.slice(data.indexOf(",") + 1) : data;
54
+ let buffer;
55
+ try {
56
+ buffer = Buffer.from(base64, "base64");
57
+ }
58
+ catch {
59
+ throw new errors_1.VertebrBadRequestError("Upload data is not valid base64");
60
+ }
61
+ if (!buffer.length) {
62
+ throw new errors_1.VertebrBadRequestError("Upload file is empty");
63
+ }
64
+ return { name, type, size: buffer.byteLength, buffer };
65
+ }
66
+ //# sourceMappingURL=uploads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../src/utils/uploads.ts"],"names":[],"mappings":";;AAQA,sCAeC;AAED,kCAWC;AAED,kDA4BC;AAlED,4CAGsB;AACtB,sCAAmD;AAInD,SAAgB,aAAa,CAC3B,QAA4B;IAE5B,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;QACrE,KAAK;QACL;YACE,KAAK;YACL,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,iCAAqB;YAC/D,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,oCAAwB;SACtB;KAC/B,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;QAC7B,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAgB,WAAW,CAAC,IAAY,EAAE,MAAgB;IACxD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,0BAA0B,CAAC;IACpE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,UAAU,KAAK,OAAO,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,+BAAsB,CAAC,wBAAwB,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,IAAI,GAAG,KAAgC,CAAC;IAC9C,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,IAAI,GACR,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAC/C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAClB,CAAC,CAAC,0BAA0B,CAAC;IACjC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,+BAAsB,CAAC,+BAA+B,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,+BAAsB,CAAC,6BAA6B,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,+BAAsB,CAAC,iCAAiC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,+BAAsB,CAAC,sBAAsB,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;AACzD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertebr/admin",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Schema-driven admin control plane — wire resources once, let owners run the app.",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",