Skip to content

Commit

Permalink
Merge pull request #1320 from Agoric/mfig/bundle-source-errors
Browse files Browse the repository at this point in the history
fix(bundle-source): fix comment misparse, make require optional
  • Loading branch information
michaelfig authored Jul 22, 2020
2 parents 1c4adc5 + 661aae8 commit 62797d5
Show file tree
Hide file tree
Showing 9 changed files with 109 additions and 21 deletions.
3 changes: 3 additions & 0 deletions packages/bundle-source/demo/comments/block-closer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
/* global success */
// */ [not executed]
success();
4 changes: 4 additions & 0 deletions packages/bundle-source/demo/comments/block-opener.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/* global success */
// /*
success();
// */
1 change: 1 addition & 0 deletions packages/bundle-source/demo/external-fs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import 'fs';
7 changes: 5 additions & 2 deletions packages/bundle-source/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,9 @@ export default async function bundleSource(
.replace(HTML_COMMENT_START_RE, '<!X-')
.replace(HTML_COMMENT_END_RE, '-X>')
// ...replace import expressions with a defanged version to pass SES restrictions.
.replace(IMPORT_RE, 'X$1$2');
.replace(IMPORT_RE, 'X$1$2')
// ...replace end-of-comment markers
.replace(/\*\//g, '*X/');
if (unmapLoc) {
unmapLoc(node.loc);
}
Expand Down Expand Up @@ -309,7 +311,8 @@ function getExportWithNestedEvaluate(filePrefix) {
${computeExports}
// Evaluate the entrypoint recursively, seeding the exports.
return computeExports(entrypoint, { require }, {});
const systemRequire = typeof require === 'undefined' ? undefined : require;
return computeExports(entrypoint, { require: systemRequire }, {});
}
${sourceMap}`;
}
Expand Down
3 changes: 1 addition & 2 deletions packages/bundle-source/test/circular.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,9 @@ test('circular export', async t => {
'nestedEvaluate',
);

const require = _ => o => o;
const nestedEvaluate = src => {
// console.log('========== evaluating', src);
return evaluate(src, { require, nestedEvaluate });
return evaluate(src, { nestedEvaluate });
};
// console.log(src1);
const srcMap1 = `(${src1})\n${map1}`;
Expand Down
7 changes: 3 additions & 4 deletions packages/bundle-source/test/sanity.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,9 @@ test('nestedEvaluate', async t => {

t.equal(mf1, 'nestedEvaluate', 'module format is nestedEvaluate');

const require = _ => o => o;
const nestedEvaluate = src => {
// console.log('========== evaluating', src);
return evaluate(src, { require, nestedEvaluate });
return evaluate(src, { nestedEvaluate });
};
const ex1 = nestedEvaluate(srcMap1)();

Expand Down Expand Up @@ -85,7 +84,7 @@ test('getExport', async t => {
t.equal(mf1, 'getExport', 'module format is getExport');

// eslint-disable-next-line no-eval
const ex1 = eval(`const require = _ => o => o;${srcMap1}`)();
const ex1 = eval(`${srcMap1}`)();

const bundle = ex1.default();
const err = bundle.makeError('foo');
Expand All @@ -105,7 +104,7 @@ test('getExport', async t => {

const nestedEvaluate = src => {
// console.log('========== evaluating', src, '\n=========');
return evaluate(src, { require, nestedEvaluate });
return evaluate(src, { nestedEvaluate });
};
// eslint-disable-next-line no-eval
const ex2 = nestedEvaluate(srcMap2)();
Expand Down
85 changes: 85 additions & 0 deletions packages/bundle-source/test/test-comment.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/* global Compartment */
import '@agoric/install-ses';
import { test } from 'tape-promise/tape';
import bundleSource from '..';

function evaluate(src, endowments) {
const c = new Compartment(endowments, {}, {});
return c.evaluate(src);
}

test('trailing comment', async t => {
try {
const { source: src1 } = await bundleSource(
`${__dirname}/../demo/comments/trailing-comment.js`,
'nestedEvaluate',
);

const nestedEvaluate = src => {
// console.log('========== evaluating', src);
return evaluate(src, { nestedEvaluate });
};
// console.log(src1);
const srcMap1 = `(${src1})`;
const ex1 = nestedEvaluate(srcMap1)();

// console.log(err.stack);
t.equals(
typeof ex1.buildRootObject,
'function',
`buildRootObject is exported`,
);
} catch (e) {
t.isNot(e, e, 'unexpected exception');
} finally {
t.end();
}
});

test('comment block opener', async t => {
try {
t.plan(1);
const { source: src1 } = await bundleSource(
`${__dirname}/../demo/comments/block-opener.js`,
'nestedEvaluate',
);

const success = () => t.pass('body runs correctly');

const nestedEvaluate = src => {
// console.log('========== evaluating', src);
return evaluate(src, { nestedEvaluate, success });
};
// console.log(src1);
const srcMap1 = `(${src1})`;
nestedEvaluate(srcMap1)();
} catch (e) {
t.isNot(e, e, 'unexpected exception');
} finally {
t.end();
}
});

test('comment block closer', async t => {
try {
t.plan(1);
const { source: src1 } = await bundleSource(
`${__dirname}/../demo/comments/block-closer.js`,
'nestedEvaluate',
);

const success = () => t.pass('body runs correctly');

const nestedEvaluate = src => {
// console.log('========== evaluating', src);
return evaluate(src, { nestedEvaluate, success });
};
// console.log(src1);
const srcMap1 = `(${src1})`;
nestedEvaluate(srcMap1)();
} catch (e) {
t.isNot(e, e, 'unexpected exception');
} finally {
t.end();
}
});
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,23 @@ function evaluate(src, endowments) {
return c.evaluate(src);
}

test('trailing comment', async t => {
test(`external require('fs')`, async t => {
try {
t.plan(1);
const { source: src1 } = await bundleSource(
`${__dirname}/../demo/trailing-comment.js`,
`${__dirname}/../demo/external-fs.js`,
'nestedEvaluate',
);

// Fake out `require('@agoric/harden')`.
const require = _ => o => o;
const myRequire = mod => t.equals(mod, 'fs', 'required fs module');

const nestedEvaluate = src => {
// console.log('========== evaluating', src);
return evaluate(src, { require, nestedEvaluate });
return evaluate(src, { nestedEvaluate, require: myRequire });
};
// console.log(src1);
const srcMap1 = `(${src1})`;
const ex1 = nestedEvaluate(srcMap1)();

// console.log(err.stack);
t.equals(
typeof ex1.buildRootObject,
'function',
`buildRootObject is exported`,
);
nestedEvaluate(srcMap1)();
} catch (e) {
t.isNot(e, e, 'unexpected exception');
} finally {
Expand Down

0 comments on commit 62797d5

Please sign in to comment.