Skip to content

Commit a4175db

Browse files
committed
Added linter
1 parent 0d4e5bb commit a4175db

7 files changed

Lines changed: 109 additions & 26 deletions

File tree

.github/workflows/test.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,44 @@ on:
77
branches: [main]
88

99
jobs:
10+
lint:
11+
runs-on: ubuntu-latest
12+
permissions:
13+
contents: read
14+
security-events: write
15+
actions: read
16+
steps:
17+
- uses: actions/checkout@v6
18+
19+
- uses: actions/setup-node@v6
20+
with:
21+
node-version: 20
22+
cache: npm
23+
24+
- run: npm ci
25+
26+
- name: Install SARIF formatter
27+
run: npm install --no-save @microsoft/eslint-formatter-sarif
28+
29+
- name: Run ESLint
30+
run: |
31+
npx eslint packages/*/src \
32+
--format @microsoft/eslint-formatter-sarif \
33+
--output-file eslint-results.sarif
34+
continue-on-error: true
35+
36+
- name: Upload SARIF results
37+
uses: github/codeql-action/upload-sarif@v3
38+
with:
39+
sarif_file: eslint-results.sarif
40+
category: eslint
41+
1042
test:
1143
runs-on: ubuntu-latest
1244
permissions:
1345
contents: read
46+
checks: write
47+
pull-requests: write
1448
strategy:
1549
matrix:
1650
node-version: [18, 20, 22]
@@ -25,3 +59,12 @@ jobs:
2559
- run: npm ci
2660
- run: npm run build
2761
- run: npm test
62+
63+
- name: Test Report
64+
uses: dorny/test-reporter@v1
65+
if: success() || failure()
66+
with:
67+
name: Test Results (Node ${{ matrix.node-version }})
68+
path: packages/core/test-results.xml
69+
reporter: java-junit
70+
fail-on-error: false

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ lib-cov
2222
coverage
2323
*.lcov
2424

25+
# Test results
26+
test-results.xml
27+
2528
# nyc test coverage
2629
.nyc_output
2730

eslint.config.mjs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import eslint from "@eslint/js";
2+
import tseslint from "typescript-eslint";
3+
4+
export default tseslint.config(
5+
eslint.configs.recommended,
6+
...tseslint.configs.recommendedTypeChecked,
7+
{
8+
languageOptions: {
9+
parserOptions: {
10+
projectService: true,
11+
tsconfigRootDir: import.meta.dirname,
12+
},
13+
},
14+
},
15+
{
16+
ignores: ["**/dist/**", "**/node_modules/**", "**/*.config.*"],
17+
}
18+
);

package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
"dev:web": "npm run dev --workspace=packages/web"
1313
},
1414
"devDependencies": {
15-
"typescript": "^5.7.0"
15+
"@eslint/js": "^9.17.0",
16+
"@types/eslint__js": "^8.42.3",
17+
"eslint": "^9.17.0",
18+
"typescript": "^5.7.0",
19+
"typescript-eslint": "^8.18.2"
1620
}
1721
}

packages/core/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@
4343
"upng-js": "^2.1.0"
4444
},
4545
"devDependencies": {
46+
"@types/pako": "^2.0.3",
4647
"tsup": "^8.0.0",
47-
"vitest": "^4.0.0",
48-
"@types/pako": "^2.0.3"
48+
"vitest": "^4.0.0"
4949
}
5050
}

packages/core/vitest.config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,9 @@ import { defineConfig } from "vitest/config";
33
export default defineConfig({
44
test: {
55
include: ["tests/**/*.test.ts"],
6+
reporters: ["default", "junit"],
7+
outputFile: {
8+
junit: "./test-results.xml",
9+
},
610
},
711
});

packages/web/src/main.ts

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -138,27 +138,27 @@ function renderFileList() {
138138
for (const { file, mode } of queue) {
139139
const li = document.createElement("li");
140140
li.className = "file-item";
141-
li.innerHTML = `
142-
<span class="file-item-name" title="${escapeHtml(file.name)}">${escapeHtml(file.name)}</span>
143-
<span class="file-item-size">${formatSize(file.size)}</span>
144-
<span class="file-item-badge ${mode === "encode" ? "badge-encode" : "badge-decode"}">${mode.toUpperCase()}</span>
145-
`;
141+
142+
const nameSpan = document.createElement("span");
143+
nameSpan.className = "file-item-name";
144+
nameSpan.title = file.name;
145+
nameSpan.textContent = file.name;
146+
147+
const sizeSpan = document.createElement("span");
148+
sizeSpan.className = "file-item-size";
149+
sizeSpan.textContent = formatSize(file.size);
150+
151+
const badge = document.createElement("span");
152+
badge.className = `file-item-badge ${mode === "encode" ? "badge-encode" : "badge-decode"}`;
153+
badge.textContent = mode.toUpperCase();
154+
155+
li.appendChild(nameSpan);
156+
li.appendChild(sizeSpan);
157+
li.appendChild(badge);
146158
fileItems.appendChild(li);
147159
}
148160
}
149161

150-
function escapeHtml(text: string): string {
151-
const map: Record<string, string> = {
152-
'&': '&amp;',
153-
'<': '&lt;',
154-
'>': '&gt;',
155-
'"': '&quot;',
156-
"'": '&#x27;',
157-
'/': '&#x2F;'
158-
};
159-
return text.replace(/[&<>"'\/]/g, (char) => map[char]);
160-
}
161-
162162
clearBtn.addEventListener("click", () => {
163163
queue = [];
164164
renderFileList();
@@ -257,12 +257,23 @@ function addResultItem(name: string, data: Uint8Array, previewUrl?: string) {
257257
function addResultError(name: string, message: string) {
258258
const li = document.createElement("li");
259259
li.className = "result-item";
260-
li.innerHTML = `
261-
<div class="result-item-info">
262-
<span class="result-item-name" title="${escapeHtml(name)}">${escapeHtml(name)}</span>
263-
</div>
264-
<span class="result-item-error" title="${escapeHtml(message)}">Error</span>
265-
`;
260+
261+
const info = document.createElement("div");
262+
info.className = "result-item-info";
263+
264+
const nameSpan = document.createElement("span");
265+
nameSpan.className = "result-item-name";
266+
nameSpan.title = name;
267+
nameSpan.textContent = name;
268+
info.appendChild(nameSpan);
269+
270+
const errorSpan = document.createElement("span");
271+
errorSpan.className = "result-item-error";
272+
errorSpan.title = message;
273+
errorSpan.textContent = "Error";
274+
275+
li.appendChild(info);
276+
li.appendChild(errorSpan);
266277
resultItems.appendChild(li);
267278
}
268279

0 commit comments

Comments
 (0)