@abgov/nx-adsp 13.8.0 → 13.9.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/README.md +48 -42
- package/package.json +1 -1
- package/src/build-assets.spec.ts +3 -3
- package/src/generators/angular-app/angular-app.js +29 -10
- package/src/generators/angular-app/angular-app.js.map +1 -1
- package/src/generators/angular-app/angular-app.spec.ts +12 -4
- package/src/generators/dotnet-service/dotnet-service.spec.ts +1 -1
- package/src/generators/express-service/express-service.js +29 -47
- package/src/generators/express-service/express-service.js.map +1 -1
- package/src/generators/express-service/express-service.spec.ts +76 -14
- package/src/generators/express-service/files/AGENTS.md__tmpl__ +31 -0
- package/src/generators/express-service/files/src/main.ts__tmpl__ +23 -0
- package/src/generators/express-service/files/src/openapi.ts__tmpl__ +19 -0
- package/src/generators/express-service/files/src/routes/example.ts__tmpl__ +73 -0
- package/src/generators/mean/mean.js +3 -2
- package/src/generators/mean/mean.js.map +1 -1
- package/src/generators/mean/mean.spec.ts +9 -1
- package/src/generators/mern/mern.js +3 -2
- package/src/generators/mern/mern.js.map +1 -1
- package/src/generators/mern/mern.spec.ts +9 -1
- package/src/generators/mevn/mevn.js +3 -2
- package/src/generators/mevn/mevn.js.map +1 -1
- package/src/generators/mevn/mevn.spec.ts +9 -1
- package/src/generators/pean/pean.js +3 -2
- package/src/generators/pean/pean.js.map +1 -1
- package/src/generators/pean/pean.spec.ts +9 -1
- package/src/generators/pern/pern.js +3 -2
- package/src/generators/pern/pern.js.map +1 -1
- package/src/generators/pern/pern.spec.ts +9 -1
- package/src/generators/pevn/pevn.js +3 -2
- package/src/generators/pevn/pevn.js.map +1 -1
- package/src/generators/pevn/pevn.spec.ts +9 -1
- package/src/generators/react-app/react-app.js +20 -9
- package/src/generators/react-app/react-app.js.map +1 -1
- package/src/generators/react-app/react-app.spec.ts +8 -3
- package/src/generators/react-dotnet/react-dotnet.spec.ts +5 -0
- package/src/generators/react-form/react-form.js.map +1 -1
- package/src/generators/react-form/react-forms.spec.ts +3 -3
- package/src/generators/react-task-list/react-task-list.js.map +1 -1
- package/src/generators/react-task-list/react-task-list.spec.ts +2 -2
- package/src/generators/vue-app/vue-app.js +22 -10
- package/src/generators/vue-app/vue-app.js.map +1 -1
- package/src/generators/vue-app/vue-app.spec.ts +35 -8
- package/src/generators/vue-components/vue-components.js +7 -2
- package/src/generators/vue-components/vue-components.js.map +1 -1
- package/src/generators/vue-components/vue-components.spec.ts +41 -13
- package/src/types/nx-angular-generators.d.ts +1 -1
- package/src/utils/agent.js +23 -9
- package/src/utils/agent.js.map +1 -1
- package/src/utils/agent.spec.ts +74 -17
- package/src/utils/keycloak-admin.js +16 -5
- package/src/utils/keycloak-admin.js.map +1 -1
- package/src/utils/quality.js.map +1 -1
- package/src/utils/quality.spec.ts +5 -3
package/README.md
CHANGED
|
@@ -10,17 +10,17 @@ Install only the framework peers for the generators you use — they are declare
|
|
|
10
10
|
as **optional** peer dependencies, so a workspace that only builds Vue apps
|
|
11
11
|
doesn't need `@nx/react`, `@nx/angular`, etc.
|
|
12
12
|
|
|
13
|
-
| Generator
|
|
14
|
-
|
|
15
|
-
| `react-app`
|
|
16
|
-
| `angular-app`
|
|
17
|
-
| `vue-app`
|
|
18
|
-
| `dotnet-service`
|
|
19
|
-
| `react-dotnet`
|
|
20
|
-
| `express-service`
|
|
21
|
-
| `pevn`, `mevn` (full-stack)
|
|
22
|
-
| `pern`, `pean` (full-stack)
|
|
23
|
-
| `react-form`, `react-task-list` | existing React project in the workspace
|
|
13
|
+
| Generator | Required peer dependency |
|
|
14
|
+
| ------------------------------- | ---------------------------------------- |
|
|
15
|
+
| `react-app` | `@nx/react` |
|
|
16
|
+
| `angular-app` | `@nx/angular` |
|
|
17
|
+
| `vue-app` | `@nx/vue` |
|
|
18
|
+
| `dotnet-service` | `@nx-dotnet/core` |
|
|
19
|
+
| `react-dotnet` | `@nx/react`, `@nx-dotnet/core` |
|
|
20
|
+
| `express-service` | `@nx/express` |
|
|
21
|
+
| `pevn`, `mevn` (full-stack) | `@nx/express`, `@nx/vue` |
|
|
22
|
+
| `pern`, `pean` (full-stack) | `@nx/express`, `@nx/react`/`@nx/angular` |
|
|
23
|
+
| `react-form`, `react-task-list` | existing React project in the workspace |
|
|
24
24
|
|
|
25
25
|
## Installation
|
|
26
26
|
|
|
@@ -99,13 +99,19 @@ Creates a Node/Express backend service configured for ADSP.
|
|
|
99
99
|
npx nx g @abgov/nx-adsp:express-service my-service --env dev --tenant my-tenant
|
|
100
100
|
```
|
|
101
101
|
|
|
102
|
-
| Option
|
|
103
|
-
|
|
104
|
-
| `name`
|
|
105
|
-
| `env`
|
|
106
|
-
| `tenant`
|
|
107
|
-
| `tenantRealm` | `-tr` | No
|
|
108
|
-
| `accessToken` | `-at` | No
|
|
102
|
+
| Option | Alias | Required | Description |
|
|
103
|
+
| ------------- | ----- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
104
|
+
| `name` | — | Yes | Name of the service |
|
|
105
|
+
| `env` | `-e` | No | ADSP environment / access service. Defaults to `test` = access-uat.alberta.ca (UAT — use for dev and pre-prod); `prod` = access.alberta.ca; `dev` = ADSP platform dev (restricted) |
|
|
106
|
+
| `tenant` | `-t` | No | ADSP tenant name; resolves the Keycloak realm by name (sign in once with `@abgov/adsp-cli` — see Authentication) |
|
|
107
|
+
| `tenantRealm` | `-tr` | No | Keycloak realm UUID; overrides the realm resolved from `--tenant` |
|
|
108
|
+
| `accessToken` | `-at` | No | Access token for non-interactive retrieval of ADSP configuration |
|
|
109
|
+
|
|
110
|
+
OpenAPI docs are generated from the same Zod schemas already used for request validation
|
|
111
|
+
(`@asteasolutions/zod-to-openapi`) and served at `/swagger/docs/v1` — no separate spec to
|
|
112
|
+
hand-maintain. The root `/` endpoint's `_links.docs` points at it, which is what ADSP's directory
|
|
113
|
+
service polls to aggregate the service's API docs into `https://api.adsp.alberta.ca/{tenant}` (once
|
|
114
|
+
the service has a directory entry — a one-time setup step outside this generator).
|
|
109
115
|
|
|
110
116
|
---
|
|
111
117
|
|
|
@@ -117,14 +123,14 @@ Creates a React/Redux frontend application configured for ADSP. Requires `@nx/re
|
|
|
117
123
|
npx nx g @abgov/nx-adsp:react-app my-app --env dev --tenant my-tenant
|
|
118
124
|
```
|
|
119
125
|
|
|
120
|
-
| Option
|
|
121
|
-
|
|
122
|
-
| `name`
|
|
123
|
-
| `env`
|
|
124
|
-
| `tenant`
|
|
125
|
-
| `tenantRealm` | `-tr` | No
|
|
126
|
-
| `accessToken` | `-at` | No
|
|
127
|
-
| `proxy`
|
|
126
|
+
| Option | Alias | Required | Description |
|
|
127
|
+
| ------------- | ----- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
128
|
+
| `name` | — | Yes | Name of the application |
|
|
129
|
+
| `env` | `-e` | No | ADSP environment / access service. Defaults to `test` = access-uat.alberta.ca (UAT — use for dev and pre-prod); `prod` = access.alberta.ca; `dev` = ADSP platform dev (restricted) |
|
|
130
|
+
| `tenant` | `-t` | No | ADSP tenant name; resolves the Keycloak realm by name (sign in once with `@abgov/adsp-cli` — see Authentication) |
|
|
131
|
+
| `tenantRealm` | `-tr` | No | Keycloak realm UUID; overrides the realm resolved from `--tenant` |
|
|
132
|
+
| `accessToken` | `-at` | No | Access token for non-interactive retrieval of ADSP configuration |
|
|
133
|
+
| `proxy` | — | No | Nginx proxy rule(s) as `{ location, proxyPass }` or an array of such objects |
|
|
128
134
|
|
|
129
135
|
---
|
|
130
136
|
|
|
@@ -148,11 +154,11 @@ Creates an ASP.NET Core backend service configured for ADSP. Requires `@nx-dotne
|
|
|
148
154
|
npx nx g @abgov/nx-adsp:dotnet-service my-service --env dev --accessToken $TOKEN
|
|
149
155
|
```
|
|
150
156
|
|
|
151
|
-
| Option
|
|
152
|
-
|
|
153
|
-
| `name`
|
|
154
|
-
| `env`
|
|
155
|
-
| `accessToken` | `-at` | No
|
|
157
|
+
| Option | Alias | Required | Description |
|
|
158
|
+
| ------------- | ----- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
159
|
+
| `name` | — | Yes | Name of the service |
|
|
160
|
+
| `env` | `-e` | No | ADSP environment / access service. Defaults to `test` = access-uat.alberta.ca (UAT — use for dev and pre-prod); `prod` = access.alberta.ca; `dev` = ADSP platform dev (restricted) |
|
|
161
|
+
| `accessToken` | `-at` | No | Access token for non-interactive retrieval of ADSP configuration |
|
|
156
162
|
|
|
157
163
|
---
|
|
158
164
|
|
|
@@ -176,11 +182,11 @@ Adds a React component generated from an existing [ADSP Form Definition](https:/
|
|
|
176
182
|
npx nx g @abgov/nx-adsp:react-form my-app --env test
|
|
177
183
|
```
|
|
178
184
|
|
|
179
|
-
| Option
|
|
180
|
-
|
|
181
|
-
| `project`
|
|
182
|
-
| `env`
|
|
183
|
-
| `accessToken` | `-at` | No
|
|
185
|
+
| Option | Alias | Required | Description |
|
|
186
|
+
| ------------- | ----- | -------- | ------------------------------------------------------------------------------------------------- |
|
|
187
|
+
| `project` | — | Yes | Name of the existing Nx project to add the form component to |
|
|
188
|
+
| `env` | `-e` | No | ADSP environment to fetch form definitions from. Defaults to `test` (UAT / access-uat.alberta.ca) |
|
|
189
|
+
| `accessToken` | `-at` | No | Access token for non-interactive retrieval of ADSP configuration |
|
|
184
190
|
|
|
185
191
|
---
|
|
186
192
|
|
|
@@ -218,11 +224,11 @@ When you run a generator:
|
|
|
218
224
|
|
|
219
225
|
Generator flags that steer which tenant/token is used:
|
|
220
226
|
|
|
221
|
-
| Flag
|
|
222
|
-
|
|
223
|
-
| `--tenant <name>`
|
|
224
|
-
| `--tenantRealm <uuid>`
|
|
225
|
-
| `--accessToken <token>` | Supply a pre-obtained token directly (CI/CD), bypassing the CLI
|
|
227
|
+
| Flag | Effect |
|
|
228
|
+
| ----------------------- | ----------------------------------------------------------------------------------- |
|
|
229
|
+
| `--tenant <name>` | Resolves the Keycloak realm by tenant name (anonymous lookup) and targets it |
|
|
230
|
+
| `--tenantRealm <uuid>` | Use the realm UUID directly; combine with `--tenant` to override the resolved realm |
|
|
231
|
+
| `--accessToken <token>` | Supply a pre-obtained token directly (CI/CD), bypassing the CLI |
|
|
226
232
|
|
|
227
233
|
With none of these, the generator lets `adsp login`'s interactive picker resolve the tenant. Don't
|
|
228
234
|
have a tenant yet? That picker also offers a **+ Create a new tenant** choice — available in
|
|
@@ -245,7 +251,7 @@ This needs the same tenant/token as [Authentication](#authentication) above, plu
|
|
|
245
251
|
is non-interactive (`--no-interactive`, no TTY, or `CI=true`). Skip it explicitly with
|
|
246
252
|
`--skipAgent`, regardless of interactivity.
|
|
247
253
|
|
|
248
|
-
> **Note for coding agents:** skip this. It exists to let a
|
|
254
|
+
> **Note for coding agents:** skip this. It exists to let a _human_ describe what they want built
|
|
249
255
|
> to a separate, remote agent working from nothing but that description. You already have the
|
|
250
256
|
> actual requirements and the surrounding codebase context that conversation exists to gather —
|
|
251
257
|
> make any needed customizations directly, after scaffolding, rather than through an indirect
|
package/package.json
CHANGED
package/src/build-assets.spec.ts
CHANGED
|
@@ -33,7 +33,7 @@ describe('build assets packaging', () => {
|
|
|
33
33
|
|
|
34
34
|
it('matches every non-TypeScript src file with an asset glob', () => {
|
|
35
35
|
const project = JSON.parse(
|
|
36
|
-
fs.readFileSync(path.join(projectRoot, 'project.json'), 'utf-8')
|
|
36
|
+
fs.readFileSync(path.join(projectRoot, 'project.json'), 'utf-8'),
|
|
37
37
|
);
|
|
38
38
|
const assets: unknown[] = project.targets.build.options.assets ?? [];
|
|
39
39
|
|
|
@@ -44,7 +44,7 @@ describe('build assets packaging', () => {
|
|
|
44
44
|
typeof a === 'object' &&
|
|
45
45
|
a !== null &&
|
|
46
46
|
'input' in a &&
|
|
47
|
-
path.resolve(repoRoot, (a as { input: string }).input) === srcRoot
|
|
47
|
+
path.resolve(repoRoot, (a as { input: string }).input) === srcRoot,
|
|
48
48
|
)
|
|
49
49
|
.map((a) => a.glob);
|
|
50
50
|
|
|
@@ -54,7 +54,7 @@ describe('build assets packaging', () => {
|
|
|
54
54
|
.map((f) => path.relative(srcRoot, f));
|
|
55
55
|
|
|
56
56
|
const unmatched = mustShip.filter(
|
|
57
|
-
(rel) => !srcGlobs.some((glob) => minimatch(rel, glob, { dot: true }))
|
|
57
|
+
(rel) => !srcGlobs.some((glob) => minimatch(rel, glob, { dot: true })),
|
|
58
58
|
);
|
|
59
59
|
|
|
60
60
|
expect(unmatched).toEqual([]);
|
|
@@ -57,7 +57,7 @@ function addFiles(host, options) {
|
|
|
57
57
|
}
|
|
58
58
|
function default_1(host, options) {
|
|
59
59
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
60
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
|
|
60
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
|
|
61
61
|
// Checked before normalizeOptions, which resolves ADSP auth and can trigger
|
|
62
62
|
// an interactive login — a missing peer shouldn't surface only after that.
|
|
63
63
|
const { applicationGenerator: initAngular } = yield Promise.resolve().then(() => require('@nx/angular/generators')).catch(() => {
|
|
@@ -93,7 +93,13 @@ function default_1(host, options) {
|
|
|
93
93
|
(0, quality_1.addVsCodeSettings)(host);
|
|
94
94
|
// @nx/angular generates app.ts/html/css/spec.ts (new naming) and nx-welcome.ts;
|
|
95
95
|
// our templates use app.component.* and don't use nx-welcome.
|
|
96
|
-
for (const file of [
|
|
96
|
+
for (const file of [
|
|
97
|
+
'app.ts',
|
|
98
|
+
'app.html',
|
|
99
|
+
'app.css',
|
|
100
|
+
'app.spec.ts',
|
|
101
|
+
'nx-welcome.ts',
|
|
102
|
+
]) {
|
|
97
103
|
host.delete(`${normalizedOptions.projectRoot}/src/app/${file}`);
|
|
98
104
|
}
|
|
99
105
|
const config = (0, devkit_1.readProjectConfiguration)(host, options.name);
|
|
@@ -106,7 +112,11 @@ function default_1(host, options) {
|
|
|
106
112
|
if ((_c = config.targets.build.configurations) === null || _c === void 0 ? void 0 : _c.production) {
|
|
107
113
|
config.targets.build.configurations.production.budgets = [
|
|
108
114
|
{ type: 'initial', maximumWarning: '2mb', maximumError: '4mb' },
|
|
109
|
-
{
|
|
115
|
+
{
|
|
116
|
+
type: 'anyComponentStyle',
|
|
117
|
+
maximumWarning: '6kb',
|
|
118
|
+
maximumError: '10kb',
|
|
119
|
+
},
|
|
110
120
|
];
|
|
111
121
|
}
|
|
112
122
|
config.targets.build.options = Object.assign(Object.assign({}, config.targets.build.options), { polyfills: ['zone.js'], assets: [
|
|
@@ -122,11 +132,15 @@ function default_1(host, options) {
|
|
|
122
132
|
// Add the webpack dev server proxy if there is proxy configuration.
|
|
123
133
|
config.targets.serve.options = Object.assign(Object.assign({}, config.targets.serve.options), { proxyConfig: `${normalizedOptions.projectRoot}/proxy.conf.json` });
|
|
124
134
|
}
|
|
135
|
+
config.tags = [
|
|
136
|
+
...((_d = config.tags) !== null && _d !== void 0 ? _d : []),
|
|
137
|
+
...(0, nx_oc_1.adspProjectTags)(normalizedOptions.env, normalizedOptions.adsp.tenant).filter((tag) => { var _a; return !((_a = config.tags) !== null && _a !== void 0 ? _a : []).includes(tag); }),
|
|
138
|
+
];
|
|
125
139
|
(0, devkit_1.updateProjectConfiguration)(host, options.name, config);
|
|
126
140
|
(0, quality_1.addSemgrepTarget)(host, options.name);
|
|
127
141
|
yield (0, devkit_1.formatFiles)(host);
|
|
128
142
|
if (normalizedOptions.adsp) {
|
|
129
|
-
const accessToken = (
|
|
143
|
+
const accessToken = (_e = normalizedOptions.adsp.accessToken) !== null && _e !== void 0 ? _e : options.accessToken;
|
|
130
144
|
const clientId = `urn:ads:${normalizedOptions.adsp.tenant}:${normalizedOptions.projectName}`;
|
|
131
145
|
yield (0, keycloak_admin_1.ensurePublicClient)(normalizedOptions.adsp.accessServiceUrl, normalizedOptions.adsp.tenantRealm, clientId, accessToken);
|
|
132
146
|
if (options.serviceClientId) {
|
|
@@ -135,12 +149,17 @@ function default_1(host, options) {
|
|
|
135
149
|
}
|
|
136
150
|
}
|
|
137
151
|
if (normalizedOptions.adsp && !options.skipAgent) {
|
|
138
|
-
const accessToken = (
|
|
139
|
-
const appComponentTs = (
|
|
140
|
-
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
const
|
|
152
|
+
const accessToken = (_f = normalizedOptions.adsp.accessToken) !== null && _f !== void 0 ? _f : options.accessToken;
|
|
153
|
+
const appComponentTs = (_h = (_g = host
|
|
154
|
+
.read(`${normalizedOptions.projectRoot}/src/app/app.component.ts`)) === null || _g === void 0 ? void 0 : _g.toString()) !== null && _h !== void 0 ? _h : '';
|
|
155
|
+
const appComponentHtml = (_k = (_j = host
|
|
156
|
+
.read(`${normalizedOptions.projectRoot}/src/app/app.component.html`)) === null || _j === void 0 ? void 0 : _j.toString()) !== null && _k !== void 0 ? _k : '';
|
|
157
|
+
const appConfigTs = (_m = (_l = host
|
|
158
|
+
.read(`${normalizedOptions.projectRoot}/src/app/app.config.ts`)) === null || _l === void 0 ? void 0 : _l.toString()) !== null && _m !== void 0 ? _m : '';
|
|
159
|
+
const appRoutesTs = (_p = (_o = host
|
|
160
|
+
.read(`${normalizedOptions.projectRoot}/src/app/app.routes.ts`)) === null || _o === void 0 ? void 0 : _o.toString()) !== null && _p !== void 0 ? _p : '';
|
|
161
|
+
const environmentTs = (_r = (_q = host
|
|
162
|
+
.read(`${normalizedOptions.projectRoot}/src/environments/environment.ts`)) === null || _q === void 0 ? void 0 : _q.toString()) !== null && _r !== void 0 ? _r : '';
|
|
144
163
|
yield (0, agent_1.confirmAfterAgentInterrupt)(yield (0, agent_1.consultAgent)(normalizedOptions.adsp.directoryServiceUrl, accessToken, {
|
|
145
164
|
projectName: normalizedOptions.projectName,
|
|
146
165
|
projectType: 'angular-app',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"angular-app.js","sourceRoot":"","sources":["../../../../../../packages/nx-adsp/src/generators/angular-app/angular-app.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"angular-app.js","sourceRoot":"","sources":["../../../../../../packages/nx-adsp/src/generators/angular-app/angular-app.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,10 @@ import { environments } from '@abgov/nx-oc';
|
|
|
6
6
|
import angularApp from './angular-app';
|
|
7
7
|
import { AngularAppGeneratorSchema } from './schema';
|
|
8
8
|
|
|
9
|
-
jest.mock('@nx/devkit', () => ({
|
|
9
|
+
jest.mock('@nx/devkit', () => ({
|
|
10
|
+
...jest.requireActual('@nx/devkit'),
|
|
11
|
+
formatFiles: jest.fn().mockResolvedValue(undefined),
|
|
12
|
+
}));
|
|
10
13
|
jest.mock('@abgov/nx-oc');
|
|
11
14
|
jest.mock('../../utils/agent', () => ({
|
|
12
15
|
consultAgent: jest.fn().mockResolvedValue(null),
|
|
@@ -19,6 +22,11 @@ utilsMock.getAdspConfiguration.mockResolvedValue({
|
|
|
19
22
|
accessServiceUrl: environments.test.accessServiceUrl,
|
|
20
23
|
directoryServiceUrl: environments.test.directoryServiceUrl,
|
|
21
24
|
});
|
|
25
|
+
// jest.mock('@abgov/nx-oc') automocks adspProjectTags too — restore the real
|
|
26
|
+
// (pure, no I/O) implementation so tag-writing behavior is actually exercised.
|
|
27
|
+
utilsMock.adspProjectTags.mockImplementation(
|
|
28
|
+
jest.requireActual('@abgov/nx-oc').adspProjectTags,
|
|
29
|
+
);
|
|
22
30
|
|
|
23
31
|
describe('angular app generator', () => {
|
|
24
32
|
let appTree: Tree;
|
|
@@ -44,7 +52,7 @@ describe('angular app generator', () => {
|
|
|
44
52
|
expect(appTree.exists('apps/test-e2e/project.json')).toBeTruthy();
|
|
45
53
|
expect(
|
|
46
54
|
appTree.exists('apps/test-e2e/playwright.config.ts') ||
|
|
47
|
-
appTree.exists('apps/test-e2e/playwright.config.mts')
|
|
55
|
+
appTree.exists('apps/test-e2e/playwright.config.mts'),
|
|
48
56
|
).toBe(true);
|
|
49
57
|
expect(appTree.exists('apps/test-e2e/cypress.config.ts')).toBeFalsy();
|
|
50
58
|
// webServer guarded so CI can target a deployed URL (BASE_URL) instead of a local server
|
|
@@ -77,7 +85,7 @@ describe('angular app generator', () => {
|
|
|
77
85
|
|
|
78
86
|
expect(host.exists('apps/test/nginx.conf')).toBeTruthy();
|
|
79
87
|
expect(host.read('apps/test/nginx.conf').toString()).toContain(
|
|
80
|
-
'http://test-service:3333/'
|
|
88
|
+
'http://test-service:3333/',
|
|
81
89
|
);
|
|
82
90
|
});
|
|
83
91
|
|
|
@@ -122,7 +130,7 @@ describe('angular app generator', () => {
|
|
|
122
130
|
expect(host.exists('apps/test/proxy.conf.json')).toBeTruthy();
|
|
123
131
|
|
|
124
132
|
const proxyConf = JSON.parse(
|
|
125
|
-
host.read('apps/test/proxy.conf.json').toString()
|
|
133
|
+
host.read('apps/test/proxy.conf.json').toString(),
|
|
126
134
|
);
|
|
127
135
|
expect(proxyConf['/test/'].target).toBe('http://localhost:3333');
|
|
128
136
|
expect(proxyConf['/test/'].pathRewrite['^/test/']).toBe('/api/');
|
|
@@ -12,43 +12,13 @@ const plugin_version_1 = require("../../utils/plugin-version");
|
|
|
12
12
|
const quality_1 = require("../../utils/quality");
|
|
13
13
|
function normalizeOptions(host, options) {
|
|
14
14
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
15
|
-
var _a
|
|
15
|
+
var _a;
|
|
16
16
|
const projectName = (0, devkit_1.names)(options.name).fileName;
|
|
17
17
|
const projectRoot = `${(0, devkit_1.getWorkspaceLayout)(host).appsDir}/${projectName}`;
|
|
18
|
-
|
|
19
|
-
if (options.tenant) {
|
|
20
|
-
// Resolve realm from tenant name via the public tenant service API (no auth required),
|
|
21
|
-
// then obtain a token for that realm via @abgov/adsp-cli.
|
|
22
|
-
const env = nx_oc_1.environments[(_a = options.env) !== null && _a !== void 0 ? _a : 'prod'];
|
|
23
|
-
const tenantServiceUrl = (yield (0, nx_oc_1.getServiceUrls)(env.directoryServiceUrl))['urn:ads:platform:tenant-service'];
|
|
24
|
-
const { default: axios } = yield Promise.resolve().then(() => require('axios'));
|
|
25
|
-
const { data } = yield axios.get(new URL('/api/tenant/v2/tenants', tenantServiceUrl).href, { params: { name: options.tenant } });
|
|
26
|
-
const tenantInfo = (_b = data === null || data === void 0 ? void 0 : data.results) === null || _b === void 0 ? void 0 : _b[0];
|
|
27
|
-
if (!tenantInfo) {
|
|
28
|
-
throw new Error(`Tenant "${options.tenant}" not found in ${env.directoryServiceUrl}.`);
|
|
29
|
-
}
|
|
30
|
-
const tenantRealm = (_c = options.tenantRealm) !== null && _c !== void 0 ? _c : tenantInfo.realm;
|
|
31
|
-
if (!options.accessToken) {
|
|
32
|
-
options = Object.assign(Object.assign({}, options), { accessToken: yield (0, nx_oc_1.ensureAdspToken)({
|
|
33
|
-
env: (_d = options.env) !== null && _d !== void 0 ? _d : 'prod',
|
|
34
|
-
realm: tenantRealm,
|
|
35
|
-
tenant: options.tenant,
|
|
36
|
-
scopes: [nx_oc_1.ADSP_ADMIN_SCOPE],
|
|
37
|
-
}).catch(() => undefined) });
|
|
38
|
-
}
|
|
39
|
-
adsp = {
|
|
40
|
-
tenant: tenantInfo.name,
|
|
41
|
-
tenantRealm,
|
|
42
|
-
accessServiceUrl: env.accessServiceUrl,
|
|
43
|
-
directoryServiceUrl: env.directoryServiceUrl,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
adsp = yield (0, nx_oc_1.getAdspConfiguration)(host, options);
|
|
48
|
-
}
|
|
18
|
+
const adsp = yield (0, nx_oc_1.getAdspConfiguration)(host, options);
|
|
49
19
|
return Object.assign(Object.assign({}, options), { projectName,
|
|
50
20
|
projectRoot,
|
|
51
|
-
adsp, database: (
|
|
21
|
+
adsp, database: (_a = options.database) !== null && _a !== void 0 ? _a : 'none' });
|
|
52
22
|
});
|
|
53
23
|
}
|
|
54
24
|
function addFiles(host, options) {
|
|
@@ -61,7 +31,7 @@ function addFiles(host, options) {
|
|
|
61
31
|
}
|
|
62
32
|
function default_1(host, options) {
|
|
63
33
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
64
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p
|
|
34
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
65
35
|
// Checked before normalizeOptions, which resolves ADSP auth and can trigger
|
|
66
36
|
// an interactive login — a missing peer shouldn't surface only after that.
|
|
67
37
|
const { applicationGenerator: initExpress } = yield Promise.resolve().then(() => require('@nx/express')).catch(() => {
|
|
@@ -69,9 +39,16 @@ function default_1(host, options) {
|
|
|
69
39
|
});
|
|
70
40
|
const normalizedOptions = yield normalizeOptions(host, options);
|
|
71
41
|
yield initExpress(host, Object.assign(Object.assign({}, options), { skipFormat: true, skipPackageJson: false, linter: eslint_1.Linter.EsLint, unitTestRunner: 'jest', js: false, directory: normalizedOptions.projectRoot }));
|
|
72
|
-
(0, devkit_1.addDependenciesToPackageJson)(host, Object.assign(Object.assign({ '@abgov/adsp-service-sdk': '^2.23.0', compression: '^1.8.1', cors: '^2.8.5', dotenv: '^16.4.7', envalid: '^8.0.0', helmet: '^8.0.0', passport: '^0.7.0', 'passport-anonymous': '^1.0.1', zod: '^3.0.0' }, (normalizedOptions.database === 'postgres'
|
|
42
|
+
(0, devkit_1.addDependenciesToPackageJson)(host, Object.assign(Object.assign({ '@abgov/adsp-service-sdk': '^2.23.0', '@asteasolutions/zod-to-openapi': '^7.3.4', compression: '^1.8.1', cors: '^2.8.5', dotenv: '^16.4.7', envalid: '^8.0.0', helmet: '^8.0.0', passport: '^0.7.0', 'passport-anonymous': '^1.0.1', zod: '^3.0.0' }, (normalizedOptions.database === 'postgres'
|
|
43
|
+
? { 'drizzle-orm': '^0.44.0', pg: '^8.11.0' }
|
|
44
|
+
: {})), (normalizedOptions.database === 'mongo' ? { mongoose: '^8.0.0' } : {})), Object.assign(Object.assign({ '@types/compression': '^1.7.5', '@types/cors': '^2.8.17', '@types/passport': '^1.0.16', '@types/passport-anonymous': '^1.0.3', supertest: '^7.0.0', '@types/supertest': '^6.0.0' }, (normalizedOptions.database === 'postgres'
|
|
45
|
+
? { 'drizzle-kit': '^0.31.0', '@types/pg': '^8.11.0' }
|
|
46
|
+
: {})), { 'eslint-plugin-security': '^3.0.0', 'eslint-plugin-no-secrets': '^2.0.0', 'eslint-plugin-jest': '^28.0.0' }));
|
|
73
47
|
addFiles(host, normalizedOptions);
|
|
74
|
-
(0, quality_1.addEslintQualityRules)(host, normalizedOptions.projectRoot, [
|
|
48
|
+
(0, quality_1.addEslintQualityRules)(host, normalizedOptions.projectRoot, [
|
|
49
|
+
'**/*.spec.ts',
|
|
50
|
+
'**/*.test.ts',
|
|
51
|
+
]);
|
|
75
52
|
(0, quality_1.addJestCoverageConfig)(host, normalizedOptions.projectRoot);
|
|
76
53
|
(0, quality_1.addVsCodeSettings)(host);
|
|
77
54
|
// Equip coding agents with grounded ADSP docs + Node SDK reference lookup.
|
|
@@ -124,17 +101,18 @@ function default_1(host, options) {
|
|
|
124
101
|
// Record the database as a project tag so the nx-oc sandbox generator can
|
|
125
102
|
// wire DATABASE_URL + the migrate init container without a --database flag.
|
|
126
103
|
const dbTag = `adsp:database:${normalizedOptions.database}`;
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
104
|
+
const newTags = [
|
|
105
|
+
...(normalizedOptions.database !== 'none' ? [dbTag] : []),
|
|
106
|
+
...(0, nx_oc_1.adspProjectTags)(normalizedOptions.env, normalizedOptions.adsp.tenant),
|
|
107
|
+
].filter((tag) => { var _a; return !((_a = projectConfig.tags) !== null && _a !== void 0 ? _a : []).includes(tag); });
|
|
108
|
+
const tags = [...((_d = projectConfig.tags) !== null && _d !== void 0 ? _d : []), ...newTags];
|
|
131
109
|
(0, devkit_1.updateProjectConfiguration)(host, normalizedOptions.projectName, Object.assign(Object.assign({}, projectConfig), { targets,
|
|
132
110
|
tags }));
|
|
133
111
|
(0, quality_1.addSemgrepTarget)(host, normalizedOptions.projectName);
|
|
134
112
|
yield (0, devkit_1.formatFiles)(host);
|
|
135
113
|
if (normalizedOptions.adsp) {
|
|
136
114
|
const clientId = `urn:ads:${normalizedOptions.adsp.tenant}:${normalizedOptions.projectName}`;
|
|
137
|
-
const accessToken = (
|
|
115
|
+
const accessToken = (_e = normalizedOptions.accessToken) !== null && _e !== void 0 ? _e : normalizedOptions.adsp.accessToken;
|
|
138
116
|
const clientSecret = yield (0, keycloak_admin_1.ensureServiceClient)(normalizedOptions.adsp.accessServiceUrl, normalizedOptions.adsp.tenantRealm, clientId, accessToken);
|
|
139
117
|
if (clientSecret) {
|
|
140
118
|
// .env.local, not .env: CLIENT_SECRET is a generated, local-only value — the
|
|
@@ -145,7 +123,9 @@ function default_1(host, options) {
|
|
|
145
123
|
// developer-owned config too (KEYCLOAK_ROOT_URL, DIRECTORY_URL, etc.) and
|
|
146
124
|
// shouldn't be blanket-gitignored.
|
|
147
125
|
const envLocalPath = `${normalizedOptions.projectRoot}/.env.local`;
|
|
148
|
-
const existing = host.exists(envLocalPath)
|
|
126
|
+
const existing = host.exists(envLocalPath)
|
|
127
|
+
? host.read(envLocalPath).toString()
|
|
128
|
+
: '';
|
|
149
129
|
if (!existing.includes('CLIENT_SECRET=')) {
|
|
150
130
|
host.write(envLocalPath, `${existing ? existing.trimEnd() + '\n' : ''}CLIENT_SECRET=${clientSecret}\n`);
|
|
151
131
|
}
|
|
@@ -159,12 +139,14 @@ function default_1(host, options) {
|
|
|
159
139
|
if (normalizedOptions.adsp && !options.skipAgent) {
|
|
160
140
|
// Both normalizeOptions paths resolve a tenant-realm token via @abgov/adsp-cli,
|
|
161
141
|
// so it's already on normalizedOptions.accessToken (--tenant) or adsp.accessToken.
|
|
162
|
-
const accessToken = (
|
|
163
|
-
const mainTs = (
|
|
164
|
-
const environmentTs = (
|
|
165
|
-
|
|
142
|
+
const accessToken = (_f = normalizedOptions.accessToken) !== null && _f !== void 0 ? _f : normalizedOptions.adsp.accessToken;
|
|
143
|
+
const mainTs = (_h = (_g = host.read(`${normalizedOptions.projectRoot}/src/main.ts`)) === null || _g === void 0 ? void 0 : _g.toString()) !== null && _h !== void 0 ? _h : '';
|
|
144
|
+
const environmentTs = (_k = (_j = host
|
|
145
|
+
.read(`${normalizedOptions.projectRoot}/src/environment.ts`)) === null || _j === void 0 ? void 0 : _j.toString()) !== null && _k !== void 0 ? _k : '';
|
|
146
|
+
const eventsTs = (_m = (_l = host.read(`${normalizedOptions.projectRoot}/src/events.ts`)) === null || _l === void 0 ? void 0 : _l.toString()) !== null && _m !== void 0 ? _m : '';
|
|
166
147
|
const databaseTs = normalizedOptions.database !== 'none'
|
|
167
|
-
? (
|
|
148
|
+
? ((_p = (_o = host
|
|
149
|
+
.read(`${normalizedOptions.projectRoot}/src/database.ts`)) === null || _o === void 0 ? void 0 : _o.toString()) !== null && _p !== void 0 ? _p : '')
|
|
168
150
|
: undefined;
|
|
169
151
|
const agentResult = yield (0, agent_1.consultAgent)(normalizedOptions.adsp.directoryServiceUrl, accessToken, {
|
|
170
152
|
projectName: normalizedOptions.projectName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express-service.js","sourceRoot":"","sources":["../../../../../../packages/nx-adsp/src/generators/express-service/express-service.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"express-service.js","sourceRoot":"","sources":["../../../../../../packages/nx-adsp/src/generators/express-service/express-service.ts"],"names":[],"mappings":";;AAuEA,4BA6PC;;AApUD,wCAIsB;AACtB,uCAUoB;AACpB,uCAAoC;AACpC,6BAA6B;AAC7B,6CAAiD;AACjD,+DAAiE;AACjE,+DAA4D;AAC5D,iDAM6B;AAG7B,SAAe,gBAAgB,CAC7B,IAAU,EACV,OAAe;;;QAEf,MAAM,WAAW,GAAG,IAAA,cAAK,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QACjD,MAAM,WAAW,GAAG,GAAG,IAAA,2BAAkB,EAAC,IAAI,CAAC,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC;QAEzE,MAAM,IAAI,GAAG,MAAM,IAAA,4BAAoB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEvD,uCACK,OAAO,KACV,WAAW;YACX,WAAW;YACX,IAAI,EACJ,QAAQ,EAAE,MAAA,OAAO,CAAC,QAAQ,mCAAI,MAAM,IACpC;IACJ,CAAC;CAAA;AAED,SAAS,QAAQ,CAAC,IAAU,EAAE,OAAyB;;IACrD,MAAM,eAAe,iDAChB,OAAO,GACP,OAAO,CAAC,IAAI,KACf,aAAa,EAAE,MAAA,OAAO,CAAC,aAAa,mCAAI,IAAI,EAC5C,IAAI,EAAE,EAAE,GACT,CAAC;IACF,IAAA,sBAAa,EACX,IAAI,EACJ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,WAAW,EACnB,eAAe,CAChB,CAAC;IACF,IAAI,OAAO,CAAC,QAAQ,KAAK,UAAU,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACpE,IAAA,sBAAa,EACX,IAAI,EACJ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,OAAO,CAAC,QAAQ,EAAE,CAAC,EACjD,OAAO,CAAC,WAAW,EACnB,eAAe,CAChB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,mBAA+B,IAAU,EAAE,OAAe;;;QACxD,4EAA4E;QAC5E,2EAA2E;QAC3E,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,GACzC,MAAM,qCAAO,aAAa,GAAE,KAAK,CAAC,GAAG,EAAE;YACrC,MAAM,IAAI,KAAK,CACb,mHAAmH,CACpH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEL,MAAM,iBAAiB,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEhE,MAAM,WAAW,CAAC,IAAI,kCACjB,OAAO,KACV,UAAU,EAAE,IAAI,EAChB,eAAe,EAAE,KAAK,EACtB,MAAM,EAAE,eAAM,CAAC,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,KAAK,EACT,SAAS,EAAE,iBAAiB,CAAC,WAAW,IACxC,CAAC;QAEH,IAAA,qCAA4B,EAC1B,IAAI,gCAEF,yBAAyB,EAAE,SAAS,EACpC,gCAAgC,EAAE,QAAQ,EAC1C,WAAW,EAAE,QAAQ,EACrB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,QAAQ,EAChB,QAAQ,EAAE,QAAQ,EAClB,oBAAoB,EAAE,QAAQ,EAC9B,GAAG,EAAE,QAAQ,IACV,CAAC,iBAAiB,CAAC,QAAQ,KAAK,UAAU;YAC3C,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;YAC7C,CAAC,CAAC,EAAE,CAAC,GACJ,CAAC,iBAAiB,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,iCAGzE,oBAAoB,EAAE,QAAQ,EAC9B,aAAa,EAAE,SAAS,EACxB,iBAAiB,EAAE,SAAS,EAC5B,2BAA2B,EAAE,QAAQ,EACrC,SAAS,EAAE,QAAQ,EACnB,kBAAkB,EAAE,QAAQ,IACzB,CAAC,iBAAiB,CAAC,QAAQ,KAAK,UAAU;YAC3C,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;YACtD,CAAC,CAAC,EAAE,CAAC,KACP,wBAAwB,EAAE,QAAQ,EAClC,0BAA0B,EAAE,QAAQ,EACpC,oBAAoB,EAAE,SAAS,IAElC,CAAC;QAEF,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAElC,IAAA,+BAAqB,EAAC,IAAI,EAAE,iBAAiB,CAAC,WAAW,EAAE;YACzD,cAAc;YACd,cAAc;SACf,CAAC,CAAC;QACH,IAAA,+BAAqB,EAAC,IAAI,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC3D,IAAA,2BAAiB,EAAC,IAAI,CAAC,CAAC;QACxB,2EAA2E;QAC3E,IAAA,0BAAgB,EAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,aAAa,GAAG,IAAA,iCAAwB,EAC5C,IAAI,EACJ,iBAAiB,CAAC,WAAW,CAC9B,CAAC;QACF,MAAM,OAAO,qBAAQ,aAAa,CAAC,OAAO,CAAE,CAAC;QAE7C,IAAI,iBAAiB,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAClB,QAAQ,EAAE,iBAAiB;gBAC3B,OAAO,EAAE;oBACP,OAAO,EAAE,wBAAwB;oBACjC,GAAG,EAAE,eAAe;iBACrB;aACF,CAAC;YAEF,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,OAAO,CAAC,mCACX,OAAO,CAAC,OAAO,CAAC,KACnB,SAAS,EAAE,CAAC,GAAG,CAAC,MAAA,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,mCAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,GAC7D,CAAC;YACJ,CAAC;YAED,IAAI,iBAAiB,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC9C,OAAO,CAAC,aAAa,CAAC,GAAG;oBACvB,QAAQ,EAAE,iBAAiB;oBAC3B,OAAO,EAAE,EAAE,OAAO,EAAE,0BAA0B,EAAE,GAAG,EAAE,eAAe,EAAE;iBACvE,CAAC;gBACF,OAAO,CAAC,YAAY,CAAC,GAAG;oBACtB,QAAQ,EAAE,iBAAiB;oBAC3B,OAAO,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,GAAG,EAAE,eAAe,EAAE;iBACtE,CAAC;gBACF,OAAO,CAAC,mBAAmB,CAAC,GAAG;oBAC7B,QAAQ,EAAE,iBAAiB;oBAC3B,OAAO,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,GAAG,EAAE,eAAe,EAAE;iBACtE,CAAC;gBACF,OAAO,CAAC,WAAW,CAAC,GAAG;oBACrB,QAAQ,EAAE,iBAAiB;oBAC3B,OAAO,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE,GAAG,EAAE,eAAe,EAAE;iBACrE,CAAC;gBAEF,6EAA6E;gBAC7E,2EAA2E;gBAC3E,wEAAwE;gBACxE,IAAI,MAAA,OAAO,CAAC,OAAO,CAAC,0CAAE,OAAO,EAAE,CAAC;oBAC9B,OAAO,CAAC,OAAO,CAAC,mCACX,OAAO,CAAC,OAAO,CAAC,KACnB,OAAO,kCACF,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,KAC3B,MAAM,EAAE;gCACN,GAAG,CAAC,MAAA,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,mCAAI,EAAE,CAAC;gCAC1C;oCACE,KAAK,EAAE,GAAG,iBAAiB,CAAC,WAAW,UAAU;oCACjD,IAAI,EAAE,MAAM;oCACZ,MAAM,EAAE,SAAS;iCAClB;6BACF,MAEJ,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,4EAA4E;QAC5E,MAAM,KAAK,GAAG,iBAAiB,iBAAiB,CAAC,QAAQ,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG;YACd,GAAG,CAAC,iBAAiB,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,IAAA,uBAAe,EAAC,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;SACzE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,WAAC,OAAA,CAAC,CAAC,MAAA,aAAa,CAAC,IAAI,mCAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA,EAAA,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,MAAA,aAAa,CAAC,IAAI,mCAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC;QAEzD,IAAA,mCAA0B,EAAC,IAAI,EAAE,iBAAiB,CAAC,WAAW,kCACzD,aAAa,KAChB,OAAO;YACP,IAAI,IACJ,CAAC;QAEH,IAAA,0BAAgB,EAAC,IAAI,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;QAExB,IAAI,iBAAiB,CAAC,IAAI,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,WAAW,iBAAiB,CAAC,IAAI,CAAC,MAAM,IAAI,iBAAiB,CAAC,WAAW,EAAE,CAAC;YAC7F,MAAM,WAAW,GACf,MAAA,iBAAiB,CAAC,WAAW,mCAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;YACtE,MAAM,YAAY,GAAG,MAAM,IAAA,oCAAmB,EAC5C,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EACvC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAClC,QAAQ,EACR,WAAW,CACZ,CAAC;YACF,IAAI,YAAY,EAAE,CAAC;gBACjB,6EAA6E;gBAC7E,wEAAwE;gBACxE,sEAAsE;gBACtE,uEAAuE;gBACvE,sEAAsE;gBACtE,0EAA0E;gBAC1E,mCAAmC;gBACnC,MAAM,YAAY,GAAG,GAAG,iBAAiB,CAAC,WAAW,aAAa,CAAC;gBACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;oBACxC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE;oBACpC,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACzC,IAAI,CAAC,KAAK,CACR,YAAY,EACZ,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,iBAAiB,YAAY,IAAI,CAC9E,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,2EAA2E;QAC3E,yEAAyE;QACzE,6CAA6C;QAC7C,yEAAyE;QACzE,IAAI,iBAAiB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACjD,gFAAgF;YAChF,mFAAmF;YACnF,MAAM,WAAW,GACf,MAAA,iBAAiB,CAAC,WAAW,mCAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;YAEtE,MAAM,MAAM,GACV,MAAA,MAAA,IAAI,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,WAAW,cAAc,CAAC,0CAAE,QAAQ,EAAE,mCACrE,EAAE,CAAC;YACL,MAAM,aAAa,GACjB,MAAA,MAAA,IAAI;iBACD,IAAI,CAAC,GAAG,iBAAiB,CAAC,WAAW,qBAAqB,CAAC,0CAC1D,QAAQ,EAAE,mCAAI,EAAE,CAAC;YACvB,MAAM,QAAQ,GACZ,MAAA,MAAA,IAAI,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,WAAW,gBAAgB,CAAC,0CAAE,QAAQ,EAAE,mCACvE,EAAE,CAAC;YACL,MAAM,UAAU,GACd,iBAAiB,CAAC,QAAQ,KAAK,MAAM;gBACnC,CAAC,CAAC,CAAC,MAAA,MAAA,IAAI;qBACF,IAAI,CAAC,GAAG,iBAAiB,CAAC,WAAW,kBAAkB,CAAC,0CACvD,QAAQ,EAAE,mCAAI,EAAE,CAAC;gBACvB,CAAC,CAAC,SAAS,CAAC;YAEhB,MAAM,WAAW,GAAG,MAAM,IAAA,oBAAY,EACpC,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,EAC1C,WAAW,EACX;gBACE,WAAW,EAAE,iBAAiB,CAAC,WAAW;gBAC1C,WAAW,EAAE,iBAAiB;gBAC9B,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC,MAAM;gBACrC,aAAa,EAAE,+BAAc;gBAC7B,aAAa,kBACX,aAAa,EAAE,MAAM,EACrB,oBAAoB,EAAE,aAAa,EACnC,eAAe,EAAE,QAAQ,IACtB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACzD;aACF,EACD,IAAI,EACJ,iBAAiB,CAAC,WAAW,CAC9B,CAAC;YAEF,0EAA0E;YAC1E,sEAAsE;YACtE,qEAAqE;YACrE,IAAI,WAAW,IAAI,WAAW,CAAC,YAAY,KAAK,CAAC,EAAE,CAAC;gBAClD,MAAM,EAAE,MAAM,EAAE,GAAG,2CAAa,UAAU,EAAC,CAAC;gBAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAuB;oBACrD,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,SAAS;oBACf,OAAO,EACL,mFAAmF;oBACrF,OAAO,EAAE,CAAC,WAAW,CAAC,WAAW;iBAClC,CAAC,CAAC;gBACH,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAA,2BAAmB,EAAC,IAAI,kCACzB,iBAAiB,KACpB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,CAAC,WAAW,EACtC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,IACpC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;CAAA"}
|