Skip to content

Commit 6b85e50

Browse files
authored
Merge pull request #3 from Agoric/2-explicit-module-rewrites
require transforms to handle modules explicitly
2 parents 88aa90f + 29f5b6f commit 6b85e50

File tree

2 files changed

+66
-1
lines changed

2 files changed

+66
-1
lines changed

src/index.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,20 @@ export const makeEvaluators = (makerOptions = {}) => {
4141
staticOptions,
4242
);
4343

44+
const moduleOptions =
45+
sourceType === 'module' ? { moduleRewritten: false } : {};
4446
const sourceState = fullTransforms.reduce(
4547
(ss, transform) => (transform.rewrite ? transform.rewrite(ss) : ss),
46-
{ ...staticOptions, src: source },
48+
{ ...staticOptions, ...moduleOptions, src: source },
4749
);
4850

51+
if (sourceType === 'module' && !sourceState.moduleRewritten) {
52+
throw SyntaxError(`Module source was not explicitly rewritten`);
53+
}
54+
if (sourceType !== 'module' && sourceState.moduleRewritten) {
55+
throw SyntaxError(`Non-module source was explicitly rewritten as module`);
56+
}
57+
4958
// Work around Babel appending semicolons.
5059
// TODO: This belongs only in the individual transforms.
5160
const maybeSource = sourceState.src;

test/test-evaluate.js

+56
Original file line numberDiff line numberDiff line change
@@ -209,3 +209,59 @@ test('options.transforms', t => {
209209
t.end();
210210
}
211211
});
212+
213+
test('evaluateModule needs explicit enabling', async t => {
214+
try {
215+
const {
216+
evaluateModule: defaultModule,
217+
evaluateProgram: defaultProgram,
218+
} = makeEvaluators();
219+
220+
t.equal(defaultProgram('123; 456'), 456, 'default program works');
221+
t.throws(
222+
() => defaultModule('123; 456'),
223+
SyntaxError,
224+
'default module fails',
225+
);
226+
227+
let rewriteAll = false;
228+
const moduleTransform = {
229+
rewrite(ss) {
230+
if (rewriteAll || ss.sourceType === 'module') {
231+
return {
232+
...ss,
233+
src: 'Promise.resolve({default: 123})',
234+
moduleRewritten: true,
235+
};
236+
}
237+
return ss;
238+
},
239+
};
240+
241+
const {
242+
evaluateModule: myModule,
243+
evaluateProgram: myProgram,
244+
} = makeEvaluators({
245+
transforms: [moduleTransform],
246+
});
247+
248+
t.equal(myProgram('123; 456'), 456, 'my program works');
249+
t.deepEqual(
250+
await myModule('export default 345;'),
251+
{ default: 123 },
252+
'module rewrites',
253+
);
254+
255+
rewriteAll = true;
256+
t.throws(
257+
() => myProgram('123; 456'),
258+
SyntaxError,
259+
'module rewrite in program context fails',
260+
);
261+
} catch (e) {
262+
console.log('unexpected exception', e);
263+
t.assert(false, e);
264+
} finally {
265+
t.end();
266+
}
267+
});

0 commit comments

Comments
 (0)