UNPKG

@backtrace/javascript-cli

Version:
132 lines 7.57 kB
"use strict"; 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