fix(bazel): flat module misses AMD module name on windows (#27839)
* Fixes that the flat module out files do not have a proper AMD module name on Windows. This is currently blocking serving a `ng_module` using the Bazel TypeScript `devserver` on Windows. PR Close #27839
This commit is contained in:
parent
31fdff7121
commit
935ce63b73
|
@ -199,25 +199,27 @@ export function compile({allDepsCompiledWithBazel = true, compilerOpts, tsHost,
|
||||||
};
|
};
|
||||||
const origBazelHostShouldNameModule = bazelHost.shouldNameModule.bind(bazelHost);
|
const origBazelHostShouldNameModule = bazelHost.shouldNameModule.bind(bazelHost);
|
||||||
bazelHost.shouldNameModule = (fileName: string) => {
|
bazelHost.shouldNameModule = (fileName: string) => {
|
||||||
|
const flatModuleOutPath =
|
||||||
|
path.posix.join(bazelOpts.package, compilerOpts.flatModuleOutFile + '.ts');
|
||||||
|
|
||||||
// The bundle index file is synthesized in bundle_index_host so it's not in the
|
// The bundle index file is synthesized in bundle_index_host so it's not in the
|
||||||
// compilationTargetSrc.
|
// compilationTargetSrc.
|
||||||
// However we still want to give it an AMD module name for devmode.
|
// However we still want to give it an AMD module name for devmode.
|
||||||
// We can't easily tell which file is the synthetic one, so we build up the path we expect
|
// We can't easily tell which file is the synthetic one, so we build up the path we expect
|
||||||
// it to have and compare against that.
|
// it to have and compare against that.
|
||||||
if (fileName ===
|
if (fileName === path.posix.join(compilerOpts.baseUrl, flatModuleOutPath)) return true;
|
||||||
path.join(compilerOpts.baseUrl, bazelOpts.package, compilerOpts.flatModuleOutFile + '.ts'))
|
|
||||||
return true;
|
|
||||||
// Also handle the case the target is in an external repository.
|
// Also handle the case the target is in an external repository.
|
||||||
// Pull the workspace name from the target which is formatted as `@wksp//package:target`
|
// Pull the workspace name from the target which is formatted as `@wksp//package:target`
|
||||||
// if it the target is from an external workspace. If the target is from the local
|
// if it the target is from an external workspace. If the target is from the local
|
||||||
// workspace then it will be formatted as `//package:target`.
|
// workspace then it will be formatted as `//package:target`.
|
||||||
const targetWorkspace = bazelOpts.target.split('/')[0].replace(/^@/, '');
|
const targetWorkspace = bazelOpts.target.split('/')[0].replace(/^@/, '');
|
||||||
|
|
||||||
if (targetWorkspace &&
|
if (targetWorkspace &&
|
||||||
fileName ===
|
fileName ===
|
||||||
path.join(
|
path.posix.join(compilerOpts.baseUrl, 'external', targetWorkspace, flatModuleOutPath))
|
||||||
compilerOpts.baseUrl, 'external', targetWorkspace, bazelOpts.package,
|
|
||||||
compilerOpts.flatModuleOutFile + '.ts'))
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return origBazelHostShouldNameModule(fileName) || NGC_GEN_FILES.test(fileName);
|
return origBazelHostShouldNameModule(fileName) || NGC_GEN_FILES.test(fileName);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -35,3 +35,19 @@ jasmine_node_test(
|
||||||
"@build_bazel_rules_typescript//third_party/github.com/bazelbuild/bazel/src/main/protobuf:worker_protocol.proto",
|
"@build_bazel_rules_typescript//third_party/github.com/bazelbuild/bazel/src/main/protobuf:worker_protocol.proto",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ts_library(
|
||||||
|
name = "flat_module_test_lib",
|
||||||
|
testonly = True,
|
||||||
|
srcs = ["flat_module_test.ts"],
|
||||||
|
tsconfig = ":tsconfig.json",
|
||||||
|
deps = [
|
||||||
|
"//packages/private/testing",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
jasmine_node_test(
|
||||||
|
name = "flat_module_test",
|
||||||
|
srcs = [":flat_module_test_lib"],
|
||||||
|
data = ["//packages/bazel/test/ngc-wrapped/flat_module"],
|
||||||
|
)
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
load("//tools:defaults.bzl", "ng_module")
|
||||||
|
|
||||||
|
package(default_visibility = ["//packages/bazel/test:__subpackages__"])
|
||||||
|
|
||||||
|
ng_module(
|
||||||
|
name = "flat_module",
|
||||||
|
srcs = [
|
||||||
|
"export.ts",
|
||||||
|
"index.ts",
|
||||||
|
],
|
||||||
|
module_name = "flat_module",
|
||||||
|
tsconfig = ":tsconfig.json",
|
||||||
|
deps = [
|
||||||
|
"//packages/core",
|
||||||
|
],
|
||||||
|
)
|
|
@ -0,0 +1,9 @@
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright Google Inc. 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const Test = 'This is a test export';
|
|
@ -0,0 +1,9 @@
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright Google Inc. 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
|
||||||
|
*/
|
||||||
|
|
||||||
|
export * from './export';
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"types": []
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright Google Inc. 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 {obsoleteInIvy, onlyInIvy} from '@angular/private/testing';
|
||||||
|
import {existsSync, readFileSync} from 'fs';
|
||||||
|
import {dirname, join} from 'path';
|
||||||
|
|
||||||
|
describe('flat_module ng_module', () => {
|
||||||
|
|
||||||
|
let packageOutput: string;
|
||||||
|
let flatModuleOutFile: string;
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
packageOutput =
|
||||||
|
dirname(require.resolve('angular/packages/bazel/test/ngc-wrapped/flat_module/index.js'));
|
||||||
|
flatModuleOutFile = join(packageOutput, 'flat_module.js');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have a flat module out file',
|
||||||
|
() => { expect(existsSync(flatModuleOutFile)).toBe(true); });
|
||||||
|
|
||||||
|
describe('flat module out file', () => {
|
||||||
|
|
||||||
|
obsoleteInIvy('Ngtsc computes the AMD module name differently than NGC')
|
||||||
|
.it('should have a proper AMD module name', () => {
|
||||||
|
expect(readFileSync(flatModuleOutFile, 'utf8'))
|
||||||
|
.toContain(`define("flat_module/flat_module"`);
|
||||||
|
});
|
||||||
|
|
||||||
|
onlyInIvy('Ngtsc computes the AMD module name differently than NGC')
|
||||||
|
.it('should have a proper AMD module name', () => {
|
||||||
|
expect(readFileSync(flatModuleOutFile, 'utf8')).toContain(`define("flat_module"`);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue