Fix Windows issues, upgrade dependencies (#253)

* Debug parallels

* Try fix cwd issue

* Try fix parallels issue

* Upgrade Node.js to 22.11.0 to fix Parallels build crash

libuv 1.46.0 (Node 20) calls uv_fatal_error when AssignProcessToJobObject
fails with ERROR_INVALID_PARAMETER inside Parallels, aborting the node-gyp
process with STATUS_BREAKPOINT (exit 2147483651). libuv 1.48.0 (Node 22)
handles this gracefully. Also resolves the stale Node 18 TODO in the ARM
Linux action.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Delete ava for simplicity

* Fix typings

* Remove dangling references

* Try to cleanup properly

* Allow parallels to skip gpu

* Update yarn.lock

* Try to disable gpu

* Fix ts error

* Fix flag

* Launch dev tools

* Open DevTools before loadURL so it captures renderer errors on blank window

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Add verbose diagnostic logging to trace blank window / plugin crash

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Fix icons

* Fix icons again

* Add session creation logging to trace blank window after PTY rebuild

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Various versioning fixes

* Update gitignore

* Bump version correctly

* Fixes

* Remove msvs version lock

* Fix lint errors

* Fix lint errors

* Rebuild react icons

* Fixes

* Fixes

* Restore ava, formatting

* Upgrade node

* Fix yarn lockfile

* Fix ava reference

* Fixes

* Try to fix proxyquire

* Pre-build app TS declarations before unit tests

@ava/typescript calls `tsc --incremental` which doesn't build project
references, so dist/tmp/appdts/*.d.ts didn't exist when the root
tsconfig tried to use them, causing TS6305 errors. Running
`tsc -b app/tsconfig.json` first generates those declarations.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Make tests pass

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Philip Peterson 2026-05-03 04:52:41 -07:00 committed by GitHub
parent 58774e60d5
commit d057ccc6e9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
52 changed files with 1072 additions and 1605 deletions

View file

@ -79,11 +79,10 @@ runs:
pip3 install setuptools --break-system-packages || pip3 install setuptools
cd target
# TODO upgrade node to 20.11.0 to match NODE_VERSION
wget https://nodejs.org/dist/v18.16.0/node-v18.16.0-linux-${{ inputs.matrix-name }}.tar.xz
tar -xJf node-v18.16.0-linux-${{ inputs.matrix-name }}.tar.xz
sudo cp node-v18.16.0-linux-${{ inputs.matrix-name }}/* /usr/local/ -R
rm node-v18.16.0-linux-${{ inputs.matrix-name }}.tar.xz
wget https://nodejs.org/dist/v22.11.0/node-v22.11.0-linux-${{ inputs.matrix-name }}.tar.xz
tar -xJf node-v22.11.0-linux-${{ inputs.matrix-name }}.tar.xz
sudo cp node-v22.11.0-linux-${{ inputs.matrix-name }}/* /usr/local/ -R
rm -rf node-v22.11.0-linux-${{ inputs.matrix-name }}.tar.xz node-v22.11.0-linux-${{ inputs.matrix-name }}
cd ..
npm run rebuild-node-pty

View file

@ -157,16 +157,3 @@ runs:
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock', 'app/yarn.lock') }}
# - name: Run E2E Tests (non-Linux)
# if: runner.os != 'Linux'
# shell: bash
# run: yarn run test:e2e --verbose
#
# - name: Run E2E Tests on Linux
# if: runner.os == 'Linux'
# uses: GabrielBB/xvfb-action@v1.7
# with:
# run: |
# yarn run test
#

View file

@ -12,7 +12,7 @@ concurrency:
cancel-in-progress: true
env:
NODE_VERSION: 20.11.0
NODE_VERSION: 22.20.0
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# CSC_LINK: ${{ secrets.MAC_CERT_P12_BASE64 }}
# CSC_KEY_PASSWORD: ${{ secrets.MAC_CERT_P12_PASSWORD }}

View file

@ -11,7 +11,7 @@ concurrency:
cancel-in-progress: true
env:
NODE_VERSION: 20.11.0
NODE_VERSION: 22.20.0
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CSC_LINK: ${{ secrets.MAC_CERT_P12_BASE64 }}
CSC_KEY_PASSWORD: ${{ secrets.MAC_CERT_P12_PASSWORD }}

4
.gitignore vendored
View file

@ -4,6 +4,10 @@ app/renderer
target
bin/cli.*
cache
build/config.gypi
# claude code
.claude
# dependencies
node_modules

View file

@ -1 +1 @@
20.11.0
22.20.0

0
.npmrc Normal file
View file

2
.nvmrc
View file

@ -1 +1 @@
20.11.0
22.20.0

View file

@ -66,7 +66,9 @@ Regardless of the platform you are working on, you will need to have Yarn instal
1. Install necessary packages:
* Windows
- Be sure to run `yarn global add windows-build-tools` from an elevated prompt (as an administrator) to install `windows-build-tools`.
- Install [Visual Studio](https://visualstudio.microsoft.com/) (2022 or newer) with the **Desktop development with C++** workload.
- In the VS Installer under **Individual Components**, also install **Latest MSVC - VS C++ x64/x86 Spectre-mitigated libs** (required for building native Node modules).
- Install Node.js >=22.20.0 (the native module build toolchain requires it).
* macOS
- Once you have installed Yarn, you can skip this section!
* Linux (You can see [here](https://en.wikipedia.org/wiki/List_of_Linux_distributions) what your Linux is based on.)

View file

@ -14,12 +14,16 @@ if (['--help', '-v', '--version'].includes(process.argv[1])) {
// Enable remote module
// eslint-disable-next-line import/order
import {initialize as remoteInitialize} from '@electron/remote/main';
console.log('[main] initializing @electron/remote');
remoteInitialize();
console.log('[main] @electron/remote initialized');
// set up config
// eslint-disable-next-line import/order
import * as config from './config';
console.log('[main] setting up config');
config.setup();
console.log('[main] config setup complete');
// Native
import {resolve} from 'path';
@ -58,6 +62,10 @@ app.getLastFocusedWindow = () => {
console.log('Disabling Chromium GPU blacklist');
app.commandLine.appendSwitch('ignore-gpu-blacklist');
if (process.env.HYPER_DISABLE_GPU) {
app.commandLine.appendSwitch('in-process-gpu');
}
if (isDev) {
console.log('running in dev mode');
@ -78,20 +86,40 @@ async function installDevExtensions(isDev_: boolean) {
if (!isDev_) {
return [];
}
console.log('[main] loading electron-devtools-installer');
const {default: installer, REACT_DEVELOPER_TOOLS, REDUX_DEVTOOLS} = await import('electron-devtools-installer');
const extensions = [REACT_DEVELOPER_TOOLS, REDUX_DEVTOOLS];
const forceDownload = Boolean(process.env.UPGRADE_EXTENSIONS);
console.log('[main] installing devtools extensions, forceDownload:', forceDownload);
return Promise.all(
extensions.map((extension) => installer(extension, {forceDownload, loadExtensionOptions: {allowFileAccess: true}}))
extensions.map((extension) =>
installer(extension, {forceDownload, loadExtensionOptions: {allowFileAccess: true}})
.then((name) => {
console.log('[main] devtools extension installed:', name);
return name;
})
.catch((err) => {
console.warn('[main] devtools extension failed:', err.message);
})
)
);
}
// eslint-disable-next-line @typescript-eslint/no-misused-promises
app.on('ready', () =>
installDevExtensions(isDev)
app.on('ready', () => {
console.log(
'[main] app ready, electron version:',
process.versions.electron,
'node:',
process.versions.node,
'chrome:',
process.versions.chrome
);
return installDevExtensions(isDev)
.then(() => {
console.log('[main] devtools extensions done, creating window');
function createWindow(
fn?: (win: BrowserWindow) => void,
options: {size?: [number, number]; position?: [number, number]} = {},
@ -139,11 +167,36 @@ app.on('ready', () =>
[startX, startY] = config.windowDefaults.windowPosition;
}
console.log('[main] creating BrowserWindow', {width, height, x: startX, y: startY});
const hwin = newWindow({width, height, x: startX, y: startY}, cfg, fn, profileName);
windowSet.add(hwin);
console.log('[main] BrowserWindow created, id:', hwin.id);
hwin.webContents.on('did-start-loading', () => console.log('[main] renderer: did-start-loading'));
hwin.webContents.on('dom-ready', () => console.log('[main] renderer: dom-ready'));
hwin.webContents.on('did-finish-load', () => console.log('[main] renderer: did-finish-load'));
hwin.webContents.on('did-stop-loading', () => console.log('[main] renderer: did-stop-loading'));
hwin.webContents.on('did-fail-load', (_e, code, desc, url_) => {
console.error('[main] renderer: did-fail-load', code, desc, url_);
});
hwin.webContents.on('render-process-gone', (_e, details) => {
console.error('[main] renderer: process gone — reason:', details.reason, 'exitCode:', details.exitCode);
});
hwin.webContents.on('unresponsive', () => console.warn('[main] renderer: unresponsive'));
if (isDev) {
// hwin.webContents.openDevTools({mode: 'detach'});
hwin.webContents.on('console-message', (_e, level, message, line, sourceId) => {
const labels = ['verbose', 'info', 'warn', 'error'];
console.log(`[renderer:${labels[level] ?? level}] ${message} (${sourceId}:${line})`);
});
}
console.log('[main] loading URL:', url);
void hwin.loadURL(url);
hwin.once('ready-to-show', () => {
console.log('[main] renderer: ready-to-show, showing window');
hwin.show();
});
@ -213,9 +266,9 @@ app.on('ready', () =>
}
})
.catch((err) => {
console.error('Error while loading devtools extensions', err);
})
);
console.error('[main] fatal error during startup:', err);
});
});
/**
* Get last focused BrowserWindow or create new if none and callback

View file

@ -46,6 +46,6 @@
"native-reg": "1.1.1"
},
"devDependencies": {
"node-gyp": "^10.2.0"
"node-gyp": "^12.3.0"
}
}

View file

@ -260,7 +260,7 @@ export const subscribe = (fn: Function) => {
};
function getPaths() {
return {
const result = {
plugins: plugins.plugins.map((name) => {
return resolve(path, 'node_modules', name.split('#')[0]);
}),
@ -268,6 +268,8 @@ function getPaths() {
return resolve(localPath, name);
})
};
console.log('[plugins] paths:', JSON.stringify(result));
return result;
}
// expose to renderer
@ -280,13 +282,16 @@ export const getBasePaths = () => {
function requirePlugins(): any[] {
const {plugins: plugins_, localPlugins} = paths;
console.log('[plugins] requirePlugins: plugins=', plugins_, 'localPlugins=', localPlugins);
const load = (path_: string) => {
let mod: Record<string, any>;
console.log('[plugins] loading:', path_);
try {
mod = require(path_);
const exposed = mod && Object.keys(mod).some((key) => availableExtensions.has(key));
if (!exposed) {
console.warn('[plugins] plugin exposes no Hyper API methods:', path_);
notify('Plugin error!', `${`Plugin "${basename(path_)}" does not expose any `}Hyper extension API methods`);
return;
}
@ -299,13 +304,15 @@ function requirePlugins(): any[] {
} catch (err) {
console.warn(`No package.json found in ${path_}`);
}
console.log(`Plugin ${mod._name} (${mod._version}) loaded.`);
console.log(`[plugins] loaded: ${mod._name} (${mod._version})`);
return mod;
} catch (_err) {
const err = _err as {code: string; message: string};
const err = _err as {code: string; message: string; stack?: string};
console.error(`[plugins] failed to load "${basename(path_)}" (${path_}):`, err.message);
console.error('[plugins] stack:', err.stack);
if (err.code === 'MODULE_NOT_FOUND') {
console.warn(`Plugin error while loading "${basename(path_)}" (${path_}): ${err.message}`);
console.warn(`[plugins] MODULE_NOT_FOUND for "${basename(path_)}": ${err.message}`);
} else {
notify('Plugin error!', `Plugin "${basename(path_)}" failed to load (${err.message})`, {error: err});
}

View file

@ -111,6 +111,18 @@ export default class Session extends EventEmitter {
}
init({uid, rows, cols, cwd, shell: _shell, shellArgs: _shellArgs, profile}: SessionOptions) {
console.log(
'[session] init uid:',
uid,
'shell:',
_shell || defaultShell,
'cwd:',
cwd,
'rows:',
rows,
'cols:',
cols
);
this.profile = profile;
const envFromConfig = config.getProfileConfig(profile).env || {};
const defaultShellArgs = ['--login'];
@ -156,10 +168,14 @@ export default class Session extends EventEmitter {
options.useConpty = useConpty;
}
console.log('[session] spawning pty, shell:', shell, 'args:', shellArgs, 'useConpty:', options.useConpty);
try {
this.pty = spawn(shell, shellArgs, options);
console.log('[session] pty spawned, pid:', this.pty.pid);
} catch (_err) {
const err = _err as {message: string};
const err = _err as {message: string; stack?: string};
console.error('[session] pty spawn failed:', err.message);
console.error('[session] pty spawn stack:', err.stack);
if (/is not a function/.test(err.message)) {
throw createNodePtyError();
} else {

View file

@ -98,6 +98,7 @@ export function newWindow(
});
rpc.on('init', () => {
console.log('[window] received init from renderer');
window.show();
updateBackgroundColor();
@ -105,6 +106,7 @@ export function newWindow(
// a new session will be created by default.
if (!fn) {
fn = (win: BrowserWindow) => {
console.log('[window] emitting termgroup add req');
win.rpc.emit('termgroup add req', {});
};
}
@ -185,9 +187,12 @@ export function newWindow(
}
rpc.on('new', (extraOptions) => {
console.log('[window] received new session request, extraOptions:', JSON.stringify(extraOptions));
const {session, options} = createSession(extraOptions);
console.log('[window] session created, uid:', options.uid, 'pid:', session.pty?.pid ?? 'no pty');
sessions.set(options.uid, session);
console.log('[window] emitting session add, uid:', options.uid);
rpc.emit('session add', {
rows: options.rows,
cols: options.cols,

View file

@ -23,16 +23,8 @@
</symbol>
<symbol id="maximize-window" viewBox="0 0 10 10">
<title>maximize window</title>
<defs>
<polygon id="maximize-window-a" points="0 0 10 0 10 10 0 10"/>
<mask id="maximize-window-b" width="10" height="10" x="0" y="0">
<use xlink:href="#maximize-window-a"/>
</mask>
</defs>
<g fill="none" fill-rule="evenodd">
<polygon fill="none" points="0 0 10 0 10 10 0 10"/>
<use stroke="currentColor" stroke-width="2" mask="url(#maximize-window-b)" xlink:href="#maximize-window-a"/>
</g>
<rect x="0.5" y="0.5" width="9" height="9"
fill="none" stroke="currentColor" stroke-width="1"/>
</symbol>
<symbol id="restore-window" viewBox="0 0 10.2 10.2">
<title>restore window</title>

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -1,7 +1,11 @@
module.exports = {
files: ['test/unit/*'],
extensions: ['ts'],
require: ['ts-node/register/transpile-only'],
files: ['test/unit/**/*.ts'],
typescript: {
compile: 'tsc',
rewritePaths: {
'test/': 'dist/tmp/root/test/',
}
},
verbose: true,
// Due to permissions issues, Windows needs cache turned off
cache: false

27
bin/with-normalized-cwd.js vendored Normal file
View file

@ -0,0 +1,27 @@
'use strict';
const {execSync, spawnSync} = require('child_process');
const args = process.argv.slice(2);
if (process.platform === 'win32') {
const cwd = process.cwd();
if (cwd.startsWith('\\\\')) {
try {
const netUse = execSync('net use', {encoding: 'utf8'});
for (const line of netUse.split(/\r?\n/)) {
const m = line.match(/\b([A-Z]:)\s+(\\\\[^\s]+)/i);
if (m) {
const [, letter, unc] = m;
if (cwd.toLowerCase().startsWith(unc.toLowerCase())) {
const normalized = letter + cwd.slice(unc.length);
process.chdir(normalized);
break;
}
}
}
} catch (_) {}
}
}
const result = spawnSync(args[0], args.slice(1), {stdio: 'inherit', shell: true});
process.exit(result.status ?? 0);

View file

@ -53,6 +53,7 @@ export function requestTermGroup(_activeUid: string | undefined, _profile: strin
const {cwd} = ui;
const activeUid = _activeUid ? _activeUid : sessions.activeUid;
const profile = _profile ? _profile : activeUid ? sessions.sessions[activeUid].profile : window.profileName;
console.log('[renderer] emitting new session, profile:', profile, 'cwd:', cwd);
rpc.emit('new', {
isNewGroup: true,
cwd,

View file

@ -1,8 +1,8 @@
import React, {useRef, useState} from 'react';
import {VscChevronDown} from '../../react-icons/VscChevronDown';
import useClickAway from 'react-use/lib/useClickAway';
import {VscChevronDown} from '../../react-icons/VscChevronDown';
import type {configOptions} from '../../typings/config';
interface Props {

View file

@ -1,13 +1,13 @@
import React, {useCallback, useRef, useEffect, forwardRef} from 'react';
import clsx from 'clsx';
import {VscArrowDown} from '../../react-icons/VscArrowDown';
import {VscArrowUp} from '../../react-icons/VscArrowUp';
import {VscCaseSensitive} from '../../react-icons/VscCaseSensitive';
import {VscClose} from '../../react-icons/VscClose';
import {VscRegex} from '../../react-icons/VscRegex';
import {VscWholeWord} from '../../react-icons/VscWholeWord';
import clsx from 'clsx';
import type {SearchBoxProps} from '../../typings/hyper';
type SearchButtonColors = {

View file

@ -21,13 +21,17 @@ import * as config from './utils/config';
import {getBase64FileData} from './utils/file';
import * as plugins from './utils/plugins';
console.log('[renderer] index.tsx starting, platform:', process.platform);
// On Linux, the default zoom was somehow changed with Electron 3 (or maybe 2).
// Setting zoom factor to 1.2 brings back the normal default size
if (process.platform === 'linux') {
webFrame.setZoomFactor(1.2);
}
console.log('[renderer] configuring store');
const store_ = configureStore();
console.log('[renderer] store configured');
Object.defineProperty(window, 'store', {get: () => store_});
Object.defineProperty(window, 'rpc', {get: () => rpc});
@ -50,8 +54,10 @@ const fetchFileData = (configData: configOptions) => {
};
// initialize config
console.log('[renderer] loading config');
store_.dispatch(loadConfig(config.getConfig()));
fetchFileData(config.getConfig());
console.log('[renderer] config loaded');
config.subscribe(() => {
const configInfo = config.getConfig();
@ -67,9 +73,11 @@ config.subscribe(() => {
}
});
console.log('[renderer] setting up RPC');
// initialize communication with main electron process
// and subscribe to all user intents for example from menus
rpc.on('ready', () => {
console.log('[renderer] RPC ready');
store_.dispatch(init());
store_.dispatch(uiActions.setFontSmoothing());
});
@ -158,6 +166,7 @@ rpc.on('session search close', () => {
});
rpc.on('termgroup add req', ({activeUid, profile}) => {
console.log('[renderer] received termgroup add req, activeUid:', activeUid, 'profile:', profile);
store_.dispatch(termGroupActions.requestTermGroup(activeUid, profile));
});
@ -233,13 +242,17 @@ rpc.on('leave full screen', () => {
store_.dispatch(uiActions.leaveFullScreen());
});
const root = createRoot(document.getElementById('mount')!);
const mountEl = document.getElementById('mount');
console.log('[renderer] mount element:', mountEl ? 'found' : 'NOT FOUND — check index.html');
const root = createRoot(mountEl!);
console.log('[renderer] calling root.render');
root.render(
<Provider store={store_}>
<HyperContainer />
</Provider>
);
console.log('[renderer] root.render called');
rpc.on('reload', () => {
plugins.reload();

View file

@ -234,8 +234,11 @@ const getPluginVersion = (path: string): string | null => {
};
const loadModules = () => {
console.log('(re)loading renderer plugins');
console.log('[renderer:plugins] loadModules start');
const paths = plugins.getPaths();
console.log('[renderer:plugins] paths:', JSON.stringify(paths));
const loadedPluginVersions = plugins.getLoadedPluginVersions();
console.log('[renderer:plugins] loaded plugin versions from main:', JSON.stringify(loadedPluginVersions));
// initialize cache that we populate with extension methods
connectors = {
@ -266,20 +269,26 @@ const loadModules = () => {
reduceTermGroups: termGroupsReducers
};
const loadedPlugins = plugins.getLoadedPluginVersions().map((plugin: any) => plugin.name);
modules = paths.plugins
.concat(paths.localPlugins)
.filter((plugin) => loadedPlugins.indexOf(pathModule.basename(plugin)) !== -1)
const loadedPlugins = loadedPluginVersions.map((plugin: any) => plugin.name);
const allPaths = paths.plugins.concat(paths.localPlugins);
const filteredPaths = allPaths.filter((plugin) => loadedPlugins.indexOf(pathModule.basename(plugin)) !== -1);
console.log('[renderer:plugins] all paths:', allPaths);
console.log('[renderer:plugins] filtered paths (matched to loaded):', filteredPaths);
modules = filteredPaths
.map((path) => {
let mod: hyperPlugin;
const pluginName = getPluginName(path);
const pluginVersion = getPluginVersion(path);
console.log(`[renderer:plugins] requiring: ${pluginName} @ ${path}`);
// window.require allows us to ensure this doesn't get
// in the way of our build
try {
mod = window.require(path);
} catch (err) {
console.log(`[renderer:plugins] required ok: ${pluginName}`);
} catch (err: any) {
console.error(`[renderer:plugins] FAILED to require ${pluginName}:`, err?.message);
console.error(`[renderer:plugins] stack:`, err?.stack);
notify(
'Plugin load error',
`"${pluginName}" failed to load in the renderer process. Check Developer Tools for details.`,
@ -375,12 +384,13 @@ const loadModules = () => {
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
mod.onRendererWindow(window);
}
console.log(`Plugin ${pluginName} (${pluginVersion}) loaded.`);
console.log(`[renderer:plugins] loaded: ${pluginName} (${pluginVersion})`);
return mod;
})
.filter((mod): mod is hyperPlugin => Boolean(mod));
console.log(`[renderer:plugins] loadModules done, ${modules.length} plugins active`);
const deprecatedPlugins = plugins.getDeprecatedConfig();
Object.keys(deprecatedPlugins).forEach((name) => {
const {css} = deprecatedPlugins[name];

View file

@ -3,22 +3,23 @@
"version": "4.0.0-q-canary.8",
"repository": "quine-global/hyper",
"engines": {
"node": "20.11.0"
"node": "22.20.0"
},
"scripts": {
"start": "echo 'please run `yarn run dev` in one tab and then `yarn run app` in another one'",
"app": "cross-env ELECTRONMON_LOGLEVEL=error electronmon target",
"app:parallels": "cross-env ELECTRONMON_LOGLEVEL=error HYPER_DISABLE_GPU=1 electronmon target",
"dev": "concurrently -n \"Webpack,TypeScript\" -c \"cyan.bold,blue.bold\" \"webpack -w\" \"tsc --build -v --pretty --watch --preserveWatchOutput\" -k",
"ts": "tsc --build -v --pretty --preserveWatchOutput",
"build": "cross-env NODE_ENV=production webpack && tsc -b -v && cross-env BABEL_ENV=production babel target/renderer/bundle.js --out-file target/renderer/bundle.js --no-comments --minified",
"lint": "eslint . --fix --ext .js,.jsx,.ts,.tsx,.json",
"test": "yarn run lint && yarn run test:unit",
"test:unit": "cross-env DEBUG=ava:watcher AVA_IMPORT_FROM_PROJECT_NO_STUB=1 ava --no-cache",
"test:unit": "tsc -b app/tsconfig.json && node --eval \"const{cpSync,mkdirSync}=require('fs');const{basename}=require('path');mkdirSync('dist/tmp/root/app',{recursive:true});cpSync('target','dist/tmp/root/app',{recursive:true,filter:function(s){const b=basename(s);if(b==='node_modules'||b==='renderer')return false;return true;}})\" && cross-env DEBUG=ava:watcher AVA_IMPORT_FROM_PROJECT_NO_STUB=1 ava --no-cache",
"test:unit:watch": "yarn run test:unit -- --watch",
"test:e2e": "cross-env DEBUG=ava:watcher AVA_IMPORT_FROM_PROJECT_NO_STUB=1 ava --no-cache --config ava-e2e.config.js",
"postinstall": "yarn run v8-snapshot && webpack --config-name hyper-app && yarn run install-app-deps-with-retry && yarn run rebuild-node-pty && cpy --cwd=target node_modules \"../../app/\" && husky && yarn run generate-schema",
"install-app-deps-with-retry": "electron-builder install-app-deps || electron-builder install-app-deps || electron-builder install-app-deps",
"rebuild-node-pty": "electron-rebuild -f -o node-pty -m target",
"install-app-deps-with-retry": "node bin/with-normalized-cwd.js electron-builder install-app-deps || node bin/with-normalized-cwd.js electron-builder install-app-deps || node bin/with-normalized-cwd.js electron-builder install-app-deps",
"rebuild-node-pty": "node bin/with-normalized-cwd.js electron-rebuild -f -o node-pty -m target",
"dist": "yarn run build && yarn run electron-builder-with-retry",
"electron-builder-with-retry": "electron-builder -p never || electron-builder -p never || electron-builder -p never",
"clean": "node ./bin/rimraf-standalone.js node_modules && node ./bin/rimraf-standalone.js ./app/node_modules && node ./bin/rimraf-standalone.js ./app/renderer && node ./bin/rimraf-standalone.js ./target && node ./bin/rimraf-standalone.js ./dist",
@ -47,13 +48,11 @@
"@xterm/addon-webgl": "0.18.0",
"@xterm/xterm": "5.5.0",
"args": "5.0.3",
"ava": "https://github.com/quine-global/ava#79bc47b960f0fd28b376b9bd179c9af1cb701c45",
"chalk": "5.3.0",
"clsx": "2.1.1",
"color": "4.2.3",
"columnify": "1.6.0",
"css-loader": "7.1.2",
"electron-rebuild": "^3.2.9",
"got": "12.4.1",
"json-loader": "0.5.7",
"lodash": "4.17.21",
@ -81,8 +80,7 @@
"webpack-cli": "5.1.4"
},
"devDependencies": {
"@ava/babel": "2.0.0",
"@ava/typescript": "^4.1.0",
"@ava/typescript": "^6.0.0",
"@babel/cli": "7.25.9",
"@babel/core": "7.26.0",
"@babel/plugin-proposal-class-properties": "^7.18.6",
@ -91,7 +89,7 @@
"@babel/plugin-proposal-optional-chaining": "7.21.0",
"@babel/preset-react": "7.25.9",
"@babel/preset-typescript": "7.26.0",
"@electron/rebuild": "^3.7.2",
"@electron/rebuild": "^4.0.4",
"@types/args": "5.0.3",
"@types/async-retry": "1.4.9",
"@types/color": "3.0.6",
@ -102,6 +100,7 @@
"@types/ms": "0.7.34",
"@types/node": "22.9.3",
"@types/plist": "3.0.5",
"@types/proxyquire": "^1.3.31",
"@types/react": "18.3.12",
"@types/react-dom": "18.3.1",
"@types/seamless-immutable": "7.1.19",
@ -109,13 +108,14 @@
"@types/uuid": "10.0.0",
"@typescript-eslint/eslint-plugin": "7.0.0",
"@typescript-eslint/parser": "6.21.0",
"ava": "https://github.com/quine-global/ava#ad77c3bc92de51a3436c1be1acbb3da594e3251e",
"babel-loader": "9.2.1",
"concurrently": "9.1.0",
"copy-webpack-plugin": "12.0.2",
"cpy-cli": "^5.0.0",
"cross-env": "7.0.3",
"electron": "38.6.0",
"electron-builder": "26.0.13",
"electron-builder": "26.8.1",
"electron-link": "^0.6.0",
"electron-mksnapshot": "38.6.0",
"electronmon": "^2.0.3",
@ -133,7 +133,7 @@
"husky-init": "^8.0.0",
"inquirer": "10.1.8",
"node-addon-api": "8.2.2",
"node-gyp": "^10.2.0",
"node-gyp": "^12.3.0",
"null-loader": "4.0.1",
"parse-url": "9.2.0",
"playwright": "1.49.0",

View file

@ -1,3 +1,3 @@
// THIS FILE IS AUTO GENERATED
import { IconTree, IconType } from '../lib'
import type {IconType} from './lib';
export declare const VscArrowDown: IconType;

View file

@ -1,5 +1,18 @@
// THIS FILE IS AUTO GENERATED
import { GenIcon } from '../lib';
export function VscArrowDown (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M3.147 9l5 5h.707l5-5-.707-.707L9 12.439V2H8v10.44L3.854 8.292 3.147 9z"}}]})(props);
};
import {GenIcon} from './lib';
export function VscArrowDown(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M3.147 9l5 5h.707l5-5-.707-.707L9 12.439V2H8v10.44L3.854 8.292 3.147 9z'
}
}
]
})(props);
}

View file

@ -1,5 +1,17 @@
// THIS FILE IS AUTO GENERATED
var GenIcon = require('../lib').GenIcon
module.exports.VscArrowDown = function VscArrowDown (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M3.147 9l5 5h.707l5-5-.707-.707L9 12.439V2H8v10.44L3.854 8.292 3.147 9z"}}]})(props);
var GenIcon = require('./lib').GenIcon;
module.exports.VscArrowDown = function VscArrowDown(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M3.147 9l5 5h.707l5-5-.707-.707L9 12.439V2H8v10.44L3.854 8.292 3.147 9z'
}
}
]
})(props);
};

View file

@ -1,3 +1,3 @@
// THIS FILE IS AUTO GENERATED
import { IconTree, IconType } from '../lib'
import type {IconType} from './lib';
export declare const VscArrowUp: IconType;

View file

@ -1,5 +1,18 @@
// THIS FILE IS AUTO GENERATED
import { GenIcon } from '../lib';
export function VscArrowUp (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M13.854 7l-5-5h-.707l-5 5 .707.707L8 3.561V14h1V3.56l4.146 4.147.708-.707z"}}]})(props);
};
import {GenIcon} from './lib';
export function VscArrowUp(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M13.854 7l-5-5h-.707l-5 5 .707.707L8 3.561V14h1V3.56l4.146 4.147.708-.707z'
}
}
]
})(props);
}

View file

@ -1,5 +1,17 @@
// THIS FILE IS AUTO GENERATED
var GenIcon = require('../lib').GenIcon
module.exports.VscArrowUp = function VscArrowUp (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M13.854 7l-5-5h-.707l-5 5 .707.707L8 3.561V14h1V3.56l4.146 4.147.708-.707z"}}]})(props);
var GenIcon = require('./lib').GenIcon;
module.exports.VscArrowUp = function VscArrowUp(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M13.854 7l-5-5h-.707l-5 5 .707.707L8 3.561V14h1V3.56l4.146 4.147.708-.707z'
}
}
]
})(props);
};

View file

@ -1,3 +1,3 @@
// THIS FILE IS AUTO GENERATED
import { IconTree, IconType } from '../lib'
import type {IconType} from './lib';
export declare const VscCaseSensitive: IconType;

View file

@ -1,5 +1,18 @@
// THIS FILE IS AUTO GENERATED
import { GenIcon } from '../lib';
export function VscCaseSensitive (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M7.495 9.052l.891 2.35h1.091L6.237 3h-1.02L2 11.402h1.095l.838-2.35h3.562zM5.811 4.453l.044.135 1.318 3.574H4.255l1.307-3.574.044-.135.038-.156.032-.152.021-.126h.023l.024.126.029.152.038.156zm7.984 6.011v.936h.96V7.498c0-.719-.18-1.272-.539-1.661-.359-.389-.889-.583-1.588-.583-.199 0-.401.019-.606.056a4.875 4.875 0 0 0-1.078.326 2.081 2.081 0 0 0-.343.188v.984c.266-.23.566-.411.904-.54a2.927 2.927 0 0 1 1.052-.193c.188 0 .358.028.513.085a.98.98 0 0 1 .396.267c.109.121.193.279.252.472.059.193.088.427.088.7l-1.811.252c-.344.047-.64.126-.888.237a1.947 1.947 0 0 0-.615.419 1.6 1.6 0 0 0-.36.58 2.134 2.134 0 0 0-.117.721c0 .246.042.475.124.688.082.213.203.397.363.551.16.154.36.276.598.366.238.09.513.135.826.135.402 0 .76-.092 1.075-.278.315-.186.572-.454.771-.806h.023zm-2.128-1.743c.176-.064.401-.114.674-.149l1.465-.205v.609c0 .246-.041.475-.123.688a1.727 1.727 0 0 1-.343.557 1.573 1.573 0 0 1-.524.372 1.63 1.63 0 0 1-.668.135c-.187 0-.353-.025-.495-.076a1.03 1.03 0 0 1-.357-.211.896.896 0 0 1-.22-.316A1.005 1.005 0 0 1 11 9.732a1.6 1.6 0 0 1 .055-.44.739.739 0 0 1 .202-.334 1.16 1.16 0 0 1 .41-.237z"}}]})(props);
};
import {GenIcon} from './lib';
export function VscCaseSensitive(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M7.495 9.052l.891 2.35h1.091L6.237 3h-1.02L2 11.402h1.095l.838-2.35h3.562zM5.811 4.453l.044.135 1.318 3.574H4.255l1.307-3.574.044-.135.038-.156.032-.152.021-.126h.023l.024.126.029.152.038.156zm7.984 6.011v.936h.96V7.498c0-.719-.18-1.272-.539-1.661-.359-.389-.889-.583-1.588-.583-.199 0-.401.019-.606.056a4.875 4.875 0 0 0-1.078.326 2.081 2.081 0 0 0-.343.188v.984c.266-.23.566-.411.904-.54a2.927 2.927 0 0 1 1.052-.193c.188 0 .358.028.513.085a.98.98 0 0 1 .396.267c.109.121.193.279.252.472.059.193.088.427.088.7l-1.811.252c-.344.047-.64.126-.888.237a1.947 1.947 0 0 0-.615.419 1.6 1.6 0 0 0-.36.58 2.134 2.134 0 0 0-.117.721c0 .246.042.475.124.688.082.213.203.397.363.551.16.154.36.276.598.366.238.09.513.135.826.135.402 0 .76-.092 1.075-.278.315-.186.572-.454.771-.806h.023zm-2.128-1.743c.176-.064.401-.114.674-.149l1.465-.205v.609c0 .246-.041.475-.123.688a1.727 1.727 0 0 1-.343.557 1.573 1.573 0 0 1-.524.372 1.63 1.63 0 0 1-.668.135c-.187 0-.353-.025-.495-.076a1.03 1.03 0 0 1-.357-.211.896.896 0 0 1-.22-.316A1.005 1.005 0 0 1 11 9.732a1.6 1.6 0 0 1 .055-.44.739.739 0 0 1 .202-.334 1.16 1.16 0 0 1 .41-.237z'
}
}
]
})(props);
}

View file

@ -1,5 +1,17 @@
// THIS FILE IS AUTO GENERATED
var GenIcon = require('../lib').GenIcon
module.exports.VscCaseSensitive = function VscCaseSensitive (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M7.495 9.052l.891 2.35h1.091L6.237 3h-1.02L2 11.402h1.095l.838-2.35h3.562zM5.811 4.453l.044.135 1.318 3.574H4.255l1.307-3.574.044-.135.038-.156.032-.152.021-.126h.023l.024.126.029.152.038.156zm7.984 6.011v.936h.96V7.498c0-.719-.18-1.272-.539-1.661-.359-.389-.889-.583-1.588-.583-.199 0-.401.019-.606.056a4.875 4.875 0 0 0-1.078.326 2.081 2.081 0 0 0-.343.188v.984c.266-.23.566-.411.904-.54a2.927 2.927 0 0 1 1.052-.193c.188 0 .358.028.513.085a.98.98 0 0 1 .396.267c.109.121.193.279.252.472.059.193.088.427.088.7l-1.811.252c-.344.047-.64.126-.888.237a1.947 1.947 0 0 0-.615.419 1.6 1.6 0 0 0-.36.58 2.134 2.134 0 0 0-.117.721c0 .246.042.475.124.688.082.213.203.397.363.551.16.154.36.276.598.366.238.09.513.135.826.135.402 0 .76-.092 1.075-.278.315-.186.572-.454.771-.806h.023zm-2.128-1.743c.176-.064.401-.114.674-.149l1.465-.205v.609c0 .246-.041.475-.123.688a1.727 1.727 0 0 1-.343.557 1.573 1.573 0 0 1-.524.372 1.63 1.63 0 0 1-.668.135c-.187 0-.353-.025-.495-.076a1.03 1.03 0 0 1-.357-.211.896.896 0 0 1-.22-.316A1.005 1.005 0 0 1 11 9.732a1.6 1.6 0 0 1 .055-.44.739.739 0 0 1 .202-.334 1.16 1.16 0 0 1 .41-.237z"}}]})(props);
var GenIcon = require('./lib').GenIcon;
module.exports.VscCaseSensitive = function VscCaseSensitive(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M7.495 9.052l.891 2.35h1.091L6.237 3h-1.02L2 11.402h1.095l.838-2.35h3.562zM5.811 4.453l.044.135 1.318 3.574H4.255l1.307-3.574.044-.135.038-.156.032-.152.021-.126h.023l.024.126.029.152.038.156zm7.984 6.011v.936h.96V7.498c0-.719-.18-1.272-.539-1.661-.359-.389-.889-.583-1.588-.583-.199 0-.401.019-.606.056a4.875 4.875 0 0 0-1.078.326 2.081 2.081 0 0 0-.343.188v.984c.266-.23.566-.411.904-.54a2.927 2.927 0 0 1 1.052-.193c.188 0 .358.028.513.085a.98.98 0 0 1 .396.267c.109.121.193.279.252.472.059.193.088.427.088.7l-1.811.252c-.344.047-.64.126-.888.237a1.947 1.947 0 0 0-.615.419 1.6 1.6 0 0 0-.36.58 2.134 2.134 0 0 0-.117.721c0 .246.042.475.124.688.082.213.203.397.363.551.16.154.36.276.598.366.238.09.513.135.826.135.402 0 .76-.092 1.075-.278.315-.186.572-.454.771-.806h.023zm-2.128-1.743c.176-.064.401-.114.674-.149l1.465-.205v.609c0 .246-.041.475-.123.688a1.727 1.727 0 0 1-.343.557 1.573 1.573 0 0 1-.524.372 1.63 1.63 0 0 1-.668.135c-.187 0-.353-.025-.495-.076a1.03 1.03 0 0 1-.357-.211.896.896 0 0 1-.22-.316A1.005 1.005 0 0 1 11 9.732a1.6 1.6 0 0 1 .055-.44.739.739 0 0 1 .202-.334 1.16 1.16 0 0 1 .41-.237z'
}
}
]
})(props);
};

