UNPKG

astx

Version:

super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring

138 lines (122 loc) 13.6 kB
import { clearCache } from 'babel-parse-wild-code' import { range } from 'lodash-es' import { cpus } from 'os' import astxGlob from './astxGlob.mjs' import AstxWorker from './AstxWorker.mjs' import AsyncPool from './AsyncPool.mjs' import { astxCosmiconfig } from './astxCosmiconfig.mjs' import PushPullIterable from '../util/PushPullIterable.mjs' class AbortedError extends Error {} export default class AstxWorkerPool { pool constructor({ capacity = cpus().length } = {}) { this.pool = new AsyncPool(range(capacity).map(() => new AstxWorker())) } async end() { await Promise.all(this.pool.elements.map((e) => e.end())) } runTransformOnFile(options) { return this.pool.run((worker) => worker.runTransformOnFile(options)) } runTransform({ gitignore, transform, transformFile, paths, exclude, fs, cwd = process.cwd(), config, signal, queueCapacity, }) { clearCache() astxCosmiconfig.clearSearchCache() const events = new PushPullIterable(queueCapacity || 1000) async function emit(event) { if ( !(await events.push(event)) || (signal !== null && signal !== void 0 && signal.aborted) ) { throw new AbortedError() } } let completed = 0, total = 0, globDone = false const progress = () => ({ type: 'progress', completed, total, globDone, }) async function checkDone() { if (globDone && completed === total) { var _transform$finish await (transform === null || transform === void 0 ? void 0 : (_transform$finish = transform.finish) === null || _transform$finish === void 0 ? void 0 : _transform$finish.call(transform)) events.return() } } ;(async () => { try { await emit(progress()) for (const include of paths !== null && paths !== void 0 && paths.length ? paths : [cwd]) { for await (const file of astxGlob({ include, exclude, cwd, gitignore, fs, })) { if (signal !== null && signal !== void 0 && signal.aborted) return total++ await emit(progress()) this.runTransformOnFile({ file, source: fs ? await fs.readFile(file, 'utf8') : undefined, transform, transformFile, config, signal, }) .then(async (result) => { if (signal !== null && signal !== void 0 && signal.aborted) return completed++ await emit({ type: 'result', result, }) if (signal !== null && signal !== void 0 && signal.aborted) return await emit(progress()) if (signal !== null && signal !== void 0 && signal.aborted) return await checkDone() }) .catch((error) => { if (error instanceof AbortedError) return events.throw(error) }) } } if (signal !== null && signal !== void 0 && signal.aborted) return globDone = true await emit(progress()) if (signal !== null && signal !== void 0 && signal.aborted) return await checkDone() } catch (error) { if (error instanceof AbortedError) return events.throw(error) } })() return events } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjbGVhckNhY2hlIiwicmFuZ2UiLCJjcHVzIiwiYXN0eEdsb2IiLCJBc3R4V29ya2VyIiwiQXN5bmNQb29sIiwiYXN0eENvc21pY29uZmlnIiwiUHVzaFB1bGxJdGVyYWJsZSIsIkFib3J0ZWRFcnJvciIsIkVycm9yIiwiQXN0eFdvcmtlclBvb2wiLCJwb29sIiwiY29uc3RydWN0b3IiLCJjYXBhY2l0eSIsImxlbmd0aCIsIm1hcCIsImVuZCIsIlByb21pc2UiLCJhbGwiLCJlbGVtZW50cyIsImUiLCJydW5UcmFuc2Zvcm1PbkZpbGUiLCJvcHRpb25zIiwicnVuIiwid29ya2VyIiwicnVuVHJhbnNmb3JtIiwiZ2l0aWdub3JlIiwidHJhbnNmb3JtIiwidHJhbnNmb3JtRmlsZSIsInBhdGhzIiwiZXhjbHVkZSIsImZzIiwiY3dkIiwicHJvY2VzcyIsImNvbmZpZyIsInNpZ25hbCIsInF1ZXVlQ2FwYWNpdHkiLCJjbGVhclNlYXJjaENhY2hlIiwiZXZlbnRzIiwiZW1pdCIsImV2ZW50IiwicHVzaCIsImFib3J0ZWQiLCJjb21wbGV0ZWQiLCJ0b3RhbCIsImdsb2JEb25lIiwicHJvZ3Jlc3MiLCJ0eXBlIiwiY2hlY2tEb25lIiwiZmluaXNoIiwicmV0dXJuIiwiaW5jbHVkZSIsImZpbGUiLCJzb3VyY2UiLCJyZWFkRmlsZSIsInVuZGVmaW5lZCIsInRoZW4iLCJyZXN1bHQiLCJjYXRjaCIsImVycm9yIiwidGhyb3ciXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm9kZS9Bc3R4V29ya2VyUG9vbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjbGVhckNhY2hlIH0gZnJvbSAnYmFiZWwtcGFyc2Utd2lsZC1jb2RlJ1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBjcHVzIH0gZnJvbSAnb3MnXG5pbXBvcnQgeyBJcGNUcmFuc2Zvcm1SZXN1bHQgfSBmcm9tICcuL2lwYydcbmltcG9ydCBhc3R4R2xvYiBmcm9tICcuL2FzdHhHbG9iJ1xuaW1wb3J0IEFzdHhXb3JrZXIgZnJvbSAnLi9Bc3R4V29ya2VyJ1xuaW1wb3J0IEFzeW5jUG9vbCBmcm9tICcuL0FzeW5jUG9vbCdcbmltcG9ydCB7IGFzdHhDb3NtaWNvbmZpZyB9IGZyb20gJy4vYXN0eENvc21pY29uZmlnJ1xuaW1wb3J0IHsgUnVuVHJhbnNmb3JtT3B0aW9ucywgUHJvZ3Jlc3MgfSBmcm9tICcuL3J1blRyYW5zZm9ybSdcbmltcG9ydCB7IFJ1blRyYW5zZm9ybU9uRmlsZU9wdGlvbnMgfSBmcm9tICcuL3J1blRyYW5zZm9ybU9uRmlsZSdcbmltcG9ydCBQdXNoUHVsbEl0ZXJhYmxlIGZyb20gJy4uL3V0aWwvUHVzaFB1bGxJdGVyYWJsZSdcblxuY2xhc3MgQWJvcnRlZEVycm9yIGV4dGVuZHMgRXJyb3Ige31cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXN0eFdvcmtlclBvb2wge1xuICBwb29sOiBBc3luY1Bvb2w8QXN0eFdvcmtlcj5cblxuICBjb25zdHJ1Y3Rvcih7IGNhcGFjaXR5ID0gY3B1cygpLmxlbmd0aCB9OiB7IGNhcGFjaXR5PzogbnVtYmVyIH0gPSB7fSkge1xuICAgIHRoaXMucG9vbCA9IG5ldyBBc3luY1Bvb2wocmFuZ2UoY2FwYWNpdHkpLm1hcCgoKSA9PiBuZXcgQXN0eFdvcmtlcigpKSlcbiAgfVxuXG4gIGFzeW5jIGVuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLnBvb2wuZWxlbWVudHMubWFwKChlKSA9PiBlLmVuZCgpKSlcbiAgfVxuXG4gIHJ1blRyYW5zZm9ybU9uRmlsZShcbiAgICBvcHRpb25zOiBSdW5UcmFuc2Zvcm1PbkZpbGVPcHRpb25zXG4gICk6IFByb21pc2U8SXBjVHJhbnNmb3JtUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMucG9vbC5ydW4oKHdvcmtlcikgPT4gd29ya2VyLnJ1blRyYW5zZm9ybU9uRmlsZShvcHRpb25zKSlcbiAgfVxuXG4gIHJ1blRyYW5zZm9ybSh7XG4gICAgZ2l0aWdub3JlLFxuICAgIHRyYW5zZm9ybSxcbiAgICB0cmFuc2Zvcm1GaWxlLFxuICAgIHBhdGhzLFxuICAgIGV4Y2x1ZGUsXG4gICAgZnMsXG4gICAgY3dkID0gcHJvY2Vzcy5jd2QoKSxcbiAgICBjb25maWcsXG4gICAgc2lnbmFsLFxuICAgIHF1ZXVlQ2FwYWNpdHksXG4gIH06IFJ1blRyYW5zZm9ybU9wdGlvbnMgJiB7XG4gICAgcXVldWVDYXBhY2l0eT86IG51bWJlclxuICB9KTogQXN5bmNJdGVyYWJsZTx7IHR5cGU6ICdyZXN1bHQnOyByZXN1bHQ6IElwY1RyYW5zZm9ybVJlc3VsdCB9IHwgUHJvZ3Jlc3M+IHtcbiAgICBjbGVhckNhY2hlKClcbiAgICBhc3R4Q29zbWljb25maWcuY2xlYXJTZWFyY2hDYWNoZSgpXG5cbiAgICBjb25zdCBldmVudHMgPSBuZXcgUHVzaFB1bGxJdGVyYWJsZTxcbiAgICAgIHsgdHlwZTogJ3Jlc3VsdCc7IHJlc3VsdDogSXBjVHJhbnNmb3JtUmVzdWx0IH0gfCBQcm9ncmVzc1xuICAgID4ocXVldWVDYXBhY2l0eSB8fCAxMDAwKVxuXG4gICAgYXN5bmMgZnVuY3Rpb24gZW1pdChcbiAgICAgIGV2ZW50OiB7IHR5cGU6ICdyZXN1bHQnOyByZXN1bHQ6IElwY1RyYW5zZm9ybVJlc3VsdCB9IHwgUHJvZ3Jlc3NcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGlmICghKGF3YWl0IGV2ZW50cy5wdXNoKGV2ZW50KSkgfHwgc2lnbmFsPy5hYm9ydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBBYm9ydGVkRXJyb3IoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBjb21wbGV0ZWQgPSAwLFxuICAgICAgdG90YWwgPSAwLFxuICAgICAgZ2xvYkRvbmUgPSBmYWxzZVxuXG4gICAgY29uc3QgcHJvZ3Jlc3MgPSAoKTogUHJvZ3Jlc3MgPT4gKHtcbiAgICAgIHR5cGU6ICdwcm9ncmVzcycsXG4gICAgICBjb21wbGV0ZWQsXG4gICAgICB0b3RhbCxcbiAgICAgIGdsb2JEb25lLFxuICAgIH0pXG5cbiAgICBhc3luYyBmdW5jdGlvbiBjaGVja0RvbmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBpZiAoZ2xvYkRvbmUgJiYgY29tcGxldGVkID09PSB0b3RhbCkge1xuICAgICAgICBhd2FpdCB0cmFuc2Zvcm0/LmZpbmlzaD8uKClcbiAgICAgICAgZXZlbnRzLnJldHVybigpXG4gICAgICB9XG4gICAgfVxuXG4gICAgOyhhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbWl0KHByb2dyZXNzKCkpXG4gICAgICAgIGZvciAoY29uc3QgaW5jbHVkZSBvZiBwYXRocz8ubGVuZ3RoID8gcGF0aHMgOiBbY3dkXSkge1xuICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgZmlsZSBvZiBhc3R4R2xvYih7XG4gICAgICAgICAgICBpbmNsdWRlLFxuICAgICAgICAgICAgZXhjbHVkZSxcbiAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICAgIGdpdGlnbm9yZSxcbiAgICAgICAgICAgIGZzLFxuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSByZXR1cm5cbiAgICAgICAgICAgIHRvdGFsKytcbiAgICAgICAgICAgIGF3YWl0IGVtaXQocHJvZ3Jlc3MoKSlcbiAgICAgICAgICAgIHRoaXMucnVuVHJhbnNmb3JtT25GaWxlKHtcbiAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgc291cmNlOiBmcyA/IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGUsICd1dGY4JykgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtRmlsZSxcbiAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICBzaWduYWwsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgcmV0dXJuXG4gICAgICAgICAgICAgICAgY29tcGxldGVkKytcbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0KHsgdHlwZTogJ3Jlc3VsdCcsIHJlc3VsdCB9KVxuICAgICAgICAgICAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHJldHVyblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXQocHJvZ3Jlc3MoKSlcbiAgICAgICAgICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSByZXR1cm5cbiAgICAgICAgICAgICAgICBhd2FpdCBjaGVja0RvbmUoKVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWJvcnRlZEVycm9yKSByZXR1cm5cbiAgICAgICAgICAgICAgICBldmVudHMudGhyb3coZXJyb3IpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHJldHVyblxuICAgICAgICBnbG9iRG9uZSA9IHRydWVcbiAgICAgICAgYXdhaXQgZW1pdChwcm9ncmVzcygpKVxuICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSByZXR1cm5cbiAgICAgICAgYXdhaXQgY2hlY2tEb25lKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFib3J0ZWRFcnJvcikgcmV0dXJuXG4gICAgICAgIGV2ZW50cy50aHJvdyhlcnJvcilcbiAgICAgIH1cbiAgICB9KSgpXG5cbiAgICByZXR1cm4gZXZlbnRzXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVCxRQUEyQix1QkFBM0I7QUFDQSxTQUFTQyxLQUFULFFBQXNCLFFBQXRCO0FBQ0EsU0FBU0MsSUFBVCxRQUFxQixJQUFyQjs7QUFFQSxPQUFPQyxRQUFQLE1BQXFC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