Skip to content

Commit

Permalink
formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
BenAAndrew committed Feb 8, 2024
1 parent 19081ed commit f29b844
Show file tree
Hide file tree
Showing 7 changed files with 325 additions and 281 deletions.
90 changes: 45 additions & 45 deletions .github/workflows/node.js.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,57 +2,57 @@ name: Test CI

on:
push:
branches: [ "main" ]
branches: ["main"]
pull_request:
branches: [ "main" ]
branches: ["main"]

jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: 18.x
cache: 'npm'
- run: npm ci
- run: npm run compile
- name: Install package
run: npm i -g
- name: Run CLI Command (expected to fail)
run: |
set +e
browser-compatibility-checker -f sample_project
if [ $? -eq 0 ]; then
echo "Command succeeded unexpectedly"
exit 1
fi
echo "Command failed as expected"
- name: Run CLI Command (expected to pass)
run: browser-compatibility-checker -f sample_project_2
- name: Run unit tests
run: npm test
- name: Run extension tests
run: xvfb-run -a npm run extension-test
- uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: 18.x
cache: "npm"
- run: npm ci
- run: npm run compile
- name: Install package
run: npm i -g
- name: Run CLI Command (expected to fail)
run: |
set +e
browser-compatibility-checker -f sample_project
if [ $? -eq 0 ]; then
echo "Command succeeded unexpectedly"
exit 1
fi
echo "Command failed as expected"
- name: Run CLI Command (expected to pass)
run: browser-compatibility-checker -f sample_project_2
- name: Run unit tests
run: npm test
- name: Run extension tests
run: xvfb-run -a npm run extension-test
test-npm-package:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: 18.x
cache: 'npm'
- run: npm install browser-compatibility-checker
- name: Run CLI Command (expected to fail)
run: |
set +e
npx browser-compatibility-checker -f sample_project
if [ $? -eq 0 ]; then
echo "Command succeeded unexpectedly"
exit 1
fi
echo "Command failed as expected"
- name: Run CLI Command (expected to pass)
run: npx browser-compatibility-checker -f sample_project_2
- uses: actions/checkout@v3
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: 18.x
cache: "npm"
- run: npm install browser-compatibility-checker
- name: Run CLI Command (expected to fail)
run: |
set +e
npx browser-compatibility-checker -f sample_project
if [ $? -eq 0 ]; then
echo "Command succeeded unexpectedly"
exit 1
fi
echo "Command failed as expected"
- name: Run CLI Command (expected to pass)
run: npx browser-compatibility-checker -f sample_project_2
26 changes: 20 additions & 6 deletions src/browser-compatibility-checker/check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,37 @@ export function findIssues(
text: string,
issues: { [key: string]: CompatIssue },
browsersToCheck: string[] = [],
warnForOtherBrowsers: boolean = true
warnForOtherBrowsers: boolean = true,
) {
const selectorsToWarn = Object.keys(issues);
const matches: { index: number; message: string; isError: boolean, mdnUrl?: string }[] = [];
const matches: {
index: number;
message: string;
isError: boolean;
mdnUrl?: string;
}[] = [];
selectorsToWarn.forEach((selector) => {
const regex = new RegExp(
/^[a-zA-Z]/.test(selector) ? `(?:^|\\s)${selector}` : selector,
"g",
);
const message = getMessage(selector, issues[selector], browsersToCheck, warnForOtherBrowsers);
if(message){
const message = getMessage(
selector,
issues[selector],
browsersToCheck,
warnForOtherBrowsers,
);
if (message) {
let match;
while ((match = regex.exec(text)) !== null) {
matches.push({ index: match.index + 2, message: message.message, isError: message.isError, ...(issues[selector].mdn_url && {mdnUrl: issues[selector].mdn_url}) });
matches.push({
index: match.index + 2,
message: message.message,
isError: message.isError,
...(issues[selector].mdn_url && { mdnUrl: issues[selector].mdn_url }),
});
}
}

});
return matches;
}
168 changes: 84 additions & 84 deletions src/browser-compatibility-checker/compat-issues.ts
Original file line number Diff line number Diff line change
@@ -1,84 +1,84 @@
import bcd, { Identifier } from "@mdn/browser-compat-data";
import fs from "fs";
import path from "path";

const CSS_GLOB = "**/*.{css,scss}";
const HTML_GLOB = "**/*.html";
const JS_GLOB = "**/*.{ts,js}";

export type CompatIssue = {
deprecated: boolean;
browserIssues: string[];
mdn_url?: string;
};

export function processCompatDataObject(
data: Identifier,
prefix: string = "",
suffix: string = "",
) {
const compatIssues: { [name: string]: CompatIssue } = {};
for (const prop of Object.keys(data)) {
let hasIssue = false;
if (!data[prop].__compat) {
continue;
}
const { status, support, mdn_url } = data[prop].__compat!;
const itemCompatIssues: CompatIssue = {
deprecated: false,
browserIssues: [],
mdn_url,
};
if (status?.deprecated) {
itemCompatIssues.deprecated = true;
hasIssue = true;
} else {
for (const [name, data] of Object.entries(support)) {
const isSupported = !Array.isArray(data)
? data.version_added && !data.version_last && !data.flags
: data.some(
(obj) => obj.version_added && !obj.version_last && !obj.flags,
);
if (!isSupported) {
itemCompatIssues.browserIssues = [
...itemCompatIssues.browserIssues,
name,
];
hasIssue = true;
}
}
}
if (hasIssue) {
compatIssues[`${prefix}${prop}${suffix}`] = itemCompatIssues;
}
}
return compatIssues;
}

export function processCompatData() {
const cssCompatIssues = {
...processCompatDataObject(bcd.css["at-rules"], "@"),
...processCompatDataObject(bcd.css.properties, "", ":"),
...processCompatDataObject(bcd.css.selectors, ":"),
...processCompatDataObject(bcd.css.types, "", "\\("),
};
const htmlCompatIssues = {
...processCompatDataObject(bcd.html.elements, "<"),
...processCompatDataObject(bcd.html.global_attributes, "", "="),
};
const jsCompatIssues = {
...processCompatDataObject(bcd.javascript.builtins, "", "\\("),
...processCompatDataObject(bcd.api, "", "\\("),
};
return {
[CSS_GLOB]: cssCompatIssues,
[HTML_GLOB]: htmlCompatIssues,
[JS_GLOB]: jsCompatIssues,
};
}

export function createCompatFile() {
const jsonString = JSON.stringify(processCompatData(), null, 2);
const filePath = path.join(__filename, '../compat-issues.json');
fs.writeFileSync(filePath, jsonString, 'utf-8');
}
import bcd, { Identifier } from "@mdn/browser-compat-data";
import fs from "fs";
import path from "path";

const CSS_GLOB = "**/*.{css,scss}";
const HTML_GLOB = "**/*.html";
const JS_GLOB = "**/*.{ts,js}";

export type CompatIssue = {
deprecated: boolean;
browserIssues: string[];
mdn_url?: string;
};

export function processCompatDataObject(
data: Identifier,
prefix: string = "",
suffix: string = "",
) {
const compatIssues: { [name: string]: CompatIssue } = {};
for (const prop of Object.keys(data)) {
let hasIssue = false;
if (!data[prop].__compat) {
continue;
}
const { status, support, mdn_url } = data[prop].__compat!;
const itemCompatIssues: CompatIssue = {
deprecated: false,
browserIssues: [],
mdn_url,
};
if (status?.deprecated) {
itemCompatIssues.deprecated = true;
hasIssue = true;
} else {
for (const [name, data] of Object.entries(support)) {
const isSupported = !Array.isArray(data)
? data.version_added && !data.version_last && !data.flags
: data.some(
(obj) => obj.version_added && !obj.version_last && !obj.flags,
);
if (!isSupported) {
itemCompatIssues.browserIssues = [
...itemCompatIssues.browserIssues,
name,
];
hasIssue = true;
}
}
}
if (hasIssue) {
compatIssues[`${prefix}${prop}${suffix}`] = itemCompatIssues;
}
}
return compatIssues;
}

export function processCompatData() {
const cssCompatIssues = {
...processCompatDataObject(bcd.css["at-rules"], "@"),
...processCompatDataObject(bcd.css.properties, "", ":"),
...processCompatDataObject(bcd.css.selectors, ":"),
...processCompatDataObject(bcd.css.types, "", "\\("),
};
const htmlCompatIssues = {
...processCompatDataObject(bcd.html.elements, "<"),
...processCompatDataObject(bcd.html.global_attributes, "", "="),
};
const jsCompatIssues = {
...processCompatDataObject(bcd.javascript.builtins, "", "\\("),
...processCompatDataObject(bcd.api, "", "\\("),
};
return {
[CSS_GLOB]: cssCompatIssues,
[HTML_GLOB]: htmlCompatIssues,
[JS_GLOB]: jsCompatIssues,
};
}

export function createCompatFile() {
const jsonString = JSON.stringify(processCompatData(), null, 2);
const filePath = path.join(__filename, "../compat-issues.json");
fs.writeFileSync(filePath, jsonString, "utf-8");
}
18 changes: 14 additions & 4 deletions src/browser-compatibility-checker/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,12 @@ const BROWSER_NAMES: { [key: string]: string } = {
webview_android: "Webview Android",
};

export function getMessage(name: string, issue: CompatIssue, browsersToCheck: string[] = [], warnForOtherBrowsers: boolean = true) {
export function getMessage(
name: string,
issue: CompatIssue,
browsersToCheck: string[] = [],
warnForOtherBrowsers: boolean = true,
) {
const nameFormatted = name.replace(/[^a-zA-Z-]/g, "");
if (issue.deprecated) {
return {
Expand All @@ -24,11 +29,16 @@ export function getMessage(name: string, issue: CompatIssue, browsersToCheck: st
};
}

let browsers = browsersToCheck.length > 0 ? issue.browserIssues.filter(browser => browsersToCheck.includes(browser)) : issue.browserIssues;
let browsers =
browsersToCheck.length > 0
? issue.browserIssues.filter((browser) =>
browsersToCheck.includes(browser),
)
: issue.browserIssues;
let isError = true;

if(browsers.length === 0){
if(warnForOtherBrowsers){
if (browsers.length === 0) {
if (warnForOtherBrowsers) {
browsers = issue.browserIssues;
isError = false;
} else {
Expand Down
Loading

0 comments on commit f29b844

Please sign in to comment.