View file

@ -1,3 +1,3 @@
// THIS FILE IS AUTO GENERATED
import { IconTree, IconType } from '../lib'
import type {IconType} from './lib';
export declare const VscChevronDown: IconType;

View file

@ -1,5 +1,18 @@
// THIS FILE IS AUTO GENERATED
import { GenIcon } from '../lib';
export function VscChevronDown (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M7.976 10.072l4.357-4.357.62.618L8.284 11h-.618L3 6.333l.619-.618 4.357 4.357z"}}]})(props);
};
import {GenIcon} from './lib';
export function VscChevronDown(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M7.976 10.072l4.357-4.357.62.618L8.284 11h-.618L3 6.333l.619-.618 4.357 4.357z'
}
}
]
})(props);
}

View file

@ -1,5 +1,17 @@
// THIS FILE IS AUTO GENERATED
var GenIcon = require('../lib').GenIcon
module.exports.VscChevronDown = function VscChevronDown (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M7.976 10.072l4.357-4.357.62.618L8.284 11h-.618L3 6.333l.619-.618 4.357 4.357z"}}]})(props);
var GenIcon = require('./lib').GenIcon;
module.exports.VscChevronDown = function VscChevronDown(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M7.976 10.072l4.357-4.357.62.618L8.284 11h-.618L3 6.333l.619-.618 4.357 4.357z'
}
}
]
})(props);
};

