@nestjs-dash/nestjs 0.1.1
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/client/nestjs-dash.js +2126 -0
- package/dist/client/nestjs-dash.js.map +7 -0
- package/dist/controllers/admin-api.controller.d.ts +41 -0
- package/dist/controllers/admin-api.controller.d.ts.map +1 -0
- package/dist/controllers/admin-api.controller.js +299 -0
- package/dist/controllers/admin-api.controller.js.map +1 -0
- package/dist/controllers/admin-auth.controller.d.ts +17 -0
- package/dist/controllers/admin-auth.controller.d.ts.map +1 -0
- package/dist/controllers/admin-auth.controller.js +111 -0
- package/dist/controllers/admin-auth.controller.js.map +1 -0
- package/dist/controllers/admin-upload.controller.d.ts +50 -0
- package/dist/controllers/admin-upload.controller.d.ts.map +1 -0
- package/dist/controllers/admin-upload.controller.js +210 -0
- package/dist/controllers/admin-upload.controller.js.map +1 -0
- package/dist/controllers/admin.controller.d.ts +69 -0
- package/dist/controllers/admin.controller.d.ts.map +1 -0
- package/dist/controllers/admin.controller.js +1062 -0
- package/dist/controllers/admin.controller.js.map +1 -0
- package/dist/decorators/admin-action.decorator.d.ts +4 -0
- package/dist/decorators/admin-action.decorator.d.ts.map +1 -0
- package/dist/decorators/admin-action.decorator.js +6 -0
- package/dist/decorators/admin-action.decorator.js.map +1 -0
- package/dist/decorators/admin-page.decorator.d.ts +3 -0
- package/dist/decorators/admin-page.decorator.d.ts.map +1 -0
- package/dist/decorators/admin-page.decorator.js +6 -0
- package/dist/decorators/admin-page.decorator.js.map +1 -0
- package/dist/decorators/admin-resource.decorator.d.ts +3 -0
- package/dist/decorators/admin-resource.decorator.d.ts.map +1 -0
- package/dist/decorators/admin-resource.decorator.js +6 -0
- package/dist/decorators/admin-resource.decorator.js.map +1 -0
- package/dist/features/audit/audit.interceptor.d.ts +17 -0
- package/dist/features/audit/audit.interceptor.d.ts.map +1 -0
- package/dist/features/audit/audit.interceptor.js +94 -0
- package/dist/features/audit/audit.interceptor.js.map +1 -0
- package/dist/features/audit/index.d.ts +2 -0
- package/dist/features/audit/index.d.ts.map +1 -0
- package/dist/features/audit/index.js +2 -0
- package/dist/features/audit/index.js.map +1 -0
- package/dist/features/auth/auth.types.d.ts +13 -0
- package/dist/features/auth/auth.types.d.ts.map +1 -0
- package/dist/features/auth/auth.types.js +2 -0
- package/dist/features/auth/auth.types.js.map +1 -0
- package/dist/features/auth/index.d.ts +12 -0
- package/dist/features/auth/index.d.ts.map +1 -0
- package/dist/features/auth/index.js +7 -0
- package/dist/features/auth/index.js.map +1 -0
- package/dist/features/auth/public.decorator.d.ts +3 -0
- package/dist/features/auth/public.decorator.d.ts.map +1 -0
- package/dist/features/auth/public.decorator.js +4 -0
- package/dist/features/auth/public.decorator.js.map +1 -0
- package/dist/features/auth/resolvers/credentials.resolver.d.ts +10 -0
- package/dist/features/auth/resolvers/credentials.resolver.d.ts.map +1 -0
- package/dist/features/auth/resolvers/credentials.resolver.js +35 -0
- package/dist/features/auth/resolvers/credentials.resolver.js.map +1 -0
- package/dist/features/auth/resolvers/custom.resolver.d.ts +7 -0
- package/dist/features/auth/resolvers/custom.resolver.d.ts.map +1 -0
- package/dist/features/auth/resolvers/custom.resolver.js +9 -0
- package/dist/features/auth/resolvers/custom.resolver.js.map +1 -0
- package/dist/features/auth/resolvers/jwt.resolver.d.ts +10 -0
- package/dist/features/auth/resolvers/jwt.resolver.d.ts.map +1 -0
- package/dist/features/auth/resolvers/jwt.resolver.js +24 -0
- package/dist/features/auth/resolvers/jwt.resolver.js.map +1 -0
- package/dist/features/auth/resolvers/passport.resolver.d.ts +9 -0
- package/dist/features/auth/resolvers/passport.resolver.d.ts.map +1 -0
- package/dist/features/auth/resolvers/passport.resolver.js +15 -0
- package/dist/features/auth/resolvers/passport.resolver.js.map +1 -0
- package/dist/features/auth/session.d.ts +9 -0
- package/dist/features/auth/session.d.ts.map +1 -0
- package/dist/features/auth/session.js +55 -0
- package/dist/features/auth/session.js.map +1 -0
- package/dist/features/media/enrich.d.ts +13 -0
- package/dist/features/media/enrich.d.ts.map +1 -0
- package/dist/features/media/enrich.js +56 -0
- package/dist/features/media/enrich.js.map +1 -0
- package/dist/features/media/index.d.ts +3 -0
- package/dist/features/media/index.d.ts.map +1 -0
- package/dist/features/media/index.js +3 -0
- package/dist/features/media/index.js.map +1 -0
- package/dist/features/media/media.helpers.d.ts +13 -0
- package/dist/features/media/media.helpers.d.ts.map +1 -0
- package/dist/features/media/media.helpers.js +63 -0
- package/dist/features/media/media.helpers.js.map +1 -0
- package/dist/guards/admin-auth.guard.d.ts +17 -0
- package/dist/guards/admin-auth.guard.d.ts.map +1 -0
- package/dist/guards/admin-auth.guard.js +82 -0
- package/dist/guards/admin-auth.guard.js.map +1 -0
- package/dist/guards/admin-policy.guard.d.ts +10 -0
- package/dist/guards/admin-policy.guard.d.ts.map +1 -0
- package/dist/guards/admin-policy.guard.js +60 -0
- package/dist/guards/admin-policy.guard.js.map +1 -0
- package/dist/helpers/action.helpers.d.ts +6 -0
- package/dist/helpers/action.helpers.d.ts.map +1 -0
- package/dist/helpers/action.helpers.js +14 -0
- package/dist/helpers/action.helpers.js.map +1 -0
- package/dist/helpers/data-source.helpers.d.ts +4 -0
- package/dist/helpers/data-source.helpers.d.ts.map +1 -0
- package/dist/helpers/data-source.helpers.js +14 -0
- package/dist/helpers/data-source.helpers.js.map +1 -0
- package/dist/helpers/icons.d.ts +8 -0
- package/dist/helpers/icons.d.ts.map +1 -0
- package/dist/helpers/icons.js +50 -0
- package/dist/helpers/icons.js.map +1 -0
- package/dist/helpers/nav-collapse.helper.d.ts +6 -0
- package/dist/helpers/nav-collapse.helper.d.ts.map +1 -0
- package/dist/helpers/nav-collapse.helper.js +25 -0
- package/dist/helpers/nav-collapse.helper.js.map +1 -0
- package/dist/helpers/relation.helpers.d.ts +17 -0
- package/dist/helpers/relation.helpers.d.ts.map +1 -0
- package/dist/helpers/relation.helpers.js +98 -0
- package/dist/helpers/relation.helpers.js.map +1 -0
- package/dist/helpers/shell-assets.helper.d.ts +6 -0
- package/dist/helpers/shell-assets.helper.d.ts.map +1 -0
- package/dist/helpers/shell-assets.helper.js +14 -0
- package/dist/helpers/shell-assets.helper.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/admin-api-host.module.d.ts +3 -0
- package/dist/modules/admin-api-host.module.d.ts.map +1 -0
- package/dist/modules/admin-api-host.module.js +17 -0
- package/dist/modules/admin-api-host.module.js.map +1 -0
- package/dist/modules/admin-core.module.d.ts +3 -0
- package/dist/modules/admin-core.module.d.ts.map +1 -0
- package/dist/modules/admin-core.module.js +37 -0
- package/dist/modules/admin-core.module.js.map +1 -0
- package/dist/modules/admin-feature.module.d.ts +3 -0
- package/dist/modules/admin-feature.module.d.ts.map +1 -0
- package/dist/modules/admin-feature.module.js +14 -0
- package/dist/modules/admin-feature.module.js.map +1 -0
- package/dist/modules/admin-ui-host.module.d.ts +3 -0
- package/dist/modules/admin-ui-host.module.d.ts.map +1 -0
- package/dist/modules/admin-ui-host.module.js +19 -0
- package/dist/modules/admin-ui-host.module.js.map +1 -0
- package/dist/modules/admin.module.d.ts +18 -0
- package/dist/modules/admin.module.d.ts.map +1 -0
- package/dist/modules/admin.module.js +197 -0
- package/dist/modules/admin.module.js.map +1 -0
- package/dist/plugin-contracts.d.ts +88 -0
- package/dist/plugin-contracts.d.ts.map +1 -0
- package/dist/plugin-contracts.js +4 -0
- package/dist/plugin-contracts.js.map +1 -0
- package/dist/plugins/openapi/admin-openapi.d.ts +21 -0
- package/dist/plugins/openapi/admin-openapi.d.ts.map +1 -0
- package/dist/plugins/openapi/admin-openapi.js +237 -0
- package/dist/plugins/openapi/admin-openapi.js.map +1 -0
- package/dist/providers/admin-page.explorer.d.ts +8 -0
- package/dist/providers/admin-page.explorer.d.ts.map +1 -0
- package/dist/providers/admin-page.explorer.js +43 -0
- package/dist/providers/admin-page.explorer.js.map +1 -0
- package/dist/providers/admin-page.registry.d.ts +9 -0
- package/dist/providers/admin-page.registry.d.ts.map +1 -0
- package/dist/providers/admin-page.registry.js +39 -0
- package/dist/providers/admin-page.registry.js.map +1 -0
- package/dist/providers/admin-panel.bootstrap.d.ts +23 -0
- package/dist/providers/admin-panel.bootstrap.d.ts.map +1 -0
- package/dist/providers/admin-panel.bootstrap.js +122 -0
- package/dist/providers/admin-panel.bootstrap.js.map +1 -0
- package/dist/providers/admin-resource.explorer.d.ts +8 -0
- package/dist/providers/admin-resource.explorer.d.ts.map +1 -0
- package/dist/providers/admin-resource.explorer.js +43 -0
- package/dist/providers/admin-resource.explorer.js.map +1 -0
- package/dist/providers/admin-resource.registry.d.ts +9 -0
- package/dist/providers/admin-resource.registry.d.ts.map +1 -0
- package/dist/providers/admin-resource.registry.js +39 -0
- package/dist/providers/admin-resource.registry.js.map +1 -0
- package/dist/react/admin-app.d.ts +14 -0
- package/dist/react/admin-app.d.ts.map +1 -0
- package/dist/react/admin-app.js +421 -0
- package/dist/react/admin-app.js.map +1 -0
- package/dist/react/document.d.ts +13 -0
- package/dist/react/document.d.ts.map +1 -0
- package/dist/react/document.js +47 -0
- package/dist/react/document.js.map +1 -0
- package/dist/react/nav-client.d.ts +10 -0
- package/dist/react/nav-client.d.ts.map +1 -0
- package/dist/react/nav-client.js +153 -0
- package/dist/react/nav-client.js.map +1 -0
- package/dist/react/theme.d.ts +6 -0
- package/dist/react/theme.d.ts.map +1 -0
- package/dist/react/theme.js +51 -0
- package/dist/react/theme.js.map +1 -0
- package/dist/react/types.d.ts +107 -0
- package/dist/react/types.d.ts.map +1 -0
- package/dist/react/types.js +2 -0
- package/dist/react/types.js.map +1 -0
- package/dist/tokens.d.ts +106 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +74 -0
- package/dist/tokens.js.map +1 -0
- package/dist/views/admin.views.d.ts +114 -0
- package/dist/views/admin.views.d.ts.map +1 -0
- package/dist/views/admin.views.js +212 -0
- package/dist/views/admin.views.js.map +1 -0
- package/package.json +98 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
function sign(value, secret) {
|
|
3
|
+
return createHmac('sha256', secret).update(value).digest('base64url');
|
|
4
|
+
}
|
|
5
|
+
export function createSessionToken(user, options) {
|
|
6
|
+
const payload = {
|
|
7
|
+
user,
|
|
8
|
+
exp: Date.now() + (options.maxAge ?? 60 * 60 * 12) * 1000,
|
|
9
|
+
};
|
|
10
|
+
const body = Buffer.from(JSON.stringify(payload), 'utf8').toString('base64url');
|
|
11
|
+
return `${body}.${sign(body, options.secret)}`;
|
|
12
|
+
}
|
|
13
|
+
export function verifySessionToken(token, options) {
|
|
14
|
+
if (!token)
|
|
15
|
+
return null;
|
|
16
|
+
const [body, signature] = token.split('.');
|
|
17
|
+
if (!body || !signature)
|
|
18
|
+
return null;
|
|
19
|
+
const expected = sign(body, options.secret);
|
|
20
|
+
const actual = Buffer.from(signature);
|
|
21
|
+
const wanted = Buffer.from(expected);
|
|
22
|
+
if (actual.length !== wanted.length || !timingSafeEqual(actual, wanted))
|
|
23
|
+
return null;
|
|
24
|
+
try {
|
|
25
|
+
const payload = JSON.parse(Buffer.from(body, 'base64url').toString('utf8'));
|
|
26
|
+
if (typeof payload.exp !== 'number' || payload.exp < Date.now())
|
|
27
|
+
return null;
|
|
28
|
+
return payload.user;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function parseCookies(header) {
|
|
35
|
+
const result = {};
|
|
36
|
+
if (!header)
|
|
37
|
+
return result;
|
|
38
|
+
for (const part of header.split(';')) {
|
|
39
|
+
const index = part.indexOf('=');
|
|
40
|
+
if (index === -1)
|
|
41
|
+
continue;
|
|
42
|
+
const key = part.slice(0, index).trim();
|
|
43
|
+
const value = part.slice(index + 1).trim();
|
|
44
|
+
if (!key)
|
|
45
|
+
continue;
|
|
46
|
+
try {
|
|
47
|
+
result[key] = decodeURIComponent(value);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
result[key] = value;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/features/auth/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SchemaNode } from '@nestjs-dash/support';
|
|
2
|
+
import type { AdminMediaServiceContract, AdminStorageServiceContract } from '../../plugin-contracts.js';
|
|
3
|
+
export declare function enrichRecordsWithImageUrls(records: Array<Record<string, unknown>>, columns: SchemaNode[] | undefined, opts: {
|
|
4
|
+
resourceSlug: string;
|
|
5
|
+
storage?: AdminStorageServiceContract | null;
|
|
6
|
+
media?: AdminMediaServiceContract | null;
|
|
7
|
+
}): Promise<Array<Record<string, unknown>>>;
|
|
8
|
+
export declare function hydrateFormMediaValues(values: Record<string, unknown>, form: SchemaNode | null | undefined, opts: {
|
|
9
|
+
resourceSlug: string;
|
|
10
|
+
recordId?: string | number;
|
|
11
|
+
media?: AdminMediaServiceContract | null;
|
|
12
|
+
}): Promise<Record<string, unknown>>;
|
|
13
|
+
//# sourceMappingURL=enrich.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../../src/features/media/enrich.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAIxG,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,OAAO,EAAE,UAAU,EAAE,GAAG,SAAS,EACjC,IAAI,EAAE;IACJ,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAC7C,KAAK,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;CAC1C,GACA,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CA2CzC;AAGD,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,EACnC,IAAI,EAAE;IACJ,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;CAC1C,GACA,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAelC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { collectImageUploadFields } from './media.helpers.js';
|
|
2
|
+
export async function enrichRecordsWithImageUrls(records, columns, opts) {
|
|
3
|
+
if (!columns?.length || !opts.storage) {
|
|
4
|
+
return records;
|
|
5
|
+
}
|
|
6
|
+
const storage = opts.storage;
|
|
7
|
+
const imageColumns = columns.filter((column) => column.kind === 'image-column');
|
|
8
|
+
if (!imageColumns.length) {
|
|
9
|
+
return records;
|
|
10
|
+
}
|
|
11
|
+
return Promise.all(records.map(async (row) => {
|
|
12
|
+
const next = { ...row };
|
|
13
|
+
for (const column of imageColumns) {
|
|
14
|
+
const name = String(column.name ?? '');
|
|
15
|
+
const collection = column.props.collection ? String(column.props.collection) : '';
|
|
16
|
+
let url = '';
|
|
17
|
+
if (collection && opts.media?.isEnabled()) {
|
|
18
|
+
const first = await opts.media.getFirst({ modelType: opts.resourceSlug, modelId: String(row.id ?? '') }, collection);
|
|
19
|
+
if (first) {
|
|
20
|
+
url = await storage.urlFor(first.disk, first.path);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
const raw = row[name];
|
|
25
|
+
if (typeof raw === 'string' && raw) {
|
|
26
|
+
if (raw.startsWith('http://') || raw.startsWith('https://') || raw.startsWith('/')) {
|
|
27
|
+
url = raw;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const diskName = column.props.disk
|
|
31
|
+
? String(column.props.disk)
|
|
32
|
+
: storage.getDefaultDiskName();
|
|
33
|
+
url = await storage.urlFor(diskName, raw);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
next[`__imageUrl:${name}`] = url;
|
|
38
|
+
}
|
|
39
|
+
return next;
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
export async function hydrateFormMediaValues(values, form, opts) {
|
|
43
|
+
if (!form || !opts.media?.isEnabled() || opts.recordId == null) {
|
|
44
|
+
return values;
|
|
45
|
+
}
|
|
46
|
+
const next = { ...values };
|
|
47
|
+
for (const field of collectImageUploadFields(form)) {
|
|
48
|
+
const name = String(field.name ?? field.props.name ?? '');
|
|
49
|
+
const collection = field.props.collection ? String(field.props.collection) : '';
|
|
50
|
+
if (!name || !collection)
|
|
51
|
+
continue;
|
|
52
|
+
next[name] = await opts.media.toClientItems({ modelType: opts.resourceSlug, modelId: opts.recordId }, collection);
|
|
53
|
+
}
|
|
54
|
+
return next;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=enrich.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../../src/features/media/enrich.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EACH,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACpB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EACH,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACpB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SchemaNode } from '@nestjs-dash/support';
|
|
2
|
+
import type { PendingMediaItem } from '../../plugin-contracts.js';
|
|
3
|
+
export declare function collectImageUploadFields(node: SchemaNode | undefined | null): SchemaNode[];
|
|
4
|
+
export declare function parseMediaPayload(raw: unknown): PendingMediaItem[];
|
|
5
|
+
export declare function extractMediaFields(body: Record<string, unknown>, form: SchemaNode | undefined | null): {
|
|
6
|
+
payload: Record<string, unknown>;
|
|
7
|
+
mediaByField: Record<string, {
|
|
8
|
+
collection: string;
|
|
9
|
+
disk?: string;
|
|
10
|
+
items: PendingMediaItem[];
|
|
11
|
+
}>;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=media.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.helpers.d.ts","sourceRoot":"","sources":["../../../src/features/media/media.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,UAAU,EAAE,CAU1F;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,EAAE,CAmBlE;AAGD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,GAClC;IACD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,CAClB,MAAM,EACN;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,gBAAgB,EAAE,CAAA;KAAE,CACjE,CAAC;CACH,CA8BA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export function collectImageUploadFields(node) {
|
|
2
|
+
if (!node)
|
|
3
|
+
return [];
|
|
4
|
+
const out = [];
|
|
5
|
+
if (node.kind === 'image-upload' || node.kind === 'file-upload') {
|
|
6
|
+
out.push(node);
|
|
7
|
+
}
|
|
8
|
+
for (const child of node.children ?? []) {
|
|
9
|
+
out.push(...collectImageUploadFields(child));
|
|
10
|
+
}
|
|
11
|
+
return out;
|
|
12
|
+
}
|
|
13
|
+
export function parseMediaPayload(raw) {
|
|
14
|
+
if (raw == null || raw === '')
|
|
15
|
+
return [];
|
|
16
|
+
if (Array.isArray(raw)) {
|
|
17
|
+
return raw;
|
|
18
|
+
}
|
|
19
|
+
if (typeof raw === 'string') {
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(raw);
|
|
22
|
+
return Array.isArray(parsed)
|
|
23
|
+
? parsed
|
|
24
|
+
: [];
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
if (raw.trim()) {
|
|
28
|
+
return [{ path: raw }];
|
|
29
|
+
}
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
export function extractMediaFields(body, form) {
|
|
36
|
+
const fields = collectImageUploadFields(form);
|
|
37
|
+
const payload = { ...body };
|
|
38
|
+
const mediaByField = {};
|
|
39
|
+
for (const field of fields) {
|
|
40
|
+
const name = String(field.name ?? field.props.name ?? '');
|
|
41
|
+
if (!name)
|
|
42
|
+
continue;
|
|
43
|
+
const collection = String(field.props.collection ?? '');
|
|
44
|
+
const items = parseMediaPayload(payload[name]);
|
|
45
|
+
if (collection) {
|
|
46
|
+
mediaByField[name] = {
|
|
47
|
+
collection,
|
|
48
|
+
disk: field.props.disk ? String(field.props.disk) : undefined,
|
|
49
|
+
items,
|
|
50
|
+
};
|
|
51
|
+
delete payload[name];
|
|
52
|
+
}
|
|
53
|
+
else if (items.length > 0) {
|
|
54
|
+
const first = items[0];
|
|
55
|
+
payload[name] = first?.url ?? first?.path ?? '';
|
|
56
|
+
}
|
|
57
|
+
else if (typeof payload[name] === 'string' && payload[name].startsWith('[')) {
|
|
58
|
+
delete payload[name];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { payload, mediaByField };
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=media.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.helpers.js","sourceRoot":"","sources":["../../../src/features/media/media.helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Panel } from '@nestjs-dash/core';
|
|
2
|
+
import { type CanActivate, type ExecutionContext } from '@nestjs/common';
|
|
3
|
+
import { Reflector } from '@nestjs/core';
|
|
4
|
+
import type { AdminAuthResolver } from '../features/auth/auth.types.js';
|
|
5
|
+
export declare class AdminAuthGuard implements CanActivate {
|
|
6
|
+
private readonly auth;
|
|
7
|
+
private readonly panel;
|
|
8
|
+
private readonly reflector;
|
|
9
|
+
private static warnedOnce;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
constructor(auth: AdminAuthResolver, panel: Panel, reflector: Reflector);
|
|
12
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
13
|
+
private warnUnprotectedOnce;
|
|
14
|
+
private wantsHtml;
|
|
15
|
+
private buildLoginUrl;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=admin-auth.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-auth.guard.d.ts","sourceRoot":"","sources":["../../src/guards/admin-auth.guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAKH,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAexE,qBACa,cAAe,YAAW,WAAW;IAKpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAI9B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAT/C,OAAO,CAAC,MAAM,CAAC,UAAU,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;gBAGb,IAAI,EAAE,iBAAiB,EACtB,KAAK,EAAE,KAAK,EAIpB,SAAS,EAAE,SAAS;IAGpD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAgC9D,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa;CAQtB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
var AdminAuthGuard_1;
|
|
14
|
+
import { Inject, Injectable, Logger, UnauthorizedException, } from '@nestjs/common';
|
|
15
|
+
import { Reflector } from '@nestjs/core';
|
|
16
|
+
import { ADMIN_PUBLIC_KEY } from '../features/auth/public.decorator.js';
|
|
17
|
+
import { NESTJS_DASH_AUTH, NESTJS_DASH_PANEL } from '../tokens.js';
|
|
18
|
+
let AdminAuthGuard = class AdminAuthGuard {
|
|
19
|
+
static { AdminAuthGuard_1 = this; }
|
|
20
|
+
static { this.warnedOnce = false; }
|
|
21
|
+
constructor(auth, panel, reflector) {
|
|
22
|
+
this.auth = auth;
|
|
23
|
+
this.panel = panel;
|
|
24
|
+
this.reflector = reflector;
|
|
25
|
+
this.logger = new Logger(AdminAuthGuard_1.name);
|
|
26
|
+
}
|
|
27
|
+
async canActivate(context) {
|
|
28
|
+
const isPublic = this.reflector.getAllAndOverride(ADMIN_PUBLIC_KEY, [
|
|
29
|
+
context.getHandler(),
|
|
30
|
+
context.getClass(),
|
|
31
|
+
]);
|
|
32
|
+
if (isPublic) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
if (typeof this.auth.authenticate !== 'function') {
|
|
36
|
+
this.warnUnprotectedOnce();
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
const request = context
|
|
40
|
+
.switchToHttp()
|
|
41
|
+
.getRequest();
|
|
42
|
+
const result = await this.auth.authenticate(request, context);
|
|
43
|
+
if (result === false) {
|
|
44
|
+
if (this.auth.loginPath && this.wantsHtml(request)) {
|
|
45
|
+
const response = context.switchToHttp().getResponse();
|
|
46
|
+
response.redirect(302, this.buildLoginUrl(request));
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
throw new UnauthorizedException();
|
|
50
|
+
}
|
|
51
|
+
request.nestjsDashUser = result.user;
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
warnUnprotectedOnce() {
|
|
55
|
+
if (AdminAuthGuard_1.warnedOnce)
|
|
56
|
+
return;
|
|
57
|
+
AdminAuthGuard_1.warnedOnce = true;
|
|
58
|
+
this.logger.warn('No AdminModuleOptions.auth resolver configured — the admin panel is unprotected. ' +
|
|
59
|
+
'Pass credentialsAuthResolver()/jwtAuthResolver()/passportAuthResolver()/customAuthResolver() ' +
|
|
60
|
+
'from "@nestjs-dash/nestjs" to require login.');
|
|
61
|
+
}
|
|
62
|
+
wantsHtml(request) {
|
|
63
|
+
return (request.headers.accept ?? '').includes('text/html');
|
|
64
|
+
}
|
|
65
|
+
buildLoginUrl(request) {
|
|
66
|
+
const loginPath = this.auth.loginPath;
|
|
67
|
+
const isAbsolute = /^https?:\/\//.test(loginPath) || loginPath.startsWith('/');
|
|
68
|
+
const target = isAbsolute ? loginPath : `${this.panel.getPath()}/${loginPath}`;
|
|
69
|
+
const redirect = encodeURIComponent(request.originalUrl ?? request.url ?? '');
|
|
70
|
+
const separator = target.includes('?') ? '&' : '?';
|
|
71
|
+
return `${target}${separator}redirect=${redirect}`;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
AdminAuthGuard = AdminAuthGuard_1 = __decorate([
|
|
75
|
+
Injectable(),
|
|
76
|
+
__param(0, Inject(NESTJS_DASH_AUTH)),
|
|
77
|
+
__param(1, Inject(NESTJS_DASH_PANEL)),
|
|
78
|
+
__param(2, Inject(Reflector)),
|
|
79
|
+
__metadata("design:paramtypes", [Object, Function, Reflector])
|
|
80
|
+
], AdminAuthGuard);
|
|
81
|
+
export { AdminAuthGuard };
|
|
82
|
+
//# sourceMappingURL=admin-auth.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-auth.guard.js","sourceRoot":"","sources":["../../src/guards/admin-auth.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Panel } from '@nestjs-dash/core';
|
|
2
|
+
import { type CanActivate, type ExecutionContext } from '@nestjs/common';
|
|
3
|
+
import { Reflector } from '@nestjs/core';
|
|
4
|
+
export declare class AdminPolicyGuard implements CanActivate {
|
|
5
|
+
private readonly panel;
|
|
6
|
+
private readonly reflector;
|
|
7
|
+
constructor(panel: Panel, reflector: Reflector);
|
|
8
|
+
canActivate(context: ExecutionContext): Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=admin-policy.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-policy.guard.d.ts","sourceRoot":"","sources":["../../src/guards/admin-policy.guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAIH,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAmBzC,qBACa,gBAAiB,YAAW,WAAW;IAErB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAI9B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAJD,KAAK,EAAE,KAAK,EAIpB,SAAS,EAAE,SAAS;IAGpD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CAkC/D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { ForbiddenException, Inject, Injectable, } from '@nestjs/common';
|
|
14
|
+
import { Reflector } from '@nestjs/core';
|
|
15
|
+
import { ADMIN_ACTION_METADATA } from '../decorators/admin-action.decorator.js';
|
|
16
|
+
import { NESTJS_DASH_PANEL } from '../tokens.js';
|
|
17
|
+
let AdminPolicyGuard = class AdminPolicyGuard {
|
|
18
|
+
constructor(panel, reflector) {
|
|
19
|
+
this.panel = panel;
|
|
20
|
+
this.reflector = reflector;
|
|
21
|
+
}
|
|
22
|
+
async canActivate(context) {
|
|
23
|
+
const request = context
|
|
24
|
+
.switchToHttp()
|
|
25
|
+
.getRequest();
|
|
26
|
+
const params = request.params ?? {};
|
|
27
|
+
const action = this.reflector.get(ADMIN_ACTION_METADATA, context.getHandler()) ?? 'view';
|
|
28
|
+
const ctx = { user: request.nestjsDashUser, request, action };
|
|
29
|
+
const resourceSlug = params.slug ?? params.resource;
|
|
30
|
+
if (resourceSlug) {
|
|
31
|
+
const resourceClass = this.panel.getResourceClass(resourceSlug);
|
|
32
|
+
if (resourceClass?.canAccess && !(await resourceClass.canAccess(ctx))) {
|
|
33
|
+
throw new ForbiddenException();
|
|
34
|
+
}
|
|
35
|
+
if (resourceClass?.can && !(await resourceClass.can(action, ctx))) {
|
|
36
|
+
throw new ForbiddenException();
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
if (params.pageSlug) {
|
|
41
|
+
const pageClass = this.panel.getPageClass(params.pageSlug);
|
|
42
|
+
if (pageClass?.canAccess && !(await pageClass.canAccess(ctx))) {
|
|
43
|
+
throw new ForbiddenException();
|
|
44
|
+
}
|
|
45
|
+
if (pageClass?.can && !(await pageClass.can(action, ctx))) {
|
|
46
|
+
throw new ForbiddenException();
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
AdminPolicyGuard = __decorate([
|
|
54
|
+
Injectable(),
|
|
55
|
+
__param(0, Inject(NESTJS_DASH_PANEL)),
|
|
56
|
+
__param(1, Inject(Reflector)),
|
|
57
|
+
__metadata("design:paramtypes", [Function, Reflector])
|
|
58
|
+
], AdminPolicyGuard);
|
|
59
|
+
export { AdminPolicyGuard };
|
|
60
|
+
//# sourceMappingURL=admin-policy.guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-policy.guard.js","sourceRoot":"","sources":["../../src/guards/admin-policy.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EACH,kBAAkB,EAClB,MAAM,EACN,UAAU,GAGb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAkB1C,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YAC8C,KAAY,EAIpB,SAAoB;QAJZ,UAAK,GAAL,KAAK,CAAO;QAIpB,cAAS,GAAT,SAAS,CAAW;IACvD,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,OAAO,GAAG,OAAO;aACpB,YAAY,EAAE;aACd,UAAU,EAAiF,CAAC;QAC/F,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QACpC,MAAM,MAAM,GACV,IAAI,CAAC,SAAS,CAAC,GAAG,CAAqB,qBAAqB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,MAAM,CAAC;QAChG,MAAM,GAAG,GAAuB,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAElF,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC;QACpD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;YAChE,IAAI,aAAa,EAAE,SAAS,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACtE,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACjC,CAAC;YACD,IAAI,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACjC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3D,IAAI,SAAS,EAAE,SAAS,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACjC,CAAC;YACD,IAAI,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC1D,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACjC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA3CY,gBAAgB;IAD5B,UAAU,EAAE;IAGR,WAAA,MAAM,CAAC,iBAAiB,CAAC,CAAA;IAIzB,WAAA,MAAM,CAAC,SAAS,CAAC,CAAA;+CAA6B,SAAS;GAN/C,gBAAgB,CA2C5B"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ResourceAdapter } from '@nestjs-dash/adapter';
|
|
2
|
+
import { type ActionHandlerContext, type ActionHandlerResult } from '@nestjs-dash/core';
|
|
3
|
+
import type { SchemaNode } from '@nestjs-dash/support';
|
|
4
|
+
export declare function findActionNode(list: SchemaNode[] | undefined, name: string): SchemaNode | undefined;
|
|
5
|
+
export declare function executeActionHandler(action: SchemaNode, adapter: ResourceAdapter, ctx: Omit<ActionHandlerContext, 'adapter'>): Promise<ActionHandlerResult | undefined>;
|
|
6
|
+
//# sourceMappingURL=action.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.helpers.d.ts","sourceRoot":"","sources":["../../src/helpers/action.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAEH,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAAE,GAAG,SAAS,EAC9B,IAAI,EAAE,MAAM,GACX,UAAU,GAAG,SAAS,CAExB;AAGD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,eAAe,EACxB,GAAG,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,GACzC,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAM1C"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { resolveActionHandler, } from '@nestjs-dash/core';
|
|
2
|
+
export function findActionNode(list, name) {
|
|
3
|
+
return (list ?? []).find((action) => String(action.props.name ?? '') === name);
|
|
4
|
+
}
|
|
5
|
+
export async function executeActionHandler(action, adapter, ctx) {
|
|
6
|
+
const key = action.props.handlerKey;
|
|
7
|
+
if (typeof key !== 'string')
|
|
8
|
+
return undefined;
|
|
9
|
+
const handler = resolveActionHandler(key);
|
|
10
|
+
if (!handler)
|
|
11
|
+
return undefined;
|
|
12
|
+
return (await handler({ ...ctx, adapter })) ?? {};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=action.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.helpers.js","sourceRoot":"","sources":["../../src/helpers/action.helpers.ts"],"names":[],"mappings":"AACA,OAAO,EACH,oBAAoB,GAGvB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,UAAU,cAAc,CAC5B,IAA8B,EAC9B,IAAY;IAEZ,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC;AACjF,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAkB,EAClB,OAAwB,EACxB,GAA0C;IAE1C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,CAAC,MAAM,OAAO,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.helpers.d.ts","sourceRoot":"","sources":["../../src/helpers/data-source.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAMpE;AAmBD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,CASjE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function isDataSourceLike(value) {
|
|
2
|
+
return (!!value &&
|
|
3
|
+
typeof value === 'object' &&
|
|
4
|
+
typeof value.getRepository === 'function');
|
|
5
|
+
}
|
|
6
|
+
export function requireDataSource(dataSource) {
|
|
7
|
+
if (!isDataSourceLike(dataSource)) {
|
|
8
|
+
throw new Error('NESTJS_DASH_DATA_SOURCE requested but no TypeORM DataSource was configured. Pass it via ' +
|
|
9
|
+
'AdminModule.forRootAsync({ inject: [DataSource], useFactory: (dataSource) => ({ ' +
|
|
10
|
+
'dataSource, panel: ... }) }), or AdminModule.forRoot({ dataSource, panel: ... }).');
|
|
11
|
+
}
|
|
12
|
+
return dataSource;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data-source.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-source.helpers.js","sourceRoot":"","sources":["../../src/helpers/data-source.helpers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,CACL,CAAC,CAAC,KAAK;QACP,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAQ,KAAqC,CAAC,aAAa,KAAK,UAAU,CAC3E,CAAC;AACJ,CAAC;AAmBD,MAAM,UAAU,iBAAiB,CAAC,UAAmB;IACnD,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,0FAA0F;YACxF,kFAAkF;YAClF,mFAAmF,CACtF,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type RenderIconOptions = {
|
|
2
|
+
className?: string;
|
|
3
|
+
size?: number;
|
|
4
|
+
strokeWidth?: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function toLucideIconName(name: string): string;
|
|
7
|
+
export declare function renderIconHtml(name: string | undefined | null, opts?: RenderIconOptions): string;
|
|
8
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/helpers/icons.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAQF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AA0BD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAC/B,IAAI,GAAE,iBAAsB,GAC3B,MAAM,CAwBR"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ui } from '@nestjs-dash/design-system/ui';
|
|
2
|
+
import { icons } from 'lucide';
|
|
3
|
+
const ICON_LOOKUP = icons;
|
|
4
|
+
export function toLucideIconName(name) {
|
|
5
|
+
return name
|
|
6
|
+
.trim()
|
|
7
|
+
.split(/[-_\s]+/)
|
|
8
|
+
.filter(Boolean)
|
|
9
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
10
|
+
.join('');
|
|
11
|
+
}
|
|
12
|
+
function escapeAttr(value) {
|
|
13
|
+
return String(value)
|
|
14
|
+
.replace(/&/g, '&')
|
|
15
|
+
.replace(/"/g, '"')
|
|
16
|
+
.replace(/</g, '<')
|
|
17
|
+
.replace(/>/g, '>');
|
|
18
|
+
}
|
|
19
|
+
function renderSvgChildren(nodes) {
|
|
20
|
+
return nodes
|
|
21
|
+
.map(([tag, attrs]) => {
|
|
22
|
+
const attrString = Object.entries(attrs)
|
|
23
|
+
.filter(([, value]) => value != null)
|
|
24
|
+
.map(([key, value]) => `${key}="${escapeAttr(value)}"`)
|
|
25
|
+
.join(' ');
|
|
26
|
+
return attrString ? `<${tag} ${attrString} />` : `<${tag} />`;
|
|
27
|
+
})
|
|
28
|
+
.join('');
|
|
29
|
+
}
|
|
30
|
+
export function renderIconHtml(name, opts = {}) {
|
|
31
|
+
if (name == null) {
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
const trimmed = String(name).trim();
|
|
35
|
+
if (!trimmed) {
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
38
|
+
const pascal = toLucideIconName(trimmed);
|
|
39
|
+
const node = ICON_LOOKUP[pascal] ??
|
|
40
|
+
ICON_LOOKUP[trimmed] ??
|
|
41
|
+
ICON_LOOKUP[trimmed.charAt(0).toUpperCase() + trimmed.slice(1)];
|
|
42
|
+
if (!node) {
|
|
43
|
+
return '';
|
|
44
|
+
}
|
|
45
|
+
const size = opts.size ?? 16;
|
|
46
|
+
const strokeWidth = opts.strokeWidth ?? 2;
|
|
47
|
+
const className = opts.className ?? ui.icon;
|
|
48
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="${strokeWidth}" stroke-linecap="round" stroke-linejoin="round" class="${escapeAttr(className)}" aria-hidden="true">${renderSvgChildren(node)}</svg>`;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/helpers/icons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,+BAA+B,CAAC;AACnD,OAAO,EAAE,KAAK,EAAiB,MAAM,QAAQ,CAAC;AAQ9C,MAAM,WAAW,GAAG,KAAiC,CAAC;AAMtD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI;SACR,IAAI,EAAE;SACN,KAAK,CAAC,SAAS,CAAC;SAChB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,KAAsB;IACxC,OAAO,MAAM,CAAC,KAAK,CAAC;SACjB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAe;IACxC,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACpB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;aACrC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,UAAU,CAAC,KAAM,CAAC,GAAG,CAAC;aACvD,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,UAAU,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;IAChE,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAMD,MAAM,UAAU,cAAc,CAC5B,IAA+B,EAC/B,OAA0B,EAAE;IAE5B,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,IAAI,GACR,WAAW,CAAC,MAAM,CAAC;QACnB,WAAW,CAAC,OAAO,CAAC;QACpB,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAElE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,CAAC;IAE5C,OAAO,kDAAkD,IAAI,aAAa,IAAI,yEAAyE,WAAW,2DAA2D,UAAU,CAAC,SAAS,CAAC,wBAAwB,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC5S,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { NavigationGroup } from '@nestjs-dash/core';
|
|
2
|
+
export declare const NAV_COLLAPSE_COOKIE_NAME = "nestjs_dash_nav_collapsed";
|
|
3
|
+
export declare function parseNavCollapseCookie(raw: string | undefined): Set<string>;
|
|
4
|
+
export declare function sanitizeCollapsedGroups(input: unknown): string[];
|
|
5
|
+
export declare function applyNavCollapseState(groups: NavigationGroup[], collapsedLabels: Set<string>): NavigationGroup[];
|
|
6
|
+
//# sourceMappingURL=nav-collapse.helper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav-collapse.helper.d.ts","sourceRoot":"","sources":["../../src/helpers/nav-collapse.helper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,eAAO,MAAM,wBAAwB,8BAA8B,CAAC;AAWpE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAQ3E;AAGD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAShE;AAOD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,eAAe,EAAE,EACzB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAC3B,eAAe,EAAE,CAInB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const NAV_COLLAPSE_COOKIE_NAME = 'nestjs_dash_nav_collapsed';
|
|
2
|
+
const MAX_GROUPS = 50;
|
|
3
|
+
const MAX_LABEL_LENGTH = 100;
|
|
4
|
+
export function parseNavCollapseCookie(raw) {
|
|
5
|
+
if (!raw)
|
|
6
|
+
return new Set();
|
|
7
|
+
try {
|
|
8
|
+
const parsed = JSON.parse(raw);
|
|
9
|
+
return new Set(sanitizeCollapsedGroups(parsed));
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return new Set();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function sanitizeCollapsedGroups(input) {
|
|
16
|
+
if (!Array.isArray(input))
|
|
17
|
+
return [];
|
|
18
|
+
return Array.from(new Set(input
|
|
19
|
+
.filter((value) => typeof value === 'string')
|
|
20
|
+
.map((value) => value.slice(0, MAX_LABEL_LENGTH)))).slice(0, MAX_GROUPS);
|
|
21
|
+
}
|
|
22
|
+
export function applyNavCollapseState(groups, collapsedLabels) {
|
|
23
|
+
return groups.map((group) => group.collapsible ? { ...group, collapsed: collapsedLabels.has(group.label) } : group);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=nav-collapse.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nav-collapse.helper.js","sourceRoot":"","sources":["../../src/helpers/nav-collapse.helper.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,wBAAwB,GAAG,2BAA2B,CAAC;AAEpE,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAQ7B,MAAM,UAAU,sBAAsB,CAAC,GAAuB;IAC5D,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,IAAI,GAAG,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAGD,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,GAAG,CACL,KAAK;SACF,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;SAC7D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,CACpD,CACF,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AACzB,CAAC;AAOD,MAAM,UAAU,qBAAqB,CACnC,MAAyB,EACzB,eAA4B;IAE5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1B,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CACtF,CAAC;AACJ,CAAC"}
|