Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.DS_Store
node_modules
dist
# dist
test/**/actual
sandbox
14,177 changes: 14,177 additions & 0 deletions dist/buble.deps.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dist/buble.deps.js.map

Large diffs are not rendered by default.

13,118 changes: 13,118 additions & 0 deletions dist/buble.es.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dist/buble.es.js.map

Large diffs are not rendered by default.

13,130 changes: 13,130 additions & 0 deletions dist/buble.umd.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions dist/buble.umd.js.map

Large diffs are not rendered by default.

45 changes: 29 additions & 16 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,29 +12,42 @@ const { parse } = [acornObjectSpread, acornJsx].reduce(

const dangerousTransforms = ['dangerousTaggedTemplateString', 'dangerousForOf'];

const fallbackOrThrow = (fallback, environment, version) => {
const error = `Unknown environment/version '${environment}/${version}'. Please raise an issue at https://github.com/Rich-Harris/buble/issues`
if (!('bitmask' in fallback)) throw new Error(error)
if (!fallback.suppress) console.error(error)
return fallback.bitmask
}

const nearest = (versions, version, fallback, environment) => {
const nearestVersion = Object.keys(versions).sort().reverse().find(v => v <= version)
return nearestVersion
? versions[nearestVersion]
: fallbackOrThrow(fallback, environment, version)
}

export function target(target) {
const fallback = {}
if ('fallback' in target) {
fallback.environment = Object.keys(target.fallback).filter(d => d != 'suppress').pop()
fallback.version = target.fallback[fallback.environment]
fallback.suppress = !!target.fallback.suppress
delete target.fallback
if (matrix[fallback.environment] && (fallback.version in matrix[fallback.environment]))
fallback.bitmask = matrix[fallback.environment][fallback.version]
}

const targets = Object.keys(target);
let bitmask = targets.length
? 0b11111111111111111111111111111111
: 0b01000000000000000000000000000000;

Object.keys(target).forEach(environment => {
const versions = matrix[environment];
if (!versions)
throw new Error(
`Unknown environment '${environment}'. Please raise an issue at https://github.com/Rich-Harris/buble/issues`
);

const targetVersion = target[environment];
if (!(targetVersion in versions))
throw new Error(
`Support data exists for the following versions of ${environment}: ${Object.keys(
versions
).join(
', '
)}. Please raise an issue at https://github.com/Rich-Harris/buble/issues`
);
const support = versions[targetVersion];
const versions = matrix[environment]
, version = target[environment]
, support = !versions ? fallbackOrThrow(fallback, environment, version)
: version in versions ? versions[version]
: nearest(versions, version, fallback, environment)

bitmask &= support;
});
Expand Down
21 changes: 21 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,27 @@ describe('buble', () => {
assert.ok(!transforms.arrow);
});

it('falls back if nonexistent browser', () => {
var transforms = buble.target({ nonexistent: 99, fallback: { node: 5 }});

assert.ok(transforms.defaultParameter);
assert.ok(!transforms.arrow);
});

it('uses nearest version if nonexistent version', () => {
var transforms = buble.target({ chrome: 51 });
assert.ok(transforms.exponentiation); // chrome 51

var transforms = buble.target({ chrome: 99 });
assert.ok(!transforms.exponentiation); // chrome 52

var transforms = buble.target({ chrome: 99, fallback: { node: 5 } });
assert.ok(!transforms.exponentiation); // chrome 52

var transforms = buble.target({ chrome: 10, fallback: { node: 5 }});
assert.ok(!transforms.arrow); // node 5
});

it('only applies necessary transforms', () => {
var source = `
const power = ( base, exponent = 2 ) => Math.pow( base, exponent );`;
Expand Down