[READ-ONLY] Mirror of https://github.com/bombshell-dev/clack. Effortlessly build beautiful command-line apps bomb.sh/docs/clack/basics/getting-started/
cli command-line command-line-app node prompt prompts
5

Configure Feed

Select the types of activity you want to include in your feed.

scaffold repo

Nate Moore (Feb 8, 2023, 5:29 PM -0600) 306598e0 609af1f2

+362 -71
+8
.changeset/README.md
··· 1 + # Changesets 2 + 3 + Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 + with multi-package repos, or single-package repos to help you version and publish your code. You can 5 + find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 + 7 + We have a quick list of common questions to get you started engaging with this project in 8 + [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
+11
.changeset/config.json
··· 1 + { 2 + "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", 3 + "changelog": "@changesets/cli/changelog", 4 + "commit": false, 5 + "fixed": [], 6 + "linked": [], 7 + "access": "restricted", 8 + "baseBranch": "main", 9 + "updateInternalDependencies": "patch", 10 + "ignore": [] 11 + }
+5
.changeset/witty-pumpkins-yawn.md
··· 1 + --- 2 + "@clack/core": patch 3 + --- 4 + 5 + Initial publish, still WIP
+36
.github/workflows/ci.yml
··· 1 + name: CI 2 + 3 + on: 4 + push: 5 + branches: 6 + - main 7 + pull_request: 8 + 9 + # Automatically cancel in-progress actions on the same branch 10 + concurrency: 11 + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request_target' && github.head_ref || github.ref }} 12 + cancel-in-progress: true 13 + 14 + jobs: 15 + build: 16 + name: Build Packages 17 + runs-on: ubuntu-latest 18 + steps: 19 + - uses: actions/checkout@v3 20 + - uses: pnpm/action-setup@v2.2.1 21 + - uses: actions/setup-node@v3 22 + with: 23 + node-version: 18 24 + cache: "pnpm" 25 + - if: ${{ steps.cache-node.outputs.cache-hit != 'true' }} 26 + run: pnpm install 27 + - run: pnpm run build 28 + - uses: changesets/action@v1 29 + if: ${{ github.event_name != 'pull_request' }} 30 + with: 31 + publish: pnpm changeset publish 32 + commit: "[ci] release" 33 + title: "[ci] release" 34 + env: 35 + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 36 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+2 -1
package.json
··· 3 3 "private": true, 4 4 "type": "module", 5 5 "scripts": { 6 - "start": "tsx ./index.ts" 6 + "build": "pnpm -r run build" 7 7 }, 8 8 "devDependencies": { 9 9 "@changesets/cli": "^2.26.0", 10 10 "@types/node": "18", 11 11 "tsx": "^3.12.2" 12 12 }, 13 + "packageManager": "pnpm@7.6.0", 13 14 "volta": { 14 15 "node": "18.14.0" 15 16 }
packages/core/index.ts packages/core/src/index.ts
+35 -3
packages/core/package.json
··· 3 3 "version": "0.0.0", 4 4 "type": "module", 5 5 "exports": { 6 - ".": "./index.ts" 6 + ".": { 7 + "types": "./dist/index.d.ts", 8 + "import": "./dist/index.js" 9 + }, 10 + "./package.json": "./package.json" 11 + }, 12 + "types": "./dist/index.d.ts", 13 + "repository": { 14 + "type": "git", 15 + "url": "https://github.com/natemoo-re/clack" 16 + }, 17 + "bugs": { 18 + "url": "https://github.com/natemoo-re/clack/issues" 7 19 }, 8 - "dependencies": { 20 + "homepage": "https://github.com/natemoo-re/clack#README", 21 + "files": [ 22 + "dist", 23 + "CHANGELOG.md" 24 + ], 25 + "author": { 26 + "name": "Nate Moore", 27 + "email": "nate@natemoo.re", 28 + "url": "https://twitter.com/n_moore" 29 + }, 30 + "license": "MIT", 31 + "packageManager": "pnpm@7.6.0", 32 + "scripts": { 33 + "build": "pnpm run build:bundle && pnpm run build:types", 34 + "build:bundle": "esbuild src/index.ts --bundle --sourcemap=external --outfile=dist/index.js --format=esm --platform=node --target=node16", 35 + "build:types": "tsc -p ." 36 + }, 37 + "devDependencies": { 38 + "@types/node": "^18.11.19", 39 + "esbuild": "^0.17.6", 9 40 "picocolors": "^1.0.0", 10 - "sisteransi": "^1.0.5" 41 + "sisteransi": "^1.0.5", 42 + "typescript": "^4.9.5" 11 43 } 12 44 }
packages/core/prompts/confirm.ts packages/core/src/prompts/confirm.ts
+2 -2
packages/core/prompts/prompt.ts packages/core/src/prompts/prompt.ts
··· 43 43 export default class Prompt { 44 44 private input: Readable; 45 45 private output: Writable; 46 - private rl: ReadLine; 46 + private rl!: ReadLine; 47 47 private opts: Omit<PromptOptions<Prompt>, 'render'|'input'|'output'>; 48 - private _render: (context: Omit<Prompt, 'prompt'>) => string; 48 + private _render: (context: Omit<Prompt, 'prompt'>) => string | void; 49 49 protected _cursor: number = 0; 50 50 51 51 public state: State = 'initial';
packages/core/prompts/select.ts packages/core/src/prompts/select.ts
packages/core/prompts/text.ts packages/core/src/prompts/text.ts
-59
packages/core/prompts/typeahead.ts
··· 1 - import * as readline from "node:readline"; 2 - import { stdin, stdout } from 'node:process'; 3 - import c from 'picocolors'; 4 - 5 - const dirs = new Set(['up', 'down', 'left']); 6 - export async function typeahead(question: string, complete: (value: string) => string | undefined, { render = (value: string, completion: string = '') => `${value}${c.dim(completion.slice(value.length))}`, input = stdin, output = stdout } = {}) { 7 - let value = ''; 8 - let completion: string | undefined; 9 - 10 - output.write(question); 11 - const prefix = question.split('\n').at(-1) ?? ''; 12 - const initialPrompt = render(''); 13 - const lines = initialPrompt.split('\n'); 14 - const dx = -999; 15 - const dy = -1 * (lines.length - 1); 16 - 17 - const rl = readline.promises.createInterface({ 18 - input, 19 - output, 20 - prompt: '', 21 - tabSize: 1 22 - }); 23 - rl.prompt(); 24 - output.write(prefix); 25 - 26 - const reset = () => { 27 - completion = value ? complete(value) : undefined; 28 - readline.moveCursor(output, dx, dy, () => { 29 - readline.clearScreenDown(output, () => { 30 - output.write(`${prefix}${render(value, completion)}`); 31 - if (completion) { 32 - const move = completion.slice(value.length).length * -1; 33 - output.moveCursor(move, 0); 34 - } 35 - }) 36 - }); 37 - } 38 - 39 - return new Promise((resolve) => { 40 - const keypress = (_, { name }) => { 41 - if (dirs.has(name)) return; 42 - if (name === 'return') { 43 - rl.close(); 44 - resolve(completion ?? value); 45 - input.off('keypress', keypress) 46 - } else if ((name === 'tab' || name === 'right') && completion) { 47 - value = completion; 48 - return reset(); 49 - } else { 50 - const newValue = rl.line.trim(); 51 - if (newValue != value) { 52 - value = newValue; 53 - } 54 - return reset(); 55 - } 56 - }; 57 - input.on('keypress', keypress) 58 - }) 59 - }
+19
packages/core/tsconfig.json
··· 1 + { 2 + "include": ["src"], 3 + "compilerOptions": { 4 + "declaration": true, 5 + "emitDeclarationOnly": true, 6 + "strict": true, 7 + "moduleResolution": "NodeNext", 8 + "esModuleInterop": true, 9 + "forceConsistentCasingInFileNames": true, 10 + "allowJs": true, 11 + "module": "NodeNext", 12 + "outDir": "./dist", 13 + "declarationDir": "./dist", 14 + "target": "ES2020", 15 + "jsx": "react", 16 + "jsxFactory": "h", 17 + "jsxFragmentFactory": "Fragment" 18 + } 19 + }
+3 -1
packages/core/utils.ts packages/core/src/utils.ts
··· 1 + import type { Key } from "node:readline"; 2 + 1 3 import * as readline from "node:readline"; 2 4 import { stdin, stdout } from 'node:process'; 3 5 ··· 47 49 readline.emitKeypressEvents(input, rl) 48 50 if (input.isTTY) input.setRawMode(true); 49 51 50 - const clear = (data: Buffer, { name }) => { 52 + const clear = (data: Buffer, { name }: Key) => { 51 53 const str = String(data); 52 54 if (str === '\x03') { 53 55 process.exit(0);
+241 -5
pnpm-lock.yaml
··· 14 14 15 15 packages/core: 16 16 specifiers: 17 + '@types/node': ^18.11.19 18 + esbuild: ^0.17.6 17 19 picocolors: ^1.0.0 18 20 sisteransi: ^1.0.5 19 - strip-ansi: ^7.0.1 20 - dependencies: 21 + typescript: ^4.9.5 22 + devDependencies: 23 + '@types/node': 18.11.19 24 + esbuild: 0.17.6 21 25 picocolors: 1.0.0 22 26 sisteransi: 1.0.5 23 - strip-ansi: 7.0.1 27 + typescript: 4.9.5 24 28 25 29 packages/demo: 26 30 specifiers: ··· 286 290 dev: true 287 291 optional: true 288 292 293 + /@esbuild/android-arm/0.17.6: 294 + resolution: {integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==} 295 + engines: {node: '>=12'} 296 + cpu: [arm] 297 + os: [android] 298 + requiresBuild: true 299 + dev: true 300 + optional: true 301 + 302 + /@esbuild/android-arm64/0.17.6: 303 + resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==} 304 + engines: {node: '>=12'} 305 + cpu: [arm64] 306 + os: [android] 307 + requiresBuild: true 308 + dev: true 309 + optional: true 310 + 311 + /@esbuild/android-x64/0.17.6: 312 + resolution: {integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==} 313 + engines: {node: '>=12'} 314 + cpu: [x64] 315 + os: [android] 316 + requiresBuild: true 317 + dev: true 318 + optional: true 319 + 320 + /@esbuild/darwin-arm64/0.17.6: 321 + resolution: {integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==} 322 + engines: {node: '>=12'} 323 + cpu: [arm64] 324 + os: [darwin] 325 + requiresBuild: true 326 + dev: true 327 + optional: true 328 + 329 + /@esbuild/darwin-x64/0.17.6: 330 + resolution: {integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==} 331 + engines: {node: '>=12'} 332 + cpu: [x64] 333 + os: [darwin] 334 + requiresBuild: true 335 + dev: true 336 + optional: true 337 + 338 + /@esbuild/freebsd-arm64/0.17.6: 339 + resolution: {integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==} 340 + engines: {node: '>=12'} 341 + cpu: [arm64] 342 + os: [freebsd] 343 + requiresBuild: true 344 + dev: true 345 + optional: true 346 + 347 + /@esbuild/freebsd-x64/0.17.6: 348 + resolution: {integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==} 349 + engines: {node: '>=12'} 350 + cpu: [x64] 351 + os: [freebsd] 352 + requiresBuild: true 353 + dev: true 354 + optional: true 355 + 356 + /@esbuild/linux-arm/0.17.6: 357 + resolution: {integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==} 358 + engines: {node: '>=12'} 359 + cpu: [arm] 360 + os: [linux] 361 + requiresBuild: true 362 + dev: true 363 + optional: true 364 + 365 + /@esbuild/linux-arm64/0.17.6: 366 + resolution: {integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==} 367 + engines: {node: '>=12'} 368 + cpu: [arm64] 369 + os: [linux] 370 + requiresBuild: true 371 + dev: true 372 + optional: true 373 + 374 + /@esbuild/linux-ia32/0.17.6: 375 + resolution: {integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==} 376 + engines: {node: '>=12'} 377 + cpu: [ia32] 378 + os: [linux] 379 + requiresBuild: true 380 + dev: true 381 + optional: true 382 + 289 383 /@esbuild/linux-loong64/0.15.18: 290 384 resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} 291 385 engines: {node: '>=12'} ··· 295 389 dev: true 296 390 optional: true 297 391 392 + /@esbuild/linux-loong64/0.17.6: 393 + resolution: {integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==} 394 + engines: {node: '>=12'} 395 + cpu: [loong64] 396 + os: [linux] 397 + requiresBuild: true 398 + dev: true 399 + optional: true 400 + 401 + /@esbuild/linux-mips64el/0.17.6: 402 + resolution: {integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==} 403 + engines: {node: '>=12'} 404 + cpu: [mips64el] 405 + os: [linux] 406 + requiresBuild: true 407 + dev: true 408 + optional: true 409 + 410 + /@esbuild/linux-ppc64/0.17.6: 411 + resolution: {integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==} 412 + engines: {node: '>=12'} 413 + cpu: [ppc64] 414 + os: [linux] 415 + requiresBuild: true 416 + dev: true 417 + optional: true 418 + 419 + /@esbuild/linux-riscv64/0.17.6: 420 + resolution: {integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==} 421 + engines: {node: '>=12'} 422 + cpu: [riscv64] 423 + os: [linux] 424 + requiresBuild: true 425 + dev: true 426 + optional: true 427 + 428 + /@esbuild/linux-s390x/0.17.6: 429 + resolution: {integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==} 430 + engines: {node: '>=12'} 431 + cpu: [s390x] 432 + os: [linux] 433 + requiresBuild: true 434 + dev: true 435 + optional: true 436 + 437 + /@esbuild/linux-x64/0.17.6: 438 + resolution: {integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==} 439 + engines: {node: '>=12'} 440 + cpu: [x64] 441 + os: [linux] 442 + requiresBuild: true 443 + dev: true 444 + optional: true 445 + 446 + /@esbuild/netbsd-x64/0.17.6: 447 + resolution: {integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==} 448 + engines: {node: '>=12'} 449 + cpu: [x64] 450 + os: [netbsd] 451 + requiresBuild: true 452 + dev: true 453 + optional: true 454 + 455 + /@esbuild/openbsd-x64/0.17.6: 456 + resolution: {integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==} 457 + engines: {node: '>=12'} 458 + cpu: [x64] 459 + os: [openbsd] 460 + requiresBuild: true 461 + dev: true 462 + optional: true 463 + 464 + /@esbuild/sunos-x64/0.17.6: 465 + resolution: {integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==} 466 + engines: {node: '>=12'} 467 + cpu: [x64] 468 + os: [sunos] 469 + requiresBuild: true 470 + dev: true 471 + optional: true 472 + 473 + /@esbuild/win32-arm64/0.17.6: 474 + resolution: {integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==} 475 + engines: {node: '>=12'} 476 + cpu: [arm64] 477 + os: [win32] 478 + requiresBuild: true 479 + dev: true 480 + optional: true 481 + 482 + /@esbuild/win32-ia32/0.17.6: 483 + resolution: {integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==} 484 + engines: {node: '>=12'} 485 + cpu: [ia32] 486 + os: [win32] 487 + requiresBuild: true 488 + dev: true 489 + optional: true 490 + 491 + /@esbuild/win32-x64/0.17.6: 492 + resolution: {integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==} 493 + engines: {node: '>=12'} 494 + cpu: [x64] 495 + os: [win32] 496 + requiresBuild: true 497 + dev: true 498 + optional: true 499 + 298 500 /@manypkg/find-root/1.1.0: 299 501 resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 300 502 dependencies: ··· 945 1147 esbuild-windows-arm64: 0.15.18 946 1148 dev: true 947 1149 1150 + /esbuild/0.17.6: 1151 + resolution: {integrity: sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==} 1152 + engines: {node: '>=12'} 1153 + hasBin: true 1154 + requiresBuild: true 1155 + optionalDependencies: 1156 + '@esbuild/android-arm': 0.17.6 1157 + '@esbuild/android-arm64': 0.17.6 1158 + '@esbuild/android-x64': 0.17.6 1159 + '@esbuild/darwin-arm64': 0.17.6 1160 + '@esbuild/darwin-x64': 0.17.6 1161 + '@esbuild/freebsd-arm64': 0.17.6 1162 + '@esbuild/freebsd-x64': 0.17.6 1163 + '@esbuild/linux-arm': 0.17.6 1164 + '@esbuild/linux-arm64': 0.17.6 1165 + '@esbuild/linux-ia32': 0.17.6 1166 + '@esbuild/linux-loong64': 0.17.6 1167 + '@esbuild/linux-mips64el': 0.17.6 1168 + '@esbuild/linux-ppc64': 0.17.6 1169 + '@esbuild/linux-riscv64': 0.17.6 1170 + '@esbuild/linux-s390x': 0.17.6 1171 + '@esbuild/linux-x64': 0.17.6 1172 + '@esbuild/netbsd-x64': 0.17.6 1173 + '@esbuild/openbsd-x64': 0.17.6 1174 + '@esbuild/sunos-x64': 0.17.6 1175 + '@esbuild/win32-arm64': 0.17.6 1176 + '@esbuild/win32-ia32': 0.17.6 1177 + '@esbuild/win32-x64': 0.17.6 1178 + dev: true 1179 + 948 1180 /escalade/3.1.1: 949 1181 resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 950 1182 engines: {node: '>=6'} ··· 1607 1839 1608 1840 /picocolors/1.0.0: 1609 1841 resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1610 - dev: false 1611 1842 1612 1843 /picomatch/2.3.1: 1613 1844 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} ··· 1786 2017 1787 2018 /sisteransi/1.0.5: 1788 2019 resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1789 - dev: false 1790 2020 1791 2021 /slash/3.0.0: 1792 2022 resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} ··· 2009 2239 call-bind: 1.0.2 2010 2240 for-each: 0.3.3 2011 2241 is-typed-array: 1.1.10 2242 + dev: true 2243 + 2244 + /typescript/4.9.5: 2245 + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 2246 + engines: {node: '>=4.2.0'} 2247 + hasBin: true 2012 2248 dev: true 2013 2249 2014 2250 /unbox-primitive/1.0.2: