346 lines
13 KiB
JavaScript
346 lines
13 KiB
JavaScript
|
|
||
|
import {createRequire as __cjsCompatRequire} from 'module';
|
||
|
const require = __cjsCompatRequire(import.meta.url);
|
||
|
|
||
|
import {
|
||
|
DEFAULT_ERROR_CODE,
|
||
|
EmitFlags,
|
||
|
SOURCE,
|
||
|
createCompilerHost,
|
||
|
createMessageDiagnostic,
|
||
|
exitCodeFromResult,
|
||
|
formatDiagnostics,
|
||
|
performCompilation,
|
||
|
readConfiguration
|
||
|
} from "./chunk-ELKFSTAE.js";
|
||
|
|
||
|
// bazel-out/k8-fastbuild/bin/packages/compiler-cli/src/main.mjs
|
||
|
import ts2 from "typescript";
|
||
|
import yargs from "yargs";
|
||
|
|
||
|
// bazel-out/k8-fastbuild/bin/packages/compiler-cli/src/perform_watch.mjs
|
||
|
import * as chokidar from "chokidar";
|
||
|
import * as path from "path";
|
||
|
import ts from "typescript";
|
||
|
function totalCompilationTimeDiagnostic(timeInMillis) {
|
||
|
let duration;
|
||
|
if (timeInMillis > 1e3) {
|
||
|
duration = `${(timeInMillis / 1e3).toPrecision(2)}s`;
|
||
|
} else {
|
||
|
duration = `${timeInMillis}ms`;
|
||
|
}
|
||
|
return {
|
||
|
category: ts.DiagnosticCategory.Message,
|
||
|
messageText: `Total time: ${duration}`,
|
||
|
code: DEFAULT_ERROR_CODE,
|
||
|
source: SOURCE,
|
||
|
file: void 0,
|
||
|
start: void 0,
|
||
|
length: void 0
|
||
|
};
|
||
|
}
|
||
|
var FileChangeEvent;
|
||
|
(function(FileChangeEvent2) {
|
||
|
FileChangeEvent2[FileChangeEvent2["Change"] = 0] = "Change";
|
||
|
FileChangeEvent2[FileChangeEvent2["CreateDelete"] = 1] = "CreateDelete";
|
||
|
FileChangeEvent2[FileChangeEvent2["CreateDeleteDir"] = 2] = "CreateDeleteDir";
|
||
|
})(FileChangeEvent || (FileChangeEvent = {}));
|
||
|
function createPerformWatchHost(configFileName, reportDiagnostics, existingOptions, createEmitCallback) {
|
||
|
return {
|
||
|
reportDiagnostics,
|
||
|
createCompilerHost: (options) => createCompilerHost({ options }),
|
||
|
readConfiguration: () => readConfiguration(configFileName, existingOptions),
|
||
|
createEmitCallback: (options) => createEmitCallback ? createEmitCallback(options) : void 0,
|
||
|
onFileChange: (options, listener, ready) => {
|
||
|
if (!options.basePath) {
|
||
|
reportDiagnostics([{
|
||
|
category: ts.DiagnosticCategory.Error,
|
||
|
messageText: "Invalid configuration option. baseDir not specified",
|
||
|
source: SOURCE,
|
||
|
code: DEFAULT_ERROR_CODE,
|
||
|
file: void 0,
|
||
|
start: void 0,
|
||
|
length: void 0
|
||
|
}]);
|
||
|
return { close: () => {
|
||
|
} };
|
||
|
}
|
||
|
const watcher = chokidar.watch(options.basePath, {
|
||
|
ignored: /((^[\/\\])\..)|(\.js$)|(\.map$)|(\.metadata\.json|node_modules)/,
|
||
|
ignoreInitial: true,
|
||
|
persistent: true
|
||
|
});
|
||
|
watcher.on("all", (event, path2) => {
|
||
|
switch (event) {
|
||
|
case "change":
|
||
|
listener(FileChangeEvent.Change, path2);
|
||
|
break;
|
||
|
case "unlink":
|
||
|
case "add":
|
||
|
listener(FileChangeEvent.CreateDelete, path2);
|
||
|
break;
|
||
|
case "unlinkDir":
|
||
|
case "addDir":
|
||
|
listener(FileChangeEvent.CreateDeleteDir, path2);
|
||
|
break;
|
||
|
}
|
||
|
});
|
||
|
watcher.on("ready", ready);
|
||
|
return { close: () => watcher.close(), ready };
|
||
|
},
|
||
|
setTimeout: ts.sys.clearTimeout && ts.sys.setTimeout || setTimeout,
|
||
|
clearTimeout: ts.sys.setTimeout && ts.sys.clearTimeout || clearTimeout
|
||
|
};
|
||
|
}
|
||
|
function performWatchCompilation(host) {
|
||
|
let cachedProgram;
|
||
|
let cachedCompilerHost;
|
||
|
let cachedOptions;
|
||
|
let timerHandleForRecompilation;
|
||
|
const ignoreFilesForWatch = /* @__PURE__ */ new Set();
|
||
|
const fileCache = /* @__PURE__ */ new Map();
|
||
|
const firstCompileResult = doCompilation();
|
||
|
let resolveReadyPromise;
|
||
|
const readyPromise = new Promise((resolve) => resolveReadyPromise = resolve);
|
||
|
const fileWatcher = host.onFileChange(cachedOptions.options, watchedFileChanged, resolveReadyPromise);
|
||
|
return { close, ready: (cb) => readyPromise.then(cb), firstCompileResult };
|
||
|
function cacheEntry(fileName) {
|
||
|
fileName = path.normalize(fileName);
|
||
|
let entry = fileCache.get(fileName);
|
||
|
if (!entry) {
|
||
|
entry = {};
|
||
|
fileCache.set(fileName, entry);
|
||
|
}
|
||
|
return entry;
|
||
|
}
|
||
|
function close() {
|
||
|
fileWatcher.close();
|
||
|
if (timerHandleForRecompilation) {
|
||
|
host.clearTimeout(timerHandleForRecompilation.timerHandle);
|
||
|
timerHandleForRecompilation = void 0;
|
||
|
}
|
||
|
}
|
||
|
function doCompilation() {
|
||
|
if (!cachedOptions) {
|
||
|
cachedOptions = host.readConfiguration();
|
||
|
}
|
||
|
if (cachedOptions.errors && cachedOptions.errors.length) {
|
||
|
host.reportDiagnostics(cachedOptions.errors);
|
||
|
return cachedOptions.errors;
|
||
|
}
|
||
|
const startTime = Date.now();
|
||
|
if (!cachedCompilerHost) {
|
||
|
cachedCompilerHost = host.createCompilerHost(cachedOptions.options);
|
||
|
const originalWriteFileCallback = cachedCompilerHost.writeFile;
|
||
|
cachedCompilerHost.writeFile = function(fileName, data, writeByteOrderMark, onError, sourceFiles = []) {
|
||
|
ignoreFilesForWatch.add(path.normalize(fileName));
|
||
|
return originalWriteFileCallback(fileName, data, writeByteOrderMark, onError, sourceFiles);
|
||
|
};
|
||
|
const originalFileExists = cachedCompilerHost.fileExists;
|
||
|
cachedCompilerHost.fileExists = function(fileName) {
|
||
|
const ce = cacheEntry(fileName);
|
||
|
if (ce.exists == null) {
|
||
|
ce.exists = originalFileExists.call(this, fileName);
|
||
|
}
|
||
|
return ce.exists;
|
||
|
};
|
||
|
const originalGetSourceFile = cachedCompilerHost.getSourceFile;
|
||
|
cachedCompilerHost.getSourceFile = function(fileName, languageVersion) {
|
||
|
const ce = cacheEntry(fileName);
|
||
|
if (!ce.sf) {
|
||
|
ce.sf = originalGetSourceFile.call(this, fileName, languageVersion);
|
||
|
}
|
||
|
return ce.sf;
|
||
|
};
|
||
|
const originalReadFile = cachedCompilerHost.readFile;
|
||
|
cachedCompilerHost.readFile = function(fileName) {
|
||
|
const ce = cacheEntry(fileName);
|
||
|
if (ce.content == null) {
|
||
|
ce.content = originalReadFile.call(this, fileName);
|
||
|
}
|
||
|
return ce.content;
|
||
|
};
|
||
|
cachedCompilerHost.getModifiedResourceFiles = function() {
|
||
|
if (timerHandleForRecompilation === void 0) {
|
||
|
return void 0;
|
||
|
}
|
||
|
return timerHandleForRecompilation.modifiedResourceFiles;
|
||
|
};
|
||
|
}
|
||
|
ignoreFilesForWatch.clear();
|
||
|
const oldProgram = cachedProgram;
|
||
|
cachedProgram = void 0;
|
||
|
const compileResult = performCompilation({
|
||
|
rootNames: cachedOptions.rootNames,
|
||
|
options: cachedOptions.options,
|
||
|
host: cachedCompilerHost,
|
||
|
oldProgram,
|
||
|
emitCallback: host.createEmitCallback(cachedOptions.options)
|
||
|
});
|
||
|
if (compileResult.diagnostics.length) {
|
||
|
host.reportDiagnostics(compileResult.diagnostics);
|
||
|
}
|
||
|
const endTime = Date.now();
|
||
|
if (cachedOptions.options.diagnostics) {
|
||
|
const totalTime = (endTime - startTime) / 1e3;
|
||
|
host.reportDiagnostics([totalCompilationTimeDiagnostic(endTime - startTime)]);
|
||
|
}
|
||
|
const exitCode = exitCodeFromResult(compileResult.diagnostics);
|
||
|
if (exitCode == 0) {
|
||
|
cachedProgram = compileResult.program;
|
||
|
host.reportDiagnostics([createMessageDiagnostic("Compilation complete. Watching for file changes.")]);
|
||
|
} else {
|
||
|
host.reportDiagnostics([createMessageDiagnostic("Compilation failed. Watching for file changes.")]);
|
||
|
}
|
||
|
return compileResult.diagnostics;
|
||
|
}
|
||
|
function resetOptions() {
|
||
|
cachedProgram = void 0;
|
||
|
cachedCompilerHost = void 0;
|
||
|
cachedOptions = void 0;
|
||
|
}
|
||
|
function watchedFileChanged(event, fileName) {
|
||
|
const normalizedPath = path.normalize(fileName);
|
||
|
if (cachedOptions && event === FileChangeEvent.Change && normalizedPath === path.normalize(cachedOptions.project)) {
|
||
|
resetOptions();
|
||
|
} else if (event === FileChangeEvent.CreateDelete || event === FileChangeEvent.CreateDeleteDir) {
|
||
|
cachedOptions = void 0;
|
||
|
}
|
||
|
if (event === FileChangeEvent.CreateDeleteDir) {
|
||
|
fileCache.clear();
|
||
|
} else {
|
||
|
fileCache.delete(normalizedPath);
|
||
|
}
|
||
|
if (!ignoreFilesForWatch.has(normalizedPath)) {
|
||
|
startTimerForRecompilation(normalizedPath);
|
||
|
}
|
||
|
}
|
||
|
function startTimerForRecompilation(changedPath) {
|
||
|
if (timerHandleForRecompilation) {
|
||
|
host.clearTimeout(timerHandleForRecompilation.timerHandle);
|
||
|
} else {
|
||
|
timerHandleForRecompilation = {
|
||
|
modifiedResourceFiles: /* @__PURE__ */ new Set(),
|
||
|
timerHandle: void 0
|
||
|
};
|
||
|
}
|
||
|
timerHandleForRecompilation.timerHandle = host.setTimeout(recompile, 250);
|
||
|
timerHandleForRecompilation.modifiedResourceFiles.add(changedPath);
|
||
|
}
|
||
|
function recompile() {
|
||
|
host.reportDiagnostics([createMessageDiagnostic("File change detected. Starting incremental compilation.")]);
|
||
|
doCompilation();
|
||
|
timerHandleForRecompilation = void 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// bazel-out/k8-fastbuild/bin/packages/compiler-cli/src/main.mjs
|
||
|
function main(args, consoleError = console.error, config, customTransformers, programReuse, modifiedResourceFiles) {
|
||
|
let { project, rootNames, options, errors: configErrors, watch: watch2, emitFlags } = config || readNgcCommandLineAndConfiguration(args);
|
||
|
if (configErrors.length) {
|
||
|
return reportErrorsAndExit(configErrors, void 0, consoleError);
|
||
|
}
|
||
|
if (watch2) {
|
||
|
const result = watchMode(project, options, consoleError);
|
||
|
return reportErrorsAndExit(result.firstCompileResult, options, consoleError);
|
||
|
}
|
||
|
let oldProgram;
|
||
|
if (programReuse !== void 0) {
|
||
|
oldProgram = programReuse.program;
|
||
|
}
|
||
|
const { diagnostics: compileDiags, program } = performCompilation({ rootNames, options, emitFlags, oldProgram, customTransformers, modifiedResourceFiles });
|
||
|
if (programReuse !== void 0) {
|
||
|
programReuse.program = program;
|
||
|
}
|
||
|
return reportErrorsAndExit(compileDiags, options, consoleError);
|
||
|
}
|
||
|
function readNgcCommandLineAndConfiguration(args) {
|
||
|
const options = {};
|
||
|
const parsedArgs = yargs(args).parserConfiguration({ "strip-aliased": true }).option("i18nFile", { type: "string" }).option("i18nFormat", { type: "string" }).option("locale", { type: "string" }).option("missingTranslation", { type: "string", choices: ["error", "warning", "ignore"] }).option("outFile", { type: "string" }).option("watch", { type: "boolean", alias: ["w"] }).parseSync();
|
||
|
if (parsedArgs.i18nFile)
|
||
|
options.i18nInFile = parsedArgs.i18nFile;
|
||
|
if (parsedArgs.i18nFormat)
|
||
|
options.i18nInFormat = parsedArgs.i18nFormat;
|
||
|
if (parsedArgs.locale)
|
||
|
options.i18nInLocale = parsedArgs.locale;
|
||
|
if (parsedArgs.missingTranslation)
|
||
|
options.i18nInMissingTranslations = parsedArgs.missingTranslation;
|
||
|
const config = readCommandLineAndConfiguration(args, options, ["i18nFile", "i18nFormat", "locale", "missingTranslation", "watch"]);
|
||
|
return { ...config, watch: parsedArgs.watch };
|
||
|
}
|
||
|
function readCommandLineAndConfiguration(args, existingOptions = {}, ngCmdLineOptions = []) {
|
||
|
let cmdConfig = ts2.parseCommandLine(args);
|
||
|
const project = cmdConfig.options.project || ".";
|
||
|
const cmdErrors = cmdConfig.errors.filter((e) => {
|
||
|
if (typeof e.messageText === "string") {
|
||
|
const msg = e.messageText;
|
||
|
return !ngCmdLineOptions.some((o) => msg.indexOf(o) >= 0);
|
||
|
}
|
||
|
return true;
|
||
|
});
|
||
|
if (cmdErrors.length) {
|
||
|
return {
|
||
|
project,
|
||
|
rootNames: [],
|
||
|
options: cmdConfig.options,
|
||
|
errors: cmdErrors,
|
||
|
emitFlags: EmitFlags.Default
|
||
|
};
|
||
|
}
|
||
|
const config = readConfiguration(project, cmdConfig.options);
|
||
|
const options = { ...config.options, ...existingOptions };
|
||
|
if (options.locale) {
|
||
|
options.i18nInLocale = options.locale;
|
||
|
}
|
||
|
return {
|
||
|
project,
|
||
|
rootNames: config.rootNames,
|
||
|
options,
|
||
|
errors: config.errors,
|
||
|
emitFlags: config.emitFlags
|
||
|
};
|
||
|
}
|
||
|
function getFormatDiagnosticsHost(options) {
|
||
|
const basePath = options ? options.basePath : void 0;
|
||
|
return {
|
||
|
getCurrentDirectory: () => basePath || ts2.sys.getCurrentDirectory(),
|
||
|
getCanonicalFileName: (fileName) => fileName.replace(/\\/g, "/"),
|
||
|
getNewLine: () => {
|
||
|
if (options && options.newLine !== void 0) {
|
||
|
return options.newLine === ts2.NewLineKind.LineFeed ? "\n" : "\r\n";
|
||
|
}
|
||
|
return ts2.sys.newLine;
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
function reportErrorsAndExit(allDiagnostics, options, consoleError = console.error) {
|
||
|
const errorsAndWarnings = allDiagnostics.filter((d) => d.category !== ts2.DiagnosticCategory.Message);
|
||
|
printDiagnostics(errorsAndWarnings, options, consoleError);
|
||
|
return exitCodeFromResult(allDiagnostics);
|
||
|
}
|
||
|
function watchMode(project, options, consoleError) {
|
||
|
return performWatchCompilation(createPerformWatchHost(project, (diagnostics) => {
|
||
|
printDiagnostics(diagnostics, options, consoleError);
|
||
|
}, options, void 0));
|
||
|
}
|
||
|
function printDiagnostics(diagnostics, options, consoleError) {
|
||
|
if (diagnostics.length === 0) {
|
||
|
return;
|
||
|
}
|
||
|
const formatHost = getFormatDiagnosticsHost(options);
|
||
|
consoleError(formatDiagnostics(diagnostics, formatHost));
|
||
|
}
|
||
|
|
||
|
export {
|
||
|
main,
|
||
|
readCommandLineAndConfiguration
|
||
|
};
|
||
|
/**
|
||
|
* @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
|
||
|
*/
|
||
|
//# sourceMappingURL=chunk-H3PIRNUD.js.map
|