From 267a75b0ac89f6766b41b62526892431352eb846 Mon Sep 17 00:00:00 2001 From: Harry Hopkinson Date: Sat, 5 Nov 2022 20:46:36 +0000 Subject: [PATCH 01/11] Implemented a Export Pet Command that exports all pets in the Playground --- .prettierrc.js | 2 - package-lock.json | 65 ++++++++++++++++------------ package.json | 17 +++++++- src/extension/extension.ts | 87 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 140 insertions(+), 31 deletions(-) diff --git a/.prettierrc.js b/.prettierrc.js index b7d08449..5862a960 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -5,5 +5,3 @@ module.exports = { printWidth: 80, semi: true, }; - -// prettier --single-quote true --trailing-comma all --tab-width 4 --print-width 80 --semi true --check "src/**/*.ts" diff --git a/package-lock.json b/package-lock.json index 18f47650..070bfa3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,15 @@ { "name": "vscode-pets", - "version": "1.16.0", + "version": "1.17.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "vscode-pets", - "version": "1.16.0", + "version": "1.17.1", "license": "MIT", "dependencies": { + "fs": "^0.0.1-security", "vscode-nls-i18n": "^0.2.4" }, "devDependencies": { @@ -33,7 +34,7 @@ "typescript": "^4.7.4", "typescript-eslint": "^0.0.1-alpha.0", "vscode-test": "^1.4.0", - "webpack": "^5.73.0", + "webpack": "5.74.0", "webpack-cli": "^4.10.0" }, "engines": { @@ -2658,9 +2659,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -3796,6 +3797,11 @@ } ] }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" + }, "node_modules/fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -9081,9 +9087,9 @@ } }, "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -9094,9 +9100,9 @@ } }, "node_modules/webpack": { - "version": "5.73.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", - "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -9104,11 +9110,11 @@ "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -9121,7 +9127,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "bin": { @@ -11480,9 +11486,9 @@ } }, "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -12363,6 +12369,11 @@ "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" + }, "fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -16488,9 +16499,9 @@ } }, "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -16498,9 +16509,9 @@ } }, "webpack": { - "version": "5.73.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", - "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -16508,11 +16519,11 @@ "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", + "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", + "enhanced-resolve": "^5.10.0", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -16525,7 +16536,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", + "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { diff --git a/package.json b/package.json index 4cf30180..48a9e991 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,8 @@ "onCommand:vscode-pets.delete-pet", "onCommand:vscode-pets.remove-all-pets", "onCommand:vscode-pets.roll-call", + "onCommand:vscode-pets.export-pet-list", + "onCommand:vscode-pets.import-pet-list", "onWebviewPanel:petCoding", "onView:explorer", "onView:petsView", @@ -86,6 +88,16 @@ "light": "media/icon/light-circle-outline.svg" } }, + { + "command": "vscode-pets.export-pet-list", + "title": "Export pet list", + "category": "Pet Coding" + }, + { + "command": "vscode-pets.import-pet-list", + "title": "Import pet list", + "category": "Pet Coding" + }, { "command": "vscode-pets.spawn-pet", "title": "Spawn additional pet", @@ -173,7 +185,7 @@ "panel", "explorer" ], - "default": "explorer", + "default": "panel", "description": "VSCode pets webview position" }, "vscode-pets.theme": { @@ -226,10 +238,11 @@ "typescript": "^4.7.4", "typescript-eslint": "^0.0.1-alpha.0", "vscode-test": "^1.4.0", - "webpack": "^5.73.0", + "webpack": "5.74.0", "webpack-cli": "^4.10.0" }, "dependencies": { + "fs": "^0.0.1-security", "vscode-nls-i18n": "^0.2.4" } } diff --git a/src/extension/extension.ts b/src/extension/extension.ts index 07dfb91a..1248ad48 100644 --- a/src/extension/extension.ts +++ b/src/extension/extension.ts @@ -13,8 +13,10 @@ import { ALL_SCALES, ALL_THEMES, } from '../common/types'; +import { allPets } from '../panel/main'; import { randomName } from '../common/names'; import * as localize from '../common/localize'; +import * as fs from 'fs'; const EXTRA_PETS_KEY = 'vscode-pets.extra-pets'; const EXTRA_PETS_KEY_TYPES = EXTRA_PETS_KEY + '.types'; @@ -382,6 +384,91 @@ export function activate(context: vscode.ExtensionContext) { }), ); + context.subscriptions.push( + vscode.commands.registerCommand( + 'vscode-pets.export-pet-list', + async () => { + const pets = PetSpecification.collectionFromMemento( + context, + getConfiguredSize(), + ); + let petList = ''; + for (let i = 0; i < pets.length; i++) { + const pet = pets[i]; + petList += `Type: ${pet.type} Color: ${pet.color} Size: ${pet.size} \n`; + } + + fs.writeFile( + path.join( + vscode.workspace.workspaceFolders![0].uri.fsPath, + 'vscodePets.txt', + ), + String(petList), + (err) => { + if (err) { + vscode.window.showErrorMessage(err.message); + } + }, + ); + }, + ), + ); + + context.subscriptions.push( + vscode.commands.registerCommand( + 'vscode-pets.import-pet-list', + async () => { + // load the vscodePets.txt file + // parse the file + // add the pets to the collection + const petsToLoad = fs.readFileSync( + path.join( + vscode.workspace.workspaceFolders![0].uri.fsPath, + 'vscodePets.txt', + ), + 'utf8', + ); + // check if empty + if (petsToLoad.length === 0) { + vscode.window.showErrorMessage( + 'File to load empty. Make sure you have a file called vscodePets.txt in your workspace', + ); + return; + } + // load the pets into the collection + const collection = PetSpecification.collectionFromMemento( + context, + getConfiguredSize(), + ); + // fetch just the pet types + const petTypes: any = petsToLoad.split('Type: '); + const petSize: any = petsToLoad.split('Size: '); + const petColor: any = petsToLoad.split('Color: '); + // remove the first element as it is empty + petTypes.shift(); + // add the pets to the collection + for (let i = 0; i < petTypes.length; i++) { + const petType: any = petTypes[i]; + const pet = new PetSpecification( + petType, + petTypes, + petSize, + petColor, + ); + collection.push(pet); + } + // load the pets + const panel = getPetPanel(); + if (panel !== undefined) { + panel.listPets(); + } else { + createPetPlayground(context); + } + storeCollectionAsMemento(context, collection); + }, + ), + ); + context.subscriptions.push( vscode.commands.registerCommand('vscode-pets.spawn-pet', async () => { const panel = getPetPanel(); From 7f27d00f153a8c59b6ae07373057fb8f202b561d Mon Sep 17 00:00:00 2001 From: Harry Hopkinson Date: Sat, 5 Nov 2022 20:49:27 +0000 Subject: [PATCH 02/11] Fix Lint --- src/extension/extension.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/extension/extension.ts b/src/extension/extension.ts index 1248ad48..ff2ed211 100644 --- a/src/extension/extension.ts +++ b/src/extension/extension.ts @@ -13,7 +13,6 @@ import { ALL_SCALES, ALL_THEMES, } from '../common/types'; -import { allPets } from '../panel/main'; import { randomName } from '../common/names'; import * as localize from '../common/localize'; import * as fs from 'fs'; From bff8cc488615ddbddda6ae03e958fd4668985a5d Mon Sep 17 00:00:00 2001 From: Harry Hopkinson Date: Sun, 6 Nov 2022 17:38:16 +0000 Subject: [PATCH 03/11] Import pet list command works. --- .eslintrc.json | 3 +-- package.json | 2 +- src/extension/extension.ts | 32 +++++++++++++------------------- 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 4bb71291..f18d7339 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -18,7 +18,6 @@ "semi": "off", "no-unused-vars": "error", "unused-imports/no-unused-imports": "error", - "prefer-const": "error", - "@typescript-eslint/no-non-null-assertion": "warn" + "prefer-const": "error" } } diff --git a/package.json b/package.json index 48a9e991..564e5fc8 100644 --- a/package.json +++ b/package.json @@ -185,7 +185,7 @@ "panel", "explorer" ], - "default": "panel", + "default": "explorer", "description": "VSCode pets webview position" }, "vscode-pets.theme": { diff --git a/src/extension/extension.ts b/src/extension/extension.ts index ff2ed211..cd5572b4 100644 --- a/src/extension/extension.ts +++ b/src/extension/extension.ts @@ -435,33 +435,27 @@ export function activate(context: vscode.ExtensionContext) { return; } // load the pets into the collection - const collection = PetSpecification.collectionFromMemento( + var collection = PetSpecification.collectionFromMemento( context, getConfiguredSize(), ); // fetch just the pet types const petTypes: any = petsToLoad.split('Type: '); - const petSize: any = petsToLoad.split('Size: '); - const petColor: any = petsToLoad.split('Color: '); - // remove the first element as it is empty - petTypes.shift(); - // add the pets to the collection - for (let i = 0; i < petTypes.length; i++) { - const petType: any = petTypes[i]; - const pet = new PetSpecification( + const panel = getPetPanel(); + for (let i = 1; i < petTypes.length; i++) { + const pet = petTypes[i]; + const petType = pet.split(' ')[0]; + const petColor = pet.split('Color: ')[1].split(' ')[0]; + const petSize = pet.split('Size: ')[1].split(' ')[0]; + const petSpec = new PetSpecification( + petColor, petType, - petTypes, petSize, - petColor, ); - collection.push(pet); - } - // load the pets - const panel = getPetPanel(); - if (panel !== undefined) { - panel.listPets(); - } else { - createPetPlayground(context); + collection.push(petSpec); + if (panel !== undefined) { + panel.spawnPet(petSpec); + } } storeCollectionAsMemento(context, collection); }, From a56f0cb52eaa675292d5d7e74cdf52107921baef Mon Sep 17 00:00:00 2001 From: Harry Hopkinson Date: Sun, 6 Nov 2022 21:10:02 +0000 Subject: [PATCH 04/11] Add no-null-assertion back into the .eslint. --- .eslintrc.json | 3 ++- src/extension/extension.ts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.eslintrc.json b/.eslintrc.json index f18d7339..4bb71291 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -18,6 +18,7 @@ "semi": "off", "no-unused-vars": "error", "unused-imports/no-unused-imports": "error", - "prefer-const": "error" + "prefer-const": "error", + "@typescript-eslint/no-non-null-assertion": "warn" } } diff --git a/src/extension/extension.ts b/src/extension/extension.ts index cd5572b4..5ee67209 100644 --- a/src/extension/extension.ts +++ b/src/extension/extension.ts @@ -399,6 +399,7 @@ export function activate(context: vscode.ExtensionContext) { fs.writeFile( path.join( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion vscode.workspace.workspaceFolders![0].uri.fsPath, 'vscodePets.txt', ), @@ -422,6 +423,7 @@ export function activate(context: vscode.ExtensionContext) { // add the pets to the collection const petsToLoad = fs.readFileSync( path.join( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion vscode.workspace.workspaceFolders![0].uri.fsPath, 'vscodePets.txt', ), From eaca7f10fceb5117a5eac39840044e68d3bb8760 Mon Sep 17 00:00:00 2001 From: Harry Hopkinson Date: Mon, 7 Nov 2022 16:56:50 +0000 Subject: [PATCH 05/11] Refactor code to use vscode's file system api. --- codecov.yml | 4 ++++ package-lock.json | 11 ---------- package.json | 1 - src/extension/extension.ts | 44 +++++++++++++++++--------------------- 4 files changed, 24 insertions(+), 36 deletions(-) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..4018e9e7 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,4 @@ +ignore: + # ignore because of errors + # due to edge cases + - src/common/names.ts diff --git a/package-lock.json b/package-lock.json index 070bfa3a..ef8ebfe9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "1.17.1", "license": "MIT", "dependencies": { - "fs": "^0.0.1-security", "vscode-nls-i18n": "^0.2.4" }, "devDependencies": { @@ -3797,11 +3796,6 @@ } ] }, - "node_modules/fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" - }, "node_modules/fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", @@ -12369,11 +12363,6 @@ "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true }, - "fs": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", - "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" - }, "fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", diff --git a/package.json b/package.json index 564e5fc8..d4e6c508 100644 --- a/package.json +++ b/package.json @@ -242,7 +242,6 @@ "webpack-cli": "^4.10.0" }, "dependencies": { - "fs": "^0.0.1-security", "vscode-nls-i18n": "^0.2.4" } } diff --git a/src/extension/extension.ts b/src/extension/extension.ts index 5ee67209..3d5bb07c 100644 --- a/src/extension/extension.ts +++ b/src/extension/extension.ts @@ -15,7 +15,6 @@ import { } from '../common/types'; import { randomName } from '../common/names'; import * as localize from '../common/localize'; -import * as fs from 'fs'; const EXTRA_PETS_KEY = 'vscode-pets.extra-pets'; const EXTRA_PETS_KEY_TYPES = EXTRA_PETS_KEY + '.types'; @@ -397,18 +396,15 @@ export function activate(context: vscode.ExtensionContext) { petList += `Type: ${pet.type} Color: ${pet.color} Size: ${pet.size} \n`; } - fs.writeFile( - path.join( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - vscode.workspace.workspaceFolders![0].uri.fsPath, - 'vscodePets.txt', + await vscode.workspace.fs.writeFile( + vscode.Uri.file( + path.join( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + vscode.workspace.workspaceFolders![0].uri.fsPath, + 'vscodePets.txt', + ), ), - String(petList), - (err) => { - if (err) { - vscode.window.showErrorMessage(err.message); - } - }, + Buffer.from(petList), ); }, ), @@ -418,17 +414,17 @@ export function activate(context: vscode.ExtensionContext) { vscode.commands.registerCommand( 'vscode-pets.import-pet-list', async () => { - // load the vscodePets.txt file - // parse the file - // add the pets to the collection - const petsToLoad = fs.readFileSync( - path.join( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - vscode.workspace.workspaceFolders![0].uri.fsPath, - 'vscodePets.txt', - ), - 'utf8', - ); + const petsToLoad: Uint8Array = + await vscode.workspace.fs.readFile( + vscode.Uri.file( + path.join( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + vscode.workspace.workspaceFolders![0].uri + .fsPath, + 'vscodePets.txt', + ), + ), + ); // check if empty if (petsToLoad.length === 0) { vscode.window.showErrorMessage( @@ -442,7 +438,7 @@ export function activate(context: vscode.ExtensionContext) { getConfiguredSize(), ); // fetch just the pet types - const petTypes: any = petsToLoad.split('Type: '); + const petTypes: any = petsToLoad.toString().split('Type: '); const panel = getPetPanel(); for (let i = 1; i < petTypes.length; i++) { const pet = petTypes[i]; From cb7d3857793136b373c0cc011c9bfb578036b758 Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Mon, 21 Nov 2022 16:33:43 +1100 Subject: [PATCH 06/11] Import/Export using the untitled API and then load using a file open dialog. --- package-lock.json | 12 ++-- src/extension/extension.ts | 120 ++++++++++++++++++++----------------- 2 files changed, 72 insertions(+), 60 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7fa4d032..6faba67b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10537,9 +10537,9 @@ } }, "node_modules/webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -19111,9 +19111,9 @@ "dev": true }, "webpack": { - "version": "5.75.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", - "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", diff --git a/src/extension/extension.ts b/src/extension/extension.ts index a7505866..2fd1834f 100644 --- a/src/extension/extension.ts +++ b/src/extension/extension.ts @@ -401,22 +401,29 @@ export function activate(context: vscode.ExtensionContext) { context, getConfiguredSize(), ); - let petList = ''; - for (let i = 0; i < pets.length; i++) { - const pet = pets[i]; - petList += `Type: ${pet.type} Color: ${pet.color} Size: ${pet.size} \n`; - } - - await vscode.workspace.fs.writeFile( - vscode.Uri.file( - path.join( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - vscode.workspace.workspaceFolders![0].uri.fsPath, - 'vscodePets.txt', + const petJson = JSON.stringify(pets, null, 2); + const fileName = 'pets.json'; + if (!vscode.workspace.workspaceFolders) { + vscode.window.showErrorMessage( + vscode.l10n.t( + 'You must have a folder or workspace open to export pets.', ), - ), - Buffer.from(petList), - ); + ); + return; + } + const workspacePath = + vscode.workspace.workspaceFolders[0].uri.fsPath; + const newUri = vscode.Uri.file(fileName).with({ + scheme: 'untitled', + path: path.join(workspacePath, fileName), + }); + vscode.workspace.openTextDocument(newUri).then((doc) => { + vscode.window.showTextDocument(doc).then((editor) => { + editor.edit((edit) => { + edit.insert(new vscode.Position(0, 0), petJson); + }); + }); + }); }, ), ); @@ -425,48 +432,53 @@ export function activate(context: vscode.ExtensionContext) { vscode.commands.registerCommand( 'vscode-pets.import-pet-list', async () => { - const petsToLoad: Uint8Array = - await vscode.workspace.fs.readFile( - vscode.Uri.file( - path.join( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - vscode.workspace.workspaceFolders![0].uri - .fsPath, - 'vscodePets.txt', + const options: vscode.OpenDialogOptions = { + canSelectMany: false, + openLabel: 'Open pets.json', + filters: { + 'JSON files': ['json'], + }, + }; + const fileUri = await vscode.window.showOpenDialog(options); + + if (fileUri && fileUri[0]) { + console.log('Selected file: ' + fileUri[0].fsPath); + try { + const fileContents = await vscode.workspace.fs.readFile( + fileUri[0], + ); + const petsToLoad = JSON.parse(fileContents.toString()); + + // load the pets into the collection + var collection = PetSpecification.collectionFromMemento( + context, + getConfiguredSize(), + ); + // fetch just the pet types + const panel = getPetPanel(); + for (let i = 0; i < petsToLoad.length; i++) { + const pet = petsToLoad[i]; + const petSpec = new PetSpecification( + pet.color, + pet.type, + pet.size, + pet.name, + ); + collection.push(petSpec); + if (panel !== undefined) { + panel.spawnPet(petSpec); + } + } + storeCollectionAsMemento(context, collection); + } catch (e: any) { + vscode.window.showErrorMessage( + vscode.l10n.t( + 'Failed to import pets: {0}', + e?.message, ), - ), - ); - // check if empty - if (petsToLoad.length === 0) { - vscode.window.showErrorMessage( - 'File to load empty. Make sure you have a file called vscodePets.txt in your workspace', - ); - return; - } - // load the pets into the collection - var collection = PetSpecification.collectionFromMemento( - context, - getConfiguredSize(), - ); - // fetch just the pet types - const petTypes: any = petsToLoad.toString().split('Type: '); - const panel = getPetPanel(); - for (let i = 1; i < petTypes.length; i++) { - const pet = petTypes[i]; - const petType = pet.split(' ')[0]; - const petColor = pet.split('Color: ')[1].split(' ')[0]; - const petSize = pet.split('Size: ')[1].split(' ')[0]; - const petSpec = new PetSpecification( - petColor, - petType, - petSize, - ); - collection.push(petSpec); - if (panel !== undefined) { - panel.spawnPet(petSpec); + ); } } - storeCollectionAsMemento(context, collection); }, ), ); From 2e2fa096a68c9fc15712e529a2f08c7a2b5e3d9b Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Mon, 21 Nov 2022 18:51:59 +1100 Subject: [PATCH 07/11] Import and export using the VS Code fs API. Validate pet colors on import and on load. --- media/main-bundle.js | 51 +++++++++++- src/extension/extension.ts | 156 ++++++++--------------------------- src/panel/basepettype.ts | 3 +- src/panel/main.ts | 12 ++- src/panel/pets.ts | 29 +++++++ src/panel/pets/cat.ts | 2 + src/panel/pets/clippy.ts | 7 ++ src/panel/pets/cockatiel.ts | 2 + src/panel/pets/crab.ts | 2 + src/panel/pets/dog.ts | 2 + src/panel/pets/mod.ts | 2 + src/panel/pets/rocky.ts | 2 + src/panel/pets/rubberduck.ts | 2 + src/panel/pets/snake.ts | 2 + src/panel/pets/totoro.ts | 2 + src/panel/pets/zappy.ts | 2 + 16 files changed, 155 insertions(+), 123 deletions(-) diff --git a/media/main-bundle.js b/media/main-bundle.js index 05de425c..46095647 100644 --- a/media/main-bundle.js +++ b/media/main-bundle.js @@ -63,6 +63,7 @@ class BasePetType { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [], }; + static possibleColors; currentState; currentStateEnum; holdState; @@ -424,6 +425,9 @@ function addPetToPanel(petType, basePetUri, petColor, petSize, left, bottom, flo const root = basePetUri + '/' + petType + '/' + petColor; console.log('Creating new pet : ', petType, root, petColor, petSize, name); try { + if (!(0, pets_1.availableColors)(petType).includes(petColor)) { + throw new pets_1.InvalidPetException('Invalid color for pet type'); + } var newPet = (0, pets_1.createPet)(petType, petSpriteElement, collisionElement, speechBubbleElement, petSize, left, bottom, root, floor, name); petCounter++; startAnimations(collisionElement, newPet, stateApi); @@ -779,7 +783,7 @@ window.addEventListener('resize', function () { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.createPet = exports.InvalidPetException = exports.PetCollection = exports.PetElement = void 0; +exports.availableColors = exports.createPet = exports.InvalidPetException = exports.PetCollection = exports.PetElement = void 0; const cat_1 = __webpack_require__(/*! ./pets/cat */ "./src/panel/pets/cat.ts"); const clippy_1 = __webpack_require__(/*! ./pets/clippy */ "./src/panel/pets/clippy.ts"); const cockatiel_1 = __webpack_require__(/*! ./pets/cockatiel */ "./src/panel/pets/cockatiel.ts"); @@ -919,6 +923,35 @@ function createPet(petType, el, collision, speech, size, left, bottom, petRoot, } } exports.createPet = createPet; +function availableColors(petType) { + switch (petType) { + case "cat" /* PetType.cat */: + return cat_1.Cat.possibleColors; + case "dog" /* PetType.dog */: + return dog_1.Dog.possibleColors; + case "crab" /* PetType.crab */: + return crab_1.Crab.possibleColors; + case "clippy" /* PetType.clippy */: + return clippy_1.Clippy.possibleColors; + case "mod" /* PetType.mod */: + return mod_1.Mod.possibleColors; + case "totoro" /* PetType.totoro */: + return totoro_1.Totoro.possibleColors; + case "snake" /* PetType.snake */: + return snake_1.Snake.possibleColors; + case "rubber-duck" /* PetType.rubberduck */: + return rubberduck_1.RubberDuck.possibleColors; + case "zappy" /* PetType.zappy */: + return zappy_1.Zappy.possibleColors; + case "rocky" /* PetType.rocky */: + return rocky_1.Rocky.possibleColors; + case "cockatiel" /* PetType.cockatiel */: + return cockatiel_1.Cockatiel.possibleColors; + default: + throw new InvalidPetException("Pet type doesn't exist"); + } +} +exports.availableColors = availableColors; /***/ }), @@ -935,6 +968,7 @@ exports.CAT_NAMES = exports.Cat = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Cat extends basepettype_1.BasePetType { label = 'cat'; + possibleColors = ["black" /* PetColor.black */, "brown" /* PetColor.brown */, "white" /* PetColor.white */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1148,6 +1182,12 @@ exports.CLIPPY_NAMES = exports.Clippy = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Clippy extends basepettype_1.BasePetType { label = 'clippy'; + possibleColors = [ + "black" /* PetColor.black */, + "brown" /* PetColor.brown */, + "green" /* PetColor.green */, + "yellow" /* PetColor.yellow */, + ]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1222,6 +1262,7 @@ exports.COCKATIEL_NAMES = exports.Cockatiel = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Cockatiel extends basepettype_1.BasePetType { label = 'cockatiel'; + possibleColors = ["gray" /* PetColor.gray */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1320,6 +1361,7 @@ exports.CRAB_NAMES = exports.Crab = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Crab extends basepettype_1.BasePetType { label = 'crab'; + possibleColors = ["red" /* PetColor.red */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1434,6 +1476,7 @@ exports.DOG_NAMES = exports.Dog = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Dog extends basepettype_1.BasePetType { label = 'dog'; + possibleColors = ["black" /* PetColor.black */, "brown" /* PetColor.brown */, "white" /* PetColor.white */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1653,6 +1696,7 @@ exports.MOD_NAMES = exports.Mod = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Mod extends basepettype_1.BasePetType { label = 'mod'; + possibleColors = ["purple" /* PetColor.purple */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1723,6 +1767,7 @@ exports.ROCKY_NAMES = exports.Rocky = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Rocky extends basepettype_1.BasePetType { label = 'rocky'; + possibleColors = ["gray" /* PetColor.gray */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1792,6 +1837,7 @@ exports.DUCK_NAMES = exports.RubberDuck = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class RubberDuck extends basepettype_1.BasePetType { label = 'rubber-duck'; + possibleColors = ["yellow" /* PetColor.yellow */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1914,6 +1960,7 @@ exports.SNAKE_NAMES = exports.Snake = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Snake extends basepettype_1.BasePetType { label = 'snake'; + possibleColors = ["green" /* PetColor.green */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -2038,6 +2085,7 @@ exports.TOTORO_NAMES = exports.Totoro = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Totoro extends basepettype_1.BasePetType { label = 'totoro'; + possibleColors = ["gray" /* PetColor.gray */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -2128,6 +2176,7 @@ exports.ZAPPY_NAMES = exports.Zappy = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Zappy extends basepettype_1.BasePetType { label = 'zappy'; + possibleColors = ["yellow" /* PetColor.yellow */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ diff --git a/src/extension/extension.ts b/src/extension/extension.ts index 2fd1834f..eefa709f 100644 --- a/src/extension/extension.ts +++ b/src/extension/extension.ts @@ -15,6 +15,7 @@ import { } from '../common/types'; import { randomName } from '../common/names'; import * as localize from '../common/localize'; +import { availableColors } from '../panel/pets'; const EXTRA_PETS_KEY = 'vscode-pets.extra-pets'; const EXTRA_PETS_KEY_TYPES = EXTRA_PETS_KEY + '.types'; @@ -402,7 +403,7 @@ export function activate(context: vscode.ExtensionContext) { getConfiguredSize(), ); const petJson = JSON.stringify(pets, null, 2); - const fileName = 'pets.json'; + const fileName = `pets-${Date.now()}.json`; if (!vscode.workspace.workspaceFolders) { vscode.window.showErrorMessage( vscode.l10n.t( @@ -411,11 +412,13 @@ export function activate(context: vscode.ExtensionContext) { ); return; } - const workspacePath = - vscode.workspace.workspaceFolders[0].uri.fsPath; + const filePath = vscode.Uri.joinPath( + vscode.workspace.workspaceFolders[0].uri, + fileName, + ); const newUri = vscode.Uri.file(fileName).with({ scheme: 'untitled', - path: path.join(workspacePath, fileName), + path: filePath.fsPath, }); vscode.workspace.openTextDocument(newUri).then((doc) => { vscode.window.showTextDocument(doc).then((editor) => { @@ -447,7 +450,12 @@ export function activate(context: vscode.ExtensionContext) { const fileContents = await vscode.workspace.fs.readFile( fileUri[0], ); - const petsToLoad = JSON.parse(fileContents.toString()); + const petsToLoad = JSON.parse( + String.fromCharCode.apply( + null, + Array.from(fileContents), + ), + ); // load the pets into the collection var collection = PetSpecification.collectionFromMemento( @@ -459,7 +467,7 @@ export function activate(context: vscode.ExtensionContext) { for (let i = 0; i < petsToLoad.length; i++) { const pet = petsToLoad[i]; const petSpec = new PetSpecification( - pet.color, + normalizeColor(pet.color, pet.type), pet.type, pet.size, pet.name, @@ -497,89 +505,23 @@ export function activate(context: vscode.ExtensionContext) { return; } var petColor: PetColor = DEFAULT_COLOR; - var choices; - switch (selectedPetType.value) { - case PetType.rubberduck: - petColor = PetColor.yellow; - break; - case PetType.snake: - petColor = PetColor.green; - break; - case PetType.rocky: - case PetType.totoro: - petColor = PetColor.gray; - break; - case PetType.cat: - choices = [ - PetColor.black, - PetColor.brown, - PetColor.white, - ]; - var selectedColor = await vscode.window.showQuickPick( - localize.stringListAsQuickPickItemList( - choices, - ), - { - placeHolder: vscode.l10n.t('Select a color'), - }, - ); - if (selectedColor === undefined) { - return; - } - petColor = selectedColor.value; - - break; - case PetType.dog: - choices = [ - PetColor.black, - PetColor.brown, - PetColor.white, - ]; - var selectedColor = await vscode.window.showQuickPick( - localize.stringListAsQuickPickItemList( - choices, - ), - { - placeHolder: vscode.l10n.t('Select a color'), - }, - ); - if (selectedColor === undefined) { - return; - } - petColor = selectedColor.value; - break; - case PetType.clippy: - choices = [ - PetColor.black, - PetColor.brown, - PetColor.green, - PetColor.yellow, - ]; - var selectedColor = await vscode.window.showQuickPick( - localize.stringListAsQuickPickItemList( - choices, - ), - { - placeHolder: vscode.l10n.t('Select a color'), - }, - ); - if (selectedColor === undefined) { - return; - } - petColor = selectedColor.value; - break; - case PetType.cockatiel: - petColor = PetColor.gray; - break; - case PetType.crab: - petColor = PetColor.red; - break; - case PetType.zappy: - petColor = PetColor.yellow; - break; - case PetType.mod: - petColor = PetColor.purple; - break; + const possibleColors = availableColors(selectedPetType.value); + + if (possibleColors.length > 1) { + var selectedColor = await vscode.window.showQuickPick( + localize.stringListAsQuickPickItemList( + possibleColors, + ), + { + placeHolder: vscode.l10n.t('Select a color'), + }, + ); + if (selectedColor === undefined) { + return; + } + petColor = selectedColor.value; + } else { + petColor = possibleColors[0]; } if (petColor === undefined) { @@ -731,38 +673,12 @@ function getWebviewOptions( * @returns normalized color */ function normalizeColor(petColor: PetColor, petType: PetType): PetColor { - if (petType === PetType.totoro || petType === PetType.rocky) { - return PetColor.gray; - } - if (petType === PetType.snake) { - return PetColor.green; - } - if (petType === PetType.rubberduck || petType === PetType.zappy) { - return PetColor.yellow; - } - if (petType === PetType.cockatiel) { - return PetColor.gray; - } - if (petType === PetType.crab) { - return PetColor.red; - } - if ( - petType === PetType.dog && - petColor !== PetColor.brown && - petColor !== PetColor.white && - petColor !== PetColor.black - ) { - return PetColor.brown; - } - if ( - petType === PetType.cat && - petColor !== PetColor.brown && - petColor !== PetColor.black && - petColor !== PetColor.white - ) { - return PetColor.brown; + const colors = availableColors(petType); + if (colors.includes(petColor)) { + return petColor; + } else { + return colors[0]; } - return petColor; } interface IPetPanel { diff --git a/src/panel/basepettype.ts b/src/panel/basepettype.ts index f3a42d06..b33a2cda 100644 --- a/src/panel/basepettype.ts +++ b/src/panel/basepettype.ts @@ -1,4 +1,4 @@ -import { PetSize, PetSpeed } from '../common/types'; +import { PetColor, PetSize, PetSpeed } from '../common/types'; import { IPetType } from './states'; import { ISequenceTree } from './sequences'; import { @@ -22,6 +22,7 @@ export abstract class BasePetType implements IPetType { startingState: States.sitIdle, sequenceStates: [], }; + static readonly possibleColors: PetColor[]; currentState: IState; currentStateEnum: States; holdState: IState | undefined; diff --git a/src/panel/main.ts b/src/panel/main.ts index af54fd44..16e94f23 100644 --- a/src/panel/main.ts +++ b/src/panel/main.ts @@ -9,7 +9,14 @@ import { WebviewMessage, } from '../common/types'; import { IPetType } from './states'; -import { createPet, PetCollection, PetElement, IPetCollection } from './pets'; +import { + createPet, + PetCollection, + PetElement, + IPetCollection, + availableColors, + InvalidPetException, +} from './pets'; import { BallState, PetElementState, PetPanelState } from './states'; /* This is how the VS Code API can be invoked from the panel */ @@ -141,6 +148,9 @@ function addPetToPanel( const root = basePetUri + '/' + petType + '/' + petColor; console.log('Creating new pet : ', petType, root, petColor, petSize, name); try { + if (!availableColors(petType).includes(petColor)) { + throw new InvalidPetException('Invalid color for pet type'); + } var newPet = createPet( petType, petSpriteElement, diff --git a/src/panel/pets.ts b/src/panel/pets.ts index 09340c83..4562a90d 100644 --- a/src/panel/pets.ts +++ b/src/panel/pets.ts @@ -196,3 +196,32 @@ export function createPet( throw new InvalidPetException("Pet type doesn't exist"); } } + +export function availableColors(petType: PetType): PetColor[] { + switch (petType) { + case PetType.cat: + return Cat.possibleColors; + case PetType.dog: + return Dog.possibleColors; + case PetType.crab: + return Crab.possibleColors; + case PetType.clippy: + return Clippy.possibleColors; + case PetType.mod: + return Mod.possibleColors; + case PetType.totoro: + return Totoro.possibleColors; + case PetType.snake: + return Snake.possibleColors; + case PetType.rubberduck: + return RubberDuck.possibleColors; + case PetType.zappy: + return Zappy.possibleColors; + case PetType.rocky: + return Rocky.possibleColors; + case PetType.cockatiel: + return Cockatiel.possibleColors; + default: + throw new InvalidPetException("Pet type doesn't exist"); + } +} diff --git a/src/panel/pets/cat.ts b/src/panel/pets/cat.ts index ed23fbaf..838ec339 100644 --- a/src/panel/pets/cat.ts +++ b/src/panel/pets/cat.ts @@ -1,8 +1,10 @@ +import { PetColor } from '../../common/types'; import { BasePetType } from '../basepettype'; import { States } from '../states'; export class Cat extends BasePetType { label = 'cat'; + possibleColors = [PetColor.black, PetColor.brown, PetColor.white]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/clippy.ts b/src/panel/pets/clippy.ts index ef328c78..cdbbc677 100644 --- a/src/panel/pets/clippy.ts +++ b/src/panel/pets/clippy.ts @@ -1,8 +1,15 @@ +import { PetColor } from '../../common/types'; import { BasePetType } from '../basepettype'; import { States } from '../states'; export class Clippy extends BasePetType { label = 'clippy'; + possibleColors = [ + PetColor.black, + PetColor.brown, + PetColor.green, + PetColor.yellow, + ]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/cockatiel.ts b/src/panel/pets/cockatiel.ts index 69da30bf..584db569 100644 --- a/src/panel/pets/cockatiel.ts +++ b/src/panel/pets/cockatiel.ts @@ -1,8 +1,10 @@ +import { PetColor } from '../../common/types'; import { BasePetType } from '../basepettype'; import { States } from '../states'; export class Cockatiel extends BasePetType { label = 'cockatiel'; + possibleColors = [PetColor.gray]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/crab.ts b/src/panel/pets/crab.ts index d733e176..991d8afd 100644 --- a/src/panel/pets/crab.ts +++ b/src/panel/pets/crab.ts @@ -1,8 +1,10 @@ +import { PetColor } from '../../common/types'; import { BasePetType } from '../basepettype'; import { States } from '../states'; export class Crab extends BasePetType { label = 'crab'; + possibleColors = [PetColor.red]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/dog.ts b/src/panel/pets/dog.ts index 512ea372..763da31b 100644 --- a/src/panel/pets/dog.ts +++ b/src/panel/pets/dog.ts @@ -1,8 +1,10 @@ +import { PetColor } from '../../common/types'; import { BasePetType } from '../basepettype'; import { States } from '../states'; export class Dog extends BasePetType { label = 'dog'; + possibleColors = [PetColor.black, PetColor.brown, PetColor.white]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/mod.ts b/src/panel/pets/mod.ts index b583a86b..f57eb8e3 100644 --- a/src/panel/pets/mod.ts +++ b/src/panel/pets/mod.ts @@ -1,8 +1,10 @@ import { States } from '../states'; import { BasePetType } from '../basepettype'; +import { PetColor } from '../../common/types'; export class Mod extends BasePetType { label = 'mod'; + possibleColors = [PetColor.purple]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/rocky.ts b/src/panel/pets/rocky.ts index 6750692e..5f24c3f0 100644 --- a/src/panel/pets/rocky.ts +++ b/src/panel/pets/rocky.ts @@ -1,8 +1,10 @@ +import { PetColor } from '../../common/types'; import { BasePetType } from '../basepettype'; import { States } from '../states'; export class Rocky extends BasePetType { label = 'rocky'; + possibleColors = [PetColor.gray]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/rubberduck.ts b/src/panel/pets/rubberduck.ts index f363ce32..4476034f 100644 --- a/src/panel/pets/rubberduck.ts +++ b/src/panel/pets/rubberduck.ts @@ -1,8 +1,10 @@ +import { PetColor } from '../../common/types'; import { BasePetType } from '../basepettype'; import { States } from '../states'; export class RubberDuck extends BasePetType { label = 'rubber-duck'; + possibleColors = [PetColor.yellow]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/snake.ts b/src/panel/pets/snake.ts index 11918ca7..17823bdc 100644 --- a/src/panel/pets/snake.ts +++ b/src/panel/pets/snake.ts @@ -1,8 +1,10 @@ +import { PetColor } from '../../common/types'; import { BasePetType } from '../basepettype'; import { States } from '../states'; export class Snake extends BasePetType { label = 'snake'; + possibleColors = [PetColor.green]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/totoro.ts b/src/panel/pets/totoro.ts index ab3c457b..e963f4fb 100644 --- a/src/panel/pets/totoro.ts +++ b/src/panel/pets/totoro.ts @@ -1,8 +1,10 @@ +import { PetColor } from '../../common/types'; import { BasePetType } from '../basepettype'; import { States } from '../states'; export class Totoro extends BasePetType { label = 'totoro'; + possibleColors = [PetColor.gray]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/zappy.ts b/src/panel/pets/zappy.ts index 0eeaa345..203baf0d 100644 --- a/src/panel/pets/zappy.ts +++ b/src/panel/pets/zappy.ts @@ -1,8 +1,10 @@ +import { PetColor } from '../../common/types'; import { BasePetType } from '../basepettype'; import { States } from '../states'; export class Zappy extends BasePetType { label = 'zappy'; + possibleColors = [PetColor.yellow]; sequence = { startingState: States.sitIdle, sequenceStates: [ From db84c6cb4a21c94a532bb87b603a8c70ee8053fe Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Mon, 21 Nov 2022 18:58:49 +1100 Subject: [PATCH 08/11] Add missing statics --- media/main-bundle.js | 22 +++++++++++----------- src/panel/basepettype.ts | 2 +- src/panel/pets/cat.ts | 2 +- src/panel/pets/clippy.ts | 2 +- src/panel/pets/cockatiel.ts | 2 +- src/panel/pets/crab.ts | 2 +- src/panel/pets/dog.ts | 2 +- src/panel/pets/mod.ts | 2 +- src/panel/pets/rocky.ts | 2 +- src/panel/pets/rubberduck.ts | 2 +- src/panel/pets/snake.ts | 2 +- src/panel/pets/totoro.ts | 2 +- src/panel/pets/zappy.ts | 2 +- 13 files changed, 23 insertions(+), 23 deletions(-) diff --git a/media/main-bundle.js b/media/main-bundle.js index 46095647..28539d52 100644 --- a/media/main-bundle.js +++ b/media/main-bundle.js @@ -968,7 +968,7 @@ exports.CAT_NAMES = exports.Cat = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Cat extends basepettype_1.BasePetType { label = 'cat'; - possibleColors = ["black" /* PetColor.black */, "brown" /* PetColor.brown */, "white" /* PetColor.white */]; + static possibleColors = ["black" /* PetColor.black */, "brown" /* PetColor.brown */, "white" /* PetColor.white */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1182,7 +1182,7 @@ exports.CLIPPY_NAMES = exports.Clippy = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Clippy extends basepettype_1.BasePetType { label = 'clippy'; - possibleColors = [ + static possibleColors = [ "black" /* PetColor.black */, "brown" /* PetColor.brown */, "green" /* PetColor.green */, @@ -1262,7 +1262,7 @@ exports.COCKATIEL_NAMES = exports.Cockatiel = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Cockatiel extends basepettype_1.BasePetType { label = 'cockatiel'; - possibleColors = ["gray" /* PetColor.gray */]; + static possibleColors = ["gray" /* PetColor.gray */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1361,7 +1361,7 @@ exports.CRAB_NAMES = exports.Crab = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Crab extends basepettype_1.BasePetType { label = 'crab'; - possibleColors = ["red" /* PetColor.red */]; + static possibleColors = ["red" /* PetColor.red */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1476,7 +1476,7 @@ exports.DOG_NAMES = exports.Dog = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Dog extends basepettype_1.BasePetType { label = 'dog'; - possibleColors = ["black" /* PetColor.black */, "brown" /* PetColor.brown */, "white" /* PetColor.white */]; + static possibleColors = ["black" /* PetColor.black */, "brown" /* PetColor.brown */, "white" /* PetColor.white */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1696,7 +1696,7 @@ exports.MOD_NAMES = exports.Mod = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Mod extends basepettype_1.BasePetType { label = 'mod'; - possibleColors = ["purple" /* PetColor.purple */]; + static possibleColors = ["purple" /* PetColor.purple */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1767,7 +1767,7 @@ exports.ROCKY_NAMES = exports.Rocky = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Rocky extends basepettype_1.BasePetType { label = 'rocky'; - possibleColors = ["gray" /* PetColor.gray */]; + static possibleColors = ["gray" /* PetColor.gray */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1837,7 +1837,7 @@ exports.DUCK_NAMES = exports.RubberDuck = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class RubberDuck extends basepettype_1.BasePetType { label = 'rubber-duck'; - possibleColors = ["yellow" /* PetColor.yellow */]; + static possibleColors = ["yellow" /* PetColor.yellow */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -1960,7 +1960,7 @@ exports.SNAKE_NAMES = exports.Snake = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Snake extends basepettype_1.BasePetType { label = 'snake'; - possibleColors = ["green" /* PetColor.green */]; + static possibleColors = ["green" /* PetColor.green */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -2085,7 +2085,7 @@ exports.TOTORO_NAMES = exports.Totoro = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Totoro extends basepettype_1.BasePetType { label = 'totoro'; - possibleColors = ["gray" /* PetColor.gray */]; + static possibleColors = ["gray" /* PetColor.gray */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ @@ -2176,7 +2176,7 @@ exports.ZAPPY_NAMES = exports.Zappy = void 0; const basepettype_1 = __webpack_require__(/*! ../basepettype */ "./src/panel/basepettype.ts"); class Zappy extends basepettype_1.BasePetType { label = 'zappy'; - possibleColors = ["yellow" /* PetColor.yellow */]; + static possibleColors = ["yellow" /* PetColor.yellow */]; sequence = { startingState: "sit-idle" /* States.sitIdle */, sequenceStates: [ diff --git a/src/panel/basepettype.ts b/src/panel/basepettype.ts index b33a2cda..58855650 100644 --- a/src/panel/basepettype.ts +++ b/src/panel/basepettype.ts @@ -22,7 +22,7 @@ export abstract class BasePetType implements IPetType { startingState: States.sitIdle, sequenceStates: [], }; - static readonly possibleColors: PetColor[]; + static possibleColors: PetColor[]; currentState: IState; currentStateEnum: States; holdState: IState | undefined; diff --git a/src/panel/pets/cat.ts b/src/panel/pets/cat.ts index 838ec339..9eb32a64 100644 --- a/src/panel/pets/cat.ts +++ b/src/panel/pets/cat.ts @@ -4,7 +4,7 @@ import { States } from '../states'; export class Cat extends BasePetType { label = 'cat'; - possibleColors = [PetColor.black, PetColor.brown, PetColor.white]; + static possibleColors = [PetColor.black, PetColor.brown, PetColor.white]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/clippy.ts b/src/panel/pets/clippy.ts index cdbbc677..0eca4aec 100644 --- a/src/panel/pets/clippy.ts +++ b/src/panel/pets/clippy.ts @@ -4,7 +4,7 @@ import { States } from '../states'; export class Clippy extends BasePetType { label = 'clippy'; - possibleColors = [ + static possibleColors = [ PetColor.black, PetColor.brown, PetColor.green, diff --git a/src/panel/pets/cockatiel.ts b/src/panel/pets/cockatiel.ts index 584db569..368516ec 100644 --- a/src/panel/pets/cockatiel.ts +++ b/src/panel/pets/cockatiel.ts @@ -4,7 +4,7 @@ import { States } from '../states'; export class Cockatiel extends BasePetType { label = 'cockatiel'; - possibleColors = [PetColor.gray]; + static possibleColors = [PetColor.gray]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/crab.ts b/src/panel/pets/crab.ts index 991d8afd..b5298475 100644 --- a/src/panel/pets/crab.ts +++ b/src/panel/pets/crab.ts @@ -4,7 +4,7 @@ import { States } from '../states'; export class Crab extends BasePetType { label = 'crab'; - possibleColors = [PetColor.red]; + static possibleColors = [PetColor.red]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/dog.ts b/src/panel/pets/dog.ts index 763da31b..7565048d 100644 --- a/src/panel/pets/dog.ts +++ b/src/panel/pets/dog.ts @@ -4,7 +4,7 @@ import { States } from '../states'; export class Dog extends BasePetType { label = 'dog'; - possibleColors = [PetColor.black, PetColor.brown, PetColor.white]; + static possibleColors = [PetColor.black, PetColor.brown, PetColor.white]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/mod.ts b/src/panel/pets/mod.ts index f57eb8e3..996181d0 100644 --- a/src/panel/pets/mod.ts +++ b/src/panel/pets/mod.ts @@ -4,7 +4,7 @@ import { PetColor } from '../../common/types'; export class Mod extends BasePetType { label = 'mod'; - possibleColors = [PetColor.purple]; + static possibleColors = [PetColor.purple]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/rocky.ts b/src/panel/pets/rocky.ts index 5f24c3f0..63e43758 100644 --- a/src/panel/pets/rocky.ts +++ b/src/panel/pets/rocky.ts @@ -4,7 +4,7 @@ import { States } from '../states'; export class Rocky extends BasePetType { label = 'rocky'; - possibleColors = [PetColor.gray]; + static possibleColors = [PetColor.gray]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/rubberduck.ts b/src/panel/pets/rubberduck.ts index 4476034f..a8cfa060 100644 --- a/src/panel/pets/rubberduck.ts +++ b/src/panel/pets/rubberduck.ts @@ -4,7 +4,7 @@ import { States } from '../states'; export class RubberDuck extends BasePetType { label = 'rubber-duck'; - possibleColors = [PetColor.yellow]; + static possibleColors = [PetColor.yellow]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/snake.ts b/src/panel/pets/snake.ts index 17823bdc..94a72114 100644 --- a/src/panel/pets/snake.ts +++ b/src/panel/pets/snake.ts @@ -4,7 +4,7 @@ import { States } from '../states'; export class Snake extends BasePetType { label = 'snake'; - possibleColors = [PetColor.green]; + static possibleColors = [PetColor.green]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/totoro.ts b/src/panel/pets/totoro.ts index e963f4fb..dc157f4e 100644 --- a/src/panel/pets/totoro.ts +++ b/src/panel/pets/totoro.ts @@ -4,7 +4,7 @@ import { States } from '../states'; export class Totoro extends BasePetType { label = 'totoro'; - possibleColors = [PetColor.gray]; + static possibleColors = [PetColor.gray]; sequence = { startingState: States.sitIdle, sequenceStates: [ diff --git a/src/panel/pets/zappy.ts b/src/panel/pets/zappy.ts index 203baf0d..3aac0f2c 100644 --- a/src/panel/pets/zappy.ts +++ b/src/panel/pets/zappy.ts @@ -4,7 +4,7 @@ import { States } from '../states'; export class Zappy extends BasePetType { label = 'zappy'; - possibleColors = [PetColor.yellow]; + static possibleColors = [PetColor.yellow]; sequence = { startingState: States.sitIdle, sequenceStates: [ From d86c3451fcf1b18b4e3e7f8f9618eeaf37bd136a Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Mon, 21 Nov 2022 19:06:26 +1100 Subject: [PATCH 09/11] Normalize colors before testing --- src/extension/extension.ts | 17 +---------------- src/panel/pets.ts | 15 +++++++++++++++ src/test/suite/panel.test.ts | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/extension/extension.ts b/src/extension/extension.ts index eefa709f..55df2acf 100644 --- a/src/extension/extension.ts +++ b/src/extension/extension.ts @@ -15,7 +15,7 @@ import { } from '../common/types'; import { randomName } from '../common/names'; import * as localize from '../common/localize'; -import { availableColors } from '../panel/pets'; +import { availableColors, normalizeColor } from '../panel/pets'; const EXTRA_PETS_KEY = 'vscode-pets.extra-pets'; const EXTRA_PETS_KEY_TYPES = EXTRA_PETS_KEY + '.types'; @@ -666,21 +666,6 @@ function getWebviewOptions( }; } -/** - * Some pets can only have certain colors, this makes sure they haven't been misconfigured. - * @param petColor - * @param petType - * @returns normalized color - */ -function normalizeColor(petColor: PetColor, petType: PetType): PetColor { - const colors = availableColors(petType); - if (colors.includes(petColor)) { - return petColor; - } else { - return colors[0]; - } -} - interface IPetPanel { throwBall(): void; resetPets(): void; diff --git a/src/panel/pets.ts b/src/panel/pets.ts index 4562a90d..6c70e271 100644 --- a/src/panel/pets.ts +++ b/src/panel/pets.ts @@ -225,3 +225,18 @@ export function availableColors(petType: PetType): PetColor[] { throw new InvalidPetException("Pet type doesn't exist"); } } + +/** + * Some pets can only have certain colors, this makes sure they haven't been misconfigured. + * @param petColor + * @param petType + * @returns normalized color + */ +export function normalizeColor(petColor: PetColor, petType: PetType): PetColor { + const colors = availableColors(petType); + if (colors.includes(petColor)) { + return petColor; + } else { + return colors[0]; + } +} \ No newline at end of file diff --git a/src/test/suite/panel.test.ts b/src/test/suite/panel.test.ts index 0ec0af6d..e8c72129 100644 --- a/src/test/suite/panel.test.ts +++ b/src/test/suite/panel.test.ts @@ -128,7 +128,7 @@ suite('Pets Test Suite', () => { 'https://test.com', Theme.beach, ColorThemeKind.dark, - PetColor.black, + pets.normalizeColor(PetColor.black, petType), PetSize.large, petType, false, From e0a20680c4b396d4d943a8928d10c808eac5b7b0 Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Mon, 21 Nov 2022 19:06:59 +1100 Subject: [PATCH 10/11] Lint fixes --- media/main-bundle.js | 18 +++++++++++++++++- src/panel/pets.ts | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/media/main-bundle.js b/media/main-bundle.js index 28539d52..c4496353 100644 --- a/media/main-bundle.js +++ b/media/main-bundle.js @@ -783,7 +783,7 @@ window.addEventListener('resize', function () { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.availableColors = exports.createPet = exports.InvalidPetException = exports.PetCollection = exports.PetElement = void 0; +exports.normalizeColor = exports.availableColors = exports.createPet = exports.InvalidPetException = exports.PetCollection = exports.PetElement = void 0; const cat_1 = __webpack_require__(/*! ./pets/cat */ "./src/panel/pets/cat.ts"); const clippy_1 = __webpack_require__(/*! ./pets/clippy */ "./src/panel/pets/clippy.ts"); const cockatiel_1 = __webpack_require__(/*! ./pets/cockatiel */ "./src/panel/pets/cockatiel.ts"); @@ -952,6 +952,22 @@ function availableColors(petType) { } } exports.availableColors = availableColors; +/** + * Some pets can only have certain colors, this makes sure they haven't been misconfigured. + * @param petColor + * @param petType + * @returns normalized color + */ +function normalizeColor(petColor, petType) { + const colors = availableColors(petType); + if (colors.includes(petColor)) { + return petColor; + } + else { + return colors[0]; + } +} +exports.normalizeColor = normalizeColor; /***/ }), diff --git a/src/panel/pets.ts b/src/panel/pets.ts index 6c70e271..75028e97 100644 --- a/src/panel/pets.ts +++ b/src/panel/pets.ts @@ -239,4 +239,4 @@ export function normalizeColor(petColor: PetColor, petType: PetType): PetColor { } else { return colors[0]; } -} \ No newline at end of file +} From 8293763dd4e89ef590146be309f93eb712cc42ab Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Mon, 21 Nov 2022 19:09:44 +1100 Subject: [PATCH 11/11] Update color match assertion --- src/test/suite/panel.test.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/suite/panel.test.ts b/src/test/suite/panel.test.ts index e8c72129..bc80ee3f 100644 --- a/src/test/suite/panel.test.ts +++ b/src/test/suite/panel.test.ts @@ -122,13 +122,14 @@ suite('Pets Test Suite', () => { 'Test panel app initialization with theme and ' + String(petType), () => { const mockState = new MockState(); + const color = pets.normalizeColor(PetColor.black, petType); panel.allPets.reset(); mockState.reset(); panel.petPanelApp( 'https://test.com', Theme.beach, ColorThemeKind.dark, - pets.normalizeColor(PetColor.black, petType), + color, PetSize.large, petType, false, @@ -147,12 +148,12 @@ suite('Pets Test Suite', () => { const firstPet: PetElementState = (mockState.getState() ?.petStates ?? [])[0]; assert.equal(firstPet.petType, petType); - assert.equal(firstPet.petColor, PetColor.black); + assert.equal(firstPet.petColor, color); const createdPets = panel.allPets.pets; assert.notEqual(createdPets.at(0), undefined); - assert.equal(createdPets.at(0)?.color, PetColor.black); + assert.equal(createdPets.at(0)?.color, color); /// Cycle 1000 frames for (var i = 0; i < 1000; i++) {