diff --git a/packages/titan/package-lock.json b/packages/titan/package-lock.json index 33c3b72..695c590 100644 --- a/packages/titan/package-lock.json +++ b/packages/titan/package-lock.json @@ -5,57 +5,11 @@ "requires": true, "dependencies": { "@littlethings/log": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@littlethings/log/-/log-1.3.1.tgz", - "integrity": "sha512-idOgKtC+KIdgV4RxUHCY5SMu9VnIv7s03Aq9cn42Ete+sqK4bVaKRRUG+45dv44VmpDvYEtIa6mwcWCqLzSzjQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@littlethings/log/-/log-2.3.0.tgz", + "integrity": "sha512-u7Gv872PHYbaZSz0hWonW3ekKgwIPRpm064eAU7b3V8ScAWA4uqn1RrH+S3+/NYpebER7D4x4gH1wN4cnutvnw==", "requires": { - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } + "kleur": "^4.1.3" } }, "@littlethings/test": { @@ -68,6 +22,14 @@ "glob": "^7.1.6" }, "dependencies": { + "@littlethings/log": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@littlethings/log/-/log-1.4.0.tgz", + "integrity": "sha512-KuGDAaKCi18wT1PESoBMon3nJlnnVREBqLrTxdWbAKb/IXVAbGyB3Ie3Tg9e69xab43SWtn+f2XgBCsE5MbCoA==", + "requires": { + "chalk": "^4.0.0" + } + }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", @@ -114,6 +76,28 @@ } } }, + "@starters/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@starters/core/-/core-1.1.0.tgz", + "integrity": "sha512-OOyeDJlRwkKwiYogC/2qkWh58L65PLZdRj1cblSTQ32KaNqzvuQLo3rrhaskGNgajjVHQaxJR0yZomnZWMlRaA==", + "requires": { + "@littlethings/log": "^2.3.0", + "inquirer": "^7.3.3", + "is-url": "^1.2.4", + "kleur": "^4.1.3", + "npm": "^7.3.0", + "npm-which": "^3.0.1", + "render-in-place": "^1.0.2", + "rimraf": "^3.0.2" + }, + "dependencies": { + "kleur": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.3.tgz", + "integrity": "sha512-H1tr8QP2PxFTNwAFM74Mui2b6ovcY9FoxJefgrwxY+OCJcq01k5nvhf4M/KnizzrJvLRap5STUy7dgDV35iUBw==" + } + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -206,11 +190,21 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -401,6 +395,21 @@ } } }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "kleur": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.3.tgz", + "integrity": "sha512-H1tr8QP2PxFTNwAFM74Mui2b6ovcY9FoxJefgrwxY+OCJcq01k5nvhf4M/KnizzrJvLRap5STUy7dgDV35iUBw==" + }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", @@ -429,131 +438,1918 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, - "npm-package-arg": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", - "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "npm": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-7.3.0.tgz", + "integrity": "sha512-VfWmOWtU5+CFVRW6ougMZNe3SAPI24aNH21RpBPCW1sA2Ec0IeZAqeDCeMlP9STmxZUxfvljXRTWye5hfUHLFA==", "requires": { - "hosted-git-info": "^3.0.2", - "semver": "^7.0.0", - "validate-npm-package-name": "^3.0.0" + "@npmcli/arborist": "^2.0.2", + "@npmcli/ci-detect": "^1.2.0", + "@npmcli/config": "^1.2.8", + "@npmcli/run-script": "^1.8.1", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "^2.0.0", + "archy": "~1.0.0", + "byte-size": "^7.0.0", + "cacache": "^15.0.5", + "chalk": "^4.1.0", + "chownr": "^2.0.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.6.0", + "columnify": "~1.5.4", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "hosted-git-info": "^3.0.6", + "ini": "^2.0.0", + "init-package-json": "^2.0.1", + "is-cidr": "^4.0.2", + "json-parse-even-better-errors": "*", + "leven": "^3.1.0", + "libnpmaccess": "^4.0.1", + "libnpmfund": "^1.0.2", + "libnpmhook": "^6.0.1", + "libnpmorg": "^2.0.1", + "libnpmpack": "^2.0.0", + "libnpmpublish": "^4.0.0", + "libnpmsearch": "^3.1.0", + "libnpmteam": "^2.0.2", + "libnpmversion": "^1.0.7", + "make-fetch-happen": "^8.0.12", + "minipass": "^3.1.3", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "mkdirp-infer-owner": "^2.0.0", + "ms": "^2.1.2", + "node-gyp": "^7.1.2", + "nopt": "^5.0.0", + "npm-audit-report": "^2.1.4", + "npm-package-arg": "^8.1.0", + "npm-pick-manifest": "^6.1.0", + "npm-profile": "^5.0.2", + "npm-registry-fetch": "^9.0.0", + "npm-user-validate": "^1.0.1", + "npmlog": "~4.1.2", + "opener": "^1.5.2", + "pacote": "^11.1.13", + "parse-conflict-json": "^1.1.1", + "qrcode-terminal": "^0.12.0", + "read": "~1.0.7", + "read-package-json": "^3.0.0", + "read-package-json-fast": "^1.2.1", + "readdir-scoped-modules": "^1.1.0", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "ssri": "^8.0.0", + "tar": "^6.0.5", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^1.0.4", + "uuid": "^8.3.1", + "validate-npm-package-name": "~3.0.0", + "which": "^2.0.2", + "write-file-atomic": "^3.0.3" }, "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" - }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "requires": { - "builtins": "^1.0.3" + "@npmcli/arborist": { + "version": "2.0.2", + "bundled": true, + "requires": { + "@npmcli/installed-package-contents": "^1.0.5", + "@npmcli/map-workspaces": "^1.0.1", + "@npmcli/metavuln-calculator": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "@npmcli/name-from-folder": "^1.0.1", + "@npmcli/node-gyp": "^1.0.1", + "@npmcli/run-script": "^1.8.1", + "bin-links": "^2.2.1", + "cacache": "^15.0.3", + "common-ancestor-path": "^1.0.1", + "json-parse-even-better-errors": "^2.3.1", + "json-stringify-nice": "^1.1.1", + "mkdirp-infer-owner": "^2.0.0", + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.1.0", + "npm-pick-manifest": "^6.1.0", + "pacote": "^11.1.13", + "parse-conflict-json": "^1.1.1", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^1.0.1", + "read-package-json-fast": "^1.2.1", + "readdir-scoped-modules": "^1.1.0", + "semver": "^7.3.4", + "treeverse": "^1.0.4", + "walk-up-path": "^1.0.0" + } + }, + "@npmcli/ci-detect": { + "version": "1.3.0", + "bundled": true + }, + "@npmcli/config": { + "version": "1.2.8", + "bundled": true, + "requires": { + "ini": "^2.0.0", + "mkdirp-infer-owner": "^2.0.0", + "nopt": "^5.0.0", + "semver": "^7.3.4", + "walk-up-path": "^1.0.0" + } + }, + "@npmcli/git": { + "version": "2.0.4", + "bundled": true, + "requires": { + "@npmcli/promise-spawn": "^1.1.0", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.3", + "npm-pick-manifest": "^6.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "semver": "^7.3.2", + "unique-filename": "^1.1.1", + "which": "^2.0.2" + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.5", + "bundled": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1", + "read-package-json-fast": "^1.1.1", + "readdir-scoped-modules": "^1.1.0" + } + }, + "@npmcli/map-workspaces": { + "version": "1.0.1", + "bundled": true, + "requires": { + "@npmcli/name-from-folder": "^1.0.1", + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "read-package-json-fast": "^1.2.1" + } + }, + "@npmcli/metavuln-calculator": { + "version": "1.0.0", + "bundled": true, + "requires": { + "cacache": "^15.0.5", + "pacote": "^11.1.11", + "semver": "^7.3.2" + } + }, + "@npmcli/move-file": { + "version": "1.0.1", + "bundled": true, + "requires": { + "mkdirp": "^1.0.4" + } + }, + "@npmcli/name-from-folder": { + "version": "1.0.1", + "bundled": true + }, + "@npmcli/node-gyp": { + "version": "1.0.1", + "bundled": true + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "bundled": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "1.8.1", + "bundled": true, + "requires": { + "@npmcli/node-gyp": "^1.0.0", + "@npmcli/promise-spawn": "^1.3.0", + "infer-owner": "^1.0.4", + "node-gyp": "^7.1.0", + "puka": "^1.0.1", + "read-package-json-fast": "^1.1.3" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "bundled": true + }, + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "agent-base": { + "version": "6.0.2", + "bundled": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.1.3", + "bundled": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "bundled": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "bundled": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "ansi-styles": { + "version": "4.3.0", + "bundled": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true + }, + "aproba": { + "version": "2.0.0", + "bundled": true + }, + "archy": { + "version": "1.0.0", + "bundled": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asap": { + "version": "2.0.6", + "bundled": true + }, + "asn1": { + "version": "0.2.4", + "bundled": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true + }, + "aws-sign2": { + "version": "0.7.0", + "bundled": true + }, + "aws4": { + "version": "1.11.0", + "bundled": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "bundled": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bin-links": { + "version": "2.2.1", + "bundled": true, + "requires": { + "cmd-shim": "^4.0.1", + "mkdirp": "^1.0.3", + "npm-normalize-package-bin": "^1.0.0", + "read-cmd-shim": "^2.0.0", + "rimraf": "^3.0.0", + "write-file-atomic": "^3.0.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "builtins": { + "version": "1.0.3", + "bundled": true + }, + "byte-size": { + "version": "7.0.0", + "bundled": true + }, + "cacache": { + "version": "15.0.5", + "bundled": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "caseless": { + "version": "0.12.0", + "bundled": true + }, + "chalk": { + "version": "4.1.0", + "bundled": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "2.0.0", + "bundled": true + }, + "cidr-regex": { + "version": "3.1.1", + "bundled": true, + "requires": { + "ip-regex": "^4.1.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "bundled": true + }, + "cli-columns": { + "version": "3.1.2", + "bundled": true, + "requires": { + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "cli-table3": { + "version": "0.6.0", + "bundled": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "bundled": true + }, + "string-width": { + "version": "4.2.0", + "bundled": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "bundled": true + }, + "cmd-shim": { + "version": "4.0.2", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp-infer-owner": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "color-convert": { + "version": "2.0.1", + "bundled": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "bundled": true + }, + "colors": { + "version": "1.4.0", + "bundled": true, + "optional": true + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.8", + "bundled": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "common-ancestor-path": { + "version": "1.0.1", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.3.1", + "bundled": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "bundled": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "requires": { + "clone": "^1.0.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "depd": { + "version": "1.1.2", + "bundled": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "bundled": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "bundled": true + }, + "encoding": { + "version": "0.1.13", + "bundled": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "env-paths": { + "version": "2.2.0", + "bundled": true + }, + "err-code": { + "version": "1.1.2", + "bundled": true + }, + "extend": { + "version": "3.0.2", + "bundled": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "bundled": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true + }, + "form-data": { + "version": "2.3.3", + "bundled": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-minipass": { + "version": "2.1.0", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "function-bind": { + "version": "1.1.1", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "bundled": true + }, + "har-schema": { + "version": "2.0.0", + "bundled": true + }, + "har-validator": { + "version": "5.1.5", + "bundled": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "bundled": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "bundled": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "hosted-git-info": { + "version": "3.0.7", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "bundled": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "bundled": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "bundled": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.6.2", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "indent-string": { + "version": "4.0.0", + "bundled": true + }, + "infer-owner": { + "version": "1.0.4", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true + }, + "ini": { + "version": "2.0.0", + "bundled": true + }, + "init-package-json": { + "version": "2.0.1", + "bundled": true, + "requires": { + "glob": "^7.1.1", + "npm-package-arg": "^8.1.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "^3.0.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "ip": { + "version": "1.1.5", + "bundled": true + }, + "ip-regex": { + "version": "4.2.0", + "bundled": true + }, + "is-cidr": { + "version": "4.0.2", + "bundled": true, + "requires": { + "cidr-regex": "^3.1.1" + } + }, + "is-core-module": { + "version": "2.2.0", + "bundled": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, + "is-lambda": { + "version": "1.0.1", + "bundled": true + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "bundled": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "bundled": true + }, + "json-stringify-nice": { + "version": "1.1.1", + "bundled": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "just-diff": { + "version": "3.0.2", + "bundled": true + }, + "just-diff-apply": { + "version": "3.0.0", + "bundled": true + }, + "leven": { + "version": "3.1.0", + "bundled": true + }, + "libnpmaccess": { + "version": "4.0.1", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "minipass": "^3.1.1", + "npm-package-arg": "^8.0.0", + "npm-registry-fetch": "^9.0.0" + } + }, + "libnpmfund": { + "version": "1.0.2", + "bundled": true, + "requires": { + "@npmcli/arborist": "^2.0.0" + } + }, + "libnpmhook": { + "version": "6.0.1", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^9.0.0" + } + }, + "libnpmorg": { + "version": "2.0.1", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^9.0.0" + } + }, + "libnpmpack": { + "version": "2.0.0", + "bundled": true, + "requires": { + "@npmcli/run-script": "^1.3.0", + "npm-package-arg": "^8.0.0", + "pacote": "^11.1.4" + } + }, + "libnpmpublish": { + "version": "4.0.0", + "bundled": true, + "requires": { + "normalize-package-data": "^3.0.0", + "npm-package-arg": "^8.1.0", + "npm-registry-fetch": "^9.0.0", + "semver": "^7.1.3", + "ssri": "^8.0.0" + } + }, + "libnpmsearch": { + "version": "3.1.0", + "bundled": true, + "requires": { + "npm-registry-fetch": "^9.0.0" + } + }, + "libnpmteam": { + "version": "2.0.2", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^9.0.0" + } + }, + "libnpmversion": { + "version": "1.0.7", + "bundled": true, + "requires": { + "@npmcli/git": "^2.0.1", + "@npmcli/run-script": "^1.2.1", + "read-package-json-fast": "^1.2.1", + "semver": "^7.1.3", + "stringify-package": "^1.0.1" + } + }, + "lru-cache": { + "version": "6.0.0", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-fetch-happen": { + "version": "8.0.12", + "bundled": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + } + }, + "mime-db": { + "version": "1.44.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.27", + "bundled": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "3.1.3", + "bundled": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.3.2", + "bundled": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "bundled": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "bundled": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "bundled": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "bundled": true + }, + "mkdirp-infer-owner": { + "version": "2.0.0", + "bundled": true, + "requires": { + "chownr": "^2.0.0", + "infer-owner": "^1.0.4", + "mkdirp": "^1.0.3" + } + }, + "ms": { + "version": "2.1.3", + "bundled": true + }, + "mute-stream": { + "version": "0.0.8", + "bundled": true + }, + "node-gyp": { + "version": "7.1.2", + "bundled": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + } + }, + "nopt": { + "version": "5.0.0", + "bundled": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "3.0.0", + "bundled": true, + "requires": { + "hosted-git-info": "^3.0.6", + "resolve": "^1.17.0", + "semver": "^7.3.2", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-audit-report": { + "version": "2.1.4", + "bundled": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "bundled": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true + }, + "npm-package-arg": { + "version": "8.1.0", + "bundled": true, + "requires": { + "hosted-git-info": "^3.0.6", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "2.1.4", + "bundled": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.0", + "bundled": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + } + }, + "npm-profile": { + "version": "5.0.2", + "bundled": true, + "requires": { + "npm-registry-fetch": "^9.0.0" + } + }, + "npm-registry-fetch": { + "version": "9.0.0", + "bundled": true, + "requires": { + "@npmcli/ci-detect": "^1.0.0", + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.1", + "bundled": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.9.0", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.2", + "bundled": true + }, + "p-map": { + "version": "4.0.0", + "bundled": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "pacote": { + "version": "11.1.13", + "bundled": true, + "requires": { + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.5", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.3.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^9.0.0", + "promise-retry": "^1.1.1", + "read-package-json-fast": "^1.1.3", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.1" + } + }, + "parse-conflict-json": { + "version": "1.1.1", + "bundled": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "just-diff": "^3.0.1", + "just-diff-apply": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "path-parse": { + "version": "1.0.6", + "bundled": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true + }, + "promise-all-reject-late": { + "version": "1.0.1", + "bundled": true + }, + "promise-call-limit": { + "version": "1.0.1", + "bundled": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "requires": { + "read": "1" + } + }, + "psl": { + "version": "1.8.0", + "bundled": true + }, + "puka": { + "version": "1.0.1", + "bundled": true + }, + "punycode": { + "version": "2.1.1", + "bundled": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true + }, + "qs": { + "version": "6.5.2", + "bundled": true + }, + "read": { + "version": "1.0.7", + "bundled": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "2.0.0", + "bundled": true + }, + "read-package-json": { + "version": "3.0.0", + "bundled": true, + "requires": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^3.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-json-fast": { + "version": "1.2.1", + "bundled": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "bundled": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "request": { + "version": "2.88.2", + "bundled": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "bundled": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "bundled": true + } + } + }, + "resolve": { + "version": "1.19.0", + "bundled": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "retry": { + "version": "0.10.1", + "bundled": true + }, + "rimraf": { + "version": "3.0.2", + "bundled": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, + "semver": { + "version": "7.3.4", + "bundled": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.3", + "bundled": true + }, + "smart-buffer": { + "version": "4.1.0", + "bundled": true + }, + "socks": { + "version": "2.5.1", + "bundled": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "5.0.0", + "bundled": true, + "requires": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + } + }, + "spdx-correct": { + "version": "3.1.1", + "bundled": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "bundled": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "bundled": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "bundled": true + }, + "sshpk": { + "version": "1.16.1", + "bundled": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "8.0.0", + "bundled": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-package": { + "version": "1.0.1", + "bundled": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "bundled": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "6.0.5", + "bundled": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true + }, + "treeverse": { + "version": "1.0.4", + "bundled": true + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "bundled": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "bundled": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "uri-js": { + "version": "4.4.0", + "bundled": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "uuid": { + "version": "8.3.2", + "bundled": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "walk-up-path": { + "version": "1.0.0", + "bundled": true + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "2.0.2", + "bundled": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write-file-atomic": { + "version": "3.0.3", + "bundled": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "yallist": { + "version": "4.0.0", + "bundled": true + } + } + }, + "npm-package-arg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "requires": { + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + } + } + }, + "npm-path": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", + "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", + "requires": { + "which": "^1.2.10" + } + }, + "npm-which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", + "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", + "requires": { + "commander": "^2.9.0", + "npm-path": "^2.0.2", + "which": "^1.2.10" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "render-in-place": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/render-in-place/-/render-in-place-1.0.2.tgz", + "integrity": "sha512-TS8Cfud/L1Td2ksEgQAIcRXgzyCb7cD4U1cb1kPQDelECPGrfjqp5IaN/R+WdCVJ9XxKEv95PWW6r9Uak+iR9g==", + "requires": { + "@types/node": "^10.3.3", + "ejs": "^2.6.1" + }, + "dependencies": { + "@types/node": { + "version": "10.17.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.50.tgz", + "integrity": "sha512-vwX+/ija9xKc/z9VqMCdbf4WYcMTGsI0I/L/6shIF3qXURxZOhPQlPRHtjTpiNhAwn0paMJzlOQqw6mAGEQnTA==" + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "requires": { + "builtins": "^1.0.3" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" } }, "wrappy": { diff --git a/packages/titan/package.json b/packages/titan/package.json index adcfe15..ffe2843 100644 --- a/packages/titan/package.json +++ b/packages/titan/package.json @@ -36,8 +36,9 @@ "@types/node": "^14.11.1" }, "dependencies": { - "@littlethings/log": "^1.3.1", + "@littlethings/log": "^2.3.0", "@littlethings/test": "^1.2.1", + "@starters/core": "^1.1.0", "arg": "^4.1.3", "chalk": "^4.1.0", "inquirer": "^7.3.3", diff --git a/packages/titan/src/commands/add/index.js b/packages/titan/src/commands/add/index.js index 69cde64..6510330 100644 --- a/packages/titan/src/commands/add/index.js +++ b/packages/titan/src/commands/add/index.js @@ -2,6 +2,7 @@ const semver = require("semver"); const log = require("../../util/log"); const npm = require("../../util/npm"); const git = require("../../util/git"); +const cmd = require("../../util/cmd"); const help = require("./help"); const getArgs = require("./args"); @@ -165,12 +166,38 @@ const command = () => { } } } else { + let resolvedVersion = version; + + if (version === "latest") { + try { + const versions = JSON.parse( + cmd.exec(`npm view ${name} versions --json`, { + encoding: "utf8", + }) + ); + + if (versions.length === 0) { + log.error( + `No versions found for package "${name}". Defaulting to "latest".` + ); + } else { + resolvedVersion = `^${ + versions[versions.length - 1] + }`; + } + } catch (error) { + log.error( + `Could not fetch versions from npm for package "${name}". Defaulting to "latest".` + ); + } + } + if (!args["--dev"] && !args["--peer"] && !args["--optional"]) { if (!pkg.config.hasOwnProperty("dependencies")) { pkg.config.dependencies = {}; } - pkg.config.dependencies[name] = version; + pkg.config.dependencies[name] = resolvedVersion; } if (args["--dev"]) { @@ -178,7 +205,7 @@ const command = () => { pkg.config.devDependencies = {}; } - pkg.config.devDependencies[name] = version; + pkg.config.devDependencies[name] = resolvedVersion; } if (args["--peer"]) { @@ -186,7 +213,7 @@ const command = () => { pkg.config.peerDependencies = {}; } - pkg.config.peerDependencies[name] = version; + pkg.config.peerDependencies[name] = resolvedVersion; } if (args["--optional"]) { @@ -194,7 +221,7 @@ const command = () => { pkg.config.optionalDependencies = {}; } - pkg.config.optionalDependencies[name] = version; + pkg.config.optionalDependencies[name] = resolvedVersion; } } } diff --git a/packages/titan/src/commands/create/args.js b/packages/titan/src/commands/create/args.js index 580091e..462f389 100644 --- a/packages/titan/src/commands/create/args.js +++ b/packages/titan/src/commands/create/args.js @@ -8,11 +8,8 @@ const getArgs = () => ({ "--force": Boolean, "-f": "--force", - "--private": Boolean, - "-p": "--private", - - "--name": String, - "-n": "--name", + "--template": String, + "-t": "--template", }, { permissive: false, diff --git a/packages/titan/src/commands/create/help.js b/packages/titan/src/commands/create/help.js index 1d0b7e1..3a0305c 100644 --- a/packages/titan/src/commands/create/help.js +++ b/packages/titan/src/commands/create/help.js @@ -8,7 +8,7 @@ const help = () => { {bold USAGE} - {dim $} {bold titan create} [root] + {dim $} {bold titan create} [root] [options] {bold OPTIONS} @@ -16,6 +16,7 @@ const help = () => { --force, -f Overwrite existing directory if it exists --private, -p Set the package to private --name, -n Set the name used in package.json + --template, -t The {white.bold starters} template to use {bold EXAMPLE} @@ -30,6 +31,9 @@ const help = () => { {dim $ # Create a private package.} {dim $} {bold titan create} --private my-private-library + + {dim $ # Create a JavaScript library from a template.} + {dim $} {bold titan create} my-library --template @starters/library `; console.log(message); diff --git a/packages/titan/src/commands/create/index.js b/packages/titan/src/commands/create/index.js index d12a4f9..9d9b9f6 100644 --- a/packages/titan/src/commands/create/index.js +++ b/packages/titan/src/commands/create/index.js @@ -1,6 +1,9 @@ +const chalk = require("chalk"); +const starters = require("@starters/core"); const fs = require("../../util/fs"); const log = require("../../util/log"); const path = require("../../util/path"); +const npm = require("../../util/npm"); const help = require("./help"); const getArgs = require("./args"); @@ -14,7 +17,7 @@ const command = () => { } if (args._.length === 1) { - log.error("Missing position arguments"); + log.error("No name specified."); help(); process.exit(1); } @@ -26,50 +29,56 @@ const command = () => { process.exit(1); } - const pkgName = args["--name"] || name; + const rootPkgPath = npm.getProjectRoot(); + const pkg = npm.getProjectRootConfig(); - const pkgPath = path.resolve(process.cwd(), "package.json"); - - if (!fs.exists(pkgPath)) { - log.error(`Unable to load package configuration at "${pkgPath}".`); + if (!pkg.titan.packages) { + log.error( + chalk`Root configuration has no {white titan.packages} property.` + ); process.exit(1); } - const pkg = JSON.parse( - fs.read(pkgPath, { - encoding: "utf8", - }) - ); + const root = path.resolveRelative(args._[2] || pkg.titan.packages[0]); - if (!pkg.titan) { - log.error("Package has no titan config."); - process.exit(1); - } + let isPkgMapped = false; + for (const pkgPath of pkg.titan.packages) { + const resolvedPkgPath = path.resolveRelative(pkgPath, rootPkgPath); - if (!pkg.titan.packages) { - log.error("Package has no `titan.packages` property."); - process.exit(1); + if (root === resolvedPkgPath) { + isPkgMapped = true; + } } - const where = path.resolveRelative(args._[2] || pkg.titan.packages[0]); + if (!isPkgMapped) { + log.warn( + chalk`Root configuration's {white.bold titan.packages} property does not include {white.bold ${path.relative( + rootPkgPath, + root + )}}.` + ); + } - if (!where) { + if (!root) { log.error("No destination available."); process.exit(1); } - if (!fs.exists(where)) { + if (!fs.exists(root)) { log.info("Creating destination directory."); - fs.mkdir(where); - } else if (!fs.isDir(where)) { + fs.mkdir(root); + } else if (!fs.isDir(root)) { log.info("Creating destination directory."); - fs.mkdir(where); + fs.mkdir(root); } - const target = path.resolve(where, name); + const target = path.resolve(root, name); if (fs.exists(target)) { if (args["--force"] && fs.isDir(target)) { + log.debug( + chalk`Removing existing directory {white.bold ${target}}.` + ); fs.rm(target); } else { log.error( @@ -82,31 +91,14 @@ const command = () => { log.info("Creating package directory."); fs.mkdir(target); - const src = path.resolve(target, "src"); - - fs.mkdir(src); - - const pkgTemplate = JSON.parse( - fs.read(path.resolve(__dirname, "package.template.json"), { - encoding: "utf8", - }) - ); - - pkgTemplate.name = pkgName; + const template = args["--template"] || "@starters/library"; - if (args["--private"]) { - pkgTemplate.private = true; + try { + starters.create(target, template, name); + } catch (error) { + log.error("Could not create package."); + process.exit(1); } - - fs.write( - path.resolve(target, "package.json"), - JSON.stringify(pkgTemplate, null, 4) + "\n" - ); - - fs.write( - path.resolve(src, "index.js"), - fs.read(path.resolve(__dirname, "index.template.js")) - ); }; module.exports = command; diff --git a/packages/titan/src/commands/index.js b/packages/titan/src/commands/index.js index 79edeec..d276ab8 100644 --- a/packages/titan/src/commands/index.js +++ b/packages/titan/src/commands/index.js @@ -2,10 +2,11 @@ module.exports = { init: require("./init"), create: require("./create"), version: require("./version"), - bootstrap: require("./bootstrap"), + install: require("./install"), exec: require("./exec"), publish: require("./publish"), add: require("./add"), changed: require("./changed"), run: require("./run"), + rm: require("./rm"), }; diff --git a/packages/titan/src/commands/init/args.js b/packages/titan/src/commands/init/args.js index d7297f5..a0e136b 100644 --- a/packages/titan/src/commands/init/args.js +++ b/packages/titan/src/commands/init/args.js @@ -16,6 +16,9 @@ const getArgs = () => ({ "--skip-git": Boolean, "-X": "--skip-git", + + "--template": String, + "-t": "--template", }, { permissive: false, diff --git a/packages/titan/src/commands/init/gitignore.template b/packages/titan/src/commands/init/gitignore.template index a0a76cd..6872ba6 100644 --- a/packages/titan/src/commands/init/gitignore.template +++ b/packages/titan/src/commands/init/gitignore.template @@ -116,3 +116,4 @@ dist .pnp.* tmp +.DS_Store \ No newline at end of file diff --git a/packages/titan/src/commands/init/help.js b/packages/titan/src/commands/init/help.js index c3fdcd1..8234976 100644 --- a/packages/titan/src/commands/init/help.js +++ b/packages/titan/src/commands/init/help.js @@ -17,6 +17,7 @@ const help = () => { --force, -f Overwrite existing directory --skip-install, -x Skip installing dependencies --skip-git, -X Skip running git commands + --template, -t The {white.bold starters} template to use {bold EXAMPLE} @@ -31,6 +32,9 @@ const help = () => { {dim $ # Create a new project but don't run git commands.} {dim $} {bold titan init} --skip-git my-project + + {dim $ # Create a new project using a template.} + {dim $} {bold titan init} my-project --template my-starters-template `; console.log(message); diff --git a/packages/titan/src/commands/init/index.js b/packages/titan/src/commands/init/index.js index 05e86c5..4167dfa 100644 --- a/packages/titan/src/commands/init/index.js +++ b/packages/titan/src/commands/init/index.js @@ -1,3 +1,4 @@ +const starters = require("@starters/core"); const fs = require("../../util/fs"); const log = require("../../util/log"); const git = require("../../util/git"); @@ -50,59 +51,68 @@ const command = () => { } } - log.info("Creating directory."); - fs.mkdir(root); + if (args["--template"]) { + try { + starters.create(root, args["--template"], name); + } catch (error) { + log.error("Could not create project."); + process.exit(1); + } + } else { + log.info("Creating directory."); + fs.mkdir(root); - log.info("Scaffolding project."); + log.info("Scaffolding project."); - const packages = path.resolve(root, "packages"); + const packages = path.resolve(root, "packages"); - fs.mkdir(packages); - fs.touch(path.resolve(packages, ".gitkeep")); + fs.mkdir(packages); + fs.touch(path.resolve(packages, ".gitkeep")); - const pkg = require("./package.template.json"); + const pkg = require("./package.template.json"); - const user = { - name: git.config.get("user.name"), - email: git.config.get("user.email"), - }; + const user = { + name: git.config.get("user.name"), + email: git.config.get("user.email"), + }; - pkg.name = name; - pkg.author = `${user.name} <${user.email}>`; + pkg.name = name; + pkg.author = `${user.name} <${user.email}>`; - fs.write( - path.resolve(root, "package.json"), - JSON.stringify(pkg, null, 4) + "\n" - ); + fs.write( + path.resolve(root, "package.json"), + JSON.stringify(pkg, null, 4) + "\n" + ); - fs.write( - path.resolve(root, ".prettierignore"), - fs.read(path.resolve(__dirname, "prettierignore.template")) - ); + fs.write( + path.resolve(root, ".prettierignore"), + fs.read(path.resolve(__dirname, "prettierignore.template")) + ); - fs.write( - path.resolve(root, ".gitignore"), - fs.read(path.resolve(__dirname, "gitignore.template")) - ); + fs.write( + path.resolve(root, ".gitignore"), + fs.read(path.resolve(__dirname, "gitignore.template")) + ); - if (args["--skip-git"]) { - log.info("Skipping git initialization."); - } else { - log.info("Initializing git repository."); - git.init(root); - } + if (args["--skip-git"]) { + log.info("Skipping git initialization."); + } else { + log.info("Initializing git repository."); + git.init(root); + } - if (args["--skip-install"]) { - log.info("Skipping installing dependencies."); - } else { - log.info("Installing dependencies."); - npm.install(root); - } + if (args["--skip-install"]) { + log.info("Skipping installing dependencies."); + } else { + log.info("Installing dependencies."); + npm.install(root); + } - if (!args["--skip-git"]) { - log.info("Committing changes."); - git.add([], ["-A"], root); - git.commit("chore: initial commit", [], root); + if (!args["--skip-git"]) { + log.info("Committing changes."); + git.add([], ["-A"], root); + git.commit("chore: initial commit", [], root); + } } }; diff --git a/packages/titan/src/commands/bootstrap/args.js b/packages/titan/src/commands/install/args.js similarity index 100% rename from packages/titan/src/commands/bootstrap/args.js rename to packages/titan/src/commands/install/args.js diff --git a/packages/titan/src/commands/bootstrap/help.js b/packages/titan/src/commands/install/help.js similarity index 76% rename from packages/titan/src/commands/bootstrap/help.js rename to packages/titan/src/commands/install/help.js index a99c7a2..234870d 100644 --- a/packages/titan/src/commands/bootstrap/help.js +++ b/packages/titan/src/commands/install/help.js @@ -8,7 +8,7 @@ const help = () => { {bold USAGE} - {dim $} {bold titan bootstrap} [options] + {dim $} {bold titan install} [options] {bold OPTIONS} @@ -21,19 +21,19 @@ const help = () => { {bold EXAMPLE} {dim $ # Install and link all dependencies} - {dim $} {bold titan bootstrap} + {dim $} {bold titan install} {dim $ # Install dependencies for all packages in the "@jakehamilton" namespace.} - {dim $} {bold titan bootstrap} --scope="^@jakeahmilton" + {dim $} {bold titan install} --scope="^@jakeahmilton" {dim $ # Install dependencies for all changed packages.} - {dim $} {bold titan bootstrap} --changed + {dim $} {bold titan install} --changed {dim $ # Install dependencies for packages with releases.} - {dim $} {bold titan bootstrap} --tagged + {dim $} {bold titan install} --tagged {dim $ # Install dependencies but don't modify "package-lock.json" files.} - {dim $} {bold titan bootstrap} --no-save + {dim $} {bold titan install} --no-save `; console.log(message); diff --git a/packages/titan/src/commands/bootstrap/index.js b/packages/titan/src/commands/install/index.js similarity index 98% rename from packages/titan/src/commands/bootstrap/index.js rename to packages/titan/src/commands/install/index.js index a6061d3..425329c 100644 --- a/packages/titan/src/commands/bootstrap/index.js +++ b/packages/titan/src/commands/install/index.js @@ -97,7 +97,7 @@ const command = () => { return locals; }, new Map()); - log.info("Bootstrapping packages."); + log.info("Installing packages."); npm.withLinkedLocals(pkgs, () => { for (const { pkg, transitive } of locals.values()) { if (transitive) { diff --git a/packages/titan/src/commands/rm/args.js b/packages/titan/src/commands/rm/args.js new file mode 100644 index 0000000..3697ee8 --- /dev/null +++ b/packages/titan/src/commands/rm/args.js @@ -0,0 +1,23 @@ +const arg = require("arg"); +const rootArgs = require("../../util/args"); + +const getArgs = () => ({ + ...arg( + { + ...rootArgs, + "--scope": String, + "-s": "--scope", + + "--changed": Boolean, + "-c": "--changed", + + "--tagged": Boolean, + "-t": "--tagged", + }, + { + permissive: false, + } + ), +}); + +module.exports = getArgs; diff --git a/packages/titan/src/commands/rm/help.js b/packages/titan/src/commands/rm/help.js new file mode 100644 index 0000000..d21bcdb --- /dev/null +++ b/packages/titan/src/commands/rm/help.js @@ -0,0 +1,38 @@ +const chalk = require("chalk"); + +const help = () => { + const message = chalk` +{bold DESCRIPTION} + + Remove dependencies to packages. + +{bold USAGE} + + {dim $} {bold titan rm} [options] deps + +{bold OPTIONS} + + --help, -h Show this help message + --scope, -s Set the scope regex to match against + --changed, -c Only run for packages that have changed + --tagged, -t Only run for packages that are tagged on HEAD + +{bold EXAMPLE} + + {dim $ # Remove "react" and "redux" from all packages.} + {dim $} {bold titan rm} react redux + + {dim $ # Remove "react" from all packages in the "@jakehamilton" namespace.} + {dim $} {bold titan rm} --scope="^@jakehamilton" react + + {dim $ # Remove "react" from all changed packages.} + {dim $} {bold titan rm} --changed react + + {dim $ # Remove "react" from packages with releases.} + {dim $} {bold titan rm} --tagged react +`; + + console.log(message); +}; + +module.exports = help; diff --git a/packages/titan/src/commands/rm/index.js b/packages/titan/src/commands/rm/index.js new file mode 100644 index 0000000..bc6a869 --- /dev/null +++ b/packages/titan/src/commands/rm/index.js @@ -0,0 +1,140 @@ +const chalk = require("chalk"); +const semver = require("semver"); +const log = require("../../util/log"); +const npm = require("../../util/npm"); +const git = require("../../util/git"); +const help = require("./help"); +const getArgs = require("./args"); + +const command = () => { + const args = getArgs(); + + if (args["--help"]) { + help(); + process.exit(0); + } + + const deps = args._.slice(1); + + if (deps.length === 0) { + log.error("You must specify a package to remove."); + help(); + process.exit(1); + } + + const changed = []; + + if (args["--changed"]) { + const releases = git.tag.latestReleases(); + + for (const release of releases.values()) { + if (git.changedSince(release)) { + changed.push(release.name); + } + } + } + + const tagged = []; + + if (args["--tagged"]) { + const tags = git.tag.at(); + + for (const tag of tags) { + const { name } = npm.parseNameWithVersion(tag); + + tagged.push(name); + } + } + + const pkgs = npm.getAllPackages(); + + const scope = args["--scope"] || ".+"; + + log.debug(`Creating matcher for scope "${scope}".`); + const scopeRegex = new RegExp(scope); + + const matchingPkgs = [...pkgs.values()].filter((pkg) => { + if (args["--changed"] && !changed.includes(pkg.config.name)) { + return false; + } + + if (args["--tagged"] && !tagged.includes(pkg.config.name)) { + return false; + } + + return pkg.config.name.match(scopeRegex); + }); + + if (matchingPkgs.length === 0) { + log.info("No matching packages."); + process.exit(0); + } + + log.info("Updating package configuration."); + for (const pkg of matchingPkgs) { + for (const dep of deps) { + const { name, version } = npm.parseNameWithVersion(dep); + + if ( + pkg.config.dependencies && + pkg.config.dependencies.hasOwnProperty(name) && + (version === "latest" || + pkg.config.dependencies[name] === version || + semver.satisfies(pkg.config.dependencies[name], version)) + ) { + log.debug( + chalk`Removing {white "${name}@${pkg.config.dependencies[name]}"} from package "${pkg.config.name}" in dependencies.` + ); + delete pkg.config.dependencies[name]; + } else if ( + pkg.config.devDependencies && + pkg.config.devDependencies.hasOwnProperty(name) && + (version === "latest" || + pkg.config.devDependencies[name] === version || + semver.satisfies(pkg.config.devDependencies[name], version)) + ) { + log.debug( + `Removing "${name}@${pkg.config.dependencies[name]}" from package "${pkg.config.name}" in devDependencies.` + ); + delete pkg.config.devDependencies[name]; + } else if ( + pkg.config.peerDependencies && + pkg.config.peerDependencies.hasOwnProperty(name) && + (version === "latest" || + pkg.config.peerDependencies[name] === version || + semver.satisfies( + pkg.config.peerDependencies[name], + version + )) + ) { + log.debug( + `Removing "${name}@${pkg.config.dependencies[name]}" from package "${pkg.config.name}" in peerDependencies.` + ); + delete pkg.config.peerDependencies[name]; + } else if ( + pkg.config.optionalDependencies && + pkg.config.optionalDependencies.hasOwnProperty(name) && + (version === "latest" || + pkg.config.optionalDependencies[name] === version || + semver.satisfies( + pkg.config.optionalDependencies[name], + version + )) + ) { + log.debug( + `Removing "${name}@${pkg.config.dependencies[name]}" from package "${pkg.config.name}" in optionalDependencies.` + ); + delete pkg.config.optionalDependencies[name]; + } + } + } + + npm.withLinkedLocals(pkgs, () => { + log.info("Installing dependencies."); + for (const pkg of matchingPkgs) { + npm.install(pkg.path); + } + }); +}; + +module.exports = command; diff --git a/packages/titan/src/util/help.js b/packages/titan/src/util/help.js index 14b6977..4967848 100644 --- a/packages/titan/src/util/help.js +++ b/packages/titan/src/util/help.js @@ -31,6 +31,7 @@ const help = () => { {dim $} {bold titan create} --help {dim $} {bold titan bootstrap} --help {dim $} {bold titan add} --help + {dim $} {bold titan rm} --help {dim $} {bold titan version} --help {dim $} {bold titan publish} --help {dim $} {bold titan exec} --help diff --git a/packages/titan/src/util/npm.js b/packages/titan/src/util/npm.js index 519ef96..2842a76 100644 --- a/packages/titan/src/util/npm.js +++ b/packages/titan/src/util/npm.js @@ -4,6 +4,7 @@ const fs = require("./fs"); const log = require("./log"); const path = require("./path"); +let PROJECT_ROOT_CONFIG = null; let PROJECT_ROOT = null; const getProjectRoot = () => { if (PROJECT_ROOT === null) { @@ -19,26 +20,46 @@ const getProjectRoot = () => { const files = fs.readDir(currentPath); if (files.find((file) => file === "package.json")) { - const pkg = JSON.parse( - fs.read(path.resolve(currentPath, "package.json"), { - encoding: "utf8", - }) - ); + let pkg; - if ("titan" in pkg) { + try { + pkg = JSON.parse( + fs.read(path.resolve(currentPath, "package.json"), { + encoding: "utf8", + }) + ); + } catch (error) { + log.debug( + `Could not import file "${path.resolve( + currentPath, + "package.json" + )}".` + ); + } + + if (pkg && "titan" in pkg) { PROJECT_ROOT = currentPath; + PROJECT_ROOT_CONFIG = pkg; return PROJECT_ROOT; } } } - log.error("Unable to find project root."); + log.error("Unable to find project root. Are you in a Titan project?"); process.exit(1); } else { return PROJECT_ROOT; } }; +const getProjectRootConfig = () => { + if (PROJECT_ROOT_CONFIG === null) { + getProjectRoot(); + } + + return PROJECT_ROOT_CONFIG; +}; + const getAllPackages = () => { const root = getProjectRoot(); @@ -313,6 +334,7 @@ const patchDependenciesWithLocals = (pkgsMap, dependencies) => { module.exports = { getProjectRoot, + getProjectRootConfig, getAllPackages, getLocalDependencies, withLinkedLocals,