@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.
- package/dist/api/catalog.d.ts +59 -0
- package/dist/api/catalog.d.ts.map +1 -0
- package/dist/api/catalog.js +85 -0
- package/dist/api/catalog.js.map +1 -0
- package/dist/api/configs.d.ts +15 -0
- package/dist/api/configs.d.ts.map +1 -0
- package/dist/api/configs.js +43 -0
- package/dist/api/configs.js.map +1 -0
- package/dist/api/emails.d.ts +85 -0
- package/dist/api/emails.d.ts.map +1 -0
- package/dist/api/emails.js +520 -0
- package/dist/api/emails.js.map +1 -0
- package/dist/api/gallery.d.ts +28 -0
- package/dist/api/gallery.d.ts.map +1 -0
- package/dist/api/gallery.js +91 -0
- package/dist/api/gallery.js.map +1 -0
- package/dist/api/metrics.d.ts +22 -0
- package/dist/api/metrics.d.ts.map +1 -0
- package/dist/api/metrics.js +38 -0
- package/dist/api/metrics.js.map +1 -0
- package/dist/api/public.d.ts +22 -0
- package/dist/api/public.d.ts.map +1 -0
- package/dist/api/public.js +69 -0
- package/dist/api/public.js.map +1 -0
- package/dist/api/request.d.ts +26 -0
- package/dist/api/request.d.ts.map +1 -0
- package/dist/api/request.js +38 -0
- package/dist/api/request.js.map +1 -0
- package/dist/api/resources.d.ts +85 -0
- package/dist/api/resources.d.ts.map +1 -0
- package/dist/api/resources.js +263 -0
- package/dist/api/resources.js.map +1 -0
- package/dist/api/routes.d.ts +8 -0
- package/dist/api/routes.d.ts.map +1 -0
- package/dist/api/routes.js +202 -0
- package/dist/api/routes.js.map +1 -0
- package/dist/api/spa.d.ts +2 -0
- package/dist/api/spa.d.ts.map +1 -0
- package/dist/api/spa.js +34 -0
- package/dist/api/spa.js.map +1 -0
- package/dist/connectors/payments/connector.d.ts +30 -0
- package/dist/connectors/payments/connector.d.ts.map +1 -0
- package/dist/connectors/payments/connector.js +226 -0
- package/dist/connectors/payments/connector.js.map +1 -0
- package/dist/connectors/payments/index.d.ts +4 -0
- package/dist/connectors/payments/index.d.ts.map +1 -0
- package/dist/connectors/payments/index.js +10 -0
- package/dist/connectors/payments/index.js.map +1 -0
- package/dist/connectors/payments/stripe.d.ts +99 -0
- package/dist/connectors/payments/stripe.d.ts.map +1 -0
- package/dist/connectors/payments/stripe.js +189 -0
- package/dist/connectors/payments/stripe.js.map +1 -0
- package/dist/connectors/payments/types.d.ts +67 -0
- package/dist/connectors/payments/types.d.ts.map +1 -0
- package/dist/connectors/payments/types.js +16 -0
- package/dist/connectors/payments/types.js.map +1 -0
- package/dist/connectors/stripe.d.ts +19 -0
- package/dist/connectors/stripe.d.ts.map +1 -0
- package/dist/connectors/stripe.js +26 -0
- package/dist/connectors/stripe.js.map +1 -0
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -0
- package/dist/createAdmin.d.ts +3 -0
- package/dist/createAdmin.d.ts.map +1 -0
- package/dist/createAdmin.js +152 -0
- package/dist/createAdmin.js.map +1 -0
- package/dist/database/connector.d.ts +1 -1
- package/dist/database/connector.d.ts.map +1 -1
- package/dist/database/connector.js +43 -6
- package/dist/database/connector.js.map +1 -1
- package/dist/database/types.d.ts +25 -5
- package/dist/database/types.d.ts.map +1 -1
- package/dist/errors.d.ts +17 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +36 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +9 -229
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -889
- package/dist/index.js.map +1 -1
- package/dist/mail.d.ts +23 -0
- package/dist/mail.d.ts.map +1 -0
- package/dist/mail.js +248 -0
- package/dist/mail.js.map +1 -0
- package/dist/schema.d.ts +8 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/services/environment.d.ts +8 -0
- package/dist/services/environment.d.ts.map +1 -0
- package/dist/services/environment.js +78 -0
- package/dist/services/environment.js.map +1 -0
- package/dist/services/registry.d.ts +6 -0
- package/dist/services/registry.d.ts.map +1 -0
- package/dist/services/registry.js +32 -0
- package/dist/services/registry.js.map +1 -0
- package/dist/services/state.d.ts +25 -0
- package/dist/services/state.d.ts.map +1 -0
- package/dist/services/state.js +3 -0
- package/dist/services/state.js.map +1 -0
- package/dist/types/actions.d.ts +15 -0
- package/dist/types/actions.d.ts.map +1 -0
- package/dist/types/actions.js +3 -0
- package/dist/types/actions.js.map +1 -0
- package/dist/types/admin.d.ts +83 -0
- package/dist/types/admin.d.ts.map +1 -0
- package/dist/types/admin.js +3 -0
- package/dist/types/admin.js.map +1 -0
- package/dist/types/auth.d.ts +67 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +3 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/config.d.ts +39 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/layout.d.ts +29 -0
- package/dist/types/layout.d.ts.map +1 -0
- package/dist/types/layout.js +3 -0
- package/dist/types/layout.js.map +1 -0
- package/dist/types/mail/catalog.d.ts +104 -0
- package/dist/types/mail/catalog.d.ts.map +1 -0
- package/dist/types/mail/catalog.js +3 -0
- package/dist/types/mail/catalog.js.map +1 -0
- package/dist/types/mail/definition.d.ts +68 -0
- package/dist/types/mail/definition.d.ts.map +1 -0
- package/dist/types/mail/definition.js +3 -0
- package/dist/types/mail/definition.js.map +1 -0
- package/dist/types/mail/index.d.ts +4 -0
- package/dist/types/mail/index.d.ts.map +1 -0
- package/dist/types/mail/index.js +3 -0
- package/dist/types/mail/index.js.map +1 -0
- package/dist/types/mail/message.d.ts +45 -0
- package/dist/types/mail/message.d.ts.map +1 -0
- package/dist/types/mail/message.js +3 -0
- package/dist/types/mail/message.js.map +1 -0
- package/dist/types/metrics.d.ts +46 -0
- package/dist/types/metrics.d.ts.map +1 -0
- package/dist/types/metrics.js +3 -0
- package/dist/types/metrics.js.map +1 -0
- package/dist/types/resource.d.ts +41 -0
- package/dist/types/resource.d.ts.map +1 -0
- package/dist/types/resource.js +3 -0
- package/dist/types/resource.js.map +1 -0
- package/dist/utils/auth.d.ts +4 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +29 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +14 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/http.d.ts +7 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +61 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/metricsRange.d.ts +34 -0
- package/dist/utils/metricsRange.d.ts.map +1 -0
- package/dist/utils/metricsRange.js +121 -0
- package/dist/utils/metricsRange.js.map +1 -0
- package/dist/utils/sidebar.d.ts +2 -0
- package/dist/utils/sidebar.d.ts.map +1 -0
- package/dist/utils/sidebar.js +8 -0
- package/dist/utils/sidebar.js.map +1 -0
- package/dist/utils/staticDir.d.ts +2 -0
- package/dist/utils/staticDir.d.ts.map +1 -0
- package/dist/utils/staticDir.js +16 -0
- package/dist/utils/staticDir.js.map +1 -0
- package/dist/utils/uploads.d.ts +6 -0
- package/dist/utils/uploads.d.ts.map +1 -0
- package/dist/utils/uploads.js +66 -0
- package/dist/utils/uploads.js.map +1 -0
- package/package.json +1 -1
- package/static/assets/index-DKyVvFeT.js +332 -0
- package/static/assets/index-DUwFg1bw.css +1 -0
- package/static/index.html +2 -2
- package/static/assets/index-BpfDn_4i.css +0 -1
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|