Fix type checking of skin-database

This commit is contained in:
Jordan Eldredge 2025-07-06 16:33:09 -07:00
parent 8abcf9d139
commit b99ea291eb
10 changed files with 93 additions and 50 deletions

View file

@ -6,15 +6,19 @@ This document describes the TypeScript checking convention established for the W
Each TypeScript-enabled package in the monorepo now has a consistent `type-check` script that performs type checking without emitting files.
**Progress: 4 out of 5 packages now passing! 🎉**
### Package Status
#### ✅ Passing Packages
- **webamp**: Clean TypeScript compilation
- **ani-cursor**: Clean TypeScript compilation
- **webamp-docs**: Clean TypeScript compilation (after adding webamp workspace dependency)
- **skin-database**: Clean TypeScript compilation (fixed JSZip types, Jest types, and Buffer compatibility issues)
- **webamp-docs**: Clean TypeScript compilation
#### ❌ Failing Packages (Need fixes)
- **skin-database**: 172 TypeScript errors (missing types, test setup issues)
- **webamp-modern**: 390+ TypeScript errors (conflicting type definitions, target issues)
## Convention
@ -40,7 +44,7 @@ The root package.json contains a centralized script that runs type checking for
```json
{
"scripts": {
"type-check": "pnpm --filter webamp type-check && pnpm --filter ani-cursor type-check && pnpm --filter webamp-docs type-check"
"type-check": "pnpm --filter webamp type-check && pnpm --filter ani-cursor type-check && pnpm --filter skin-database type-check && pnpm --filter webamp-docs type-check"
}
}
```
@ -69,19 +73,28 @@ When adding a new TypeScript package to the type-check convention:
### Common Issues
1. **Missing Jest types** (`skin-database`):
1. **Missing Jest types** (Fixed in `skin-database`):
- Install `@types/jest` and configure proper Jest setup
- Ensure test files are properly configured
2. **Conflicting type definitions** (`webamp-modern`):
2. **Missing package types** (Fixed in `skin-database`):
- Install missing dependencies like `jszip`, `react-redux`, `express`
- Install corresponding `@types/` packages where needed
- Note: Some packages like JSZip provide their own types
3. **Buffer compatibility issues** (Fixed in `skin-database`):
- Newer TypeScript versions require explicit casting for `fs.writeFileSync`
- Use `new Uint8Array(buffer)` instead of raw `Buffer` objects
4. **Conflicting type definitions** (`webamp-modern`):
- Multiple versions of `@types/node` causing conflicts
- Target configuration issues (ES5 vs ES2015+)
- Dependency type mismatches
3. **Missing dependencies**:
- Missing type definitions for imported modules
- Incorrect dependency references
### Recommended Fix Strategy
1. Start with packages that have fewer errors

View file

@ -11,7 +11,7 @@
"scripts": {
"test": "jest",
"lint": "eslint . --ext ts,tsx,js,jsx --rulesdir=packages/webamp-modern/tools/eslint-rules",
"type-check": "pnpm --filter webamp type-check && pnpm --filter ani-cursor type-check && pnpm --filter webamp-docs type-check",
"type-check": "pnpm --filter webamp type-check && pnpm --filter ani-cursor type-check && pnpm --filter skin-database type-check && pnpm --filter webamp-docs type-check",
"deploy": "sh deploy.sh",
"format": "prettier --write '**/*.{js,ts,tsx}'"
},

View file

