Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: amilajack/eslint-plugin-compat
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v3.6.0
Choose a base ref
...
head repository: amilajack/eslint-plugin-compat
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v3.7.0
Choose a head ref
  • 6 commits
  • 18 files changed
  • 1 contributor

Commits on May 17, 2020

  1. bump ast-metadata-inferer (#323)

    * bump ast-metadata-inferer
    
    * add additional test cases
    amilajack authored May 17, 2020

    Verified

    This commit was signed with the committer’s verified signature.
    pellared Robert Pająk
    Copy the full SHA
    7c56d63 View commit details
  2. update CHANGELOG

    amilajack committed May 17, 2020

    Verified

    This commit was signed with the committer’s verified signature.
    pellared Robert Pająk
    Copy the full SHA
    39b38ff View commit details
  3. v3.7.0-0

    amilajack committed May 17, 2020

    Verified

    This commit was signed with the committer’s verified signature.
    pellared Robert Pająk
    Copy the full SHA
    ae8ccaf View commit details

Commits on May 20, 2020

  1. 5
    Copy the full SHA
    e79f72c View commit details
  2. v3.7.0-1

    amilajack committed May 20, 2020
    Copy the full SHA
    947798b View commit details

Commits on May 23, 2020

  1. v3.7.0

    amilajack committed May 23, 2020
    Copy the full SHA
    7a3b8a2 View commit details
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
## v3.6.0
### v3.7.0
### Fixed
- Fixed many bugs reporting incorrect linter errors

# v3.6.0
### Fixed
- Update dependencies
- Remove `fixable` and add `meta.type` ([305](https://github.com/amilajack/eslint-plugin-compat/pull/305))
28 changes: 12 additions & 16 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "eslint-plugin-compat",
"version": "3.6.0",
"version": "3.7.0",
"description": "Lint browser compatibility of API used",
"main": "lib/index.js",
"repository": {
@@ -43,27 +43,27 @@
"@babel/preset-env": "^7.9.6",
"@babel/preset-flow": "^7.9.0",
"cross-env": "^7.0.2",
"eslint": "^6.8.0",
"eslint-config-bliss": "^4.8.1",
"eslint": "^7.0.0",
"eslint-config-bliss": "^5.0.0",
"eslint-plugin-prettier": "^3.1.3",
"flow-bin": "^0.123.0",
"flow-bin": "^0.124.0",
"flow-typed": "^3.1.0",
"jest": "^25.5.3"
"jest": "^26.0.1"
},
"dependencies": {
"ast-metadata-inferer": "^0.1.1",
"browserslist": "^4.11.1",
"caniuse-db": "^1.0.30001040",
"ast-metadata-inferer": "^0.2.0-0",
"browserslist": "^4.12.0",
"caniuse-db": "^1.0.30001059",
"core-js": "^3.6.5",
"lodash.memoize": "4.1.2",
"mdn-browser-compat-data": "^1.0.17",
"semver": "7.2.2"
"mdn-browser-compat-data": "^1.0.21",
"semver": "7.3.2"
},
"peerDependencies": {
"eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
"eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
},
"engines": {
"node": ">=8.x"
"node": ">=9.x"
},
"collective": {
"type": "opencollective",
@@ -98,10 +98,6 @@
"renovate": {
"extends": [
"bliss"
],
"ignoreDeps": [
"caniuse-db",
"mdn-browser-compat-data"
]
}
}
2 changes: 1 addition & 1 deletion src/Lint.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// @flow
import type { Node, ESLintNode } from './LintTypes';
import type { Node, ESLintNode } from "./LintTypes";

export function lintCallExpression(
reporter: Function,
4 changes: 2 additions & 2 deletions src/LintTypes.js
Original file line number Diff line number Diff line change
@@ -8,7 +8,7 @@ export type BrowserListConfig =
| null;

export type node = {
type?: 'MemberExpression' | 'NewExpression' | 'CallExpression',
type?: "MemberExpression" | "NewExpression" | "CallExpression",
name?: string,
object: string,
property: string | void,
@@ -18,7 +18,7 @@ export type node = {

export type Target = {
target: string,
version: number | string | 'all'
version: number | string | "all"
};

export type Targets = Array<string>;
67 changes: 34 additions & 33 deletions src/Versioning.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,31 @@
/* eslint no-nested-ternary: off */
// @flow
import browserslist from 'browserslist';
import type { BrowserListConfig } from './LintTypes';
import browserslist from "browserslist";
import type { BrowserListConfig } from "./LintTypes";

export const STANDARD_TARGET_NAME_MAPPING = {
chrome: 'Chrome',
firefox: 'Firefox',
safari: 'Safari',
ios_saf: 'iOS Safari',
ie: 'IE',
ie_mob: 'IE Mobile',
edge: 'Edge',
baidu: 'Baidu',
electron: 'Electron',
blackberry_browser: 'Blackberry Browser',
edge_mobile: 'Edge Mobile',
and_uc: 'Android UC Browser',
and_chrome: 'Android Chrome',
and_firefox: 'Android Firefox',
and_webview: 'Android Webview',
and_samsung: 'Samsung Browser',
and_opera: 'Opera Android',
opera: 'Opera',
opera_mini: 'Opera Mini',
opera_mobile: 'Opera Mobile',
node: 'Node.js',
kaios: 'KaiOS'
chrome: "Chrome",
firefox: "Firefox",
safari: "Safari",
ios_saf: "iOS Safari",
ie: "IE",
ie_mob: "IE Mobile",
edge: "Edge",
baidu: "Baidu",
electron: "Electron",
blackberry_browser: "Blackberry Browser",
edge_mobile: "Edge Mobile",
and_uc: "Android UC Browser",
and_chrome: "Android Chrome",
and_firefox: "Android Firefox",
and_webview: "Android Webview",
and_samsung: "Samsung Browser",
and_opera: "Opera Android",
opera: "Opera",
opera_mini: "Opera Mini",
opera_mobile: "Opera Mobile",
node: "Node.js",
kaios: "KaiOS"
};

export function reverseTargetMappings(targetMappings) {
@@ -37,7 +38,7 @@ export function reverseTargetMappings(targetMappings) {
type TargetListItem = {
target: string,
parsedVersion: number,
version: string | 'all'
version: string | "all"
};

/**
@@ -51,11 +52,11 @@ export default function DetermineTargetsFromConfig(
): Array<string> {
const browserslistOpts = { path: configPath };

if (Array.isArray(config) || typeof config === 'string') {
if (Array.isArray(config) || typeof config === "string") {
return browserslist(config, browserslistOpts);
}

if (config && typeof config === 'object') {
if (config && typeof config === "object") {
return browserslist(
[...(config.production || []), ...(config.development || [])],
browserslistOpts
@@ -74,15 +75,15 @@ export function Versioning(targetslist: Array<string>): Array<TargetListItem> {
targetslist
// Sort the targets by target name and then version number in ascending order
.map((e: string): TargetListItem => {
const [target, version] = e.split(' ');
const [target, version] = e.split(" ");
return {
target,
version,
parsedVersion:
version === 'all'
version === "all"
? 0
: version.includes('-')
? parseFloat(version.split('-')[0])
: version.includes("-")
? parseFloat(version.split("-")[0])
: parseFloat(version)
};
})
@@ -92,8 +93,8 @@ export function Versioning(targetslist: Array<string>): Array<TargetListItem> {
if (b.target === a.target) {
// If any version === 'all', return 0. The only version of op_mini is 'all'
// Otherwise, compare the versions
return typeof b.parsedVersion === 'string' ||
typeof a.parsedVersion === 'string'
return typeof b.parsedVersion === "string" ||
typeof a.parsedVersion === "string"
? 0
: b.parsedVersion - a.parsedVersion;
}
4 changes: 2 additions & 2 deletions src/config/recommended.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
export default {
plugins: ['compat'],
plugins: ["compat"],
env: {
browser: true
},
rules: {
'compat/compat': 'error'
"compat/compat": "error"
}
};
4 changes: 2 additions & 2 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -6,14 +6,14 @@
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
import recommended from './config/recommended';
import recommended from "./config/recommended";

//------------------------------------------------------------------------------
// Plugin Definition
//------------------------------------------------------------------------------

// import all rules in lib/rules
import compat from './rules/compat';
import compat from "./rules/compat";

export const configs = {
recommended
184 changes: 92 additions & 92 deletions src/providers/CanIUseProvider.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// @flow
// $FlowFixMe: Flow import error
import canIUseRecords from 'caniuse-db/fulldata-json/data-2.0.json';
import { STANDARD_TARGET_NAME_MAPPING } from '../Versioning';
import type { Node, Targets, Target } from '../LintTypes';
import canIUseRecords from "caniuse-db/fulldata-json/data-2.0.json";
import { STANDARD_TARGET_NAME_MAPPING } from "../Versioning";
import type { Node, Targets, Target } from "../LintTypes";

type CanIUseStats = {
[browser: string]: {
@@ -28,7 +28,7 @@ function formatTargetNames(target: Target): string {
* ex. 10.0-10.2
*/
function versionIsRange(version: string): boolean {
return version.includes('-');
return version.includes("-");
}

/**
@@ -63,7 +63,7 @@ function isSupportedByCanIUse(
return Object.keys(targetStats).some((statsVersion: string): boolean =>
versionIsRange(statsVersion) &&
areVersionsEqual(parsedVersion, statsVersion)
? !targetStats[statsVersion].includes('y')
? !targetStats[statsVersion].includes("y")
: true
);
}
@@ -74,7 +74,7 @@ function isSupportedByCanIUse(
if (!(version in targetStats)) return true;
if (!targetStats[version]) return true;

return targetStats[version].includes('y');
return targetStats[version].includes("y");
}

/**
@@ -92,152 +92,152 @@ export function getUnsupportedTargets(
const CanIUseProvider: Array<Node> = [
// new ServiceWorker()
{
caniuseId: 'serviceworkers',
astNodeType: 'NewExpression',
object: 'ServiceWorker'
caniuseId: "serviceworkers",
astNodeType: "NewExpression",
object: "ServiceWorker"
},
{
caniuseId: 'serviceworkers',
astNodeType: 'MemberExpression',
object: 'navigator',
property: 'serviceWorker'
caniuseId: "serviceworkers",
astNodeType: "MemberExpression",
object: "navigator",
property: "serviceWorker"
},
// document.querySelector()
{
caniuseId: 'queryselector',
astNodeType: 'MemberExpression',
object: 'document',
property: 'querySelector'
caniuseId: "queryselector",
astNodeType: "MemberExpression",
object: "document",
property: "querySelector"
},
// IntersectionObserver
{
caniuseId: 'intersectionobserver',
astNodeType: 'NewExpression',
object: 'IntersectionObserver'
caniuseId: "intersectionobserver",
astNodeType: "NewExpression",
object: "IntersectionObserver"
},
// ResizeObserver
{
caniuseId: 'resizeobserver',
astNodeType: 'NewExpression',
object: 'ResizeObserver'
caniuseId: "resizeobserver",
astNodeType: "NewExpression",
object: "ResizeObserver"
},
// PaymentRequest
{
caniuseId: 'payment-request',
astNodeType: 'NewExpression',
object: 'PaymentRequest'
caniuseId: "payment-request",
astNodeType: "NewExpression",
object: "PaymentRequest"
},
// Promises
{
caniuseId: 'promises',
astNodeType: 'NewExpression',
object: 'Promise'
caniuseId: "promises",
astNodeType: "NewExpression",
object: "Promise"
},
{
caniuseId: 'promises',
astNodeType: 'MemberExpression',
object: 'Promise',
property: 'resolve'
caniuseId: "promises",
astNodeType: "MemberExpression",
object: "Promise",
property: "resolve"
},
{
caniuseId: 'promises',
astNodeType: 'MemberExpression',
object: 'Promise',
property: 'all'
caniuseId: "promises",
astNodeType: "MemberExpression",
object: "Promise",
property: "all"
},
{
caniuseId: 'promises',
astNodeType: 'MemberExpression',
object: 'Promise',
property: 'race'
caniuseId: "promises",
astNodeType: "MemberExpression",
object: "Promise",
property: "race"
},
{
caniuseId: 'promises',
astNodeType: 'MemberExpression',
object: 'Promise',
property: 'reject'
caniuseId: "promises",
astNodeType: "MemberExpression",
object: "Promise",
property: "reject"
},
// fetch
{
caniuseId: 'fetch',
astNodeType: 'CallExpression',
object: 'fetch'
caniuseId: "fetch",
astNodeType: "CallExpression",
object: "fetch"
},
// document.currentScript()
{
caniuseId: 'document-currentscript',
astNodeType: 'MemberExpression',
object: 'document',
property: 'currentScript'
caniuseId: "document-currentscript",
astNodeType: "MemberExpression",
object: "document",
property: "currentScript"
},
// URL
{
caniuseId: 'url',
astNodeType: 'NewExpression',
object: 'URL'
caniuseId: "url",
astNodeType: "NewExpression",
object: "URL"
},
// URLSearchParams
{
caniuseId: 'urlsearchparams',
astNodeType: 'NewExpression',
object: 'URLSearchParams'
caniuseId: "urlsearchparams",
astNodeType: "NewExpression",
object: "URLSearchParams"
},
// performance.now()
{
caniuseId: 'high-resolution-time',
astNodeType: 'MemberExpression',
object: 'performance',
property: 'now'
caniuseId: "high-resolution-time",
astNodeType: "MemberExpression",
object: "performance",
property: "now"
},
{
caniuseId: 'typedarrays',
astNodeType: 'NewExpression',
object: 'TypedArray'
caniuseId: "typedarrays",
astNodeType: "NewExpression",
object: "TypedArray"
},
{
caniuseId: 'typedarrays',
astNodeType: 'NewExpression',
object: 'Int8Array'
caniuseId: "typedarrays",
astNodeType: "NewExpression",
object: "Int8Array"
},
{
caniuseId: 'typedarrays',
astNodeType: 'NewExpression',
object: 'Uint8Array'
caniuseId: "typedarrays",
astNodeType: "NewExpression",
object: "Uint8Array"
},
{
caniuseId: 'typedarrays',
astNodeType: 'NewExpression',
object: 'Uint8ClampedArray'
caniuseId: "typedarrays",
astNodeType: "NewExpression",
object: "Uint8ClampedArray"
},
{
caniuseId: 'typedarrays',
astNodeType: 'NewExpression',
object: 'Int16Array'
caniuseId: "typedarrays",
astNodeType: "NewExpression",
object: "Int16Array"
},
{
caniuseId: 'typedarrays',
astNodeType: 'NewExpression',
object: 'Uint16Array'
caniuseId: "typedarrays",
astNodeType: "NewExpression",
object: "Uint16Array"
},
{
caniuseId: 'typedarrays',
astNodeType: 'NewExpression',
object: 'Int32Array'
caniuseId: "typedarrays",
astNodeType: "NewExpression",
object: "Int32Array"
},
{
caniuseId: 'typedarrays',
astNodeType: 'NewExpression',
object: 'Uint32Array'
caniuseId: "typedarrays",
astNodeType: "NewExpression",
object: "Uint32Array"
},
{
caniuseId: 'typedarrays',
astNodeType: 'NewExpression',
object: 'Float32Array'
caniuseId: "typedarrays",
astNodeType: "NewExpression",
object: "Float32Array"
},
{
caniuseId: 'typedarrays',
astNodeType: 'NewExpression',
object: 'Float64Array'
caniuseId: "typedarrays",
astNodeType: "NewExpression",
object: "Float64Array"
}
].map(rule => ({
...rule,
2 changes: 1 addition & 1 deletion src/providers/KangaxProvider.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// @flow
import type { Node } from '../LintTypes';
import type { Node } from "../LintTypes";

// TODO: not implemented yet.
const KangaxProvider: Array<Node> = [];
59 changes: 30 additions & 29 deletions src/providers/MdnProvider.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import AstMetadata from 'ast-metadata-inferer';
import semver from 'semver';
import AstMetadata from "ast-metadata-inferer";
import semver from "semver";
import {
STANDARD_TARGET_NAME_MAPPING,
reverseTargetMappings
} from '../Versioning';
import type { Node, Targets, Target } from '../LintTypes';
} from "../Versioning";
import type { Node, Targets, Target } from "../LintTypes";

// @TODO Import this type from ast-metadata-inferer after migrating this project to TypeScript
type AstMetadataRecordType = {
apiType: 'js-api' | 'css-api',
type: 'js-api' | 'css-api',
apiType: "js-api" | "css-api",
type: "js-api" | "css-api",
protoChain: Array<string>,
protoChainId: string,
astNodeTypes: Array<string>,
@@ -32,20 +33,20 @@ const mdnRecords: Map<string, AstMetadataRecordType> = new Map(
* Map ids of mdn targets to their "common/friendly" name
*/
const targetIdMappings = {
chrome: 'chrome',
firefox: 'firefox',
opera: 'opera',
safari: 'safari',
safari_ios: 'ios_saf',
ie: 'ie',
edge_mobile: 'ie_mob',
edge: 'edge',
opera_android: 'and_opera',
chrome_android: 'and_chrome',
firefox_android: 'and_firefox',
webview_android: 'and_webview',
samsunginternet_android: 'and_samsung',
nodejs: 'node'
chrome: "chrome",
firefox: "firefox",
opera: "opera",
safari: "safari",
safari_ios: "ios_saf",
ie: "ie",
edge_mobile: "ie_mob",
edge: "edge",
opera_android: "and_opera",
chrome_android: "and_chrome",
firefox_android: "and_firefox",
webview_android: "and_webview",
samsunginternet_android: "and_samsung",
nodejs: "node"
};

const reversedTargetMappings = reverseTargetMappings(targetIdMappings);
@@ -62,7 +63,7 @@ function formatTargetNames(target: Target): string {
* Convert '9' => '9.0.0'
*/
function customCoerce(version: string): string {
return version.length === 1 ? [version, 0, 0].join('.') : version;
return version.length === 1 ? [version, 0, 0].join(".") : version;
}

/*
@@ -80,20 +81,20 @@ export function isSupportedByMDN(
if (!record || !record.compat.support) return true;
const compatRecord = record.compat.support[target];
if (!compatRecord) return true;
if (!Array.isArray(compatRecord) && !('version_added' in compatRecord))
if (!Array.isArray(compatRecord) && !("version_added" in compatRecord))
return true;
const { version_added: versionAdded } = Array.isArray(compatRecord)
? compatRecord.find(e => 'version_added' in e)
? compatRecord.find(e => "version_added" in e)
: compatRecord;

// If a version is true then it is supported but version is unsure
if (typeof versionAdded === 'boolean') return versionAdded;
if (typeof versionAdded === "boolean") return versionAdded;
if (versionAdded === null) return true;

// Special case for Safari TP: TP is always gte than any other releases
if (target === 'safari') {
if (version === 'TP') return true;
if (versionAdded === 'TP') return false;
if (target === "safari") {
if (version === "TP") return true;
if (versionAdded === "TP") return false;
}
// A browser supports an API if its version is greater than or equal
// to the first version of the browser that API was added in
@@ -138,7 +139,7 @@ function getMetadataName(metadata: Node) {
return metadata.protoChain[0];
}
default:
return `${metadata.protoChain.join('.')}()`;
return `${metadata.protoChain.join(".")}()`;
}
}

@@ -157,7 +158,7 @@ const MdnProvider: Array<Node> = AstMetadata
}))
)
// Flatten the array of arrays
.reduce((p, c) => [...p, ...c])
.flat()
// Add rule and target support logic for each entry
.map(rule => ({
...rule,
8 changes: 4 additions & 4 deletions src/providers/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// @flow
import CanIUse from './CanIUseProvider';
import Mdn from './MdnProvider';
import type { Node } from '../LintTypes';
import CanIUse from "./CanIUseProvider";
import Mdn from "./MdnProvider";
import type { Node } from "../LintTypes";

// eslint-disable-next-line import/prefer-default-export
export const rules: Array<Node> = [...CanIUse, ...Mdn];
export const nodes: Array<Node> = [...CanIUse, ...Mdn];
68 changes: 34 additions & 34 deletions src/rules/compat.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
// @flow
import memoize from 'lodash.memoize';
import memoize from "lodash.memoize";
import {
lintCallExpression,
lintMemberExpression,
lintNewExpression
} from '../Lint';
import DetermineTargetsFromConfig, { Versioning } from '../Versioning';
import type { ESLintNode, Node, BrowserListConfig } from '../LintTypes';
import { rules } from '../providers';
} from "../Lint";
import determineTargetsFromConfig, { Versioning } from "../Versioning";
import type { ESLintNode, Node, BrowserListConfig } from "../LintTypes";
import { nodes } from "../providers";

type ESLint = {
[astNodeTypeName: string]: (node: ESLintNode) => void
@@ -26,17 +26,17 @@ type Context = {

function getName(node: ESLintNode): string {
switch (node.type) {
case 'NewExpression': {
case "NewExpression": {
return node.callee.name;
}
case 'MemberExpression': {
case "MemberExpression": {
return node.object.name;
}
case 'CallExpression': {
case "CallExpression": {
return node.callee.name;
}
default:
throw new Error('not found');
throw new Error("not found");
}
}

@@ -66,30 +66,30 @@ function isPolyfilled(context: Context, rule: Node): boolean {
}

const getRulesForTargets = memoize((targetsJSON: string): Object => {
const targets = JSON.parse(targetsJSON);
const result = {
CallExpression: [],
NewExpression: [],
MemberExpression: []
};
rules.forEach(rule => {
if (rule.getUnsupportedTargets(rule, targets).length === 0) return;
result[rule.astNodeType].push(rule);
const targets = JSON.parse(targetsJSON);
nodes.forEach(node => {
if (node.getUnsupportedTargets(node, targets).length === 0) return;
result[node.astNodeType].push(node);
});
return result;
});

export default {
meta: {
docs: {
description: 'Ensure cross-browser API compatibility',
category: 'Compatibility',
description: "Ensure cross-browser API compatibility",
category: "Compatibility",
url:
'https://github.com/amilajack/eslint-plugin-compat/blob/master/docs/rules/compat.md',
"https://github.com/amilajack/eslint-plugin-compat/blob/master/docs/rules/compat.md",
recommended: true
},
type: 'problem',
schema: [{ type: 'string' }]
type: "problem",
schema: [{ type: "string" }]
},
create(context: Context): ESLint {
// Determine lowest targets from browserslist config, which reads user's
@@ -100,7 +100,7 @@ export default {
context.options[0];

const browserslistTargets = Versioning(
DetermineTargetsFromConfig(context.getFilename(), browserslistConfig)
determineTargetsFromConfig(context.getFilename(), browserslistConfig)
);

// Stringify to support memoization; browserslistConfig is always an array of new objects.
@@ -110,15 +110,15 @@ export default {

const errors = [];

function handleFailingRule(rule: Node, node: ESLintNode) {
if (isPolyfilled(context, rule)) return;
function handleFailingRule(node: Node, eslintNode: ESLintNode) {
if (isPolyfilled(context, node)) return;
errors.push({
node,
node: eslintNode,
message: [
generateErrorName(rule),
'is not supported in',
rule.getUnsupportedTargets(rule, browserslistTargets).join(', ')
].join(' ')
generateErrorName(node),
"is not supported in",
node.getUnsupportedTargets(node, browserslistTargets).join(", ")
].join(" ")
});
}

@@ -146,25 +146,25 @@ export default {
const { type } = node.parent;
if (
// ex. const { Set } = require('immutable');
type === 'Property' ||
type === "Property" ||
// ex. function Set() {}
type === 'FunctionDeclaration' ||
type === "FunctionDeclaration" ||
// ex. const Set = () => {}
type === 'VariableDeclarator' ||
type === "VariableDeclarator" ||
// ex. class Set {}
type === 'ClassDeclaration' ||
type === "ClassDeclaration" ||
// ex. import Set from 'set';
type === 'ImportDefaultSpecifier' ||
type === "ImportDefaultSpecifier" ||
// ex. import {Set} from 'set';
type === 'ImportSpecifier' ||
type === "ImportSpecifier" ||
// ex. import {Set} from 'set';
type === 'ImportDeclaration'
type === "ImportDeclaration"
) {
identifiers.add(node.name);
}
}
},
'Program:exit': () => {
"Program:exit": () => {
// Get a map of all the variables defined in the root scope (not the global scope)
// const variablesMap = context.getScope().childScopes.map(e => e.set)[0];
errors
14 changes: 7 additions & 7 deletions test/CanIUseProvider.spec.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import DetermineTargetsFromConfig, { Versioning } from '../src/Versioning';
import { getUnsupportedTargets } from '../src/providers/CanIUseProvider';
import expectRangeResultJSON from './expect-range-result-config.json';
import DetermineTargetsFromConfig, { Versioning } from "../src/Versioning";
import { getUnsupportedTargets } from "../src/providers/CanIUseProvider";
import expectRangeResultJSON from "./expect-range-result-config.json";

describe('CanIUseProvider', () => {
it('should return unsupported iOS targets with range value for Fetch API', () => {
const node = { caniuseId: 'fetch' };
describe("CanIUseProvider", () => {
it("should return unsupported iOS targets with range value for Fetch API", () => {
const node = { caniuseId: "fetch" };
const config = DetermineTargetsFromConfig(
'.',
".",
expectRangeResultJSON.browsers
);
const targets = Versioning(config);
12 changes: 6 additions & 6 deletions test/MdnProvider.spec.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import DetermineTargetsFromConfig, { Versioning } from '../src/Versioning';
import { getUnsupportedTargets } from '../src/providers/MdnProvider';
import DetermineTargetsFromConfig, { Versioning } from "../src/Versioning";
import { getUnsupportedTargets } from "../src/providers/MdnProvider";

describe('MdnProvider', () => {
it('should support Safari TP', () => {
const node = { protoChainId: 'AbortController' };
const config = DetermineTargetsFromConfig('.', ['safari tp']);
describe("MdnProvider", () => {
it("should support Safari TP", () => {
const node = { protoChainId: "AbortController" };
const config = DetermineTargetsFromConfig(".", ["safari tp"]);
const targets = Versioning(config);
const result = getUnsupportedTargets(node, targets);
expect(result).toEqual([]);
60 changes: 33 additions & 27 deletions test/Versioning.spec.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
import path from 'path';
import DetermineTargetsFromConfig, { Versioning } from '../src/Versioning';
import multiEnvPackageJSON from './multi-config.package.json';
import singleArrayEnvPackageJSON from './single-array-config.package.json';
import singleVersionEnvPackageJSON from './single-version-config.package.json';
import path from "path";
import DetermineTargetsFromConfig, { Versioning } from "../src/Versioning";
import multiEnvPackageJSON from "./multi-config.package.json";
import singleArrayEnvPackageJSON from "./single-array-config.package.json";
import singleVersionEnvPackageJSON from "./single-version-config.package.json";

describe('Versioning', () => {
it('should support multi env config in browserslist package.json', () => {
describe("Versioning", () => {
it("should support multi env config in browserslist package.json", () => {
const config = DetermineTargetsFromConfig(
'.',
".",
multiEnvPackageJSON.browsers
);
const result = Versioning(config);
expect(result).toMatchSnapshot();
});

it('should support resolving browserslist config in subdirectory', () => {
it("should support resolving browserslist config in subdirectory", () => {
// This should resolve the ./test/.browserslistrc config
const relativeConfig = DetermineTargetsFromConfig(
path.join(__dirname, '.browserslistrc')
path.join(__dirname, ".browserslistrc")
);
const rootConfig = DetermineTargetsFromConfig(
require.resolve('../package.json')
require.resolve("../package.json")
);
const relativeConfigVersions = Versioning(relativeConfig);
expect(relativeConfigVersions).toMatchSnapshot();
@@ -30,43 +30,49 @@ describe('Versioning', () => {
expect(relativeConfigVersions).not.toEqual(rootConfigVersions);
});

it('should support single array config in browserslist package.json', () => {
it("should support single array config in browserslist package.json", () => {
const config = DetermineTargetsFromConfig(
'.',
".",
singleArrayEnvPackageJSON.browsers
);
const result = Versioning(config);
expect(result).toMatchSnapshot();
});

it('should support single version config in browserslist package.json', () => {
it("should support single version config in browserslist package.json", () => {
const config = DetermineTargetsFromConfig(
'.',
".",
singleVersionEnvPackageJSON.browsers
);
const result = Versioning(config);
expect(result).toMatchSnapshot([
{ target: 'safari', version: '8', parsedVersion: 8 },
{ target: 'ie', version: '9', parsedVersion: 9 },
{ target: 'firefox', version: '20', parsedVersion: 20 },
{ target: 'chrome', version: '32', parsedVersion: 32 }
{ target: "safari", version: "8", parsedVersion: 8 },
{ target: "ie", version: "9", parsedVersion: 9 },
{ target: "firefox", version: "20", parsedVersion: 20 },
{ target: "chrome", version: "32", parsedVersion: 32 }
]);
});

it('should get lowest target versions', () => {
it("should get lowest target versions", () => {
const versions = [
'chrome 20',
'chrome 30',
'node 7',
'chrome 30.5',
'firefox 50.5'
"chrome 20",
"chrome 30",
"node 7",
"chrome 30.5",
"firefox 50.5"
];
expect(Versioning(versions)).toMatchSnapshot();
});

it('should support string config in rule option', () => {
const config = DetermineTargetsFromConfig('.', 'defaults, not ie < 9');
it("should support string config in rule option", () => {
const config = DetermineTargetsFromConfig(".", "defaults, not ie < 9");
const result = Versioning(config);
expect(result).toMatchSnapshot();
});

it("should fail on incorrect browserslist target version", () => {
expect(() => {
DetermineTargetsFromConfig(".", "edge 100");
}).toThrow("Unknown version 100 of edge");
});
});
88 changes: 44 additions & 44 deletions test/__snapshots__/Versioning.spec.js.snap
Original file line number Diff line number Diff line change
@@ -28,14 +28,14 @@ Array [
"version": "8.2",
},
Object {
"parsedVersion": 11.1,
"parsedVersion": 12,
"target": "safari",
"version": "11.1",
"version": "12",
},
Object {
"parsedVersion": 63,
"parsedVersion": 65,
"target": "opera",
"version": "63",
"version": "65",
},
Object {
"parsedVersion": 11.5,
@@ -73,9 +73,9 @@ Array [
"version": "68",
},
Object {
"parsedVersion": 17,
"parsedVersion": 18,
"target": "edge",
"version": "17",
"version": "18",
},
Object {
"parsedVersion": 78,
@@ -93,9 +93,9 @@ Array [
"version": "7.12",
},
Object {
"parsedVersion": 80,
"parsedVersion": 81,
"target": "android",
"version": "80",
"version": "81",
},
Object {
"parsedVersion": 12.12,
@@ -113,9 +113,9 @@ Array [
"version": "68",
},
Object {
"parsedVersion": 80,
"parsedVersion": 81,
"target": "and_chr",
"version": "80",
"version": "81",
},
]
`;
@@ -138,14 +138,14 @@ Array [
"version": "11.1",
},
Object {
"parsedVersion": 13,
"parsedVersion": 13.1,
"target": "safari",
"version": "13",
"version": "13.1",
},
Object {
"parsedVersion": 66,
"parsedVersion": 68,
"target": "opera",
"version": "66",
"version": "68",
},
Object {
"parsedVersion": 46,
@@ -163,9 +163,9 @@ Array [
"version": "2.5",
},
Object {
"parsedVersion": 13.3,
"parsedVersion": 13.4,
"target": "ios_saf",
"version": "13.3",
"version": "13.4",
},
Object {
"parsedVersion": 11,
@@ -178,14 +178,14 @@ Array [
"version": "11",
},
Object {
"parsedVersion": 75,
"parsedVersion": 76,
"target": "firefox",
"version": "75",
"version": "76",
},
Object {
"parsedVersion": 80,
"parsedVersion": 81,
"target": "edge",
"version": "80",
"version": "81",
},
Object {
"parsedVersion": 81,
@@ -203,9 +203,9 @@ Array [
"version": "7.12",
},
Object {
"parsedVersion": 80,
"parsedVersion": 81,
"target": "android",
"version": "80",
"version": "81",
},
Object {
"parsedVersion": 12.12,
@@ -223,9 +223,9 @@ Array [
"version": "68",
},
Object {
"parsedVersion": 80,
"parsedVersion": 81,
"target": "and_chr",
"version": "80",
"version": "81",
},
]
`;
@@ -238,14 +238,14 @@ Array [
"version": "8.2",
},
Object {
"parsedVersion": 11.1,
"parsedVersion": 12,
"target": "safari",
"version": "11.1",
"version": "12",
},
Object {
"parsedVersion": 63,
"parsedVersion": 65,
"target": "opera",
"version": "63",
"version": "65",
},
Object {
"parsedVersion": 11.5,
@@ -283,9 +283,9 @@ Array [
"version": "68",
},
Object {
"parsedVersion": 17,
"parsedVersion": 18,
"target": "edge",
"version": "17",
"version": "18",
},
Object {
"parsedVersion": 72,
@@ -303,9 +303,9 @@ Array [
"version": "7.12",
},
Object {
"parsedVersion": 80,
"parsedVersion": 81,
"target": "android",
"version": "80",
"version": "81",
},
Object {
"parsedVersion": 12.12,
@@ -323,9 +323,9 @@ Array [
"version": "68",
},
Object {
"parsedVersion": 80,
"parsedVersion": 81,
"target": "and_chr",
"version": "80",
"version": "81",
},
]
`;
@@ -363,14 +363,14 @@ Array [
"version": "10.1",
},
Object {
"parsedVersion": 12.1,
"parsedVersion": 13,
"target": "safari",
"version": "12.1",
"version": "13",
},
Object {
"parsedVersion": 65,
"parsedVersion": 67,
"target": "opera",
"version": "65",
"version": "67",
},
Object {
"parsedVersion": 46,
@@ -408,19 +408,19 @@ Array [
"version": "18",
},
Object {
"parsedVersion": 79,
"parsedVersion": 80,
"target": "chrome",
"version": "79",
"version": "80",
},
Object {
"parsedVersion": 7.12,
"target": "baidu",
"version": "7.12",
},
Object {
"parsedVersion": 80,
"parsedVersion": 81,
"target": "android",
"version": "80",
"version": "81",
},
Object {
"parsedVersion": 12.12,
@@ -438,9 +438,9 @@ Array [
"version": "68",
},
Object {
"parsedVersion": 80,
"parsedVersion": 81,
"target": "and_chr",
"version": "80",
"version": "81",
},
]
`;
338 changes: 203 additions & 135 deletions test/e2e.spec.js

Large diffs are not rendered by default.

1,376 changes: 715 additions & 661 deletions yarn.lock

Large diffs are not rendered by default.