Compare commits

...
Author SHA1 Message Date
Daniel ImmsandCursor 368848a93b chore(benchmark): remove trailing whitespace in benchmark.json
Drop stray trailing space after the evalConfig closing brace so the
benchmark config JSON is cleanly formatted.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 15:28:49 +00:00
Daniel Imms 6fd6003d6c Merge pull request #5971 from xtermjs/cursor/parseint-radix-10-89d6
fix: pass radix 10 to parseInt across core and addons
2026-06-01 08:12:17 -07:00
Daniel ImmsandCursor d407bf561f fix(webgl): pass radix 10 for SVG arc flag parsing
CustomGlyphRasterizer parsed large-arc and sweep flags with parseInt
without a radix when drawing SVG arc paths. Use base 10 for 0/1 flags.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 15:05:58 +00:00
Daniel ImmsandCursor a1a8d1abae fix(image): pass radix 10 when parsing kitty graphics numeric keys
KittyGraphicsTypes parsed numeric control values with parseInt
without a radix. Use base 10 explicitly for format, id, dimensions,
and offset fields.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 15:05:58 +00:00
Daniel ImmsandCursor f34d0a255c fix(image): pass radix 10 in IIPHandler dimension parsing
_dim() parsed percent, pixel, and cell dimension strings with
parseInt without an explicit radix. Use base 10 for all three paths,
consistent with other numeric parsing fixes in the repo.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 15:05:58 +00:00
Daniel ImmsandCursor a2cd1ab29c fix(fit): parse terminal padding with radix 10 and zero fallback
proposeDimensions summed padding-top/bottom/left/right via bare
parseInt, so non-numeric padding values produced NaN and broke
available width/height. Use radix 10 and || 0 on each side, consistent
with parent element size parsing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 15:05:58 +00:00
Daniel ImmsandCursor 99550840d2 fix(fit): add radix and zero fallback for parent width parsing
Align parent width parsing with the height fix: parseInt with radix
10 and || 0 inside Math.max so non-numeric CSS width does not yield
NaN cols in proposeDimensions.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 15:05:57 +00:00
Daniel ImmsandCursor b0f6aed4a1 fix(common): pass radix 10 when parsing OSC color indices
InputHandler parsed palette indices from OSC color sequences with
parseInt without a radix after validating digits-only slots. Use
base 10 for set/report and restore color index parsing.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 15:05:43 +00:00
Daniel ImmsandCursor 878e3fc52d fix(browser): pass radix 10 when parsing Chrome major version
Wheel event DPR factoring parses Chrome/(\d+) with parseInt without a
radix. Add base 10 explicitly, matching getSafariVersion and other
version parsing in the codebase.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 15:05:43 +00:00
Daniel ImmsandCursor f04679a42e fix(common): pass radix 10 when parsing rgb() components in Color
rgba/rgb CSS parsing used parseInt without a radix on captured digit
groups. Add base 10 explicitly, matching getSafariVersion and other
call sites in the codebase.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 15:05:43 +00:00
Daniel ImmsandCursor 6ebcf79358 fix(common): pass radix 10 to parseInt in getSafariVersion
Safari major version parsing used parseInt without an explicit radix.
Other call sites in the repo use base 10; add the radix for consistency
and to avoid octal interpretation of leading-zero strings.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 15:05:43 +00:00
Daniel ImmsandCursor d4acf2fa45 fix(browser): use radix 10 for padding parseInt in Mouse coords
parseInt without a radix can mis-parse leading-zero padding values as
octal. Match AccessibilityManager and document rowCount JSDoc typo.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 15:05:43 +00:00
Daniel Imms ddf2b7d091 Merge pull request #5969 from Tyriar/import-no-cycle-5897-2
Add oxlint import/no-cycle and break existing src/common cycles
2026-05-31 15:13:58 -07:00
Daniel ImmsandCursor 5684f95c8e Colocate circular list types in CircularList.ts
The import/no-cycle refactor had moved IInsertEvent, IDeleteEvent, and
ICircularList into Types.ts, with CircularList.ts re-exporting the event
types from there. That split the list abstraction from its implementation
and pulled Types into the circular-list dependency graph.

Define IInsertEvent, IDeleteEvent, and ICircularList in CircularList.ts
alongside the CircularList class. CircularList.ts now depends only on
Lifecycle and Event, not Types.ts.

Remove those definitions from Types.ts (and the unused Emitter import).

Update callers to import list types from CircularList:
- buffer/Types.ts (IBuffer.lines)
- DecorationService.ts (buffer line insert/delete handlers)
- browser TestUtils.test.ts (mock buffer lines)

Types.ts no longer imports or re-exports circular-list types, preserving
the acyclic Types -> buffer/CircularList boundary.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-31 14:37:01 -07:00
Daniel ImmsandCursor cd3dcc52b2 Colocate buffer types in buffer/Types.ts
The import/no-cycle refactor had moved IBuffer, IBufferSet, and related
cell/line types into src/common/Types.ts, with buffer/Types.ts only
re-exporting them. That inverted the natural module boundary and made
buffer code depend on the top-level types hub.

Define buffer-owned types in buffer/Types.ts instead:
- CharData, IExtendedAttrs, IAttributeData, ICellData, IBufferLine
- IMarker, IBuffer, IBufferSet, BufferIndex

Restore UnderlineStyle to buffer/Constants.ts (used by IExtendedAttrs)
and remove those definitions from Types.ts.

buffer/Types.ts imports only what it needs from outside the buffer layer:
ICircularList and ICharset from Types, IDisposable from Lifecycle,
IEvent from Event, and UnderlineStyle from Constants. Types.ts does not
import buffer/Types.ts, so the previous Types <-> buffer cycle stays broken.

