From 3b58277970c0c830b565ce89aeb199ed10a6d47f Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Bianchi <72747835+JBBianchi@users.noreply.github.com> Date: Fri, 5 Jan 2024 13:57:00 +0100 Subject: [PATCH] Build Angular packages with ng-packagr (#2236) This replaces the use of ngc with ng-packagr when building the angular packages. With this, the libraries don't provide a cjs output anymore, only (partially compiled) *esm. In order to tidy the output, the sources have been moved to a library sub folder and exposed via a commonly used public_api file. The example for the angular material renderer has also been modified to import the output of the library instead of the sources. This allows to actually validate that the package can be loaded and fully compiled (rather than rebuilding everything, the lib + the app, all at once). Therefore, the use of rollup has been dropped in favor of the internal angular browser builder. This also adds `@angular/core` as dev dependency to root package.json to facilitate the new build working with angular-material's `dev` npm script from within the package. --------- Co-authored-by: Lucas Koehler --- package.json | 1 + packages/angular-material/build-example.js | 73 +++++++++++ packages/angular-material/build-package.js | 11 ++ .../example/app/app.component.ts | 2 +- .../example/app/app.module.ts | 2 +- .../example/index.bundled.html | 30 ----- packages/angular-material/example/index.html | 5 +- packages/angular-material/example/main.ts | 3 +- packages/angular-material/ng-package.json | 10 ++ packages/angular-material/package.json | 18 +-- .../angular-material/rollup.example.config.js | 56 -------- packages/angular-material/src/index.ts | 122 +----------------- .../controls/autocomplete.renderer.ts | 0 .../controls/boolean.renderer.ts | 0 .../{ => library}/controls/date.renderer.ts | 0 .../src/{ => library}/controls/index.ts | 0 .../{ => library}/controls/number.renderer.ts | 0 .../{ => library}/controls/range.renderer.ts | 0 .../{ => library}/controls/text.renderer.ts | 0 .../controls/textarea.renderer.ts | 0 .../{ => library}/controls/toggle.renderer.ts | 0 .../angular-material/src/library/index.ts | 121 +++++++++++++++++ .../layouts/array-layout.renderer.ts | 0 .../layouts/categorization-layout.renderer.ts | 0 .../layouts/group-layout.renderer.ts | 0 .../layouts/horizontal-layout.renderer.ts | 0 .../src/{ => library}/layouts/index.ts | 0 .../{ => library}/layouts/layout.renderer.ts | 0 .../layouts/vertical-layout.renderer.ts | 0 .../src/{ => library}/module.ts | 0 .../src/{ => library}/other/index.ts | 0 .../src/{ => library}/other/label.renderer.ts | 0 .../other/master-detail/detail.ts | 0 .../other/master-detail/index.ts | 0 .../other/master-detail/master.ts | 0 .../{ => library}/other/object.renderer.ts | 0 .../src/{ => library}/other/table.renderer.ts | 0 .../src/{ => library}/other/util.ts | 0 packages/angular-material/src/public_api.ts | 1 + packages/angular-material/test-runner.js | 4 +- .../test/group-layout.spec.ts | 4 +- .../test/horizontal-layout.spec.ts | 4 +- .../test/label-renderer.spec.ts | 2 +- .../test/master-detail.spec.ts | 4 +- .../test/object-control.spec.ts | 4 +- .../test/table-control.spec.ts | 2 +- .../angular-material/test/tsconfig.test.json | 11 -- .../test/vertical-layout.spec.ts | 4 +- packages/angular-material/tsconfig.cjs.json | 9 -- .../angular-material/tsconfig.example.json | 13 +- packages/angular-material/tsconfig.json | 7 +- packages/angular-test/build-package.js | 11 ++ packages/angular-test/ng-package.json | 8 ++ packages/angular-test/package.json | 5 +- packages/angular-test/src/index.ts | 31 +---- .../angular-test/src/{ => library}/boolean.ts | 0 packages/angular-test/src/library/index.ts | 30 +++++ .../angular-test/src/{ => library}/layout.ts | 0 .../angular-test/src/{ => library}/number.ts | 0 .../angular-test/src/{ => library}/range.ts | 0 .../angular-test/src/{ => library}/text.ts | 0 .../angular-test/src/{ => library}/util.ts | 0 packages/angular-test/src/public_api.ts | 1 + packages/angular-test/tsconfig.json | 14 +- packages/angular/build-package.js | 11 ++ packages/angular/ng-package.json | 5 + packages/angular/package.json | 7 +- packages/angular/src/index.ts | 34 +---- .../src/{ => library}/abstract-control.ts | 0 .../src/{ => library}/array-control.ts | 0 .../src/{ => library}/base.renderer.ts | 0 packages/angular/src/{ => library}/control.ts | 0 packages/angular/src/library/index.ts | 33 +++++ .../{ => library}/jsonforms-root.component.ts | 0 .../src/{ => library}/jsonforms.component.ts | 0 .../src/{ => library}/jsonforms.module.ts | 0 .../src/{ => library}/jsonforms.service.ts | 0 .../src/{ => library}/unknown.component.ts | 0 packages/angular/src/public_api.ts | 1 + packages/angular/tsconfig.json | 7 +- pnpm-lock.yaml | 99 +------------- 81 files changed, 379 insertions(+), 441 deletions(-) create mode 100644 packages/angular-material/build-example.js create mode 100644 packages/angular-material/build-package.js delete mode 100644 packages/angular-material/example/index.bundled.html create mode 100644 packages/angular-material/ng-package.json delete mode 100644 packages/angular-material/rollup.example.config.js rename packages/angular-material/src/{ => library}/controls/autocomplete.renderer.ts (100%) rename packages/angular-material/src/{ => library}/controls/boolean.renderer.ts (100%) rename packages/angular-material/src/{ => library}/controls/date.renderer.ts (100%) rename packages/angular-material/src/{ => library}/controls/index.ts (100%) rename packages/angular-material/src/{ => library}/controls/number.renderer.ts (100%) rename packages/angular-material/src/{ => library}/controls/range.renderer.ts (100%) rename packages/angular-material/src/{ => library}/controls/text.renderer.ts (100%) rename packages/angular-material/src/{ => library}/controls/textarea.renderer.ts (100%) rename packages/angular-material/src/{ => library}/controls/toggle.renderer.ts (100%) create mode 100644 packages/angular-material/src/library/index.ts rename packages/angular-material/src/{ => library}/layouts/array-layout.renderer.ts (100%) rename packages/angular-material/src/{ => library}/layouts/categorization-layout.renderer.ts (100%) rename packages/angular-material/src/{ => library}/layouts/group-layout.renderer.ts (100%) rename packages/angular-material/src/{ => library}/layouts/horizontal-layout.renderer.ts (100%) rename packages/angular-material/src/{ => library}/layouts/index.ts (100%) rename packages/angular-material/src/{ => library}/layouts/layout.renderer.ts (100%) rename packages/angular-material/src/{ => library}/layouts/vertical-layout.renderer.ts (100%) rename packages/angular-material/src/{ => library}/module.ts (100%) rename packages/angular-material/src/{ => library}/other/index.ts (100%) rename packages/angular-material/src/{ => library}/other/label.renderer.ts (100%) rename packages/angular-material/src/{ => library}/other/master-detail/detail.ts (100%) rename packages/angular-material/src/{ => library}/other/master-detail/index.ts (100%) rename packages/angular-material/src/{ => library}/other/master-detail/master.ts (100%) rename packages/angular-material/src/{ => library}/other/object.renderer.ts (100%) rename packages/angular-material/src/{ => library}/other/table.renderer.ts (100%) rename packages/angular-material/src/{ => library}/other/util.ts (100%) create mode 100644 packages/angular-material/src/public_api.ts delete mode 100644 packages/angular-material/test/tsconfig.test.json delete mode 100644 packages/angular-material/tsconfig.cjs.json create mode 100644 packages/angular-test/build-package.js create mode 100644 packages/angular-test/ng-package.json rename packages/angular-test/src/{ => library}/boolean.ts (100%) create mode 100644 packages/angular-test/src/library/index.ts rename packages/angular-test/src/{ => library}/layout.ts (100%) rename packages/angular-test/src/{ => library}/number.ts (100%) rename packages/angular-test/src/{ => library}/range.ts (100%) rename packages/angular-test/src/{ => library}/text.ts (100%) rename packages/angular-test/src/{ => library}/util.ts (100%) create mode 100644 packages/angular-test/src/public_api.ts create mode 100644 packages/angular/build-package.js create mode 100644 packages/angular/ng-package.json rename packages/angular/src/{ => library}/abstract-control.ts (100%) rename packages/angular/src/{ => library}/array-control.ts (100%) rename packages/angular/src/{ => library}/base.renderer.ts (100%) rename packages/angular/src/{ => library}/control.ts (100%) create mode 100644 packages/angular/src/library/index.ts rename packages/angular/src/{ => library}/jsonforms-root.component.ts (100%) rename packages/angular/src/{ => library}/jsonforms.component.ts (100%) rename packages/angular/src/{ => library}/jsonforms.module.ts (100%) rename packages/angular/src/{ => library}/jsonforms.service.ts (100%) rename packages/angular/src/{ => library}/unknown.component.ts (100%) create mode 100644 packages/angular/src/public_api.ts diff --git a/package.json b/package.json index dbb332f7d0..f7c2ecfb1c 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "build:examples-app": "lerna run build:examples-app && node packages/examples-app/prepare-examples-app.js" }, "devDependencies": { + "@angular/core": "^16.0.0", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.5", "@babel/plugin-proposal-optional-chaining": "^7.16.5", "@istanbuljs/nyc-config-typescript": "^1.0.2", diff --git a/packages/angular-material/build-example.js b/packages/angular-material/build-example.js new file mode 100644 index 0000000000..76ee52538c --- /dev/null +++ b/packages/angular-material/build-example.js @@ -0,0 +1,73 @@ +const path = require('path'); +const ngCore = require('@angular-devkit/core'); +const buildWebpackBrowser = require('@angular-devkit/build-angular/src/builders/browser').buildWebpackBrowser; + +const main = async () => new Promise((resolve, reject) => { + const project = 'angular-material'; + const target = 'build'; + const configuration = ''; + const workspaceRoot = path.join(process.cwd(), '../..'); + const root = `packages/${project}`; + const options = { + outputPath: root + '/example/dist', + tsConfig: root + '/tsconfig.example.json', + main: root + '/example/main.ts', + index: root + '/example/index.html', + styles: [ + root + '/node_modules/@angular/material/prebuilt-themes/indigo-pink.css' + ], + allowedCommonJsDependencies: [ + 'lodash', + 'hammerjs' + ], + watch: false, + buildOptimizer: false, + optimization: false, + outputHashing: 'none', + }; + const sourceRoot = root; + const teardownLogics = []; + const context = { + workspaceRoot, + logger: new ngCore.logging.Logger(`${project}:${target}:`), + target: { + project, + configuration, + target + }, + getProjectMetadata: (projectName) => Promise.resolve({ + root, + sourceRoot + }), + getBuilderNameForTarget: () => '@angular-devkit/build-angular:karma', + getTargetOptions: (target) => ({...options}), + validateOptions: (options) => options, + addTeardown: (teardown) => { + teardownLogics.push(teardown); + } + }; + let exitCode = 1; + buildWebpackBrowser(options, context, {}).subscribe({ + next: out => { + if (out.success) { + exitCode = 0; + } + }, + error: (err) => { + reject(err); + }, + complete: () => { + if (!exitCode) return resolve(); + reject(); + } + }); + return exitCode; +}); + +main() +.then(() => { + process.exit(0); +}) +.catch(err => { + process.exit(1); +}); \ No newline at end of file diff --git a/packages/angular-material/build-package.js b/packages/angular-material/build-package.js new file mode 100644 index 0000000000..aef214d1a9 --- /dev/null +++ b/packages/angular-material/build-package.js @@ -0,0 +1,11 @@ +const ngPackage = require('ng-packagr'); + +ngPackage + .ngPackagr() + .forProject('ng-package.json') + .withTsConfig('tsconfig.json') + .build() + .catch(error => { + console.error(error); + process.exit(1); + }); \ No newline at end of file diff --git a/packages/angular-material/example/app/app.component.ts b/packages/angular-material/example/app/app.component.ts index 2a274a6145..ecf04458aa 100644 --- a/packages/angular-material/example/app/app.component.ts +++ b/packages/angular-material/example/app/app.component.ts @@ -29,7 +29,7 @@ import { UISchemaElement, UISchemaTester, } from '@jsonforms/core'; -import { angularMaterialRenderers } from '../../src/index'; +import { angularMaterialRenderers } from '../../lib'; import { DateAdapter } from '@angular/material/core'; const uiSchema = { diff --git a/packages/angular-material/example/app/app.module.ts b/packages/angular-material/example/app/app.module.ts index 25cb82bf94..9b532e27a1 100644 --- a/packages/angular-material/example/app/app.module.ts +++ b/packages/angular-material/example/app/app.module.ts @@ -26,7 +26,7 @@ import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { AppComponent } from './app.component'; -import { JsonFormsAngularMaterialModule } from '../../src/module'; +import { JsonFormsAngularMaterialModule } from '../../lib'; @NgModule({ declarations: [AppComponent], diff --git a/packages/angular-material/example/index.bundled.html b/packages/angular-material/example/index.bundled.html deleted file mode 100644 index 52c0b9b0b3..0000000000 --- a/packages/angular-material/example/index.bundled.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - JSON Forms Angular Material RendererSet - - - - - - - - - - - - - diff --git a/packages/angular-material/example/index.html b/packages/angular-material/example/index.html index 7eb9fa2b81..07875afcb5 100644 --- a/packages/angular-material/example/index.html +++ b/packages/angular-material/example/index.html @@ -2,12 +2,10 @@ - Tour of Heroes - + JSON Forms Angular Material RendererSet - -