@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.
Files changed (195) hide show
  1. package/dist/client/nestjs-dash.js +2126 -0
  2. package/dist/client/nestjs-dash.js.map +7 -0
  3. package/dist/controllers/admin-api.controller.d.ts +41 -0
  4. package/dist/controllers/admin-api.controller.d.ts.map +1 -0
  5. package/dist/controllers/admin-api.controller.js +299 -0
  6. package/dist/controllers/admin-api.controller.js.map +1 -0
  7. package/dist/controllers/admin-auth.controller.d.ts +17 -0
  8. package/dist/controllers/admin-auth.controller.d.ts.map +1 -0
  9. package/dist/controllers/admin-auth.controller.js +111 -0
  10. package/dist/controllers/admin-auth.controller.js.map +1 -0
  11. package/dist/controllers/admin-upload.controller.d.ts +50 -0
  12. package/dist/controllers/admin-upload.controller.d.ts.map +1 -0
  13. package/dist/controllers/admin-upload.controller.js +210 -0
  14. package/dist/controllers/admin-upload.controller.js.map +1 -0
  15. package/dist/controllers/admin.controller.d.ts +69 -0
  16. package/dist/controllers/admin.controller.d.ts.map +1 -0
  17. package/dist/controllers/admin.controller.js +1062 -0
  18. package/dist/controllers/admin.controller.js.map +1 -0
  19. package/dist/decorators/admin-action.decorator.d.ts +4 -0
  20. package/dist/decorators/admin-action.decorator.d.ts.map +1 -0
  21. package/dist/decorators/admin-action.decorator.js +6 -0
  22. package/dist/decorators/admin-action.decorator.js.map +1 -0
  23. package/dist/decorators/admin-page.decorator.d.ts +3 -0
  24. package/dist/decorators/admin-page.decorator.d.ts.map +1 -0
  25. package/dist/decorators/admin-page.decorator.js +6 -0
  26. package/dist/decorators/admin-page.decorator.js.map +1 -0
  27. package/dist/decorators/admin-resource.decorator.d.ts +3 -0
  28. package/dist/decorators/admin-resource.decorator.d.ts.map +1 -0
  29. package/dist/decorators/admin-resource.decorator.js +6 -0
  30. package/dist/decorators/admin-resource.decorator.js.map +1 -0
  31. package/dist/features/audit/audit.interceptor.d.ts +17 -0
  32. package/dist/features/audit/audit.interceptor.d.ts.map +1 -0
  33. package/dist/features/audit/audit.interceptor.js +94 -0
  34. package/dist/features/audit/audit.interceptor.js.map +1 -0
  35. package/dist/features/audit/index.d.ts +2 -0
  36. package/dist/features/audit/index.d.ts.map +1 -0
  37. package/dist/features/audit/index.js +2 -0
  38. package/dist/features/audit/index.js.map +1 -0
  39. package/dist/features/auth/auth.types.d.ts +13 -0
  40. package/dist/features/auth/auth.types.d.ts.map +1 -0
  41. package/dist/features/auth/auth.types.js +2 -0
  42. package/dist/features/auth/auth.types.js.map +1 -0
  43. package/dist/features/auth/index.d.ts +12 -0
  44. package/dist/features/auth/index.d.ts.map +1 -0
  45. package/dist/features/auth/index.js +7 -0
  46. package/dist/features/auth/index.js.map +1 -0
  47. package/dist/features/auth/public.decorator.d.ts +3 -0
  48. package/dist/features/auth/public.decorator.d.ts.map +1 -0
  49. package/dist/features/auth/public.decorator.js +4 -0
  50. package/dist/features/auth/public.decorator.js.map +1 -0
  51. package/dist/features/auth/resolvers/credentials.resolver.d.ts +10 -0
  52. package/dist/features/auth/resolvers/credentials.resolver.d.ts.map +1 -0
  53. package/dist/features/auth/resolvers/credentials.resolver.js +35 -0
  54. package/dist/features/auth/resolvers/credentials.resolver.js.map +1 -0
  55. package/dist/features/auth/resolvers/custom.resolver.d.ts +7 -0
  56. package/dist/features/auth/resolvers/custom.resolver.d.ts.map +1 -0
  57. package/dist/features/auth/resolvers/custom.resolver.js +9 -0
  58. package/dist/features/auth/resolvers/custom.resolver.js.map +1 -0
  59. package/dist/features/auth/resolvers/jwt.resolver.d.ts +10 -0
  60. package/dist/features/auth/resolvers/jwt.resolver.d.ts.map +1 -0
  61. package/dist/features/auth/resolvers/jwt.resolver.js +24 -0
  62. package/dist/features/auth/resolvers/jwt.resolver.js.map +1 -0
  63. package/dist/features/auth/resolvers/passport.resolver.d.ts +9 -0
  64. package/dist/features/auth/resolvers/passport.resolver.d.ts.map +1 -0
  65. package/dist/features/auth/resolvers/passport.resolver.js +15 -0
  66. package/dist/features/auth/resolvers/passport.resolver.js.map +1 -0
  67. package/dist/features/auth/session.d.ts +9 -0
  68. package/dist/features/auth/session.d.ts.map +1 -0
  69. package/dist/features/auth/session.js +55 -0
  70. package/dist/features/auth/session.js.map +1 -0
  71. package/dist/features/media/enrich.d.ts +13 -0
  72. package/dist/features/media/enrich.d.ts.map +1 -0
  73. package/dist/features/media/enrich.js +56 -0
  74. package/dist/features/media/enrich.js.map +1 -0
  75. package/dist/features/media/index.d.ts +3 -0
  76. package/dist/features/media/index.d.ts.map +1 -0
  77. package/dist/features/media/index.js +3 -0
  78. package/dist/features/media/index.js.map +1 -0
  79. package/dist/features/media/media.helpers.d.ts +13 -0
  80. package/dist/features/media/media.helpers.d.ts.map +1 -0
  81. package/dist/features/media/media.helpers.js +63 -0
  82. package/dist/features/media/media.helpers.js.map +1 -0
  83. package/dist/guards/admin-auth.guard.d.ts +17 -0
  84. package/dist/guards/admin-auth.guard.d.ts.map +1 -0
  85. package/dist/guards/admin-auth.guard.js +82 -0
  86. package/dist/guards/admin-auth.guard.js.map +1 -0
  87. package/dist/guards/admin-policy.guard.d.ts +10 -0
  88. package/dist/guards/admin-policy.guard.d.ts.map +1 -0
  89. package/dist/guards/admin-policy.guard.js +60 -0
  90. package/dist/guards/admin-policy.guard.js.map +1 -0
  91. package/dist/helpers/action.helpers.d.ts +6 -0
  92. package/dist/helpers/action.helpers.d.ts.map +1 -0
  93. package/dist/helpers/action.helpers.js +14 -0
  94. package/dist/helpers/action.helpers.js.map +1 -0
  95. package/dist/helpers/data-source.helpers.d.ts +4 -0
  96. package/dist/helpers/data-source.helpers.d.ts.map +1 -0
  97. package/dist/helpers/data-source.helpers.js +14 -0
  98. package/dist/helpers/data-source.helpers.js.map +1 -0
  99. package/dist/helpers/icons.d.ts +8 -0
  100. package/dist/helpers/icons.d.ts.map +1 -0
  101. package/dist/helpers/icons.js +50 -0
  102. package/dist/helpers/icons.js.map +1 -0
  103. package/dist/helpers/nav-collapse.helper.d.ts +6 -0
  104. package/dist/helpers/nav-collapse.helper.d.ts.map +1 -0
  105. package/dist/helpers/nav-collapse.helper.js +25 -0
  106. package/dist/helpers/nav-collapse.helper.js.map +1 -0
  107. package/dist/helpers/relation.helpers.d.ts +17 -0
  108. package/dist/helpers/relation.helpers.d.ts.map +1 -0
  109. package/dist/helpers/relation.helpers.js +98 -0
  110. package/dist/helpers/relation.helpers.js.map +1 -0
  111. package/dist/helpers/shell-assets.helper.d.ts +6 -0
  112. package/dist/helpers/shell-assets.helper.d.ts.map +1 -0
  113. package/dist/helpers/shell-assets.helper.js +14 -0
  114. package/dist/helpers/shell-assets.helper.js.map +1 -0
  115. package/dist/index.d.ts +29 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +27 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/modules/admin-api-host.module.d.ts +3 -0
  120. package/dist/modules/admin-api-host.module.d.ts.map +1 -0
  121. package/dist/modules/admin-api-host.module.js +17 -0
  122. package/dist/modules/admin-api-host.module.js.map +1 -0
  123. package/dist/modules/admin-core.module.d.ts +3 -0
  124. package/dist/modules/admin-core.module.d.ts.map +1 -0
  125. package/dist/modules/admin-core.module.js +37 -0
  126. package/dist/modules/admin-core.module.js.map +1 -0
  127. package/dist/modules/admin-feature.module.d.ts +3 -0
  128. package/dist/modules/admin-feature.module.d.ts.map +1 -0
  129. package/dist/modules/admin-feature.module.js +14 -0
  130. package/dist/modules/admin-feature.module.js.map +1 -0
  131. package/dist/modules/admin-ui-host.module.d.ts +3 -0
  132. package/dist/modules/admin-ui-host.module.d.ts.map +1 -0
  133. package/dist/modules/admin-ui-host.module.js +19 -0
  134. package/dist/modules/admin-ui-host.module.js.map +1 -0
  135. package/dist/modules/admin.module.d.ts +18 -0
  136. package/dist/modules/admin.module.d.ts.map +1 -0
  137. package/dist/modules/admin.module.js +197 -0
  138. package/dist/modules/admin.module.js.map +1 -0
  139. package/dist/plugin-contracts.d.ts +88 -0
  140. package/dist/plugin-contracts.d.ts.map +1 -0
  141. package/dist/plugin-contracts.js +4 -0
  142. package/dist/plugin-contracts.js.map +1 -0
  143. package/dist/plugins/openapi/admin-openapi.d.ts +21 -0
  144. package/dist/plugins/openapi/admin-openapi.d.ts.map +1 -0
  145. package/dist/plugins/openapi/admin-openapi.js +237 -0
  146. package/dist/plugins/openapi/admin-openapi.js.map +1 -0
  147. package/dist/providers/admin-page.explorer.d.ts +8 -0
  148. package/dist/providers/admin-page.explorer.d.ts.map +1 -0
  149. package/dist/providers/admin-page.explorer.js +43 -0
  150. package/dist/providers/admin-page.explorer.js.map +1 -0
  151. package/dist/providers/admin-page.registry.d.ts +9 -0
  152. package/dist/providers/admin-page.registry.d.ts.map +1 -0
  153. package/dist/providers/admin-page.registry.js +39 -0
  154. package/dist/providers/admin-page.registry.js.map +1 -0
  155. package/dist/providers/admin-panel.bootstrap.d.ts +23 -0
  156. package/dist/providers/admin-panel.bootstrap.d.ts.map +1 -0
  157. package/dist/providers/admin-panel.bootstrap.js +122 -0
  158. package/dist/providers/admin-panel.bootstrap.js.map +1 -0
  159. package/dist/providers/admin-resource.explorer.d.ts +8 -0
  160. package/dist/providers/admin-resource.explorer.d.ts.map +1 -0
  161. package/dist/providers/admin-resource.explorer.js +43 -0
  162. package/dist/providers/admin-resource.explorer.js.map +1 -0
  163. package/dist/providers/admin-resource.registry.d.ts +9 -0
  164. package/dist/providers/admin-resource.registry.d.ts.map +1 -0
  165. package/dist/providers/admin-resource.registry.js +39 -0
  166. package/dist/providers/admin-resource.registry.js.map +1 -0
  167. package/dist/react/admin-app.d.ts +14 -0
  168. package/dist/react/admin-app.d.ts.map +1 -0
  169. package/dist/react/admin-app.js +421 -0
  170. package/dist/react/admin-app.js.map +1 -0
  171. package/dist/react/document.d.ts +13 -0
  172. package/dist/react/document.d.ts.map +1 -0
  173. package/dist/react/document.js +47 -0
  174. package/dist/react/document.js.map +1 -0
  175. package/dist/react/nav-client.d.ts +10 -0
  176. package/dist/react/nav-client.d.ts.map +1 -0
  177. package/dist/react/nav-client.js +153 -0
  178. package/dist/react/nav-client.js.map +1 -0
  179. package/dist/react/theme.d.ts +6 -0
  180. package/dist/react/theme.d.ts.map +1 -0
  181. package/dist/react/theme.js +51 -0
  182. package/dist/react/theme.js.map +1 -0
  183. package/dist/react/types.d.ts +107 -0
  184. package/dist/react/types.d.ts.map +1 -0
  185. package/dist/react/types.js +2 -0
  186. package/dist/react/types.js.map +1 -0
  187. package/dist/tokens.d.ts +106 -0
  188. package/dist/tokens.d.ts.map +1 -0
  189. package/dist/tokens.js +74 -0
  190. package/dist/tokens.js.map +1 -0
  191. package/dist/views/admin.views.d.ts +114 -0
  192. package/dist/views/admin.views.d.ts.map +1 -0
  193. package/dist/views/admin.views.js +212 -0
  194. package/dist/views/admin.views.js.map +1 -0
  195. 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,3 @@
1
+ export { enrichRecordsWithImageUrls, hydrateFormMediaValues } from './enrich.js';
2
+ export { collectImageUploadFields, extractMediaFields, parseMediaPayload } from './media.helpers.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export { enrichRecordsWithImageUrls, hydrateFormMediaValues } from './enrich.js';
2
+ export { collectImageUploadFields, extractMediaFields, parseMediaPayload } from './media.helpers.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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,4 @@
1
+ import type { DataSource } from 'typeorm';
2
+ export declare function isDataSourceLike(value: unknown): value is DataSource;
3
+ export declare function requireDataSource(dataSource: unknown): DataSource;
4
+ //# sourceMappingURL=data-source.helpers.d.ts.map
@@ -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, '&amp;')
15
+ .replace(/"/g, '&quot;')
16
+ .replace(/</g, '&lt;')
17
+ .replace(/>/g, '&gt;');
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"}