From d6ba7dd21f15e6c27536f3ff17f8a2c0c6256bb0 Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 21:11:30 +0200 Subject: [PATCH 01/14] Squash chore/add-completion (merge-base 97d7f25a3bb3254f7305f4b676088b710135b12a, previous tip e41d7c99d398dd9816c52eba34e820e604f7fa7c) commit e41d7c99d398dd9816c52eba34e820e604f7fa7c Author: Mathis Pinsault Date: Tue Oct 21 21:10:55 2025 +0200 fix prettier Signed-off-by: Mathis Pinsault commit 7fec31253f7625dfb53286085d916cd3dd395577 Author: Mathis Pinsault Date: Tue Oct 21 21:08:44 2025 +0200 chore: add completion --- .changeset/README.md | 8 +++ .changeset/config.json | 11 ++++ .github/workflows/check.yml | 22 -------- .github/workflows/ci.yml | 42 ++++++++++++++ .github/workflows/deploy.yml | 61 -------------------- .github/workflows/release.yml | 102 ++++++++++++++++++++++++++++++++++ .npmrc | 2 + .prettierignore | 7 +++ .prototools | 2 + bun.lockb | Bin 33443 -> 76943 bytes configs/.prettierrc.json | 10 ++++ configs/knip.json | 6 ++ configs/oxlint.json | 15 +++++ package.json | 30 +++++++--- scripts/fig.ts | 29 ---------- scripts/semver-check.ts | 40 ------------- scripts/setup-binary.js | 94 +++++++++++++++++++++++++++---- src/cli/completion.ts | 102 ++++++++++++++++++++++++++++++++++ src/cli/list.ts | 2 +- src/index.ts | 46 ++++++++++++++- src/utils/assertions.ts | 13 ----- src/utils/cache.ts | 99 +++++++++++++++++++++++++++++++++ src/utils/help.ts | 37 +++++++++--- src/utils/load-yaml.ts | 2 +- src/utils/log-report.ts | 23 ++++++-- src/utils/logger.ts | 2 +- src/utils/scan-moon.ts | 16 +++++- src/utils/utils.ts | 8 +-- tsconfig.json | 11 ++-- 29 files changed, 626 insertions(+), 216 deletions(-) create mode 100644 .changeset/README.md create mode 100644 .changeset/config.json delete mode 100644 .github/workflows/check.yml create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/deploy.yml create mode 100644 .github/workflows/release.yml create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prototools create mode 100644 configs/.prettierrc.json create mode 100644 configs/knip.json create mode 100644 configs/oxlint.json delete mode 100644 scripts/fig.ts delete mode 100644 scripts/semver-check.ts create mode 100644 src/cli/completion.ts delete mode 100644 src/utils/assertions.ts create mode 100644 src/utils/cache.ts diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..e5b6d8d --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..2be13d4 --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml deleted file mode 100644 index e2feeaa..0000000 --- a/.github/workflows/check.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: check - -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - lint: - runs-on: ubuntu-latest - name: check code style and build - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - run: bun install - - run: bun run prettier - - run: bun run build - - run: bun run sort --check - - run: bun run semver-check diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..4c4d9f2 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +name: CI + +on: + pull_request: + branches: + - main + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + ci: + name: CI Checks + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Format check + run: bun run format + + - name: Type check + run: bun run type-check + + - name: Lint + run: bun run lint + + - name: Build + run: bun run build diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 2d28b82..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: deploy - -on: - push: - branches: - - main - pull_request: - branches: - - main - -jobs: - build: - runs-on: ubuntu-latest - name: build and deploy - strategy: - matrix: - platform: [darwin, linux] - arch: [x64, arm64] - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - uses: pnpm/action-setup@v2 - with: - version: 8 - - run: bun install - - run: bun build . --target="bun-${{ matrix.platform }}-${{ matrix.arch }}" --outfile="bin/${{ matrix.platform }}-${{ matrix.arch }}" --compile - # upload the build artifact - - uses: actions/upload-artifact@v4 - with: - path: bin - name: ${{ matrix.platform }}-${{ matrix.arch }} - deploy: - runs-on: ubuntu-latest - name: deploy - needs: build - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - uses: pnpm/action-setup@v2 - with: - version: 8 - - uses: actions/cache/restore@v4 - with: - path: | - **/node_modules - key: ${{ runner.os }}-node-${{ hashFiles('**/bun.lockb') }} - - uses: actions/download-artifact@v4 - with: - path: bin - - run: pnpm version prepatch --preid="pr-$GITHUB_RUN_ID" --no-git-tag-version - if: github.event_name == 'pull_request' - - name: authenticate with npm - run: echo "//registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: publish prerelease - run: pnpm publish --access public --no-git-checks --tag="pr-${{ github.event.number }}" - if: github.event_name == 'pull_request' - - name: publish - run: pnpm publish --access public --no-git-checks - if: github.event_name == 'push' && github.ref == 'refs/heads/main' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..d0c68e8 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,102 @@ +name: Release + +on: + push: + tags: + - "v*.*.*" + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + build: + name: Build binaries + runs-on: ubuntu-latest + strategy: + matrix: + platform: [darwin, linux] + arch: [x64, arm64] + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Build binary + run: bun build . --target="bun-${{ matrix.platform }}-${{ matrix.arch }}" --outfile="bin/${{ matrix.platform }}-${{ matrix.arch }}" --compile + + - name: Upload build artifact + uses: actions/upload-artifact@v4 + with: + path: bin + name: ${{ matrix.platform }}-${{ matrix.arch }} + + release: + name: Release + runs-on: ubuntu-latest + needs: build + permissions: + contents: write + id-token: write + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Format check + run: bun run format + + - name: Type check + run: bun run type-check + + - name: Lint + run: bun run lint + + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: bin + + - name: Publish to npm + run: npm publish --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + generate_release_notes: true + files: | + bin/darwin-x64/darwin-x64 + bin/darwin-arm64/darwin-arm64 + bin/linux-x64/linux-x64 + bin/linux-arm64/linux-arm64 + body: | + ## Installation + + ```bash + npm install @maastrich/moonx@${{ github.ref_name }} + ``` + + The platform-specific binaries will be automatically downloaded during installation. + + See [CHANGELOG.md](https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md) for full details. + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..16720db --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +engine-strict=true +auto-install-peers=false diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..be22c12 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,7 @@ +dist +node_modules +*.d.ts +pnpm-lock.yaml +coverage +.git +bin diff --git a/.prototools b/.prototools new file mode 100644 index 0000000..02690a7 --- /dev/null +++ b/.prototools @@ -0,0 +1,2 @@ +[plugins] +moon = "https://raw.githubusercontent.com/moonrepo/moon/master/proto-plugin.toml" diff --git a/bun.lockb b/bun.lockb index abda2e227ccef6374716ddcd1f475682f8724bfe..0d4e6b0995554033c3f529aa5422b5a903c79bb2 100755 GIT binary patch literal 76943 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 bGweNtOBFN*bn|T`lvLDE_$b1E-+%uP7^%;~ delta 12752 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 !arg.startsWith("-") && arg.length && "moonx" !== arg, - ), - ]; - }, - trigger: "moonx", - postProcess(out) { - const lines = out.split("\n"); - return lines.map((line) => { - return { - name: line, - }; - }); - }, -}; - -const completionSpec: Fig.Spec = { - name: "moonx", - args: { - isVariadic: true, - generators: generator, - }, -}; -export default completionSpec; diff --git a/scripts/semver-check.ts b/scripts/semver-check.ts deleted file mode 100644 index 54333ac..0000000 --- a/scripts/semver-check.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { gt, valid } from "semver"; - -import pkg from "../package.json"; - -try { - const response = await fetch( - "https://raw.githubusercontent.com/maastrich/moonx/main/package.json", - { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }, - ); - const infos = await response.json(); - - const current = pkg.version; - const previous = infos.version; - - if (!previous || !valid(previous) || !valid(current)) { - console.error( - "Could not compare versions, got: previous=%s, current=%s", - previous, - current, - ); - process.exit(1); - } - - if (!gt(current, previous)) { - console.error( - "Current version %s is not greater than previous version %s", - current, - previous, - ); - process.exit(1); - } -} catch (error) { - console.error("Could not resolve previous version:\n\t%s", error); - process.exit(0); -} diff --git a/scripts/setup-binary.js b/scripts/setup-binary.js index f118238..ac0b328 100644 --- a/scripts/setup-binary.js +++ b/scripts/setup-binary.js @@ -1,20 +1,90 @@ -import { chmodSync, existsSync, renameSync } from "node:fs"; -import { join } from "node:path"; +import { + chmodSync, + createWriteStream, + existsSync, + mkdirSync, + readFileSync, + renameSync, +} from "node:fs"; +import { get } from "node:https"; +import { join, dirname } from "node:path"; +import { pipeline } from "node:stream/promises"; +import { fileURLToPath } from "node:url"; const { platform, arch } = process; -const src = join( - process.cwd(), - "bin", - `${platform}-${arch}`, - `${platform}-${arch}`, -); +console.log(process.env.INIT_CWD, process.cwd()); + +// Skip installation in development workspace +// INIT_CWD is the directory where npm install was initiated +// If it differs from cwd, we're in a workspace install +if (process.env.INIT_CWD && process.env.INIT_CWD === process.cwd()) { + console.log("Skipping binary download in workspace install"); + process.exit(0); +} + +// Get package version from package.json +const __dirname = dirname(fileURLToPath(import.meta.url)); +const packageJsonPath = join(__dirname, "..", "package.json"); +const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf-8")); +const version = packageJson.version; + +const binaryName = `${platform}-${arch}`; +const src = join(process.cwd(), "bin", binaryName, binaryName); const dest = join(process.cwd(), "bin", "moonx"); -if (!existsSync(src)) { - console.error(`Binary not found: ${src}`); +// If binary already exists locally (from build), use it +if (existsSync(src)) { + renameSync(src, dest); + chmodSync(dest, 0o755); + console.log(`Binary installed successfully from local build`); process.exit(0); } -renameSync(src, dest); -chmodSync(dest, 0o755); +// Download from GitHub releases +console.log(`Downloading binary for ${platform}-${arch}...`); + +const downloadUrl = `https://github.com/maastrich/moonx/releases/download/v${version}/${binaryName}`; + +async function downloadBinary(url, destPath) { + return new Promise((resolve, reject) => { + get(url, (response) => { + // Handle redirects + if (response.statusCode === 301 || response.statusCode === 302) { + downloadBinary(response.headers.location, destPath) + .then(resolve) + .catch(reject); + return; + } + + if (response.statusCode !== 200) { + reject( + new Error(`Failed to download binary: HTTP ${response.statusCode}`) + ); + return; + } + + // Ensure directory exists + mkdirSync(dirname(destPath), { recursive: true }); + + const fileStream = createWriteStream(destPath); + pipeline(response, fileStream) + .then(() => { + chmodSync(destPath, 0o755); + resolve(); + }) + .catch(reject); + }).on("error", reject); + }); +} + +try { + await downloadBinary(downloadUrl, dest); + console.log(`Binary downloaded and installed successfully`); +} catch (error) { + console.error(`Failed to download binary: ${error.message}`); + console.error(`Tried to download from: ${downloadUrl}`); + console.error(`Please ensure the release v${version} exists on GitHub`); + console.error(`\tsee: https://github.com/maastrich/moonx/releases`); + process.exit(1); +} diff --git a/src/cli/completion.ts b/src/cli/completion.ts new file mode 100644 index 0000000..ef5db03 --- /dev/null +++ b/src/cli/completion.ts @@ -0,0 +1,102 @@ +export type Shell = "bash" | "zsh" | "fish"; + +/** + * Generate shell completion script for moonx + * + * The completion scripts use `moonx _moonx_list` which automatically caches results + * for 5 minutes (configurable via MOONX_CACHE_TTL env var in milliseconds). + * + * Cache management: + * - `moonx cache:info` - Show cache status and location + * - `moonx cache:clear` - Clear the cache + */ +export function generateCompletion(shell: Shell): string { + switch (shell) { + case "bash": + return generateBashCompletion(); + case "zsh": + return generateZshCompletion(); + case "fish": + return generateFishCompletion(); + default: + throw new Error(`Unknown shell: ${shell}`); + } +} + +function generateBashCompletion(): string { + return `# moonx completion script for bash +# Add this to your ~/.bashrc or ~/.bash_profile: +# eval "$(moonx completion bash)" + +_moonx_completion() { + local cur prev words cword + _init_completion || return + + if [ $cword -eq 1 ]; then + # Complete commands + COMPREPLY=($(compgen -W "$(moonx _moonx_list)" -- "$cur")) + return 0 + fi + + if [ $cword -ge 2 ]; then + # Complete workspaces for the selected command + local command="\${words[1]}" + COMPREPLY=($(compgen -W "$(moonx _moonx_list "$command")" -- "$cur")) + return 0 + fi +} + +complete -F _moonx_completion moonx +complete -F _moonx_completion mx +`; +} + +function generateZshCompletion(): string { + return `# moonx completion script for zsh +# Add this to your ~/.zshrc: +# eval "$(moonx completion zsh)" + +_moonx_completion() { + local state line + + _arguments -C \\ + '1: :->command' \\ + '*: :->workspace' + + case $state in + command) + local commands + commands=("\${(@f)$(moonx _moonx_list)}") + _describe 'command' commands + ;; + workspace) + local workspaces + workspaces=("\${(@f)$(moonx _moonx_list $line[1])}") + _describe 'workspace' workspaces + ;; + esac +} + +compdef _moonx_completion moonx +compdef _moonx_completion mx +`; +} + +function generateFishCompletion(): string { + return `# moonx completion script for fish +# Add this to your ~/.config/fish/completions/moonx.fish: +# moonx completion fish > ~/.config/fish/completions/moonx.fish + +# Remove previous completions +complete -c moonx -e +complete -c mx -e + +# Complete commands +complete -c moonx -f -n "__fish_is_first_token" -a "(moonx _moonx_list)" +complete -c mx -f -n "__fish_is_first_token" -a "(moonx _moonx_list)" + +# Complete workspaces +complete -c moonx -f -n "not __fish_is_first_token" -a "(moonx _moonx_list (commandline -opc)[2])" +complete -c mx -f -n "not __fish_is_first_token" -a "(moonx _moonx_list (commandline -opc)[2])" +`; +} diff --git a/src/cli/list.ts b/src/cli/list.ts index 14e4165..80e0d5b 100644 --- a/src/cli/list.ts +++ b/src/cli/list.ts @@ -1,6 +1,6 @@ export function list( [command, ...wss]: Array, - commands: Map, + commands: Map ) { if (!commands.has(command) && wss.length) { console.log(`task ${command} does not exist`); diff --git a/src/index.ts b/src/index.ts index 94febb2..58bd233 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,9 @@ import { cac } from "cac"; -import pkg from "../package.json"; +import pkg from "../package.json" with { type: "json" }; +import { clearCache, getCacheInfo } from "./utils/cache.js"; +import { generateCompletion, type Shell } from "./cli/completion.js"; import { list } from "./cli/list.js"; import { help } from "./utils/help.js"; import { logReport } from "./utils/log-report.js"; @@ -9,10 +11,14 @@ import { logger } from "./utils/logger.js"; import { scan } from "./utils/scan-moon.js"; import { moon } from "./utils/utils.js"; -const commands = await scan(); - const cli = cac("moonx"); +// Check if this is a completion or cache command - skip scanning if so +const skipScanCommands = ["completion", "cache:clear", "cache:info"]; +const shouldSkipScan = Bun.argv.some((arg) => skipScanCommands.includes(arg)); + +const commands = shouldSkipScan ? new Map() : await scan(); + cli.option("cache", ""); cli.option("color", ""); cli.option("concurrency", ""); @@ -38,6 +44,40 @@ cli stdout.end(); }); +cli + .command("completion ", "Generate shell completion script") + .action((shell: string) => { + const validShells = ["bash", "zsh", "fish"]; + if (!validShells.includes(shell)) { + logger.error( + `Invalid shell: ${shell}. Must be one of: ${validShells.join(", ")}` + ); + process.exit(1); + } + const completionScript = generateCompletion(shell as Shell); + const stdout = Bun.stdout.writer(); + stdout.write(completionScript); + stdout.end(); + }); + +cli.command("cache:clear", "Clear the completion cache").action(() => { + clearCache(); + logger.info("Cache cleared successfully"); +}); + +cli.command("cache:info", "Show cache information").action(async () => { + const info = await getCacheInfo(); + if (!info.exists) { + logger.info("No cache found"); + logger.info(`Cache path: ${info.path}`); + } else { + const ageInSeconds = Math.floor((info.age ?? 0) / 1000); + const ageInMinutes = Math.floor(ageInSeconds / 60); + logger.info(`Cache age: ${ageInMinutes}m ${ageInSeconds % 60}s`); + logger.info(`Cache path: ${info.path}`); + } +}); + for (const [name, workspaces] of commands) { cli .command(`${name} [...workspaces]`, workspaces.join(), { diff --git a/src/utils/assertions.ts b/src/utils/assertions.ts deleted file mode 100644 index 85ac088..0000000 --- a/src/utils/assertions.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { - PartialWorkspaceProjects, - PartialWorkspaceProjectsConfig, -} from "@moonrepo/types"; - -export function isWorkspaceProjectsConfig( - projects: PartialWorkspaceProjects, -): projects is PartialWorkspaceProjectsConfig { - if (projects instanceof Array) { - return false; - } - return Object.values(projects).some((v) => typeof v !== "string"); -} diff --git a/src/utils/cache.ts b/src/utils/cache.ts new file mode 100644 index 0000000..2d1b334 --- /dev/null +++ b/src/utils/cache.ts @@ -0,0 +1,99 @@ +import { existsSync, mkdirSync } from "node:fs"; +import { homedir } from "node:os"; +import { join } from "node:path"; + +type CacheData = { + commands: Array<[string, string[]]>; + timestamp: number; +}; + +// Cache TTL in milliseconds (default: 5 minutes) +const CACHE_TTL = Number(process.env.MOONX_CACHE_TTL) || 5 * 60 * 1000; + +function getCacheDir(): string { + const cacheDir = join(homedir(), ".cache", "moonx"); + if (!existsSync(cacheDir)) { + mkdirSync(cacheDir, { recursive: true }); + } + return cacheDir; +} + +function getCachePath(): string { + return join(getCacheDir(), "commands.json"); +} + +export async function readCache(): Promise | null> { + const cachePath = getCachePath(); + + if (!existsSync(cachePath)) { + return null; + } + + try { + const file = Bun.file(cachePath); + const text = await file.text(); + const data: CacheData = JSON.parse(text); + + // Check if cache is expired + const now = Date.now(); + if (now - data.timestamp > CACHE_TTL) { + return null; + } + + return new Map(data.commands); + } catch { + // If cache is corrupted, return null + return null; + } +} + +export function writeCache(commands: Map): void { + const cachePath = getCachePath(); + + const data: CacheData = { + commands: Array.from(commands.entries()), + timestamp: Date.now(), + }; + + try { + Bun.write(cachePath, JSON.stringify(data, null, 2)); + } catch { + // Silently fail if we can't write cache + // This shouldn't block the main functionality + } +} + +export function clearCache(): void { + const cachePath = getCachePath(); + + if (existsSync(cachePath)) { + try { + Bun.write(cachePath, ""); + } catch { + // Silently fail + } + } +} + +export async function getCacheInfo(): Promise<{ + exists: boolean; + age?: number; + path: string; +}> { + const cachePath = getCachePath(); + + if (!existsSync(cachePath)) { + return { exists: false, path: cachePath }; + } + + try { + const file = Bun.file(cachePath); + const text = await file.text(); + const data: CacheData = JSON.parse(text); + const age = Date.now() - data.timestamp; + + return { exists: true, age, path: cachePath }; + } catch { + return { exists: false, path: cachePath }; + } +} diff --git a/src/utils/help.ts b/src/utils/help.ts index d572fb2..f3dc634 100644 --- a/src/utils/help.ts +++ b/src/utils/help.ts @@ -3,8 +3,8 @@ import { renderString } from "nunjucks"; function style(text: string) { return text - .replace(/([\[\<][A-Z_]+[\]\>])/g, chalk.gray("$1")) - .replace(/(?:(\-[a-zA-Z]), )?(\-\-[a-zA-Z\-]+)/g, (_, short, long) => { + .replace(/([[<][A-Z_]+[\]>])/g, chalk.gray("$1")) + .replace(/(?:(-[a-zA-Z]), )?(--[a-zA-Z-]+)/g, (_, short, long) => { if (!short) { return chalk.blue(long); } @@ -16,11 +16,11 @@ const _moonx = style(` ${chalk.bold.blue("moonx")} ${chalk.bold.magenta("Usage:")} ${chalk.yellow( - "moonx", + "moonx" )} [...workspaces] [MOON_OPTIONS] -- [COMMAND_OPTIONS] ${chalk.bold( - "Info:", + "Info:" )} When no workspaces are specified, moonx will run the command on all available workspaces. ${chalk.bold("Commands:")} @@ -48,11 +48,32 @@ For more info, run any command with the --help flag `); function moonx(tasks: Array<[string, string[]]>) { + const max = Math.max(...tasks.map(([task]) => task.length), 29); + + const renderCommand = (commands: string[], max: number) => { + // join commands until length exceeds 50 + // if length exceeds 50, add "+N" at the end + const { extras, content } = commands.reduce( + (acc, current) => { + if (acc.content.length + current.length + 1 <= max) { + acc.content += (acc.content ? " " : "") + current; + } else { + acc.extras += 1; + } + return acc; + }, + { extras: 0, content: "" } + ); + return content + (extras > 0 ? ` ${chalk.magenta(`+${extras}`)}` : ""); + }; + + console.log(process.env.COLUMNS); + return renderString(_moonx, { tasks: tasks.map(([task, commands]) => ({ name: task, - spacing: " ".repeat(30 - task.length), - commands: commands.join(" "), + spacing: " ".repeat(max - task.length + 1), + commands: renderCommand(commands, process.stdout.columns - max - 10), })), }); } @@ -61,11 +82,11 @@ const _task = style(` ${chalk.bold.blue("moonx")} ${chalk.bold.magenta("Usage:")} ${chalk.yellow( - "moonx", + "moonx" )} {command} [...workspaces] [MOON_OPTIONS] -- [COMMAND_OPTIONS] ${chalk.bold( - "Info:", + "Info:" )} When no workspaces are specified, moonx will run the command on all available workspaces. ${chalk.bold("Available workspaces:")} diff --git a/src/utils/load-yaml.ts b/src/utils/load-yaml.ts index c0ca105..e56aad1 100644 --- a/src/utils/load-yaml.ts +++ b/src/utils/load-yaml.ts @@ -13,7 +13,7 @@ type LoadOptions = export async function load( path: string, - options?: LoadOptions, + options?: LoadOptions ): Promise { const file = Bun.file(path); diff --git a/src/utils/log-report.ts b/src/utils/log-report.ts index 70ffbc8..54cf61e 100644 --- a/src/utils/log-report.ts +++ b/src/utils/log-report.ts @@ -3,6 +3,9 @@ import type { RunReport } from "@moonrepo/types"; import { logger } from "./logger.js"; export async function logReport({ enabled }: { enabled: boolean }) { + if (!enabled) { + return; + } const report: RunReport = await Bun.file(".moon/cache/runReport.json").json(); const tasks = report.actions .map((action) => { @@ -28,12 +31,20 @@ export async function logReport({ enabled }: { enabled: boolean }) { const parts = [ task.target + " ".repeat(maxTargetLength + 4 - task.target.length), task.status + " ".repeat(maxStatusLength + 4 - task.status.length), - !task.duration - ? "unknown" - : `${task.duration.secs ? `${task.duration.secs}s ` : ""}${ - task.duration.nanos ? `${task.duration.nanos / 1000000}ms` : "" - }`.trim(), + !task.duration ? "unknown" : formatDuration(task.duration), ]; - logger.info(parts.join(" ")); + logger.info(" " + parts.join(" ")); } } + +function formatDuration(options: { secs: number; nanos: number }) { + const totalMs = options.secs * 1e3 + options.nanos / 1e6; + + if (totalMs < 1000) return `${totalMs.toFixed(2)} ms`; + if (totalMs < 60_000) return `${(totalMs / 1000).toFixed(2)} s`; + + const totalSec = totalMs / 1000; + const minutes = Math.floor(totalSec / 60); + const secondsRemainder = (totalSec % 60).toFixed(2); + return `${minutes}m ${secondsRemainder}s`; +} diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 0d31692..c2d3ace 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -4,7 +4,7 @@ class Logger { public dump( type: "log" | "info" | "warn" | "error", message: string, - prefix?: string, + prefix?: string ) { if (!prefix) { console[type](emojify(message)); diff --git a/src/utils/scan-moon.ts b/src/utils/scan-moon.ts index 229154f..a0cf832 100644 --- a/src/utils/scan-moon.ts +++ b/src/utils/scan-moon.ts @@ -1,5 +1,6 @@ import type { Task } from "@moonrepo/types"; +import { readCache, writeCache } from "./cache.js"; import { load } from "./load-yaml.js"; import { moon } from "./utils.js"; @@ -8,7 +9,15 @@ type QueryResult = { options: object; }; -export async function scan() { +export async function scan(options?: { skipCache?: boolean }) { + // Try to read from cache first unless skipCache is true + if (!options?.skipCache) { + const cached = await readCache(); + if (cached) { + return cached; + } + } + const moonxfig = await load<{ "ignore-tasks": string[]; }>("moonx.yml", { @@ -26,7 +35,7 @@ export async function scan() { const { tasks }: QueryResult = JSON.parse(res.stdout.toString()); const projects = Object.entries(tasks).map( - ([name, tasks]) => [name, Object.keys(tasks)] as const, + ([name, tasks]) => [name, Object.keys(tasks)] as const ); // Map> @@ -43,5 +52,8 @@ export async function scan() { } } + // Write to cache + writeCache(commands); + return commands; } diff --git a/src/utils/utils.ts b/src/utils/utils.ts index c1227a6..ff249f3 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -2,7 +2,7 @@ import type { SpawnOptions } from "bun"; import { logger } from "./logger.js"; -export function getPackageManager() { +function getPackageManager() { const userAgent = process.env.npm_config_user_agent ?? "empty"; return ( ["pnpm", "yarn", "bun", "npm"].find((pm) => userAgent.includes(pm)) ?? null @@ -11,7 +11,7 @@ export function getPackageManager() { let installedGlobally: boolean | null = null; -export function isMoonInstalledGlobally() { +function isMoonInstalledGlobally() { if (installedGlobally !== null) { return installedGlobally; } @@ -40,7 +40,7 @@ function getBaseCommand() { return ["moon"]; } logger.error( - "Could not find a package manager to run moon and moon is not installed globally", + "Could not find a package manager to run moon and moon is not installed globally" ); process.exit(1); } @@ -49,7 +49,7 @@ function getBaseCommand() { export function moon( args: string[], - options: Omit = {}, + options: Omit = {} ) { const baseCommand = getBaseCommand(); return Bun.spawnSync({ diff --git a/tsconfig.json b/tsconfig.json index b8895a3..efee74b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,15 @@ { "compilerOptions": { - "strict": true, "target": "ESNext", "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true, "skipLibCheck": true, - "types": ["bun-types", "@withfig/autocomplete-types"], "resolveJsonModule": true, - "moduleResolution": "NodeNext" + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "types": ["bun-types"] }, - "include": ["src/**/*", "scripts/**/*"] + "include": ["src/**/*", "scripts/**/*"], + "exclude": ["node_modules", "bin", "dist"] } From 7fb271d4036337d56cdbd488db1a4c8a62eb760c Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 21:14:34 +0200 Subject: [PATCH 02/14] tag Signed-off-by: Mathis Pinsault --- CHANGELOG.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..0611a70 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# @maastrich/moonx + +## 0.1.7 + +### Patch Changes + +- This is a test workflow diff --git a/package.json b/package.json index 6d482ec..fd9cf83 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@maastrich/moonx", - "version": "0.1.6", + "version": "0.1.7", "description": "A CLI tool to help you with moon syntax", "keywords": [ "moon", From 1705270631aa07981481d03074325947db3524cf Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 21:37:08 +0200 Subject: [PATCH 03/14] add fixes Signed-off-by: Mathis Pinsault --- .github/workflows/release.yml | 25 +- bun.lockb | Bin 76943 -> 0 bytes package.json | 30 +- pnpm-lock.yaml | 1655 +++++++++++++++++++++++++++++++++ src/utils/utils.ts | 13 +- tsconfig.json | 19 +- 6 files changed, 1709 insertions(+), 33 deletions(-) delete mode 100755 bun.lockb create mode 100644 pnpm-lock.yaml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d0c68e8..f0a7cdc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,13 +52,20 @@ jobs: with: fetch-depth: 0 - - name: Setup Bun - uses: oven-sh/setup-bun@v2 + - uses: pnpm/action-setup@v4 + name: Install pnpm with: - bun-version: latest + version: 10 + run_install: false + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" - name: Install dependencies - run: bun install --frozen-lockfile + run: pnpm install --frozen-lockfile - name: Format check run: bun run format @@ -69,16 +76,16 @@ jobs: - name: Lint run: bun run lint + - name: Publish to npm + run: pnpm publish --no-git-checks --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + - name: Download all artifacts uses: actions/download-artifact@v4 with: path: bin - - name: Publish to npm - run: npm publish --access public - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 0d4e6b0995554033c3f529aa5422b5a903c79bb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76943 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 bGweNtOBFN*bn|T`lvLDE_$b1E-+%uP7^%;~ diff --git a/package.json b/package.json index fd9cf83..155a675 100644 --- a/package.json +++ b/package.json @@ -21,29 +21,30 @@ ], "scripts": { "build": "bun build --compile . --outfile=\"bin/moonx\"", + "changeset": "changeset", + "format": "prettier --check . --config ./configs/.prettierrc.json", + "format:fix": "prettier --write . --config ./configs/.prettierrc.json", "postinstall": "node scripts/setup-binary.js", - "sort": "bun x sort-package-json", - "type-check": "tsc --noEmit", - "lint": "bun run lint:knip && bun run lint:oxlint", - "lint:fix": "bun run lint:knip:fix && bun run lint:oxlint:fix", + "lint": "pnpm run lint:knip && pnpm run lint:oxlint", + "lint:fix": "pnpm run lint:knip:fix && pnpm run lint:oxlint:fix", "lint:knip": "knip --config ./configs/knip.json", "lint:knip:fix": "knip --config ./configs/knip.json --fix", "lint:oxlint": "oxlint src scripts --config ./configs/oxlint.json", "lint:oxlint:fix": "oxlint src scripts --config ./configs/oxlint.json --fix", - "format": "prettier --check . --config ./configs/.prettierrc.json", - "format:fix": "prettier --write . --config ./configs/.prettierrc.json", - "changeset": "changeset", - "version": "changeset version", - "release": "bun run build && changeset publish", - "prepack": "bun run build", - "prepublishOnly": "bun run format && bun run type-check && bun run lint" + "prepack": "pnpm run build", + "prepublishOnly": "pnpm run format && pnpm run type-check && pnpm run lint", + "release": "pnpm run build && changeset publish", + "sort": "pnpm sort-package-json", + "type-check": "tsc --noEmit", + "version": "changeset version" }, "devDependencies": { "@changesets/cli": "^2.29.7", "@moonrepo/types": "^1.21.3", "@prettier/plugin-oxc": "^0.0.4", + "@types/bun": "^1.3.0", + "@types/node": "^24.9.1", "@types/nunjucks": "^3.2.6", - "bun-types": "^1.0.11", "cac": "^6.7.14", "chalk": "^5.3.0", "knip": "^5.66.2", @@ -54,5 +55,10 @@ "sort-package-json": "^2.6.0", "typescript": "^5.9.3", "yaml": "^2.3.4" + }, + "packageManager": "pnpm@10.8.1", + "engines": { + "node": ">=18", + "pnpm": ">=9" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..d2aeb10 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1655 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: false + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@changesets/cli': + specifier: ^2.29.7 + version: 2.29.7(@types/node@24.9.1) + '@moonrepo/types': + specifier: ^1.21.3 + version: 1.33.3 + '@prettier/plugin-oxc': + specifier: ^0.0.4 + version: 0.0.4 + '@types/bun': + specifier: ^1.3.0 + version: 1.3.0 + '@types/node': + specifier: ^24.9.1 + version: 24.9.1 + '@types/nunjucks': + specifier: ^3.2.6 + version: 3.2.6 + cac: + specifier: ^6.7.14 + version: 6.7.14 + chalk: + specifier: ^5.3.0 + version: 5.6.2 + knip: + specifier: ^5.66.2 + version: 5.66.2(@types/node@24.9.1)(typescript@5.9.3) + node-emoji: + specifier: ^2.1.0 + version: 2.2.0 + nunjucks: + specifier: ^3.2.4 + version: 3.2.4 + oxlint: + specifier: ^1.23.0 + version: 1.23.0 + prettier: + specifier: ^3.6.2 + version: 3.6.2 + sort-package-json: + specifier: ^2.6.0 + version: 2.15.1 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + yaml: + specifier: ^2.3.4 + version: 2.8.1 + +packages: + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.0.13': + resolution: {integrity: sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==} + + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + + '@changesets/cli@2.29.7': + resolution: {integrity: sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==} + hasBin: true + + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + + '@emnapi/core@1.6.0': + resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} + + '@emnapi/runtime@1.6.0': + resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@moonrepo/types@1.33.3': + resolution: {integrity: sha512-MSwSPsGR4P/879/FlGeKFYzZKjfI4eqPvALiAyjrbEjWoZ83nDlXNywf3eGBxJHox2VUHW4hb13dr5TcULhq9A==} + engines: {node: '>=18.12.0'} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@oxc-parser/binding-android-arm64@0.74.0': + resolution: {integrity: sha512-lgq8TJq22eyfojfa2jBFy2m66ckAo7iNRYDdyn9reXYA3I6Wx7tgGWVx1JAp1lO+aUiqdqP/uPlDaETL9tqRcg==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.74.0': + resolution: {integrity: sha512-xbY/io/hkARggbpYEMFX6CwFzb7f4iS6WuBoBeZtdqRWfIEi7sm/uYWXfyVeB8uqOATvJ07WRFC2upI8PSI83g==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.74.0': + resolution: {integrity: sha512-FIj2gAGtFaW0Zk+TnGyenMUoRu1ju+kJ/h71D77xc1owOItbFZFGa+4WSVck1H8rTtceeJlK+kux+vCjGFCl9Q==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.74.0': + resolution: {integrity: sha512-W1I+g5TJg0TRRMHgEWNWsTIfe782V3QuaPgZxnfPNmDMywYdtlzllzclBgaDq6qzvZCCQc/UhvNb37KWTCTj8A==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.74.0': + resolution: {integrity: sha512-gxqkyRGApeVI8dgvJ19SYe59XASW3uVxF1YUgkE7peW/XIg5QRAOVTFKyTjI9acYuK1MF6OJHqx30cmxmZLtiQ==} + engines: {node: '>=20.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.74.0': + resolution: {integrity: sha512-jpnAUP4Fa93VdPPDzxxBguJmldj/Gpz7wTXKFzpAueqBMfZsy9KNC+0qT2uZ9HGUDMzNuKw0Se3bPCpL/gfD2Q==} + engines: {node: '>=20.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.74.0': + resolution: {integrity: sha512-fcWyM7BNfCkHqIf3kll8fJctbR/PseL4RnS2isD9Y3FFBhp4efGAzhDaxIUK5GK7kIcFh1P+puIRig8WJ6IMVQ==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.74.0': + resolution: {integrity: sha512-AMY30z/C77HgiRRJX7YtVUaelKq1ex0aaj28XoJu4SCezdS8i0IftUNTtGS1UzGjGZB8zQz5SFwVy4dRu4GLwg==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.74.0': + resolution: {integrity: sha512-/RZAP24TgZo4vV/01TBlzRqs0R7E6xvatww4LnmZEBBulQBU/SkypDywfriFqWuFoa61WFXPV7sLcTjJGjim/w==} + engines: {node: '>=20.0.0'} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.74.0': + resolution: {integrity: sha512-620J1beNAlGSPBD+Msb3ptvrwxu04B8iULCH03zlf0JSLy/5sqlD6qBs0XUVkUJv1vbakUw1gfVnUQqv0UTuEg==} + engines: {node: '>=20.0.0'} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.74.0': + resolution: {integrity: sha512-WBFgQmGtFnPNzHyLKbC1wkYGaRIBxXGofO0+hz1xrrkPgbxbJS1Ukva1EB8sPaVBBQ52Bdc2GjLSp721NWRvww==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.74.0': + resolution: {integrity: sha512-y4mapxi0RGqlp3t6Sm+knJlAEqdKDYrEue2LlXOka/F2i4sRN0XhEMPiSOB3ppHmvK4I2zY2XBYTsX1Fel0fAg==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-wasm32-wasi@0.74.0': + resolution: {integrity: sha512-yDS9bRDh5ymobiS2xBmjlrGdUuU61IZoJBaJC5fELdYT5LJNBXlbr3Yc6m2PWfRJwkH6Aq5fRvxAZ4wCbkGa8w==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.74.0': + resolution: {integrity: sha512-XFWY52Rfb4N5wEbMCTSBMxRkDLGbAI9CBSL24BIDywwDJMl31gHEVlmHdCDRoXAmanCI6gwbXYTrWe0HvXJ7Aw==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.74.0': + resolution: {integrity: sha512-1D3x6iU2apLyfTQHygbdaNbX3nZaHu4yaXpD7ilYpoLo7f0MX0tUuoDrqJyJrVGqvyXgc0uz4yXz9tH9ZZhvvg==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.74.0': + resolution: {integrity: sha512-KOw/RZrVlHGhCXh1RufBFF7Nuo7HdY5w1lRJukM/igIl6x9qtz8QycDvZdzb4qnHO7znrPyo2sJrFJK2eKHgfQ==} + + '@oxc-resolver/binding-android-arm-eabi@11.11.1': + resolution: {integrity: sha512-v5rtczLD5d8lasBdP6GXoM7VQ1Av9pZyWGXF5afQawRZcWTVvncrIzu9nhKpvIhhmC4C6MYdXA3CNZc60LvUig==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.11.1': + resolution: {integrity: sha512-0QqKsM8/XRNDGZy1/rxys53U/aCLVBKV2jgGFr3msypTZtNH/d4qao7QULM++H4hcaXghfXaB4xVCPDg3tHCvQ==} + cpu: [arm64] + os: [android] + + '@oxc-resolver/binding-darwin-arm64@11.11.1': + resolution: {integrity: sha512-xdHj8Mn3WB+dTGWcMzC07pZiSvQfKxcCEIlmDGrwwLmS4MgyJcraDDykFg4NXwd8dJNKOLqEfV3RMLRYgE2f8w==} + cpu: [arm64] + os: [darwin] + + '@oxc-resolver/binding-darwin-x64@11.11.1': + resolution: {integrity: sha512-t9ImHoJXhFimPx3u0UMbQzADUBq/xnQY1eGc3bfOu5l4h0k/3rlsO16Fe8dheG8Iuvc3j2lh8H8dFg/Los4WeQ==} + cpu: [x64] + os: [darwin] + + '@oxc-resolver/binding-freebsd-x64@11.11.1': + resolution: {integrity: sha512-aK7b1Yr2VkC2efK0w63v7gZkCqYmhR4XTCCYgA5KbtpJVg1OwFXVRjO1vfWNn5osk9dNpaIdeo3C1IfWPhW68w==} + cpu: [x64] + os: [freebsd] + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.11.1': + resolution: {integrity: sha512-9wHEYo+1VLoCjX4iI29ZR2ExdcGbG8JlmSR0aRW/A/NuzKxFB+bfiPkwUrvdSv7syXS8CrixvLdqAkBoXgk/rQ==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.11.1': + resolution: {integrity: sha512-Mf8wZJEeGAQ1WAwp6nvtxucYAQDDtj9Qhv1BaQS8SbeR3na203RUFdEm6F5ptWzF8cuY+ye+FsGKr8lKG3pvWg==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-gnu@11.11.1': + resolution: {integrity: sha512-Fk8BrFBfKzUveCEAXZ6kDhyc5RLWIWOI0+UZGp1G3WQIFo9HDEqnYtsOtUbzLtjifbyMhtaTteElRSGNKTJ3nA==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-arm64-musl@11.11.1': + resolution: {integrity: sha512-jbsO1/VTDRb5FAvWnxEIFOnFHA7dALBn5HPdxdoAbnuvjgjIPYMVvTFEBPNLz3BSFxWdounZasZDYYFhBhFzmQ==} + cpu: [arm64] + os: [linux] + + '@oxc-resolver/binding-linux-ppc64-gnu@11.11.1': + resolution: {integrity: sha512-+aY2AjUQkByiOtKUU0RyqB7VV7HIh3SMBh54/9nzUbHN5RiF0As5DApV/IwbQjB2oKc0VywQZzE+/Wj/Ijvd/Q==} + cpu: [ppc64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.11.1': + resolution: {integrity: sha512-HqBogCmIl344en3EAhC9vSm/h52fb5BA0eFxsgsH9HgwYY6qH4th4msBqBAiMRCKcC6hVwjh0fmzHgST2rx4Cw==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-musl@11.11.1': + resolution: {integrity: sha512-9dXyIMQMrh76WyMtNDJhsRYqc6KDsQe3/ja9fAPBk28p7kltEvZvHpivq1Xa8Ca/JCa8QgTROgLInChNEF27bQ==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-s390x-gnu@11.11.1': + resolution: {integrity: sha512-Ybp/bSJmnl0sr8zh+nIz0cpU077tDZDYRYDhZiWN+f7rcWF7D8Z/pKD9zPxRocvJieZGfzrIwmHiHf9eY47P9w==} + cpu: [s390x] + os: [linux] + + '@oxc-resolver/binding-linux-x64-gnu@11.11.1': + resolution: {integrity: sha512-uVWj/UI6+l5/CeV2d4XpjycJNDkk/JfxNzQLAFCsVl5ZbrIfWQ9TzEzAi7xsDgVZYLBuL7iSowQ7YYRp1LQZlA==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-linux-x64-musl@11.11.1': + resolution: {integrity: sha512-Q9kQmiZn4bNnCOqPHvdF4bHdKXBa7Ow6yfeKTWPNOHyoZXdyxIu5C+3jSjo+SJiFNhmnh0hEAN8om6GEuJEYCA==} + cpu: [x64] + os: [linux] + + '@oxc-resolver/binding-wasm32-wasi@11.11.1': + resolution: {integrity: sha512-skGIwjoRwEh2qFIaG/wwa74i5KcoWNTEy1ycB6qdRV+OOSlkosVFIzXPYzjcuwtIL1M6pC7+M+56TgQQEzOUmw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-resolver/binding-win32-arm64-msvc@11.11.1': + resolution: {integrity: sha512-5R2GVH44JXGoI+gVlR4+O3ql6KZICQlCmIB0ZbpiYbEHNxaB47v3aSMVxcCuwhYKndJUJZwRXnYzoCfMEu4o0g==} + cpu: [arm64] + os: [win32] + + '@oxc-resolver/binding-win32-ia32-msvc@11.11.1': + resolution: {integrity: sha512-iB/ljDyPJCMIO7WPx2bj8fRCB1TxmHSv/t3oyUwOiz79Q0A33QbwZWhdx+ZXdazGPer71mYZfr3eb0hAnmlgrg==} + cpu: [ia32] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.11.1': + resolution: {integrity: sha512-OtUpzpStS5bgVGXV7eaBr7Spot9lXu/wyd0yWEyoG2tyzm/bwdRKCwJQzxWIhlecRxMDGA+qlLRRicTNOejkSQ==} + cpu: [x64] + os: [win32] + + '@oxlint/darwin-arm64@1.23.0': + resolution: {integrity: sha512-sbxoftgEMKmZQO7O4wHR9Rs7MfiHa2UH2x4QJDoc4LXqSCsI4lUIJbFQ05vX+zOUbt7CQMPdxEzExd4DqeKY2w==} + cpu: [arm64] + os: [darwin] + + '@oxlint/darwin-x64@1.23.0': + resolution: {integrity: sha512-PjByWr1TlwHQiOqEc8CPyXCT4wnujSK3n9l1m4un0Eh0uLJEDG5WM9tyDWOGuakC0Ika9/SMp0HDRg3ySchRRA==} + cpu: [x64] + os: [darwin] + + '@oxlint/linux-arm64-gnu@1.23.0': + resolution: {integrity: sha512-sWlCwQ6xKeKC08qU3SfozqpRGCLJiO/onPYFJKEHbjzHkFp+OubOacFaT4ePcka28jCU1TvQ7Gi5BVQRncr0Xg==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-arm64-musl@1.23.0': + resolution: {integrity: sha512-MPkmSiezuVgjMbzDSkRhENdnb038JOI+OTpBrOho2crbCAuqSRvyFwkMRhncJGZskzo1yeKxrKXB8T83ofmSXw==} + cpu: [arm64] + os: [linux] + + '@oxlint/linux-x64-gnu@1.23.0': + resolution: {integrity: sha512-F6H9wmLfjBoNqtsgyg3P9abLnkVjNbCAnISKdRtDl7HvkMs4s/eU8np9+tSnqPeKOTBhkS+h/VSWgPGZTqIWQA==} + cpu: [x64] + os: [linux] + + '@oxlint/linux-x64-musl@1.23.0': + resolution: {integrity: sha512-Xra0Cow35mAku8mbUbviPRalTU4Ct6MXQ1Eue8GmN4HFkjosrNa5qfy7QkJBqzjiI+JdnHxPXwackGn92/XOQw==} + cpu: [x64] + os: [linux] + + '@oxlint/win32-arm64@1.23.0': + resolution: {integrity: sha512-FR+I+uGD3eFzTfBw87QRr+Y1jBYil3TqPM0wkSvuf3gOJTEXAfSkh9QHCgQqrseW3HDW7YJJ8ty1+sU31H/N4g==} + cpu: [arm64] + os: [win32] + + '@oxlint/win32-x64@1.23.0': + resolution: {integrity: sha512-/oX0b26YIC1OgS5B+G8Ux1Vs/PIjOP4CBRzsPpYr0T+RoboJ3ZuV32bztLRggJKQqIlozcqiRo9fl/UMOMp8kQ==} + cpu: [x64] + os: [win32] + + '@prettier/plugin-oxc@0.0.4': + resolution: {integrity: sha512-UGXe+g/rSRbglL0FOJiar+a+nUrst7KaFmsg05wYbKiInGWP6eAj/f8A2Uobgo5KxEtb2X10zeflNH6RK2xeIQ==} + engines: {node: '>=14'} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/bun@1.3.0': + resolution: {integrity: sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@24.9.1': + resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==} + + '@types/nunjucks@3.2.6': + resolution: {integrity: sha512-pHiGtf83na1nCzliuAdq8GowYiXvH5l931xZ0YEHaLMNFgynpEqx+IPStlu7UaDkehfvl01e4x/9Tpwhy7Ue3w==} + + a-sync-waterfall@1.0.1: + resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bun-types@1.3.0: + resolution: {integrity: sha512-u8X0thhx+yJ0KmkxuEo9HAtdfgCBaM/aI9K90VQcQioAmkVp3SG3FkwWGibUFz3WdXAdcsqOcbU40lK7tbHdkQ==} + peerDependencies: + '@types/react': ^19 + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chardet@2.1.0: + resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} + + detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + formatly@0.3.0: + resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} + engines: {node: '>=18.3.0'} + hasBin: true + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + git-hooks-list@3.2.0: + resolution: {integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + human-id@4.1.2: + resolution: {integrity: sha512-v/J+4Z/1eIJovEBdlV5TYj1IR+ZiohcYGRY+qN/oC9dAfKzVT023N/Bgw37hrKCoVRBvk3bqyzpr2PP5YeTMSg==} + hasBin: true + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + knip@5.66.2: + resolution: {integrity: sha512-5wvsdc17C5bMxjuGfN9KVS/tW5KIvzP1RClfpTMdLYm8IXIsfWsiHlFkTvZIca9skwoVDyTyXmbRq4w1Poim+A==} + engines: {node: '>=18.18.0'} + hasBin: true + peerDependencies: + '@types/node': '>=18' + typescript: '>=5.0.4 <7' + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + node-emoji@2.2.0: + resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} + engines: {node: '>=18'} + + nunjucks@3.2.4: + resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==} + engines: {node: '>= 6.9.0'} + hasBin: true + peerDependencies: + chokidar: ^3.3.0 + peerDependenciesMeta: + chokidar: + optional: true + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + oxc-parser@0.74.0: + resolution: {integrity: sha512-2tDN/ttU8WE6oFh8EzKNam7KE7ZXSG5uXmvX85iNzxdJfMssDWcj3gpYzZi1E04XuE7m3v1dVWl/8BE886vPGw==} + engines: {node: '>=20.0.0'} + + oxc-resolver@11.11.1: + resolution: {integrity: sha512-4Z86u4xQAxl2IC1OAAdHjk/S9GNbE2ewALQVOpBk9F8NkfqXlglY6R2ts+HEgY/Q3T9m/H8W0G4id71muw/Nng==} + + oxlint@1.23.0: + resolution: {integrity: sha512-cLVdSE7Bza8npm+PffU0oufs15+M5uSMbQn0k2fJCayWU0xqQ3dyA3w9tEk8lgNOk1j1VJEdYctz64Vik8VG1w==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.2.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + smol-toml@1.4.2: + resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==} + engines: {node: '>= 18'} + + sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + + sort-package-json@2.15.1: + resolution: {integrity: sha512-9x9+o8krTT2saA9liI4BljNjwAbvUnWf11Wq+i/iZt8nl2UGYnf3TH5uBydE7VALmP7AGwlfszuEeL8BDyb0YA==} + hasBin: true + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@5.0.2: + resolution: {integrity: sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g==} + engines: {node: '>=14.16'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + +snapshots: + + '@babel/runtime@7.28.4': {} + + '@changesets/apply-release-plan@7.0.13': + dependencies: + '@changesets/config': 3.1.1 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.3 + + '@changesets/assemble-release-plan@6.0.9': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.3 + + '@changesets/changelog-git@0.2.1': + dependencies: + '@changesets/types': 6.1.0 + + '@changesets/cli@2.29.7(@types/node@24.9.1)': + dependencies: + '@changesets/apply-release-plan': 7.0.13 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.13 + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.2(@types/node@24.9.1) + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.3 + spawndamnit: 3.0.1 + term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' + + '@changesets/config@3.1.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.3': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.3 + + '@changesets/get-release-plan@4.0.13': + dependencies: + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.4': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.1': + dependencies: + '@changesets/types': 6.1.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.5': + dependencies: + '@changesets/git': 3.0.4 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.2': + dependencies: + '@changesets/types': 6.1.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.1.0': {} + + '@changesets/write@0.4.0': + dependencies: + '@changesets/types': 6.1.0 + fs-extra: 7.0.1 + human-id: 4.1.2 + prettier: 2.8.8 + + '@emnapi/core@1.6.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.6.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@inquirer/external-editor@1.0.2(@types/node@24.9.1)': + dependencies: + chardet: 2.1.0 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 24.9.1 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.28.4 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.28.4 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@moonrepo/types@1.33.3': {} + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@oxc-parser/binding-android-arm64@0.74.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.74.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.74.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.74.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.74.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.74.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.74.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.74.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.74.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.74.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.74.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.74.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.74.0': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.74.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.74.0': + optional: true + + '@oxc-project/types@0.74.0': {} + + '@oxc-resolver/binding-android-arm-eabi@11.11.1': + optional: true + + '@oxc-resolver/binding-android-arm64@11.11.1': + optional: true + + '@oxc-resolver/binding-darwin-arm64@11.11.1': + optional: true + + '@oxc-resolver/binding-darwin-x64@11.11.1': + optional: true + + '@oxc-resolver/binding-freebsd-x64@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-arm-gnueabihf@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-arm-musleabihf@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-arm64-gnu@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-arm64-musl@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-ppc64-gnu@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-riscv64-gnu@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-riscv64-musl@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-s390x-gnu@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-x64-gnu@11.11.1': + optional: true + + '@oxc-resolver/binding-linux-x64-musl@11.11.1': + optional: true + + '@oxc-resolver/binding-wasm32-wasi@11.11.1': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@oxc-resolver/binding-win32-arm64-msvc@11.11.1': + optional: true + + '@oxc-resolver/binding-win32-ia32-msvc@11.11.1': + optional: true + + '@oxc-resolver/binding-win32-x64-msvc@11.11.1': + optional: true + + '@oxlint/darwin-arm64@1.23.0': + optional: true + + '@oxlint/darwin-x64@1.23.0': + optional: true + + '@oxlint/linux-arm64-gnu@1.23.0': + optional: true + + '@oxlint/linux-arm64-musl@1.23.0': + optional: true + + '@oxlint/linux-x64-gnu@1.23.0': + optional: true + + '@oxlint/linux-x64-musl@1.23.0': + optional: true + + '@oxlint/win32-arm64@1.23.0': + optional: true + + '@oxlint/win32-x64@1.23.0': + optional: true + + '@prettier/plugin-oxc@0.0.4': + dependencies: + oxc-parser: 0.74.0 + + '@sindresorhus/is@4.6.0': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/bun@1.3.0': + dependencies: + bun-types: 1.3.0 + transitivePeerDependencies: + - '@types/react' + + '@types/node@12.20.55': {} + + '@types/node@24.9.1': + dependencies: + undici-types: 7.16.0 + + '@types/nunjucks@3.2.6': {} + + a-sync-waterfall@1.0.1: {} + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + asap@2.0.6: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bun-types@1.3.0: + dependencies: + '@types/node': 24.9.1 + + cac@6.7.14: {} + + chalk@5.6.2: {} + + char-regex@1.0.2: {} + + chardet@2.1.0: {} + + ci-info@3.9.0: {} + + commander@5.1.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + detect-indent@6.1.0: {} + + detect-indent@7.0.2: {} + + detect-newline@4.0.1: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + emojilib@2.4.0: {} + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + esprima@4.0.1: {} + + extendable-error@0.1.7: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fd-package-json@2.0.0: + dependencies: + walk-up-path: 4.0.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + formatly@0.3.0: + dependencies: + fd-package-json: 2.0.0 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + get-stdin@9.0.0: {} + + git-hooks-list@3.2.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + graceful-fs@4.2.11: {} + + human-id@4.1.2: {} + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + + isexe@2.0.0: {} + + jiti@2.6.1: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + knip@5.66.2(@types/node@24.9.1)(typescript@5.9.3): + dependencies: + '@nodelib/fs.walk': 1.2.8 + '@types/node': 24.9.1 + fast-glob: 3.3.3 + formatly: 0.3.0 + jiti: 2.6.1 + js-yaml: 4.1.0 + minimist: 1.2.8 + oxc-resolver: 11.11.1 + picocolors: 1.1.1 + picomatch: 4.0.3 + smol-toml: 1.4.2 + strip-json-comments: 5.0.2 + typescript: 5.9.3 + zod: 4.1.12 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.startcase@4.4.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + minimist@1.2.8: {} + + mri@1.2.0: {} + + node-emoji@2.2.0: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + + nunjucks@3.2.4: + dependencies: + a-sync-waterfall: 1.0.1 + asap: 2.0.6 + commander: 5.1.0 + + outdent@0.5.0: {} + + oxc-parser@0.74.0: + dependencies: + '@oxc-project/types': 0.74.0 + optionalDependencies: + '@oxc-parser/binding-android-arm64': 0.74.0 + '@oxc-parser/binding-darwin-arm64': 0.74.0 + '@oxc-parser/binding-darwin-x64': 0.74.0 + '@oxc-parser/binding-freebsd-x64': 0.74.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.74.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.74.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.74.0 + '@oxc-parser/binding-linux-arm64-musl': 0.74.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.74.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.74.0 + '@oxc-parser/binding-linux-x64-gnu': 0.74.0 + '@oxc-parser/binding-linux-x64-musl': 0.74.0 + '@oxc-parser/binding-wasm32-wasi': 0.74.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.74.0 + '@oxc-parser/binding-win32-x64-msvc': 0.74.0 + + oxc-resolver@11.11.1: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.11.1 + '@oxc-resolver/binding-android-arm64': 11.11.1 + '@oxc-resolver/binding-darwin-arm64': 11.11.1 + '@oxc-resolver/binding-darwin-x64': 11.11.1 + '@oxc-resolver/binding-freebsd-x64': 11.11.1 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.11.1 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.11.1 + '@oxc-resolver/binding-linux-arm64-gnu': 11.11.1 + '@oxc-resolver/binding-linux-arm64-musl': 11.11.1 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.11.1 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.11.1 + '@oxc-resolver/binding-linux-riscv64-musl': 11.11.1 + '@oxc-resolver/binding-linux-s390x-gnu': 11.11.1 + '@oxc-resolver/binding-linux-x64-gnu': 11.11.1 + '@oxc-resolver/binding-linux-x64-musl': 11.11.1 + '@oxc-resolver/binding-wasm32-wasi': 11.11.1 + '@oxc-resolver/binding-win32-arm64-msvc': 11.11.1 + '@oxc-resolver/binding-win32-ia32-msvc': 11.11.1 + '@oxc-resolver/binding-win32-x64-msvc': 11.11.1 + + oxlint@1.23.0: + optionalDependencies: + '@oxlint/darwin-arm64': 1.23.0 + '@oxlint/darwin-x64': 1.23.0 + '@oxlint/linux-arm64-gnu': 1.23.0 + '@oxlint/linux-arm64-musl': 1.23.0 + '@oxlint/linux-x64-gnu': 1.23.0 + '@oxlint/linux-x64-musl': 1.23.0 + '@oxlint/win32-arm64': 1.23.0 + '@oxlint/win32-x64': 1.23.0 + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pify@4.0.1: {} + + prettier@2.8.8: {} + + prettier@3.6.2: {} + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + resolve-from@5.0.0: {} + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + semver@7.7.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + + slash@3.0.0: {} + + smol-toml@1.4.2: {} + + sort-object-keys@1.1.3: {} + + sort-package-json@2.15.1: + dependencies: + detect-indent: 7.0.2 + detect-newline: 4.0.1 + get-stdin: 9.0.0 + git-hooks-list: 3.2.0 + is-plain-obj: 4.1.0 + semver: 7.7.3 + sort-object-keys: 1.1.3 + tinyglobby: 0.2.15 + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + sprintf-js@1.0.3: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-json-comments@5.0.2: {} + + term-size@2.2.1: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tslib@2.8.1: + optional: true + + typescript@5.9.3: {} + + undici-types@7.16.0: {} + + unicode-emoji-modifier-base@1.0.0: {} + + universalify@0.1.2: {} + + walk-up-path@4.0.0: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + yaml@2.8.1: {} + + zod@4.1.12: {} diff --git a/src/utils/utils.ts b/src/utils/utils.ts index ff249f3..0afc6c7 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -40,20 +40,23 @@ function getBaseCommand() { return ["moon"]; } logger.error( - "Could not find a package manager to run moon and moon is not installed globally" + "Could not find a package manager to run moon and moon is not installed globally", ); process.exit(1); } } } -export function moon( +export function moon< + const In extends SpawnOptions.Writable = "ignore", + const Out extends SpawnOptions.Readable = "pipe", + const Err extends SpawnOptions.Readable = "pipe", +>( args: string[], - options: Omit = {} + options: Omit, "cmd"> = {}, ) { const baseCommand = getBaseCommand(); - return Bun.spawnSync({ - cmd: [...baseCommand, ...args], + return Bun.spawnSync([...baseCommand, ...args], { ...options, }); } diff --git a/tsconfig.json b/tsconfig.json index efee74b..c53bf8f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,20 @@ { "compilerOptions": { - "target": "ESNext", - "module": "NodeNext", - "moduleResolution": "NodeNext", + "target": "ES2020", + "module": "ESNext", + "lib": ["ES2020"], + "moduleResolution": "bundler", "strict": true, "skipLibCheck": true, - "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "types": ["bun-types"] + "resolveJsonModule": true, + "outDir": "./dist", + "rootDir": "./src" }, - "include": ["src/**/*", "scripts/**/*"], - "exclude": ["node_modules", "bin", "dist"] + "include": ["src/**/*"], + "exclude": ["node_modules"] } From 5ae5bc610d1015ab6d56e4c896c0d1c77a498011 Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 21:37:51 +0200 Subject: [PATCH 04/14] v0.1.8 Signed-off-by: Mathis Pinsault --- CHANGELOG.md | 6 ++++++ package.json | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0611a70..6e565f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # @maastrich/moonx +## 0.1.8 + +### Patch Changes + +- Another test + ## 0.1.7 ### Patch Changes diff --git a/package.json b/package.json index 155a675..af23082 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@maastrich/moonx", - "version": "0.1.7", + "version": "0.1.8", "description": "A CLI tool to help you with moon syntax", "keywords": [ "moon", From 54b2f856d85907b3d825249f0f5b125338369c57 Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 21:39:25 +0200 Subject: [PATCH 05/14] update Signed-off-by: Mathis Pinsault --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f0a7cdc..bfb8cab 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -55,7 +55,6 @@ jobs: - uses: pnpm/action-setup@v4 name: Install pnpm with: - version: 10 run_install: false - name: Install Node.js From 82849c1c6c59aee89bf8a5f99b4d31e013214ed5 Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 21:41:29 +0200 Subject: [PATCH 06/14] update to pnpm Signed-off-by: Mathis Pinsault --- .github/workflows/release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bfb8cab..05df26b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -67,13 +67,13 @@ jobs: run: pnpm install --frozen-lockfile - name: Format check - run: bun run format + run: pnpm run format - name: Type check - run: bun run type-check + run: pnpm run type-check - name: Lint - run: bun run lint + run: pnpm run lint - name: Publish to npm run: pnpm publish --no-git-checks --access public From 3ac3077e7c19455805392a64dadc9b2b0f19eeb4 Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 21:43:42 +0200 Subject: [PATCH 07/14] update Signed-off-by: Mathis Pinsault --- src/utils/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 0afc6c7..aee3e4f 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -40,7 +40,7 @@ function getBaseCommand() { return ["moon"]; } logger.error( - "Could not find a package manager to run moon and moon is not installed globally", + "Could not find a package manager to run moon and moon is not installed globally" ); process.exit(1); } @@ -53,7 +53,7 @@ export function moon< const Err extends SpawnOptions.Readable = "pipe", >( args: string[], - options: Omit, "cmd"> = {}, + options: Omit, "cmd"> = {} ) { const baseCommand = getBaseCommand(); return Bun.spawnSync([...baseCommand, ...args], { From 576772959aa2a0a4310496ad4c82e85089f295a1 Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 21:46:29 +0200 Subject: [PATCH 08/14] fix Signed-off-by: Mathis Pinsault --- .github/workflows/release.yml | 5 +++++ package.json | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 05df26b..6253cc4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -57,6 +57,11 @@ jobs: with: run_install: false + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + - name: Install Node.js uses: actions/setup-node@v4 with: diff --git a/package.json b/package.json index af23082..c6eacf8 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "lint:oxlint": "oxlint src scripts --config ./configs/oxlint.json", "lint:oxlint:fix": "oxlint src scripts --config ./configs/oxlint.json --fix", "prepack": "pnpm run build", - "prepublishOnly": "pnpm run format && pnpm run type-check && pnpm run lint", "release": "pnpm run build && changeset publish", "sort": "pnpm sort-package-json", "type-check": "tsc --noEmit", From 952ddb0e28b44e13b5c538ea0a163c8de9bf44ff Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 21:52:59 +0200 Subject: [PATCH 09/14] fix Signed-off-by: Mathis Pinsault --- .github/workflows/release.yml | 5 ----- package.json | 2 -- 2 files changed, 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6253cc4..05df26b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -57,11 +57,6 @@ jobs: with: run_install: false - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - name: Install Node.js uses: actions/setup-node@v4 with: diff --git a/package.json b/package.json index c6eacf8..35d2a9e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "license": "MIT", "author": "Maastrich @maastrich", "type": "module", - "main": "src/index.ts", "bin": { "moonx": "bin/moonx", "mx": "bin/moonx" @@ -31,7 +30,6 @@ "lint:knip:fix": "knip --config ./configs/knip.json --fix", "lint:oxlint": "oxlint src scripts --config ./configs/oxlint.json", "lint:oxlint:fix": "oxlint src scripts --config ./configs/oxlint.json --fix", - "prepack": "pnpm run build", "release": "pnpm run build && changeset publish", "sort": "pnpm sort-package-json", "type-check": "tsc --noEmit", From 016f40b45ca14817e91e16086117f7bc49dc8ad4 Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 21:56:19 +0200 Subject: [PATCH 10/14] fix Signed-off-by: Mathis Pinsault --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 35d2a9e..8a2cec4 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "scripts/setup-binary.js" ], "scripts": { - "build": "bun build --compile . --outfile=\"bin/moonx\"", + "build": "bun build --compile src/index.ts --outfile=\"bin/moonx\"", "changeset": "changeset", "format": "prettier --check . --config ./configs/.prettierrc.json", "format:fix": "prettier --write . --config ./configs/.prettierrc.json", From 559e49ccde195b828e9634e4307dcf4a7bfa90da Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 21:57:45 +0200 Subject: [PATCH 11/14] fix Signed-off-by: Mathis Pinsault --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 05df26b..2314784 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -30,7 +30,7 @@ jobs: run: bun install --frozen-lockfile - name: Build binary - run: bun build . --target="bun-${{ matrix.platform }}-${{ matrix.arch }}" --outfile="bin/${{ matrix.platform }}-${{ matrix.arch }}" --compile + run: bun build src/index.ts --target="bun-${{ matrix.platform }}-${{ matrix.arch }}" --outfile="bin/${{ matrix.platform }}-${{ matrix.arch }}" --compile - name: Upload build artifact uses: actions/upload-artifact@v4 From 9aef5e97d9d87ce67ee7b19e2ffebee573fd1197 Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 22:04:40 +0200 Subject: [PATCH 12/14] fix Signed-off-by: Mathis Pinsault --- .gitignore | 4 +--- bin/moonx | 3 +++ package.json | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100755 bin/moonx diff --git a/.gitignore b/.gitignore index 6b07e52..f71c070 100644 --- a/.gitignore +++ b/.gitignore @@ -233,6 +233,4 @@ $RECYCLE.BIN/ *.lnk # End of https://www.toptal.com/developers/gitignore/api/node,git,macos,windows,visualstudiocode - -# moonx binary -bin +bin/moonx-dev diff --git a/bin/moonx b/bin/moonx new file mode 100755 index 0000000..92c93bb --- /dev/null +++ b/bin/moonx @@ -0,0 +1,3 @@ +#! /usr/bin/env bash + +echo "Binary not installed, you may need to run approve-build" diff --git a/package.json b/package.json index 8a2cec4..afef233 100644 --- a/package.json +++ b/package.json @@ -16,10 +16,11 @@ "mx": "bin/moonx" }, "files": [ + "bin/moonx", "scripts/setup-binary.js" ], "scripts": { - "build": "bun build --compile src/index.ts --outfile=\"bin/moonx\"", + "build": "bun build --compile src/index.ts --outfile=\"bin/moonx-dev\"", "changeset": "changeset", "format": "prettier --check . --config ./configs/.prettierrc.json", "format:fix": "prettier --write . --config ./configs/.prettierrc.json", From 327fcae823e6062b7cb44a87894d67394a1b83e4 Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 22:05:37 +0200 Subject: [PATCH 13/14] add registry Signed-off-by: Mathis Pinsault --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2314784..3d241d6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -62,6 +62,7 @@ jobs: with: node-version: 20 cache: "pnpm" + registry-url: "https://registry.npmjs.org" - name: Install dependencies run: pnpm install --frozen-lockfile From 93432fa788efbe8face2e5ef6577239233ed27de Mon Sep 17 00:00:00 2001 From: Mathis Pinsault Date: Tue, 21 Oct 2025 22:10:34 +0200 Subject: [PATCH 14/14] fix Signed-off-by: Mathis Pinsault --- CHANGELOG.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e565f7..54347e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,5 @@ # @maastrich/moonx -## 0.1.8 +## <= 0.1.8 -### Patch Changes - -- Another test - -## 0.1.7 - -### Patch Changes - -- This is a test workflow +- Initial release