@backtrace/javascript-cli
Version:
Backtrace CLI for working with Javascript files.
132 lines • 7.57 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.processSource = exports.processSources = exports.processCmd = void 0;
const sourcemap_tools_1 = require("@backtrace/sourcemap-tools");
const path_1 = __importDefault(require("path"));
const Command_1 = require("../commands/Command");
const common_1 = require("../helpers/common");
const errorBehavior_1 = require("../helpers/errorBehavior");
const find_1 = require("../helpers/find");
const logs_1 = require("../helpers/logs");
const normalizePaths_1 = require("../helpers/normalizePaths");
const loadOptions_1 = require("../options/loadOptions");
exports.processCmd = new Command_1.Command({
name: 'process',
description: 'Processing source and sourcemap files',
})
.option({
name: 'path',
description: 'Path to source files or directories containing sourcemaps to process.',
defaultOption: true,
multiple: true,
alias: 'p',
})
.option({
name: 'include',
description: 'Includes specified paths.',
type: String,
multiple: true,
alias: 'i',
})
.option({
name: 'exclude',
description: 'Excludes specified paths.',
type: String,
multiple: true,
alias: 'x',
})
.option({
name: 'dry-run',
alias: 'n',
type: Boolean,
description: 'Does not modify the files at the end.',
})
.option({
name: 'force',
alias: 'f',
type: Boolean,
description: 'Processes files even if already processed.',
})
.option({
name: 'asset-error-behavior',
alias: 'e',
type: String,
description: `What to do when an asset fails. Can be one of: ${Object.keys(errorBehavior_1.ErrorBehaviors).join(', ')}.`,
})
.option({
name: 'pass-with-no-files',
type: Boolean,
description: 'Exits with zero exit code if no files for processing are found.',
})
.execute(processSources);
/**
* Processes source files found in path(s).
*/
async function processSources({ opts, logger, getHelpMessage }) {
const sourceProcessor = new sourcemap_tools_1.SourceProcessor(new sourcemap_tools_1.DebugIdGenerator());
const configPath = opts.config ?? (await (0, loadOptions_1.findConfig)());
const configResult = await (0, loadOptions_1.loadOptionsForCommand)(configPath)('process');
if (configResult.isErr()) {
return configResult;
}
const config = configResult.data;
opts = {
...config,
...opts,
path: opts.path ??
(config.path && configPath ? (0, normalizePaths_1.relativePaths)(config.path, path_1.default.dirname(configPath)) : process.cwd()),
};
logger.trace(`resolved options: \n${JSON.stringify(opts, null, ' ')}`);
const searchPaths = (0, normalizePaths_1.normalizePaths)(opts.path, process.cwd());
if (!searchPaths) {
logger.info(getHelpMessage());
return (0, sourcemap_tools_1.Err)('path must be specified');
}
const logDebug = (0, sourcemap_tools_1.log)(logger, 'debug');
const logTrace = (0, sourcemap_tools_1.log)(logger, 'trace');
const logDebugAssets = (0, logs_1.logAssets)(logger, 'debug');
const logTraceAssets = (0, logs_1.logAssets)(logger, 'trace');
const assetErrorBehaviorResult = (0, errorBehavior_1.getErrorBehavior)(opts['asset-error-behavior'] ?? 'exit');
if (assetErrorBehaviorResult.isErr()) {
logger.info(getHelpMessage());
return assetErrorBehaviorResult;
}
const assetErrorBehavior = assetErrorBehaviorResult.data;
const handleFailedAsset = (0, errorBehavior_1.handleError)(assetErrorBehavior);
const logAssetBehaviorError = (asset) => (err, level) => (0, logs_1.createAssetLogger)(logger, level)(err)(asset);
const processAssetCommand = (asset) => (0, sourcemap_tools_1.pipe)(asset, logTraceAssets('reading source and sourcemap'), (0, common_1.readSourceAndSourceMap)(sourceProcessor), sourcemap_tools_1.R.map(logDebugAssets('read source and sourcemap')), sourcemap_tools_1.R.map(logTraceAssets('processing source and sourcemap')), sourcemap_tools_1.R.map(processSource(opts.force ?? false)), sourcemap_tools_1.R.map(logDebugAssets('processed source and sourcemap')), sourcemap_tools_1.R.map(opts['dry-run']
? sourcemap_tools_1.Ok
: (0, sourcemap_tools_1.flow)(logTraceAssets('writing source and sourcemap'), common_1.writeSourceAndSourceMap, sourcemap_tools_1.R.map(logDebugAssets('wrote source and sourcemap')))), sourcemap_tools_1.R.mapErr((err) => `${asset.source.name}: ${err}`), handleFailedAsset(logAssetBehaviorError(asset.source)));
const includePaths = (0, normalizePaths_1.normalizePaths)(opts.include);
const excludePaths = (0, normalizePaths_1.normalizePaths)(opts.exclude);
const { isIncluded, isExcluded } = await (0, find_1.buildIncludeExclude)(includePaths, excludePaths, logTrace);
return (0, sourcemap_tools_1.pipe)(searchPaths, find_1.findTuples, sourcemap_tools_1.R.map((0, sourcemap_tools_1.flow)(logDebug((r) => `found ${r.length} files`), (0, sourcemap_tools_1.map)(logTrace((result) => `found file: ${result.file1.path}`)), isIncluded ? (0, sourcemap_tools_1.filterAsync)((x) => isIncluded(x.file1)) : sourcemap_tools_1.pass, isExcluded ? (0, sourcemap_tools_1.filterAsync)((0, sourcemap_tools_1.flow)((x) => isExcluded(x.file1), sourcemap_tools_1.not)) : sourcemap_tools_1.pass, (0, sourcemap_tools_1.filter)((t) => t.file1.direct || (0, sourcemap_tools_1.matchSourceExtension)(t.file1.path)), logDebug((r) => `found ${r.length} files for processing`), (0, sourcemap_tools_1.map)(logTrace((path) => `file for processing: ${path.file1.path}`)), (0, sourcemap_tools_1.map)(common_1.toSourceAndSourceMapPaths), opts['pass-with-no-files'] ? sourcemap_tools_1.Ok : (0, sourcemap_tools_1.failIfEmpty)('no source files found'), sourcemap_tools_1.R.map((0, sourcemap_tools_1.flow)((0, sourcemap_tools_1.mapAsync)(processAssetCommand), sourcemap_tools_1.R.flatMap)), sourcemap_tools_1.R.map(errorBehavior_1.filterBehaviorSkippedElements), sourcemap_tools_1.R.map((0, sourcemap_tools_1.map)(output(logger))))));
}
exports.processSources = processSources;
function processSource(force) {
const sourceProcessor = new sourcemap_tools_1.SourceProcessor(new sourcemap_tools_1.DebugIdGenerator());
const getSourceDebugId = (sourceAndSourceMap) => sourceProcessor.getSourceDebugId(sourceAndSourceMap.source.content);
const getSourceMapDebugId = (sourceAndSourceMap) => sourceProcessor.getSourceMapDebugId(sourceAndSourceMap.sourceMap.content);
const getDebugIds = (sourceAndSourceMap) => ({
sourceDebugId: getSourceDebugId(sourceAndSourceMap),
sourceMapDebugId: getSourceMapDebugId(sourceAndSourceMap),
});
return async function processSource(asset) {
return (0, sourcemap_tools_1.pipe)(asset, getDebugIds, ({ sourceDebugId, sourceMapDebugId }) => (0, sourcemap_tools_1.pipe)(asset, (asset) => sourceProcessor.processSourceAndSourceMap(asset.source.content, asset.sourceMap.content, sourceDebugId ?? sourceMapDebugId, force), (result) => ({
source: { ...asset.source, content: result.source },
sourceMap: { ...asset.sourceMap, content: result.sourceMap },
debugId: result.debugId,
})));
};
}
exports.processSource = processSource;
function output(logger) {
return function output(result) {
logger.output(result.source.path);
return result;
};
}
//# sourceMappingURL=process.js.map
;