Skip to content

Commit f5be6ff

Browse files
committed
enable env composition to override compiler options
1 parent a8b209d commit f5be6ff

File tree

16 files changed

+211
-160
lines changed

16 files changed

+211
-160
lines changed

packages/angular-v11/angular-v11.main.runtime.ts

Lines changed: 4 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,8 @@
1-
import { MainRuntime } from '@teambit/cli';
2-
import { CompilerAspect, CompilerMain } from '@teambit/compiler';
3-
import { CompositionsAspect, CompositionsMain } from '@teambit/compositions';
4-
import { EnvsAspect, EnvsMain } from '@teambit/envs';
5-
import { ESLintAspect, ESLintMain } from '@teambit/eslint';
6-
import { GeneratorAspect, GeneratorMain } from '@teambit/generator';
7-
import { JestAspect, JestMain } from '@teambit/jest';
8-
import { NgPackagrAspect, NgPackagrMain } from '@teambit/ng-packagr';
9-
import { WebpackAspect, WebpackMain } from '@teambit/webpack';
10-
import { Workspace, WorkspaceAspect } from '@teambit/workspace';
11-
import { AngularPreview } from '@teambit/angular';
1+
import { AngularDeps, AngularMain, AngularPreview } from '@teambit/angular';
122
import { AngularV11Aspect } from './angular-v11.aspect';
133
import { AngularV11Env } from './angular-v11.env';
144

