@postxl/generators 1.18.0 → 1.19.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/backend-actions/actions.generator.d.ts +1 -0
- package/dist/backend-actions/actions.generator.js +6 -0
- package/dist/backend-actions/actions.generator.js.map +1 -1
- package/dist/backend-actions/generators/actions-module.generator.js +3 -2
- package/dist/backend-actions/generators/actions-module.generator.js.map +1 -1
- package/dist/backend-actions/generators/authorization-policy-service.generator.d.ts +2 -0
- package/dist/backend-actions/generators/authorization-policy-service.generator.js +214 -0
- package/dist/backend-actions/generators/authorization-policy-service.generator.js.map +1 -0
- package/dist/backend-actions/generators/authorization-service.generator.d.ts +1 -1
- package/dist/backend-actions/generators/authorization-service.generator.js +20 -8
- package/dist/backend-actions/generators/authorization-service.generator.js.map +1 -1
- package/dist/backend-actions/generators/dispatcher-service.generator.js +3 -2
- package/dist/backend-actions/generators/dispatcher-service.generator.js.map +1 -1
- package/dist/backend-ai/generators/ai-route.generator.js +3 -3
- package/dist/backend-authentication/authentication.generator.js +23 -1
- package/dist/backend-authentication/authentication.generator.js.map +1 -1
- package/dist/backend-authentication/generators/auth-guard.generator.js +5 -8
- package/dist/backend-authentication/generators/auth-guard.generator.js.map +1 -1
- package/dist/backend-authentication/generators/authentication-module.generator.js +1 -1
- package/dist/backend-authentication/generators/authentication-service.generator.js +11 -8
- package/dist/backend-authentication/generators/authentication-service.generator.js.map +1 -1
- package/dist/backend-authentication/generators/authentication-types.generator.js +4 -3
- package/dist/backend-authentication/generators/authentication-types.generator.js.map +1 -1
- package/dist/backend-authentication/template/src/authentication.config.ts +9 -0
- package/dist/backend-authentication/template/src/authentication.mock.service.ts +77 -13
- package/dist/backend-authentication/template/src/utils.ts +45 -0
- package/dist/backend-core/backend.generator.js +16 -0
- package/dist/backend-core/backend.generator.js.map +1 -1
- package/dist/backend-core/generators/api-config.generator.js +5 -0
- package/dist/backend-core/generators/api-config.generator.js.map +1 -1
- package/dist/backend-core/types.d.ts +4 -0
- package/dist/backend-excel-io/generators/excel-io-service.generator.js +27 -11
- package/dist/backend-excel-io/generators/excel-io-service.generator.js.map +1 -1
- package/dist/backend-excel-io/template/excel-io.controller.ts +3 -3
- package/dist/backend-rest-api/generators/model-controller.generator.js +9 -5
- package/dist/backend-rest-api/generators/model-controller.generator.js.map +1 -1
- package/dist/backend-rest-api/template/restApi/src/restApi.utils.ts +9 -0
- package/dist/backend-router-trpc/generators/audit-log-route.generator.js +2 -2
- package/dist/backend-router-trpc/generators/excel-io-route.generator.js +1 -1
- package/dist/backend-router-trpc/generators/middleware.generator.js +8 -5
- package/dist/backend-router-trpc/generators/middleware.generator.js.map +1 -1
- package/dist/backend-router-trpc/generators/model-routes.generator.js +27 -7
- package/dist/backend-router-trpc/generators/model-routes.generator.js.map +1 -1
- package/dist/backend-router-trpc/generators/trpc-plugin.generator.js +9 -6
- package/dist/backend-router-trpc/generators/trpc-plugin.generator.js.map +1 -1
- package/dist/backend-router-trpc/generators/trpc-shared.generator.js +4 -24
- package/dist/backend-router-trpc/generators/trpc-shared.generator.js.map +1 -1
- package/dist/backend-router-trpc/router-trpc.generator.d.ts +4 -0
- package/dist/backend-router-trpc/router-trpc.generator.js +1 -0
- package/dist/backend-router-trpc/router-trpc.generator.js.map +1 -1
- package/dist/backend-router-trpc/template/viewer.router.ts +1 -6
- package/dist/backend-update/update-actions.decoders.d.ts +4 -4
- package/dist/backend-upload/template/src/upload.controller.ts +1 -1
- package/dist/backend-upload/template/src/upload.service.ts +11 -5
- package/dist/backend-view/model-view-service.generator.js +105 -52
- package/dist/backend-view/model-view-service.generator.js.map +1 -1
- package/dist/backend-view/view.generator.d.ts +2 -1
- package/dist/backend-view/view.generator.js +8 -1
- package/dist/backend-view/view.generator.js.map +1 -1
- package/dist/base/base.generator.js +2 -0
- package/dist/base/base.generator.js.map +1 -1
- package/dist/e2e/template/e2e/specs/example.spec.ts-snapshots/Navigate-to-homepage-and-take-snapshot-1-chromium-linux.png +0 -0
- package/dist/frontend-admin/admin.generator.js +2 -0
- package/dist/frontend-admin/admin.generator.js.map +1 -1
- package/dist/frontend-admin/generators/authorization-utils.generator.d.ts +1 -0
- package/dist/frontend-admin/generators/authorization-utils.generator.js +20 -0
- package/dist/frontend-admin/generators/authorization-utils.generator.js.map +1 -0
- package/dist/frontend-admin/generators/comment-sidebar.generator.js +9 -1
- package/dist/frontend-admin/generators/comment-sidebar.generator.js.map +1 -1
- package/dist/frontend-admin/generators/model-admin-page.generator.js +347 -184
- package/dist/frontend-admin/generators/model-admin-page.generator.js.map +1 -1
- package/dist/frontend-core/frontend.generator.d.ts +6 -0
- package/dist/frontend-core/frontend.generator.js +10 -3
- package/dist/frontend-core/frontend.generator.js.map +1 -1
- package/dist/frontend-core/template/README.md +2 -0
- package/dist/frontend-core/template/src/context-providers/auth-context-provider.tsx +1 -2
- package/dist/frontend-core/template/src/pages/dashboard/dashboard.page.tsx +10 -1
- package/dist/frontend-core/template/src/pages/login/login.page.tsx +1 -1
- package/dist/frontend-core/template/vite.config.ts +5 -0
- package/dist/frontend-core/types/component.d.ts +1 -1
- package/dist/frontend-core/types/contextprovider.d.ts +1 -1
- package/dist/frontend-core/types/hook.d.ts +1 -1
- package/dist/frontend-trpc-client/generators/model-hook.generator.js +104 -39
- package/dist/frontend-trpc-client/generators/model-hook.generator.js.map +1 -1
- package/dist/frontend-trpc-client/trpc-client.generator.js +28 -14
- package/dist/frontend-trpc-client/trpc-client.generator.js.map +1 -1
- package/dist/types/types.generator.d.ts +7 -0
- package/dist/types/types.generator.js +80 -0
- package/dist/types/types.generator.js.map +1 -1
- package/package.json +3 -3
|
@@ -5,6 +5,7 @@ function generateAuthenticationTypes(context) {
|
|
|
5
5
|
return /* ts */ `
|
|
6
6
|
import { z } from 'zod'
|
|
7
7
|
import { Result } from '@postxl/utils'
|
|
8
|
+
import { USER_ROLES } from '@types'
|
|
8
9
|
import { Viewer } from '@authentication/auth.guard'
|
|
9
10
|
|
|
10
11
|
/**
|
|
@@ -42,12 +43,12 @@ export const z${context.authentication.types.userInfo.name} = z.object({
|
|
|
42
43
|
*/
|
|
43
44
|
export type ${context.authentication.types.userInfo.name} = z.infer<typeof z${context.authentication.types.userInfo.name}>
|
|
44
45
|
|
|
45
|
-
export const
|
|
46
|
+
export const zUserRole = z.enum(USER_ROLES)
|
|
46
47
|
|
|
47
|
-
export
|
|
48
|
+
export const z${context.authentication.types.userRoles.name} = z.array(zUserRole)
|
|
48
49
|
|
|
49
50
|
export type ViewerResult = Result<
|
|
50
|
-
|
|
51
|
+
Viewer,
|
|
51
52
|
| {
|
|
52
53
|
type: 'redirect'
|
|
53
54
|
redirectUrl: string
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authentication-types.generator.js","sourceRoot":"","sources":["../../../src/backend-authentication/generators/authentication-types.generator.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"authentication-types.generator.js","sourceRoot":"","sources":["../../../src/backend-authentication/generators/authentication-types.generator.ts"],"names":[],"mappings":";;AAEA,kEA4DC;AA5DD,SAAgB,2BAA2B,CAAC,OAAsB;IAChE,OAAO,QAAQ,CAAC;;;;;;;KAOb,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;;;gBAG/B,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2BrD,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;;cAEjC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,sBAAsB,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;;;;gBAIxG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI;;;;;;;;;;;;;;;CAe1D,CAAA;AACD,CAAC"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
export type AuthenticationConfig = AuthenticationConfig_Disabled | AuthenticationConfig_EnabledKeycloak
|
|
2
2
|
export type AuthenticationConfig_Disabled = {
|
|
3
3
|
enableAuthentication: false
|
|
4
|
+
mockIdentity: {
|
|
5
|
+
sub: string
|
|
6
|
+
name: string
|
|
7
|
+
email: string
|
|
8
|
+
roles: string[]
|
|
9
|
+
groups: string[]
|
|
10
|
+
}
|
|
11
|
+
allowTestOverrides: boolean
|
|
4
12
|
}
|
|
5
13
|
export type AuthenticationConfig_EnabledKeycloak = {
|
|
6
14
|
enableAuthentication: true
|
|
15
|
+
roleClaimPath: string
|
|
7
16
|
/**
|
|
8
17
|
* The URL of the backend server.
|
|
9
18
|
*/
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
// We import Fastify cookie here to ensure that the cookie plugin and its types are registered.
|
|
2
2
|
import '@fastify/cookie'
|
|
3
3
|
|
|
4
|
-
import type {
|
|
4
|
+
import type { FastifyRequest } from 'fastify'
|
|
5
|
+
|
|
6
|
+
import type { UserRoles } from '@types'
|
|
7
|
+
|
|
8
|
+
import type { AuthenticationConfig_Disabled } from './authentication.config'
|
|
9
|
+
import { zUserRoles } from './authentication.types'
|
|
10
|
+
import type { UserInfo } from './authentication.types'
|
|
11
|
+
import { parseStringList } from './utils'
|
|
5
12
|
|
|
6
13
|
type MockAuthenticationResult = {
|
|
7
14
|
/**
|
|
@@ -49,6 +56,54 @@ const mockResult: MockAuthenticationResult = {
|
|
|
49
56
|
|
|
50
57
|
export class MockAuthenticationService {
|
|
51
58
|
public readonly cookieDomain = 'localhost'
|
|
59
|
+
private readonly mockResult: MockAuthenticationResult
|
|
60
|
+
|
|
61
|
+
constructor(private readonly config: AuthenticationConfig_Disabled) {
|
|
62
|
+
const parsedConfigRoles = zUserRoles.safeParse(config.mockIdentity.roles)
|
|
63
|
+
|
|
64
|
+
this.mockResult = {
|
|
65
|
+
...mockResult,
|
|
66
|
+
userInfo: {
|
|
67
|
+
...mockResult.userInfo,
|
|
68
|
+
sub: config.mockIdentity.sub,
|
|
69
|
+
name: config.mockIdentity.name,
|
|
70
|
+
preferred_username: config.mockIdentity.email,
|
|
71
|
+
given_name: config.mockIdentity.name.split(' ').at(0) ?? config.mockIdentity.name,
|
|
72
|
+
family_name: config.mockIdentity.name.split(' ').slice(1).join(' ') || config.mockIdentity.name,
|
|
73
|
+
email: config.mockIdentity.email,
|
|
74
|
+
groups: config.mockIdentity.groups,
|
|
75
|
+
},
|
|
76
|
+
userRoles: parsedConfigRoles.success ? parsedConfigRoles.data : mockResult.userRoles,
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private parseHeaderRoles(raw: unknown): UserRoles {
|
|
81
|
+
const parsed = zUserRoles.safeParse(parseStringList(raw, this.mockResult.userRoles))
|
|
82
|
+
return parsed.success ? parsed.data : this.mockResult.userRoles
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private getTestOverrideRoles(req: FastifyRequest | undefined): UserRoles | null {
|
|
86
|
+
// Test override headers are only honored when:
|
|
87
|
+
// - authentication is disabled (`AUTH=false`) and
|
|
88
|
+
// - explicit test overrides are enabled (`AUTH_TEST_OVERRIDES=true`) and
|
|
89
|
+
// - runtime is test (`NODE_ENV=test`)
|
|
90
|
+
if (!this.config.allowTestOverrides || process.env.NODE_ENV !== 'test' || !req) {
|
|
91
|
+
return null
|
|
92
|
+
}
|
|
93
|
+
const rawRoles = req.headers['x-pxl-test-roles']
|
|
94
|
+
return this.parseHeaderRoles(rawRoles)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private getTestOverrideSub(req: FastifyRequest | undefined): string | undefined {
|
|
98
|
+
if (!this.config.allowTestOverrides || process.env.NODE_ENV !== 'test' || !req) {
|
|
99
|
+
return undefined
|
|
100
|
+
}
|
|
101
|
+
const rawSub = req.headers['x-pxl-test-sub']
|
|
102
|
+
if (typeof rawSub !== 'string' || rawSub.trim().length === 0) {
|
|
103
|
+
return undefined
|
|
104
|
+
}
|
|
105
|
+
return rawSub.trim()
|
|
106
|
+
}
|
|
52
107
|
|
|
53
108
|
public refreshAccessToken(): Promise<
|
|
54
109
|
| {
|
|
@@ -62,7 +117,7 @@ export class MockAuthenticationService {
|
|
|
62
117
|
error: unknown
|
|
63
118
|
}
|
|
64
119
|
> {
|
|
65
|
-
return Promise.resolve({ ok: true, accessToken: mockResult.accessToken, state: null }) // NOSONAR - We want to adhere to the interface
|
|
120
|
+
return Promise.resolve({ ok: true, accessToken: this.mockResult.accessToken, state: null }) // NOSONAR - We want to adhere to the interface
|
|
66
121
|
}
|
|
67
122
|
public getAccessTokenFromURL(): Promise<
|
|
68
123
|
| {
|
|
@@ -75,36 +130,45 @@ export class MockAuthenticationService {
|
|
|
75
130
|
error: unknown
|
|
76
131
|
}
|
|
77
132
|
> {
|
|
78
|
-
return Promise.resolve({ ok: true, accessToken: mockResult.accessToken, state: null }) // NOSONAR - We want to adhere to the interface
|
|
133
|
+
return Promise.resolve({ ok: true, accessToken: this.mockResult.accessToken, state: null }) // NOSONAR - We want to adhere to the interface
|
|
79
134
|
}
|
|
80
135
|
public getAuthenticationUrl(): Promise<string> {
|
|
81
|
-
return Promise.resolve(mockResult.authRedirectUrl) // NOSONAR - We want to adhere to the interface
|
|
136
|
+
return Promise.resolve(this.mockResult.authRedirectUrl) // NOSONAR - We want to adhere to the interface
|
|
82
137
|
}
|
|
83
138
|
|
|
84
|
-
public async getUserInfoFromRequest(): Promise<{ ok: true; userInfo: UserInfo } | { ok: false }> {
|
|
85
|
-
const info = await this.getUserInfo()
|
|
139
|
+
public async getUserInfoFromRequest(req?: FastifyRequest): Promise<{ ok: true; userInfo: UserInfo } | { ok: false }> {
|
|
140
|
+
const info = await this.getUserInfo(req)
|
|
86
141
|
|
|
87
142
|
return info
|
|
88
143
|
}
|
|
89
144
|
|
|
90
|
-
public getUserInfo(): Promise<{ ok: true; userInfo: UserInfo } | { ok: false }> {
|
|
145
|
+
public getUserInfo(req?: FastifyRequest): Promise<{ ok: true; userInfo: UserInfo } | { ok: false }> {
|
|
146
|
+
const overrideSub = this.getTestOverrideSub(req)
|
|
91
147
|
// NOSONAR - We want to keep all validations async to adhere to the same interface
|
|
92
148
|
return Promise.resolve({
|
|
93
149
|
ok: true,
|
|
94
|
-
userInfo:
|
|
150
|
+
userInfo: {
|
|
151
|
+
...this.mockResult.userInfo,
|
|
152
|
+
sub: overrideSub ?? this.mockResult.userInfo.sub,
|
|
153
|
+
},
|
|
95
154
|
})
|
|
96
155
|
}
|
|
97
156
|
|
|
98
|
-
public async getUserRolesFromRequest(
|
|
99
|
-
|
|
157
|
+
public async getUserRolesFromRequest(
|
|
158
|
+
req?: FastifyRequest,
|
|
159
|
+
): Promise<{ ok: true; userRoles: UserRoles } | { ok: false }> {
|
|
160
|
+
const roles = await this.getUserRoles(req)
|
|
100
161
|
|
|
101
162
|
return roles
|
|
102
163
|
}
|
|
103
164
|
|
|
104
|
-
public getUserRoles(): Promise<{ ok: true; userRoles: UserRoles } | { ok: false }> {
|
|
105
|
-
return Promise.resolve({
|
|
165
|
+
public getUserRoles(req?: FastifyRequest): Promise<{ ok: true; userRoles: UserRoles } | { ok: false }> {
|
|
166
|
+
return Promise.resolve({
|
|
167
|
+
ok: true,
|
|
168
|
+
userRoles: this.getTestOverrideRoles(req) ?? this.mockResult.userRoles,
|
|
169
|
+
}) // NOSONAR - We want to adhere to the interface
|
|
106
170
|
}
|
|
107
171
|
public getLogoutUrl(): Promise<string> {
|
|
108
|
-
return Promise.resolve(mockResult.logoutRedirectUrl) // NOSONAR - We want to adhere to the interface
|
|
172
|
+
return Promise.resolve(this.mockResult.logoutRedirectUrl) // NOSONAR - We want to adhere to the interface
|
|
109
173
|
}
|
|
110
174
|
}
|
|
@@ -11,3 +11,48 @@ export function unknownToErrorMessage(error: unknown, message: string): string {
|
|
|
11
11
|
export const normalizeUrl = (url: string): string => {
|
|
12
12
|
return url.endsWith('/') ? url : `${url}/`
|
|
13
13
|
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Parses role/group lists from JSON-array or CSV strings.
|
|
17
|
+
*/
|
|
18
|
+
export function parseStringList(raw: unknown, fallback: string[] = []): string[] {
|
|
19
|
+
if (typeof raw !== 'string' || raw.trim().length === 0) {
|
|
20
|
+
return fallback
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
const parsed = JSON.parse(raw)
|
|
25
|
+
if (Array.isArray(parsed)) {
|
|
26
|
+
return parsed
|
|
27
|
+
.filter((entry): entry is string => typeof entry === 'string')
|
|
28
|
+
.map((entry) => entry.trim())
|
|
29
|
+
.filter(Boolean)
|
|
30
|
+
}
|
|
31
|
+
} catch {
|
|
32
|
+
// ignore and use csv fallback
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return raw
|
|
36
|
+
.split(',')
|
|
37
|
+
.map((entry) => entry.trim())
|
|
38
|
+
.filter(Boolean)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Resolves a nested value by dot-path (e.g. "realm_access.roles").
|
|
43
|
+
*/
|
|
44
|
+
export function getByPath(input: unknown, path: string): unknown {
|
|
45
|
+
if (!path) {
|
|
46
|
+
return undefined
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let current: unknown = input
|
|
50
|
+
for (const segment of path.split('.').filter(Boolean)) {
|
|
51
|
+
if (typeof current !== 'object' || current === null || !(segment in current)) {
|
|
52
|
+
return undefined
|
|
53
|
+
}
|
|
54
|
+
current = (current as Record<string, unknown>)[segment]
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return current
|
|
58
|
+
}
|
|
@@ -80,6 +80,22 @@ const baseScripts = [
|
|
|
80
80
|
name: 'dev',
|
|
81
81
|
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false -- nest start --debug --watch',
|
|
82
82
|
},
|
|
83
|
+
{
|
|
84
|
+
name: 'dev:viewer',
|
|
85
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false --env AUTH_MOCK_ROLES=viewer -- nest start --debug --watch',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'dev:editor',
|
|
89
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false --env AUTH_MOCK_ROLES=editor -- nest start --debug --watch',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'dev:admin',
|
|
93
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false --env AUTH_MOCK_ROLES=admin -- nest start --debug --watch',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'dev:superadmin',
|
|
97
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false --env AUTH_MOCK_ROLES=superadmin -- nest start --debug --watch',
|
|
98
|
+
},
|
|
83
99
|
{
|
|
84
100
|
name: 'dev:auth',
|
|
85
101
|
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=true -- nest start --debug --watch',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.generator.js","sourceRoot":"","sources":["../../src/backend-core/backend.generator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"backend.generator.js","sourceRoot":"","sources":["../../src/backend-core/backend.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateApiConfig = generateApiConfig;
|
|
4
4
|
function generateApiConfig({ backend: { modules } }) {
|
|
5
|
+
const envConfigImports = Array.from(new Set(modules
|
|
6
|
+
.flatMap((module) => module.envConfig?.imports ?? [])
|
|
7
|
+
.map((statement) => statement.trim())
|
|
8
|
+
.filter(Boolean)));
|
|
5
9
|
return /*ts*/ `
|
|
6
10
|
import z from 'zod'
|
|
11
|
+
${envConfigImports.join('\n')}
|
|
7
12
|
|
|
8
13
|
const zEnvBoolean = z.union([
|
|
9
14
|
//
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-config.generator.js","sourceRoot":"","sources":["../../../src/backend-core/generators/api-config.generator.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"api-config.generator.js","sourceRoot":"","sources":["../../../src/backend-core/generators/api-config.generator.ts"],"names":[],"mappings":";;AAEA,8CA0EC;AA1ED,SAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAe;IACrE,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CACjC,IAAI,GAAG,CACL,OAAO;SACJ,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC;SACpD,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;SACpC,MAAM,CAAC,OAAO,CAAC,CACnB,CACF,CAAA;IAED,OAAO,MAAM,CAAC;;EAEd,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA6BvB,OAAO;SACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,SAAU,CAAC,OAAO,CAAC,EAAE,CAAC;SAC1D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;SACvB,IAAI,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;MAeZ,OAAO;SACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,SAAU,CAAC,WAAW,CAAC,EAAE,CAAC;SAC9D,IAAI,CAAC,KAAK,CAAC;;;;;;EAMhB,OAAO;SACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,SAAU,CAAC,IAAK,CAAC,EAAE,CAAC,CAAC,qDAAqD;SAC9G,IAAI,CAAC,IAAI,CAAC;CACZ,CAAA;AACD,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AACnC,CAAC"}
|
|
@@ -100,6 +100,10 @@ export type NestJSModule = {
|
|
|
100
100
|
vfs?: Generator.VirtualFileSystem;
|
|
101
101
|
};
|
|
102
102
|
export type EnvConfig = {
|
|
103
|
+
/**
|
|
104
|
+
* Optional import statements required by decoder/transformer code.
|
|
105
|
+
*/
|
|
106
|
+
imports?: Generator.Typescript[];
|
|
103
107
|
/**
|
|
104
108
|
* Example:
|
|
105
109
|
* AWS_ACCESS_KEY: z.string(),
|
|
@@ -11,14 +11,14 @@ function generateExcelIoService(context) {
|
|
|
11
11
|
.join('\n');
|
|
12
12
|
const modelNames = models.map((model) => `'${model._conjugated.camelCase}'`).join(',\n ');
|
|
13
13
|
const allModelsDataModel = models
|
|
14
|
-
.map((model) => ` ${model._conjugated.camelCasePlural}: await this.viewService.${model.view.service.variableName}.getList(
|
|
14
|
+
.map((model) => ` ${model._conjugated.camelCasePlural}: await this.viewService.${model.view.service.variableName}.getList(authorization),`)
|
|
15
15
|
.join('\n');
|
|
16
16
|
const modelCases = models
|
|
17
17
|
.map((model) => `
|
|
18
18
|
case '${model._conjugated.camelCase}': {
|
|
19
19
|
const filters = ${model.types.filter.decoder.name}.parse(rawFilters ?? {})
|
|
20
20
|
const sort = ${model.types.sort.decoder.name}.optional().parse(rawSort)
|
|
21
|
-
const items = await this.viewService.${model.view.service.variableName}.getFiltered({ filters, sort,
|
|
21
|
+
const items = await this.viewService.${model.view.service.variableName}.getFiltered({ filters, sort, authorization })
|
|
22
22
|
return this.renderExcel({
|
|
23
23
|
dataModel: { ${model._conjugated.camelCasePlural}: items },
|
|
24
24
|
filename: \`${'${timeStamp()}'} ${model._conjugated.kebabCasePlural}.xlsx\`,
|
|
@@ -37,7 +37,7 @@ import { ImportService } from '@import/import.service'
|
|
|
37
37
|
import type { Delta } from '@import/detect-delta/models.detect-delta'
|
|
38
38
|
import { extractErrors } from '@import/detect-delta/models.detect-delta'
|
|
39
39
|
import { forwardRef, Inject, Injectable, Logger } from '@nestjs/common'
|
|
40
|
-
import type {
|
|
40
|
+
import type { AuthorizationContext } from '@types'
|
|
41
41
|
import {
|
|
42
42
|
${filterSortImports}
|
|
43
43
|
} from '@types'
|
|
@@ -144,7 +144,7 @@ export class ExcelIoService {
|
|
|
144
144
|
return modelNameDecoder.parse(model)
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
-
public async exportAllModelsToExcel(
|
|
147
|
+
public async exportAllModelsToExcel(authorization: AuthorizationContext) {
|
|
148
148
|
this.logger.log('Exporting all models to Excel')
|
|
149
149
|
|
|
150
150
|
const dataModel: DataModel = {
|
|
@@ -158,12 +158,12 @@ ${allModelsDataModel}
|
|
|
158
158
|
model,
|
|
159
159
|
rawFilters,
|
|
160
160
|
rawSort,
|
|
161
|
-
|
|
161
|
+
authorization,
|
|
162
162
|
}: {
|
|
163
163
|
model: ExportModelName
|
|
164
164
|
rawFilters?: unknown
|
|
165
165
|
rawSort?: unknown
|
|
166
|
-
|
|
166
|
+
authorization: AuthorizationContext
|
|
167
167
|
}) {
|
|
168
168
|
this.logger.log(\`Exporting model ${'${model}'} to Excel\`)
|
|
169
169
|
|
|
@@ -173,7 +173,15 @@ ${allModelsDataModel}
|
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
public async importExcel({
|
|
176
|
+
public async importExcel({
|
|
177
|
+
data,
|
|
178
|
+
filename,
|
|
179
|
+
authorization,
|
|
180
|
+
}: {
|
|
181
|
+
data: Buffer
|
|
182
|
+
filename: string
|
|
183
|
+
authorization: AuthorizationContext
|
|
184
|
+
}) {
|
|
177
185
|
this.logger.log('Importing uploaded Excel file through import action')
|
|
178
186
|
|
|
179
187
|
const action: Action_Import = {
|
|
@@ -185,7 +193,11 @@ ${allModelsDataModel}
|
|
|
185
193
|
},
|
|
186
194
|
}
|
|
187
195
|
|
|
188
|
-
return this.dispatcherService.dispatch({
|
|
196
|
+
return this.dispatcherService.dispatch({
|
|
197
|
+
action,
|
|
198
|
+
user: authorization.user,
|
|
199
|
+
userRoles: authorization.userRoles,
|
|
200
|
+
})
|
|
189
201
|
}
|
|
190
202
|
|
|
191
203
|
public async previewImportExcel({
|
|
@@ -236,8 +248,8 @@ ${allModelsDataModel}
|
|
|
236
248
|
ignoreErrors,
|
|
237
249
|
confirmDeletes,
|
|
238
250
|
selectedDeltaIndicesByModel,
|
|
239
|
-
|
|
240
|
-
}: ImportExecuteRequest & {
|
|
251
|
+
authorization,
|
|
252
|
+
}: ImportExecuteRequest & { authorization: AuthorizationContext }): Promise<ImportExecutionSummary> {
|
|
241
253
|
this.logger.log(\`Executing import from preview session: \${previewSessionId}\`)
|
|
242
254
|
const stored = this.getStoredPreview(previewSessionId)
|
|
243
255
|
const selectedDelta = filterDeltaBySelectedIndices(stored.delta, selectedDeltaIndicesByModel)
|
|
@@ -266,7 +278,11 @@ ${allModelsDataModel}
|
|
|
266
278
|
},
|
|
267
279
|
}
|
|
268
280
|
|
|
269
|
-
const result = await this.dispatcherService.dispatch({
|
|
281
|
+
const result = await this.dispatcherService.dispatch({
|
|
282
|
+
action,
|
|
283
|
+
user: authorization.user,
|
|
284
|
+
userRoles: authorization.userRoles,
|
|
285
|
+
})
|
|
270
286
|
|
|
271
287
|
this.previewStore.delete(previewSessionId)
|
|
272
288
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"excel-io-service.generator.js","sourceRoot":"","sources":["../../../src/backend-excel-io/generators/excel-io-service.generator.ts"],"names":[],"mappings":";;AAUA,
|
|
1
|
+
{"version":3,"file":"excel-io-service.generator.js","sourceRoot":"","sources":["../../../src/backend-excel-io/generators/excel-io-service.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ export class ExcelIoController {
|
|
|
26
26
|
@Get('export/all')
|
|
27
27
|
async exportAll(@ViewerParam() viewer: Viewer, @Res({ passthrough: true }) res: FastifyReply): Promise<void> {
|
|
28
28
|
try {
|
|
29
|
-
const { filename, file } = await this.excelIoService.exportAllModelsToExcel(viewer
|
|
29
|
+
const { filename, file } = await this.excelIoService.exportAllModelsToExcel(viewer)
|
|
30
30
|
const disposition = createContentDisposition(filename)
|
|
31
31
|
|
|
32
32
|
res.type('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
|
|
@@ -56,7 +56,7 @@ export class ExcelIoController {
|
|
|
56
56
|
model: parsedModel,
|
|
57
57
|
rawFilters,
|
|
58
58
|
rawSort,
|
|
59
|
-
|
|
59
|
+
authorization: viewer,
|
|
60
60
|
})
|
|
61
61
|
const disposition = createContentDisposition(filename)
|
|
62
62
|
|
|
@@ -86,7 +86,7 @@ export class ExcelIoController {
|
|
|
86
86
|
const result = await this.excelIoService.importExcel({
|
|
87
87
|
data: uploadData.buffer,
|
|
88
88
|
filename: uploadData.filename,
|
|
89
|
-
|
|
89
|
+
authorization: viewer,
|
|
90
90
|
})
|
|
91
91
|
|
|
92
92
|
res.status(200).send({ success: true, result })
|
|
@@ -122,7 +122,7 @@ import z from 'zod'
|
|
|
122
122
|
|
|
123
123
|
import { createFieldsDecoder, selectFields } from '@utils/fieldSelection'
|
|
124
124
|
import { paginatedResultDecoder, paginationDecoderFromQuery } from '@utils/pagination'
|
|
125
|
-
import { createWorkbookBuffer, jsonQueryParam } from './restApi.utils'
|
|
125
|
+
import { createRootAuthorization, createWorkbookBuffer, jsonQueryParam } from './restApi.utils'
|
|
126
126
|
|
|
127
127
|
// REST API decoder safe for JSON Schema / OpenAPI generation
|
|
128
128
|
// Reuses ${model.decoder.decoder.zodDecoder.name} but overrides fields with transforms or non-JSON-representable types${duComment}
|
|
@@ -192,9 +192,10 @@ export class ${model.restApi.controller.name} {
|
|
|
192
192
|
@Param() params: Get${PascalCase}ParamsDto,
|
|
193
193
|
@Query() query: Get${PascalCase}QueryDto,
|
|
194
194
|
): Promise<Get${PascalCase}Response> {
|
|
195
|
+
const authorization = createRootAuthorization(this.viewService.users.data.rootUser)
|
|
195
196
|
const data = await this.viewService.${model.view.service.variableName}.get({
|
|
196
197
|
id: ${model.types.id.toBranded.name}(params.id),
|
|
197
|
-
|
|
198
|
+
authorization,
|
|
198
199
|
})
|
|
199
200
|
return {
|
|
200
201
|
data: data ? to${PascalCase}RestApi(data, query.fields) : null,
|
|
@@ -219,8 +220,9 @@ export class ${model.restApi.controller.name} {
|
|
|
219
220
|
@ZodResponse({ type: Get${PascalCasePlural}ResponseDto })
|
|
220
221
|
@Get('')
|
|
221
222
|
async get${PascalCasePlural}(@Query() query: Get${PascalCasePlural}Dto): Promise<Get${PascalCasePlural}Response> {
|
|
223
|
+
const authorization = createRootAuthorization(this.viewService.users.data.rootUser)
|
|
222
224
|
const result = await this.viewService.${model.view.service.variableName}.getFilteredPaginated({
|
|
223
|
-
|
|
225
|
+
authorization,
|
|
224
226
|
filters: query.filters ?? {},
|
|
225
227
|
sort: query.sort,
|
|
226
228
|
cursor: query.cursor,
|
|
@@ -252,8 +254,9 @@ export class ${model.restApi.controller.name} {
|
|
|
252
254
|
@Query() query: Get${PascalCasePlural}DownloadDto,
|
|
253
255
|
@Res() res: FastifyReply,
|
|
254
256
|
): Promise<void> {
|
|
257
|
+
const authorization = createRootAuthorization(this.viewService.users.data.rootUser)
|
|
255
258
|
const result = await this.viewService.${model.view.service.variableName}.getFilteredPaginated({
|
|
256
|
-
|
|
259
|
+
authorization,
|
|
257
260
|
filters: query.filters ?? {},
|
|
258
261
|
sort: query.sort,
|
|
259
262
|
cursor: query.cursor,
|
|
@@ -291,8 +294,9 @@ export class ${model.restApi.controller.name} {
|
|
|
291
294
|
@Query() query: Get${PascalCasePlural}DownloadDto,
|
|
292
295
|
@Res() res: FastifyReply,
|
|
293
296
|
): Promise<void> {
|
|
297
|
+
const authorization = createRootAuthorization(this.viewService.users.data.rootUser)
|
|
294
298
|
const result = await this.viewService.${model.view.service.variableName}.getFilteredPaginated({
|
|
295
|
-
|
|
299
|
+
authorization,
|
|
296
300
|
filters: query.filters ?? {},
|
|
297
301
|
sort: query.sort,
|
|
298
302
|
cursor: query.cursor,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-controller.generator.js","sourceRoot":"","sources":["../../../src/backend-rest-api/generators/model-controller.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,
|
|
1
|
+
{"version":3,"file":"model-controller.generator.js","sourceRoot":"","sources":["../../../src/backend-rest-api/generators/model-controller.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import * as Excel from 'exceljs'
|
|
2
|
+
import type { AuthorizationContext, User } from '@types'
|
|
3
|
+
import { USER_ROLES } from '@types'
|
|
2
4
|
import z from 'zod'
|
|
3
5
|
|
|
4
6
|
/**
|
|
@@ -203,6 +205,13 @@ export async function createWorkbookBuffer({
|
|
|
203
205
|
return Buffer.from(buffer)
|
|
204
206
|
}
|
|
205
207
|
|
|
208
|
+
export function createRootAuthorization(rootUser: User): AuthorizationContext {
|
|
209
|
+
return {
|
|
210
|
+
user: rootUser,
|
|
211
|
+
userRoles: [...USER_ROLES],
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
206
215
|
/**
|
|
207
216
|
* Creates a Zod schema for a query parameter that accepts a JSON string
|
|
208
217
|
* and parses it into the specified schema type.
|
|
@@ -550,10 +550,10 @@ export const auditLogs = router({
|
|
|
550
550
|
})
|
|
551
551
|
|
|
552
552
|
// Get actions map for scope/type info
|
|
553
|
-
const actionsMap = await ctx.view.actions.getAll(ctx.
|
|
553
|
+
const actionsMap = await ctx.view.actions.getAll(ctx.viewer)
|
|
554
554
|
|
|
555
555
|
// Get users map for user names
|
|
556
|
-
const usersMap = await ctx.view.users.getAll(ctx.
|
|
556
|
+
const usersMap = await ctx.view.users.getAll(ctx.viewer)
|
|
557
557
|
|
|
558
558
|
// Process entries
|
|
559
559
|
let entries: AuditLogEntry[] = []
|
|
@@ -39,8 +39,11 @@ function generateMiddleware(context) {
|
|
|
39
39
|
const imports = Generator.ImportGenerator.from(context.trpcRouter._middleware._filePath)
|
|
40
40
|
.add(context.actions.summary.action)
|
|
41
41
|
.add(context.actions.summary.resultOfActionHelper)
|
|
42
|
-
.add(context.types.user)
|
|
43
42
|
.add({ name: context.trpcRouter._shared.context.name, location: context.trpcRouter._shared._filePath })
|
|
43
|
+
.addType({
|
|
44
|
+
name: context.trpcRouter._shared.authenticatedViewer.name,
|
|
45
|
+
location: context.trpcRouter._shared._filePath,
|
|
46
|
+
})
|
|
44
47
|
.add({ name: context.trpcRouter._shared.middleware.name, location: context.trpcRouter._shared._filePath });
|
|
45
48
|
return /* ts */ `
|
|
46
49
|
import { TRPCError } from '@trpc/server'
|
|
@@ -50,10 +53,10 @@ function generateMiddleware(context) {
|
|
|
50
53
|
/**
|
|
51
54
|
* The shared context available to all routes after authentication.
|
|
52
55
|
*
|
|
53
|
-
* Contains the
|
|
56
|
+
* Contains the authenticated viewer and a dispatch function that already has the user set.
|
|
54
57
|
*/
|
|
55
58
|
export type ${context.trpcRouter._middleware.auth.context.name} = ${context.trpcRouter._shared.context.name} & {
|
|
56
|
-
|
|
59
|
+
viewer: ${context.trpcRouter._shared.authenticatedViewer.name}
|
|
57
60
|
dispatch: <A extends ${context.actions.summary.action.name}>(action: A) => Promise<${context.actions.summary.resultOfActionHelper.name}<A>>
|
|
58
61
|
}
|
|
59
62
|
|
|
@@ -71,8 +74,8 @@ export const ${context.trpcRouter._middleware.auth.name} = ${context.trpcRouter.
|
|
|
71
74
|
|
|
72
75
|
const context: ${context.trpcRouter._middleware.auth.context.name} = {
|
|
73
76
|
...ctx,
|
|
74
|
-
|
|
75
|
-
dispatch: <A extends ${context.actions.summary.action.name}>(action: A) => ctx.dispatcher.dispatch({ action, user: viewer.user }),
|
|
77
|
+
viewer,
|
|
78
|
+
dispatch: <A extends ${context.actions.summary.action.name}>(action: A) => ctx.dispatcher.dispatch({ action, user: viewer.user, userRoles: viewer.userRoles }),
|
|
76
79
|
}
|
|
77
80
|
|
|
78
81
|
return opts.next({ ctx: context })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.generator.js","sourceRoot":"","sources":["../../../src/backend-router-trpc/generators/middleware.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,
|
|
1
|
+
{"version":3,"file":"middleware.generator.js","sourceRoot":"","sources":["../../../src/backend-router-trpc/generators/middleware.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,gDAiEC;AApED,6DAA8C;AAG9C,SAAgB,kBAAkB,CAAC,OAAsB;IACvD,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC;SACrF,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;SACnC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;SACjD,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;SACtG,OAAO,CAAC;QACP,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI;QACzD,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS;KAC/C,CAAC;SACD,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IAE5G,OAAO,QAAQ,CAAC;;IAEd,OAAO,CAAC,QAAQ,EAAE;;;;;;;;cAQR,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI;YAC/F,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI;yBACtC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,2BAA2B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI;;;;;;;;eAQzH,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI;;;;;;;mBAOpF,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;;;2BAGxC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;;;;;;4BAMlC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI;;;;;;;;;;;;;;;;;GAiBnE,CAAA;AACH,CAAC"}
|