Compare commits

...
Author SHA1 Message Date
Cursor AgentandDaniel Imms e83102070b Merge common/encoding and common/data into common/base
Move TextDecoder, Charsets, and EscapeSequences into the base layer.
Remove separate encoding and data composite projects; update imports
and explicit project references across common subprojects.

Co-authored-by: Daniel Imms <Tyriar@users.noreply.github.com>
2026-05-30 18:12:34 +00:00
42 changed files with 35 additions and 150 deletions
@@ -6,7 +6,7 @@
import { perfContext, before, ThroughputRuntimeCase } from 'xterm-benchmark';
import { spawn } from 'node-pty';
import { Utf8ToUtf32, stringFromCodePoint } from 'common/encoding/TextDecoder';
import { Utf8ToUtf32, stringFromCodePoint } from 'common/base/TextDecoder';
import { Terminal } from 'browser/public/Terminal';
import { SerializeAddon } from 'SerializeAddon';
@@ -6,7 +6,7 @@
import { perfContext, before, ThroughputRuntimeCase } from 'xterm-benchmark';
import { spawn } from 'node-pty';
import { Utf8ToUtf32, stringFromCodePoint } from 'common/encoding/TextDecoder';
import { Utf8ToUtf32, stringFromCodePoint } from 'common/base/TextDecoder';
import { CoreBrowserTerminal } from 'browser/CoreBrowserTerminal';
import { UnicodeGraphemeProvider } from 'UnicodeGraphemeProvider';
+1 -1
View File
@@ -51,7 +51,7 @@ import { ColorRequestType, IColorEvent, SpecialColorIndex } from 'common/termina
import { KeyboardResultType } from 'common/input/KeyboardTypes';
import { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';
import { IBuffer } from 'common/buffer/Types';
import { C0, C1ESCAPED } from 'common/data/EscapeSequences';
import { C0, C1ESCAPED } from 'common/base/EscapeSequences';
import { toRgbString } from 'common/input/XParseColor';
import { DecorationService } from 'common/services/DecorationService';
import { IDecorationService } from 'common/services/Services';
+1 -1
View File
@@ -10,7 +10,7 @@ import { IColorSet, ITerminal, ILinkifier2, IBrowser, IViewport, ICompositionHel
import { IBuffer, IBufferSet } from 'common/buffer/Types';
import type { ICircularList } from 'common/base/CircularList';
import type { IBufferLine, ICellData, IAttributeData } from 'common/buffer/CellTypes';
import type { ICharset } from 'common/data/Charsets';
import type { ICharset } from 'common/base/Charsets';
import type { ITerminalOptions } from 'common/services/Services';
import type { XtermListener } from 'common/terminal/CoreTerminalTypes';
import { ColorIndex } from 'common/terminal/InputHandlerTypes';
+1 -1
View File
@@ -5,7 +5,7 @@
import { IRenderService } from 'browser/services/Services';
import { IBufferService, ICoreService, IOptionsService } from 'common/services/Services';
import { C0 } from 'common/data/EscapeSequences';
import { C0 } from 'common/base/EscapeSequences';
interface IPosition {
start: number;
+1 -1
View File
@@ -3,7 +3,7 @@
* @license MIT
*/
import { C0 } from 'common/data/EscapeSequences';
import { C0 } from 'common/base/EscapeSequences';
import { IBufferService } from 'common/services/Services';
const enum Direction {
+1 -1
View File
@@ -7,7 +7,7 @@ import { addDisposableListener } from 'browser/Dom';
import { IBufferService, IMouseStateService, ICoreService, ILogService, IOptionsService } from 'common/services/Services';
import type { IDisposable } from 'common/base/Lifecycle';
import { CoreMouseAction, CoreMouseButton, CoreMouseEventType, ICoreMouseEvent } from 'common/services/Types';
import { C0 } from 'common/data/EscapeSequences';
import { C0 } from 'common/base/EscapeSequences';
import { DisposableStore, MutableDisposable, toDisposable } from 'common/base/Lifecycle';
import { ICoreBrowserService, IMouseCoordsService, IMouseService, IMouseServiceTarget, IRenderService, ISelectionService } from './Services';
import { Gesture, EventType as GestureEventType, IGestureEvent } from 'browser/scrollable/touch';
+3 -10
View File
@@ -9,16 +9,11 @@ flowchart BT
subgraph platform["Platform layer"]
direction LR
base["common/base"]
encoding["common/encoding"]
data["common/data"]
buffer["common/buffer"]
parser["common/parser"]
input["common/input"]
encoding --> base
data --> base
buffer --> encoding
buffer --> data
buffer --> base
parser --> buffer
input --> parser
end
@@ -42,14 +37,12 @@ flowchart BT
| Project | Role | Notable sources |
| --- | --- | --- |
| `common/base` | Core utilities (lifecycle, events, platform) | `Async`, `Event`, `Lifecycle`, `Platform`, `StringBuilder`, `Version`, `CircularList`, `Color`, `ColorTypes` |
| `common/encoding` | UTF conversion | `TextDecoder` (moved from `input/`) |
| `common/data` | Static terminal data | `Charsets`, `EscapeSequences` |
| `common/base` | Core utilities, UTF conversion, static terminal data | `Async`, `Event`, `Lifecycle`, `Color`, `TextDecoder`, `Charsets`, `EscapeSequences`, … |
| `common/buffer` | Screen buffer | `Buffer`, `BufferLine`, … |
| `common/parser` | Escape sequence parser | `EscapeSequenceParser`, … |
| `common/input` | Keyboard / write path helpers | `Keyboard`, `WriteBuffer`, … |
| `common/services` | DI service implementations | `Services`, `Types` (modes, mouse, osc link), … |
| `common/terminal` | Core terminal + input handler | `CoreTerminal`, `CoreTerminalTypes`, `InputHandler`, `InputHandlerTypes`, `WindowsMode` |
| `common/terminal` | Core terminal + input handler | `CoreTerminal`, `CoreTerminalTypes`, `InputHandler`, … |
| `common/public` | Public API adapters | `AddonManager`, buffer API views |
## TypeScript projects
@@ -4,7 +4,7 @@
*/
import { assert } from 'chai';
import { StringToUtf32, stringFromCodePoint, Utf8ToUtf32, utf32ToString } from 'common/encoding/TextDecoder';
import { StringToUtf32, stringFromCodePoint, Utf8ToUtf32, utf32ToString } from 'common/base/TextDecoder';
// convert UTF32 codepoints to string
-2
View File
@@ -14,8 +14,6 @@
"paths": {
"@xterm/xterm": ["../../../typings/xterm.d.ts"],
"common/base/*": ["./*"],
"common/encoding/*": ["../encoding/*"],
"common/data/*": ["../data/*"],
"common/buffer/*": ["../buffer/*"],
"common/parser/*": ["../parser/*"],
"common/input/*": ["../input/*"],
+2 -2
View File
@@ -7,7 +7,7 @@ import { CircularList, IInsertEvent } from 'common/base/CircularList';
import { Disposable, toDisposable } from 'common/base/Lifecycle';
import { IdleTaskQueue } from 'common/base/TaskQueue';
import type { IAttributeData, IBufferLine, ICellData } from 'common/buffer/CellTypes';
import type { ICharset } from 'common/data/Charsets';
import type { ICharset } from 'common/base/Charsets';
import type { IBufferService } from 'common/buffer/BufferService';
import type { IBufferOptionsService } from 'common/buffer/BufferOptions';
import type { IBufferLogService } from 'common/buffer/BufferLog';
@@ -19,7 +19,7 @@ import { CellData } from 'common/buffer/CellData';
import { NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, WHITESPACE_CELL_WIDTH } from 'common/buffer/Constants';
import { Marker } from 'common/buffer/Marker';
import { IBuffer } from 'common/buffer/Types';
import { DEFAULT_CHARSET } from 'common/data/Charsets';
import { DEFAULT_CHARSET } from 'common/base/Charsets';
export const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1
+1 -1
View File
@@ -7,7 +7,7 @@ import { CharData, IAttributeData, IBufferLine, ICellData, IExtendedAttrs } from
import { AttributeData } from 'common/buffer/AttributeData';
import { CellData } from 'common/buffer/CellData';
import { Attributes, BgFlags, CHAR_DATA_ATTR_INDEX, CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, Content, NULL_CELL_CHAR, NULL_CELL_CODE, NULL_CELL_WIDTH, WHITESPACE_CELL_CHAR } from 'common/buffer/Constants';
import { stringFromCodePoint } from 'common/encoding/TextDecoder';
import { stringFromCodePoint } from 'common/base/TextDecoder';
import { StringBuilder } from 'common/base/StringBuilder';
// Buffer memory layout:
+1 -1
View File
@@ -4,7 +4,7 @@
*/
import { CharData, ICellData, IExtendedAttrs } from 'common/buffer/CellTypes';
import { stringFromCodePoint } from 'common/encoding/TextDecoder';
import { stringFromCodePoint } from 'common/base/TextDecoder';
import { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';
import { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';
import type { IBufferCell as IBufferCellApi } from '@xterm/xterm';
+1 -1
View File
@@ -7,7 +7,7 @@ import type { ICircularList } from 'common/base/CircularList';
import type { IDisposable } from 'common/base/Lifecycle';
import type { IEvent } from 'common/base/Event';
import type { IAttributeData, IBufferLine, ICellData, IMarker } from 'common/buffer/CellTypes';
import type { ICharset } from 'common/data/Charsets';
import type { ICharset } from 'common/base/Charsets';
// BufferIndex denotes a position in the buffer: [rowIndex, colIndex]
export type BufferIndex = [number, number];
+1 -5
View File
@@ -14,8 +14,6 @@
"paths": {
"@xterm/xterm": ["../../../typings/xterm.d.ts"],
"common/base/*": ["../base/*"],
"common/encoding/*": ["../encoding/*"],
"common/data/*": ["../data/*"],
"common/buffer/*": ["./*"],
"common/parser/*": ["../parser/*"],
"common/input/*": ["../input/*"],
@@ -36,8 +34,6 @@
"**/*.test.ts"
],
"references": [
{ "path": "../base" },
{ "path": "../encoding" },
{ "path": "../data" }
{ "path": "../base" }
]
}
-40
View File
@@ -1,40 +0,0 @@
{
"extends": "../../tsconfig-library-base",
"compilerOptions": {
"lib": [
"es2015",
"es2016.Array.Include",
"es2019.string",
"es2021.weakref",
"dom"
],
"types": [
"../../../node_modules/@types/mocha"
],
"paths": {
"@xterm/xterm": ["../../../typings/xterm.d.ts"],
"common/base/*": ["../base/*"],
"common/encoding/*": ["../encoding/*"],
"common/data/*": ["./*"],
"common/buffer/*": ["../buffer/*"],
"common/parser/*": ["../parser/*"],
"common/input/*": ["../input/*"],
"common/services/*": ["../services/*"],
"common/terminal/*": ["../terminal/*"],
"common/public/*": ["../public/*"],
"common/*": ["../*"],
"*": ["../../*"]
},
"outDir": "../../../out/common/data",
"rootDir": "."
},
"include": [
"./**/*"
],
"exclude": [
"**/*.test.ts"
],
"references": [
{ "path": "../base" }
]
}
-40
View File
@@ -1,40 +0,0 @@
{
"extends": "../../tsconfig-library-base",
"compilerOptions": {
"lib": [
"es2015",
"es2016.Array.Include",
"es2019.string",
"es2021.weakref",
"dom"
],
"types": [
"../../../node_modules/@types/mocha"
],
"paths": {
"@xterm/xterm": ["../../../typings/xterm.d.ts"],
"common/base/*": ["../base/*"],
"common/encoding/*": ["./*"],
"common/data/*": ["../data/*"],
"common/buffer/*": ["../buffer/*"],
"common/parser/*": ["../parser/*"],
"common/input/*": ["../input/*"],
"common/services/*": ["../services/*"],
"common/terminal/*": ["../terminal/*"],
"common/public/*": ["../public/*"],
"common/*": ["../*"],
"*": ["../../*"]
},
"outDir": "../../../out/common/encoding",
"rootDir": "."
},
"include": [
"./**/*"
],
"exclude": [
"**/*.test.ts"
],
"references": [
{ "path": "../base" }
]
}
+1 -1
View File
@@ -5,7 +5,7 @@
*/
import { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/input/KeyboardTypes';
import { C0 } from 'common/data/EscapeSequences';
import { C0 } from 'common/base/EscapeSequences';
// reg + shift key mappings for digits and special chars
const KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {
+1 -1
View File
@@ -7,7 +7,7 @@
*/
import { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/input/KeyboardTypes';
import { C0 } from 'common/data/EscapeSequences';
import { C0 } from 'common/base/EscapeSequences';
/**
* Kitty keyboard protocol enhancement flags (bitfield).
+1 -1
View File
@@ -15,7 +15,7 @@
*/
import { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/input/KeyboardTypes';
import { C0 } from 'common/data/EscapeSequences';
import { C0 } from 'common/base/EscapeSequences';
/**
* Win32 control key state flags (from Windows API).
-4
View File
@@ -14,8 +14,6 @@
"paths": {
"@xterm/xterm": ["../../../typings/xterm.d.ts"],
"common/base/*": ["../base/*"],
"common/encoding/*": ["../encoding/*"],
"common/data/*": ["../data/*"],
"common/buffer/*": ["../buffer/*"],
"common/parser/*": ["../parser/*"],
"common/input/*": ["./*"],
@@ -36,8 +34,6 @@
],
"references": [
{ "path": "../base" },
{ "path": "../encoding" },
{ "path": "../data" },
{ "path": "../buffer" },
{ "path": "../parser" }
]
+1 -1
View File
@@ -4,7 +4,7 @@
*/
import { assert } from 'chai';
import { ApcParser, ApcHandler } from 'common/parser/ApcParser';
import { StringToUtf32, utf32ToString } from 'common/encoding/TextDecoder';
import { StringToUtf32, utf32ToString } from 'common/base/TextDecoder';
import { IApcHandler, IFunctionIdentifier } from 'common/parser/Types';
function toUtf32(s: string): Uint32Array {
+1 -1
View File
@@ -5,7 +5,7 @@
import { IApcHandler, IHandlerCollection, ApcFallbackHandlerType, IApcParser, ISubParserStackState } from 'common/parser/Types';
import { ParserConstants } from 'common/parser/Constants';
import { utf32ToString } from 'common/encoding/TextDecoder';
import { utf32ToString } from 'common/base/TextDecoder';
import { IDisposable } from 'common/base/Lifecycle';
import { LimitedStringBuilder } from 'common/base/StringBuilder';
+1 -1
View File
@@ -5,7 +5,7 @@
import { assert } from 'chai';
import { DcsParser, DcsHandler } from 'common/parser/DcsParser';
import { IDcsHandler, IParams, IFunctionIdentifier } from 'common/parser/Types';
import { utf32ToString, StringToUtf32 } from 'common/encoding/TextDecoder';
import { utf32ToString, StringToUtf32 } from 'common/base/TextDecoder';
import { Params } from 'common/parser/Params';
function toUtf32(s: string): Uint32Array {
+1 -1
View File
@@ -5,7 +5,7 @@
import { IDisposable } from 'common/base/Lifecycle';
import { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType, ISubParserStackState } from 'common/parser/Types';
import { utf32ToString } from 'common/encoding/TextDecoder';
import { utf32ToString } from 'common/base/TextDecoder';
import { Params } from 'common/parser/Params';
import { ParserConstants } from 'common/parser/Constants';
import { LimitedStringBuilder } from 'common/base/StringBuilder';
@@ -6,7 +6,7 @@
import { IParsingState, IParams, ParamsArray, IOscParser, IOscHandler, OscFallbackHandlerType, IFunctionIdentifier, IParserStackState, ParserStackType } from 'common/parser/Types';
import { EscapeSequenceParser, TransitionTable, VT500_TRANSITION_TABLE } from 'common/parser/EscapeSequenceParser';
import { assert } from 'chai';
import { StringToUtf32, stringFromCodePoint, utf32ToString } from 'common/encoding/TextDecoder';
import { StringToUtf32, stringFromCodePoint, utf32ToString } from 'common/base/TextDecoder';
import { ParserState } from 'common/parser/Constants';
import { Params } from 'common/parser/Params';
import { OscHandler } from 'common/parser/OscParser';
+1 -1
View File
@@ -4,7 +4,7 @@
*/
import { assert } from 'chai';
import { OscParser, OscHandler } from 'common/parser/OscParser';
import { StringToUtf32, utf32ToString } from 'common/encoding/TextDecoder';
import { StringToUtf32, utf32ToString } from 'common/base/TextDecoder';
import { IOscHandler } from 'common/parser/Types';
function toUtf32(s: string): Uint32Array {
+1 -1
View File
@@ -5,7 +5,7 @@
import { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser, ISubParserStackState } from 'common/parser/Types';
import { OscState, ParserConstants } from 'common/parser/Constants';
import { utf32ToString } from 'common/encoding/TextDecoder';
import { utf32ToString } from 'common/base/TextDecoder';
import { IDisposable } from 'common/base/Lifecycle';
import { LimitedStringBuilder } from 'common/base/StringBuilder';
-4
View File
@@ -14,8 +14,6 @@
"paths": {
"@xterm/xterm": ["../../../typings/xterm.d.ts"],
"common/base/*": ["../base/*"],
"common/encoding/*": ["../encoding/*"],
"common/data/*": ["../data/*"],
"common/buffer/*": ["../buffer/*"],
"common/parser/*": ["./*"],
"common/input/*": ["../input/*"],
@@ -36,8 +34,6 @@
],
"references": [
{ "path": "../base" },
{ "path": "../encoding" },
{ "path": "../data" },
{ "path": "../buffer" }
]
}
-4
View File
@@ -14,8 +14,6 @@
"paths": {
"@xterm/xterm": ["../../../typings/xterm.d.ts"],
"common/base/*": ["../base/*"],
"common/encoding/*": ["../encoding/*"],
"common/data/*": ["../data/*"],
"common/buffer/*": ["../buffer/*"],
"common/parser/*": ["../parser/*"],
"common/input/*": ["../input/*"],
@@ -37,8 +35,6 @@
],
"references": [
{ "path": "../base" },
{ "path": "../encoding" },
{ "path": "../data" },
{ "path": "../buffer" },
{ "path": "../parser" },
{ "path": "../input" },
+1 -1
View File
@@ -4,7 +4,7 @@
*/
import { ICharsetService } from 'common/services/Services';
import type { ICharset } from 'common/data/Charsets';
import type { ICharset } from 'common/base/Charsets';
export class CharsetService implements ICharsetService {
public serviceBrand: any;
+1 -1
View File
@@ -5,7 +5,7 @@
import type { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty, IOverviewRulerOptions } from '@xterm/xterm';
import type { IAttributeData } from 'common/buffer/CellTypes';
import type { ICharset } from 'common/data/Charsets';
import type { ICharset } from 'common/base/Charsets';
import type { IColor } from 'common/base/ColorTypes';
import type { IDisposable } from 'common/base/Lifecycle';
import type { IWindowOptions } from 'common/input/WindowOptions';
-4
View File
@@ -14,8 +14,6 @@
"paths": {
"@xterm/xterm": ["../../../typings/xterm.d.ts"],
"common/base/*": ["../base/*"],
"common/encoding/*": ["../encoding/*"],
"common/data/*": ["../data/*"],
"common/buffer/*": ["../buffer/*"],
"common/parser/*": ["../parser/*"],
"common/input/*": ["../input/*"],
@@ -37,8 +35,6 @@
],
"references": [
{ "path": "../base" },
{ "path": "../encoding" },
{ "path": "../data" },
{ "path": "../buffer" },
{ "path": "../parser" },
{ "path": "../input" }
+3 -3
View File
@@ -8,10 +8,10 @@ import type { IAttributeData } from 'common/buffer/CellTypes';
import { Disposable, type IDisposable } from 'common/base/Lifecycle';
import type { IWindowOptions } from 'common/input/WindowOptions';
import { IInputHandler, IColorEvent, IParseStack, ColorIndex, ColorRequestType, SpecialColorIndex } from 'common/terminal/InputHandlerTypes';
import { C0, C1 } from 'common/data/EscapeSequences';
import { CHARSETS, DEFAULT_CHARSET } from 'common/data/Charsets';
import { C0, C1 } from 'common/base/EscapeSequences';
import { CHARSETS, DEFAULT_CHARSET } from 'common/base/Charsets';
import { EscapeSequenceParser } from 'common/parser/EscapeSequenceParser';
import { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from 'common/encoding/TextDecoder';
import { StringToUtf32, stringFromCodePoint, Utf8ToUtf32 } from 'common/base/TextDecoder';
import { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';
import { IParsingState, IEscapeSequenceParser, IParams, IFunctionIdentifier } from 'common/parser/Types';
import { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from 'common/buffer/Constants';
+1 -1
View File
@@ -9,7 +9,7 @@ import { DEFAULT_OPTIONS } from 'common/services/OptionsService';
import { IBufferSet, IBuffer } from 'common/buffer/Types';
import { BufferSet } from 'common/buffer/BufferSet';
import type { IAttributeData, IBufferLine, IExtendedAttrs } from 'common/buffer/CellTypes';
import type { ICharset } from 'common/data/Charsets';
import type { ICharset } from 'common/base/Charsets';
import type { IDisposable } from 'common/base/Lifecycle';
import { CoreMouseEventType, ICoreMouseEvent, IDecPrivateModes, IKittyKeyboardState, IModes, IOscLinkData } from 'common/services/Types';
import { UnicodeV6 } from 'common/input/UnicodeV6';
-4
View File
@@ -14,8 +14,6 @@
"paths": {
"@xterm/xterm": ["../../../typings/xterm.d.ts"],
"common/base/*": ["../base/*"],
"common/encoding/*": ["../encoding/*"],
"common/data/*": ["../data/*"],
"common/buffer/*": ["../buffer/*"],
"common/parser/*": ["../parser/*"],
"common/input/*": ["../input/*"],
@@ -37,8 +35,6 @@
],
"references": [
{ "path": "../base" },
{ "path": "../encoding" },
{ "path": "../data" },
{ "path": "../buffer" },
{ "path": "../parser" },
{ "path": "../input" },
-2
View File
@@ -3,8 +3,6 @@
"files": [],
"references": [
{ "path": "./base" },
{ "path": "./encoding" },
{ "path": "./data" },
{ "path": "./buffer" },
{ "path": "./parser" },
{ "path": "./input" },
@@ -5,7 +5,7 @@
import { perfContext, before, beforeEach, ThroughputRuntimeCase } from 'xterm-benchmark';
import { EscapeSequenceParser } from 'common/parser/EscapeSequenceParser';
import { C0, C1 } from 'common/data/EscapeSequences';
import { C0, C1 } from 'common/base/EscapeSequences';
import { IDcsHandler, IOscHandler, IApcHandler, IParams } from 'common/parser/Types';
import { OscHandler } from 'common/parser/OscParser';
import { DcsHandler } from 'common/parser/DcsParser';
+1 -1
View File
@@ -6,7 +6,7 @@
import { perfContext, before, ThroughputRuntimeCase } from 'xterm-benchmark';
import { spawn } from 'node-pty';
import { Utf8ToUtf32, stringFromCodePoint } from 'common/encoding/TextDecoder';
import { Utf8ToUtf32, stringFromCodePoint } from 'common/base/TextDecoder';
import { CoreBrowserTerminal } from 'browser/CoreBrowserTerminal';
perfContext('Terminal: ls -lR /usr/lib', () => {