From 70f18716516d1a8f75167a6ec99c0415d98ee396 Mon Sep 17 00:00:00 2001 From: Olivier Combe Date: Mon, 6 Jan 2025 16:58:32 +0100 Subject: [PATCH] feat: use vite preview instead of webpack for Angular v17+ --- .bitmap | 120 ++++---- .../angular-app-type/angular-app-options.ts | 6 - .../angular-app-type/angular.application.ts | 131 +++------ .../app-types/angular-app-type/component.json | 20 +- angular/app-types/angular-app-type/utils.ts | 65 ----- angular/devkit/common/component.json | 6 +- angular/devkit/common/env-options.ts | 2 - angular/devkit/common/generic-angular-env.ts | 46 ++- angular/devkit/common/utils.ts | 23 +- .../elements/angular-elements.compiler.ts | 21 +- .../devkit/compiler/elements/component.json | 6 +- .../elements/rollup/rollup.compiler.ts | 28 +- .../compiler/multi-compiler/component.json | 10 +- .../multi-compiler/ng-multi-compiler.ts | 2 - .../devkit/compiler/ng-packagr/component.json | 10 +- .../ng-packagr/ng-packagr.compiler.ts | 13 +- angular/devkit/linter/eslint/component.json | 6 +- .../build-angular/builders/application.ts | 6 +- .../schemas/application.schema.ts | 2 +- .../build-angular/webpack/configs.ts | 5 - angular/devkit/ng-compat/component.json | 6 +- angular/devkit/preview/mounter/component.json | 10 +- .../preview-app/preview-app/favicon.ico | Bin 0 -> 15086 bytes .../src/app/docs/docs.component.ts | 52 +++- .../preview-app/preview-app/src/favicon.ico | Bin 948 -> 0 bytes .../preview-app/preview-app/src/index.html | 20 +- .../preview-app/preview-app/src/main.ts | 1 + .../preview-app/preview-app/src/polyfills.ts | 64 ---- .../preview-app/preview-app/src/styles.scss | 2 +- .../preview-app/preview-app/tsconfig.app.json | 17 +- angular/devkit/preview/preview/component.json | 10 +- angular/devkit/preview/runtime/component.json | 10 +- angular/devkit/preview/runtime/loader.ts | 1 + .../vite-preview/angular-vite-preview.ts | 164 +++++++++++ .../preview/vite-preview/component.json | 28 ++ angular/devkit/preview/vite-preview/docs.ts | 34 +++ angular/devkit/preview/vite-preview/index.ts | 1 + .../devkit/preview/vite-preview/mounter.ts | 4 + .../devkit/preview/vite-preview/types.d.ts | 9 + .../vite}/application.bundler.ts | 114 ++++++-- .../vite}/application.dev-server.ts | 46 ++- angular/devkit/vite/component.json | 35 ++- angular/devkit/vite/config.factory.ts | 182 ------------ angular/devkit/vite/index.ts | 8 +- angular/devkit/vite/ng-vite.bundler.ts | 168 +++++++++-- angular/devkit/vite/ng-vite.dev-server.ts | 122 ++++++-- angular/devkit/vite/plugins/dedupe.plugin.ts | 47 +++ .../vite}/plugins/define.plugin.ts | 9 +- .../plugins/index-file/augment-index-html.ts | 276 ------------------ .../index-file/html-rewriting-stream.ts | 57 ---- .../index-file/index-html-generator.ts | 103 ------- .../plugins/index-file/package-chunk-sort.ts | 89 ------ .../vite/plugins/index-file/strip-bom.ts | 13 - .../devkit/vite/plugins/index-html.plugin.ts | 79 ----- angular/devkit/vite/plugins/md.plugin.ts | 37 +++ .../vite/plugins/server-entry.plugin.ts | 113 ------- .../vite}/runtime/api-middleware.js | 0 .../vite}/runtime/renderer.js | 0 angular/devkit/vite/utils/host-alias.ts | 58 ---- angular/devkit/vite/utils/types.ts | 20 +- angular/devkit/vite/utils/utils.ts | 161 +++++++++- angular/devkit/webpack/component.json | 6 +- angular/devkit/webpack/ng-webpack-bundler.ts | 2 +- .../devkit/webpack/ng-webpack-dev-server.ts | 2 +- .../docs/build-pipelines/build-pipelines.mdx | 8 +- .../code-snippets/add-replace-task-build.mdx | 4 +- .../code-snippets/add-task-build.mdx | 4 +- .../code-snippets/add-task-snap.mdx | 4 +- .../code-snippets/add-task-tag.mdx | 4 +- .../code-snippets/jest-build-task.mdx | 4 +- .../code-snippets/jest-service.mdx | 4 +- .../component-generators.mdx | 4 +- .../docs/components-preview/code-examples.tsx | 6 +- .../components-preview/components-preview.mdx | 10 +- .../snippets/composition-mounter-env.mdx | 6 +- .../snippets/composition-provider-env.mdx | 6 +- .../development-tools/development-tools.mdx | 8 +- angular/docs/ng-theming/code-snippet-tabs.tsx | 2 +- .../composition-provider-env.mdx | 6 +- .../workspace-starters/workspace-starters.mdx | 8 +- angular/envs/angular-env/angular.bit-env.ts | 4 - angular/envs/angular-env/angular.docs.mdx | 3 +- angular/envs/angular-env/component.json | 8 +- angular/envs/angular-env/env.jsonc | 14 +- angular/envs/angular-env/index.ts | 2 - .../angular-v16-env.bit-env.ts | 30 +- .../angular-v16-env/angular-v16-env.docs.mdx | 3 +- angular/envs/angular-v16-env/component.json | 8 +- .../config}/mounter.ts | 3 +- angular/envs/angular-v16-env/env.jsonc | 12 +- angular/envs/angular-v16-env/index.ts | 2 - .../angular-v16-env/webpack-config.factory.ts | 6 +- .../webpack/module-rules.config.ts | 2 +- .../angular-v17-env.bit-env.ts | 12 +- .../angular-v17-env/angular-v17-env.docs.mdx | 3 +- angular/envs/angular-v17-env/component.json | 44 +-- angular/envs/angular-v17-env/env.jsonc | 52 ++-- angular/envs/angular-v17-env/index.ts | 2 - .../angular-v17-env/webpack-config.factory.ts | 6 +- .../webpack/module-rules.config.ts | 4 +- .../angular-v18-env.bit-env.ts | 12 +- .../angular-v18-env/angular-v18-env.docs.mdx | 3 +- angular/envs/angular-v18-env/component.json | 8 +- angular/envs/angular-v18-env/env.jsonc | 12 +- angular/envs/angular-v18-env/index.ts | 2 - .../angular-v18-env/webpack-config.factory.ts | 6 +- .../angular-v19-env.bit-env.ts | 12 +- .../angular-v19-env/angular-v19-env.docs.mdx | 3 +- angular/envs/angular-v19-env/component.json | 8 +- angular/envs/angular-v19-env/env.jsonc | 14 +- angular/envs/angular-v19-env/index.ts | 2 - .../angular-v19-env/webpack-config.factory.ts | 6 +- .../webpack/module-rules.config.ts | 23 +- .../envs/base-env/angular-base-env.bit-env.ts | 66 +++-- angular/envs/base-env/component.json | 8 +- angular/envs/base-env/config/mounter.ts | 27 ++ angular/envs/base-env/index.ts | 2 - .../base-env/preview/host-dependencies.ts | 11 - .../examples/my-angular-env/component.json | 8 +- .../config}/mounter.ts | 2 +- angular/examples/my-angular-env/env.jsonc | 14 +- .../my-angular-env/my-angular-env.bit-env.ts | 139 +-------- .../my-angular-env/my-angular-env.docs.mdx | 3 +- .../preview/host-dependencies.ts | 11 - .../my-angular-v16-env/component.json | 8 +- .../config}/mounter.ts | 2 +- angular/examples/my-angular-v16-env/env.jsonc | 12 +- .../my-angular-v16-env.bit-env.ts | 139 +-------- .../my-angular-v16-env.docs.mdx | 3 +- .../preview/host-dependencies.ts | 11 - .../my-angular-v17-env/component.json | 8 +- .../config}/mounter.ts | 2 +- angular/examples/my-angular-v17-env/env.jsonc | 52 ++-- angular/examples/my-angular-v17-env/index.ts | 2 - .../my-angular-v17-env.bit-env.ts | 137 +-------- .../my-angular-v17-env.docs.mdx | 3 +- .../preview/host-dependencies.ts | 11 - .../my-angular-v18-env/component.json | 8 +- .../config}/mounter.ts | 2 +- angular/examples/my-angular-v18-env/env.jsonc | 12 +- angular/examples/my-angular-v18-env/index.ts | 2 - .../my-angular-v18-env.bit-env.ts | 139 +-------- .../my-angular-v18-env.docs.mdx | 3 +- .../preview/host-dependencies.ts | 11 - .../my-angular-v19-env/component.json | 8 +- .../my-angular-v19-env/config/mounter.ts | 27 ++ angular/examples/my-angular-v19-env/env.jsonc | 14 +- angular/examples/my-angular-v19-env/index.ts | 2 - .../my-angular-v19-env.bit-env.ts | 139 +-------- .../my-angular-v19-env.docs.mdx | 3 +- .../preview/host-dependencies.ts | 11 - .../my-angular-v19-env/preview/mounter.ts | 27 -- .../integration/demo-app/demo-app.bit-app.ts | 9 +- .../demo-app/src/app/app.config.ts | 3 +- angular/integration/demo-app/src/main.ts | 4 +- angular/integration/demo-app/src/server.ts | 7 +- .../integration/demo-app/tsconfig.app.json | 1 + .../{src => }/bit-test.component.ts | 0 .../demo-lib-v16/{src => }/bit-test.docs.md | 0 .../demo-lib-v16/{src => }/bit-test.module.ts | 0 .../{src => }/bit-test.service.ts | 0 .../demo-lib-v16/{src => }/bit-test.spec.ts | 0 .../{src => }/bit-test2.component.ts | 0 .../compositions/bit-test.composition.ts | 0 .../compositions/cmp1.composition.ts | 0 .../integration/demo-lib-v16/public-api.ts | 6 +- .../{src => }/bit-test.component.scss | 0 .../{src => }/bit-test.component.ts | 0 .../demo-lib-v17/{src => }/bit-test.docs.md | 0 .../demo-lib-v17/{src => }/bit-test.module.ts | 0 .../{src => }/bit-test.service.ts | 0 .../demo-lib-v17/{src => }/bit-test.spec.ts | 0 .../{src => }/bit-test2.component.ts | 0 .../compositions/bit-test.composition.ts | 0 .../compositions/cmp1.composition.ts | 0 .../integration/demo-lib-v17/public-api.ts | 6 +- .../{src => }/bit-test.component.scss | 0 .../{src => }/bit-test.component.ts | 4 +- .../demo-lib-v18/{src => }/bit-test.module.ts | 0 .../{src => }/bit-test.service.ts | 0 .../demo-lib-v18/{src => }/bit-test.spec.ts | 0 .../{src => }/bit-test2.component.ts | 0 .../compositions/bit-test.composition.ts | 0 .../compositions/cmp1.composition.ts | 0 .../bit-test.docs.md => demo-lib-v18.docs.md} | 0 .../integration/demo-lib-v18/public-api.ts | 6 +- .../{src => }/bit-test.component.scss | 0 .../{src => }/bit-test.component.ts | 0 .../demo-lib-v19/{src => }/bit-test.docs.md | 0 .../demo-lib-v19/{src => }/bit-test.module.ts | 0 .../{src => }/bit-test.service.ts | 0 .../demo-lib-v19/{src => }/bit-test.spec.ts | 0 .../{src => }/bit-test2.component.ts | 0 .../{src => }/bit-test3.component.ts | 0 .../compositions/bit-test.composition.ts | 0 .../compositions/cmp1.composition.ts | 0 .../integration/demo-lib-v19/public-api.ts | 8 +- angular/templates/generators/ng-app/index.ts | 36 +-- .../template-files/src/app/app.config.ts | 9 +- .../ng-app/template-files/src/server.ts | 2 +- .../generators/ng-env/files/config/mounter.ts | 33 +++ .../templates/generators/ng-env/files/doc.ts | 3 +- .../templates/generators/ng-env/files/env.ts | 138 +-------- .../ng-env/files/preview/host-dependencies.ts | 16 - .../ng-env/files/preview/mounter.ts | 68 ----- angular/templates/generators/ng-env/index.ts | 6 +- .../ng-module/files/component-spec.ts | 1 - .../generators/ng-module/files/composition.ts | 31 +- .../templates/generators/ng-module/index.ts | 2 +- .../ng-standalone/files/component-spec.ts | 1 - bit-angular.zip | Bin 0 -> 920606 bytes workspace.jsonc | 43 ++- 212 files changed, 1749 insertions(+), 2910 deletions(-) delete mode 100644 angular/app-types/angular-app-type/utils.ts create mode 100644 angular/devkit/preview/preview-app/preview-app/favicon.ico delete mode 100644 angular/devkit/preview/preview-app/preview-app/src/favicon.ico delete mode 100644 angular/devkit/preview/preview-app/preview-app/src/polyfills.ts create mode 100644 angular/devkit/preview/vite-preview/angular-vite-preview.ts create mode 100644 angular/devkit/preview/vite-preview/component.json create mode 100644 angular/devkit/preview/vite-preview/docs.ts create mode 100644 angular/devkit/preview/vite-preview/index.ts create mode 100644 angular/devkit/preview/vite-preview/mounter.ts create mode 100644 angular/devkit/preview/vite-preview/types.d.ts rename angular/{app-types/angular-app-type => devkit/vite}/application.bundler.ts (73%) rename angular/{app-types/angular-app-type => devkit/vite}/application.dev-server.ts (74%) delete mode 100644 angular/devkit/vite/config.factory.ts create mode 100644 angular/devkit/vite/plugins/dedupe.plugin.ts rename angular/{app-types/angular-app-type => devkit/vite}/plugins/define.plugin.ts (88%) delete mode 100644 angular/devkit/vite/plugins/index-file/augment-index-html.ts delete mode 100644 angular/devkit/vite/plugins/index-file/html-rewriting-stream.ts delete mode 100644 angular/devkit/vite/plugins/index-file/index-html-generator.ts delete mode 100644 angular/devkit/vite/plugins/index-file/package-chunk-sort.ts delete mode 100644 angular/devkit/vite/plugins/index-file/strip-bom.ts delete mode 100644 angular/devkit/vite/plugins/index-html.plugin.ts create mode 100644 angular/devkit/vite/plugins/md.plugin.ts delete mode 100644 angular/devkit/vite/plugins/server-entry.plugin.ts rename angular/{app-types/angular-app-type => devkit/vite}/runtime/api-middleware.js (100%) rename angular/{app-types/angular-app-type => devkit/vite}/runtime/renderer.js (100%) delete mode 100644 angular/devkit/vite/utils/host-alias.ts rename angular/envs/{base-env/preview => angular-v16-env/config}/mounter.ts (95%) create mode 100644 angular/envs/base-env/config/mounter.ts delete mode 100644 angular/envs/base-env/preview/host-dependencies.ts rename angular/examples/{my-angular-v17-env/preview => my-angular-env/config}/mounter.ts (95%) delete mode 100644 angular/examples/my-angular-env/preview/host-dependencies.ts rename angular/examples/{my-angular-v18-env/preview => my-angular-v16-env/config}/mounter.ts (95%) delete mode 100644 angular/examples/my-angular-v16-env/preview/host-dependencies.ts rename angular/examples/{my-angular-env/preview => my-angular-v17-env/config}/mounter.ts (95%) delete mode 100644 angular/examples/my-angular-v17-env/preview/host-dependencies.ts rename angular/examples/{my-angular-v16-env/preview => my-angular-v18-env/config}/mounter.ts (95%) delete mode 100644 angular/examples/my-angular-v18-env/preview/host-dependencies.ts create mode 100644 angular/examples/my-angular-v19-env/config/mounter.ts delete mode 100644 angular/examples/my-angular-v19-env/preview/host-dependencies.ts delete mode 100644 angular/examples/my-angular-v19-env/preview/mounter.ts rename angular/integration/demo-lib-v16/{src => }/bit-test.component.ts (100%) rename angular/integration/demo-lib-v16/{src => }/bit-test.docs.md (100%) rename angular/integration/demo-lib-v16/{src => }/bit-test.module.ts (100%) rename angular/integration/demo-lib-v16/{src => }/bit-test.service.ts (100%) rename angular/integration/demo-lib-v16/{src => }/bit-test.spec.ts (100%) rename angular/integration/demo-lib-v16/{src => }/bit-test2.component.ts (100%) rename angular/integration/demo-lib-v16/{src => }/compositions/bit-test.composition.ts (100%) rename angular/integration/demo-lib-v16/{src => }/compositions/cmp1.composition.ts (100%) rename angular/integration/demo-lib-v17/{src => }/bit-test.component.scss (100%) rename angular/integration/demo-lib-v17/{src => }/bit-test.component.ts (100%) rename angular/integration/demo-lib-v17/{src => }/bit-test.docs.md (100%) rename angular/integration/demo-lib-v17/{src => }/bit-test.module.ts (100%) rename angular/integration/demo-lib-v17/{src => }/bit-test.service.ts (100%) rename angular/integration/demo-lib-v17/{src => }/bit-test.spec.ts (100%) rename angular/integration/demo-lib-v17/{src => }/bit-test2.component.ts (100%) rename angular/integration/demo-lib-v17/{src => }/compositions/bit-test.composition.ts (100%) rename angular/integration/demo-lib-v17/{src => }/compositions/cmp1.composition.ts (100%) rename angular/integration/demo-lib-v18/{src => }/bit-test.component.scss (100%) rename angular/integration/demo-lib-v18/{src => }/bit-test.component.ts (65%) rename angular/integration/demo-lib-v18/{src => }/bit-test.module.ts (100%) rename angular/integration/demo-lib-v18/{src => }/bit-test.service.ts (100%) rename angular/integration/demo-lib-v18/{src => }/bit-test.spec.ts (100%) rename angular/integration/demo-lib-v18/{src => }/bit-test2.component.ts (100%) rename angular/integration/demo-lib-v18/{src => }/compositions/bit-test.composition.ts (100%) rename angular/integration/demo-lib-v18/{src => }/compositions/cmp1.composition.ts (100%) rename angular/integration/demo-lib-v18/{src/bit-test.docs.md => demo-lib-v18.docs.md} (100%) rename angular/integration/demo-lib-v19/{src => }/bit-test.component.scss (100%) rename angular/integration/demo-lib-v19/{src => }/bit-test.component.ts (100%) rename angular/integration/demo-lib-v19/{src => }/bit-test.docs.md (100%) rename angular/integration/demo-lib-v19/{src => }/bit-test.module.ts (100%) rename angular/integration/demo-lib-v19/{src => }/bit-test.service.ts (100%) rename angular/integration/demo-lib-v19/{src => }/bit-test.spec.ts (100%) rename angular/integration/demo-lib-v19/{src => }/bit-test2.component.ts (100%) rename angular/integration/demo-lib-v19/{src => }/bit-test3.component.ts (100%) rename angular/integration/demo-lib-v19/{src => }/compositions/bit-test.composition.ts (100%) rename angular/integration/demo-lib-v19/{src => }/compositions/cmp1.composition.ts (100%) create mode 100644 angular/templates/generators/ng-env/files/config/mounter.ts delete mode 100644 angular/templates/generators/ng-env/files/preview/host-dependencies.ts delete mode 100644 angular/templates/generators/ng-env/files/preview/mounter.ts create mode 100644 bit-angular.zip diff --git a/.bitmap b/.bitmap index 07a08e7f..a72a7930 100644 --- a/.bitmap +++ b/.bitmap @@ -12,371 +12,385 @@ "angular-env": { "name": "angular-env", "scope": "bitdev.angular", - "version": "7.1.0", + "version": "8.0.1", "mainFile": "index.ts", "rootDir": "angular/envs/angular-env" }, "app-types/angular-app-type": { "name": "app-types/angular-app-type", "scope": "bitdev.angular", - "version": "7.0.0", + "version": "8.0.1", "mainFile": "index.ts", "rootDir": "angular/app-types/angular-app-type" }, "dev-services/common": { "name": "dev-services/common", "scope": "bitdev.angular", - "version": "7.0.0", + "version": "8.0.0", "mainFile": "index.ts", "rootDir": "angular/devkit/common" }, "dev-services/compiler/elements": { "name": "dev-services/compiler/elements", "scope": "bitdev.angular", - "version": "7.0.0", + "version": "8.0.0", "mainFile": "index.ts", "rootDir": "angular/devkit/compiler/elements" }, "dev-services/compiler/multi-compiler": { "name": "dev-services/compiler/multi-compiler", "scope": "bitdev.angular", - "version": "7.0.0", + "version": "8.0.0", "mainFile": "index.ts", "rootDir": "angular/devkit/compiler/multi-compiler" }, "dev-services/compiler/ng-packagr": { "name": "dev-services/compiler/ng-packagr", "scope": "bitdev.angular", - "version": "7.0.0", + "version": "8.0.0", "mainFile": "index.ts", "rootDir": "angular/devkit/compiler/ng-packagr" }, "dev-services/linter/eslint": { "name": "dev-services/linter/eslint", "scope": "bitdev.angular", - "version": "4.0.0", + "version": "5.0.0", "mainFile": "index.js", "rootDir": "angular/devkit/linter/eslint" }, "dev-services/ng-compat": { "name": "dev-services/ng-compat", "scope": "bitdev.angular", - "version": "4.0.0", + "version": "5.0.0", "mainFile": "index.ts", "rootDir": "angular/devkit/ng-compat" }, "dev-services/preview/mounter": { "name": "dev-services/preview/mounter", "scope": "bitdev.angular", - "version": "4.0.0", + "version": "5.0.0", "mainFile": "index.ts", "rootDir": "angular/devkit/preview/mounter" }, "dev-services/preview/preview": { "name": "dev-services/preview/preview", "scope": "bitdev.angular", - "version": "7.0.0", + "version": "8.0.0", "mainFile": "index.ts", "rootDir": "angular/devkit/preview/preview" }, "dev-services/preview/preview-app": { "name": "dev-services/preview/preview-app", "scope": "bitdev.angular", - "version": "2.0.0", + "version": "3.0.0", "mainFile": "index.ts", "rootDir": "angular/devkit/preview/preview-app" }, "dev-services/preview/runtime": { "name": "dev-services/preview/runtime", "scope": "bitdev.angular", - "version": "4.0.0", + "version": "5.0.0", "mainFile": "index.ts", "rootDir": "angular/devkit/preview/runtime" }, + "dev-services/preview/vite-preview": { + "name": "dev-services/preview/vite-preview", + "scope": "bitdev.angular", + "version": "1.0.1", + "mainFile": "index.ts", + "rootDir": "angular/devkit/preview/vite-preview" + }, + "dev-services/vite": { + "name": "dev-services/vite", + "scope": "bitdev.angular", + "version": "2.0.1", + "mainFile": "index.ts", + "rootDir": "angular/devkit/vite" + }, "dev-services/webpack": { "name": "dev-services/webpack", "scope": "bitdev.angular", - "version": "7.0.0", + "version": "8.0.0", "mainFile": "index.ts", "rootDir": "angular/devkit/webpack" }, "docs/angular-docs-routes": { "name": "docs/angular-docs-routes", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/angular-docs-routes" }, "docs/angular-env-docs-data": { "name": "docs/angular-env-docs-data", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/angular-env-docs-data" }, "docs/angular-versions": { "name": "docs/angular-versions", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/angular-versions" }, "docs/bit-angular-introduction": { "name": "docs/bit-angular-introduction", "scope": "bitdev.angular", - "version": "0.0.4", + "version": "1.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/bit-angular-introduction" }, "docs/build-pipelines": { "name": "docs/build-pipelines", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/build-pipelines" }, "docs/component-generators": { "name": "docs/component-generators", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/component-generators" }, "docs/component-libs": { "name": "docs/component-libs", "scope": "bitdev.angular", - "version": "0.0.3", + "version": "1.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/component-libs" }, "docs/components-documentation": { "name": "docs/components-documentation", "scope": "bitdev.angular", - "version": "0.0.3", + "version": "1.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/components-documentation" }, "docs/components-overview": { "name": "docs/components-overview", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/components-overview" }, "docs/components-preview": { "name": "docs/components-preview", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/components-preview" }, "docs/create-custom-env": { "name": "docs/create-custom-env", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/create-custom-env" }, "docs/create-ng-app": { "name": "docs/create-ng-app", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/create-ng-app" }, "docs/dependency-policy": { "name": "docs/dependency-policy", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/dependency-policy" }, "docs/development-tools": { "name": "docs/development-tools", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/development-tools" }, "docs/ng-app-build": { "name": "docs/ng-app-build", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/ng-app-build" }, "docs/ng-app-deploy": { "name": "docs/ng-app-deploy", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/ng-app-deploy" }, "docs/ng-base-components": { "name": "docs/ng-base-components", "scope": "bitdev.angular", - "version": "0.0.3", + "version": "1.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/ng-base-components" }, "docs/ng-component-libraries": { "name": "docs/ng-component-libraries", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/ng-component-libraries" }, "docs/ng-design-overview": { "name": "docs/ng-design-overview", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/ng-design-overview" }, "docs/ng-theming": { "name": "docs/ng-theming", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/ng-theming" }, "docs/workspace-starters": { "name": "docs/workspace-starters", "scope": "bitdev.angular", - "version": "1.0.0", + "version": "2.0.0", "mainFile": "index.ts", "rootDir": "angular/docs/workspace-starters" }, "envs/angular-v16-env": { "name": "envs/angular-v16-env", "scope": "bitdev.angular", - "version": "7.1.0", + "version": "8.0.1", "mainFile": "index.ts", "rootDir": "angular/envs/angular-v16-env" }, "envs/angular-v17-env": { "name": "envs/angular-v17-env", "scope": "bitdev.angular", - "version": "6.1.0", + "version": "7.0.1", "mainFile": "index.ts", "rootDir": "angular/envs/angular-v17-env" }, "envs/angular-v18-env": { "name": "envs/angular-v18-env", "scope": "bitdev.angular", - "version": "2.1.0", + "version": "3.0.1", "mainFile": "index.ts", "rootDir": "angular/envs/angular-v18-env" }, "envs/angular-v19-env": { "name": "envs/angular-v19-env", "scope": "bitdev.angular", - "version": "1.1.0", + "version": "2.0.1", "mainFile": "index.ts", "rootDir": "angular/envs/angular-v19-env" }, "envs/base-env": { "name": "envs/base-env", "scope": "bitdev.angular", - "version": "7.1.0", + "version": "8.0.1", "mainFile": "index.ts", "rootDir": "angular/envs/base-env" }, "examples/my-angular-env": { "name": "examples/my-angular-env", "scope": "bitdev.angular", - "version": "7.1.0", + "version": "8.0.1", "mainFile": "index.ts", "rootDir": "angular/examples/my-angular-env" }, "examples/my-angular-v16-env": { "name": "examples/my-angular-v16-env", "scope": "bitdev.angular", - "version": "6.1.0", + "version": "7.0.1", "mainFile": "index.ts", "rootDir": "angular/examples/my-angular-v16-env" }, "examples/my-angular-v17-env": { "name": "examples/my-angular-v17-env", "scope": "bitdev.angular", - "version": "6.1.0", + "version": "7.0.1", "mainFile": "index.ts", "rootDir": "angular/examples/my-angular-v17-env" }, "examples/my-angular-v18-env": { "name": "examples/my-angular-v18-env", "scope": "bitdev.angular", - "version": "2.1.0", + "version": "3.0.1", "mainFile": "index.ts", "rootDir": "angular/examples/my-angular-v18-env" }, "examples/my-angular-v19-env": { "name": "examples/my-angular-v19-env", "scope": "bitdev.angular", - "version": "1.1.0", + "version": "2.0.1", "mainFile": "index.ts", "rootDir": "angular/examples/my-angular-v19-env" }, "integration/demo-app": { "name": "integration/demo-app", "scope": "bitdev.angular", - "version": "1.1.0", + "version": "2.0.1", "mainFile": "index.ts", "rootDir": "angular/integration/demo-app" }, "integration/demo-lib": { "name": "integration/demo-lib", "scope": "bitdev.angular", - "version": "1.1.0", + "version": "2.0.1", "mainFile": "public-api.ts", "rootDir": "angular/integration/demo-lib" }, "integration/demo-lib-v16": { "name": "integration/demo-lib-v16", "scope": "bitdev.angular", - "version": "1.1.0", + "version": "2.0.1", "mainFile": "public-api.ts", "rootDir": "angular/integration/demo-lib-v16" }, "integration/demo-lib-v17": { "name": "integration/demo-lib-v17", "scope": "bitdev.angular", - "version": "1.1.0", + "version": "2.0.1", "mainFile": "public-api.ts", "rootDir": "angular/integration/demo-lib-v17" }, "integration/demo-lib-v18": { "name": "integration/demo-lib-v18", "scope": "bitdev.angular", - "version": "1.1.0", + "version": "2.0.1", "mainFile": "public-api.ts", "rootDir": "angular/integration/demo-lib-v18" }, "integration/demo-lib-v19": { "name": "integration/demo-lib-v19", "scope": "bitdev.angular", - "version": "1.1.0", + "version": "2.0.1", "mainFile": "public-api.ts", "rootDir": "angular/integration/demo-lib-v19" }, "readme": { "name": "readme", "scope": "bitdev.angular", - "version": "2.0.3", + "version": "3.0.0", "mainFile": "index.ts", "rootDir": "angular/readme" }, "templates/generators": { "name": "templates/generators", "scope": "bitdev.angular", - "version": "7.1.0", + "version": "8.0.1", "mainFile": "index.ts", "rootDir": "angular/templates/generators" }, "templates/starters": { "name": "templates/starters", "scope": "bitdev.angular", - "version": "7.0.0", + "version": "8.0.0", "mainFile": "index.ts", "rootDir": "angular/templates/starters" }, diff --git a/angular/app-types/angular-app-type/angular-app-options.ts b/angular/app-types/angular-app-type/angular-app-options.ts index f4530373..1d7fc9e3 100644 --- a/angular/app-types/angular-app-type/angular-app-options.ts +++ b/angular/app-types/angular-app-type/angular-app-options.ts @@ -1,5 +1,4 @@ import { - AngularEnvOptions, ApplicationOptions, BrowserOptions, DevServerOptions @@ -53,9 +52,4 @@ export type AngularAppOptions = { * Angular options for `bit run` */ angularServeOptions: (BrowserOptions & DevServerOptions) | (ApplicationOptions & DevServerOptions); - - /** - * Env-specific options depending on the version of Angular used. - */ - ngEnvOptions: AngularEnvOptions; }; diff --git a/angular/app-types/angular-app-type/angular.application.ts b/angular/app-types/angular-app-type/angular.application.ts index 45a06154..21847bcf 100644 --- a/angular/app-types/angular-app-type/angular.application.ts +++ b/angular/app-types/angular-app-type/angular.application.ts @@ -1,7 +1,8 @@ import { VERSION } from '@angular/cli'; import { getWorkspace, NG_APP_NAME, normalizePath } from '@bitdev/angular.dev-services.common'; import { ApplicationBuilderOptions, SsrClass } from '@bitdev/angular.dev-services.ng-compat'; -import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; +import { AngularVitePreview } from '@bitdev/angular.dev-services.preview.vite-preview'; +import { buildApplication, generateAppTsConfig, getEnvFile, serveApplication } from '@bitdev/angular.dev-services.vite'; import { AppBuildContext, AppBuildResult, @@ -11,25 +12,17 @@ import { DeployFn } from '@teambit/application'; import { Bundler, BundlerContext, DevServerContext } from '@teambit/bundler'; -import { Component } from '@teambit/component'; import { DependencyResolverAspect, DependencyResolverMain } from '@teambit/dependency-resolver'; import { EnvContext, EnvHandler } from '@teambit/envs'; -import { CACHE_ROOT } from '@teambit/legacy/dist/constants.js'; +import { CACHE_ROOT } from '@teambit/legacy.constants'; import { Preview } from '@teambit/preview'; import { Port } from '@teambit/toolbox.network.get-port'; import { Workspace } from '@teambit/workspace'; import assert from 'assert'; import fs from 'fs-extra'; import { cloneDeep } from 'lodash-es'; -import objectHash from 'object-hash'; import { join } from 'path'; -import ts from 'typescript'; import { AngularAppOptions } from './angular-app-options.js'; -import { buildApplication } from './application.bundler.js'; -import { serveApplication } from './application.dev-server.js'; -import { expandIncludeExclude, JsonObject } from './utils.js'; - -const writeHash = new Map(); export class AngularApp implements Application { readonly name: string; @@ -63,10 +56,9 @@ export class AngularApp implements Application { } private getDevServerContext(context: AppContext): DevServerContext { - // const ngEnvOptions = this.angularEnv.getNgEnvOptions(); return Object.assign(cloneDeep(context), { entry: [], - rootPath: /*ngEnvOptions.devServer === 'vite' ? _appRootPath : */'', + rootPath: '', publicPath: `${this.publicDir}/${this.options.name}`, title: this.options.name }); @@ -93,48 +85,11 @@ export class AngularApp implements Application { const angularServeOptions: any = Object.assign(cloneDeep(this.options.angularServeOptions), { tsConfig: tsconfigPath }); const angularBuildOptions: any = Object.assign(cloneDeep(this.options.angularBuildOptions), { tsConfig: tsconfigPath }); - return AngularPreview.from({ - webpackServeTransformers: this.options.webpackServeTransformers, - webpackBuildTransformers: this.options.webpackBuildTransformers, + return AngularVitePreview.from({ angularServeOptions, angularBuildOptions, - ngEnvOptions: this.options.ngEnvOptions, sourceRoot: this.options.sourceRoot }); - - } - - private generateTsConfig(bitCmps: Component[], appRootPath: string, appTsconfigPath: string, tsconfigPath: string, depsResolver: DependencyResolverMain, workspace?: Workspace, serverEntry?: string): void { - const tsconfigJSON: JsonObject = ts.readConfigFile(appTsconfigPath, ts.sys.readFile).config; - - // Add the paths to tsconfig to remap bit components to local folders - tsconfigJSON.compilerOptions.paths = tsconfigJSON.compilerOptions.paths || {}; - bitCmps.forEach((dep: Component) => { - let componentDir = workspace?.componentDir(dep.id, { - ignoreVersion: true - }); - if (componentDir) { - componentDir = normalizePath(componentDir); - const pkgName = depsResolver.getPackageName(dep); - // TODO we should find a way to use the real entry file based on the component config because people can change it - if (fs.existsSync(join(componentDir, 'public-api.ts'))) { - tsconfigJSON.compilerOptions.paths[pkgName] = [`${componentDir}/public-api.ts`, `${componentDir}`]; - } - tsconfigJSON.compilerOptions.paths[`${pkgName}/*`] = [`${componentDir}/*`]; - } - }); - - if (serverEntry) { - tsconfigJSON.files.push(serverEntry); - } - - const tsconfigContent = expandIncludeExclude(tsconfigJSON, tsconfigPath, [appRootPath]); - const hash = objectHash(tsconfigContent); - // write only if link has changed (prevents triggering fs watches) - if (writeHash.get(tsconfigPath) !== hash) { - fs.outputJsonSync(tsconfigPath, tsconfigContent, { spaces: 2 }); - writeHash.set(tsconfigPath, hash); - } } /** @@ -145,16 +100,6 @@ export class AngularApp implements Application { return context as any as EnvContext; } - private async getEnvFile(mode: string, rootDir: string, overrides?: Record) { - // TODO: enable this one we have ESM envs, otherwise we get a warning message about loading the deprecated CJS build of Vite - // const vite = await import('vite'); - // const dotenv = vite.loadEnv(mode, rootDir); - return { - ...overrides - // ...dotenv - }; - } - // TODO: fix return type once bit has a new stable version async run(context: AppContext): Promise { const depsResolver = context.getAspect(DependencyResolverAspect.id); @@ -171,32 +116,23 @@ export class AngularApp implements Application { const bitCmps = await workspace.getMany(workspaceCmpsIDs); const tempFolder = this.getTempFolder(workspace); const tsconfigPath = this.getTsconfigPath(tempFolder); - this.generateTsConfig(bitCmps, appRootPath, appTsconfigPath, tsconfigPath, depsResolver, workspace); - - if (Number(VERSION.major) >= 16) { - const envVars = await this.getEnvFile('development', appRootPath, context.envVariables as any); - await serveApplication({ - angularOptions: { - ...this.options.angularBuildOptions as ApplicationBuilderOptions, - tsConfig: tsconfigPath - }, - sourceRoot: this.options.sourceRoot || 'src', - workspaceRoot: appRootPath, - port, - logger: logger, - tempFolder: tempFolder, - envVars: { - process: { env: envVars } - } - }); - } else { - const devServerContext = this.getDevServerContext(context); - const envContext = this.getEnvContext(context); - const preview = this.getPreview(tsconfigPath)(envContext); - - const devServer = await preview.getDevServer(devServerContext)(envContext); - await devServer.listen(port); - } + generateAppTsConfig(bitCmps, appRootPath, appTsconfigPath, tsconfigPath, depsResolver, workspace); + + const envVars = await getEnvFile('development', appRootPath, context.envVariables as any); + await serveApplication({ + angularOptions: { + ...this.options.angularBuildOptions as ApplicationBuilderOptions, + tsConfig: tsconfigPath + }, + sourceRoot: this.options.sourceRoot || 'src', + workspaceRoot: appRootPath, + port, + logger: logger, + tempFolder: tempFolder, + envVars: { + process: { env: envVars } + } + }); return { appName: this.name, @@ -221,11 +157,12 @@ export class AngularApp implements Application { } const tempFolder = this.getTempFolder(); const tsconfigPath = this.getTsconfigPath(tempFolder); - this.generateTsConfig([capsule.component], appRootPath, appTsconfigPath, tsconfigPath, depsResolver, undefined, entryServer); + generateAppTsConfig([capsule.component], appRootPath, appTsconfigPath, tsconfigPath, depsResolver, undefined, entryServer ? [entryServer] : undefined); - if (!this.options.bundler && Number(VERSION.major) >= 16) { - const envVars = await this.getEnvFile('production', appRootPath, context.envVariables as any); - await buildApplication({ + const errors: Error[] = []; + if (!this.options.bundler) { + const envVars = await getEnvFile('production', appRootPath, context.envVariables); + const results = await buildApplication({ angularOptions: { ...appOptions, tsConfig: tsconfigPath @@ -240,7 +177,11 @@ export class AngularApp implements Application { 'process.env': envVars } }); - console.log('build done'); + for (const result of results) { + if (result.error) { + errors.push(new Error(result.error)); + } + } } else { let bundler: Bundler; if (this.options.bundler) { @@ -252,9 +193,15 @@ export class AngularApp implements Application { bundler = await preview.getBundler(bundlerContext)(envContext); } - await bundler.run(); + const results = await bundler.run(); + for (const result of results) { + if (result.errors) { + errors.push(...result.errors); + } + } } return { + errors, artifacts: [{ name: this.name, globPatterns: [outputPath], diff --git a/angular/app-types/angular-app-type/component.json b/angular/app-types/angular-app-type/component.json index 2d867f2a..29c6cac3 100644 --- a/angular/app-types/angular-app-type/component.json +++ b/angular/app-types/angular-app-type/component.json @@ -2,36 +2,30 @@ "componentId": { "scope": "bitdev.angular", "name": "app-types/angular-app-type", - "version": "7.0.0" + "version": "8.0.1" }, "propagate": false, "extensions": { "teambit.dependencies/dependency-resolver": { "policy": { "dependencies": { - "h3": "^1.9.0", - "nitropack": "^2.8.0", - "@angular-devkit/build-angular": "-", - "@angular/cli": "-", - "typescript": "-", - "#alias": "-" + "@angular/cli": "-" }, "peerDependencies": { - "@angular-devkit/build-angular": ">= 0.0.1", - "@angular/cli": ">= 13.0.0", - "esbuild": ">= 0.14.0", - "typescript": ">= 3.5.3" + "@angular/cli": ">= 13.0.0" } } }, - "bitdev.node/node-env@2.0.2": {}, - "teambit.envs/envs": {}, "teambit.component/renaming": { "renamedFrom": { "scope": "bitdev.angular", "name": "dev-services/apps", "version": "02f8cd3d639894dea416cc38674a6887e11e939b" } + }, + "bitdev.node/node-env@2.0.40": {}, + "teambit.envs/envs": { + "env": "bitdev.node/node-env" } } } diff --git a/angular/app-types/angular-app-type/utils.ts b/angular/app-types/angular-app-type/utils.ts deleted file mode 100644 index 9ddbc71f..00000000 --- a/angular/app-types/angular-app-type/utils.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { ApplicationOptions, normalizePath } from '@bitdev/angular.dev-services.common'; -import assert from 'assert'; -import { flatten } from 'lodash-es'; -import { dirname, relative } from 'path'; - -export interface JsonObject { - [prop: string]: any; -} - -/** - * Takes a tsconfig.json file, a list of component directories, and returns a new tsconfig.json file with the include - * and exclude properties expanded to include all the component directories - * @param {any} tsconfigJSON - The path to the existing tsconfig.json file. - * @param {string} targetPath - The path to the new tsconfig.json file. - * @param {string[]} compDirs - An array of paths to the component directories. - * @returns the tsConfig object. - */ -export function expandIncludeExclude(tsconfigJSON: JsonObject, targetPath: string, compDirs: string[]): JsonObject { - // eslint-disable-next-line no-param-reassign - targetPath = dirname(targetPath); - - if (tsconfigJSON.include) { - // eslint-disable-next-line no-param-reassign - tsconfigJSON.include = flatten( - tsconfigJSON.include.map((includedPath: string) => { - return compDirs.map((compDir: string) => { - const compDirRelative = normalizePath(relative(targetPath, compDir)); - return `${compDirRelative}/${includedPath}`; - }); - }) - ); - } - if (tsconfigJSON.exclude) { - // eslint-disable-next-line no-param-reassign - tsconfigJSON.exclude = flatten( - tsconfigJSON.exclude.map((excludedPath: string) => { - return compDirs.map((compDir: string) => { - const compDirRelative = normalizePath(relative(targetPath, compDir)); - return `${compDirRelative}/${excludedPath}`; - }); - }) - ); - } - if (tsconfigJSON.files) { - // eslint-disable-next-line no-param-reassign - tsconfigJSON.files = flatten( - tsconfigJSON.files.map((filesPath: string) => { - return compDirs.map((compDir: string) => { - const compDirRelative = normalizePath(relative(targetPath, compDir)); - return `${compDirRelative}/${filesPath}`; - }); - }) - ); - } - - return tsconfigJSON; -} - -export function getIndexInputFile(index: ApplicationOptions['index']): string { - assert(index, 'No index file provided'); - if (typeof index === 'string') { - return index; - } - return (index as any).input; -} diff --git a/angular/devkit/common/component.json b/angular/devkit/common/component.json index ba1521f4..d0edf54b 100644 --- a/angular/devkit/common/component.json +++ b/angular/devkit/common/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "dev-services/common", - "version": "7.0.0" + "version": "33b27185d4339685b5106095d560648a1e296ae7" }, "propagate": false, "extensions": { @@ -19,7 +19,6 @@ } } }, - "teambit.node/node@1.0.54": {}, "teambit.envs/envs": {}, "teambit.component/dev-files": {}, "teambit.pkg/pkg": {}, @@ -27,6 +26,7 @@ "teambit.compositions/compositions": {}, "teambit.docs/docs": {}, "teambit.pipelines/builder": {}, - "teambit.semantics/schema": {} + "teambit.semantics/schema": {}, + "teambit.node/node@1.0.103": {} } } diff --git a/angular/devkit/common/env-options.ts b/angular/devkit/common/env-options.ts index a3c5260f..aeb22196 100644 --- a/angular/devkit/common/env-options.ts +++ b/angular/devkit/common/env-options.ts @@ -3,13 +3,11 @@ import { WebpackConfigWithDevServer } from '@teambit/webpack'; export type WebpackConfigFactory = (opts: any) => Promise; export type AngularEnvOptions = { - /** * Use Rollup & Angular Elements to compile compositions instead of webpack. * This transforms compositions into Web Components and replaces the Angular bundler by the React bundler. */ useAngularElementsPreview?: boolean; - jestConfigPath: string; jestModulePath: string; ngPackagrModulePath: string; angularElementsModulePath?: string; diff --git a/angular/devkit/common/generic-angular-env.ts b/angular/devkit/common/generic-angular-env.ts index eff1a663..43d7ffec 100644 --- a/angular/devkit/common/generic-angular-env.ts +++ b/angular/devkit/common/generic-angular-env.ts @@ -10,9 +10,49 @@ import { CompilerEnv } from '@teambit/compiler'; import { PreviewEnv } from '@teambit/preview'; import { AngularEnvOptions } from './env-options'; -export type BrowserOptions = Omit & {inlineStyleLanguage?: "css" | "less" | "sass" | "scss"}; -export type DevServerOptions = Omit; -export type ApplicationOptions = Omit & {inlineStyleLanguage?: "css" | "less" | "sass" | "scss", outputMode?: "static" | "server" | OutputMode}; +export type BrowserOptions = + Omit + & { inlineStyleLanguage?: "css" | "less" | "sass" | "scss" }; +export type DevServerOptions = + Omit + & { buildTarget?: "development" | "production" }; +export type ApplicationOptions = + Omit + & { inlineStyleLanguage?: "css" | "less" | "sass" | "scss", outputMode?: "static" | "server" | OutputMode }; + +/** Internal options hidden from builder schema but available when invoked programmatically. */ +export interface InternalOptions { + /** + * Entry points to use for the compilation. Incompatible with `browser`, which must not be provided. May be relative or absolute paths. + * If given a relative path, it is resolved relative to the current workspace and will generate an output at the same relative location + * in the output directory. If given an absolute path, the output will be generated in the root of the output directory with the same base + * name. + */ + entryPoints?: Set; + + /** File extension to use for the generated output files. */ + outExtension?: 'js' | 'mjs'; + + /** + * Indicates whether all node packages should be marked as external. + * Currently used by the dev-server to support prebundling. + */ + externalPackages?: boolean | { exclude: string[] }; + + /** + * Forces the output from the localize post-processing to not create nested directories per locale output. + * This is only used by the development server which currently only supports a single locale per build. + */ + forceI18nFlatOutput?: boolean; +} + +export type ApplicationInternalOptions = Omit< + ApplicationOptions & InternalOptions, + 'browser' +> & { + // `browser` can be `undefined` if `entryPoints` is used. + browser?: string; +}; export interface GenericAngularEnv extends AppsEnv, diff --git a/angular/devkit/common/utils.ts b/angular/devkit/common/utils.ts index 4e9e7980..e5b8d87f 100644 --- a/angular/devkit/common/utils.ts +++ b/angular/devkit/common/utils.ts @@ -6,7 +6,7 @@ import { EnvContext } from '@teambit/envs'; import { IsolatorMain } from '@teambit/isolator'; import { Logger } from '@teambit/logger'; import { PkgMain } from '@teambit/pkg'; -import TesterAspect from '@teambit/tester'; +import { TesterAspect } from '@teambit/tester'; import WorkspaceAspect, { Workspace } from '@teambit/workspace'; import { ScopeMain } from '@teambit/scope'; import { getRootComponentDir } from '@teambit/workspace.root-components'; @@ -190,7 +190,8 @@ export function generateTsConfig( compilerOptions: { paths: tsPaths }, - files: ["./src/main.ts", "./src/polyfills.ts"].map((file: string) => posix.join(pAppPath, file)), + // eslint-disable-next-line + files: ["./src/main.ts" /*, "./src/polyfills.ts"*/ ].map((file: string) => posix.join(pAppPath, file)), include: [ ...["./src/app/**/*.ts"].map((file: string) => posix.join(pAppPath, file)), ...includePaths.map((path) => posix.join(path, '**/*.ts')) @@ -284,7 +285,7 @@ export async function writeTsconfig( return normalizePath(targetPath); } -export function dedupPaths(paths: (string | any)[]): string[] { +export function dedupePaths(paths: (string | any)[]): string[] { return Array.from(new Set(paths.map(p => typeof p === 'string' ? posix.normalize(p) : p))); } @@ -299,27 +300,28 @@ export function packagePath(packageName: string, path = ''): string { return join(dirname(require.resolve(`${packageName}/package.json`)), path); } -export function getLoggerApi(logger: Logger) { +export function getLoggerApi(logger: Logger, isPreview = false) { return { // eslint-disable-next-line no-console error: (m: string) => console.error(m), - log: (m: string) => logger.console(m), + log: (m: string) => !isPreview ? logger.console(m) : null, + // ignoring the warning about the server to use only for testing // eslint-disable-next-line no-console - warn: (m: string) => console.warn(m), - info: (m: string) => logger.console(m), + warn: (m: string) => !m.match('This is a simple server') ? console.warn(m) : null, + info: (m: string) => !isPreview ? logger.console(m) : null, // eslint-disable-next-line no-console colorMessage: (m: string) => console.log(m), createChild: () => logger } as any; } -export function addSafeResolve(path: string, nodeModulesPaths?: string[]): string | undefined { +export function getSafeResolve(path: string, nodeModulesPaths?: string[]): string | undefined { try { return require.resolve(path, { paths: nodeModulesPaths }); } catch (_e) { if (nodeModulesPaths) { try { - return addSafeResolve(path); + return getSafeResolve(path); } catch (_e2) { return undefined; } @@ -333,6 +335,7 @@ export function getWebpackAngularAliases(nodeModulesPaths?: string[]): { [key: s [ '@angular/build', + '@angular/cdk', '@angular/core/schematics', '@angular/core/rxjs-interop', '@angular/core/primitives/signals', @@ -364,7 +367,7 @@ export function getWebpackAngularAliases(nodeModulesPaths?: string[]): { [key: s '@angular/ssr/schematics', '@angular/ssr' ].forEach((pkg) => { - const resolved = addSafeResolve(pkg, nodeModulesPaths); + const resolved = getSafeResolve(pkg, nodeModulesPaths); if (resolved) { aliases[pkg] = resolved; } diff --git a/angular/devkit/compiler/elements/angular-elements.compiler.ts b/angular/devkit/compiler/elements/angular-elements.compiler.ts index 0d956dea..b6af6ffa 100644 --- a/angular/devkit/compiler/elements/angular-elements.compiler.ts +++ b/angular/devkit/compiler/elements/angular-elements.compiler.ts @@ -1,26 +1,16 @@ // @ts-ignore import type { AngularCompilerOptions } from '@angular/compiler-cli'; -import type { AngularEnvOptions } from '@bitdev/angular.dev-services.common'; -import { - componentIsApp, - getNodeModulesPaths, - getWorkspace -} from '@bitdev/angular.dev-services.common'; +import { componentIsApp, getNodeModulesPaths, getWorkspace } from '@bitdev/angular.dev-services.common'; import { ApplicationAspect, ApplicationMain } from '@teambit/application'; -import { - ArtifactDefinition, - BuildContext, - BuiltTaskResult, - ComponentResult -} from '@teambit/builder'; +import { ArtifactDefinition, BuildContext, BuiltTaskResult, ComponentResult } from '@teambit/builder'; import { Compiler, TranspileComponentParams } from '@teambit/compiler'; import { Component } from '@teambit/component'; import { CompositionsAspect, CompositionsMain } from '@teambit/compositions'; import { EnvContext, EnvHandler } from '@teambit/envs'; import { IsolatorAspect, IsolatorMain } from '@teambit/isolator'; -import { Timer } from '@teambit/legacy/dist/toolbox/timer'; import { Logger } from '@teambit/logger'; import { ScopeAspect, ScopeMain } from '@teambit/scope'; +import { Timer } from '@teambit/toolbox.time.timer'; import { Workspace } from '@teambit/workspace'; import chalk from 'chalk'; import { extname, join } from 'path'; @@ -28,7 +18,6 @@ import { RollupCompiler } from './rollup/rollup.compiler'; interface AngularElementsCompilerOptions { ngPackagrModulePath?: string; - ngEnvOptions: AngularEnvOptions; tsCompilerOptions?: AngularCompilerOptions; name?: string; distDir: string; @@ -55,7 +44,6 @@ export class AngularElementsCompiler implements Compiler { public artifactName: string, private tsCompilerOptions: AngularCompilerOptions = {}, private nodeModulesPaths: string[] = [], - private ngEnvOptions: AngularEnvOptions ) { this.rollupCompiler = new RollupCompiler(this.tsCompilerOptions, this.logger); } @@ -201,8 +189,7 @@ Built Angular Compositions options.shouldCopyNonSupportedFiles, options.artifactName, options.tsCompilerOptions, - nodeModulesPaths, - options.ngEnvOptions + nodeModulesPaths ); }; } diff --git a/angular/devkit/compiler/elements/component.json b/angular/devkit/compiler/elements/component.json index 5bc0edf8..aff63e96 100644 --- a/angular/devkit/compiler/elements/component.json +++ b/angular/devkit/compiler/elements/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "dev-services/compiler/elements", - "version": "7.0.0" + "version": "ced8dc9e4b51671f124d90b0bde8541dce8d84bc" }, "propagate": false, "extensions": { @@ -48,7 +48,6 @@ } } }, - "teambit.node/node@1.0.54": {}, "teambit.envs/envs": {}, "teambit.component/dev-files": {}, "teambit.pkg/pkg": {}, @@ -56,6 +55,7 @@ "teambit.compositions/compositions": {}, "teambit.docs/docs": {}, "teambit.pipelines/builder": {}, - "teambit.semantics/schema": {} + "teambit.semantics/schema": {}, + "teambit.node/node@1.0.103": {} } } diff --git a/angular/devkit/compiler/elements/rollup/rollup.compiler.ts b/angular/devkit/compiler/elements/rollup/rollup.compiler.ts index ed5901ef..8bf96b7e 100644 --- a/angular/devkit/compiler/elements/rollup/rollup.compiler.ts +++ b/angular/devkit/compiler/elements/rollup/rollup.compiler.ts @@ -90,16 +90,38 @@ export class RollupCompiler { nodeResolve({ moduleDirectories: opts.nodeModulesPaths ?? ['node_modules'], dedupe: [ + '@angular/build', + '@angular/cdk', + '@angular/core/schematics', + '@angular/core/rxjs-interop', + '@angular/core/primitives/signals', + '@angular/core/primitives/event-dispatch', + '@angular/core/testing', + '@angular/core', + '@angular/common/http', + '@angular/common/locales', + '@angular/common/testing', + '@angular/common', + '@angular/animations/browser', '@angular/animations', '@angular/cli', - '@angular/common', '@angular/compiler', '@angular/compiler-cli', - '@angular/core', '@angular/forms', + '@angular/platform-browser/animations/async', + '@angular/platform-browser/animations', + '@angular/platform-browser/testing', '@angular/platform-browser', + '@angular/platform-browser-dynamic/testing', '@angular/platform-browser-dynamic', - '@angular/router' + '@angular/platform-server/init', + '@angular/platform-server/testing', + '@angular/platform-server', + '@angular/router/upgrade', + '@angular/router/testing', + '@angular/router', + '@angular/ssr/schematics', + '@angular/ssr' ] }), // sourcemaps({ diff --git a/angular/devkit/compiler/multi-compiler/component.json b/angular/devkit/compiler/multi-compiler/component.json index fa39597c..9002fad1 100644 --- a/angular/devkit/compiler/multi-compiler/component.json +++ b/angular/devkit/compiler/multi-compiler/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "dev-services/compiler/multi-compiler", - "version": "7.0.0" + "version": "a1956f0864f870916641de83680136e322d0f63a" }, "propagate": false, "extensions": { @@ -24,14 +24,16 @@ } } }, - "bitdev.node/node-env@2.0.2": {}, - "teambit.envs/envs": {}, "teambit.component/dev-files": {}, "teambit.pkg/pkg": {}, "teambit.preview/preview": {}, "teambit.compositions/compositions": {}, "teambit.docs/docs": {}, "teambit.pipelines/builder": {}, - "teambit.semantics/schema": {} + "teambit.semantics/schema": {}, + "bitdev.node/node-env@2.0.40": {}, + "teambit.envs/envs": { + "env": "bitdev.node/node-env" + } } } diff --git a/angular/devkit/compiler/multi-compiler/ng-multi-compiler.ts b/angular/devkit/compiler/multi-compiler/ng-multi-compiler.ts index 4f8c19c0..6a4d679e 100644 --- a/angular/devkit/compiler/multi-compiler/ng-multi-compiler.ts +++ b/angular/devkit/compiler/multi-compiler/ng-multi-compiler.ts @@ -189,7 +189,6 @@ export class NgMultiCompiler implements Compiler { artifactName, distDir, distGlobPatterns, - ngEnvOptions: options.ngEnvOptions, ngPackagrModulePath, shouldCopyNonSupportedFiles, tsCompilerOptions: options.tsCompilerOptions, @@ -203,7 +202,6 @@ export class NgMultiCompiler implements Compiler { artifactName, distDir, distGlobPatterns, - ngEnvOptions: options.ngEnvOptions, shouldCopyNonSupportedFiles, tsCompilerOptions: options.tsCompilerOptions })(context); diff --git a/angular/devkit/compiler/ng-packagr/component.json b/angular/devkit/compiler/ng-packagr/component.json index 851d5988..7bcf0027 100644 --- a/angular/devkit/compiler/ng-packagr/component.json +++ b/angular/devkit/compiler/ng-packagr/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "dev-services/compiler/ng-packagr", - "version": "7.0.0" + "version": "f2f08c62f796c69586c399178142c69fcdebd557" }, "propagate": false, "extensions": { @@ -19,14 +19,16 @@ } } }, - "bitdev.node/node-env@2.0.2": {}, - "teambit.envs/envs": {}, "teambit.component/dev-files": {}, "teambit.pkg/pkg": {}, "teambit.preview/preview": {}, "teambit.compositions/compositions": {}, "teambit.docs/docs": {}, "teambit.pipelines/builder": {}, - "teambit.semantics/schema": {} + "teambit.semantics/schema": {}, + "bitdev.node/node-env@2.0.40": {}, + "teambit.envs/envs": { + "env": "bitdev.node/node-env" + } } } diff --git a/angular/devkit/compiler/ng-packagr/ng-packagr.compiler.ts b/angular/devkit/compiler/ng-packagr/ng-packagr.compiler.ts index 98e4826f..4abb52b0 100644 --- a/angular/devkit/compiler/ng-packagr/ng-packagr.compiler.ts +++ b/angular/devkit/compiler/ng-packagr/ng-packagr.compiler.ts @@ -19,8 +19,8 @@ import { DependencyResolverAspect, DependencyResolverMain } from '@teambit/depen import { EnvContext, EnvHandler } from '@teambit/envs'; import { CyclicError } from '@teambit/graph.cleargraph'; import { IsolatorAspect, IsolatorMain } from '@teambit/isolator'; -import { PACKAGE_JSON } from '@teambit/legacy/dist/constants.js'; -import PackageJsonFile from '@teambit/legacy/dist/consumer/component/package-json-file.js'; +import { PACKAGE_JSON } from '@teambit/legacy.constants'; +import * as sources from '@teambit/component.sources'; import { Logger } from '@teambit/logger'; import { ScopeAspect, ScopeMain } from '@teambit/scope'; import { Workspace } from '@teambit/workspace'; @@ -30,6 +30,7 @@ import { mkdirsSync, outputFileSync, removeSync } from 'fs-extra/esm'; import type { NgPackageConfig } from 'ng-packagr/ng-package.schema.js'; import { createRequire } from 'node:module'; import { join, posix, resolve } from 'node:path'; +import { pathToFileURL } from "node:url"; import type { Diagnostic, DiagnosticWithLocation } from 'typescript'; import ts from 'typescript'; @@ -100,7 +101,6 @@ export interface NgPackagr { interface NgPackagrCompilerOptions { ngPackagrModulePath: string; - ngEnvOptions: AngularEnvOptions; tsCompilerOptions?: AngularCompilerOptions; tsconfigPath?: string; name?: string; @@ -184,7 +184,7 @@ export class NgPackagrCompiler implements Compiler { // check for dependencies other than tslib and move them to peer dependencies // see https://github.com/ng-packagr/ng-packagr/blob/master/docs/dependencies.md#general-recommendation-use-peerdependencies-whenever-possible // @ts-ignore - const packageJson = PackageJsonFile.default.loadFromPathSync(pathToOutputFolder, ''); + const packageJson = sources.default.PackageJsonFile.loadFromPathSync(pathToOutputFolder, ''); const { dependencies } = packageJson.packageJsonObject; // const peerDependencies = packageJson.packageJsonObject.peerDependencies; const allowedNonPeerDependencies: string[] = []; @@ -233,7 +233,7 @@ export class NgPackagrCompiler implements Compiler { const parsedTsConfig = await this.readDefaultTsConfig(); parsedTsConfig.options = { ...parsedTsConfig.options, ...tsCompilerOptions }; - const ngPackagr: NgPackagr = (await import(this.ngPackagrPath)).ngPackagr(); + const ngPackagr: NgPackagr = (await import(pathToFileURL(this.ngPackagrPath).href)).ngPackagr(); return ngPackagr .withTsConfig(parsedTsConfig) .forProject(ngPackageJsonPath) @@ -241,7 +241,7 @@ export class NgPackagrCompiler implements Compiler { .then(async() => { // copy over properties generated by ngPackagr // @ts-ignore - const tempPackageJson = PackageJsonFile.default.loadSync(pathToOutputFolder, this.distDir).packageJsonObject; + const tempPackageJson = sources.default.PackageJsonFile.loadSync(pathToOutputFolder, this.distDir).packageJsonObject; const jsonProps = this.updatePaths(tempPackageJson); packageJson.mergePackageJsonObject(jsonProps); await packageJson.write(); @@ -412,7 +412,6 @@ export class NgPackagrCompiler implements Compiler { version(): string { const require = createRequire(import.meta.url); - // eslint-disable-next-line global-require return require('ng-packagr/package.json').version; } diff --git a/angular/devkit/linter/eslint/component.json b/angular/devkit/linter/eslint/component.json index 1f1625fc..c712e7f9 100644 --- a/angular/devkit/linter/eslint/component.json +++ b/angular/devkit/linter/eslint/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "dev-services/linter/eslint", - "version": "4.0.0" + "version": "ebdc47a8803c9e11a951e7f528004c1ea985f5f4" }, "propagate": false, "extensions": { @@ -22,7 +22,6 @@ } } }, - "teambit.node/node@1.0.54": {}, "teambit.envs/envs": {}, "teambit.component/dev-files": {}, "teambit.pkg/pkg": {}, @@ -30,6 +29,7 @@ "teambit.compositions/compositions": {}, "teambit.docs/docs": {}, "teambit.pipelines/builder": {}, - "teambit.semantics/schema": {} + "teambit.semantics/schema": {}, + "teambit.node/node@1.0.103": {} } } diff --git a/angular/devkit/ng-compat/build-angular/builders/application.ts b/angular/devkit/ng-compat/build-angular/builders/application.ts index 5f143959..8a590376 100644 --- a/angular/devkit/ng-compat/build-angular/builders/application.ts +++ b/angular/devkit/ng-compat/build-angular/builders/application.ts @@ -9,9 +9,9 @@ export let buildApplicationInternal = ( context: BuilderContext & { signal?: AbortSignal; }, - infrastructureSettings?: { - write?: boolean; - }, + // infrastructureSettings?: { + // write?: boolean; + // }, plugins?: Plugin[] | { codePlugins: Plugin[], indexHtmlTransformer: any } // @ts-ignore ) => AsyncIterable= 2) || Number(VERSION.maj export const getCommonConfig: configFn = configs.getCommonConfig; export const getDevServerConfig: configFn = configs.getDevServerConfig; export const getStylesConfig: configFn = configs.getStylesConfig; - -// Angular v12, undefined for other versions -export const getBrowserConfig: configFn = configs.getBrowserConfig; -export const getStatsConfig: (wco: any) => { stats: any } = configs.getStatsConfig; -export const getTypeScriptConfig: configFn = configs.getTypeScriptConfig; diff --git a/angular/devkit/ng-compat/component.json b/angular/devkit/ng-compat/component.json index b59015b9..201f3638 100644 --- a/angular/devkit/ng-compat/component.json +++ b/angular/devkit/ng-compat/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "dev-services/ng-compat", - "version": "4.0.0" + "version": "85ce3b597c81384a3d96b07ce7a2c9b789155116" }, "propagate": false, "extensions": { @@ -22,7 +22,6 @@ } } }, - "teambit.node/node@1.0.54": {}, "teambit.envs/envs": {}, "teambit.component/dev-files": {}, "teambit.pkg/pkg": {}, @@ -30,6 +29,7 @@ "teambit.compositions/compositions": {}, "teambit.docs/docs": {}, "teambit.pipelines/builder": {}, - "teambit.semantics/schema": {} + "teambit.semantics/schema": {}, + "teambit.node/node@1.0.103": {} } } diff --git a/angular/devkit/preview/mounter/component.json b/angular/devkit/preview/mounter/component.json index ac223e0e..9491c908 100644 --- a/angular/devkit/preview/mounter/component.json +++ b/angular/devkit/preview/mounter/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "dev-services/preview/mounter", - "version": "4.0.0" + "version": "1aec2c8c2f5de9f231eca1e3eda587b7973477b2" }, "propagate": false, "extensions": { @@ -21,14 +21,16 @@ } } }, - "bitdev.node/node-env@2.0.2": {}, - "teambit.envs/envs": {}, "teambit.component/dev-files": {}, "teambit.pkg/pkg": {}, "teambit.preview/preview": {}, "teambit.compositions/compositions": {}, "teambit.docs/docs": {}, "teambit.pipelines/builder": {}, - "teambit.semantics/schema": {} + "teambit.semantics/schema": {}, + "bitdev.node/node-env@2.0.40": {}, + "teambit.envs/envs": { + "env": "bitdev.node/node-env" + } } } diff --git a/angular/devkit/preview/preview-app/preview-app/favicon.ico b/angular/devkit/preview/preview-app/preview-app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..57614f9c967596fad0a3989bec2b1deff33034f6 GIT binary patch literal 15086 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 Nr__JTFzvMr^FKp4S3v*( literal 0 HcmV?d00001 diff --git a/angular/devkit/preview/preview-app/preview-app/src/app/docs/docs.component.ts b/angular/devkit/preview/preview-app/preview-app/src/app/docs/docs.component.ts index 4ac6a467..6f723907 100644 --- a/angular/devkit/preview/preview-app/preview-app/src/app/docs/docs.component.ts +++ b/angular/devkit/preview/preview-app/preview-app/src/app/docs/docs.component.ts @@ -1,5 +1,32 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { Component, Input, ViewChild, ElementRef } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; +import { AfterViewChecked, Component, ElementRef, Inject, Input, PLATFORM_ID, ViewChild } from '@angular/core'; + +// importing prismjs order is important! +import 'prismjs'; + +import 'prismjs/plugins/toolbar/prism-toolbar'; + +import 'prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard'; +import 'prismjs/plugins/line-numbers/prism-line-numbers'; +import 'prismjs/plugins/show-language/prism-show-language'; + +import 'prismjs/components/prism-csharp'; +import 'prismjs/components/prism-css'; +import 'prismjs/components/prism-java'; +import 'prismjs/components/prism-javascript'; +import 'prismjs/components/prism-json'; +import 'prismjs/components/prism-markup'; +import 'prismjs/components/prism-python'; +import 'prismjs/components/prism-sass'; +import 'prismjs/components/prism-scss'; +import 'prismjs/components/prism-sql'; +import 'prismjs/components/prism-typescript'; +import 'prismjs/components/prism-visual-basic'; +import 'prismjs/components/prism-xml-doc'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare const Prism: any; @Component({ selector: 'app-docs', @@ -7,8 +34,29 @@ import { Component, Input, ViewChild, ElementRef } from '@angular/core'; template: `
`, styleUrls: ['./docs.style.scss'], }) -export class DocsComponent { +export class DocsComponent implements AfterViewChecked { @ViewChild('docsRoot', { static: true }) docsRoot!: ElementRef; @Input() template = ''; + + highlighted = false; + + constructor(@Inject(PLATFORM_ID) private platformId: object) {} + + ngAfterViewChecked() { + if (!this.highlighted && isPlatformBrowser(this.platformId)) { + this.highlightHtml(); + this.highlighted = true; + } + } + + highlightHtml() { + const codeElements = this.docsRoot.nativeElement.querySelectorAll('pre[data-language]'); + codeElements.forEach((el: HTMLElement) => { + const lang = el.getAttribute('data-language')?.replace('language-', '') || 'javascript'; + el.setAttribute('class', `language-${lang}`); + // eslint-disable-next-line no-param-reassign + el.innerHTML = Prism.highlight(el.textContent || '', Prism.languages[lang], lang); + }); + } } diff --git a/angular/devkit/preview/preview-app/preview-app/src/favicon.ico b/angular/devkit/preview/preview-app/preview-app/src/favicon.ico deleted file mode 100644 index 997406ad22c29aae95893fb3d666c30258a09537..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 - - - Angular preview - - - - - -
- + + + Angular preview + + + + + +
+ diff --git a/angular/devkit/preview/preview-app/preview-app/src/main.ts b/angular/devkit/preview/preview-app/preview-app/src/main.ts index d48879c2..bba8a4a0 100644 --- a/angular/devkit/preview/preview-app/preview-app/src/main.ts +++ b/angular/devkit/preview/preview-app/preview-app/src/main.ts @@ -1,3 +1,4 @@ +import 'zone.js'; import { NgModuleRef } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app/app.module'; diff --git a/angular/devkit/preview/preview-app/preview-app/src/polyfills.ts b/angular/devkit/preview/preview-app/preview-app/src/polyfills.ts deleted file mode 100644 index 8827b010..00000000 --- a/angular/devkit/preview/preview-app/preview-app/src/polyfills.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/** ************************************************************************************************* - * BROWSER POLYFILLS - */ - -/** - * IE11 requires the following for NgClass support on SVG elements - */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/** ************************************************************************************************* - * Zone JS is required by default for Angular itself. - */ -import 'zone.js'; // Included with Angular CLI. - -/** ************************************************************************************************* - * APPLICATION IMPORTS - */ diff --git a/angular/devkit/preview/preview-app/preview-app/src/styles.scss b/angular/devkit/preview/preview-app/preview-app/src/styles.scss index 6c8a96c1..beaabfe6 100644 --- a/angular/devkit/preview/preview-app/preview-app/src/styles.scss +++ b/angular/devkit/preview/preview-app/preview-app/src/styles.scss @@ -1,2 +1,2 @@ /* You can add global styles to this file, and also import other style files */ -@import './styles/prism-theme-vsc-dark-plus'; +@use './styles/prism-theme-vsc-dark-plus'; diff --git a/angular/devkit/preview/preview-app/preview-app/tsconfig.app.json b/angular/devkit/preview/preview-app/preview-app/tsconfig.app.json index 7263ce21..a83d63aa 100644 --- a/angular/devkit/preview/preview-app/preview-app/tsconfig.app.json +++ b/angular/devkit/preview/preview-app/preview-app/tsconfig.app.json @@ -12,10 +12,9 @@ "importHelpers": true, "lib": [ "es2018", - "dom", - "esnext.asynciterable" + "dom" ], - "module": "esnext", + "module": "ES2022", "moduleResolution": "node", "noFallthroughCasesInSwitch": true, "noImplicitReturns": true, @@ -24,7 +23,10 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "target": "es5" + "target": "ES2022", + "types": [], + "useDefineForClassFields": true, + "esModuleInterop": true }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false, @@ -34,13 +36,12 @@ "enableIvy": true }, "files": [ - "./src/main.ts", - "./src/polyfills.ts" + "./src/main.ts" ], "include": [ - "./src/app/**/*.ts", + "./src/**/*.ts" ], "exclude": [ - "./src/app/**/*.spec.ts" + "./src/**/*.spec.ts" ] } diff --git a/angular/devkit/preview/preview/component.json b/angular/devkit/preview/preview/component.json index 2f69f3d4..887d31e1 100644 --- a/angular/devkit/preview/preview/component.json +++ b/angular/devkit/preview/preview/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "dev-services/preview/preview", - "version": "7.0.0" + "version": "97b6d79f2438864e11a05f1a96173e97062e632b" }, "propagate": false, "extensions": { @@ -28,14 +28,16 @@ } } }, - "bitdev.node/node-env@2.0.2": {}, - "teambit.envs/envs": {}, "teambit.component/dev-files": {}, "teambit.pkg/pkg": {}, "teambit.preview/preview": {}, "teambit.compositions/compositions": {}, "teambit.docs/docs": {}, "teambit.pipelines/builder": {}, - "teambit.semantics/schema": {} + "teambit.semantics/schema": {}, + "bitdev.node/node-env@2.0.40": {}, + "teambit.envs/envs": { + "env": "bitdev.node/node-env" + } } } diff --git a/angular/devkit/preview/runtime/component.json b/angular/devkit/preview/runtime/component.json index 51a98bab..bd40a2f4 100644 --- a/angular/devkit/preview/runtime/component.json +++ b/angular/devkit/preview/runtime/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "dev-services/preview/runtime", - "version": "4.0.0" + "version": "dea3ae30f4ba75f535e40a4931c416655909316c" }, "propagate": false, "extensions": { @@ -20,14 +20,16 @@ } } }, - "bitdev.node/node-env@2.0.2": {}, - "teambit.envs/envs": {}, "teambit.component/dev-files": {}, "teambit.pkg/pkg": {}, "teambit.preview/preview": {}, "teambit.compositions/compositions": {}, "teambit.docs/docs": {}, "teambit.pipelines/builder": {}, - "teambit.semantics/schema": {} + "teambit.semantics/schema": {}, + "bitdev.node/node-env@2.0.40": {}, + "teambit.envs/envs": { + "env": "bitdev.node/node-env" + } } } diff --git a/angular/devkit/preview/runtime/loader.ts b/angular/devkit/preview/runtime/loader.ts index a155383f..b5791d16 100644 --- a/angular/devkit/preview/runtime/loader.ts +++ b/angular/devkit/preview/runtime/loader.ts @@ -1,4 +1,5 @@ /* eslint-disable */ +// @ts-ignore import './native-shim.cjs'; import { Injector, NgModuleRef, Type } from '@angular/core'; import { createCustomElement } from '@angular/elements'; diff --git a/angular/devkit/preview/vite-preview/angular-vite-preview.ts b/angular/devkit/preview/vite-preview/angular-vite-preview.ts new file mode 100644 index 00000000..7160f3b9 --- /dev/null +++ b/angular/devkit/preview/vite-preview/angular-vite-preview.ts @@ -0,0 +1,164 @@ +import { + ApplicationOptions, + BrowserOptions, + DevServerOptions, + isAppBuildContext +} from '@bitdev/angular.dev-services.common'; +import { NgViteBundler, NgViteDevServer } from '@bitdev/angular.dev-services.vite'; +import { Bundler, BundlerContext, DevServer, DevServerContext } from '@teambit/bundler'; +import { AsyncEnvHandler, EnvContext, EnvHandler } from '@teambit/envs'; +import { EnvPreviewConfig, Preview } from '@teambit/preview'; +import { dirname, join, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import objectHash from 'object-hash'; +// Make sure bit recognizes the dependencies +import 'webpack-dev-server'; + +interface AngularVitePreviewOptions { + /** + * Override the default Angular docs template path + */ + docsTemplatePath?: string; + + /** + * Deps that will be bundled with the env template and will be configured as externals for the component bundle. + * These dependencies will be available in the preview as singletons. + */ + hostDependencies?: string[]; + + /** + * Override the default Angular mount path + */ + mounterPath?: string; + + /** + * Name of the angular preview. + */ + name?: string; + + /** + * Configuration for the preview. + */ + previewConfig?: EnvPreviewConfig; + + /** + * Angular options for `bit run` + */ + angularServeOptions?: Partial<(BrowserOptions | ApplicationOptions) & DevServerOptions>; + + /** + * Angular options for `bit build` + */ + angularBuildOptions?: Partial<(BrowserOptions | ApplicationOptions)>; + + /** + * The root of the source files, assets and index.html file structure. + */ + sourceRoot?: string; +} + +export function getPreviewRootPath(): string { + const appPath = dirname(fileURLToPath(import.meta.resolve('@bitdev/angular.dev-services.preview.preview-app'))); + // appPath is the path of the current file in dist + // but we want the preview app source code files (.ts) which are located in the parent directory + return resolve(join(appPath, '../preview-app/')); +} + + +export class AngularVitePreview implements Preview { + private constructor( + readonly name: string, + private angularServeOptions: Partial<(BrowserOptions | ApplicationOptions) & DevServerOptions> = {}, + private angularBuildOptions: Partial<(BrowserOptions | ApplicationOptions)> = {}, + private docsTemplatePath: string = fileURLToPath(import.meta.resolve('./docs.js')), + private mounterPath: string = fileURLToPath(import.meta.resolve('./mounter.js')), + private previewConfig: EnvPreviewConfig = {}, + private hostDependencies?: string[], + private sourceRoot?: string, + ) { + } + + getDevServer(context: DevServerContext): AsyncEnvHandler { + const appRootPath = getPreviewRootPath(); + return NgViteDevServer.from({ + angularOptions: this.angularServeOptions, + devServerContext: context, + sourceRoot: this.sourceRoot, + appRootPath + }); + } + + getDevEnvId() { + const objToHash = { + name: this.name, + docsTemplatePath: this.docsTemplatePath, + mounterPath: this.mounterPath, + previewConfig: this.previewConfig, + }; + return objectHash(objToHash); + } + + getBundler(context: BundlerContext): AsyncEnvHandler { + let appRootPath: string; + if (isAppBuildContext(context)) { // When you use `bit build` for an actual angular app + appRootPath = context.capsule.path; + } else { // When you use `bit build` for the preview app + appRootPath = getPreviewRootPath(); + } + return NgViteBundler.from({ + angularOptions: this.angularBuildOptions, + bundlerContext: context, + sourceRoot: this.sourceRoot, + appRootPath + }); + } + + /** + * Dependencies to be bundled only once, in the env preview template, and not in each component preview. + * most of your peer dependencies should be listed here to avoid duplications in the preview. + * React, ReactDOM, and MDX are included as they are part of the preview ui. + */ + getHostDependencies(): string[] { + return ( + this.hostDependencies || [ + '@teambit/mdx.ui.mdx-scope-context', + '@mdx-js/react', + 'react', + 'react-dom' + ] + ); + } + + getMounter(): string { + return this.mounterPath; + } + + getDocsTemplate(): string { + return this.docsTemplatePath; + } + + getPreviewConfig(): EnvPreviewConfig & { isScaling?: boolean } { + return { + strategyName: 'env', + // splitComponentBundle: true, + // isScaling: true, + ...this.previewConfig + }; + } + + static from(options: AngularVitePreviewOptions): EnvHandler { + const name = options.name || 'angular-preview'; + return (_context: EnvContext) => { + return new AngularVitePreview( + name, + options.angularServeOptions, + options.angularBuildOptions, + options.docsTemplatePath, + options.mounterPath, + options.previewConfig, + options.hostDependencies, + options.sourceRoot, + ); + }; + } +} diff --git a/angular/devkit/preview/vite-preview/component.json b/angular/devkit/preview/vite-preview/component.json new file mode 100644 index 00000000..ca349ec3 --- /dev/null +++ b/angular/devkit/preview/vite-preview/component.json @@ -0,0 +1,28 @@ +{ + "componentId": { + "scope": "bitdev.angular", + "name": "dev-services/preview/vite-preview", + "version": "1.0.1" + }, + "propagate": false, + "extensions": { + "teambit.dependencies/dependency-resolver": { + "policy": { + "peerDependencies": { + "@angular/core": ">= 16.0.0" + } + } + }, + "teambit.component/dev-files": {}, + "teambit.pkg/pkg": {}, + "teambit.preview/preview": {}, + "teambit.compositions/compositions": {}, + "teambit.docs/docs": {}, + "teambit.pipelines/builder": {}, + "teambit.semantics/schema": {}, + "bitdev.node/node-env@2.0.40": {}, + "teambit.envs/envs": { + "env": "bitdev.node/node-env" + } + } +} diff --git a/angular/devkit/preview/vite-preview/docs.ts b/angular/devkit/preview/vite-preview/docs.ts new file mode 100644 index 00000000..2a31e8d4 --- /dev/null +++ b/angular/devkit/preview/vite-preview/docs.ts @@ -0,0 +1,34 @@ +import type { RenderingContext } from '@teambit/preview'; +// @ts-ignore +import type { Type } from '@angular/core'; +import { ReplaySubject } from 'rxjs'; + +window.onDocsLoad$ = window.onDocsLoad$ || new ReplaySubject(); +const root = document.getElementById('root'); + +export type DocsFile = { + default: string; +}; + +export type DocsRootProps = { + Provider: Type | undefined, + componentId: string, + docs: DocsFile | string | undefined, + compositions: { [key: string]: any }, + context: RenderingContext +} + +async function docsRoot({docs}: DocsRootProps): Promise { + if (docs && root) { + const appRoot = document.createElement('app-root'); + root.replaceChildren(appRoot); + await window.ngMainStart(); + window.onDocsLoad$.next((docs as DocsFile).default ?? docs as string); + } +} + +// Add support for new api signature +// TODO: remove by the end of 2022 +docsRoot.apiObject = true; + +export default docsRoot; diff --git a/angular/devkit/preview/vite-preview/index.ts b/angular/devkit/preview/vite-preview/index.ts new file mode 100644 index 00000000..bd58b705 --- /dev/null +++ b/angular/devkit/preview/vite-preview/index.ts @@ -0,0 +1 @@ +export * from './angular-vite-preview.js'; diff --git a/angular/devkit/preview/vite-preview/mounter.ts b/angular/devkit/preview/vite-preview/mounter.ts new file mode 100644 index 00000000..60171057 --- /dev/null +++ b/angular/devkit/preview/vite-preview/mounter.ts @@ -0,0 +1,4 @@ +/* eslint-disable import/no-unresolved */ +import { createMounter } from '@bitdev/angular.dev-services.preview.mounter'; + +export default createMounter(); diff --git a/angular/devkit/preview/vite-preview/types.d.ts b/angular/devkit/preview/vite-preview/types.d.ts new file mode 100644 index 00000000..4962c903 --- /dev/null +++ b/angular/devkit/preview/vite-preview/types.d.ts @@ -0,0 +1,9 @@ +import type { NgModuleRef } from '@angular/core'; +import type { ReplaySubject } from 'rxjs'; + +declare global { + interface Window { + onDocsLoad$: ReplaySubject; + ngMainStart: () => Promise | void>; + } +} diff --git a/angular/app-types/angular-app-type/application.bundler.ts b/angular/devkit/vite/application.bundler.ts similarity index 73% rename from angular/app-types/angular-app-type/application.bundler.ts rename to angular/devkit/vite/application.bundler.ts index 7ae238c0..8862b196 100644 --- a/angular/app-types/angular-app-type/application.bundler.ts +++ b/angular/devkit/vite/application.bundler.ts @@ -1,34 +1,44 @@ /* eslint-disable no-param-reassign */ import { OutputHashing } from '@angular-devkit/build-angular'; import { VERSION } from '@angular/cli'; -import { dedupPaths, getLoggerApi, normalizePath } from '@bitdev/angular.dev-services.common'; +import { ApplicationOptions, dedupePaths, getLoggerApi, normalizePath } from '@bitdev/angular.dev-services.common'; import { type ApplicationBuilderOptions, buildApplicationInternal } from '@bitdev/angular.dev-services.ng-compat'; import { Logger } from '@teambit/logger'; import assert from 'assert'; +import { nodeModulesPolyfillPlugin } from 'esbuild-plugins-node-modules-polyfill'; import fs from 'fs-extra'; // @ts-ignore import type { NitroConfig } from 'nitropack'; import { fileURLToPath } from 'node:url'; import { basename, extname, join, posix, relative, resolve } from 'path'; +import dedupePlugin from "./plugins/dedupe.plugin.js"; import definePlugin from './plugins/define.plugin.js'; -import { getIndexInputFile } from './utils.js'; +import mdPlugin from "./plugins/md.plugin.js"; +import { getIndexInputFile } from './utils/utils.js'; export type BuildApplicationOptions = { - angularOptions: Partial; + angularOptions: Partial; outputPath: string; sourceRoot: string; workspaceRoot: string; logger: Logger; tempFolder: string; entryServer?: string; - envVars: any; + envVars?: any; + isPreview?: boolean; +} + +export type BuildOutput = { + success: boolean; + error?: string; } // TODO allow customizing this const BUILDER_NAME = '@angular-devkit/build-angular:application'; +const CACHE_PATH = 'angular/cache'; -export async function buildApplication(options: BuildApplicationOptions): Promise { - const { angularOptions: { tsConfig, server, define }, envVars } = options; +export async function buildApplication(options: BuildApplicationOptions): Promise { + const { angularOptions: { tsConfig, server, define }, envVars, isPreview } = options; assert(tsConfig, 'tsConfig option is required'); const isSsr = !!server && Number(VERSION.major) >= 17; if (isSsr && Number(VERSION.major) < 19) { @@ -36,17 +46,36 @@ export async function buildApplication(options: BuildApplicationOptions): Promis } const appOptions = getAppOptions(options, isSsr); const builderContext = getBuilderContext(options, appOptions); - const codePlugins = [definePlugin({ ...envVars, ...define || {} })]; - const extensions: any = (Number(VERSION.major) >= 17 && Number(VERSION.minor) >= 1) ? { codePlugins } : []; - - for await (const result of buildApplicationInternal( - appOptions as any, - builderContext, - { write: true }, - extensions - )) { - if (!result.success && result.errors) { - throw new Error(result.errors.map((err: any) => err.text).join('\n')); + const extensions: any = { codePlugins: [dedupePlugin()] }; + if (isPreview) { + extensions.codePlugins.push(mdPlugin(), nodeModulesPolyfillPlugin()); + } else if ((Number(VERSION.major) >= 17 && Number(VERSION.minor) >= 1)) { + extensions.codePlugins.push(definePlugin({ ...envVars, ...define || {} })); + } + + let results: AsyncGenerator; + // todo use buildApplication + if (Number(VERSION.major) >= 18) { + results = buildApplicationInternal( + appOptions, + builderContext, + extensions + ) + } else { + results = buildApplicationInternal( + appOptions, + builderContext, + { write: true }, + // @ts-ignore only v18+ has 3 arguments, previous versions had 4 + extensions + ) + } + + const res: BuildOutput[] = []; + for await (const result of results) { + res.push(result); + if (result.error) { + options.logger.error(result.error); } } @@ -54,6 +83,8 @@ export async function buildApplication(options: BuildApplicationOptions): Promis if (isSsr && Number(VERSION.major) < 19) { await buildNitro(options); } + + return res; } function addEntryServer(options: BuildApplicationOptions): void { @@ -96,8 +127,8 @@ function getAppOptions(options: BuildApplicationOptions, isSsr: boolean): Applic const normalizedBrowser = `./${join(sourceRoot, 'main.ts')}`; const serverPath = `./${join(sourceRoot, 'main.server.ts')}`; - const dedupedAssets = dedupPaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]); - const dedupedStyles = dedupPaths([posix.join(sourceRoot, `styles.${angularOptions.inlineStyleLanguage}`), ...(angularOptions.styles ?? [])]); + const dedupedAssets = dedupePaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]); + const dedupedStyles = dedupePaths([posix.join(sourceRoot, `styles.${angularOptions.inlineStyleLanguage}`), ...(angularOptions.styles ?? [])]); return { ...angularOptions, @@ -111,24 +142,31 @@ function getAppOptions(options: BuildApplicationOptions, isSsr: boolean): Applic styles: dedupedStyles, scripts: angularOptions.scripts, namedChunks: angularOptions.namedChunks ?? true, - optimization: false,//angularOptions.optimization ?? true, + optimization: angularOptions.optimization ?? true, aot: true, deleteOutputPath: true, sourceMap: angularOptions.sourceMap ?? true, - outputHashing: OutputHashing.None,//angularOptions.outputHashing ?? OutputHashing.All, + outputHashing: angularOptions.outputHashing ?? OutputHashing.All, watch: false, outputMode: angularOptions.outputMode ?? (isSsr ? 'server' : 'static'), server: isSsr ? angularOptions.server ?? serverPath : undefined, prerender: isSsr ? (angularOptions.prerender ?? !!angularOptions.server) : undefined, ssr: isSsr ? { entry: entryServer - } : undefined + } : undefined, + // @ts-ignore Angular 17-18 + browserTarget: BUILDER_NAME, + // @ts-ignore Angular 17+ + buildTarget: BUILDER_NAME, + // support for bit.cloud workspaces + host: "0.0.0.0" }; } function getBuilderContext(options: BuildApplicationOptions, appOptions: ApplicationBuilderOptions): any { - const { workspaceRoot, sourceRoot, tempFolder } = options; + const { workspaceRoot } = options; + const builderAbort = new AbortController(); return { id: 1, builder: { @@ -137,20 +175,16 @@ function getBuilderContext(options: BuildApplicationOptions, appOptions: Applica optionSchema: {} }, logger: getLoggerApi(options.logger), + signal: builderAbort.signal, workspaceRoot: workspaceRoot, currentDirectory: '', // doesn't matter, just needs to exist target: { project: 'bit-ng-app-builder', - target: 'build' - }, - getProjectMetadata: function (): Promise { - return Promise.resolve({ - root: '', - sourceRoot, - cli: { cache: { enabled: true, path: resolve(tempFolder, 'angular/cache') } } - }); + // target: 'build' + target: 'development' }, + getProjectMetadata: getProjectMetadata(options), addTeardown: () => { }, getBuilderNameForTarget: () => Promise.resolve(BUILDER_NAME), @@ -159,6 +193,22 @@ function getBuilderContext(options: BuildApplicationOptions, appOptions: Applica }; } +function getProjectMetadata(options: BuildApplicationOptions) { + const { sourceRoot, tempFolder } = options; + return function (): Promise { + return Promise.resolve({ + root: '', + sourceRoot, + cli: { + cache: { + enabled: true, + path: resolve(tempFolder, CACHE_PATH) + } + } + }); + }; +} + async function getNitroConfig(options: BuildApplicationOptions): Promise { const { workspaceRoot, @@ -173,7 +223,7 @@ async function getNitroConfig(options: BuildApplicationOptions): Promise; + angularOptions: Partial; sourceRoot: string; workspaceRoot: string; logger: Logger; port: number; tempFolder: string; envVars: any; + indexHtmlTransform?: (content: string) => Promise; + isPreview?: boolean; } // TODO allow customizing this @@ -39,31 +49,42 @@ export async function serveApplication(options: ServeApplicationOptions): Promis const appOptions = getAppOptions(options, isSsr); const builderContext = getBuilderContext(options, appOptions); const devServerOptions: any = { - buildPlugins: [], + buildPlugins: [dedupePlugin()], middleware: [] }; + if (options.isPreview) { + devServerOptions.buildPlugins.push(mdPlugin(), nodeModulesPolyfillPlugin()); + } if (isSsr) { - devServerOptions.buildPlugins = [definePlugin({ ...envVars, ...define })]; + devServerOptions.buildPlugins.push(definePlugin({ ...envVars, ...define })); // Versions of Angular <19 require a nitro middleware to support SSR API endpoints if (Number(VERSION.major) < 19) { devServerOptions.middleware = [await createNitroApiMiddleware(options)]; } } + const transforms = { + indexHtml: options.indexHtmlTransform + }; - // @ts-ignore only v17+ has 4 arguments, previous versions only have 3 - await executeDevServerBuilder(appOptions, builderContext as any, undefined, devServerOptions).toPromise(); + if (Number(VERSION.major) > 17 || (Number(VERSION.major) == 17 && Number(VERSION.minor) >= 1)) { + // @ts-ignore only v17.1.0+ has 4 arguments, previous versions only have 3 + await executeDevServerBuilder(appOptions, builderContext as any, transforms, devServerOptions).toPromise(); + } else { + // @ts-ignore only v17.1.0+ has 4 arguments, previous versions only have 3 + await executeDevServerBuilder(appOptions, builderContext as any, devServerOptions).toPromise(); + } } -function getAppOptions(options: ServeApplicationOptions, isSsr: boolean): ApplicationBuilderOptions & DevServerBuilderOptions { +function getAppOptions(options: ServeApplicationOptions, isSsr: boolean): /*ApplicationBuilderOptions & DevServerBuilderOptions*/ any { const { angularOptions, port, sourceRoot, workspaceRoot } = options; // declare constants for all reusable values here const normalizedIndex = `./${join(sourceRoot, 'index.html')}`; const normalizedBrowser = `./${join(sourceRoot, 'main.ts')}`; const serverPath = `./${join(sourceRoot, 'main.server.ts')}`; - const dedupedAssets = dedupPaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]); - const dedupedStyles = dedupPaths([posix.join(sourceRoot, `styles.${angularOptions.inlineStyleLanguage}`), ...(angularOptions.styles ?? [])]); + const dedupedAssets = dedupePaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]); + const dedupedStyles = dedupePaths([posix.join(sourceRoot, `styles.${angularOptions.inlineStyleLanguage}`), ...(angularOptions.styles ?? [])]); return { ...angularOptions, @@ -71,7 +92,7 @@ function getAppOptions(options: ServeApplicationOptions, isSsr: boolean): Applic preserveSymlinks: false, outputPath: OUTPUT_PATH, index: angularOptions.index ?? normalizedIndex, - browser: angularOptions.browser ?? normalizedBrowser, + browser: angularOptions.browser ?? (angularOptions.entryPoints ? undefined : normalizedBrowser), tsConfig: relative(workspaceRoot, angularOptions.tsConfig!), assets: dedupedAssets, styles: dedupedStyles, @@ -87,9 +108,10 @@ function getAppOptions(options: ServeApplicationOptions, isSsr: boolean): Applic hmr: angularOptions.hmr ?? false, outputMode: angularOptions.outputMode ?? (isSsr ? 'server' : 'static'), server: isSsr ? angularOptions.server ?? serverPath : undefined, - prerender: isSsr ? angularOptions.prerender ?? !!angularOptions.server : false, + prerender: isSsr && !angularOptions.outputMode ? angularOptions.prerender ?? !!angularOptions.server : undefined, ssr: isSsr ? (angularOptions.ssr ?? !!angularOptions.server) : false, port, + // @ts-ignore Angular 17-18 browserTarget: BUILDER_NAME, // @ts-ignore Angular 17+ buildTarget: BUILDER_NAME, @@ -108,7 +130,7 @@ function getBuilderContext(options: ServeApplicationOptions, appOptions: Applica description: 'Bit Angular Application Builder', optionSchema: {} }, - logger: getLoggerApi(options.logger), + logger: getLoggerApi(options.logger, options.isPreview), signal: builderAbort.signal, workspaceRoot: workspaceRoot, currentDirectory: '', diff --git a/angular/devkit/vite/component.json b/angular/devkit/vite/component.json index 0d1ad0e9..9a8cc2da 100644 --- a/angular/devkit/vite/component.json +++ b/angular/devkit/vite/component.json @@ -1,33 +1,32 @@ { "componentId": { "scope": "bitdev.angular", - "name": "dev-services/vite" + "name": "dev-services/vite", + "version": "2.0.1" }, - "propagate": true, + "propagate": false, "extensions": { "teambit.dependencies/dependency-resolver": { "policy": { "dependencies": { - "@analogjs/platform": "-", - "@teambit/node.deps-detectors.detective-es6": "0.0.5", - "@teambit/vite.vite-bundler": "*", - "@teambit/vite.vite-dev-server": "*", - "@types/express": "^4.17.17", - "@types/memoizee": "0.4.5", - "find-root": "1.1.0", - "memoizee": "0.4.15", - "parse5-html-rewriting-stream": "7.0.0" - }, - "devDependencies": { - "@types/find-root": "1.1.2", - "@types/node": "12.20.4" + "#alias": "-", + "h3": "^1.9.0", + "nitropack": "^2.8.0", + "@angular-devkit/build-angular": "-", + "@angular/cli": "-", + "typescript": "-" }, "peerDependencies": { - "@analogjs/platform": ">= 0.2.22", - "@angular/common": ">= 13.0.0", - "vite": "5.0.0" + "@angular-devkit/build-angular": ">= 0.0.1", + "@angular/cli": ">= 13.0.0", + "esbuild": ">= 0.14.0", + "typescript": ">= 3.5.3" } } + }, + "bitdev.node/node-env@2.0.40": {}, + "teambit.envs/envs": { + "env": "bitdev.node/node-env" } } } diff --git a/angular/devkit/vite/config.factory.ts b/angular/devkit/vite/config.factory.ts deleted file mode 100644 index 6ef6a3f4..00000000 --- a/angular/devkit/vite/config.factory.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { default as analog } from '@analogjs/platform'; -import { isAppBuildContext, normalizePath } from '@bitdev/angular.dev-services.common'; -import { BundlerContext, DevServerContext } from '@teambit/bundler'; -import { CACHE_ROOT } from '@teambit/legacy/dist/constants'; -import assert from 'assert'; -import { basename, extname, join, posix, resolve } from 'path'; -// @ts-ignore -import type { InlineConfig } from 'vite'; -import { getIndexInputFile, htmlPlugin } from './plugins/index-html.plugin'; -import { BuildMode, NgViteOptions, ViteAspectsContext } from './utils/types'; -import { joinPathFragments } from './utils/utils'; - -type ConfigFactoryOptions = NgViteOptions & { context: DevServerContext | BundlerContext }; - - -const SSR_DIR = 'ssr'; -const BROWSER_DIR = 'browser'; - -/** - * Generate Vite configuration object based on provided options. - * - * @param {ConfigFactoryOptions} options - The options for generating the configuration. - * @param {ViteAspectsContext} aspectContext - The context object for Vite aspects. - * @return {Promise} - The generated Vite configuration object. - */ -export async function configFactory( - options: ConfigFactoryOptions, - aspectContext: ViteAspectsContext -): Promise { - const { mergeConfig } = await import('vite'); - const { - angularOptions: { tsConfig, index }, - context: { rootPath, envRuntime }, - context, - name, - outputPath - } = options; - assert(rootPath, 'rootPath is required'); - assert(outputPath, 'outputPath is required'); - const { workspace } = aspectContext; - const idName = `${ envRuntime.id }/${ name }`; - const tempFolder = workspace ? workspace.getTempDir(idName) : join(CACHE_ROOT, idName); - const indexPath = getIndexInputFile(index!); - const browserDir = normalizePath(resolve(outputPath, BROWSER_DIR)); - const ssrDir = normalizePath(resolve(outputPath, SSR_DIR)); - - assert(isAppBuildContext(context), 'Angular vite only support apps for now'); - let appRootPath: string; - const capsule = (options.context as any).capsule; - if (capsule) { - appRootPath = capsule.path; - } else { - appRootPath = workspace?.componentDir(context.appComponent.id, { - ignoreVersion: true - }) || ''; - } - const tsconfigPath = tsConfig ?? posix.join(appRootPath, 'tsconfig.app.json'); - - const baseConfig = createBaseConfig(options, tsconfigPath, tempFolder, browserDir, ssrDir, appRootPath, indexPath); - const serverConfig = await createServerConfig(rootPath); - const buildConfig = createBuildConfig(browserDir, appRootPath, indexPath); - const testConfig = createTestConfig(); - - return mergeConfig( - baseConfig, - { - build: buildConfig - //server: serverConfig, - //test: testConfig - } - ); -} - -function createBaseConfig(options: ConfigFactoryOptions, tsconfigPath: string, tempFolder: string, browserDir: string, ssrDir: string, appRootPath: string, indexPath: string) { - const { - angularOptions: { baseHref, server, ssr }, - angularOptions, - context: { rootPath }, - buildMode, - outputPath, - sourceRoot - } = options; - - assert(rootPath, 'rootPath is required'); - assert(outputPath, 'outputPath is required'); - - // TODO: fix this - const entryServer = ''; //(ssr as SsrClass)?.entry as string; - - const baseConfig: InlineConfig = { - // publicDir: 'src/assets', // todo - root: join(appRootPath, sourceRoot || 'src'), - base: baseHref ?? './', - mode: buildMode, - resolve: { - mainFields: ['module'] - }, - define: { - 'import.meta.vitest': buildMode !== BuildMode.Production - }, - plugins: [ - analog({ - vite: { - tsconfig: tsconfigPath - }, - ssr: !!server, - ssrBuildDir: ssr ? ssrDir : undefined, - entryServer: resolve(appRootPath, entryServer), - nitro: { - alias: ssr ? { - '#analog/ssr': join(ssrDir, basename(entryServer, extname(entryServer))), - '#analog/index': join(browserDir, basename(indexPath)) - } : {}, - serverAssets: ssr ? [{ - baseName: 'public', - dir: browserDir - }] : [], - publicAssets: ssr ? [{ - dir: browserDir - }] : [], - output: ssr ? { - dir: normalizePath(resolve(outputPath, 'server')), - publicDir: normalizePath(resolve(outputPath, 'server/public')) - } : {}, - buildDir: normalizePath(resolve(tempFolder, 'nitro')), - prerender: { - concurrency: 4 - } - }, - index: indexPath, - workspaceRoot: appRootPath - }) - ] - }; - - if (server) { - // When running the ssr dev server, CTRL+C doesn't seem to work anymore (bug in nitro?) - // This is a workaround to make sure the process exits when CTRL+C is pressed - process.on('SIGINT', () => process.exit(1)); - } //else { - // When we are not using ssr, we need to add the html plugin to generate the index.html file - baseConfig.plugins!.push(htmlPlugin(angularOptions, rootPath!, indexPath, !!ssr)); - //} - return baseConfig; -} - -async function createServerConfig(rootPath: string) { - const { searchForWorkspaceRoot } = await import('vite'); - return { - fs: { - allow: [ - searchForWorkspaceRoot(joinPathFragments(rootPath)), - joinPathFragments('.', 'node_modules/vite') - ] - } - }; -} - -function createBuildConfig(browserDir: string, appRootPath: string, indexPath: string) { - return { - target: ['es2020'], - outDir: browserDir, - emptyOutDir: true, - reportCompressedSize: true, - commonjsOptions: { - transformMixedEsModules: true - } - }; -} - -function createTestConfig() { - return { - globals: true, - environment: 'jsdom', - setupFiles: ['src/test.ts'], - include: ['**/*.spec.ts'] - }; -} - - - - diff --git a/angular/devkit/vite/index.ts b/angular/devkit/vite/index.ts index ca5e622d..cfe21050 100644 --- a/angular/devkit/vite/index.ts +++ b/angular/devkit/vite/index.ts @@ -1,3 +1,5 @@ -export * from './ng-vite.dev-server'; -export * from './ng-vite.bundler'; -export * from './utils/types'; +export * from './ng-vite.dev-server.js'; +export * from './ng-vite.bundler.js'; +export * from './application.dev-server.js'; +export * from './application.bundler.js'; +export * from './utils/utils.js'; diff --git a/angular/devkit/vite/ng-vite.bundler.ts b/angular/devkit/vite/ng-vite.bundler.ts index 3586c0d8..926602e4 100644 --- a/angular/devkit/vite/ng-vite.bundler.ts +++ b/angular/devkit/vite/ng-vite.bundler.ts @@ -1,35 +1,151 @@ -import type { Bundler, BundlerContext } from '@teambit/bundler'; +import { OutputHashing } from '@angular-devkit/build-angular'; +import { ApplicationInternalOptions, getWorkspace, normalizePath } from "@bitdev/angular.dev-services.common"; +import type { Bundler, BundlerContext, BundlerResult, Target } from '@teambit/bundler'; +import type { Component } from '@teambit/component'; +import { DependencyResolverAspect, type DependencyResolverMain } from '@teambit/dependency-resolver'; +import { DevFilesAspect, type DevFilesMain } from "@teambit/dev-files"; import type { AsyncEnvHandler, EnvContext } from '@teambit/envs'; -import { Logger } from '@teambit/logger'; -import { ViteBundler, ViteBundlerOptions } from '@teambit/vite.vite-bundler'; +import type { Logger } from '@teambit/logger'; import type { Workspace } from '@teambit/workspace'; -// @ts-ignore -import type { InlineConfig } from 'vite'; -import { configFactory } from './config.factory'; -import { NgViteOptions } from './utils/types'; - -export class NgViteBundler { - - static from(options: NgViteOptions & { context: BundlerContext }): AsyncEnvHandler { - return async(context: EnvContext): Promise => { - options.name = options.name || 'ng-vite-bundler'; - const logger: Logger = context.createLogger(options.name); - const workspace: Workspace = context.getAspect('teambit.workspace/workspace'); - - const ngConfig = await configFactory(options, { logger, workspace }); - // @ts-ignore - const transformer: any = (config: InlineConfig, vite: typeof import('vite')): InlineConfig => { - return vite.mergeConfig(config, ngConfig); +import assert from "assert"; +import fs from "fs-extra"; +import { findScopePath } from '@teambit/scope.modules.find-scope-path'; +import { join, posix, resolve } from "path"; +import { buildApplication } from "./application.bundler.js"; +import { NgViteOptions } from "./utils/types.js"; +import { fixEntries, generateAppTsConfig, generateMainEntryFile } from "./utils/utils.js"; + +const DEFAULT_SERVER_NAME = 'ng-vite-dev-server'; + +export class NgViteBundler implements Bundler { + idName: string; + + constructor( + public id: string, + private options: NgViteOptions & { bundlerContext: BundlerContext }, + private logger: Logger, + private depsResolver: DependencyResolverMain, + private devFilesMain: DevFilesMain, + private workspace?: Workspace + ) { + this.idName = `bitdev.angular/${this.id}`; + } + + getComponents(targets: Target[], outputPath: string): Component[] { + const path = outputPath.substring(0, outputPath.lastIndexOf(posix.sep)); + const target = targets.find((targetCandidate) => path === targetCandidate.outputPath); + + assert(target, `Could not find target for path "${outputPath}"`); + + return target.components as any as Component[]; + } + + private getTempFolder(idName: string, path = process.cwd()): string { + const scopePath = findScopePath(path); + assert(scopePath, `Unable to find scope path`); + const tempFolder = join(scopePath, 'tmp', 'preview-entries', idName); + + if (!fs.existsSync(tempFolder)) { + fs.mkdirSync(tempFolder, { recursive: true }); + } + return tempFolder; + } + + async run(): Promise { + const componentsOutput: BundlerResult[] = []; + const targets = this.options.bundlerContext.targets; + const startTime = Date.now(); + const longProcessLogger = this.logger.createLongProcessLogger('Running Angular ESBuild bundler', targets.length); + // this.logger.console('bundling components'); + + for (const target of targets) { + const components = this.options.bundlerContext.components; + const ids = components.map(component => component.id.toString()).join(', '); + + const fullMessage = `on ${components.length} component${components.length > 1 ? 's' : ''}`; + longProcessLogger.logProgress(fullMessage); + // this.logger.console(fullMessage); + this.logger.debug(`${fullMessage}\ncomponents ids: ${ids}`); + + const output: Pick = { + assets: [], + assetsByChunkName: {}, + entriesAssetsMap: {}, }; - const viteConfig: ViteBundlerOptions = { - bundlerContext: options.context as BundlerContext, - name: options.name, - resolveHostAlias: true, - transformers: [transformer, ...options.transformers ?? []] + // const tempFolder = this.getTempFolder(this.idName); + const tempFolder = target.outputPath; + const entries = fixEntries(tempFolder, target.entries as string[]); + const mainEntryFile = generateMainEntryFile(this.options.appRootPath, tempFolder, [...entries, resolve(join(this.options.appRootPath, 'src', 'main'))]); + + const angularOptions: ApplicationInternalOptions = { + baseHref: `./`, + optimization: false, + outputHashing: OutputHashing.None, + browser: mainEntryFile, + index: './src/index.html', + tsConfig: 'tsconfig.app.json', + assets: ['./src/favicon.ico', './src/assets'], + styles: ['./src/styles.scss'], + inlineStyleLanguage: "scss", + ssr: false, + // Disable the progress reporting with a loading spinner from Angular + progress: false }; - return ViteBundler.from(viteConfig)(context); + const appTsconfigPath = join(this.options.appRootPath, angularOptions.tsConfig); + const tsconfigPath = normalizePath(join(tempFolder, `tsconfig/tsconfig-${Date.now()}.json`)); + generateAppTsConfig(components, this.options.appRootPath, appTsconfigPath, tsconfigPath, this.depsResolver, this.workspace, [mainEntryFile], this.devFilesMain); + + const publicPath = join(target.outputPath, 'public'); + const results = await buildApplication({ + angularOptions: { + ...angularOptions, + tsConfig: tsconfigPath + }, + outputPath: publicPath, + sourceRoot: this.options.sourceRoot || 'src', + workspaceRoot: this.options.appRootPath, + logger: this.logger, + tempFolder: tempFolder, + isPreview: true + }); + + // Angular outputs the files into the public/browser folder, we need to move them to the root of the public folder + for(const file of fs.readdirSync(join(publicPath, 'browser'))) { + fs.moveSync(join(publicPath, 'browser', file), join(publicPath, file)); + } + // remove the browser folder + fs.removeSync(join(publicPath, 'browser')); + + const endTime = Date.now(); + + componentsOutput.push({ + components, + outputPath: join(target.outputPath, 'public'), + ...output, + errors: results.filter(result => !!result.error).map(result => result.error), + warnings: [], + startTime, + endTime, + } as any as BundlerResult); + } + + longProcessLogger.end(); + + return componentsOutput; + } + + static from(options: NgViteOptions & { bundlerContext: BundlerContext }): AsyncEnvHandler { + return async (context: EnvContext): Promise => { + const name = options.name || DEFAULT_SERVER_NAME; + const logger = context.createLogger(name); + const depsResolver = context.getAspect(DependencyResolverAspect.id); + const devFilesMain = context.getAspect(DevFilesAspect.id); + const preview = context.getAspect(DevFilesAspect.id); + const workspace = getWorkspace(context); + + return new NgViteBundler(name, options, logger, depsResolver, devFilesMain, workspace); }; } } diff --git a/angular/devkit/vite/ng-vite.dev-server.ts b/angular/devkit/vite/ng-vite.dev-server.ts index 9c5725f2..85809179 100644 --- a/angular/devkit/vite/ng-vite.dev-server.ts +++ b/angular/devkit/vite/ng-vite.dev-server.ts @@ -1,40 +1,106 @@ +import { OutputHashing } from '@angular-devkit/build-angular'; +import { + ApplicationInternalOptions, + type DevServerOptions, + getWorkspace, + normalizePath +} from "@bitdev/angular.dev-services.common"; import type { DevServer, DevServerContext } from '@teambit/bundler'; +import { DependencyResolverAspect, DependencyResolverMain } from '@teambit/dependency-resolver'; +import { DevFilesAspect, DevFilesMain } from "@teambit/dev-files"; import type { AsyncEnvHandler, EnvContext } from '@teambit/envs'; -import { ViteDevServer, ViteDevServerOptions } from '@teambit/vite.vite-dev-server'; -import { configFactory } from './config.factory'; -import { NgViteOptions } from './utils/types'; +import { Logger } from '@teambit/logger'; +import { findScopePath } from '@teambit/scope.modules.find-scope-path'; +import { Port } from '@teambit/toolbox.network.get-port'; +import type { Workspace } from '@teambit/workspace'; +import fs from "fs-extra"; +import { Server } from 'http'; +import assert from "node:assert"; +import { join, resolve } from "path"; +import { serveApplication } from "./application.dev-server.js"; +import { NgViteOptions } from './utils/types.js'; +import { fixEntries, generateAppTsConfig, generateMainEntryFile, getEnvFile } from "./utils/utils.js"; -// Extracted constant const DEFAULT_SERVER_NAME = 'ng-vite-dev-server'; -export class NgViteDevServer { - static from(options: NgViteOptions & { context: DevServerContext }): AsyncEnvHandler { - return async(context: EnvContext): Promise => { - options.name = options.name || DEFAULT_SERVER_NAME; - const logger = context.createLogger(options.name); - const workspace = context.getAspect('teambit.workspace/workspace'); +export class NgViteDevServer implements DevServer { + idName: string; - const ngConfig = await configFactory(options, { logger, workspace }); + constructor( + public id: string, + private options: NgViteOptions & { devServerContext: DevServerContext }, + private logger: Logger, + private depsResolver: DependencyResolverMain, + private devFilesMain: DevFilesMain, + private workspace?: Workspace + ) { + this.idName = `bitdev.angular/${this.id}`; + } + + private getTempFolder(idName: string, path = process.cwd()): string { + const scopePath = findScopePath(path); + assert(scopePath, `Unable to find scope path`); + const tempFolder = join(scopePath, 'tmp', 'preview-entries', idName); + + if (!fs.existsSync(tempFolder)) { + fs.mkdirSync(tempFolder, { recursive: true }); + } + return tempFolder; + } + + async listen(port: number): Promise { + assert(this.workspace, 'Workspace is not defined'); + const tempFolder = this.getTempFolder(this.idName, this.workspace.path); + const entries = fixEntries(tempFolder, this.options.devServerContext.entry); + const mainEntryFile = generateMainEntryFile(this.options.appRootPath, tempFolder, [...entries, resolve(join(this.options.appRootPath, 'src', 'main'))]); - // @ts-ignore - function transformer(config: any, vite: typeof import('vite')): any { - return vite.mergeConfig(config, ngConfig); + const angularOptions: ApplicationInternalOptions & DevServerOptions = { + baseHref: `/${this.options.devServerContext.rootPath}/`, + optimization: false, + outputHashing: OutputHashing.None, + browser: mainEntryFile, + index: './src/index.html', + tsConfig: 'tsconfig.app.json', + assets: ['./src/favicon.ico', './src/assets'], + styles: ['./src/styles.scss'], + inlineStyleLanguage: "scss", + buildTarget: 'development', + progress: false + }; + const envVars = await getEnvFile('development', this.options.appRootPath); + const appTsconfigPath = join(this.options.appRootPath, angularOptions.tsConfig); + const tsconfigPath = normalizePath(join(tempFolder, `tsconfig/tsconfig-${Date.now()}.json`)); + const workspaceCmpsIDs = this.workspace.listIds(); + const components = await this.workspace.getMany(workspaceCmpsIDs); + generateAppTsConfig(components, this.options.appRootPath, appTsconfigPath, tsconfigPath, this.depsResolver, this.workspace, [mainEntryFile], this.devFilesMain); + + // The returned Server is never used, so we can safely ignore the return type + return await serveApplication({ + angularOptions: { + ...angularOptions, + tsConfig: tsconfigPath + }, + sourceRoot: 'src', + workspaceRoot: this.options.appRootPath, + port: port || (await Port.getPortFromRange([3000, 4000])), + logger: this.logger, + tempFolder: tempFolder, + isPreview: true, + envVars: { + process: { env: envVars } } + }) as any as Server; + } + + static from(options: NgViteOptions & { devServerContext: DevServerContext }): AsyncEnvHandler { + return async (context: EnvContext): Promise => { + const name = options.name || DEFAULT_SERVER_NAME; + const logger = context.createLogger(name); + const depsResolver = context.getAspect(DependencyResolverAspect.id); + const devFilesMain = context.getAspect(DevFilesAspect.id); + const workspace = getWorkspace(context); - const viteConfig: ViteDevServerOptions = { - define: ngConfig.define, - devServerContext: options.context as DevServerContext, - name: options.name, - optimizeEntries: options.optimizeEntries as any, - plugins: ngConfig.plugins as any, - resolveHostAlias: true, - // Improved readability for transformers array - transformers: [ - transformer, ...(options.transformers ?? []) - ] - }; - - return ViteDevServer.from(viteConfig)(context); + return new NgViteDevServer(name, options, logger, depsResolver, devFilesMain, workspace); }; } } diff --git a/angular/devkit/vite/plugins/dedupe.plugin.ts b/angular/devkit/vite/plugins/dedupe.plugin.ts new file mode 100644 index 00000000..e10c1ce9 --- /dev/null +++ b/angular/devkit/vite/plugins/dedupe.plugin.ts @@ -0,0 +1,47 @@ +import { Plugin, PluginBuild, ResolveResult } from 'esbuild'; + +const DEDUPE_PACKAGE_RESOLUTION = Symbol('DEDUPE_PACKAGE_RESOLUTION'); +const resolvedPaths = new Map>(); + +function toESBuildFilter(packages: string[] = ['@angular/', '@ngrx/', 'apollo-angular']): RegExp { + const patterns = packages.map((pkg) => pkg.replace(/\//g, '[\\/]')); + const conditionalPatterns = patterns.join('|'); + return new RegExp(`^(${ conditionalPatterns })`); +} + +/** + * Creates a plugin that stores the first resolved path and returns it on subsequent requests, + * effectively deduping packages. + */ +export default function dedupePlugin(options?: { packages?: string[] }): Plugin { + const pattern = toESBuildFilter(options?.packages); + return { + name: 'dedupe-packages', + setup(build: PluginBuild) { + // Only attempt resolve of Angular packages for now + build.onResolve({ filter: pattern }, async args => { + if (args.pluginData?.[DEDUPE_PACKAGE_RESOLUTION]) { + return null; + } + if (resolvedPaths?.has(args.path)) { + return resolvedPaths.get(args.path); + } + + const { importer, kind, resolveDir, namespace, pluginData = {} } = args; + pluginData[DEDUPE_PACKAGE_RESOLUTION] = true; + + const result = build.resolve(args.path, { + importer, + kind, + namespace, + pluginData, + resolveDir, + }); + + resolvedPaths.set(args.path, result); + + return result; + }); + }, + }; +} diff --git a/angular/app-types/angular-app-type/plugins/define.plugin.ts b/angular/devkit/vite/plugins/define.plugin.ts similarity index 88% rename from angular/app-types/angular-app-type/plugins/define.plugin.ts rename to angular/devkit/vite/plugins/define.plugin.ts index 31e0cecc..43c7109f 100644 --- a/angular/app-types/angular-app-type/plugins/define.plugin.ts +++ b/angular/devkit/vite/plugins/define.plugin.ts @@ -1,4 +1,4 @@ -import { Plugin, PluginBuild } from 'esbuild'; +import { PluginBuild } from 'esbuild'; import { merge } from 'lodash-es'; export const stringifyDefine = (define: any) => { @@ -16,9 +16,8 @@ export default function(defineValues: any = {}) { // set variables on global so that they also work during ssr merge(global, defineValues); - const plugin: Plugin = { - name: 'env', - + return { + name: 'env-define', setup(build: PluginBuild) { const { platform, define = {} } = build.initialOptions; if (platform === 'node') { @@ -35,6 +34,4 @@ export default function(defineValues: any = {}) { }; } }; - - return plugin; } diff --git a/angular/devkit/vite/plugins/index-file/augment-index-html.ts b/angular/devkit/vite/plugins/index-file/augment-index-html.ts deleted file mode 100644 index d11a263f..00000000 --- a/angular/devkit/vite/plugins/index-file/augment-index-html.ts +++ /dev/null @@ -1,276 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import { loadEsmModule } from '@bitdev/angular.dev-services.common'; -import assert from 'assert'; -import { extname } from 'path'; -import { htmlRewritingStream } from './html-rewriting-stream'; -import { EntryPointsType } from './package-chunk-sort'; - -export type CrossOriginValue = 'none' | 'anonymous' | 'use-credentials'; - -export interface AugmentIndexHtmlOptions { - /* Input contents */ - html: string; - baseHref?: string; - deployUrl?: string; - /** crossorigin attribute setting of elements that provide CORS support */ - crossOrigin?: CrossOriginValue; - /** Used to sort the insertion of files in the HTML file */ - entrypoints: EntryPointsType[]; - /** Used to set the document default locale */ - lang?: string; - hints?: { url: string; mode: string; as?: string }[]; -} - -function isString(value: unknown): value is string { - return typeof value === 'string'; -} - -async function getLanguageDirectionFromLocales(locale: string): Promise { - try { - const localeData = ( - await loadEsmModule( - `@angular/common/locales/${locale}`, - ) - ).default; - - const dir = localeData[localeData.length - 2]; - - return isString(dir) ? dir : undefined; - } catch { - // In some cases certain locales might map to files which are named only with language id. - // Example: `en-US` -> `en`. - const [languageId] = locale.split('-', 1); - if (languageId !== locale) { - return getLanguageDirectionFromLocales(languageId); - } - } - - return undefined; -} - -async function getLanguageDirection( - locale: string, - warnings: string[], -): Promise { - const dir = await getLanguageDirectionFromLocales(locale); - - if (!dir) { - warnings.push( - `Locale data for '${locale}' cannot be found. 'dir' attribute will not be set for this locale.`, - ); - } - - return dir; -} - -function updateAttribute( - tag: { attrs: { name: string; value: string }[] }, - name: string, - value: string, -): void { - const index = tag.attrs.findIndex((a) => a.name === name); - const newValue = { name, value }; - - if (index === -1) { - tag.attrs.push(newValue); - } else { - // eslint-disable-next-line no-param-reassign - tag.attrs[index] = newValue; - } -} - -/* - * Helper function used by the IndexHtmlWebpackPlugin. - * Can also be directly used by builder, e.g. in order to generate an index.html - * after processing several configurations in order to build different sets of - * bundles for differential serving. - */ -export async function augmentIndexHtml( - params: AugmentIndexHtmlOptions, -): Promise<{ content: string; warnings: string[]; errors: string[] }> { - const { entrypoints, deployUrl = '', lang, baseHref, html } = params; - - const warnings: string[] = []; - const errors: string[] = []; - - const { crossOrigin = 'none' } = params; - - const stylesheets = new Set(); - const scripts = new Map(); - - // Sort files in the order we want to insert them by entrypoint - // eslint-disable-next-line no-restricted-syntax - for (const [file, isModule] of entrypoints) { - const extension = extname(file); - if (scripts.has(file) || stylesheets.has(file)) { - // eslint-disable-next-line no-continue - continue; - } - - switch (extension) { - case '.js': - case '.jsx': - case '.ts': - case '.tsx': - default: - // Also, non entrypoints need to be loaded as no module as they can contain problematic code. - scripts.set(file, isModule); - break; - case '.mjs': - case '.mts': - // It would be very confusing to link an `*.mjs` file in a non-module script context, - // so we disallow it entirely. - assert(isModule, '`.mjs` & `.mts` files *must* set `isModule` to `true`.'); - scripts.set(file, true /* isModule */); - break; - case '.css': - case '.scss': - case '.sass': - case '.less': - stylesheets.add(file); - break; - } - } - - let scriptTags: string[] = []; - // eslint-disable-next-line no-restricted-syntax - for (const [src, isModule] of scripts) { - const attrs = [`src="${deployUrl}${src}"`]; - - // This is also need for non-entry-points as they may contain problematic code. - if (isModule) { - attrs.push('type="module"'); - } else { - attrs.push('defer'); - } - - if (crossOrigin !== 'none') { - attrs.push(`crossorigin="${crossOrigin}"`); - } - - scriptTags.push(``); - } - - let linkTags: string[] = []; - // eslint-disable-next-line no-restricted-syntax - for (const src of stylesheets) { - const attrs = [`rel="stylesheet"`, `href="${deployUrl}${src}"`]; - - if (crossOrigin !== 'none') { - attrs.push(`crossorigin="${crossOrigin}"`); - } - - linkTags.push(``); - } - - if (params.hints?.length) { - // eslint-disable-next-line no-restricted-syntax - for (const hint of params.hints) { - const attrs = [`rel="${hint.mode}"`, `href="${deployUrl}${hint.url}"`]; - - if (hint.mode !== 'modulepreload' && crossOrigin !== 'none') { - // Value is considered anonymous by the browser when not present or empty - attrs.push(crossOrigin === 'anonymous' ? 'crossorigin' : `crossorigin="${crossOrigin}"`); - } - - if (hint.mode === 'preload' || hint.mode === 'prefetch') { - switch (extname(hint.url)) { - case '.js': - attrs.push('as="script"'); - break; - case '.css': - attrs.push('as="style"'); - break; - default: - if (hint.as) { - attrs.push(`as="${hint.as}"`); - } - break; - } - } - - linkTags.push(``); - } - } - - const dir = lang ? await getLanguageDirection(lang, warnings) : undefined; - const { rewriter, transformedContent } = await htmlRewritingStream(html); - const baseTagExists = html.includes(' { - // eslint-disable-next-line default-case - switch (tag.tagName) { - case 'html': - // Adjust document locale if specified - if (isString(lang)) { - updateAttribute(tag, 'lang', lang); - } - - if (dir) { - updateAttribute(tag, 'dir', dir); - } - break; - case 'head': - // Base href should be added before any link, meta tags - if (!baseTagExists && isString(baseHref)) { - rewriter.emitStartTag(tag); - rewriter.emitRaw(``); - - return; - } - break; - case 'base': - // Adjust base href if specified - if (isString(baseHref)) { - updateAttribute(tag, 'href', baseHref); - } - break; - } - - rewriter.emitStartTag(tag); - }) - .on('endTag', (tag) => { - // eslint-disable-next-line default-case - switch (tag.tagName) { - case 'head': - // eslint-disable-next-line no-restricted-syntax - for (const linkTag of linkTags) { - rewriter.emitRaw(linkTag); - } - - linkTags = []; - break; - case 'body': - // Add script tags - // eslint-disable-next-line no-restricted-syntax - for (const scriptTag of scriptTags) { - rewriter.emitRaw(scriptTag); - } - - scriptTags = []; - break; - } - - rewriter.emitEndTag(tag); - }); - - const content = await transformedContent(); - - return { - content: - linkTags.length || scriptTags.length - ? // In case no body/head tags are not present (dotnet partial templates) - linkTags.join('') + scriptTags.join('') + content - : content, - warnings, - errors, - }; -} diff --git a/angular/devkit/vite/plugins/index-file/html-rewriting-stream.ts b/angular/devkit/vite/plugins/index-file/html-rewriting-stream.ts deleted file mode 100644 index 6b1ec1c3..00000000 --- a/angular/devkit/vite/plugins/index-file/html-rewriting-stream.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import { Readable, Writable } from 'stream'; -import { loadEsmModule } from '@bitdev/angular.dev-services.common'; - -export async function htmlRewritingStream(content: string): Promise<{ - rewriter: import('parse5-html-rewriting-stream').RewritingStream; - transformedContent: () => Promise; -}> { - const { RewritingStream } = await loadEsmModule( - 'parse5-html-rewriting-stream', - ); - const chunks: Buffer[] = []; - const rewriter = new RewritingStream(); - - return { - rewriter, - transformedContent: () => { - return new Promise((resolve) => { - new Readable({ - encoding: 'utf8', - read(): void { - this.push(Buffer.from(content)); - this.push(null); - }, - }) - .pipe(rewriter) - .pipe( - new Writable({ - write( - chunk: string | Buffer, - encoding: string | undefined, - callback: Function, - ): void { - chunks.push( - typeof chunk === 'string' - ? Buffer.from(chunk, encoding as BufferEncoding) - : chunk, - ); - callback(); - }, - final(callback: (error?: Error) => void): void { - callback(); - resolve(Buffer.concat(chunks).toString()); - }, - }), - ); - }); - }, - }; -} diff --git a/angular/devkit/vite/plugins/index-file/index-html-generator.ts b/angular/devkit/vite/plugins/index-file/index-html-generator.ts deleted file mode 100644 index 3330f4d5..00000000 --- a/angular/devkit/vite/plugins/index-file/index-html-generator.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import * as fs from 'fs'; -import { join } from 'path'; -import { EntryPointsType } from './package-chunk-sort'; -import { stripBom } from './strip-bom'; -import { CrossOriginValue, augmentIndexHtml } from './augment-index-html'; - -type IndexHtmlGeneratorPlugin = ( - html: string, - options: IndexHtmlGeneratorProcessOptions, -) => Promise; - -export type HintMode = 'prefetch' | 'preload' | 'modulepreload' | 'preconnect' | 'dns-prefetch'; - -export interface IndexHtmlGeneratorProcessOptions { - lang: string | undefined; - baseHref: string | undefined; - hints?: { url: string; mode: HintMode; as?: string }[]; -} - -export interface IndexHtmlGeneratorOptions { - rootPath: string; - indexPath: string; - deployUrl?: string; - entrypoints: EntryPointsType[]; - crossOrigin?: CrossOriginValue; -} - -export interface IndexHtmlTransformResult { - content: string; - warnings: string[]; - errors: string[]; -} - -function augmentIndexHtmlPlugin(generator: IndexHtmlGenerator): IndexHtmlGeneratorPlugin { - const { deployUrl, crossOrigin, entrypoints } = generator.options; - - return async (html, options) => { - const { lang, baseHref, hints } = options; - - return augmentIndexHtml({ - html, - baseHref, - deployUrl, - crossOrigin, - lang, - entrypoints, - hints, - }); - }; -} - -export class IndexHtmlGenerator { - private readonly plugins: IndexHtmlGeneratorPlugin[]; - - constructor(readonly options: IndexHtmlGeneratorOptions) { - this.plugins = [ - augmentIndexHtmlPlugin(this) - ]; - } - - async process(options: IndexHtmlGeneratorProcessOptions): Promise { - let content = stripBom(await this.readIndex(join(this.options.rootPath, this.options.indexPath))); - const warnings: string[] = []; - const errors: string[] = []; - - // eslint-disable-next-line no-restricted-syntax - for (const plugin of this.plugins) { - // eslint-disable-next-line no-await-in-loop - const result = await plugin(content, options); - if (typeof result === 'string') { - content = result; - } else { - content = result.content; - - if (result.warnings.length) { - warnings.push(...result.warnings); - } - - if (result.errors.length) { - errors.push(...result.errors); - } - } - } - - return { - content, - warnings, - errors, - }; - } - - protected async readIndex(path: string): Promise { - return fs.promises.readFile(path, 'utf-8'); - } -} diff --git a/angular/devkit/vite/plugins/index-file/package-chunk-sort.ts b/angular/devkit/vite/plugins/index-file/package-chunk-sort.ts deleted file mode 100644 index d8ca0db4..00000000 --- a/angular/devkit/vite/plugins/index-file/package-chunk-sort.ts +++ /dev/null @@ -1,89 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import {parse} from 'path'; -// import { ScriptElement, StyleElement } from '@angular-devkit/build-angular/src/builders/browser/schema'; -import type { BrowserBuilderOptions } from '@bitdev/angular.dev-services.ng-compat'; - -export type EntryPointsType = [name: string, isModule: boolean, inject: boolean]; - -type Flatten = T extends any[] ? T[number] : T; -export type ScriptElement = NonNullable>; -export type StyleElement = NonNullable>; - -export type NormalizedEntryPoint = Required>; - -export function normalizeExtraEntryPoints( - extraEntryPoints: (ScriptElement | StyleElement)[], - defaultBundleName: string, -): NormalizedEntryPoint[] { - return extraEntryPoints.map((entry) => { - if(!entry) { - throw new Error('Empty entry point found.'); - } - - if (typeof entry === 'string') { - return { input: entry || '', inject: true, bundleName: defaultBundleName }; - } - - const { inject = true, ...newEntry } = entry; - let bundleName; - if (entry.bundleName) { - bundleName = entry.bundleName; - } else if (!inject) { - // Lazy entry points use the file name as bundle name. - bundleName = parse(entry.input).name; - } else { - bundleName = defaultBundleName; - } - - return { ...newEntry, inject, bundleName }; - }); -} - -export function generateEntryPoints(options: { - main: string; - polyfills?: string[] | string; - styles: StyleElement[]; - scripts: ScriptElement[]; - isHMREnabled?: boolean; -}): EntryPointsType[] { - // Add all styles/scripts, except lazy-loaded ones. - const extraEntryPoints = ( - eePoints: (ScriptElement | StyleElement)[], - defaultBundleName: string, - ) => { - const entryPoints = normalizeExtraEntryPoints(eePoints, defaultBundleName) - .filter((entry) => entry.inject) - .map((entry) => entry.input); - - // remove duplicates - return [...new Set(entryPoints)].map((f) => [f, defaultBundleName === 'scripts', defaultBundleName === 'scripts']); - }; - - let polyfills: EntryPointsType[] = []; - if(options.polyfills) { - polyfills = Array.isArray(options.polyfills) ? options.polyfills.map((p: string) => [p, true, false]) : [[options.polyfills, true, false]]; - } - const entryPoints: EntryPointsType[] = [ - ...polyfills, - ...extraEntryPoints(options.styles, 'styles'), - ...extraEntryPoints(options.scripts, 'scripts'), - [options.main, true, false], - ]; - - const duplicates = entryPoints.filter( - ([name]) => entryPoints[0].indexOf(name) !== entryPoints[0].lastIndexOf(name), - ); - - if (duplicates.length > 0) { - throw new Error(`Multiple bundles have been named the same: '${duplicates.join(`', '`)}'.`); - } - - return entryPoints; -} diff --git a/angular/devkit/vite/plugins/index-file/strip-bom.ts b/angular/devkit/vite/plugins/index-file/strip-bom.ts deleted file mode 100644 index f6ed209f..00000000 --- a/angular/devkit/vite/plugins/index-file/strip-bom.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -// Strip BOM from file data. -// https://stackoverflow.com/questions/24356713 -export function stripBom(data: string) { - return data.replace(/^\uFEFF/, ''); -} diff --git a/angular/devkit/vite/plugins/index-html.plugin.ts b/angular/devkit/vite/plugins/index-html.plugin.ts deleted file mode 100644 index 2a96e027..00000000 --- a/angular/devkit/vite/plugins/index-html.plugin.ts +++ /dev/null @@ -1,79 +0,0 @@ -import type { ServerResponse } from 'http'; -import memoize from 'memoizee'; -// @ts-ignore -import type { Connect, Plugin, ViteDevServer } from 'vite'; -import { ApplicationOptions } from '@bitdev/angular.dev-services.common'; -import { IndexHtmlGenerator } from './index-file/index-html-generator'; -import { generateEntryPoints } from './index-file/package-chunk-sort'; -import assert from 'assert'; - -export function getIndexInputFile(index: ApplicationOptions['index']): string { - assert(index, 'No index file provided'); - if (typeof index === 'string') { - return index; - } - return (index as any).input; -} - -const cleanUrl = (url: string) => url.replace(/#.*$/s, '').replace(/\?.*$/s, ''); - -async function genHtml(options: Partial, rootPath: string, indexPath: string) { - assert(options.browser, 'No main file provided'); - const entrypoints = generateEntryPoints({ - main: options.browser, - polyfills: options.polyfills ?? [], - scripts: options.scripts ?? [], - styles: options.styles ?? [] - }); - - const indexHtmlGenerator = new IndexHtmlGenerator({ - rootPath, - indexPath, - entrypoints, - crossOrigin: options.crossOrigin - }); - - const { content, warnings, errors } = await indexHtmlGenerator.process({ - baseHref: options.baseHref ?? './', - // i18nLocale is used when Ivy is disabled - lang: undefined - }); - - if (warnings.length) { - // eslint-disable-next-line no-console - warnings.forEach((warning) => console.warn(warning)); - } - - if (errors.length) { - throw new Error(`Index html generation failed: ${errors.join(', ')}`); - } - - return content; -}; - -const memoized = memoize(genHtml); - -export const htmlPlugin = (options: Partial, rootPath: string, indexPath: string, ssr: boolean): Plugin => { - return { - name: 'ng-vite-html-plugin', - configureServer(server: ViteDevServer) { - return (): void => { - // if(ssr) { - // return; - // } - server.middlewares.use(async(req: Connect.IncomingMessage, res: ServerResponse, next: Connect.NextFunction) => { - const url = req.url && cleanUrl(req.url); - if (url?.endsWith('.html')) { - res.statusCode = 200; - res.setHeader('Content-Type', 'text/html'); - let html = await memoized(options, rootPath, indexPath); - html = await server.transformIndexHtml(indexPath, html, req.originalUrl); - res.end(html); - return; - } - next(); - }); - }; - } - }; -}; diff --git a/angular/devkit/vite/plugins/md.plugin.ts b/angular/devkit/vite/plugins/md.plugin.ts new file mode 100644 index 00000000..d22d3a5b --- /dev/null +++ b/angular/devkit/vite/plugins/md.plugin.ts @@ -0,0 +1,37 @@ +import markdoc from '@markdoc/markdoc'; +import { Plugin, PluginBuild } from 'esbuild'; +import { promises } from 'fs'; + +/** + * This plugin uses build.onLoad to intercept .md filenames. + * These files are then read from disk and parsed by remark. + * @returns An esbuild plugin. + */ +export default function () { + const plugin: Plugin = { + name: 'md-loader', + + setup(build: PluginBuild) { + // intercept .md files + build.onResolve({ filter: /\.md$/ }, args => { + return { + path: args.path, + namespace: 'md-ns', + } + }); + + build.onLoad({ filter: /.*/, namespace: 'md-ns' }, async args => { + const data = await promises.readFile(args.path, 'utf8'); + const ast = markdoc.parse(data); + const content = markdoc.transform(ast, {}); + const html = markdoc.renderers.html(content); + return { + contents: html, + loader: 'text', + }; + }) + } + }; + + return plugin; +} diff --git a/angular/devkit/vite/plugins/server-entry.plugin.ts b/angular/devkit/vite/plugins/server-entry.plugin.ts deleted file mode 100644 index fb998fe2..00000000 --- a/angular/devkit/vite/plugins/server-entry.plugin.ts +++ /dev/null @@ -1,113 +0,0 @@ -// // SSR dev server, middleware and error page source modified from -// // https://github.com/solidjs/solid-start/blob/main/packages/start/dev/server.js -// -// import { Connect, Plugin, ViteDevServer } from 'vite'; -// import * as path from 'path'; -// import * as fs from 'fs'; -// -// interface ServerOptions { -// indexPath?: string; -// entryServer?: string; -// } -// -// export function devServerPlugin(options: ServerOptions): Plugin { -// const entryServer = options.entryServer || 'src/main.server.ts'; -// const index = options.indexPath || 'index.html'; -// -// return { -// name: 'ng-vite-server-entry-plugin', -// config() { -// return { -// resolve: { -// alias: { -// '~ng-vite/main-server': entryServer, -// }, -// }, -// }; -// }, -// configureServer(viteServer) { -// return async () => { -// remove_html_middlewares(viteServer.middlewares); -// viteServer.middlewares.use(async (req, res) => { -// let template = fs.readFileSync( -// path.resolve(viteServer.config.root, index), -// 'utf-8' -// ); -// -// template = await viteServer.transformIndexHtml( -// req.originalUrl as string, -// template -// ); -// -// console.log(template); -// -// try { -// const entryServer = ( -// await viteServer.ssrLoadModule('~ng-vite/main-server') -// )['default']; -// const result = await entryServer(req.originalUrl, template); -// console.log(result); -// -// res.setHeader('Content-Type', 'text/html'); -// res.end(result); -// } catch (e) { -// viteServer && viteServer.ssrFixStacktrace(e as Error); -// res.statusCode = 500; -// res.end(` -// -// -// -// -// Error -// -// -// -// -// -// `); -// } -// }); -// }; -// }, -// }; -// } -// -// /** -// * Removes Vite internal middleware -// * -// * @param server -// */ -// function remove_html_middlewares(server: ViteDevServer['middlewares']) { -// const html_middlewares = [ -// 'viteIndexHtmlMiddleware', -// 'vite404Middleware', -// 'viteSpaFallbackMiddleware', -// ]; -// for (let i = server.stack.length - 1; i > 0; i--) { -// // @ts-ignore -// if (html_middlewares.includes(server.stack[i].handle.name)) { -// server.stack.splice(i, 1); -// } -// } -// } -// -// /** -// * Formats error for SSR message in error overlay -// * @param req -// * @param error -// * @returns -// */ -// function prepareError(req: Connect.IncomingMessage, error: unknown) { -// const e = error as Error; -// return { -// message: `An error occured while server rendering ${req.url}:\n\n\t${ -// typeof e === 'string' ? e : e.message -// } `, -// stack: typeof e === 'string' ? '' : e.stack, -// }; -// } diff --git a/angular/app-types/angular-app-type/runtime/api-middleware.js b/angular/devkit/vite/runtime/api-middleware.js similarity index 100% rename from angular/app-types/angular-app-type/runtime/api-middleware.js rename to angular/devkit/vite/runtime/api-middleware.js diff --git a/angular/app-types/angular-app-type/runtime/renderer.js b/angular/devkit/vite/runtime/renderer.js similarity index 100% rename from angular/app-types/angular-app-type/runtime/renderer.js rename to angular/devkit/vite/runtime/renderer.js diff --git a/angular/devkit/vite/utils/host-alias.ts b/angular/devkit/vite/utils/host-alias.ts deleted file mode 100644 index 22dd5331..00000000 --- a/angular/devkit/vite/utils/host-alias.ts +++ /dev/null @@ -1,58 +0,0 @@ -// @ts-nocheck - -import findRoot from 'find-root'; -import type { Alias } from 'vite'; -import type {BundlerContext, DevServerContext} from '@teambit/bundler'; - -export type ViteContext = { - /** - * A path for the host root dir - * Host root dir is usually the env root dir - * This can be used in different bundle options which run require.resolve - * for example when configuring webpack aliases or webpack expose loader on the peers deps - */ - hostRootDir?: string; - /** - * Array of host dependencies, they are used later in case you use one of the following: - * - */ - hostDependencies?: string[]; - /** - * Make the hostDependencies externals. externals (from webpack docs): - * The externals configuration option provides a way of excluding dependencies from the output bundles. - * Instead, the created bundle relies on that dependency to be present in the consumer's (any end-user application) environment. - */ - externalizeHostDependencies?: boolean; - /** - * Make aliases for the hostDependencies. - * the path of each one will be resolved by [hostRootDir, process.cwd(), __dirname] - * this will usually replace the instance of import one of the host dependencies by the instance of the env provided it - */ - aliasHostDependencies?: boolean; -}; - -export function getHostAlias(context: BundlerContext | DevServerContext): [] { - const alias: Alias[] = []; - const { hostDependencies: deps, aliasHostDependencies, hostRootDir } = context; - if (deps && aliasHostDependencies) { - deps.forEach(dep => { - let resolved: string; - try { - resolved = require.resolve(dep, { paths: [hostRootDir, process.cwd(), __dirname] }); - const folder = findRoot(resolved); - alias.push({ - find: dep, - replacement: folder - }) - } catch (e) { - if (resolved) { - alias.push({ - find: dep, - replacement: resolved - }) - } - } - }) - } - return alias; -} diff --git a/angular/devkit/vite/utils/types.ts b/angular/devkit/vite/utils/types.ts index ac8b517e..dc59d433 100644 --- a/angular/devkit/vite/utils/types.ts +++ b/angular/devkit/vite/utils/types.ts @@ -1,13 +1,4 @@ -import { ApplicationOptions, DevServerOptions } from '@bitdev/angular.dev-services.common'; -import { Logger } from '@teambit/logger'; -import type { ViteDevServerOptions } from '@teambit/vite.vite-dev-server'; -import { Workspace } from '@teambit/workspace'; - - -export type ViteAspectsContext = { - logger: Logger; - workspace: Workspace; -}; +import { ApplicationOptions, BrowserOptions, DevServerOptions } from '@bitdev/angular.dev-services.common'; export enum BuildMode { Development = 'development', @@ -15,17 +6,12 @@ export enum BuildMode { } export type NgViteOptions = { - angularOptions: Partial; + angularOptions: any;//Partial<(BrowserOptions | ApplicationOptions) & DevServerOptions>; /** name of the dev server */ name?: string; - // TODO: fix type once we can support preview with vite - /** list of transformers to modify Vite config in an advanced way */ - transformers?: ViteDevServerOptions['transformers']; - - /** optimize entries before passing them to Vite */ - optimizeEntries?: (entries: string[], context: ViteAspectsContext) => string[]; + appRootPath: string; /** Output folder path for build files */ outputPath?: string; diff --git a/angular/devkit/vite/utils/utils.ts b/angular/devkit/vite/utils/utils.ts index 1251c9fe..11f68ecd 100644 --- a/angular/devkit/vite/utils/utils.ts +++ b/angular/devkit/vite/utils/utils.ts @@ -1,21 +1,160 @@ -import * as path from 'path'; +import { ApplicationOptions, normalizePath } from "@bitdev/angular.dev-services.common"; +import { Component } from '@teambit/component'; +import { DependencyResolverMain } from '@teambit/dependency-resolver'; +import { DevFilesMain } from '@teambit/dev-files'; +import { TesterAspect } from '@teambit/tester'; +import { Workspace } from '@teambit/workspace'; +import assert from 'assert'; +import fs from "fs-extra"; +import { flatten } from 'lodash-es'; +import objectHash from "object-hash"; +import { basename, dirname, isAbsolute, join, relative } from "path"; +import ts from 'typescript'; -function removeWindowsDriveLetter(osSpecificPath: string): string { - return osSpecificPath.replace(/^[A-Z]:/, ''); + +const writeHash = new Map(); +export const ENTRY_REGEXP = new RegExp(/(import\s.*['"])(.*)(@teambit(\/|\\\\).*['"];)/gm); +export interface JsonObject { + [prop: string]: any; +} + +export function generateMainEntryFile(appRootPath: string, tempFolder: string, entryPoints: string[]): string { + const entryFileContent = entryPoints.map(entry => `import './${normalizePath(relative(tempFolder, entry.endsWith('.ts') ? entry.replace(/\.ts$/, '') : entry))}';`).join('\n'); + const entryFile = join(tempFolder, `main-${Date.now()}.ts`); + fs.outputFileSync(entryFile, entryFileContent); + return normalizePath(relative(appRootPath, entryFile)); } /** - * Coverts an os specific path to a unix style path. Use this when writing paths to config files. - * This should not be used to read files on disk because of the removal of Windows drive letters. + * We need to move the entries to `.git/bit/tmp/preview-entries/` + * out of `node_modules` since Vite doesn't support entries in it. */ -export function normalizePath(osSpecificPath: string): string { - return removeWindowsDriveLetter(osSpecificPath).split('\\').join('/'); +export function fixEntries(tempFolder: string, entries: string[]) { + return entries.filter(entry => !!entry.match(/(compositions-\d*\.js|overview-\d*\.js|preview\.root.*\.js|preview\.entry.*\.js)/)) + .map(entry => { + const name = basename(entry); + const newEntry = join(tempFolder, name); + let content = fs.readFileSync(entry, 'utf8'); + content = content.replaceAll(ENTRY_REGEXP, '$1$3').replaceAll(/\\\\/gm, '/'); + // content = content.replaceAll("@teambit/preview/dist/preview.preview.runtime.js", "@teambit/preview/dist/preview-modules.js"); + fs.outputFileSync(newEntry, content); + return newEntry; + }); } + /** - * Normalized path fragments and joins them. Use this when writing paths to config files. - * This should not be used to read files on disk because of the removal of Windows drive letters. + * Takes a tsconfig.json file, a list of component directories, and returns a new tsconfig.json file with the include + * and exclude properties expanded to include all the component directories + * @param {any} tsconfigJSON - The path to the existing tsconfig.json file. + * @param {string} targetPath - The path to the new tsconfig.json file. + * @param {string[]} compDirs - An array of paths to the component directories. + * @returns the tsConfig object. */ -export function joinPathFragments(...fragments: string[]): string { - return normalizePath(path.join(...fragments)); +export function expandIncludeExclude(tsconfigJSON: JsonObject, targetPath: string, compDirs: string[]): JsonObject { + // eslint-disable-next-line no-param-reassign + targetPath = dirname(targetPath); + + if (tsconfigJSON.include) { + // eslint-disable-next-line no-param-reassign + tsconfigJSON.include = flatten( + tsconfigJSON.include.map((includedPath: string) => { + return compDirs.map((compDir: string) => { + return isAbsolute(includedPath) ? normalizePath(includedPath) : `${normalizePath(relative(targetPath, compDir))}/${includedPath}`; + }); + }) + ); + } + if (tsconfigJSON.exclude) { + // eslint-disable-next-line no-param-reassign + tsconfigJSON.exclude = flatten( + tsconfigJSON.exclude.map((excludedPath: string) => { + return compDirs.map((compDir: string) => { + return isAbsolute(excludedPath) ? normalizePath(excludedPath) : `${normalizePath(relative(targetPath, compDir))}/${excludedPath}`; + }); + }) + ); + } + if (tsconfigJSON.files) { + // eslint-disable-next-line no-param-reassign + tsconfigJSON.files = flatten( + tsconfigJSON.files.map((filesPath: string) => { + return compDirs.map((compDir: string) => { + return isAbsolute(filesPath) ? normalizePath(relative(targetPath, filesPath)) : `${normalizePath(relative(targetPath, compDir))}/${filesPath}`; + }); + }) + ); + } + + return tsconfigJSON; +} + + +export function getIndexInputFile(index: ApplicationOptions['index']): string { + assert(index, 'No index file provided'); + if (typeof index === 'string') { + return index; + } + return (index as any).input; +} + +export function generateAppTsConfig( + bitCmps: Component[], + appRootPath: string, + appTsconfigPath: string, + tsconfigPath: string, + depsResolver: DependencyResolverMain, + workspace?: Workspace, + additionalEntries?: string[], + devFilesMain?: DevFilesMain +): void { + const configFile = ts.readConfigFile(appTsconfigPath, ts.sys.readFile); + if (configFile.error) { + throw configFile.error; + } + const tsconfigJSON: JsonObject = configFile.config; + // Add the paths to tsconfig to remap bit components to local folders + tsconfigJSON.compilerOptions = tsconfigJSON.compilerOptions || {}; + tsconfigJSON.compilerOptions.paths = tsconfigJSON.compilerOptions.paths || {}; + bitCmps.forEach((dep: Component) => { + let componentDir = workspace?.componentDir(dep.id, { + ignoreVersion: true + }); + if (componentDir && dep.config.main === 'public-api.ts' || componentDir === appRootPath) { + componentDir = normalizePath(componentDir); + const pkgName = depsResolver.getPackageName(dep); + tsconfigJSON.compilerOptions.paths[pkgName] = [`${componentDir}/${dep.config.main}`, `${componentDir}`]; + tsconfigJSON.compilerOptions.paths[`${pkgName}/*`] = [`${componentDir}/*`]; + if (devFilesMain) { + tsconfigJSON.include.push(`${componentDir}/**/*`); + + // get the list of spec patterns + const devPatterns: string[] = devFilesMain.getDevPatterns(dep, TesterAspect.id); + devPatterns.forEach(specPattern => { + tsconfigJSON.exclude.push(`${componentDir}/${specPattern}`); + }); + } + } + }); + + if (additionalEntries) { + tsconfigJSON.files.push(...additionalEntries); + } + + const tsconfigContent = expandIncludeExclude(tsconfigJSON, tsconfigPath, [appRootPath]); + const hash = objectHash(tsconfigContent); + // write only if link has changed (prevents triggering fs watches) + if (writeHash.get(tsconfigPath) !== hash) { + fs.outputJsonSync(tsconfigPath, tsconfigContent, { spaces: 2 }); + writeHash.set(tsconfigPath, hash); + } +} + +export async function getEnvFile(mode: string, rootDir: string, overrides?: Record) { + const vite = await import('vite'); + const dotenv = vite.loadEnv(mode, rootDir); + return { + ...overrides, + ...dotenv + }; } diff --git a/angular/devkit/webpack/component.json b/angular/devkit/webpack/component.json index bb15d913..1adb9c12 100644 --- a/angular/devkit/webpack/component.json +++ b/angular/devkit/webpack/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "dev-services/webpack", - "version": "7.0.0" + "version": "2ef44a3d81b791be618aec5ccb179aea5f1b6953" }, "propagate": false, "extensions": { @@ -21,7 +21,6 @@ } } }, - "teambit.node/node@1.0.54": {}, "teambit.envs/envs": {}, "teambit.component/dev-files": {}, "teambit.pkg/pkg": {}, @@ -29,6 +28,7 @@ "teambit.compositions/compositions": {}, "teambit.docs/docs": {}, "teambit.pipelines/builder": {}, - "teambit.semantics/schema": {} + "teambit.semantics/schema": {}, + "teambit.node/node@1.0.103": {} } } diff --git a/angular/devkit/webpack/ng-webpack-bundler.ts b/angular/devkit/webpack/ng-webpack-bundler.ts index 311c3f6d..e4513499 100644 --- a/angular/devkit/webpack/ng-webpack-bundler.ts +++ b/angular/devkit/webpack/ng-webpack-bundler.ts @@ -14,7 +14,7 @@ import { BundlerContext } from '@teambit/bundler'; import { DevFilesAspect, DevFilesMain } from '@teambit/dev-files'; import { AsyncEnvHandler, EnvContext } from '@teambit/envs'; import { IsolatorAspect, IsolatorMain } from '@teambit/isolator'; -import { CACHE_ROOT } from '@teambit/legacy/dist/constants'; +import { CACHE_ROOT } from '@teambit/legacy.constants'; import { PkgAspect, PkgMain } from '@teambit/pkg'; import { ScopeAspect, ScopeMain } from '@teambit/scope'; import { diff --git a/angular/devkit/webpack/ng-webpack-dev-server.ts b/angular/devkit/webpack/ng-webpack-dev-server.ts index c6d7960c..fd853e7e 100644 --- a/angular/devkit/webpack/ng-webpack-dev-server.ts +++ b/angular/devkit/webpack/ng-webpack-dev-server.ts @@ -15,7 +15,7 @@ import { Component } from '@teambit/component'; import { DevFilesAspect, DevFilesMain } from '@teambit/dev-files'; import { AsyncEnvHandler, EnvContext } from '@teambit/envs'; import { IsolatorAspect, IsolatorMain } from '@teambit/isolator'; -import { CACHE_ROOT } from '@teambit/legacy/dist/constants'; +import { CACHE_ROOT } from '@teambit/legacy.constants'; import { PkgAspect, PkgMain } from '@teambit/pkg'; import { PubsubMain } from '@teambit/pubsub'; import { ScopeAspect, ScopeMain } from '@teambit/scope'; diff --git a/angular/docs/build-pipelines/build-pipelines.mdx b/angular/docs/build-pipelines/build-pipelines.mdx index 579b0ed6..9fc8fb87 100644 --- a/angular/docs/build-pipelines/build-pipelines.mdx +++ b/angular/docs/build-pipelines/build-pipelines.mdx @@ -73,10 +73,10 @@ The following example replaces the default `Jest` build task with the same task, ```ts // @filename: my-angular-env.bit-env.ts // ... -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { JestTask } from '@teambit/defender.jest-tester'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { build() { /* replace the default Jest build task with a new one, that uses a different config */ return super.build().replace([ @@ -110,9 +110,9 @@ Get the task name from [the component's list of build tasks](#review-a-component ```ts // @filename: my-angular-env.bit-env.ts // ... -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { build() { return super.build().remove('JestTask'); } diff --git a/angular/docs/build-pipelines/code-snippets/add-replace-task-build.mdx b/angular/docs/build-pipelines/code-snippets/add-replace-task-build.mdx index b2e876ee..7d0e13bc 100644 --- a/angular/docs/build-pipelines/code-snippets/add-replace-task-build.mdx +++ b/angular/docs/build-pipelines/code-snippets/add-replace-task-build.mdx @@ -1,12 +1,12 @@ It is common to both replace tasks and add new tasks. ```ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { JestTask } from '@teambit/defender.jest-tester'; /* import the task you want to add */ import { ComponentNameTask } from '@learnbit/extending-bit.build-tasks.component-name'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { build() { return ( super diff --git a/angular/docs/build-pipelines/code-snippets/add-task-build.mdx b/angular/docs/build-pipelines/code-snippets/add-task-build.mdx index 6965f946..205b92b5 100644 --- a/angular/docs/build-pipelines/code-snippets/add-task-build.mdx +++ b/angular/docs/build-pipelines/code-snippets/add-task-build.mdx @@ -1,11 +1,11 @@ The following code snippet adds a task to the default build pipeline of the Angular env. ```ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; /* import the task you want to add */ import { ComponentNameTask } from '@learnbit/extending-bit.build-tasks.component-name'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { build() { /* add your task to the build pipeline */ return super.build().add([ComponentNameTask.from({})]); diff --git a/angular/docs/build-pipelines/code-snippets/add-task-snap.mdx b/angular/docs/build-pipelines/code-snippets/add-task-snap.mdx index 174cc0c1..6918d69c 100644 --- a/angular/docs/build-pipelines/code-snippets/add-task-snap.mdx +++ b/angular/docs/build-pipelines/code-snippets/add-task-snap.mdx @@ -2,12 +2,12 @@ The Angular env does not register tasks to the snap pipeline. To add a new task, first create a new snap pipeline. ```ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { Pipeline } from '@teambit/builder'; /* import the task you want to add */ import { ComponentNameTask } from '@learnbit/extending-bit.build-tasks.component-name'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { snap() { /* create a new pipeline and add your task */ return Pipeline.from([ComponentNameTask.from({})]); diff --git a/angular/docs/build-pipelines/code-snippets/add-task-tag.mdx b/angular/docs/build-pipelines/code-snippets/add-task-tag.mdx index d1e1f68d..76c08052 100644 --- a/angular/docs/build-pipelines/code-snippets/add-task-tag.mdx +++ b/angular/docs/build-pipelines/code-snippets/add-task-tag.mdx @@ -2,12 +2,12 @@ The Angular env does not register tasks to the tag pipeline. To add a new task, first create a new tag pipeline. ```ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { Pipeline } from '@teambit/builder'; /* import the task you want to add */ import { ComponentNameTask } from '@learnbit/extending-bit.build-tasks.component-name'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { tag() { /* create a new pipeline and add your task */ return Pipeline.from([ComponentNameTask.from({})]); diff --git a/angular/docs/build-pipelines/code-snippets/jest-build-task.mdx b/angular/docs/build-pipelines/code-snippets/jest-build-task.mdx index a3a57f96..0010d3d1 100644 --- a/angular/docs/build-pipelines/code-snippets/jest-build-task.mdx +++ b/angular/docs/build-pipelines/code-snippets/jest-build-task.mdx @@ -1,11 +1,11 @@ ```ts // @filename: my-angular-env.bit-env.ts // ... -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { JestTask } from '@teambit/defender.jest-tester'; import { Pipeline } from '@teambit/builder'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { build() { return Pipeline.from([ // ... diff --git a/angular/docs/build-pipelines/code-snippets/jest-service.mdx b/angular/docs/build-pipelines/code-snippets/jest-service.mdx index 66dd1f2e..07124863 100644 --- a/angular/docs/build-pipelines/code-snippets/jest-service.mdx +++ b/angular/docs/build-pipelines/code-snippets/jest-service.mdx @@ -1,12 +1,12 @@ ```ts // @filename: my-angular-env.bit-env.ts // ... -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { EnvHandler } from '@teambit/envs'; import { Tester } from '@teambit/tester'; import { JestTester } from '@teambit/defender.jest-tester'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { tester(): EnvHandler { return JestTester.from({ jest: require.resolve('jest'), diff --git a/angular/docs/component-generators/component-generators.mdx b/angular/docs/component-generators/component-generators.mdx index 8f04de8e..a79ba0b5 100644 --- a/angular/docs/component-generators/component-generators.mdx +++ b/angular/docs/component-generators/component-generators.mdx @@ -75,11 +75,11 @@ Implement the `generator` env handler in your env, and provide the generators wi ```ts // @filename: my-angular-env.bit-env.ts -import { AngularV18Env } from '@bitdev/angular.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.angular-v19-env'; import { TemplateList } from '@teambit/generator'; import { NgModuleTemplate } from '@bitdev/angular.templates.generators'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { generators() { return TemplateList.from([ NgModuleTemplate.from({ diff --git a/angular/docs/components-preview/code-examples.tsx b/angular/docs/components-preview/code-examples.tsx index c9924f61..807a828f 100644 --- a/angular/docs/components-preview/code-examples.tsx +++ b/angular/docs/components-preview/code-examples.tsx @@ -10,7 +10,7 @@ import CompositionMounterEnv from './snippets/composition-mounter-env.mdx'; const compositionProviderContent = [ { title: 'my-angular-env.bit-env.ts', body: }, - { title: 'preview/mounter.ts', body: }, + { title: 'config/mounter.ts', body: }, { title: 'wrapper.component.ts', body: }, ]; @@ -20,7 +20,7 @@ export const CompositionProviderExample = () => ( const compositionProviderContent2 = [ { title: 'my-angular-env.bit-env.ts', body: }, - { title: 'preview/mounter.ts', body: }, + { title: 'config/mounter.ts', body: }, { title: 'wrapper.ts', body: }, ]; @@ -30,7 +30,7 @@ export const CompositionProviderExample2 = () => ( const compositionMounterContent = [ { title: 'my-angular-env.bit-env.ts', body: }, - { title: 'preview/docs.tsx', body: }, + { title: 'config/docs.tsx', body: }, ]; export const CompositionMounterExample = () => ( diff --git a/angular/docs/components-preview/components-preview.mdx b/angular/docs/components-preview/components-preview.mdx index c8557ac4..965dc3ac 100644 --- a/angular/docs/components-preview/components-preview.mdx +++ b/angular/docs/components-preview/components-preview.mdx @@ -11,12 +11,12 @@ to customize how your docs and compositions are bundled and rendered: ```ts // @filename: my-angular-env.bit-env.ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { Preview } from '@teambit/preview'; import { EnvHandler } from '@teambit/envs'; import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { preview(): EnvHandler { return AngularPreview.from({ /* preview config goes here */ @@ -94,15 +94,15 @@ providers only once in the bundle of your env and exclude them from the preview You can do that by configuring the `hostDependencies` property of your preview. For example: ```ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { Preview } from '@teambit/preview'; import { EnvHandler } from '@teambit/envs'; import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { preview(): EnvHandler { return AngularPreview.from({ - mounterPath: require.resolve('./preview/mounter'), + mounterPath: require.resolve('./config/mounter'), hostDependencies: [ /* your composition provider */ '@my-scope/my-theme.provider', diff --git a/angular/docs/components-preview/snippets/composition-mounter-env.mdx b/angular/docs/components-preview/snippets/composition-mounter-env.mdx index c2946cf3..359509ae 100644 --- a/angular/docs/components-preview/snippets/composition-mounter-env.mdx +++ b/angular/docs/components-preview/snippets/composition-mounter-env.mdx @@ -1,14 +1,14 @@ ```tsx // @filename: my-angular-env.bit-env.ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { Preview } from '@teambit/preview'; import { EnvHandler } from '@teambit/envs'; import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { preview(): EnvHandler { return AngularPreview.from({ - mounterPath: require.resolve('./preview/mounter') + mounterPath: require.resolve('./config/mounter') }); } } diff --git a/angular/docs/components-preview/snippets/composition-provider-env.mdx b/angular/docs/components-preview/snippets/composition-provider-env.mdx index c2946cf3..359509ae 100644 --- a/angular/docs/components-preview/snippets/composition-provider-env.mdx +++ b/angular/docs/components-preview/snippets/composition-provider-env.mdx @@ -1,14 +1,14 @@ ```tsx // @filename: my-angular-env.bit-env.ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { Preview } from '@teambit/preview'; import { EnvHandler } from '@teambit/envs'; import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { preview(): EnvHandler { return AngularPreview.from({ - mounterPath: require.resolve('./preview/mounter') + mounterPath: require.resolve('./config/mounter') }); } } diff --git a/angular/docs/development-tools/development-tools.mdx b/angular/docs/development-tools/development-tools.mdx index acc0e4d8..8e4ca686 100644 --- a/angular/docs/development-tools/development-tools.mdx +++ b/angular/docs/development-tools/development-tools.mdx @@ -7,7 +7,7 @@ The compilation of the source files is done by the Angular compiler (ngc) throug If you use a custom env, you can configure both webpack and the Angular compiler by overriding the `getDevServer` method: ```ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { AngularEnvOptions, BrowserOptions, DevServerOptions } from '@bitdev/angular.dev-services.common'; import { NgWebpackDevServer } from '@bitdev/angular.dev-services.webpack'; import { Configuration } from 'webpack'; @@ -15,7 +15,7 @@ import { DevServer, DevServerContext } from '@teambit/bundler'; import { WebpackConfigTransformer, WebpackConfigWithDevServer } from '@teambit/webpack'; import { AsyncEnvHandler } from '@teambit/envs'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { // ... override getDevServer( @@ -75,7 +75,7 @@ but the options are optimized for production builds. If you use a custom env, you can configure both webpack and the Angular compiler by overriding the `getBundler` method: ```ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { AngularEnvOptions, BrowserOptions, DevServerOptions } from '@bitdev/angular.dev-services.common'; import { NgWebpackBundler } from '@bitdev/angular.dev-services.webpack'; import { Configuration } from 'webpack'; @@ -83,7 +83,7 @@ import { Bundler, BundlerContext } from '@teambit/bundler'; import { WebpackConfigTransformer, WebpackConfigWithDevServer } from '@teambit/webpack'; import { AsyncEnvHandler } from '@teambit/envs'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { // ... override getBundler( diff --git a/angular/docs/ng-theming/code-snippet-tabs.tsx b/angular/docs/ng-theming/code-snippet-tabs.tsx index 05671b33..776cb01d 100644 --- a/angular/docs/ng-theming/code-snippet-tabs.tsx +++ b/angular/docs/ng-theming/code-snippet-tabs.tsx @@ -24,7 +24,7 @@ export const MyDarkThemeTabs = () => ; const compositionProviderContent = [ { title: 'my-angular-env.bit-env.ts', body: }, - { title: 'preview/mounter.ts', body: }, + { title: 'config/mounter.ts', body: }, { title: 'wrapper.component.ts', body: }, ]; diff --git a/angular/docs/ng-theming/code-snippets/composition-provider-env.mdx b/angular/docs/ng-theming/code-snippets/composition-provider-env.mdx index f218c8e6..d298cce1 100644 --- a/angular/docs/ng-theming/code-snippets/composition-provider-env.mdx +++ b/angular/docs/ng-theming/code-snippets/composition-provider-env.mdx @@ -1,14 +1,14 @@ ```ts // @filename: my-angular-env.bit-env.ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { Preview } from '@teambit/preview'; import { EnvHandler } from '@teambit/envs'; import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { preview(): EnvHandler { return AngularPreview.from({ - mounterPath: require.resolve('./preview/mounter') + mounterPath: require.resolve('./config/mounter') }); } } diff --git a/angular/docs/workspace-starters/workspace-starters.mdx b/angular/docs/workspace-starters/workspace-starters.mdx index 3ae4b1c8..137befc2 100644 --- a/angular/docs/workspace-starters/workspace-starters.mdx +++ b/angular/docs/workspace-starters/workspace-starters.mdx @@ -59,12 +59,12 @@ Implement the `starter`` env handler in your env, and provide the starters with ```ts // @filename: my-angular-env.bit-env.ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { EnvHandler } from '@teambit/envs'; import { StarterList } from '@teambit/generator'; import { NgWorkspaceTemplate } from '@bitdev/angular.templates.starters'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { packageName = '@my-org/my-scope.my-angular-env'; starters(): EnvHandler { @@ -93,13 +93,13 @@ Replace the default starter with your own custom one: ```ts // @filename: my-angular-env.bit-env.ts -import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; +import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; import { EnvHandler } from '@teambit/envs'; import { StarterList } from '@teambit/generator'; /* a custom starter */ import { AngularWorkspaceStarter } from '@my-org/my-scope.templates.my-custom-starter'; -export class MyAngularEnv extends AngularV18Env { +export class MyAngularEnv extends AngularV19Env { packageName = '@my-org/my-scope.my-angular-env'; starters(): EnvHandler { diff --git a/angular/envs/angular-env/angular.bit-env.ts b/angular/envs/angular-env/angular.bit-env.ts index 6d0bbb5f..f902bc47 100644 --- a/angular/envs/angular-env/angular.bit-env.ts +++ b/angular/envs/angular-env/angular.bit-env.ts @@ -1,8 +1,4 @@ import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; -import { NativeCompileCache } from '@teambit/toolbox.performance.v8-cache'; - -// Disable v8-caching because it breaks ESM loaders -NativeCompileCache.uninstall(); export class AngularEnv extends AngularV19Env { name = 'Angular'; diff --git a/angular/envs/angular-env/angular.docs.mdx b/angular/envs/angular-env/angular.docs.mdx index e882b7a2..f0ebe9b1 100644 --- a/angular/envs/angular-env/angular.docs.mdx +++ b/angular/envs/angular-env/angular.docs.mdx @@ -60,8 +60,7 @@ import { EnvOverview } from '@teambit/envs.docs.env-overview-template'; name: 'Component Preview', toolLink: 'https://bit.cloud/bitdev/angular/dev-services/preview/mounter', configFiles: [ - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/mounter.ts', - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/host-dependencies.ts', + 'https://bit.cloud/bitdev/angular/envs/base-env/~code/config/mounter.ts' ], }, { diff --git a/angular/envs/angular-env/component.json b/angular/envs/angular-env/component.json index 3898d73c..b15b1dec 100644 --- a/angular/envs/angular-env/component.json +++ b/angular/envs/angular-env/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "angular-env", - "version": "7.1.0" + "version": "8.0.1" }, "propagate": false, "extensions": { @@ -67,7 +67,9 @@ } } }, - "bitdev.general/envs/bit-env@1.0.1": {}, - "teambit.envs/envs": {} + "bitdev.general/envs/bit-env@1.0.21": {}, + "teambit.envs/envs": { + "env": "bitdev.general/envs/bit-env" + } } } diff --git a/angular/envs/angular-env/env.jsonc b/angular/envs/angular-env/env.jsonc index d345a517..7fdba035 100644 --- a/angular/envs/angular-env/env.jsonc +++ b/angular/envs/angular-env/env.jsonc @@ -18,13 +18,6 @@ * as a direct component dependencies. they are used for component development only. **/ "dev": [ - { - "name": "@types/jest", - "version": "^29.5.0", - "supportedRange": "^29.0.0", - "hidden": true, - "force": true - }, { "name": "@types/node", "version": "^20.11.22", @@ -84,7 +77,7 @@ { "name": "@angular/platform-browser", "version": "^19.0.0", - "supportedRange": "19.0.0" + "supportedRange": "^19.0.0" }, { "name": "@angular/platform-browser-dynamic", @@ -111,6 +104,11 @@ "version": "^8.40.0", "supportedRange": "^8.40.0" }, + { + "name": "@types/jest", + "version": "^29.5.0", + "supportedRange": "^29.0.0" + }, { "name": "express", "version": "~4.21.1", diff --git a/angular/envs/angular-env/index.ts b/angular/envs/angular-env/index.ts index c54c49f0..916f5d49 100644 --- a/angular/envs/angular-env/index.ts +++ b/angular/envs/angular-env/index.ts @@ -1,4 +1,2 @@ export { AngularEnv } from './angular.bit-env.js'; export { ngEnvOptions } from '@bitdev/angular.envs.angular-v19-env'; -// @ts-ignore -export { default as jestConfig } from './jest/jest.config.cjs'; diff --git a/angular/envs/angular-v16-env/angular-v16-env.bit-env.ts b/angular/envs/angular-v16-env/angular-v16-env.bit-env.ts index 110b6f9d..5947c863 100644 --- a/angular/envs/angular-v16-env/angular-v16-env.bit-env.ts +++ b/angular/envs/angular-v16-env/angular-v16-env.bit-env.ts @@ -1,20 +1,18 @@ import { AngularEnvOptions } from '@bitdev/angular.dev-services.common'; +import { AngularPreview } from "@bitdev/angular.dev-services.preview.preview"; import { AngularBaseEnv } from '@bitdev/angular.envs.base-env'; -import { NativeCompileCache } from '@teambit/toolbox.performance.v8-cache'; +import { EnvHandler } from '@teambit/envs'; +import { Preview } from '@teambit/preview'; import { createRequire } from 'node:module'; import { webpackConfigFactory } from './webpack-config.factory.js'; -// Disable v8-caching because it breaks ESM loaders -NativeCompileCache.uninstall(); - const require = createRequire(import.meta.url); export const ngEnvOptions: AngularEnvOptions = { useAngularElementsPreview: false, // angularElementsModulePath: require.resolve('@angular/elements'), - jestConfigPath: require.resolve('./jest/jest.config.cjs'), jestModulePath: require.resolve('jest'), - ngPackagrModulePath: import.meta.resolve('ng-packagr'), + ngPackagrModulePath: require.resolve('ng-packagr'), webpackConfigFactory, webpackDevServerModulePath: require.resolve('webpack-dev-server'), // resolving to the webpack used by angular devkit to avoid multiple instances of webpack @@ -32,6 +30,26 @@ export class AngularV16Env extends AngularBaseEnv { angularVersion = 16; ngEnvOptions: AngularEnvOptions = ngEnvOptions; + + /* Jest config. Learn how to replace tester - https://bit.dev/reference/testing/set-up-tester */ + protected jestConfigPath = require.resolve('./jest/jest.config.cjs'); + + /** + * Esbuild plugins are not supported in Angular v16 and required for the preview, so we can't use vite dev server. + * Instead, we use the old webpack dev server. + */ + override preview(): EnvHandler { + return AngularPreview.from({ + ngEnvOptions: this.getNgEnvOptions(), + hostDependencies: [ + '@teambit/mdx.ui.mdx-scope-context', + '@mdx-js/react', + 'react', + 'react-dom', + ], + mounterPath: require.resolve('./config/mounter.js') + }); + } } export default new AngularV16Env(); diff --git a/angular/envs/angular-v16-env/angular-v16-env.docs.mdx b/angular/envs/angular-v16-env/angular-v16-env.docs.mdx index df0af439..31fb8ae2 100644 --- a/angular/envs/angular-v16-env/angular-v16-env.docs.mdx +++ b/angular/envs/angular-v16-env/angular-v16-env.docs.mdx @@ -60,8 +60,7 @@ import { EnvOverview } from '@teambit/envs.docs.env-overview-template'; name: 'Component Preview', toolLink: 'https://bit.cloud/bitdev/angular/dev-services/preview/mounter', configFiles: [ - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/mounter.ts', - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/host-dependencies.ts', + 'https://bit.cloud/bitdev/angular/envs/base-env/~code/config/mounter.ts' ], }, { diff --git a/angular/envs/angular-v16-env/component.json b/angular/envs/angular-v16-env/component.json index 70c1984e..13b0b404 100644 --- a/angular/envs/angular-v16-env/component.json +++ b/angular/envs/angular-v16-env/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "envs/angular-v16-env", - "version": "7.1.0" + "version": "8.0.1" }, "propagate": false, "extensions": { @@ -67,14 +67,16 @@ } } }, - "bitdev.general/envs/bit-env@1.0.1": {}, - "teambit.envs/envs": {}, "teambit.component/renaming": { "renamedFrom": { "scope": "bitdev.angular", "name": "envs/v16", "version": "277a7758ede161c02a2f2d01b02f056782c45d67" } + }, + "bitdev.general/envs/bit-env@1.0.21": {}, + "teambit.envs/envs": { + "env": "bitdev.general/envs/bit-env" } } } diff --git a/angular/envs/base-env/preview/mounter.ts b/angular/envs/angular-v16-env/config/mounter.ts similarity index 95% rename from angular/envs/base-env/preview/mounter.ts rename to angular/envs/angular-v16-env/config/mounter.ts index af297c87..e0b86263 100644 --- a/angular/envs/base-env/preview/mounter.ts +++ b/angular/envs/angular-v16-env/config/mounter.ts @@ -5,7 +5,7 @@ import { Component, ViewEncapsulation } from '@angular/core'; /** * Provide your component compositions (preview) with the context they need to run. * for example, a router, a theme, a data provider, etc. - * components added here as providers should be listed as host-dependencies in your host-dependencies.ts file. + * components added here as providers should be listed as host-dependencies * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers */ @Component({ @@ -19,7 +19,6 @@ import { Component, ViewEncapsulation } from '@angular/core'; `, }) export class WrapperComponent {} - /** * the entry for the app (preview runtime) that renders your component previews. * use the default template or create your own. diff --git a/angular/envs/angular-v16-env/env.jsonc b/angular/envs/angular-v16-env/env.jsonc index ab1e5f9e..9f6c02f9 100644 --- a/angular/envs/angular-v16-env/env.jsonc +++ b/angular/envs/angular-v16-env/env.jsonc @@ -18,13 +18,6 @@ * as a direct component dependencies. they are used for component development only. **/ "dev": [ - { - "name": "@types/jest", - "version": "^29.5.0", - "supportedRange": "^29.0.0", - "hidden": true, - "force": true - }, { "name": "@types/node", "version": "^16.11.7", @@ -95,6 +88,11 @@ "version": "^8.40.0", "supportedRange": "^8.40.0" }, + { + "name": "@types/jest", + "version": "^29.5.0", + "supportedRange": "^29.0.0" + }, { "name": "jest", "version": "^29.5.0", diff --git a/angular/envs/angular-v16-env/index.ts b/angular/envs/angular-v16-env/index.ts index 84c8f74f..3c73bc7d 100644 --- a/angular/envs/angular-v16-env/index.ts +++ b/angular/envs/angular-v16-env/index.ts @@ -1,3 +1 @@ export { AngularV16Env, ngEnvOptions } from './angular-v16-env.bit-env.js'; -// @ts-ignore -export { default as jestConfig } from './jest/jest.config.cjs'; diff --git a/angular/envs/angular-v16-env/webpack-config.factory.ts b/angular/envs/angular-v16-env/webpack-config.factory.ts index bc9c31d4..8c4e3ca9 100644 --- a/angular/envs/angular-v16-env/webpack-config.factory.ts +++ b/angular/envs/angular-v16-env/webpack-config.factory.ts @@ -1,7 +1,7 @@ /* eslint-disable no-param-reassign */ import { OutputHashing } from '@angular-devkit/build-angular'; import { getSystemPath, normalize, tags } from '@angular-devkit/core'; -import { BundlerSetup, dedupPaths, getLoggerApi } from '@bitdev/angular.dev-services.common'; +import { BundlerSetup, dedupePaths, getLoggerApi } from '@bitdev/angular.dev-services.common'; import type { BrowserBuilderOptions } from '@bitdev/angular.dev-services.ng-compat'; import { generateEntryPoints, @@ -108,8 +108,8 @@ async function getWebpackConfig( main: angularOptions.main ?? `./${join(sourceRoot, `main.ts`)}`, polyfills: angularOptions.polyfills, tsConfig: angularOptions.tsConfig ?? tsconfigPath, - assets: dedupPaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]), - styles: dedupPaths([posix.join(sourceRoot, `styles.${ angularOptions.inlineStyleLanguage ?? 'scss' }`), ...(angularOptions.styles ?? [])]), + assets: dedupePaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]), + styles: dedupePaths([posix.join(sourceRoot, `styles.${ angularOptions.inlineStyleLanguage ?? 'scss' }`), ...(angularOptions.styles ?? [])]), scripts: angularOptions.scripts, vendorChunk: angularOptions.vendorChunk ?? true, namedChunks: angularOptions.namedChunks ?? true, diff --git a/angular/envs/angular-v16-env/webpack/module-rules.config.ts b/angular/envs/angular-v16-env/webpack/module-rules.config.ts index bfdf9b8c..4fd1ab04 100644 --- a/angular/envs/angular-v16-env/webpack/module-rules.config.ts +++ b/angular/envs/angular-v16-env/webpack/module-rules.config.ts @@ -28,7 +28,7 @@ const postCssConfig = { // Adds PostCSS Normalize as the reset css with default options, // so that it honors browserslist config in package.json // which in turn lets users customize the target behavior as per their needs. - // require.resolve('postcss-normalize'), + // req.resolve('postcss-normalize'), ], }; diff --git a/angular/envs/angular-v17-env/angular-v17-env.bit-env.ts b/angular/envs/angular-v17-env/angular-v17-env.bit-env.ts index b0d40628..28d8bf92 100644 --- a/angular/envs/angular-v17-env/angular-v17-env.bit-env.ts +++ b/angular/envs/angular-v17-env/angular-v17-env.bit-env.ts @@ -1,20 +1,15 @@ import { AngularEnvOptions } from '@bitdev/angular.dev-services.common'; import { AngularBaseEnv } from '@bitdev/angular.envs.base-env'; -import { NativeCompileCache } from '@teambit/toolbox.performance.v8-cache'; import { createRequire } from 'node:module'; import { webpackConfigFactory } from './webpack-config.factory.js'; -// Disable v8-caching because it breaks ESM loaders -NativeCompileCache.uninstall(); - const require = createRequire(import.meta.url); export const ngEnvOptions: AngularEnvOptions = { useAngularElementsPreview: false, - // angularElementsModulePath: require.resolve('@angular/elements'), - jestConfigPath: require.resolve('./jest/jest.config.cjs'), + // angularElementsModulePath: req.resolve('@angular/elements'), jestModulePath: require.resolve('jest'), - ngPackagrModulePath: import.meta.resolve('ng-packagr'), + ngPackagrModulePath: require.resolve('ng-packagr'), webpackConfigFactory, webpackDevServerModulePath: require.resolve('webpack-dev-server'), // resolving to the webpack used by angular devkit to avoid multiple instances of webpack @@ -32,6 +27,9 @@ export class AngularV17Env extends AngularBaseEnv { angularVersion = 17; ngEnvOptions: AngularEnvOptions = ngEnvOptions; + + /* Jest config. Learn how to replace tester - https://bit.dev/reference/testing/set-up-tester */ + protected jestConfigPath = require.resolve('./jest/jest.config.cjs'); } export default new AngularV17Env(); diff --git a/angular/envs/angular-v17-env/angular-v17-env.docs.mdx b/angular/envs/angular-v17-env/angular-v17-env.docs.mdx index 0d9c7b5a..98869f19 100644 --- a/angular/envs/angular-v17-env/angular-v17-env.docs.mdx +++ b/angular/envs/angular-v17-env/angular-v17-env.docs.mdx @@ -60,8 +60,7 @@ import { EnvOverview } from '@teambit/envs.docs.env-overview-template'; name: 'Component Preview', toolLink: 'https://bit.cloud/bitdev/angular/dev-services/preview/mounter', configFiles: [ - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/mounter.ts', - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/host-dependencies.ts', + 'https://bit.cloud/bitdev/angular/envs/base-env/~code/config/mounter.ts' ], }, { diff --git a/angular/envs/angular-v17-env/component.json b/angular/envs/angular-v17-env/component.json index 8be176fc..d7406345 100644 --- a/angular/envs/angular-v17-env/component.json +++ b/angular/envs/angular-v17-env/component.json @@ -2,34 +2,34 @@ "componentId": { "scope": "bitdev.angular", "name": "envs/angular-v17-env", - "version": "6.1.0" + "version": "7.0.1" }, "propagate": false, "extensions": { "teambit.dependencies/dependency-resolver": { "policy": { "dependencies": { - "@angular-devkit/architect": "0.1700.0", - "@angular-devkit/build-angular": "^17.0.0", - "@angular-devkit/build-webpack": "0.1700.0", - "@angular-devkit/core": "^17.0.0", - "@angular-devkit/schematics": "^17.0.0", + "@angular-devkit/architect": "0.1703.11", + "@angular-devkit/build-angular": "^17.3.0", + "@angular-devkit/build-webpack": "0.1703.11", + "@angular-devkit/core": "^17.3.0", + "@angular-devkit/schematics": "^17.3.0", "@angular-eslint/eslint-plugin": "~16.1.1", "@angular-eslint/eslint-plugin-template": "~16.1.1", "@angular-eslint/template-parser": "~16.1.1", - "@angular/animations": "^17.0.0", - "@angular/cli": "^17.0.0", - "@angular/common": "^17.0.0", - "@angular/compiler": "^17.0.0", - "@angular/compiler-cli": "^17.0.0", - "@angular/core": "^17.0.0", - "@angular/elements": "^17.0.0", - "@angular/platform-browser": "^17.0.0", - "@angular/platform-browser-dynamic": "^17.0.0", - "@angular/platform-server": "^17.0.0", - "@angular/ssr": "^17.0.0", + "@angular/animations": "^17.3.0", + "@angular/cli": "^17.3.0", + "@angular/common": "^17.3.0", + "@angular/compiler": "^17.3.0", + "@angular/compiler-cli": "^17.3.0", + "@angular/core": "^17.3.0", + "@angular/elements": "^17.3.0", + "@angular/platform-browser": "^17.3.0", + "@angular/platform-browser-dynamic": "^17.3.0", + "@angular/platform-server": "^17.3.0", + "@angular/ssr": "^17.3.0", "@jest/globals": "^29.3.1", - "@ngtools/webpack": "^17.0.0", + "@ngtools/webpack": "^17.3.0", "@types/eslint": "^8.40.0", "@types/jest": "^29.5.0", "@types/react-dev-utils": "~9.0.8", @@ -44,7 +44,7 @@ "jest-environment-jsdom": "^29.0.3", "jest-environment-node": "^29.0.3", "jest-preset-angular": "~13.1.3", - "ng-packagr": "^17.0.0", + "ng-packagr": "^17.3.0", "postcss": "8.4.23", "postcss-flexbugs-fixes": "5.0.2", "postcss-loader": "7.2.4", @@ -68,7 +68,9 @@ } } }, - "bitdev.general/envs/bit-env@1.0.1": {}, - "teambit.envs/envs": {} + "bitdev.general/envs/bit-env@1.0.21": {}, + "teambit.envs/envs": { + "env": "bitdev.general/envs/bit-env" + } } } diff --git a/angular/envs/angular-v17-env/env.jsonc b/angular/envs/angular-v17-env/env.jsonc index 704692e3..a5333fa5 100644 --- a/angular/envs/angular-v17-env/env.jsonc +++ b/angular/envs/angular-v17-env/env.jsonc @@ -18,13 +18,6 @@ * as a direct component dependencies. they are used for component development only. **/ "dev": [ - { - "name": "@types/jest", - "version": "^29.5.0", - "supportedRange": "^29.0.0", - "hidden": true, - "force": true - }, { "name": "@types/node", "version": "^20.11.22", @@ -42,59 +35,64 @@ "peers": [ { "name": "@angular/animations", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/common", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/compiler", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/compiler-cli", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/core", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/forms", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/platform-browser", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/platform-browser-dynamic", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/platform-server", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/router", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@types/eslint", "version": "^8.40.0", "supportedRange": "^8.40.0" }, + { + "name": "@types/jest", + "version": "^29.5.0", + "supportedRange": "^29.0.0" + }, { "name": "jest", "version": "^29.5.0", diff --git a/angular/envs/angular-v17-env/index.ts b/angular/envs/angular-v17-env/index.ts index ac37e154..654a7ac2 100644 --- a/angular/envs/angular-v17-env/index.ts +++ b/angular/envs/angular-v17-env/index.ts @@ -1,3 +1 @@ export { AngularV17Env, ngEnvOptions } from './angular-v17-env.bit-env.js'; -// @ts-ignore -export { default as jestConfig } from './jest/jest.config.cjs'; diff --git a/angular/envs/angular-v17-env/webpack-config.factory.ts b/angular/envs/angular-v17-env/webpack-config.factory.ts index 7645044e..c7b28201 100644 --- a/angular/envs/angular-v17-env/webpack-config.factory.ts +++ b/angular/envs/angular-v17-env/webpack-config.factory.ts @@ -1,7 +1,7 @@ /* eslint-disable no-param-reassign */ import { OutputHashing } from '@angular-devkit/build-angular'; import { getSystemPath, normalize, tags } from '@angular-devkit/core'; -import { BundlerSetup, dedupPaths, getLoggerApi } from '@bitdev/angular.dev-services.common'; +import { BundlerSetup, dedupePaths, getLoggerApi } from '@bitdev/angular.dev-services.common'; import type { BrowserBuilderOptions} from '@bitdev/angular.dev-services.ng-compat'; import { generateEntryPoints, @@ -108,8 +108,8 @@ async function getWebpackConfig( main: angularOptions.browser ?? `./${join(sourceRoot, `main.ts`)}`, polyfills: angularOptions.polyfills, tsConfig: angularOptions.tsConfig ?? tsconfigPath, - assets: dedupPaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]), - styles: dedupPaths([posix.join(sourceRoot, `styles.${ angularOptions.inlineStyleLanguage ?? 'scss' }`), ...(angularOptions.styles ?? [])]), + assets: dedupePaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]), + styles: dedupePaths([posix.join(sourceRoot, `styles.${ angularOptions.inlineStyleLanguage ?? 'scss' }`), ...(angularOptions.styles ?? [])]), scripts: angularOptions.scripts, vendorChunk: angularOptions.vendorChunk ?? true, namedChunks: angularOptions.namedChunks ?? true, diff --git a/angular/envs/angular-v17-env/webpack/module-rules.config.ts b/angular/envs/angular-v17-env/webpack/module-rules.config.ts index bfdf9b8c..81222520 100644 --- a/angular/envs/angular-v17-env/webpack/module-rules.config.ts +++ b/angular/envs/angular-v17-env/webpack/module-rules.config.ts @@ -16,9 +16,7 @@ const postCssConfig = { // https://github.com/facebook/create-react-app/issues/2677 ident: 'postcss', plugins: [ - // eslint-disable-next-line global-require require.resolve('postcss-flexbugs-fixes'), - // eslint-disable-next-line global-require require('postcss-preset-env')({ autoprefixer: { flexbox: 'no-2009', @@ -28,7 +26,7 @@ const postCssConfig = { // Adds PostCSS Normalize as the reset css with default options, // so that it honors browserslist config in package.json // which in turn lets users customize the target behavior as per their needs. - // require.resolve('postcss-normalize'), + // req.resolve('postcss-normalize'), ], }; diff --git a/angular/envs/angular-v18-env/angular-v18-env.bit-env.ts b/angular/envs/angular-v18-env/angular-v18-env.bit-env.ts index 1b37466b..75044114 100644 --- a/angular/envs/angular-v18-env/angular-v18-env.bit-env.ts +++ b/angular/envs/angular-v18-env/angular-v18-env.bit-env.ts @@ -1,20 +1,15 @@ import { AngularEnvOptions } from '@bitdev/angular.dev-services.common'; import { AngularBaseEnv } from '@bitdev/angular.envs.base-env'; -import { NativeCompileCache } from '@teambit/toolbox.performance.v8-cache'; import { createRequire } from 'node:module'; import { webpackConfigFactory } from './webpack-config.factory.js'; -// Disable v8-caching because it breaks ESM loaders -NativeCompileCache.uninstall(); - const require = createRequire(import.meta.url); export const ngEnvOptions: AngularEnvOptions = { useAngularElementsPreview: false, - // angularElementsModulePath: require.resolve('@angular/elements'), - jestConfigPath: require.resolve('./jest/jest.config.cjs'), + // angularElementsModulePath: req.resolve('@angular/elements'), jestModulePath: require.resolve('jest'), - ngPackagrModulePath: import.meta.resolve('ng-packagr'), + ngPackagrModulePath: require.resolve('ng-packagr'), webpackConfigFactory, webpackDevServerModulePath: require.resolve('webpack-dev-server'), // resolving to the webpack used by angular devkit to avoid multiple instances of webpack @@ -32,6 +27,9 @@ export class AngularV18Env extends AngularBaseEnv { angularVersion = 18; ngEnvOptions: AngularEnvOptions = ngEnvOptions; + + /* Jest config. Learn how to replace tester - https://bit.dev/reference/testing/set-up-tester */ + protected jestConfigPath = require.resolve('./jest/jest.config.cjs'); } export default new AngularV18Env(); diff --git a/angular/envs/angular-v18-env/angular-v18-env.docs.mdx b/angular/envs/angular-v18-env/angular-v18-env.docs.mdx index 8e22471f..ea99b46e 100644 --- a/angular/envs/angular-v18-env/angular-v18-env.docs.mdx +++ b/angular/envs/angular-v18-env/angular-v18-env.docs.mdx @@ -60,8 +60,7 @@ import { EnvOverview } from '@teambit/envs.docs.env-overview-template'; name: 'Component Preview', toolLink: 'https://bit.cloud/bitdev/angular/dev-services/preview/mounter', configFiles: [ - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/mounter.ts', - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/host-dependencies.ts', + 'https://bit.cloud/bitdev/angular/envs/base-env/~code/config/mounter.ts' ], }, { diff --git a/angular/envs/angular-v18-env/component.json b/angular/envs/angular-v18-env/component.json index 2db849b4..f6fd5eb4 100644 --- a/angular/envs/angular-v18-env/component.json +++ b/angular/envs/angular-v18-env/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "envs/angular-v18-env", - "version": "2.1.0" + "version": "3.0.1" }, "propagate": false, "extensions": { @@ -69,7 +69,9 @@ } } }, - "bitdev.general/envs/bit-env@1.0.1": {}, - "teambit.envs/envs": {} + "bitdev.general/envs/bit-env@1.0.21": {}, + "teambit.envs/envs": { + "env": "bitdev.general/envs/bit-env" + } } } diff --git a/angular/envs/angular-v18-env/env.jsonc b/angular/envs/angular-v18-env/env.jsonc index 074e9052..0600575f 100644 --- a/angular/envs/angular-v18-env/env.jsonc +++ b/angular/envs/angular-v18-env/env.jsonc @@ -18,13 +18,6 @@ * as a direct component dependencies. they are used for component development only. **/ "dev": [ - { - "name": "@types/jest", - "version": "^29.5.0", - "supportedRange": "^29.0.0", - "hidden": true, - "force": true - }, { "name": "@types/node", "version": "^20.11.22", @@ -100,6 +93,11 @@ "version": "^8.40.0", "supportedRange": "^8.40.0" }, + { + "name": "@types/jest", + "version": "^29.5.0", + "supportedRange": "^29.0.0" + }, { "name": "jest", "version": "^29.5.0", diff --git a/angular/envs/angular-v18-env/index.ts b/angular/envs/angular-v18-env/index.ts index a0c5ac92..108f367b 100644 --- a/angular/envs/angular-v18-env/index.ts +++ b/angular/envs/angular-v18-env/index.ts @@ -1,3 +1 @@ export { AngularV18Env, ngEnvOptions } from './angular-v18-env.bit-env.js'; -// @ts-ignore -export { default as jestConfig } from './jest/jest.config.cjs'; diff --git a/angular/envs/angular-v18-env/webpack-config.factory.ts b/angular/envs/angular-v18-env/webpack-config.factory.ts index 1e6147a6..d689be50 100644 --- a/angular/envs/angular-v18-env/webpack-config.factory.ts +++ b/angular/envs/angular-v18-env/webpack-config.factory.ts @@ -1,7 +1,7 @@ /* eslint-disable no-param-reassign */ import { OutputHashing } from '@angular-devkit/build-angular'; import { getSystemPath, normalize, tags } from '@angular-devkit/core'; -import { BundlerSetup, dedupPaths, getLoggerApi } from '@bitdev/angular.dev-services.common'; +import { BundlerSetup, dedupePaths, getLoggerApi } from '@bitdev/angular.dev-services.common'; import type { BrowserBuilderOptions} from '@bitdev/angular.dev-services.ng-compat'; import { generateEntryPoints, @@ -108,8 +108,8 @@ async function getWebpackConfig( main: angularOptions.browser ?? `./${join(sourceRoot, `main.ts`)}`, polyfills: angularOptions.polyfills, tsConfig: angularOptions.tsConfig ?? tsconfigPath, - assets: dedupPaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]), - styles: dedupPaths([posix.join(sourceRoot, `styles.${ angularOptions.inlineStyleLanguage ?? 'scss' }`), ...(angularOptions.styles ?? [])]), + assets: dedupePaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]), + styles: dedupePaths([posix.join(sourceRoot, `styles.${ angularOptions.inlineStyleLanguage ?? 'scss' }`), ...(angularOptions.styles ?? [])]), scripts: angularOptions.scripts, vendorChunk: angularOptions.vendorChunk ?? true, namedChunks: angularOptions.namedChunks ?? true, diff --git a/angular/envs/angular-v19-env/angular-v19-env.bit-env.ts b/angular/envs/angular-v19-env/angular-v19-env.bit-env.ts index 640c3a31..e303c761 100644 --- a/angular/envs/angular-v19-env/angular-v19-env.bit-env.ts +++ b/angular/envs/angular-v19-env/angular-v19-env.bit-env.ts @@ -1,20 +1,15 @@ import { AngularEnvOptions } from '@bitdev/angular.dev-services.common'; import { AngularBaseEnv } from '@bitdev/angular.envs.base-env'; -import { NativeCompileCache } from '@teambit/toolbox.performance.v8-cache'; import { createRequire } from 'node:module'; import { webpackConfigFactory } from './webpack-config.factory.js'; -// Disable v8-caching because it breaks ESM loaders -NativeCompileCache.uninstall(); - const require = createRequire(import.meta.url); export const ngEnvOptions: AngularEnvOptions = { useAngularElementsPreview: false, - // angularElementsModulePath: require.resolve('@angular/elements'), - jestConfigPath: require.resolve('./jest/jest.config.cjs'), + // angularElementsModulePath: req.resolve('@angular/elements'), jestModulePath: require.resolve('jest'), - ngPackagrModulePath: import.meta.resolve('ng-packagr'), + ngPackagrModulePath: require.resolve('ng-packagr'), webpackConfigFactory, webpackDevServerModulePath: require.resolve('webpack-dev-server'), // resolving to the webpack used by angular devkit to avoid multiple instances of webpack @@ -32,6 +27,9 @@ export class AngularV19Env extends AngularBaseEnv { angularVersion = 19; ngEnvOptions: AngularEnvOptions = ngEnvOptions; + + /* Jest config. Learn how to replace tester - https://bit.dev/reference/testing/set-up-tester */ + protected jestConfigPath = require.resolve('./jest/jest.config.cjs'); } export default new AngularV19Env(); diff --git a/angular/envs/angular-v19-env/angular-v19-env.docs.mdx b/angular/envs/angular-v19-env/angular-v19-env.docs.mdx index 2fa7c23b..731165d4 100644 --- a/angular/envs/angular-v19-env/angular-v19-env.docs.mdx +++ b/angular/envs/angular-v19-env/angular-v19-env.docs.mdx @@ -60,8 +60,7 @@ import { EnvOverview } from '@teambit/envs.docs.env-overview-template'; name: 'Component Preview', toolLink: 'https://bit.cloud/bitdev/angular/dev-services/preview/mounter', configFiles: [ - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/mounter.ts', - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/host-dependencies.ts', + 'https://bit.cloud/bitdev/angular/envs/base-env/~code/config/mounter.ts' ], }, { diff --git a/angular/envs/angular-v19-env/component.json b/angular/envs/angular-v19-env/component.json index af32e418..1a8a0cd1 100644 --- a/angular/envs/angular-v19-env/component.json +++ b/angular/envs/angular-v19-env/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "envs/angular-v19-env", - "version": "1.1.0" + "version": "2.0.1" }, "propagate": false, "extensions": { @@ -67,7 +67,9 @@ } } }, - "bitdev.general/envs/bit-env@1.0.1": {}, - "teambit.envs/envs": {} + "bitdev.general/envs/bit-env@1.0.21": {}, + "teambit.envs/envs": { + "env": "bitdev.general/envs/bit-env" + } } } diff --git a/angular/envs/angular-v19-env/env.jsonc b/angular/envs/angular-v19-env/env.jsonc index d413aee8..5f811413 100644 --- a/angular/envs/angular-v19-env/env.jsonc +++ b/angular/envs/angular-v19-env/env.jsonc @@ -24,13 +24,6 @@ "hidden": true, "force": true }, - { - "name": "@types/jest", - "version": "^29.5.0", - "supportedRange": "^29.0.0", - "hidden": true, - "force": true - }, { "name": "@types/node", "version": "^20.11.22", @@ -84,7 +77,7 @@ { "name": "@angular/platform-browser", "version": "^19.0.0", - "supportedRange": "19.0.0" + "supportedRange": "^19.0.0" }, { "name": "@angular/platform-browser-dynamic", @@ -111,6 +104,11 @@ "version": "^8.40.0", "supportedRange": "^8.40.0" }, + { + "name": "@types/jest", + "version": "^29.5.0", + "supportedRange": "^29.0.0" + }, { "name": "express", "version": "~4.21.1", diff --git a/angular/envs/angular-v19-env/index.ts b/angular/envs/angular-v19-env/index.ts index 7ea66394..09234856 100644 --- a/angular/envs/angular-v19-env/index.ts +++ b/angular/envs/angular-v19-env/index.ts @@ -1,3 +1 @@ export { AngularV19Env, ngEnvOptions } from './angular-v19-env.bit-env.js'; -// @ts-ignore -export { default as jestConfig } from './jest/jest.config.cjs'; diff --git a/angular/envs/angular-v19-env/webpack-config.factory.ts b/angular/envs/angular-v19-env/webpack-config.factory.ts index b691057f..67b1cbb5 100644 --- a/angular/envs/angular-v19-env/webpack-config.factory.ts +++ b/angular/envs/angular-v19-env/webpack-config.factory.ts @@ -1,7 +1,7 @@ /* eslint-disable no-param-reassign */ import { OutputHashing } from '@angular-devkit/build-angular'; import { getSystemPath, normalize, tags } from '@angular-devkit/core'; -import { BundlerSetup, dedupPaths, getLoggerApi } from '@bitdev/angular.dev-services.common'; +import { BundlerSetup, dedupePaths, getLoggerApi } from '@bitdev/angular.dev-services.common'; import type { BrowserBuilderOptions} from '@bitdev/angular.dev-services.ng-compat'; import { generateEntryPoints, @@ -108,8 +108,8 @@ async function getWebpackConfig( main: angularOptions.browser ?? `./${join(sourceRoot, `main.ts`)}`, polyfills: angularOptions.polyfills, tsConfig: angularOptions.tsConfig ?? tsconfigPath, - assets: dedupPaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]), - styles: dedupPaths([posix.join(sourceRoot, `styles.${ angularOptions.inlineStyleLanguage ?? 'scss' }`), ...(angularOptions.styles ?? [])]), + assets: dedupePaths([posix.join(sourceRoot, `assets/**/*`), ...(angularOptions.assets ?? [])]), + styles: dedupePaths([posix.join(sourceRoot, `styles.${ angularOptions.inlineStyleLanguage ?? 'scss' }`), ...(angularOptions.styles ?? [])]), scripts: angularOptions.scripts, vendorChunk: angularOptions.vendorChunk ?? true, namedChunks: angularOptions.namedChunks ?? true, diff --git a/angular/envs/angular-v19-env/webpack/module-rules.config.ts b/angular/envs/angular-v19-env/webpack/module-rules.config.ts index bfdf9b8c..00c99cc7 100644 --- a/angular/envs/angular-v19-env/webpack/module-rules.config.ts +++ b/angular/envs/angular-v19-env/webpack/module-rules.config.ts @@ -1,7 +1,8 @@ import { generateStyleLoaders } from '@teambit/webpack.modules.generate-style-loaders'; import * as stylesRegexps from '@teambit/webpack.modules.style-regexps'; import { merge } from 'lodash-es'; -import { createRequire } from 'node:module'; +// @ts-ignore +import postCssPresetEnv from 'postcss-preset-env'; // @ts-ignore import getLocalIdent from 'react-dev-utils-esm/getCSSModuleLocalIdent.js'; import RemarkFrontmatter from 'remark-frontmatter'; @@ -9,17 +10,13 @@ import RemarkHTML from 'remark-html'; import RemarkPrism from 'remark-prism'; import { RuleSetRule } from 'webpack'; -const require = createRequire(import.meta.url); - const postCssConfig = { // Necessary for external CSS imports to work // https://github.com/facebook/create-react-app/issues/2677 ident: 'postcss', plugins: [ - // eslint-disable-next-line global-require - require.resolve('postcss-flexbugs-fixes'), - // eslint-disable-next-line global-require - require('postcss-preset-env')({ + import.meta.resolve('postcss-flexbugs-fixes'), + postCssPresetEnv({ autoprefixer: { flexbox: 'no-2009', }, @@ -28,11 +25,11 @@ const postCssConfig = { // Adds PostCSS Normalize as the reset css with default options, // so that it honors browserslist config in package.json // which in turn lets users customize the target behavior as per their needs. - // require.resolve('postcss-normalize'), + // import.meta.resolve('postcss-normalize'), ], }; -const styleLoaderPath = require.resolve('style-loader'); +const styleLoaderPath = import.meta.resolve('style-loader'); // Source maps are resource heavy and can cause out of memory issue for large source files. const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false'; @@ -40,8 +37,8 @@ const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false'; export function getModuleRulesConfig(isEnvProduction: boolean): RuleSetRule[] { const baseStyleLoadersOptions = { injectingLoader: styleLoaderPath, - cssLoaderPath: require.resolve('css-loader'), - postCssLoaderPath: require.resolve('postcss-loader'), + cssLoaderPath: import.meta.resolve('css-loader'), + postCssLoaderPath: import.meta.resolve('postcss-loader'), postCssConfig }; @@ -130,8 +127,8 @@ export function getModuleRulesConfig(isEnvProduction: boolean): RuleSetRule[] { }, shouldUseSourceMap: isEnvProduction || shouldUseSourceMap, preProcessOptions: { - resolveUrlLoaderPath: require.resolve('resolve-url-loader'), - preProcessorPath: require.resolve('sass-loader') + resolveUrlLoaderPath: import.meta.resolve('resolve-url-loader'), + preProcessorPath: import.meta.resolve('sass-loader') } }) ) diff --git a/angular/envs/base-env/angular-base-env.bit-env.ts b/angular/envs/base-env/angular-base-env.bit-env.ts index b2725c18..a017784d 100644 --- a/angular/envs/base-env/angular-base-env.bit-env.ts +++ b/angular/envs/base-env/angular-base-env.bit-env.ts @@ -1,20 +1,13 @@ import { AngularEnvOptions } from '@bitdev/angular.dev-services.common'; -import { - NgMultiCompiler, - NgMultiCompilerTask -} from '@bitdev/angular.dev-services.compiler.multi-compiler'; -import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; +import { NgMultiCompiler, NgMultiCompilerTask } from '@bitdev/angular.dev-services.compiler.multi-compiler'; +import { AngularVitePreview } from "@bitdev/angular.dev-services.preview.vite-preview"; import { NgAppTemplate, NgEnvTemplate, NgModuleTemplate, NgStandaloneTemplate } from '@bitdev/angular.templates.generators'; -import { - AngularStarter, - DesignSystemStarter, - MaterialDesignSystemStarter -} from '@bitdev/angular.templates.starters'; +import { AngularStarter, DesignSystemStarter, MaterialDesignSystemStarter } from '@bitdev/angular.templates.starters'; import { CAPSULE_ARTIFACTS_DIR, Pipeline } from '@teambit/builder'; import { Compiler } from '@teambit/compiler'; import { EslintConfigWriter, ESLintLinter, EslintTask } from '@teambit/defender.eslint-linter'; @@ -35,7 +28,6 @@ import { ESLint as ESLintLib } from 'eslint'; import { merge } from 'lodash-es'; import { createRequire } from 'node:module'; import { AngularEnvInterface } from './angular-env.interface.js'; -import hostDependencies from './preview/host-dependencies.js'; let ngMultiCompiler: EnvHandler | undefined; @@ -56,6 +48,23 @@ export abstract class AngularBaseEnv implements AngularEnvInterface { [key: string]: any; + /*** Default functions & properties that custom envs will override ***/ + /* Typescript config used for linter, schema extractor and config writer */ + protected tsconfigPath = require.resolve('./config/tsconfig.json'); + + /* ESLint config. Learn how to replace linter - https://bit.dev/reference/linting/set-up-linter */ + protected eslintConfigPath = require.resolve('./config/eslintrc.cjs'); + + /* Prettier config. Learn how to replace formatter - https://bit.dev/reference/formatting/set-up-formatter */ + protected prettierConfigPath = require.resolve('./config/prettier.config.cjs'); + + /* Component mounting and dev-server config. Learn how to replace dev-server - https://bit.dev/reference/preview/setup-preview */ + protected previewMounterPath = require.resolve('./config/mounter.js'); + + /* Jest config. Learn how to replace tester - https://bit.dev/reference/testing/set-up-tester */ + protected abstract jestConfigPath: string; + /*** End of default functions & properties ***/ + public getNgEnvOptions(): AngularEnvOptions { return { ...this.ngEnvOptions }; } @@ -98,15 +107,15 @@ export abstract class AngularBaseEnv implements AngularEnvInterface { formatter(): EnvHandler { return PrettierFormatter.from({ - configPath: require.resolve('./config/prettier.config.cjs') + configPath: this.prettierConfigPath }); } getLinterConfig(): any { return { - tsconfig: require.resolve('./config/tsconfig.json'), + tsconfig: this.tsconfigPath, eslint: ESLintLib, - configPath: require.resolve('./config/eslintrc.cjs'), + configPath: this.eslintConfigPath, // resolve all plugins from the angular environment. pluginsPath: import.meta.dirname, extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs'] @@ -149,12 +158,22 @@ export abstract class AngularBaseEnv implements AngularEnvInterface { } preview(): EnvHandler { + return AngularVitePreview.from({ + mounterPath: this.previewMounterPath + }); + + /*const hostDependencies = [ + '@teambit/mdx.ui.mdx-scope-context', + '@mdx-js/react', + 'react', + 'react-dom', + ]; const ngEnvOptions = this.getNgEnvOptions(); return AngularPreview.from({ ngEnvOptions, hostDependencies, - mounterPath: require.resolve('./preview/mounter.js'), - }); + mounterPath: this.previewMounterPath + });*/ } /** @@ -163,7 +182,7 @@ export abstract class AngularBaseEnv implements AngularEnvInterface { */ schemaExtractor(): EnvHandler { return TypeScriptExtractor.from({ - tsconfig: require.resolve('./config/tsconfig.json') + tsconfig: this.tsconfigPath }); } @@ -213,23 +232,22 @@ export abstract class AngularBaseEnv implements AngularEnvInterface { workspaceConfig(): ConfigWriterList { return ConfigWriterList.from([ TypescriptConfigWriter.from({ - tsconfig: require.resolve('./config/tsconfig.json') + tsconfig: this.tsconfigPath }), EslintConfigWriter.from({ - configPath: require.resolve('./config/eslintrc.cjs'), - tsconfig: require.resolve('./config/tsconfig.json') + configPath: this.eslintConfigPath, + tsconfig: this.tsconfigPath }), PrettierConfigWriter.from({ - configPath: require.resolve('./config/prettier.config.cjs') + configPath: this.prettierConfigPath }) ]); } getTesterConfig() { - const ngEnvOptions = this.getNgEnvOptions(); return { - jest: ngEnvOptions.jestModulePath, - config: ngEnvOptions.jestConfigPath + jest: this.jestModulePath, + config: this.jestConfigPath }; // return VitestTester.from({ // config: require.resolve(ngEnvOptions.vitestConfigPath) diff --git a/angular/envs/base-env/component.json b/angular/envs/base-env/component.json index ba9efa83..938208c4 100644 --- a/angular/envs/base-env/component.json +++ b/angular/envs/base-env/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "envs/base-env", - "version": "7.1.0" + "version": "8.0.1" }, "propagate": false, "extensions": { @@ -52,14 +52,16 @@ } } }, - "teambit.envs/envs": {}, - "bitdev.node/node-env@2.0.2": {}, "teambit.component/renaming": { "renamedFrom": { "scope": "bitdev.angular", "name": "envs/base", "version": "547117b9b87b26959751781746560193ca3af410" } + }, + "bitdev.node/node-env@2.0.40": {}, + "teambit.envs/envs": { + "env": "bitdev.node/node-env" } } } diff --git a/angular/envs/base-env/config/mounter.ts b/angular/envs/base-env/config/mounter.ts new file mode 100644 index 00000000..e0b86263 --- /dev/null +++ b/angular/envs/base-env/config/mounter.ts @@ -0,0 +1,27 @@ +import { createMounter } from '@bitdev/angular.dev-services.preview.mounter'; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import { Component, ViewEncapsulation } from '@angular/core'; + +/** + * Provide your component compositions (preview) with the context they need to run. + * for example, a router, a theme, a data provider, etc. + * components added here as providers should be listed as host-dependencies + * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers + */ +@Component({ + selector: 'bit-wrapper', + // @ts-ignore + standalone: true, + imports: [], + encapsulation: ViewEncapsulation.None, + template: ` + + `, +}) export class WrapperComponent {} + +/** + * the entry for the app (preview runtime) that renders your component previews. + * use the default template or create your own. + * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers + */ +export default createMounter(WrapperComponent); diff --git a/angular/envs/base-env/index.ts b/angular/envs/base-env/index.ts index bf36fe2b..94b91a3a 100644 --- a/angular/envs/base-env/index.ts +++ b/angular/envs/base-env/index.ts @@ -1,4 +1,2 @@ export { AngularBaseEnv } from './angular-base-env.bit-env.js'; export type { AngularEnvInterface } from './angular-env.interface.js'; -// @ts-ignore -export { default as prettierConfig } from './config/prettier.config.cjs'; diff --git a/angular/envs/base-env/preview/host-dependencies.ts b/angular/envs/base-env/preview/host-dependencies.ts deleted file mode 100644 index 6f6a9bb7..00000000 --- a/angular/envs/base-env/preview/host-dependencies.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Dependencies to be bundled only once, in the env preview template, and not in each component preview. - * most of your peer dependencies should be listed here to avoid duplications in the preview. - * React, ReactDOM, and MDX are included as they are part of the preview ui. - */ -export default [ - '@teambit/mdx.ui.mdx-scope-context', - '@mdx-js/react', - 'react', - 'react-dom', -]; diff --git a/angular/examples/my-angular-env/component.json b/angular/examples/my-angular-env/component.json index 4ef9c801..518ed2cb 100644 --- a/angular/examples/my-angular-env/component.json +++ b/angular/examples/my-angular-env/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "examples/my-angular-env", - "version": "7.1.0" + "version": "8.0.1" }, "propagate": false, "extensions": { @@ -18,14 +18,16 @@ } } }, - "bitdev.general/envs/bit-env@1.0.1": {}, - "teambit.envs/envs": {}, "teambit.component/renaming": { "renamedFrom": { "scope": "bitdev.angular", "name": "examples/angular-env", "version": "1.0.1" } + }, + "bitdev.general/envs/bit-env@1.0.21": {}, + "teambit.envs/envs": { + "env": "bitdev.general/envs/bit-env" } } } diff --git a/angular/examples/my-angular-v17-env/preview/mounter.ts b/angular/examples/my-angular-env/config/mounter.ts similarity index 95% rename from angular/examples/my-angular-v17-env/preview/mounter.ts rename to angular/examples/my-angular-env/config/mounter.ts index 6831d115..1420a724 100644 --- a/angular/examples/my-angular-v17-env/preview/mounter.ts +++ b/angular/examples/my-angular-env/config/mounter.ts @@ -5,7 +5,7 @@ import { Component, ViewEncapsulation } from '@angular/core'; /** * Provide your component compositions (preview) with the context they need to run. * for example, a router, a theme, a data provider, etc. - * components added here as providers should be listed as host-dependencies in your host-dependencies.ts file. + * components added here as providers should be listed as host-dependencies * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers */ @Component({ diff --git a/angular/examples/my-angular-env/env.jsonc b/angular/examples/my-angular-env/env.jsonc index d345a517..7fdba035 100644 --- a/angular/examples/my-angular-env/env.jsonc +++ b/angular/examples/my-angular-env/env.jsonc @@ -18,13 +18,6 @@ * as a direct component dependencies. they are used for component development only. **/ "dev": [ - { - "name": "@types/jest", - "version": "^29.5.0", - "supportedRange": "^29.0.0", - "hidden": true, - "force": true - }, { "name": "@types/node", "version": "^20.11.22", @@ -84,7 +77,7 @@ { "name": "@angular/platform-browser", "version": "^19.0.0", - "supportedRange": "19.0.0" + "supportedRange": "^19.0.0" }, { "name": "@angular/platform-browser-dynamic", @@ -111,6 +104,11 @@ "version": "^8.40.0", "supportedRange": "^8.40.0" }, + { + "name": "@types/jest", + "version": "^29.5.0", + "supportedRange": "^29.0.0" + }, { "name": "express", "version": "~4.21.1", diff --git a/angular/examples/my-angular-env/my-angular-env.bit-env.ts b/angular/examples/my-angular-env/my-angular-env.bit-env.ts index 369cf101..93f8a604 100644 --- a/angular/examples/my-angular-env/my-angular-env.bit-env.ts +++ b/angular/examples/my-angular-env/my-angular-env.bit-env.ts @@ -1,141 +1,26 @@ import { AngularEnv } from '@bitdev/angular.angular-env'; -import { - NgMultiCompiler, - NgMultiCompilerTask -} from '@bitdev/angular.dev-services.compiler.multi-compiler'; -import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; -import { Pipeline } from '@teambit/builder'; -import { Compiler } from '@teambit/compiler'; -import { EslintConfigWriter, ESLintLinter, EslintTask } from '@teambit/defender.eslint-linter'; -import { JestTask, JestTester } from '@teambit/defender.jest-tester'; -import { PrettierConfigWriter, PrettierFormatter } from '@teambit/defender.prettier-formatter'; -import { EnvHandler } from '@teambit/envs'; -import { Linter } from '@teambit/linter'; -import { Preview } from '@teambit/preview'; -import { Tester } from '@teambit/tester'; -import { TypescriptConfigWriter } from '@teambit/typescript.typescript-compiler'; -import { ConfigWriterList } from '@teambit/workspace-config-files'; -import { ESLint as ESLintLib } from 'eslint'; import { createRequire } from 'node:module'; -import hostDependencies from './preview/host-dependencies.js'; -let ngMultiCompiler: EnvHandler | undefined; - -const require = createRequire(import.meta.url); +const req = createRequire(import.meta.url); export class MyAngularEnv extends AngularEnv { - // Name of the environment, used for friendly mentions across bit + /* Name of the environment, used for friendly mentions across bit */ name = 'my-angular-env'; - getTesterConfig() { - return { - jest: require.resolve('jest'), - config: require.resolve('./config/jest.config.cjs') - }; - } - - /** - * Returns a tester to use during development - * Required for `bit start` & `bit test` - */ - override tester(): EnvHandler { - /** - * @see https://bit.dev/reference/jest/using-jest - * */ - return JestTester.from(this.getTesterConfig()); - } - - getLinterConfig() { - return { - tsconfig: require.resolve('./config/tsconfig.json'), - eslint: ESLintLib, - configPath: require.resolve('./config/eslintrc.cjs'), - // resolve all plugins from the angular environment. - pluginsPath: import.meta.dirname, - extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs'] - }; - } - - /** - * Returns an instance of the compiler - * Required for making and reading dists, especially for `bit compile` - */ - compiler(): EnvHandler { - if (!ngMultiCompiler) { - ngMultiCompiler = NgMultiCompiler.from({ - ngEnvOptions: this.getNgEnvOptions(), - tsconfigPath: require.resolve('./config/tsconfig.json'), - }); - } - return ngMultiCompiler!; - } - - /** - * The linter to use during development. - * Config files would be used to validate coding standards in components. - * bit will write the minimum required files in any workspace to optimize - * for dev experience. - */ - override linter(): EnvHandler { - return ESLintLinter.from(this.getLinterConfig()); - } + /* Typescript config used for linter, schema extractor and config writer */ + protected tsconfigPath = req.resolve('./config/tsconfig.json'); - /** - * The formatter to use during development - * (source files are not formatted as part of the components' build) - * */ - override formatter() { - /** - * @see https://bit.dev/reference/prettier/using-prettier - * */ - return PrettierFormatter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }); - } + /* ESLint config. Learn how to replace linter - https://bit.dev/reference/linting/set-up-linter */ + protected eslintConfigPath = req.resolve('./config/eslintrc.cjs'); - /** - * Generates the component previews during development and build - */ - override preview(): EnvHandler { - const tsConfig = require.resolve('./config/tsconfig.json'); - return AngularPreview.from({ - ngEnvOptions: this.getNgEnvOptions(), - hostDependencies, - mounterPath: require.resolve('./preview/mounter.js'), - angularServeOptions: { tsConfig }, - angularBuildOptions: { tsConfig }, - }); - } + /* Prettier config. Learn how to replace formatter - https://bit.dev/reference/formatting/set-up-formatter */ + protected prettierConfigPath = req.resolve('./config/prettier.config.cjs'); - /** - * Defines the build pipeline for a component. - * Pipelines are optimized for performance and consistency, making sure every component is - * independently built and tested. - * This is a set of processes to be performed before a component is snapped, during its build phase - * @see https://bit.dev/docs/my-angular-env/build-pipelines - */ - override build(): Pipeline { - return Pipeline.from([ - NgMultiCompilerTask.from({ ngMultiCompiler: this.compiler() }), - EslintTask.from(this.getLinterConfig()), - JestTask.from(this.getTesterConfig()) - ]); - } + /* Component mounting and dev-server config. Learn how to replace dev-server - https://bit.dev/reference/preview/setup-preview */ + protected previewMounterPath = req.resolve('./config/mounter.js'); - override workspaceConfig(): ConfigWriterList { - return ConfigWriterList.from([ - TypescriptConfigWriter.from({ - tsconfig: require.resolve('./config/tsconfig.json') - }), - EslintConfigWriter.from({ - configPath: require.resolve('./config/eslintrc.cjs'), - tsconfig: require.resolve('./config/tsconfig.json') - }), - PrettierConfigWriter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }) - ]); - } + /* Jest config. Learn how to replace tester - https://bit.dev/reference/testing/set-up-tester */ + protected jestConfigPath = req.resolve('./config/jest.config.cjs'); } export default new MyAngularEnv(); diff --git a/angular/examples/my-angular-env/my-angular-env.docs.mdx b/angular/examples/my-angular-env/my-angular-env.docs.mdx index 9cf3bfcb..9133eb13 100644 --- a/angular/examples/my-angular-env/my-angular-env.docs.mdx +++ b/angular/examples/my-angular-env/my-angular-env.docs.mdx @@ -61,8 +61,7 @@ import { EnvOverview } from '@teambit/envs.docs.env-overview-template'; name: 'Component Preview', toolLink: 'https://bit.cloud/bitdev/angular/dev-services/preview/mounter', configFiles: [ - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/mounter.ts', - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/host-dependencies.ts', + 'https://bit.cloud/bitdev/angular/envs/base-env/~code/config/mounter.ts' ], }, { diff --git a/angular/examples/my-angular-env/preview/host-dependencies.ts b/angular/examples/my-angular-env/preview/host-dependencies.ts deleted file mode 100644 index 6f6a9bb7..00000000 --- a/angular/examples/my-angular-env/preview/host-dependencies.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Dependencies to be bundled only once, in the env preview template, and not in each component preview. - * most of your peer dependencies should be listed here to avoid duplications in the preview. - * React, ReactDOM, and MDX are included as they are part of the preview ui. - */ -export default [ - '@teambit/mdx.ui.mdx-scope-context', - '@mdx-js/react', - 'react', - 'react-dom', -]; diff --git a/angular/examples/my-angular-v16-env/component.json b/angular/examples/my-angular-v16-env/component.json index e91ef92d..c6e4b363 100644 --- a/angular/examples/my-angular-v16-env/component.json +++ b/angular/examples/my-angular-v16-env/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "examples/my-angular-v16-env", - "version": "6.1.0" + "version": "7.0.1" }, "propagate": false, "extensions": { @@ -17,14 +17,16 @@ } } }, - "bitdev.general/envs/bit-env@1.0.1": {}, - "teambit.envs/envs": {}, "teambit.component/renaming": { "renamedFrom": { "scope": "bitdev.angular", "name": "examples/angular-v16-env", "version": "1.0.1" } + }, + "bitdev.general/envs/bit-env@1.0.21": {}, + "teambit.envs/envs": { + "env": "bitdev.general/envs/bit-env" } } } diff --git a/angular/examples/my-angular-v18-env/preview/mounter.ts b/angular/examples/my-angular-v16-env/config/mounter.ts similarity index 95% rename from angular/examples/my-angular-v18-env/preview/mounter.ts rename to angular/examples/my-angular-v16-env/config/mounter.ts index 6831d115..1420a724 100644 --- a/angular/examples/my-angular-v18-env/preview/mounter.ts +++ b/angular/examples/my-angular-v16-env/config/mounter.ts @@ -5,7 +5,7 @@ import { Component, ViewEncapsulation } from '@angular/core'; /** * Provide your component compositions (preview) with the context they need to run. * for example, a router, a theme, a data provider, etc. - * components added here as providers should be listed as host-dependencies in your host-dependencies.ts file. + * components added here as providers should be listed as host-dependencies * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers */ @Component({ diff --git a/angular/examples/my-angular-v16-env/env.jsonc b/angular/examples/my-angular-v16-env/env.jsonc index ab1e5f9e..9f6c02f9 100644 --- a/angular/examples/my-angular-v16-env/env.jsonc +++ b/angular/examples/my-angular-v16-env/env.jsonc @@ -18,13 +18,6 @@ * as a direct component dependencies. they are used for component development only. **/ "dev": [ - { - "name": "@types/jest", - "version": "^29.5.0", - "supportedRange": "^29.0.0", - "hidden": true, - "force": true - }, { "name": "@types/node", "version": "^16.11.7", @@ -95,6 +88,11 @@ "version": "^8.40.0", "supportedRange": "^8.40.0" }, + { + "name": "@types/jest", + "version": "^29.5.0", + "supportedRange": "^29.0.0" + }, { "name": "jest", "version": "^29.5.0", diff --git a/angular/examples/my-angular-v16-env/my-angular-v16-env.bit-env.ts b/angular/examples/my-angular-v16-env/my-angular-v16-env.bit-env.ts index 0cd48761..7a5caa20 100644 --- a/angular/examples/my-angular-v16-env/my-angular-v16-env.bit-env.ts +++ b/angular/examples/my-angular-v16-env/my-angular-v16-env.bit-env.ts @@ -1,141 +1,26 @@ -import { - NgMultiCompiler, - NgMultiCompilerTask -} from '@bitdev/angular.dev-services.compiler.multi-compiler'; -import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; import { AngularV16Env } from '@bitdev/angular.envs.angular-v16-env'; -import { Pipeline } from '@teambit/builder'; -import { Compiler } from '@teambit/compiler'; -import { EslintConfigWriter, ESLintLinter, EslintTask } from '@teambit/defender.eslint-linter'; -import { JestTask, JestTester } from '@teambit/defender.jest-tester'; -import { PrettierConfigWriter, PrettierFormatter } from '@teambit/defender.prettier-formatter'; -import { EnvHandler } from '@teambit/envs'; -import { Linter } from '@teambit/linter'; -import { Preview } from '@teambit/preview'; -import { Tester } from '@teambit/tester'; -import { TypescriptConfigWriter } from '@teambit/typescript.typescript-compiler'; -import { ConfigWriterList } from '@teambit/workspace-config-files'; -import { ESLint as ESLintLib } from 'eslint'; import { createRequire } from 'node:module'; -import hostDependencies from './preview/host-dependencies.js'; -let ngMultiCompiler: EnvHandler | undefined; - -const require = createRequire(import.meta.url); +const req = createRequire(import.meta.url); export class MyAngularV16Env extends AngularV16Env { - // Name of the environment, used for friendly mentions across bit + /* Name of the environment, used for friendly mentions across bit */ name = 'my-angular-v16-env'; - getTesterConfig() { - return { - jest: require.resolve('jest'), - config: require.resolve('./config/jest.config.cjs') - }; - } - - /** - * Returns a tester to use during development - * Required for `bit start` & `bit test` - */ - override tester(): EnvHandler { - /** - * @see https://bit.dev/reference/jest/using-jest - * */ - return JestTester.from(this.getTesterConfig()); - } - - getLinterConfig() { - return { - tsconfig: require.resolve('./config/tsconfig.json'), - eslint: ESLintLib, - configPath: require.resolve('./config/eslintrc.cjs'), - // resolve all plugins from the angular environment. - pluginsPath: import.meta.dirname, - extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs'] - }; - } - - /** - * Returns an instance of the compiler - * Required for making and reading dists, especially for `bit compile` - */ - compiler(): EnvHandler { - if (!ngMultiCompiler) { - ngMultiCompiler = NgMultiCompiler.from({ - ngEnvOptions: this.getNgEnvOptions(), - tsconfigPath: require.resolve('./config/tsconfig.json'), - }); - } - return ngMultiCompiler!; - } - - /** - * The linter to use during development. - * Config files would be used to validate coding standards in components. - * bit will write the minimum required files in any workspace to optimize - * for dev experience. - */ - override linter(): EnvHandler { - return ESLintLinter.from(this.getLinterConfig()); - } + /* Typescript config used for linter, schema extractor and config writer */ + protected tsconfigPath = req.resolve('./config/tsconfig.json'); - /** - * The formatter to use during development - * (source files are not formatted as part of the components' build) - * */ - override formatter() { - /** - * @see https://bit.dev/reference/prettier/using-prettier - * */ - return PrettierFormatter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }); - } + /* ESLint config. Learn how to replace linter - https://bit.dev/reference/linting/set-up-linter */ + protected eslintConfigPath = req.resolve('./config/eslintrc.cjs'); - /** - * Generates the component previews during development and build - */ - override preview(): EnvHandler { - const tsConfig = require.resolve('./config/tsconfig.json'); - return AngularPreview.from({ - ngEnvOptions: this.getNgEnvOptions(), - hostDependencies, - mounterPath: require.resolve('./preview/mounter.js'), - angularServeOptions: { tsConfig }, - angularBuildOptions: { tsConfig }, - }); - } + /* Prettier config. Learn how to replace formatter - https://bit.dev/reference/formatting/set-up-formatter */ + protected prettierConfigPath = req.resolve('./config/prettier.config.cjs'); - /** - * Defines the build pipeline for a component. - * Pipelines are optimized for performance and consistency, making sure every component is - * independently built and tested. - * This is a set of processes to be performed before a component is snapped, during its build phase - * @see https://bit.dev/docs/angular-env/build-pipelines - */ - override build(): Pipeline { - return Pipeline.from([ - NgMultiCompilerTask.from({ ngMultiCompiler: this.compiler() }), - EslintTask.from(this.getLinterConfig()), - JestTask.from(this.getTesterConfig()) - ]); - } + /* Component mounting and dev-server config. Learn how to replace dev-server - https://bit.dev/reference/preview/setup-preview */ + protected previewMounterPath = req.resolve('./config/mounter.js'); - override workspaceConfig(): ConfigWriterList { - return ConfigWriterList.from([ - TypescriptConfigWriter.from({ - tsconfig: require.resolve('./config/tsconfig.json') - }), - EslintConfigWriter.from({ - configPath: require.resolve('./config/eslintrc.cjs'), - tsconfig: require.resolve('./config/tsconfig.json') - }), - PrettierConfigWriter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }) - ]); - } + /* Jest config. Learn how to replace tester - https://bit.dev/reference/testing/set-up-tester */ + protected jestConfigPath = req.resolve('./config/jest.config.cjs'); } export default new MyAngularV16Env(); diff --git a/angular/examples/my-angular-v16-env/my-angular-v16-env.docs.mdx b/angular/examples/my-angular-v16-env/my-angular-v16-env.docs.mdx index 75a0dcaf..f2843bb7 100644 --- a/angular/examples/my-angular-v16-env/my-angular-v16-env.docs.mdx +++ b/angular/examples/my-angular-v16-env/my-angular-v16-env.docs.mdx @@ -61,8 +61,7 @@ import { EnvOverview } from '@teambit/envs.docs.env-overview-template'; name: 'Component Preview', toolLink: 'https://bit.cloud/bitdev/angular/dev-services/preview/mounter', configFiles: [ - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/mounter.ts', - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/host-dependencies.ts', + 'https://bit.cloud/bitdev/angular/envs/base-env/~code/config/mounter.ts' ], }, { diff --git a/angular/examples/my-angular-v16-env/preview/host-dependencies.ts b/angular/examples/my-angular-v16-env/preview/host-dependencies.ts deleted file mode 100644 index 6f6a9bb7..00000000 --- a/angular/examples/my-angular-v16-env/preview/host-dependencies.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Dependencies to be bundled only once, in the env preview template, and not in each component preview. - * most of your peer dependencies should be listed here to avoid duplications in the preview. - * React, ReactDOM, and MDX are included as they are part of the preview ui. - */ -export default [ - '@teambit/mdx.ui.mdx-scope-context', - '@mdx-js/react', - 'react', - 'react-dom', -]; diff --git a/angular/examples/my-angular-v17-env/component.json b/angular/examples/my-angular-v17-env/component.json index 0a9e9386..cb6ffc93 100644 --- a/angular/examples/my-angular-v17-env/component.json +++ b/angular/examples/my-angular-v17-env/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "examples/my-angular-v17-env", - "version": "6.1.0" + "version": "7.0.1" }, "propagate": false, "extensions": { @@ -17,7 +17,9 @@ } } }, - "bitdev.general/envs/bit-env@1.0.1": {}, - "teambit.envs/envs": {} + "bitdev.general/envs/bit-env@1.0.21": {}, + "teambit.envs/envs": { + "env": "bitdev.general/envs/bit-env" + } } } diff --git a/angular/examples/my-angular-env/preview/mounter.ts b/angular/examples/my-angular-v17-env/config/mounter.ts similarity index 95% rename from angular/examples/my-angular-env/preview/mounter.ts rename to angular/examples/my-angular-v17-env/config/mounter.ts index 6831d115..1420a724 100644 --- a/angular/examples/my-angular-env/preview/mounter.ts +++ b/angular/examples/my-angular-v17-env/config/mounter.ts @@ -5,7 +5,7 @@ import { Component, ViewEncapsulation } from '@angular/core'; /** * Provide your component compositions (preview) with the context they need to run. * for example, a router, a theme, a data provider, etc. - * components added here as providers should be listed as host-dependencies in your host-dependencies.ts file. + * components added here as providers should be listed as host-dependencies * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers */ @Component({ diff --git a/angular/examples/my-angular-v17-env/env.jsonc b/angular/examples/my-angular-v17-env/env.jsonc index 704692e3..a5333fa5 100644 --- a/angular/examples/my-angular-v17-env/env.jsonc +++ b/angular/examples/my-angular-v17-env/env.jsonc @@ -18,13 +18,6 @@ * as a direct component dependencies. they are used for component development only. **/ "dev": [ - { - "name": "@types/jest", - "version": "^29.5.0", - "supportedRange": "^29.0.0", - "hidden": true, - "force": true - }, { "name": "@types/node", "version": "^20.11.22", @@ -42,59 +35,64 @@ "peers": [ { "name": "@angular/animations", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/common", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/compiler", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/compiler-cli", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/core", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/forms", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/platform-browser", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/platform-browser-dynamic", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/platform-server", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@angular/router", - "version": "^17.0.0", - "supportedRange": "^17.0.0" + "version": "^17.3.0", + "supportedRange": "^17.3.0" }, { "name": "@types/eslint", "version": "^8.40.0", "supportedRange": "^8.40.0" }, + { + "name": "@types/jest", + "version": "^29.5.0", + "supportedRange": "^29.0.0" + }, { "name": "jest", "version": "^29.5.0", diff --git a/angular/examples/my-angular-v17-env/index.ts b/angular/examples/my-angular-v17-env/index.ts index d54add6b..0e0f4d0a 100644 --- a/angular/examples/my-angular-v17-env/index.ts +++ b/angular/examples/my-angular-v17-env/index.ts @@ -1,3 +1 @@ export { MyAngularV17Env, MyAngularV17Env as default } from './my-angular-v17-env.bit-env.js'; -// @ts-ignore -export { default as jestConfig } from './config/jest.config.cjs'; \ No newline at end of file diff --git a/angular/examples/my-angular-v17-env/my-angular-v17-env.bit-env.ts b/angular/examples/my-angular-v17-env/my-angular-v17-env.bit-env.ts index 0b76e6de..bae92eb6 100644 --- a/angular/examples/my-angular-v17-env/my-angular-v17-env.bit-env.ts +++ b/angular/examples/my-angular-v17-env/my-angular-v17-env.bit-env.ts @@ -1,141 +1,26 @@ -import { - NgMultiCompiler, - NgMultiCompilerTask -} from '@bitdev/angular.dev-services.compiler.multi-compiler'; -import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; import { AngularV17Env } from '@bitdev/angular.envs.angular-v17-env'; -import { Pipeline } from '@teambit/builder'; -import { Compiler } from '@teambit/compiler'; -import { EslintConfigWriter, ESLintLinter, EslintTask } from '@teambit/defender.eslint-linter'; -import { JestTask, JestTester } from '@teambit/defender.jest-tester'; -import { PrettierConfigWriter, PrettierFormatter } from '@teambit/defender.prettier-formatter'; -import { EnvHandler } from '@teambit/envs'; -import { Linter } from '@teambit/linter'; -import { Preview } from '@teambit/preview'; -import { Tester } from '@teambit/tester'; -import { TypescriptConfigWriter } from '@teambit/typescript.typescript-compiler'; -import { ConfigWriterList } from '@teambit/workspace-config-files'; -import { ESLint as ESLintLib } from 'eslint'; import { createRequire } from 'node:module'; -import hostDependencies from './preview/host-dependencies.js'; -let ngMultiCompiler: EnvHandler | undefined; - -const require = createRequire(import.meta.url); +const req = createRequire(import.meta.url); export class MyAngularV17Env extends AngularV17Env { // Name of the environment, used for friendly mentions across bit name = 'my-angular-v17-env'; - getTesterConfig() { - return { - jest: require.resolve('jest'), - config: require.resolve('./config/jest.config.cjs') - }; - } - - /** - * Returns a tester to use during development - * Required for `bit start` & `bit test` - */ - override tester(): EnvHandler { - /** - * @see https://bit.dev/reference/jest/using-jest - * */ - return JestTester.from(this.getTesterConfig()); - } - - getLinterConfig() { - return { - tsconfig: require.resolve('./config/tsconfig.json'), - eslint: ESLintLib, - configPath: require.resolve('./config/eslintrc.cjs'), - // resolve all plugins from the angular environment. - pluginsPath: import.meta.dirname, - extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs'] - }; - } - - /** - * Returns an instance of the compiler - * Required for making and reading dists, especially for `bit compile` - */ - compiler(): EnvHandler { - if (!ngMultiCompiler) { - ngMultiCompiler = NgMultiCompiler.from({ - ngEnvOptions: this.getNgEnvOptions(), - tsconfigPath: require.resolve('./config/tsconfig.json'), - }); - } - return ngMultiCompiler!; - } - - /** - * The linter to use during development. - * Config files would be used to validate coding standards in components. - * bit will write the minimum required files in any workspace to optimize - * for dev experience. - */ - override linter(): EnvHandler { - return ESLintLinter.from(this.getLinterConfig()); - } + /* Typescript config used for linter, schema extractor and config writer */ + protected tsconfigPath = req.resolve('./config/tsconfig.json'); - /** - * The formatter to use during development - * (source files are not formatted as part of the components' build) - * */ - override formatter() { - /** - * @see https://bit.dev/reference/prettier/using-prettier - * */ - return PrettierFormatter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }); - } + /* ESLint config. Learn how to replace linter - https://bit.dev/reference/linting/set-up-linter */ + protected eslintConfigPath = req.resolve('./config/eslintrc.cjs'); - /** - * Generates the component previews during development and build - */ - override preview(): EnvHandler { - const tsConfig = require.resolve('./config/tsconfig.json'); - return AngularPreview.from({ - ngEnvOptions: this.getNgEnvOptions(), - hostDependencies, - mounterPath: require.resolve('./preview/mounter.js'), - angularServeOptions: { tsConfig }, - angularBuildOptions: { tsConfig }, - }); - } + /* Prettier config. Learn how to replace formatter - https://bit.dev/reference/formatting/set-up-formatter */ + protected prettierConfigPath = req.resolve('./config/prettier.config.cjs'); - /** - * Defines the build pipeline for a component. - * Pipelines are optimized for performance and consistency, making sure every component is - * independently built and tested. - * This is a set of processes to be performed before a component is snapped, during its build phase - * @see https://bit.dev/docs/angular-env/build-pipelines - */ - override build(): Pipeline { - return Pipeline.from([ - NgMultiCompilerTask.from({ ngMultiCompiler: this.compiler() }), - EslintTask.from(this.getLinterConfig()), - JestTask.from(this.getTesterConfig()) - ]); - } + /* Component mounting and dev-server config. Learn how to replace dev-server - https://bit.dev/reference/preview/setup-preview */ + protected previewMounterPath = req.resolve('./config/mounter.js'); - override workspaceConfig(): ConfigWriterList { - return ConfigWriterList.from([ - TypescriptConfigWriter.from({ - tsconfig: require.resolve('./config/tsconfig.json') - }), - EslintConfigWriter.from({ - configPath: require.resolve('./config/eslintrc.cjs'), - tsconfig: require.resolve('./config/tsconfig.json') - }), - PrettierConfigWriter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }) - ]); - } + /* Jest config. Learn how to replace tester - https://bit.dev/reference/testing/set-up-tester */ + protected jestConfigPath = req.resolve('./config/jest.config.cjs'); } export default new MyAngularV17Env(); diff --git a/angular/examples/my-angular-v17-env/my-angular-v17-env.docs.mdx b/angular/examples/my-angular-v17-env/my-angular-v17-env.docs.mdx index e424639a..6ca0b3f1 100644 --- a/angular/examples/my-angular-v17-env/my-angular-v17-env.docs.mdx +++ b/angular/examples/my-angular-v17-env/my-angular-v17-env.docs.mdx @@ -61,8 +61,7 @@ import { EnvOverview } from '@teambit/envs.docs.env-overview-template'; name: 'Component Preview', toolLink: 'https://bit.cloud/bitdev/angular/dev-services/preview/mounter', configFiles: [ - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/mounter.ts', - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/host-dependencies.ts', + 'https://bit.cloud/bitdev/angular/envs/base-env/~code/config/mounter.ts' ], }, { diff --git a/angular/examples/my-angular-v17-env/preview/host-dependencies.ts b/angular/examples/my-angular-v17-env/preview/host-dependencies.ts deleted file mode 100644 index 6f6a9bb7..00000000 --- a/angular/examples/my-angular-v17-env/preview/host-dependencies.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Dependencies to be bundled only once, in the env preview template, and not in each component preview. - * most of your peer dependencies should be listed here to avoid duplications in the preview. - * React, ReactDOM, and MDX are included as they are part of the preview ui. - */ -export default [ - '@teambit/mdx.ui.mdx-scope-context', - '@mdx-js/react', - 'react', - 'react-dom', -]; diff --git a/angular/examples/my-angular-v18-env/component.json b/angular/examples/my-angular-v18-env/component.json index 9e93474a..20967327 100644 --- a/angular/examples/my-angular-v18-env/component.json +++ b/angular/examples/my-angular-v18-env/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "examples/my-angular-v18-env", - "version": "2.1.0" + "version": "3.0.1" }, "propagate": false, "extensions": { @@ -18,7 +18,9 @@ } } }, - "bitdev.general/envs/bit-env@1.0.1": {}, - "teambit.envs/envs": {} + "bitdev.general/envs/bit-env@1.0.21": {}, + "teambit.envs/envs": { + "env": "bitdev.general/envs/bit-env" + } } } diff --git a/angular/examples/my-angular-v16-env/preview/mounter.ts b/angular/examples/my-angular-v18-env/config/mounter.ts similarity index 95% rename from angular/examples/my-angular-v16-env/preview/mounter.ts rename to angular/examples/my-angular-v18-env/config/mounter.ts index 6831d115..1420a724 100644 --- a/angular/examples/my-angular-v16-env/preview/mounter.ts +++ b/angular/examples/my-angular-v18-env/config/mounter.ts @@ -5,7 +5,7 @@ import { Component, ViewEncapsulation } from '@angular/core'; /** * Provide your component compositions (preview) with the context they need to run. * for example, a router, a theme, a data provider, etc. - * components added here as providers should be listed as host-dependencies in your host-dependencies.ts file. + * components added here as providers should be listed as host-dependencies * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers */ @Component({ diff --git a/angular/examples/my-angular-v18-env/env.jsonc b/angular/examples/my-angular-v18-env/env.jsonc index 074e9052..0600575f 100644 --- a/angular/examples/my-angular-v18-env/env.jsonc +++ b/angular/examples/my-angular-v18-env/env.jsonc @@ -18,13 +18,6 @@ * as a direct component dependencies. they are used for component development only. **/ "dev": [ - { - "name": "@types/jest", - "version": "^29.5.0", - "supportedRange": "^29.0.0", - "hidden": true, - "force": true - }, { "name": "@types/node", "version": "^20.11.22", @@ -100,6 +93,11 @@ "version": "^8.40.0", "supportedRange": "^8.40.0" }, + { + "name": "@types/jest", + "version": "^29.5.0", + "supportedRange": "^29.0.0" + }, { "name": "jest", "version": "^29.5.0", diff --git a/angular/examples/my-angular-v18-env/index.ts b/angular/examples/my-angular-v18-env/index.ts index ed75e91a..2f3de0f3 100644 --- a/angular/examples/my-angular-v18-env/index.ts +++ b/angular/examples/my-angular-v18-env/index.ts @@ -1,3 +1 @@ export { MyAngularV18Env, MyAngularV18Env as default } from './my-angular-v18-env.bit-env.js'; -// @ts-ignore -export { default as jestConfig } from './config/jest.config.cjs'; diff --git a/angular/examples/my-angular-v18-env/my-angular-v18-env.bit-env.ts b/angular/examples/my-angular-v18-env/my-angular-v18-env.bit-env.ts index 9d4ff624..6cbaa230 100644 --- a/angular/examples/my-angular-v18-env/my-angular-v18-env.bit-env.ts +++ b/angular/examples/my-angular-v18-env/my-angular-v18-env.bit-env.ts @@ -1,141 +1,26 @@ -import { - NgMultiCompiler, - NgMultiCompilerTask -} from '@bitdev/angular.dev-services.compiler.multi-compiler'; -import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; import { AngularV18Env } from '@bitdev/angular.envs.angular-v18-env'; -import { Pipeline } from '@teambit/builder'; -import { Compiler } from '@teambit/compiler'; -import { EslintConfigWriter, ESLintLinter, EslintTask } from '@teambit/defender.eslint-linter'; -import { JestTask, JestTester } from '@teambit/defender.jest-tester'; -import { PrettierConfigWriter, PrettierFormatter } from '@teambit/defender.prettier-formatter'; -import { EnvHandler } from '@teambit/envs'; -import { Linter } from '@teambit/linter'; -import { Preview } from '@teambit/preview'; -import { Tester } from '@teambit/tester'; -import { TypescriptConfigWriter } from '@teambit/typescript.typescript-compiler'; -import { ConfigWriterList } from '@teambit/workspace-config-files'; -import { ESLint as ESLintLib } from 'eslint'; import { createRequire } from 'node:module'; -import hostDependencies from './preview/host-dependencies.js'; -let ngMultiCompiler: EnvHandler | undefined; - -const require = createRequire(import.meta.url); +const req = createRequire(import.meta.url); export class MyAngularV18Env extends AngularV18Env { - // Name of the environment, used for friendly mentions across bit + /* Name of the environment, used for friendly mentions across bit */ name = 'my-angular-v18-env'; - getTesterConfig() { - return { - jest: require.resolve('jest'), - config: require.resolve('./config/jest.config.cjs') - }; - } - - /** - * Returns a tester to use during development - * Required for `bit start` & `bit test` - */ - override tester(): EnvHandler { - /** - * @see https://bit.dev/reference/jest/using-jest - * */ - return JestTester.from(this.getTesterConfig()); - } - - getLinterConfig() { - return { - tsconfig: require.resolve('./config/tsconfig.json'), - eslint: ESLintLib, - configPath: require.resolve('./config/eslintrc.cjs'), - // resolve all plugins from the angular environment. - pluginsPath: import.meta.dirname, - extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs'] - }; - } - - /** - * Returns an instance of the compiler - * Required for making and reading dists, especially for `bit compile` - */ - compiler(): EnvHandler { - if (!ngMultiCompiler) { - ngMultiCompiler = NgMultiCompiler.from({ - ngEnvOptions: this.getNgEnvOptions(), - tsconfigPath: require.resolve('./config/tsconfig.json'), - }); - } - return ngMultiCompiler!; - } - - /** - * The linter to use during development. - * Config files would be used to validate coding standards in components. - * bit will write the minimum required files in any workspace to optimize - * for dev experience. - */ - override linter(): EnvHandler { - return ESLintLinter.from(this.getLinterConfig()); - } + /* Typescript config used for linter, schema extractor and config writer */ + protected tsconfigPath = req.resolve('./config/tsconfig.json'); - /** - * The formatter to use during development - * (source files are not formatted as part of the components' build) - * */ - override formatter() { - /** - * @see https://bit.dev/reference/prettier/using-prettier - * */ - return PrettierFormatter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }); - } + /* ESLint config. Learn how to replace linter - https://bit.dev/reference/linting/set-up-linter */ + protected eslintConfigPath = req.resolve('./config/eslintrc.cjs'); - /** - * Generates the component previews during development and build - */ - override preview(): EnvHandler { - const tsConfig = require.resolve('./config/tsconfig.json'); - return AngularPreview.from({ - ngEnvOptions: this.getNgEnvOptions(), - hostDependencies, - mounterPath: require.resolve('./preview/mounter.js'), - angularServeOptions: { tsConfig }, - angularBuildOptions: { tsConfig }, - }); - } + /* Prettier config. Learn how to replace formatter - https://bit.dev/reference/formatting/set-up-formatter */ + protected prettierConfigPath = req.resolve('./config/prettier.config.cjs'); - /** - * Defines the build pipeline for a component. - * Pipelines are optimized for performance and consistency, making sure every component is - * independently built and tested. - * This is a set of processes to be performed before a component is snapped, during its build phase - * @see https://bit.dev/docs/angular-env/build-pipelines - */ - override build(): Pipeline { - return Pipeline.from([ - NgMultiCompilerTask.from({ ngMultiCompiler: this.compiler() }), - EslintTask.from(this.getLinterConfig()), - JestTask.from(this.getTesterConfig()) - ]); - } + /* Component mounting and dev-server config. Learn how to replace dev-server - https://bit.dev/reference/preview/setup-preview */ + protected previewMounterPath = req.resolve('./config/mounter.js'); - override workspaceConfig(): ConfigWriterList { - return ConfigWriterList.from([ - TypescriptConfigWriter.from({ - tsconfig: require.resolve('./config/tsconfig.json') - }), - EslintConfigWriter.from({ - configPath: require.resolve('./config/eslintrc.cjs'), - tsconfig: require.resolve('./config/tsconfig.json') - }), - PrettierConfigWriter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }) - ]); - } + /* Jest config. Learn how to replace tester - https://bit.dev/reference/testing/set-up-tester */ + protected jestConfigPath = req.resolve('./config/jest.config.cjs'); } export default new MyAngularV18Env(); diff --git a/angular/examples/my-angular-v18-env/my-angular-v18-env.docs.mdx b/angular/examples/my-angular-v18-env/my-angular-v18-env.docs.mdx index 09f8d70d..ee3728ae 100644 --- a/angular/examples/my-angular-v18-env/my-angular-v18-env.docs.mdx +++ b/angular/examples/my-angular-v18-env/my-angular-v18-env.docs.mdx @@ -61,8 +61,7 @@ import { EnvOverview } from '@teambit/envs.docs.env-overview-template'; name: 'Component Preview', toolLink: 'https://bit.cloud/bitdev/angular/dev-services/preview/mounter', configFiles: [ - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/mounter.ts', - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/host-dependencies.ts', + 'https://bit.cloud/bitdev/angular/envs/base-env/~code/config/mounter.ts' ], }, { diff --git a/angular/examples/my-angular-v18-env/preview/host-dependencies.ts b/angular/examples/my-angular-v18-env/preview/host-dependencies.ts deleted file mode 100644 index 6f6a9bb7..00000000 --- a/angular/examples/my-angular-v18-env/preview/host-dependencies.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Dependencies to be bundled only once, in the env preview template, and not in each component preview. - * most of your peer dependencies should be listed here to avoid duplications in the preview. - * React, ReactDOM, and MDX are included as they are part of the preview ui. - */ -export default [ - '@teambit/mdx.ui.mdx-scope-context', - '@mdx-js/react', - 'react', - 'react-dom', -]; diff --git a/angular/examples/my-angular-v19-env/component.json b/angular/examples/my-angular-v19-env/component.json index 8534df31..c9cce2af 100644 --- a/angular/examples/my-angular-v19-env/component.json +++ b/angular/examples/my-angular-v19-env/component.json @@ -2,7 +2,7 @@ "componentId": { "scope": "bitdev.angular", "name": "examples/my-angular-v19-env", - "version": "1.1.0" + "version": "2.0.1" }, "propagate": false, "extensions": { @@ -18,7 +18,9 @@ } } }, - "bitdev.general/envs/bit-env@1.0.1": {}, - "teambit.envs/envs": {} + "bitdev.general/envs/bit-env@1.0.21": {}, + "teambit.envs/envs": { + "env": "bitdev.general/envs/bit-env" + } } } diff --git a/angular/examples/my-angular-v19-env/config/mounter.ts b/angular/examples/my-angular-v19-env/config/mounter.ts new file mode 100644 index 00000000..1420a724 --- /dev/null +++ b/angular/examples/my-angular-v19-env/config/mounter.ts @@ -0,0 +1,27 @@ +/* eslint-disable import/no-unresolved */ +import { createMounter } from '@bitdev/angular.dev-services.preview.mounter'; +import { Component, ViewEncapsulation } from '@angular/core'; + +/** + * Provide your component compositions (preview) with the context they need to run. + * for example, a router, a theme, a data provider, etc. + * components added here as providers should be listed as host-dependencies + * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers + */ +@Component({ + selector: 'bit-wrapper', + standalone: true, + imports: [], + encapsulation: ViewEncapsulation.None, + template: ` + + `, +}) export class WrapperComponent {} + + +/** + * the entry for the app (preview runtime) that renders your component previews. + * use the default template or create your own. + * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers + */ +export default createMounter(WrapperComponent); diff --git a/angular/examples/my-angular-v19-env/env.jsonc b/angular/examples/my-angular-v19-env/env.jsonc index d345a517..7fdba035 100644 --- a/angular/examples/my-angular-v19-env/env.jsonc +++ b/angular/examples/my-angular-v19-env/env.jsonc @@ -18,13 +18,6 @@ * as a direct component dependencies. they are used for component development only. **/ "dev": [ - { - "name": "@types/jest", - "version": "^29.5.0", - "supportedRange": "^29.0.0", - "hidden": true, - "force": true - }, { "name": "@types/node", "version": "^20.11.22", @@ -84,7 +77,7 @@ { "name": "@angular/platform-browser", "version": "^19.0.0", - "supportedRange": "19.0.0" + "supportedRange": "^19.0.0" }, { "name": "@angular/platform-browser-dynamic", @@ -111,6 +104,11 @@ "version": "^8.40.0", "supportedRange": "^8.40.0" }, + { + "name": "@types/jest", + "version": "^29.5.0", + "supportedRange": "^29.0.0" + }, { "name": "express", "version": "~4.21.1", diff --git a/angular/examples/my-angular-v19-env/index.ts b/angular/examples/my-angular-v19-env/index.ts index 6b283234..c54f01e8 100644 --- a/angular/examples/my-angular-v19-env/index.ts +++ b/angular/examples/my-angular-v19-env/index.ts @@ -1,3 +1 @@ export { MyAngularV19Env, MyAngularV19Env as default } from './my-angular-v19-env.bit-env.js'; -// @ts-ignore -export { default as jestConfig } from './config/jest.config.cjs'; diff --git a/angular/examples/my-angular-v19-env/my-angular-v19-env.bit-env.ts b/angular/examples/my-angular-v19-env/my-angular-v19-env.bit-env.ts index 10b1ebab..9cb48c94 100644 --- a/angular/examples/my-angular-v19-env/my-angular-v19-env.bit-env.ts +++ b/angular/examples/my-angular-v19-env/my-angular-v19-env.bit-env.ts @@ -1,141 +1,26 @@ -import { - NgMultiCompiler, - NgMultiCompilerTask -} from '@bitdev/angular.dev-services.compiler.multi-compiler'; -import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; import { AngularV19Env } from '@bitdev/angular.envs.angular-v19-env'; -import { Pipeline } from '@teambit/builder'; -import { Compiler } from '@teambit/compiler'; -import { EslintConfigWriter, ESLintLinter, EslintTask } from '@teambit/defender.eslint-linter'; -import { JestTask, JestTester } from '@teambit/defender.jest-tester'; -import { PrettierConfigWriter, PrettierFormatter } from '@teambit/defender.prettier-formatter'; -import { EnvHandler } from '@teambit/envs'; -import { Linter } from '@teambit/linter'; -import { Preview } from '@teambit/preview'; -import { Tester } from '@teambit/tester'; -import { TypescriptConfigWriter } from '@teambit/typescript.typescript-compiler'; -import { ConfigWriterList } from '@teambit/workspace-config-files'; -import { ESLint as ESLintLib } from 'eslint'; import { createRequire } from 'node:module'; -import hostDependencies from './preview/host-dependencies.js'; -let ngMultiCompiler: EnvHandler | undefined; - -const require = createRequire(import.meta.url); +const req = createRequire(import.meta.url); export class MyAngularV19Env extends AngularV19Env { - // Name of the environment, used for friendly mentions across bit + /* Name of the environment, used for friendly mentions across bit */ name = 'my-angular-v19-env'; - getTesterConfig() { - return { - jest: require.resolve('jest'), - config: require.resolve('./config/jest.config.cjs') - }; - } - - /** - * Returns a tester to use during development - * Required for `bit start` & `bit test` - */ - override tester(): EnvHandler { - /** - * @see https://bit.dev/reference/jest/using-jest - * */ - return JestTester.from(this.getTesterConfig()); - } - - getLinterConfig() { - return { - tsconfig: require.resolve('./config/tsconfig.json'), - eslint: ESLintLib, - configPath: require.resolve('./config/eslintrc.cjs'), - // resolve all plugins from the angular environment. - pluginsPath: import.meta.dirname, - extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs'] - }; - } - - /** - * Returns an instance of the compiler - * Required for making and reading dists, especially for `bit compile` - */ - compiler(): EnvHandler { - if (!ngMultiCompiler) { - ngMultiCompiler = NgMultiCompiler.from({ - ngEnvOptions: this.getNgEnvOptions(), - tsconfigPath: require.resolve('./config/tsconfig.json'), - }); - } - return ngMultiCompiler!; - } - - /** - * The linter to use during development. - * Config files would be used to validate coding standards in components. - * bit will write the minimum required files in any workspace to optimize - * for dev experience. - */ - override linter(): EnvHandler { - return ESLintLinter.from(this.getLinterConfig()); - } + /* Typescript config used for linter, schema extractor and config writer */ + protected tsconfigPath = req.resolve('./config/tsconfig.json'); - /** - * The formatter to use during development - * (source files are not formatted as part of the components' build) - * */ - override formatter() { - /** - * @see https://bit.dev/reference/prettier/using-prettier - * */ - return PrettierFormatter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }); - } + /* ESLint config. Learn how to replace linter - https://bit.dev/reference/linting/set-up-linter */ + protected eslintConfigPath = req.resolve('./config/eslintrc.cjs'); - /** - * Generates the component previews during development and build - */ - override preview(): EnvHandler { - const tsConfig = require.resolve('./config/tsconfig.json'); - return AngularPreview.from({ - ngEnvOptions: this.getNgEnvOptions(), - hostDependencies, - mounterPath: require.resolve('./preview/mounter.js'), - angularServeOptions: { tsConfig }, - angularBuildOptions: { tsConfig }, - }); - } + /* Prettier config. Learn how to replace formatter - https://bit.dev/reference/formatting/set-up-formatter */ + protected prettierConfigPath = req.resolve('./config/prettier.config.cjs'); - /** - * Defines the build pipeline for a component. - * Pipelines are optimized for performance and consistency, making sure every component is - * independently built and tested. - * This is a set of processes to be performed before a component is snapped, during its build phase - * @see https://bit.dev/docs/angular-env/build-pipelines - */ - override build(): Pipeline { - return Pipeline.from([ - NgMultiCompilerTask.from({ ngMultiCompiler: this.compiler() }), - EslintTask.from(this.getLinterConfig()), - JestTask.from(this.getTesterConfig()) - ]); - } + /* Component mounting and dev-server config. Learn how to replace dev-server - https://bit.dev/reference/preview/setup-preview */ + protected previewMounterPath = req.resolve('./config/mounter.js'); - override workspaceConfig(): ConfigWriterList { - return ConfigWriterList.from([ - TypescriptConfigWriter.from({ - tsconfig: require.resolve('./config/tsconfig.json') - }), - EslintConfigWriter.from({ - configPath: require.resolve('./config/eslintrc.cjs'), - tsconfig: require.resolve('./config/tsconfig.json') - }), - PrettierConfigWriter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }) - ]); - } + /* Jest config. Learn how to replace tester - https://bit.dev/reference/testing/set-up-tester */ + protected jestConfigPath = req.resolve('./config/jest.config.cjs'); } export default new MyAngularV19Env(); diff --git a/angular/examples/my-angular-v19-env/my-angular-v19-env.docs.mdx b/angular/examples/my-angular-v19-env/my-angular-v19-env.docs.mdx index d7f68af8..12cbd864 100644 --- a/angular/examples/my-angular-v19-env/my-angular-v19-env.docs.mdx +++ b/angular/examples/my-angular-v19-env/my-angular-v19-env.docs.mdx @@ -61,8 +61,7 @@ import { EnvOverview } from '@teambit/envs.docs.env-overview-template'; name: 'Component Preview', toolLink: 'https://bit.cloud/bitdev/angular/dev-services/preview/mounter', configFiles: [ - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/mounter.ts', - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/host-dependencies.ts', + 'https://bit.cloud/bitdev/angular/envs/base-env/~code/config/mounter.ts' ], }, { diff --git a/angular/examples/my-angular-v19-env/preview/host-dependencies.ts b/angular/examples/my-angular-v19-env/preview/host-dependencies.ts deleted file mode 100644 index 6f6a9bb7..00000000 --- a/angular/examples/my-angular-v19-env/preview/host-dependencies.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Dependencies to be bundled only once, in the env preview template, and not in each component preview. - * most of your peer dependencies should be listed here to avoid duplications in the preview. - * React, ReactDOM, and MDX are included as they are part of the preview ui. - */ -export default [ - '@teambit/mdx.ui.mdx-scope-context', - '@mdx-js/react', - 'react', - 'react-dom', -]; diff --git a/angular/examples/my-angular-v19-env/preview/mounter.ts b/angular/examples/my-angular-v19-env/preview/mounter.ts deleted file mode 100644 index 6831d115..00000000 --- a/angular/examples/my-angular-v19-env/preview/mounter.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable import/no-unresolved */ -import { createMounter } from '@bitdev/angular.dev-services.preview.mounter'; -import { Component, ViewEncapsulation } from '@angular/core'; - -/** - * Provide your component compositions (preview) with the context they need to run. - * for example, a router, a theme, a data provider, etc. - * components added here as providers should be listed as host-dependencies in your host-dependencies.ts file. - * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers - */ -@Component({ - selector: 'bit-wrapper', - standalone: true, - imports: [], - encapsulation: ViewEncapsulation.None, - template: ` - - `, -}) export class WrapperComponent {} - - -/** - * the entry for the app (preview runtime) that renders your component previews. - * use the default template or create your own. - * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers - */ -export default createMounter(WrapperComponent); diff --git a/angular/integration/demo-app/demo-app.bit-app.ts b/angular/integration/demo-app/demo-app.bit-app.ts index e3b19a79..c9942c01 100644 --- a/angular/integration/demo-app/demo-app.bit-app.ts +++ b/angular/integration/demo-app/demo-app.bit-app.ts @@ -1,6 +1,5 @@ import { type AngularAppOptions, AngularApp } from '@bitdev/angular.app-types.angular-app-type'; import type { ApplicationOptions, DevServerOptions } from '@bitdev/angular.dev-services.common'; -import { ngEnvOptions } from '@bitdev/angular.angular-env'; const angularOptions: ApplicationOptions & DevServerOptions = { browser: './src/main.ts', @@ -10,7 +9,6 @@ const angularOptions: ApplicationOptions & DevServerOptions = { assets: ['./src/favicon.ico', './src/assets'], styles: ['./src/styles.scss'], inlineStyleLanguage: "scss", - prerender: true, outputMode: "server", ssr: { "entry": "./src/server.ts" @@ -36,12 +34,7 @@ export const DemoAppOptions: AngularAppOptions = { /** * Angular options for `bit run` */ - angularServeOptions: angularOptions, - - /** - * Env-specific options depending on the version of Angular used. - */ - ngEnvOptions + angularServeOptions: angularOptions }; export default AngularApp.from(DemoAppOptions); diff --git a/angular/integration/demo-app/src/app/app.config.ts b/angular/integration/demo-app/src/app/app.config.ts index a9af5184..64ab414a 100644 --- a/angular/integration/demo-app/src/app/app.config.ts +++ b/angular/integration/demo-app/src/app/app.config.ts @@ -1,8 +1,7 @@ import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; - -import { routes } from './app.routes'; import { provideClientHydration, withEventReplay } from '@angular/platform-browser'; +import { routes } from './app.routes'; export const appConfig: ApplicationConfig = { providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideClientHydration(withEventReplay())] diff --git a/angular/integration/demo-app/src/main.ts b/angular/integration/demo-app/src/main.ts index 272abdb0..28b8e271 100644 --- a/angular/integration/demo-app/src/main.ts +++ b/angular/integration/demo-app/src/main.ts @@ -17,4 +17,6 @@ import { bootstrapApplication } from '@angular/platform-browser'; import { AppComponent } from './app/app.component'; import { appConfig } from './app/app.config'; -bootstrapApplication(AppComponent, appConfig); +bootstrapApplication(AppComponent, appConfig) + .catch((err) => console.error(err)); + diff --git a/angular/integration/demo-app/src/server.ts b/angular/integration/demo-app/src/server.ts index bbeed293..bb9fee8c 100644 --- a/angular/integration/demo-app/src/server.ts +++ b/angular/integration/demo-app/src/server.ts @@ -5,8 +5,8 @@ import { writeResponseToNodeResponse, } from '@angular/ssr/node'; import express from 'express'; -import { dirname, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; +import { dirname, resolve } from 'path'; +import { fileURLToPath } from 'url'; const serverDistFolder = dirname(fileURLToPath(import.meta.url)); const browserDistFolder = resolve(serverDistFolder, '../browser'); @@ -40,7 +40,7 @@ app.use( /** * Handle all other requests by rendering the Angular application. */ -app.use('/**', (req, res, next) => { +app.use('/**', (req: any, res: any, next: any) => { angularApp .handle(req) .then((response) => { @@ -55,6 +55,7 @@ app.use('/**', (req, res, next) => { * The server listens on the port defined by the `PORT` environment variable, or defaults to 4000. */ if (isMainModule(import.meta.url)) { + // @ts-ignore const port = process.env['PORT'] || 4000; app.listen(port, () => { console.log(`Node Express server listening on http://localhost:${port}`); diff --git a/angular/integration/demo-app/tsconfig.app.json b/angular/integration/demo-app/tsconfig.app.json index 8b83f686..10acbb99 100644 --- a/angular/integration/demo-app/tsconfig.app.json +++ b/angular/integration/demo-app/tsconfig.app.json @@ -4,6 +4,7 @@ "compilerOptions": { "allowJs": true, "allowSyntheticDefaultImports": true, + "baseUrl": "./", "declaration": false, "downlevelIteration": true, "esModuleInterop": true, diff --git a/angular/integration/demo-lib-v16/src/bit-test.component.ts b/angular/integration/demo-lib-v16/bit-test.component.ts similarity index 100% rename from angular/integration/demo-lib-v16/src/bit-test.component.ts rename to angular/integration/demo-lib-v16/bit-test.component.ts diff --git a/angular/integration/demo-lib-v16/src/bit-test.docs.md b/angular/integration/demo-lib-v16/bit-test.docs.md similarity index 100% rename from angular/integration/demo-lib-v16/src/bit-test.docs.md rename to angular/integration/demo-lib-v16/bit-test.docs.md diff --git a/angular/integration/demo-lib-v16/src/bit-test.module.ts b/angular/integration/demo-lib-v16/bit-test.module.ts similarity index 100% rename from angular/integration/demo-lib-v16/src/bit-test.module.ts rename to angular/integration/demo-lib-v16/bit-test.module.ts diff --git a/angular/integration/demo-lib-v16/src/bit-test.service.ts b/angular/integration/demo-lib-v16/bit-test.service.ts similarity index 100% rename from angular/integration/demo-lib-v16/src/bit-test.service.ts rename to angular/integration/demo-lib-v16/bit-test.service.ts diff --git a/angular/integration/demo-lib-v16/src/bit-test.spec.ts b/angular/integration/demo-lib-v16/bit-test.spec.ts similarity index 100% rename from angular/integration/demo-lib-v16/src/bit-test.spec.ts rename to angular/integration/demo-lib-v16/bit-test.spec.ts diff --git a/angular/integration/demo-lib-v16/src/bit-test2.component.ts b/angular/integration/demo-lib-v16/bit-test2.component.ts similarity index 100% rename from angular/integration/demo-lib-v16/src/bit-test2.component.ts rename to angular/integration/demo-lib-v16/bit-test2.component.ts diff --git a/angular/integration/demo-lib-v16/src/compositions/bit-test.composition.ts b/angular/integration/demo-lib-v16/compositions/bit-test.composition.ts similarity index 100% rename from angular/integration/demo-lib-v16/src/compositions/bit-test.composition.ts rename to angular/integration/demo-lib-v16/compositions/bit-test.composition.ts diff --git a/angular/integration/demo-lib-v16/src/compositions/cmp1.composition.ts b/angular/integration/demo-lib-v16/compositions/cmp1.composition.ts similarity index 100% rename from angular/integration/demo-lib-v16/src/compositions/cmp1.composition.ts rename to angular/integration/demo-lib-v16/compositions/cmp1.composition.ts diff --git a/angular/integration/demo-lib-v16/public-api.ts b/angular/integration/demo-lib-v16/public-api.ts index b0c87230..d49b3a72 100644 --- a/angular/integration/demo-lib-v16/public-api.ts +++ b/angular/integration/demo-lib-v16/public-api.ts @@ -1,6 +1,6 @@ /** * Entry point for this Angular library, do not move or rename this file. */ -export * from './src/bit-test.component'; -export * from './src/bit-test2.component'; -export * from './src/bit-test.module'; +export * from './bit-test.component'; +export * from './bit-test2.component'; +export * from './bit-test.module'; diff --git a/angular/integration/demo-lib-v17/src/bit-test.component.scss b/angular/integration/demo-lib-v17/bit-test.component.scss similarity index 100% rename from angular/integration/demo-lib-v17/src/bit-test.component.scss rename to angular/integration/demo-lib-v17/bit-test.component.scss diff --git a/angular/integration/demo-lib-v17/src/bit-test.component.ts b/angular/integration/demo-lib-v17/bit-test.component.ts similarity index 100% rename from angular/integration/demo-lib-v17/src/bit-test.component.ts rename to angular/integration/demo-lib-v17/bit-test.component.ts diff --git a/angular/integration/demo-lib-v17/src/bit-test.docs.md b/angular/integration/demo-lib-v17/bit-test.docs.md similarity index 100% rename from angular/integration/demo-lib-v17/src/bit-test.docs.md rename to angular/integration/demo-lib-v17/bit-test.docs.md diff --git a/angular/integration/demo-lib-v17/src/bit-test.module.ts b/angular/integration/demo-lib-v17/bit-test.module.ts similarity index 100% rename from angular/integration/demo-lib-v17/src/bit-test.module.ts rename to angular/integration/demo-lib-v17/bit-test.module.ts diff --git a/angular/integration/demo-lib-v17/src/bit-test.service.ts b/angular/integration/demo-lib-v17/bit-test.service.ts similarity index 100% rename from angular/integration/demo-lib-v17/src/bit-test.service.ts rename to angular/integration/demo-lib-v17/bit-test.service.ts diff --git a/angular/integration/demo-lib-v17/src/bit-test.spec.ts b/angular/integration/demo-lib-v17/bit-test.spec.ts similarity index 100% rename from angular/integration/demo-lib-v17/src/bit-test.spec.ts rename to angular/integration/demo-lib-v17/bit-test.spec.ts diff --git a/angular/integration/demo-lib-v17/src/bit-test2.component.ts b/angular/integration/demo-lib-v17/bit-test2.component.ts similarity index 100% rename from angular/integration/demo-lib-v17/src/bit-test2.component.ts rename to angular/integration/demo-lib-v17/bit-test2.component.ts diff --git a/angular/integration/demo-lib-v17/src/compositions/bit-test.composition.ts b/angular/integration/demo-lib-v17/compositions/bit-test.composition.ts similarity index 100% rename from angular/integration/demo-lib-v17/src/compositions/bit-test.composition.ts rename to angular/integration/demo-lib-v17/compositions/bit-test.composition.ts diff --git a/angular/integration/demo-lib-v17/src/compositions/cmp1.composition.ts b/angular/integration/demo-lib-v17/compositions/cmp1.composition.ts similarity index 100% rename from angular/integration/demo-lib-v17/src/compositions/cmp1.composition.ts rename to angular/integration/demo-lib-v17/compositions/cmp1.composition.ts diff --git a/angular/integration/demo-lib-v17/public-api.ts b/angular/integration/demo-lib-v17/public-api.ts index b0c87230..d49b3a72 100644 --- a/angular/integration/demo-lib-v17/public-api.ts +++ b/angular/integration/demo-lib-v17/public-api.ts @@ -1,6 +1,6 @@ /** * Entry point for this Angular library, do not move or rename this file. */ -export * from './src/bit-test.component'; -export * from './src/bit-test2.component'; -export * from './src/bit-test.module'; +export * from './bit-test.component'; +export * from './bit-test2.component'; +export * from './bit-test.module'; diff --git a/angular/integration/demo-lib-v18/src/bit-test.component.scss b/angular/integration/demo-lib-v18/bit-test.component.scss similarity index 100% rename from angular/integration/demo-lib-v18/src/bit-test.component.scss rename to angular/integration/demo-lib-v18/bit-test.component.scss diff --git a/angular/integration/demo-lib-v18/src/bit-test.component.ts b/angular/integration/demo-lib-v18/bit-test.component.ts similarity index 65% rename from angular/integration/demo-lib-v18/src/bit-test.component.ts rename to angular/integration/demo-lib-v18/bit-test.component.ts index 36185b96..452d2dd4 100644 --- a/angular/integration/demo-lib-v18/src/bit-test.component.ts +++ b/angular/integration/demo-lib-v18/bit-test.component.ts @@ -1,4 +1,4 @@ -import { Component } from "@angular/core"; +import { Component, Inject } from "@angular/core"; import { BitTestService } from './bit-test.service'; @Component({ @@ -9,5 +9,5 @@ import { BitTestService } from './bit-test.service'; ` }) export class BitTestComponent { - constructor(public service: BitTestService) {} + constructor(@Inject(BitTestService) public service: BitTestService) {} } diff --git a/angular/integration/demo-lib-v18/src/bit-test.module.ts b/angular/integration/demo-lib-v18/bit-test.module.ts similarity index 100% rename from angular/integration/demo-lib-v18/src/bit-test.module.ts rename to angular/integration/demo-lib-v18/bit-test.module.ts diff --git a/angular/integration/demo-lib-v18/src/bit-test.service.ts b/angular/integration/demo-lib-v18/bit-test.service.ts similarity index 100% rename from angular/integration/demo-lib-v18/src/bit-test.service.ts rename to angular/integration/demo-lib-v18/bit-test.service.ts diff --git a/angular/integration/demo-lib-v18/src/bit-test.spec.ts b/angular/integration/demo-lib-v18/bit-test.spec.ts similarity index 100% rename from angular/integration/demo-lib-v18/src/bit-test.spec.ts rename to angular/integration/demo-lib-v18/bit-test.spec.ts diff --git a/angular/integration/demo-lib-v18/src/bit-test2.component.ts b/angular/integration/demo-lib-v18/bit-test2.component.ts similarity index 100% rename from angular/integration/demo-lib-v18/src/bit-test2.component.ts rename to angular/integration/demo-lib-v18/bit-test2.component.ts diff --git a/angular/integration/demo-lib-v18/src/compositions/bit-test.composition.ts b/angular/integration/demo-lib-v18/compositions/bit-test.composition.ts similarity index 100% rename from angular/integration/demo-lib-v18/src/compositions/bit-test.composition.ts rename to angular/integration/demo-lib-v18/compositions/bit-test.composition.ts diff --git a/angular/integration/demo-lib-v18/src/compositions/cmp1.composition.ts b/angular/integration/demo-lib-v18/compositions/cmp1.composition.ts similarity index 100% rename from angular/integration/demo-lib-v18/src/compositions/cmp1.composition.ts rename to angular/integration/demo-lib-v18/compositions/cmp1.composition.ts diff --git a/angular/integration/demo-lib-v18/src/bit-test.docs.md b/angular/integration/demo-lib-v18/demo-lib-v18.docs.md similarity index 100% rename from angular/integration/demo-lib-v18/src/bit-test.docs.md rename to angular/integration/demo-lib-v18/demo-lib-v18.docs.md diff --git a/angular/integration/demo-lib-v18/public-api.ts b/angular/integration/demo-lib-v18/public-api.ts index b0c87230..d49b3a72 100644 --- a/angular/integration/demo-lib-v18/public-api.ts +++ b/angular/integration/demo-lib-v18/public-api.ts @@ -1,6 +1,6 @@ /** * Entry point for this Angular library, do not move or rename this file. */ -export * from './src/bit-test.component'; -export * from './src/bit-test2.component'; -export * from './src/bit-test.module'; +export * from './bit-test.component'; +export * from './bit-test2.component'; +export * from './bit-test.module'; diff --git a/angular/integration/demo-lib-v19/src/bit-test.component.scss b/angular/integration/demo-lib-v19/bit-test.component.scss similarity index 100% rename from angular/integration/demo-lib-v19/src/bit-test.component.scss rename to angular/integration/demo-lib-v19/bit-test.component.scss diff --git a/angular/integration/demo-lib-v19/src/bit-test.component.ts b/angular/integration/demo-lib-v19/bit-test.component.ts similarity index 100% rename from angular/integration/demo-lib-v19/src/bit-test.component.ts rename to angular/integration/demo-lib-v19/bit-test.component.ts diff --git a/angular/integration/demo-lib-v19/src/bit-test.docs.md b/angular/integration/demo-lib-v19/bit-test.docs.md similarity index 100% rename from angular/integration/demo-lib-v19/src/bit-test.docs.md rename to angular/integration/demo-lib-v19/bit-test.docs.md diff --git a/angular/integration/demo-lib-v19/src/bit-test.module.ts b/angular/integration/demo-lib-v19/bit-test.module.ts similarity index 100% rename from angular/integration/demo-lib-v19/src/bit-test.module.ts rename to angular/integration/demo-lib-v19/bit-test.module.ts diff --git a/angular/integration/demo-lib-v19/src/bit-test.service.ts b/angular/integration/demo-lib-v19/bit-test.service.ts similarity index 100% rename from angular/integration/demo-lib-v19/src/bit-test.service.ts rename to angular/integration/demo-lib-v19/bit-test.service.ts diff --git a/angular/integration/demo-lib-v19/src/bit-test.spec.ts b/angular/integration/demo-lib-v19/bit-test.spec.ts similarity index 100% rename from angular/integration/demo-lib-v19/src/bit-test.spec.ts rename to angular/integration/demo-lib-v19/bit-test.spec.ts diff --git a/angular/integration/demo-lib-v19/src/bit-test2.component.ts b/angular/integration/demo-lib-v19/bit-test2.component.ts similarity index 100% rename from angular/integration/demo-lib-v19/src/bit-test2.component.ts rename to angular/integration/demo-lib-v19/bit-test2.component.ts diff --git a/angular/integration/demo-lib-v19/src/bit-test3.component.ts b/angular/integration/demo-lib-v19/bit-test3.component.ts similarity index 100% rename from angular/integration/demo-lib-v19/src/bit-test3.component.ts rename to angular/integration/demo-lib-v19/bit-test3.component.ts diff --git a/angular/integration/demo-lib-v19/src/compositions/bit-test.composition.ts b/angular/integration/demo-lib-v19/compositions/bit-test.composition.ts similarity index 100% rename from angular/integration/demo-lib-v19/src/compositions/bit-test.composition.ts rename to angular/integration/demo-lib-v19/compositions/bit-test.composition.ts diff --git a/angular/integration/demo-lib-v19/src/compositions/cmp1.composition.ts b/angular/integration/demo-lib-v19/compositions/cmp1.composition.ts similarity index 100% rename from angular/integration/demo-lib-v19/src/compositions/cmp1.composition.ts rename to angular/integration/demo-lib-v19/compositions/cmp1.composition.ts diff --git a/angular/integration/demo-lib-v19/public-api.ts b/angular/integration/demo-lib-v19/public-api.ts index 08d067e3..baf0d610 100644 --- a/angular/integration/demo-lib-v19/public-api.ts +++ b/angular/integration/demo-lib-v19/public-api.ts @@ -1,7 +1,7 @@ /** * Entry point for this Angular library, do not move or rename this file. */ -export * from './src/bit-test.component'; -export * from './src/bit-test2.component'; -export * from './src/bit-test3.component'; -export * from './src/bit-test.module'; +export * from './bit-test.component'; +export * from './bit-test2.component'; +export * from './bit-test3.component'; +export * from './bit-test.module'; diff --git a/angular/templates/generators/ng-app/index.ts b/angular/templates/generators/ng-app/index.ts index 86527d0e..8cbf6fff 100644 --- a/angular/templates/generators/ng-app/index.ts +++ b/angular/templates/generators/ng-app/index.ts @@ -19,7 +19,6 @@ import { indexHtmlFile } from './template-files/src/index-html'; import { mainNgAppFile } from './template-files/src/main'; import { mainServerFile } from './template-files/src/main.server'; import { serverFile } from './template-files/src/server'; -import { polyfillsFile } from './template-files/src/polyfills'; import { helloApiFile } from './template-files/src/server/api/hello'; import { stylesFile } from './template-files/src/styles'; import { tsconfigFile } from './template-files/tsconfig.app'; @@ -59,17 +58,13 @@ export class NgAppTemplate implements ComponentTemplate { }) as Promise }; - if (this.angularVersion > 13) { - prompts.standalone = () => confirm({ - message: 'Do you want to use standalone components?' - }) as Promise; - } + prompts.standalone = () => confirm({ + message: 'Do you want to use standalone components?' + }) as Promise; - if (this.angularVersion >= 16) { - prompts.ssr = () => confirm({ - message: 'Do you want to enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)?' - }) as Promise; - } + prompts.ssr = () => confirm({ + message: 'Do you want to enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)?' + }) as Promise; const params = await group(prompts); @@ -81,7 +76,7 @@ export class NgAppTemplate implements ComponentTemplate { async generateFiles(context: ComponentContext) { let params: { [id: string]: any } = { styleSheet: 'scss', - standalone: this.angularVersion > 13, + standalone: true, ssr: this.angularVersion >= 17 }; @@ -114,13 +109,12 @@ export class NgAppTemplate implements ComponentTemplate { ]; if (params.ssr) { - files.push( - mainServerFile(params.standalone), - helloApiFile() - ); + files.push(mainServerFile(params.standalone)); if (this.angularVersion >= 19) { files.push(serverFile()); + } else { + files.push(helloApiFile()); } if (params.standalone) { @@ -128,16 +122,8 @@ export class NgAppTemplate implements ComponentTemplate { } } - if (this.angularVersion < 15) { - files.push( - // starting from Angular 15, the `polyfills` option accept an array of module specifiers. - // https://github.com/angular/angular-cli/commit/597bfea1b29cc7b25d1f466eb313cbeeb6dffc98 - polyfillsFile() - ); - } - if (params.standalone) { - files.push(appConfigFile(this.angularVersion, params.ssr)); + files.push(appConfigFile(params.ssr)); } if (!params.standalone) { files.push(appModuleFile(params.ssr)); diff --git a/angular/templates/generators/ng-app/template-files/src/app/app.config.ts b/angular/templates/generators/ng-app/template-files/src/app/app.config.ts index ba4bfa05..c5ac560b 100644 --- a/angular/templates/generators/ng-app/template-files/src/app/app.config.ts +++ b/angular/templates/generators/ng-app/template-files/src/app/app.config.ts @@ -1,13 +1,12 @@ import { ComponentFile } from '@teambit/generator'; -export const appConfigFile = (angularVersion: number, ssr: boolean): ComponentFile => { +export const appConfigFile = (ssr: boolean): ComponentFile => { return { relativePath: `src/app/app.config.ts`, - content: `import { ApplicationConfig } from '${angularVersion >= 16 ? '@angular/core' : '@angular/platform-browser'}'; -import { provideRouter } from '@angular/router'; - -import { routes } from './app.routes';${ssr ? ` + content: `import { ApplicationConfig } from '@angular/core'; +import { provideRouter } from '@angular/router';${ssr ? ` import { provideClientHydration } from '@angular/platform-browser';` : ''} +import { routes } from './app.routes'; export const appConfig: ApplicationConfig = { providers: [provideRouter(routes)${ssr ? ', provideClientHydration()' : ''}] diff --git a/angular/templates/generators/ng-app/template-files/src/server.ts b/angular/templates/generators/ng-app/template-files/src/server.ts index 5b2e7b02..a0e74b35 100644 --- a/angular/templates/generators/ng-app/template-files/src/server.ts +++ b/angular/templates/generators/ng-app/template-files/src/server.ts @@ -2,7 +2,7 @@ import { ComponentFile } from '@teambit/generator'; export const serverFile = (): ComponentFile => { return { - relativePath: `src/main.server.ts`, + relativePath: `src/server.ts`, content: `import { AngularNodeAppEngine, createNodeRequestHandler, diff --git a/angular/templates/generators/ng-env/files/config/mounter.ts b/angular/templates/generators/ng-env/files/config/mounter.ts new file mode 100644 index 00000000..ec28eba7 --- /dev/null +++ b/angular/templates/generators/ng-env/files/config/mounter.ts @@ -0,0 +1,33 @@ +export const mounterFile = () => { + return { + relativePath: './config/mounter.ts', + content: `/* eslint-disable import/no-unresolved */ +import { createMounter } from '@bitdev/angular.dev-services.preview.mounter'; +import { Component, ViewEncapsulation } from '@angular/core'; + +/** + * Provide your component compositions (preview) with the context they need to run. + * for example, a router, a theme, a data provider, etc. + * components added here as providers should be listed as host-dependencies + * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers + */ +@Component({ + selector: 'bit-wrapper', + standalone: true, + imports: [], + encapsulation: ViewEncapsulation.None, + template: \` + + \`, +}) export class WrapperComponent {} + + +/** + * the entry for the app (preview runtime) that renders your component previews. + * use the default template or create your own. + * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers + */ +export default createMounter(WrapperComponent); +`, + }; +}; diff --git a/angular/templates/generators/ng-env/files/doc.ts b/angular/templates/generators/ng-env/files/doc.ts index 20f25748..060c4916 100644 --- a/angular/templates/generators/ng-env/files/doc.ts +++ b/angular/templates/generators/ng-env/files/doc.ts @@ -63,8 +63,7 @@ tools={{ name: 'Component Preview', toolLink: 'https://bit.cloud/bitdev/angular/dev-services/preview/mounter', configFiles: [ - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/mounter.ts', - 'https://bit.cloud/bitdev/angular/envs/base-env/~code/preview/host-dependencies.ts', + 'https://bit.cloud/bitdev/angular/envs/base-env/~code/config/mounter.ts', ], }, { diff --git a/angular/templates/generators/ng-env/files/env.ts b/angular/templates/generators/ng-env/files/env.ts index ac79c7b3..855bea4b 100644 --- a/angular/templates/generators/ng-env/files/env.ts +++ b/angular/templates/generators/ng-env/files/env.ts @@ -2,141 +2,29 @@ import { ComponentContext } from '@teambit/generator'; export function envFile({ namePascalCase: Name, name }: ComponentContext, envName: string, angularVersion: number, envPkgName: string) { // language=TypeScript - return `import { NgMultiCompiler, NgMultiCompilerTask } from '@bitdev/angular.dev-services.compiler.multi-compiler'; -import { AngularPreview } from '@bitdev/angular.dev-services.preview.preview'; -import { Pipeline } from '@teambit/builder'; -import { ${envName} } from '${envPkgName}'; -import { Compiler } from '@teambit/compiler'; -import { EslintConfigWriter, ESLintLinter, EslintTask } from '@teambit/defender.eslint-linter'; -import { JestTask, JestTester } from '@teambit/defender.jest-tester'; -import { PrettierConfigWriter, PrettierFormatter } from '@teambit/defender.prettier-formatter'; -import { EnvHandler } from '@teambit/envs'; -import { Linter } from '@teambit/linter'; -import { Preview } from '@teambit/preview'; -import { Tester } from '@teambit/tester'; -import { TypescriptConfigWriter } from '@teambit/typescript.typescript-compiler'; -import { ConfigWriterList } from '@teambit/workspace-config-files'; -import { ESLint as ESLintLib } from 'eslint'; + return `import { ${envName} } from '${envPkgName}'; import { createRequire } from 'node:module'; -import hostDependencies from './preview/host-dependencies.js'; -let ngMultiCompiler: EnvHandler | undefined; - -const require = createRequire(import.meta.url); +const req = createRequire(import.meta.url); export class ${Name} extends ${envName} { - // Name of the environment, used for friendly mentions across bit + /* Name of the environment, used for friendly mentions across bit */ name = '${name}'; - getTesterConfig() { - return { - jest: require.resolve('jest'), - config: require.resolve('./config/jest.config.cjs') - }; - } - - /** - * Returns a tester to use during development - * Required for \`bit start\` & \`bit test\` - */ - override tester(): EnvHandler { - /** - * @see https://bit.dev/reference/jest/using-jest - * */ - return JestTester.from(this.getTesterConfig()); - } - - getLinterConfig() { - return { - tsconfig: require.resolve('@bitdev/angular.dev-services.linter.eslint/config/tsconfig.json'), - eslint: ESLintLib, - configPath: require.resolve('./config/eslintrc.cjs'), - // resolve all plugins from the angular environment. - pluginsPath: import.meta.dirname, - extensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs'] - }; - } - - /** - * Returns an instance of the compiler - * Required for making and reading dists, especially for \`bit compile\` - */ - compiler(): EnvHandler { - if (!ngMultiCompiler) { - ngMultiCompiler = NgMultiCompiler.from({ - ngEnvOptions: this.getNgEnvOptions(), - tsconfigPath: require.resolve('./config/tsconfig.json'), - }); - } - return ngMultiCompiler; - } - - /** - * The linter to use during development. - * Config files would be used to validate coding standards in components. - * bit will write the minimum required files in any workspace to optimize - * for dev experience. - */ - override linter(): EnvHandler { - return ESLintLinter.from(this.getLinterConfig()); - } + /* Typescript config used for linter, schema extractor and config writer */ + protected tsconfigPath = req.resolve('./config/tsconfig.json'); - /** - * The formatter to use during development - * (source files are not formatted as part of the components' build) - * */ - override formatter() { - /** - * @see https://bit.dev/reference/prettier/using-prettier - * */ - return PrettierFormatter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }); - } + /* ESLint config. Learn how to replace linter - https://bit.dev/reference/linting/set-up-linter */ + protected eslintConfigPath = req.resolve('./config/eslintrc.cjs'); - /** - * Generates the component previews during development and build. - */ - override preview(): EnvHandler { - const tsConfig = require.resolve('./config/tsconfig.json'); - return AngularPreview.from({ - ngEnvOptions: this.getNgEnvOptions(), - hostDependencies, - mounterPath: require.resolve('./preview/mounter.js'), - angularServeOptions: { tsConfig }, - angularBuildOptions: { tsConfig }, - }); - } + /* Prettier config. Learn how to replace formatter - https://bit.dev/reference/formatting/set-up-formatter */ + protected prettierConfigPath = req.resolve('./config/prettier.config.cjs'); - /** - * Defines the build pipeline for a component. - * Pipelines are optimized for performance and consistency, making sure every component is - * independently built and tested. - * This is a set of processes to be performed before a component is snapped, during its build phase - * @see https://bit.dev/docs/angular-env/build-pipelines - */ - override build() { - return Pipeline.from([ - NgMultiCompilerTask.from({ ngMultiCompiler: this.compiler() }), - EslintTask.from(this.getLinterConfig()), - JestTask.from(this.getTesterConfig()) - ]); - } + /* Component mounting and dev-server config. Learn how to replace dev-server - https://bit.dev/reference/preview/setup-preview */ + protected previewMounterPath = req.resolve('./config/mounter.js'); - override workspaceConfig(): ConfigWriterList { - return ConfigWriterList.from([ - TypescriptConfigWriter.from({ - tsconfig: require.resolve('./config/tsconfig.json') - }), - EslintConfigWriter.from({ - configPath: require.resolve('./config/eslintrc.cjs'), - tsconfig: require.resolve('./config/tsconfig.json') - }), - PrettierConfigWriter.from({ - configPath: require.resolve('./config/prettier.config.cjs') - }) - ]); - } + /* Jest config. Learn how to replace tester - https://bit.dev/reference/testing/set-up-tester */ + protected jestConfigPath = req.resolve('./config/jest.config.cjs'); } export default new ${Name}(); diff --git a/angular/templates/generators/ng-env/files/preview/host-dependencies.ts b/angular/templates/generators/ng-env/files/preview/host-dependencies.ts deleted file mode 100644 index bc1b1575..00000000 --- a/angular/templates/generators/ng-env/files/preview/host-dependencies.ts +++ /dev/null @@ -1,16 +0,0 @@ -export const hostDependenciesFile = () => { - return { - relativePath: './preview/host-dependencies.ts', - content: `/** - * Dependencies to be bundled only once, in the env preview template, and not in each component preview. - * most of your peer dependencies should be listed here to avoid duplications in the preview. - * React, ReactDOM, and MDX are included as they are part of the preview ui. - */ -export default [ - '@teambit/mdx.ui.mdx-scope-context', - '@mdx-js/react', - 'react', - 'react-dom', -];`, - }; -}; diff --git a/angular/templates/generators/ng-env/files/preview/mounter.ts b/angular/templates/generators/ng-env/files/preview/mounter.ts deleted file mode 100644 index f5af14e9..00000000 --- a/angular/templates/generators/ng-env/files/preview/mounter.ts +++ /dev/null @@ -1,68 +0,0 @@ -export const mounterFile = (angularVersion: number) => { - return { - relativePath: './preview/mounter.ts', - content: angularVersion <= 13 ? `/* eslint-disable import/no-unresolved */ -import { createMounter } from '@bitdev/angular.dev-services.preview.mounter'; -import { Component, NgModule, ViewEncapsulation } from '@angular/core'; - -/** - * Provide your component compositions (preview) with the context they need to run. - * for example, a router, a theme, a data provider, etc. - * components added here as providers should be listed as host-dependencies in your host-dependencies.ts file. - * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers - */ -@Component({ - selector: 'bit-wrapper', - encapsulation: ViewEncapsulation.ShadowDom, - template: \` -
- \`, -}) export class WrapperComponent { -} - -@NgModule({ - declarations: [WrapperComponent], - imports: [], - exports: [WrapperComponent], - bootstrap: [WrapperComponent], -}) export class WrapperModule { -} - - -/** - * the entry for the app (preview runtime) that renders your component previews. - * use the default template or create your own. - * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers - */ -export default createMounter(WrapperModule, {wrapperSelector: '#wrapper-host'});` -// Angular v14+ -: `/* eslint-disable import/no-unresolved */ -import { createMounter } from '@bitdev/angular.dev-services.preview.mounter'; -import { Component, ViewEncapsulation } from '@angular/core'; - -/** - * Provide your component compositions (preview) with the context they need to run. - * for example, a router, a theme, a data provider, etc. - * components added here as providers should be listed as host-dependencies in your host-dependencies.ts file. - * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers - */ -@Component({ - selector: 'bit-wrapper', - standalone: true, - imports: [], - encapsulation: ViewEncapsulation.None, - template: \` - - \`, -}) export class WrapperComponent {} - - -/** - * the entry for the app (preview runtime) that renders your component previews. - * use the default template or create your own. - * @see https://bit.dev/docs/angular-env-env/components-preview#compositions-providers - */ -export default createMounter(WrapperComponent); -`, - }; -}; diff --git a/angular/templates/generators/ng-env/index.ts b/angular/templates/generators/ng-env/index.ts index f20613b1..de20672a 100644 --- a/angular/templates/generators/ng-env/index.ts +++ b/angular/templates/generators/ng-env/index.ts @@ -13,8 +13,7 @@ import { docFile } from './files/doc'; import { envFile } from './files/env'; import { envJsoncFile } from './files/env-jsonc'; import { indexFile } from './files/index'; -import { hostDependenciesFile } from './files/preview/host-dependencies'; -import { mounterFile } from './files/preview/mounter'; +import { mounterFile } from './files/config/mounter'; export class NgEnvTemplate implements ComponentTemplate { installMissingDependencies = true; @@ -66,8 +65,7 @@ export class NgEnvTemplate implements ComponentTemplate { prettierConfigFile(), tsConfigFile(), tsConfigSpecFile(), - mounterFile(this.angularVersion), - hostDependenciesFile() + mounterFile() ]; } diff --git a/angular/templates/generators/ng-module/files/component-spec.ts b/angular/templates/generators/ng-module/files/component-spec.ts index 76b192d6..d18f3bce 100644 --- a/angular/templates/generators/ng-module/files/component-spec.ts +++ b/angular/templates/generators/ng-module/files/component-spec.ts @@ -6,7 +6,6 @@ export const componentSpecFile = (context: ComponentContext): ComponentFile => { return { relativePath: `${name}.spec.ts`, content: `import { ComponentFixture, TestBed } from '@angular/core/testing'; - import { ${Name}Component } from './${name}.component'; import { ${Name}Module } from './${name}.module'; diff --git a/angular/templates/generators/ng-module/files/composition.ts b/angular/templates/generators/ng-module/files/composition.ts index c27aea3b..30e5978a 100644 --- a/angular/templates/generators/ng-module/files/composition.ts +++ b/angular/templates/generators/ng-module/files/composition.ts @@ -1,27 +1,11 @@ import { ComponentContext, ComponentFile } from '@teambit/generator'; -export const compositionFile = (context: ComponentContext, angularVersion: number): ComponentFile => { +export const compositionFile = (context: ComponentContext): ComponentFile => { const { name, namePascalCase: Name } = context; - const moduleComposition = `import { Component, NgModule } from '@angular/core'; -import { ${Name}Module } from './${name}.module'; - -@Component({ - selector: '${name}-composition-cmp', - standalone: false, - template: \`${Name} composition: <${name}>\` -}) -class ${Name}CompositionComponent {} - -@NgModule({ - declarations: [${Name}CompositionComponent], - imports: [${Name}Module], - bootstrap: [${Name}CompositionComponent] -}) -export class ${Name}CompositionModule {} -`; - - const standaloneComposition = `import { Component } from '@angular/core'; + return { + relativePath: `${name}.composition.ts`, + content: `import { Component } from '@angular/core'; import { ${Name}Module } from './${name}.module'; @Component({ @@ -30,11 +14,6 @@ import { ${Name}Module } from './${name}.module'; imports: [${Name}Module], template: \`${Name} composition: <${name}>\` }) -export class ${Name}CompositionComponent {} -`; - - return { - relativePath: `${name}.composition.ts`, - content: angularVersion >= 14 ? standaloneComposition : moduleComposition, +export class ${Name}CompositionComponent {}`, }; }; diff --git a/angular/templates/generators/ng-module/index.ts b/angular/templates/generators/ng-module/index.ts index 37fda9ec..b5b5f3db 100644 --- a/angular/templates/generators/ng-module/index.ts +++ b/angular/templates/generators/ng-module/index.ts @@ -24,7 +24,7 @@ export class NgModuleTemplate implements ComponentTemplate { moduleFile(context), docsFile(context), componentSpecFile(context), - compositionFile(context, this.angularVersion), + compositionFile(context), ]; } diff --git a/angular/templates/generators/ng-standalone/files/component-spec.ts b/angular/templates/generators/ng-standalone/files/component-spec.ts index 27ba4eb9..ded11ef6 100644 --- a/angular/templates/generators/ng-standalone/files/component-spec.ts +++ b/angular/templates/generators/ng-standalone/files/component-spec.ts @@ -6,7 +6,6 @@ export const componentSpecFile = (context: ComponentContext): ComponentFile => { return { relativePath: `${name}.spec.ts`, content: `import { ComponentFixture, TestBed } from '@angular/core/testing'; - import { ${Name}Component } from './${name}.component'; describe('${Name}Component', () => { diff --git a/bit-angular.zip b/bit-angular.zip new file mode 100644 index 0000000000000000000000000000000000000000..bd49300f5883796fd7a31ad96240fc7c54f3aebd GIT binary patch literal 920606 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�E64Q@?lKmA+#2- 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

u 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 RI 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