15-
type AngularV11Deps = [
16-
JestMain,
17-
CompilerMain,
18-
ESLintMain,
19-
NgPackagrMain,
20-
GeneratorMain,
21-
WebpackMain,
22-
Workspace,
23-
CompositionsMain,
24-
EnvsMain
25-
];
26-
27-
export class AngularV11Main {
28-
static slots = [];
29-
static runtime: any = MainRuntime;
30-
static dependencies: any = [
31-
JestAspect,
32-
CompilerAspect,
33-
ESLintAspect,
34-
NgPackagrAspect,
35-
GeneratorAspect,
36-
WebpackAspect,
37-
WorkspaceAspect,
38-
CompositionsAspect,
39-
EnvsAspect,
40-
];
41-
42-
constructor(readonly angularV11Env: AngularV11Env) {}
43-
5+
export class AngularV11Main extends AngularMain {
446
static async provider([
457
jestAspect,
468
compiler,
@@ -51,7 +13,7 @@ export class AngularV11Main {
5113
workspace,
5214
compositions,
5315
envs,
54-
]: AngularV11Deps) {
16+
]: AngularDeps) {
5517
const angularV11Env = new AngularV11Env(
5618
jestAspect,
5719
compiler,
@@ -62,9 +24,7 @@ export class AngularV11Main {
6224
workspace,
6325
compositions
6426
);
65-
const angularV11Main = new AngularV11Main(angularV11Env);
66-
envs.registerEnv(angularV11Env);
67-
return angularV11Main;
27+
return new AngularV11Main(envs, angularV11Env);
6828
}
6929
}
7030

packages/angular-v12/angular-v12.main.runtime.ts

Lines changed: 4 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,8 @@
1-
import { MainRuntime } from '@teambit/cli';
2-
import { CompilerAspect, CompilerMain } from '@teambit/compiler';
3-
import { CompositionsAspect, CompositionsMain } from '@teambit/compositions';
4-
import { EnvsAspect, EnvsMain } from '@teambit/envs';
5-
import { ESLintAspect, ESLintMain } from '@teambit/eslint';
6-
import { GeneratorAspect, GeneratorMain } from '@teambit/generator';
7-
import { JestAspect, JestMain } from '@teambit/jest';
8-
import { NgPackagrAspect, NgPackagrMain } from '@teambit/ng-packagr';
9-
import { WebpackAspect, WebpackMain } from '@teambit/webpack';
10-
import { Workspace, WorkspaceAspect } from '@teambit/workspace';
11-
import { AngularPreview } from '@teambit/angular';
1+
import { AngularDeps, AngularMain, AngularPreview } from '@teambit/angular';
122
import { AngularV12Aspect } from './angular-v12.aspect';
133
import { AngularV12Env } from './angular-v12.env';
144

15-
type AngularV12Deps = [
16-
JestMain,
17-
CompilerMain,
18-
ESLintMain,
19-
NgPackagrMain,
20-
GeneratorMain,
21-
WebpackMain,
22-
Workspace,
23-
CompositionsMain,
24-
EnvsMain
25-
];
26-
27-
export class AngularV12Main {
28-
static slots = [];
29-
static runtime: any = MainRuntime;
30-
static dependencies: any = [
31-
JestAspect,
32-
CompilerAspect,
33-
ESLintAspect,
34-
NgPackagrAspect,
35-
GeneratorAspect,
36-
WebpackAspect,
37-
WorkspaceAspect,
38-
CompositionsAspect,
39-
EnvsAspect,
40-
];
41-
42-
constructor(readonly angularV12Env: AngularV12Env) {}
43-
5+
export class AngularV12Main extends AngularMain {
446
static async provider([
457
jestAspect,
468
compiler,
@@ -51,7 +13,7 @@ export class AngularV12Main {
5113
workspace,
5214
compositions,
5315
envs,
54-
]: AngularV12Deps) {
16+
]: AngularDeps): Promise<AngularMain> {
5517
const angularV12Env = new AngularV12Env(
5618
jestAspect,
5719
compiler,
@@ -62,9 +24,7 @@ export class AngularV12Main {
6224
workspace,
6325
compositions
6426
);
65-
const angularV12Main = new AngularV12Main(angularV12Env);
66-
envs.registerEnv(angularV12Env);
67-
return angularV12Main;
27+
return new AngularV12Main(envs, angularV12Env);
6828
}
6929
}
7030

packages/angular/angular.env.ts

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,30 @@ import { BuildTask } from '@teambit/builder';
33
import { Bundler, BundlerContext, DevServer, DevServerContext } from '@teambit/bundler';
44
import { CompilerMain, CompilerOptions } from '@teambit/compiler';
55
import { VariantPolicyConfigObject } from '@teambit/dependency-resolver';
6-
import { BuilderEnv, DependenciesEnv, DevEnv, EnvDescriptor, LinterEnv, TesterEnv } from '@teambit/envs';
6+
import {
7+
BuilderEnv,
8+
CompilerEnv,
9+
DependenciesEnv,
10+
DevEnv,
11+
EnvDescriptor,
12+
LinterEnv,
13+
TesterEnv
14+
} from '@teambit/envs';
715
import { ESLintMain } from '@teambit/eslint';
816
import { GeneratorMain } from '@teambit/generator';
917
import { JestMain } from '@teambit/jest';
1018
import { Linter } from '@teambit/linter';
1119
import { NgPackagr, NgPackagrMain } from '@teambit/ng-packagr';
1220
import { Tester } from '@teambit/tester';
13-
import { TsCompilerOptionsWithoutTsConfig } from '@teambit/typescript';
1421
import { WebpackConfigTransformer } from '@teambit/webpack';
22+
import { CompilerOptions as TsCompilerOptions } from '@angular/compiler-cli';
1523
import { angularTemplates } from './angular.templates';
1624
import { AngularWebpack } from './angular.webpack';
1725

1826
/**
1927
* a component environment built for [Angular](https://angular.io).
2028
*/
21-
export abstract class AngularEnv implements BuilderEnv, LinterEnv, DependenciesEnv, DevEnv, TesterEnv {
29+
export abstract class AngularEnv implements CompilerEnv, LinterEnv, DependenciesEnv, DevEnv, TesterEnv {
2230
icon = 'https://static.bit.dev/extensions-icons/angular.svg';
2331

2432
constructor(
@@ -39,38 +47,22 @@ export abstract class AngularEnv implements BuilderEnv, LinterEnv, DependenciesE
3947
abstract __getDescriptor(): Promise<EnvDescriptor>;
4048
abstract getDependencies(): VariantPolicyConfigObject | Promise<VariantPolicyConfigObject>;
4149

42-
private createNgPackgrCompiler(
43-
tsconfig?: any, // any instead of TsConfigSourceFile because we don't use the same ts version
44-
compilerOptions: Partial<CompilerOptions> = {}
45-
) {
46-
return this.ngPackagrAspect.createCompiler(this.ngPackagr, this.readDefaultTsConfig, tsconfig, {
47-
...compilerOptions,
48-
});
49-
}
50-
51-
getCompiler(
52-
tsconfig?: any, // any instead of TsConfigSourceFile because we don't use the same ts version
53-
compilerOptions: Partial<TsCompilerOptionsWithoutTsConfig> = {}
54-
) {
55-
return this.createNgPackgrCompiler(tsconfig, compilerOptions);
50+
private createNgPackgrCompiler(tsCompilerOptions?: TsCompilerOptions, bitCompilerOptions?: Partial<CompilerOptions>) {
51+
return this.ngPackagrAspect.createCompiler(this.ngPackagr, this.readDefaultTsConfig, tsCompilerOptions, bitCompilerOptions);
5652
}
5753

58-
private getCompilerTask(
59-
tsconfig?: any, // any instead of TsConfigSourceFile because we don't use the same ts version
60-
compilerOptions: Partial<TsCompilerOptionsWithoutTsConfig> = {}
61-
) {
62-
return this.compiler.createTask('NgPackagrCompiler', this.getCompiler(tsconfig, compilerOptions));
54+
getCompiler(tsCompilerOptions?: TsCompilerOptions, bitCompilerOptions?: Partial<CompilerOptions>) {
55+
return this.createNgPackgrCompiler(tsCompilerOptions, bitCompilerOptions);
6356
}
6457

6558
/**
6659
* Returns the component build pipeline
6760
* Required for `bit build`
6861
*/
69-
getBuildPipe(
70-
tsconfig?: any, // any instead of TsConfigSourceFile because we don't use the same ts version
71-
compilerOptions: Partial<TsCompilerOptionsWithoutTsConfig> = {}
72-
): BuildTask[] {
73-
return [this.getCompilerTask(tsconfig, compilerOptions)];
62+
getBuildPipe(tsCompilerOptions?: TsCompilerOptions, bitCompilerOptions?: Partial<CompilerOptions>): BuildTask[] {
63+
const compiler = this.getCompiler(tsCompilerOptions, bitCompilerOptions);
64+
const compilerTask = this.compiler.createTask('NgPackagrCompiler', compiler);
65+
return [compilerTask];
7466
}
7567

7668
/**
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { CompilerOptions as TsCompilerOptions, readConfiguration } from '@angular/compiler-cli';
2+
import { CompilerAspect, CompilerMain, CompilerOptions } from '@teambit/compiler';
3+
import { CompositionsAspect, CompositionsMain } from '@teambit/compositions';
4+
import { Environment, EnvsAspect, EnvsMain, EnvTransformer } from '@teambit/envs';
5+
import { ESLintAspect, ESLintMain } from '@teambit/eslint';
6+
import { GeneratorAspect, GeneratorMain } from '@teambit/generator';
7+
import { JestAspect, JestMain } from '@teambit/jest';
8+
import { MainRuntime } from '@teambit/legacy/dist/scopes/harmony/cli';
9+
import { NgPackagrAspect, NgPackagrMain } from '@teambit/ng-packagr';
10+
import { WebpackAspect, WebpackMain } from '@teambit/webpack';
11+
import { Workspace, WorkspaceAspect } from '@teambit/workspace';
12+
import { AngularEnv } from './angular.env';
13+
14+
export type AngularDeps = [
15+
JestMain,
16+
CompilerMain,
17+
ESLintMain,
18+
NgPackagrMain,
19+
GeneratorMain,
20+
WebpackMain,
21+
Workspace,
22+
CompositionsMain,
23+
EnvsMain
24+
];
25+
26+
export abstract class AngularMain {
27+
static slots = [];
28+
static runtime: any = MainRuntime;
29+
static dependencies: any = [
30+
JestAspect,
31+
CompilerAspect,
32+
ESLintAspect,
33+
NgPackagrAspect,
34+
GeneratorAspect,
35+
WebpackAspect,
36+
WorkspaceAspect,
37+
CompositionsAspect,
38+
EnvsAspect,
39+
];
40+
41+
constructor(private envs: EnvsMain, private angularEnv: AngularEnv) {
42+
envs.registerEnv(angularEnv);
43+
}
44+
45+
/**
46+
* Create a new composition of the angular environment.
47+
*/
48+
compose(transformers: EnvTransformer[], targetEnv: Environment = {}) {
49+
return this.envs.compose(this.envs.merge(targetEnv, this.angularEnv), transformers);
50+
}
51+
52+
/**
53+
* Override the compiler options for the Angular environment.
54+
* Compiler options combine both typescript "compilerOptions" and Angular specific "angularCompilerOptions"
55+
*/
56+
overrideCompilerOptions(tsconfigPath: string, bitCompilerOptions?: Partial<CompilerOptions>): EnvTransformer;
57+
overrideCompilerOptions(compilerOptions: TsCompilerOptions, bitCompilerOptions?: Partial<CompilerOptions>): EnvTransformer;
58+
overrideCompilerOptions(opts?: TsCompilerOptions | string, bitCompilerOptions?: Partial<CompilerOptions>): EnvTransformer {
59+
let tsCompilerOptions: TsCompilerOptions | undefined;
60+
if (typeof opts === 'string') {
61+
tsCompilerOptions = readConfiguration(opts).options;
62+
} else {
63+
tsCompilerOptions = opts;
64+
}
65+
66+
return this.envs.override({
67+
getCompiler: () => {
68+
return this.angularEnv.getCompiler(tsCompilerOptions, bitCompilerOptions);
69+
},
70+
getBuildPipe: () => {
71+
return this.angularEnv.getBuildPipe(tsCompilerOptions, bitCompilerOptions);
72+
}
73+
});
74+
}
75+
}

packages/angular/angular.templates.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { ComponentTemplate } from '@teambit/generator';
2+
import { ngEnvTemplate } from './templates/ng-env';
23
import { ngLibTemplate } from './templates/ng-lib';
34

4-
export const angularTemplates: ComponentTemplate[] = [ngLibTemplate];
5+
export const angularTemplates: ComponentTemplate[] = [ngLibTemplate, ngEnvTemplate];
56

67
// export const workspaceTemplates: WorkspaceTemplate[] = [angularWorkspaceTemplate];

packages/angular/angular.webpack.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { Bundler, BundlerContext, DevServer, DevServerContext, Target } from '@teambit/bundler';
2-
import { ComponentID } from '@teambit/component';
32
import { CompositionsMain } from '@teambit/compositions';
43
import { CACHE_ROOT } from '@teambit/legacy/dist/constants';
54
import { pathNormalizeToLinux } from '@teambit/legacy/dist/utils';

packages/angular/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@ export { AngularWebpack, WebpackSetup } from './angular.webpack';
22
export { AngularEnv } from './angular.env';
33
export { AngularPreview } from './angular.preview.runtime';
44
export { AngularModulesResolverPlugin } from './angular.webpack.resolver';
5+
export { AngularMain } from './angular.main.runtime';
6+
export type { AngularDeps } from './angular.main.runtime'
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export function docFile() {
2+
return `---
3+
labels: ['extension', 'angular', 'env', 'environment']
4+
description: 'A customized extension for Angular environment.'
5+
---
6+
7+
This is a customized extension for Angular, based on the [Angular Aspect](https://bit.dev/teambit/angular/angular-v12).
8+
9+
Explain here the modified configurations and tools applied.
10+
`;
11+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { ComponentContext } from '@teambit/generator';
2+
3+
export function extensionFile({ namePascalCase: Name }: ComponentContext) {
4+
return `import { EnvsMain, EnvsAspect } from '@teambit/envs'
5+
import { AngularV12Aspect, AngularV12Main } from '@teambit/angular-v12'
6+
7+
export class ${Name}Extension {
8+
constructor(private angular: AngularV12Main) {}
9+
10+
static dependencies: any = [EnvsAspect, AngularV12Aspect]
11+
12+
static async provider([envs, angular]: [EnvsMain, AngularV12Main]) {
13+
const ${Name}Env = angular.compose([
14+
/**
15+
* Use any of the "angular.override..." transformers, for example:
16+
* angular.overrideCompilerOptions({
17+
* fullTemplateTypeCheck: false
18+
* })
19+
*/
20+
])
21+
22+
envs.registerEnv(${Name}Env)
23+
24+
return new ${Name}Extension(angular)
25+
}
26+
}
27+
`;
28+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { ComponentContext } from '@teambit/generator';
2+
3+
export function indexFile({ namePascalCase: Name, name }: ComponentContext) {
4+
return `export { ${Name}Extension, ${Name}Extension as default } from './${name}.extension';
5+
`;
6+
}

0 commit comments

Comments
 (0)