Skip to content

Commit af564f1

Browse files
committed
fix: excise @babel/core except from ui-components
1 parent f533f76 commit af564f1

File tree

9 files changed

+70
-58
lines changed

9 files changed

+70
-58
lines changed

packages/SwingSet/package.json

-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
"@agoric/tame-metering": "^1.3.9",
5151
"@agoric/transform-metering": "^1.4.12",
5252
"@agoric/xsnap": "^0.6.2",
53-
"@babel/core": "^7.5.0",
5453
"@babel/generator": "^7.6.4",
5554
"@endo/base64": "^0.1.0",
5655
"@types/tmp": "^0.2.0",

packages/SwingSet/src/controller.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { performance } from 'perf_hooks';
88
import { spawn } from 'child_process';
99
import { type as osType } from 'os';
1010
import { Worker } from 'worker_threads';
11-
import * as babelCore from '@babel/core';
1211
import anylogger from 'anylogger';
1312
import { tmpName } from 'tmp';
1413

@@ -213,7 +212,7 @@ export async function makeSwingsetController(
213212
// cannot be implemented within a non-start-Compartment. We build it out
214213
// here and pass it to the kernel, which then passes it to vats. This is
215214
// intended to be powerless.
216-
const mt = makeMeteringTransformer(babelCore);
215+
const mt = makeMeteringTransformer();
217216
function transformMetering(src, getMeter) {
218217
// 'getMeter' provides the meter to which the transformation itself is
219218
// billed (the COMPUTE meter is charged the length of the source string).

packages/SwingSet/test/metering/test-metering.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { assert, details as X } from '@agoric/assert';
66
import bundleSource from '@agoric/bundle-source';
77
import { importBundle } from '@agoric/import-bundle';
88
import { makeMeter, makeMeteringTransformer } from '@agoric/transform-metering';
9-
import * as babelCore from '@babel/core';
109
import re2 from 're2';
1110
import test from 'ava';
1211
import { waitUntilQuiescent } from '../../src/waitUntilQuiescent';
@@ -52,7 +51,7 @@ async function meteredImportBundle(bundle, endowments) {
5251
// controller into the kernel, so the kernel can create dynamic vats. We can also
5352
// pass it into static vats, so within-vat metering can happen.
5453

55-
const mt = makeMeteringTransformer(babelCore);
54+
const mt = makeMeteringTransformer();
5655
function transform(src) {
5756
const ss = mt.rewrite({ src, endowments: { getMeter } });
5857
// const newRegExp = ss.endowments.RegExp; // === re2

packages/transform-metering/README.md

-45
Original file line numberDiff line numberDiff line change
@@ -6,52 +6,9 @@ This technique is not airtight, but it is at least is a best approximation in th
66

77
## Quickstart
88

9-
### SES 1.0
10-
11-
The following example is for legacy [SES-1.0](https://github.com/Agoric/SES#readme):
12-
13-
```js
14-
import { SES1TameMeteringShim, SES1ReplaceGlobalMeter } from '@agoric/tame-metering';
15-
import SES1 from 'ses';
16-
import * as babelCore from '@babel/core';
17-
import { makeMeteredEvaluator } from '@agoric/transform-metering';
18-
19-
// Create a new SES instance (root realm).
20-
const sesRealm = SES1.makeSESRootRealm({
21-
shims: [SES1TameMeteringShim],
22-
configurableGlobals: true,
23-
});
24-
25-
const replaceGlobalMeter = SES1ReplaceGlobalMeter(sesRealm);
26-
27-
const meteredEval = makeMeteredEvaluator({
28-
// Needed for enabling metering of the global builtins.
29-
replaceGlobalMeter,
30-
// Needed for source transforms that prevent runaways.
31-
babelCore,
32-
// Create an object with an `evaluate(src, endowments, options)` method
33-
makeEvaluator: opts => {
34-
const c = sesRealm.global.Realm.makeCompartment(opts);
35-
// FIXME: Realms bug doesn't propagate global properties.
36-
Object.defineProperties(
37-
c.global,
38-
Object.getOwnPropertyDescriptors(sesRealm.global),
39-
);
40-
return c;
41-
},
42-
// Call a callback when the code inside the meteredEval is done evaluating.
43-
quiesceCallback: cb => setTimeout(cb),
44-
});
45-
```
46-
47-
### SES 2.0
48-
49-
This example is for the [SES 2.0 (beta)](https://github.com/Agoric/SES-beta#readme). Note that it currently has issues that prevents it from working correctly, but YMMV.
50-
519
```js
5210
import { tameMetering } from '@agoric/tame-metering';
5311
import { lockdown } from 'ses';
54-
import * as babelCore from '@babel/core';
5512
import { makeMeteredEvaluator } from '@agoric/transform-metering';
5613

5714
// Override all the global objects with metered versions.
@@ -63,8 +20,6 @@ lockdown();
6320
const meteredEval = makeMeteredEvaluator({
6421
// Needed for enabling metering of the global builtins.
6522
replaceGlobalMeter,
66-
// Needed for source transforms that prevent runaways.
67-
babelCore,
6823
// Create an object with an `evaluate(src, endowments)` method
6924
makeEvaluator: opts => {
7025
const c = new Compartment(undefined, undefined, opts);

packages/transform-metering/package.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
},
1717
"devDependencies": {
1818
"@agoric/install-ses": "^0.5.13",
19-
"@babel/core": "^7.5.0",
2019
"ava": "^3.12.1",
2120
"esm": "^3.2.5",
2221
"nyc": "^15.1.0",
@@ -26,6 +25,10 @@
2625
"dependencies": {
2726
"@agoric/nat": "^4.0.0",
2827
"@agoric/tame-metering": "^1.3.9",
28+
"@agoric/babel-parser": "^7.6.4",
29+
"@babel/types": "^7.6.0",
30+
"@babel/generator": "^7.6.0",
31+
"@babel/traverse": "^7.6.0",
2932
"re2": "^1.10.5"
3033
},
3134
"keywords": [],
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import * as babelParser from '@agoric/babel-parser';
2+
import traverse, { NodePath } from '@babel/traverse';
3+
import generator from '@babel/generator';
4+
import * as types from '@babel/types';
5+
6+
// Create a file structure to wire into @babel/traverse.
7+
export function makePureFile({ code, ast }) {
8+
const file = {
9+
ast,
10+
opts: {},
11+
code,
12+
};
13+
file.hub = {
14+
file,
15+
getCode: () => file.code,
16+
getScope: () => file.scope,
17+
addHelper() {
18+
throw Error(`Helpers are not supported by the fake file hub.`);
19+
},
20+
buildError(_node, msg, Error = TypeError) {
21+
return new Error(msg);
22+
},
23+
};
24+
file.path = NodePath.get({
25+
hub: file.hub,
26+
parentPath: null,
27+
parent: file.ast,
28+
container: file.ast,
29+
key: 'program',
30+
}).setContext();
31+
file.scope = file.path.scope;
32+
return file;
33+
}
34+
35+
/**
36+
* Create a working subset of babelCore that doesn't touch the filesystem.
37+
*/
38+
export function makePureBabelCore() {
39+
return {
40+
parseSync(source, { parserOpts = undefined } = {}) {
41+
return babelParser.parse(source, parserOpts);
42+
},
43+
transformFromAstSync(ast, code = undefined, transformOptions = undefined) {
44+
const { generatorOpts, plugins } = transformOptions || {};
45+
46+
const pluginArgs = [{ types }];
47+
const visitors = plugins
48+
.map(p => p(...pluginArgs).visitor)
49+
.filter(v => v);
50+
if (!visitors.length) {
51+
// We fail here because a null transform is unnecessary.
52+
throw Error(`No visitors found in plugins`);
53+
}
54+
const visitor = traverse.visitors.merge(visitors);
55+
const file = makePureFile({ ast, code });
56+
traverse(file.ast, visitor);
57+
return generator(ast, generatorOpts, code);
58+
},
59+
};
60+
}

packages/transform-metering/src/transform.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/* global require */
22
import * as c from './constants';
3+
import { makePureBabelCore } from './pure-babel-core';
34

45
// We'd like to import this, but RE2 is cjs
56
const RE2 = require('re2');
@@ -8,7 +9,7 @@ const METER_GENERATED = Symbol('meter-generated');
89
const getMeterId = 'getMeter';
910

1011
export function makeMeteringTransformer(
11-
babelCore,
12+
babelCore = makePureBabelCore(),
1213
{
1314
overrideParser = undefined,
1415
overrideRegExp = RE2,
@@ -192,7 +193,6 @@ const ${reid}=RegExp(${JSON.stringify(pattern)},${JSON.stringify(flags)});`);
192193
compact: false,
193194
},
194195
plugins: [meteringPlugin(regexpList)],
195-
ast: true,
196196
code: true,
197197
});
198198

packages/transform-metering/test/test-transform.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
/* global __dirname */
22
/* eslint-disable no-await-in-loop */
33
import test from 'ava';
4-
import * as babelCore from '@babel/core';
54
import fs from 'fs';
65

76
import { makeMeteringTransformer } from '../src/index';
87
import * as c from '../src/constants';
98

109
test('meter transform', async t => {
1110
let getMeter;
12-
const meteringTransform = makeMeteringTransformer(babelCore, {
11+
const meteringTransform = makeMeteringTransformer(undefined, {
1312
overrideMeterId: '$m',
1413
overrideRegExpIdPrefix: '$re_',
1514
});

packages/transform-metering/test/test-zzz-eval.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
/* global process setTimeout */
2-
// eslint-disable-next-line import/order
32
import { replaceGlobalMeter } from './install-metering';
43
import '@agoric/install-ses'; // calls lockdown()
54

5+
// eslint-disable-next-line import/order
66
import test from 'ava';
7-
import * as babelCore from '@babel/core';
87

98
import { makeMeter, makeMeteredEvaluator } from '../src/index';
109

@@ -42,7 +41,6 @@ test.skip('metering evaluator', async t => {
4241
refiller();
4342
}
4443
},
45-
babelCore,
4644
makeEvaluator,
4745
quiesceCallback: cb => setTimeout(cb),
4846
});

0 commit comments

Comments
 (0)