astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
144 lines (126 loc) • 12.2 kB
JavaScript
import { Worker } from 'worker_threads'
import emitted from 'p-event'
export default class AstxWorker {
worker
_seq = 0
_running = false
ended = false
constructor() {
this.startWorker()
}
async end() {
if (this.ended) return
this.ended = true
const { worker } = this
if (worker) {
await worker.terminate()
this.worker = undefined
}
}
startWorker() {
if (this.ended) return
const worker = new Worker(new URL('./AstxWorkerEntry.mjs', import.meta.url))
this.worker = worker
worker.once('exit', async () => {
this.worker = undefined
if (this.ended) return
await new Promise((r) => setTimeout(r, 1000))
this.startWorker()
})
}
get running() {
return this.running
}
async getWorker() {
while (!this.worker) {
await new Promise((r) => setTimeout(r, 1000))
}
if (this.worker) return this.worker
throw new Error('unexpected')
}
async runTransformOnFile({ file, transform, transformFile, config, signal }) {
const worker = await this.getWorker()
if (this._running) {
throw new Error(`a transform is currently running`)
}
const seq = this._seq++
try {
var _on, _ref
this._running = true
signal === null || signal === void 0
? void 0
: (_on = (_ref = signal).on) === null || _on === void 0
? void 0
: _on.call(_ref, 'abort', () => {
worker.postMessage({
type: 'abort',
seq,
})
})
const promise = Promise.race([
emitted(worker, 'message', {
filter: (event) => event.seq === seq,
rejectionEvents: ['error', 'exit'],
}).catch((reason) =>
typeof reason === 'number'
? `worker exited with code ${reason}`
: reason
),
...(signal
? [
emitted(signal, '', {
rejectionEvents: ['abort'],
}),
]
: []),
])
promise.catch(() => {
// ignore
})
worker.postMessage({
type: 'runTransformOnFile',
seq,
file,
transform: transformFile ? undefined : transform,
transformFile,
...(config && {
config,
}),
})
const message = await promise
switch (message.type) {
case 'error': {
const error = new Error(message.error.message)
error.stack = message.error.stack
throw error
}
case 'transformResult': {
var _result$reports
const { result } = message
if (
(_result$reports = result.reports) !== null &&
_result$reports !== void 0 &&
_result$reports.length &&
transform !== null &&
transform !== void 0 &&
transform.onReport
) {
for (const report of result.reports) {
transform.onReport({
file,
report,
})
}
}
return result
}
default: {
throw new Error(`unknown message: ${JSON.stringify(message)}`)
}
}
} finally {
this._running = false
}
}
} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXb3JrZXIiLCJlbWl0dGVkIiwiQXN0eFdvcmtlciIsIndvcmtlciIsIl9zZXEiLCJfcnVubmluZyIsImVuZGVkIiwiY29uc3RydWN0b3IiLCJzdGFydFdvcmtlciIsImVuZCIsInRlcm1pbmF0ZSIsInVuZGVmaW5lZCIsInJlcXVpcmUiLCJyZXNvbHZlIiwib25jZSIsIlByb21pc2UiLCJyIiwic2V0VGltZW91dCIsInJ1bm5pbmciLCJnZXRXb3JrZXIiLCJFcnJvciIsInJ1blRyYW5zZm9ybU9uRmlsZSIsImZpbGUiLCJ0cmFuc2Zvcm0iLCJ0cmFuc2Zvcm1GaWxlIiwiY29uZmlnIiwic2lnbmFsIiwic2VxIiwib24iLCJwb3N0TWVzc2FnZSIsInR5cGUiLCJwcm9taXNlIiwicmFjZSIsImZpbHRlciIsImV2ZW50IiwicmVqZWN0aW9uRXZlbnRzIiwiY2F0Y2giLCJyZWFzb24iLCJtZXNzYWdlIiwiZXJyb3IiLCJzdGFjayIsInJlc3VsdCIsInJlcG9ydHMiLCJsZW5ndGgiLCJvblJlcG9ydCIsInJlcG9ydCIsIkpTT04iLCJzdHJpbmdpZnkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbm9kZS9Bc3R4V29ya2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0IHsgV29ya2VyIH0gZnJvbSAnd29ya2VyX3RocmVhZHMnXG5pbXBvcnQgeyBSdW5UcmFuc2Zvcm1PbkZpbGVPcHRpb25zIH0gZnJvbSAnLi9ydW5UcmFuc2Zvcm1PbkZpbGUnXG5pbXBvcnQgZW1pdHRlZCBmcm9tICdwLWV2ZW50J1xuaW1wb3J0IHsgSXBjVHJhbnNmb3JtUmVzdWx0IH0gZnJvbSAnLi9pcGMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFzdHhXb3JrZXIge1xuICBwcml2YXRlIHdvcmtlcjogV29ya2VyIHwgdW5kZWZpbmVkXG4gIHByaXZhdGUgX3NlcSA9IDBcbiAgcHJpdmF0ZSBfcnVubmluZyA9IGZhbHNlXG4gIHByaXZhdGUgZW5kZWQgPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RhcnRXb3JrZXIoKVxuICB9XG5cbiAgYXN5bmMgZW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmVuZGVkKSByZXR1cm5cbiAgICB0aGlzLmVuZGVkID0gdHJ1ZVxuICAgIGNvbnN0IHsgd29ya2VyIH0gPSB0aGlzXG4gICAgaWYgKHdvcmtlcikge1xuICAgICAgYXdhaXQgd29ya2VyLnRlcm1pbmF0ZSgpXG4gICAgICB0aGlzLndvcmtlciA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRXb3JrZXIoKSB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHJldHVyblxuICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIocmVxdWlyZS5yZXNvbHZlKCcuL0FzdHhXb3JrZXJFbnRyeS5iYWJlbC5qcycpKVxuICAgIHRoaXMud29ya2VyID0gd29ya2VyXG4gICAgd29ya2VyLm9uY2UoJ2V4aXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLndvcmtlciA9IHVuZGVmaW5lZFxuICAgICAgaWYgKHRoaXMuZW5kZWQpIHJldHVyblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTAwMCkpXG4gICAgICB0aGlzLnN0YXJ0V29ya2VyKClcbiAgICB9KVxuICB9XG5cbiAgZ2V0IHJ1bm5pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucnVubmluZ1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRXb3JrZXIoKTogUHJvbWlzZTxXb3JrZXI+IHtcbiAgICB3aGlsZSAoIXRoaXMud29ya2VyKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMDAwKSlcbiAgICB9XG4gICAgaWYgKHRoaXMud29ya2VyKSByZXR1cm4gdGhpcy53b3JrZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQnKVxuICB9XG5cbiAgYXN5bmMgcnVuVHJhbnNmb3JtT25GaWxlKHtcbiAgICBmaWxlLFxuICAgIHRyYW5zZm9ybSxcbiAgICB0cmFuc2Zvcm1GaWxlLFxuICAgIGNvbmZpZyxcbiAgICBzaWduYWwsXG4gIH06IFJ1blRyYW5zZm9ybU9uRmlsZU9wdGlvbnMpOiBQcm9taXNlPElwY1RyYW5zZm9ybVJlc3VsdD4ge1xuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IHRoaXMuZ2V0V29ya2VyKClcblxuICAgIGlmICh0aGlzLl9ydW5uaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGEgdHJhbnNmb3JtIGlzIGN1cnJlbnRseSBydW5uaW5nYClcbiAgICB9XG4gICAgY29uc3Qgc2VxID0gdGhpcy5fc2VxKytcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9ydW5uaW5nID0gdHJ1ZVxuICAgICAgOyhzaWduYWwgYXMgYW55KT8ub24/LignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7IHR5cGU6ICdhYm9ydCcsIHNlcSB9KVxuICAgICAgfSlcbiAgICAgIGNvbnN0IHByb21pc2UgPSBQcm9taXNlLnJhY2UoW1xuICAgICAgICBlbWl0dGVkKHdvcmtlciwgJ21lc3NhZ2UnLCB7XG4gICAgICAgICAgZmlsdGVyOiAoZXZlbnQ6IGFueSkgPT4gZXZlbnQuc2VxID09PSBzZXEsXG4gICAgICAgICAgcmVqZWN0aW9uRXZlbnRzOiBbJ2Vycm9yJywgJ2V4aXQnXSxcbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT5cbiAgICAgICAgICB0eXBlb2YgcmVhc29uID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyBgd29ya2VyIGV4aXRlZCB3aXRoIGNvZGUgJHtyZWFzb259YFxuICAgICAgICAgICAgOiByZWFzb25cbiAgICAgICAgKSxcbiAgICAgICAgLi4uKHNpZ25hbFxuICAgICAgICAgID8gW2VtaXR0ZWQoc2lnbmFsIGFzIGFueSwgJycsIHsgcmVqZWN0aW9uRXZlbnRzOiBbJ2Fib3J0J10gfSldXG4gICAgICAgICAgOiBbXSksXG4gICAgICBdKVxuICAgICAgcHJvbWlzZS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfSlcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6ICdydW5UcmFuc2Zvcm1PbkZpbGUnLFxuICAgICAgICBzZXEsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtRmlsZSA/IHVuZGVmaW5lZCA6IHRyYW5zZm9ybSxcbiAgICAgICAgdHJhbnNmb3JtRmlsZSxcbiAgICAgICAgLi4uKGNvbmZpZyAmJiB7IGNvbmZpZyB9KSxcbiAgICAgIH0pXG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgcHJvbWlzZVxuICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZS5lcnJvci5tZXNzYWdlKVxuICAgICAgICAgIGVycm9yLnN0YWNrID0gbWVzc2FnZS5lcnJvci5zdGFja1xuICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndHJhbnNmb3JtUmVzdWx0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSBtZXNzYWdlXG4gICAgICAgICAgaWYgKHJlc3VsdC5yZXBvcnRzPy5sZW5ndGggJiYgdHJhbnNmb3JtPy5vblJlcG9ydCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXBvcnQgb2YgcmVzdWx0LnJlcG9ydHMpIHtcbiAgICAgICAgICAgICAgdHJhbnNmb3JtLm9uUmVwb3J0KHsgZmlsZSwgcmVwb3J0IH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIG1lc3NhZ2U6ICR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9ydW5uaW5nID0gZmFsc2VcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsU0FBU0EsTUFBVCxRQUF1QixnQkFBdkI7O0FBRUEsT0FBT0MsT0FBUCxNQUFvQixTQUFwQjs7O0FBR0EsZUFBZSxNQUFNQyxVQUFOLENBQWlCO0VBQ3RCQyxNQUFNO0VBQ05DLElBQUksR0FBRyxDQUFIO0VBQ0pDLFFBQVEsR0FBRyxLQUFIO0VBQ1JDLEtBQUssR0FBRyxLQUFIOztFQUViQyxXQUFXLEdBQUc7SUFDWixLQUFLQyxXQUFMO0VBQ0Q7O0VBRVEsTUFBSEMsR0FBRyxHQUFrQjtJQUN6QixJQUFJLEtBQUtILEtBQVQsRUFBZ0I7SUFDaEIsS0FBS0EsS0FBTCxHQUFhLElBQWI7SUFDQSxNQUFNLEVBQUVILE1BQUYsS0FBYSxJQUFuQjtJQUNBLElBQUlBLE1BQUosRUFBWTtNQUNWLE1BQU1BLE1BQU0sQ0FBQ08sU0FBUCxFQUFOO01BQ0EsS0FBS1AsTUFBTCxHQUFjUSxTQUFkO0lBQ0Q7RUFDRjs7RUFFT0gsV0FBVyxHQUFHO0lBQ3BCLElBQUksS0FBS0YsS0FBVCxFQUFnQjtJQUNoQixNQUFNSCxNQUFNLEdBQUcsSUFBSUgsTUFBSixDQUFXWSxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsNEJBQWhCLENBQVgsQ0FBZjtJQUNBLEtBQUtWLE1BQUwsR0FBY0EsTUFBZDtJQUNBQSxNQUFNLENBQUNXLElBQVAsQ0FBWSxNQUFaLEVBQW9CLFlBQVk7TUFDOUIsS0FBS1gsTUFBTCxHQUFjUSxTQUFkO01BQ0EsSUFBSSxLQUFLTCxLQUFULEVBQWdCO01BQ2hCLE1BQU0sSUFBSVMsT0FBSixDQUFZLENBQUNDLENBQUQsS0FBT0MsVUFBVSxDQUFDRCxDQUFELEVBQUksSUFBSixDQUE3QixDQUFOO01BQ0EsS0FBS1IsV0FBTDtJ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