diff --git a/docs/typescript-checking.md b/docs/typescript-checking.md index fa8871ad..51d1a0c6 100644 --- a/docs/typescript-checking.md +++ b/docs/typescript-checking.md @@ -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 diff --git a/package.json b/package.json index f55be73b..99e6e7f5 100644 --- a/package.json +++ b/package.json @@ -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}'" }, diff --git a/packages/skin-database/addSkin.ts b/packages/skin-database/addSkin.ts index a6f07def..1d879d44 100644 --- a/packages/skin-database/addSkin.ts +++ b/packages/skin-database/addSkin.ts @@ -59,7 +59,7 @@ async function addModernSkinFromBuffer( ): Promise { 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 { 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[] = []; diff --git a/packages/skin-database/package.json b/packages/skin-database/package.json index c4aa99d4..cff2e23c 100644 --- a/packages/skin-database/package.json +++ b/packages/skin-database/package.json @@ -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", diff --git a/packages/skin-database/tasks/screenshotSkin.ts b/packages/skin-database/tasks/screenshotSkin.ts index acac0177..46c2902d 100644 --- a/packages/skin-database/tasks/screenshotSkin.ts +++ b/packages/skin-database/tasks/screenshotSkin.ts @@ -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, diff --git a/packages/skin-database/tasks/syncToArchive.ts b/packages/skin-database/tasks/syncToArchive.ts index b6c6e926..0498e73d 100644 --- a/packages/skin-database/tasks/syncToArchive.ts +++ b/packages/skin-database/tasks/syncToArchive.ts @@ -138,7 +138,7 @@ async function downloadToTemp(url: string, filename: string): Promise { 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; } diff --git a/packages/skin-database/tasks/tweet.ts b/packages/skin-database/tasks/tweet.ts index 2c4e155d..8a436829 100644 --- a/packages/skin-database/tasks/tweet.ts +++ b/packages/skin-database/tasks/tweet.ts @@ -109,7 +109,7 @@ async function sendTweet(skin: SkinModel): Promise { 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( diff --git a/packages/skin-database/utils.ts b/packages/skin-database/utils.ts index 118c3f19..2bcf783a 100644 --- a/packages/skin-database/utils.ts +++ b/packages/skin-database/utils.ts @@ -73,7 +73,7 @@ export async function withBufferAsTempFile( ): Promise { 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); diff --git a/packages/webamp-docs/package.json b/packages/webamp-docs/package.json index a2df40db..51876c50 100644 --- a/packages/webamp-docs/package.json +++ b/packages/webamp-docs/package.json @@ -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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75e8e6f4..0e700377 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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: