From 1f11c7e46c513d56198eb19b8d40d79b1269f991 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 08:46:15 -0700 Subject: [PATCH 01/25] Get sources building with esbuild --- .eslintrc.json | 5 +- .gitignore | 2 + .vscode/settings.json | 8 +- .vscode/tasks.json | 114 +++++----- addons/addon-attach/package.json | 2 +- addons/addon-attach/test/playwright.config.ts | 2 +- addons/addon-canvas/package.json | 2 +- addons/addon-canvas/test/playwright.config.ts | 2 +- addons/addon-clipboard/package.json | 2 +- .../addon-clipboard/test/playwright.config.ts | 2 +- addons/addon-fit/package.json | 2 +- addons/addon-fit/test/playwright.config.ts | 2 +- addons/addon-image/package.json | 2 +- addons/addon-image/test/playwright.config.ts | 2 +- addons/addon-search/package.json | 2 +- addons/addon-search/test/playwright.config.ts | 2 +- addons/addon-serialize/package.json | 2 +- addons/addon-serialize/src/SerializeAddon.ts | 2 +- .../addon-serialize/test/playwright.config.ts | 2 +- .../UnicodeGraphemeAddon.benchmark.ts | 10 +- addons/addon-unicode-graphemes/package.json | 2 +- .../test/playwright.config.ts | 2 +- addons/addon-unicode11/package.json | 2 +- .../addon-unicode11/test/playwright.config.ts | 2 +- addons/addon-web-links/package.json | 2 +- .../addon-web-links/test/playwright.config.ts | 2 +- addons/addon-webgl/package.json | 2 +- addons/addon-webgl/test/playwright.config.ts | 2 +- addons/addon-webgl/typings/addon-webgl.d.ts | 5 + bin/esbuild.mjs | 197 ++++++++++++++++++ bin/esbuild_all.mjs | 55 +++++ demo/client.ts | 91 ++++---- demo/start-server-only.js | 10 - demo/start.js | 16 -- demo/tsconfig.json | 20 +- package.json | 61 ++++-- .../{Terminal.ts => CoreBrowserTerminal.ts} | 2 +- src/browser/Terminal2.test.ts | 8 +- src/browser/TestUtils.test.ts | 4 +- src/browser/Types.ts | 49 +++++ src/browser/public/Terminal.ts | 2 +- src/browser/services/ThemeService.test.ts | 3 +- src/browser/services/ThemeService.ts | 52 +---- test/benchmark/Terminal.benchmark.ts | 10 +- yarn.lock | 150 +++++++++++++ 45 files changed, 666 insertions(+), 254 deletions(-) create mode 100644 bin/esbuild.mjs create mode 100644 bin/esbuild_all.mjs delete mode 100644 demo/start-server-only.js rename src/browser/{Terminal.ts => CoreBrowserTerminal.ts} (99%) diff --git a/.eslintrc.json b/.eslintrc.json index d4d7eddc..9c8493dd 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -45,10 +45,13 @@ "addons/*/src/third-party/*.ts", "out/*", "out-test/*", + "out-esbuild/*", + "out-esbuild-test/*", "**/inwasm-sdks/*", "**/typings/*.d.ts", "**/node_modules", - "**/*.js" + "**/*.js", + "**/*.mjs" ], "plugins": [ "@stylistic/ts", diff --git a/.gitignore b/.gitignore index 8aea04b2..b33a6471 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ node_modules/ lib/ out/ out-test/ +out-esbuild/ +out-esbuild-test/ .nyc_output/ Makefile.gyp *.Makefile diff --git a/.vscode/settings.json b/.vscode/settings.json index af3cc208..20356fd5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,10 +7,14 @@ "mochaExplorer.envPath": ".mocha.env", "mochaExplorer.files": [ "out/**/*.test.js", - "addons/**/out/*.test.js" + "addons/**/out/*.test.js", + "out-*/**/*.test.js", + "addons/**/out-*/*.test.js" ], "mochaExplorer.watch": [ "out/**/*.js", - "addons/**/out/*.js" + "addons/**/out/*.js", + "out-*/**/*.js", + "addons/**/out-*/*.js" ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 89a811b7..1681bb8d 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -7,7 +7,66 @@ "panel": "dedicated", "showReuseMessage": true }, - "tasks": [ + "tasks": [// Compound tasks + { + "label": "Development", + "dependsOn": ["demo-server", "tsc", "esbuild", "esbuild-demo"], + "group": { + "kind": "build", + "isDefault": true + } + }, + + // Demo + { + "label": "demo-server", + "type": "npm", + "script": "start", + "group": "build", + "isBackground": true, + "problemMatcher": [], + "presentation": { + "group": "xterm-demo" + } + }, + + // Build + { + "label": "tsc", + "type": "npm", + "script": "tsc-watch", + "group": "build", + "isBackground": true, + "problemMatcher": "$tsc-watch", + "presentation": { + "group": "xterm-build" + } + }, + { + "label": "esbuild", + "type": "npm", + "script": "esbuild-watch", + "group": "build", + "isBackground": true, + "problemMatcher": "$esbuild-watch", + "presentation": { + "group": "xterm-build" + } + }, + { + "label": "esbuild-demo", + "type": "npm", + "script": "esbuild-demo-watch", + "dependsOn": ["esbuild", "tsc"], + "group": "build", + "isBackground": true, + "problemMatcher": "$esbuild-watch", + "presentation": { + "group": "xterm-demo" + } + }, + + // Test { "type": "npm", "script": "test", @@ -16,59 +75,6 @@ "isDefault": true }, "problemMatcher": [] - }, - { - "label": "watch", - "type": "npm", - "script": "watch", - "group": "build", - "isBackground": true, - "problemMatcher": "$tsc-watch", - "presentation": { - "group": "vscode" - } - }, - { - "label": "start", - "type": "npm", - "script": "start", - "group": "build", - "isBackground": true, - "problemMatcher": [], - "presentation": { - "group": "vscode" - } - }, - { - "label": "Start demo", - "dependsOn": ["start", "watch"], - "group": { - "kind": "build", - "isDefault": true - }, - "isBackground": true, - "problemMatcher": { - "owner": "typescript", - "fileLocation": [ - "relative", - "${workspaceFolder}" - ], - "pattern": [ - { - "regexp": "^([^\\\\s].*)\\\\((\\\\d+,\\\\d+)\\\\):\\\\s*(.*)$", - "file": 1, - "location": 2, - "message": 3 - } - ], - "background": { - "beginsPattern": "assets by", - "endsPattern": "webpack \\d+\\.\\d+\\.\\d+ compiled successfully" - } - }, - "presentation": { - "group": "vscode" - } } ] } diff --git a/addons/addon-attach/package.json b/addons/addon-attach/package.json index 3a73b384..6f0c32b7 100644 --- a/addons/addon-attach/package.json +++ b/addons/addon-attach/package.json @@ -19,7 +19,7 @@ "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", - "start-server-only": "node ../../demo/start-server-only" + "start": "node ../../demo/start" }, "peerDependencies": { "@xterm/xterm": "^5.0.0" diff --git a/addons/addon-attach/test/playwright.config.ts b/addons/addon-attach/test/playwright.config.ts index 79cf9f02..22834be1 100644 --- a/addons/addon-attach/test/playwright.config.ts +++ b/addons/addon-attach/test/playwright.config.ts @@ -26,7 +26,7 @@ const config: PlaywrightTestConfig = { ], reporter: 'list', webServer: { - command: 'npm run start-server-only', + command: 'npm run start', port: 3000, timeout: 120000, reuseExistingServer: !process.env.CI diff --git a/addons/addon-canvas/package.json b/addons/addon-canvas/package.json index 2ca5d163..cb5ded7c 100644 --- a/addons/addon-canvas/package.json +++ b/addons/addon-canvas/package.json @@ -20,7 +20,7 @@ "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", - "start-server-only": "node ../../demo/start-server-only" + "start": "node ../../demo/start" }, "peerDependencies": { "@xterm/xterm": "^5.0.0" diff --git a/addons/addon-canvas/test/playwright.config.ts b/addons/addon-canvas/test/playwright.config.ts index 79cf9f02..22834be1 100644 --- a/addons/addon-canvas/test/playwright.config.ts +++ b/addons/addon-canvas/test/playwright.config.ts @@ -26,7 +26,7 @@ const config: PlaywrightTestConfig = { ], reporter: 'list', webServer: { - command: 'npm run start-server-only', + command: 'npm run start', port: 3000, timeout: 120000, reuseExistingServer: !process.env.CI diff --git a/addons/addon-clipboard/package.json b/addons/addon-clipboard/package.json index ef6c46f6..8ecdd6af 100644 --- a/addons/addon-clipboard/package.json +++ b/addons/addon-clipboard/package.json @@ -19,7 +19,7 @@ "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", - "start-server-only": "node ../../demo/start-server-only" + "start": "node ../../demo/start" }, "peerDependencies": { "@xterm/xterm": "^5.4.0" diff --git a/addons/addon-clipboard/test/playwright.config.ts b/addons/addon-clipboard/test/playwright.config.ts index 79cf9f02..22834be1 100644 --- a/addons/addon-clipboard/test/playwright.config.ts +++ b/addons/addon-clipboard/test/playwright.config.ts @@ -26,7 +26,7 @@ const config: PlaywrightTestConfig = { ], reporter: 'list', webServer: { - command: 'npm run start-server-only', + command: 'npm run start', port: 3000, timeout: 120000, reuseExistingServer: !process.env.CI diff --git a/addons/addon-fit/package.json b/addons/addon-fit/package.json index 561283a2..14d65f30 100644 --- a/addons/addon-fit/package.json +++ b/addons/addon-fit/package.json @@ -19,7 +19,7 @@ "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", - "start-server-only": "node ../../demo/start-server-only" + "start": "node ../../demo/start" }, "peerDependencies": { "@xterm/xterm": "^5.0.0" diff --git a/addons/addon-fit/test/playwright.config.ts b/addons/addon-fit/test/playwright.config.ts index 79cf9f02..22834be1 100644 --- a/addons/addon-fit/test/playwright.config.ts +++ b/addons/addon-fit/test/playwright.config.ts @@ -26,7 +26,7 @@ const config: PlaywrightTestConfig = { ], reporter: 'list', webServer: { - command: 'npm run start-server-only', + command: 'npm run start', port: 3000, timeout: 120000, reuseExistingServer: !process.env.CI diff --git a/addons/addon-image/package.json b/addons/addon-image/package.json index 19e56f94..2ea80c65 100644 --- a/addons/addon-image/package.json +++ b/addons/addon-image/package.json @@ -20,7 +20,7 @@ "prepackage": "../../node_modules/.bin/tsc -p .", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", - "start-server-only": "node ../../demo/start-server-only" + "start": "node ../../demo/start" }, "peerDependencies": { "@xterm/xterm": "^5.2.0" diff --git a/addons/addon-image/test/playwright.config.ts b/addons/addon-image/test/playwright.config.ts index 79cf9f02..22834be1 100644 --- a/addons/addon-image/test/playwright.config.ts +++ b/addons/addon-image/test/playwright.config.ts @@ -26,7 +26,7 @@ const config: PlaywrightTestConfig = { ], reporter: 'list', webServer: { - command: 'npm run start-server-only', + command: 'npm run start', port: 3000, timeout: 120000, reuseExistingServer: !process.env.CI diff --git a/addons/addon-search/package.json b/addons/addon-search/package.json index d43699aa..91dfef2e 100644 --- a/addons/addon-search/package.json +++ b/addons/addon-search/package.json @@ -18,7 +18,7 @@ "prepackage": "../../node_modules/.bin/tsc -p .", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", - "start-server-only": "node ../../demo/start-server-only" + "start": "node ../../demo/start" }, "peerDependencies": { "@xterm/xterm": "^5.0.0" diff --git a/addons/addon-search/test/playwright.config.ts b/addons/addon-search/test/playwright.config.ts index 79cf9f02..22834be1 100644 --- a/addons/addon-search/test/playwright.config.ts +++ b/addons/addon-search/test/playwright.config.ts @@ -26,7 +26,7 @@ const config: PlaywrightTestConfig = { ], reporter: 'list', webServer: { - command: 'npm run start-server-only', + command: 'npm run start', port: 3000, timeout: 120000, reuseExistingServer: !process.env.CI diff --git a/addons/addon-serialize/package.json b/addons/addon-serialize/package.json index d07b898b..3901addc 100644 --- a/addons/addon-serialize/package.json +++ b/addons/addon-serialize/package.json @@ -19,7 +19,7 @@ "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", - "start-server-only": "node ../../demo/start-server-only", + "start": "node ../../demo/start", "benchmark": "NODE_PATH=../../out:./out:./out-benchmark/ ../../node_modules/.bin/xterm-benchmark -r 5 -c benchmark/benchmark.json", "benchmark-baseline": "NODE_PATH=../../out:./out:./out-benchmark/ ../../node_modules/.bin/xterm-benchmark -r 5 -c benchmark/benchmark.json --baseline out-benchmark/benchmark/*benchmark.js", "benchmark-eval": "NODE_PATH=../../out:./out:./out-benchmark/ ../../node_modules/.bin/xterm-benchmark -r 5 -c benchmark/benchmark.json --eval out-benchmark/benchmark/*benchmark.js" diff --git a/addons/addon-serialize/src/SerializeAddon.ts b/addons/addon-serialize/src/SerializeAddon.ts index cd15cfc3..6f1d5d43 100644 --- a/addons/addon-serialize/src/SerializeAddon.ts +++ b/addons/addon-serialize/src/SerializeAddon.ts @@ -7,8 +7,8 @@ import type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm'; import type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize'; -import { DEFAULT_ANSI_COLORS } from 'browser/services/ThemeService'; import { IAttributeData, IColor } from 'common/Types'; +import { DEFAULT_ANSI_COLORS } from 'browser/Types'; function constrain(value: number, low: number, high: number): number { return Math.max(low, Math.min(value, high)); diff --git a/addons/addon-serialize/test/playwright.config.ts b/addons/addon-serialize/test/playwright.config.ts index 79cf9f02..22834be1 100644 --- a/addons/addon-serialize/test/playwright.config.ts +++ b/addons/addon-serialize/test/playwright.config.ts @@ -26,7 +26,7 @@ const config: PlaywrightTestConfig = { ], reporter: 'list', webServer: { - command: 'npm run start-server-only', + command: 'npm run start', port: 3000, timeout: 120000, reuseExistingServer: !process.env.CI diff --git a/addons/addon-unicode-graphemes/benchmark/UnicodeGraphemeAddon.benchmark.ts b/addons/addon-unicode-graphemes/benchmark/UnicodeGraphemeAddon.benchmark.ts index f1acf8b3..7538b934 100644 --- a/addons/addon-unicode-graphemes/benchmark/UnicodeGraphemeAddon.benchmark.ts +++ b/addons/addon-unicode-graphemes/benchmark/UnicodeGraphemeAddon.benchmark.ts @@ -7,7 +7,7 @@ import { perfContext, before, ThroughputRuntimeCase } from 'xterm-benchmark'; import { spawn } from 'node-pty'; import { Utf8ToUtf32, stringFromCodePoint } from 'common/input/TextDecoder'; -import { Terminal } from 'browser/Terminal'; +import { CoreBrowserTerminal } from 'browser/CoreBrowserTerminal'; import { UnicodeGraphemeProvider } from 'UnicodeGraphemeProvider'; @@ -54,9 +54,9 @@ perfContext('Terminal: ls -lR /usr/lib', () => { }); perfContext('write/string/async', () => { - let terminal: Terminal; + let terminal: CoreBrowserTerminal; before(() => { - terminal = new Terminal({ cols: 80, rows: 25, scrollback: 1000 }); + terminal = new CoreBrowserTerminal({ cols: 80, rows: 25, scrollback: 1000 }); fakedAddonLoad(terminal); }); new ThroughputRuntimeCase('', async () => { @@ -66,9 +66,9 @@ perfContext('Terminal: ls -lR /usr/lib', () => { }); perfContext('write/Utf8/async', () => { - let terminal: Terminal; + let terminal: CoreBrowserTerminal; before(() => { - terminal = new Terminal({ cols: 80, rows: 25, scrollback: 1000 }); + terminal = new CoreBrowserTerminal({ cols: 80, rows: 25, scrollback: 1000 }); }); new ThroughputRuntimeCase('', async () => { await new Promise(res => terminal.write(content, res)); diff --git a/addons/addon-unicode-graphemes/package.json b/addons/addon-unicode-graphemes/package.json index e883d86b..193cdecd 100644 --- a/addons/addon-unicode-graphemes/package.json +++ b/addons/addon-unicode-graphemes/package.json @@ -19,7 +19,7 @@ "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", - "start-server-only": "node ../../demo/start-server-only", + "start": "node ../../demo/start", "benchmark": "NODE_PATH=../../out:./out:./out-benchmark/ ../../node_modules/.bin/xterm-benchmark -r 5 -c benchmark/benchmark.json out-benchmark/benchmark/*benchmark.js", "benchmark-baseline": "NODE_PATH=../../out:./out:./out-benchmark/ ../../node_modules/.bin/xterm-benchmark -r 5 -c benchmark/benchmark.json --baseline out-benchmark/benchmark/*benchmark.js", "benchmark-eval": "NODE_PATH=../../out:./out:./out-benchmark/ ../../node_modules/.bin/xterm-benchmark -r 5 -c benchmark/benchmark.json --eval out-benchmark/benchmark/*benchmark.js" diff --git a/addons/addon-unicode-graphemes/test/playwright.config.ts b/addons/addon-unicode-graphemes/test/playwright.config.ts index 79cf9f02..22834be1 100644 --- a/addons/addon-unicode-graphemes/test/playwright.config.ts +++ b/addons/addon-unicode-graphemes/test/playwright.config.ts @@ -26,7 +26,7 @@ const config: PlaywrightTestConfig = { ], reporter: 'list', webServer: { - command: 'npm run start-server-only', + command: 'npm run start', port: 3000, timeout: 120000, reuseExistingServer: !process.env.CI diff --git a/addons/addon-unicode11/package.json b/addons/addon-unicode11/package.json index ce8c3e25..0981702b 100644 --- a/addons/addon-unicode11/package.json +++ b/addons/addon-unicode11/package.json @@ -19,7 +19,7 @@ "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", - "start-server-only": "node ../../demo/start-server-only" + "start": "node ../../demo/start" }, "peerDependencies": { "@xterm/xterm": "^5.0.0" diff --git a/addons/addon-unicode11/test/playwright.config.ts b/addons/addon-unicode11/test/playwright.config.ts index 79cf9f02..22834be1 100644 --- a/addons/addon-unicode11/test/playwright.config.ts +++ b/addons/addon-unicode11/test/playwright.config.ts @@ -26,7 +26,7 @@ const config: PlaywrightTestConfig = { ], reporter: 'list', webServer: { - command: 'npm run start-server-only', + command: 'npm run start', port: 3000, timeout: 120000, reuseExistingServer: !process.env.CI diff --git a/addons/addon-web-links/package.json b/addons/addon-web-links/package.json index 148047ec..be5cf7c3 100644 --- a/addons/addon-web-links/package.json +++ b/addons/addon-web-links/package.json @@ -19,7 +19,7 @@ "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", - "start-server-only": "node ../../demo/start-server-only" + "start": "node ../../demo/start" }, "peerDependencies": { "@xterm/xterm": "^5.0.0" diff --git a/addons/addon-web-links/test/playwright.config.ts b/addons/addon-web-links/test/playwright.config.ts index 79cf9f02..22834be1 100644 --- a/addons/addon-web-links/test/playwright.config.ts +++ b/addons/addon-web-links/test/playwright.config.ts @@ -26,7 +26,7 @@ const config: PlaywrightTestConfig = { ], reporter: 'list', webServer: { - command: 'npm run start-server-only', + command: 'npm run start', port: 3000, timeout: 120000, reuseExistingServer: !process.env.CI diff --git a/addons/addon-webgl/package.json b/addons/addon-webgl/package.json index da37eb26..6c91daf9 100644 --- a/addons/addon-webgl/package.json +++ b/addons/addon-webgl/package.json @@ -20,7 +20,7 @@ "prepackage": "npm run build", "package": "../../node_modules/.bin/webpack", "prepublishOnly": "npm run package", - "start-server-only": "node ../../demo/start-server-only" + "start": "node ../../demo/start" }, "peerDependencies": { "@xterm/xterm": "^5.0.0" diff --git a/addons/addon-webgl/test/playwright.config.ts b/addons/addon-webgl/test/playwright.config.ts index 79cf9f02..22834be1 100644 --- a/addons/addon-webgl/test/playwright.config.ts +++ b/addons/addon-webgl/test/playwright.config.ts @@ -26,7 +26,7 @@ const config: PlaywrightTestConfig = { ], reporter: 'list', webServer: { - command: 'npm run start-server-only', + command: 'npm run start', port: 3000, timeout: 120000, reuseExistingServer: !process.env.CI diff --git a/addons/addon-webgl/typings/addon-webgl.d.ts b/addons/addon-webgl/typings/addon-webgl.d.ts index 8c560421..6efa709e 100644 --- a/addons/addon-webgl/typings/addon-webgl.d.ts +++ b/addons/addon-webgl/typings/addon-webgl.d.ts @@ -27,6 +27,11 @@ declare module '@xterm/addon-webgl' { */ public readonly onAddTextureAtlasCanvas: IEvent; + /** + * An event that is fired when the a page is removed from the texture atlas. + */ + public readonly onRemoveTextureAtlasCanvas: IEvent; + constructor(preserveDrawingBuffer?: boolean); /** diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs new file mode 100644 index 00000000..38638841 --- /dev/null +++ b/bin/esbuild.mjs @@ -0,0 +1,197 @@ +/** + * Copyright (c) 2023 The xterm.js authors. All rights reserved. + * @license MIT + */ + +// @ts-check + +import { build, context, default as esbuild } from 'esbuild'; +import { argv } from 'process'; + +const config = { + isProd: argv.includes('--prod'), + isWatch: argv.includes('--watch'), + isDemoClient: argv.includes('--demo-client'), + addon: argv.find(e => e.startsWith('--addon='))?.replace(/^--addon=/, ''), +}; + +// console.info('Running with config:', JSON.stringify(config, undefined, 2)); + +/** @type {esbuild.BuildOptions} */ +const commonOptions = { + format: 'esm', + target: 'es2021', + logLevel: 'debug', +}; + +/** @type {esbuild.BuildOptions} */ +const devOptions = { + sourcemap: true, + minify: false, +}; + +/** @type {esbuild.BuildOptions} */ +const prodOptions = { + minify: true, + treeShaking: true, + logLevel: 'debug', + legalComments: 'none', + // TODO: Mangling private and protected properties will reduce bundle size quite a bit, we must + // make sure we don't cast privates to `any` in order to prevent regressions. + //mangleProps: /_.+/, + banner: { + js: `/** + * Copyright (c) 2014-2024 The xterm.js authors. All rights reserved. + * @license MIT + * + * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) + * @license MIT + * + * Originally forked from (with the author's permission): + * Fabrice Bellard's javascript vt100 for jslinux: + * http://bellard.org/jslinux/ + * Copyright (c) 2011 Fabrice Bellard + */ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/` + } + // mangleProps: /_.+/, +}; + +/** + * @param {string} addon + */ +function getAddonEntryPoint(addon) { + let result = ''; + let nextCap = true; + for (const char of addon) { + if (char === '-') { + nextCap = true; + continue; + } + result += nextCap ? char.toUpperCase() : char + nextCap = false; + } + result += 'Addon'; + return result; +} + +/** @type {esbuild.BuildOptions} */ +let bundleConfig = { + bundle: true, + ...commonOptions, + ...(config.isProd ? prodOptions : devOptions) +}; + +/** @type {esbuild.BuildOptions} */ +let outConfig = { + format: 'cjs' +} +let skipOut = false; + +/** @type {esbuild.BuildOptions} */ +let outTestConfig = { + format: 'cjs' +} +let skipOutTest = false; + +if (config.addon) { + bundleConfig = { + ...bundleConfig, + entryPoints: [`addons/addon-${config.addon}/src/${getAddonEntryPoint(config.addon)}.ts`], + outfile: `addons/addon-${config.addon}/lib/xterm-addon-${config.addon}.js`, + }; + outConfig = { + ...outConfig, + entryPoints: [`addons/addon-${config.addon}/src/**/*.ts`], + outdir: `addons/addon-${config.addon}/out-esbuild/` + }; + outTestConfig = { + ...outConfig, + entryPoints: [`addons/addon-${config.addon}/test/**/*.ts`], + outdir: `addons/addon-${config.addon}/out-esbuild-test/` + }; + + if (config.addon === 'ligatures') { + bundleConfig.platform = 'node'; + } + + if (config.addon === 'serialize') { + bundleConfig.tsconfig = 'addons/addon-serialize/src/tsconfig.json' + } + + // Addons that don't have unit tests + if (['ligatures'].includes(config.addon)) { + skipOutTest = true; + } + + // TODO: Fix these + if (config.addon === 'image') { + skipOut = true; + skipOutTest = true; + } +} else { + bundleConfig = { + ...bundleConfig, + entryPoints: [`src/browser/public/Terminal.ts`], + outfile: `lib/xterm.js` + }; + outConfig = { + ...outConfig, + entryPoints: ['src/**/*.ts'], + outdir: 'out-esbuild/' + }; + outTestConfig = { + ...outConfig, + entryPoints: ['test/**/*.ts'], + outdir: 'out-esbuild-test/' + }; +} + +if (config.isDemoClient) { + bundleConfig = { + ...bundleConfig, + entryPoints: [`demo/client.ts`], + outfile: 'demo/dist/client-bundle.js', + external: ['util', 'os', 'fs', 'path', 'stream', 'Terminal'], + alias: { + "@xterm/xterm": ".", + "@xterm/addon-attach": "./addons/addon-attach/lib/xterm-addon-attach.js", + "@xterm/addon-canvas": "./addons/addon-canvas/lib/xterm-addon-canvas.js", + "@xterm/addon-clipboard": "./addons/addon-clipboard/lib/xterm-addon-clipboard.js", + "@xterm/addon-fit": "./addons/addon-fit/lib/xterm-addon-fit.js", + // "@xterm/addon-image": "./addons/addon-image/lib/xterm-addon-image.js", + // "@xterm/addon-ligatures": "./addons/addon-ligatures/lib/xterm-addon-ligatures.js", + "@xterm/addon-search": "./addons/addon-search/lib/xterm-addon-search.js", + "@xterm/addon-serialize": "./addons/addon-serialize/lib/xterm-addon-serialize.js", + "@xterm/addon-web-links": "./addons/addon-web-links/lib/xterm-addon-web-links.js", + "@xterm/addon-webgl": "./addons/addon-webgl/lib/xterm-addon-webgl.js", + "@xterm/addon-unicode11": "./addons/addon-unicode11/lib/xterm-addon-unicode11.js", + "@xterm/addon-unicode-graphemes": "./addons/addon-unicode-graphemes/lib/xterm-addon-unicode-graphemes.js", + + // Needed for out-tsc based image addon + "common/Lifecycle": "./src/common/Lifecycle.ts", + } + } +}; + +if (config.isWatch) { + // TODO: This doesn't report errors? + context(bundleConfig).then(e => e.watch()); + if (!skipOut) { + context(outConfig).then(e => e.watch()); + } + if (!skipOutTest) { + context(outTestConfig).then(e => e.watch()); + } +} else { + await build(bundleConfig); + if (!skipOut) { + await build(outConfig); + } + if (!skipOutTest) { + await build(outTestConfig); + } +} diff --git a/bin/esbuild_all.mjs b/bin/esbuild_all.mjs new file mode 100644 index 00000000..c2d6ba72 --- /dev/null +++ b/bin/esbuild_all.mjs @@ -0,0 +1,55 @@ +// @ts-check + +import { spawn } from "child_process"; +import { readdir } from "fs/promises"; +import { argv } from "process"; + +/** @type {{cp: import("child_process").ChildProcessByStdio, name: string}[]} */ +const jobs = []; + +// Core job +jobs.push(createJob('xterm', [])); + +// Addon jobs +const addons = (await readdir('addons')).map(e => e.replace('addon-', '')); +for (const addon of addons) { + if (addon !== 'image') { + jobs.push(createJob(`xterm-addon-${addon}`, [`--addon=${addon}`])); + } +} + +// Demo job - This requires the others to be built so it's not included when building all +// jobs.push(createJob('demo-client', [`--demo-client`])); + +await Promise.all(jobs.map((job, i) => { + return new Promise(r => { + job.cp.on('exit', code => { + log(`Finished \x1b[32m${job.name}\x1b[0m${code ? ' \x1b[31mwith errors\x1b[0m' : ''}`); + r(code); + }); + }); +})); + +/** + * @param {string} message + */ +function log(message) { + console.info(`[\x1b[2m${new Date().toLocaleTimeString('en-GB')}\x1b[0m] ${message}`); +} + +/** + * @param {string} name + * @param {string[]} extraArgs + */ +function createJob(name, extraArgs) { + log(`Starting \x1b[32m${name}\x1b[0m...`); + const args = [ + 'bin/esbuild.mjs', + ...extraArgs, + ...argv + ]; + return { + name, + cp: spawn('node', args, { stdio: ["inherit", "inherit", "inherit"] }) + }; +} diff --git a/demo/client.ts b/demo/client.ts index 4df15eb5..6cd0e1bc 100644 --- a/demo/client.ts +++ b/demo/client.ts @@ -8,21 +8,11 @@ /// -// Use tsc version (yarn watch) -import { Terminal } from '../out/browser/public/Terminal'; -import { AttachAddon } from '../addons/addon-attach/out/AttachAddon'; -import { CanvasAddon } from '../addons/addon-canvas/out/CanvasAddon'; -import { ClipboardAddon } from '../addons/addon-clipboard/out/ClipboardAddon'; -import { FitAddon } from '../addons/addon-fit/out/FitAddon'; -import { SearchAddon, ISearchOptions } from '../addons/addon-search/out/SearchAddon'; -import { SerializeAddon } from '../addons/addon-serialize/out/SerializeAddon'; -import { WebLinksAddon } from '../addons/addon-web-links/out/WebLinksAddon'; -import { WebglAddon } from '../addons/addon-webgl/out/WebglAddon'; -import { Unicode11Addon } from '../addons/addon-unicode11/out/Unicode11Addon'; -import { UnicodeGraphemesAddon } from '../addons/addon-unicode-graphemes/out/UnicodeGraphemesAddon'; -import { LigaturesAddon } from '../addons/addon-ligatures/out/LigaturesAddon'; +// TODO: Move to regular import? +import { LigaturesAddon } from '../addons/addon-ligatures/out-esbuild/LigaturesAddon'; -// Playwright/WebKit on Windows does not support WebAssembly https://stackoverflow.com/q/62311688/1156119 +// DEBT: The image addon is not currently build with esbuild +// HACK: Playwright/WebKit on Windows does not support WebAssembly https://stackoverflow.com/q/62311688/1156119 import type { ImageAddonType, IImageAddonOptions } from '../addons/addon-image/out/ImageAddon'; let ImageAddon: ImageAddonType | undefined; // eslint-disable-line @typescript-eslint/naming-convention if ('WebAssembly' in window) { @@ -30,32 +20,28 @@ if ('WebAssembly' in window) { ImageAddon = imageAddon.ImageAddon; } -// Use webpacked version (yarn package) -// import { Terminal } from '../lib/xterm'; -// import { AttachAddon } from '@xterm/addon-attach'; -// import { ClipboardAddon } from '@xterm/addon-clipboard'; -// import { FitAddon } from '@xterm/addon-fit'; +import { Terminal as TerminalCtor, ITerminalOptions, type IDisposable } from '@xterm/xterm'; +import { AttachAddon } from '@xterm/addon-attach'; +import { CanvasAddon } from '@xterm/addon-canvas'; +import { ClipboardAddon } from '@xterm/addon-clipboard'; +import { FitAddon } from '@xterm/addon-fit'; // import { ImageAddon } from '@xterm/addon-image'; -// import { SearchAddon, ISearchOptions } from '@xterm/addon-search'; -// import { SerializeAddon } from '@xterm/addon-serialize'; -// import { WebLinksAddon } from '@xterm/addon-web-links'; -// import { WebglAddon } from '@@xterm/addon-webgl'; -// import { Unicode11Addon } from '@xterm/addon-unicode11'; -// import { UnicodeGraphemesAddon } from '@xterm/addon-unicode-graphemes'; // import { LigaturesAddon } from '@xterm/addon-ligatures'; - -// Pulling in the module's types relies on the above, it's looks a -// little weird here as we're importing "this" module -import { Terminal as TerminalType, ITerminalOptions, type IDisposable } from '@xterm/xterm'; +import { SearchAddon, ISearchOptions } from '@xterm/addon-search'; +import { SerializeAddon } from '@xterm/addon-serialize'; +import { WebLinksAddon } from '@xterm/addon-web-links'; +import { WebglAddon } from '@xterm/addon-webgl'; +import { Unicode11Addon } from '@xterm/addon-unicode11'; +import { UnicodeGraphemesAddon } from '@xterm/addon-unicode-graphemes'; export interface IWindowWithTerminal extends Window { - term: TerminalType; - Terminal?: typeof TerminalType; // eslint-disable-line @typescript-eslint/naming-convention + term: TerminalCtor; + Terminal: typeof TerminalCtor; AttachAddon?: typeof AttachAddon; // eslint-disable-line @typescript-eslint/naming-convention CanvasAddon?: typeof CanvasAddon; // eslint-disable-line @typescript-eslint/naming-convention ClipboardAddon?: typeof ClipboardAddon; // eslint-disable-line @typescript-eslint/naming-convention FitAddon?: typeof FitAddon; // eslint-disable-line @typescript-eslint/naming-convention - ImageAddon?: typeof ImageAddonType; // eslint-disable-line @typescript-eslint/naming-convention + ImageAddon?: typeof ImageAddon; // eslint-disable-line @typescript-eslint/naming-convention SearchAddon?: typeof SearchAddon; // eslint-disable-line @typescript-eslint/naming-convention SerializeAddon?: typeof SerializeAddon; // eslint-disable-line @typescript-eslint/naming-convention WebLinksAddon?: typeof WebLinksAddon; // eslint-disable-line @typescript-eslint/naming-convention @@ -84,13 +70,14 @@ interface IDemoAddon { T extends 'clipboard' ? typeof ClipboardAddon : T extends 'fit' ? typeof FitAddon : T extends 'image' ? typeof ImageAddonType : - T extends 'search' ? typeof SearchAddon : - T extends 'serialize' ? typeof SerializeAddon : - T extends 'webLinks' ? typeof WebLinksAddon : - T extends 'unicode11' ? typeof Unicode11Addon : - T extends 'unicodeGraphemes' ? typeof UnicodeGraphemesAddon : - T extends 'ligatures' ? typeof LigaturesAddon : - typeof WebglAddon + T extends 'ligatures' ? typeof LigaturesAddon : + T extends 'search' ? typeof SearchAddon : + T extends 'serialize' ? typeof SerializeAddon : + T extends 'webLinks' ? typeof WebLinksAddon : + T extends 'unicode11' ? typeof Unicode11Addon : + T extends 'unicodeGraphemes' ? typeof UnicodeGraphemesAddon : + T extends 'webgl' ? typeof WebglAddon : + never ); instance?: ( T extends 'attach' ? AttachAddon : @@ -98,13 +85,13 @@ interface IDemoAddon { T extends 'clipboard' ? ClipboardAddon : T extends 'fit' ? FitAddon : T extends 'image' ? ImageAddonType : - T extends 'search' ? SearchAddon : - T extends 'serialize' ? SerializeAddon : - T extends 'webLinks' ? WebLinksAddon : - T extends 'webgl' ? WebglAddon : - T extends 'unicode11' ? typeof Unicode11Addon : - T extends 'unicodeGraphemes' ? typeof UnicodeGraphemesAddon : - T extends 'ligatures' ? typeof LigaturesAddon : + T extends 'ligatures' ? LigaturesAddon : + T extends 'search' ? SearchAddon : + T extends 'serialize' ? SerializeAddon : + T extends 'webLinks' ? WebLinksAddon : + T extends 'unicode11' ? Unicode11Addon : + T extends 'unicodeGraphemes' ? UnicodeGraphemesAddon : + T extends 'webgl' ? WebglAddon : never ); } @@ -232,7 +219,7 @@ const createNewWindowButtonHandler: () => void = () => { }; if (document.location.pathname === '/test') { - window.Terminal = Terminal; + window.Terminal = TerminalCtor; window.AttachAddon = AttachAddon; window.CanvasAddon = CanvasAddon; window.ClipboardAddon = ClipboardAddon; @@ -278,7 +265,7 @@ function createTerminal(): void { } const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].indexOf(navigator.platform) >= 0; - term = new Terminal({ + term = new TerminalCtor({ allowProposedApi: true, windowsPty: isWindows ? { // In a real scenario, these values should be verified on the backend @@ -290,7 +277,7 @@ function createTerminal(): void { } as ITerminalOptions); // Load addons - const typedTerm = term as TerminalType; + const typedTerm = term as TerminalCtor; addons.search.instance = new SearchAddon(); addons.serialize.instance = new SerializeAddon(); addons.fit.instance = new FitAddon(); @@ -443,7 +430,7 @@ function runFakeTerminal(): void { }); } -function initOptions(term: TerminalType): void { +function initOptions(term: TerminalCtor): void { const blacklistedOptions = [ // Internal only options 'cancelEvents', @@ -619,7 +606,7 @@ function initOptions(term: TerminalType): void { }); } -function initAddons(term: TerminalType): void { +function initAddons(term: TerminalCtor): void { const fragment = document.createDocumentFragment(); Object.keys(addons).forEach((name: AddonType) => { const addon = addons[name]; @@ -1190,7 +1177,7 @@ function decorationStressTest(): void { } decorationStressTestDecorations = undefined; } else { - const t = term as Terminal; + const t = term as TerminalCtor; const buffer = t.buffer.active; const cursorY = buffer.baseY + buffer.cursorY; decorationStressTestDecorations = []; diff --git a/demo/start-server-only.js b/demo/start-server-only.js deleted file mode 100644 index b240966f..00000000 --- a/demo/start-server-only.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) 2018 The xterm.js authors. All rights reserved. - * @license MIT - */ - -// @ts-check - -const startServer = require('./server.js'); - -startServer(); diff --git a/demo/start.js b/demo/start.js index c0037545..b240966f 100644 --- a/demo/start.js +++ b/demo/start.js @@ -5,22 +5,6 @@ // @ts-check -const clientConfig = require('./webpack.config'); -const webpack = require('webpack'); const startServer = require('./server.js'); startServer(); - -const compiler = webpack(clientConfig); - -compiler.watch({ - aggregateTimeout: 300, - poll: undefined -}, (err, stats) => { - if (err) { - console.error(err); - } - console.log(stats?.toString({ - colors: true - })); -}); diff --git a/demo/tsconfig.json b/demo/tsconfig.json index 4114f6d6..1d632e8f 100644 --- a/demo/tsconfig.json +++ b/demo/tsconfig.json @@ -6,14 +6,18 @@ "sourceMap": true, "baseUrl": ".", "paths": { - "addon-attach": ["../addons/addon-attach"], - "addon-clipboard": ["../addons/addon-clipboard"], - "addon-fit": ["../addons/addon-fit"], - "addon-image": ["../addons/addon-image"], - "addon-search": ["../addons/addon-search"], - "addon-serialize": ["../addons/addon-serialize"], - "addon-web-links": ["../addons/addon-web-links"], - "addon-webgl": ["../addons/addon-webgl"] + "@xterm/addon-attach": ["../addons/addon-attach"], + "@xterm/addon-canvas": ["../addons/addon-canvas"], + "@xterm/addon-clipboard": ["../addons/addon-clipboard"], + "@xterm/addon-fit": ["../addons/addon-fit"], + "@xterm/addon-image": ["../addons/addon-image"], + "@xterm/addon-search": ["../addons/addon-search"], + "@xterm/addon-serialize": ["../addons/addon-serialize"], + "@xterm/addon-web-links": ["../addons/addon-web-links"], + "@xterm/addon-webgl": ["../addons/addon-webgl"], + "@xterm/addon-unicode11": ["../addons/addon-unicode11"], + "@xterm/addon-unicode-graphemes": ["../addons/addon-unicode-graphemes"], + "@xterm/addon-ligatures": ["../addons/addon-ligatures"] } }, "include": [ diff --git a/package.json b/package.json index 4790fc43..5174f39e 100644 --- a/package.json +++ b/package.json @@ -23,36 +23,58 @@ "xterm" ], "scripts": { - "prepackage": "npm run build", - "package": "webpack", - "package-headless": "webpack --config ./webpack.config.headless.js", - "postpackage-headless": "node ./bin/package_headless.js", + "setup": "npm run build", + "presetup": "npm run install-addons", + "install-addons": "node ./bin/install-addons.js", + "start": "node demo/start", - "start-server-only": "node demo/start-server-only", "build-demo": "webpack --config ./demo/webpack.config.js", - "lint": "eslint -c .eslintrc.json --max-warnings 0 --ext .ts src/ addons/", - "lint-api": "eslint --no-eslintrc -c .eslintrc.json.typings --max-warnings 0 --no-ignore --ext .d.ts typings/", + + "build": "npm run tsc", + "watch": "npm run tsc-watch", + "tsc": "tsc -b ./tsconfig.all.json", + "tsc-watch": "tsc -b -w ./tsconfig.all.json --preserveWatchOutput", + + "esbuild": "node bin/esbuild_all.mjs", + "esbuild-watch": "node bin/esbuild_all.mjs --watch", + "esbuild-package": "node bin/esbuild_all.mjs --prod", + "esbuild-package-watch": "node bin/esbuild_all.mjs --prod --watch", + "esbuild-demo": "node bin/esbuild.mjs --demo-client", + "esbuild-demo-watch": "node bin/esbuild.mjs --demo-client --watch", + "test": "npm run test-unit", "posttest": "npm run lint", + + "lint": "eslint -c .eslintrc.json --max-warnings 0 --ext .ts src/ addons/", + "lint-api": "eslint --no-eslintrc -c .eslintrc.json.typings --max-warnings 0 --no-ignore --ext .d.ts typings/", + + "test-unit": "node ./bin/test.js", + "test-unit-coverage": "node ./bin/test.js --coverage", + "test-unit-dev": "cross-env NODE_PATH='./out' mocha", + + "test-api": "npm run test-api-chromium", + "test-api-chromium": "node ./bin/test_api.js --browser=chromium --timeout=20000", + "test-api-firefox": "node ./bin/test_api.js --browser=firefox --timeout=20000", + "test-api-webkit": "node ./bin/test_api.js --browser=webkit --timeout=20000", + "test-integration": "node ./bin/test_playwright.js --workers=75%", "test-integration-chromium": "node ./bin/test_playwright.js --workers=75% \"--project=ChromeStable\"", "test-integration-firefox": "node ./bin/test_playwright.js --workers=75% \"--project=FirefoxStable\"", "test-integration-webkit": "node ./bin/test_playwright.js --workers=75% \"--project=WebKit\"", "test-integration-debug": "node ./bin/test_playwright.js --workers=1 --headed --timeout=30000", - "test-unit": "node ./bin/test.js", - "test-unit-coverage": "node ./bin/test.js --coverage", - "test-unit-dev": "cross-env NODE_PATH='./out' mocha", - "build": "tsc -b ./tsconfig.all.json", - "install-addons": "node ./bin/install-addons.js", - "presetup": "npm run install-addons", - "setup": "npm run build", - "prepublishOnly": "npm run package", - "watch": "tsc -b -w ./tsconfig.all.json --preserveWatchOutput", + "benchmark": "NODE_PATH=./out xterm-benchmark -r 5 -c test/benchmark/benchmark.json", - "benchmark-baseline": "NODE_PATH=./out xterm-benchmark -r 5 -c test/benchmark/benchmark.json --baseline out-test/benchmark/test/benchmark/*benchmark.js", - "benchmark-eval": "NODE_PATH=./out xterm-benchmark -r 5 -c test/benchmark/benchmark.json --eval out-test/benchmark/test/benchmark/*benchmark.js", + "benchmark-baseline": "NODE_PATH=./out xterm-benchmark -r 5 -c test/benchmark/benchmark.json --baseline out-tsc/test-benchmark/test/benchmark/*benchmark.js", + "benchmark-eval": "NODE_PATH=./out xterm-benchmark -r 5 -c test/benchmark/benchmark.json --eval out-tsc/test-benchmark/test/benchmark/*benchmark.js", + "clean": "rm -rf lib out addons/*/lib addons/*/out", - "vtfeatures": "node bin/extract_vtfeatures.js src/**/*.ts src/*.ts" + "vtfeatures": "node bin/extract_vtfeatures.js src/**/*.ts src/*.ts", + + "prepackage": "npm run build", + "package": "webpack", + "package-headless": "webpack --config ./webpack.config.headless.js", + "postpackage-headless": "node ./bin/package_headless.js", + "prepublishOnly": "npm run package" }, "devDependencies": { "@lunapaint/png-codec": "^0.2.0", @@ -75,6 +97,7 @@ "chai": "^4.3.4", "cross-env": "^7.0.3", "deep-equal": "^2.0.5", + "esbuild": "^0.23.0", "eslint": "^8.56.0", "eslint-plugin-jsdoc": "^46.9.1", "express": "^4.19.2", diff --git a/src/browser/Terminal.ts b/src/browser/CoreBrowserTerminal.ts similarity index 99% rename from src/browser/Terminal.ts rename to src/browser/CoreBrowserTerminal.ts index 0e945aa9..6d684953 100644 --- a/src/browser/Terminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -59,7 +59,7 @@ import { WindowsOptionsReportType } from '../common/InputHandler'; import { AccessibilityManager } from './AccessibilityManager'; import { LinkProviderService } from 'browser/services/LinkProviderService'; -export class Terminal extends CoreTerminal implements ITerminal { +export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { public textarea: HTMLTextAreaElement | undefined; public element: HTMLElement | undefined; public screenElement: HTMLElement | undefined; diff --git a/src/browser/Terminal2.test.ts b/src/browser/Terminal2.test.ts index abbb42d3..8401ba78 100644 --- a/src/browser/Terminal2.test.ts +++ b/src/browser/Terminal2.test.ts @@ -8,7 +8,7 @@ import * as path from 'path'; import * as os from 'os'; import * as fs from 'fs'; import * as pty from 'node-pty'; -import { Terminal } from 'browser/Terminal'; +import { CoreBrowserTerminal } from 'browser/CoreBrowserTerminal'; import { IDisposable } from '@xterm/xterm'; // all test files expect terminal in 80x25 @@ -40,7 +40,7 @@ describe('Escape Sequence Files', function(): void { let ptyTerm: any; let slaveEnd: any; - let term: Terminal; + let term: CoreBrowserTerminal; let customHandler: IDisposable | undefined; before(() => { @@ -49,7 +49,7 @@ describe('Escape Sequence Files', function(): void { } ptyTerm = (pty as any).open({cols: COLS, rows: ROWS}); slaveEnd = ptyTerm._slave; - term = new Terminal({cols: COLS, rows: ROWS}); + term = new CoreBrowserTerminal({cols: COLS, rows: ROWS}); ptyTerm._master.on('data', (data: string) => term.write(data)); }); @@ -121,7 +121,7 @@ function formatError(input: string, output: string, expected: string): string { } // simple debug output of terminal cells -function terminalToString(term: Terminal): string { +function terminalToString(term: CoreBrowserTerminal): string { let result = ''; let lineText = ''; for (let line = term.buffer.ybase; line < term.buffer.ybase + term.rows; line++) { diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index c7c8438c..45af130f 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -12,7 +12,7 @@ import { IBuffer, IBufferSet } from 'common/buffer/Types'; import { IBufferLine, ICellData, IAttributeData, ICircularList, XtermListener, ICharset, ITerminalOptions, ColorIndex } from 'common/Types'; import { Buffer } from 'common/buffer/Buffer'; import * as Browser from 'common/Platform'; -import { Terminal } from 'browser/Terminal'; +import { CoreBrowserTerminal } from 'browser/CoreBrowserTerminal'; import { IUnicodeService, IOptionsService, ICoreService, ICoreMouseService } from 'common/services/Services'; import { IFunctionIdentifier, IParams } from 'common/parser/Types'; import { AttributeData } from 'common/buffer/AttributeData'; @@ -20,7 +20,7 @@ import { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from import { css } from 'common/Color'; import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils'; -export class TestTerminal extends Terminal { +export class TestTerminal extends CoreBrowserTerminal { public get curAttrData(): IAttributeData { return (this as any)._inputHandler._curAttrData; } public keyDown(ev: any): boolean | undefined { return this._keyDown(ev); } public keyPress(ev: any): boolean { return this._keyPress(ev); } diff --git a/src/browser/Types.ts b/src/browser/Types.ts index 24f008a1..9ef9d3a8 100644 --- a/src/browser/Types.ts +++ b/src/browser/Types.ts @@ -7,6 +7,7 @@ import { IEvent } from 'common/EventEmitter'; import { CharData, IColor, ICoreTerminal, ITerminalOptions } from 'common/Types'; import { IBuffer } from 'common/buffer/Types'; import { IDisposable, Terminal as ITerminalApi } from '@xterm/xterm'; +import { channels, css } from 'common/Color'; /** * A portion of the public API that are implemented identially internally and simply passed through. @@ -172,3 +173,51 @@ export interface IRenderDebouncerWithCallback extends IRenderDebouncer { export interface IBufferElementProvider { provideBufferElements(): DocumentFragment | HTMLElement; } + +// An IIFE to generate DEFAULT_ANSI_COLORS. +export const DEFAULT_ANSI_COLORS = Object.freeze((() => { + const colors = [ + // dark: + css.toColor('#2e3436'), + css.toColor('#cc0000'), + css.toColor('#4e9a06'), + css.toColor('#c4a000'), + css.toColor('#3465a4'), + css.toColor('#75507b'), + css.toColor('#06989a'), + css.toColor('#d3d7cf'), + // bright: + css.toColor('#555753'), + css.toColor('#ef2929'), + css.toColor('#8ae234'), + css.toColor('#fce94f'), + css.toColor('#729fcf'), + css.toColor('#ad7fa8'), + css.toColor('#34e2e2'), + css.toColor('#eeeeec') + ]; + + // Fill in the remaining 240 ANSI colors. + // Generate colors (16-231) + const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]; + for (let i = 0; i < 216; i++) { + const r = v[(i / 36) % 6 | 0]; + const g = v[(i / 6) % 6 | 0]; + const b = v[i % 6]; + colors.push({ + css: channels.toCss(r, g, b), + rgba: channels.toRgba(r, g, b) + }); + } + + // Generate greys (232-255) + for (let i = 0; i < 24; i++) { + const c = 8 + i * 10; + colors.push({ + css: channels.toCss(c, c, c), + rgba: channels.toRgba(c, c, c) + }); + } + + return colors; +})()); diff --git a/src/browser/public/Terminal.ts b/src/browser/public/Terminal.ts index 56edbc50..cb4f221e 100644 --- a/src/browser/public/Terminal.ts +++ b/src/browser/public/Terminal.ts @@ -4,7 +4,7 @@ */ import * as Strings from 'browser/LocalizableStrings'; -import { Terminal as TerminalCore } from 'browser/Terminal'; +import { CoreBrowserTerminal as TerminalCore } from 'browser/CoreBrowserTerminal'; import { IBufferRange, ITerminal } from 'browser/Types'; import { IEvent } from 'common/EventEmitter'; import { Disposable } from 'common/Lifecycle'; diff --git a/src/browser/services/ThemeService.test.ts b/src/browser/services/ThemeService.test.ts index cdfa87df..a36dea31 100644 --- a/src/browser/services/ThemeService.test.ts +++ b/src/browser/services/ThemeService.test.ts @@ -5,8 +5,9 @@ import jsdom = require('jsdom'); import { assert } from 'chai'; -import { ThemeService, DEFAULT_ANSI_COLORS } from 'browser/services/ThemeService'; +import { ThemeService } from 'browser/services/ThemeService'; import { OptionsService } from 'common/services/OptionsService'; +import { DEFAULT_ANSI_COLORS } from 'browser/Types'; describe('ThemeService', () => { let themeService: ThemeService; diff --git a/src/browser/services/ThemeService.ts b/src/browser/services/ThemeService.ts index 199b3ace..31b1192c 100644 --- a/src/browser/services/ThemeService.ts +++ b/src/browser/services/ThemeService.ts @@ -5,8 +5,8 @@ import { ColorContrastCache } from 'browser/ColorContrastCache'; import { IThemeService } from 'browser/services/Services'; -import { IColorContrastCache, IColorSet, ReadonlyColorSet } from 'browser/Types'; -import { channels, color, css, NULL_COLOR } from 'common/Color'; +import { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from 'browser/Types'; +import { color, css, NULL_COLOR } from 'common/Color'; import { EventEmitter } from 'common/EventEmitter'; import { Disposable } from 'common/Lifecycle'; import { IOptionsService, ITheme } from 'common/services/Services'; @@ -29,54 +29,6 @@ const DEFAULT_SELECTION = { rgba: 0xFFFFFF4D }; -// An IIFE to generate DEFAULT_ANSI_COLORS. -export const DEFAULT_ANSI_COLORS = Object.freeze((() => { - const colors = [ - // dark: - css.toColor('#2e3436'), - css.toColor('#cc0000'), - css.toColor('#4e9a06'), - css.toColor('#c4a000'), - css.toColor('#3465a4'), - css.toColor('#75507b'), - css.toColor('#06989a'), - css.toColor('#d3d7cf'), - // bright: - css.toColor('#555753'), - css.toColor('#ef2929'), - css.toColor('#8ae234'), - css.toColor('#fce94f'), - css.toColor('#729fcf'), - css.toColor('#ad7fa8'), - css.toColor('#34e2e2'), - css.toColor('#eeeeec') - ]; - - // Fill in the remaining 240 ANSI colors. - // Generate colors (16-231) - const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]; - for (let i = 0; i < 216; i++) { - const r = v[(i / 36) % 6 | 0]; - const g = v[(i / 6) % 6 | 0]; - const b = v[i % 6]; - colors.push({ - css: channels.toCss(r, g, b), - rgba: channels.toRgba(r, g, b) - }); - } - - // Generate greys (232-255) - for (let i = 0; i < 24; i++) { - const c = 8 + i * 10; - colors.push({ - css: channels.toCss(c, c, c), - rgba: channels.toRgba(c, c, c) - }); - } - - return colors; -})()); - export class ThemeService extends Disposable implements IThemeService { public serviceBrand: undefined; diff --git a/test/benchmark/Terminal.benchmark.ts b/test/benchmark/Terminal.benchmark.ts index d2b6ed8f..4944495b 100644 --- a/test/benchmark/Terminal.benchmark.ts +++ b/test/benchmark/Terminal.benchmark.ts @@ -7,7 +7,7 @@ import { perfContext, before, ThroughputRuntimeCase } from 'xterm-benchmark'; import { spawn } from 'node-pty'; import { Utf8ToUtf32, stringFromCodePoint } from 'common/input/TextDecoder'; -import { Terminal } from 'browser/Terminal'; +import { CoreBrowserTerminal } from 'browser/CoreBrowserTerminal'; perfContext('Terminal: ls -lR /usr/lib', () => { let content = ''; @@ -45,9 +45,9 @@ perfContext('Terminal: ls -lR /usr/lib', () => { }); perfContext('write/string/async', () => { - let terminal: Terminal; + let terminal: CoreBrowserTerminal; before(() => { - terminal = new Terminal({ cols: 80, rows: 25, scrollback: 1000 }); + terminal = new CoreBrowserTerminal({ cols: 80, rows: 25, scrollback: 1000 }); }); new ThroughputRuntimeCase('', async () => { await new Promise(res => terminal.write(content, res)); @@ -56,9 +56,9 @@ perfContext('Terminal: ls -lR /usr/lib', () => { }); perfContext('write/Utf8/async', () => { - let terminal: Terminal; + let terminal: CoreBrowserTerminal; before(() => { - terminal = new Terminal({ cols: 80, rows: 25, scrollback: 1000 }); + terminal = new CoreBrowserTerminal({ cols: 80, rows: 25, scrollback: 1000 }); }); new ThroughputRuntimeCase('', async () => { await new Promise(res => terminal.write(content, res)); diff --git a/yarn.lock b/yarn.lock index 4a8c5e7d..1422c7db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -274,6 +274,126 @@ esquery "^1.5.0" jsdoc-type-pratt-parser "~4.0.0" +"@esbuild/aix-ppc64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz#145b74d5e4a5223489cabdc238d8dad902df5259" + integrity sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ== + +"@esbuild/android-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz#453bbe079fc8d364d4c5545069e8260228559832" + integrity sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ== + +"@esbuild/android-arm@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.0.tgz#26c806853aa4a4f7e683e519cd9d68e201ebcf99" + integrity sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g== + +"@esbuild/android-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.0.tgz#1e51af9a6ac1f7143769f7ee58df5b274ed202e6" + integrity sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ== + +"@esbuild/darwin-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz#d996187a606c9534173ebd78c58098a44dd7ef9e" + integrity sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow== + +"@esbuild/darwin-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz#30c8f28a7ef4e32fe46501434ebe6b0912e9e86c" + integrity sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ== + +"@esbuild/freebsd-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz#30f4fcec8167c08a6e8af9fc14b66152232e7fb4" + integrity sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw== + +"@esbuild/freebsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz#1003a6668fe1f5d4439e6813e5b09a92981bc79d" + integrity sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ== + +"@esbuild/linux-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz#3b9a56abfb1410bb6c9138790f062587df3e6e3a" + integrity sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw== + +"@esbuild/linux-arm@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz#237a8548e3da2c48cd79ae339a588f03d1889aad" + integrity sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw== + +"@esbuild/linux-ia32@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz#4269cd19cb2de5de03a7ccfc8855dde3d284a238" + integrity sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA== + +"@esbuild/linux-loong64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz#82b568f5658a52580827cc891cb69d2cb4f86280" + integrity sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A== + +"@esbuild/linux-mips64el@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz#9a57386c926262ae9861c929a6023ed9d43f73e5" + integrity sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w== + +"@esbuild/linux-ppc64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz#f3a79fd636ba0c82285d227eb20ed8e31b4444f6" + integrity sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw== + +"@esbuild/linux-riscv64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz#f9d2ef8356ce6ce140f76029680558126b74c780" + integrity sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw== + +"@esbuild/linux-s390x@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz#45390f12e802201f38a0229e216a6aed4351dfe8" + integrity sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg== + +"@esbuild/linux-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz#c8409761996e3f6db29abcf9b05bee8d7d80e910" + integrity sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ== + +"@esbuild/netbsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz#ba70db0114380d5f6cfb9003f1d378ce989cd65c" + integrity sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw== + +"@esbuild/openbsd-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz#72fc55f0b189f7a882e3cf23f332370d69dfd5db" + integrity sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ== + +"@esbuild/openbsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz#b6ae7a0911c18fe30da3db1d6d17a497a550e5d8" + integrity sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg== + +"@esbuild/sunos-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz#58f0d5e55b9b21a086bfafaa29f62a3eb3470ad8" + integrity sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA== + +"@esbuild/win32-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz#b858b2432edfad62e945d5c7c9e5ddd0f528ca6d" + integrity sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ== + +"@esbuild/win32-ia32@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz#167ef6ca22a476c6c0c014a58b4f43ae4b80dec7" + integrity sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA== + +"@esbuild/win32-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz#db44a6a08520b5f25bbe409f34a59f2d4bcc7ced" + integrity sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g== + "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1756,6 +1876,36 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +esbuild@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.0.tgz#de06002d48424d9fdb7eb52dbe8e95927f852599" + integrity sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.23.0" + "@esbuild/android-arm" "0.23.0" + "@esbuild/android-arm64" "0.23.0" + "@esbuild/android-x64" "0.23.0" + "@esbuild/darwin-arm64" "0.23.0" + "@esbuild/darwin-x64" "0.23.0" + "@esbuild/freebsd-arm64" "0.23.0" + "@esbuild/freebsd-x64" "0.23.0" + "@esbuild/linux-arm" "0.23.0" + "@esbuild/linux-arm64" "0.23.0" + "@esbuild/linux-ia32" "0.23.0" + "@esbuild/linux-loong64" "0.23.0" + "@esbuild/linux-mips64el" "0.23.0" + "@esbuild/linux-ppc64" "0.23.0" + "@esbuild/linux-riscv64" "0.23.0" + "@esbuild/linux-s390x" "0.23.0" + "@esbuild/linux-x64" "0.23.0" + "@esbuild/netbsd-x64" "0.23.0" + "@esbuild/openbsd-arm64" "0.23.0" + "@esbuild/openbsd-x64" "0.23.0" + "@esbuild/sunos-x64" "0.23.0" + "@esbuild/win32-arm64" "0.23.0" + "@esbuild/win32-ia32" "0.23.0" + "@esbuild/win32-x64" "0.23.0" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" From ba3ba899a53f284843fee4e50b620c9d0ac2ad24 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 08:55:01 -0700 Subject: [PATCH 02/25] Clean up --- bin/esbuild.mjs | 1 - demo/client.ts | 19 +++++++++---------- test/playwright/MouseTracking.test.ts | 2 -- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs index 38638841..7ddecd43 100644 --- a/bin/esbuild.mjs +++ b/bin/esbuild.mjs @@ -178,7 +178,6 @@ if (config.isDemoClient) { }; if (config.isWatch) { - // TODO: This doesn't report errors? context(bundleConfig).then(e => e.watch()); if (!skipOut) { context(outConfig).then(e => e.watch()); diff --git a/demo/client.ts b/demo/client.ts index 6cd0e1bc..c1404882 100644 --- a/demo/client.ts +++ b/demo/client.ts @@ -20,7 +20,7 @@ if ('WebAssembly' in window) { ImageAddon = imageAddon.ImageAddon; } -import { Terminal as TerminalCtor, ITerminalOptions, type IDisposable } from '@xterm/xterm'; +import { Terminal, ITerminalOptions, type IDisposable } from '@xterm/xterm'; import { AttachAddon } from '@xterm/addon-attach'; import { CanvasAddon } from '@xterm/addon-canvas'; import { ClipboardAddon } from '@xterm/addon-clipboard'; @@ -35,8 +35,8 @@ import { Unicode11Addon } from '@xterm/addon-unicode11'; import { UnicodeGraphemesAddon } from '@xterm/addon-unicode-graphemes'; export interface IWindowWithTerminal extends Window { - term: TerminalCtor; - Terminal: typeof TerminalCtor; + term: typeof Terminal; + Terminal: typeof Terminal; AttachAddon?: typeof AttachAddon; // eslint-disable-line @typescript-eslint/naming-convention CanvasAddon?: typeof CanvasAddon; // eslint-disable-line @typescript-eslint/naming-convention ClipboardAddon?: typeof ClipboardAddon; // eslint-disable-line @typescript-eslint/naming-convention @@ -219,7 +219,7 @@ const createNewWindowButtonHandler: () => void = () => { }; if (document.location.pathname === '/test') { - window.Terminal = TerminalCtor; + window.Terminal = Terminal; window.AttachAddon = AttachAddon; window.CanvasAddon = CanvasAddon; window.ClipboardAddon = ClipboardAddon; @@ -265,7 +265,7 @@ function createTerminal(): void { } const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].indexOf(navigator.platform) >= 0; - term = new TerminalCtor({ + term = new Terminal({ allowProposedApi: true, windowsPty: isWindows ? { // In a real scenario, these values should be verified on the backend @@ -277,7 +277,7 @@ function createTerminal(): void { } as ITerminalOptions); // Load addons - const typedTerm = term as TerminalCtor; + const typedTerm = term as Terminal; addons.search.instance = new SearchAddon(); addons.serialize.instance = new SerializeAddon(); addons.fit.instance = new FitAddon(); @@ -430,7 +430,7 @@ function runFakeTerminal(): void { }); } -function initOptions(term: TerminalCtor): void { +function initOptions(term: Terminal): void { const blacklistedOptions = [ // Internal only options 'cancelEvents', @@ -438,7 +438,6 @@ function initOptions(term: TerminalCtor): void { 'termName', 'cols', 'rows', // subsumed by "size" (colsRows) option // Complex option - 'documentOverride', 'linkHandler', 'logger', 'theme', @@ -606,7 +605,7 @@ function initOptions(term: TerminalCtor): void { }); } -function initAddons(term: TerminalCtor): void { +function initAddons(term: Terminal): void { const fragment = document.createDocumentFragment(); Object.keys(addons).forEach((name: AddonType) => { const addon = addons[name]; @@ -1177,7 +1176,7 @@ function decorationStressTest(): void { } decorationStressTestDecorations = undefined; } else { - const t = term as TerminalCtor; + const t = term as Terminal; const buffer = t.buffer.active; const cursorY = buffer.baseY + buffer.cursorY; decorationStressTestDecorations = []; diff --git a/test/playwright/MouseTracking.test.ts b/test/playwright/MouseTracking.test.ts index 1cefd7cd..7620f881 100644 --- a/test/playwright/MouseTracking.test.ts +++ b/test/playwright/MouseTracking.test.ts @@ -3,8 +3,6 @@ * @license MIT */ import { test } from '@playwright/test'; -import { deepStrictEqual, ok, strictEqual } from 'assert'; -import type { IDisposable } from '@xterm/xterm'; import { createTestContext, ITestContext, openTerminal, pollFor } from './TestUtils'; let ctx: ITestContext; From 9c3694af5ae91bb2e4b2c2bf2f004ef3fbeb333f Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 09:10:20 -0700 Subject: [PATCH 03/25] Move unit tests onto esbuild sources --- addons/addon-ligatures/src/index.test.ts | 10 ---------- bin/test.js | 6 +++--- src/browser/Terminal.test.ts | 20 +++++++++----------- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/addons/addon-ligatures/src/index.test.ts b/addons/addon-ligatures/src/index.test.ts index c6aead98..7210c0d9 100644 --- a/addons/addon-ligatures/src/index.test.ts +++ b/addons/addon-ligatures/src/index.test.ts @@ -7,7 +7,6 @@ import * as path from 'path'; import * as sinon from 'sinon'; import { assert } from 'chai'; import * as fontFinder from 'font-finder'; -import * as fontLigatures from 'font-ligatures'; import * as ligatureSupport from '.'; @@ -106,15 +105,6 @@ describe('LigaturesAddon', () => { await delay(500); assert.isTrue(onRefresh.notCalled); }); - - it('ensures no empty errors are thrown', async () => { - sinon.stub(fontLigatures, 'loadFile').callsFake(async () => { throw undefined; }); - term.options.fontFamily = 'Iosevka'; - assert.deepEqual(term.joiner!(input), []); - await delay(500); - assert.isTrue(onRefresh.notCalled); - (fontLigatures.loadFile as sinon.SinonStub).restore(); - }); }); class MockTerminal { diff --git a/bin/test.js b/bin/test.js index b6492454..e1e48bce 100644 --- a/bin/test.js +++ b/bin/test.js @@ -10,11 +10,11 @@ const COVERAGE_LINES_THRESHOLD = 40; // Add `out` to the NODE_PATH so absolute paths can be resolved. const env = { ...process.env }; -env.NODE_PATH = path.resolve(__dirname, '../out'); +env.NODE_PATH = path.resolve(__dirname, '../out-esbuild'); let testFiles = [ - './out/**/*test.js', - './addons/**/out/*test.js', + './out-esbuild/**/*test.js', + './addons/**/out-esbuild/*test.js', ]; let flagArgs = []; diff --git a/src/browser/Terminal.test.ts b/src/browser/Terminal.test.ts index 6c4c9326..11f676a3 100644 --- a/src/browser/Terminal.test.ts +++ b/src/browser/Terminal.test.ts @@ -10,6 +10,7 @@ import { CellData } from 'common/buffer/CellData'; import { MockUnicodeService } from 'common/TestUtils.test'; import { IMarker, ScrollSource } from 'common/Types'; import { ICoreService } from 'common/services/Services'; +import type { IBrowser } from 'browser/Types'; const INIT_COLS = 80; const INIT_ROWS = 24; @@ -571,12 +572,9 @@ describe('Terminal', () => { }); describe('with macOptionIsMeta', () => { - let originalIsMac: boolean; beforeEach(() => { - originalIsMac = term.browser.isMac; term.options.macOptionIsMeta = true; }); - afterEach(() => term.browser.isMac = originalIsMac); it('should interfere with the alt key on keyDown', () => { evKeyDown.altKey = true; @@ -589,12 +587,12 @@ describe('Terminal', () => { }); describe('On Mac OS', () => { - let originalIsMac: boolean; + let originalBrowser: IBrowser; beforeEach(() => { - originalIsMac = term.browser.isMac; - term.browser.isMac = true; + originalBrowser = term.browser; + term.browser = { ...originalBrowser, isMac: true }; }); - afterEach(() => term.browser.isMac = originalIsMac); + afterEach(() => term.browser = originalBrowser); it('should not interfere with the alt key on keyDown', () => { evKeyDown.altKey = true; @@ -656,12 +654,12 @@ describe('Terminal', () => { }); describe('On MS Windows', () => { - let originalIsWindows: boolean; + let originalBrowser: IBrowser; beforeEach(() => { - originalIsWindows = term.browser.isWindows; - term.browser.isWindows = true; + originalBrowser = term.browser; + term.browser = { ...originalBrowser, isWindows: true }; }); - afterEach(() => term.browser.isWindows = originalIsWindows); + afterEach(() => term.browser = originalBrowser); it('should not interfere with the alt + ctrl key on keyDown', () => { evKeyPress.altKey = true; From be49bb6263df4611a940000596abd271ddda2014 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 09:12:30 -0700 Subject: [PATCH 04/25] Move integration tests onto esbuild sources (except image) --- bin/test_playwright.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/bin/test_playwright.js b/bin/test_playwright.js index da173300..8de3b784 100644 --- a/bin/test_playwright.js +++ b/bin/test_playwright.js @@ -18,18 +18,19 @@ while (argv.some(e => e.startsWith('--suite='))) { } let configs = [ - { name: 'core', path: 'out-test/playwright/playwright.config.js' }, - { name: 'addon-attach', path: 'addons/addon-attach/out-test/playwright.config.js' }, - { name: 'addon-canvas', path: 'addons/addon-canvas/out-test/playwright.config.js' }, - { name: 'addon-clipboard', path: 'addons/addon-clipboard/out-test/playwright.config.js' }, - { name: 'addon-fit', path: 'addons/addon-fit/out-test/playwright.config.js' }, + { name: 'core', path: 'out-esbuild-test/playwright/playwright.config.js' }, + { name: 'addon-attach', path: 'addons/addon-attach/out-esbuild-test/playwright.config.js' }, + { name: 'addon-canvas', path: 'addons/addon-canvas/out-esbuild-test/playwright.config.js' }, + { name: 'addon-clipboard', path: 'addons/addon-clipboard/out-esbuild-test/playwright.config.js' }, + { name: 'addon-fit', path: 'addons/addon-fit/out-esbuild-test/playwright.config.js' }, + // TODO: Move onto esbuild sources { name: 'addon-image', path: 'addons/addon-image/out-test/playwright.config.js' }, - { name: 'addon-search', path: 'addons/addon-search/out-test/playwright.config.js' }, - { name: 'addon-serialize', path: 'addons/addon-serialize/out-test/playwright.config.js' }, - { name: 'addon-unicode-graphemes', path: 'addons/addon-unicode-graphemes/out-test/playwright.config.js' }, - { name: 'addon-unicode11', path: 'addons/addon-unicode11/out-test/playwright.config.js' }, - { name: 'addon-web-links', path: 'addons/addon-web-links/out-test/playwright.config.js' }, - { name: 'addon-webgl', path: 'addons/addon-webgl/out-test/playwright.config.js' } + { name: 'addon-search', path: 'addons/addon-search/out-esbuild-test/playwright.config.js' }, + { name: 'addon-serialize', path: 'addons/addon-serialize/out-esbuild-test/playwright.config.js' }, + { name: 'addon-unicode-graphemes', path: 'addons/addon-unicode-graphemes/out-esbuild-test/playwright.config.js' }, + { name: 'addon-unicode11', path: 'addons/addon-unicode11/out-esbuild-test/playwright.config.js' }, + { name: 'addon-web-links', path: 'addons/addon-web-links/out-esbuild-test/playwright.config.js' }, + { name: 'addon-webgl', path: 'addons/addon-webgl/out-esbuild-test/playwright.config.js' } ]; if (suiteFilter) { From c9baa366abdf3d958539465c8a96e9375f9e033f Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 09:15:34 -0700 Subject: [PATCH 05/25] Fix image esbuild --- addons/addon-image/test/ImageAddon.test.ts | 2 +- bin/esbuild.mjs | 6 ------ bin/esbuild_all.mjs | 4 +--- bin/test_playwright.js | 3 +-- 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/addons/addon-image/test/ImageAddon.test.ts b/addons/addon-image/test/ImageAddon.test.ts index c6f16d8c..54ea635a 100644 --- a/addons/addon-image/test/ImageAddon.test.ts +++ b/addons/addon-image/test/ImageAddon.test.ts @@ -118,7 +118,7 @@ test.describe('ImageAddon', () => { strictEqual(await ctx.page.evaluate('window.term._core.buffer.lines.get(0)._data instanceof Uint32Array'), true); strictEqual(await ctx.page.evaluate('window.term._core.buffer.lines.get(0)._extendedAttrs instanceof Object'), true); // inputhandler privates - strictEqual(await ctx.page.evaluate('window.term._core._inputHandler._curAttrData.constructor.name'), 'AttributeData'); + strictEqual(await ctx.page.evaluate('window.term._core._inputHandler._curAttrData.constructor.name'), '_AttributeData'); strictEqual(await ctx.page.evaluate('window.term._core._inputHandler._parser.constructor.name'), 'EscapeSequenceParser'); }); diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs index 7ddecd43..53fca648 100644 --- a/bin/esbuild.mjs +++ b/bin/esbuild.mjs @@ -126,12 +126,6 @@ if (config.addon) { if (['ligatures'].includes(config.addon)) { skipOutTest = true; } - - // TODO: Fix these - if (config.addon === 'image') { - skipOut = true; - skipOutTest = true; - } } else { bundleConfig = { ...bundleConfig, diff --git a/bin/esbuild_all.mjs b/bin/esbuild_all.mjs index c2d6ba72..0c0e27b7 100644 --- a/bin/esbuild_all.mjs +++ b/bin/esbuild_all.mjs @@ -13,9 +13,7 @@ jobs.push(createJob('xterm', [])); // Addon jobs const addons = (await readdir('addons')).map(e => e.replace('addon-', '')); for (const addon of addons) { - if (addon !== 'image') { - jobs.push(createJob(`xterm-addon-${addon}`, [`--addon=${addon}`])); - } + jobs.push(createJob(`xterm-addon-${addon}`, [`--addon=${addon}`])); } // Demo job - This requires the others to be built so it's not included when building all diff --git a/bin/test_playwright.js b/bin/test_playwright.js index 8de3b784..3cb6adf6 100644 --- a/bin/test_playwright.js +++ b/bin/test_playwright.js @@ -23,8 +23,7 @@ let configs = [ { name: 'addon-canvas', path: 'addons/addon-canvas/out-esbuild-test/playwright.config.js' }, { name: 'addon-clipboard', path: 'addons/addon-clipboard/out-esbuild-test/playwright.config.js' }, { name: 'addon-fit', path: 'addons/addon-fit/out-esbuild-test/playwright.config.js' }, - // TODO: Move onto esbuild sources - { name: 'addon-image', path: 'addons/addon-image/out-test/playwright.config.js' }, + { name: 'addon-image', path: 'addons/addon-image/out-esbuild-test/playwright.config.js' }, { name: 'addon-search', path: 'addons/addon-search/out-esbuild-test/playwright.config.js' }, { name: 'addon-serialize', path: 'addons/addon-serialize/out-esbuild-test/playwright.config.js' }, { name: 'addon-unicode-graphemes', path: 'addons/addon-unicode-graphemes/out-esbuild-test/playwright.config.js' }, From 6135757349809240bcfd833a52070b7b48f3e060 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 09:16:47 -0700 Subject: [PATCH 06/25] Remove unwanted npm scripts --- package.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/package.json b/package.json index 5174f39e..ce78818e 100644 --- a/package.json +++ b/package.json @@ -52,11 +52,6 @@ "test-unit-coverage": "node ./bin/test.js --coverage", "test-unit-dev": "cross-env NODE_PATH='./out' mocha", - "test-api": "npm run test-api-chromium", - "test-api-chromium": "node ./bin/test_api.js --browser=chromium --timeout=20000", - "test-api-firefox": "node ./bin/test_api.js --browser=firefox --timeout=20000", - "test-api-webkit": "node ./bin/test_api.js --browser=webkit --timeout=20000", - "test-integration": "node ./bin/test_playwright.js --workers=75%", "test-integration-chromium": "node ./bin/test_playwright.js --workers=75% \"--project=ChromeStable\"", "test-integration-firefox": "node ./bin/test_playwright.js --workers=75% \"--project=FirefoxStable\"", From 24813f56ed0dc708c64f9cbc11f3569d69c7c35f Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 09:35:03 -0700 Subject: [PATCH 07/25] How to run tests --- CONTRIBUTING.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5c8ece78..b71f746f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -60,3 +60,48 @@ By contributing code to xterm.js you: ### Test coverage One area that always needs attention is improving out unit test coverage, you can view the code coverage report on [Azure Pipelines](https://dev.azure.com/xtermjs/xterm.js/_build/latest?definitionId=3) by clicking the Code Coverage tab. + +## Testing + +### Unit tests + +All unit tests can be run with: + +```sh +yarn test-unit +``` + +Run a subset of tests like this: + +```sh +# Absolute file path: +yarn test-unit out-esbuild/browser/Terminal.test.js + +# Wildcard: +yarn test-unit out-esbuild/**/Terminal.test.js + +# All of an specific addon's tests: +yarn test-unit addons/addon-image/out-esbuild/*.test.js + +# Multiple files: +yarn test-unit out-esbuild/**/Terminal.test.js out-esbuild/**/InputHandler.test.js +``` + +These use mocha to run all `.test.js` files within the esbuild output (`out-esbuild/`). + +### Integration tests + +All integration tests can be run with: + +```sh +yarn test-integration +``` + +Run a particular suite with the `--suite` flag: + +```sh +yarn test-integration --suite=core +yarn test-integration --suite=addon-search +``` + +These use `@playwright/test` to run all tests within the tsc test output (`out-test/`). These do not use the esbuild output because they require declaration files to get types to work. From 40c5fbf0cb37a56818fba053b6022c8c52aca650 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 10:30:47 -0700 Subject: [PATCH 08/25] Don't build test folders These are for integration tests which need tsc sources anyway --- bin/esbuild.mjs | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs index 53fca648..774c75c1 100644 --- a/bin/esbuild.mjs +++ b/bin/esbuild.mjs @@ -92,10 +92,10 @@ let outConfig = { let skipOut = false; /** @type {esbuild.BuildOptions} */ -let outTestConfig = { - format: 'cjs' -} -let skipOutTest = false; +// let outTestConfig = { +// format: 'cjs' +// } +// let skipOutTest = false; if (config.addon) { bundleConfig = { @@ -108,11 +108,11 @@ if (config.addon) { entryPoints: [`addons/addon-${config.addon}/src/**/*.ts`], outdir: `addons/addon-${config.addon}/out-esbuild/` }; - outTestConfig = { - ...outConfig, - entryPoints: [`addons/addon-${config.addon}/test/**/*.ts`], - outdir: `addons/addon-${config.addon}/out-esbuild-test/` - }; + // outTestConfig = { + // ...outConfig, + // entryPoints: [`addons/addon-${config.addon}/test/**/*.ts`], + // outdir: `addons/addon-${config.addon}/out-esbuild-test/` + // }; if (config.addon === 'ligatures') { bundleConfig.platform = 'node'; @@ -121,11 +121,6 @@ if (config.addon) { if (config.addon === 'serialize') { bundleConfig.tsconfig = 'addons/addon-serialize/src/tsconfig.json' } - - // Addons that don't have unit tests - if (['ligatures'].includes(config.addon)) { - skipOutTest = true; - } } else { bundleConfig = { ...bundleConfig, @@ -137,11 +132,11 @@ if (config.addon) { entryPoints: ['src/**/*.ts'], outdir: 'out-esbuild/' }; - outTestConfig = { - ...outConfig, - entryPoints: ['test/**/*.ts'], - outdir: 'out-esbuild-test/' - }; + // outTestConfig = { + // ...outConfig, + // entryPoints: ['test/**/*.ts'], + // outdir: 'out-esbuild-test/' + // }; } if (config.isDemoClient) { @@ -176,15 +171,15 @@ if (config.isWatch) { if (!skipOut) { context(outConfig).then(e => e.watch()); } - if (!skipOutTest) { - context(outTestConfig).then(e => e.watch()); - } + // if (!skipOutTest) { + // context(outTestConfig).then(e => e.watch()); + // } } else { await build(bundleConfig); if (!skipOut) { await build(outConfig); } - if (!skipOutTest) { - await build(outTestConfig); - } + // if (!skipOutTest) { + // await build(outTestConfig); + // } } From 057abba08baad3be30243f83cf381ae5c48cb928 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:48:42 -0700 Subject: [PATCH 09/25] mjs and js --- addons/addon-attach/package.json | 1 + addons/addon-canvas/package.json | 1 + addons/addon-clipboard/package.json | 1 + addons/addon-fit/package.json | 1 + addons/addon-image/package.json | 1 + addons/addon-ligatures/package.json | 1 + addons/addon-search/package.json | 1 + addons/addon-serialize/package.json | 1 + addons/addon-unicode-graphemes/package.json | 1 + addons/addon-unicode11/package.json | 1 + addons/addon-web-links/package.json | 1 + addons/addon-webgl/package.json | 1 + bin/esbuild.mjs | 31 ++++++++++++--------- package.json | 2 ++ src/browser/AccessibilityManager.ts | 2 +- src/browser/CoreBrowserTerminal.ts | 2 +- src/browser/LocalizableStrings.ts | 19 ++++++++++--- src/browser/public/Terminal.ts | 8 +++++- 18 files changed, 56 insertions(+), 20 deletions(-) diff --git a/addons/addon-attach/package.json b/addons/addon-attach/package.json index 6f0c32b7..bbc44d2d 100644 --- a/addons/addon-attach/package.json +++ b/addons/addon-attach/package.json @@ -6,6 +6,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-attach.js", + "module": "lib/addon-attach.mjs", "types": "typings/addon-attach.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-attach", "license": "MIT", diff --git a/addons/addon-canvas/package.json b/addons/addon-canvas/package.json index cb5ded7c..f61da636 100644 --- a/addons/addon-canvas/package.json +++ b/addons/addon-canvas/package.json @@ -6,6 +6,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-canvas.js", + "module": "lib/addon-canvas.mjs", "types": "typings/addon-canvas.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-canvas", "license": "MIT", diff --git a/addons/addon-clipboard/package.json b/addons/addon-clipboard/package.json index 8ecdd6af..9ac7de0e 100644 --- a/addons/addon-clipboard/package.json +++ b/addons/addon-clipboard/package.json @@ -6,6 +6,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-clipboard.js", + "module": "lib/addon-clipboard.mjs", "types": "typings/addon-clipboard.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-clipboard", "license": "MIT", diff --git a/addons/addon-fit/package.json b/addons/addon-fit/package.json index 14d65f30..311c8cea 100644 --- a/addons/addon-fit/package.json +++ b/addons/addon-fit/package.json @@ -6,6 +6,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-fit.js", + "module": "lib/addon-fit.mjs", "types": "typings/addon-fit.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-fit", "license": "MIT", diff --git a/addons/addon-image/package.json b/addons/addon-image/package.json index 2ea80c65..bc6c878f 100644 --- a/addons/addon-image/package.json +++ b/addons/addon-image/package.json @@ -6,6 +6,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-image.js", + "module": "lib/addon-image.mjs", "types": "typings/addon-image.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image", "license": "MIT", diff --git a/addons/addon-ligatures/package.json b/addons/addon-ligatures/package.json index 80608ee3..5db07290 100644 --- a/addons/addon-ligatures/package.json +++ b/addons/addon-ligatures/package.json @@ -7,6 +7,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-ligatures.js", + "module": "lib/addon-ligatures.mjs", "types": "typings/addon-ligatures.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-ligatures", "engines": { diff --git a/addons/addon-search/package.json b/addons/addon-search/package.json index 91dfef2e..0cfbee57 100644 --- a/addons/addon-search/package.json +++ b/addons/addon-search/package.json @@ -6,6 +6,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-search.js", + "module": "lib/addon-search.mjs", "types": "typings/addon-search.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-search", "license": "MIT", diff --git a/addons/addon-serialize/package.json b/addons/addon-serialize/package.json index 3901addc..fb074a59 100644 --- a/addons/addon-serialize/package.json +++ b/addons/addon-serialize/package.json @@ -6,6 +6,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-serialize.js", + "module": "lib/addon-serialize.mjs", "types": "typings/addon-serialize.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-serialize", "license": "MIT", diff --git a/addons/addon-unicode-graphemes/package.json b/addons/addon-unicode-graphemes/package.json index 193cdecd..19a6baac 100644 --- a/addons/addon-unicode-graphemes/package.json +++ b/addons/addon-unicode-graphemes/package.json @@ -6,6 +6,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-unicode-graphemes.js", + "module": "lib/.addon-unicode-graphemes.mjs", "types": "typings/addon-unicode-graphemes.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-unicode-graphemes", "license": "MIT", diff --git a/addons/addon-unicode11/package.json b/addons/addon-unicode11/package.json index 0981702b..6db1a0bd 100644 --- a/addons/addon-unicode11/package.json +++ b/addons/addon-unicode11/package.json @@ -6,6 +6,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-unicode11.js", + "module": "lib/addon-unicode11.mjs", "types": "typings/addon-unicode11.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-unicode11", "license": "MIT", diff --git a/addons/addon-web-links/package.json b/addons/addon-web-links/package.json index be5cf7c3..723acacd 100644 --- a/addons/addon-web-links/package.json +++ b/addons/addon-web-links/package.json @@ -6,6 +6,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-web-links.js", + "module": "lib/addon-web-links.mjs", "types": "typings/addon-web-links.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-web-links", "license": "MIT", diff --git a/addons/addon-webgl/package.json b/addons/addon-webgl/package.json index 6c91daf9..797d229c 100644 --- a/addons/addon-webgl/package.json +++ b/addons/addon-webgl/package.json @@ -6,6 +6,7 @@ "url": "https://xtermjs.org/" }, "main": "lib/addon-webgl.js", + "module": "lib/addon-webgl.mjs", "types": "typings/addon-webgl.d.ts", "repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-webgl", "license": "MIT", diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs index 774c75c1..948c11b9 100644 --- a/bin/esbuild.mjs +++ b/bin/esbuild.mjs @@ -56,7 +56,12 @@ const prodOptions = { * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/` - } + }, + // footer: { + // js: `return __export__;\n});` + // }, + + format: 'esm', // mangleProps: /_.+/, }; @@ -101,7 +106,7 @@ if (config.addon) { bundleConfig = { ...bundleConfig, entryPoints: [`addons/addon-${config.addon}/src/${getAddonEntryPoint(config.addon)}.ts`], - outfile: `addons/addon-${config.addon}/lib/xterm-addon-${config.addon}.js`, + outfile: `addons/addon-${config.addon}/lib/xterm-addon-${config.addon}.mjs`, }; outConfig = { ...outConfig, @@ -125,7 +130,7 @@ if (config.addon) { bundleConfig = { ...bundleConfig, entryPoints: [`src/browser/public/Terminal.ts`], - outfile: `lib/xterm.js` + outfile: `lib/xterm.mjs` }; outConfig = { ...outConfig, @@ -147,18 +152,18 @@ if (config.isDemoClient) { external: ['util', 'os', 'fs', 'path', 'stream', 'Terminal'], alias: { "@xterm/xterm": ".", - "@xterm/addon-attach": "./addons/addon-attach/lib/xterm-addon-attach.js", - "@xterm/addon-canvas": "./addons/addon-canvas/lib/xterm-addon-canvas.js", - "@xterm/addon-clipboard": "./addons/addon-clipboard/lib/xterm-addon-clipboard.js", - "@xterm/addon-fit": "./addons/addon-fit/lib/xterm-addon-fit.js", + "@xterm/addon-attach": "./addons/addon-attach/lib/xterm-addon-attach.mjs", + "@xterm/addon-canvas": "./addons/addon-canvas/lib/xterm-addon-canvas.mjs", + "@xterm/addon-clipboard": "./addons/addon-clipboard/lib/xterm-addon-clipboard.mjs", + "@xterm/addon-fit": "./addons/addon-fit/lib/xterm-addon-fit.mjs", // "@xterm/addon-image": "./addons/addon-image/lib/xterm-addon-image.js", // "@xterm/addon-ligatures": "./addons/addon-ligatures/lib/xterm-addon-ligatures.js", - "@xterm/addon-search": "./addons/addon-search/lib/xterm-addon-search.js", - "@xterm/addon-serialize": "./addons/addon-serialize/lib/xterm-addon-serialize.js", - "@xterm/addon-web-links": "./addons/addon-web-links/lib/xterm-addon-web-links.js", - "@xterm/addon-webgl": "./addons/addon-webgl/lib/xterm-addon-webgl.js", - "@xterm/addon-unicode11": "./addons/addon-unicode11/lib/xterm-addon-unicode11.js", - "@xterm/addon-unicode-graphemes": "./addons/addon-unicode-graphemes/lib/xterm-addon-unicode-graphemes.js", + "@xterm/addon-search": "./addons/addon-search/lib/xterm-addon-search.mjs", + "@xterm/addon-serialize": "./addons/addon-serialize/lib/xterm-addon-serialize.mjs", + "@xterm/addon-web-links": "./addons/addon-web-links/lib/xterm-addon-web-links.mjs", + "@xterm/addon-webgl": "./addons/addon-webgl/lib/xterm-addon-webgl.mjs", + "@xterm/addon-unicode11": "./addons/addon-unicode11/lib/xterm-addon-unicode11.mjs", + "@xterm/addon-unicode-graphemes": "./addons/addon-unicode-graphemes/lib/xterm-addon-unicode-graphemes.mjs", // Needed for out-tsc based image addon "common/Lifecycle": "./src/common/Lifecycle.ts", diff --git a/package.json b/package.json index ce78818e..7440cf49 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "description": "Full xterm terminal, in your browser", "version": "5.5.0", "main": "lib/xterm.js", + "module": "lib/xterm.mjs", "style": "css/xterm.css", "types": "typings/xterm.d.ts", "repository": "https://github.com/xtermjs/xterm.js", @@ -67,6 +68,7 @@ "prepackage": "npm run build", "package": "webpack", + "postpackage":"npm run esbuild-package", "package-headless": "webpack --config ./webpack.config.headless.js", "postpackage-headless": "node ./bin/package_headless.js", "prepublishOnly": "npm run package" diff --git a/src/browser/AccessibilityManager.ts b/src/browser/AccessibilityManager.ts index a4a58187..174ccc44 100644 --- a/src/browser/AccessibilityManager.ts +++ b/src/browser/AccessibilityManager.ts @@ -151,7 +151,7 @@ export class AccessibilityManager extends Disposable { if (char === '\n') { this._liveRegionLineCount++; if (this._liveRegionLineCount === MAX_ROWS_TO_READ + 1) { - this._liveRegion.textContent += Strings.tooMuchOutput; + this._liveRegion.textContent += Strings.tooMuchOutput.get(); } } } diff --git a/src/browser/CoreBrowserTerminal.ts b/src/browser/CoreBrowserTerminal.ts index 6d684953..f9eefaed 100644 --- a/src/browser/CoreBrowserTerminal.ts +++ b/src/browser/CoreBrowserTerminal.ts @@ -443,7 +443,7 @@ export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { this.textarea = this._document.createElement('textarea'); this.textarea.classList.add('xterm-helper-textarea'); - this.textarea.setAttribute('aria-label', Strings.promptLabel); + this.textarea.setAttribute('aria-label', Strings.promptLabel.get()); if (!Browser.isChromeOS) { // ChromeVox on ChromeOS does not like this. See // https://issuetracker.google.com/issues/260170397 diff --git a/src/browser/LocalizableStrings.ts b/src/browser/LocalizableStrings.ts index d8bcc2c6..32055ce9 100644 --- a/src/browser/LocalizableStrings.ts +++ b/src/browser/LocalizableStrings.ts @@ -5,8 +5,19 @@ // This file contains strings that get exported in the API so they can be localized -// eslint-disable-next-line prefer-const -export let promptLabel = 'Terminal input'; +let promptLabelInternal = 'Terminal input'; +const promptLabel = { + get: () => promptLabelInternal, + set: (value: string) => promptLabelInternal = value +}; -// eslint-disable-next-line prefer-const -export let tooMuchOutput = 'Too much output to announce, navigate to rows manually to read'; +let tooMuchOutputInternal = 'Too much output to announce, navigate to rows manually to read'; +const tooMuchOutput = { + get: () => tooMuchOutputInternal, + set: (value: string) => tooMuchOutputInternal = value +}; + +export { + promptLabel, + tooMuchOutput +}; diff --git a/src/browser/public/Terminal.ts b/src/browser/public/Terminal.ts index cb4f221e..572bac04 100644 --- a/src/browser/public/Terminal.ts +++ b/src/browser/public/Terminal.ts @@ -247,7 +247,13 @@ export class Terminal extends Disposable implements ITerminalApi { this._addonManager.loadAddon(this, addon); } public static get strings(): ILocalizableStrings { - return Strings; + // A wrapper is required here because esbuild prevents setting an `export let` + return { + get promptLabel(): string { return Strings.promptLabel.get(); }, + set promptLabel(value: string) { Strings.promptLabel.set(value); }, + get tooMuchOutput(): string { return Strings.tooMuchOutput.get(); }, + set tooMuchOutput(value: string) { Strings.tooMuchOutput.set(value); } + }; } private _verifyIntegers(...values: number[]): void { From 93bf18c5b0d108f9884cfcf35ec85f4e6fd64886 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:51:47 -0700 Subject: [PATCH 10/25] Sourcemaps on prod build --- bin/esbuild.mjs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs index 948c11b9..6baf3d30 100644 --- a/bin/esbuild.mjs +++ b/bin/esbuild.mjs @@ -21,12 +21,12 @@ const config = { const commonOptions = { format: 'esm', target: 'es2021', + sourcemap: true, logLevel: 'debug', }; /** @type {esbuild.BuildOptions} */ const devOptions = { - sourcemap: true, minify: false, }; @@ -57,12 +57,6 @@ const prodOptions = { * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/` }, - // footer: { - // js: `return __export__;\n});` - // }, - - format: 'esm', - // mangleProps: /_.+/, }; /** From 208d6e96f84da2d0947c19f341f171ddc015bf71 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:00:05 -0700 Subject: [PATCH 11/25] Use esm image addon in demo --- bin/esbuild.mjs | 2 +- demo/client.ts | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs index 6baf3d30..9360d5bb 100644 --- a/bin/esbuild.mjs +++ b/bin/esbuild.mjs @@ -150,7 +150,7 @@ if (config.isDemoClient) { "@xterm/addon-canvas": "./addons/addon-canvas/lib/xterm-addon-canvas.mjs", "@xterm/addon-clipboard": "./addons/addon-clipboard/lib/xterm-addon-clipboard.mjs", "@xterm/addon-fit": "./addons/addon-fit/lib/xterm-addon-fit.mjs", - // "@xterm/addon-image": "./addons/addon-image/lib/xterm-addon-image.js", + "@xterm/addon-image": "./addons/addon-image/lib/xterm-addon-image.mjs", // "@xterm/addon-ligatures": "./addons/addon-ligatures/lib/xterm-addon-ligatures.js", "@xterm/addon-search": "./addons/addon-search/lib/xterm-addon-search.mjs", "@xterm/addon-serialize": "./addons/addon-serialize/lib/xterm-addon-serialize.mjs", diff --git a/demo/client.ts b/demo/client.ts index c1404882..5aa961c6 100644 --- a/demo/client.ts +++ b/demo/client.ts @@ -8,15 +8,14 @@ /// -// TODO: Move to regular import? +// TODO: Move to regular import, currently it complains about the `fs` module import { LigaturesAddon } from '../addons/addon-ligatures/out-esbuild/LigaturesAddon'; -// DEBT: The image addon is not currently build with esbuild // HACK: Playwright/WebKit on Windows does not support WebAssembly https://stackoverflow.com/q/62311688/1156119 -import type { ImageAddonType, IImageAddonOptions } from '../addons/addon-image/out/ImageAddon'; -let ImageAddon: ImageAddonType | undefined; // eslint-disable-line @typescript-eslint/naming-convention +import type { ImageAddon as ImageAddonType, IImageAddonOptions } from '@xterm/addon-image'; +let ImageAddon: typeof ImageAddonType | undefined; // eslint-disable-line @typescript-eslint/naming-convention if ('WebAssembly' in window) { - const imageAddon = require('../addons/addon-image/out/ImageAddon'); + const imageAddon = require('@xterm/addon-image'); ImageAddon = imageAddon.ImageAddon; } @@ -25,7 +24,6 @@ import { AttachAddon } from '@xterm/addon-attach'; import { CanvasAddon } from '@xterm/addon-canvas'; import { ClipboardAddon } from '@xterm/addon-clipboard'; import { FitAddon } from '@xterm/addon-fit'; -// import { ImageAddon } from '@xterm/addon-image'; // import { LigaturesAddon } from '@xterm/addon-ligatures'; import { SearchAddon, ISearchOptions } from '@xterm/addon-search'; import { SerializeAddon } from '@xterm/addon-serialize'; From 992fa015a48b73c023c9a11265e605b9c07c71b7 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:12:03 -0700 Subject: [PATCH 12/25] Move on to all ESM imports in the demo --- bin/esbuild.mjs | 10 +++++++--- demo/client.ts | 16 +++++++--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs index 9360d5bb..e2242ee5 100644 --- a/bin/esbuild.mjs +++ b/bin/esbuild.mjs @@ -145,13 +145,13 @@ if (config.isDemoClient) { outfile: 'demo/dist/client-bundle.js', external: ['util', 'os', 'fs', 'path', 'stream', 'Terminal'], alias: { + // Library ESM imports "@xterm/xterm": ".", "@xterm/addon-attach": "./addons/addon-attach/lib/xterm-addon-attach.mjs", "@xterm/addon-canvas": "./addons/addon-canvas/lib/xterm-addon-canvas.mjs", "@xterm/addon-clipboard": "./addons/addon-clipboard/lib/xterm-addon-clipboard.mjs", "@xterm/addon-fit": "./addons/addon-fit/lib/xterm-addon-fit.mjs", "@xterm/addon-image": "./addons/addon-image/lib/xterm-addon-image.mjs", - // "@xterm/addon-ligatures": "./addons/addon-ligatures/lib/xterm-addon-ligatures.js", "@xterm/addon-search": "./addons/addon-search/lib/xterm-addon-search.mjs", "@xterm/addon-serialize": "./addons/addon-serialize/lib/xterm-addon-serialize.mjs", "@xterm/addon-web-links": "./addons/addon-web-links/lib/xterm-addon-web-links.mjs", @@ -159,8 +159,12 @@ if (config.isDemoClient) { "@xterm/addon-unicode11": "./addons/addon-unicode11/lib/xterm-addon-unicode11.mjs", "@xterm/addon-unicode-graphemes": "./addons/addon-unicode-graphemes/lib/xterm-addon-unicode-graphemes.mjs", - // Needed for out-tsc based image addon - "common/Lifecycle": "./src/common/Lifecycle.ts", + // Non-bundled ESM imports + // HACK: Ligatures imports fs which in the esbuild bundle resolves at runtime _on startup_ + // instead of only when it's needed. This causes a `Dynamic require of "fs" is not + // supported` exception to be thrown. So the unbundled out-esbuild sources are used + // instead of the .mjs file which seems to resolve the issue. + "@xterm/addon-ligatures": "./addons/addon-ligatures/out-esbuild/LigaturesAddon", } } }; diff --git a/demo/client.ts b/demo/client.ts index 5aa961c6..0e794f3e 100644 --- a/demo/client.ts +++ b/demo/client.ts @@ -8,9 +8,6 @@ /// -// TODO: Move to regular import, currently it complains about the `fs` module -import { LigaturesAddon } from '../addons/addon-ligatures/out-esbuild/LigaturesAddon'; - // HACK: Playwright/WebKit on Windows does not support WebAssembly https://stackoverflow.com/q/62311688/1156119 import type { ImageAddon as ImageAddonType, IImageAddonOptions } from '@xterm/addon-image'; let ImageAddon: typeof ImageAddonType | undefined; // eslint-disable-line @typescript-eslint/naming-convention @@ -24,7 +21,7 @@ import { AttachAddon } from '@xterm/addon-attach'; import { CanvasAddon } from '@xterm/addon-canvas'; import { ClipboardAddon } from '@xterm/addon-clipboard'; import { FitAddon } from '@xterm/addon-fit'; -// import { LigaturesAddon } from '@xterm/addon-ligatures'; +import { LigaturesAddon } from '@xterm/addon-ligatures'; import { SearchAddon, ISearchOptions } from '@xterm/addon-search'; import { SerializeAddon } from '@xterm/addon-serialize'; import { WebLinksAddon } from '@xterm/addon-web-links'; @@ -620,15 +617,15 @@ function initAddons(term: Terminal): void { term.unicode.activeVersion = '15-graphemes'; } if (name === 'search' && checkbox.checked) { - addon.instance.onDidChangeResults(e => updateFindResults(e)); + addons[name].instance.onDidChangeResults(e => updateFindResults(e)); } addDomListener(checkbox, 'change', () => { if (name === 'image') { if (checkbox.checked) { const ctorOptionsJson = document.querySelector('#image-options').value; addon.instance = ctorOptionsJson - ? new addon.ctor(JSON.parse(ctorOptionsJson)) - : new addon.ctor(); + ? new addons[name].ctor(JSON.parse(ctorOptionsJson)) + : new addons[name].ctor(); term.loadAddon(addon.instance); } else { addon.instance!.dispose(); @@ -637,7 +634,8 @@ function initAddons(term: Terminal): void { return; } if (checkbox.checked) { - addon.instance = new addon.ctor(); + // HACK: Manually remove addons that cannot be changes + addon.instance = new (addon as IDemoAddon>).ctor(); try { term.loadAddon(addon.instance); if (name === 'webgl') { @@ -657,7 +655,7 @@ function initAddons(term: Terminal): void { } else if (name === 'unicodeGraphemes') { term.unicode.activeVersion = '15-graphemes'; } else if (name === 'search') { - addon.instance.onDidChangeResults(e => updateFindResults(e)); + addons[name].instance.onDidChangeResults(e => updateFindResults(e)); } } catch { From 804a2b76939ad92b796c0d2363fcbfd13b4716dc Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:32:21 -0700 Subject: [PATCH 13/25] Zip up right folders, run esbuild in CI --- .github/workflows/ci.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5b97acbf..227424a7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,36 +19,51 @@ jobs: cache: 'yarn' - name: Install dependencies run: yarn --frozen-lockfile - - name: Build + - name: Setup and run tsc run: yarn setup + - name: Esbuild + run: yarn esbuild-dev - name: Zip artifacts run: | zip -r compressed-build \ ./out/* \ + ./out-esbuild/* \ ./out-test/* \ ./addons/addon-attach/out/* \ + ./addons/addon-attach/out-esbuild/* \ ./addons/addon-attach/out-test/* \ ./addons/addon-canvas/out/* \ + ./addons/addon-canvas/out-esbuild/* \ ./addons/addon-canvas/out-test/* \ ./addons/addon-clipboard/out/* \ + ./addons/addon-clipboard/out-esbuild/* \ ./addons/addon-clipboard/out-test/* \ ./addons/addon-fit/out/* \ + ./addons/addon-fit/out-esbuild/* \ ./addons/addon-fit/out-test/* \ ./addons/addon-image/out/* \ + ./addons/addon-image/out-esbuild/* \ ./addons/addon-image/out-test/* \ ./addons/addon-ligatures/out/* \ + ./addons/addon-ligatures/out-esbuild/* \ ./addons/addon-ligatures/out-test/* \ ./addons/addon-search/out/* \ + ./addons/addon-search/out-esbuild/* \ ./addons/addon-search/out-test/* \ ./addons/addon-serialize/out/* \ + ./addons/addon-serialize/out-esbuild/* \ ./addons/addon-serialize/out-test/* \ ./addons/addon-unicode11/out/* \ + ./addons/addon-unicode11/out-esbuild/* \ ./addons/addon-unicode11/out-test/* \ ./addons/addon-unicode-graphemes/out/* \ + ./addons/addon-unicode-graphemes/out-esbuild/* \ ./addons/addon-unicode-graphemes/out-test/* \ ./addons/addon-web-links/out/* \ + ./addons/addon-web-links/out-esbuild/* \ ./addons/addon-web-links/out-test/* \ ./addons/addon-webgl/out/* \ + ./addons/addon-webgl/out-esbuild/* \ ./addons/addon-webgl/out-test/* - name: Upload artifacts uses: actions/upload-artifact@v3 From 4d45215622764cac77c810ee3ac17c1afd0ad6ba Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:34:17 -0700 Subject: [PATCH 14/25] Run right esbuild script --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 227424a7..ad6f031d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: - name: Setup and run tsc run: yarn setup - name: Esbuild - run: yarn esbuild-dev + run: yarn esbuild - name: Zip artifacts run: | zip -r compressed-build \ From 1911d19cf8bac80b85e019fbe3083394d9cf9bbe Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:37:10 -0700 Subject: [PATCH 15/25] Build demo with esbuild --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad6f031d..a6e71813 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -204,7 +204,7 @@ jobs: fi ls -R - name: Build demo - run: yarn build-demo + run: yarn esbuild-demo - name: Integration tests (core) # Tests use 50% workers to reduce flakiness run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=core - name: Integration tests (addon-attach) From c337fa8dc57a806c9e59246f880a9ee88c6238a6 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 13:41:12 -0700 Subject: [PATCH 16/25] Upload lib artifacts --- .github/workflows/ci.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a6e71813..4d836c1d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,42 +26,55 @@ jobs: - name: Zip artifacts run: | zip -r compressed-build \ + ./lib/* \ ./out/* \ ./out-esbuild/* \ ./out-test/* \ + ./addons/addon-attach/lib/* \ ./addons/addon-attach/out/* \ ./addons/addon-attach/out-esbuild/* \ ./addons/addon-attach/out-test/* \ + ./addons/addon-canvas/lib/* \ ./addons/addon-canvas/out/* \ ./addons/addon-canvas/out-esbuild/* \ ./addons/addon-canvas/out-test/* \ + ./addons/addon-clipboard/lib/* \ ./addons/addon-clipboard/out/* \ ./addons/addon-clipboard/out-esbuild/* \ ./addons/addon-clipboard/out-test/* \ + ./addons/addon-fit/lib/* \ ./addons/addon-fit/out/* \ ./addons/addon-fit/out-esbuild/* \ ./addons/addon-fit/out-test/* \ + ./addons/addon-image/lib/* \ ./addons/addon-image/out/* \ ./addons/addon-image/out-esbuild/* \ ./addons/addon-image/out-test/* \ + ./addons/addon-ligatures/lib/* \ ./addons/addon-ligatures/out/* \ ./addons/addon-ligatures/out-esbuild/* \ ./addons/addon-ligatures/out-test/* \ + ./addons/addon-search/lib/* \ ./addons/addon-search/out/* \ ./addons/addon-search/out-esbuild/* \ ./addons/addon-search/out-test/* \ + ./addons/addon-serialize/lib/* \ ./addons/addon-serialize/out/* \ ./addons/addon-serialize/out-esbuild/* \ ./addons/addon-serialize/out-test/* \ + ./addons/addon-unicode11/lib/* \ ./addons/addon-unicode11/out/* \ ./addons/addon-unicode11/out-esbuild/* \ ./addons/addon-unicode11/out-test/* \ + ./addons/addon-unicode-graphemes/lib/* \ ./addons/addon-unicode-graphemes/out/* \ ./addons/addon-unicode-graphemes/out-esbuild/* \ ./addons/addon-unicode-graphemes/out-test/* \ + ./addons/addon-web-links/lib/* \ ./addons/addon-web-links/out/* \ ./addons/addon-web-links/out-esbuild/* \ ./addons/addon-web-links/out-test/* \ + ./addons/addon-webgl/lib/* \ ./addons/addon-webgl/out/* \ ./addons/addon-webgl/out-esbuild/* \ ./addons/addon-webgl/out-test/* From 62c5747e3fa9a4877c36ace3f0c8d8a5a11335ab Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Fri, 5 Jul 2024 14:05:24 -0700 Subject: [PATCH 17/25] Use out-test for integration tests --- bin/test_playwright.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/bin/test_playwright.js b/bin/test_playwright.js index 3cb6adf6..da173300 100644 --- a/bin/test_playwright.js +++ b/bin/test_playwright.js @@ -18,18 +18,18 @@ while (argv.some(e => e.startsWith('--suite='))) { } let configs = [ - { name: 'core', path: 'out-esbuild-test/playwright/playwright.config.js' }, - { name: 'addon-attach', path: 'addons/addon-attach/out-esbuild-test/playwright.config.js' }, - { name: 'addon-canvas', path: 'addons/addon-canvas/out-esbuild-test/playwright.config.js' }, - { name: 'addon-clipboard', path: 'addons/addon-clipboard/out-esbuild-test/playwright.config.js' }, - { name: 'addon-fit', path: 'addons/addon-fit/out-esbuild-test/playwright.config.js' }, - { name: 'addon-image', path: 'addons/addon-image/out-esbuild-test/playwright.config.js' }, - { name: 'addon-search', path: 'addons/addon-search/out-esbuild-test/playwright.config.js' }, - { name: 'addon-serialize', path: 'addons/addon-serialize/out-esbuild-test/playwright.config.js' }, - { name: 'addon-unicode-graphemes', path: 'addons/addon-unicode-graphemes/out-esbuild-test/playwright.config.js' }, - { name: 'addon-unicode11', path: 'addons/addon-unicode11/out-esbuild-test/playwright.config.js' }, - { name: 'addon-web-links', path: 'addons/addon-web-links/out-esbuild-test/playwright.config.js' }, - { name: 'addon-webgl', path: 'addons/addon-webgl/out-esbuild-test/playwright.config.js' } + { name: 'core', path: 'out-test/playwright/playwright.config.js' }, + { name: 'addon-attach', path: 'addons/addon-attach/out-test/playwright.config.js' }, + { name: 'addon-canvas', path: 'addons/addon-canvas/out-test/playwright.config.js' }, + { name: 'addon-clipboard', path: 'addons/addon-clipboard/out-test/playwright.config.js' }, + { name: 'addon-fit', path: 'addons/addon-fit/out-test/playwright.config.js' }, + { name: 'addon-image', path: 'addons/addon-image/out-test/playwright.config.js' }, + { name: 'addon-search', path: 'addons/addon-search/out-test/playwright.config.js' }, + { name: 'addon-serialize', path: 'addons/addon-serialize/out-test/playwright.config.js' }, + { name: 'addon-unicode-graphemes', path: 'addons/addon-unicode-graphemes/out-test/playwright.config.js' }, + { name: 'addon-unicode11', path: 'addons/addon-unicode11/out-test/playwright.config.js' }, + { name: 'addon-web-links', path: 'addons/addon-web-links/out-test/playwright.config.js' }, + { name: 'addon-webgl', path: 'addons/addon-webgl/out-test/playwright.config.js' } ]; if (suiteFilter) { From ff019956912e46d82791d355bef64b6e13530678 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sun, 7 Jul 2024 08:32:19 -0700 Subject: [PATCH 18/25] Improve testing instructions --- CONTRIBUTING.md | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b71f746f..6c1633dd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,25 +65,22 @@ One area that always needs attention is improving out unit test coverage, you ca ### Unit tests -All unit tests can be run with: +Unit tests are run with `yarn test-unit`: ```sh +# All unit tests yarn test-unit -``` -Run a subset of tests like this: - -```sh -# Absolute file path: +# Absolute file path yarn test-unit out-esbuild/browser/Terminal.test.js -# Wildcard: +# Filter by wildcard yarn test-unit out-esbuild/**/Terminal.test.js -# All of an specific addon's tests: +# Specific addon unit tests tests yarn test-unit addons/addon-image/out-esbuild/*.test.js -# Multiple files: +# Multiple files yarn test-unit out-esbuild/**/Terminal.test.js out-esbuild/**/InputHandler.test.js ``` @@ -91,16 +88,16 @@ These use mocha to run all `.test.js` files within the esbuild output (`out-esbu ### Integration tests -All integration tests can be run with: +Integration tests are run with `yarn test-integration`: ```sh +# All integration tests yarn test-integration -``` -Run a particular suite with the `--suite` flag: - -```sh +# Core integration tests yarn test-integration --suite=core + +# Specific addon integration tests yarn test-integration --suite=addon-search ``` From b6a9c24c7d069f154d73c45dfba86861633f3770 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sun, 7 Jul 2024 08:35:17 -0700 Subject: [PATCH 19/25] Generate addon playwright suites via list of addons --- bin/test_playwright.js | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/bin/test_playwright.js b/bin/test_playwright.js index da173300..7536ff0d 100644 --- a/bin/test_playwright.js +++ b/bin/test_playwright.js @@ -18,19 +18,24 @@ while (argv.some(e => e.startsWith('--suite='))) { } let configs = [ - { name: 'core', path: 'out-test/playwright/playwright.config.js' }, - { name: 'addon-attach', path: 'addons/addon-attach/out-test/playwright.config.js' }, - { name: 'addon-canvas', path: 'addons/addon-canvas/out-test/playwright.config.js' }, - { name: 'addon-clipboard', path: 'addons/addon-clipboard/out-test/playwright.config.js' }, - { name: 'addon-fit', path: 'addons/addon-fit/out-test/playwright.config.js' }, - { name: 'addon-image', path: 'addons/addon-image/out-test/playwright.config.js' }, - { name: 'addon-search', path: 'addons/addon-search/out-test/playwright.config.js' }, - { name: 'addon-serialize', path: 'addons/addon-serialize/out-test/playwright.config.js' }, - { name: 'addon-unicode-graphemes', path: 'addons/addon-unicode-graphemes/out-test/playwright.config.js' }, - { name: 'addon-unicode11', path: 'addons/addon-unicode11/out-test/playwright.config.js' }, - { name: 'addon-web-links', path: 'addons/addon-web-links/out-test/playwright.config.js' }, - { name: 'addon-webgl', path: 'addons/addon-webgl/out-test/playwright.config.js' } + { name: 'core', path: 'out-test/playwright/playwright.config.js' } ]; +const addons = [ + 'attach', + 'canvas', + 'clipboard', + 'fit', + 'image', + 'search', + 'serialize', + 'unicode-graphemes', + 'unicode11', + 'web-links', + 'webgl', +]; +for (const addon of addons) { + configs.push({ name: `addon-${addon}`, path: `addons/addon-${addon}/out-test/playwright.config.js` }); +} if (suiteFilter) { configs = configs.filter(e => e.name === suiteFilter); From 215315b37724fce37b134b1cae5059e6cb919590 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sun, 7 Jul 2024 08:51:38 -0700 Subject: [PATCH 20/25] Esbuild package headless --- .npmignore | 3 +++ bin/esbuild.mjs | 51 ++++++++++++++++++++++++++----------------- headless/.npmignore | 3 +++ headless/package.json | 25 +++++++++++++++++++++ package.json | 2 ++ 5 files changed, 64 insertions(+), 20 deletions(-) create mode 100644 headless/package.json diff --git a/.npmignore b/.npmignore index 91fbd773..c840ec62 100644 --- a/.npmignore +++ b/.npmignore @@ -17,6 +17,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs index e2242ee5..724c2ca1 100644 --- a/bin/esbuild.mjs +++ b/bin/esbuild.mjs @@ -12,6 +12,7 @@ const config = { isProd: argv.includes('--prod'), isWatch: argv.includes('--watch'), isDemoClient: argv.includes('--demo-client'), + isHeadless: argv.includes('--headless'), addon: argv.find(e => e.startsWith('--addon='))?.replace(/^--addon=/, ''), }; @@ -120,25 +121,7 @@ if (config.addon) { if (config.addon === 'serialize') { bundleConfig.tsconfig = 'addons/addon-serialize/src/tsconfig.json' } -} else { - bundleConfig = { - ...bundleConfig, - entryPoints: [`src/browser/public/Terminal.ts`], - outfile: `lib/xterm.mjs` - }; - outConfig = { - ...outConfig, - entryPoints: ['src/**/*.ts'], - outdir: 'out-esbuild/' - }; - // outTestConfig = { - // ...outConfig, - // entryPoints: ['test/**/*.ts'], - // outdir: 'out-esbuild-test/' - // }; -} - -if (config.isDemoClient) { +} else if (config.isDemoClient) { bundleConfig = { ...bundleConfig, entryPoints: [`demo/client.ts`], @@ -167,7 +150,35 @@ if (config.isDemoClient) { "@xterm/addon-ligatures": "./addons/addon-ligatures/out-esbuild/LigaturesAddon", } } -}; +} else if (config.isHeadless) { + bundleConfig = { + ...bundleConfig, + entryPoints: [`src/headless/public/Terminal.ts`], + outfile: `headless/lib-headless/xterm-headless.mjs` + }; + outConfig = { + ...outConfig, + entryPoints: ['src/**/*.ts'], + outdir: 'out-esbuild/' + }; + skipOut = true; +} else { + bundleConfig = { + ...bundleConfig, + entryPoints: [`src/browser/public/Terminal.ts`], + outfile: `lib/xterm.mjs` + }; + outConfig = { + ...outConfig, + entryPoints: ['src/**/*.ts'], + outdir: 'out-esbuild/' + }; + // outTestConfig = { + // ...outConfig, + // entryPoints: ['test/**/*.ts'], + // outdir: 'out-esbuild-test/' + // }; +} if (config.isWatch) { context(bundleConfig).then(e => e.watch()); diff --git a/headless/.npmignore b/headless/.npmignore index 535e5ec3..904f07f8 100644 --- a/headless/.npmignore +++ b/headless/.npmignore @@ -8,6 +8,9 @@ !lib-headless/**/*.js !lib-headless/**/*.js.map +!lib-headless/**/*.mjs +!lib-headless/**/*.mjs.map + !lib-headless/**/*.css # Whitelist - src/ diff --git a/headless/package.json b/headless/package.json new file mode 100644 index 00000000..fca4a8c3 --- /dev/null +++ b/headless/package.json @@ -0,0 +1,25 @@ +{ + "name": "@xterm/headless", + "description": "A headless terminal component that runs in Node.js", + "version": "5.5.0", + "main": "lib-headless/xterm-headless.js", + "module": "lib/xterm.mjs", + "types": "typings/xterm-headless.d.ts", + "repository": "https://github.com/xtermjs/xterm.js", + "license": "MIT", + "keywords": [ + "cli", + "command-line", + "console", + "pty", + "shell", + "ssh", + "styles", + "terminal-emulator", + "terminal", + "tty", + "vt100", + "webgl", + "xterm" + ] +} \ No newline at end of file diff --git a/package.json b/package.json index 7440cf49..ab93fc8e 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "esbuild-watch": "node bin/esbuild_all.mjs --watch", "esbuild-package": "node bin/esbuild_all.mjs --prod", "esbuild-package-watch": "node bin/esbuild_all.mjs --prod --watch", + "esbuild-package-headless-only": "node bin/esbuild.mjs --prod --headless", "esbuild-demo": "node bin/esbuild.mjs --demo-client", "esbuild-demo-watch": "node bin/esbuild.mjs --demo-client --watch", @@ -69,6 +70,7 @@ "prepackage": "npm run build", "package": "webpack", "postpackage":"npm run esbuild-package", + "prepackage-headless": "npm run esbuild-package-headless-only", "package-headless": "webpack --config ./webpack.config.headless.js", "postpackage-headless": "node ./bin/package_headless.js", "prepublishOnly": "npm run package" From faed3e7c802a83f1f89f4128e25bab939ca97dc9 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sun, 7 Jul 2024 09:06:26 -0700 Subject: [PATCH 21/25] Move playwright tests to use project references --- .github/workflows/ci.yml | 13 ++++++ CONTRIBUTING.md | 2 +- addons/addon-attach/test/AttachAddon.test.ts | 2 +- addons/addon-attach/test/tsconfig.json | 6 ++- .../addon-canvas/test/CanvasRenderer.test.ts | 4 +- addons/addon-canvas/test/tsconfig.json | 7 ++-- .../test/ClipboardAddon.test.ts | 2 +- addons/addon-clipboard/test/tsconfig.json | 6 ++- addons/addon-fit/test/FitAddon.test.ts | 2 +- addons/addon-fit/test/tsconfig.json | 6 ++- addons/addon-image/test/ImageAddon.test.ts | 2 +- addons/addon-image/test/tsconfig.json | 6 ++- addons/addon-search/test/SearchAddon.test.ts | 2 +- addons/addon-search/test/tsconfig.json | 6 ++- .../test/SerializeAddon.test.ts | 2 +- addons/addon-serialize/test/tsconfig.json | 6 ++- .../test/UnicodeGraphemesAddon.test.ts | 2 +- .../test/tsconfig.json | 6 ++- .../test/Unicode11Addon.test.ts | 2 +- addons/addon-unicode11/test/tsconfig.json | 6 ++- .../test/WebLinksAddon.test.ts | 2 +- addons/addon-web-links/test/tsconfig.json | 6 ++- addons/addon-webgl/test/WebglRenderer.test.ts | 4 +- addons/addon-webgl/test/tsconfig.json | 7 ++-- bin/esbuild.mjs | 41 ++++++++++--------- bin/test_playwright.js | 6 +-- test/playwright/SharedRendererTests.ts | 2 +- test/playwright/tsconfig.json | 1 + 28 files changed, 97 insertions(+), 62 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4d836c1d..978f192f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,54 +29,67 @@ jobs: ./lib/* \ ./out/* \ ./out-esbuild/* \ + ./out-esbuild-test/* \ ./out-test/* \ ./addons/addon-attach/lib/* \ ./addons/addon-attach/out/* \ ./addons/addon-attach/out-esbuild/* \ + ./addons/addon-attach/out-esbuild-test/* \ ./addons/addon-attach/out-test/* \ ./addons/addon-canvas/lib/* \ ./addons/addon-canvas/out/* \ ./addons/addon-canvas/out-esbuild/* \ + ./addons/addon-canvas/out-esbuild-test/* \ ./addons/addon-canvas/out-test/* \ ./addons/addon-clipboard/lib/* \ ./addons/addon-clipboard/out/* \ ./addons/addon-clipboard/out-esbuild/* \ + ./addons/addon-clipboard/out-esbuild-test/* \ ./addons/addon-clipboard/out-test/* \ ./addons/addon-fit/lib/* \ ./addons/addon-fit/out/* \ ./addons/addon-fit/out-esbuild/* \ + ./addons/addon-fit/out-esbuild-test/* \ ./addons/addon-fit/out-test/* \ ./addons/addon-image/lib/* \ ./addons/addon-image/out/* \ ./addons/addon-image/out-esbuild/* \ + ./addons/addon-image/out-esbuild-test/* \ ./addons/addon-image/out-test/* \ ./addons/addon-ligatures/lib/* \ ./addons/addon-ligatures/out/* \ ./addons/addon-ligatures/out-esbuild/* \ + ./addons/addon-ligatures/out-esbuild-test/* \ ./addons/addon-ligatures/out-test/* \ ./addons/addon-search/lib/* \ ./addons/addon-search/out/* \ ./addons/addon-search/out-esbuild/* \ + ./addons/addon-search/out-esbuild-test/* \ ./addons/addon-search/out-test/* \ ./addons/addon-serialize/lib/* \ ./addons/addon-serialize/out/* \ ./addons/addon-serialize/out-esbuild/* \ + ./addons/addon-serialize/out-esbuild-test/* \ ./addons/addon-serialize/out-test/* \ ./addons/addon-unicode11/lib/* \ ./addons/addon-unicode11/out/* \ ./addons/addon-unicode11/out-esbuild/* \ + ./addons/addon-unicode11/out-esbuild-test/* \ ./addons/addon-unicode11/out-test/* \ ./addons/addon-unicode-graphemes/lib/* \ ./addons/addon-unicode-graphemes/out/* \ ./addons/addon-unicode-graphemes/out-esbuild/* \ + ./addons/addon-unicode-graphemes/out-esbuild-test/* \ ./addons/addon-unicode-graphemes/out-test/* \ ./addons/addon-web-links/lib/* \ ./addons/addon-web-links/out/* \ ./addons/addon-web-links/out-esbuild/* \ + ./addons/addon-web-links/out-esbuild-test/* \ ./addons/addon-web-links/out-test/* \ ./addons/addon-webgl/lib/* \ ./addons/addon-webgl/out/* \ ./addons/addon-webgl/out-esbuild/* \ + ./addons/addon-webgl/out-esbuild-test/* \ ./addons/addon-webgl/out-test/* - name: Upload artifacts uses: actions/upload-artifact@v3 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6c1633dd..1fffbab1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -101,4 +101,4 @@ yarn test-integration --suite=core yarn test-integration --suite=addon-search ``` -These use `@playwright/test` to run all tests within the tsc test output (`out-test/`). These do not use the esbuild output because they require declaration files to get types to work. +These use `@playwright/test` to run all tests within the esbuild test output (`out-esbuild-test/`). diff --git a/addons/addon-attach/test/AttachAddon.test.ts b/addons/addon-attach/test/AttachAddon.test.ts index efb64e6f..b49d9f33 100644 --- a/addons/addon-attach/test/AttachAddon.test.ts +++ b/addons/addon-attach/test/AttachAddon.test.ts @@ -6,7 +6,7 @@ import WebSocket = require('ws'); import test from '@playwright/test'; -import { ITestContext, createTestContext, openTerminal, pollFor, timeout } from '../../../out-test/playwright/TestUtils'; +import { ITestContext, createTestContext, openTerminal, pollFor, timeout } from '../../../test/playwright/TestUtils'; let ctx: ITestContext; test.beforeAll(async ({ browser }) => { diff --git a/addons/addon-attach/test/tsconfig.json b/addons/addon-attach/test/tsconfig.json index 5f0d9f6c..cff27705 100644 --- a/addons/addon-attach/test/tsconfig.json +++ b/addons/addon-attach/test/tsconfig.json @@ -20,8 +20,7 @@ }, "strict": true, "types": [ - "../../../node_modules/@types/node", - "../../../out-test/playwright/TestUtils" + "../../../node_modules/@types/node" ] }, "include": [ @@ -34,6 +33,9 @@ }, { "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" } ] } diff --git a/addons/addon-canvas/test/CanvasRenderer.test.ts b/addons/addon-canvas/test/CanvasRenderer.test.ts index c8b35c7a..099b62ec 100644 --- a/addons/addon-canvas/test/CanvasRenderer.test.ts +++ b/addons/addon-canvas/test/CanvasRenderer.test.ts @@ -4,8 +4,8 @@ */ import test from '@playwright/test'; -import { ISharedRendererTestContext, injectSharedRendererTests, injectSharedRendererTestsStandalone } from '../../../out-test/playwright/SharedRendererTests'; -import { ITestContext, createTestContext, openTerminal } from '../../../out-test/playwright/TestUtils'; +import { ISharedRendererTestContext, injectSharedRendererTests, injectSharedRendererTestsStandalone } from '../../../test/playwright/SharedRendererTests'; +import { ITestContext, createTestContext, openTerminal } from '../../../test/playwright/TestUtils'; let ctx: ITestContext; const ctxWrapper: ISharedRendererTestContext = { diff --git a/addons/addon-canvas/test/tsconfig.json b/addons/addon-canvas/test/tsconfig.json index f73f1014..6efb7073 100644 --- a/addons/addon-canvas/test/tsconfig.json +++ b/addons/addon-canvas/test/tsconfig.json @@ -21,9 +21,7 @@ "strict": true, "types": [ "../../../node_modules/@types/node", - "../../../node_modules/@lunapaint/png-codec", - "../../../out-test/playwright/TestUtils", - "../../../out-test/playwright/SharedRendererTests" + "../../../node_modules/@lunapaint/png-codec" ] }, "include": [ @@ -36,6 +34,9 @@ }, { "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" } ] } diff --git a/addons/addon-clipboard/test/ClipboardAddon.test.ts b/addons/addon-clipboard/test/ClipboardAddon.test.ts index 6234a3cd..d4d86d46 100644 --- a/addons/addon-clipboard/test/ClipboardAddon.test.ts +++ b/addons/addon-clipboard/test/ClipboardAddon.test.ts @@ -5,7 +5,7 @@ import test from '@playwright/test'; import { deepEqual, ok, strictEqual } from 'assert'; -import { ITestContext, createTestContext, launchBrowser, openTerminal, timeout } from '../../../out-test/playwright/TestUtils'; +import { ITestContext, createTestContext, launchBrowser, openTerminal, timeout } from '../../../test/playwright/TestUtils'; let ctx: ITestContext; test.beforeAll(async ({ browser }, testInfo) => { diff --git a/addons/addon-clipboard/test/tsconfig.json b/addons/addon-clipboard/test/tsconfig.json index 5f0d9f6c..cff27705 100644 --- a/addons/addon-clipboard/test/tsconfig.json +++ b/addons/addon-clipboard/test/tsconfig.json @@ -20,8 +20,7 @@ }, "strict": true, "types": [ - "../../../node_modules/@types/node", - "../../../out-test/playwright/TestUtils" + "../../../node_modules/@types/node" ] }, "include": [ @@ -34,6 +33,9 @@ }, { "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" } ] } diff --git a/addons/addon-fit/test/FitAddon.test.ts b/addons/addon-fit/test/FitAddon.test.ts index f780e2f5..a8a2d8bb 100644 --- a/addons/addon-fit/test/FitAddon.test.ts +++ b/addons/addon-fit/test/FitAddon.test.ts @@ -5,7 +5,7 @@ import test from '@playwright/test'; import { deepEqual, ok, strictEqual } from 'assert'; -import { ITestContext, createTestContext, openTerminal, timeout } from '../../../out-test/playwright/TestUtils'; +import { ITestContext, createTestContext, openTerminal, timeout } from '../../../test/playwright/TestUtils'; let ctx: ITestContext; test.beforeAll(async ({ browser }) => { diff --git a/addons/addon-fit/test/tsconfig.json b/addons/addon-fit/test/tsconfig.json index 5f0d9f6c..cff27705 100644 --- a/addons/addon-fit/test/tsconfig.json +++ b/addons/addon-fit/test/tsconfig.json @@ -20,8 +20,7 @@ }, "strict": true, "types": [ - "../../../node_modules/@types/node", - "../../../out-test/playwright/TestUtils" + "../../../node_modules/@types/node" ] }, "include": [ @@ -34,6 +33,9 @@ }, { "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" } ] } diff --git a/addons/addon-image/test/ImageAddon.test.ts b/addons/addon-image/test/ImageAddon.test.ts index 54ea635a..758a19a4 100644 --- a/addons/addon-image/test/ImageAddon.test.ts +++ b/addons/addon-image/test/ImageAddon.test.ts @@ -6,7 +6,7 @@ import test from '@playwright/test'; import { readFileSync } from 'fs'; import { FINALIZER, introducer, sixelEncode } from 'sixel'; -import { ITestContext, createTestContext, openTerminal, pollFor } from '../../../out-test/playwright/TestUtils'; +import { ITestContext, createTestContext, openTerminal, pollFor } from '../../../test/playwright/TestUtils'; import { deepStrictEqual, ok, strictEqual } from 'assert'; /** diff --git a/addons/addon-image/test/tsconfig.json b/addons/addon-image/test/tsconfig.json index 5f0d9f6c..cff27705 100644 --- a/addons/addon-image/test/tsconfig.json +++ b/addons/addon-image/test/tsconfig.json @@ -20,8 +20,7 @@ }, "strict": true, "types": [ - "../../../node_modules/@types/node", - "../../../out-test/playwright/TestUtils" + "../../../node_modules/@types/node" ] }, "include": [ @@ -34,6 +33,9 @@ }, { "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" } ] } diff --git a/addons/addon-search/test/SearchAddon.test.ts b/addons/addon-search/test/SearchAddon.test.ts index dbcb0738..0045cf1c 100644 --- a/addons/addon-search/test/SearchAddon.test.ts +++ b/addons/addon-search/test/SearchAddon.test.ts @@ -7,7 +7,7 @@ import test from '@playwright/test'; import { deepStrictEqual, strictEqual } from 'assert'; import { readFile } from 'fs'; import { resolve } from 'path'; -import { ITestContext, createTestContext, openTerminal, timeout } from '../../../out-test/playwright/TestUtils'; +import { ITestContext, createTestContext, openTerminal, timeout } from '../../../test/playwright/TestUtils'; let ctx: ITestContext; test.beforeAll(async ({ browser }) => { diff --git a/addons/addon-search/test/tsconfig.json b/addons/addon-search/test/tsconfig.json index 5f0d9f6c..cff27705 100644 --- a/addons/addon-search/test/tsconfig.json +++ b/addons/addon-search/test/tsconfig.json @@ -20,8 +20,7 @@ }, "strict": true, "types": [ - "../../../node_modules/@types/node", - "../../../out-test/playwright/TestUtils" + "../../../node_modules/@types/node" ] }, "include": [ @@ -34,6 +33,9 @@ }, { "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" } ] } diff --git a/addons/addon-serialize/test/SerializeAddon.test.ts b/addons/addon-serialize/test/SerializeAddon.test.ts index 30ff6002..cf00b391 100644 --- a/addons/addon-serialize/test/SerializeAddon.test.ts +++ b/addons/addon-serialize/test/SerializeAddon.test.ts @@ -7,7 +7,7 @@ import test from '@playwright/test'; import { deepStrictEqual, notDeepStrictEqual, strictEqual } from 'assert'; import { readFile } from 'fs'; import { resolve } from 'path'; -import { ITestContext, createTestContext, openTerminal, timeout, writeSync } from '../../../out-test/playwright/TestUtils'; +import { ITestContext, createTestContext, openTerminal, timeout, writeSync } from '../../../test/playwright/TestUtils'; const writeRawSync = (page: any, str: string): Promise => writeSync(ctx.page, `' +` + JSON.stringify(str) + `+ '`); diff --git a/addons/addon-serialize/test/tsconfig.json b/addons/addon-serialize/test/tsconfig.json index 5f0d9f6c..cff27705 100644 --- a/addons/addon-serialize/test/tsconfig.json +++ b/addons/addon-serialize/test/tsconfig.json @@ -20,8 +20,7 @@ }, "strict": true, "types": [ - "../../../node_modules/@types/node", - "../../../out-test/playwright/TestUtils" + "../../../node_modules/@types/node" ] }, "include": [ @@ -34,6 +33,9 @@ }, { "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" } ] } diff --git a/addons/addon-unicode-graphemes/test/UnicodeGraphemesAddon.test.ts b/addons/addon-unicode-graphemes/test/UnicodeGraphemesAddon.test.ts index 9bf272ef..258e3668 100644 --- a/addons/addon-unicode-graphemes/test/UnicodeGraphemesAddon.test.ts +++ b/addons/addon-unicode-graphemes/test/UnicodeGraphemesAddon.test.ts @@ -5,7 +5,7 @@ import test from '@playwright/test'; import { deepStrictEqual, strictEqual } from 'assert'; -import { ITestContext, createTestContext, openTerminal } from '../../../out-test/playwright/TestUtils'; +import { ITestContext, createTestContext, openTerminal } from '../../../test/playwright/TestUtils'; let ctx: ITestContext; test.beforeAll(async ({ browser }) => { diff --git a/addons/addon-unicode-graphemes/test/tsconfig.json b/addons/addon-unicode-graphemes/test/tsconfig.json index 5f0d9f6c..cff27705 100644 --- a/addons/addon-unicode-graphemes/test/tsconfig.json +++ b/addons/addon-unicode-graphemes/test/tsconfig.json @@ -20,8 +20,7 @@ }, "strict": true, "types": [ - "../../../node_modules/@types/node", - "../../../out-test/playwright/TestUtils" + "../../../node_modules/@types/node" ] }, "include": [ @@ -34,6 +33,9 @@ }, { "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" } ] } diff --git a/addons/addon-unicode11/test/Unicode11Addon.test.ts b/addons/addon-unicode11/test/Unicode11Addon.test.ts index 4e941c34..a0f1dc49 100644 --- a/addons/addon-unicode11/test/Unicode11Addon.test.ts +++ b/addons/addon-unicode11/test/Unicode11Addon.test.ts @@ -5,7 +5,7 @@ import test from '@playwright/test'; import { deepStrictEqual } from 'assert'; -import { ITestContext, createTestContext, openTerminal } from '../../../out-test/playwright/TestUtils'; +import { ITestContext, createTestContext, openTerminal } from '../../../test/playwright/TestUtils'; let ctx: ITestContext; test.beforeAll(async ({ browser }) => { diff --git a/addons/addon-unicode11/test/tsconfig.json b/addons/addon-unicode11/test/tsconfig.json index 5f0d9f6c..cff27705 100644 --- a/addons/addon-unicode11/test/tsconfig.json +++ b/addons/addon-unicode11/test/tsconfig.json @@ -20,8 +20,7 @@ }, "strict": true, "types": [ - "../../../node_modules/@types/node", - "../../../out-test/playwright/TestUtils" + "../../../node_modules/@types/node" ] }, "include": [ @@ -34,6 +33,9 @@ }, { "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" } ] } diff --git a/addons/addon-web-links/test/WebLinksAddon.test.ts b/addons/addon-web-links/test/WebLinksAddon.test.ts index abad5150..8682c533 100644 --- a/addons/addon-web-links/test/WebLinksAddon.test.ts +++ b/addons/addon-web-links/test/WebLinksAddon.test.ts @@ -6,7 +6,7 @@ import test from '@playwright/test'; import { deepStrictEqual, strictEqual } from 'assert'; import { readFile } from 'fs'; import { resolve } from 'path'; -import { ITestContext, createTestContext, openTerminal, pollFor, timeout } from '../../../out-test/playwright/TestUtils'; +import { ITestContext, createTestContext, openTerminal, pollFor, timeout } from '../../../test/playwright/TestUtils'; interface ILinkStateData { uri?: string; diff --git a/addons/addon-web-links/test/tsconfig.json b/addons/addon-web-links/test/tsconfig.json index 0c61a31e..120fccdc 100644 --- a/addons/addon-web-links/test/tsconfig.json +++ b/addons/addon-web-links/test/tsconfig.json @@ -21,8 +21,7 @@ }, "strict": true, "types": [ - "../../../node_modules/@types/node", - "../../../out-test/playwright/TestUtils" + "../../../node_modules/@types/node" ] }, "include": [ @@ -35,6 +34,9 @@ }, { "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" } ] } diff --git a/addons/addon-webgl/test/WebglRenderer.test.ts b/addons/addon-webgl/test/WebglRenderer.test.ts index d5f62fda..af61992c 100644 --- a/addons/addon-webgl/test/WebglRenderer.test.ts +++ b/addons/addon-webgl/test/WebglRenderer.test.ts @@ -4,8 +4,8 @@ */ import test from '@playwright/test'; -import { ISharedRendererTestContext, injectSharedRendererTests, injectSharedRendererTestsStandalone } from '../../../out-test/playwright/SharedRendererTests'; -import { ITestContext, createTestContext, openTerminal } from '../../../out-test/playwright/TestUtils'; +import { ISharedRendererTestContext, injectSharedRendererTests, injectSharedRendererTestsStandalone } from '../../../test/playwright/SharedRendererTests'; +import { ITestContext, createTestContext, openTerminal } from '../../../test/playwright/TestUtils'; import { platform } from 'os'; let ctx: ITestContext; diff --git a/addons/addon-webgl/test/tsconfig.json b/addons/addon-webgl/test/tsconfig.json index 7ff5f6c1..c602c462 100644 --- a/addons/addon-webgl/test/tsconfig.json +++ b/addons/addon-webgl/test/tsconfig.json @@ -21,9 +21,7 @@ "strict": true, "types": [ "../../../node_modules/@types/node", - "../../../node_modules/@lunapaint/png-codec", - "../../../out-test/playwright/TestUtils", - "../../../out-test/playwright/SharedRendererTests" + "../../../node_modules/@lunapaint/png-codec" ] }, "include": [ @@ -36,6 +34,9 @@ }, { "path": "../../../src/browser" + }, + { + "path": "../../../test/playwright" } ] } diff --git a/bin/esbuild.mjs b/bin/esbuild.mjs index 724c2ca1..f056e30d 100644 --- a/bin/esbuild.mjs +++ b/bin/esbuild.mjs @@ -92,10 +92,10 @@ let outConfig = { let skipOut = false; /** @type {esbuild.BuildOptions} */ -// let outTestConfig = { -// format: 'cjs' -// } -// let skipOutTest = false; +let outTestConfig = { + format: 'cjs' +} +let skipOutTest = false; if (config.addon) { bundleConfig = { @@ -108,14 +108,15 @@ if (config.addon) { entryPoints: [`addons/addon-${config.addon}/src/**/*.ts`], outdir: `addons/addon-${config.addon}/out-esbuild/` }; - // outTestConfig = { - // ...outConfig, - // entryPoints: [`addons/addon-${config.addon}/test/**/*.ts`], - // outdir: `addons/addon-${config.addon}/out-esbuild-test/` - // }; + outTestConfig = { + ...outConfig, + entryPoints: [`addons/addon-${config.addon}/test/**/*.ts`], + outdir: `addons/addon-${config.addon}/out-esbuild-test/` + }; if (config.addon === 'ligatures') { bundleConfig.platform = 'node'; + skipOutTest = true; } if (config.addon === 'serialize') { @@ -173,11 +174,11 @@ if (config.addon) { entryPoints: ['src/**/*.ts'], outdir: 'out-esbuild/' }; - // outTestConfig = { - // ...outConfig, - // entryPoints: ['test/**/*.ts'], - // outdir: 'out-esbuild-test/' - // }; + outTestConfig = { + ...outConfig, + entryPoints: ['test/**/*.ts'], + outdir: 'out-esbuild-test/' + }; } if (config.isWatch) { @@ -185,15 +186,15 @@ if (config.isWatch) { if (!skipOut) { context(outConfig).then(e => e.watch()); } - // if (!skipOutTest) { - // context(outTestConfig).then(e => e.watch()); - // } + if (!skipOutTest) { + context(outTestConfig).then(e => e.watch()); + } } else { await build(bundleConfig); if (!skipOut) { await build(outConfig); } - // if (!skipOutTest) { - // await build(outTestConfig); - // } + if (!skipOutTest) { + await build(outTestConfig); + } } diff --git a/bin/test_playwright.js b/bin/test_playwright.js index 7536ff0d..2964693c 100644 --- a/bin/test_playwright.js +++ b/bin/test_playwright.js @@ -18,7 +18,7 @@ while (argv.some(e => e.startsWith('--suite='))) { } let configs = [ - { name: 'core', path: 'out-test/playwright/playwright.config.js' } + { name: 'core', path: 'out-esbuild-test/playwright/playwright.config.js' } ]; const addons = [ 'attach', @@ -34,7 +34,7 @@ const addons = [ 'webgl', ]; for (const addon of addons) { - configs.push({ name: `addon-${addon}`, path: `addons/addon-${addon}/out-test/playwright.config.js` }); + configs.push({ name: `addon-${addon}`, path: `addons/addon-${addon}/out-esbuild-test/playwright.config.js` }); } if (suiteFilter) { @@ -61,8 +61,8 @@ async function run() { if (run.error) { console.error(run.error); + process.exit(run.status ?? -1); } - process.exit(run.status ?? -1); } } run(); diff --git a/test/playwright/SharedRendererTests.ts b/test/playwright/SharedRendererTests.ts index 68492b3d..4a1798ce 100644 --- a/test/playwright/SharedRendererTests.ts +++ b/test/playwright/SharedRendererTests.ts @@ -1313,7 +1313,7 @@ function getCellColor(ctx: ITestContext, col: number, row: number, position: Cel let frameDetails: { cols: number, rows: number, decoded: IImage32 } | undefined = undefined; async function getFrameDetails(ctx: ITestContext): Promise<{ cols: number, rows: number, decoded: IImage32 }> { - const screenshotOptions: LocatorScreenshotOptions | undefined = process.env.DEBUG ? { path: 'out-test/playwright/screenshot.png' } : undefined; + const screenshotOptions: LocatorScreenshotOptions | undefined = process.env.DEBUG ? { path: 'out-esbuild-test/playwright/screenshot.png' } : undefined; const buffer = await ctx.page.locator('#terminal-container .xterm-screen').screenshot(screenshotOptions); frameDetails = { cols: await ctx.proxy.cols, diff --git a/test/playwright/tsconfig.json b/test/playwright/tsconfig.json index 9857ff0d..255e6eb0 100644 --- a/test/playwright/tsconfig.json +++ b/test/playwright/tsconfig.json @@ -26,6 +26,7 @@ }, "target": "ESNext", "module": "commonjs", + "composite": true }, "include": [ "./**/*", From 89e315ab2b85ebd2b5f4e8c7de558d1af14b70a8 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sun, 7 Jul 2024 09:12:28 -0700 Subject: [PATCH 22/25] Hide build output from vscode explorer --- .vscode/settings.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.vscode/settings.json b/.vscode/settings.json index 20356fd5..b6926a32 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,12 @@ "files.associations": { ".eslintrc.json.typings": "jsonc" }, + // Hide output files from the file explorer, comment this out to see the build output + "files.exclude": { + "**/lib": true, + "**/out": true, + "**/out-*": true, + }, "typescript.preferences.importModuleSpecifier": "non-relative", "typescript.preferences.quoteStyle": "single", "mochaExplorer.envPath": ".mocha.env", From 2fc8acf81e41e42193720888ea08dfb56d765133 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sun, 7 Jul 2024 09:15:25 -0700 Subject: [PATCH 23/25] Publish addon mjs files --- addons/addon-attach/.npmignore | 3 +++ addons/addon-canvas/.npmignore | 3 +++ addons/addon-clipboard/.npmignore | 3 +++ addons/addon-fit/.npmignore | 3 +++ addons/addon-image/.npmignore | 2 ++ addons/addon-ligatures/.npmignore | 3 +++ addons/addon-search/.npmignore | 3 +++ addons/addon-serialize/.npmignore | 3 +++ addons/addon-unicode-graphemes/.npmignore | 3 +++ addons/addon-unicode11/.npmignore | 3 +++ addons/addon-web-links/.npmignore | 3 +++ addons/addon-webgl/.npmignore | 3 +++ 12 files changed, 35 insertions(+) diff --git a/addons/addon-attach/.npmignore b/addons/addon-attach/.npmignore index b203232a..d2fb3bdc 100644 --- a/addons/addon-attach/.npmignore +++ b/addons/addon-attach/.npmignore @@ -8,6 +8,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ diff --git a/addons/addon-canvas/.npmignore b/addons/addon-canvas/.npmignore index b203232a..d2fb3bdc 100644 --- a/addons/addon-canvas/.npmignore +++ b/addons/addon-canvas/.npmignore @@ -8,6 +8,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ diff --git a/addons/addon-clipboard/.npmignore b/addons/addon-clipboard/.npmignore index b203232a..d2fb3bdc 100644 --- a/addons/addon-clipboard/.npmignore +++ b/addons/addon-clipboard/.npmignore @@ -8,6 +8,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ diff --git a/addons/addon-fit/.npmignore b/addons/addon-fit/.npmignore index b203232a..d2fb3bdc 100644 --- a/addons/addon-fit/.npmignore +++ b/addons/addon-fit/.npmignore @@ -8,6 +8,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ diff --git a/addons/addon-image/.npmignore b/addons/addon-image/.npmignore index 5889e6f1..d2b906cd 100644 --- a/addons/addon-image/.npmignore +++ b/addons/addon-image/.npmignore @@ -6,5 +6,7 @@ tsconfig.json webpack.config.js test out-test +out-esbuild +out-esbuild-test inwasm-sdks inwasm-builds diff --git a/addons/addon-ligatures/.npmignore b/addons/addon-ligatures/.npmignore index b203232a..d2fb3bdc 100644 --- a/addons/addon-ligatures/.npmignore +++ b/addons/addon-ligatures/.npmignore @@ -8,6 +8,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ diff --git a/addons/addon-search/.npmignore b/addons/addon-search/.npmignore index b203232a..d2fb3bdc 100644 --- a/addons/addon-search/.npmignore +++ b/addons/addon-search/.npmignore @@ -8,6 +8,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ diff --git a/addons/addon-serialize/.npmignore b/addons/addon-serialize/.npmignore index b203232a..d2fb3bdc 100644 --- a/addons/addon-serialize/.npmignore +++ b/addons/addon-serialize/.npmignore @@ -8,6 +8,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ diff --git a/addons/addon-unicode-graphemes/.npmignore b/addons/addon-unicode-graphemes/.npmignore index b203232a..d2fb3bdc 100644 --- a/addons/addon-unicode-graphemes/.npmignore +++ b/addons/addon-unicode-graphemes/.npmignore @@ -8,6 +8,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ diff --git a/addons/addon-unicode11/.npmignore b/addons/addon-unicode11/.npmignore index b203232a..d2fb3bdc 100644 --- a/addons/addon-unicode11/.npmignore +++ b/addons/addon-unicode11/.npmignore @@ -8,6 +8,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ diff --git a/addons/addon-web-links/.npmignore b/addons/addon-web-links/.npmignore index b203232a..d2fb3bdc 100644 --- a/addons/addon-web-links/.npmignore +++ b/addons/addon-web-links/.npmignore @@ -8,6 +8,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ diff --git a/addons/addon-webgl/.npmignore b/addons/addon-webgl/.npmignore index b203232a..d2fb3bdc 100644 --- a/addons/addon-webgl/.npmignore +++ b/addons/addon-webgl/.npmignore @@ -8,6 +8,9 @@ !lib/**/*.js !lib/**/*.js.map +!lib/**/*.mjs +!lib/**/*.mjs.map + !lib/**/*.css # Whitelist - src/ From ab8453c7738aedecf81ad8b5293e3c7f3f9b153d Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sun, 7 Jul 2024 09:21:17 -0700 Subject: [PATCH 24/25] Simplify zip job --- .github/workflows/ci.yml | 52 ++++++++++------------------------------ 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 978f192f..6f03e492 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,69 +28,43 @@ jobs: zip -r compressed-build \ ./lib/* \ ./out/* \ - ./out-esbuild/* \ - ./out-esbuild-test/* \ - ./out-test/* \ + ./out-*/* \ ./addons/addon-attach/lib/* \ ./addons/addon-attach/out/* \ - ./addons/addon-attach/out-esbuild/* \ - ./addons/addon-attach/out-esbuild-test/* \ - ./addons/addon-attach/out-test/* \ + ./addons/addon-attach/out-*/* \ ./addons/addon-canvas/lib/* \ ./addons/addon-canvas/out/* \ - ./addons/addon-canvas/out-esbuild/* \ - ./addons/addon-canvas/out-esbuild-test/* \ - ./addons/addon-canvas/out-test/* \ + ./addons/addon-canvas/out-*/* \ ./addons/addon-clipboard/lib/* \ ./addons/addon-clipboard/out/* \ - ./addons/addon-clipboard/out-esbuild/* \ - ./addons/addon-clipboard/out-esbuild-test/* \ - ./addons/addon-clipboard/out-test/* \ + ./addons/addon-clipboard/out-*/* \ ./addons/addon-fit/lib/* \ ./addons/addon-fit/out/* \ - ./addons/addon-fit/out-esbuild/* \ - ./addons/addon-fit/out-esbuild-test/* \ - ./addons/addon-fit/out-test/* \ + ./addons/addon-fit/out-*/* \ ./addons/addon-image/lib/* \ ./addons/addon-image/out/* \ - ./addons/addon-image/out-esbuild/* \ - ./addons/addon-image/out-esbuild-test/* \ - ./addons/addon-image/out-test/* \ + ./addons/addon-image/out-*/* \ ./addons/addon-ligatures/lib/* \ ./addons/addon-ligatures/out/* \ - ./addons/addon-ligatures/out-esbuild/* \ - ./addons/addon-ligatures/out-esbuild-test/* \ - ./addons/addon-ligatures/out-test/* \ + ./addons/addon-ligatures/out-*/* \ ./addons/addon-search/lib/* \ ./addons/addon-search/out/* \ - ./addons/addon-search/out-esbuild/* \ - ./addons/addon-search/out-esbuild-test/* \ - ./addons/addon-search/out-test/* \ + ./addons/addon-search/out-*/* \ ./addons/addon-serialize/lib/* \ ./addons/addon-serialize/out/* \ - ./addons/addon-serialize/out-esbuild/* \ - ./addons/addon-serialize/out-esbuild-test/* \ - ./addons/addon-serialize/out-test/* \ + ./addons/addon-serialize/out-*/* \ ./addons/addon-unicode11/lib/* \ ./addons/addon-unicode11/out/* \ - ./addons/addon-unicode11/out-esbuild/* \ - ./addons/addon-unicode11/out-esbuild-test/* \ - ./addons/addon-unicode11/out-test/* \ + ./addons/addon-unicode11/out-*/* \ ./addons/addon-unicode-graphemes/lib/* \ ./addons/addon-unicode-graphemes/out/* \ - ./addons/addon-unicode-graphemes/out-esbuild/* \ - ./addons/addon-unicode-graphemes/out-esbuild-test/* \ - ./addons/addon-unicode-graphemes/out-test/* \ + ./addons/addon-unicode-graphemes/out-*/* \ ./addons/addon-web-links/lib/* \ ./addons/addon-web-links/out/* \ - ./addons/addon-web-links/out-esbuild/* \ - ./addons/addon-web-links/out-esbuild-test/* \ - ./addons/addon-web-links/out-test/* \ + ./addons/addon-web-links/out-*/* \ ./addons/addon-webgl/lib/* \ ./addons/addon-webgl/out/* \ - ./addons/addon-webgl/out-esbuild/* \ - ./addons/addon-webgl/out-esbuild-test/* \ - ./addons/addon-webgl/out-test/* + ./addons/addon-webgl/out-*st/* - name: Upload artifacts uses: actions/upload-artifact@v3 with: From f341d0a3e9c81a2d0d7d343311d556ec025ffb44 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sun, 7 Jul 2024 09:21:55 -0700 Subject: [PATCH 25/25] Fix formatting of tasks.json --- .vscode/tasks.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 1681bb8d..6c9286d7 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -7,7 +7,8 @@ "panel": "dedicated", "showReuseMessage": true }, - "tasks": [// Compound tasks + "tasks": [ + // Compound tasks { "label": "Development", "dependsOn": ["demo-server", "tsc", "esbuild", "esbuild-demo"],