mirror of
https://github.com/quine-global/hyper.git
synced 2026-11-03 21:49:40 -09:00
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:
parent
58774e60d5
commit
d057ccc6e9
52 changed files with 1072 additions and 1605 deletions
9
.github/actions/build-linux-arm/action.yml
vendored
9
.github/actions/build-linux-arm/action.yml
vendored
|
|
@ -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
|
||||
|
|
|
|||
13
.github/actions/build/action.yml
vendored
13
.github/actions/build/action.yml
vendored
|
|
@ -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
|
||||
#
|
||||
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
|
|
@ -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 }}
|
||||
|
|
|
|||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
|
|
@ -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
4
.gitignore
vendored
|
|
@ -4,6 +4,10 @@ app/renderer
|
|||
target
|
||||
bin/cli.*
|
||||
cache
|
||||
build/config.gypi
|
||||
|
||||
# claude code
|
||||
.claude
|
||||
|
||||
# dependencies
|
||||
node_modules
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
20.11.0
|
||||
22.20.0
|
||||
|
|
|
|||
0
.npmrc
Normal file
0
.npmrc
Normal file
2
.nvmrc
2
.nvmrc
|
|
@ -1 +1 @@
|
|||
20.11.0
|
||||
22.20.0
|
||||
|
|
|
|||
|
|
@ -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.)
|
||||
|
|
|
|||
65
app/index.ts
65
app/index.ts
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -46,6 +46,6 @@
|
|||
"native-reg": "1.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"node-gyp": "^10.2.0"
|
||||
"node-gyp": "^12.3.0"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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
27
bin/with-normalized-cwd.js
vendored
Normal 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);
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 = {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
22
package.json
22
package.json
|
|
@ -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",
|
||||
|
|
|
|||
2
react-icons/VscArrowDown.d.ts
vendored
2
react-icons/VscArrowDown.d.ts
vendored
|
|
@ -1,3 +1,3 @@
|
|||
// THIS FILE IS AUTO GENERATED
|
||||
import { IconTree, IconType } from '../lib'
|
||||
import type {IconType} from './lib';
|
||||
export declare const VscArrowDown: IconType;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
20
react-icons/VscArrowDown.js
vendored
20
react-icons/VscArrowDown.js
vendored
|
|
@ -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);
|
||||
};
|
||||
|
|
|
|||
2
react-icons/VscArrowUp.d.ts
vendored
2
react-icons/VscArrowUp.d.ts
vendored
|
|
@ -1,3 +1,3 @@
|
|||
// THIS FILE IS AUTO GENERATED
|
||||
import { IconTree, IconType } from '../lib'
|
||||
import type {IconType} from './lib';
|
||||
export declare const VscArrowUp: IconType;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
20
react-icons/VscArrowUp.js
vendored
20
react-icons/VscArrowUp.js
vendored
|
|
@ -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);
|
||||
};
|
||||
|
|
|
|||
2
react-icons/VscCaseSensitive.d.ts
vendored
2
react-icons/VscCaseSensitive.d.ts
vendored
|
|
@ -1,3 +1,3 @@
|
|||
// THIS FILE IS AUTO GENERATED
|
||||
import { IconTree, IconType } from '../lib'
|
||||
import type {IconType} from './lib';
|
||||
export declare const VscCaseSensitive: IconType;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
20
react-icons/VscCaseSensitive.js
vendored
20
react-icons/VscCaseSensitive.js
vendored
|
|
@ -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);
|
||||
};
|
||||
|
|
|
|||
2
react-icons/VscChevronDown.d.ts
vendored
2
react-icons/VscChevronDown.d.ts
vendored
|
|
@ -1,3 +1,3 @@
|
|||
// THIS FILE IS AUTO GENERATED
|
||||
import { IconTree, IconType } from '../lib'
|
||||
import type {IconType} from './lib';
|
||||
export declare const VscChevronDown: IconType;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
20
react-icons/VscChevronDown.js
vendored
20
react-icons/VscChevronDown.js
vendored
|
|
@ -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);
|
||||
};
|
||||
|
|
|
|||
2
react-icons/VscClose.d.ts
vendored
2
react-icons/VscClose.d.ts
vendored
|
|
@ -1,3 +1,3 @@
|
|||
// THIS FILE IS AUTO GENERATED
|
||||
import { IconTree, IconType } from '../lib'
|
||||
import type {IconType} from './lib';
|
||||
export declare const VscClose: IconType;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
20
react-icons/VscClose.js
vendored
20
react-icons/VscClose.js
vendored
|
|
@ -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);
|
||||
};
|
||||
|
|
|
|||
2
react-icons/VscRegex.d.ts
vendored
2
react-icons/VscRegex.d.ts
vendored
|
|
@ -1,3 +1,3 @@
|
|||
// THIS FILE IS AUTO GENERATED
|
||||
import { IconTree, IconType } from '../lib'
|
||||
import type {IconType} from './lib';
|
||||
export declare const VscRegex: IconType;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
20
react-icons/VscRegex.js
vendored
20
react-icons/VscRegex.js
vendored
|
|
@ -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);
|
||||
};
|
||||
|
|
|
|||
2
react-icons/VscWholeWord.d.ts
vendored
2
react-icons/VscWholeWord.d.ts
vendored
|
|
@ -1,3 +1,3 @@
|
|||
// THIS FILE IS AUTO GENERATED
|
||||
import { IconTree, IconType } from '../lib'
|
||||
import type {IconType} from './lib';
|
||||
export declare const VscWholeWord: IconType;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
20
react-icons/VscWholeWord.js
vendored
20
react-icons/VscWholeWord.js
vendored
|
|
@ -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);
|
||||
};
|
||||
|
|
|
|||
19
react-icons/iconContext.ts
Normal file
19
react-icons/iconContext.ts
Normal 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
74
react-icons/lib.tsx
Normal 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)));
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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: () => {
|
||||
|
|
|
|||
|
|
@ -5,11 +5,11 @@
|
|||
"composite": true
|
||||
},
|
||||
"include": [
|
||||
"./app/",
|
||||
"./lib/",
|
||||
"./test/",
|
||||
"./cli/",
|
||||
"./typings/"
|
||||
"./typings/",
|
||||
"./react-icons/"
|
||||
],
|
||||
"references": [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ const config: webpack.Configuration[] = [
|
|||
{
|
||||
test: /\.(js|jsx|ts|tsx)$/,
|
||||
exclude: /node_modules/,
|
||||
loader: 'null-loader'
|
||||
loader: require.resolve('null-loader')
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
|
|||
Loading…
Reference in a new issue