View file

@ -1,3 +1,3 @@
// THIS FILE IS AUTO GENERATED
import { IconTree, IconType } from '../lib'
import type {IconType} from './lib';
export declare const VscClose: IconType;

View file

@ -1,5 +1,18 @@
// THIS FILE IS AUTO GENERATED
import { GenIcon } from '../lib';
export function VscClose (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M8 8.707l3.646 3.647.708-.707L8.707 8l3.647-3.646-.707-.708L8 7.293 4.354 3.646l-.707.708L7.293 8l-3.646 3.646.707.708L8 8.707z"}}]})(props);
};
import {GenIcon} from './lib';
export function VscClose(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M8 8.707l3.646 3.647.708-.707L8.707 8l3.647-3.646-.707-.708L8 7.293 4.354 3.646l-.707.708L7.293 8l-3.646 3.646.707.708L8 8.707z'
}
}
]
})(props);
}

View file

@ -1,5 +1,17 @@
// THIS FILE IS AUTO GENERATED
var GenIcon = require('../lib').GenIcon
module.exports.VscClose = function VscClose (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M8 8.707l3.646 3.647.708-.707L8.707 8l3.647-3.646-.707-.708L8 7.293 4.354 3.646l-.707.708L7.293 8l-3.646 3.646.707.708L8 8.707z"}}]})(props);
var GenIcon = require('./lib').GenIcon;
module.exports.VscClose = function VscClose(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M8 8.707l3.646 3.647.708-.707L8.707 8l3.647-3.646-.707-.708L8 7.293 4.354 3.646l-.707.708L7.293 8l-3.646 3.646.707.708L8 8.707z'
}
}
]
})(props);
};

