feat(bazel): allow setting compilationMode
in ng_module
rule (#41366)
Adds a new attribute to the `ng_module` rule that allows users to set the Angular compiler `compilationMode` flag. An alternative would have been to just enable the option in the user-specified tsconfig. Though that is more inconvenient if a Bazel workspace wants to change the compilation mode conditionally at anaylsis phase through build settings. Related to: https://github.com/angular/components/pull/22351t PR Close #41366
This commit is contained in:
parent
9f31cddfa6
commit
31370f4103
@ -339,6 +339,7 @@ def _ngc_tsconfig(ctx, files, srcs, **kwargs):
|
|||||||
# Summaries are only enabled if Angular outputs are to be produced.
|
# Summaries are only enabled if Angular outputs are to be produced.
|
||||||
"enableSummariesForJit": is_legacy_ngc,
|
"enableSummariesForJit": is_legacy_ngc,
|
||||||
"enableIvy": is_ivy_enabled(ctx),
|
"enableIvy": is_ivy_enabled(ctx),
|
||||||
|
"compilationMode": ctx.attr.compilation_mode,
|
||||||
"fullTemplateTypeCheck": ctx.attr.type_check,
|
"fullTemplateTypeCheck": ctx.attr.type_check,
|
||||||
# In Google3 we still want to use the symbol factory re-exports in order to
|
# In Google3 we still want to use the symbol factory re-exports in order to
|
||||||
# not break existing apps inside Google. Unlike Bazel, Google3 does not only
|
# not break existing apps inside Google. Unlike Bazel, Google3 does not only
|
||||||
@ -725,6 +726,14 @@ NG_MODULE_ATTRIBUTES = {
|
|||||||
"filter_summaries": attr.bool(default = False),
|
"filter_summaries": attr.bool(default = False),
|
||||||
"type_check": attr.bool(default = True),
|
"type_check": attr.bool(default = True),
|
||||||
"inline_resources": attr.bool(default = True),
|
"inline_resources": attr.bool(default = True),
|
||||||
|
"compilation_mode": attr.string(
|
||||||
|
doc = """Set the compilation mode for the Angular compiler.
|
||||||
|
|
||||||
|
This attribute is a noop if Ivy is not enabled.
|
||||||
|
""",
|
||||||
|
values = ["partial", "full", ""],
|
||||||
|
default = "",
|
||||||
|
),
|
||||||
"no_i18n": attr.bool(default = False),
|
"no_i18n": attr.bool(default = False),
|
||||||
"compiler": attr.label(
|
"compiler": attr.label(
|
||||||
doc = """Sets a different ngc compiler binary to use for this library.
|
doc = """Sets a different ngc compiler binary to use for this library.
|
||||||
|
45
packages/bazel/test/ngc-wrapped/ivy_enabled/BUILD.bazel
Normal file
45
packages/bazel/test/ngc-wrapped/ivy_enabled/BUILD.bazel
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ts_library")
|
||||||
|
|
||||||
|
ts_library(
|
||||||
|
name = "ng_module_ivy_test_lib",
|
||||||
|
testonly = True,
|
||||||
|
srcs = ["ng_module_ivy_test.ts"],
|
||||||
|
tags = ["ivy-only"],
|
||||||
|
)
|
||||||
|
|
||||||
|
# `ng_module` with `compilation_mode` explicitly set to `partial`.
|
||||||
|
ng_module(
|
||||||
|
name = "test_module_partial_compilation",
|
||||||
|
srcs = ["test_module_partial_compilation.ts"],
|
||||||
|
compilation_mode = "partial",
|
||||||
|
tags = ["ivy-only"],
|
||||||
|
deps = ["//packages/core"],
|
||||||
|
)
|
||||||
|
|
||||||
|
# `ng_module` with `compilation_mode` explicitly set to `full`.
|
||||||
|
ng_module(
|
||||||
|
name = "test_module_full_compilation",
|
||||||
|
srcs = ["test_module_full_compilation.ts"],
|
||||||
|
compilation_mode = "full",
|
||||||
|
tags = ["ivy-only"],
|
||||||
|
deps = ["//packages/core"],
|
||||||
|
)
|
||||||
|
|
||||||
|
# `ng_module` with no specific `compilation_mode` attribute specified.
|
||||||
|
ng_module(
|
||||||
|
name = "test_module_default_compilation",
|
||||||
|
srcs = ["test_module_default_compilation.ts"],
|
||||||
|
tags = ["ivy-only"],
|
||||||
|
deps = ["//packages/core"],
|
||||||
|
)
|
||||||
|
|
||||||
|
jasmine_node_test(
|
||||||
|
name = "ng_module_ivy_test",
|
||||||
|
srcs = [":ng_module_ivy_test_lib"],
|
||||||
|
data = [
|
||||||
|
":test_module_default_compilation",
|
||||||
|
":test_module_full_compilation",
|
||||||
|
":test_module_partial_compilation",
|
||||||
|
],
|
||||||
|
tags = ["ivy-only"],
|
||||||
|
)
|
@ -0,0 +1,41 @@
|
|||||||
|
/**
|
||||||
|
* @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 {readFileSync} from 'fs';
|
||||||
|
|
||||||
|
/** Runfiles helper from bazel to resolve file name paths. */
|
||||||
|
const runfiles = require(process.env['BAZEL_NODE_RUNFILES_HELPER']!);
|
||||||
|
|
||||||
|
describe('ng_module with ivy enabled', () => {
|
||||||
|
describe('default compilation mode', () => {
|
||||||
|
it('should generate definitions', () => {
|
||||||
|
const outputFile = runfiles.resolveWorkspaceRelative(
|
||||||
|
'packages/bazel/test/ngc-wrapped/ivy_enabled/test_module_default_compilation.js');
|
||||||
|
const fileContent = readFileSync(outputFile, 'utf8');
|
||||||
|
expect(fileContent).toContain(`TestComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent(`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('full compilation mode', () => {
|
||||||
|
it('should generate definitions', () => {
|
||||||
|
const outputFile = runfiles.resolveWorkspaceRelative(
|
||||||
|
'packages/bazel/test/ngc-wrapped/ivy_enabled/test_module_full_compilation.js');
|
||||||
|
const fileContent = readFileSync(outputFile, 'utf8');
|
||||||
|
expect(fileContent).toContain(`TestComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent(`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('partial compilation mode', () => {
|
||||||
|
it('should generate declarations', () => {
|
||||||
|
const outputFile = runfiles.resolveWorkspaceRelative(
|
||||||
|
'packages/bazel/test/ngc-wrapped/ivy_enabled/test_module_partial_compilation.js');
|
||||||
|
const fileContent = readFileSync(outputFile, 'utf8');
|
||||||
|
expect(fileContent).toContain(`TestComponent.ɵcmp = i0.ɵɵngDeclareComponent(`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* @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 {Component} from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
template: 'Hello',
|
||||||
|
})
|
||||||
|
export class TestComponent {
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* @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 {Component} from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
template: 'Hello',
|
||||||
|
})
|
||||||
|
export class TestComponent {
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* @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 {Component} from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
template: 'Hello',
|
||||||
|
})
|
||||||
|
export class TestComponent {
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user