Update imports across common, browser, headless, addons, and tests to use
common/buffer/Types for buffer types rather than common/Types.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-31 14:35:08 -07:00
Daniel Imms 936442c813 Merge pull request #5964 from PerBothner/decoration-test
Avoid "fake markers" in DecorationService.test.ts.
2026-05-31 11:57:36 -07:00
Daniel Imms dfb65ca66f Add mise.toml to .gitignore (#5968)
<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
Ignores local `mise.toml` configuration at the repository root so it is not committed.
<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a href="https://cursor.com/agents/bc-02c1c884-aae2-4267-b29b-fe7b93574ebe"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a href="https://cursor.com/background-agent?bcId=bc-02c1c884-aae2-4267-b29b-fe7b93574ebe"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>
2026-05-31 10:52:07 -07:00
Per Bothner 35c91cbf2d Merge branch 'master' into decoration-test 2026-05-31 10:13:17 -07:00
Cursor AgentandDaniel Imms 587856e2ca Add mise.toml to .gitignore
Co-authored-by: Daniel Imms <Tyriar@users.noreply.github.com>
2026-05-31 17:08:48 +00:00
Daniel ImmsandCursor 56a7195487 Add oxlint import/no-cycle and break existing src/common cycles
Enable oxlint's import/no-cycle rule (import plugin) so circular module
dependencies are caught in CI, similar to eslint-plugin-import/no-cycle
and biome no-import-cycles discussed in the issue.

Relocate shared types and dependencies to remove cycles under src/common:

- Types.ts: host IInsertEvent, IDeleteEvent, IParams, UnderlineStyle,
  IBuffer, and IBufferSet; drop imports from CircularList, buffer/Types,
  parser/Types, and Services
- CoreTerminal.ts: define and export ICoreTerminal
- ServiceRegistry.ts: define IServiceIdentifier (break Services registry loop)
- UnicodeService: stop constructing UnicodeV6; CoreTerminal registers the
  default v6 provider after service creation
- buffer/Types.ts and parser/Types.ts: re-export moved types for callers

Fixes https://github.com/xtermjs/xterm.js/issues/5897

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-31 10:08:04 -07:00
Daniel Imms 4aa04c6b3f Merge pull request #5967 from Tyriar/migrate-eslint-to-oxlint-5690
Migrate linting from ESLint to Oxlint (Fixes #5690)
2026-05-31 09:59:34 -07:00
Per Bothner 28eadddb79 Merge branch 'master' into decoration-test 2026-05-31 09:49:20 -07:00
Daniel ImmsandCursor 59d1ec7bf0 Migrate linting from ESLint to Oxlint (Fixes #5690)
Replace the primary lint pipeline with oxlint and oxlint-tsgolint for type-aware TypeScript rules, preserving existing rule behavior from eslint.config.mjs via @oxlint/migrate and targeted jsPlugins (@stylistic/eslint-plugin, eslint-plugin-jsdoc as jsdoc-js, oxlint-plugin-eslint for no-restricted-syntax and object-curly-spacing).

Keep a hybrid ESLint pass (eslint.config.naming.mjs) only for @typescript-eslint/naming-convention until tsgolint implements it (oxc-project/tsgolint#186). Legacy eslint.config.mjs and eslint.config.typings.mjs remain for reference but are no longer used by npm scripts.

Add .oxlintrc.json for src/addons/demo/test and .oxlintrc.typings.json for typings/ (syntax-only, no --type-aware). Update lint, lint-fix, lint-api, and lint-changes to run oxlint first, then naming ESLint. Platform binaries install via oxlint-tsgolint optionalDependencies on Linux, macOS, and Windows.

Fixes https://github.com/xtermjs/xterm.js/issues/5690

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-31 09:48:32 -07:00
Per Bothner 7c82c1a815 Update more DecorationService tests to use existing bufferService. 2026-05-31 09:48:19 -07:00
Daniel Imms 04a0b7347c Merge pull request #5966 from Tyriar/remove-path-mappings-5896
Remove TypeScript path mappings in favor of relative imports
2026-05-31 09:31:57 -07:00
Daniel ImmsandCursor 5d8da19c44 Keep path mappings for addons after core migration
Follow-up to https://github.com/xtermjs/xterm.js/issues/5896 / PR #5966.

Converting addons to ../../../src/common relative imports broke unit tests:
esbuild emits addon code under addons/*/out-esbuild/ without mirroring the
shared tree, so Node could not load TypeScript sources at runtime
(Cannot find module '../../../src/common/Lifecycle').

Core src/, test/, and headless continue to use relative imports with no
common/* path mappings. Addons keep the prior model until build layout
can share out-esbuild the same way as the main package.

Changes:
- Restore common/* and browser/* paths in addon src/test/benchmark tsconfigs
- Revert addon imports to common/ and browser/ path-mapped specifiers
- Restore NODE_PATH=out-esbuild in bin/test_unit.js for Mocha resolution
- Restore webpack resolve.alias on addons that bundle against out/

Fixes CI test-unit failures on remove-path-mappings-5896.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-31 09:25:12 -07:00
Daniel ImmsandCursor 17ad33dc3d Remove TypeScript path mappings in favor of relative imports
Fixes https://github.com/xtermjs/xterm.js/issues/5896

TypeScript path mappings for common/*, browser/*, and headless/*
were not rewritten in emitted JavaScript, which forced webpack resolve
aliases and NODE_PATH workarounds so runtime could resolve modules.
That added build complexity and broke tooling such as ESLint import/no-cycle.

Changes:
- Convert ~750 imports across src/, addons/, and test/ to relative paths
- Remove common/browser/headless paths and src catch-all mappings from tsconfigs
  (keep @xterm/addon-* demo and addon typings paths)
- Remove webpack resolve.alias for common, browser, headless, and vs
- Drop NODE_PATH from unit tests, benchmarks, and VS Code launch config
- Fix addon-image IIPImageStorage to import ./Types after removing catch-all *

Verified: npm run build, esbuild, package, package-headless
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-31 09:16:10 -07:00
Per Bothner f76c7aa8ea Avoid "fake markers" in DecorationService.test.ts.
Instead we use an actual Marker in an actual Buffer.
2026-05-30 14:07:03 -07:00
188 changed files with 2085 additions and 1002 deletions
+1
View File
@@ -17,6 +17,7 @@ docs/
npm-debug.log npm-debug.log
/.idea/ /.idea/
.env .env
mise.toml
build/ build/
.DS_Store .DS_Store
yarn.lock yarn.lock
+374
View File
@@ -0,0 +1,374 @@
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": [
"import",
"typescript"
],
"categories": {
"correctness": "off"
},
"options": {
"typeAware": true,
"maxWarnings": 0
},
"env": {
"builtin": true
},
"ignorePatterns": [
"addons/*/src/third-party/*.ts",
"**/out/*",
"**/out-test/*",
"**/out-esbuild/*",
"**/out-esbuild-test/*",
"**/inwasm-sdks/*",
"**/typings/*.d.ts",
"**/node_modules",
"**/*.js",
"**/*.mjs"
],
"rules": {
"constructor-super": "error",
"for-direction": "error",
"getter-return": "error",
"no-async-promise-executor": "error",
"no-case-declarations": "error",
"no-class-assign": "error",
"no-compare-neg-zero": "error",
"no-cond-assign": "error",
"no-const-assign": "error",
"no-constant-binary-expression": "error",
"no-constant-condition": "error",
"no-control-regex": "error",
"no-debugger": "error",
"no-delete-var": "error",
"no-dupe-class-members": "error",
"no-dupe-else-if": "error",
"no-dupe-keys": "error",
"no-duplicate-case": "error",
"no-empty": "error",
"no-empty-character-class": "error",
"no-empty-pattern": "error",
"no-empty-static-block": "error",
"no-ex-assign": "error",
"no-extra-boolean-cast": "error",
"no-fallthrough": "error",
"no-func-assign": "error",
"no-global-assign": "error",
"no-import-assign": "error",
"no-invalid-regexp": "error",
"no-irregular-whitespace": "error",
"no-loss-of-precision": "error",
"no-misleading-character-class": "error",
"no-new-native-nonconstructor": "error",
"no-nonoctal-decimal-escape": "error",
"no-obj-calls": "error",
"no-prototype-builtins": "error",
"no-redeclare": "error",
"no-regex-spaces": "error",
"no-self-assign": "error",
"no-setter-return": "error",
"no-shadow-restricted-names": "error",
"no-sparse-arrays": "error",
"no-this-before-super": "error",
"no-unassigned-vars": "error",
"no-unexpected-multiline": "error",
"no-unreachable": "error",
"no-unsafe-finally": "error",
"no-unsafe-negation": "error",
"no-unsafe-optional-chaining": "error",
"no-unused-labels": "error",
"no-unused-private-class-members": "error",
"no-unused-vars": "error",
"no-useless-backreference": "error",
"no-useless-catch": "error",
"no-useless-escape": "error",
"no-with": "error",
"preserve-caught-error": "error",
"require-yield": "error",
"use-isnan": "error",
"valid-typeof": "error",
"no-array-constructor": "error",
"no-unused-expressions": "error",
"typescript/ban-ts-comment": "error",
"typescript/no-duplicate-enum-values": "error",
"typescript/no-empty-object-type": "error",
"typescript/no-explicit-any": "error",
"typescript/no-extra-non-null-assertion": "error",
"typescript/no-misused-new": "error",
"typescript/no-namespace": "error",
"typescript/no-non-null-asserted-optional-chain": "error",
"typescript/no-require-imports": "error",
"typescript/no-this-alias": "error",
"typescript/no-unnecessary-type-constraint": "error",
"typescript/no-unsafe-declaration-merging": "error",
"typescript/no-unsafe-function-type": "error",
"typescript/no-wrapper-object-types": "error",
"typescript/prefer-as-const": "error",
"typescript/prefer-namespace-keyword": "error",
"typescript/triple-slash-reference": "error",
"import/no-cycle": "error"
},
"overrides": [
{
"files": [
"**/*.ts",
"**/*.tsx",
"**/*.mts",
"**/*.cts"
],
"rules": {
"constructor-super": "off",
"getter-return": "off",
"no-class-assign": "off",
"no-const-assign": "off",
"no-dupe-class-members": "off",
"no-dupe-keys": "off",
"no-func-assign": "off",
"no-import-assign": "off",
"no-new-native-nonconstructor": "off",
"no-obj-calls": "off",
"no-redeclare": "off",
"no-setter-return": "off",
"no-this-before-super": "off",
"no-unreachable": "off",
"no-unsafe-negation": "off",
"no-var": "error",
"no-with": "off",
"prefer-const": "error",
"prefer-rest-params": "error",
"prefer-spread": "error"
}
},
{
"files": [
"**/*.ts"
],
"jsPlugins": [
"@stylistic/eslint-plugin",
{
"name": "jsdoc-js",
"specifier": "eslint-plugin-jsdoc"
},
"oxlint-plugin-eslint"
],
"rules": {
"@stylistic/comma-spacing": [
"warn",
{
"before": false,
"after": true
}
],
"@stylistic/indent": [
"warn",
2
],
"@stylistic/semi": [
"warn",
"always"
],
"@stylistic/quotes": [
"warn",
"single",
{
"allowTemplateLiterals": "always"
}
],
"@stylistic/member-delimiter-style": [
"warn",
{
"multiline": {
"delimiter": "semi",
"requireLast": true
},
"singleline": {
"delimiter": "comma",
"requireLast": false
}
}
],
"@stylistic/type-annotation-spacing": "warn",
"@stylistic/space-unary-ops": "warn",
"@stylistic/keyword-spacing": "warn",
"@stylistic/max-len": [
"warn",
{
"code": 1000,
"comments": 100,
"ignoreTrailingComments": true,
"ignoreUrls": true,
"ignorePattern": "^ *((?<vt_comment>(//|\\*) @vt)|(?<table_comment>\\* \\| )|(?<commented_code>// ))"
}
],
"@stylistic/new-parens": "warn",
"@stylistic/no-extra-semi": "error",
"@stylistic/no-trailing-spaces": "warn",
"eslint-js/object-curly-spacing": [
"warn",
"always"
],
"@stylistic/spaced-comment": [
"warn",
"always",
{
"markers": [
"/"
],
"exceptions": [
"-"
]
}
],
"jsdoc-js/check-alignment": "warn",
"jsdoc-js/check-param-names": "warn",
"jsdoc-js/multiline-blocks": "warn",
"jsdoc-js/no-multi-asterisks": "warn",
"eslint-js/one-var": [
"warn",
"never"
],
"eslint-js/no-restricted-syntax": [
"warn",
{
"selector": "CallExpression[callee.name='requestAnimationFrame']",
"message": "The global requestAnimationFrame() should be avoided, call it on the parent window from ICoreBrowserService."
},
{
"selector": "CallExpression[callee.name='cancelAnimationFrame']",
"message": "The global cancelAnimationFrame() should be avoided, call it on the parent window from ICoreBrowserService."
},
{
"selector": "CallExpression > MemberExpression[object.name='window'][property.name='requestAnimationFrame']",
"message": "window.requestAnimationFrame() should be avoided, call it on the parent window from ICoreBrowserService."
},
{
"selector": "CallExpression > MemberExpression[object.name='window'][property.name='cancelAnimationFrame']",
"message": "window.cancelAnimationFrame() should be avoided, call it on the parent window from ICoreBrowserService."
},
{
"selector": "MemberExpression[object.name='window'][property.name='devicePixelRatio']",
"message": "window.devicePixelRatio should be avoided, get it from ICoreBrowserService."
}
],
"curly": [
"warn",
"multi-line"
],
"eqeqeq": [
"warn",
"always"
],
"no-duplicate-imports": "warn",
"no-else-return": [
"warn",
{
"allowElseIf": false
}
],
"no-eval": "warn",
"no-irregular-whitespace": "warn",
"no-restricted-imports": [
"warn",
{
"patterns": [
".*\\/out\\/.*"
]
}
],
"no-unsafe-finally": "warn",
"no-unused-vars": "off",
"no-var": "warn",
"no-empty": "off",
"no-empty-pattern": "off",
"no-cond-assign": "off",
"no-case-declarations": "off",
"for-direction": "off",
"no-prototype-builtins": "off",
"no-useless-escape": "off",
"no-self-assign": "off",
"no-async-promise-executor": "off",
"prefer-rest-params": "off",
"no-control-regex": "off",
"no-fallthrough": "off",
"prefer-spread": "off",
"prefer-const": "warn",
"no-unused-expressions": "off",
"typescript/array-type": [
"warn",
{
"default": "array",
"readonly": "generic"
}
],
"typescript/consistent-type-assertions": "warn",
"typescript/consistent-type-definitions": "warn",
"typescript/explicit-function-return-type": [
"warn",
{
"allowExpressions": true
}
],
"typescript/explicit-member-accessibility": [
"warn",
{
"accessibility": "explicit",
"overrides": {
"constructors": "off"
}
}
],
"typescript/no-confusing-void-expression": [
"warn",
{
"ignoreArrowShorthand": true
}
],
"typescript/no-useless-constructor": "warn",
"typescript/prefer-nullish-coalescing": [
"warn",
{
"ignorePrimitives": true
}
],
"typescript/prefer-namespace-keyword": "warn",
"typescript/no-unused-vars": [
"warn",
{
"vars": "all",
"args": "none"
}
],
"typescript/no-require-imports": "off",
"typescript/no-explicit-any": "off",
"typescript/no-wrapper-object-types": "off",
"typescript/no-empty-object-type": "off",
"typescript/no-unsafe-function-type": "off",
"typescript/no-this-alias": "off",
"typescript/no-namespace": "off",
"typescript/no-duplicate-enum-values": "off"
}
},
{
"files": [
"**/*.api.ts",
"**/*.test.ts"
],
"rules": {
"eslint-js/object-curly-spacing": "off",
"@stylistic/max-len": "off",
"typescript/no-unused-vars": "off",
"typescript/explicit-function-return-type": "off",
"typescript/explicit-member-accessibility": "off"
}
},
{
"files": [
"demo/**/*.ts",
"**/*.benchmark.ts"
],
"rules": {
"typescript/prefer-nullish-coalescing": "off"
}
}
]
}
+120
View File
@@ -0,0 +1,120 @@
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"options": {
"maxWarnings": 0
},
"env": {
"builtin": true
},
"overrides": [
{
"files": [
"typings/**/*.d.ts"
],
"plugins": [
"typescript"
],
"jsPlugins": [
"@stylistic/eslint-plugin",
{
"name": "jsdoc-js",
"specifier": "eslint-plugin-jsdoc"
},
"oxlint-plugin-eslint"
],
"rules": {
"@stylistic/indent": [
"warn",
2
],
"@stylistic/semi": [
"warn",
"always"
],
"@stylistic/quotes": [
"warn",
"single",
{
"allowTemplateLiterals": "always"
}
],
"@stylistic/member-delimiter-style": [
"warn",
{
"multiline": {
"delimiter": "semi",
"requireLast": true
},
"singleline": {
"delimiter": "comma",
"requireLast": false
}
}
],
"@stylistic/type-annotation-spacing": "warn",
"@stylistic/keyword-spacing": "warn",
"@stylistic/max-len": [
"warn",
{
"code": 1000,
"comments": 80,
"ignoreUrls": true,
"ignorePattern": "^ *(?<ps_description>\\* Ps=)"
}
],
"@stylistic/no-extra-semi": "error",
"@stylistic/no-trailing-spaces": "warn",
"eslint-js/object-curly-spacing": [
"warn",
"always"
],
"@stylistic/spaced-comment": [
"warn",
"always",
{
"markers": [
"/"
],
"exceptions": [
"-"
]
}
],
"@stylistic/comma-dangle": [
"warn",
{
"objects": "never",
"arrays": "never",
"functions": "never"
}
],
"@stylistic/eol-last": "warn",
"curly": [
"warn",
"multi-line"
],
"eqeqeq": [
"warn",
"always"
],
"jsdoc-js/check-alignment": "warn",
"jsdoc-js/check-param-names": "warn",
"no-irregular-whitespace": "warn",
"typescript/array-type": [
"warn",
{
"default": "array",
"readonly": "generic"
}
],
"typescript/explicit-function-return-type": [
"warn",
{
"allowExpressions": true
}
],
"typescript/prefer-namespace-keyword": "warn"
}
}
]
}
-3
View File
@@ -15,9 +15,6 @@
"--recursive", "--recursive",
"${workspaceRoot}/out/**/*.test.js" "${workspaceRoot}/out/**/*.test.js"
], ],
"env": {
"NODE_PATH": "${workspaceRoot}/out"
},
"sourceMaps": true, "sourceMaps": true,
"outFiles": [ "${workspaceRoot}/out/**/*.js" ], "outFiles": [ "${workspaceRoot}/out/**/*.js" ],
"internalConsoleOptions": "openOnSessionStart" "internalConsoleOptions": "openOnSessionStart"
+1
View File
@@ -26,6 +26,7 @@ npm run build && npm run esbuild # Build all TypeScript and bundle
- Integration tests: `npm run test-integration` (Playwright across Chrome/Firefox/WebKit) - Integration tests: `npm run test-integration` (Playwright across Chrome/Firefox/WebKit)
- Integration tests by file: `npm run test-integration -- test/playwright/InputHandler.test.ts`. Never use grep to filter tests, it doesn't work - Integration tests by file: `npm run test-integration -- test/playwright/InputHandler.test.ts`. Never use grep to filter tests, it doesn't work
- Integration tests by addon: `npm run test-integration -- --suite=addon-search`. Suites always follow the format `addon-<something>` - Integration tests by addon: `npm run test-integration -- --suite=addon-search`. Suites always follow the format `addon-<something>`
- Lint: `npm run lint` (oxlint with type-aware rules, then ESLint for `naming-convention` only), `npm run lint-api` for `typings/`, `npm run lint-fix` for oxlint auto-fix
- Lint changes: `npm run lint-changes` to lint only changed files, `npm run lint-changes-fix` to fix them - Lint changes: `npm run lint-changes` to lint only changed files, `npm run lint-changes-fix` to fix them
## Addon Development Pattern ## Addon Development Pattern
+6 -6
View File
@@ -74,14 +74,14 @@ export class FitAddon implements ITerminalAddon, IFitApi {
: (this._terminal.options.scrollbar?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH)); : (this._terminal.options.scrollbar?.width ?? ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH));
const parentElementStyle = _getComputedStyle(this._terminal.element.parentElement); const parentElementStyle = _getComputedStyle(this._terminal.element.parentElement);
const parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height')); const parentElementHeight = Math.max(0, parseInt(parentElementStyle.getPropertyValue('height'), 10) || 0);
const parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width'))); const parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width'), 10) || 0);
const elementStyle = _getComputedStyle(this._terminal.element); const elementStyle = _getComputedStyle(this._terminal.element);
const elementPadding = { const elementPadding = {
top: parseInt(elementStyle.getPropertyValue('padding-top')), top: parseInt(elementStyle.getPropertyValue('padding-top'), 10) || 0,
bottom: parseInt(elementStyle.getPropertyValue('padding-bottom')), bottom: parseInt(elementStyle.getPropertyValue('padding-bottom'), 10) || 0,
right: parseInt(elementStyle.getPropertyValue('padding-right')), right: parseInt(elementStyle.getPropertyValue('padding-right'), 10) || 0,
left: parseInt(elementStyle.getPropertyValue('padding-left')) left: parseInt(elementStyle.getPropertyValue('padding-left'), 10) || 0
}; };
const elementPaddingVer = elementPadding.top + elementPadding.bottom; const elementPaddingVer = elementPadding.top + elementPadding.bottom;
const elementPaddingHor = elementPadding.right + elementPadding.left; const elementPaddingHor = elementPadding.right + elementPadding.left;
+3 -3
View File
@@ -222,8 +222,8 @@ export class IIPHandler implements IOscHandler, IResetHandler {
private _dim(s: string, total: number, cdim: number): number { private _dim(s: string, total: number, cdim: number): number {
if (s === 'auto') return 0; if (s === 'auto') return 0;
if (s.endsWith('%')) return parseInt(s.slice(0, -1)) * total / 100; if (s.endsWith('%')) return parseInt(s.slice(0, -1), 10) * total / 100;
if (s.endsWith('px')) return parseInt(s.slice(0, -2)); if (s.endsWith('px')) return parseInt(s.slice(0, -2), 10);
return parseInt(s) * cdim; return parseInt(s, 10) * cdim;
} }
} }
+1 -1
View File
@@ -3,7 +3,7 @@
* @license MIT * @license MIT
*/ */
import { IAddImageOpts } from 'Types'; import { IAddImageOpts } from './Types';
import { ImageStorage } from './ImageStorage'; import { ImageStorage } from './ImageStorage';
/** /**
+2 -1
View File
@@ -9,7 +9,8 @@ import { IDisposable, IMarker, Terminal } from '@xterm/xterm';
import { Attributes, BgFlags, Content, ExtFlags, UnderlineStyle } from 'common/buffer/Constants'; import { Attributes, BgFlags, Content, ExtFlags, UnderlineStyle } from 'common/buffer/Constants';
import type { AttributeData } from 'common/buffer/AttributeData'; import type { AttributeData } from 'common/buffer/AttributeData';
import type { IParams, IDcsHandler, IOscHandler, IApcHandler, IEscapeSequenceParser } from 'common/parser/Types'; import type { IParams, IDcsHandler, IOscHandler, IApcHandler, IEscapeSequenceParser } from 'common/parser/Types';
import type { IBufferLine, IExtendedAttrs, IInputHandler } from 'common/Types'; import type { IInputHandler } from 'common/Types';
import type { IBufferLine, IExtendedAttrs } from 'common/buffer/Types';
import type { ITerminal, ReadonlyColorSet } from 'browser/Types'; import type { ITerminal, ReadonlyColorSet } from 'browser/Types';
import type { IRenderDimensions } from 'browser/renderer/shared/Types'; import type { IRenderDimensions } from 'browser/renderer/shared/Types';
import type { ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services'; import type { ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';
@@ -168,7 +168,7 @@ export function parseKittyCommand(data: string): IKittyCommand {
cmd.deleteSelector = value; cmd.deleteSelector = value;
continue; continue;
} }
const numValue = parseInt(value); const numValue = parseInt(value, 10);
switch (key) { switch (key) {
case KittyKey.FORMAT: cmd.format = numValue; break; case KittyKey.FORMAT: cmd.format = numValue; break;
case KittyKey.ID: cmd.id = numValue; break; case KittyKey.ID: cmd.id = numValue; break;
+3 -3
View File
@@ -21,8 +21,8 @@
"package": "../../node_modules/.bin/webpack", "package": "../../node_modules/.bin/webpack",
"prepublishOnly": "npm run package", "prepublishOnly": "npm run package",
"start": "node ../../demo/start", "start": "node ../../demo/start",
"benchmark": "NODE_PATH=../../out:./out:./out-benchmark/ ../../node_modules/.bin/xterm-benchmark -r 5 -c benchmark/benchmark.json", "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-baseline": "../../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" "benchmark-eval": "../../node_modules/.bin/xterm-benchmark -r 5 -c benchmark/benchmark.json --eval out-benchmark/benchmark/*benchmark.js"
} }
} }
+2 -1
View File
@@ -7,7 +7,8 @@
import type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm'; import type { IBuffer, IBufferCell, IBufferRange, ITerminalAddon, Terminal } from '@xterm/xterm';
import type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize'; import type { IHTMLSerializeOptions, SerializeAddon as ISerializeApi, ISerializeOptions, ISerializeRange } from '@xterm/addon-serialize';
import { IAttributeData, IColor } from 'common/Types'; import { IColor } from 'common/Types';
import { IAttributeData } from 'common/buffer/Types';
import { DEFAULT_ANSI_COLORS } from 'browser/Types'; import { DEFAULT_ANSI_COLORS } from 'browser/Types';
import { UnderlineStyle } from 'common/buffer/Constants'; import { UnderlineStyle } from 'common/buffer/Constants';
+3 -3
View File
@@ -21,8 +21,8 @@
"package": "../../node_modules/.bin/webpack", "package": "../../node_modules/.bin/webpack",
"prepublishOnly": "npm run package", "prepublishOnly": "npm run package",
"start": "node ../../demo/start", "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": "../../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-baseline": "../../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" "benchmark-eval": "../../node_modules/.bin/xterm-benchmark -r 5 -c benchmark/benchmark.json --eval out-benchmark/benchmark/*benchmark.js"
} }
} }
+1 -1
View File
@@ -3,7 +3,7 @@ import { ICoreBrowserService, IThemeService } from 'browser/services/Services';
import { ReadonlyColorSet } from 'browser/Types'; import { ReadonlyColorSet } from 'browser/Types';
import { Attributes, BgFlags, ExtFlags, FgFlags, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants'; import { Attributes, BgFlags, ExtFlags, FgFlags, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants';
import { IDecorationService, IOptionsService } from 'common/services/Services'; import { IDecorationService, IOptionsService } from 'common/services/Services';
import { ICellData } from 'common/Types'; import { ICellData } from 'common/buffer/Types';
import { Terminal } from '@xterm/xterm'; import { Terminal } from '@xterm/xterm';
import { rgba } from 'common/Color'; import { rgba } from 'common/Color';
import { treatGlyphAsBackgroundColor } from 'browser/renderer/shared/RendererUtils'; import { treatGlyphAsBackgroundColor } from 'browser/renderer/shared/RendererUtils';
+1 -1
View File
@@ -10,7 +10,7 @@ import { CursorBlinkStateManager } from './CursorBlinkStateManager';
import { observeDevicePixelDimensions } from './DevicePixelObserver'; import { observeDevicePixelDimensions } from './DevicePixelObserver';
import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types'; import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types';
import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';
import { CharData, IBufferLine, ICellData } from 'common/Types'; import { CharData, IBufferLine, ICellData } from 'common/buffer/Types';
import { AttributeData } from 'common/buffer/AttributeData'; import { AttributeData } from 'common/buffer/AttributeData';
import { CellData } from 'common/buffer/CellData'; import { CellData } from 'common/buffer/CellData';
import { Attributes, Content, FgFlags, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants'; import { Attributes, Content, FgFlags, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';
@@ -5,7 +5,7 @@
import { CustomGlyphDefinitionType, CustomGlyphScaleType, CustomGlyphVectorType, type CustomGlyphCharacterDefinition, type CustomGlyphDefinitionPart, type CustomGlyphPathDrawFunctionDefinition } from './Types'; import { CustomGlyphDefinitionType, CustomGlyphScaleType, CustomGlyphVectorType, type CustomGlyphCharacterDefinition, type CustomGlyphDefinitionPart, type CustomGlyphPathDrawFunctionDefinition } from './Types';
/* eslint-disable max-len */ /* oxlint-disable @stylistic/max-len -- generated glyph path data */
const enum Shapes { const enum Shapes {
/** │ */ TOP_TO_BOTTOM = 'M.5,0 L.5,1', /** │ */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',
@@ -221,8 +221,8 @@ function drawPathDefinitionCharacter(
const rx = parseFloat(args[0]) * deviceCellWidth; const rx = parseFloat(args[0]) * deviceCellWidth;
const ry = parseFloat(args[1]) * deviceCellHeight; const ry = parseFloat(args[1]) * deviceCellHeight;
const xAxisRotation = parseFloat(args[2]) * Math.PI / 180; const xAxisRotation = parseFloat(args[2]) * Math.PI / 180;
const largeArcFlag = parseInt(args[3]); const largeArcFlag = parseInt(args[3], 10);
const sweepFlag = parseInt(args[4]); const sweepFlag = parseInt(args[4], 10);
const x = xOffset + parseFloat(args[5]) * deviceCellWidth; const x = xOffset + parseFloat(args[5]) * deviceCellWidth;
const y = yOffset + parseFloat(args[6]) * deviceCellHeight; const y = yOffset + parseFloat(args[6]) * deviceCellHeight;
drawSvgArc(ctx, currentX, currentY, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y); drawSvgArc(ctx, currentX, currentY, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y);
+41 -11
View File
@@ -33,17 +33,47 @@ if (files.length === 0) {
console.log(`Linting ${files.length} changed file(s)...`); console.log(`Linting ${files.length} changed file(s)...`);
const eslintArgs = ['--max-warnings', '0', '--no-warn-ignored']; const cwd = path.join(__dirname, '..');
if (fix) { const isWin = process.platform === 'win32';
eslintArgs.push('--fix');
/**
* @param {string} command
* @param {string[]} args
* @returns {Promise<void>}
*/
function run(command, args) {
return new Promise(/** @type {(resolve: () => void, reject: (reason: Error) => void) => void} */ ((resolve, reject) => {
const child = spawn(command, args, {
stdio: 'inherit',
cwd,
shell: isWin
});
child.on('close', code => {
if (code === 0) {
resolve();
} else {
reject(new Error(`${command} exited with code ${code}`));
}
});
}));
} }
eslintArgs.push(...files);
const eslint = process.platform === 'win32' ? 'eslint.cmd' : 'eslint'; async function main() {
const child = spawn(eslint, eslintArgs, { const oxlintArgs = ['--type-aware', '--max-warnings', '0'];
stdio: 'inherit', if (fix) {
cwd: path.join(__dirname, '..'), oxlintArgs.push('--fix');
shell: process.platform === 'win32' }
oxlintArgs.push(...files);
const oxlint = isWin ? 'oxlint.cmd' : 'oxlint';
await run(oxlint, oxlintArgs);
const eslintArgs = ['--config', 'eslint.config.naming.mjs', '--max-warnings', '0', ...files];
const eslint = isWin ? 'eslint.cmd' : 'eslint';
await run(eslint, eslintArgs);
}
main().catch(err => {
console.error(err.message);
process.exit(1);
}); });
child.on('close', code => process.exit(code ?? 0));
+1 -1
View File
@@ -8,7 +8,7 @@ const path = require('path');
const COVERAGE_LINES_THRESHOLD = 40; const COVERAGE_LINES_THRESHOLD = 40;
// Add `out` to the NODE_PATH so absolute paths can be resolved. // Add `out-esbuild` to NODE_PATH so addon path-mapped imports (common/*, browser/*) resolve.
const env = { ...process.env }; const env = { ...process.env };
env.NODE_PATH = path.resolve(__dirname, '../out-esbuild'); env.NODE_PATH = path.resolve(__dirname, '../out-esbuild');
+1 -1
View File
@@ -43,7 +43,7 @@ export class GpuWindow extends BaseWindow implements IControlWindow {
} }
private _styleAtlasPage(canvas: HTMLCanvasElement): void { private _styleAtlasPage(canvas: HTMLCanvasElement): void {
// eslint-disable-next-line no-restricted-syntax // oxlint-disable-next-line eslint-js/no-restricted-syntax
const dpr = window.devicePixelRatio; const dpr = window.devicePixelRatio;
canvas.style.width = `${canvas.width / dpr}px`; canvas.style.width = `${canvas.width / dpr}px`;
canvas.style.height = `${canvas.height / dpr}px`; canvas.style.height = `${canvas.height / dpr}px`;
+1 -1
View File
@@ -43,7 +43,7 @@ export class WebglWindow extends BaseWindow implements IControlWindow {
} }
private _styleAtlasPage(canvas: HTMLCanvasElement): void { private _styleAtlasPage(canvas: HTMLCanvasElement): void {
// eslint-disable-next-line no-restricted-syntax // oxlint-disable-next-line eslint-js/no-restricted-syntax
const dpr = window.devicePixelRatio; const dpr = window.devicePixelRatio;
canvas.style.width = `${canvas.width / dpr}px`; canvas.style.width = `${canvas.width / dpr}px`;
canvas.style.height = `${canvas.height / dpr}px`; canvas.style.height = `${canvas.height / dpr}px`;
+42 -14
View File
@@ -2,26 +2,54 @@
"compilerOptions": { "compilerOptions": {
"module": "commonjs", "module": "commonjs",
"target": "es2021", "target": "es2021",
"types": ["node"], "types": [
"node"
],
"outDir": "../out-demo/client", "outDir": "../out-demo/client",
"rootDir": ".", "rootDir": ".",
"sourceMap": true, "sourceMap": true,
"strict": true, "strict": true,
"skipLibCheck": true, "skipLibCheck": true,
"paths": { "paths": {
"@xterm/addon-attach": ["../../addons/addon-attach"], "@xterm/addon-attach": [
"@xterm/addon-clipboard": ["../../addons/addon-clipboard"], "../../addons/addon-attach"
"@xterm/addon-fit": ["../../addons/addon-fit"], ],
"@xterm/addon-image": ["../../addons/addon-image"], "@xterm/addon-clipboard": [
"@xterm/addon-progress": ["../../addons/addon-progress"], "../../addons/addon-clipboard"
"@xterm/addon-search": ["../../addons/addon-search"], ],
"@xterm/addon-serialize": ["../../addons/addon-serialize"], "@xterm/addon-fit": [
"@xterm/addon-web-fonts": ["../../addons/addon-web-fonts"], "../../addons/addon-fit"
"@xterm/addon-web-links": ["../../addons/addon-web-links"], ],
"@xterm/addon-webgl": ["../../addons/addon-webgl"], "@xterm/addon-image": [
"@xterm/addon-unicode11": ["../../addons/addon-unicode11"], "../../addons/addon-image"
"@xterm/addon-unicode-graphemes": ["../../addons/addon-unicode-graphemes"], ],
"@xterm/addon-ligatures": ["../../addons/addon-ligatures"], "@xterm/addon-progress": [
"../../addons/addon-progress"
],
"@xterm/addon-search": [
"../../addons/addon-search"
],
"@xterm/addon-serialize": [
"../../addons/addon-serialize"
],
"@xterm/addon-web-fonts": [
"../../addons/addon-web-fonts"
],
"@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"
],
"*": ["./*"] "*": ["./*"]
} }
}, },
+71
View File
@@ -0,0 +1,71 @@
// @ts-check
import tseslint from 'typescript-eslint';
const ignores = [
'addons/*/src/third-party/*.ts',
'**/out/*',
'**/out-test/*',
'**/out-esbuild/*',
'**/out-esbuild-test/*',
'**/inwasm-sdks/*',
'**/node_modules',
'**/*.js',
'**/*.mjs'
];
const namingConventionMain = [
'warn',
{ selector: 'default', format: ['camelCase'], filter: { regex: '^[a-z]', match: true } },
{ selector: 'variable', format: ['camelCase', 'UPPER_CASE'] },
{ selector: 'variable', filter: '^I.+Service$', format: ['PascalCase'], prefix: ['I'] },
{ selector: 'memberLike', modifiers: ['private'], format: ['camelCase'], leadingUnderscore: 'require' },
{ selector: 'memberLike', modifiers: ['protected'], format: ['camelCase'], leadingUnderscore: 'require' },
{ selector: 'enumMember', format: ['UPPER_CASE'] },
{ selector: 'property', modifiers: ['public'], format: ['camelCase', 'UPPER_CASE'], filter: { regex: '^[a-z]', match: true } },
{ selector: 'method', modifiers: ['public'], format: ['camelCase', 'UPPER_CASE'], custom: { regex: '^on[A-Z].+', match: false } },
{ selector: 'method', modifiers: ['private'], format: ['camelCase'], leadingUnderscore: 'require', custom: { regex: '^on[A-Z].+', match: false } },
{ selector: 'method', modifiers: ['protected'], format: ['camelCase'], leadingUnderscore: 'require', custom: { regex: '^on[A-Z].+', match: false } },
{ selector: 'typeLike', format: ['PascalCase'] },
{ selector: 'interface', format: ['PascalCase'], prefix: ['I'] }
];
const namingConventionTypings = [
'warn',
{ selector: 'typeLike', format: ['PascalCase'] },
{ selector: 'interface', format: ['PascalCase'], prefix: ['I'] }
];
export default tseslint.config(
{
ignores
},
{
files: ['**/*.ts'],
ignores: ['typings/**/*.d.ts', 'addons/**/typings/**'],
plugins: {
'@typescript-eslint': tseslint.plugin
},
languageOptions: {
parser: tseslint.parser,
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname
}
},
rules: {
'@typescript-eslint/naming-convention': namingConventionMain
}
},
{
files: ['typings/**/*.d.ts'],
plugins: {
'@typescript-eslint': tseslint.plugin
},
languageOptions: {
parser: tseslint.parser
},
rules: {
'@typescript-eslint/naming-convention': namingConventionTypings
}
}
);
+511
View File
@@ -32,6 +32,7 @@
"esbuild": "^0.28.0", "esbuild": "^0.28.0",
"eslint": "^10.3.0", "eslint": "^10.3.0",
"eslint-plugin-jsdoc": "^62.9.0", "eslint-plugin-jsdoc": "^62.9.0",
"eslint-plugin-oxlint": "^1.67.0",
"express": "^5.2.1", "express": "^5.2.1",
"express-ws": "^5.0.2", "express-ws": "^5.0.2",
"jsdom": "^29.1.1", "jsdom": "^29.1.1",
@@ -39,6 +40,9 @@
"mustache": "^4.2.0", "mustache": "^4.2.0",
"node-pty": "^1.2.0-beta.9", "node-pty": "^1.2.0-beta.9",
"nyc": "^18.0.0", "nyc": "^18.0.0",
"oxlint": "^1.67.0",
"oxlint-plugin-eslint": "^1.67.0",
"oxlint-tsgolint": "^0.23.0",
"source-map-loader": "^5.0.0", "source-map-loader": "^5.0.0",
"source-map-support": "^0.5.20", "source-map-support": "^0.5.20",
"ts-loader": "^9.5.7", "ts-loader": "^9.5.7",
@@ -1508,6 +1512,413 @@
"pako": "^2.0.4" "pako": "^2.0.4"
} }
}, },
"node_modules/@oxlint-tsgolint/darwin-arm64": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-0.23.0.tgz",
"integrity": "sha512-gOs9PVr2wEg4ox9z0aJo+RKhhImW86YL5N6yav8BK/rgPsIrwN/igSZ+pbRr723NFvUNKde9fgMhRA6JrXAOZw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@oxlint-tsgolint/darwin-x64": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-0.23.0.tgz",
"integrity": "sha512-kjJ8B+7n4tB9VJdxS5A9GdJt6/bYpzbu4lXp2uO1S3sRmCB5gDEABlGoiePNApRWaW+xqL4b4xgiE727jSLhuA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@oxlint-tsgolint/linux-arm64": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-0.23.0.tgz",
"integrity": "sha512-6dCZuKNu135seMXilkRk9SpCx6i1XgmiipYGalLij5WVRX6ZYS8c4xI7preN/zv9fCXhsQclTIMDu2Y/cytTjw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@oxlint-tsgolint/linux-x64": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-0.23.0.tgz",
"integrity": "sha512-3bdilnyA7kmSTjK27rvjIjSxL5SIg3wt7vwNiRkouWB83ytssyKnuGvxSYJxgMEmFpSutzaBzcCUM2jDtPGcgA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@oxlint-tsgolint/win32-arm64": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-0.23.0.tgz",
"integrity": "sha512-j+OEp44SVYiQ+ZD+uttsX7u6L9SvmbbQ77SO1pSFCcJlsVMeCk8qZsjhKfGKuT/jIA+ipOJMVs/+pqUfObBWNw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@oxlint-tsgolint/win32-x64": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-0.23.0.tgz",
"integrity": "sha512-5MyjFuqf+g8OUPJBSGWHJtmoWnzFJYyOg4To9WMQshZYEWig/vtu7JtJ03VWnzHv9LJkAUeApY0gVCOywFR/iQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@oxlint/binding-android-arm-eabi": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.67.0.tgz",
"integrity": "sha512-VrSi571rDv1N8HaEDM+DEX8nmT0y9jJo8tzzW13vsOWTx59xQczCIJx68n2zWOXRT5YKZsOZXp4qkHN/10x4mw==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-android-arm64": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.67.0.tgz",
"integrity": "sha512-l6+NdYxMoRohix5r5bbigW16LPicceCwGcQ6LKKuE1kUdjgFfQolJjrJsQYPFetIs78Gxj/G/f5TEGoTCwj9nQ==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"android"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-darwin-arm64": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.67.0.tgz",
"integrity": "sha512-jOzXxS1AxFxhImLIRbtGIMrEwaXcgMw3gR57WB1cRk8ai+vpr6726kxXqVvlNsrXtJ/FrmOm8RxlC0m8SW24Qg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-darwin-x64": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.67.0.tgz",
"integrity": "sha512-3DFAVY94OqjIZHXIPz37yGRSWwOFTAqChQ64/M69GYLawzP0KiwdhDNfqdKKYT0bTR/DNxmMnQsj3ns+8+X/Lg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-freebsd-x64": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.67.0.tgz",
"integrity": "sha512-e4dDKZuLu8TR9DEBssWSDahlPgZBwojTTHZUvnjBRJfJJbpxYCjfjKfi0Z1+CSLMiJBwI2yCDtRM1XJQaARjmg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-linux-arm-gnueabihf": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.67.0.tgz",
"integrity": "sha512-BKytFdcQzbITV3xlnzDUDTEDtbUMCCiC4EaNTDZ4FyT8gdNvBC4gfiLucXp/sQl0XU3p7syTlorUWVVVBZab2g==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-linux-arm-musleabihf": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.67.0.tgz",
"integrity": "sha512-XYAv0esBDX7BpTzRDjVX2Vdj+zndd8ll2dFQiaeQ6zTZr7A8GRDTN7fH3FP3jU+O0vCDx85oH/EtG7BzPgAXuw==",
"cpu": [
"arm"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-linux-arm64-gnu": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.67.0.tgz",
"integrity": "sha512-zizRMjA0i6u/2B0evgda04iycu+MoNuf1pBy6Eh+1CjC5wMEG7qN5zdDKTCvFc0KSYSDM9QTG3gjZHirgtQuKg==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-linux-arm64-musl": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.67.0.tgz",
"integrity": "sha512-zB/Tf6sUjmmvvbva9Gj3JTJ8rJ9t4I8/U0o6vSRtd0DRIsIuyegBwJAzhSUFQHdMijIRJkW0exs/yBhpw2S20w==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-linux-ppc64-gnu": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.67.0.tgz",
"integrity": "sha512-kgU40Gt74CK0TCsF51KZymkIwN9U0BajKsMijB52zPqOeZU9NAHkA/NSQkZDHEaCakx42DxhXkODiAqf2b4Gug==",
"cpu": [
"ppc64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-linux-riscv64-gnu": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.67.0.tgz",
"integrity": "sha512-tOYhkk/iaG9aD3FvGpBFd1Lrw0x0RaVoJBxjUkfNzS50rC5NS5BteNCwgr8A2zCdADrIIoze6D7u6U5Ic++/iQ==",
"cpu": [
"riscv64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-linux-riscv64-musl": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.67.0.tgz",
"integrity": "sha512-sEtywrPb+0b+tHYl1SDCrw903fiC4eyKoNqzP3v+f2JT3Xcv4NEYG+P8rj+eEnX7IWhqV/xj8/JmcmVj21CXaA==",
"cpu": [
"riscv64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-linux-s390x-gnu": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.67.0.tgz",
"integrity": "sha512-BvR8Moa0zCLxroOx4vZaZN9nUfwAUpSTwjZdxZyKy4bv3PrzrXrxKR/ZQ0L9wNSvlPhnMJeZfa3q5w6ZCTuN6Q==",
"cpu": [
"s390x"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-linux-x64-gnu": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.67.0.tgz",
"integrity": "sha512-mm2cxM6fksOpq6l0uFws8BUGKAR4dNa/cZCn37Npq7PFbhD5HDJqWfnoIvTaeRKMy5XdS2tO0MA0qbHDrnXAAA==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-linux-x64-musl": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.67.0.tgz",
"integrity": "sha512-WmbMuLapKyDlobMkXAaAL0Y+Uczh4LETfIfQsUpbId4Ip8Ai82/jqeYTOoUCkuuhBFapgqP253+d83tLKOksJg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-openharmony-arm64": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.67.0.tgz",
"integrity": "sha512-9g/PqxYJelzzTAOR5Y+RiRqdeydhEuXv2KxNeFcAKQ7UsvnWSY1OP4MsuPMbTO2Pf70tz7mFhl1j13H3fyh+8g==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openharmony"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-win32-arm64-msvc": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.67.0.tgz",
"integrity": "sha512-2VhwE6Gatb0vJGnN0TBuQMbKCOiZlSQ/zJvVWYLK4a9d4iDiJOen/yVQkGpmsJ90MuH66fzi0kEKI0jRQMDxGA==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-win32-ia32-msvc": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.67.0.tgz",
"integrity": "sha512-EQ3VExXfeM1InbE5+JjufhZZTWy+kHUwgt3yZR7gQ47Je/mE0WspQPan0OJznh493L5anM210YNJtH1PXjTSFg==",
"cpu": [
"ia32"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@oxlint/binding-win32-x64-msvc": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.67.0.tgz",
"integrity": "sha512-bw24y+/1MHS4QDkons3YyHkPT9uCMoLHHgQhb+mb8NOjTYwub1CZ+K9Ngr8aO5DMrDrkqHwTzlTwFP2vS8Y/ZQ==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
},
"node_modules/@pkgjs/parseargs": { "node_modules/@pkgjs/parseargs": {
"version": "0.11.0", "version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -3652,6 +4063,19 @@
"url": "https://opencollective.com/eslint" "url": "https://opencollective.com/eslint"
} }
}, },
"node_modules/eslint-plugin-oxlint": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-oxlint/-/eslint-plugin-oxlint-1.67.0.tgz",
"integrity": "sha512-tS/RGy8x2+rIUp7gV8ICgEeSAgFH6Qg7phzCbUblW/dPUsqXkcedrzO0nOaKhce4fvUVDR9uTmWlLkCNSDKcsw==",
"dev": true,
"license": "MIT",
"dependencies": {
"jsonc-parser": "^3.3.1"
},
"peerDependencies": {
"oxlint": "~1.67.0"
}
},
"node_modules/eslint-scope": { "node_modules/eslint-scope": {
"version": "9.1.2", "version": "9.1.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
@@ -5045,6 +5469,13 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/jsonc-parser": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
"integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
"dev": true,
"license": "MIT"
},
"node_modules/keyv": { "node_modules/keyv": {
"version": "4.5.4", "version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -5797,6 +6228,86 @@
"node": ">= 0.8.0" "node": ">= 0.8.0"
} }
}, },
"node_modules/oxlint": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.67.0.tgz",
"integrity": "sha512-blwwaHPdoH8piQ5/z0KHeoHFR7FZgl12WluKJfu4qFLPkZl6mK04PkLE45Fw1NxfBRSlh40Gu7MkxHUw++ociQ==",
"dev": true,
"license": "MIT",
"bin": {
"oxlint": "bin/oxlint"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/sponsors/Boshen"
},
"optionalDependencies": {
"@oxlint/binding-android-arm-eabi": "1.67.0",
"@oxlint/binding-android-arm64": "1.67.0",
"@oxlint/binding-darwin-arm64": "1.67.0",
"@oxlint/binding-darwin-x64": "1.67.0",
"@oxlint/binding-freebsd-x64": "1.67.0",
"@oxlint/binding-linux-arm-gnueabihf": "1.67.0",
"@oxlint/binding-linux-arm-musleabihf": "1.67.0",
"@oxlint/binding-linux-arm64-gnu": "1.67.0",
"@oxlint/binding-linux-arm64-musl": "1.67.0",
"@oxlint/binding-linux-ppc64-gnu": "1.67.0",
"@oxlint/binding-linux-riscv64-gnu": "1.67.0",
"@oxlint/binding-linux-riscv64-musl": "1.67.0",
"@oxlint/binding-linux-s390x-gnu": "1.67.0",
"@oxlint/binding-linux-x64-gnu": "1.67.0",
"@oxlint/binding-linux-x64-musl": "1.67.0",
"@oxlint/binding-openharmony-arm64": "1.67.0",
"@oxlint/binding-win32-arm64-msvc": "1.67.0",
"@oxlint/binding-win32-ia32-msvc": "1.67.0",
"@oxlint/binding-win32-x64-msvc": "1.67.0"
},
"peerDependencies": {
"oxlint-tsgolint": ">=0.22.1",
"vite-plus": "*"
},
"peerDependenciesMeta": {
"oxlint-tsgolint": {
"optional": true
},
"vite-plus": {
"optional": true
}
}
},
"node_modules/oxlint-plugin-eslint": {
"version": "1.67.0",
"resolved": "https://registry.npmjs.org/oxlint-plugin-eslint/-/oxlint-plugin-eslint-1.67.0.tgz",
"integrity": "sha512-MfpO9t/l/1qWVKym4sTkz0bhErAkUn/cOOQsFegI5ngQkR1cZEp6G23FKIhGcALoYytPBRmu47yjiEa6XWFBRw==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^20.19.0 || >=22.12.0"
},
"funding": {
"url": "https://github.com/sponsors/Boshen"
}
},
"node_modules/oxlint-tsgolint": {
"version": "0.23.0",
"resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-0.23.0.tgz",
"integrity": "sha512-3mBv3CoPbh8dFbzfDGIWa2ytZjn2v+3EX4aKRXjIhsoGFzG8GCjfRirz3rwZf1wYbZzsNLTSgpw8VjQuWdp/jA==",
"dev": true,
"license": "MIT",
"bin": {
"tsgolint": "bin/tsgolint.js"
},
"optionalDependencies": {
"@oxlint-tsgolint/darwin-arm64": "0.23.0",
"@oxlint-tsgolint/darwin-x64": "0.23.0",
"@oxlint-tsgolint/linux-arm64": "0.23.0",
"@oxlint-tsgolint/linux-x64": "0.23.0",
"@oxlint-tsgolint/win32-arm64": "0.23.0",
"@oxlint-tsgolint/win32-x64": "0.23.0"
}
},
"node_modules/p-limit": { "node_modules/p-limit": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+10 -6
View File
@@ -48,11 +48,11 @@
"esbuild-demo-server-watch": "node bin/esbuild.mjs --demo-server --watch", "esbuild-demo-server-watch": "node bin/esbuild.mjs --demo-server --watch",
"test": "npm run test-unit", "test": "npm run test-unit",
"posttest": "npm run lint", "posttest": "npm run lint",
"lint": "eslint --max-warnings 0 src/ addons/ demo/ test/", "lint": "oxlint --type-aware --max-warnings 0 src addons demo test && eslint --config eslint.config.naming.mjs --max-warnings 0 src addons demo test",
"lint-changes": "node ./bin/lint_changes.js", "lint-changes": "node ./bin/lint_changes.js",
"lint-changes-fix": "node ./bin/lint_changes.js --fix", "lint-changes-fix": "node ./bin/lint_changes.js --fix",
"lint-fix": "eslint --fix src/ addons/ demo/ test/", "lint-fix": "oxlint --type-aware --fix --max-warnings 0 src addons demo test",
"lint-api": "eslint --config eslint.config.typings.mjs --max-warnings 0 typings/", "lint-api": "oxlint --max-warnings 0 -c .oxlintrc.typings.json typings && eslint --config eslint.config.naming.mjs --max-warnings 0 typings",
"test-unit": "node ./bin/test_unit.js", "test-unit": "node ./bin/test_unit.js",
"test-unit-slow-tests": "npm run test-unit | grep \"ms)\"", "test-unit-slow-tests": "npm run test-unit | grep \"ms)\"",
"test-unit-coverage": "node ./bin/test_unit.js --coverage", "test-unit-coverage": "node ./bin/test_unit.js --coverage",
@@ -61,9 +61,9 @@
"test-integration-firefox": "node ./bin/test_integration.js --workers=75% \"--project=FirefoxStable\"", "test-integration-firefox": "node ./bin/test_integration.js --workers=75% \"--project=FirefoxStable\"",
"test-integration-webkit": "node ./bin/test_integration.js --workers=75% \"--project=WebKit\"", "test-integration-webkit": "node ./bin/test_integration.js --workers=75% \"--project=WebKit\"",
"test-integration-debug": "node ./bin/test_integration.js --workers=1 --headed --timeout=30000", "test-integration-debug": "node ./bin/test_integration.js --workers=1 --headed --timeout=30000",
"benchmark": "NODE_PATH=./out xterm-benchmark -r 5 -c test/benchmark/benchmark.json", "benchmark": "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/*benchmark.js", "benchmark-baseline": "xterm-benchmark -r 5 -c test/benchmark/benchmark.json --baseline out-test/benchmark/*benchmark.js",
"benchmark-eval": "NODE_PATH=./out xterm-benchmark -r 5 -c test/benchmark/benchmark.json --eval out-test/benchmark/*benchmark.js", "benchmark-eval": "xterm-benchmark -r 5 -c test/benchmark/benchmark.json --eval out-test/benchmark/*benchmark.js",
"clean": "rm -rf lib out addons/*/lib addons/*/out", "clean": "rm -rf lib out addons/*/lib addons/*/out",
"vtfeatures": "node bin/extract_vtfeatures.js src/*/*.ts src/*/*/*.ts src/*.ts addons/**/src/*.ts", "vtfeatures": "node bin/extract_vtfeatures.js src/*/*.ts src/*/*/*.ts src/*.ts addons/**/src/*.ts",
"prepackage": "npm run build", "prepackage": "npm run build",
@@ -95,6 +95,7 @@
"esbuild": "^0.28.0", "esbuild": "^0.28.0",
"eslint": "^10.3.0", "eslint": "^10.3.0",
"eslint-plugin-jsdoc": "^62.9.0", "eslint-plugin-jsdoc": "^62.9.0",
"eslint-plugin-oxlint": "^1.67.0",
"express": "^5.2.1", "express": "^5.2.1",
"express-ws": "^5.0.2", "express-ws": "^5.0.2",
"jsdom": "^29.1.1", "jsdom": "^29.1.1",
@@ -102,6 +103,9 @@
"mustache": "^4.2.0", "mustache": "^4.2.0",
"node-pty": "^1.2.0-beta.9", "node-pty": "^1.2.0-beta.9",
"nyc": "^18.0.0", "nyc": "^18.0.0",
"oxlint": "^1.67.0",
"oxlint-plugin-eslint": "^1.67.0",
"oxlint-tsgolint": "^0.23.0",
"source-map-loader": "^5.0.0", "source-map-loader": "^5.0.0",
"source-map-support": "^0.5.20", "source-map-support": "^0.5.20",
"ts-loader": "^9.5.7", "ts-loader": "^9.5.7",
+8 -8
View File
@@ -3,14 +3,14 @@
* @license MIT * @license MIT
*/ */
import * as Strings from 'browser/LocalizableStrings'; import * as Strings from './LocalizableStrings';
import { ITerminal, IRenderDebouncer } from 'browser/Types'; import { ITerminal, IRenderDebouncer } from './Types';
import { TimeBasedDebouncer } from 'browser/TimeBasedDebouncer'; import { TimeBasedDebouncer } from './TimeBasedDebouncer';
import { Disposable, toDisposable } from 'common/Lifecycle'; import { Disposable, toDisposable } from '../common/Lifecycle';
import { ICoreBrowserService, IRenderService } from 'browser/services/Services'; import { ICoreBrowserService, IRenderService } from './services/Services';
import { IBuffer } from 'common/buffer/Types'; import { IBuffer } from '../common/buffer/Types';
import { IInstantiationService } from 'common/services/Services'; import { IInstantiationService } from '../common/services/Services';
import { addDisposableListener } from 'browser/Dom'; import { addDisposableListener } from './Dom';
const enum Constants { const enum Constants {
MAX_ROWS_TO_READ = 20 MAX_ROWS_TO_READ = 20
+1 -1
View File
@@ -4,7 +4,7 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import * as Clipboard from 'browser/Clipboard'; import * as Clipboard from './Clipboard';
describe('evaluatePastedTextProcessing', () => { describe('evaluatePastedTextProcessing', () => {
it('should replace carriage return and/or line feed with carriage return', () => { it('should replace carriage return and/or line feed with carriage return', () => {
+2 -2
View File
@@ -3,8 +3,8 @@
* @license MIT * @license MIT
*/ */
import { ISelectionService } from 'browser/services/Services'; import { ISelectionService } from './services/Services';
import { ICoreService, IOptionsService } from 'common/services/Services'; import { ICoreService, IOptionsService } from '../common/services/Services';
/** /**
* Prepares text to be pasted into the terminal by normalizing the line endings * Prepares text to be pasted into the terminal by normalizing the line endings
+1 -1
View File
@@ -4,7 +4,7 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { ColorContrastCache } from 'browser/ColorContrastCache'; import { ColorContrastCache } from './ColorContrastCache';
describe('ColorContrastCache', () => { describe('ColorContrastCache', () => {
let cache: ColorContrastCache; let cache: ColorContrastCache;
+3 -3
View File
@@ -3,9 +3,9 @@
* @license MIT * @license MIT
*/ */
import { IColorContrastCache } from 'browser/Types'; import { IColorContrastCache } from './Types';
import { IColor } from 'common/Types'; import { IColor } from '../common/Types';
import { TwoKeyMap } from 'common/MultiKeyMap'; import { TwoKeyMap } from '../common/MultiKeyMap';
export class ColorContrastCache implements IColorContrastCache { export class ColorContrastCache implements IColorContrastCache {
private _color: TwoKeyMap</* bg */number, /* fg */number, IColor | null> = new TwoKeyMap(); private _color: TwoKeyMap</* bg */number, /* fg */number, IColor | null> = new TwoKeyMap();
+34 -34
View File
@@ -22,43 +22,43 @@
*/ */
import { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm'; import { IDecoration, IDecorationOptions, IDisposable, ILinkProvider, IMarker, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm';
import { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from 'browser/Clipboard'; import { copyHandler, handlePasteEvent, moveTextAreaUnderMouseCursor, paste, rightClickHandler } from './Clipboard';
import * as Strings from 'browser/LocalizableStrings'; import * as Strings from './LocalizableStrings';
import { OscLinkProvider } from 'browser/OscLinkProvider'; import { OscLinkProvider } from './OscLinkProvider';
import { CharacterJoinerHandler, CustomKeyEventHandler, CustomWheelEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal } from 'browser/Types'; import { CharacterJoinerHandler, CustomKeyEventHandler, CustomWheelEventHandler, IBrowser, IBufferRange, ICompositionHelper, ILinkifier2, ITerminal } from './Types';
import { Viewport } from 'browser/Viewport'; import { Viewport } from './Viewport';
import { BufferDecorationRenderer } from 'browser/decorations/BufferDecorationRenderer'; import { BufferDecorationRenderer } from './decorations/BufferDecorationRenderer';
import { OverviewRulerRenderer } from 'browser/decorations/OverviewRulerRenderer'; import { OverviewRulerRenderer } from './decorations/OverviewRulerRenderer';
import { CompositionHelper } from 'browser/input/CompositionHelper'; import { CompositionHelper } from './input/CompositionHelper';
import { DomRenderer } from 'browser/renderer/dom/DomRenderer'; import { DomRenderer } from './renderer/dom/DomRenderer';
import { IRenderer } from 'browser/renderer/shared/Types'; import { IRenderer } from './renderer/shared/Types';
import { CharSizeService } from 'browser/services/CharSizeService'; import { CharSizeService } from './services/CharSizeService';
import { CharacterJoinerService } from 'browser/services/CharacterJoinerService'; import { CharacterJoinerService } from './services/CharacterJoinerService';
import { CoreBrowserService } from 'browser/services/CoreBrowserService'; import { CoreBrowserService } from './services/CoreBrowserService';
import { LinkProviderService } from 'browser/services/LinkProviderService'; import { LinkProviderService } from './services/LinkProviderService';
import { MouseCoordsService } from 'browser/services/MouseCoordsService'; import { MouseCoordsService } from './services/MouseCoordsService';
import { MouseEventCssClasses, MouseService } from 'browser/services/MouseService'; import { MouseEventCssClasses, MouseService } from './services/MouseService';
import { RenderService } from 'browser/services/RenderService'; import { RenderService } from './services/RenderService';
import { SelectionService } from 'browser/services/SelectionService'; import { SelectionService } from './services/SelectionService';
import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from 'browser/services/Services'; import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IKeyboardService, ILinkProviderService, IMouseCoordsService, IMouseService, IRenderService, ISelectionService, IThemeService } from './services/Services';
import { ThemeService } from 'browser/services/ThemeService'; import { ThemeService } from './services/ThemeService';
import { KeyboardService } from 'browser/services/KeyboardService'; import { KeyboardService } from './services/KeyboardService';
import { channels, color, rgb } from 'common/Color'; import { channels, color, rgb } from '../common/Color';
import { CoreTerminal } from 'common/CoreTerminal'; import { CoreTerminal } from '../common/CoreTerminal';
import * as Browser from 'common/Platform'; import * as Browser from '../common/Platform';
import { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from 'common/Types'; import { ColorRequestType, IColorEvent, ITerminalOptions, KeyboardResultType, SpecialColorIndex } from '../common/Types';
import { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine'; import { DEFAULT_ATTR_DATA } from '../common/buffer/BufferLine';
import { IBuffer } from 'common/buffer/Types'; import { IBuffer } from '../common/buffer/Types';
import { C0, C1ESCAPED } from 'common/data/EscapeSequences'; import { C0, C1ESCAPED } from '../common/data/EscapeSequences';
import { toRgbString } from 'common/input/XParseColor'; import { toRgbString } from '../common/input/XParseColor';
import { DecorationService } from 'common/services/DecorationService'; import { DecorationService } from '../common/services/DecorationService';
import { IDecorationService } from 'common/services/Services'; import { IDecorationService } from '../common/services/Services';
import { WindowsOptionsReportType } from '../common/InputHandler'; import { WindowsOptionsReportType } from '../common/InputHandler';
import { AccessibilityManager } from './AccessibilityManager'; import { AccessibilityManager } from './AccessibilityManager';
import { Linkifier } from './Linkifier'; import { Linkifier } from './Linkifier';
import { Emitter, EventUtils, type IEvent } from 'common/Event'; import { Emitter, EventUtils, type IEvent } from '../common/Event';
import { addDisposableListener } from 'browser/Dom'; import { addDisposableListener } from './Dom';
import { MutableDisposable, toDisposable } from 'common/Lifecycle'; import { MutableDisposable, toDisposable } from '../common/Lifecycle';
export class CoreBrowserTerminal extends CoreTerminal implements ITerminal { export class CoreBrowserTerminal extends CoreTerminal implements ITerminal {
public textarea: HTMLTextAreaElement | undefined; public textarea: HTMLTextAreaElement | undefined;
+2 -2
View File
@@ -5,8 +5,8 @@
* Minimal DOM helpers for xterm.js browser code. * Minimal DOM helpers for xterm.js browser code.
*/ */
import { IntervalTimer } from 'common/Async'; import { IntervalTimer } from '../common/Async';
import { IDisposable } from 'common/Lifecycle'; import { IDisposable } from '../common/Lifecycle';
export function getWindow(e: Node | UIEvent | undefined | null): Window { export function getWindow(e: Node | UIEvent | undefined | null): Window {
const candidateNode = e as Node | undefined | null; const candidateNode = e as Node | undefined | null;
+4 -4
View File
@@ -4,11 +4,11 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { IBufferService } from 'common/services/Services'; import { IBufferService } from '../common/services/Services';
import { Linkifier } from './Linkifier'; import { Linkifier } from './Linkifier';
import { MockBufferService } from 'common/TestUtils.test'; import { MockBufferService } from '../common/TestUtils.test';
import { ILink } from 'browser/Types'; import { ILink } from './Types';
import { LinkProviderService } from 'browser/services/LinkProviderService'; import { LinkProviderService } from './services/LinkProviderService';
import jsdom = require('jsdom'); import jsdom = require('jsdom');
class TestLinkifier2 extends Linkifier { class TestLinkifier2 extends Linkifier {
+6 -6
View File
@@ -3,13 +3,13 @@
* @license MIT * @license MIT
*/ */
import { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from 'browser/Types'; import { IBufferCellPosition, ILink, ILinkDecorations, ILinkWithState, ILinkifier2, ILinkifierEvent } from './Types';
import { Disposable, dispose, toDisposable } from 'common/Lifecycle'; import { Disposable, dispose, toDisposable } from '../common/Lifecycle';
import { IDisposable } from 'common/Types'; import { IDisposable } from '../common/Types';
import { IBufferService } from 'common/services/Services'; import { IBufferService } from '../common/services/Services';
import { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services'; import { ILinkProviderService, IMouseCoordsService, IRenderService } from './services/Services';
import { Emitter } from 'common/Event'; import { Emitter } from '../common/Event';
import { addDisposableListener } from 'browser/Dom'; import { addDisposableListener } from './Dom';
export class Linkifier extends Disposable implements ILinkifier2 { export class Linkifier extends Disposable implements ILinkifier2 {
public get currentLink(): ILinkWithState | undefined { return this._currentLink; } public get currentLink(): ILinkWithState | undefined { return this._currentLink; }
+6 -5
View File
@@ -4,11 +4,12 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { OscLinkProvider } from 'browser/OscLinkProvider'; import { OscLinkProvider } from './OscLinkProvider';
import { ILink } from 'browser/Types'; import { ILink } from './Types';
import { createCellData, MockBufferService, MockOptionsService } from 'common/TestUtils.test'; import { createCellData, MockBufferService, MockOptionsService } from '../common/TestUtils.test';
import { IBufferService, IOscLinkService } from 'common/services/Services'; import { IBufferService, IOscLinkService } from '../common/services/Services';
import { IBufferLine, IOscLinkData } from 'common/Types'; import { IOscLinkData } from '../common/Types';
import { IBufferLine } from '../common/buffer/Types';
class TestOscLinkService implements IOscLinkService { class TestOscLinkService implements IOscLinkService {
public serviceBrand: any; public serviceBrand: any;
+5 -5
View File
@@ -3,11 +3,11 @@
* @license MIT * @license MIT
*/ */
import { IBufferRange, ILink } from 'browser/Types'; import { IBufferRange, ILink } from './Types';
import { ILinkProvider } from 'browser/services/Services'; import { ILinkProvider } from './services/Services';
import { CellData } from 'common/buffer/CellData'; import { CellData } from '../common/buffer/CellData';
import { IBufferLine } from 'common/Types'; import { IBufferLine } from '../common/buffer/Types';
import { IBufferService, IOptionsService, IOscLinkService } from 'common/services/Services'; import { IBufferService, IOptionsService, IOscLinkService } from '../common/services/Services';
export class OscLinkProvider implements ILinkProvider { export class OscLinkProvider implements ILinkProvider {
private readonly _workCell = new CellData(); private readonly _workCell = new CellData();
+2 -2
View File
@@ -3,8 +3,8 @@
* @license MIT * @license MIT
*/ */
import { IRenderDebouncerWithCallback } from 'browser/Types'; import { IRenderDebouncerWithCallback } from './Types';
import { ICoreBrowserService } from 'browser/services/Services'; import { ICoreBrowserService } from './services/Services';
/** /**
* Debounces calls to render terminal rows using animation frames. * Debounces calls to render terminal rows using animation frames.
+6 -6
View File
@@ -3,13 +3,13 @@
* @license MIT * @license MIT
*/ */
import { MockCompositionHelper, MockRenderer, MockViewport, TestTerminal } from 'browser/TestUtils.test'; import { MockCompositionHelper, MockRenderer, MockViewport, TestTerminal } from './TestUtils.test';
import type { IBrowser } from 'browser/Types'; import type { IBrowser } from './Types';
import { assert } from 'chai'; import { assert } from 'chai';
import { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine'; import { DEFAULT_ATTR_DATA } from '../common/buffer/BufferLine';
import { CellData } from 'common/buffer/CellData'; import { CellData } from '../common/buffer/CellData';
import { MockUnicodeService, createCellData } from 'common/TestUtils.test'; import { MockUnicodeService, createCellData } from '../common/TestUtils.test';
import { IMarker } from 'common/Types'; import { IMarker } from '../common/buffer/Types';
const INIT_COLS = 80; const INIT_COLS = 80;
const INIT_ROWS = 24; const INIT_ROWS = 24;
+1 -1
View File
@@ -7,7 +7,7 @@ import * as path from 'path';
import * as os from 'os'; import * as os from 'os';
import * as fs from 'fs'; import * as fs from 'fs';
import * as pty from 'node-pty'; import * as pty from 'node-pty';
import { CoreBrowserTerminal } from 'browser/CoreBrowserTerminal'; import { CoreBrowserTerminal } from './CoreBrowserTerminal';
import { IDisposable } from '@xterm/xterm'; import { IDisposable } from '@xterm/xterm';
// all test files expect terminal in 80x25 // all test files expect terminal in 80x25
+16 -15
View File
@@ -4,21 +4,22 @@
*/ */
import { IDisposable, IMarker, ILinkProvider, IDecorationOptions, IDecoration, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm'; import { IDisposable, IMarker, ILinkProvider, IDecorationOptions, IDecoration, IRenderDimensions as IRenderDimensionsApi } from '@xterm/xterm';
import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IMouseService, IRenderService, ISelectionService, IThemeService } from 'browser/services/Services'; import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IMouseService, IRenderService, ISelectionService, IThemeService } from './services/Services';
import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types'; import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from './renderer/shared/Types';
import { IColorSet, ITerminal, ILinkifier2, IBrowser, IViewport, ICompositionHelper, CharacterJoinerHandler, IBufferRange, ReadonlyColorSet, IBufferElementProvider } from 'browser/Types'; import { IColorSet, ITerminal, ILinkifier2, IBrowser, IViewport, ICompositionHelper, CharacterJoinerHandler, IBufferRange, ReadonlyColorSet, IBufferElementProvider } from './Types';
import { IBuffer, IBufferSet } from 'common/buffer/Types'; import { IAttributeData, IBuffer, IBufferLine, IBufferSet, ICellData } from '../common/buffer/Types';
import { IBufferLine, ICellData, IAttributeData, ICircularList, XtermListener, ICharset, ITerminalOptions, ColorIndex } from 'common/Types'; import { ICircularList } from '../common/CircularList';
import { Buffer } from 'common/buffer/Buffer'; import { XtermListener, ICharset, ITerminalOptions, ColorIndex } from '../common/Types';
import * as Browser from 'common/Platform'; import { Buffer } from '../common/buffer/Buffer';
import { CoreBrowserTerminal } from 'browser/CoreBrowserTerminal'; import * as Browser from '../common/Platform';
import { IUnicodeService, IOptionsService, ICoreService, IMouseStateService } from 'common/services/Services'; import { CoreBrowserTerminal } from './CoreBrowserTerminal';
import { IFunctionIdentifier, IParams } from 'common/parser/Types'; import { IUnicodeService, IOptionsService, ICoreService, IMouseStateService } from '../common/services/Services';
import { AttributeData } from 'common/buffer/AttributeData'; import { IFunctionIdentifier, IParams } from '../common/parser/Types';
import { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types'; import { AttributeData } from '../common/buffer/AttributeData';
import { css } from 'common/Color'; import { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from './selection/Types';
import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils'; import { css } from '../common/Color';
import { Emitter, type IEvent } from 'common/Event'; import { createRenderDimensions } from './renderer/shared/RendererUtils';
import { Emitter, type IEvent } from '../common/Event';
export class TestTerminal extends CoreBrowserTerminal { export class TestTerminal extends CoreBrowserTerminal {
public get curAttrData(): IAttributeData { return (this as any)._inputHandler._curAttrData; } public get curAttrData(): IAttributeData { return (this as any)._inputHandler._curAttrData; }
+1 -1
View File
@@ -5,7 +5,7 @@
const RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second const RENDER_DEBOUNCE_THRESHOLD_MS = 1000; // 1 Second
import { IRenderDebouncer } from 'browser/Types'; import { IRenderDebouncer } from './Types';
/** /**
* Debounces calls to update screen readers to update at most once configurable interval of time. * Debounces calls to update screen readers to update at most once configurable interval of time.
+5 -4
View File
@@ -3,11 +3,12 @@
* @license MIT * @license MIT
*/ */
import { CharData, IColor, ICoreTerminal, ITerminalOptions } from 'common/Types'; import { IColor, ITerminalOptions } from '../common/Types';
import { IBuffer } from 'common/buffer/Types'; import { CharData, IBuffer } from '../common/buffer/Types';
import { ICoreTerminal } from '../common/CoreTerminal';
import { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm'; import { IDisposable, IRenderDimensions as IRenderDimensionsApi, Terminal as ITerminalApi } from '@xterm/xterm';
import { channels, css } from 'common/Color'; import { channels, css } from '../common/Color';
import type { IEvent } from 'common/Event'; import type { IEvent } from '../common/Event';
/** /**
* A portion of the public API that are implemented identially internally and simply passed through. * A portion of the public API that are implemented identially internally and simply passed through.
+10 -10
View File
@@ -3,16 +3,16 @@
* @license MIT * @license MIT
*/ */
import { ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services'; import { ICoreBrowserService, IRenderService, IThemeService } from './services/Services';
import { ViewportConstants } from 'browser/shared/Constants'; import { ViewportConstants } from './shared/Constants';
import { Disposable, toDisposable } from 'common/Lifecycle'; import { Disposable, toDisposable } from '../common/Lifecycle';
import { IBufferService, ICoreService, IMouseStateService, IOptionsService } from 'common/services/Services'; import { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../common/services/Services';
import { CoreMouseEventType } from 'common/Types'; import { CoreMouseEventType } from '../common/Types';
import { scheduleAtNextAnimationFrame } from 'browser/Dom'; import { scheduleAtNextAnimationFrame } from './Dom';
import { SmoothScrollableElement } from 'browser/scrollable/scrollableElement'; import { SmoothScrollableElement } from './scrollable/scrollableElement';
import type { IScrollableElementChangeOptions } from 'browser/scrollable/scrollableElementOptions'; import type { IScrollableElementChangeOptions } from './scrollable/scrollableElementOptions';
import { Emitter, EventUtils } from 'common/Event'; import { Emitter, EventUtils } from '../common/Event';
import { Scrollable, ScrollbarVisibility, type IScrollEvent } from 'browser/scrollable/scrollable'; import { Scrollable, ScrollbarVisibility, type IScrollEvent } from './scrollable/scrollable';
export class Viewport extends Disposable { export class Viewport extends Disposable {
@@ -3,9 +3,9 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { ICoreBrowserService, IRenderService } from 'browser/services/Services'; import { ICoreBrowserService, IRenderService } from '../services/Services';
import { Disposable, toDisposable } from 'common/Lifecycle'; import { Disposable, toDisposable } from '../../common/Lifecycle';
import { IBufferService, IDecorationService, IInternalDecoration } from 'common/services/Services'; import { IBufferService, IDecorationService, IInternalDecoration } from '../../common/services/Services';
export class BufferDecorationRenderer extends Disposable { export class BufferDecorationRenderer extends Disposable {
private readonly _container: HTMLElement; private readonly _container: HTMLElement;
@@ -4,7 +4,7 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { ColorZoneStore } from 'browser/decorations/ColorZoneStore'; import { ColorZoneStore } from './ColorZoneStore';
const optionsRedFull = { const optionsRedFull = {
overviewRulerOptions: { overviewRulerOptions: {
+1 -1
View File
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { IInternalDecoration } from 'common/services/Services'; import { IInternalDecoration } from '../../common/services/Services';
export interface IColorZoneStore { export interface IColorZoneStore {
readonly zones: IColorZone[]; readonly zones: IColorZone[];
@@ -3,10 +3,10 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { ColorZoneStore, IColorZone, IColorZoneStore } from 'browser/decorations/ColorZoneStore'; import { ColorZoneStore, IColorZone, IColorZoneStore } from './ColorZoneStore';
import { ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services'; import { ICoreBrowserService, IRenderService, IThemeService } from '../services/Services';
import { Disposable, toDisposable } from 'common/Lifecycle'; import { Disposable, toDisposable } from '../../common/Lifecycle';
import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; import { IBufferService, IDecorationService, IOptionsService } from '../../common/services/Services';
const enum Constants { const enum Constants {
OVERVIEW_RULER_BORDER_WIDTH = 1 OVERVIEW_RULER_BORDER_WIDTH = 1
+3 -3
View File
@@ -4,9 +4,9 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { CompositionHelper } from 'browser/input/CompositionHelper'; import { CompositionHelper } from './CompositionHelper';
import { MockRenderService } from 'browser/TestUtils.test'; import { MockRenderService } from '../TestUtils.test';
import { MockCoreService, MockBufferService, MockOptionsService } from 'common/TestUtils.test'; import { MockCoreService, MockBufferService, MockOptionsService } from '../../common/TestUtils.test';
describe('CompositionHelper', () => { describe('CompositionHelper', () => {
let compositionHelper: CompositionHelper; let compositionHelper: CompositionHelper;
+3 -3
View File
@@ -3,9 +3,9 @@
* @license MIT * @license MIT
*/ */
import { IRenderService } from 'browser/services/Services'; import { IRenderService } from '../services/Services';
import { IBufferService, ICoreService, IOptionsService } from 'common/services/Services'; import { IBufferService, ICoreService, IOptionsService } from '../../common/services/Services';
import { C0 } from 'common/data/EscapeSequences'; import { C0 } from '../../common/data/EscapeSequences';
interface IPosition { interface IPosition {
start: number; start: number;
+1 -1
View File
@@ -5,7 +5,7 @@
import jsdom = require('jsdom'); import jsdom = require('jsdom');
import { assert } from 'chai'; import { assert } from 'chai';
import { getCoords } from 'browser/input/Mouse'; import { getCoords } from './Mouse';
const CHAR_WIDTH = 10; const CHAR_WIDTH = 10;
const CHAR_HEIGHT = 20; const CHAR_HEIGHT = 20;
+3 -3
View File
@@ -6,8 +6,8 @@
export function getCoordsRelativeToElement(window: Pick<Window, 'getComputedStyle'>, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] { export function getCoordsRelativeToElement(window: Pick<Window, 'getComputedStyle'>, event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {
const rect = element.getBoundingClientRect(); const rect = element.getBoundingClientRect();
const elementStyle = window.getComputedStyle(element); const elementStyle = window.getComputedStyle(element);
const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left')); const leftPadding = parseInt(elementStyle.getPropertyValue('padding-left'), 10);
const topPadding = parseInt(elementStyle.getPropertyValue('padding-top')); const topPadding = parseInt(elementStyle.getPropertyValue('padding-top'), 10);
return [ return [
event.clientX - rect.left - leftPadding, event.clientX - rect.left - leftPadding,
event.clientY - rect.top - topPadding event.clientY - rect.top - topPadding
@@ -22,7 +22,7 @@ export function getCoordsRelativeToElement(window: Pick<Window, 'getComputedStyl
* @param event The mouse event. * @param event The mouse event.
* @param element The terminal's container element. * @param element The terminal's container element.
* @param colCount The number of columns in the terminal. * @param colCount The number of columns in the terminal.
* @param rowCount The number of rows n the terminal. * @param rowCount The number of rows in the terminal.
* @param hasValidCharSize Whether there is a valid character size available. * @param hasValidCharSize Whether there is a valid character size available.
* @param cssCellWidth The cell width device pixel render dimensions. * @param cssCellWidth The cell width device pixel render dimensions.
* @param cssCellHeight The cell height device pixel render dimensions. * @param cssCellHeight The cell height device pixel render dimensions.
+2 -2
View File
@@ -4,8 +4,8 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { IBufferService } from 'common/services/Services'; import { IBufferService } from '../../common/services/Services';
import { MockBufferService } from 'common/TestUtils.test'; import { MockBufferService } from '../../common/TestUtils.test';
import { moveToCellSequence } from './MoveToCell'; import { moveToCellSequence } from './MoveToCell';
describe('MoveToCell', () => { describe('MoveToCell', () => {
+2 -2
View File
@@ -3,8 +3,8 @@
* @license MIT * @license MIT
*/ */
import { C0 } from 'common/data/EscapeSequences'; import { C0 } from '../../common/data/EscapeSequences';
import { IBufferService } from 'common/services/Services'; import { IBufferService } from '../../common/services/Services';
const enum Direction { const enum Direction {
UP = 'A', UP = 'A',
+10 -10
View File
@@ -3,17 +3,17 @@
* @license MIT * @license MIT
*/ */
import * as Strings from 'browser/LocalizableStrings'; import * as Strings from '../LocalizableStrings';
import { CoreBrowserTerminal as TerminalCore } from 'browser/CoreBrowserTerminal'; import { CoreBrowserTerminal as TerminalCore } from '../CoreBrowserTerminal';
import { IBufferRange, ITerminal } from 'browser/Types'; import { IBufferRange, ITerminal } from '../Types';
import { Disposable } from 'common/Lifecycle'; import { Disposable } from '../../common/Lifecycle';
import { ITerminalOptions } from 'common/Types'; import { ITerminalOptions } from '../../common/Types';
import { AddonManager } from 'common/public/AddonManager'; import { AddonManager } from '../../common/public/AddonManager';
import { BufferNamespaceApi } from 'common/public/BufferNamespaceApi'; import { BufferNamespaceApi } from '../../common/public/BufferNamespaceApi';
import { ParserApi } from 'common/public/ParserApi'; import { ParserApi } from '../../common/public/ParserApi';
import { UnicodeApi } from 'common/public/UnicodeApi'; import { UnicodeApi } from '../../common/public/UnicodeApi';
import { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm'; import { IBufferNamespace as IBufferNamespaceApi, IDecoration, IDecorationOptions, IDisposable, ILinkProvider, ILocalizableStrings, IMarker, IModes, IParser, IRenderDimensions, ITerminalAddon, Terminal as ITerminalApi, ITerminalInitOnlyOptions, IUnicodeHandling } from '@xterm/xterm';
import type { IEvent } from 'common/Event'; import type { IEvent } from '../../common/Event';
/** /**
* The set of options that only have an effect when set in the Terminal constructor. * The set of options that only have an effect when set in the Terminal constructor.
+14 -14
View File
@@ -3,20 +3,20 @@
* @license MIT * @license MIT
*/ */
import { DomRendererRowFactory, RowCss } from 'browser/renderer/dom/DomRendererRowFactory'; import { DomRendererRowFactory, RowCss } from './DomRendererRowFactory';
import { WidthCache } from 'browser/renderer/dom/WidthCache'; import { WidthCache } from './WidthCache';
import { INVERTED_DEFAULT_COLOR, RendererConstants } from 'browser/renderer/shared/Constants'; import { INVERTED_DEFAULT_COLOR, RendererConstants } from '../shared/Constants';
import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils'; import { createRenderDimensions } from '../shared/RendererUtils';
import { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel'; import { createSelectionRenderModel } from '../shared/SelectionRenderModel';
import { TextBlinkStateManager } from 'browser/renderer/shared/TextBlinkStateManager'; import { TextBlinkStateManager } from '../shared/TextBlinkStateManager';
import { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from 'browser/renderer/shared/Types'; import { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from '../shared/Types';
import { ICharSizeService, ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { ICharSizeService, ICoreBrowserService, IThemeService } from '../../services/Services';
import { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from 'browser/Types'; import { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from '../../Types';
import { color } from 'common/Color'; import { color } from '../../../common/Color';
import { Disposable, toDisposable } from 'common/Lifecycle'; import { Disposable, toDisposable } from '../../../common/Lifecycle';
import { IBufferService, ICoreService, IInstantiationService, IOptionsService } from 'common/services/Services'; import { IBufferService, ICoreService, IInstantiationService, IOptionsService } from '../../../common/services/Services';
import { Emitter } from 'common/Event'; import { Emitter } from '../../../common/Event';
import { addDisposableListener } from 'browser/Dom'; import { addDisposableListener } from '../../Dom';
const enum Constants { const enum Constants {
@@ -5,15 +5,15 @@
import jsdom = require('jsdom'); import jsdom = require('jsdom');
import { assert } from 'chai'; import { assert } from 'chai';
import { DomRendererRowFactory } from 'browser/renderer/dom/DomRendererRowFactory'; import { DomRendererRowFactory } from './DomRendererRowFactory';
import { NULL_CELL_CODE, NULL_CELL_WIDTH, NULL_CELL_CHAR, DEFAULT_ATTR, FgFlags, BgFlags, Attributes, UnderlineStyle } from 'common/buffer/Constants'; import { NULL_CELL_CODE, NULL_CELL_WIDTH, NULL_CELL_CHAR, DEFAULT_ATTR, FgFlags, BgFlags, Attributes, UnderlineStyle } from '../../../common/buffer/Constants';
import { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine'; import { BufferLine, DEFAULT_ATTR_DATA } from '../../../common/buffer/BufferLine';
import { BufferLineStringCache } from 'common/buffer/BufferLineStringCache'; import { BufferLineStringCache } from '../../../common/buffer/BufferLineStringCache';
import { IBufferLine } from 'common/Types'; import { IBufferLine } from '../../../common/buffer/Types';
import { CellData } from 'common/buffer/CellData'; import { CellData } from '../../../common/buffer/CellData';
import { MockCoreService, MockDecorationService, MockOptionsService, createCellData, NULL_CELL_DATA } from 'common/TestUtils.test'; import { MockCoreService, MockDecorationService, MockOptionsService, createCellData, NULL_CELL_DATA } from '../../../common/TestUtils.test';
import { MockCharacterJoinerService, MockCoreBrowserService, MockThemeService } from 'browser/TestUtils.test'; import { MockCharacterJoinerService, MockCoreBrowserService, MockThemeService } from '../../TestUtils.test';
import { TestWidthCache } from 'browser/renderer/dom/WidthCache.test'; import { TestWidthCache } from './WidthCache.test';
const TEST_STRING_CACHE = new BufferLineStringCache(); const TEST_STRING_CACHE = new BufferLineStringCache();
@@ -3,18 +3,19 @@
* @license MIT * @license MIT
*/ */
import { IBufferLine, ICellData, IColor } from 'common/Types'; import { IColor } from '../../../common/Types';
import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants'; import { IBufferLine, ICellData } from '../../../common/buffer/Types';
import { WHITESPACE_CELL_CHAR, Attributes } from 'common/buffer/Constants'; import { INVERTED_DEFAULT_COLOR } from '../shared/Constants';
import { CellData } from 'common/buffer/CellData'; import { WHITESPACE_CELL_CHAR, Attributes } from '../../../common/buffer/Constants';
import { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; import { CellData } from '../../../common/buffer/CellData';
import { channels, color } from 'common/Color'; import { ICoreService, IDecorationService, IOptionsService } from '../../../common/services/Services';
import { ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { channels, color } from '../../../common/Color';
import { JoinedCellData } from 'browser/services/CharacterJoinerService'; import { ICharacterJoinerService, ICoreBrowserService, IThemeService } from '../../services/Services';
import { treatGlyphAsBackgroundColor } from 'browser/renderer/shared/RendererUtils'; import { JoinedCellData } from '../../services/CharacterJoinerService';
import { AttributeData } from 'common/buffer/AttributeData'; import { treatGlyphAsBackgroundColor } from '../shared/RendererUtils';
import { WidthCache } from 'browser/renderer/dom/WidthCache'; import { AttributeData } from '../../../common/buffer/AttributeData';
import { IColorContrastCache } from 'browser/Types'; import { WidthCache } from './WidthCache';
import { IColorContrastCache } from '../../Types';
export const enum RowCss { export const enum RowCss {
@@ -231,7 +232,6 @@ export class DomRendererRowFactory {
} }
charElement = this._document.createElement('span'); charElement = this._document.createElement('span');
cellAmount = 0; cellAmount = 0;
// eslint-disable-next-line no-useless-assignment
text = ''; text = '';
} }
} }
+1 -1
View File
@@ -4,7 +4,7 @@
*/ */
import * as assert from 'assert'; import * as assert from 'assert';
import { IWidthCacheFontVariantCanvas, WidthCache, WidthCacheSettings } from 'browser/renderer/dom/WidthCache'; import { IWidthCacheFontVariantCanvas, WidthCache, WidthCacheSettings } from './WidthCache';
class MockWidthCacheFontVariantCanvas implements IWidthCacheFontVariantCanvas { class MockWidthCacheFontVariantCanvas implements IWidthCacheFontVariantCanvas {
+3 -3
View File
@@ -3,9 +3,9 @@
* @license MIT * @license MIT
*/ */
import { throwIfFalsy } from 'browser/renderer/shared/RendererUtils'; import { throwIfFalsy } from '../shared/RendererUtils';
import { IDisposable } from 'common/Types'; import { IDisposable } from '../../../common/Types';
import { FontWeight } from 'common/services/Services'; import { FontWeight } from '../../../common/services/Services';
export const enum WidthCacheSettings { export const enum WidthCacheSettings {
@@ -3,7 +3,7 @@
* @license MIT * @license MIT
*/ */
import { computeNextVariantOffset } from 'browser/renderer/shared/RendererUtils'; import { computeNextVariantOffset } from './RendererUtils';
import { assert } from 'chai'; import { assert } from 'chai';
describe('RendererUtils', () => { describe('RendererUtils', () => {
+1 -1
View File
@@ -3,7 +3,7 @@
* @license MIT * @license MIT
*/ */
import { IDimensions, IRenderDimensions } from 'browser/renderer/shared/Types'; import { IDimensions, IRenderDimensions } from './Types';
export function throwIfFalsy<T>(value: T | undefined | null): T { export function throwIfFalsy<T>(value: T | undefined | null): T {
if (!value) { if (!value) {
@@ -3,8 +3,8 @@
* @license MIT * @license MIT
*/ */
import { ITerminal } from 'browser/Types'; import { ITerminal } from '../../Types';
import { ISelectionRenderModel } from 'browser/renderer/shared/Types'; import { ISelectionRenderModel } from './Types';
import { Terminal } from '@xterm/xterm'; import { Terminal } from '@xterm/xterm';
class SelectionRenderModel implements ISelectionRenderModel { class SelectionRenderModel implements ISelectionRenderModel {
@@ -4,10 +4,10 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { TextBlinkStateManager } from 'browser/renderer/shared/TextBlinkStateManager'; import { TextBlinkStateManager } from './TextBlinkStateManager';
import { MockOptionsService } from 'common/TestUtils.test'; import { MockOptionsService } from '../../../common/TestUtils.test';
import type { ICoreBrowserService } from 'browser/services/Services'; import type { ICoreBrowserService } from '../../services/Services';
import { Emitter } from 'common/Event'; import { Emitter } from '../../../common/Event';
class FakeWindow { class FakeWindow {
public nextId = 1; public nextId = 1;
@@ -3,9 +3,9 @@
* @license MIT * @license MIT
*/ */
import { ICoreBrowserService } from 'browser/services/Services'; import { ICoreBrowserService } from '../../services/Services';
import { Disposable, toDisposable } from 'common/Lifecycle'; import { Disposable, toDisposable } from '../../../common/Lifecycle';
import { IOptionsService } from 'common/services/Services'; import { IOptionsService } from '../../../common/services/Services';
export class TextBlinkStateManager extends Disposable { export class TextBlinkStateManager extends Disposable {
private _intervalDuration: number = 0; private _intervalDuration: number = 0;
+3 -3
View File
@@ -4,9 +4,9 @@
*/ */
import { Terminal } from '@xterm/xterm'; import { Terminal } from '@xterm/xterm';
import { ITerminal } from 'browser/Types'; import { ITerminal } from '../../Types';
import { IDisposable } from 'common/Types'; import { IDisposable } from '../../../common/Types';
import type { IEvent } from 'common/Event'; import type { IEvent } from '../../../common/Event';
export interface IDimensions { export interface IDimensions {
width: number; width: number;
+1 -1
View File
@@ -11,7 +11,7 @@ import { ScrollbarArrow, IScrollbarArrowOptions } from './scrollbarArrow';
import { ScrollbarState } from './scrollbarState'; import { ScrollbarState } from './scrollbarState';
import { ScrollbarVisibilityController } from './scrollbarVisibilityController'; import { ScrollbarVisibilityController } from './scrollbarVisibilityController';
import { Widget } from './widget'; import { Widget } from './widget';
import * as platform from 'common/Platform'; import * as platform from '../../common/Platform';
import { INewScrollPosition, Scrollable, ScrollbarVisibility } from './scrollable'; import { INewScrollPosition, Scrollable, ScrollbarVisibility } from './scrollable';
/** /**
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as dom from '../Dom'; import * as dom from '../Dom';
import { DisposableStore, IDisposable, toDisposable } from 'common/Lifecycle'; import { DisposableStore, IDisposable, toDisposable } from '../../common/Lifecycle';
type PointerMoveCallback = (event: PointerEvent) => void; type PointerMoveCallback = (event: PointerEvent) => void;
type OnStopCallback = () => void; type OnStopCallback = () => void;
+2 -2
View File
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as platform from 'common/Platform'; import * as platform from '../../common/Platform';
interface IWindowChainElement { interface IWindowChainElement {
readonly window: WeakRef<Window>; readonly window: WeakRef<Window>;
@@ -217,7 +217,7 @@ export class StandardWheelEvent {
let shouldFactorDPR: boolean = false; let shouldFactorDPR: boolean = false;
if (platform.isChrome) { if (platform.isChrome) {
const chromeVersionMatch = navigator.userAgent.match(/Chrome\/(\d+)/); const chromeVersionMatch = navigator.userAgent.match(/Chrome\/(\d+)/);
const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1]) : 123; const chromeMajorVersion = chromeVersionMatch ? parseInt(chromeVersionMatch[1], 10) : 123;
shouldFactorDPR = chromeMajorVersion <= 122; shouldFactorDPR = chromeMajorVersion <= 122;
} }
+2 -2
View File
@@ -3,8 +3,8 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { Emitter, IEvent } from 'common/Event'; import { Emitter, IEvent } from '../../common/Event';
import { Disposable, IDisposable } from 'common/Lifecycle'; import { Disposable, IDisposable } from '../../common/Lifecycle';
export const enum ScrollbarVisibility { export const enum ScrollbarVisibility {
AUTO = 1, AUTO = 1,
+4 -4
View File
@@ -11,10 +11,10 @@ import { HorizontalScrollbar } from './horizontalScrollbar';
import { IScrollableElementChangeOptions, IScrollableElementCreationOptions, IScrollableElementResolvedOptions } from './scrollableElementOptions'; import { IScrollableElementChangeOptions, IScrollableElementCreationOptions, IScrollableElementResolvedOptions } from './scrollableElementOptions';
import { VerticalScrollbar } from './verticalScrollbar'; import { VerticalScrollbar } from './verticalScrollbar';
import { Widget } from './widget'; import { Widget } from './widget';
import { TimeoutTimer } from 'common/Async'; import { TimeoutTimer } from '../../common/Async';
import { Emitter, IEvent } from 'common/Event'; import { Emitter, IEvent } from '../../common/Event';
import { IDisposable, dispose } from 'common/Lifecycle'; import { IDisposable, dispose } from '../../common/Lifecycle';
import * as platform from 'common/Platform'; import * as platform from '../../common/Platform';
import { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, IScrollEvent, Scrollable, ScrollbarVisibility } from './scrollable'; import { INewScrollDimensions, INewScrollPosition, IScrollDimensions, IScrollPosition, IScrollEvent, Scrollable, ScrollbarVisibility } from './scrollable';
// import 'vs/css!./media/scrollbars'; // import 'vs/css!./media/scrollbars';
+1 -1
View File
@@ -5,7 +5,7 @@
import { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor'; import { GlobalPointerMoveMonitor } from './globalPointerMoveMonitor';
import { Widget } from './widget'; import { Widget } from './widget';
import { TimeoutTimer } from 'common/Async'; import { TimeoutTimer } from '../../common/Async';
import * as dom from '../Dom'; import * as dom from '../Dom';
export interface IScrollbarArrowOptions { export interface IScrollbarArrowOptions {
@@ -4,8 +4,8 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { FastDomNode } from './fastDomNode'; import { FastDomNode } from './fastDomNode';
import { TimeoutTimer } from 'common/Async'; import { TimeoutTimer } from '../../common/Async';
import { Disposable } from 'common/Lifecycle'; import { Disposable } from '../../common/Lifecycle';
import { ScrollbarVisibility } from './scrollable'; import { ScrollbarVisibility } from './scrollable';
export class ScrollbarVisibilityController extends Disposable { export class ScrollbarVisibilityController extends Disposable {
+1 -1
View File
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as DomUtils from '../Dom'; import * as DomUtils from '../Dom';
import { Disposable, IDisposable, toDisposable } from 'common/Lifecycle'; import { Disposable, IDisposable, toDisposable } from '../../common/Lifecycle';
const mainWindow = (typeof window === 'object' ? window : globalThis) as Window & typeof globalThis; const mainWindow = (typeof window === 'object' ? window : globalThis) as Window & typeof globalThis;
+1 -1
View File
@@ -5,7 +5,7 @@
import * as dom from '../Dom'; import * as dom from '../Dom';
import { IMouseEvent, StandardMouseEvent } from './mouseEvent'; import { IMouseEvent, StandardMouseEvent } from './mouseEvent';
import { Disposable } from 'common/Lifecycle'; import { Disposable } from '../../common/Lifecycle';
export abstract class Widget extends Disposable { export abstract class Widget extends Disposable {
+1 -1
View File
@@ -5,7 +5,7 @@
import { assert } from 'chai'; import { assert } from 'chai';
import { SelectionModel } from './SelectionModel'; import { SelectionModel } from './SelectionModel';
import { MockBufferService } from 'common/TestUtils.test'; import { MockBufferService } from '../../common/TestUtils.test';
describe('SelectionModel', () => { describe('SelectionModel', () => {
let model: SelectionModel; let model: SelectionModel;
+1 -1
View File
@@ -3,7 +3,7 @@
* @license MIT * @license MIT
*/ */
import { IBufferService } from 'common/services/Services'; import { IBufferService } from '../../common/services/Services';
/** /**
* Represents a selection within the buffer. This model only cares about column * Represents a selection within the buffer. This model only cares about column
+4 -4
View File
@@ -3,10 +3,10 @@
* @license MIT * @license MIT
*/ */
import { IOptionsService } from 'common/services/Services'; import { IOptionsService } from '../../common/services/Services';
import { ICharSizeService } from 'browser/services/Services'; import { ICharSizeService } from './Services';
import { Disposable } from 'common/Lifecycle'; import { Disposable } from '../../common/Lifecycle';
import { Emitter } from 'common/Event'; import { Emitter } from '../../common/Event';
export class CharSizeService extends Disposable implements ICharSizeService { export class CharSizeService extends Disposable implements ICharSizeService {
public serviceBrand: undefined; public serviceBrand: undefined;
@@ -4,13 +4,13 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { ICharacterJoinerService } from 'browser/services/Services'; import { ICharacterJoinerService } from './Services';
import { CharacterJoinerService } from 'browser/services/CharacterJoinerService'; import { CharacterJoinerService } from './CharacterJoinerService';
import { BufferLine } from 'common/buffer/BufferLine'; import { BufferLine } from '../../common/buffer/BufferLine';
import { BufferLineStringCache } from 'common/buffer/BufferLineStringCache'; import { BufferLineStringCache } from '../../common/buffer/BufferLineStringCache';
import { IBufferLine } from 'common/Types'; import { IBufferLine } from '../../common/buffer/Types';
import { CellData } from 'common/buffer/CellData'; import { CellData } from '../../common/buffer/CellData';
import { MockBufferService, createCellData } from 'common/TestUtils.test'; import { MockBufferService, createCellData } from '../../common/TestUtils.test';
const TEST_STRING_CACHE = new BufferLineStringCache(); const TEST_STRING_CACHE = new BufferLineStringCache();
@@ -3,13 +3,13 @@
* @license MIT * @license MIT
*/ */
import { IBufferLine, ICellData, CharData } from 'common/Types'; import { CharData, IBufferLine, ICellData } from '../../common/buffer/Types';
import { ICharacterJoiner } from 'browser/Types'; import { ICharacterJoiner } from '../Types';
import { AttributeData } from 'common/buffer/AttributeData'; import { AttributeData } from '../../common/buffer/AttributeData';
import { WHITESPACE_CELL_CHAR, Content } from 'common/buffer/Constants'; import { WHITESPACE_CELL_CHAR, Content } from '../../common/buffer/Constants';
import { CellData } from 'common/buffer/CellData'; import { CellData } from '../../common/buffer/CellData';
import { IBufferService } from 'common/services/Services'; import { IBufferService } from '../../common/services/Services';
import { ICharacterJoinerService } from 'browser/services/Services'; import { ICharacterJoinerService } from './Services';
export class JoinedCellData extends AttributeData implements ICellData { export class JoinedCellData extends AttributeData implements ICellData {
private _width: number; private _width: number;
+3 -3
View File
@@ -4,9 +4,9 @@
*/ */
import { ICoreBrowserService } from './Services'; import { ICoreBrowserService } from './Services';
import { Emitter, EventUtils } from 'common/Event'; import { Emitter, EventUtils } from '../../common/Event';
import { addDisposableListener } from 'browser/Dom'; import { addDisposableListener } from '../Dom';
import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; import { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';
export class CoreBrowserService extends Disposable implements ICoreBrowserService { export class CoreBrowserService extends Disposable implements ICoreBrowserService {
public serviceBrand: undefined; public serviceBrand: undefined;
+7 -7
View File
@@ -3,13 +3,13 @@
* @license MIT * @license MIT
*/ */
import { IKeyboardService } from 'browser/services/Services'; import { IKeyboardService } from './Services';
import { evaluateKeyboardEvent } from 'common/input/Keyboard'; import { evaluateKeyboardEvent } from '../../common/input/Keyboard';
import { KittyKeyboard, KittyKeyboardEventType, KittyKeyboardFlags } from 'common/input/KittyKeyboard'; import { KittyKeyboard, KittyKeyboardEventType, KittyKeyboardFlags } from '../../common/input/KittyKeyboard';
import { Win32InputMode } from 'common/input/Win32InputMode'; import { Win32InputMode } from '../../common/input/Win32InputMode';
import { isMac } from 'common/Platform'; import { isMac } from '../../common/Platform';
import { ICoreService, IOptionsService } from 'common/services/Services'; import { ICoreService, IOptionsService } from '../../common/services/Services';
import { IKeyboardResult } from 'common/Types'; import { IKeyboardResult } from '../../common/Types';
export class KeyboardService implements IKeyboardService { export class KeyboardService implements IKeyboardService {
public serviceBrand: undefined; public serviceBrand: undefined;
+3 -3
View File
@@ -1,6 +1,6 @@
import { ILinkProvider, ILinkProviderService } from 'browser/services/Services'; import { ILinkProvider, ILinkProviderService } from './Services';
import { Disposable, toDisposable } from 'common/Lifecycle'; import { Disposable, toDisposable } from '../../common/Lifecycle';
import { IDisposable } from 'common/Types'; import { IDisposable } from '../../common/Types';
export class LinkProviderService extends Disposable implements ILinkProviderService { export class LinkProviderService extends Disposable implements ILinkProviderService {
declare public serviceBrand: undefined; declare public serviceBrand: undefined;
+3 -3
View File
@@ -3,9 +3,9 @@
* @license MIT * @license MIT
*/ */
import { getWindow } from 'browser/Dom'; import { getWindow } from '../Dom';
import { getCoords, getCoordsRelativeToElement } from 'browser/input/Mouse'; import { getCoords, getCoordsRelativeToElement } from '../input/Mouse';
import { ICharSizeService, IMouseCoordsService, IRenderService } from 'browser/services/Services'; import { ICharSizeService, IMouseCoordsService, IRenderService } from './Services';
export class MouseCoordsService implements IMouseCoordsService { export class MouseCoordsService implements IMouseCoordsService {
public serviceBrand: undefined; public serviceBrand: undefined;
+6 -6
View File
@@ -3,12 +3,12 @@
* @license MIT * @license MIT
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { AltMouseCursorController, MouseEventCssClasses, MouseService } from 'browser/services/MouseService'; import { AltMouseCursorController, MouseEventCssClasses, MouseService } from './MouseService';
import { MouseStateService } from 'common/services/MouseStateService'; import { MouseStateService } from '../../common/services/MouseStateService';
import { CoreMouseAction, CoreMouseButton } from 'common/Types'; import { CoreMouseAction, CoreMouseButton } from '../../common/Types';
import { IBufferService, ICoreService, ILogService, IOptionsService } from 'common/services/Services'; import { IBufferService, ICoreService, ILogService, IOptionsService } from '../../common/services/Services';
import { OptionsService } from 'common/services/OptionsService'; import { OptionsService } from '../../common/services/OptionsService';
import { MockCoreBrowserService, MockRenderService, MockSelectionService } from 'browser/TestUtils.test'; import { MockCoreBrowserService, MockRenderService, MockSelectionService } from '../TestUtils.test';
function toBytes(s: string | undefined): number[] { function toBytes(s: string | undefined): number[] {
if (!s) { if (!s) {
+6 -6
View File
@@ -3,13 +3,13 @@
* @license MIT * @license MIT
*/ */
import { addDisposableListener } from 'browser/Dom'; import { addDisposableListener } from '../Dom';
import { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from 'common/services/Services'; import { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from '../../common/services/Services';
import { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from 'common/Types'; import { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent, IDisposable } from '../../common/Types';
import { C0 } from 'common/data/EscapeSequences'; import { C0 } from '../../common/data/EscapeSequences';
import { DisposableStore, MutableDisposable, toDisposable } from 'common/Lifecycle'; import { DisposableStore, MutableDisposable, toDisposable } from '../../common/Lifecycle';
import { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services'; import { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';
import { Gesture, EventType as GestureEventType, IGestureEvent } from 'browser/scrollable/touch'; import { Gesture, EventType as GestureEventType, IGestureEvent } from '../scrollable/touch';
type RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>; type RequestedMouseEvents = Record<'mouseup' | 'wheel' | 'mousedrag' | 'mousemove', EventListener | null>;
+8 -8
View File
@@ -3,14 +3,14 @@
* @license MIT * @license MIT
*/ */
import { RenderDebouncer } from 'browser/RenderDebouncer'; import { RenderDebouncer } from '../RenderDebouncer';
import { IRenderDebouncerWithCallback } from 'browser/Types'; import { IRenderDebouncerWithCallback } from '../Types';
import { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types'; import { IRenderDimensions, IRenderer } from '../renderer/shared/Types';
import { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services'; import { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from './Services';
import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; import { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';
import { DebouncedIdleTask } from 'common/TaskQueue'; import { DebouncedIdleTask } from '../../common/TaskQueue';
import { IBufferService, ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services'; import { IBufferService, ICoreService, IDecorationService, ILogService, IOptionsService } from '../../common/services/Services';
import { Emitter } from 'common/Event'; import { Emitter } from '../../common/Event';
interface ISelectionState { interface ISelectionState {
start: [number, number] | undefined; start: [number, number] | undefined;
+9 -10
View File
@@ -5,16 +5,15 @@
import { assert } from 'chai'; import { assert } from 'chai';
import { SelectionService, SelectionMode } from './SelectionService'; import { SelectionService, SelectionMode } from './SelectionService';
import { SelectionModel } from 'browser/selection/SelectionModel'; import { SelectionModel } from '../selection/SelectionModel';
import { IBufferLine } from 'common/Types'; import { IBuffer, IBufferLine } from '../../common/buffer/Types';
import { MockBufferService, MockOptionsService, MockCoreService, MockMouseStateService, createCellData } from 'common/TestUtils.test'; import { MockBufferService, MockOptionsService, MockCoreService, MockMouseStateService, createCellData } from '../../common/TestUtils.test';
import { BufferLine } from 'common/buffer/BufferLine'; import { BufferLine } from '../../common/buffer/BufferLine';
import { BufferLineStringCache } from 'common/buffer/BufferLineStringCache'; import { BufferLineStringCache } from '../../common/buffer/BufferLineStringCache';
import { IBufferService, IOptionsService } from 'common/services/Services'; import { IBufferService, IOptionsService } from '../../common/services/Services';
import { MockCoreBrowserService, MockMouseService, MockRenderService } from 'browser/TestUtils.test'; import { MockCoreBrowserService, MockMouseService, MockRenderService } from '../TestUtils.test';
import { CellData } from 'common/buffer/CellData'; import { CellData } from '../../common/buffer/CellData';
import { IBuffer } from 'common/buffer/Types'; import { IRenderService } from './Services';
import { IRenderService } from 'browser/services/Services';
const TEST_STRING_CACHE = new BufferLineStringCache(); const TEST_STRING_CACHE = new BufferLineStringCache();
+14 -14
View File
@@ -3,20 +3,20 @@
* @license MIT * @license MIT
*/ */
import { IBufferRange, ILinkifier2 } from 'browser/Types'; import { IBufferRange, ILinkifier2 } from '../Types';
import { getCoordsRelativeToElement } from 'browser/input/Mouse'; import { getCoordsRelativeToElement } from '../input/Mouse';
import { moveToCellSequence } from 'browser/input/MoveToCell'; import { moveToCellSequence } from '../input/MoveToCell';
import { SelectionModel } from 'browser/selection/SelectionModel'; import { SelectionModel } from '../selection/SelectionModel';
import { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types'; import { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';
import { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from 'browser/services/Services'; import { ICoreBrowserService, IMouseCoordsService, IRenderService, ISelectionService } from './Services';
import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; import { Disposable, MutableDisposable, toDisposable } from '../../common/Lifecycle';
import * as Browser from 'common/Platform'; import * as Browser from '../../common/Platform';
import { IBufferLine, ICellData, IDisposable } from 'common/Types'; import { IDisposable } from '../../common/Types';
import { getRangeLength } from 'common/buffer/BufferRange'; import { IBuffer, IBufferLine, ICellData } from '../../common/buffer/Types';
import { CellData } from 'common/buffer/CellData'; import { getRangeLength } from '../../common/buffer/BufferRange';
import { IBuffer } from 'common/buffer/Types'; import { CellData } from '../../common/buffer/CellData';
import { IBufferService, ICoreService, IMouseStateService, IOptionsService } from 'common/services/Services'; import { IBufferService, ICoreService, IMouseStateService, IOptionsService } from '../../common/services/Services';
import { Emitter } from 'common/Event'; import { Emitter } from '../../common/Event';
const enum Constants { const enum Constants {
/** /**
+6 -6
View File
@@ -3,12 +3,12 @@
* @license MIT * @license MIT
*/ */
import { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types'; import { IRenderDimensions, IRenderer } from '../renderer/shared/Types';
import { IColorSet, ILink, ReadonlyColorSet } from 'browser/Types'; import { IColorSet, ILink, ReadonlyColorSet } from '../Types';
import { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types'; import { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from '../selection/Types';
import { createDecorator } from 'common/services/ServiceRegistry'; import { createDecorator } from '../../common/services/ServiceRegistry';
import { AllColorIndex, IDisposable, IKeyboardResult } from 'common/Types'; import { AllColorIndex, IDisposable, IKeyboardResult } from '../../common/Types';
import type { IEvent } from 'common/Event'; import type { IEvent } from '../../common/Event';
export const ICharSizeService = createDecorator<ICharSizeService>('CharSizeService'); export const ICharSizeService = createDecorator<ICharSizeService>('CharSizeService');
export interface ICharSizeService { export interface ICharSizeService {
+3 -3
View File
@@ -5,9 +5,9 @@
import jsdom = require('jsdom'); import jsdom = require('jsdom');
import { assert } from 'chai'; import { assert } from 'chai';
import { ThemeService } from 'browser/services/ThemeService'; import { ThemeService } from './ThemeService';
import { OptionsService } from 'common/services/OptionsService'; import { OptionsService } from '../../common/services/OptionsService';
import { DEFAULT_ANSI_COLORS } from 'browser/Types'; import { DEFAULT_ANSI_COLORS } from '../Types';
describe('ThemeService', () => { describe('ThemeService', () => {
let themeService: ThemeService; let themeService: ThemeService;
+8 -8
View File
@@ -3,14 +3,14 @@
* @license MIT * @license MIT
*/ */
import { ColorContrastCache } from 'browser/ColorContrastCache'; import { ColorContrastCache } from '../ColorContrastCache';
import { IThemeService } from 'browser/services/Services'; import { IThemeService } from './Services';
import { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from 'browser/Types'; import { DEFAULT_ANSI_COLORS, IColorContrastCache, IColorSet, ReadonlyColorSet } from '../Types';
import { color, css, NULL_COLOR } from 'common/Color'; import { color, css, NULL_COLOR } from '../../common/Color';
import { Disposable } from 'common/Lifecycle'; import { Disposable } from '../../common/Lifecycle';
import { IOptionsService, ITheme } from 'common/services/Services'; import { IOptionsService, ITheme } from '../../common/services/Services';
import { AllColorIndex, IColor, SpecialColorIndex } from 'common/Types'; import { AllColorIndex, IColor, SpecialColorIndex } from '../../common/Types';
import { Emitter } from 'common/Event'; import { Emitter } from '../../common/Event';
interface IRestoreColorSet { interface IRestoreColorSet {
foreground: IColor; foreground: IColor;
+4 -6
View File
@@ -9,17 +9,15 @@
"types": [ "types": [
"../../node_modules/@types/mocha" "../../node_modules/@types/mocha"
], ],
"skipLibCheck": true, "skipLibCheck": true
"paths": {
"common/*": [ "./../common/*" ],
"*": [ "./../*" ]
}
}, },
"include": [ "include": [
"./**/*", "./**/*",
"../../typings/xterm.d.ts" "../../typings/xterm.d.ts"
], ],
"references": [ "references": [
{ "path": "../common" } {
"path": "../common"
}
] ]
} }
+1 -1
View File
@@ -5,7 +5,7 @@
* Minimal async helpers for xterm.js core. * Minimal async helpers for xterm.js core.
*/ */
import { DisposableStore, IDisposable, toDisposable } from 'common/Lifecycle'; import { DisposableStore, IDisposable, toDisposable } from './Lifecycle';
export function timeout(millis: number): Promise<void> { export function timeout(millis: number): Promise<void> {
return new Promise(resolve => setTimeout(resolve, millis)); return new Promise(resolve => setTimeout(resolve, millis));
+1 -1
View File
@@ -4,7 +4,7 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { CircularList } from 'common/CircularList'; import { CircularList } from './CircularList';
describe('CircularList', () => { describe('CircularList', () => {
describe('push', () => { describe('push', () => {
+24 -3
View File
@@ -3,9 +3,8 @@
* @license MIT * @license MIT
*/ */
import { ICircularList } from 'common/Types'; import { Disposable } from './Lifecycle';
import { Disposable } from 'common/Lifecycle'; import { Emitter, type IEvent } from './Event';
import { Emitter } from 'common/Event';
export interface IInsertEvent { export interface IInsertEvent {
index: number; index: number;
@@ -17,6 +16,28 @@ export interface IDeleteEvent {
amount: number; amount: number;
} }
export interface ICircularList<T> {
length: number;
maxLength: number;
isFull: boolean;
onDeleteEmitter: Emitter<IDeleteEvent>;
onDelete: IEvent<IDeleteEvent>;
onInsertEmitter: Emitter<IInsertEvent>;
onInsert: IEvent<IInsertEvent>;
onTrimEmitter: Emitter<number>;
onTrim: IEvent<number>;
get(index: number): T | undefined;
set(index: number, value: T): void;
push(value: T): void;
recycle(): T;
pop(): T | undefined;
splice(start: number, deleteCount: number, ...items: T[]): void;
trimStart(count: number): void;
shiftElements(start: number, count: number, offset: number): void;
}
/** /**
* Represents a circular list; a list with a maximum size that wraps around when push is called, * Represents a circular list; a list with a maximum size that wraps around when push is called,
* overriding values at the start of the list. * overriding values at the start of the list.
+1 -1
View File
@@ -4,7 +4,7 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { channels, color, css, rgb, rgba, toPaddedHex, contrastRatio } from 'common/Color'; import { channels, color, css, rgb, rgba, toPaddedHex, contrastRatio } from './Color';
describe('Color', () => { describe('Color', () => {
+4 -4
View File
@@ -3,7 +3,7 @@
* @license MIT * @license MIT
*/ */
import { IColor, IColorRGB } from 'common/Types'; import { IColor, IColorRGB } from './Types';
let $r = 0; let $r = 0;
let $g = 0; let $g = 0;
@@ -177,9 +177,9 @@ export namespace css {
// Formats: rgb() or rgba() // Formats: rgb() or rgba()
const rgbaMatch = css.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/); const rgbaMatch = css.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);
if (rgbaMatch) { if (rgbaMatch) {
$r = parseInt(rgbaMatch[1]); $r = parseInt(rgbaMatch[1], 10);
$g = parseInt(rgbaMatch[2]); $g = parseInt(rgbaMatch[2], 10);
$b = parseInt(rgbaMatch[3]); $b = parseInt(rgbaMatch[3], 10);
$a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF); $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);
return channels.toColor($r, $g, $b, $a); return channels.toColor($r, $g, $b, $a);
} }
+34 -18
View File
@@ -21,28 +21,43 @@
* http://linux.die.net/man/7/urxvt * http://linux.die.net/man/7/urxvt
*/ */
import { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, ITerminalOptions, IOscLinkService } from 'common/services/Services'; import { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, IMouseStateService, IUnicodeService, LogLevelEnum, IOscLinkService } from './services/Services';
import { InstantiationService } from 'common/services/InstantiationService'; import { InstantiationService } from './services/InstantiationService';
import { LogService } from 'common/services/LogService'; import { LogService } from './services/LogService';
import { BufferService, BufferServiceConstants } from 'common/services/BufferService'; import { BufferService, BufferServiceConstants } from './services/BufferService';
import { OptionsService } from 'common/services/OptionsService'; import { OptionsService } from './services/OptionsService';
import { IDisposable, IAttributeData, ICoreTerminal, IScrollEvent } from 'common/Types'; import { IDisposable, IScrollEvent, ITerminalOptions, IParams } from './Types';
import { CoreService } from 'common/services/CoreService'; import { IAttributeData, IBufferSet } from './buffer/Types';
import { MouseStateService } from 'common/services/MouseStateService'; import { CoreService } from './services/CoreService';
import { UnicodeService } from 'common/services/UnicodeService'; import { MouseStateService } from './services/MouseStateService';
import { CharsetService } from 'common/services/CharsetService'; import { UnicodeV6 } from './input/UnicodeV6';
import { updateWindowsModeWrappedState } from 'common/WindowsMode'; import { UnicodeService } from './services/UnicodeService';
import { IFunctionIdentifier, IParams } from 'common/parser/Types'; import { CharsetService } from './services/CharsetService';
import { IBufferSet } from 'common/buffer/Types'; import { updateWindowsModeWrappedState } from './WindowsMode';
import { InputHandler } from 'common/InputHandler'; import { IFunctionIdentifier } from './parser/Types';
import { WriteBuffer } from 'common/input/WriteBuffer'; import { InputHandler } from './InputHandler';
import { OscLinkService } from 'common/services/OscLinkService'; import { WriteBuffer } from './input/WriteBuffer';
import { Emitter, EventUtils, type IEvent } from 'common/Event'; import { OscLinkService } from './services/OscLinkService';
import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; import { Emitter, EventUtils, type IEvent } from './Event';
import { Disposable, MutableDisposable, toDisposable } from './Lifecycle';
// Only trigger this warning a single time per session // Only trigger this warning a single time per session
let hasWriteSyncWarnHappened = false; let hasWriteSyncWarnHappened = false;
export interface ICoreTerminal {
mouseStateService: IMouseStateService;
coreService: ICoreService;
optionsService: IOptionsService;
unicodeService: IUnicodeService;
buffers: IBufferSet;
options: Required<ITerminalOptions>;
registerCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean | Promise<boolean>): IDisposable;
registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean | Promise<boolean>): IDisposable;
registerEscHandler(id: IFunctionIdentifier, callback: () => boolean | Promise<boolean>): IDisposable;
registerOscHandler(ident: number, callback: (data: string) => boolean | Promise<boolean>): IDisposable;
registerApcHandler(id: IFunctionIdentifier, callback: (data: string) => boolean | Promise<boolean>): IDisposable;
}
export abstract class CoreTerminal extends Disposable implements ICoreTerminal { export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
protected readonly _instantiationService: IInstantiationService; protected readonly _instantiationService: IInstantiationService;
protected readonly _bufferService: IBufferService; protected readonly _bufferService: IBufferService;
@@ -116,6 +131,7 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService)); this.mouseStateService = this._register(this._instantiationService.createInstance(MouseStateService));
this._instantiationService.setService(IMouseStateService, this.mouseStateService); this._instantiationService.setService(IMouseStateService, this.mouseStateService);
this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService)); this.unicodeService = this._register(this._instantiationService.createInstance(UnicodeService));
this.unicodeService.register(new UnicodeV6());
this._instantiationService.setService(IUnicodeService, this.unicodeService); this._instantiationService.setService(IUnicodeService, this.unicodeService);
this._charsetService = this._instantiationService.createInstance(CharsetService); this._charsetService = this._instantiationService.createInstance(CharsetService);
this._instantiationService.setService(ICharsetService, this._charsetService); this._instantiationService.setService(ICharsetService, this._charsetService);
+1 -1
View File
@@ -4,7 +4,7 @@
*/ */
import { assert } from 'chai'; import { assert } from 'chai';
import { Emitter } from 'common/Event'; import { Emitter } from './Event';
describe('Emitter', () => { describe('Emitter', () => {
it('should fire with 0 listeners without error', () => { it('should fire with 0 listeners without error', () => {
+1 -1
View File
@@ -6,7 +6,7 @@
* Simplified from VS Code's event.ts - no leak detection/profiling. * Simplified from VS Code's event.ts - no leak detection/profiling.
*/ */
import { IDisposable, DisposableStore, toDisposable } from 'common/Lifecycle'; import { IDisposable, DisposableStore, toDisposable } from './Lifecycle';
export interface IEvent<T> { export interface IEvent<T> {
(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable; (listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;

Some files were not shown because too many files have changed in this diff Show More