From 49c757ffb0872f43de026b9efa48ee4d6eb26b6d Mon Sep 17 00:00:00 2001 From: ewnd9 Date: Fri, 29 Aug 2025 11:59:53 +0300 Subject: [PATCH 1/4] change .js to .ts and apply require-to-import codemod --- CLAUDE.md | 69 +++++++++++++++ mise.toml | 2 + package.json | 6 +- packages/belt-cli/cli.js | 83 +------------------ packages/belt-cli/package.json | 17 +++- .../commands/flash-drive.ts} | 8 +- .../commands/incantation/index.ts} | 11 ++- .../commands/incantation/utils.ts} | 16 ++-- .../{ => src}/commands/init/README.md | 0 .../index.js => src/commands/init/index.ts} | 32 +++---- .../commands/install-deps.ts} | 19 ++--- .../commands/licensify.ts} | 8 +- .../commands/lint-shell.ts} | 10 +-- .../commands/provision/index.ts} | 10 +-- .../commands/provision/tasks/apt.ts} | 6 +- .../commands/provision/tasks/atom.ts} | 8 +- .../commands/provision/tasks/brew.ts} | 12 +-- .../commands/provision/tasks/code.ts} | 9 +- .../commands/provision/tasks/npm.ts} | 8 +- .../commands/provision/tasks/submodules.ts} | 14 ++-- .../commands/provision/tasks/symlinks.ts} | 12 +-- .../commands/provision/utils.ts} | 12 +-- .../commands/repo-open.ts} | 9 +- packages/belt-cli/src/index.ts | 81 ++++++++++++++++++ .../execa.js => src/modules/execa.ts} | 8 +- .../{modules/log.js => src/modules/log.ts} | 8 +- .../{modules/opn.js => src/modules/opn.ts} | 8 +- packages/belt-cli/src/types.d.ts | 4 + packages/belt-cli/tsconfig.json | 13 +++ tsconfig.json | 3 + yarn.lock | 65 ++++++++++++++- 31 files changed, 369 insertions(+), 202 deletions(-) create mode 100644 CLAUDE.md create mode 100644 mise.toml rename packages/belt-cli/{commands/flash-drive.js => src/commands/flash-drive.ts} (92%) rename packages/belt-cli/{commands/incantation/index.js => src/commands/incantation/index.ts} (92%) rename packages/belt-cli/{commands/incantation/utils.js => src/commands/incantation/utils.ts} (88%) rename packages/belt-cli/{ => src}/commands/init/README.md (100%) rename packages/belt-cli/{commands/init/index.js => src/commands/init/index.ts} (86%) rename packages/belt-cli/{commands/install-deps.js => src/commands/install-deps.ts} (79%) rename packages/belt-cli/{commands/licensify.js => src/commands/licensify.ts} (86%) rename packages/belt-cli/{commands/lint-shell.js => src/commands/lint-shell.ts} (68%) rename packages/belt-cli/{commands/provision/index.js => src/commands/provision/index.ts} (84%) rename packages/belt-cli/{commands/provision/tasks/apt.js => src/commands/provision/tasks/apt.ts} (94%) rename packages/belt-cli/{commands/provision/tasks/atom.js => src/commands/provision/tasks/atom.ts} (75%) rename packages/belt-cli/{commands/provision/tasks/brew.js => src/commands/provision/tasks/brew.ts} (87%) rename packages/belt-cli/{commands/provision/tasks/code.js => src/commands/provision/tasks/code.ts} (80%) rename packages/belt-cli/{commands/provision/tasks/npm.js => src/commands/provision/tasks/npm.ts} (78%) rename packages/belt-cli/{commands/provision/tasks/submodules.js => src/commands/provision/tasks/submodules.ts} (75%) rename packages/belt-cli/{commands/provision/tasks/symlinks.js => src/commands/provision/tasks/symlinks.ts} (81%) rename packages/belt-cli/{commands/provision/utils.js => src/commands/provision/utils.ts} (91%) rename packages/belt-cli/{commands/repo-open.js => src/commands/repo-open.ts} (61%) create mode 100644 packages/belt-cli/src/index.ts rename packages/belt-cli/{modules/execa.js => src/modules/execa.ts} (60%) rename packages/belt-cli/{modules/log.js => src/modules/log.ts} (55%) rename packages/belt-cli/{modules/opn.js => src/modules/opn.ts} (72%) create mode 100644 packages/belt-cli/src/types.d.ts create mode 100644 packages/belt-cli/tsconfig.json create mode 100644 tsconfig.json diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..04761e2 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,69 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Repository Overview + +This is a personal dotfiles repository containing configuration files and a custom CLI tool called "belt". The repository uses a yarn workspace monorepo structure with a single package `belt-cli` in the packages directory. + +## Architecture + +- **Root Level**: Main dotfiles configuration including zshrc, tmux.conf, and various config folders +- **packages/belt-cli**: A Node.js CLI tool that provides custom commands for dotfile management and development tasks +- **config/**: Contains configuration files for various tools (VS Code, iTerm, Karabiner, Obsidian, tmux, zsh) +- **scripts/**: Utility scripts for various system administration tasks +- **snippets/**: Code snippets organized by language + +## Key Components + +### Belt CLI (`packages/belt-cli/`) +The belt CLI is a command registry system that allows running custom commands with namespacing. Commands are defined in `package.json` under the `belt.commands` section and include: + +- `ewnd9:incantation`: Regenerate snippets +- `ewnd9:init`: Initialize project +- `ewnd9:provision`: Provision/sync dotfiles +- `ewnd9:lint-shell`: Lint dotfiles shell scripts +- `repo:open`: Open repository in browser + +### Configuration Management +The repository manages configurations for: +- **Shell**: Zsh with custom prompt (Pure), autosuggestions, and git integration +- **Editor**: VS Code settings, keybindings, and snippets +- **Terminal**: iTerm themes and tmux configurations +- **System**: Karabiner keyboard remapping, Obsidian settings + +## Common Development Commands + +### Linting +```bash +yarn lint # Lint JavaScript files in packages +yarn lint:shell # Lint shell scripts using belt CLI +``` + +### Belt CLI Usage +```bash +belt list # Show available commands +belt ewnd9:provision # Sync dotfiles +belt ewnd9:lint-shell # Lint shell scripts +``` + +### Setup/Installation +```bash +./init.sh # Initial setup script +./reload.sh # Reload configurations +``` + +## Development Workflow + +The repository follows these patterns: +- JavaScript files use ES modules and modern Node.js features +- Shell scripts are located in various directories and linted via belt CLI +- Configuration files are symlinked from this repository to their target locations +- The belt CLI system allows extending functionality through modular commands + +## Package Management + +- Uses Yarn v4.9.4+ with workspace configuration +- Single workspace package at `packages/belt-cli` +- Global installation of belt CLI for system-wide access +- Dependencies managed at workspace level where appropriate \ No newline at end of file diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..d395c19 --- /dev/null +++ b/mise.toml @@ -0,0 +1,2 @@ +[tools] +node = "22.13.0" diff --git a/package.json b/package.json index d0e1f8f..9e750c7 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,13 @@ "packages/*" ], "devDependencies": { + "@tsconfig/node-ts": "^23.6.1", + "@tsconfig/node22": "^22.0.2", + "@types/node": "22", "babel-eslint": "^8.2.3", "eslint": "^4.19.1", - "husky": "^0.14.3" + "husky": "^0.14.3", + "typescript": "^5.9.2" }, "scripts": { "precommit": "yarn lint && yarn lint:shell", diff --git a/packages/belt-cli/cli.js b/packages/belt-cli/cli.js index 11d12d9..64939d0 100755 --- a/packages/belt-cli/cli.js +++ b/packages/belt-cli/cli.js @@ -1,84 +1,3 @@ #!/usr/bin/env node -'use strict'; - -const path = require('path'); -const argv = require('minimist')(process.argv.slice(2), { string: '_' }); - -if (argv._[0] === 'list') { - printHelp(); -} else if (argv._.length > 0) { - run({ argv }); -} else { - printHelp(); -} - -async function run({ argv }) { - const commands = getCommands(); - const command = commands[argv._[0]]; - - if (!command) { - throw new Error(`unknown command "${argv._[0]}"`); - } - - argv._.splice(0, 1); - - const ctx = { - argv, - command, - }; - - const mod = require(command.scriptPath); - await mod.run(ctx); -} - -function printHelp() { - const groupBy = require('lodash.groupby'); - const sortBy = require('lodash.sortby'); - const commands = getCommands(); - - const groups = Object.entries(groupBy(Object.entries(commands), ([command]) => { - const parts = command.split(':'); - return parts.length === 1 ? '_' : parts[0]; - })); - - const noPrefix = groups.find(_ => _[0] === '_') || ['_', []]; - const prefixed = sortBy(groups.filter(_ => _[0] !== '_'), '[0]'); - - sortBy(noPrefix[1], '[0]').forEach(([command, info]) => { - console.log(`- ${command} (${info.description})`); - }); - - let prevLength = noPrefix[1].length; - - prefixed.forEach(([, commands]) => { - if (prevLength > 1) { - console.log(); - } - - sortBy(commands, '[0]').forEach(([command, info]) => { - console.log(`- ${command} (${info.description})`); - }); - - prevLength = commands.length; - }); -} - -function getCommands() { - const pkgPath = require.resolve('./package.json'); - const pkgDir = path.dirname(pkgPath); - const pkg = require(pkgPath); - return Object.entries(pkg.belt.commands).reduce((commands, [name, info]) => { - const scriptPath = `${pkgDir}/${info.script}`; - commands[name] = { - name, - pkg, - pkgName: pkg.name, - pkgPath, - scriptPath, - description: info.description || '' - }; - - return commands; - }, {}); -} +require('./dist'); diff --git a/packages/belt-cli/package.json b/packages/belt-cli/package.json index f45b061..3666337 100644 --- a/packages/belt-cli/package.json +++ b/packages/belt-cli/package.json @@ -3,14 +3,19 @@ "version": "0.0.0-local", "description": "Global CLI scripts registry", "private": true, - "main": "cli.js", + "type": "module", + "main": "dist/index.js", "bin": { - "belt": "cli.js" + "belt": "dist/index.js" }, - "preferGlobal": true, "author": "ewnd9 ", "license": "MIT", - "repository": "https://github.com/ewnd9/belt/tree/master/packages/belt-cli", + "scripts": { + "build": "tsc", + "typecheck": "tsc --noEmit", + "dev": "tsc --watch", + "prepublishOnly": "yarn build" + }, "belt": { "commands": { "ewnd9:incantation": { @@ -59,5 +64,9 @@ "minimist": "^1.2.0", "opn": "^6.0.0", "prompts": "^0.1.11" + }, + "devDependencies": { + "@types/minimist": "^1.2.5", + "typescript": "^5.9.2" } } diff --git a/packages/belt-cli/commands/flash-drive.js b/packages/belt-cli/src/commands/flash-drive.ts similarity index 92% rename from packages/belt-cli/commands/flash-drive.js rename to packages/belt-cli/src/commands/flash-drive.ts index 39f7927..e81fe2d 100644 --- a/packages/belt-cli/commands/flash-drive.js +++ b/packages/belt-cli/src/commands/flash-drive.ts @@ -1,9 +1,9 @@ -'use strict'; -const execa = require('@belt/tools/modules/execa'); -const prompts = require('prompts'); -module.exports = { +import execa from '../modules/execa'; +import prompts from 'prompts'; + +export default { run }; diff --git a/packages/belt-cli/commands/incantation/index.js b/packages/belt-cli/src/commands/incantation/index.ts similarity index 92% rename from packages/belt-cli/commands/incantation/index.js rename to packages/belt-cli/src/commands/incantation/index.ts index 96639f0..97bad78 100644 --- a/packages/belt-cli/commands/incantation/index.js +++ b/packages/belt-cli/src/commands/incantation/index.ts @@ -1,15 +1,14 @@ -'use strict'; -const fs = require('fs'); -const yaml = require('js-yaml'); -const globby = require('globby'); -const { rootPath, generateCode } = require('./utils'); +import fs from 'fs'; +import yaml from 'js-yaml'; +import globby from 'globby'; +import { rootPath, generateCode } from './utils'; const snippetsPath = `${rootPath}/snippets`; const files = globby.sync(['**/*.yaml'], { cwd: snippetsPath, absolute: true }); -module.exports = { +export default { run }; diff --git a/packages/belt-cli/commands/incantation/utils.js b/packages/belt-cli/src/commands/incantation/utils.ts similarity index 88% rename from packages/belt-cli/commands/incantation/utils.js rename to packages/belt-cli/src/commands/incantation/utils.ts index 94c848e..d7ecd33 100644 --- a/packages/belt-cli/commands/incantation/utils.js +++ b/packages/belt-cli/src/commands/incantation/utils.ts @@ -1,11 +1,11 @@ -'use strict'; -const fs = require('fs'); -const path = require('path'); -const mkdirp = require('mkdirp'); -const CSON = require('season'); -const yaml = require('js-yaml'); -const invert = require('lodash/fp/invert'); + +import fs from 'fs'; +import path from 'path'; +import mkdirp from 'mkdirp'; +import CSON from 'season'; +import yaml from 'js-yaml'; +import invert from 'lodash/fp/invert'; const rootPath = path.resolve(`${__dirname}/../../../..`); @@ -20,7 +20,7 @@ const atomGrammars = { const atomGrammarsByLang = invert(atomGrammars); -module.exports = { +export default { rootPath, transformAtom, generateAtom, diff --git a/packages/belt-cli/commands/init/README.md b/packages/belt-cli/src/commands/init/README.md similarity index 100% rename from packages/belt-cli/commands/init/README.md rename to packages/belt-cli/src/commands/init/README.md diff --git a/packages/belt-cli/commands/init/index.js b/packages/belt-cli/src/commands/init/index.ts similarity index 86% rename from packages/belt-cli/commands/init/index.js rename to packages/belt-cli/src/commands/init/index.ts index 568136f..7f45198 100644 --- a/packages/belt-cli/commands/init/index.js +++ b/packages/belt-cli/src/commands/init/index.ts @@ -1,19 +1,19 @@ -'use strict'; - -const fs = require('fs'); -const execa = require('execa'); -const makeDir = require('make-dir'); -const gitUrlParse = require('git-url-parse'); -const qs = require('qs'); -const ncp = require('ncp'); -const prompts = require('prompts'); -const kebabCase = require('lodash/kebabCase'); -const snakeCase = require('lodash/snakeCase'); -const camelCase = require('lodash/camelCase'); -const upperFirst = require('lodash/camelCase'); -const upperCase = require('lodash/upperCase'); - -module.exports = { + + +import fs from 'fs'; +import execa from 'execa'; +import makeDir from 'make-dir'; +import gitUrlParse from 'git-url-parse'; +import qs from 'qs'; +import ncp from 'ncp'; +import prompts from 'prompts'; +import kebabCase from 'lodash/kebabCase'; +import snakeCase from 'lodash/snakeCase'; +import camelCase from 'lodash/camelCase'; +import upperFirst from 'lodash/camelCase'; +import upperCase from 'lodash/upperCase'; + +export default { run }; diff --git a/packages/belt-cli/commands/install-deps.js b/packages/belt-cli/src/commands/install-deps.ts similarity index 79% rename from packages/belt-cli/commands/install-deps.js rename to packages/belt-cli/src/commands/install-deps.ts index 6099bdd..f449b59 100644 --- a/packages/belt-cli/commands/install-deps.js +++ b/packages/belt-cli/src/commands/install-deps.ts @@ -1,16 +1,15 @@ -'use strict'; -const fs = require('fs'); -const { promisify: pify } = require('util'); -const readFile = pify(fs.readFile); -const path = require('path'); -const { parse } = require('babylon'); -const { traverse } = require('babel-core'); -const builtinModules = require('builtin-modules'); -const globby = require('globby'); +import fs from 'fs'; +import { promisify as pify } from 'util'; +const readFile = pify(fs.readFile); +import path from 'path'; +import { parse } from 'babylon'; +import { traverse } from 'babel-core'; +import builtinModules from 'builtin-modules'; +import globby from 'globby'; -module.exports = { +export default { run }; diff --git a/packages/belt-cli/commands/licensify.js b/packages/belt-cli/src/commands/licensify.ts similarity index 86% rename from packages/belt-cli/commands/licensify.js rename to packages/belt-cli/src/commands/licensify.ts index e22230d..729d1c5 100644 --- a/packages/belt-cli/commands/licensify.js +++ b/packages/belt-cli/src/commands/licensify.ts @@ -1,9 +1,9 @@ -'use strict'; -const fs = require('fs'); -const path = require('path'); -module.exports = { +import fs from 'fs'; +import path from 'path'; + +export default { run }; diff --git a/packages/belt-cli/commands/lint-shell.js b/packages/belt-cli/src/commands/lint-shell.ts similarity index 68% rename from packages/belt-cli/commands/lint-shell.js rename to packages/belt-cli/src/commands/lint-shell.ts index 3f80e51..cd71745 100644 --- a/packages/belt-cli/commands/lint-shell.js +++ b/packages/belt-cli/src/commands/lint-shell.ts @@ -1,11 +1,11 @@ -'use strict'; -const path = require('path'); -const execa = require('../modules/execa'); -const { globby } = require('globby'); + +import path from 'path'; +import execa from '../modules/execa'; +import { globby } from 'globby'; const rootPath = path.resolve(`${__dirname}/../../..`); -module.exports = { +export default { run }; diff --git a/packages/belt-cli/commands/provision/index.js b/packages/belt-cli/src/commands/provision/index.ts similarity index 84% rename from packages/belt-cli/commands/provision/index.js rename to packages/belt-cli/src/commands/provision/index.ts index 0b15f95..a9a082e 100644 --- a/packages/belt-cli/commands/provision/index.js +++ b/packages/belt-cli/src/commands/provision/index.ts @@ -1,10 +1,10 @@ -'use strict'; -const fs = require('fs'); -const path = require('path'); -const yaml = require('js-yaml'); -module.exports = { +import fs from 'fs'; +import path from 'path'; +import yaml from 'js-yaml'; + +export default { run }; diff --git a/packages/belt-cli/commands/provision/tasks/apt.js b/packages/belt-cli/src/commands/provision/tasks/apt.ts similarity index 94% rename from packages/belt-cli/commands/provision/tasks/apt.js rename to packages/belt-cli/src/commands/provision/tasks/apt.ts index c8f14a9..e2b9f0e 100644 --- a/packages/belt-cli/commands/provision/tasks/apt.js +++ b/packages/belt-cli/src/commands/provision/tasks/apt.ts @@ -1,8 +1,8 @@ -'use strict'; -const execa = require('@belt/tools/modules/execa'); -module.exports = { +import execa from '../modules/execa'; + +export default { setup, extract }; diff --git a/packages/belt-cli/commands/provision/tasks/atom.js b/packages/belt-cli/src/commands/provision/tasks/atom.ts similarity index 75% rename from packages/belt-cli/commands/provision/tasks/atom.js rename to packages/belt-cli/src/commands/provision/tasks/atom.ts index d362e19..ac843e2 100644 --- a/packages/belt-cli/commands/provision/tasks/atom.js +++ b/packages/belt-cli/src/commands/provision/tasks/atom.ts @@ -1,9 +1,9 @@ -'use strict'; -const execa = require('@belt/tools/modules/execa'); -const { readNodeModules } = require('../utils'); -module.exports = { +import execa from '../modules/execa'; +import { readNodeModules } from '../utils'; + +export default { setup, extract }; diff --git a/packages/belt-cli/commands/provision/tasks/brew.js b/packages/belt-cli/src/commands/provision/tasks/brew.ts similarity index 87% rename from packages/belt-cli/commands/provision/tasks/brew.js rename to packages/belt-cli/src/commands/provision/tasks/brew.ts index 09d5f77..60ecc60 100644 --- a/packages/belt-cli/commands/provision/tasks/brew.js +++ b/packages/belt-cli/src/commands/provision/tasks/brew.ts @@ -1,11 +1,11 @@ -'use strict'; -const prompts = require('prompts'); -const execa = require('@belt/tools/modules/execa'); -const uniq = require('lodash/uniq'); -const { readZshHistory } = require('../utils'); -module.exports = { +import prompts from 'prompts'; +import execa from '../modules/execa'; +import uniq from 'lodash/uniq'; +import { readZshHistory } from '../utils'; + +export default { setup, extract, }; diff --git a/packages/belt-cli/commands/provision/tasks/code.js b/packages/belt-cli/src/commands/provision/tasks/code.ts similarity index 80% rename from packages/belt-cli/commands/provision/tasks/code.js rename to packages/belt-cli/src/commands/provision/tasks/code.ts index 4b6d9a3..a01a5e4 100644 --- a/packages/belt-cli/commands/provision/tasks/code.js +++ b/packages/belt-cli/src/commands/provision/tasks/code.ts @@ -1,11 +1,12 @@ -'use strict'; + // https://code.visualstudio.com/docs/editor/extension-gallery -const execa = require('@belt/tools/modules/execa'); -const { readNodeModules } = require('../utils'); +import execa from '../modules/execa'; + +import { readNodeModules } from '../utils'; -module.exports = { +export default { setup, extract }; diff --git a/packages/belt-cli/commands/provision/tasks/npm.js b/packages/belt-cli/src/commands/provision/tasks/npm.ts similarity index 78% rename from packages/belt-cli/commands/provision/tasks/npm.js rename to packages/belt-cli/src/commands/provision/tasks/npm.ts index eb12f16..6bc1e97 100644 --- a/packages/belt-cli/commands/provision/tasks/npm.js +++ b/packages/belt-cli/src/commands/provision/tasks/npm.ts @@ -1,9 +1,9 @@ -'use strict'; -const execa = require('@belt/tools/modules/execa'); -const { readNodeModules } = require('../utils'); -module.exports = { +import execa from '../modules/execa'; +import { readNodeModules } from '../utils'; + +export default { setup, extract }; diff --git a/packages/belt-cli/commands/provision/tasks/submodules.js b/packages/belt-cli/src/commands/provision/tasks/submodules.ts similarity index 75% rename from packages/belt-cli/commands/provision/tasks/submodules.js rename to packages/belt-cli/src/commands/provision/tasks/submodules.ts index 3c0de91..07009f6 100644 --- a/packages/belt-cli/commands/provision/tasks/submodules.js +++ b/packages/belt-cli/src/commands/provision/tasks/submodules.ts @@ -1,12 +1,14 @@ -'use strict'; -const fs = require('fs'); -const chalk = require('chalk'); + +import fs from 'fs'; +import chalk from 'chalk'; + // const parse = require('parse-github-repo-url'); -const execa = require('@belt/tools/modules/execa'); -const { evalTemplate, ensureParentDir } = require('../utils'); +import execa from '../modules/execa'; + +import { evalTemplate, ensureParentDir } from '../utils'; -module.exports = { +export default { setup, extract }; diff --git a/packages/belt-cli/commands/provision/tasks/symlinks.js b/packages/belt-cli/src/commands/provision/tasks/symlinks.ts similarity index 81% rename from packages/belt-cli/commands/provision/tasks/symlinks.js rename to packages/belt-cli/src/commands/provision/tasks/symlinks.ts index ddbfa41..543b446 100644 --- a/packages/belt-cli/commands/provision/tasks/symlinks.js +++ b/packages/belt-cli/src/commands/provision/tasks/symlinks.ts @@ -1,11 +1,11 @@ -'use strict'; -const fs = require('fs'); -const chalk = require('chalk'); -const execa = require('@belt/tools/modules/execa'); -const { evalTemplate, ensureParentDir } = require('../utils'); -module.exports = { +import fs from 'fs'; +import chalk from 'chalk'; +import execa from '../modules/execa'; +import { evalTemplate, ensureParentDir } from '../utils'; + +export default { setup }; diff --git a/packages/belt-cli/commands/provision/utils.js b/packages/belt-cli/src/commands/provision/utils.ts similarity index 91% rename from packages/belt-cli/commands/provision/utils.js rename to packages/belt-cli/src/commands/provision/utils.ts index a3a9e17..927c396 100644 --- a/packages/belt-cli/commands/provision/utils.js +++ b/packages/belt-cli/src/commands/provision/utils.ts @@ -1,11 +1,11 @@ -'use strict'; -const fs = require('fs'); -const path = require('path'); -const mkdirp = require('mkdirp'); -const execa = require('@belt/tools/modules/execa'); -module.exports = { +import fs from 'fs'; +import path from 'path'; +import mkdirp from 'mkdirp'; +import execa from '../modules/execa'; + +export default { evalTemplate, ensureParentDir, readNodeModules, diff --git a/packages/belt-cli/commands/repo-open.js b/packages/belt-cli/src/commands/repo-open.ts similarity index 61% rename from packages/belt-cli/commands/repo-open.js rename to packages/belt-cli/src/commands/repo-open.ts index 3617f37..6d9eb62 100644 --- a/packages/belt-cli/commands/repo-open.js +++ b/packages/belt-cli/src/commands/repo-open.ts @@ -1,11 +1,10 @@ -'use strict'; -const execa = require('../modules/execa'); -const opn = require('../modules/opn'); -const gitUrlParse = require('git-url-parse'); +import execa from '../modules/execa'; +import opn from '../modules/opn'; +import gitUrlParse from 'git-url-parse'; -module.exports = { +export default { run }; diff --git a/packages/belt-cli/src/index.ts b/packages/belt-cli/src/index.ts new file mode 100644 index 0000000..d32dc36 --- /dev/null +++ b/packages/belt-cli/src/index.ts @@ -0,0 +1,81 @@ +import path from 'path'; + +const argv = require('minimist')(process.argv.slice(2), { string: '_' }); + +if (argv._[0] === 'list') { + printHelp(); +} else if (argv._.length > 0) { + run({ argv }); +} else { + printHelp(); +} + +async function run({ argv }) { + const commands = getCommands(); + const command = commands[argv._[0]]; + + if (!command) { + throw new Error(`unknown command "${argv._[0]}"`); + } + + argv._.splice(0, 1); + + const ctx = { + argv, + command, + }; + + const mod = require(command.scriptPath); + await mod.run(ctx); +} + +function printHelp() { + const groupBy = require('lodash.groupby'); + const sortBy = require('lodash.sortby'); + const commands = getCommands(); + + const groups = Object.entries(groupBy(Object.entries(commands), ([command]) => { + const parts = command.split(':'); + return parts.length === 1 ? '_' : parts[0]; + })); + + const noPrefix = groups.find(_ => _[0] === '_') || ['_', []]; + const prefixed = sortBy(groups.filter(_ => _[0] !== '_'), '[0]'); + + sortBy(noPrefix[1], '[0]').forEach(([command, info]) => { + console.log(`- ${command} (${info.description})`); + }); + + let prevLength = noPrefix[1].length; + + prefixed.forEach(([, commands]) => { + if (prevLength > 1) { + console.log(); + } + + sortBy(commands, '[0]').forEach(([command, info]) => { + console.log(`- ${command} (${info.description})`); + }); + + prevLength = commands.length; + }); +} + +function getCommands() { + const pkgPath = require.resolve('./package.json'); + const pkgDir = path.dirname(pkgPath); + const pkg = require(pkgPath); + return Object.entries(pkg.belt.commands).reduce((commands, [name, info]) => { + const scriptPath = `${pkgDir}/${info.script}`; + commands[name] = { + name, + pkg, + pkgName: pkg.name, + pkgPath, + scriptPath, + description: info.description || '' + }; + + return commands; + }, {}); +} diff --git a/packages/belt-cli/modules/execa.js b/packages/belt-cli/src/modules/execa.ts similarity index 60% rename from packages/belt-cli/modules/execa.js rename to packages/belt-cli/src/modules/execa.ts index d5a1e8a..c85fa12 100644 --- a/packages/belt-cli/modules/execa.js +++ b/packages/belt-cli/src/modules/execa.ts @@ -1,9 +1,9 @@ -'use strict'; -const { execa } = require('execa'); -const { logShell } = require('./log'); -module.exports = execaProxy; +import { execa } from 'execa'; +import { logShell } from './log'; + +export default execaProxy; // seems cleaner without abstractions async function execaProxy(cmd, args, opts) { diff --git a/packages/belt-cli/modules/log.js b/packages/belt-cli/src/modules/log.ts similarity index 55% rename from packages/belt-cli/modules/log.js rename to packages/belt-cli/src/modules/log.ts index de7a178..7ccd6d8 100644 --- a/packages/belt-cli/modules/log.js +++ b/packages/belt-cli/src/modules/log.ts @@ -1,9 +1,9 @@ -'use strict'; -const shellEscape = require('any-shell-escape'); -const chalk = require('chalk'); -module.exports = { +import shellEscape from 'any-shell-escape'; +import chalk from 'chalk'; + +export default { log, logShell }; diff --git a/packages/belt-cli/modules/opn.js b/packages/belt-cli/src/modules/opn.ts similarity index 72% rename from packages/belt-cli/modules/opn.js rename to packages/belt-cli/src/modules/opn.ts index cda300e..2087efc 100644 --- a/packages/belt-cli/modules/opn.js +++ b/packages/belt-cli/src/modules/opn.ts @@ -1,9 +1,9 @@ -'use strict'; -const opn = require('opn'); -const { logShell } = require('./log'); -module.exports = opnProxy; +import opn from 'opn'; +import { logShell } from './log'; + +export default opnProxy; function opnProxy(url, opts) { // sorry windows, it's complex https://github.com/sindresorhus/opn/blob/cfab3f9ba2096b00fef655f454be65b070f49d8a/index.js#L34 diff --git a/packages/belt-cli/src/types.d.ts b/packages/belt-cli/src/types.d.ts new file mode 100644 index 0000000..56b7aeb --- /dev/null +++ b/packages/belt-cli/src/types.d.ts @@ -0,0 +1,4 @@ +declare module 'any-shell-escape' { + function shellEscape(args: string[]): string; + export = shellEscape; +} diff --git a/packages/belt-cli/tsconfig.json b/packages/belt-cli/tsconfig.json new file mode 100644 index 0000000..16b3ec7 --- /dev/null +++ b/packages/belt-cli/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "module": "ES2022", + "moduleResolution": "node", + "target": "ES2022", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true + }, + "include": ["src/**/*.ts"], +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..109be4b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": ["@tsconfig/node22/tsconfig.json", "@tsconfig/node-ts/tsconfig.json"] +} diff --git a/yarn.lock b/yarn.lock index d23eda7..8a12223 100644 --- a/yarn.lock +++ b/yarn.lock @@ -112,6 +112,7 @@ __metadata: version: 0.0.0-use.local resolution: "@belt/cli@workspace:packages/belt-cli" dependencies: + "@types/minimist": "npm:^1.2.5" any-shell-escape: "npm:^0.1.1" chalk: "npm:^2.4.1" execa: "npm:^9.6.0" @@ -123,8 +124,9 @@ __metadata: minimist: "npm:^1.2.0" opn: "npm:^6.0.0" prompts: "npm:^0.1.11" + typescript: "npm:^5.9.2" bin: - belt: cli.js + belt: dist/index.js languageName: unknown linkType: soft @@ -176,6 +178,36 @@ __metadata: languageName: node linkType: hard +"@tsconfig/node-ts@npm:^23.6.1": + version: 23.6.1 + resolution: "@tsconfig/node-ts@npm:23.6.1" + checksum: 10c0/4fedf85d27e83a0765835f3c9303aa7dc6a22fd1214c58a8c5933e6b78c66fa40b3bfd37f515b816d801cb435fc1c084c32a58dfcf4f5ea19714336e2a41a5c8 + languageName: node + linkType: hard + +"@tsconfig/node22@npm:^22.0.2": + version: 22.0.2 + resolution: "@tsconfig/node22@npm:22.0.2" + checksum: 10c0/c75e6b9ea86ec2a384adefac0e2f16a6c08202ae5cf6c8c745944396a6931ffb38e742809491c1882d1868c2af1c33744193701779674bfb1e05f6a130045a18 + languageName: node + linkType: hard + +"@types/minimist@npm:^1.2.5": + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 10c0/3f791258d8e99a1d7d0ca2bda1ca6ea5a94e5e7b8fc6cde84dd79b0552da6fb68ade750f0e17718f6587783c24254bbca0357648dd59dc3812c150305cabdc46 + languageName: node + linkType: hard + +"@types/node@npm:22": + version: 22.18.0 + resolution: "@types/node@npm:22.18.0" + dependencies: + undici-types: "npm:~6.21.0" + checksum: 10c0/02cce4493eee8408e66e76fcad164f33c0600ed0854ad08e5519a76a06402da5b589b278cf71bc975c9e014f2668bdf758bc3be7fed63bdbfd0900495372797c + languageName: node + linkType: hard + "@types/parse-path@npm:^7.0.0": version: 7.0.3 resolution: "@types/parse-path@npm:7.0.3" @@ -1568,9 +1600,13 @@ __metadata: version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." dependencies: + "@tsconfig/node-ts": "npm:^23.6.1" + "@tsconfig/node22": "npm:^22.0.2" + "@types/node": "npm:22" babel-eslint: "npm:^8.2.3" eslint: "npm:^4.19.1" husky: "npm:^0.14.3" + typescript: "npm:^5.9.2" languageName: unknown linkType: soft @@ -1862,6 +1898,33 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.9.2": + version: 5.9.2 + resolution: "typescript@npm:5.9.2" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/cd635d50f02d6cf98ed42de2f76289701c1ec587a363369255f01ed15aaf22be0813226bff3c53e99d971f9b540e0b3cc7583dbe05faded49b1b0bed2f638a18 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.9.2#optional!builtin": + version: 5.9.2 + resolution: "typescript@patch:typescript@npm%3A5.9.2#optional!builtin::version=5.9.2&hash=5786d5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/34d2a8e23eb8e0d1875072064d5e1d9c102e0bdce56a10a25c0b917b8aa9001a9cf5c225df12497e99da107dc379360bc138163c66b55b95f5b105b50578067e + languageName: node + linkType: hard + +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04 + languageName: node + linkType: hard + "unicorn-magic@npm:^0.3.0": version: 0.3.0 resolution: "unicorn-magic@npm:0.3.0" From 8dc68ddeec92aa7eb7b0f05993db1bc4647c222e Mon Sep 17 00:00:00 2001 From: ewnd9 Date: Fri, 29 Aug 2025 12:42:21 +0300 Subject: [PATCH 2/4] fix typescript errors --- .gitignore | 1 + packages/belt-cli/cli.js | 3 +- packages/belt-cli/package.json | 8 +- packages/belt-cli/src/commands/flash-drive.ts | 22 ++-- .../src/commands/incantation/index.ts | 56 ++------ .../src/commands/incantation/utils.ts | 81 ++---------- packages/belt-cli/src/commands/init/index.ts | 124 ++++++++++-------- .../belt-cli/src/commands/install-deps.ts | 36 ++--- packages/belt-cli/src/commands/licensify.ts | 6 +- packages/belt-cli/src/commands/lint-shell.ts | 8 +- .../belt-cli/src/commands/provision/index.ts | 10 +- .../src/commands/provision/tasks/apt.ts | 25 ++-- .../src/commands/provision/tasks/atom.ts | 25 ---- .../src/commands/provision/tasks/brew.ts | 48 ++++--- .../src/commands/provision/tasks/code.ts | 27 ++-- .../src/commands/provision/tasks/npm.ts | 17 +-- .../commands/provision/tasks/submodules.ts | 21 ++- .../src/commands/provision/tasks/symlinks.ts | 14 +- .../belt-cli/src/commands/provision/utils.ts | 96 +++++++------- packages/belt-cli/src/commands/repo-open.ts | 14 +- packages/belt-cli/src/index.ts | 78 ++++++----- packages/belt-cli/src/interface.ts | 11 ++ packages/belt-cli/src/modules/execa.ts | 12 +- packages/belt-cli/src/modules/log.ts | 11 +- packages/belt-cli/src/modules/opn.ts | 12 +- packages/belt-cli/src/types.d.ts | 8 ++ yarn.lock | 105 ++++++++++++--- 27 files changed, 411 insertions(+), 468 deletions(-) delete mode 100644 packages/belt-cli/src/commands/provision/tasks/atom.ts create mode 100644 packages/belt-cli/src/interface.ts diff --git a/.gitignore b/.gitignore index cb97645..f6f758e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ fl.sh test.sh config/vim/.netrwhist config/karabiner/automatic_backups +dist node_modules .yarn/* diff --git a/packages/belt-cli/cli.js b/packages/belt-cli/cli.js index 64939d0..ff6f632 100755 --- a/packages/belt-cli/cli.js +++ b/packages/belt-cli/cli.js @@ -1,3 +1,4 @@ #!/usr/bin/env node -require('./dist'); +// eslint-disable-next-line +await import('./dist/index.js'); diff --git a/packages/belt-cli/package.json b/packages/belt-cli/package.json index 3666337..42dd7af 100644 --- a/packages/belt-cli/package.json +++ b/packages/belt-cli/package.json @@ -58,15 +58,19 @@ "execa": "^9.6.0", "git-url-parse": "^16.1.0", "globby": "^14.1.0", - "lodash.groupby": "^4.6.0", - "lodash.sortby": "^4.7.0", + "lodash": "^4.17.21", "make-dir": "^1.3.0", "minimist": "^1.2.0", "opn": "^6.0.0", "prompts": "^0.1.11" }, "devDependencies": { + "@types/js-yaml": "^4.0.9", + "@types/lodash": "^4.17.20", + "@types/make-dir": "^2.1.0", "@types/minimist": "^1.2.5", + "@types/opn": "^5.5.0", + "@types/prompts": "^2.4.9", "typescript": "^5.9.2" } } diff --git a/packages/belt-cli/src/commands/flash-drive.ts b/packages/belt-cli/src/commands/flash-drive.ts index e81fe2d..c8c5abb 100644 --- a/packages/belt-cli/src/commands/flash-drive.ts +++ b/packages/belt-cli/src/commands/flash-drive.ts @@ -1,13 +1,9 @@ -import execa from '../modules/execa'; +import execa from "../modules/execa.js"; import prompts from 'prompts'; -export default { - run -}; - -async function run() { +export async function run() { const dir = '/media/flashdrive'; const devices = await getDevices(); const mounts = await getMounts(); @@ -16,7 +12,7 @@ async function run() { type: 'select', name: 'value', message: 'Pick a device', - choices: devices.map(({ name, size }, i) => { + choices: devices.map(({ name, size }: { name: string; size: string }, i: number) => { const parts = [`${name} (${size})`]; if (mounts[name] === dir) { @@ -43,12 +39,12 @@ async function run() { } async function getDevices() { - const stdout = await execa.stdout('sudo', ['fdisk', '-l'], { stdio: [0, 'pipe', 'pipe'] }); + const stdout = (await execa('sudo', ['fdisk', '-l'], { stdio: [0, 'pipe', 'pipe'] })) || ''; const lines = stdout.split('\n'); return lines - .filter(_ => _.startsWith('/dev/sd')) - .map(line => { + .filter((_: string) => _.startsWith('/dev/sd')) + .map((line: string) => { const parts = line.split(/\s+/); const name = parts[0]; @@ -59,10 +55,10 @@ async function getDevices() { } async function getMounts() { - const stdout = await execa.stdout('cat', ['/proc/mounts']); + const stdout = (await execa('cat', ['/proc/mounts'], {})) || ''; return stdout .split('\n') - .reduce((acc, line) => { + .reduce((acc: Record, line: string) => { const [src, dest] = line.split(' '); if (src.startsWith('/dev/sd')) { @@ -70,6 +66,6 @@ async function getMounts() { } return acc; - }, {}) + }, {} as Record) } diff --git a/packages/belt-cli/src/commands/incantation/index.ts b/packages/belt-cli/src/commands/incantation/index.ts index 97bad78..ff64c00 100644 --- a/packages/belt-cli/src/commands/incantation/index.ts +++ b/packages/belt-cli/src/commands/incantation/index.ts @@ -2,19 +2,14 @@ import fs from 'fs'; import yaml from 'js-yaml'; -import globby from 'globby'; -import { rootPath, generateCode } from './utils'; +import { globby } from 'globby'; +import { rootPath, generateCode } from "./utils.js"; -const snippetsPath = `${rootPath}/snippets`; -const files = globby.sync(['**/*.yaml'], { cwd: snippetsPath, absolute: true }); - -export default { - run -}; - -async function run() { - const snippets = files.reduce((total, file) => { - const content = yaml.safeLoad(fs.readFileSync(file)); +export async function run() { + const snippetsPath = `${rootPath}/snippets`; + const files = await globby(['**/*.yaml'], { cwd: snippetsPath, absolute: true }); + const snippets = files.reduce((total: any, file: string) => { + const content = yaml.load(fs.readFileSync(file, 'utf8')) as any; if (!total[content.lang]) { total[content.lang] = []; @@ -55,46 +50,15 @@ async function run() { } }; - Object.entries(snippets).forEach(([lang, snippets]) => { + Object.entries(snippets).forEach(([lang, snippets]: [string, any]) => { generateCode( lang, snippets, - arrayify(paths[lang].code) + arrayify((paths as any)[lang].code) ); }); } -function arrayify(xs) { +function arrayify(xs: any) { return Array.isArray(xs) ? xs : [xs]; } - -// const js = transformAtom( -// 'javascript', -// `${rootPath}/config/atom/snippets/js.cson`, -// `${__dirname}/snippets/javascript/javascript.yaml` -// ); -// -// transformAtom( -// 'bash', -// `${rootPath}/config/atom/snippets/bash.cson`, -// `${__dirname}/snippets/bash/bash.yaml` -// ); -// -// transformAtom( -// 'css', -// `${rootPath}/config/atom/snippets/css.cson`, -// `${__dirname}/snippets/css/css.yaml` -// ); -// -// transformAtom( -// 'html', -// `${rootPath}/config/atom/snippets/html.cson`, -// `${__dirname}/snippets/html/html.yaml` -// ); -// -// transformAtom( -// 'markdown', -// `${rootPath}/config/atom/snippets/md.cson`, -// `${__dirname}/snippets/md/md.yaml` -// ); -// diff --git a/packages/belt-cli/src/commands/incantation/utils.ts b/packages/belt-cli/src/commands/incantation/utils.ts index d7ecd33..92da448 100644 --- a/packages/belt-cli/src/commands/incantation/utils.ts +++ b/packages/belt-cli/src/commands/incantation/utils.ts @@ -1,88 +1,23 @@ - - import fs from 'fs'; import path from 'path'; -import mkdirp from 'mkdirp'; -import CSON from 'season'; -import yaml from 'js-yaml'; -import invert from 'lodash/fp/invert'; - -const rootPath = path.resolve(`${__dirname}/../../../..`); - -const atomGrammars = { - '.source.shell': 'bash', - '.source.css': 'css', - '.text.html': 'html', - '.source.js': 'javascript', - '.source.json': 'json', - '.source.gfm': 'markdown' -}; - -const atomGrammarsByLang = invert(atomGrammars); - -export default { - rootPath, - transformAtom, - generateAtom, - generateCode -}; - -function transformAtom(lang, srcPath, destPath) { - mkdirp.sync(path.dirname(destPath)); - - const content = CSON.readFileSync(srcPath); - const snippets = Object.entries(content).reduce((total, [, snippets]) => { - Object.entries(snippets).forEach(([name, snippet]) => { - total.push({ name, prefix: snippet.prefix, body: snippet.body }); - }); - - return total; - }, []); - - const result = { - lang, - snippets - }; - - fs.writeFileSync(destPath, yaml.safeDump(result, { lineWidth: 120 })); - return result; -} - -function generateAtom(lang, snippets, paths) { - const result = { - [atomGrammarsByLang[lang]]: snippets.reduce((total, { name, prefix, body }) => { - total[name] = { - prefix, - body - }; - return total; - }, {}) - }; - - paths.forEach(path => { - const content = CSON.stringify(result) - .replace(/\n\s+\n/g, '\n\n') - - fs.writeFileSync(path, content); - }); -} +export const rootPath = path.resolve(`${__dirname}/../../../..`); -function generateCode(lang, snippets, paths) { - const result = snippets.reduce((total, { name, prefix, body }) => { +export function generateCode(lang: string, snippets: any[], paths: string[]) { + const result = snippets.reduce((total: any, { name, prefix, body }: any) => { total[name] = { prefix, // vs-code needs to encode ${string} to $\\{string\\} // see https://github.com/Microsoft/vscode/issues/1670 // body: body.replace(/\\([\{\}])/gm, '$1'), - body: body.replace(/\$\{([_a-zA-Z]+)\}/gm, '\${$1\\}'), - description: name + body: body.replace(/\$\{([_a-zA-Z]+)\}/gm, '${$1\\}'), + description: name, }; return total; - }, {}); + }, {} as any); - paths.forEach(path => { - fs.writeFileSync(path, JSON.stringify(result, null, 2)); + paths.forEach((pathItem: string) => { + fs.writeFileSync(pathItem, JSON.stringify(result, null, 2)); }); } diff --git a/packages/belt-cli/src/commands/init/index.ts b/packages/belt-cli/src/commands/init/index.ts index 7f45198..78c6518 100644 --- a/packages/belt-cli/src/commands/init/index.ts +++ b/packages/belt-cli/src/commands/init/index.ts @@ -1,8 +1,5 @@ - - import fs from 'fs'; -import execa from 'execa'; -import makeDir from 'make-dir'; +import execa from "../../modules/execa.js"; import gitUrlParse from 'git-url-parse'; import qs from 'qs'; import ncp from 'ncp'; @@ -12,36 +9,36 @@ import snakeCase from 'lodash/snakeCase'; import camelCase from 'lodash/camelCase'; import upperFirst from 'lodash/camelCase'; import upperCase from 'lodash/upperCase'; +import type { Ctx } from "../../interface.js"; -export default { - run -}; - -async function run({ argv }) { - const ctx = getContext(argv); +export async function run({ argv }: Ctx) { + const ctx = getContext(argv as any); if (argv.i || argv.interactive) { const dirs = fs.readdirSync(`${ctx.repoDir}/templates`); - const overrides = await prompts([{ - type: 'text', - name: 'name', - message: 'name of a project' - }, { - type: 'select', - name: 'templatePath', - message: 'pick a template', - choices: dirs.map(dir => ({title: dir, value: `templates/${dir}`})), - initial: 1 - }]); + const overrides = await prompts([ + { + type: 'text', + name: 'name', + message: 'name of a project', + }, + { + type: 'select', + name: 'templatePath', + message: 'pick a template', + choices: dirs.map((dir) => ({ title: dir, value: `templates/${dir}` })), + initial: 1, + }, + ]); Object.assign(ctx, overrides); } if (!fs.existsSync(ctx.repoDir)) { - await makeDir(ctx.repoDir); + fs.mkdirSync(ctx.repoDir, { recursive: true }); await execa('git', ['clone', ctx.repoUrl.split('#')[0], ctx.repoDir], { - stdio: 'inherit' + stdio: 'inherit', }); } else { await execa('git', ['checkout', ctx.branch], { cwd: ctx.repoDir }); @@ -63,8 +60,8 @@ async function run({ argv }) { fullTemplatePath, process.cwd(), { - transform(read, write) { - if (ignore.some(ignoredFile => read.path.endsWith(ignoredFile))) { + transform(read: any, write: any) { + if (ignore.some((ignoredFile) => read.path.endsWith(ignoredFile))) { read.pipe(write); return; } @@ -75,9 +72,18 @@ async function run({ argv }) { } const result = data - .replace(new RegExp('generator-template', 'g'), kebabCase(ctx.name)) - .replace(new RegExp('generator_template', 'g'), snakeCase(ctx.name)) - .replace(new RegExp('generatorTemplate', 'g'), camelCase(ctx.name)) + .replace( + new RegExp('generator-template', 'g'), + kebabCase(ctx.name) + ) + .replace( + new RegExp('generator_template', 'g'), + snakeCase(ctx.name) + ) + .replace( + new RegExp('generatorTemplate', 'g'), + camelCase(ctx.name) + ) .replace( new RegExp('GeneratorTemplate', 'g'), upperFirst(camelCase(ctx.name)) @@ -87,7 +93,7 @@ async function run({ argv }) { upperCase(snakeCase(ctx.name)) ); - fs.writeFile(write.path, result, 'utf8', err => { + fs.writeFile(write.path, result, 'utf8', (err) => { if (err) { throw err; } @@ -95,43 +101,45 @@ async function run({ argv }) { return null; }); }); - } + }, }, - err => { + (err: Error) => { if (err) { reject(err); } else { - resolve(); + resolve(true); } } ); }); } -function getContext({name, from: repoUrl, template: templatePath}) { - const ctx = {repoUrl}; - - if (repoUrl) { - Object.assign(ctx, gitUrlParse(repoUrl)); - const { branch, path: templatePath } = qs.parse(ctx.search); - - ctx.branch = branch; - ctx.templatePath = templatePath; - } else { - const repoUrl = 'https://github.com/ewnd9/templates.git?path=node-express&branch=master'; - Object.assign(ctx, gitUrlParse(repoUrl)); - - ctx.branch = 'master'; - ctx.templatePath = templatePath || 'node'; - } - - ctx.repoDir = `${process.env.HOME}/.cache/belt-ewnd9-init/${[ - ctx.source, - ctx.full_name - ] - .join('-') - .replace(/\W+/g, '-')}`; - - ctx.name = name || ctx.templatePath.split('/').pop(); - return ctx; +function getContext({ + name, + from: repoUrl = 'https://github.com/ewnd9/templates.git?path=node-express&branch=master', + template = 'node', +}: { + name: string; + from: string | undefined; + template: string | undefined; +}) { + const parseResult = gitUrlParse(repoUrl); + const { branch = 'master', path: overridenTemplatePath } = qs.parse( + parseResult.search + ); + const templatePath = overridenTemplatePath || template; + + return { + ...parseResult, + repoUrl, + branch, + templatePath, + repoDir: `${process.env.HOME}/.cache/belt-ewnd9-init/${[ + parseResult.source, + parseResult.full_name, + ] + .join('-') + .replace(/\W+/g, '-')}`, + name: name || templatePath.split('/').pop(), + }; } diff --git a/packages/belt-cli/src/commands/install-deps.ts b/packages/belt-cli/src/commands/install-deps.ts index f449b59..5093bf0 100644 --- a/packages/belt-cli/src/commands/install-deps.ts +++ b/packages/belt-cli/src/commands/install-deps.ts @@ -1,30 +1,30 @@ - - -import fs from 'fs'; -import { promisify as pify } from 'util'; -const readFile = pify(fs.readFile); +import fs from 'fs/promises'; import path from 'path'; import { parse } from 'babylon'; import { traverse } from 'babel-core'; import builtinModules from 'builtin-modules'; -import globby from 'globby'; - -export default { - run -}; +import { globby } from 'globby'; +import type { Ctx } from "../interface.js"; -async function run({ argv }) { +export async function run({ argv }: Ctx) { const cwd = path.resolve(process.cwd(), argv._[0] || '.'); - const files = await globby('**/*.js', { cwd, ignore: ['node_modules/**'], absolute: true, gitignore: true }); + const files = await globby('**/*.js', { + cwd, + ignore: ['node_modules/**'], + absolute: true, + gitignore: true, + }); const pkg = require(`${cwd}/package.json`); const pkgDeps = Object.assign({}, pkg.dependencies, pkg.devDependencies); const res = []; for (const file of files) { - const content = await readFile(file, 'utf-8'); + const content = await fs.readFile(file, 'utf-8'); const ast = parse(content); const deps = getDeps(ast); - const external = deps.filter(dep => dep && !dep.startsWith('.') && !builtinModules.includes(dep)); + const external = deps.filter( + (dep) => dep && !dep.startsWith('.') && !builtinModules.includes(dep) + ); for (const dep of external) { if (pkgDeps[dep]) { @@ -38,11 +38,11 @@ async function run({ argv }) { console.log(res.join(' ')); } -function getDeps(ast) { - const deps = []; +function getDeps(ast: any) { + const deps: string[] = []; traverse(ast, { - CallExpression({ node }) { + CallExpression({ node }: { node: any }) { if (node.callee.name === 'require' && node.arguments[0].value) { const val = node.arguments[0].value; @@ -52,7 +52,7 @@ function getDeps(ast) { deps.push(val.split('/')[0]); } } - } + }, }); return deps; diff --git a/packages/belt-cli/src/commands/licensify.ts b/packages/belt-cli/src/commands/licensify.ts index 729d1c5..84d9c83 100644 --- a/packages/belt-cli/src/commands/licensify.ts +++ b/packages/belt-cli/src/commands/licensify.ts @@ -3,11 +3,7 @@ import fs from 'fs'; import path from 'path'; -export default { - run -}; - -async function run() { +export async function run() { const pkgPath = './package.json'; const json = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')); diff --git a/packages/belt-cli/src/commands/lint-shell.ts b/packages/belt-cli/src/commands/lint-shell.ts index cd71745..e55c960 100644 --- a/packages/belt-cli/src/commands/lint-shell.ts +++ b/packages/belt-cli/src/commands/lint-shell.ts @@ -1,15 +1,11 @@ import path from 'path'; -import execa from '../modules/execa'; +import execa from "../modules/execa.js"; import { globby } from 'globby'; const rootPath = path.resolve(`${__dirname}/../../..`); -export default { - run -}; - -async function run() { +export async function run() { const files = await globby(['scripts/**/*.sh', '!scripts/gnome-terminal-themes/one-dark.sh'], { cwd: rootPath, gitignore: true diff --git a/packages/belt-cli/src/commands/provision/index.ts b/packages/belt-cli/src/commands/provision/index.ts index a9a082e..b1e3e7b 100644 --- a/packages/belt-cli/src/commands/provision/index.ts +++ b/packages/belt-cli/src/commands/provision/index.ts @@ -4,21 +4,17 @@ import fs from 'fs'; import path from 'path'; import yaml from 'js-yaml'; -export default { - run -}; - -async function run({ argv }) { +export async function run({ argv }: { argv: any }) { const rootPath = path.resolve(`${__dirname}/../../../..`); const configPath = `${rootPath}/provision/apt.yaml`; // @TODO split to separate configs - const doc = yaml.safeLoad(fs.readFileSync(configPath, 'utf8')); + const doc = yaml.load(fs.readFileSync(configPath, 'utf8')) as any; if (argv.extract) { const target = argv.extract; doc[target] = await require(`./tasks/${target}`).extract(doc[target]); - fs.writeFileSync(configPath, yaml.safeDump(doc, { lineWidth: 80, skipInvalid: true })); + fs.writeFileSync(configPath, yaml.dump(doc, { lineWidth: 80, skipInvalid: true })); } else if (argv.setup) { const target = argv.setup; await require(`./tasks/${target}`).setup(doc[target]); diff --git a/packages/belt-cli/src/commands/provision/tasks/apt.ts b/packages/belt-cli/src/commands/provision/tasks/apt.ts index e2b9f0e..6c999ac 100644 --- a/packages/belt-cli/src/commands/provision/tasks/apt.ts +++ b/packages/belt-cli/src/commands/provision/tasks/apt.ts @@ -1,29 +1,25 @@ +import execa from "../../../modules/execa.js"; - -import execa from '../modules/execa'; - -export default { - setup, - extract -}; - -async function setup({ packages }) { +export async function setup({ packages }: { packages: { name: string }[] }) { await execa('sudo', ['apt-get', 'update'], { stdio: 'inherit' }); for (const pkg of packages) { - await execa('sudo', ['apt-get', 'install', '-y', pkg.name], { stdio: 'inherit' }); + await execa('sudo', ['apt-get', 'install', '-y', pkg.name], { + stdio: 'inherit', + }); } } -async function extract({ packages }) { +export async function extract({ packages }: { packages: any }) { for (const pkg of packages) { if (pkg.disable) { - return pkg + return pkg; } - const stdout = await execa.stdout('dpkg', ['-s', pkg.name]) + const result = (await execa('dpkg', ['-s', pkg.name], {})) || ''; + const stdout = result .split('\n') - .find(line => line.startsWith('Version')); + .find((line: string) => line.startsWith('Version')); pkg.version = stdout ? stdout.split(' ')[1] : undefined; } @@ -82,4 +78,3 @@ async function extract({ packages }) { // neovim // sudo apt-get purge -y nautilus - diff --git a/packages/belt-cli/src/commands/provision/tasks/atom.ts b/packages/belt-cli/src/commands/provision/tasks/atom.ts deleted file mode 100644 index ac843e2..0000000 --- a/packages/belt-cli/src/commands/provision/tasks/atom.ts +++ /dev/null @@ -1,25 +0,0 @@ - - -import execa from '../modules/execa'; -import { readNodeModules } from '../utils'; - -export default { - setup, - extract -}; - -async function setup({ packages }) { - for (const pkg of packages) { - await execa('apm', ['install', pkg.name], { stdio: 'inherit' }); - } -} - -function extract() { - const atomPackagesPath = `${process.env.HOME}/.atom/packages`; - - const packages = readNodeModules(atomPackagesPath).map(pkg => { - return { name: pkg.name, version: pkg.version }; - }); - - return { packages }; -} diff --git a/packages/belt-cli/src/commands/provision/tasks/brew.ts b/packages/belt-cli/src/commands/provision/tasks/brew.ts index 60ecc60..7b3b738 100644 --- a/packages/belt-cli/src/commands/provision/tasks/brew.ts +++ b/packages/belt-cli/src/commands/provision/tasks/brew.ts @@ -1,60 +1,68 @@ - - import prompts from 'prompts'; -import execa from '../modules/execa'; +import execa from "../../../modules/execa.js"; import uniq from 'lodash/uniq'; -import { readZshHistory } from '../utils'; +import { readZshHistory } from "../utils.js"; -export default { - setup, - extract, -}; +interface BrewOptions { + packages: { name: string }[]; + repositories: { name: string }[]; + cask: { name: string }[]; +} -async function setup({ packages, repositories, cask }) { +export async function setup({ packages, repositories, cask }: BrewOptions) { for (const repo of repositories) { await execa('brew', ['tap', repo.name], { stdio: 'inherit' }); } - await execa('brew', ['install', ...packages.map(pkg => pkg.name)], { stdio: 'inherit' }); - await execa('brew', ['install', ...cask.map(pkg => pkg.name), '--cask'], { stdio: 'inherit' }); + await execa('brew', ['install', ...packages.map((pkg) => pkg.name)], { + stdio: 'inherit', + }); + await execa('brew', ['install', ...cask.map((pkg) => pkg.name), '--cask'], { + stdio: 'inherit', + }); } -async function extract(opts) { +export async function extract(opts: BrewOptions) { const lines = readZshHistory(); await parseMissingCommands( lines, 'brew install', - pkg => `Add "brew install ${pkg}"?`, + (pkg) => `Add "brew install ${pkg}"?`, opts.packages ); await parseMissingCommands( lines, 'brew cask install', - pkg => `Add "brew cask install ${pkg}"?`, + (pkg) => `Add "brew cask install ${pkg}"?`, opts.cask ); await parseMissingCommands( lines, 'brew tap', - pkg => `Add "brew tap ${pkg}"?`, + (pkg) => `Add "brew tap ${pkg}"?`, opts.repositories ); return opts; } -async function parseMissingCommands(lines, pattern, buildMessage, source) { +async function parseMissingCommands( + lines: string[], + pattern: string, + buildMessage: (pkg: any) => string, + source: { name: string }[] +) { const pkgs = uniq( lines - .filter(line => line.startsWith(pattern)) - .map(line => line.substring(pattern.length + 1)) - .flatMap(line => line.split(/\s+/g)) + .filter((line) => line.startsWith(pattern)) + .map((line) => line.substring(pattern.length + 1)) + .flatMap((line) => line.split(/\s+/g)) ); const missingPkgs = pkgs.filter( - pkg => !source.some(({ name }) => name === pkg) + (pkg) => !source.some(({ name }) => name === pkg) ); for (const pkg of missingPkgs) { diff --git a/packages/belt-cli/src/commands/provision/tasks/code.ts b/packages/belt-cli/src/commands/provision/tasks/code.ts index a01a5e4..b660db7 100644 --- a/packages/belt-cli/src/commands/provision/tasks/code.ts +++ b/packages/belt-cli/src/commands/provision/tasks/code.ts @@ -1,26 +1,27 @@ - - // https://code.visualstudio.com/docs/editor/extension-gallery -import execa from '../modules/execa'; - -import { readNodeModules } from '../utils'; +import execa from "../../../modules/execa.js"; -export default { - setup, - extract -}; +import { readNodeModules } from "../utils.js"; -async function setup({ extensions }) { +export async function setup({ + extensions, +}: { + extensions: { publisher: string; name: string }[]; +}) { for (const ext of extensions) { - await execa('code', ['--install-extension', `${ext.publisher}.${ext.name}`], { stdio: 'inherit' }); + await execa( + 'code', + ['--install-extension', `${ext.publisher}.${ext.name}`], + { stdio: 'inherit' } + ); } } -function extract() { +export function extract() { const codeExtensionsPath = `${process.env.HOME}/.vscode/extensions`; - const extensions = readNodeModules(codeExtensionsPath).map(pkg => { + const extensions = readNodeModules(codeExtensionsPath).map((pkg) => { return { name: pkg.name, publisher: pkg.publisher, version: pkg.version }; }); diff --git a/packages/belt-cli/src/commands/provision/tasks/npm.ts b/packages/belt-cli/src/commands/provision/tasks/npm.ts index 6bc1e97..2cf2b86 100644 --- a/packages/belt-cli/src/commands/provision/tasks/npm.ts +++ b/packages/belt-cli/src/commands/provision/tasks/npm.ts @@ -1,23 +1,16 @@ +import execa from "../../../modules/execa.js"; +import { readNodeModules } from "../utils.js"; - -import execa from '../modules/execa'; -import { readNodeModules } from '../utils'; - -export default { - setup, - extract -}; - -async function setup({ packages }) { +export async function setup({ packages }: { packages: { name: string }[] }) { for (const pkg of packages) { await execa('npm', ['install', '--global', pkg.name], { stdio: 'inherit' }); } } -function extract() { +export function extract() { const npmPackagesPath = `${process.env.HOME}/.npm-packages/lib/node_modules`; // @TODO: find via ~/.npmrc with fallback to default - const packages = readNodeModules(npmPackagesPath).map(pkg => { + const packages = readNodeModules(npmPackagesPath).map((pkg) => { return { name: pkg.name, version: pkg.version }; }); diff --git a/packages/belt-cli/src/commands/provision/tasks/submodules.ts b/packages/belt-cli/src/commands/provision/tasks/submodules.ts index 07009f6..478fbf9 100644 --- a/packages/belt-cli/src/commands/provision/tasks/submodules.ts +++ b/packages/belt-cli/src/commands/provision/tasks/submodules.ts @@ -1,19 +1,16 @@ - - import fs from 'fs'; import chalk from 'chalk'; // const parse = require('parse-github-repo-url'); -import execa from '../modules/execa'; - -import { evalTemplate, ensureParentDir } from '../utils'; +import execa from "../../../modules/execa.js"; -export default { - setup, - extract -}; +import { evalTemplate, ensureParentDir } from "../utils.js"; -async function setup({ modules }) { +export async function setup({ + modules, +}: { + modules: { repo: string; sha: string; dest: string }[]; +}) { for (const mod of modules) { // const repoName = parse(mod.repo)[1]; const dest = evalTemplate(mod.dest); @@ -23,7 +20,7 @@ async function setup({ modules }) { await execa('git', ['clone', mod.repo, dest]); } - const sha = await execa.stdout('git', ['rev-parse', 'HEAD'], { cwd: dest }); + const sha = await execa('git', ['rev-parse', 'HEAD'], { cwd: dest }); if (sha !== mod.sha) { await execa('git', ['checkout', mod.sha], { cwd: dest }); @@ -33,6 +30,6 @@ async function setup({ modules }) { } } -function extract() { +export function extract() { throw new Error(`not implemented`); } diff --git a/packages/belt-cli/src/commands/provision/tasks/symlinks.ts b/packages/belt-cli/src/commands/provision/tasks/symlinks.ts index 543b446..a87a5da 100644 --- a/packages/belt-cli/src/commands/provision/tasks/symlinks.ts +++ b/packages/belt-cli/src/commands/provision/tasks/symlinks.ts @@ -2,15 +2,11 @@ import fs from 'fs'; import chalk from 'chalk'; -import execa from '../modules/execa'; -import { evalTemplate, ensureParentDir } from '../utils'; +import execa from "../../../modules/execa.js"; +import { evalTemplate, ensureParentDir } from "../utils.js"; -export default { - setup -}; - -async function setup(symLinks) { - for (const { src, dest, disable } of symLinks.targets) { +export async function setup(symLinks: any) { + for (const { src, dest, disable } of symLinks.targets as any[]) { if (disable) { console.log(`${chalk.grey('✔️')} ${dest} (skip)`); continue; @@ -22,7 +18,7 @@ async function setup(symLinks) { ensureParentDir(destPath); if (!fs.existsSync(destPath)) { - await execa('ln', ['-s', srcPath, destPath]); + await execa('ln', ['-s', srcPath, destPath], {}); console.log(`${chalk.green('✔️')} ${srcPath} -> ${destPath}`); } else { const stat = fs.lstatSync(destPath); diff --git a/packages/belt-cli/src/commands/provision/utils.ts b/packages/belt-cli/src/commands/provision/utils.ts index 927c396..a8f7a4b 100644 --- a/packages/belt-cli/src/commands/provision/utils.ts +++ b/packages/belt-cli/src/commands/provision/utils.ts @@ -1,28 +1,17 @@ - - import fs from 'fs'; import path from 'path'; -import mkdirp from 'mkdirp'; -import execa from '../modules/execa'; - -export default { - evalTemplate, - ensureParentDir, - readNodeModules, - readGitModules, - readZshHistory, -}; +import execa from "../../modules/execa.js"; const ctx = { HOME: process.env.HOME, - DOTFILES: `${process.env.HOME}/dotfiles` + DOTFILES: `${process.env.HOME}/dotfiles`, }; -function evalTemplate(template) { +export function evalTemplate(template: string) { const regExp = /\$(\w+)/g; - return template.replace(regExp, (match, group) => { - const variable = ctx[group]; + return template.replace(regExp, (match: string, group: string) => { + const variable = (ctx as any)[group]; if (!variable) { throw new Error(`unknown variable ${group}`); @@ -32,36 +21,40 @@ function evalTemplate(template) { }); } -function ensureParentDir(filePath) { - mkdirp.sync(path.dirname(filePath)); +export function ensureParentDir(filePath: string) { + fs.mkdirSync(path.dirname(filePath), { recursive: true }); } -function readNodeModules(dirPath) { - const packages = fs.readdirSync(dirPath).reduce((total, dir) => { - const modulePath = `${dirPath}/${dir}`; +export function readNodeModules(dirPath: string): any[] { + const packages = fs + .readdirSync(dirPath) + .reduce((total: any[], dir: string) => { + const modulePath = `${dirPath}/${dir}`; - if (dir[0] === '@') { - total.push.apply(total, readNodeModules(modulePath)); - } else { - const pkgPath = `${modulePath}/package.json`; - const pkg = JSON.parse(fs.readFileSync(pkgPath)); + if (dir[0] === '@') { + total.push.apply(total, readNodeModules(modulePath)); + } else { + const pkgPath = `${modulePath}/package.json`; + const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')); - total.push(pkg); - } + total.push(pkg); + } - return total; - }, []); + return total; + }, [] as any[]); return packages; } -async function readGitModules(dirPath) { - const modules = []; +export async function readGitModules(dirPath: string) { + const modules: any[] = []; for (const dir of fs.readdirSync(dirPath)) { const modulePath = `${dirPath}/${dir}`; - const repo = await execa.stdout('git', ['config', '--get', 'remote.origin.url'], { cwd: modulePath }); - const sha = await execa.stdout('git', ['rev-parse', 'HEAD'], { cwd: modulePath }); + const repo = await execa('git', ['config', '--get', 'remote.origin.url'], { + cwd: modulePath, + }); + const sha = await execa('git', ['rev-parse', 'HEAD'], { cwd: modulePath }); modules.push({ repo, sha }); } @@ -69,23 +62,26 @@ async function readGitModules(dirPath) { return modules; } -function readZshHistory() { +export function readZshHistory() { const zshHistoryPath = `${process.env.HOME}/.zsh_history`; - const lines = fs.readFileSync(zshHistoryPath, 'utf-8').split('\n').reduce((acc, line) => { - if (line[0] === ':') { - line = line.substring(line.indexOf(';') + 1); - } - - const prevLine = acc[acc.length - 1] || ''; - - if (prevLine.substring(prevLine.length - 2) === '\\\\') { - acc[acc.length - 1] = prevLine.substring(0, prevLine.length - 2) + line; - } else { - acc.push(line); - } - - return acc; - }, []); + const lines = fs + .readFileSync(zshHistoryPath, 'utf-8') + .split('\n') + .reduce((acc: string[], line: string) => { + if (line[0] === ':') { + line = line.substring(line.indexOf(';') + 1); + } + + const prevLine = acc[acc.length - 1] || ''; + + if (prevLine.substring(prevLine.length - 2) === '\\\\') { + acc[acc.length - 1] = prevLine.substring(0, prevLine.length - 2) + line; + } else { + acc.push(line); + } + + return acc; + }, [] as string[]); return lines; } diff --git a/packages/belt-cli/src/commands/repo-open.ts b/packages/belt-cli/src/commands/repo-open.ts index 6d9eb62..adefc4a 100644 --- a/packages/belt-cli/src/commands/repo-open.ts +++ b/packages/belt-cli/src/commands/repo-open.ts @@ -1,17 +1,13 @@ -import execa from '../modules/execa'; -import opn from '../modules/opn'; +import execa from "../modules/execa.js"; +import opn from "../modules/opn.js"; import gitUrlParse from 'git-url-parse'; -export default { - run -}; - -async function run({ argv }) { - const remoteUrl = await execa('git', ['remote', 'get-url', argv.origin || 'origin']); +export async function run({ argv }: { argv: any }) { + const remoteUrl = (await execa('git', ['remote', 'get-url', argv.origin || 'origin'], {})) || ''; const { resource, owner, name } = gitUrlParse(remoteUrl); const url = `http://${resource}/${owner}/${name}`; - opn(url); + opn(url, {}); } diff --git a/packages/belt-cli/src/index.ts b/packages/belt-cli/src/index.ts index d32dc36..e4608f0 100644 --- a/packages/belt-cli/src/index.ts +++ b/packages/belt-cli/src/index.ts @@ -1,6 +1,14 @@ +import fs from 'fs'; import path from 'path'; +import { dirname } from 'path'; +import { fileURLToPath } from 'url'; +import minimist from 'minimist'; +import groupBy from 'lodash/groupBy.js'; +import sortBy from 'lodash/sortBy.js'; +import type { Ctx } from "./interface.js"; -const argv = require('minimist')(process.argv.slice(2), { string: '_' }); +const __dirname = dirname(fileURLToPath(import.meta.url)); +const argv = minimist(process.argv.slice(2), { string: '_' }); if (argv._[0] === 'list') { printHelp(); @@ -10,7 +18,7 @@ if (argv._[0] === 'list') { printHelp(); } -async function run({ argv }) { +async function run({ argv }: { argv: any }) { const commands = getCommands(); const command = commands[argv._[0]]; @@ -20,40 +28,43 @@ async function run({ argv }) { argv._.splice(0, 1); - const ctx = { + const ctx: Ctx = { argv, command, }; - const mod = require(command.scriptPath); + const mod = await import(command.scriptPath); await mod.run(ctx); } function printHelp() { - const groupBy = require('lodash.groupby'); - const sortBy = require('lodash.sortby'); const commands = getCommands(); - const groups = Object.entries(groupBy(Object.entries(commands), ([command]) => { - const parts = command.split(':'); - return parts.length === 1 ? '_' : parts[0]; - })); + const groups = Object.entries( + groupBy(Object.entries(commands), ([command]: [string, any]) => { + const parts = command.split(':'); + return parts.length === 1 ? '_' : parts[0]; + }) + ); - const noPrefix = groups.find(_ => _[0] === '_') || ['_', []]; - const prefixed = sortBy(groups.filter(_ => _[0] !== '_'), '[0]'); + const noPrefix = groups.find((_: [string, any]) => _[0] === '_') || ['_', []]; + const prefixed = sortBy( + groups.filter((_: [string, any]) => _[0] !== '_'), + '[0]' + ); - sortBy(noPrefix[1], '[0]').forEach(([command, info]) => { + sortBy(noPrefix[1], '[0]').forEach(([command, info]: [string, any]) => { console.log(`- ${command} (${info.description})`); }); - let prevLength = noPrefix[1].length; + let prevLength = (noPrefix[1] as any[]).length; - prefixed.forEach(([, commands]) => { + prefixed.forEach(([, commands]: [string, any[]]) => { if (prevLength > 1) { console.log(); } - sortBy(commands, '[0]').forEach(([command, info]) => { + sortBy(commands, '[0]').forEach(([command, info]: [string, any]) => { console.log(`- ${command} (${info.description})`); }); @@ -62,20 +73,23 @@ function printHelp() { } function getCommands() { - const pkgPath = require.resolve('./package.json'); - const pkgDir = path.dirname(pkgPath); - const pkg = require(pkgPath); - return Object.entries(pkg.belt.commands).reduce((commands, [name, info]) => { - const scriptPath = `${pkgDir}/${info.script}`; - commands[name] = { - name, - pkg, - pkgName: pkg.name, - pkgPath, - scriptPath, - description: info.description || '' - }; - - return commands; - }, {}); + const pkgDir = path.resolve(`${__dirname}/..`); + const pkgPath = path.resolve(`${pkgDir}/package.json`); + const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')); + return Object.entries((pkg.belt as any).commands).reduce( + (commands: any, [name, info]: [string, any]) => { + const scriptPath = `${pkgDir}/dist/${(info as any).script}.js`; + commands[name] = { + name, + pkg, + pkgName: pkg.name, + pkgPath, + scriptPath, + description: (info as any).description || '', + }; + + return commands; + }, + {} + ); } diff --git a/packages/belt-cli/src/interface.ts b/packages/belt-cli/src/interface.ts new file mode 100644 index 0000000..d0e49bd --- /dev/null +++ b/packages/belt-cli/src/interface.ts @@ -0,0 +1,11 @@ +import type minimist from "minimist"; + +export interface Ctx { + command: Command; + argv: minimist.ParsedArgs; +} + +export interface Command { + script: string; + description: string; +} diff --git a/packages/belt-cli/src/modules/execa.ts b/packages/belt-cli/src/modules/execa.ts index c85fa12..3ce071c 100644 --- a/packages/belt-cli/src/modules/execa.ts +++ b/packages/belt-cli/src/modules/execa.ts @@ -1,13 +1,9 @@ - - -import { execa } from 'execa'; -import { logShell } from './log'; - -export default execaProxy; +import { execa as ogExeca } from 'execa'; +import { logShell } from "./log.js"; // seems cleaner without abstractions -async function execaProxy(cmd, args, opts) { +export default async function execaProxy(cmd: string, args: string[], opts?: any) { logShell([cmd, ...args]); - const { stdout } = await execa(cmd, args, opts); + const { stdout } = await ogExeca(cmd, args, opts); return stdout; } diff --git a/packages/belt-cli/src/modules/log.ts b/packages/belt-cli/src/modules/log.ts index 7ccd6d8..e22ace9 100644 --- a/packages/belt-cli/src/modules/log.ts +++ b/packages/belt-cli/src/modules/log.ts @@ -1,17 +1,10 @@ - - import shellEscape from 'any-shell-escape'; import chalk from 'chalk'; -export default { - log, - logShell -}; - -function log(str) { +export function log(str: string) { console.error(chalk.grey(str)); } -function logShell(args) { +export function logShell(args: string[]) { log(`$ ${shellEscape(args)}`); } diff --git a/packages/belt-cli/src/modules/opn.ts b/packages/belt-cli/src/modules/opn.ts index 2087efc..36adeee 100644 --- a/packages/belt-cli/src/modules/opn.ts +++ b/packages/belt-cli/src/modules/opn.ts @@ -1,14 +1,10 @@ +import ogOpn from 'opn'; +import { logShell } from "./log.js"; - -import opn from 'opn'; -import { logShell } from './log'; - -export default opnProxy; - -function opnProxy(url, opts) { +export default function opn(url: string, opts?: any) { // sorry windows, it's complex https://github.com/sindresorhus/opn/blob/cfab3f9ba2096b00fef655f454be65b070f49d8a/index.js#L34 const cmd = process.platform === 'darwin' ? 'open' : 'xdg-open'; logShell([cmd, url]); - return opn(url, opts); + return ogOpn(url, opts); } diff --git a/packages/belt-cli/src/types.d.ts b/packages/belt-cli/src/types.d.ts index 56b7aeb..1b833f3 100644 --- a/packages/belt-cli/src/types.d.ts +++ b/packages/belt-cli/src/types.d.ts @@ -2,3 +2,11 @@ declare module 'any-shell-escape' { function shellEscape(args: string[]): string; export = shellEscape; } + +declare module 'prompts'; +declare module 'opn'; +declare module 'qs'; +declare module 'ncp'; +declare module 'babylon'; +declare module 'babel-core'; +declare module 'builtin-modules'; diff --git a/yarn.lock b/yarn.lock index 8a12223..d386691 100644 --- a/yarn.lock +++ b/yarn.lock @@ -112,14 +112,18 @@ __metadata: version: 0.0.0-use.local resolution: "@belt/cli@workspace:packages/belt-cli" dependencies: + "@types/js-yaml": "npm:^4.0.9" + "@types/lodash": "npm:^4.17.20" + "@types/make-dir": "npm:^2.1.0" "@types/minimist": "npm:^1.2.5" + "@types/opn": "npm:^5.5.0" + "@types/prompts": "npm:^2.4.9" any-shell-escape: "npm:^0.1.1" chalk: "npm:^2.4.1" execa: "npm:^9.6.0" git-url-parse: "npm:^16.1.0" globby: "npm:^14.1.0" - lodash.groupby: "npm:^4.6.0" - lodash.sortby: "npm:^4.7.0" + lodash: "npm:^4.17.21" make-dir: "npm:^1.3.0" minimist: "npm:^1.2.0" opn: "npm:^6.0.0" @@ -192,6 +196,29 @@ __metadata: languageName: node linkType: hard +"@types/js-yaml@npm:^4.0.9": + version: 4.0.9 + resolution: "@types/js-yaml@npm:4.0.9" + checksum: 10c0/24de857aa8d61526bbfbbaa383aa538283ad17363fcd5bb5148e2c7f604547db36646440e739d78241ed008702a8920665d1add5618687b6743858fae00da211 + languageName: node + linkType: hard + +"@types/lodash@npm:^4.17.20": + version: 4.17.20 + resolution: "@types/lodash@npm:4.17.20" + checksum: 10c0/98cdd0faae22cbb8079a01a3bb65aa8f8c41143367486c1cbf5adc83f16c9272a2a5d2c1f541f61d0d73da543c16ee1d21cf2ef86cb93cd0cc0ac3bced6dd88f + languageName: node + linkType: hard + +"@types/make-dir@npm:^2.1.0": + version: 2.1.0 + resolution: "@types/make-dir@npm:2.1.0" + dependencies: + make-dir: "npm:*" + checksum: 10c0/975053fb88f010b6db7d95a1a1731cfab1b60ec96339eea3774b7587c84c09ce774a1ad87cfa6badaa2beda584b8c00961c1935356059cbc14c2b8150bcf1b00 + languageName: node + linkType: hard + "@types/minimist@npm:^1.2.5": version: 1.2.5 resolution: "@types/minimist@npm:1.2.5" @@ -199,6 +226,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:*": + version: 24.3.0 + resolution: "@types/node@npm:24.3.0" + dependencies: + undici-types: "npm:~7.10.0" + checksum: 10c0/96bdeca01f690338957c2dcc92cb9f76c262c10398f8d91860865464412b0f9d309c24d9b03d0bdd26dd47fa7ee3f8227893d5c89bc2009d919a525a22512030 + languageName: node + linkType: hard + "@types/node@npm:22": version: 22.18.0 resolution: "@types/node@npm:22.18.0" @@ -208,6 +244,15 @@ __metadata: languageName: node linkType: hard +"@types/opn@npm:^5.5.0": + version: 5.5.0 + resolution: "@types/opn@npm:5.5.0" + dependencies: + opn: "npm:*" + checksum: 10c0/349c57dc1bd69dca0c15ffa3baf71c5fb583a57eaa00d30af5c8b5b3cb5ec6417b6bc64961c07f02b0711ef421512a852c00c9595d441b0feaa7669e12c7c32d + languageName: node + linkType: hard + "@types/parse-path@npm:^7.0.0": version: 7.0.3 resolution: "@types/parse-path@npm:7.0.3" @@ -215,6 +260,16 @@ __metadata: languageName: node linkType: hard +"@types/prompts@npm:^2.4.9": + version: 2.4.9 + resolution: "@types/prompts@npm:2.4.9" + dependencies: + "@types/node": "npm:*" + kleur: "npm:^3.0.3" + checksum: 10c0/22fe0da6807681c85e88ba283184f4be4c8a95c744ea12a638865c98c4e0c22e7f733542f6b0f1fbca02245cdc3fe84feacf9c9adf4ddd8bc98a337fd679d8d2 + languageName: node + linkType: hard + "acorn-jsx@npm:^3.0.0": version: 3.0.1 resolution: "acorn-jsx@npm:3.0.1" @@ -1181,6 +1236,13 @@ __metadata: languageName: node linkType: hard +"kleur@npm:^3.0.3": + version: 3.0.3 + resolution: "kleur@npm:3.0.3" + checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b + languageName: node + linkType: hard + "levn@npm:^0.3.0, levn@npm:~0.3.0": version: 0.3.0 resolution: "levn@npm:0.3.0" @@ -1191,21 +1253,7 @@ __metadata: languageName: node linkType: hard -"lodash.groupby@npm:^4.6.0": - version: 4.6.0 - resolution: "lodash.groupby@npm:4.6.0" - checksum: 10c0/3d136cad438ad6c3a078984ef60e057a3498b1312aa3621b00246ecb99e8f2c4d447e2815460db7a0b661a4fe4e2eeee96c84cb661a824bad04b6cf1f7bc6e9b - languageName: node - linkType: hard - -"lodash.sortby@npm:^4.7.0": - version: 4.7.0 - resolution: "lodash.sortby@npm:4.7.0" - checksum: 10c0/fc48fb54ff7669f33bb32997cab9460757ee99fafaf72400b261c3e10fde21538e47d8cfcbe6a25a31bcb5b7b727c27d52626386fc2de24eb059a6d64a89cdf5 - languageName: node - linkType: hard - -"lodash@npm:^4.17.4, lodash@npm:^4.2.0, lodash@npm:^4.3.0": +"lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.2.0, lodash@npm:^4.3.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c @@ -1233,6 +1281,13 @@ __metadata: languageName: node linkType: hard +"make-dir@npm:*": + version: 5.0.0 + resolution: "make-dir@npm:5.0.0" + checksum: 10c0/3485deb28f07d6ae5858e011deac74f1333a74f9ac3a5580b8bf86c7d3234615611f237d9287e30cebb05f74dd92572fd4f78eabf7f47ed69ec233c599e8a50a + languageName: node + linkType: hard + "make-dir@npm:^1.3.0": version: 1.3.0 resolution: "make-dir@npm:1.3.0" @@ -1356,6 +1411,15 @@ __metadata: languageName: node linkType: hard +"opn@npm:*": + version: 5.5.0 + resolution: "opn@npm:5.5.0" + dependencies: + is-wsl: "npm:^1.1.0" + checksum: 10c0/03f78b1ab464fd0d97543e2a90e47ca872e2324696bc13f741467693060fe058e87e38e9cfc9f3b568e60dfb31579fbe664d8e806b2f219262c423da953bba4c + languageName: node + linkType: hard + "opn@npm:^6.0.0": version: 6.0.0 resolution: "opn@npm:6.0.0" @@ -1925,6 +1989,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~7.10.0": + version: 7.10.0 + resolution: "undici-types@npm:7.10.0" + checksum: 10c0/8b00ce50e235fe3cc601307f148b5e8fb427092ee3b23e8118ec0a5d7f68eca8cee468c8fc9f15cbb2cf2a3797945ebceb1cbd9732306a1d00e0a9b6afa0f635 + languageName: node + linkType: hard + "unicorn-magic@npm:^0.3.0": version: 0.3.0 resolution: "unicorn-magic@npm:0.3.0" From 92018ddf810427206e0b415e6212670d99a61410 Mon Sep 17 00:00:00 2001 From: ewnd9 Date: Fri, 29 Aug 2025 13:44:19 +0300 Subject: [PATCH 3/4] replace eslint with biome --- .eslintignore | 1 - .eslintrc.js | 25 - .github/workflows/ci.yml | 6 +- .husky/pre-commit | 3 + .vscode/settings.json | 18 + biome.jsonc | 25 + package.json | 11 +- packages/belt-cli/package.json | 3 +- packages/belt-cli/src/commands/flash-drive.ts | 18 +- .../src/commands/incantation/index.ts | 28 +- .../src/commands/incantation/utils.ts | 7 +- packages/belt-cli/src/commands/init/index.ts | 52 +- .../belt-cli/src/commands/install-deps.ts | 12 +- packages/belt-cli/src/commands/licensify.ts | 19 +- packages/belt-cli/src/commands/lint-shell.ts | 12 +- .../belt-cli/src/commands/provision/index.ts | 7 +- .../src/commands/provision/tasks/apt.ts | 6 +- .../src/commands/provision/tasks/brew.ts | 35 +- .../src/commands/provision/tasks/code.ts | 16 +- .../src/commands/provision/tasks/npm.ts | 4 +- .../commands/provision/tasks/submodules.ts | 12 +- .../src/commands/provision/tasks/symlinks.ts | 8 +- .../belt-cli/src/commands/provision/utils.ts | 32 +- packages/belt-cli/src/commands/repo-open.ts | 6 +- packages/belt-cli/src/index.ts | 44 +- packages/belt-cli/src/interface.ts | 2 +- packages/belt-cli/src/modules/execa.ts | 2 +- packages/belt-cli/src/modules/opn.ts | 2 +- packages/belt-cli/tsconfig.json | 2 +- yarn.lock | 1407 ++--------------- 30 files changed, 281 insertions(+), 1544 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js create mode 100644 .husky/pre-commit create mode 100644 .vscode/settings.json create mode 100644 biome.jsonc diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 3c3629e..0000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 7b3563a..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -module.exports = { - parser: 'babel-eslint', - env: { - node: true - }, - globals: { - Promise: true - }, - rules: { - 'arrow-parens': [ - 2, - 'as-needed' - ], - 'no-const-assign': 2, - 'no-undef': 2, - 'no-unused-vars': 2, - 'object-shorthand': 2, - 'prefer-const': [2, { - 'destructuring': 'all', - 'ignoreReadBeforeAssign': false - }] - } -}; diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8df9faf..2874c93 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,8 +26,8 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: "22" - cache: "yarn" + node-version: '22' + cache: 'yarn' - name: Install dependencies run: yarn install @@ -36,7 +36,7 @@ jobs: run: cd packages/belt-cli && npm install -g . - name: Run lint - run: yarn precommit + run: ./.husky/pre-commit # - name: Run turbo # run: SKIP_ENV_VALIDATION=true yarn turbo --env-mode=loose typecheck build diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..24d45b1 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,3 @@ +#!/bin/bash + +yarn lint && yarn lint:shell diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..daca3a2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,18 @@ +{ + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports.biome": true + }, + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[json]": { + "editor.defaultFormatter": "biomejs.biome" + } +} diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 0000000..7ab3788 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,25 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.2.2/schema.json", + "files": { + "includes": ["**", "!node_modules/*", "!**/node_modules/*", "!**/dist/*"] + }, + "linter": { + "enabled": true, + "rules": { + "suspicious": { + "noExplicitAny": "off" + } + } + }, + "formatter": { + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "jsxQuoteStyle": "double" + } + } +} diff --git a/package.json b/package.json index 9e750c7..9492aa3 100644 --- a/package.json +++ b/package.json @@ -5,17 +5,16 @@ "packages/*" ], "devDependencies": { + "@biomejs/biome": "^2.2.2", "@tsconfig/node-ts": "^23.6.1", "@tsconfig/node22": "^22.0.2", "@types/node": "22", - "babel-eslint": "^8.2.3", - "eslint": "^4.19.1", - "husky": "^0.14.3", + "husky": "^9.1.7", "typescript": "^5.9.2" }, "scripts": { - "precommit": "yarn lint && yarn lint:shell", - "lint": "eslint 'packages/**/*.js'", - "lint:shell": "belt ewnd9:lint-shell" + "lint": "biome check ./packages/belt-cli/ --write", + "lint:shell": "belt ewnd9:lint-shell", + "prepare": "husky" } } diff --git a/packages/belt-cli/package.json b/packages/belt-cli/package.json index 42dd7af..98719d1 100644 --- a/packages/belt-cli/package.json +++ b/packages/belt-cli/package.json @@ -4,9 +4,8 @@ "description": "Global CLI scripts registry", "private": true, "type": "module", - "main": "dist/index.js", "bin": { - "belt": "dist/index.js" + "belt": "cli.js" }, "author": "ewnd9 ", "license": "MIT", diff --git a/packages/belt-cli/src/commands/flash-drive.ts b/packages/belt-cli/src/commands/flash-drive.ts index c8c5abb..12c501d 100644 --- a/packages/belt-cli/src/commands/flash-drive.ts +++ b/packages/belt-cli/src/commands/flash-drive.ts @@ -1,7 +1,5 @@ - - -import execa from "../modules/execa.js"; import prompts from 'prompts'; +import execa from '../modules/execa.js'; export async function run() { const dir = '/media/flashdrive'; @@ -21,10 +19,10 @@ export async function run() { return { title: parts.join(' '), - value: i + value: i, }; }), - initial: devices.length - 1 + initial: devices.length - 1, }); const device = devices[value]; @@ -56,9 +54,8 @@ async function getDevices() { async function getMounts() { const stdout = (await execa('cat', ['/proc/mounts'], {})) || ''; - return stdout - .split('\n') - .reduce((acc: Record, line: string) => { + return stdout.split('\n').reduce( + (acc: Record, line: string) => { const [src, dest] = line.split(' '); if (src.startsWith('/dev/sd')) { @@ -66,6 +63,7 @@ async function getMounts() { } return acc; - }, {} as Record) + }, + {} as Record, + ); } - diff --git a/packages/belt-cli/src/commands/incantation/index.ts b/packages/belt-cli/src/commands/incantation/index.ts index ff64c00..e76919a 100644 --- a/packages/belt-cli/src/commands/incantation/index.ts +++ b/packages/belt-cli/src/commands/incantation/index.ts @@ -1,9 +1,7 @@ - - -import fs from 'fs'; -import yaml from 'js-yaml'; +import fs from 'node:fs'; import { globby } from 'globby'; -import { rootPath, generateCode } from "./utils.js"; +import yaml from 'js-yaml'; +import { generateCode, rootPath } from './utils.js'; export async function run() { const snippetsPath = `${rootPath}/snippets`; @@ -34,28 +32,22 @@ export async function run() { `${rootPath}/config/code/snippets/javascript.json`, `${rootPath}/config/code/snippets/javascriptreact.json`, `${rootPath}/config/code/snippets/typescript.json`, - `${rootPath}/config/code/snippets/typescriptreact.json` - ] + `${rootPath}/config/code/snippets/typescriptreact.json`, + ], }, json: { - code: `${rootPath}/config/code/snippets/json.json` + code: `${rootPath}/config/code/snippets/json.json`, }, jsonc: { - code: `${rootPath}/config/code/snippets/jsonc.json` + code: `${rootPath}/config/code/snippets/jsonc.json`, }, markdown: { - code: [ - `${rootPath}/config/code/snippets/markdown.json` - ] - } + code: [`${rootPath}/config/code/snippets/markdown.json`], + }, }; Object.entries(snippets).forEach(([lang, snippets]: [string, any]) => { - generateCode( - lang, - snippets, - arrayify((paths as any)[lang].code) - ); + generateCode(lang, snippets, arrayify((paths as any)[lang].code)); }); } diff --git a/packages/belt-cli/src/commands/incantation/utils.ts b/packages/belt-cli/src/commands/incantation/utils.ts index 92da448..c90809b 100644 --- a/packages/belt-cli/src/commands/incantation/utils.ts +++ b/packages/belt-cli/src/commands/incantation/utils.ts @@ -1,15 +1,16 @@ -import fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; export const rootPath = path.resolve(`${__dirname}/../../../..`); -export function generateCode(lang: string, snippets: any[], paths: string[]) { +export function generateCode(_lang: string, snippets: any[], paths: string[]) { const result = snippets.reduce((total: any, { name, prefix, body }: any) => { total[name] = { prefix, // vs-code needs to encode ${string} to $\\{string\\} // see https://github.com/Microsoft/vscode/issues/1670 // body: body.replace(/\\([\{\}])/gm, '$1'), + // biome-ignore lint/suspicious/noTemplateCurlyInString: see above body: body.replace(/\$\{([_a-zA-Z]+)\}/gm, '${$1\\}'), description: name, }; diff --git a/packages/belt-cli/src/commands/init/index.ts b/packages/belt-cli/src/commands/init/index.ts index 78c6518..9a1a389 100644 --- a/packages/belt-cli/src/commands/init/index.ts +++ b/packages/belt-cli/src/commands/init/index.ts @@ -1,15 +1,15 @@ -import fs from 'fs'; -import execa from "../../modules/execa.js"; +import fs from 'node:fs'; import gitUrlParse from 'git-url-parse'; -import qs from 'qs'; -import ncp from 'ncp'; -import prompts from 'prompts'; -import kebabCase from 'lodash/kebabCase'; -import snakeCase from 'lodash/snakeCase'; import camelCase from 'lodash/camelCase'; import upperFirst from 'lodash/camelCase'; +import kebabCase from 'lodash/kebabCase'; +import snakeCase from 'lodash/snakeCase'; import upperCase from 'lodash/upperCase'; -import type { Ctx } from "../../interface.js"; +import ncp from 'ncp'; +import prompts from 'prompts'; +import qs from 'qs'; +import type { Ctx } from '../../interface.js'; +import execa from '../../modules/execa.js'; export async function run({ argv }: Ctx) { const ctx = getContext(argv as any); @@ -72,26 +72,11 @@ export async function run({ argv }: Ctx) { } const result = data - .replace( - new RegExp('generator-template', 'g'), - kebabCase(ctx.name) - ) - .replace( - new RegExp('generator_template', 'g'), - snakeCase(ctx.name) - ) - .replace( - new RegExp('generatorTemplate', 'g'), - camelCase(ctx.name) - ) - .replace( - new RegExp('GeneratorTemplate', 'g'), - upperFirst(camelCase(ctx.name)) - ) - .replace( - new RegExp('GENERATOR_TEMPLATE', 'g'), - upperCase(snakeCase(ctx.name)) - ); + .replace(/generator-template/g, kebabCase(ctx.name)) + .replace(/generator_template/g, snakeCase(ctx.name)) + .replace(/generatorTemplate/g, camelCase(ctx.name)) + .replace(/GeneratorTemplate/g, upperFirst(camelCase(ctx.name))) + .replace(/GENERATOR_TEMPLATE/g, upperCase(snakeCase(ctx.name))); fs.writeFile(write.path, result, 'utf8', (err) => { if (err) { @@ -109,7 +94,7 @@ export async function run({ argv }: Ctx) { } else { resolve(true); } - } + }, ); }); } @@ -124,9 +109,7 @@ function getContext({ template: string | undefined; }) { const parseResult = gitUrlParse(repoUrl); - const { branch = 'master', path: overridenTemplatePath } = qs.parse( - parseResult.search - ); + const { branch = 'master', path: overridenTemplatePath } = qs.parse(parseResult.search); const templatePath = overridenTemplatePath || template; return { @@ -134,10 +117,7 @@ function getContext({ repoUrl, branch, templatePath, - repoDir: `${process.env.HOME}/.cache/belt-ewnd9-init/${[ - parseResult.source, - parseResult.full_name, - ] + repoDir: `${process.env.HOME}/.cache/belt-ewnd9-init/${[parseResult.source, parseResult.full_name] .join('-') .replace(/\W+/g, '-')}`, name: name || templatePath.split('/').pop(), diff --git a/packages/belt-cli/src/commands/install-deps.ts b/packages/belt-cli/src/commands/install-deps.ts index 5093bf0..72049ef 100644 --- a/packages/belt-cli/src/commands/install-deps.ts +++ b/packages/belt-cli/src/commands/install-deps.ts @@ -1,10 +1,10 @@ -import fs from 'fs/promises'; -import path from 'path'; -import { parse } from 'babylon'; +import fs from 'node:fs/promises'; +import path from 'node:path'; import { traverse } from 'babel-core'; +import { parse } from 'babylon'; import builtinModules from 'builtin-modules'; import { globby } from 'globby'; -import type { Ctx } from "../interface.js"; +import type { Ctx } from '../interface.js'; export async function run({ argv }: Ctx) { const cwd = path.resolve(process.cwd(), argv._[0] || '.'); @@ -22,9 +22,7 @@ export async function run({ argv }: Ctx) { const content = await fs.readFile(file, 'utf-8'); const ast = parse(content); const deps = getDeps(ast); - const external = deps.filter( - (dep) => dep && !dep.startsWith('.') && !builtinModules.includes(dep) - ); + const external = deps.filter((dep) => dep && !dep.startsWith('.') && !builtinModules.includes(dep)); for (const dep of external) { if (pkgDeps[dep]) { diff --git a/packages/belt-cli/src/commands/licensify.ts b/packages/belt-cli/src/commands/licensify.ts index 84d9c83..cf20b8a 100644 --- a/packages/belt-cli/src/commands/licensify.ts +++ b/packages/belt-cli/src/commands/licensify.ts @@ -1,7 +1,5 @@ - - -import fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; export async function run() { const pkgPath = './package.json'; @@ -11,20 +9,13 @@ export async function run() { Object.assign(json, { repository: { type: 'git', - url: `git+https://github.com/ewnd9/${path.basename(process.cwd())}.git` + url: `git+https://github.com/ewnd9/${path.basename(process.cwd())}.git`, }, author: 'ewnd9 ', - license: 'MIT' + license: 'MIT', }); fs.writeFileSync(pkgPath, JSON.stringify(json, null, 2)); - fs.appendFileSync('./README.md', [ - '## License', - '', - 'MIT © [ewnd9](http://ewnd9.com)', - '' - ].join('\n')); + fs.appendFileSync('./README.md', ['## License', '', 'MIT © [ewnd9](http://ewnd9.com)', ''].join('\n')); } - - diff --git a/packages/belt-cli/src/commands/lint-shell.ts b/packages/belt-cli/src/commands/lint-shell.ts index e55c960..a35f1d8 100644 --- a/packages/belt-cli/src/commands/lint-shell.ts +++ b/packages/belt-cli/src/commands/lint-shell.ts @@ -1,14 +1,16 @@ +import path, { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; - -import path from 'path'; -import execa from "../modules/execa.js"; import { globby } from 'globby'; -const rootPath = path.resolve(`${__dirname}/../../..`); +import execa from '../modules/execa.js'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const rootPath = path.resolve(`${__dirname}/../../../..`); export async function run() { const files = await globby(['scripts/**/*.sh', '!scripts/gnome-terminal-themes/one-dark.sh'], { cwd: rootPath, - gitignore: true + gitignore: true, }); await execa('shellcheck', [...files], { cwd: rootPath, stdio: 'inherit' }); diff --git a/packages/belt-cli/src/commands/provision/index.ts b/packages/belt-cli/src/commands/provision/index.ts index b1e3e7b..7930a2f 100644 --- a/packages/belt-cli/src/commands/provision/index.ts +++ b/packages/belt-cli/src/commands/provision/index.ts @@ -1,7 +1,5 @@ - - -import fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; import yaml from 'js-yaml'; export async function run({ argv }: { argv: any }) { @@ -22,4 +20,3 @@ export async function run({ argv }: { argv: any }) { console.log('use --extract or --setup '); } } - diff --git a/packages/belt-cli/src/commands/provision/tasks/apt.ts b/packages/belt-cli/src/commands/provision/tasks/apt.ts index 6c999ac..11b35ab 100644 --- a/packages/belt-cli/src/commands/provision/tasks/apt.ts +++ b/packages/belt-cli/src/commands/provision/tasks/apt.ts @@ -1,4 +1,4 @@ -import execa from "../../../modules/execa.js"; +import execa from '../../../modules/execa.js'; export async function setup({ packages }: { packages: { name: string }[] }) { await execa('sudo', ['apt-get', 'update'], { stdio: 'inherit' }); @@ -17,9 +17,7 @@ export async function extract({ packages }: { packages: any }) { } const result = (await execa('dpkg', ['-s', pkg.name], {})) || ''; - const stdout = result - .split('\n') - .find((line: string) => line.startsWith('Version')); + const stdout = result.split('\n').find((line: string) => line.startsWith('Version')); pkg.version = stdout ? stdout.split(' ')[1] : undefined; } diff --git a/packages/belt-cli/src/commands/provision/tasks/brew.ts b/packages/belt-cli/src/commands/provision/tasks/brew.ts index 7b3b738..6165f6d 100644 --- a/packages/belt-cli/src/commands/provision/tasks/brew.ts +++ b/packages/belt-cli/src/commands/provision/tasks/brew.ts @@ -1,7 +1,7 @@ -import prompts from 'prompts'; -import execa from "../../../modules/execa.js"; import uniq from 'lodash/uniq'; -import { readZshHistory } from "../utils.js"; +import prompts from 'prompts'; +import execa from '../../../modules/execa.js'; +import { readZshHistory } from '../utils.js'; interface BrewOptions { packages: { name: string }[]; @@ -24,26 +24,11 @@ export async function setup({ packages, repositories, cask }: BrewOptions) { export async function extract(opts: BrewOptions) { const lines = readZshHistory(); - await parseMissingCommands( - lines, - 'brew install', - (pkg) => `Add "brew install ${pkg}"?`, - opts.packages - ); + await parseMissingCommands(lines, 'brew install', (pkg) => `Add "brew install ${pkg}"?`, opts.packages); - await parseMissingCommands( - lines, - 'brew cask install', - (pkg) => `Add "brew cask install ${pkg}"?`, - opts.cask - ); + await parseMissingCommands(lines, 'brew cask install', (pkg) => `Add "brew cask install ${pkg}"?`, opts.cask); - await parseMissingCommands( - lines, - 'brew tap', - (pkg) => `Add "brew tap ${pkg}"?`, - opts.repositories - ); + await parseMissingCommands(lines, 'brew tap', (pkg) => `Add "brew tap ${pkg}"?`, opts.repositories); return opts; } @@ -52,18 +37,16 @@ async function parseMissingCommands( lines: string[], pattern: string, buildMessage: (pkg: any) => string, - source: { name: string }[] + source: { name: string }[], ) { const pkgs = uniq( lines .filter((line) => line.startsWith(pattern)) .map((line) => line.substring(pattern.length + 1)) - .flatMap((line) => line.split(/\s+/g)) + .flatMap((line) => line.split(/\s+/g)), ); - const missingPkgs = pkgs.filter( - (pkg) => !source.some(({ name }) => name === pkg) - ); + const missingPkgs = pkgs.filter((pkg) => !source.some(({ name }) => name === pkg)); for (const pkg of missingPkgs) { const { value } = await prompts({ diff --git a/packages/belt-cli/src/commands/provision/tasks/code.ts b/packages/belt-cli/src/commands/provision/tasks/code.ts index b660db7..cb83ee4 100644 --- a/packages/belt-cli/src/commands/provision/tasks/code.ts +++ b/packages/belt-cli/src/commands/provision/tasks/code.ts @@ -1,20 +1,12 @@ // https://code.visualstudio.com/docs/editor/extension-gallery -import execa from "../../../modules/execa.js"; +import execa from '../../../modules/execa.js'; -import { readNodeModules } from "../utils.js"; +import { readNodeModules } from '../utils.js'; -export async function setup({ - extensions, -}: { - extensions: { publisher: string; name: string }[]; -}) { +export async function setup({ extensions }: { extensions: { publisher: string; name: string }[] }) { for (const ext of extensions) { - await execa( - 'code', - ['--install-extension', `${ext.publisher}.${ext.name}`], - { stdio: 'inherit' } - ); + await execa('code', ['--install-extension', `${ext.publisher}.${ext.name}`], { stdio: 'inherit' }); } } diff --git a/packages/belt-cli/src/commands/provision/tasks/npm.ts b/packages/belt-cli/src/commands/provision/tasks/npm.ts index 2cf2b86..5c82e2f 100644 --- a/packages/belt-cli/src/commands/provision/tasks/npm.ts +++ b/packages/belt-cli/src/commands/provision/tasks/npm.ts @@ -1,5 +1,5 @@ -import execa from "../../../modules/execa.js"; -import { readNodeModules } from "../utils.js"; +import execa from '../../../modules/execa.js'; +import { readNodeModules } from '../utils.js'; export async function setup({ packages }: { packages: { name: string }[] }) { for (const pkg of packages) { diff --git a/packages/belt-cli/src/commands/provision/tasks/submodules.ts b/packages/belt-cli/src/commands/provision/tasks/submodules.ts index 478fbf9..b9cbc62 100644 --- a/packages/belt-cli/src/commands/provision/tasks/submodules.ts +++ b/packages/belt-cli/src/commands/provision/tasks/submodules.ts @@ -1,16 +1,12 @@ -import fs from 'fs'; +import fs from 'node:fs'; import chalk from 'chalk'; // const parse = require('parse-github-repo-url'); -import execa from "../../../modules/execa.js"; +import execa from '../../../modules/execa.js'; -import { evalTemplate, ensureParentDir } from "../utils.js"; +import { ensureParentDir, evalTemplate } from '../utils.js'; -export async function setup({ - modules, -}: { - modules: { repo: string; sha: string; dest: string }[]; -}) { +export async function setup({ modules }: { modules: { repo: string; sha: string; dest: string }[] }) { for (const mod of modules) { // const repoName = parse(mod.repo)[1]; const dest = evalTemplate(mod.dest); diff --git a/packages/belt-cli/src/commands/provision/tasks/symlinks.ts b/packages/belt-cli/src/commands/provision/tasks/symlinks.ts index a87a5da..2c7d047 100644 --- a/packages/belt-cli/src/commands/provision/tasks/symlinks.ts +++ b/packages/belt-cli/src/commands/provision/tasks/symlinks.ts @@ -1,9 +1,7 @@ - - -import fs from 'fs'; +import fs from 'node:fs'; import chalk from 'chalk'; -import execa from "../../../modules/execa.js"; -import { evalTemplate, ensureParentDir } from "../utils.js"; +import execa from '../../../modules/execa.js'; +import { ensureParentDir, evalTemplate } from '../utils.js'; export async function setup(symLinks: any) { for (const { src, dest, disable } of symLinks.targets as any[]) { diff --git a/packages/belt-cli/src/commands/provision/utils.ts b/packages/belt-cli/src/commands/provision/utils.ts index a8f7a4b..40c3a80 100644 --- a/packages/belt-cli/src/commands/provision/utils.ts +++ b/packages/belt-cli/src/commands/provision/utils.ts @@ -1,6 +1,6 @@ -import fs from 'fs'; -import path from 'path'; -import execa from "../../modules/execa.js"; +import fs from 'node:fs'; +import path from 'node:path'; +import execa from '../../modules/execa.js'; const ctx = { HOME: process.env.HOME, @@ -10,7 +10,7 @@ const ctx = { export function evalTemplate(template: string) { const regExp = /\$(\w+)/g; - return template.replace(regExp, (match: string, group: string) => { + return template.replace(regExp, (_match: string, group: string) => { const variable = (ctx as any)[group]; if (!variable) { @@ -26,22 +26,20 @@ export function ensureParentDir(filePath: string) { } export function readNodeModules(dirPath: string): any[] { - const packages = fs - .readdirSync(dirPath) - .reduce((total: any[], dir: string) => { - const modulePath = `${dirPath}/${dir}`; + const packages = fs.readdirSync(dirPath).reduce((total: any[], dir: string) => { + const modulePath = `${dirPath}/${dir}`; - if (dir[0] === '@') { - total.push.apply(total, readNodeModules(modulePath)); - } else { - const pkgPath = `${modulePath}/package.json`; - const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')); + if (dir[0] === '@') { + total.push.apply(total, readNodeModules(modulePath)); + } else { + const pkgPath = `${modulePath}/package.json`; + const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')); - total.push(pkg); - } + total.push(pkg); + } - return total; - }, [] as any[]); + return total; + }, [] as any[]); return packages; } diff --git a/packages/belt-cli/src/commands/repo-open.ts b/packages/belt-cli/src/commands/repo-open.ts index adefc4a..c266674 100644 --- a/packages/belt-cli/src/commands/repo-open.ts +++ b/packages/belt-cli/src/commands/repo-open.ts @@ -1,8 +1,6 @@ - - -import execa from "../modules/execa.js"; -import opn from "../modules/opn.js"; import gitUrlParse from 'git-url-parse'; +import execa from '../modules/execa.js'; +import opn from '../modules/opn.js'; export async function run({ argv }: { argv: any }) { const remoteUrl = (await execa('git', ['remote', 'get-url', argv.origin || 'origin'], {})) || ''; diff --git a/packages/belt-cli/src/index.ts b/packages/belt-cli/src/index.ts index e4608f0..872d8b5 100644 --- a/packages/belt-cli/src/index.ts +++ b/packages/belt-cli/src/index.ts @@ -1,11 +1,10 @@ -import fs from 'fs'; -import path from 'path'; -import { dirname } from 'path'; -import { fileURLToPath } from 'url'; -import minimist from 'minimist'; +import fs from 'node:fs'; +import path, { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; import groupBy from 'lodash/groupBy.js'; import sortBy from 'lodash/sortBy.js'; -import type { Ctx } from "./interface.js"; +import minimist from 'minimist'; +import type { Ctx } from './interface.js'; const __dirname = dirname(fileURLToPath(import.meta.url)); const argv = minimist(process.argv.slice(2), { string: '_' }); @@ -44,13 +43,13 @@ function printHelp() { groupBy(Object.entries(commands), ([command]: [string, any]) => { const parts = command.split(':'); return parts.length === 1 ? '_' : parts[0]; - }) + }), ); const noPrefix = groups.find((_: [string, any]) => _[0] === '_') || ['_', []]; const prefixed = sortBy( groups.filter((_: [string, any]) => _[0] !== '_'), - '[0]' + '[0]', ); sortBy(noPrefix[1], '[0]').forEach(([command, info]: [string, any]) => { @@ -76,20 +75,17 @@ function getCommands() { const pkgDir = path.resolve(`${__dirname}/..`); const pkgPath = path.resolve(`${pkgDir}/package.json`); const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')); - return Object.entries((pkg.belt as any).commands).reduce( - (commands: any, [name, info]: [string, any]) => { - const scriptPath = `${pkgDir}/dist/${(info as any).script}.js`; - commands[name] = { - name, - pkg, - pkgName: pkg.name, - pkgPath, - scriptPath, - description: (info as any).description || '', - }; - - return commands; - }, - {} - ); + return Object.entries((pkg.belt as any).commands).reduce((commands: any, [name, info]: [string, any]) => { + const scriptPath = `${pkgDir}/dist/${(info as any).script}.js`; + commands[name] = { + name, + pkg, + pkgName: pkg.name, + pkgPath, + scriptPath, + description: (info as any).description || '', + }; + + return commands; + }, {}); } diff --git a/packages/belt-cli/src/interface.ts b/packages/belt-cli/src/interface.ts index d0e49bd..4f6a1a9 100644 --- a/packages/belt-cli/src/interface.ts +++ b/packages/belt-cli/src/interface.ts @@ -1,4 +1,4 @@ -import type minimist from "minimist"; +import type minimist from 'minimist'; export interface Ctx { command: Command; diff --git a/packages/belt-cli/src/modules/execa.ts b/packages/belt-cli/src/modules/execa.ts index 3ce071c..bec5ab5 100644 --- a/packages/belt-cli/src/modules/execa.ts +++ b/packages/belt-cli/src/modules/execa.ts @@ -1,5 +1,5 @@ import { execa as ogExeca } from 'execa'; -import { logShell } from "./log.js"; +import { logShell } from './log.js'; // seems cleaner without abstractions export default async function execaProxy(cmd: string, args: string[], opts?: any) { diff --git a/packages/belt-cli/src/modules/opn.ts b/packages/belt-cli/src/modules/opn.ts index 36adeee..ef13998 100644 --- a/packages/belt-cli/src/modules/opn.ts +++ b/packages/belt-cli/src/modules/opn.ts @@ -1,5 +1,5 @@ import ogOpn from 'opn'; -import { logShell } from "./log.js"; +import { logShell } from './log.js'; export default function opn(url: string, opts?: any) { // sorry windows, it's complex https://github.com/sindresorhus/opn/blob/cfab3f9ba2096b00fef655f454be65b070f49d8a/index.js#L34 diff --git a/packages/belt-cli/tsconfig.json b/packages/belt-cli/tsconfig.json index 16b3ec7..78e29e4 100644 --- a/packages/belt-cli/tsconfig.json +++ b/packages/belt-cli/tsconfig.json @@ -9,5 +9,5 @@ "allowSyntheticDefaultImports": true, "esModuleInterop": true }, - "include": ["src/**/*.ts"], + "include": ["src/**/*.ts"] } diff --git a/yarn.lock b/yarn.lock index d386691..589e67c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,134 +5,122 @@ __metadata: version: 8 cacheKey: 10c0 -"@babel/code-frame@npm:7.0.0-beta.44": - version: 7.0.0-beta.44 - resolution: "@babel/code-frame@npm:7.0.0-beta.44" +"@belt/cli@workspace:packages/belt-cli": + version: 0.0.0-use.local + resolution: "@belt/cli@workspace:packages/belt-cli" dependencies: - "@babel/highlight": "npm:7.0.0-beta.44" - checksum: 10c0/d1de16a7013f2a4b3bc6d22216f10199d7ff7b7a8e3e04b5d1a49a057e7e11bcfdc8087ab9c8361e32ca37d17df39fa797fcbd9ef8e0523bed776beec4867c7f + "@types/js-yaml": "npm:^4.0.9" + "@types/lodash": "npm:^4.17.20" + "@types/make-dir": "npm:^2.1.0" + "@types/minimist": "npm:^1.2.5" + "@types/opn": "npm:^5.5.0" + "@types/prompts": "npm:^2.4.9" + any-shell-escape: "npm:^0.1.1" + chalk: "npm:^2.4.1" + execa: "npm:^9.6.0" + git-url-parse: "npm:^16.1.0" + globby: "npm:^14.1.0" + lodash: "npm:^4.17.21" + make-dir: "npm:^1.3.0" + minimist: "npm:^1.2.0" + opn: "npm:^6.0.0" + prompts: "npm:^0.1.11" + typescript: "npm:^5.9.2" + bin: + belt: cli.js + languageName: unknown + linkType: soft + +"@biomejs/biome@npm:^2.2.2": + version: 2.2.2 + resolution: "@biomejs/biome@npm:2.2.2" + dependencies: + "@biomejs/cli-darwin-arm64": "npm:2.2.2" + "@biomejs/cli-darwin-x64": "npm:2.2.2" + "@biomejs/cli-linux-arm64": "npm:2.2.2" + "@biomejs/cli-linux-arm64-musl": "npm:2.2.2" + "@biomejs/cli-linux-x64": "npm:2.2.2" + "@biomejs/cli-linux-x64-musl": "npm:2.2.2" + "@biomejs/cli-win32-arm64": "npm:2.2.2" + "@biomejs/cli-win32-x64": "npm:2.2.2" + dependenciesMeta: + "@biomejs/cli-darwin-arm64": + optional: true + "@biomejs/cli-darwin-x64": + optional: true + "@biomejs/cli-linux-arm64": + optional: true + "@biomejs/cli-linux-arm64-musl": + optional: true + "@biomejs/cli-linux-x64": + optional: true + "@biomejs/cli-linux-x64-musl": + optional: true + "@biomejs/cli-win32-arm64": + optional: true + "@biomejs/cli-win32-x64": + optional: true + bin: + biome: bin/biome + checksum: 10c0/108690efd8c3a5fcee9faf89371319b2d066208e8adbb05855650032a1cc9afc98ec4206b73b0be2c49cdf64ef765cf5a24785456b814d5846ab65b293791daf languageName: node linkType: hard -"@babel/generator@npm:7.0.0-beta.44": - version: 7.0.0-beta.44 - resolution: "@babel/generator@npm:7.0.0-beta.44" - dependencies: - "@babel/types": "npm:7.0.0-beta.44" - jsesc: "npm:^2.5.1" - lodash: "npm:^4.2.0" - source-map: "npm:^0.5.0" - trim-right: "npm:^1.0.1" - checksum: 10c0/91b7b4c20d306af92c5d216deb8706c680daf652ee873739057205ecc085aca4e587d0e3e8cec0db8616333cf97790244a5387ad8fa5271280a5009f38efa16a +"@biomejs/cli-darwin-arm64@npm:2.2.2": + version: 2.2.2 + resolution: "@biomejs/cli-darwin-arm64@npm:2.2.2" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@babel/helper-function-name@npm:7.0.0-beta.44": - version: 7.0.0-beta.44 - resolution: "@babel/helper-function-name@npm:7.0.0-beta.44" - dependencies: - "@babel/helper-get-function-arity": "npm:7.0.0-beta.44" - "@babel/template": "npm:7.0.0-beta.44" - "@babel/types": "npm:7.0.0-beta.44" - checksum: 10c0/e91ecd55bbe8c66e2ae5ec744c92d9cbf1d1fd4b9cd45697420f6082d12814e7d943993b81eab4cc58c5a8a06871f4b8bf14d6101f86b42f373c57ec8ec12aef +"@biomejs/cli-darwin-x64@npm:2.2.2": + version: 2.2.2 + resolution: "@biomejs/cli-darwin-x64@npm:2.2.2" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@babel/helper-get-function-arity@npm:7.0.0-beta.44": - version: 7.0.0-beta.44 - resolution: "@babel/helper-get-function-arity@npm:7.0.0-beta.44" - dependencies: - "@babel/types": "npm:7.0.0-beta.44" - checksum: 10c0/e75bdbc3eeb07657b4136fbde22abca3220732a75da90f11f1e2b3e652e2ae4cdd1e26cd37d8510b522e38655c5389bd2293b7301c1bf9a78862a4b08635013f +"@biomejs/cli-linux-arm64-musl@npm:2.2.2": + version: 2.2.2 + resolution: "@biomejs/cli-linux-arm64-musl@npm:2.2.2" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:7.0.0-beta.44": - version: 7.0.0-beta.44 - resolution: "@babel/helper-split-export-declaration@npm:7.0.0-beta.44" - dependencies: - "@babel/types": "npm:7.0.0-beta.44" - checksum: 10c0/7b5a3d1dfffdf82c6a1f66b3c8694ef07480b11c7076e53a5dc58650dd7f12300c0c3ce205b3b51f47f7b7709616764c336a1eb438aaaa0ade287c09557c461a +"@biomejs/cli-linux-arm64@npm:2.2.2": + version: 2.2.2 + resolution: "@biomejs/cli-linux-arm64@npm:2.2.2" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@babel/highlight@npm:7.0.0-beta.44": - version: 7.0.0-beta.44 - resolution: "@babel/highlight@npm:7.0.0-beta.44" - dependencies: - chalk: "npm:^2.0.0" - esutils: "npm:^2.0.2" - js-tokens: "npm:^3.0.0" - checksum: 10c0/02d875370ed1920810f149896ec9fc6f5adf42ab5ac5dbcdbec215be8e457d16f18ac7704266943c129822c6e45c979211709ae7feaba8bc6b3667a1a7f448d8 +"@biomejs/cli-linux-x64-musl@npm:2.2.2": + version: 2.2.2 + resolution: "@biomejs/cli-linux-x64-musl@npm:2.2.2" + conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@babel/template@npm:7.0.0-beta.44": - version: 7.0.0-beta.44 - resolution: "@babel/template@npm:7.0.0-beta.44" - dependencies: - "@babel/code-frame": "npm:7.0.0-beta.44" - "@babel/types": "npm:7.0.0-beta.44" - babylon: "npm:7.0.0-beta.44" - lodash: "npm:^4.2.0" - checksum: 10c0/3c701e6b6c90a9097af08e62c0dfb7935f41acade48d89541fb27e19978f2e1ac0299bf4680a1a663bc0f459ed9d41077745b504a0f33f2b4b31e1eea9a31c53 +"@biomejs/cli-linux-x64@npm:2.2.2": + version: 2.2.2 + resolution: "@biomejs/cli-linux-x64@npm:2.2.2" + conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@babel/traverse@npm:7.0.0-beta.44": - version: 7.0.0-beta.44 - resolution: "@babel/traverse@npm:7.0.0-beta.44" - dependencies: - "@babel/code-frame": "npm:7.0.0-beta.44" - "@babel/generator": "npm:7.0.0-beta.44" - "@babel/helper-function-name": "npm:7.0.0-beta.44" - "@babel/helper-split-export-declaration": "npm:7.0.0-beta.44" - "@babel/types": "npm:7.0.0-beta.44" - babylon: "npm:7.0.0-beta.44" - debug: "npm:^3.1.0" - globals: "npm:^11.1.0" - invariant: "npm:^2.2.0" - lodash: "npm:^4.2.0" - checksum: 10c0/5470330ce878b71b6cc43967274b18f73eff0ae6bc1cf5e142dba6111970711a2c480eb4a8e13e4c88134935cfad20a7478fc96b6cc1e23e75d185b7e8552413 - languageName: node - linkType: hard - -"@babel/types@npm:7.0.0-beta.44": - version: 7.0.0-beta.44 - resolution: "@babel/types@npm:7.0.0-beta.44" - dependencies: - esutils: "npm:^2.0.2" - lodash: "npm:^4.2.0" - to-fast-properties: "npm:^2.0.0" - checksum: 10c0/fc452f104222664d453cb0a6058f6a44da88b39273d4c6bc814c27ce1592c1182f0ac66d863cd55d0403bc4e977180250f3313f0dff93abd2c6ef772db1f6c7f +"@biomejs/cli-win32-arm64@npm:2.2.2": + version: 2.2.2 + resolution: "@biomejs/cli-win32-arm64@npm:2.2.2" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@belt/cli@workspace:packages/belt-cli": - version: 0.0.0-use.local - resolution: "@belt/cli@workspace:packages/belt-cli" - dependencies: - "@types/js-yaml": "npm:^4.0.9" - "@types/lodash": "npm:^4.17.20" - "@types/make-dir": "npm:^2.1.0" - "@types/minimist": "npm:^1.2.5" - "@types/opn": "npm:^5.5.0" - "@types/prompts": "npm:^2.4.9" - any-shell-escape: "npm:^0.1.1" - chalk: "npm:^2.4.1" - execa: "npm:^9.6.0" - git-url-parse: "npm:^16.1.0" - globby: "npm:^14.1.0" - lodash: "npm:^4.17.21" - make-dir: "npm:^1.3.0" - minimist: "npm:^1.2.0" - opn: "npm:^6.0.0" - prompts: "npm:^0.1.11" - typescript: "npm:^5.9.2" - bin: - belt: dist/index.js - languageName: unknown - linkType: soft +"@biomejs/cli-win32-x64@npm:2.2.2": + version: 2.2.2 + resolution: "@biomejs/cli-win32-x64@npm:2.2.2" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 @@ -270,82 +258,6 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^3.0.0": - version: 3.0.1 - resolution: "acorn-jsx@npm:3.0.1" - dependencies: - acorn: "npm:^3.0.4" - checksum: 10c0/ce6b4ace31fa615e9f2f4d9b5bd52f090e1af0125ca2cd4a880e218e5e45e26ff5b2e98bd29f882950fcc1329132845b29066b6fe0eca55e2093ac30cbbcb5e2 - languageName: node - linkType: hard - -"acorn@npm:^3.0.4": - version: 3.3.0 - resolution: "acorn@npm:3.3.0" - bin: - acorn: ./bin/acorn - checksum: 10c0/04d645eede54b19e0aab3da2bea73778b1b42b0c45598fab95687c01bcae0fb47eec7661a73c09781b400a884b47f279fb5c2bdc24f5d09642b5ef3ef62b03a2 - languageName: node - linkType: hard - -"acorn@npm:^5.5.0": - version: 5.7.4 - resolution: "acorn@npm:5.7.4" - bin: - acorn: bin/acorn - checksum: 10c0/b29e61d48fa31ae69d38d74bb213b77b32de6317f125890a6cb76b44d173adccbcd3a07fc9a86acdfe8ab0a80f42b5ec6290df8b7944e0506504ac3b716232bd - languageName: node - linkType: hard - -"ajv-keywords@npm:^2.1.0": - version: 2.1.1 - resolution: "ajv-keywords@npm:2.1.1" - peerDependencies: - ajv: ^5.0.0 - checksum: 10c0/25ad18f426152af72493f31340f9221b4cd61046379d7b0db93123fe9893be093b936ef6a635ba5624709f86bfe009a7bec179d201d86677e097f8f90af2d092 - languageName: node - linkType: hard - -"ajv@npm:^5.2.3, ajv@npm:^5.3.0": - version: 5.5.2 - resolution: "ajv@npm:5.5.2" - dependencies: - co: "npm:^4.6.0" - fast-deep-equal: "npm:^1.0.0" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.3.0" - checksum: 10c0/9b8f762cd6b9da3935987b82418402247e76925e39814ca0d62088656117129db7e0cdc1d3e4aa6a3c4aa5ff67021551299ee4771735bcccb6cdd3f85061e565 - languageName: node - linkType: hard - -"ansi-escapes@npm:^3.0.0": - version: 3.2.0 - resolution: "ansi-escapes@npm:3.2.0" - checksum: 10c0/084e1ce38139ad2406f18a8e7efe2b850ddd06ce3c00f633392d1ce67756dab44fe290e573d09ef3c9a0cb13c12881e0e35a8f77a017d39a0a4ab85ae2fae04f - languageName: node - linkType: hard - -"ansi-regex@npm:^2.0.0": - version: 2.1.1 - resolution: "ansi-regex@npm:2.1.1" - checksum: 10c0/78cebaf50bce2cb96341a7230adf28d804611da3ce6bf338efa7b72f06cc6ff648e29f80cd95e582617ba58d5fdbec38abfeed3500a98bce8381a9daec7c548b - languageName: node - linkType: hard - -"ansi-regex@npm:^3.0.0": - version: 3.0.1 - resolution: "ansi-regex@npm:3.0.1" - checksum: 10c0/d108a7498b8568caf4a46eea4f1784ab4e0dfb2e3f3938c697dee21443d622d765c958f2b7e2b9f6b9e55e2e2af0584eaa9915d51782b89a841c28e744e7a167 - languageName: node - linkType: hard - -"ansi-styles@npm:^2.2.1": - version: 2.2.1 - resolution: "ansi-styles@npm:2.2.1" - checksum: 10c0/7c68aed4f1857389e7a12f85537ea5b40d832656babbf511cc7ecd9efc52889b9c3e5653a71a6aade783c3c5e0aa223ad4ff8e83c27ac8a666514e6c79068cab - languageName: node - linkType: hard - "ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -362,66 +274,6 @@ __metadata: languageName: node linkType: hard -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: "npm:~1.0.2" - checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de - languageName: node - linkType: hard - -"babel-code-frame@npm:^6.22.0": - version: 6.26.0 - resolution: "babel-code-frame@npm:6.26.0" - dependencies: - chalk: "npm:^1.1.3" - esutils: "npm:^2.0.2" - js-tokens: "npm:^3.0.2" - checksum: 10c0/7fecc128e87578cf1b96e78d2b25e0b260e202bdbbfcefa2eac23b7f8b7b2f7bc9276a14599cde14403cc798cc2a38e428e2cab50b77658ab49228b09ae92473 - languageName: node - linkType: hard - -"babel-eslint@npm:^8.2.3": - version: 8.2.6 - resolution: "babel-eslint@npm:8.2.6" - dependencies: - "@babel/code-frame": "npm:7.0.0-beta.44" - "@babel/traverse": "npm:7.0.0-beta.44" - "@babel/types": "npm:7.0.0-beta.44" - babylon: "npm:7.0.0-beta.44" - eslint-scope: "npm:3.7.1" - eslint-visitor-keys: "npm:^1.0.0" - checksum: 10c0/b805d86cdf9efd92aeefead099f083a4cc32deee32dc9cad8b79b1c46de1667166aa74a10452504d3c0897fa78beb3fda29ea459fe1f6974bef7b38453e99191 - languageName: node - linkType: hard - -"babylon@npm:7.0.0-beta.44": - version: 7.0.0-beta.44 - resolution: "babylon@npm:7.0.0-beta.44" - bin: - babylon: ./bin/babylon.js - checksum: 10c0/a3d6985eca5310140cfca062ee01f4d3a3ae12644e52d1bfb8b1a29af4251231073786079b5972939665fa4d61cc39a4fe9293febdf540dc06bdf188767045e5 - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 - languageName: node - linkType: hard - "braces@npm:^3.0.3": version: 3.0.3 resolution: "braces@npm:3.0.3" @@ -431,43 +283,7 @@ __metadata: languageName: node linkType: hard -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 - languageName: node - linkType: hard - -"caller-path@npm:^0.1.0": - version: 0.1.0 - resolution: "caller-path@npm:0.1.0" - dependencies: - callsites: "npm:^0.2.0" - checksum: 10c0/4f605823f01019dee30b561cc7fac99eef573990c8de9da069dc0fc926c031cc93e907f9bd08a8a099ac98bb287859e15d02d756e5b37ee1ea3dcb7bd41dad4e - languageName: node - linkType: hard - -"callsites@npm:^0.2.0": - version: 0.2.0 - resolution: "callsites@npm:0.2.0" - checksum: 10c0/1d7b0a32257ea7756bd4a085bba9f0f6c7e5249f67ea0d4ccd24f78c068d5444c2fa2fd6e165a49aae2567128212625730dc932f4869801365138f4e58354068 - languageName: node - linkType: hard - -"chalk@npm:^1.1.3": - version: 1.1.3 - resolution: "chalk@npm:1.1.3" - dependencies: - ansi-styles: "npm:^2.2.1" - escape-string-regexp: "npm:^1.0.2" - has-ansi: "npm:^2.0.0" - strip-ansi: "npm:^3.0.0" - supports-color: "npm:^2.0.0" - checksum: 10c0/28c3e399ec286bb3a7111fd4225ebedb0d7b813aef38a37bca7c498d032459c265ef43404201d5fbb8d888d29090899c95335b4c0cda13e8b126ff15c541cef8 - languageName: node - linkType: hard - -"chalk@npm:^2.0.0, chalk@npm:^2.1.0, chalk@npm:^2.4.1": +"chalk@npm:^2.4.1": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -478,50 +294,6 @@ __metadata: languageName: node linkType: hard -"chardet@npm:^0.4.0": - version: 0.4.2 - resolution: "chardet@npm:0.4.2" - checksum: 10c0/287fff1609301b1a9e8dc9730271af7aa24187a8e224d23b8c3eb88cb7c0e8ceb962905377e36947bc07edb69afd188903f4924cc6bd0bd4e7703d498505b70d - languageName: node - linkType: hard - -"ci-info@npm:^1.5.0": - version: 1.6.0 - resolution: "ci-info@npm:1.6.0" - checksum: 10c0/5a74921e50e0be504ef811f00cb8dd6a547e1f4f2e709b7364b2de72a6fbc0215d86c88cd62c485a129090365d2a6367ca00344ced04e714860b22fbe10180c8 - languageName: node - linkType: hard - -"circular-json@npm:^0.3.1": - version: 0.3.3 - resolution: "circular-json@npm:0.3.3" - checksum: 10c0/573d1c62f2b1254aac68b58c90764f3d6638eb1451d5d8baab3008e6624d12a5ee4b4ef1ad7aae170655dd476e0ccbb984a439319581e5fcbe37afb4c632b513 - languageName: node - linkType: hard - -"cli-cursor@npm:^2.1.0": - version: 2.1.0 - resolution: "cli-cursor@npm:2.1.0" - dependencies: - restore-cursor: "npm:^2.0.0" - checksum: 10c0/09ee6d8b5b818d840bf80ec9561eaf696672197d3a02a7daee2def96d5f52ce6e0bbe7afca754ccf14f04830b5a1b4556273e983507d5029f95bba3016618eda - languageName: node - linkType: hard - -"cli-width@npm:^2.0.0": - version: 2.2.1 - resolution: "cli-width@npm:2.2.1" - checksum: 10c0/e3a6d422d657ca111c630f69ee0f1a499e8f114eea158ccb2cdbedd19711edffa217093bbd43dafb34b68d1b1a3b5334126e51d059b9ec1d19afa53b42b3ef86 - languageName: node - linkType: hard - -"co@npm:^4.6.0": - version: 4.6.0 - resolution: "co@npm:4.6.0" - checksum: 10c0/c0e85ea0ca8bf0a50cbdca82efc5af0301240ca88ebe3644a6ffb8ffe911f34d40f8fbcf8f1d52c5ddd66706abd4d3bfcd64259f1e8e2371d4f47573b0dc8c28 - languageName: node - linkType: hard - "color-convert@npm:^1.9.0": version: 1.9.3 resolution: "color-convert@npm:1.9.3" @@ -538,43 +310,6 @@ __metadata: languageName: node linkType: hard -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - -"concat-stream@npm:^1.6.0": - version: 1.6.2 - resolution: "concat-stream@npm:1.6.2" - dependencies: - buffer-from: "npm:^1.0.0" - inherits: "npm:^2.0.3" - readable-stream: "npm:^2.2.2" - typedarray: "npm:^0.0.6" - checksum: 10c0/2e9864e18282946dabbccb212c5c7cec0702745e3671679eb8291812ca7fd12023f7d8cb36493942a62f770ac96a7f90009dc5c82ad69893438371720fa92617 - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 - languageName: node - linkType: hard - -"cross-spawn@npm:^5.1.0": - version: 5.1.0 - resolution: "cross-spawn@npm:5.1.0" - dependencies: - lru-cache: "npm:^4.0.1" - shebang-command: "npm:^1.2.0" - which: "npm:^1.2.9" - checksum: 10c0/1918621fddb9f8c61e02118b2dbf81f611ccd1544ceaca0d026525341832b8511ce2504c60f935dbc06b35e5ef156fe8c1e72708c27dd486f034e9c0e1e07201 - languageName: node - linkType: hard - "cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" @@ -586,172 +321,13 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: "npm:^2.1.1" - checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a - languageName: node - linkType: hard - -"deep-is@npm:~0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c - languageName: node - linkType: hard - -"doctrine@npm:^2.1.0": - version: 2.1.0 - resolution: "doctrine@npm:2.1.0" - dependencies: - esutils: "npm:^2.0.2" - checksum: 10c0/b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": +"escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 languageName: node linkType: hard -"eslint-scope@npm:3.7.1": - version: 3.7.1 - resolution: "eslint-scope@npm:3.7.1" - dependencies: - esrecurse: "npm:^4.1.0" - estraverse: "npm:^4.1.1" - checksum: 10c0/dc9e602fb146258952da683b47ff365ded2c55d2be4076ead2c73ab1aac6a7f5d451bfd90cadca1f28900f79ba89530a00f8d7062e0f5c3e72cd86df312b17dc - languageName: node - linkType: hard - -"eslint-scope@npm:^3.7.1": - version: 3.7.3 - resolution: "eslint-scope@npm:3.7.3" - dependencies: - esrecurse: "npm:^4.1.0" - estraverse: "npm:^4.1.1" - checksum: 10c0/d4dc4ac9f15cd65d3c696c2b978bd5426c0b79c3ba5088eeea3283f757a61d7ca9ee574f3800c1e1035ec5639eabd8f2116be30799411fd3a5259b8d032a1b84 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^1.0.0": - version: 1.3.0 - resolution: "eslint-visitor-keys@npm:1.3.0" - checksum: 10c0/10c91fdbbe36810dd4308e57f9a8bc7177188b2a70247e54e3af1fa05ebc66414ae6fd4ce3c6c6821591f43a556e9037bc6b071122e099b5f8b7d2f76df553e3 - languageName: node - linkType: hard - -"eslint@npm:^4.19.1": - version: 4.19.1 - resolution: "eslint@npm:4.19.1" - dependencies: - ajv: "npm:^5.3.0" - babel-code-frame: "npm:^6.22.0" - chalk: "npm:^2.1.0" - concat-stream: "npm:^1.6.0" - cross-spawn: "npm:^5.1.0" - debug: "npm:^3.1.0" - doctrine: "npm:^2.1.0" - eslint-scope: "npm:^3.7.1" - eslint-visitor-keys: "npm:^1.0.0" - espree: "npm:^3.5.4" - esquery: "npm:^1.0.0" - esutils: "npm:^2.0.2" - file-entry-cache: "npm:^2.0.0" - functional-red-black-tree: "npm:^1.0.1" - glob: "npm:^7.1.2" - globals: "npm:^11.0.1" - ignore: "npm:^3.3.3" - imurmurhash: "npm:^0.1.4" - inquirer: "npm:^3.0.6" - is-resolvable: "npm:^1.0.0" - js-yaml: "npm:^3.9.1" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.3.0" - lodash: "npm:^4.17.4" - minimatch: "npm:^3.0.2" - mkdirp: "npm:^0.5.1" - natural-compare: "npm:^1.4.0" - optionator: "npm:^0.8.2" - path-is-inside: "npm:^1.0.2" - pluralize: "npm:^7.0.0" - progress: "npm:^2.0.0" - regexpp: "npm:^1.0.1" - require-uncached: "npm:^1.0.3" - semver: "npm:^5.3.0" - strip-ansi: "npm:^4.0.0" - strip-json-comments: "npm:~2.0.1" - table: "npm:4.0.2" - text-table: "npm:~0.2.0" - bin: - eslint: ./bin/eslint.js - checksum: 10c0/3f815fa8124654e364602984ba816845d0e16bb34c72e6a66a5d7f2c48be67d09ecc939ac137134ca3bf01ba563963c538c7d4a09fec49cbd5fe62318aac13d4 - languageName: node - linkType: hard - -"espree@npm:^3.5.4": - version: 3.5.4 - resolution: "espree@npm:3.5.4" - dependencies: - acorn: "npm:^5.5.0" - acorn-jsx: "npm:^3.0.0" - checksum: 10c0/30794af82523e432c40eb4022cf949978bb12b94c292bbd56eb8ecf0f497e1ab5800ce2384080fba39c2e572e447e11471fd6eab5185c962244488ca7838ce77 - languageName: node - linkType: hard - -"esprima@npm:^4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 - languageName: node - linkType: hard - -"esquery@npm:^1.0.0": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" - dependencies: - estraverse: "npm:^5.1.0" - checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 - languageName: node - linkType: hard - -"esrecurse@npm:^4.1.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: "npm:^5.2.0" - checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: 10c0/9cb46463ef8a8a4905d3708a652d60122a0c20bb58dec7e0e12ab0e7235123d74214fc0141d743c381813e1b992767e2708194f6f6e0f9fd00c1b4e0887b8b6d - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 - languageName: node - linkType: hard - "execa@npm:^9.6.0": version: 9.6.0 resolution: "execa@npm:9.6.0" @@ -772,24 +348,6 @@ __metadata: languageName: node linkType: hard -"external-editor@npm:^2.0.4": - version: 2.2.0 - resolution: "external-editor@npm:2.2.0" - dependencies: - chardet: "npm:^0.4.0" - iconv-lite: "npm:^0.4.17" - tmp: "npm:^0.0.33" - checksum: 10c0/5440df6ab809467485b3b15557d301e9fa3dda2892d6eaddd036ea337e0ced3e369c319507a123e34749cfce89c51f891848d249c713f54bcfaf95296663ff49 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^1.0.0": - version: 1.1.0 - resolution: "fast-deep-equal@npm:1.1.0" - checksum: 10c0/2cdcb17ca3c28ea199863de4ff0f4de14722c63bb19d716c1bbb4a661479413a0cbfb27e8596d34204e4525f0de11ff7c8ac6a27673c961bd0f37d0e48f9c743 - languageName: node - linkType: hard - "fast-glob@npm:^3.3.3": version: 3.3.3 resolution: "fast-glob@npm:3.3.3" @@ -803,20 +361,6 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b - languageName: node - linkType: hard - -"fast-levenshtein@npm:~2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 - languageName: node - linkType: hard - "fastq@npm:^1.6.0": version: 1.19.1 resolution: "fastq@npm:1.19.1" @@ -826,15 +370,6 @@ __metadata: languageName: node linkType: hard -"figures@npm:^2.0.0": - version: 2.0.0 - resolution: "figures@npm:2.0.0" - dependencies: - escape-string-regexp: "npm:^1.0.5" - checksum: 10c0/5dc5a75fec3e7e04ae65d6ce51d28b3e70d4656c51b06996b6fdb2cb5b542df512e3b3c04482f5193a964edddafa5521479ff948fa84e12ff556e53e094ab4ce - languageName: node - linkType: hard - "figures@npm:^6.1.0": version: 6.1.0 resolution: "figures@npm:6.1.0" @@ -844,16 +379,6 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^2.0.0": - version: 2.0.0 - resolution: "file-entry-cache@npm:2.0.0" - dependencies: - flat-cache: "npm:^1.2.1" - object-assign: "npm:^4.0.1" - checksum: 10c0/b104739964d54baaaa390ace60cf57d42a4344ccb450530d83d67cf626834b4ec869524d14db454bec1c945a198a53808458649f7150b17b4bfea052cc8487c9 - languageName: node - linkType: hard - "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -863,32 +388,6 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^1.2.1": - version: 1.3.4 - resolution: "flat-cache@npm:1.3.4" - dependencies: - circular-json: "npm:^0.3.1" - graceful-fs: "npm:^4.1.2" - rimraf: "npm:~2.6.2" - write: "npm:^0.2.1" - checksum: 10c0/caa87faf8e76726c385f3e547ef8d0847dd29a6858368771b311209e9ee6f37ec1d409935f73d193df12e7bce5dfd27f8db6029ee37f266748d6272332cf3aa4 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 - languageName: node - linkType: hard - -"functional-red-black-tree@npm:^1.0.1": - version: 1.0.1 - resolution: "functional-red-black-tree@npm:1.0.1" - checksum: 10c0/5959eed0375803d9924f47688479bb017e0c6816a0e5ac151e22ba6bfe1d12c41de2f339188885e0aa8eeea2072dad509d8e4448467e816bde0a2ca86a0670d3 - languageName: node - linkType: hard - "get-stream@npm:^9.0.0": version: 9.0.1 resolution: "get-stream@npm:9.0.1" @@ -927,27 +426,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.2, glob@npm:^7.1.3": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe - languageName: node - linkType: hard - -"globals@npm:^11.0.1, globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 - languageName: node - linkType: hard - "globby@npm:^14.1.0": version: 14.1.0 resolution: "globby@npm:14.1.0" @@ -962,22 +440,6 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.2": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"has-ansi@npm:^2.0.0": - version: 2.0.0 - resolution: "has-ansi@npm:2.0.0" - dependencies: - ansi-regex: "npm:^2.0.0" - checksum: 10c0/f54e4887b9f8f3c4bfefd649c48825b3c093987c92c27880ee9898539e6f01aed261e82e73153c3f920fde0db5bf6ebd58deb498ed1debabcb4bc40113ccdf05 - languageName: node - linkType: hard - "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -992,30 +454,12 @@ __metadata: languageName: node linkType: hard -"husky@npm:^0.14.3": - version: 0.14.3 - resolution: "husky@npm:0.14.3" - dependencies: - is-ci: "npm:^1.0.10" - normalize-path: "npm:^1.0.0" - strip-indent: "npm:^2.0.0" - checksum: 10c0/6f929f9765bfe24494ee2a32cc7b01861cbe849feb8739da029d68e454558def7aa6a7795e436edc0729cdf355fb3160331639ff14b27b8f1b82cce4ed303afb - languageName: node - linkType: hard - -"iconv-lite@npm:^0.4.17": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 - languageName: node - linkType: hard - -"ignore@npm:^3.3.3": - version: 3.3.10 - resolution: "ignore@npm:3.3.10" - checksum: 10c0/973e0ef3b3eaab8fc19014d80014ed11bcf3585de8088d9c7a5b5c4edefc55f4ecdc498144bdd0440b8e2ff22deb03f89c90300bfef2d1750d5920f997d0a600 +"husky@npm:^9.1.7": + version: 9.1.7 + resolution: "husky@npm:9.1.7" + bin: + husky: bin.js + checksum: 10c0/35bb110a71086c48906aa7cd3ed4913fb913823715359d65e32e0b964cb1e255593b0ae8014a5005c66a68e6fa66c38dcfa8056dbbdfb8b0187c0ffe7ee3a58f languageName: node linkType: hard @@ -1026,72 +470,6 @@ __metadata: languageName: node linkType: hard -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:~2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 - languageName: node - linkType: hard - -"inquirer@npm:^3.0.6": - version: 3.3.0 - resolution: "inquirer@npm:3.3.0" - dependencies: - ansi-escapes: "npm:^3.0.0" - chalk: "npm:^2.0.0" - cli-cursor: "npm:^2.1.0" - cli-width: "npm:^2.0.0" - external-editor: "npm:^2.0.4" - figures: "npm:^2.0.0" - lodash: "npm:^4.3.0" - mute-stream: "npm:0.0.7" - run-async: "npm:^2.2.0" - rx-lite: "npm:^4.0.8" - rx-lite-aggregates: "npm:^4.0.8" - string-width: "npm:^2.1.0" - strip-ansi: "npm:^4.0.0" - through: "npm:^2.3.6" - checksum: 10c0/d17475d6446e177227f5707cbd89ae6027cc316791d433c1b64f7be14d54456227186a0b058d580d7bbaf10e7098b0a1a986833cf71a956aa6d4f78878e78d3c - languageName: node - linkType: hard - -"invariant@npm:^2.2.0": - version: 2.2.4 - resolution: "invariant@npm:2.2.4" - dependencies: - loose-envify: "npm:^1.0.0" - checksum: 10c0/5af133a917c0bcf65e84e7f23e779e7abc1cd49cb7fdc62d00d1de74b0d8c1b5ee74ac7766099fb3be1b05b26dfc67bab76a17030d2fe7ea2eef867434362dfc - languageName: node - linkType: hard - -"is-ci@npm:^1.0.10": - version: 1.2.1 - resolution: "is-ci@npm:1.2.1" - dependencies: - ci-info: "npm:^1.5.0" - bin: - is-ci: bin.js - checksum: 10c0/56d8e0e404c5ee9eb4cc846b9fbed043bac587633a8b10caad35b1e4b11edccae742037c4bc2196203e5929643bd257a4caac23b65e99b372a54e68d187bacc9 - languageName: node - linkType: hard - "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -1099,13 +477,6 @@ __metadata: languageName: node linkType: hard -"is-fullwidth-code-point@npm:^2.0.0": - version: 2.0.0 - resolution: "is-fullwidth-code-point@npm:2.0.0" - checksum: 10c0/e58f3e4a601fc0500d8b2677e26e9fe0cd450980e66adb29d85b6addf7969731e38f8e43ed2ec868a09c101a55ac3d8b78902209269f38c5286bc98f5bc1b4d9 - languageName: node - linkType: hard - "is-glob@npm:^4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" @@ -1125,14 +496,7 @@ __metadata: "is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" - checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e - languageName: node - linkType: hard - -"is-resolvable@npm:^1.0.0": - version: 1.1.0 - resolution: "is-resolvable@npm:1.1.0" - checksum: 10c0/17d5bf39d9268173adf834c23effb6b4e926d809b528a851d87e6fb944e9606ed2c94dfaf1b1b675f922c2990fbc402d754136d8557c90a931ac7fd2f1e4cf07 + checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e languageName: node linkType: hard @@ -1166,13 +530,6 @@ __metadata: languageName: node linkType: hard -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d - languageName: node - linkType: hard - "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -1180,55 +537,6 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^3.0.0 || ^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed - languageName: node - linkType: hard - -"js-tokens@npm:^3.0.0, js-tokens@npm:^3.0.2": - version: 3.0.2 - resolution: "js-tokens@npm:3.0.2" - checksum: 10c0/e3c3ee4d12643d90197628eb022a2884a15f08ea7dcac1ce97fdeee43031fbfc7ede674f2cdbbb582dcd4c94388b22e52d56c6cbeb2ac7d1b57c2f33c405e2ba - languageName: node - linkType: hard - -"js-yaml@npm:^3.9.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" - dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^4.0.0" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b - languageName: node - linkType: hard - -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 10c0/dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.3.0": - version: 0.3.1 - resolution: "json-schema-traverse@npm:0.3.1" - checksum: 10c0/462316de759d3dd9278959de17861e8d214c3722e1f0bf3c510daac990009bc2b0e11e89f9b299d765cd52569db74c8fa1a371a2b08c514a07998fb2f10eb57e - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 - languageName: node - linkType: hard - "kleur@npm:^2.0.1": version: 2.0.2 resolution: "kleur@npm:2.0.2" @@ -1243,44 +551,13 @@ __metadata: languageName: node linkType: hard -"levn@npm:^0.3.0, levn@npm:~0.3.0": - version: 0.3.0 - resolution: "levn@npm:0.3.0" - dependencies: - prelude-ls: "npm:~1.1.2" - type-check: "npm:~0.3.2" - checksum: 10c0/e440df9de4233da0b389cd55bd61f0f6aaff766400bebbccd1231b81801f6dbc1d816c676ebe8d70566394b749fa624b1ed1c68070e9c94999f0bdecc64cb676 - languageName: node - linkType: hard - -"lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.2.0, lodash@npm:^4.3.0": +"lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c languageName: node linkType: hard -"loose-envify@npm:^1.0.0": - version: 1.4.0 - resolution: "loose-envify@npm:1.4.0" - dependencies: - js-tokens: "npm:^3.0.0 || ^4.0.0" - bin: - loose-envify: cli.js - checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e - languageName: node - linkType: hard - -"lru-cache@npm:^4.0.1": - version: 4.1.5 - resolution: "lru-cache@npm:4.1.5" - dependencies: - pseudomap: "npm:^1.0.2" - yallist: "npm:^2.1.2" - checksum: 10c0/1ca5306814e5add9ec63556d6fd9b24a4ecdeaef8e9cea52cbf30301e6b88c8d8ddc7cab45b59b56eb763e6c45af911585dc89925a074ab65e1502e3fe8103cf - languageName: node - linkType: hard - "make-dir@npm:*": version: 5.0.0 resolution: "make-dir@npm:5.0.0" @@ -1314,68 +591,13 @@ __metadata: languageName: node linkType: hard -"mimic-fn@npm:^1.0.0": - version: 1.2.0 - resolution: "mimic-fn@npm:1.2.0" - checksum: 10c0/ad55214aec6094c0af4c0beec1a13787556f8116ed88807cf3f05828500f21f93a9482326bcd5a077ae91e3e8795b4e76b5b4c8bb12237ff0e4043a365516cba - languageName: node - linkType: hard - -"minimatch@npm:^3.0.2, minimatch@npm:^3.1.1": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 - languageName: node - linkType: hard - -"minimist@npm:^1.2.0, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 languageName: node linkType: hard -"mkdirp@npm:^0.5.1": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: "npm:^1.2.6" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/e2e2be789218807b58abced04e7b49851d9e46e88a2f9539242cc8a92c9b5c3a0b9bab360bd3014e02a140fc4fbc58e31176c408b493f8a2a6f4986bd7527b01 - languageName: node - linkType: hard - -"ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"mute-stream@npm:0.0.7": - version: 0.0.7 - resolution: "mute-stream@npm:0.0.7" - checksum: 10c0/c687cfe99289166fe17dcbd0cf49612c5d267410a7819b654a82df45016967d7b2b0b18b35410edef86de6bb089a00413557dc0182c5e78a4af50ba5d61edb42 - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 - languageName: node - linkType: hard - -"normalize-path@npm:^1.0.0": - version: 1.0.0 - resolution: "normalize-path@npm:1.0.0" - checksum: 10c0/b8e578b79fb1ef43735712d7af2c2b288d6d2509f2ef8206201933e7d95e38b922f41378b28610bb9424e1e49cb56b85d1d5f493e3287572d57e263010843bf9 - languageName: node - linkType: hard - "npm-run-path@npm:^6.0.0": version: 6.0.0 resolution: "npm-run-path@npm:6.0.0" @@ -1386,31 +608,6 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 - languageName: node - linkType: hard - -"onetime@npm:^2.0.0": - version: 2.0.1 - resolution: "onetime@npm:2.0.1" - dependencies: - mimic-fn: "npm:^1.0.0" - checksum: 10c0/b4e44a8c34e70e02251bfb578a6e26d6de6eedbed106cd78211d2fd64d28b6281d54924696554e4e966559644243753ac5df73c87f283b0927533d3315696215 - languageName: node - linkType: hard - "opn@npm:*": version: 5.5.0 resolution: "opn@npm:5.5.0" @@ -1429,27 +626,6 @@ __metadata: languageName: node linkType: hard -"optionator@npm:^0.8.2": - version: 0.8.3 - resolution: "optionator@npm:0.8.3" - dependencies: - deep-is: "npm:~0.1.3" - fast-levenshtein: "npm:~2.0.6" - levn: "npm:~0.3.0" - prelude-ls: "npm:~1.1.2" - type-check: "npm:~0.3.2" - word-wrap: "npm:~1.2.3" - checksum: 10c0/ad7000ea661792b3ec5f8f86aac28895850988926f483b5f308f59f4607dfbe24c05df2d049532ee227c040081f39401a268cf7bbf3301512f74c4d760dc6dd8 - languageName: node - linkType: hard - -"os-tmpdir@npm:~1.0.2": - version: 1.0.2 - resolution: "os-tmpdir@npm:1.0.2" - checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 - languageName: node - linkType: hard - "parse-ms@npm:^4.0.0": version: 4.0.0 resolution: "parse-ms@npm:4.0.0" @@ -1476,20 +652,6 @@ __metadata: languageName: node linkType: hard -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - -"path-is-inside@npm:^1.0.2": - version: 1.0.2 - resolution: "path-is-inside@npm:1.0.2" - checksum: 10c0/7fdd4b41672c70461cce734fc222b33e7b447fa489c7c4377c95e7e6852d83d69741f307d88ec0cc3b385b41cb4accc6efac3c7c511cd18512e95424f5fa980c - languageName: node - linkType: hard - "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -1525,20 +687,6 @@ __metadata: languageName: node linkType: hard -"pluralize@npm:^7.0.0": - version: 7.0.0 - resolution: "pluralize@npm:7.0.0" - checksum: 10c0/b44fd8e4bc487534b804bb8490bc9982bd229997af6e9cc0f51c8205e11c1f31013e8eba3f9b0864fa9f3c0534e06935db46f71f612d1a9633253a14add948e6 - languageName: node - linkType: hard - -"prelude-ls@npm:~1.1.2": - version: 1.1.2 - resolution: "prelude-ls@npm:1.1.2" - checksum: 10c0/7284270064f74e0bb7f04eb9bff7be677e4146417e599ccc9c1200f0f640f8b11e592d94eb1b18f7aa9518031913bb42bea9c86af07ba69902864e61005d6f18 - languageName: node - linkType: hard - "pretty-ms@npm:^9.2.0": version: 9.2.0 resolution: "pretty-ms@npm:9.2.0" @@ -1548,20 +696,6 @@ __metadata: languageName: node linkType: hard -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 - languageName: node - linkType: hard - -"progress@npm:^2.0.0": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: 10c0/1697e07cb1068055dbe9fe858d242368ff5d2073639e652b75a7eb1f2a1a8d4afd404d719de23c7b48481a6aa0040686310e2dac2f53d776daa2176d3f96369c - languageName: node - linkType: hard - "prompts@npm:^0.1.11": version: 0.1.14 resolution: "prompts@npm:0.1.14" @@ -1579,13 +713,6 @@ __metadata: languageName: node linkType: hard -"pseudomap@npm:^1.0.2": - version: 1.0.2 - resolution: "pseudomap@npm:1.0.2" - checksum: 10c0/5a91ce114c64ed3a6a553aa7d2943868811377388bb31447f9d8028271bae9b05b340fe0b6961a64e45b9c72946aeb0a4ab635e8f7cb3715ffd0ff2beeb6a679 - languageName: node - linkType: hard - "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -1593,55 +720,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.2.2": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.3" - isarray: "npm:~1.0.0" - process-nextick-args: "npm:~2.0.0" - safe-buffer: "npm:~5.1.1" - string_decoder: "npm:~1.1.1" - util-deprecate: "npm:~1.0.1" - checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa - languageName: node - linkType: hard - -"regexpp@npm:^1.0.1": - version: 1.1.0 - resolution: "regexpp@npm:1.1.0" - checksum: 10c0/3496fd39c9feb14cde9a1aa94e28194cd1ab9a0e97429c688306712a9fce79c1799021684959bbf9b88c890b21b07b3799e86e6386ef731a90cab1d86a8b079d - languageName: node - linkType: hard - -"require-uncached@npm:^1.0.3": - version: 1.0.3 - resolution: "require-uncached@npm:1.0.3" - dependencies: - caller-path: "npm:^0.1.0" - resolve-from: "npm:^1.0.0" - checksum: 10c0/74def8a3e47bde90f0288fbcd46fdd9874810758a9bec5822f16fe8664b290bdab572fa2724eedcbcd725dad0c1b6cfdba2b2efd42f88f91da1214c4839e6466 - languageName: node - linkType: hard - -"resolve-from@npm:^1.0.0": - version: 1.0.1 - resolution: "resolve-from@npm:1.0.1" - checksum: 10c0/593ed3612f1421471ef9c00e54f4d56d7cf965f8135a7e92b5c5715602ef640fe48d75258aca91e6cae361dd1e512e7c2cdf4cc65df85e7f6506c12992ffc46f - languageName: node - linkType: hard - -"restore-cursor@npm:^2.0.0": - version: 2.0.0 - resolution: "restore-cursor@npm:2.0.0" - dependencies: - onetime: "npm:^2.0.0" - signal-exit: "npm:^3.0.2" - checksum: 10c0/f5b335bee06f440445e976a7031a3ef53691f9b7c4a9d42a469a0edaf8a5508158a0d561ff2b26a1f4f38783bcca2c0e5c3a44f927326f6694d5b44d7a4993e6 - languageName: node - linkType: hard - "reusify@npm:^1.0.4": version: 1.1.0 resolution: "reusify@npm:1.1.0" @@ -1649,38 +727,19 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:~2.6.2": - version: 2.6.3 - resolution: "rimraf@npm:2.6.3" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: ./bin.js - checksum: 10c0/f1e646f8c567795f2916aef7aadf685b543da6b9a53e482bb04b07472c7eef2b476045ba1e29f401c301c66b630b22b815ab31fdd60c5e1ae6566ff523debf45 - languageName: node - linkType: hard - "root-workspace-0b6124@workspace:.": version: 0.0.0-use.local resolution: "root-workspace-0b6124@workspace:." dependencies: + "@biomejs/biome": "npm:^2.2.2" "@tsconfig/node-ts": "npm:^23.6.1" "@tsconfig/node22": "npm:^22.0.2" "@types/node": "npm:22" - babel-eslint: "npm:^8.2.3" - eslint: "npm:^4.19.1" - husky: "npm:^0.14.3" + husky: "npm:^9.1.7" typescript: "npm:^5.9.2" languageName: unknown linkType: soft -"run-async@npm:^2.2.0": - version: 2.4.1 - resolution: "run-async@npm:2.4.1" - checksum: 10c0/35a68c8f1d9664f6c7c2e153877ca1d6e4f886e5ca067c25cdd895a6891ff3a1466ee07c63d6a9be306e9619ff7d509494e6d9c129516a36b9fd82263d579ee1 - languageName: node - linkType: hard - "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -1690,54 +749,6 @@ __metadata: languageName: node linkType: hard -"rx-lite-aggregates@npm:^4.0.8": - version: 4.0.8 - resolution: "rx-lite-aggregates@npm:4.0.8" - dependencies: - rx-lite: "npm:*" - checksum: 10c0/e21f95feca7e63b861fd711a980924cbaa9cb8ebc4786c7cbc287e153d5e96fbd48c0a8a978e53594174d4a68d5d2263b823a2b975c80a955f5748eb59cdec60 - languageName: node - linkType: hard - -"rx-lite@npm:*, rx-lite@npm:^4.0.8": - version: 4.0.8 - resolution: "rx-lite@npm:4.0.8" - checksum: 10c0/a3e76e3a6471347855196e30450bc500f7b1becfdbb0f3d58b1f1d5d6f89165a159e8549b4403084023de99938d67f43a3319c92b1b46c3fd8d7318ecce42c79 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"semver@npm:^5.3.0": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 - languageName: node - linkType: hard - -"shebang-command@npm:^1.2.0": - version: 1.2.0 - resolution: "shebang-command@npm:1.2.0" - dependencies: - shebang-regex: "npm:^1.0.0" - checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d - languageName: node - linkType: hard - "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -1747,13 +758,6 @@ __metadata: languageName: node linkType: hard -"shebang-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "shebang-regex@npm:1.0.0" - checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 - languageName: node - linkType: hard - "shebang-regex@npm:^3.0.0": version: 3.0.0 resolution: "shebang-regex@npm:3.0.0" @@ -1761,13 +765,6 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.2": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 - languageName: node - linkType: hard - "signal-exit@npm:^4.1.0": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" @@ -1789,66 +786,6 @@ __metadata: languageName: node linkType: hard -"slice-ansi@npm:1.0.0": - version: 1.0.0 - resolution: "slice-ansi@npm:1.0.0" - dependencies: - is-fullwidth-code-point: "npm:^2.0.0" - checksum: 10c0/589d9b80b33b8274f88942d4da7c3698cebb8bba0d367c79a42f95a4f69eb7645fdf51821ffbd6d0af6aea6dda70f725925b6cf5e670a53b7ae2c31e7fd10a2e - languageName: node - linkType: hard - -"source-map@npm:^0.5.0": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb - languageName: node - linkType: hard - -"string-width@npm:^2.1.0, string-width@npm:^2.1.1": - version: 2.1.1 - resolution: "string-width@npm:2.1.1" - dependencies: - is-fullwidth-code-point: "npm:^2.0.0" - strip-ansi: "npm:^4.0.0" - checksum: 10c0/e5f2b169fcf8a4257a399f95d069522f056e92ec97dbdcb9b0cdf14d688b7ca0b1b1439a1c7b9773cd79446cbafd582727279d6bfdd9f8edd306ea5e90e5b610 - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: "npm:~5.1.0" - checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e - languageName: node - linkType: hard - -"strip-ansi@npm:^3.0.0": - version: 3.0.1 - resolution: "strip-ansi@npm:3.0.1" - dependencies: - ansi-regex: "npm:^2.0.0" - checksum: 10c0/f6e7fbe8e700105dccf7102eae20e4f03477537c74b286fd22cfc970f139002ed6f0d9c10d0e21aa9ed9245e0fa3c9275930e8795c5b947da136e4ecb644a70f - languageName: node - linkType: hard - -"strip-ansi@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-ansi@npm:4.0.0" - dependencies: - ansi-regex: "npm:^3.0.0" - checksum: 10c0/d75d9681e0637ea316ddbd7d4d3be010b1895a17e885155e0ed6a39755ae0fd7ef46e14b22162e66a62db122d3a98ab7917794e255532ab461bb0a04feb03e7d - languageName: node - linkType: hard - "strip-final-newline@npm:^4.0.0": version: 4.0.0 resolution: "strip-final-newline@npm:4.0.0" @@ -1856,27 +793,6 @@ __metadata: languageName: node linkType: hard -"strip-indent@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-indent@npm:2.0.0" - checksum: 10c0/d88dbef5d2aaa3eb622a9011151b2543b886c581366003ad2bd8c168b419dfbf83f28dcb8962b670ab71a818895d998479b0eac08fba99ee0267b600d11bd764 - languageName: node - linkType: hard - -"strip-json-comments@npm:~2.0.1": - version: 2.0.1 - resolution: "strip-json-comments@npm:2.0.1" - checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 - languageName: node - linkType: hard - -"supports-color@npm:^2.0.0": - version: 2.0.0 - resolution: "supports-color@npm:2.0.0" - checksum: 10c0/570e0b63be36cccdd25186350a6cb2eaad332a95ff162fa06d9499982315f2fe4217e69dd98e862fbcd9c81eaff300a825a1fe7bf5cc752e5b84dfed042b0dda - languageName: node - linkType: hard - "supports-color@npm:^5.3.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -1886,50 +802,6 @@ __metadata: languageName: node linkType: hard -"table@npm:4.0.2": - version: 4.0.2 - resolution: "table@npm:4.0.2" - dependencies: - ajv: "npm:^5.2.3" - ajv-keywords: "npm:^2.1.0" - chalk: "npm:^2.1.0" - lodash: "npm:^4.17.4" - slice-ansi: "npm:1.0.0" - string-width: "npm:^2.1.1" - checksum: 10c0/e9cbe50aa3648bb411ed73abd89ddc884e6e4b10460ca61fc5c146e997818c48bdc5e04a2f51eb596696a3bb2b39d5dd94a93b879ca6d07f37b42fbcc0870745 - languageName: node - linkType: hard - -"text-table@npm:~0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c - languageName: node - linkType: hard - -"through@npm:^2.3.6": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc - languageName: node - linkType: hard - -"tmp@npm:^0.0.33": - version: 0.0.33 - resolution: "tmp@npm:0.0.33" - dependencies: - os-tmpdir: "npm:~1.0.2" - checksum: 10c0/69863947b8c29cabad43fe0ce65cec5bb4b481d15d4b4b21e036b060b3edbf3bc7a5541de1bacb437bb3f7c4538f669752627fdf9b4aaf034cebd172ba373408 - languageName: node - linkType: hard - -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10c0/b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -1939,29 +811,6 @@ __metadata: languageName: node linkType: hard -"trim-right@npm:^1.0.1": - version: 1.0.1 - resolution: "trim-right@npm:1.0.1" - checksum: 10c0/71989ec179c6b42a56e03db68e60190baabf39d32d4e1252fa1501c4e478398ae29d7191beffe015b9d9dc76f04f4b3a946bdb9949ad6b0c0b0c5db65f3eb672 - languageName: node - linkType: hard - -"type-check@npm:~0.3.2": - version: 0.3.2 - resolution: "type-check@npm:0.3.2" - dependencies: - prelude-ls: "npm:~1.1.2" - checksum: 10c0/776217116b2b4e50e368c7ee0c22c0a85e982881c16965b90d52f216bc296d6a52ef74f9202d22158caacc092a7645b0b8d5fe529a96e3fe35d0fb393966c875 - languageName: node - linkType: hard - -"typedarray@npm:^0.0.6": - version: 0.0.6 - resolution: "typedarray@npm:0.0.6" - checksum: 10c0/6005cb31df50eef8b1f3c780eb71a17925f3038a100d82f9406ac2ad1de5eb59f8e6decbdc145b3a1f8e5836e17b0c0002fb698b9fe2516b8f9f9ff602d36412 - languageName: node - linkType: hard - "typescript@npm:^5.9.2": version: 5.9.2 resolution: "typescript@npm:5.9.2" @@ -2003,24 +852,6 @@ __metadata: languageName: node linkType: hard -"util-deprecate@npm:~1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 - languageName: node - linkType: hard - -"which@npm:^1.2.9": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 - languageName: node - linkType: hard - "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -2032,36 +863,6 @@ __metadata: languageName: node linkType: hard -"word-wrap@npm:~1.2.3": - version: 1.2.5 - resolution: "word-wrap@npm:1.2.5" - checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 - languageName: node - linkType: hard - -"write@npm:^0.2.1": - version: 0.2.1 - resolution: "write@npm:0.2.1" - dependencies: - mkdirp: "npm:^0.5.1" - checksum: 10c0/9559b4ca2e6641a903dce10789c7491669e320fab5d503676b86d9829cdfe4f42a1d3d0a0dc23fb2120853bd2a96e069db30315da433f366ae5de9e477ab3b0a - languageName: node - linkType: hard - -"yallist@npm:^2.1.2": - version: 2.1.2 - resolution: "yallist@npm:2.1.2" - checksum: 10c0/0b9e25aa00adf19e01d2bcd4b208aee2b0db643d9927131797b7af5ff69480fc80f1c3db738cbf3946f0bddf39d8f2d0a5709c644fd42d4aa3a4e6e786c087b5 - languageName: node - linkType: hard - "yoctocolors@npm:^2.1.1": version: 2.1.2 resolution: "yoctocolors@npm:2.1.2" From 89066e8088f57002f4196c9fc2ce251bd543b447 Mon Sep 17 00:00:00 2001 From: ewnd9 Date: Fri, 29 Aug 2025 13:49:44 +0300 Subject: [PATCH 4/4] add turbo --- .github/workflows/ci.yml | 8 ++-- .gitignore | 1 + package.json | 1 + packages/belt-cli/package.json | 3 +- turbo.json | 17 ++++++++ yarn.lock | 72 ++++++++++++++++++++++++++++++++++ 6 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 turbo.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2874c93..2cf75e0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,8 +35,8 @@ jobs: - name: Setup legacy belt-cli run: cd packages/belt-cli && npm install -g . - - name: Run lint - run: ./.husky/pre-commit + - name: Run turbo + run: yarn turbo --env-mode=loose typecheck build test - # - name: Run turbo - # run: SKIP_ENV_VALIDATION=true yarn turbo --env-mode=loose typecheck build + - name: Run lint + run: bash ./.husky/pre-commit diff --git a/.gitignore b/.gitignore index f6f758e..c4c65d0 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ test.sh config/vim/.netrwhist config/karabiner/automatic_backups dist +.turbo node_modules .yarn/* diff --git a/package.json b/package.json index 9492aa3..f35bff3 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "@tsconfig/node22": "^22.0.2", "@types/node": "22", "husky": "^9.1.7", + "turbo": "^2.5.6", "typescript": "^5.9.2" }, "scripts": { diff --git a/packages/belt-cli/package.json b/packages/belt-cli/package.json index 98719d1..5952156 100644 --- a/packages/belt-cli/package.json +++ b/packages/belt-cli/package.json @@ -13,7 +13,8 @@ "build": "tsc", "typecheck": "tsc --noEmit", "dev": "tsc --watch", - "prepublishOnly": "yarn build" + "prepublishOnly": "yarn build", + "test": "echo 1" }, "belt": { "commands": { diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..2393f74 --- /dev/null +++ b/turbo.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://turborepo.com/schema.json", + "tasks": { + "build": { + "dependsOn": ["^build"], + "outputs": ["dist/**", "tsconfig.tsbuildinfo"] + }, + "typecheck": { + "dependsOn": [], + "outputs": [] + }, + "test": { + "dependsOn": ["build"], + "outputs": [] + } + } +} diff --git a/yarn.lock b/yarn.lock index 589e67c..7259fa5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -736,6 +736,7 @@ __metadata: "@tsconfig/node22": "npm:^22.0.2" "@types/node": "npm:22" husky: "npm:^9.1.7" + turbo: "npm:^2.5.6" typescript: "npm:^5.9.2" languageName: unknown linkType: soft @@ -811,6 +812,77 @@ __metadata: languageName: node linkType: hard +"turbo-darwin-64@npm:2.5.6": + version: 2.5.6 + resolution: "turbo-darwin-64@npm:2.5.6" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"turbo-darwin-arm64@npm:2.5.6": + version: 2.5.6 + resolution: "turbo-darwin-arm64@npm:2.5.6" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"turbo-linux-64@npm:2.5.6": + version: 2.5.6 + resolution: "turbo-linux-64@npm:2.5.6" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"turbo-linux-arm64@npm:2.5.6": + version: 2.5.6 + resolution: "turbo-linux-arm64@npm:2.5.6" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"turbo-windows-64@npm:2.5.6": + version: 2.5.6 + resolution: "turbo-windows-64@npm:2.5.6" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"turbo-windows-arm64@npm:2.5.6": + version: 2.5.6 + resolution: "turbo-windows-arm64@npm:2.5.6" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"turbo@npm:^2.5.6": + version: 2.5.6 + resolution: "turbo@npm:2.5.6" + dependencies: + turbo-darwin-64: "npm:2.5.6" + turbo-darwin-arm64: "npm:2.5.6" + turbo-linux-64: "npm:2.5.6" + turbo-linux-arm64: "npm:2.5.6" + turbo-windows-64: "npm:2.5.6" + turbo-windows-arm64: "npm:2.5.6" + dependenciesMeta: + turbo-darwin-64: + optional: true + turbo-darwin-arm64: + optional: true + turbo-linux-64: + optional: true + turbo-linux-arm64: + optional: true + turbo-windows-64: + optional: true + turbo-windows-arm64: + optional: true + bin: + turbo: bin/turbo + checksum: 10c0/b9657bf211bbcfe3911496e4fee6c9a24526bc37e9cadf7f0c76d0376e9c9dfafaacec27f5a61bb621dfe330600ce68c1b21e4cdc19bdccd3ebfe66766fcf62f + languageName: node + linkType: hard + "typescript@npm:^5.9.2": version: 5.9.2 resolution: "typescript@npm:5.9.2"