fix(tsc-wrapped): ensure valid path separators in metadata
* Fixes that `tsc-wrapped` stores invalid path separators in the bundled metadata files. Previous errors could have been: `Cannot find module '.corecoordinationnique-selection-dispatcher'.` (See https://github.com/angular/material2/issues/3834) * Fixes failing tests on Windows. Now all tooling tests are green on Windows. Related to #15403
This commit is contained in:
parent
258d5392d5
commit
96aa2365ae
|
@ -522,12 +522,14 @@ export class CompilerHostAdapter implements MetadataBundlerHost {
|
||||||
|
|
||||||
function resolveModule(importName: string, from: string): string {
|
function resolveModule(importName: string, from: string): string {
|
||||||
if (importName.startsWith('.') && from) {
|
if (importName.startsWith('.') && from) {
|
||||||
const normalPath = path.normalize(path.join(path.dirname(from), importName));
|
let normalPath = path.normalize(path.join(path.dirname(from), importName));
|
||||||
if (!normalPath.startsWith('.') && from.startsWith('.')) {
|
if (!normalPath.startsWith('.') && from.startsWith('.')) {
|
||||||
// path.normalize() preserves leading '../' but not './'. This adds it back.
|
// path.normalize() preserves leading '../' but not './'. This adds it back.
|
||||||
return `.${path.sep}${normalPath}`;
|
normalPath = `.${path.sep}${normalPath}`;
|
||||||
}
|
}
|
||||||
return normalPath;
|
// Replace windows path delimiters with forward-slashes. Otherwise the paths are not
|
||||||
|
// TypeScript compatible when building the bundle.
|
||||||
|
return normalPath.replace(/\\/g, '/');
|
||||||
}
|
}
|
||||||
return importName;
|
return importName;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import * as fs from 'fs';
|
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
|
@ -84,6 +83,19 @@ describe('metadata bundler', () => {
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should not output windows paths in metadata', () => {
|
||||||
|
const host = new MockStringBundlerHost('/', {
|
||||||
|
'index.ts': `
|
||||||
|
export * from './exports/test';
|
||||||
|
`,
|
||||||
|
'exports': {'test.ts': `export class TestExport {}`}
|
||||||
|
});
|
||||||
|
const bundler = new MetadataBundler('/index', undefined, host);
|
||||||
|
const result = bundler.getMetadataBundle();
|
||||||
|
|
||||||
|
expect(result.metadata.origins).toEqual({'TestExport': './exports/test'});
|
||||||
|
});
|
||||||
|
|
||||||
it('should convert re-exported to the export', () => {
|
it('should convert re-exported to the export', () => {
|
||||||
const host = new MockStringBundlerHost('/', {
|
const host = new MockStringBundlerHost('/', {
|
||||||
'index.ts': `
|
'index.ts': `
|
||||||
|
|
|
@ -54,7 +54,9 @@ export class Host implements ts.LanguageServiceHost {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function open(directory: Directory, fileName: string): Directory|string|undefined {
|
export function open(directory: Directory, fileName: string): Directory|string|undefined {
|
||||||
const names = fileName.split('/');
|
// Path might be normalized by the current node environment. But it could also happen that this
|
||||||
|
// path directly comes from the compiler in POSIX format. Support both separators for development.
|
||||||
|
const names = fileName.split(/[\\/]/);
|
||||||
let current: Directory|string = directory;
|
let current: Directory|string = directory;
|
||||||
if (names.length && names[0] === '') names.shift();
|
if (names.length && names[0] === '') names.shift();
|
||||||
for (const name of names) {
|
for (const name of names) {
|
||||||
|
|
Loading…
Reference in New Issue