View file

@ -1,3 +1,3 @@
// THIS FILE IS AUTO GENERATED
import { IconTree, IconType } from '../lib'
import type {IconType} from './lib';
export declare const VscRegex: IconType;

View file

@ -1,5 +1,18 @@
// THIS FILE IS AUTO GENERATED
import { GenIcon } from '../lib';
export function VscRegex (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M10.012 2h.976v3.113l2.56-1.557.486.885L11.47 6l2.564 1.559-.485.885-2.561-1.557V10h-.976V6.887l-2.56 1.557-.486-.885L9.53 6 6.966 4.441l.485-.885 2.561 1.557V2zM2 10h4v4H2v-4z"}}]})(props);
};
import {GenIcon} from './lib';
export function VscRegex(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M10.012 2h.976v3.113l2.56-1.557.486.885L11.47 6l2.564 1.559-.485.885-2.561-1.557V10h-.976V6.887l-2.56 1.557-.486-.885L9.53 6 6.966 4.441l.485-.885 2.561 1.557V2zM2 10h4v4H2v-4z'
}
}
]
})(props);
}

View file

@ -1,5 +1,17 @@
// THIS FILE IS AUTO GENERATED
var GenIcon = require('../lib').GenIcon
module.exports.VscRegex = function VscRegex (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M10.012 2h.976v3.113l2.56-1.557.486.885L11.47 6l2.564 1.559-.485.885-2.561-1.557V10h-.976V6.887l-2.56 1.557-.486-.885L9.53 6 6.966 4.441l.485-.885 2.561 1.557V2zM2 10h4v4H2v-4z"}}]})(props);
var GenIcon = require('./lib').GenIcon;
module.exports.VscRegex = function VscRegex(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M10.012 2h.976v3.113l2.56-1.557.486.885L11.47 6l2.564 1.559-.485.885-2.561-1.557V10h-.976V6.887l-2.56 1.557-.486-.885L9.53 6 6.966 4.441l.485-.885 2.561 1.557V2zM2 10h4v4H2v-4z'
}
}
]
})(props);
};

