Skip to content

Commit fba0b75

Browse files
author
Daniel Del Core
committed
puts missing lib files back
1 parent ab731ff commit fba0b75

File tree

4 files changed

+441
-1
lines changed

4 files changed

+441
-1
lines changed

.changeset/odd-timers-study.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@hypermod/core': patch
3+
'@hypermod/cli': patch
4+
---
5+
6+
Fixes missing lib files

packages/cli/src/main.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ export default async function main(
284284
await core.run(transform, paths, {
285285
verbose: flags.verbose,
286286
dry: flags.dry,
287-
print: true,
287+
print: false,
288288
babel: true,
289289
extensions: flags.extensions,
290290
ignorePattern: flags.ignorePattern,

packages/core/lib/Worker.js

Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
/* eslint-disable @typescript-eslint/no-var-requires */
2+
'use strict';
3+
4+
const path = require('path');
5+
const { EventEmitter } = require('events');
6+
const async = require('neo-async');
7+
const fs = require('graceful-fs');
8+
const writeFileAtomic = require('write-file-atomic');
9+
const { DEFAULT_EXTENSIONS } = require('@babel/core');
10+
11+
const getParser = require('jscodeshift/src/getParser');
12+
const jscodeshift = require('jscodeshift/src/core');
13+
14+
let presetEnv;
15+
try {
16+
presetEnv = require('@babel/preset-env');
17+
} catch (_) {}
18+
19+
let emitter;
20+
let finish;
21+
let notify;
22+
let transform;
23+
let parserFromTransform;
24+
25+
if (module.parent) {
26+
emitter = new EventEmitter();
27+
// @ts-expect-error
28+
emitter.send = data => run(data);
29+
finish = () => emitter.emit('disconnect');
30+
notify = data => emitter.emit('message', data);
31+
32+
module.exports = args => {
33+
setup(args[0], args[1]);
34+
return emitter;
35+
};
36+
} else {
37+
finish = () => setImmediate(() => process.disconnect());
38+
notify = data => process.send(data);
39+
process.on('message', data => run(data));
40+
setup(process.argv[2], process.argv[3]);
41+
}
42+
43+
function prepareJscodeshift(options) {
44+
const parser =
45+
parserFromTransform || getParser(options.parser, options.parserConfig);
46+
return jscodeshift.withParser(parser);
47+
}
48+
49+
function retrieveTransformId(str) {
50+
return (str.match(/[^@]*(?:[@](?!.*[@]))(.*)$/) || [, ''])[1];
51+
}
52+
function retrievePresetId(str) {
53+
return (str.match(/[^#]*(?:[#](?!.*[#]))(.*)$/) || [, ''])[1];
54+
}
55+
56+
function retrievePath(str) {
57+
return str.replace(/[@#][^@#]*$/, '');
58+
}
59+
60+
function getModule(mod) {
61+
return mod.hasOwnProperty('default') ? mod.default : mod;
62+
}
63+
64+
function setup(entryPath, babel) {
65+
if (babel === 'babel') {
66+
const presets = [];
67+
if (presetEnv) {
68+
presets.push([presetEnv.default, { targets: { node: true } }]);
69+
}
70+
71+
presets.push(
72+
/\.tsx?$/.test(entryPath)
73+
? require('@babel/preset-typescript').default
74+
: require('@babel/preset-flow').default,
75+
);
76+
77+
require('@babel/register')({
78+
configFile: false,
79+
babelrc: false,
80+
presets,
81+
plugins: [
82+
require('@babel/plugin-proposal-class-properties').default,
83+
require('@babel/plugin-proposal-nullish-coalescing-operator').default,
84+
require('@babel/plugin-proposal-optional-chaining').default,
85+
require('@babel/plugin-transform-modules-commonjs').default,
86+
],
87+
extensions: [...DEFAULT_EXTENSIONS, '.ts', '.tsx'],
88+
// By default, babel register only compiles things inside the current working directory.
89+
// https://github.com/babel/babel/blob/2a4f16236656178e84b05b8915aab9261c55782c/packages/babel-register/src/node.js#L140-L157
90+
ignore: [
91+
// Ignore parser related files
92+
/@babel\/parser/,
93+
/\/flow-parser\//,
94+
/\/recast\//,
95+
/\/ast-types\//,
96+
],
97+
});
98+
}
99+
100+
const transformId = retrieveTransformId(entryPath);
101+
const presetId = retrievePresetId(entryPath);
102+
103+
let transformPkg;
104+
let transformModule;
105+
106+
if (transformId) {
107+
transformPkg = getModule(require(path.resolve(retrievePath(entryPath))));
108+
transformModule = transformPkg.transforms[transformId];
109+
}
110+
111+
if (presetId) {
112+
transformPkg = getModule(require(path.resolve(retrievePath(entryPath))));
113+
transformModule = transformPkg.presets[presetId];
114+
}
115+
116+
if (!transformId && !presetId) {
117+
transformModule = require(path.resolve(entryPath));
118+
}
119+
120+
transform = getModule(transformModule);
121+
122+
if (transformModule.parser) {
123+
parserFromTransform =
124+
typeof transformModule.parser === 'string'
125+
? getParser(transformModule.parser)
126+
: transformModule.parser;
127+
}
128+
}
129+
130+
function updateStatus(status, file, msg) {
131+
msg = msg ? file + ' ' + msg : file;
132+
notify({ action: 'status', status, msg });
133+
}
134+
135+
function stats(name, quantity) {
136+
quantity = typeof quantity !== 'number' ? 1 : quantity;
137+
notify({ action: 'update', name: name, quantity: quantity });
138+
}
139+
140+
function trimStackTrace(trace) {
141+
if (!trace) {
142+
return '';
143+
}
144+
// Remove this file from the stack trace of an error thrown in the transformer
145+
const result = [];
146+
trace.split('\n').every(line => {
147+
if (line.indexOf(__filename) === -1) {
148+
result.push(line);
149+
return true;
150+
}
151+
});
152+
return result.join('\n');
153+
}
154+
155+
function run(data) {
156+
const files = data.files;
157+
const options = data.options || {};
158+
159+
if (!files.length) {
160+
finish();
161+
return;
162+
}
163+
async.each(
164+
files,
165+
function (file, callback) {
166+
fs.readFile(file, async function (err, source) {
167+
if (err) {
168+
updateStatus('error', file, 'File error: ' + err);
169+
callback();
170+
return;
171+
}
172+
source = source.toString();
173+
174+
try {
175+
const jscodeshift = prepareJscodeshift(options);
176+
const out = await transform(
177+
{
178+
path: file,
179+
source: source,
180+
},
181+
{
182+
j: jscodeshift,
183+
jscodeshift: jscodeshift,
184+
// eslint-disable-next-line @typescript-eslint/no-empty-function
185+
stats: options.dry ? stats : () => {},
186+
report: msg => notify({ action: 'report', file, msg }),
187+
},
188+
options,
189+
);
190+
if (!out || out === source) {
191+
updateStatus(out ? 'nochange' : 'skip', file);
192+
callback();
193+
return;
194+
}
195+
if (options.print) {
196+
console.log(out); // eslint-disable-line no-console
197+
}
198+
if (!options.dry) {
199+
writeFileAtomic(file, out, err => {
200+
if (err) {
201+
updateStatus('error', file, 'File writer error: ' + err);
202+
} else {
203+
updateStatus('ok', file);
204+
}
205+
callback();
206+
});
207+
} else {
208+
updateStatus('ok', file);
209+
callback();
210+
}
211+
} catch (err) {
212+
updateStatus(
213+
'error',
214+
file,
215+
'Transformation error (' +
216+
err.message.replace(/\n/g, ' ') +
217+
')\n' +
218+
trimStackTrace(err.stack),
219+
);
220+
callback();
221+
}
222+
});
223+
},
224+
function (err) {
225+
if (err) {
226+
updateStatus('error', '', 'This should never be shown!');
227+
}
228+
notify({ action: 'free' });
229+
},
230+
);
231+
}

0 commit comments

Comments
 (0)