@ -59,7 +59,7 @@ async function addModernSkinFromBuffer(
): Promise<Result> {
console.log("Write temporarty file.");
const tempFile = temp.path({ suffix: ".wal" });
fs.writeFileSync(tempFile, buffer);
fs.writeFileSync(tempFile, new Uint8Array(buffer));
console.log("Put skin to S3.");
await S3.putSkin(md5, buffer, "wal");
@ -83,7 +83,7 @@ async function addClassicSkinFromBuffer(
uploader: string
): Promise<Result> {
const tempFile = temp.path({ suffix: ".wsz" });
fs.writeFileSync(tempFile, buffer);
fs.writeFileSync(tempFile, new Uint8Array(buffer));
const tempScreenshotPath = temp.path({ suffix: ".png" });
const logLines: string[] = [];

View file

@ -21,6 +21,7 @@
"graphql-yoga": "^5.10.10",
"imagemin": "^7.0.0",
"imagemin-optipng": "^7.0.0",
"jszip": "^3.10.1",
"knex": "^0.21.1",
"lru-cache": "^6.0.0",
"mastodon-api": "^1.3.0",
@ -33,6 +34,7 @@
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-dropzone": "^11.1.0",
"react-redux": "^8.0.5",
"react-window": "^1.8.1",
"redux-observable": "^1.0.0",
"rxjs": "^6.3.3",
@ -64,6 +66,8 @@
"prettier": {},
"devDependencies": {
"@types/cookie-session": "^2.0.48",
"@types/express": "^5.0.3",
"@types/jest": "^30.0.0",
"@types/lru-cache": "^5.1.0",
"@types/node-fetch": "^2.5.7",
"@typescript-eslint/eslint-plugin": "^7.1.0",

View file

@ -28,7 +28,7 @@ export async function screenshot(skin: SkinModel, shooter: typeof Shooter) {
const tempFile = temp.path({ suffix: ".wsz" });
const tempScreenshotPath = temp.path({ suffix: ".png" });
fs.writeFileSync(tempFile, buffer);
fs.writeFileSync(tempFile, new Uint8Array(buffer));
const success = await shooter.takeScreenshot(tempFile, tempScreenshotPath, {
minify: true,

View file

@ -138,7 +138,7 @@ async function downloadToTemp(url: string, filename: string): Promise<string> {
const result = await response.buffer();
const tempDir = temp.mkdirSync();
const tempFile = path.join(tempDir, filename);
fs.writeFileSync(tempFile, result);
fs.writeFileSync(tempFile, new Uint8Array(result));
return tempFile;
}

View file

@ -109,7 +109,7 @@ async function sendTweet(skin: SkinModel): Promise<string> {
const screenshotBuffer = await getResizedScreenshot(skin.getMd5());
const filename = await skin.getFileName();
const tempFile = temp.path({ suffix: ".png" });
fs.writeFileSync(tempFile, screenshotBuffer);
fs.writeFileSync(tempFile, new Uint8Array(screenshotBuffer));
const t = getTwitterClient();
const promise: Promise<{ media_id_string: string }> = new Promise(

View file

@ -73,7 +73,7 @@ export async function withBufferAsTempFile<T>(
): Promise<T> {
const tempDir = temp.mkdirSync();
const tempFile = path.join(tempDir, filename);
fs.writeFileSync(tempFile, buffer);
fs.writeFileSync(tempFile, new Uint8Array(buffer));
const r = await cb(tempFile);
fs.unlinkSync(tempFile);
fs.rmdirSync(tempDir);

View file

@ -22,8 +22,7 @@
"clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"webamp": "workspace:*"
"react-dom": "^19.0.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.8.1",

91
pnpm-lock.yaml generated
View file

@ -98,7 +98,7 @@ importers:
dependencies:
'@next/third-parties':
specifier: ^15.3.3
version: 15.3.3(next@15.3.3(@babel/core@7.27.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)
version: 15.3.3(next@15.3.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)
'@sentry/node':
specifier: ^5.27.3
version: 5.30.0
@ -147,6 +147,9 @@ importers:
imagemin-optipng:
specifier: ^7.0.0
version: 7.1.0
jszip:
specifier: ^3.10.1
version: 3.10.1
knex:
specifier: ^0.21.1
version: 0.21.21(sqlite3@5.1.7)
@ -161,7 +164,7 @@ importers:
version: 2.3.0
next:
specifier: ^15.3.3
version: 15.3.3(@babel/core@7.27.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
version: 15.3.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
node-fetch:
specifier: ^2.6.7
version: 2.7.0(encoding@0.1.13)
@ -183,6 +186,9 @@ importers:
react-dropzone:
specifier: ^11.1.0
version: 11.7.1(react@19.1.0)
react-redux:
specifier: ^8.0.5
version: 8.1.3(@types/react-dom@18.2.24)(@types/react@18.2.74)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(redux@5.0.1)
react-window:
specifier: ^1.8.1
version: 1.8.11(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@ -220,6 +226,12 @@ importers:
'@types/cookie-session':
specifier: ^2.0.48
version: 2.0.48
'@types/express':
specifier: ^5.0.3
version: 5.0.3
'@types/jest':
specifier: ^30.0.0
version: 30.0.0
'@types/lru-cache':
specifier: ^5.1.0
version: 5.1.1
@ -504,9 +516,6 @@ importers:
react-dom:
specifier: ^19.0.0
version: 19.1.0(react@19.1.0)
webamp:
specifier: workspace:*
version: link:../webamp
devDependencies:
'@docusaurus/module-type-aliases':
specifier: 3.8.1
@ -4131,9 +4140,15 @@ packages:
'@types/express-serve-static-core@4.17.43':
resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==}
'@types/express-serve-static-core@5.0.6':
resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==}
'@types/express@4.17.21':
resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
'@types/express@5.0.3':
resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==}
'@types/fscreen@1.0.4':
resolution: {integrity: sha512-TsjxyAUvlvuQyao9vNk0yES4nY07K9xoAbkhgXU948JG39EqlLxniWuW9OiZde9Q8ACSpu3fmbXXRAfb/l/HqQ==}
@ -16927,7 +16942,7 @@ snapshots:
'@jest/console@28.1.3':
dependencies:
'@jest/types': 28.1.3
'@types/node': 20.12.4
'@types/node': 24.0.10
chalk: 4.1.2
jest-message-util: 28.1.3
jest-util: 28.1.3
@ -17108,7 +17123,7 @@ snapshots:
'@jest/transform': 28.1.3
'@jest/types': 28.1.3
'@jridgewell/trace-mapping': 0.3.25
'@types/node': 20.12.4
'@types/node': 24.0.10
chalk: 4.1.2
collect-v8-coverage: 1.0.2
exit: 0.1.2
@ -17497,9 +17512,9 @@ snapshots:
'@next/swc-win32-x64-msvc@15.3.3':
optional: true
'@next/third-parties@15.3.3(next@15.3.3(@babel/core@7.27.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)':
'@next/third-parties@15.3.3(next@15.3.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)':
dependencies:
next: 15.3.3(@babel/core@7.27.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
next: 15.3.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
react: 19.1.0
third-party-capital: 1.0.20
@ -17638,13 +17653,15 @@ snapshots:
transitivePeerDependencies:
- '@parcel/core'
'@parcel/cache@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))':
'@parcel/cache@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)':
dependencies:
'@parcel/core': 2.12.0(@swc/helpers@0.5.15)
'@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)
'@parcel/logger': 2.12.0
'@parcel/utils': 2.12.0
lmdb: 2.8.5
transitivePeerDependencies:
- '@swc/helpers'
'@parcel/cache@2.7.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))':
dependencies:
@ -17716,7 +17733,7 @@ snapshots:
'@parcel/core@2.12.0(@swc/helpers@0.5.15)':
dependencies:
'@mischnic/json-sourcemap': 0.1.1
'@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))
'@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)
'@parcel/diagnostic': 2.12.0
'@parcel/events': 2.12.0
'@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)
@ -18205,7 +18222,7 @@ snapshots:
'@parcel/types@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)':
dependencies:
'@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))
'@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)
'@parcel/diagnostic': 2.12.0
'@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)
'@parcel/package-manager': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)
@ -18933,11 +18950,11 @@ snapshots:
'@types/body-parser@1.19.5':
dependencies:
'@types/connect': 3.4.38
'@types/node': 20.12.4
'@types/node': 24.0.10
'@types/bonjour@3.5.13':
dependencies:
'@types/node': 20.12.4
'@types/node': 24.0.10
'@types/cacheable-request@6.0.3':
dependencies:
@ -18953,15 +18970,15 @@ snapshots:
'@types/connect-history-api-fallback@1.5.4':
dependencies:
'@types/express-serve-static-core': 4.17.43
'@types/node': 20.12.4
'@types/node': 24.0.10
'@types/connect@3.4.38':
dependencies:
'@types/node': 20.12.4
'@types/node': 24.0.10
'@types/cookie-session@2.0.48':
dependencies:
'@types/express': 4.17.21
'@types/express': 5.0.3
'@types/keygrip': 1.0.6
'@types/cookie@0.4.1': {}
@ -19003,7 +19020,14 @@ snapshots:
'@types/express-serve-static-core@4.17.43':
dependencies:
'@types/node': 20.12.4
'@types/node': 24.0.10
'@types/qs': 6.9.14
'@types/range-parser': 1.2.7
'@types/send': 0.17.4
'@types/express-serve-static-core@5.0.6':
dependencies:
'@types/node': 24.0.10
'@types/qs': 6.9.14
'@types/range-parser': 1.2.7
'@types/send': 0.17.4
@ -19015,6 +19039,12 @@ snapshots:
'@types/qs': 6.9.14
'@types/serve-static': 1.15.7
'@types/express@5.0.3':
dependencies:
'@types/body-parser': 1.19.5
'@types/express-serve-static-core': 5.0.6
'@types/serve-static': 1.15.7
'@types/fscreen@1.0.4': {}
'@types/glob@7.2.0':
@ -19212,7 +19242,7 @@ snapshots:
'@types/send@0.17.4':
dependencies:
'@types/mime': 1.3.5
'@types/node': 20.12.4
'@types/node': 24.0.10
'@types/serve-index@1.9.4':
dependencies:
@ -19221,12 +19251,12 @@ snapshots:
'@types/serve-static@1.15.7':
dependencies:
'@types/http-errors': 2.0.4
'@types/node': 20.12.4
'@types/node': 24.0.10
'@types/send': 0.17.4
'@types/sockjs@0.3.36':
dependencies:
'@types/node': 20.12.4
'@types/node': 24.0.10
'@types/stack-utils@2.0.3': {}
@ -19244,7 +19274,7 @@ snapshots:
'@types/ws@8.5.10':
dependencies:
'@types/node': 20.12.4
'@types/node': 24.0.10
'@types/yargs-parser@21.0.3': {}
@ -25162,7 +25192,7 @@ snapshots:
'@jest/environment': 29.7.0
'@jest/fake-timers': 29.7.0
'@jest/types': 29.6.3
'@types/node': 20.12.4
'@types/node': 24.0.10
jest-mock: 29.7.0
jest-util: 29.7.0
@ -25188,7 +25218,7 @@ snapshots:
dependencies:
'@jest/types': 28.1.3
'@types/graceful-fs': 4.1.9
'@types/node': 20.12.4
'@types/node': 24.0.10
anymatch: 3.1.3
fb-watchman: 2.0.2
graceful-fs: 4.2.11
@ -25388,7 +25418,7 @@ snapshots:
'@jest/test-result': 28.1.3
'@jest/transform': 28.1.3
'@jest/types': 28.1.3
'@types/node': 20.12.4
'@types/node': 24.0.10
chalk: 4.1.2
emittery: 0.10.2
graceful-fs: 4.2.11
@ -25589,7 +25619,7 @@ snapshots:
dependencies:
'@jest/test-result': 28.1.3
'@jest/types': 28.1.3
'@types/node': 20.12.4
'@types/node': 24.0.10
ansi-escapes: 4.3.2
chalk: 4.1.2
emittery: 0.10.2
@ -27363,7 +27393,7 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
next@15.3.3(@babel/core@7.27.4)(babel-plugin-macros@3.1.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
next@15.3.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
'@next/env': 15.3.3
'@swc/counter': 0.1.3
@ -27373,7 +27403,7 @@ snapshots:
postcss: 8.4.31
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
styled-jsx: 5.1.6(@babel/core@7.27.4)(babel-plugin-macros@3.1.0)(react@19.1.0)
styled-jsx: 5.1.6(react@19.1.0)
optionalDependencies:
'@next/swc-darwin-arm64': 15.3.3
'@next/swc-darwin-x64': 15.3.3
@ -30665,13 +30695,10 @@ snapshots:
'@babel/core': 7.27.4
babel-plugin-macros: 3.1.0
styled-jsx@5.1.6(@babel/core@7.27.4)(babel-plugin-macros@3.1.0)(react@19.1.0):
styled-jsx@5.1.6(react@19.1.0):
dependencies:
client-only: 0.0.1
react: 19.1.0
optionalDependencies:
'@babel/core': 7.27.4
babel-plugin-macros: 3.1.0
stylehacks@5.1.1(postcss@8.5.6):
dependencies: