diff --git a/README.md b/README.md index 1d4c699..3421cac 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,87 @@ # CodeDesignerAI VSCode [![CI](https://github.com/TylerDev888/CodeDesignerAI/actions/workflows/ci.yml/badge.svg)](https://github.com/TylerDev888/CodeDesignerAI/actions/workflows/ci.yml) +CDS Assembler ![CodeDesigner screenshot](./Screenshot.png) +Disasm +![CodeDesigner screenshot](./Screenshot_2.png) +![CodeDesigner screenshot](./Screenshot_3.png) +![CodeDesigner screenshot](./Screenshot_4.png) + ## Description A MIPS64 (PS2 Emotion Engine) assembler / disassembler with extended pseudo-commands and directives for custom CDS scripts. Used to create custom patches for the playstation 2. Make sure to use github co-pilot with this vs code extension. +## Example CDS script +```asm +/* +This is a test cds script +*/ +address $20694d48 +hexcode $00010000 + +address $20c49788 +hexcode $ffffffff + +address $200c0000 +print "this is a string" +nop +___OnRoomExit: +addiu sp, sp, $FFd0 +sw ra, $0000(sp) +sw s0, $0004(sp) +sw s1, $0008(sp) +sw at, $000C(sp) + +setreg at, $002CED04 +setreg s1, $03e00008 +sw s1, $0000(at) + +setreg at, $000A0000 +sw zero, $0000(at) +sw zero, $0004(at) +sw zero, $0008(at) + +// load pointer +lui s0, $0044 +lw s0, $0c38(s0) +beq s0, zero, :EndOnRoomExit +nop +lw s1, $0010(at) +sw s1, $0014(s0) +lw s1, $000C(at) +sw s1, $0028(s0) + +EndOnRoomExit: +lw ra, $0000(sp) +lw s0, $0004(sp) +lw s1, $0008(sp) +lw at, $000C(sp) +j $00204438 +addiu sp sp, $0030 +``` + +## Planned Enhancements / Future Work + +- **VS Code Disassembler Views** + - Add disassembler-style windows that mirror *PCSX2Dis*, including address, opcode bytes, labels, operations, and annotations. + +- **PCSX2 Integration** + - Native integration with PCSX2 for live memory inspection, breakpoint-style workflows, and runtime code injection. + +- **Cheat Engine Integration** + - Optional interoperability with Cheat Engine for scanning, validation, and memory manipulation workflows. + +- **Expanded Pseudo Syntax** + - Introduce richer, higher-level pseudo-instructions to simplify common patterns and improve readability. + +- **AI / Code Generation Integration** + - Deeper integration with GitHub Copilot and/or a custom LLM for: + - Code generation + - Pattern recognition + - Automatic code discovery and suggestion + +- **Multi-Platform Emulator Support** + - Extend support beyond PCSX2 to additional consoles and emulators as the architecture matures. + ## Projects and READMEs - CLI & tooling - [CodeDesigner.ConsoleApp](CodeDesigner.ConsoleApp/ReadMe.md) — Console front-end / CLI @@ -36,3 +114,7 @@ Each project README contains sections marked with the letters above when applica - Add changelogs or release notes where appropriate. - Prefer small, focused PRs and include test or verification steps in the PR description. +## Branching Strategy + - Define and document a clear Git branching model (e.g., `main`, `dev`, `feature`, `bug`) + - Establish pull request requirements, review expectations, and CI validation rules + diff --git a/Screenshot_2.png b/Screenshot_2.png new file mode 100644 index 0000000..c23ab6c Binary files /dev/null and b/Screenshot_2.png differ diff --git a/Screenshot_3.png b/Screenshot_3.png new file mode 100644 index 0000000..41dc890 Binary files /dev/null and b/Screenshot_3.png differ diff --git a/Screenshot_4.png b/Screenshot_4.png new file mode 100644 index 0000000..3fc756c Binary files /dev/null and b/Screenshot_4.png differ diff --git a/vscode/cds-assembler/package-lock.json b/vscode/cds-assembler/package-lock.json index d4f1864..7816c07 100644 --- a/vscode/cds-assembler/package-lock.json +++ b/vscode/cds-assembler/package-lock.json @@ -14,7 +14,7 @@ "typescript": "^5.1.3" }, "engines": { - "vscode": "^1.70.0" + "vscode": "^1.107.0" } }, "node_modules/@types/node": { diff --git a/vscode/cds-assembler/package.json b/vscode/cds-assembler/package.json index c362a76..cb11171 100644 --- a/vscode/cds-assembler/package.json +++ b/vscode/cds-assembler/package.json @@ -3,7 +3,7 @@ "displayName": "CDS Assembler", "description": "CDS Assembler sidebar panel with custom commands", "version": "0.0.1", - "publisher": "antix-fatality", + "publisher": "tylerdev888", "engines": { "vscode": "^1.107.0" }, diff --git a/vscode/cds-assembler/src/extension.ts b/vscode/cds-assembler/src/extension.ts index dd2e6a2..3c05280 100644 --- a/vscode/cds-assembler/src/extension.ts +++ b/vscode/cds-assembler/src/extension.ts @@ -55,6 +55,14 @@ class CDSAssemblerPanelProvider implements vscode.WebviewViewProvider { }); } + private getWorkspaceRoot(): string | null { + const folders = vscode.workspace.workspaceFolders; + if (!folders || folders.length === 0) { + return null; + } + return folders[0].uri.fsPath; + } + private runCds(option: string) { const editor = vscode.window.activeTextEditor; @@ -73,6 +81,7 @@ class CDSAssemblerPanelProvider implements vscode.WebviewViewProvider { outputChannel.clear(); outputChannel.show(true); outputChannel.appendLine(`> ${command}\n`); + //outputChannel.appendLine(this.getWorkspaceRoot() ?? 'No workspace root'); exec(command, (error, stdout, stderr) => { diff --git a/vscode/cds-assembler/tsconfig.json b/vscode/cds-assembler/tsconfig.json index 6c9a9b5..ab7159e 100644 --- a/vscode/cds-assembler/tsconfig.json +++ b/vscode/cds-assembler/tsconfig.json @@ -6,7 +6,9 @@ "lib": ["ES2020"], "sourceMap": true, "rootDir": "src", - "strict": true + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true }, "exclude": ["node_modules", ".vscode-test"] } diff --git a/vscode/cds-dis/cds-dis/.vscode-test.mjs b/vscode/cds-dis/cds-dis/.vscode-test.mjs new file mode 100644 index 0000000..b62ba25 --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscode-test.mjs @@ -0,0 +1,5 @@ +import { defineConfig } from '@vscode/test-cli'; + +export default defineConfig({ + files: 'out/test/**/*.test.js', +}); diff --git a/vscode/cds-dis/cds-dis/.vscode/extensions.json b/vscode/cds-dis/cds-dis/.vscode/extensions.json new file mode 100644 index 0000000..186459d --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "dbaeumer.vscode-eslint", + "ms-vscode.extension-test-runner" + ] +} diff --git a/vscode/cds-dis/cds-dis/.vscode/launch.json b/vscode/cds-dis/cds-dis/.vscode/launch.json new file mode 100644 index 0000000..8880465 --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscode/launch.json @@ -0,0 +1,21 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/out/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + } + ] +} diff --git a/vscode/cds-dis/cds-dis/.vscode/settings.json b/vscode/cds-dis/cds-dis/.vscode/settings.json new file mode 100644 index 0000000..afdab66 --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscode/settings.json @@ -0,0 +1,11 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": false // set this to true to hide the "out" folder with the compiled JS files + }, + "search.exclude": { + "out": true // set this to false to include "out" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" +} diff --git a/vscode/cds-dis/cds-dis/.vscode/tasks.json b/vscode/cds-dis/cds-dis/.vscode/tasks.json new file mode 100644 index 0000000..3b17e53 --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscode/tasks.json @@ -0,0 +1,20 @@ +// See https://go.microsoft.com/fwlink/?LinkId=733558 +// for the documentation about the tasks.json format +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/vscode/cds-dis/cds-dis/.vscodeignore b/vscode/cds-dis/cds-dis/.vscodeignore new file mode 100644 index 0000000..7d3e5c7 --- /dev/null +++ b/vscode/cds-dis/cds-dis/.vscodeignore @@ -0,0 +1,11 @@ +.vscode/** +.vscode-test/** +src/** +.gitignore +.yarnrc +vsc-extension-quickstart.md +**/tsconfig.json +**/eslint.config.mjs +**/*.map +**/*.ts +**/.vscode-test.* diff --git a/vscode/cds-dis/cds-dis/CHANGELOG.md b/vscode/cds-dis/cds-dis/CHANGELOG.md new file mode 100644 index 0000000..4153e0b --- /dev/null +++ b/vscode/cds-dis/cds-dis/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +All notable changes to the "cds-dis" extension will be documented in this file. + +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## [Unreleased] + +- Initial release \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/README.md b/vscode/cds-dis/cds-dis/README.md new file mode 100644 index 0000000..58afdb0 --- /dev/null +++ b/vscode/cds-dis/cds-dis/README.md @@ -0,0 +1,71 @@ +# cds-dis README + +This is the README for your extension "cds-dis". After writing up a brief description, we recommend including the following sections. + +## Features + +Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file. + +For example if there is an image subfolder under your extension project workspace: + +\!\[feature X\]\(images/feature-x.png\) + +> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow. + +## Requirements + +If you have any requirements or dependencies, add a section describing those and how to install and configure them. + +## Extension Settings + +Include if your extension adds any VS Code settings through the `contributes.configuration` extension point. + +For example: + +This extension contributes the following settings: + +* `myExtension.enable`: Enable/disable this extension. +* `myExtension.thing`: Set to `blah` to do something. + +## Known Issues + +Calling out known issues can help limit users opening duplicate issues against your extension. + +## Release Notes + +Users appreciate release notes as you update your extension. + +### 1.0.0 + +Initial release of ... + +### 1.0.1 + +Fixed issue #. + +### 1.1.0 + +Added features X, Y, and Z. + +--- + +## Following extension guidelines + +Ensure that you've read through the extensions guidelines and follow the best practices for creating your extension. + +* [Extension Guidelines](https://code.visualstudio.com/api/references/extension-guidelines) + +## Working with Markdown + +You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts: + +* Split the editor (`Cmd+\` on macOS or `Ctrl+\` on Windows and Linux). +* Toggle preview (`Shift+Cmd+V` on macOS or `Shift+Ctrl+V` on Windows and Linux). +* Press `Ctrl+Space` (Windows, Linux, macOS) to see a list of Markdown snippets. + +## For more information + +* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown) +* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/) + +**Enjoy!** diff --git a/vscode/cds-dis/cds-dis/eslint.config.mjs b/vscode/cds-dis/cds-dis/eslint.config.mjs new file mode 100644 index 0000000..7c51b0c --- /dev/null +++ b/vscode/cds-dis/cds-dis/eslint.config.mjs @@ -0,0 +1,27 @@ +import typescriptEslint from "typescript-eslint"; + +export default [{ + files: ["**/*.ts"], +}, { + plugins: { + "@typescript-eslint": typescriptEslint.plugin, + }, + + languageOptions: { + parser: typescriptEslint.parser, + ecmaVersion: 2022, + sourceType: "module", + }, + + rules: { + "@typescript-eslint/naming-convention": ["warn", { + selector: "import", + format: ["camelCase", "PascalCase"], + }], + + curly: "warn", + eqeqeq: "warn", + "no-throw-literal": "warn", + semi: "warn", + }, +}]; \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/language-configuration.json b/vscode/cds-dis/cds-dis/language-configuration.json new file mode 100644 index 0000000..b9f454d --- /dev/null +++ b/vscode/cds-dis/cds-dis/language-configuration.json @@ -0,0 +1,8 @@ +{ + "comments": { + "lineComment": ";" + }, + "brackets": [], + "autoClosingPairs": [], + "surroundingPairs": [] +} \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/BaseProviders/BaseEditorProvider.js b/vscode/cds-dis/cds-dis/out/BaseProviders/BaseEditorProvider.js new file mode 100644 index 0000000..6696c27 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/BaseProviders/BaseEditorProvider.js @@ -0,0 +1,71 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BaseEditorProvider = void 0; +const fs = __importStar(require("fs")); +const path = __importStar(require("path")); +const helpers_1 = require("../helpers"); +// Base class with reusable webview logic +class BaseEditorProvider { + htmlFileName; + providerName; + constructor(htmlFileName, providerName) { + this.htmlFileName = htmlFileName; + this.providerName = providerName; + } // HTML file provided by child + async openCustomDocument(uri) { + return { uri, dispose() { } }; + } + loadHtml(webview) { + // Compute the provider folder name by stripping "Provider" from the class name + const providerFolder = this.providerName; + // Path to compiled JS output + provider folder + const htmlPath = path.join(__dirname, '..', providerFolder, this.htmlFileName); + let html = fs.readFileSync(htmlPath, 'utf8'); + const nonce = (0, helpers_1.getNonce)(); + html = html.replace(' + + \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js b/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js new file mode 100644 index 0000000..4385eea --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js @@ -0,0 +1,62 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DisasmEditorProvider = void 0; +const fs = __importStar(require("fs")); +const helpers_1 = require("../helpers"); +const BaseEditorProvider_1 = require("../BaseProvider/BaseEditorProvider"); +class DisasmEditorProvider extends BaseEditorProvider_1.BaseEditorProvider { + constructor() { + super('DisasmEditorProvider.html', "DisasmEditor"); + } + async onDidResolveWebview(webviewPanel, document) { + fs.readFile(document.uri.fsPath, (err, data) => { + if (err) { + webviewPanel.webview.postMessage({ + type: 'error', + message: err.message + }); + return; + } + const rows = (0, helpers_1.disassemble)(data); + webviewPanel.webview.postMessage({ + type: 'disasm', + rows + }); + }); + } +} +exports.DisasmEditorProvider = DisasmEditorProvider; +//# sourceMappingURL=DisasmEditorProvider.js.map \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js.map b/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js.map new file mode 100644 index 0000000..49b0e6a --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/DisasmEditor/DisasmEditorProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DisasmEditorProvider.js","sourceRoot":"","sources":["../../src/disasmEditor/DisasmEditorProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAAyB;AAEzB,wCAAmD;AACnD,2EAAwE;AAGxE,MAAa,oBAAqB,SAAQ,uCAAkB;IACxD;QACI,KAAK,CAAC,2BAA2B,EAAE,cAAc,CAAC,CAAC;IACvD,CAAC;IAES,KAAK,CAAC,mBAAmB,CAC/B,YAAiC,EACjC,QAA+B;QAE/B,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;YAC3C,IAAI,GAAG,EAAE,CAAC;gBACN,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;oBAC7B,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,GAAG,CAAC,OAAO;iBACvB,CAAC,CAAC;gBACH,OAAO;YACX,CAAC;YAED,MAAM,IAAI,GAAG,IAAA,qBAAW,EAAC,IAAI,CAAC,CAAC;YAC/B,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC7B,IAAI,EAAE,QAAQ;gBACd,IAAI;aACP,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAzBD,oDAyBC"} \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.html b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.html new file mode 100644 index 0000000..ea1a74d --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.html @@ -0,0 +1,14 @@ + + + +

Disasm Panel Loaded

+ + + + + \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js new file mode 100644 index 0000000..6d18920 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js @@ -0,0 +1,53 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DisasmPanelProvider = void 0; +const vscode = __importStar(require("vscode")); +const BasePanelProvider_1 = require("../BaseProvider/BasePanelProvider"); +class DisasmPanelProvider extends BasePanelProvider_1.BasePanelProvider { + constructor() { + super('disasmPanel', 'DisasmPanelProvider.html', "DisasmPanel"); // HTML file + } + onDidResolveWebviewView(webviewView) { + // Listen to messages from the webview + webviewView.webview.onDidReceiveMessage(msg => { + if (msg.command === 'connect') { + vscode.window.showInformationMessage('Panel works!'); + } + }); + } +} +exports.DisasmPanelProvider = DisasmPanelProvider; +//# sourceMappingURL=DisasmPanelProvider.js.map \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js.map b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js.map new file mode 100644 index 0000000..21a3739 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/DisasmPanel/DisasmPanelProvider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"DisasmPanelProvider.js","sourceRoot":"","sources":["../../src/disasmPanel/DisasmPanelProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,yEAAsE;AAEtE,MAAa,mBAAoB,SAAQ,qCAAiB;IACtD;QACI,KAAK,CAAC,aAAa,EAAE,0BAA0B,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY;IACjF,CAAC;IAES,uBAAuB,CAAC,WAA+B;QAC7D,sCAAsC;QACtC,WAAW,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE;YAC1C,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;YACzD,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAbD,kDAaC"} \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/analyzer.js b/vscode/cds-dis/cds-dis/out/analyzer.js new file mode 100644 index 0000000..21ec936 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/analyzer.js @@ -0,0 +1,903 @@ +"use strict"; +/** + * MIPS Disassembler and Analyzer + * Provides comprehensive analysis including function detection, cross-references, and register tracking + */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getNonce = getNonce; +exports.formatBytes = formatBytes; +exports.disassemble = disassemble; +/** + * Analysis context for tracking state across instructions + */ +class AnalysisContext { + functions = new Map(); + xrefs = new Map(); // target -> [sources] + labels = new Map(); + registers = Array(32).fill(null).map(() => ({})); + /** + * Add a cross-reference from source to target + */ + addXref(source, target) { + if (!this.xrefs.has(target)) { + this.xrefs.set(target, []); + } + this.xrefs.get(target).push(source); + } + /** + * Register a function at the given address + */ + registerFunction(addr, name) { + if (!this.functions.has(addr)) { + this.functions.set(addr, { + startAddr: addr, + name: name || `func_${addr.toString(16).padStart(8, '0')}`, + calls: [], + calledFrom: [] + }); + } + } + /** + * Add a function call relationship + */ + addFunctionCall(from, to) { + const fromFunc = this.findFunction(from); + const toFunc = this.findFunction(to); + if (fromFunc && toFunc) { + if (!fromFunc.calls.includes(to)) { + fromFunc.calls.push(to); + } + if (!toFunc.calledFrom.includes(from)) { + toFunc.calledFrom.push(from); + } + } + } + /** + * Find which function contains the given address + */ + findFunction(addr) { + for (const func of this.functions.values()) { + if (addr >= func.startAddr && (!func.endAddr || addr < func.endAddr)) { + return func; + } + } + return undefined; + } +} +/** + * Generate a nonce for webview security + */ +function getNonce() { + let text = ""; + const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + for (let i = 0; i < 32; i++) { + text += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return text; +} +/** + * Format a buffer as hex bytes (little-endian display) + */ +function formatBytes(bytes) { + return [...bytes] + .reverse() + .map((b) => b.toString(16).padStart(2, "0")) + .join(" "); +} +/** + * Main disassembly function with comprehensive analysis + * @param startAddr - Virtual address where disassembly begins + * @param buffer - Binary data to disassemble + * @returns Array of disassembled instructions with analysis + */ +function disassemble(startAddr, buffer) { + const rows = []; + const context = new AnalysisContext(); + // First pass: Disassemble and identify functions/branches + for (let offset = 0; offset < buffer.length; offset += 4) { + const slice = buffer.slice(offset, offset + 4); + if (slice.length < 4) + break; + const currentAddr = startAddr + offset; + const instr = slice.readUInt32LE(0); + // Detect function entry points (common patterns) + if (offset === 0 || isFunctionEntry(instr, buffer, offset)) { + context.registerFunction(currentAddr); + } + // Analyze instruction for branches/calls + analyzeInstruction(instr, currentAddr, context); + } + // Second pass: Generate disassembly with analysis + for (let offset = 0; offset < buffer.length; offset += 4) { + const slice = buffer.slice(offset, offset + 4); + if (slice.length < 4) + break; + const bytesLE = Array.from(slice) + .reverse() + .map(b => b.toString(16).padStart(2, '0').toUpperCase()) + .join(' '); + const instr = slice.readUInt32LE(0); + const currentAddr = startAddr + offset; + const decoded = decodeMIPS(instr, currentAddr, context); + if (decoded) { + // Add cross-references + const xrefs = context.xrefs.get(currentAddr); + const xrefComment = xrefs ? `; XREF: ${xrefs.map(x => `$${x.toString(16).padStart(8, '0')}`).join(', ')}` : ''; + rows.push({ + addr: currentAddr.toString(16).toUpperCase().padStart(8, "0"), + bytes: bytesLE, + label: context.labels.get(currentAddr) || decoded.label || "", + op: decoded.op, + args: decoded.args, + comment: [decoded.comment, xrefComment].filter(Boolean).join(' '), + xrefs: xrefs?.map(x => x.toString(16).padStart(8, '0')) + }); + } + } + console.log('Disassembled', rows.length, 'instructions'); + console.log('Detected', context.functions.size, 'functions'); + return rows; +} +/** + * Detect if instruction is likely a function entry point + */ +function isFunctionEntry(instr, buffer, offset) { + const opcode = (instr >> 26) & 0x3f; + const rt = (instr >> 16) & 0x1f; + const rs = (instr >> 21) & 0x1f; + const imm = instr & 0xffff; + const signedImm = imm & 0x8000 ? imm | 0xffff0000 : imm; + // Common function prologue: addiu sp, sp, -X (stack allocation) + if (opcode === 0x09 && rt === 29 && rs === 29 && signedImm < 0) { + return true; + } + // Check if previous instruction was a JAL (function was called) + if (offset >= 4) { + const prevInstr = buffer.readUInt32LE(offset - 4); + const prevOpcode = (prevInstr >> 26) & 0x3f; + if (prevOpcode === 0x03) { // JAL + return true; + } + } + return false; +} +/** + * Analyze instruction for branches, calls, and data flow + */ +function analyzeInstruction(instr, pc, context) { + const opcode = (instr >> 26) & 0x3f; + const rs = (instr >> 21) & 0x1f; + const rt = (instr >> 16) & 0x1f; + const imm = instr & 0xffff; + const signedImm = imm & 0x8000 ? imm | 0xffff0000 : imm; + const target = instr & 0x3ffffff; + const funct = instr & 0x3f; + // JAL - Function call + if (opcode === 0x03) { + const targetAddr = (pc & 0xf0000000) | (target << 2); + context.addXref(pc, targetAddr); + context.registerFunction(targetAddr); + context.addFunctionCall(pc, targetAddr); + } + // JALR - Indirect function call + if (opcode === 0x00 && funct === 0x09) { + // Register-based call, harder to analyze statically + } + // Branch instructions - add cross-references + if (opcode >= 0x04 && opcode <= 0x07 || opcode >= 0x14 && opcode <= 0x17) { + const targetAddr = pc + 4 + (signedImm << 2); + context.addXref(pc, targetAddr); + } + // REGIMM branches + if (opcode === 0x01) { + const targetAddr = pc + 4 + (signedImm << 2); + context.addXref(pc, targetAddr); + } + // Track register values for pointer analysis + // LUI - Load upper immediate (often used for address loading) + if (opcode === 0x0f) { + context.registers[rt].value = imm << 16; + context.registers[rt].source = `lui $${imm.toString(16)}`; + } + // ORI/ADDIU - Complete address loading + if ((opcode === 0x0d || opcode === 0x09) && context.registers[rs].value !== undefined) { + context.registers[rt].value = (context.registers[rs].value + signedImm) >>> 0; + context.registers[rt].isPointer = true; + } +} +/** + * Decode a single MIPS instruction + * @param instr - 32-bit instruction word + * @param pc - Program counter (current address) + * @param context - Analysis context for labels and cross-references + * @returns Decoded instruction or null + */ +function decodeMIPS(instr, pc, context) { + const opcode = (instr >> 26) & 0x3f; + const rs = (instr >> 21) & 0x1f; + const rt = (instr >> 16) & 0x1f; + const rd = (instr >> 11) & 0x1f; + const sa = (instr >> 6) & 0x1f; + const funct = instr & 0x3f; + const imm = instr & 0xffff; + const signedImm = imm & 0x8000 ? imm | 0xffff0000 : imm; + const target = instr & 0x3ffffff; + const code = (instr >> 6) & 0xfffff; + // Register name lookup + const reg = (r) => { + const names = [ + "zero", "at", "v0", "v1", "a0", "a1", "a2", "a3", + "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", + "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", + "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra", + ]; + return names[r]; + }; + const freg = (r) => `f${r}`; + // Format signed immediate with 4-digit hex padding + const formatImm = (val) => { + const hex = (val & 0xffff).toString(16).toUpperCase().padStart(4, '0'); + return `$${hex}`; + }; + // Format branch with target address and instruction count + const formatBranch = (targetAddr, offset) => { + const addrHex = (targetAddr >>> 0).toString(16).toUpperCase().padStart(8, '0'); + const instrCount = offset / 4; + const sign = instrCount >= 0 ? '+' : ''; + const arrow = instrCount >= 0 ? '▼' : '▲'; + // Add label if function exists at target + const func = context.functions.get(targetAddr); + const label = func ? ` ; ${func.name}` : ''; + return `$${addrHex} (${sign}${instrCount}${arrow})${label}`; + }; + // Format jump target address + const formatAddr = (addr) => { + const hex = (addr >>> 0).toString(16).toUpperCase().padStart(8, '0'); + const func = context.functions.get(addr); + const label = func ? ` ; ${func.name}` : ''; + return `$${hex}${label}`; + }; + // Generate analysis comments + let comment = ""; + if (instr === 0) { + return { op: "nop", args: "", comment: "; no operation" }; + } + // SPECIAL opcode (0x00) + if (opcode === 0x00) { + switch (funct) { + case 0x00: + return sa === 0 ? { op: "nop", args: "", comment } : { op: "sll", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x02: + return { op: "srl", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x03: + return { op: "sra", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x04: + return { op: "sllv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x06: + return { op: "srlv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x07: + return { op: "srav", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x08: + comment = rd === 31 ? "; return from function" : ""; + return { op: "jr", args: reg(rs), comment }; + case 0x09: + comment = "; call via register"; + return rd === 31 ? { op: "jalr", args: reg(rs), comment } : { op: "jalr", args: `${reg(rd)}, ${reg(rs)}`, comment }; + case 0x0a: + return { op: "movz", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0b: + return { op: "movn", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0c: + return { op: "syscall", args: code > 0 ? `${code}` : "", comment: "; system call" }; + case 0x0d: + return { op: "break", args: code > 0 ? `${code}` : "", comment: "; breakpoint" }; + case 0x0f: + return { op: "sync", args: sa > 0 ? `${sa}` : "", comment }; + case 0x10: + return { op: "mfhi", args: reg(rd), comment: "; move from HI" }; + case 0x11: + return { op: "mthi", args: reg(rs), comment: "; move to HI" }; + case 0x12: + return { op: "mflo", args: reg(rd), comment: "; move from LO" }; + case 0x13: + return { op: "mtlo", args: reg(rs), comment: "; move to LO" }; + case 0x14: + return { op: "dsllv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x16: + return { op: "dsrlv", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x17: + return { op: "dsrav", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x18: + return rd === 0 ? { op: "mult", args: `${reg(rs)}, ${reg(rt)}`, comment } : { op: "mult", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x19: + return rd === 0 ? { op: "multu", args: `${reg(rs)}, ${reg(rt)}`, comment } : { op: "multu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1a: + return { op: "div", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1b: + return { op: "divu", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1c: + return { op: "dmult", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1d: + return { op: "dmultu", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1e: + return { op: "ddiv", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1f: + return { op: "ddivu", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x20: + return { op: "add", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x21: + return { op: "addu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x22: + return { op: "sub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x23: + return { op: "subu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x24: + return { op: "and", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x25: + return { op: "or", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x26: + return { op: "xor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x27: + return { op: "nor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x28: + return { op: "mfsa", args: reg(rd), comment }; + case 0x29: + return { op: "mtsa", args: reg(rs), comment }; + case 0x2a: + return { op: "slt", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment: "; set if less than" }; + case 0x2b: + return { op: "sltu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment: "; set if less than unsigned" }; + case 0x2c: + return { op: "dadd", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x2d: + return { op: "daddu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x2e: + return { op: "dsub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x2f: + return { op: "dsubu", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x30: + return { op: "tge", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x31: + return { op: "tgeu", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x32: + return { op: "tlt", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x33: + return { op: "tltu", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x34: + return { op: "teq", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x36: + return { op: "tne", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x38: + return { op: "dsll", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3a: + return { op: "dsrl", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3b: + return { op: "dsra", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3c: + return { op: "dsll32", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3e: + return { op: "dsrl32", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3f: + return { op: "dsra32", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + } + } + // REGIMM opcode (0x01) - Branch instructions + if (opcode === 0x01) { + switch (rt) { + case 0x00: + return { op: "bltz", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x01: + return { op: "bgez", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x02: + return { op: "bltzl", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x03: + return { op: "bgezl", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x08: + return { op: "tgei", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x09: + return { op: "tgeiu", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x0a: + return { op: "tlti", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x0b: + return { op: "tltiu", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x0c: + return { op: "teqi", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x0e: + return { op: "tnei", args: `${reg(rs)}, ${formatImm(signedImm)}`, comment }; + case 0x10: + return { op: "bltzal", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment: "; branch and link" }; + case 0x11: + return { op: "bgezal", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment: "; branch and link" }; + case 0x12: + return { op: "bltzall", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x13: + return { op: "bgezall", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + case 0x18: + return { op: "mtsab", args: `${reg(rs)}, ${formatImm(imm)}`, comment }; + case 0x19: + return { op: "mtsah", args: `${reg(rs)}, ${formatImm(imm)}`, comment }; + } + } + // J and JAL (0x02, 0x03) - Jump instructions + if (opcode === 0x02) { + return { op: "j", args: formatAddr((pc & 0xf0000000) | (target << 2)), comment }; + } + if (opcode === 0x03) { + comment = "; call function"; + return { op: "jal", args: formatAddr((pc & 0xf0000000) | (target << 2)), comment }; + } + // Branch instructions (0x04-0x07, 0x14-0x17) + if (opcode === 0x04) + return { op: "beq", args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x05) + return { op: "bne", args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x06) + return { op: "blez", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x07) + return { op: "bgtz", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x14) + return { op: "beql", args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x15) + return { op: "bnel", args: `${reg(rs)}, ${reg(rt)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x16) + return { op: "blezl", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + if (opcode === 0x17) + return { op: "bgtzl", args: `${reg(rs)}, ${formatBranch(pc + 4 + (signedImm << 2), signedImm << 2)}`, comment }; + // Immediate arithmetic/logical (0x08-0x0f, 0x18-0x19) + if (opcode === 0x08) { + comment = rs === 29 && signedImm < 0 ? "; allocate stack frame" : ""; + return { op: "addi", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, comment }; + } + if (opcode === 0x09) { + comment = rs === 29 && signedImm < 0 ? "; allocate stack frame" : rs === 29 && signedImm > 0 ? "; deallocate stack frame" : ""; + return { op: "addiu", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, comment }; + } + if (opcode === 0x0a) + return { op: "slti", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, comment }; + if (opcode === 0x0b) + return { op: "sltiu", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}`, comment }; + if (opcode === 0x0c) + return { op: "andi", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}`, comment }; + if (opcode === 0x0d) + return { op: "ori", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}`, comment }; + if (opcode === 0x0e) + return { op: "xori", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(imm)}`, comment }; + if (opcode === 0x0f) { + comment = "; load upper immediate"; + return { op: "lui", args: `${reg(rt)}, ${formatImm(imm)}`, comment }; + } + if (opcode === 0x18) + return { op: "daddi", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, comment }; + if (opcode === 0x19) + return { op: "daddiu", args: `${reg(rt)}, ${reg(rs)}, ${formatImm(signedImm)}`, comment }; + // Load instructions (0x1a-0x1b, 0x20-0x27, 0x37) + if (opcode === 0x1a) + return { op: "ldl", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x1b) + return { op: "ldr", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x20) + return { op: "lb", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load byte" }; + if (opcode === 0x21) + return { op: "lh", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load halfword" }; + if (opcode === 0x22) + return { op: "lwl", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x23) + return { op: "lw", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load word" }; + if (opcode === 0x24) + return { op: "lbu", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load byte unsigned" }; + if (opcode === 0x25) + return { op: "lhu", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load halfword unsigned" }; + if (opcode === 0x26) + return { op: "lwr", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x27) + return { op: "lwu", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x37) + return { op: "ld", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load doubleword" }; + // Store instructions (0x28-0x2f, 0x3f) + if (opcode === 0x28) + return { op: "sb", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; store byte" }; + if (opcode === 0x29) + return { op: "sh", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; store halfword" }; + if (opcode === 0x2a) + return { op: "swl", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x2b) + return { op: "sw", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; store word" }; + if (opcode === 0x2c) + return { op: "sdl", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x2d) + return { op: "sdr", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x2e) + return { op: "swr", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x2f) + return { op: "cache", args: `${rt}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x33) + return { op: "pref", args: `${rt}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x3f) + return { op: "sd", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; store doubleword" }; + // Quadword loads/stores (PS2 specific - 128-bit) + if (opcode === 0x1e) + return { op: "lq", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; load quadword" }; + if (opcode === 0x1f) + return { op: "sq", args: `${reg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment: "; store quadword" }; + // Floating point loads/stores + if (opcode === 0x31) + return { op: "lwc1", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x35) + return { op: "ldc1", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x36) + return { op: "lqc2", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x39) + return { op: "swc1", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x3d) + return { op: "sdc1", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + if (opcode === 0x3e) + return { op: "sqc2", args: `${freg(rt)}, ${formatImm(signedImm)}(${reg(rs)})`, comment }; + // MMI opcode (0x1C) - PS2 specific multimedia instructions + if (opcode === 0x1c) { + const mmiFunc = funct & 0x3f; + const mmiFmt = (instr >> 6) & 0x1f; + switch (mmiFunc) { + case 0x00: + return { op: "madd", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x01: + return { op: "maddu", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x04: + return { op: "plzcw", args: `${reg(rd)}, ${reg(rs)}`, comment }; + case 0x08: + switch (mmiFmt) { + case 0x00: return { op: "paddw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x01: return { op: "psubw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x02: return { op: "pcgtw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x03: return { op: "pmaxw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x04: return { op: "paddh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x05: return { op: "psubh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x06: return { op: "pcgth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x07: return { op: "pmaxh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x08: return { op: "paddb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x09: return { op: "psubb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0a: return { op: "pcgtb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x10: return { op: "paddsw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x11: return { op: "psubsw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x12: return { op: "pextlw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x13: return { op: "ppacw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x14: return { op: "paddsh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x15: return { op: "psubsh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x16: return { op: "pextlh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x17: return { op: "ppach", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x18: return { op: "paddsb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x19: return { op: "psubsb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1a: return { op: "pextlb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1b: return { op: "ppacb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1e: return { op: "pext5", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x1f: return { op: "ppac5", args: `${reg(rd)}, ${reg(rt)}`, comment }; + } + break; + case 0x09: + switch (mmiFmt) { + case 0x00: return { op: "pmaddw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x01: return { op: "pmsubw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x02: return { op: "psllvw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x03: return { op: "psrlvw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x04: return { op: "pmfhi", args: reg(rd), comment }; + case 0x05: return { op: "pmflo", args: reg(rd), comment }; + case 0x06: return { op: "pinth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x08: return { op: "pmultw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x09: return { op: "pdivw", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0a: return { op: "pcpyld", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0c: return { op: "pmaddh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0d: return { op: "phmadh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0e: return { op: "pand", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0f: return { op: "pxor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x10: return { op: "pmsubh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x11: return { op: "phmsbh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x12: return { op: "pexeh", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x13: return { op: "prevh", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x14: return { op: "pmulth", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x15: return { op: "pdivbw", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x16: return { op: "pexew", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x17: return { op: "prot3w", args: `${reg(rd)}, ${reg(rt)}`, comment }; + } + break; + case 0x10: return { op: "mfhi1", args: reg(rd), comment }; + case 0x11: return { op: "mthi1", args: reg(rs), comment }; + case 0x12: return { op: "mflo1", args: reg(rd), comment }; + case 0x13: return { op: "mtlo1", args: reg(rs), comment }; + case 0x18: + return { op: "mult1", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x19: + return { op: "multu1", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1a: return { op: "div1", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1b: return { op: "divu1", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x20: + return { op: "madd1", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x21: + return { op: "maddu1", args: rd === 0 ? `${reg(rs)}, ${reg(rt)}` : `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x28: + switch (mmiFmt) { + case 0x00: return { op: "pmadduw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x02: return { op: "psravw", args: `${reg(rd)}, ${reg(rt)}, ${reg(rs)}`, comment }; + case 0x03: return { op: "pmthi", args: reg(rs), comment }; + case 0x04: return { op: "pmtlo", args: reg(rs), comment }; + case 0x05: return { op: "pinteh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x08: return { op: "pmultuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x09: return { op: "pdivuw", args: `${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0a: return { op: "pcpyud", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0e: return { op: "por", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0f: return { op: "pnor", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x12: return { op: "pexch", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x13: return { op: "pcpyh", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x16: return { op: "pexcw", args: `${reg(rd)}, ${reg(rt)}`, comment }; + } + break; + case 0x29: + switch (mmiFmt) { + case 0x00: return { op: "psubuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x01: return { op: "pextuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x02: return { op: "pceqw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x03: return { op: "pminw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x04: return { op: "padsbh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x05: return { op: "psubuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x06: return { op: "pceqh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x07: return { op: "pminh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x0a: return { op: "pceqb", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x10: return { op: "padduw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x11: return { op: "pextuw", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x14: return { op: "padduh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x15: return { op: "psubuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x16: return { op: "pextuh", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x18: return { op: "paddub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x19: return { op: "psubub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1a: return { op: "pextub", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1b: return { op: "qfsrv", args: `${reg(rd)}, ${reg(rs)}, ${reg(rt)}`, comment }; + case 0x1d: return { op: "pabsw", args: `${reg(rd)}, ${reg(rt)}`, comment }; + case 0x1e: return { op: "pabsh", args: `${reg(rd)}, ${reg(rt)}`, comment }; + } + break; + case 0x30: + const fmt = mmiFmt & 0x1f; + switch (fmt) { + case 0x00: return { op: "pmfhl.lw", args: reg(rd), comment }; + case 0x01: return { op: "pmfhl.uw", args: reg(rd), comment }; + case 0x02: return { op: "pmfhl.slw", args: reg(rd), comment }; + case 0x03: return { op: "pmfhl.lh", args: reg(rd), comment }; + case 0x04: return { op: "pmfhl.sh", args: reg(rd), comment }; + } + break; + case 0x31: + if (mmiFmt === 0x00) + return { op: "pmthl.lw", args: reg(rs), comment }; + break; + case 0x34: return { op: "psllh", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x36: return { op: "psrlh", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x37: return { op: "psrah", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3c: return { op: "psllw", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3e: return { op: "psrlw", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + case 0x3f: return { op: "psraw", args: `${reg(rd)}, ${reg(rt)}, ${sa}`, comment }; + } + } + // COP0 opcode (0x10) - Coprocessor 0 (System Control) + if (opcode === 0x10) { + const cop0Func = rs; + if (cop0Func === 0x00) + return { op: "mfc0", args: `${reg(rt)}, $${rd}`, comment: "; move from CP0" }; + if (cop0Func === 0x04) + return { op: "mtc0", args: `${reg(rt)}, $${rd}`, comment: "; move to CP0" }; + if (cop0Func === 0x08) { + const bc0 = rt; + if (bc0 === 0x00) + return { op: "bc0f", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc0 === 0x01) + return { op: "bc0t", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc0 === 0x02) + return { op: "bc0fl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc0 === 0x03) + return { op: "bc0tl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + } + if (cop0Func === 0x10) { + if (funct === 0x01) + return { op: "tlbr", args: "", comment }; + if (funct === 0x02) + return { op: "tlbwi", args: "", comment }; + if (funct === 0x06) + return { op: "tlbwr", args: "", comment }; + if (funct === 0x08) + return { op: "tlbp", args: "", comment }; + if (funct === 0x18) + return { op: "eret", args: "", comment: "; exception return" }; + if (funct === 0x38) + return { op: "ei", args: "", comment: "; enable interrupts" }; + if (funct === 0x39) + return { op: "di", args: "", comment: "; disable interrupts" }; + } + } + // COP1 (FPU) opcode (0x11) - Floating Point Unit + if (opcode === 0x11) { + const cop1Func = rs; + if (cop1Func === 0x00) + return { op: "mfc1", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop1Func === 0x02) + return { op: "cfc1", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop1Func === 0x04) + return { op: "mtc1", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop1Func === 0x06) + return { op: "ctc1", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop1Func === 0x08) { + const bc1 = rt; + if (bc1 === 0x00) + return { op: "bc1f", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc1 === 0x01) + return { op: "bc1t", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc1 === 0x02) + return { op: "bc1fl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc1 === 0x03) + return { op: "bc1tl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + } + if (cop1Func === 0x10) { + // S format (single precision) + switch (funct) { + case 0x00: return { op: "add.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x01: return { op: "sub.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x02: return { op: "mul.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x03: return { op: "div.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x04: return { op: "sqrt.s", args: `${freg(sa)}, ${freg(rt)}`, comment }; + case 0x05: return { op: "abs.s", args: `${freg(sa)}, ${freg(rd)}`, comment }; + case 0x06: return { op: "mov.s", args: `${freg(sa)}, ${freg(rd)}`, comment }; + case 0x07: return { op: "neg.s", args: `${freg(sa)}, ${freg(rd)}`, comment }; + case 0x16: return { op: "rsqrt.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x18: return { op: "adda.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x19: return { op: "suba.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x1a: return { op: "mula.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x1c: return { op: "madd.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x1d: return { op: "msub.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x1e: return { op: "madda.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x1f: return { op: "msuba.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x24: return { op: "cvt.w.s", args: `${freg(sa)}, ${freg(rd)}`, comment }; + case 0x28: return { op: "max.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x29: return { op: "min.s", args: `${freg(sa)}, ${freg(rd)}, ${freg(rt)}`, comment }; + case 0x30: return { op: "c.f.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x32: return { op: "c.eq.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x34: return { op: "c.lt.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + case 0x36: return { op: "c.le.s", args: `${freg(rd)}, ${freg(rt)}`, comment }; + } + } + if (cop1Func === 0x14) { + // W format (word fixed point) + if (funct === 0x20) + return { op: "cvt.s.w", args: `${freg(sa)}, ${freg(rd)}`, comment }; + } + } + // COP2 (VU0) opcode (0x12) - PS2 Vector Unit + if (opcode === 0x12) { + const cop2Func = rs; + if (cop2Func === 0x01) + return { op: "qmfc2", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop2Func === 0x02) + return { op: "cfc2", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop2Func === 0x05) + return { op: "qmtc2", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop2Func === 0x06) + return { op: "ctc2", args: `${reg(rt)}, ${freg(rd)}`, comment }; + if (cop2Func === 0x08) { + const bc2 = rt; + if (bc2 === 0x00) + return { op: "bc2f", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc2 === 0x01) + return { op: "bc2t", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc2 === 0x02) + return { op: "bc2fl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + if (bc2 === 0x03) + return { op: "bc2tl", args: formatBranch(pc + 4 + (signedImm << 2), signedImm << 2), comment }; + } + // VU0 macro mode instructions (COP2 special functions) + if ((cop2Func & 0x10) === 0x10) { + const vuFunc = funct & 0x3f; + const dest = (instr >> 21) & 0xf; // destination mask (xyzw) + const ft = (instr >> 16) & 0x1f; + const fs = (instr >> 11) & 0x1f; + const fd = (instr >> 6) & 0x1f; + const bc = (instr >> 0) & 0x3; // broadcast field + const vreg = (r) => `vf${r}`; + const vireg = (r) => `vi${r}`; + const destStr = (d) => { + if (d === 0xf) + return ""; + let s = ""; + if (d & 8) + s += "x"; + if (d & 4) + s += "y"; + if (d & 2) + s += "z"; + if (d & 1) + s += "w"; + return s ? `.${s}` : ""; + }; + const bcStr = (b) => ["x", "y", "z", "w"][b]; + // VU0 computational instructions + switch (vuFunc) { + case 0x00: return { op: "vadd", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x01: return { op: "vsub", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x02: return { op: "vmul", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x03: return { op: "vmax", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x04: return { op: "vmin", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x05: return { op: "vmul", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x06: return { op: "vmulq", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x07: return { op: "vmaxi", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x08: return { op: "vaddq", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x09: return { op: "vsubq", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x0a: return { op: "vaddi", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x0b: return { op: "vsubi", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x0c: return { op: "vmini", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x0d: return { op: "vadd", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x0e: return { op: "vsub", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x0f: return { op: "vopmsub", args: `${vreg(fd)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x10: return { op: "vacc", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x11: return { op: "vmsub", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x12: return { op: "vmadd", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x13: return { op: "vmmax", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x14: return { op: "vmmin", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x15: return { op: "vmsub", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x16: return { op: "vmsubq", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x17: return { op: "vmmini", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x18: return { op: "vaddabc", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x19: return { op: "vsubabc", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x1a: return { op: "vmulabc", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x1b: return { op: "vmadda", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x1c: return { op: "vmsuba", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x1d: return { op: "vmadd", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}.${bcStr(bc)}`, comment }; + case 0x1e: return { op: "vmaddq", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x1f: return { op: "vmmaxi", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x20: return { op: "vaddai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x21: return { op: "vsubai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x22: return { op: "vmulai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x23: return { op: "vmaddai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x24: return { op: "vmsubai", args: `ACC${destStr(dest)}, ${vreg(fs)}, I`, comment }; + case 0x25: return { op: "vadda", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x26: return { op: "vsuba", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x27: return { op: "vmula", args: `ACC${destStr(dest)}, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x28: return { op: "vopmula", args: `ACC, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x29: return { op: "vnop", args: "", comment }; + case 0x2a: return { op: "vmove", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}`, comment }; + case 0x2b: return { op: "vmr32", args: `${vreg(fd)}${destStr(dest)}, ${vreg(fs)}`, comment }; + case 0x2c: return { op: "vlqi", args: `${vreg(fd)}${destStr(dest)}, (${vireg(fs)}++)`, comment }; + case 0x2d: return { op: "vsqi", args: `${vreg(fs)}${destStr(dest)}, (${vireg(ft)}++)`, comment }; + case 0x2e: return { op: "vlqd", args: `${vreg(fd)}${destStr(dest)}, (--${vireg(fs)})`, comment }; + case 0x2f: return { op: "vsqd", args: `${vreg(fs)}${destStr(dest)}, (--${vireg(ft)})`, comment }; + case 0x30: return { op: "vdiv", args: `Q, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x31: return { op: "vsqrt", args: `Q, ${vreg(ft)}`, comment }; + case 0x32: return { op: "vrsqrt", args: `Q, ${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x33: return { op: "vwaitq", args: "", comment }; + case 0x34: return { op: "vmtir", args: `${vireg(ft)}, ${vreg(fs)}`, comment }; + case 0x35: return { op: "vmfir", args: `${vreg(fd)}${destStr(dest)}, ${vireg(fs)}`, comment }; + case 0x36: return { op: "vilwr", args: `${vireg(ft)}, (${vireg(fs)})`, comment }; + case 0x37: return { op: "viswr", args: `${vireg(ft)}, (${vireg(fs)})`, comment }; + case 0x38: return { op: "vrnext", args: `${vreg(fd)}${destStr(dest)}, R`, comment }; + case 0x39: return { op: "vrget", args: `${vreg(fd)}${destStr(dest)}, R`, comment }; + case 0x3a: return { op: "vrinit", args: `R, ${vreg(fs)}`, comment }; + case 0x3b: return { op: "vrxor", args: `R, ${vreg(fs)}`, comment }; + case 0x3c: return { op: "vclip", args: `${vreg(fs)}, ${vreg(ft)}`, comment }; + case 0x3d: return { op: "vmaddaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x3e: return { op: "vmsubaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + case 0x3f: return { op: "vmulaq", args: `ACC${destStr(dest)}, ${vreg(fs)}, Q`, comment }; + } + // VU0 special instructions (lower instructions with different encoding) + const vuLower = (instr >> 25) & 0x7f; + if (vuLower === 0x30 || vuLower === 0x31 || vuLower === 0x32 || vuLower === 0x33) { + const it = (instr >> 16) & 0x1f; + const is = (instr >> 11) & 0x1f; + const id = (instr >> 6) & 0x1f; + const vireg = (r) => `vi${r}`; + switch (funct) { + case 0x30: return { op: "viadd", args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, comment }; + case 0x31: return { op: "visub", args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, comment }; + case 0x32: return { op: "viaddi", args: `${vireg(it)}, ${vireg(is)}, ${(instr & 0x1f) - ((instr & 0x10) ? 32 : 0)}`, comment }; + case 0x33: return { op: "viand", args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, comment }; + case 0x34: return { op: "vior", args: `${vireg(id)}, ${vireg(is)}, ${vireg(it)}`, comment }; + } + } + } + } + // If we reach here, instruction is unknown + return { op: "unknown", args: "", label: "", comment: "; unrecognized instruction" }; +} +//# sourceMappingURL=analyzer.js.map \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/analyzer.js.map b/vscode/cds-dis/cds-dis/out/analyzer.js.map new file mode 100644 index 0000000..2a54ba8 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/analyzer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"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C,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,E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,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACvF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;oBACxF,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,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"} \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/out/baseProvider/BaseEditorProvider.js b/vscode/cds-dis/cds-dis/out/baseProvider/BaseEditorProvider.js new file mode 100644 index 0000000..6696c27 --- /dev/null +++ b/vscode/cds-dis/cds-dis/out/baseProvider/BaseEditorProvider.js @@ -0,0 +1,71 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BaseEditorProvider = void 0; +const fs = __importStar(require("fs")); +const path = __importStar(require("path")); +const helpers_1 = require("../helpers"); +// Base class with reusable webview logic +class BaseEditorProvider { + htmlFileName; + providerName; + constructor(htmlFileName, providerName) { + this.htmlFileName = htmlFileName; + this.providerName = providerName; + } // HTML file provided by child + async openCustomDocument(uri) { + return { uri, dispose() { } }; + } + loadHtml(webview) { + // Compute the provider folder name by stripping "Provider" from the class name + const providerFolder = this.providerName; + // Path to compiled JS output + provider folder + const htmlPath = path.join(__dirname, '..', providerFolder, this.htmlFileName); + let html = fs.readFileSync(htmlPath, 'utf8'); + const nonce = (0, helpers_1.getNonce)(); + html = html.replace(' + + \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/DisasmEditorProvider.ts b/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/DisasmEditorProvider.ts new file mode 100644 index 0000000..6d6c8ce --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/DisasmEditorProvider.ts @@ -0,0 +1,331 @@ +import * as vscode from "vscode"; +import * as fs from "fs"; +import { disassemble, analyzePointers } from "../../helpers"; +import { BaseEditorProvider } from "../BaseProvider/BaseEditorProvider"; + +/** + * Allowed searchable fields in a disassembled instruction row + */ +type SearchField = 'addr' | 'bytes' | 'label' | 'op' | 'args' | 'comment'; + +interface SearchMatch { + instructionIndex: number; + address: number; + field: SearchField; + start: number; + length: number; +} + +export class DisasmEditorProvider extends BaseEditorProvider { + private static readonly HEX_VIEW_SIZE = 0x30; + private static readonly INSTRUCTION_SIZE = 4; + private static readonly BASE_ADDRESS = 0x00000000; + private static readonly PAGE_SIZE = 1000; + private static readonly BUFFER_PAGES = 2; + + constructor() { + super("DisasmEditorProvider.html", "DisasmEditor"); + } + + protected async onDidResolveWebview( + webviewPanel: vscode.WebviewPanel, + document: vscode.CustomDocument + ): Promise { + fs.readFile(document.uri.fsPath, (err, fileData) => { + if (err) { + webviewPanel.webview.postMessage({ + type: "error", + message: err.message, + }); + return; + } + + const totalInstructions = Math.floor( + fileData.length / DisasmEditorProvider.INSTRUCTION_SIZE + ); + + webviewPanel.webview.postMessage({ + type: "init", + totalInstructions, + pageSize: DisasmEditorProvider.PAGE_SIZE, + baseAddress: DisasmEditorProvider.BASE_ADDRESS, + }); + + this.sendDisasmPage(webviewPanel, fileData, 0); + + this.sendHexView( + webviewPanel, + fileData, + DisasmEditorProvider.BASE_ADDRESS, + DisasmEditorProvider.BASE_ADDRESS, + DisasmEditorProvider.INSTRUCTION_SIZE + ); + + webviewPanel.webview.onDidReceiveMessage((message) => { + if (message.type === "updateHex") { + this.sendHexView( + webviewPanel, + fileData, + DisasmEditorProvider.BASE_ADDRESS, + message.address, + message.length || DisasmEditorProvider.INSTRUCTION_SIZE + ); + } else if (message.type === "requestPage") { + this.sendDisasmPage(webviewPanel, fileData, message.startIndex); + } else if (message.type === "search") { + this.performSearch(webviewPanel, fileData, message.query, message.mode); + } + }); + }); + } + + private performSearch( + webviewPanel: vscode.WebviewPanel, + fileData: Buffer, + query: string, + mode: 'text' | 'bytes' | 'string' | 'regex' + ): void { + const matches: SearchMatch[] = []; + + if (mode === 'bytes') { + const pattern = this.parseBytePattern(query); + if (!pattern) { + webviewPanel.webview.postMessage({ type: 'searchResults', matches: [] }); + return; + } + + for (let offset = 0; offset <= fileData.length - pattern.length; offset++) { + let found = true; + for (let i = 0; i < pattern.length; i++) { + if (fileData[offset + i] !== pattern[i]) { + found = false; + break; + } + } + + if (found) { + const instructionIndex = Math.floor(offset / DisasmEditorProvider.INSTRUCTION_SIZE); + const address = DisasmEditorProvider.BASE_ADDRESS + offset; + + matches.push({ + instructionIndex, + address, + field: 'bytes', + start: 0, + length: pattern.length * 3 - 1 + }); + + offset += pattern.length - 1; + } + } + } else if (mode === 'string') { + const stringBytes = Buffer.from(query, 'utf8'); + + for (let offset = 0; offset <= fileData.length - stringBytes.length; offset++) { + let found = true; + for (let i = 0; i < stringBytes.length; i++) { + if (fileData[offset + i] !== stringBytes[i]) { + found = false; + break; + } + } + + if (found) { + const instructionIndex = Math.floor(offset / DisasmEditorProvider.INSTRUCTION_SIZE); + const address = DisasmEditorProvider.BASE_ADDRESS + offset; + + matches.push({ + instructionIndex, + address, + field: 'bytes', + start: 0, + length: stringBytes.length * 3 - 1 + }); + + offset += stringBytes.length - 1; + } + } + } else { + const totalInstructions = Math.floor( + fileData.length / DisasmEditorProvider.INSTRUCTION_SIZE + ); + + for (let instrIndex = 0; instrIndex < totalInstructions; instrIndex++) { + const offset = instrIndex * DisasmEditorProvider.INSTRUCTION_SIZE; + const slice = fileData.slice(offset, offset + DisasmEditorProvider.INSTRUCTION_SIZE); + if (slice.length < DisasmEditorProvider.INSTRUCTION_SIZE) break; + + const address = DisasmEditorProvider.BASE_ADDRESS + offset; + const rows = disassemble(address, slice); + + if (rows.length === 0) continue; + + const row = rows[0]; + const rowMatches = this.searchInRow(row, query, mode); + + for (const match of rowMatches) { + matches.push({ + instructionIndex: instrIndex, + address, + field: match.field, + start: match.start, + length: match.length + }); + } + } + } + + webviewPanel.webview.postMessage({ + type: 'searchResults', + matches + }); + } + + private parseBytePattern(pattern: string): number[] | null { + const cleaned = pattern.replace(/0x/gi, '').replace(/[,\s]+/g, ' ').trim(); + if (!cleaned) return null; + + const bytes = cleaned.split(/\s+/); + const result: number[] = []; + + for (const byte of bytes) { + if (!/^[0-9a-f]{1,2}$/i.test(byte)) return null; + result.push(parseInt(byte, 16)); + } + + return result.length ? result : null; + } + + private searchInRow( + row: any, + query: string, + mode: 'text' | 'regex' + ): Array<{ field: SearchField; start: number; length: number }> { + const matches: Array<{ field: SearchField; start: number; length: number }> = []; + + const fields: Array<{ text: string; field: SearchField }> = [ + { text: row.addr, field: 'addr' }, + { text: row.bytes, field: 'bytes' }, + { text: row.label || '', field: 'label' }, + { text: row.op, field: 'op' }, + { text: row.args, field: 'args' }, + { text: row.comment || '', field: 'comment' } + ]; + + if (mode === 'text') { + const searchLower = query.toLowerCase(); + + for (const { text, field } of fields) { + const lower = text.toLowerCase(); + let index = 0; + + while ((index = lower.indexOf(searchLower, index)) !== -1) { + matches.push({ field, start: index, length: query.length }); + index += query.length; + } + } + } else { + try { + const regex = new RegExp(query, 'gi'); + + for (const { text, field } of fields) { + let match: RegExpExecArray | null; + const fieldRegex = new RegExp(regex); + + while ((match = fieldRegex.exec(text)) !== null) { + matches.push({ + field, + start: match.index, + length: match[0].length + }); + + if (match.index === fieldRegex.lastIndex) { + fieldRegex.lastIndex++; + } + } + } + } catch { + return []; + } + } + + return matches; + } + + private sendDisasmPage( + webviewPanel: vscode.WebviewPanel, + fileData: Buffer, + startIndex: number + ): void { + const startOffset = startIndex * DisasmEditorProvider.INSTRUCTION_SIZE; + const endOffset = Math.min( + fileData.length, + startOffset + DisasmEditorProvider.PAGE_SIZE * DisasmEditorProvider.INSTRUCTION_SIZE + ); + + const slice = fileData.slice(startOffset, endOffset); + const startAddr = DisasmEditorProvider.BASE_ADDRESS + startOffset; + + const rows = disassemble(startAddr, slice); + const refs = analyzePointers(rows); + + const refMap = new Map(); + for (const ref of refs) { + if (!refMap.has(ref.instrAddr)) { + refMap.set(ref.instrAddr, []); + } + refMap.get(ref.instrAddr)!.push(ref); + } + + for (const row of rows) { + const addr = parseInt(row.addr, 16); + const rowRefs = refMap.get(addr); + if (!rowRefs) continue; + + const annotations = rowRefs.map(ref => { + if (ref.targetAddr !== undefined) { + const addrStr = `0x${ref.targetAddr.toString(16).toUpperCase()}`; + return ref.isFunction + ? `; ptr to function at ${addrStr}` + : `; ptr [${addrStr}]`; + } + return `; ptr: ${ref.baseReg ?? '?'} (unresolved)`; + }); + + row.comment = row.comment + ? `${row.comment} ${annotations.join(', ')}` + : annotations.join(', '); + } + + webviewPanel.webview.postMessage({ + type: "disasmPage", + rows, + startIndex, + }); + } + + private sendHexView( + webviewPanel: vscode.WebviewPanel, + fileData: Buffer, + baseAddr: number, + highlightAddr: number, + highlightLength: number + ): void { + const alignedAddr = Math.max(baseAddr, (highlightAddr & ~0xf) - 0x10); + const fileOffset = alignedAddr - baseAddr; + const endOffset = Math.min( + fileData.length, + fileOffset + DisasmEditorProvider.HEX_VIEW_SIZE + ); + + const slice = fileData.slice(fileOffset, endOffset); + + webviewPanel.webview.postMessage({ + type: "hexview", + data: Array.from(slice), + offset: alignedAddr, + highlight_addr: highlightAddr, + highlight_length: highlightLength, + }); + } +} diff --git a/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/Search.md b/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/Search.md new file mode 100644 index 0000000..941c4d4 --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/providers/DisasmEditor/Search.md @@ -0,0 +1,394 @@ +# MIPS Disassembler Search Modes - Complete Guide + +## Overview +The disassembler includes 4 distinct search modes, each optimized for different use cases when analyzing PlayStation 2 MIPS binary files. + +--- + +## 1. TEXT SEARCH (Aa Button) + +### Purpose +Case-insensitive text search across all disassembled instruction fields. + +### Use Cases +- Finding specific instructions (e.g., "addiu", "jal") +- Locating register usage (e.g., "sp", "ra", "v0") +- Searching comments and labels +- Quick general-purpose searching + +### Search Scope +Searches in these fields: +- **Address**: Memory addresses (e.g., "00001234") +- **Bytes**: Hex representation (e.g., "27 BD FF F0") +- **Label**: Assembly labels (e.g., "main:") +- **Opcode**: Instruction mnemonic (e.g., "addiu") +- **Arguments**: Operands (e.g., "sp, sp, $FFF0") +- **Comments**: Analysis comments (e.g., "; ptr to function") + +### Examples +``` +Query: "addiu" +Finds: All add immediate unsigned instructions + +Query: "sp" +Finds: All stack pointer references in any field + +Query: "jal" +Finds: All function call instructions + +Query: "ptr" +Finds: All pointer references in comments +``` + +### Algorithm +1. Convert query to lowercase +2. Convert each field to lowercase +3. Find all substring matches +4. Record position and length for highlighting +5. Case-insensitive comparison throughout + +### Performance +⚠️ **SLOW** - Must disassemble every instruction in the file + +--- + +## 2. BYTE PATTERN SEARCH (0x Button) + +### Purpose +Search for exact hexadecimal byte sequences in the raw binary file. + +### Use Cases +- Finding specific instruction encodings +- Locating opcode patterns +- Searching for data structures +- Finding exact byte sequences + +### Input Format +Accepts flexible formats: +``` +Space-separated: 12 34 AB CD +With 0x prefix: 0x12 0x34 0xAB 0xCD +Comma-separated: 12,34,AB,CD +Mixed: 0x12 34, AB CD +``` + +### Examples +``` +Query: "27 BD FF F0" +Finds: addiu sp, sp, -16 (common stack allocation) + +Query: "3C 01 80 00" +Finds: lui at, $8000 (load upper immediate) + +Query: "0C" +Finds: All JAL instructions (opcode 0x03 = 0000 11xx) + +Query: "00 00 00 00" +Finds: NOP instructions or null data +``` + +### Algorithm +1. Parse hex string into byte array +2. Validate each byte (must be 0x00-0xFF) +3. Scan entire file buffer sequentially +4. Compare byte-by-byte with pattern +5. Record matches at instruction boundaries +6. Skip overlapping matches + +### Performance +⚡ **FAST** - Direct binary search, no disassembly required + +### Validation +- Each byte must be 1-2 hexadecimal digits +- Invalid characters show error: "Invalid byte pattern" +- Empty pattern returns no results + +--- + +## 3. STRING SEARCH ("ab" Button) + +### Purpose +Search for ASCII/UTF-8 text strings embedded in the binary file. + +### Use Cases +- Finding function names in debug symbols +- Locating string literals +- Finding copyright notices +- Searching for embedded text data + +### Characteristics +- **Case-sensitive** (unlike text mode) +- Searches raw binary data +- No null-terminator required +- UTF-8 encoding support + +### Examples +``` +Query: "main" +Finds: String "main" in binary (function name, debug symbol) + +Query: "Copyright" +Finds: Copyright strings in ROM data + +Query: "Error" +Finds: Error message strings + +Query: "Sony" +Finds: Developer/publisher strings +``` + +### Algorithm +1. Convert query string to UTF-8 bytes +2. Scan entire file buffer +3. Compare byte sequences +4. Record matches at instruction boundaries +5. Match is exact (no partial matches) + +### Performance +⚡ **FAST** - Direct binary search like byte mode + +### Encoding Details +``` +Query: "A" +Bytes: [0x41] + +Query: "Hello" +Bytes: [0x48, 0x65, 0x6C, 0x6C, 0x6F] + +Query: "日本" +Bytes: [0xE6, 0x97, 0xA5, 0xE6, 0x9C, 0xAC] (UTF-8) +``` + +--- + +## 4. REGEX SEARCH (.* Button) + +### Purpose +Advanced pattern matching using regular expressions. + +### Use Cases +- Complex pattern searches +- Finding instruction sequences +- Matching patterns in arguments +- Advanced filtering + +### Regex Flags +- **g**: Global (find all matches) +- **i**: Case-insensitive + +### Examples + +#### Basic Patterns +``` +Query: "lw.*sp" +Finds: Load word instructions using stack pointer +Match: "lw a0, $0010(sp)" + +Query: "^addiu" +Finds: Lines starting with addiu +Match: "addiu sp, sp, -16" + +Query: "(jal|jalr)" +Finds: All function calls (JAL or JALR) +Match: "jal $00001234" +Match: "jalr ra" +``` + +#### Advanced Patterns +``` +Query: "\$[0-9A-F]{8}" +Finds: All 32-bit hex addresses +Match: "$00001234" +Match: "$80000000" + +Query: "sp,\s*sp,\s*-" +Finds: Stack allocations (sp = sp - X) +Match: "addiu sp, sp, -16" +Match: "addiu sp,sp,-32" + +Query: "lw\s+\w+,\s*\$[0-9A-F]+\(sp\)" +Finds: Load from stack with hex offset +Match: "lw a0, $0010(sp)" +``` + +#### Metacharacters +- `.` = Any character +- `*` = Zero or more +- `+` = One or more +- `?` = Zero or one +- `^` = Start of line +- `$` = End of line +- `\s` = Whitespace +- `\w` = Word character +- `\d` = Digit +- `[abc]` = Character class +- `(a|b)` = Alternation + +### Algorithm +1. Compile regex with 'gi' flags +2. Create fresh instance per field +3. Execute regex.exec() in loop +4. Record all matches +5. Handle zero-length matches +6. Catch and ignore invalid regex + +### Performance +⚠️ **SLOW** - Must disassemble every instruction + regex overhead + +### Error Handling +Invalid regex syntax fails silently (returns no matches) + +--- + +## Search Architecture + +### Backend Processing (TypeScript) +1. Receives search request from frontend +2. Determines search strategy based on mode: + - **Byte/String**: Direct buffer search + - **Text/Regex**: Disassemble-then-search +3. Scans entire file (not just visible page) +4. Returns array of match objects: + ```typescript + { + instructionIndex: number, // 0-based instruction index + address: number, // Memory address + field: string, // 'addr'|'bytes'|'op'|'args'|etc + start: number, // Character position + length: number // Match length + } + ``` + +### Frontend Display (HTML/JS) +1. Receives match array +2. Stores in state +3. Jumps to first match +4. Highlights matches in visible rows: + - **All matches**: Orange background + - **Current match**: Brighter orange +5. Updates counter: "X of Y" + +### Navigation +- **Enter / F3**: Next match +- **Shift+Enter / Shift+F3**: Previous match +- **↑/↓ Buttons**: Manual navigation +- **Wrapping**: After last → first, before first → last + +--- + +## Performance Comparison + +| Mode | Speed | Disassembly Required | Use Case | +|--------|-------|---------------------|----------| +| Text | Slow | Yes (all instructions) | Quick searches | +| Bytes | Fast | No (binary scan) | Exact patterns | +| String | Fast | No (binary scan) | Text in data | +| Regex | Slow | Yes + regex overhead | Complex patterns | + +### Optimization Tips +1. Use **byte mode** for finding specific opcodes +2. Use **string mode** for finding embedded text +3. Use **text mode** for quick register/instruction searches +4. Use **regex mode** only when pattern matching is needed + +--- + +## Visual Feedback + +### Highlighting Colors +```css +.search-match { + background: #613214; /* Row background - all matches */ +} + +.search-current { + background: #4e3c1e; /* Row background - current match */ +} + +.search-match-highlight { + background: #f9826c; /* Text highlight - all matches */ + color: #000; +} + +.search-current-highlight { + background: #ea5c00; /* Text highlight - current match */ + color: #fff; +} +``` + +### UI Elements +- **Search input**: Border turns red for invalid byte patterns +- **Clear button (×)**: Appears when text is entered +- **Counter**: Shows "X of Y" or "No results" +- **Navigation buttons**: Disabled when no results + +--- + +## Keyboard Shortcuts + +| Shortcut | Action | +|----------|--------| +| Ctrl+F / Cmd+F | Open search panel | +| Enter | Search / Next match | +| Shift+Enter | Previous match | +| F3 | Next match | +| Shift+F3 | Previous match | +| Escape | Close search panel | + +--- + +## Implementation Notes + +### Memory Efficiency +- Entire file is loaded in backend (Node.js) +- Only match positions stored in frontend +- Page-based rendering unchanged +- Matches highlighted only when visible + +### Match Persistence +- Matches remain highlighted when scrolling +- Current match updates when navigating +- Clearing search removes all highlights +- Changing modes triggers new search + +### Edge Cases Handled +1. Invalid regex → silent fail, no matches +2. Invalid byte pattern → error message +3. Zero-length regex matches → prevented +4. Overlapping byte matches → skipped +5. No matches → "No results" message +6. Empty query → clears search + +--- + +## Common Search Patterns + +### Finding Function Prologues +```regex +Text: "addiu sp, sp, -" +Finds: Functions that allocate stack frames +``` + +### Finding Function Calls +```regex +Regex: "^jal " +Finds: All JAL (jump and link) instructions +``` + +### Finding Immediate Values +```regex +Regex: "\$[0-9A-F]{4}" +Finds: All 16-bit immediate values +``` + +### Finding Memory Loads +```regex +Text: "lw" +Finds: All load word instructions +``` + +### Finding Stack Operations +```regex +Text: "(sp)" +Finds: All stack-relative memory operations +``` \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.html b/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.html new file mode 100644 index 0000000..ea1a74d --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.html @@ -0,0 +1,14 @@ + + + +

Disasm Panel Loaded

+ + + + + \ No newline at end of file diff --git a/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.ts b/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.ts new file mode 100644 index 0000000..bc03d9f --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/providers/DisasmPanel/DisasmPanelProvider.ts @@ -0,0 +1,17 @@ +import * as vscode from 'vscode'; +import { BasePanelProvider } from '../BaseProvider/BasePanelProvider'; + +export class DisasmPanelProvider extends BasePanelProvider { + constructor() { + super('disasmPanel', 'DisasmPanelProvider.html', "DisasmPanel"); // HTML file + } + + protected onDidResolveWebviewView(webviewView: vscode.WebviewView) { + // Listen to messages from the webview + webviewView.webview.onDidReceiveMessage(msg => { + if (msg.command === 'connect') { + vscode.window.showInformationMessage('Panel works!'); + } + }); + } +} diff --git a/vscode/cds-dis/cds-dis/src/resources/cds-icon.svg b/vscode/cds-dis/cds-dis/src/resources/cds-icon.svg new file mode 100644 index 0000000..b71be72 --- /dev/null +++ b/vscode/cds-dis/cds-dis/src/resources/cds-icon.svg @@ -0,0 +1,4 @@ + + + CDS + diff --git a/vscode/cds-dis/cds-dis/tsconfig.json b/vscode/cds-dis/cds-dis/tsconfig.json new file mode 100644 index 0000000..356580f --- /dev/null +++ b/vscode/cds-dis/cds-dis/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "Node16", + "target": "ES2022", + "outDir": "out", + "lib": [ + "ES2022" + ], + "sourceMap": true, + "rootDir": "src", + "strict": true, /* enable all strict type-checking options */ + /* Additional Checks */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + } +} diff --git a/vscode/cds-dis/cds-dis/vsc-extension-quickstart.md b/vscode/cds-dis/cds-dis/vsc-extension-quickstart.md new file mode 100644 index 0000000..c912064 --- /dev/null +++ b/vscode/cds-dis/cds-dis/vsc-extension-quickstart.md @@ -0,0 +1,44 @@ +# Welcome to your VS Code Extension + +## What's in the folder + +* This folder contains all of the files necessary for your extension. +* `package.json` - this is the manifest file in which you declare your extension and command. + * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. +* `src/extension.ts` - this is the main file where you will provide the implementation of your command. + * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. + * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. + +## Get up and running straight away + +* Press `F5` to open a new window with your extension loaded. +* Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. +* Set breakpoints in your code inside `src/extension.ts` to debug your extension. +* Find output from your extension in the debug console. + +## Make changes + +* You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. +* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. + +## Explore the API + +* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. + +## Run tests + +* Install the [Extension Test Runner](https://marketplace.visualstudio.com/items?itemName=ms-vscode.extension-test-runner) +* Run the "watch" task via the **Tasks: Run Task** command. Make sure this is running, or tests might not be discovered. +* Open the Testing view from the activity bar and click the Run Test" button, or use the hotkey `Ctrl/Cmd + ; A` +* See the output of the test result in the Test Results view. +* Make changes to `src/test/extension.test.ts` or create new test files inside the `test` folder. + * The provided test runner will only consider files matching the name pattern `**.test.ts`. + * You can create folders inside the `test` folder to structure your tests any way you want. + +## Go further + +* [Follow UX guidelines](https://code.visualstudio.com/api/ux-guidelines/overview) to create extensions that seamlessly integrate with VS Code's native interface and patterns. +* Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). +* [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. +* Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). +* Integrate to the [report issue](https://code.visualstudio.com/api/get-started/wrapping-up#issue-reporting) flow to get issue and feature requests reported by users. diff --git a/vscode/cds-dis/package-lock.json b/vscode/cds-dis/package-lock.json new file mode 100644 index 0000000..0b02c47 --- /dev/null +++ b/vscode/cds-dis/package-lock.json @@ -0,0 +1,1873 @@ +{ + "name": "cds-dis", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "generator-code": "^1.11.15" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@octokit/auth-token": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz", + "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.6.tgz", + "integrity": "sha512-kIU8SLQkYWGp3pVKiYzA5OSaNF5EE03P/R8zEmmrG6XwOg5oBjXyQVVIauQ0dgau4zYhpZEhJrvIYt6oM+zZZA==", + "dependencies": { + "@octokit/auth-token": "^5.0.0", + "@octokit/graphql": "^8.2.2", + "@octokit/request": "^9.2.3", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", + "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", + "dependencies": { + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", + "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "dependencies": { + "@octokit/request": "^9.2.3", + "@octokit/types": "^14.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", + "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz", + "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==", + "dependencies": { + "@octokit/types": "^13.10.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", + "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz", + "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==", + "dependencies": { + "@octokit/types": "^13.10.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==" + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@octokit/request": { + "version": "9.2.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.4.tgz", + "integrity": "sha512-q8ybdytBmxa6KogWlNa818r0k1wlqzNC+yNkcQDECHvQo8Vmstrg18JwqJHdJdUiHD2sjlwBgSm9kHkOKe2iyA==", + "dependencies": { + "@octokit/endpoint": "^10.1.4", + "@octokit/request-error": "^6.1.8", + "@octokit/types": "^14.0.0", + "fast-content-type-parse": "^2.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz", + "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==", + "dependencies": { + "@octokit/types": "^14.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz", + "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==", + "dependencies": { + "@octokit/core": "^6.1.4", + "@octokit/plugin-paginate-rest": "^11.4.2", + "@octokit/plugin-request-log": "^5.3.1", + "@octokit/plugin-rest-endpoint-methods": "^13.3.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", + "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", + "dependencies": { + "@octokit/openapi-types": "^25.1.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/ejs": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==" + }, + "node_modules/@types/expect": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", + "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", + "peer": true + }, + "node_modules/@types/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@types/vinyl": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz", + "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==", + "peer": true, + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "node_modules/@yeoman/namespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@yeoman/namespace/-/namespace-1.0.1.tgz", + "integrity": "sha512-XGdYL0HCoPvrzW7T8bxD6RbCY/B8uvR2jpOzJc/yEwTueKHwoVhjSLjVXkokQAO0LNl8nQFLVZ1aKfr2eFWZeA==", + "engines": { + "node": "^16.13.0 || >=18.12.0" + } + }, + "node_modules/@yeoman/types": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@yeoman/types/-/types-1.9.1.tgz", + "integrity": "sha512-5BMdA/zMzLv/ahnL1ktaV46nSXorb4sU4kQPQKDhIcK8ERbx9TAbGAE+XAlCXKioNIiOrihYj6gW1d/GEfU9Zw==", + "peer": true, + "engines": { + "node": "^16.13.0 || >=18.12.0" + }, + "peerDependencies": { + "@types/node": ">=16.18.26", + "@yeoman/adapter": "^1.6.0 || ^2.0.0-beta.0 || ^3.0.0 || ^4.0.0", + "mem-fs": "^3.0.0 || ^4.0.0-beta.1", + "mem-fs-editor": "^10.0.2 || >=10.0.2" + }, + "peerDependenciesMeta": { + "@yeoman/adapter": { + "optional": true + }, + "mem-fs": { + "optional": true + }, + "mem-fs-editor": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-differ": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-4.0.0.tgz", + "integrity": "sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/before-after-hook": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" + }, + "node_modules/binaryextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-6.11.0.tgz", + "integrity": "sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/editions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", + "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==", + "dependencies": { + "version-range": "^4.15.0" + }, + "engines": { + "ecmascript": ">= es5", + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==" + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-content-type-parse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz", + "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ] + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-plist": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/fast-plist/-/fast-plist-0.1.3.tgz", + "integrity": "sha512-d9cEfo/WcOezgPLAC/8t8wGb6YOD6JTCPMw2QcG2nAdFmyY+9rTUizCTaGjIZAloWENTEUMAPpkUAIJJJ0i96A==" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/first-chunk-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-5.0.0.tgz", + "integrity": "sha512-WdHo4ejd2cG2Dl+sLkW79SctU7mUQDfr4s1i26ffOZRs5mgv+BRttIM9gwcq0rDbemo0KlpVPaa3LBVLqPXzcQ==", + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/generator-code": { + "version": "1.11.15", + "resolved": "https://registry.npmjs.org/generator-code/-/generator-code-1.11.15.tgz", + "integrity": "sha512-ZIQ9EGMDcg5RzIJr4V/9tfREWXgmokwjksIlCGVBxksKEhMQ5eoq/21xU9u5nbyn9JLc8wxizWvtWP0/5oQnFA==", + "dependencies": { + "chalk": "^5.6.2", + "fast-plist": "^0.1.3", + "request-light": "^0.8.0", + "which": "^6.0.0", + "yeoman-generator": "^7.5.1", + "yosay": "^3.0.0" + }, + "engines": { + "node": ">=20.5.0" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-username": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-9.0.0.tgz", + "integrity": "sha512-lY7+mymwQUEhRwWTLxieKkxcZkVNnUh8iAGnl30DMB1ZtYODHkMAckZk8Jx5dLQs1YKPYM2ibnzQu02aCLFcYQ==", + "dependencies": { + "@octokit/rest": "^21.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "peer": true + }, + "node_modules/isbinaryfile": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.3.tgz", + "integrity": "sha512-VR4gNjFaDP8csJQvzInG20JvBj8MaHYLxNOMXysxRbGM7tcsHZwCjhch3FubFtZBkuDbN55i4dUukGeIrzF+6g==", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/ky": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.2.tgz", + "integrity": "sha512-q3RBbsO5A5zrPhB6CaCS8ZUv+NWCXv6JJT4Em0i264G9W0fdPB8YRfnnEi7Dm7X7omAkBIPojzYJ2D1oHTHqug==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "node_modules/latest-version": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-9.0.0.tgz", + "integrity": "sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==", + "dependencies": { + "package-json": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash-es": { + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", + "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/mem-fs": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-4.1.2.tgz", + "integrity": "sha512-CMwusHK+Kz0tu1qjgbd0rwcJxzgg76jlkPpqK+pDTv8Hth8JyM7JlgxNWaAFRKe969HATPTz/sp8T63QflyI+w==", + "peer": true, + "dependencies": { + "@types/node": ">=18", + "@types/vinyl": "^2.0.8", + "vinyl": "^3.0.0", + "vinyl-file": "^5.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/mem-fs-editor": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-11.1.4.tgz", + "integrity": "sha512-Z4QX14Ev6eOVTuVSayS5rdiOua6C3gHcFw+n9Qc7WiaVTbC+H8b99c32MYGmbQN9UFHJeI/p3lf3LAxiIzwEmA==", + "dependencies": { + "@types/ejs": "^3.1.4", + "@types/node": ">=18", + "binaryextensions": "^6.11.0", + "commondir": "^1.0.1", + "deep-extend": "^0.6.0", + "ejs": "^3.1.10", + "globby": "^14.0.2", + "isbinaryfile": "5.0.3", + "minimatch": "^9.0.3", + "multimatch": "^7.0.0", + "normalize-path": "^3.0.0", + "textextensions": "^6.11.0", + "vinyl": "^3.0.0" + }, + "acceptDependencies": { + "isbinaryfile": "^5.0.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "mem-fs": "^4.0.0" + } + }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/multimatch": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-7.0.0.tgz", + "integrity": "sha512-SYU3HBAdF4psHEL/+jXDKHO95/m5P2RvboHT2Y0WtTttvJLP4H/2WS9WlQPFvF6C8d6SpLw8vjCnQOnVIVOSJQ==", + "dependencies": { + "array-differ": "^4.0.0", + "array-union": "^3.0.1", + "minimatch": "^9.0.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-10.0.1.tgz", + "integrity": "sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==", + "dependencies": { + "ky": "^1.2.0", + "registry-auth-token": "^5.0.2", + "registry-url": "^6.0.1", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pad-component": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pad-component/-/pad-component-0.0.1.tgz", + "integrity": "sha512-8EKVBxCRSvLnsX1p2LlSFSH3c2/wuhY9/BXXWu8boL78FbVKqn2L5SpURt1x5iw6Gq8PTqJ7MdPoe5nCtX3I+g==" + }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/read-package-up": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", + "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "dependencies": { + "find-up-simple": "^1.0.0", + "read-pkg": "^9.0.0", + "type-fest": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", + "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "dependencies": { + "@types/normalize-package-data": "^2.4.3", + "normalize-package-data": "^6.0.0", + "parse-json": "^8.0.0", + "type-fest": "^4.6.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/registry-auth-token": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/request-light": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.8.0.tgz", + "integrity": "sha512-bH6E4PMmsEXYrLX6Kr1vu+xI3HproB1vECAwaPSJeroLE1kpWE3HR27uB4icx+6YORu1ajqBJXxuedv8ZQg5Lw==" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-git": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", + "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-keys": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-5.1.0.tgz", + "integrity": "sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ==", + "dependencies": { + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==" + }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom-buf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-3.0.1.tgz", + "integrity": "sha512-iJaWw2WroigLHzQysdc5WWeUc99p7ea7AEgB6JkY8CMyiO1yTVAA1gIlJJgORElUIR+lcZJkNl1OGChMhvc2Cw==", + "peer": true, + "dependencies": { + "is-utf8": "^0.2.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-bom-stream": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-5.0.0.tgz", + "integrity": "sha512-Yo472mU+3smhzqeKlIxClre4s4pwtYZEvDNQvY/sJpnChdaxmKuwU28UVx/v1ORKNMxkmj1GBuvxJQyBk6wYMQ==", + "peer": true, + "dependencies": { + "first-chunk-stream": "^5.0.0", + "strip-bom-buf": "^3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/textextensions": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-6.11.0.tgz", + "integrity": "sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==", + "dependencies": { + "editions": "^6.21.0" + }, + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/version-range": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", + "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==", + "engines": { + "node": ">=4" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/vinyl": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.1.tgz", + "integrity": "sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==", + "dependencies": { + "clone": "^2.1.2", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-5.0.0.tgz", + "integrity": "sha512-MvkPF/yA1EX7c6p+juVIvp9+Lxp70YUfNKzEWeHMKpUNVSnTZh2coaOqLxI0pmOe2V9nB+OkgFaMDkodaJUyGw==", + "peer": true, + "dependencies": { + "@types/vinyl": "^2.0.7", + "strip-bom-buf": "^3.0.1", + "strip-bom-stream": "^5.0.0", + "vinyl": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/which": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.0.tgz", + "integrity": "sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yeoman-generator": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-7.5.1.tgz", + "integrity": "sha512-MYncRvzSTd71BMwiUMAVhfX00sDD8DZDrmPzRxQkWuWQ0V1Qt4Rd0gS/Nee2QDTWvRjvCa+KBfiAVrtOySq+JA==", + "dependencies": { + "@types/lodash-es": "^4.17.9", + "@yeoman/namespace": "^1.0.0", + "chalk": "^5.3.0", + "debug": "^4.1.1", + "execa": "^8.0.1", + "github-username": "^9.0.0", + "json-schema": "^0.4.0", + "latest-version": "^9.0.0", + "lodash-es": "^4.17.21", + "mem-fs-editor": "^11.0.1", + "minimist": "^1.2.8", + "read-package-up": "^11.0.0", + "semver": "^7.5.4", + "simple-git": "^3.20.0", + "sort-keys": "^5.0.0", + "text-table": "^0.2.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "peerDependencies": { + "@types/node": ">=18.18.5", + "@yeoman/types": "^1.1.1", + "mem-fs": "^4.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/yosay": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/yosay/-/yosay-3.0.0.tgz", + "integrity": "sha512-ydCeqln4hPSPMA1ggS0ZsUnrXxDaatbmtigxF+4R2h/y2USVTaOIIZFPXANeq7tkmHo2bLEK8eal2wmrFMiwYA==", + "dependencies": { + "ansi-regex": "^6.0.1", + "ansi-styles": "^6.2.1", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "meow": "^12.1.1", + "pad-component": "0.0.1", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^8.1.0" + }, + "bin": { + "yosay": "cli.js" + }, + "engines": { + "node": ">=18" + } + } + } +} diff --git a/vscode/cds-dis/package.json b/vscode/cds-dis/package.json new file mode 100644 index 0000000..7f1a1a6 --- /dev/null +++ b/vscode/cds-dis/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "generator-code": "^1.11.15" + } +} diff --git a/vscode/cds-language/cds-language.esproj b/vscode/cds-language/cds-language.esproj index 2fbe60b..4a7406c 100644 --- a/vscode/cds-language/cds-language.esproj +++ b/vscode/cds-language/cds-language.esproj @@ -1,6 +1,6 @@ - npm start + npm compile Jasmine false