Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
karmaOptions.singleRun = !options.watch;
}
// Convert browsers from a string to an array
if (options.browsers) {
karmaOptions.browsers = options.browsers.split(',');
}
if (options.reporters) {
// Split along commas to make it more natural, and remove empty strings.
const reporters = options.reporters
.reduce((acc, curr) => acc.concat(curr.split(/,/)), [])
.filter(x => !!x);
if (reporters.length > 0) {
karmaOptions.reporters = reporters;
}
}
const sourceRoot = builderConfig.sourceRoot && core_1.resolve(root, builderConfig.sourceRoot);
karmaOptions.buildWebpack = {
root: core_1.getSystemPath(root),
projectRoot: core_1.getSystemPath(projectRoot),
options,
webpackConfig: this.buildWebpackConfig(root, projectRoot, sourceRoot, host, options),
// Pass onto Karma to emit BuildEvents.
successCb: () => obs.next({ success: true }),
failureCb: () => obs.next({ success: false }),
// Workaround for https://github.com/karma-runner/karma/issues/3154
// When this workaround is removed, user projects need to be updated to use a Karma
// version that has a fix for this issue.
toJSON: () => { },
logger: this.context.logger,
};
// TODO: inside the configs, always use the project root and not the workspace root.
// Until then we pretend the app root is relative (``) but the same as `projectRoot`.
run(builderConfig: BuilderConfiguration): Observable {
console.log('Hi');
const options = builderConfig.options;
const root = this.context.workspace.root;
const projectRoot = resolve(root, builderConfig.root);
const host = new virtualFs.AliasHost(this.context.host as virtualFs.Host);
const webpackBuilder = new WebpackBuilder({ ...this.context, host });
return of(null).pipe(
concatMap(() => options.deleteOutputPath
? this._deleteOutputDir(root, normalize(options.outputPath), this.context.host)
: of(null)),
concatMap(() => addFileReplacements(root, host, options.fileReplacements)),
concatMap(() => normalizeAssetPatterns(
options.assets, host, root, projectRoot, builderConfig.sourceRoot)),
// Replace the assets in options with the normalized version.
tap((assetPatternObjects => options.assets = assetPatternObjects)),
concatMap(() => {
// Ensure Build Optimizer is only used with AOT.
if (options.buildOptimizer && !options.aot) {
throw new Error('The `--build-optimizer` option cannot be used without `--aot`.');
buildWebpackConfig(root, projectRoot, options) {
let wco;
const host = new core_1.virtualFs.AliasHost(this.context.host);
const tsConfigPath = core_1.getSystemPath(core_1.normalize(core_1.resolve(root, core_1.normalize(options.tsConfig))));
const tsConfig = read_tsconfig_1.readTsconfig(tsConfigPath);
wco = {
root: core_1.getSystemPath(root),
projectRoot: core_1.getSystemPath(projectRoot),
// TODO: use only this.options, it contains all flags and configs items already.
buildOptions: options,
tsConfig,
tsConfigPath,
supportES2015: false,
};
const webpackConfigs = [
// We don't need to write to disk.
{ plugins: [new InMemoryOutputPlugin()] },
webpack_configs_1.getCommonConfig(wco),
webpack_configs_1.getAotConfig(wco, host, true),
webpack_configs_1.getStylesConfig(wco),
_deleteOutputDir(root, outputPath, host) {
const resolvedOutputPath = core_1.resolve(root, outputPath);
if (resolvedOutputPath === root) {
throw new Error('Output path MUST not be project root directory!');
}
return host.exists(resolvedOutputPath).pipe(operators_1.concatMap(exists => exists
// TODO: remove this concat once host ops emit an event.
? rxjs_1.concat(host.delete(resolvedOutputPath), rxjs_1.of(null)).pipe(operators_1.last())
// ? of(null)
: rxjs_1.of(null)));
}
}
private _deleteOutputDir(root: Path, outputPath: Path, host: virtualFs.Host) {
const resolvedOutputPath = resolve(root, outputPath);
if (resolvedOutputPath === root) {
throw new Error('Output path MUST not be project root directory!');
}
return host.exists(resolvedOutputPath).pipe(
concatMap(exists => exists
// TODO: remove this concat once host ops emit an event.
? concat(host.delete(resolvedOutputPath), of(null)).pipe(last())
// ? of(null)
: of(null)),
);
}
}
return assetPatterns.map((assetPattern: any) => {
if (typeof assetPattern === 'object') {
return assetPattern;
}
const assetPath = normalize(assetPattern);
const resolvedSourceRoot = resolve(dirToSearch, sourceRoot);
const resolvedAssetPath = resolve(dirToSearch, assetPath);
const parts = getAssetsParts(resolvedAssetPath, assetPath);
// Output directory for both is the relative path from source root to input.
const output = relative(resolvedSourceRoot, resolve(dirToSearch, parts.input));
// Return the asset pattern in object format.
return {
...parts,
output,
};
});
}
run(builderConfig: BuilderConfiguration): Observable {
const options = builderConfig.options;
const root = this.context.workspace.root;
const projectRoot = resolve(root, builderConfig.root);
const host = new virtualFs.AliasHost(this.context.host as virtualFs.Host);
const webpackBuilder = new WebpackBuilder({ ...this.context, host });
// TODO: verify using of(null) to kickstart things is a pattern.
return of(null).pipe(
concatMap(() => options.deleteOutputPath
? this._deleteOutputDir(root, normalize(options.outputPath), this.context.host)
: of(null)),
concatMap(() => normalizeFileReplacements(options.fileReplacements, host, root)),
tap(fileReplacements => options.fileReplacements = fileReplacements),
concatMap(() => {
const webpackConfig = this.buildWebpackConfig(root, projectRoot, host, options);
return webpackBuilder.runWebpack(webpackConfig, getBrowserLoggingCb(options.verbose));
}),
);
return new Observable(obs => {
augmentAppWithServiceWorker(
this.context.host,
root,
projectRoot,
resolve(root, normalize(options.outputPath)),
options.baseHref || '/',
options.ngswConfigPath
).then(
() => {
obs.next({ success: true });
obs.complete();
},
(err) => {
obs.error(err);
}
);
});
} else {
return new Observable(obs => {
augmentAppWithServiceWorker(
this.context.host,
root,
projectRoot,
resolve(root, normalize(options.outputPath)),
options.baseHref || '/',
options.ngswConfigPath,
).then(
() => {
obs.next({ success: true });
obs.complete();
},
(err: Error) => {
obs.error(err);
},
);
});
} else {
run(builderConfig: BuilderConfiguration): Observable {
const configPath = resolve(this.context.workspace.root,
normalize(builderConfig.options.webpackConfig));
return this.loadWebpackConfig(getSystemPath(configPath)).pipe(
concatMap(config => this.runWebpack(config)),
);
}