From abaabf529d1641c384ea1c21cf6c32dab9124e11 Mon Sep 17 00:00:00 2001 From: Iben Van de Veire Date: Wed, 28 May 2025 13:05:39 +0200 Subject: [PATCH] feat(ngx-gov-flanders): Setup Flanders Gov package --- libs/angular/gov/flanders/.eslintrc.json | 50 +++++ libs/angular/gov/flanders/README.md | 29 +++ libs/angular/gov/flanders/jest.config.ts | 21 ++ libs/angular/gov/flanders/ng-package.json | 7 + libs/angular/gov/flanders/package.json | 35 ++++ libs/angular/gov/flanders/project.json | 36 ++++ libs/angular/gov/flanders/src/index.ts | 1 + libs/angular/gov/flanders/src/lib/index.ts | 2 + .../acm-component-injection.service.ts | 191 ++++++++++++++++++ .../gov/flanders/src/lib/services/index.ts | 1 + ...-component-injection-configuration.type.ts | 44 ++++ .../gov/flanders/src/lib/types/index.ts | 1 + libs/angular/gov/flanders/src/test-setup.ts | 6 + libs/angular/gov/flanders/tsconfig.json | 5 + libs/angular/gov/flanders/tsconfig.lib.json | 5 + .../gov/flanders/tsconfig.lib.prod.json | 9 + libs/angular/gov/flanders/tsconfig.spec.json | 11 + package-lock.json | 23 +++ package.json | 2 + tsconfig.base.json | 3 +- 20 files changed, 481 insertions(+), 1 deletion(-) create mode 100644 libs/angular/gov/flanders/.eslintrc.json create mode 100644 libs/angular/gov/flanders/README.md create mode 100644 libs/angular/gov/flanders/jest.config.ts create mode 100644 libs/angular/gov/flanders/ng-package.json create mode 100644 libs/angular/gov/flanders/package.json create mode 100644 libs/angular/gov/flanders/project.json create mode 100644 libs/angular/gov/flanders/src/index.ts create mode 100644 libs/angular/gov/flanders/src/lib/index.ts create mode 100644 libs/angular/gov/flanders/src/lib/services/acm-component-injection.service.ts create mode 100644 libs/angular/gov/flanders/src/lib/services/index.ts create mode 100644 libs/angular/gov/flanders/src/lib/types/acm-component-injection-configuration.type.ts create mode 100644 libs/angular/gov/flanders/src/lib/types/index.ts create mode 100644 libs/angular/gov/flanders/src/test-setup.ts create mode 100644 libs/angular/gov/flanders/tsconfig.json create mode 100644 libs/angular/gov/flanders/tsconfig.lib.json create mode 100644 libs/angular/gov/flanders/tsconfig.lib.prod.json create mode 100644 libs/angular/gov/flanders/tsconfig.spec.json diff --git a/libs/angular/gov/flanders/.eslintrc.json b/libs/angular/gov/flanders/.eslintrc.json new file mode 100644 index 00000000..9dfb0220 --- /dev/null +++ b/libs/angular/gov/flanders/.eslintrc.json @@ -0,0 +1,50 @@ +{ + "extends": ["../../../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts"], + "extends": [ + "plugin:@nx/angular", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@angular-eslint/component-class-suffix": [ + "error", + { + "suffixes": ["Component", "Container", "Page"] + } + ], + "@typescript-eslint/no-inferrable-types": "off", + "comma-dangle": [ + "error", + { + "arrays": "always-multiline", + "exports": "always-multiline", + "functions": "never", + "imports": "always-multiline", + "objects": "always-multiline" + } + ], + "import/order": "error" + } + }, + { + "files": ["*.html"], + "extends": ["plugin:@nx/angular-template"], + "rules": {} + }, + { + "files": ["*.json"], + "parser": "jsonc-eslint-parser", + "rules": { + "@nx/dependency-checks": [ + "error", + { + "ignoredFiles": ["{projectRoot}/eslint.config.{js,cjs,mjs}"] + } + ] + } + } + ] +} diff --git a/libs/angular/gov/flanders/README.md b/libs/angular/gov/flanders/README.md new file mode 100644 index 00000000..d791f034 --- /dev/null +++ b/libs/angular/gov/flanders/README.md @@ -0,0 +1,29 @@ +# # Angular Tools: NgxGovFlanders (`@studiohyperdrive/ngx-gov-flanders`) + +This library provides multiple utilities for projects related to the Flemish Government. + +## Installation + +Install the package first: + +```shell +npm install @studiohyperdrive/ngx-gov-flanders +``` + +## Versioning and build information + +This package will follow a semver-like format, `major.minor.patch`, in which: + +- `major`: Follows the Angular major version +- `minor`: Introduces new features and (potential) breaking changes +- `patch`: Introduces bugfixes and minor non-breaking changes + +For more information about the build process, authors, contributions and issues, we refer to the [hyperdrive-opensource](https://github.com/studiohyperdrive/hyperdrive-opensource) repository. + +## Concept + +The `ngx-gov-flanders` package provides helpers and wrappers that will make it easier to implement services and components that are provided by the Flemish Government. + +## Documentation + +To find more information regarding this package, we refer to [our documentation platform](https://open-source.studiohyperdrive.be/docs/angular/gov/flanders/introduction). diff --git a/libs/angular/gov/flanders/jest.config.ts b/libs/angular/gov/flanders/jest.config.ts new file mode 100644 index 00000000..ba5caea3 --- /dev/null +++ b/libs/angular/gov/flanders/jest.config.ts @@ -0,0 +1,21 @@ +export default { + displayName: 'ngx-gov-flanders', + preset: '../../../../jest.preset.js', + setupFilesAfterEnv: ['/src/test-setup.ts'], + coverageDirectory: '../../../../coverage/libs/angular/gov/flanders', + transform: { + '^.+\\.(ts|mjs|js|html)$': [ + 'jest-preset-angular', + { + tsconfig: '/tsconfig.spec.json', + stringifyContentPathRegex: '\\.(html|svg)$', + }, + ], + }, + transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], + snapshotSerializers: [ + 'jest-preset-angular/build/serializers/no-ng-attributes', + 'jest-preset-angular/build/serializers/ng-snapshot', + 'jest-preset-angular/build/serializers/html-comment', + ], +}; diff --git a/libs/angular/gov/flanders/ng-package.json b/libs/angular/gov/flanders/ng-package.json new file mode 100644 index 00000000..9d21532e --- /dev/null +++ b/libs/angular/gov/flanders/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../../../dist/libs/angular/gov/flanders", + "lib": { + "entryFile": "src/index.ts" + } +} diff --git a/libs/angular/gov/flanders/package.json b/libs/angular/gov/flanders/package.json new file mode 100644 index 00000000..4ea75dc7 --- /dev/null +++ b/libs/angular/gov/flanders/package.json @@ -0,0 +1,35 @@ +{ + "name": "@studiohyperdrive/ngx-gov-flanders", + "version": "0.0.0", + "description": "An integrated Angular approach to common use-cases for applications for the Flemish Government.", + "keywords": [ + "angular", + "angular2", + "ACM", + "GlobalHeader", + "GlobalFooter", + "VO", + "Flanders", + "Vlaamse Overheid", + "Flemish Government" + ], + "homepage": "https://open-source.studiohyperdrive.be/docs/angular/gov/flanders/introduction", + "license": "MIT", + "author": { + "name": "Studio Hyperdrive", + "url": "https://studiohyperdrive.be/" + }, + "repository": { + "type": "git", + "url": "https://github.com/studiohyperdrive/hyperdrive-opensource", + "directory": "libs/angular/gov/flanders/src" + }, + "peerDependencies": { + "@angular/core": "^19.0.0", + "@govflanders/vl-widget-global-footer-types": "^1.0.22", + "@govflanders/vl-widget-global-header-types": "^2.0.12", + "@studiohyperdrive/ngx-core": "^19.1.0", + "rxjs": "7.8.1" + }, + "sideEffects": false +} diff --git a/libs/angular/gov/flanders/project.json b/libs/angular/gov/flanders/project.json new file mode 100644 index 00000000..27d97704 --- /dev/null +++ b/libs/angular/gov/flanders/project.json @@ -0,0 +1,36 @@ +{ + "name": "ngx-gov-flanders", + "$schema": "../../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/angular/gov/flanders/src", + "prefix": "lib", + "projectType": "library", + "tags": [], + "targets": { + "build": { + "executor": "@nx/angular:package", + "outputs": ["{workspaceRoot}/dist/{projectRoot}"], + "options": { + "project": "libs/angular/gov/flanders/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "libs/angular/gov/flanders/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "libs/angular/gov/flanders/tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + }, + "test": { + "executor": "@nx/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "libs/angular/gov/flanders/jest.config.ts" + } + }, + "lint": { + "executor": "@nx/eslint:lint" + } + } +} diff --git a/libs/angular/gov/flanders/src/index.ts b/libs/angular/gov/flanders/src/index.ts new file mode 100644 index 00000000..f41a696f --- /dev/null +++ b/libs/angular/gov/flanders/src/index.ts @@ -0,0 +1 @@ +export * from './lib'; diff --git a/libs/angular/gov/flanders/src/lib/index.ts b/libs/angular/gov/flanders/src/lib/index.ts new file mode 100644 index 00000000..3112a3c0 --- /dev/null +++ b/libs/angular/gov/flanders/src/lib/index.ts @@ -0,0 +1,2 @@ +export * from './services'; +export * from './types'; diff --git a/libs/angular/gov/flanders/src/lib/services/acm-component-injection.service.ts b/libs/angular/gov/flanders/src/lib/services/acm-component-injection.service.ts new file mode 100644 index 00000000..ad3ad8ba --- /dev/null +++ b/libs/angular/gov/flanders/src/lib/services/acm-component-injection.service.ts @@ -0,0 +1,191 @@ +import { inject, Injectable, Renderer2, RendererFactory2 } from '@angular/core'; +import { GlobalFooterClient } from '@govflanders/vl-widget-global-footer-types'; +import { GlobalHeaderClient } from '@govflanders/vl-widget-global-header-types'; +import { NgxWindowService } from '@studiohyperdrive/ngx-core'; +import { first, from, fromEvent, Observable, of, retry, switchMap, throwError } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { + NgxAcmComponentConfiguration, + NgxAcmComponentInjectionConfiguration, + NgxAcmHeaderComponentConfiguration, +} from '../types'; + +/** + * The `NgxAcmComponentInjectionService` is a service that provides methods to inject either a GlobalHeader or a GlobalFooter by ACM to your application. + */ +@Injectable({ + providedIn: 'root', +}) +export class NgxAcmComponentInjectionService { + /** + * An instance of the RendererFactory2 + */ + private rendererFactory: RendererFactory2 = inject(RendererFactory2); + /** + * An instance of the Renderer2 + */ + private renderer: Renderer2 = this.rendererFactory.createRenderer(null, null); + /** + * An instance of the NgxWindowService + */ + private windowService: NgxWindowService = inject(NgxWindowService); + + /** + * Initializes the VO Global Header widget and sets optional applicationMenuLinks. + * + * @param selector - The selector of the element where the header widget should be mounted. + * @param configuration - The configuration object + * @param configuration.url - The URL of the widget (e.g. 'https://.widgets.burgerprofiel.vlaanderen.be/') + * @param configuration.id - The ID of the widget (e.g. '7502b557-5d49-4ab3-9995-168718b81be5') + * @param configuration.profile - The profile configuration object + * @param links - Optional application menu links + * + * @returns The GlobalHeaderClient object will be returned to allow for custom implementations that are not supported out of the box, see: https://test.widgets.burgerprofiel.dev-vlaanderen.be/docs/global-header/ for more information. + */ + public injectGlobalHeaderComponent({ + selector, + configuration, + links, + }: NgxAcmComponentInjectionConfiguration): Observable { + // Denis: The following code should only run in the browser. + return this.windowService.runInBrowser>( + ({ browserWindow, browserDocument }) => { + // Denis: Create a new script tag + return this.injectComponent( + browserDocument, + selector, + configuration, + 'GlobalHeaderComponent' + ).pipe( + switchMap((headerElement: HTMLElement) => { + // Denis: Get the GlobalHeaderClient object + const headerClient: GlobalHeaderClient = browserWindow.globalHeaderClient; + + return from(headerClient.mount(headerElement)); + }), + switchMap(() => { + // Denis: If there are no links, fallback to the default links + if (!Array.isArray(links) || !links.length) { + return of(null); + } + + // Denis: Get the GlobalHeaderClient object + const headerClient: GlobalHeaderClient = browserWindow.globalHeaderClient; + + // Denis: Set the optional application menu links + return from(headerClient.accessMenu.setApplicationMenuLinks(links)); + }), + switchMap(() => { + // Denis: Get the GlobalHeaderClient object + const headerClient: GlobalHeaderClient = browserWindow.globalHeaderClient; + + // Denis: Set the provided ProfileConfig + return headerClient.accessMenu.setProfile(configuration.profile); + }), + map(() => browserWindow.globalHeaderClient) + ); + } + ); + } + + /** + * Initializes the VO Global Footer widget and sets optional navigation links. + * + * @param selector - The selector of the element where the footer widget should be mounted. + * @param configuration - The configuration object + * @param configuration.url - The URL of the widget (e.g. 'https://.widgets.burgerprofiel.vlaanderen.be/') + * @param configuration.id - The ID of the widget (e.g. '7502b557-5d49-4ab3-9995-168718b81be5') + * @param links - Optional navigation links + * + * @returns The GlobalFooterClient object will be returned to allow for custom implementations that are not supported out of the box, see: https://test.widgets.burgerprofiel.dev-vlaanderen.be/docs/global-footer/ for more information. + */ + public injectGlobalFooterComponent({ + selector, + configuration, + links, + }: NgxAcmComponentInjectionConfiguration): Observable { + // Denis: The following code should only run in the browser. + return this.windowService.runInBrowser>( + ({ browserWindow, browserDocument }) => { + // Denis: Create a new script tag + return this.injectComponent( + browserDocument, + selector, + configuration, + 'GlobalFooterComponent' + ).pipe( + switchMap((footerElement: HTMLElement) => { + // Denis: When the script is loaded, get the GlobalHeaderClient object + const footerClient: GlobalFooterClient = browserWindow.globalFooterClient; + + return from(footerClient.mount(footerElement)); + }), + switchMap(() => { + // Denis: If there are no links, fallback to the default links + if (!Array.isArray(links) || !links.length) { + return of(null); + } + + // Denis: Get the GlobalHeaderClient object + const footerClient: GlobalFooterClient = browserWindow.globalFooterClient; + + // Denis: Set the provided navigation links + return from(footerClient.setNavigationLinks(links)); + }), + map(() => browserWindow.globalFooterClient) + ); + } + ); + } + + /** + * Creates a script tag for the ACMComponent and appends it to the browser + * + * @private + * @param browserDocument - An instance of the browser document + * @param configuration - The configuration of the ACM component + * @param selector - The selector of the component + * @param component - The name of the component we wish to append + */ + private injectComponent( + browserDocument: Document, + selector: string, + configuration: NgxAcmComponentConfiguration, + component: string + ): Observable { + // Denis: Create a new script tag + const script = this.renderer.createElement('script'); + + // Denis: Set up the script to load the header widget + script.src = configuration.url + 'api/v2/widget/' + configuration.id + '/entry'; + script.type = 'text/javascript'; + + // Denis: Append the script to the DOM to load it. + this.renderer.appendChild(browserDocument.head, script); + + return fromEvent(script, 'load').pipe( + first(), + switchMap(() => { + // Denis: Mount the provided widget script + const element: HTMLElement = browserDocument.querySelector(selector); + + // Iben: If no element was found, we throw an error + if (typeof element === 'undefined' || element === null) { + return throwError( + () => + new Error( + `NGXGovFlanders: An error occurred when trying to mount the ${component}, the provided targetElement was not found.` + ) + ); + } + + // Iben: Return the element + return of(element); + }), + retry({ + count: 5, + delay: 100, + }) + ); + } +} diff --git a/libs/angular/gov/flanders/src/lib/services/index.ts b/libs/angular/gov/flanders/src/lib/services/index.ts new file mode 100644 index 00000000..9253d4fa --- /dev/null +++ b/libs/angular/gov/flanders/src/lib/services/index.ts @@ -0,0 +1 @@ +export * from './acm-component-injection.service'; diff --git a/libs/angular/gov/flanders/src/lib/types/acm-component-injection-configuration.type.ts b/libs/angular/gov/flanders/src/lib/types/acm-component-injection-configuration.type.ts new file mode 100644 index 00000000..c495d455 --- /dev/null +++ b/libs/angular/gov/flanders/src/lib/types/acm-component-injection-configuration.type.ts @@ -0,0 +1,44 @@ +import { ApplicationMenuLink, ProfileConfig } from '@govflanders/vl-widget-global-header-types'; + +/** + * Configuration to inject an ACM component + */ +export interface NgxAcmComponentInjectionConfiguration< + ConfigurationType extends NgxAcmComponentConfiguration = NgxAcmComponentConfiguration, +> { + /** + * The selector of the element where the component should be mounted. + */ + selector: string; + /** + * The configuration of the component + */ + configuration: ConfigurationType; + /** + * An optional list of links we want to display in the components + */ + links?: ApplicationMenuLink[]; +} +/** + * The configuration of the component + */ +export interface NgxAcmComponentConfiguration { + /** + * The URL of the widget (e.g. 'https://.widgets.burgerprofiel.vlaanderen.be/') + */ + url: string; + /** + * The id of the widget (e.g. '7502b557-5d49-4ab3-9995-168718b81be5') + */ + id: string; +} + +/** + * The configuration of the Global Header component + */ +export interface NgxAcmHeaderComponentConfiguration extends NgxAcmComponentConfiguration { + /** + * The profile configuration object + */ + profile: ProfileConfig; +} diff --git a/libs/angular/gov/flanders/src/lib/types/index.ts b/libs/angular/gov/flanders/src/lib/types/index.ts new file mode 100644 index 00000000..63da9b4c --- /dev/null +++ b/libs/angular/gov/flanders/src/lib/types/index.ts @@ -0,0 +1 @@ +export * from './acm-component-injection-configuration.type'; diff --git a/libs/angular/gov/flanders/src/test-setup.ts b/libs/angular/gov/flanders/src/test-setup.ts new file mode 100644 index 00000000..bc3333bb --- /dev/null +++ b/libs/angular/gov/flanders/src/test-setup.ts @@ -0,0 +1,6 @@ +import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone'; + +setupZoneTestEnv({ + errorOnUnknownElements: true, + errorOnUnknownProperties: true, +}); diff --git a/libs/angular/gov/flanders/tsconfig.json b/libs/angular/gov/flanders/tsconfig.json new file mode 100644 index 00000000..86042b36 --- /dev/null +++ b/libs/angular/gov/flanders/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../../../tsconfig.base.json", + "exclude": ["src/test.ts", "**/*.spec.ts"], + "include": ["**/*.ts"] +} diff --git a/libs/angular/gov/flanders/tsconfig.lib.json b/libs/angular/gov/flanders/tsconfig.lib.json new file mode 100644 index 00000000..86042b36 --- /dev/null +++ b/libs/angular/gov/flanders/tsconfig.lib.json @@ -0,0 +1,5 @@ +{ + "extends": "../../../../tsconfig.base.json", + "exclude": ["src/test.ts", "**/*.spec.ts"], + "include": ["**/*.ts"] +} diff --git a/libs/angular/gov/flanders/tsconfig.lib.prod.json b/libs/angular/gov/flanders/tsconfig.lib.prod.json new file mode 100644 index 00000000..7b29b93f --- /dev/null +++ b/libs/angular/gov/flanders/tsconfig.lib.prod.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/libs/angular/gov/flanders/tsconfig.spec.json b/libs/angular/gov/flanders/tsconfig.spec.json new file mode 100644 index 00000000..40aad461 --- /dev/null +++ b/libs/angular/gov/flanders/tsconfig.spec.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "target": "es2016", + "types": ["jest", "node"] + }, + "files": ["src/test-setup.ts"], + "include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"] +} diff --git a/package-lock.json b/package-lock.json index 67c423a3..f674f92d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,8 @@ "@angular/platform-server": "19.0.3", "@angular/router": "19.0.3", "@angular/ssr": "19.0.4", + "@govflanders/vl-widget-global-footer-types": "1.0.23", + "@govflanders/vl-widget-global-header-types": "2.0.14", "@ng-doc/app": "19.0.1", "@ng-doc/builder": "19.0.1", "@ng-doc/core": "19.0.1", @@ -2771,6 +2773,27 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@govflanders/vl-widget-global-footer-types": { + "version": "1.0.23", + "resolved": "https://registry.npmjs.org/@govflanders/vl-widget-global-footer-types/-/vl-widget-global-footer-types-1.0.23.tgz", + "integrity": "sha512-/MXFXsi9K1O0RyObolw5UCc3O8ZC5dUVgvxplDzZRNgubhEJM17kcUR6BM4SzytWFXIiOT7M2j+G1F8+y0SdLw==", + "dependencies": { + "@govflanders/vl-widget-shared": "^1.0.14" + } + }, + "node_modules/@govflanders/vl-widget-global-header-types": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@govflanders/vl-widget-global-header-types/-/vl-widget-global-header-types-2.0.14.tgz", + "integrity": "sha512-M1RYI2Bppa4Sw3vEvg5Gdw3lWtrXyRji5o3YWRwnPHJ5Kv8ypT2MeOJti9BjUREU2XVO098M/HfBEDRgHaB/KQ==", + "dependencies": { + "@govflanders/vl-widget-shared": "^1.0.14" + } + }, + "node_modules/@govflanders/vl-widget-shared": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@govflanders/vl-widget-shared/-/vl-widget-shared-1.0.14.tgz", + "integrity": "sha512-7/NStaEGiqHnPo9UMiqj8uBd9pMa0p7D20UfP5PBk9sFPtQ40OK4Oj21phacrs4BMuKvV/I1/J7uKHj4SZnZVA==" + }, "node_modules/@hapi/address": { "version": "4.1.0", "license": "BSD-3-Clause", diff --git a/package.json b/package.json index 25f499b3..8491870c 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,8 @@ "@angular/platform-server": "19.0.3", "@angular/router": "19.0.3", "@angular/ssr": "19.0.4", + "@govflanders/vl-widget-global-footer-types": "1.0.23", + "@govflanders/vl-widget-global-header-types": "2.0.14", "@ng-doc/app": "19.0.1", "@ng-doc/builder": "19.0.1", "@ng-doc/core": "19.0.1", diff --git a/tsconfig.base.json b/tsconfig.base.json index 7ecae486..00abb607 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -35,7 +35,8 @@ "@ngx/store": ["libs/angular/store/src/public-api.ts"], "@ngx/table": ["libs/angular/table/src/public-api.ts"], "@ngx/tour": ["libs/angular/tour/src/index.ts"], - "@ngx/utils": ["libs/angular/utils/src/public-api.ts"] + "@ngx/utils": ["libs/angular/utils/src/public-api.ts"], + "@studiohyperdrive/ngx-gov-flanders": ["libs/angular/gov/flanders/src/index.ts"] }, "useDefineForClassFields": false, "skipLibCheck": true,