View file

@ -1,3 +1,3 @@
// THIS FILE IS AUTO GENERATED
import { IconTree, IconType } from '../lib'
import type {IconType} from './lib';
export declare const VscWholeWord: IconType;

View file

@ -1,5 +1,18 @@
// THIS FILE IS AUTO GENERATED
import { GenIcon } from '../lib';
export function VscWholeWord (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M1 2h14v1H1V2zm13 2h-1v8h1V4zm-2.728 4.387a2.353 2.353 0 0 0-.36-.786 1.746 1.746 0 0 0-.609-.53 1.832 1.832 0 0 0-.866-.193c-.198 0-.38.024-.547.073a1.76 1.76 0 0 0-.453.205 1.724 1.724 0 0 0-.365.318l-.179.258V4.578H7V12h.893v-.575l.126.175c.087.102.189.19.304.269.117.078.249.14.398.186.149.046.314.068.498.068.353 0 .666-.071.937-.212.272-.143.499-.338.682-.586.183-.25.321-.543.414-.879.093-.338.14-.703.14-1.097a3.756 3.756 0 0 0-.12-.962zM9.793 7.78c.151.071.282.176.39.314.109.14.194.313.255.517.051.174.082.371.089.587l-.007.125c0 .327-.033.62-.1.869a1.886 1.886 0 0 1-.278.614c-.117.162-.26.285-.421.366-.322.162-.76.166-1.069.015a1.264 1.264 0 0 1-.393-.296 1.273 1.273 0 0 1-.218-.367s-.179-.447-.179-.947c0-.5.179-1.002.179-1.002.062-.177.136-.318.224-.43.114-.143.256-.259.424-.345.168-.086.365-.129.587-.129.19 0 .364.037.517.109zM15 13H1v1h14v-1zM2.813 10l-.728 2.031H1l.025-.072 2.441-7.086h.941l2.485 7.158H5.81L5.032 10H2.813zm1.121-3.578h-.022l-.905 2.753h1.841l-.914-2.753z"}}]})(props);
};
import {GenIcon} from './lib';
export function VscWholeWord(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M1 2h14v1H1V2zm13 2h-1v8h1V4zm-2.728 4.387a2.353 2.353 0 0 0-.36-.786 1.746 1.746 0 0 0-.609-.53 1.832 1.832 0 0 0-.866-.193c-.198 0-.38.024-.547.073a1.76 1.76 0 0 0-.453.205 1.724 1.724 0 0 0-.365.318l-.179.258V4.578H7V12h.893v-.575l.126.175c.087.102.189.19.304.269.117.078.249.14.398.186.149.046.314.068.498.068.353 0 .666-.071.937-.212.272-.143.499-.338.682-.586.183-.25.321-.543.414-.879.093-.338.14-.703.14-1.097a3.756 3.756 0 0 0-.12-.962zM9.793 7.78c.151.071.282.176.39.314.109.14.194.313.255.517.051.174.082.371.089.587l-.007.125c0 .327-.033.62-.1.869a1.886 1.886 0 0 1-.278.614c-.117.162-.26.285-.421.366-.322.162-.76.166-1.069.015a1.264 1.264 0 0 1-.393-.296 1.273 1.273 0 0 1-.218-.367s-.179-.447-.179-.947c0-.5.179-1.002.179-1.002.062-.177.136-.318.224-.43.114-.143.256-.259.424-.345.168-.086.365-.129.587-.129.19 0 .364.037.517.109zM15 13H1v1h14v-1zM2.813 10l-.728 2.031H1l.025-.072 2.441-7.086h.941l2.485 7.158H5.81L5.032 10H2.813zm1.121-3.578h-.022l-.905 2.753h1.841l-.914-2.753z'
}
}
]
})(props);
}

View file

@ -1,5 +1,17 @@
// THIS FILE IS AUTO GENERATED
var GenIcon = require('../lib').GenIcon
module.exports.VscWholeWord = function VscWholeWord (props) {
return GenIcon({"tag":"svg","attr":{"viewBox":"0 0 16 16","fill":"currentColor"},"child":[{"tag":"path","attr":{"fillRule":"evenodd","clipRule":"evenodd","d":"M1 2h14v1H1V2zm13 2h-1v8h1V4zm-2.728 4.387a2.353 2.353 0 0 0-.36-.786 1.746 1.746 0 0 0-.609-.53 1.832 1.832 0 0 0-.866-.193c-.198 0-.38.024-.547.073a1.76 1.76 0 0 0-.453.205 1.724 1.724 0 0 0-.365.318l-.179.258V4.578H7V12h.893v-.575l.126.175c.087.102.189.19.304.269.117.078.249.14.398.186.149.046.314.068.498.068.353 0 .666-.071.937-.212.272-.143.499-.338.682-.586.183-.25.321-.543.414-.879.093-.338.14-.703.14-1.097a3.756 3.756 0 0 0-.12-.962zM9.793 7.78c.151.071.282.176.39.314.109.14.194.313.255.517.051.174.082.371.089.587l-.007.125c0 .327-.033.62-.1.869a1.886 1.886 0 0 1-.278.614c-.117.162-.26.285-.421.366-.322.162-.76.166-1.069.015a1.264 1.264 0 0 1-.393-.296 1.273 1.273 0 0 1-.218-.367s-.179-.447-.179-.947c0-.5.179-1.002.179-1.002.062-.177.136-.318.224-.43.114-.143.256-.259.424-.345.168-.086.365-.129.587-.129.19 0 .364.037.517.109zM15 13H1v1h14v-1zM2.813 10l-.728 2.031H1l.025-.072 2.441-7.086h.941l2.485 7.158H5.81L5.032 10H2.813zm1.121-3.578h-.022l-.905 2.753h1.841l-.914-2.753z"}}]})(props);
var GenIcon = require('./lib').GenIcon;
module.exports.VscWholeWord = function VscWholeWord(props) {
return GenIcon({
tag: 'svg',
attr: {viewBox: '0 0 16 16', fill: 'currentColor'},
child: [
{
tag: 'path',
attr: {
fillRule: 'evenodd',
clipRule: 'evenodd',
d: 'M1 2h14v1H1V2zm13 2h-1v8h1V4zm-2.728 4.387a2.353 2.353 0 0 0-.36-.786 1.746 1.746 0 0 0-.609-.53 1.832 1.832 0 0 0-.866-.193c-.198 0-.38.024-.547.073a1.76 1.76 0 0 0-.453.205 1.724 1.724 0 0 0-.365.318l-.179.258V4.578H7V12h.893v-.575l.126.175c.087.102.189.19.304.269.117.078.249.14.398.186.149.046.314.068.498.068.353 0 .666-.071.937-.212.272-.143.499-.338.682-.586.183-.25.321-.543.414-.879.093-.338.14-.703.14-1.097a3.756 3.756 0 0 0-.12-.962zM9.793 7.78c.151.071.282.176.39.314.109.14.194.313.255.517.051.174.082.371.089.587l-.007.125c0 .327-.033.62-.1.869a1.886 1.886 0 0 1-.278.614c-.117.162-.26.285-.421.366-.322.162-.76.166-1.069.015a1.264 1.264 0 0 1-.393-.296 1.273 1.273 0 0 1-.218-.367s-.179-.447-.179-.947c0-.5.179-1.002.179-1.002.062-.177.136-.318.224-.43.114-.143.256-.259.424-.345.168-.086.365-.129.587-.129.19 0 .364.037.517.109zM15 13H1v1h14v-1zM2.813 10l-.728 2.031H1l.025-.072 2.441-7.086h.941l2.485 7.158H5.81L5.032 10H2.813zm1.121-3.578h-.022l-.905 2.753h1.841l-.914-2.753z'
}
}
]
})(props);
};

View file

@ -0,0 +1,19 @@
import * as React from 'react';
export interface IconContext {
color?: string;
size?: string;
className?: string;
style?: React.CSSProperties;
attr?: React.SVGAttributes<SVGElement>;
}
export const DefaultContext: IconContext = {
color: undefined,
size: undefined,
className: undefined,
style: undefined,
attr: undefined
};
export const IconContext: React.Context<IconContext> = React.createContext(DefaultContext);

74
react-icons/lib.tsx Normal file
View file

@ -0,0 +1,74 @@
import React from 'react';
import {IconContext} from './iconContext';
export interface IconBaseProps extends React.SVGAttributes<SVGElement> {
children?: React.ReactNode;
size?: string | number;
color?: string;
title?: string;
}
export interface IconTree {
tag: string;
attr: {[key: string]: string};
child: IconTree[];
}
export function GenIcon(data: IconTree) {
return function GenIconInner(props: IconBaseProps) {
return (
<IconBase attr={{...data.attr}} {...props}>
{Tree2Element(data.child)}
</IconBase>
);
};
}
export interface IconBaseProps extends React.SVGAttributes<SVGElement> {
children?: React.ReactNode;
size?: string | number;
color?: string;
title?: string;
}
export type IconType = (props: IconBaseProps) => React.ReactNode;
export function IconBase(props: IconBaseProps & {attr?: Record<string, string>}): React.ReactElement {
const elem = (conf: IconContext) => {
const {attr, size, title, ...svgProps} = props;
const computedSize = size || conf.size || '1em';
let className;
if (conf.className) className = conf.className;
if (props.className) className = (className ? className + ' ' : '') + props.className;
return (
<svg
stroke="currentColor"
fill="currentColor"
strokeWidth="0"
{...conf.attr}
{...attr}
{...svgProps}
className={className}
style={{
color: props.color || conf.color,
...conf.style,
...props.style
}}
height={computedSize}
width={computedSize}
xmlns="http://www.w3.org/2000/svg"
>
{title && <title>{title}</title>}
{props.children}
</svg>
);
};
return <IconContext.Consumer>{(conf: IconContext) => elem(conf)}</IconContext.Consumer>;
}
function Tree2Element(tree: IconTree[]): React.ReactElement[] {
return tree.map((node, i) => React.createElement(node.tag, {key: i, ...node.attr}, Tree2Element(node.child)));
}

View file

@ -2,9 +2,9 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-call */
import test from 'ava';
import proxyquireLib from 'proxyquire';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const proxyquire = require('proxyquire').noCallThru();
const proxyquire = proxyquireLib.noCallThru();
test('existsOnNpm() builds the url for non-scoped packages', (t) => {
let getUrl: string;

View file

@ -1,7 +1,7 @@
import test from 'ava';
import toElectronBackgroundColor from '../../app/utils/to-electron-background-color';
import {isHexColor} from '../testUtils/is-hex-color';
import toElectronBackgroundColor from '../../app/utils/to-electron-background-color.js';
import {isHexColor} from '../testUtils/is-hex-color.js';
test('toElectronBackgroundColor', (t) => {
t.false(false);

View file

@ -1,13 +1,14 @@
// eslint-disable-next-line eslint-comments/disable-enable-pair
/* eslint-disable @typescript-eslint/no-unsafe-call */
import test from 'ava';
import proxyquireLib from 'proxyquire';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const proxyquire = require('proxyquire').noCallThru();
const proxyquire = proxyquireLib.noCallThru();
test('positionIsValid() returns true when window is on only screen', (t) => {
const position = [50, 50];
const windowUtils = proxyquire('../../app/utils/window-utils', {
const windowUtils = proxyquire('../../../../../target/utils/window-utils', {
electron: {
screen: {
getAllDisplays: () => {
@ -33,7 +34,7 @@ test('positionIsValid() returns true when window is on only screen', (t) => {
test('positionIsValid() returns true when window is on second screen', (t) => {
const position = [750, 50];
const windowUtils = proxyquire('../../app/utils/window-utils', {
const windowUtils = proxyquire('../../../../../target/utils/window-utils', {
electron: {
screen: {
getAllDisplays: () => {
@ -75,7 +76,7 @@ test('positionIsValid() returns false when position isnt valid', (t) => {
}
};
const position = [600, 50];
const windowUtils = proxyquire('../../app/utils/window-utils', {
const windowUtils = proxyquire('../../../../../target/utils/window-utils', {
electron: {
screen: {
getAllDisplays: () => {

View file

@ -5,11 +5,11 @@
"composite": true
},
"include": [
"./app/",
"./lib/",
"./test/",
"./cli/",
"./typings/"
"./typings/",
"./react-icons/"
],
"references": [
{

View file

@ -24,7 +24,7 @@ const config: webpack.Configuration[] = [
{
test: /\.(js|jsx|ts|tsx)$/,
exclude: /node_modules/,
loader: 'null-loader'
loader: require.resolve('null-loader')
}
]
},

1998
yarn.lock

File diff suppressed because it is too large Load diff