diff --git a/CHANGELOG.md b/CHANGELOG.md index e5a27a4e7237..1d59feff7afa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [unreleased] +- [#2162](https://github.com/teambit/bit/pull/2162) - add integration with [librarian](https://github.com/teambit/librarian) - [#2178](https://github.com/teambit/bit/issues/2178) fix adding ts types packages to respect overrides settings -- [#2176](https://github.com/teambit/bit/issues/2176) fix workspace overrides to not leak rules to unrelated components +- [#2176](https://github.com/teambit/bit/issues/2176) fix workspace overrides to not leak rules to unrelated component - [#2171](https://github.com/teambit/bit/issues/2171) fix component-not-found when exporting to multiple scopes and there are dependencies between them ## [14.6.1-dev.2] - 2019-12-04 diff --git a/components/core/capsule/capsule.ts b/components/core/capsule/capsule.ts index c427eb187619..de4ace6f46e5 100644 --- a/components/core/capsule/capsule.ts +++ b/components/core/capsule/capsule.ts @@ -1,17 +1,20 @@ -import State from "./state"; +import State from './state'; import Container from './container'; // @ts-ignore -import { Volume } from "memfs/lib/volume"; -import Console from "./console"; +import librarian from 'librarian'; +import { Volume } from 'memfs/lib/volume'; +import Console from './console'; // @ts-ignore import { Union } from 'unionfs'; import { ContainerFS } from './container'; -import { Exec } from "./container"; +import { Exec } from './container'; + +import loader from '../../../src/cli/loader'; // TODO: better (have the capsule accept the loader as an arg?) export class ContainerFactoryOptions { image: string = ''; config: object = {}; -}; +} export default class Capsule { constructor( @@ -41,6 +44,8 @@ export default class Capsule { */ static image = 'ubuntu'; + componentName?: string; + /** * default capsule config. */ @@ -63,8 +68,8 @@ export default class Capsule { this.container.on(event, fn); } - updateFs(fs: {[path: string]: string}, fn: Function): void { - Object.keys(fs).forEach((path) => { + updateFs(fs: { [path: string]: string }, fn: Function): void { + Object.keys(fs).forEach(path => { // @ts-ignorex this.fs.writeFile(path, fs[path], () => { if (Object.keys(fs).length === 1) fn(); @@ -72,6 +77,20 @@ export default class Capsule { }); } + async execNode(executable: string, args: any) { + // TODO: better + const loaderPrefix = this.componentName ? `isolating ${this.componentName}` : ''; + const log = message => (this.componentName ? loader.setText(`${loaderPrefix}: ${message}`) : {}); + const { patchFileSystem } = librarian.api(); + const onScriptRun = () => + this.componentName ? loader.setText(`running build for ${this.componentName} in an isolated environment`) : {}; // TODO: do this from the compiler/tester so we can customize the message + await patchFileSystem(executable, { args, cwd: this.container.path, log, onScriptRun }); + } + + setComponentName(componentName: string) { + this.componentName = componentName; + } + outputFile(file: string, data: any, options: Object): Promise { return this.container.outputFile(file, data, options); } @@ -89,7 +108,7 @@ export default class Capsule { } resume() { - return this.container.resume() + return this.container.resume(); } stop() { @@ -117,21 +136,19 @@ export default class Capsule { private static buildFs(memFs: Volume, containerFs: ContainerFS): Volume { const fs = new Union(); - fs - .use(memFs) - .use(containerFs); + fs.use(memFs).use(containerFs); return fs; } static async create( - containerFactory: (options: ContainerFactoryOptions) => Promise, - volume: Volume = new Volume(), - initialState: State = new State(), - console: Console = new Console() - ): Promise { + containerFactory: (options: ContainerFactoryOptions) => Promise, + volume: Volume = new Volume(), + initialState: State = new State(), + console: Console = new Console() + ): Promise { const container = await containerFactory({ image: this.image, config: this.config }); const fs = await ContainerFS.fromJSON(container, {}); - return (new this(container, this.buildFs(volume, fs), console, initialState) as T); + return new this(container, this.buildFs(volume, fs), console, initialState) as T; } } diff --git a/components/core/capsule/container/container.ts b/components/core/capsule/container/container.ts index b5cb80bb5ad3..50c4e9ed790f 100644 --- a/components/core/capsule/container/container.ts +++ b/components/core/capsule/container/container.ts @@ -6,6 +6,7 @@ export default interface Container { * container id */ id: string; + path: string; /** * execute a command on the container @@ -20,13 +21,13 @@ export default interface Container { /** * put a file or a directory to the container. */ - put(files: {[path: string]: string}, options: { overwrite?: boolean, path: string }): Promise; + put(files: { [path: string]: string }, options: { overwrite?: boolean; path: string }): Promise; + + on(event: string, fn: (data: any) => void): void; - on(event: string, fn: (data: any) => void): void; - /** * start a container. - */ + */ start(): Promise; /** @@ -69,37 +70,37 @@ export type ContainerStatus = { /** * array of open container ports */ - ports: number[], + ports: number[]; /** * container host */ - host: string, + host: string; }; export type CommitOptions = { /** * repository name for the created image */ - repo: string, - + repo: string; + /** * tag name for the create image */ - tag: string, + tag: string; /** * commit message */ - comment: string, + comment: string; /** * author of the image. */ - author: string, + author: string; /** * whether to pause the container before committing */ - pause: boolean, + pause: boolean; }; diff --git a/e2e/commands/isolate.e2e.1.ts b/e2e/commands/isolate.e2e.1.ts index 13853a63fcd1..36c583fad2db 100644 --- a/e2e/commands/isolate.e2e.1.ts +++ b/e2e/commands/isolate.e2e.1.ts @@ -40,7 +40,7 @@ describe('run bit isolate', function() { describe('with the same parameters as pack is using', () => { let isolatePath; before(() => { - isolatePath = helper.command.isolateComponent('bar/foo', '-olw'); + isolatePath = helper.command.isolateComponent('bar/foo', '-owls'); }); it('should be able to generate the links correctly and require the dependencies', () => { const appJsFixture = `const barFoo = require('./'); diff --git a/e2e/functionalities/custom-module-resolutions.e2e.2.ts b/e2e/functionalities/custom-module-resolutions.e2e.2.ts index 541b77631fa9..4e1db0e2db5e 100644 --- a/e2e/functionalities/custom-module-resolutions.e2e.2.ts +++ b/e2e/functionalities/custom-module-resolutions.e2e.2.ts @@ -91,7 +91,7 @@ describe('custom module resolutions', function() { describe('importing the component using isolated environment', () => { let isolatePath; before(() => { - isolatePath = helper.command.isolateComponent('bar/foo', '-olw'); + isolatePath = helper.command.isolateComponent('bar/foo', '-olws'); }); it('should be able to generate the links correctly and require the dependencies', () => { const appJsFixture = `const barFoo = require('./'); diff --git a/package-lock.json b/package-lock.json index 39494f0f9dee..7add04211a2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,7 @@ + { "name": "bit-bin", - "version": "14.5.0", + "version": "14.6.1-dev.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2190,7 +2191,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -2514,8 +2514,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assertion-error": { "version": "1.1.0", @@ -2569,8 +2568,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", @@ -2586,14 +2584,12 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "babel-eslint": { "version": "9.0.0", @@ -2697,7 +2693,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -3077,8 +3072,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chai": { "version": "4.2.0", @@ -3154,8 +3148,7 @@ "charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", - "dev": true + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" }, "check-error": { "version": "1.0.2", @@ -3454,7 +3447,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -3756,8 +3748,7 @@ "crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", - "dev": true + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" }, "crypto-random-string": { "version": "1.0.0", @@ -3871,7 +3862,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -4033,8 +4023,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { "version": "1.1.2", @@ -4203,11 +4192,15 @@ } } }, + "easy-stack": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.0.tgz", + "integrity": "sha1-EskbMIWjfwuqM26UhurEv5Tj54g=" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -5049,6 +5042,11 @@ "es5-ext": "~0.10.14" } }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==" + }, "execa": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz", @@ -5277,8 +5275,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "eyes": { "version": "0.1.8", @@ -5518,17 +5515,49 @@ "for-in": "^1.0.1" } }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -5600,7 +5629,6 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", - "dev": true, "requires": { "minipass": "^2.2.1" } @@ -5709,6 +5737,11 @@ } } }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==" + }, "get-amd-module-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-3.0.0.tgz", @@ -5751,7 +5784,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -6029,14 +6061,12 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -6167,8 +6197,7 @@ "hosted-git-info": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", - "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", - "dev": true + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==" }, "html-encoding-sniffer": { "version": "1.0.2", @@ -6220,7 +6249,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -6355,6 +6383,14 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, "import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -6410,6 +6446,11 @@ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, "infinity-x": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/infinity-x/-/infinity-x-1.0.2.tgz", @@ -6972,8 +7013,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-url": { "version": "1.2.4", @@ -7073,6 +7113,19 @@ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true }, + "js-message": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.5.tgz", + "integrity": "sha1-IwDSSxrwjondCVvBpMnJz8uJLRU=" + }, + "js-queue": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.0.tgz", + "integrity": "sha1-NiITz4YPRo8BJfxslqvBdCUx+Ug=", + "requires": { + "easy-stack": "^1.0.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7099,8 +7152,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsdom": { "version": "15.1.1", @@ -7177,14 +7229,21 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -7194,8 +7253,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { "version": "2.1.0", @@ -7220,11 +7278,15 @@ "graceful-fs": "^4.1.6" } }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" }, "jsonwebtoken": { "version": "8.5.1", @@ -7256,7 +7318,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -7343,6 +7404,98 @@ "type-check": "~0.3.2" } }, + "librarian": { + "version": "github:teambit/librarian#f5c72716194b72fce8e702b0a808c2f69a7e89d5", + "from": "github:teambit/librarian#release", + "requires": { + "fs-extra": "^7.0.1", + "fs-monkey": "^0.3.3", + "json-stable-stringify": "^1.0.1", + "md5": "^2.2.1", + "memfs": "^2.15.5", + "node-ipc": "^9.1.1", + "npm-logical-tree": "^1.2.1", + "pacote": "^9.5.0", + "request": "^2.88.0", + "request-promise": "^4.2.4", + "request-promise-native": "^1.0.7", + "semver": "^5.6.0", + "spawn-wrap": "^1.4.3", + "ssri": "^6.0.1", + "tar": "^5.0.5", + "tar-stream": "^2.0.0", + "unionfs": "4.1.0", + "yargs": "^13.2.2" + }, + "dependencies": { + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz", + "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "tar": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz", + "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==", + "requires": { + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^0.5.0", + "yallist": "^4.0.0" + } + }, + "unionfs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unionfs/-/unionfs-4.1.0.tgz", + "integrity": "sha512-KNDO1K0v/4Pdc+JbXMaLmjOP6yvGFK1Vm5o6GjqqSzA3qUJ3Y3o8cC9h8FsDRO+tYBrUecb3DcE/8/7JO1Xz8Q==", + "requires": { + "fs-monkey": "^0.3.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "line-reader": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.2.4.tgz", @@ -8003,7 +8156,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "dev": true, "requires": { "charenc": "~0.0.1", "crypt": "~0.0.1", @@ -8237,14 +8389,12 @@ "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" }, "mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, "requires": { "mime-db": "1.40.0" } @@ -8271,7 +8421,6 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.6.0.tgz", "integrity": "sha512-OuNZ0OHrrI+jswzmgivYBZ+fAAGHZA4293d5q0z631/I9QSw3yumKB92njxHIHiB1eAdGRsE+3CcOPkoEyV5FQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -8281,7 +8430,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.2.tgz", "integrity": "sha512-hR3At21uSrsjjDTWrbu0IMLTpnkpv8IIMFDFaoz43Tmu4LkmAXfH44vNNzpTnf+OAQQCHrb91y/wc2J4x5XgSQ==", - "dev": true, "requires": { "minipass": "^2.2.1" } @@ -8715,6 +8863,16 @@ "safe-buffer": "^5.1.1" } }, + "node-ipc": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.1.tgz", + "integrity": "sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w==", + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.5", + "js-queue": "2.0.0" + } + }, "node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", @@ -8742,7 +8900,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -8768,6 +8925,36 @@ "white-space-x": "^3.0.0" } }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" + }, + "npm-logical-tree": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz", + "integrity": "sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg==" + }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.6.tgz", + "integrity": "sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, "npm-path": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", @@ -8777,6 +8964,99 @@ "which": "^1.2.10" } }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-registry-fetch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.2.tgz", + "integrity": "sha512-Z0IFtPEozNdeZRPh3aHHxdG+ZRpzcbQaJLthsm3VhNf6DScicTFRHZzK82u8RsJUsUHkX+QH/zcB/5pmd20H4A==", + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } + } + }, "npm-run-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", @@ -8818,8 +9098,7 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", @@ -9112,6 +9391,15 @@ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "output-file-sync": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz", @@ -9227,6 +9515,114 @@ "optimist": "~0.6.0" } }, + "pacote": { + "version": "9.5.10", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.10.tgz", + "integrity": "sha512-YfMv9yyUFojekkPB4x2pL7DvAaQ5KF+XObfrhNBreXkLopo9k9nOPszObZ4V7ORoLsaFq4ZaK851JxfJxfpfAg==", + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "pad": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/pad/-/pad-3.2.0.tgz", @@ -9410,8 +9806,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { "version": "2.0.7", @@ -9736,6 +10131,14 @@ "to-property-key-x": "^2.0.1" } }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "requires": { + "genfun": "^5.0.0" + } + }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -9754,14 +10157,12 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", - "dev": true + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" }, "pump": { "version": "3.0.0", @@ -9806,8 +10207,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "ramda": { "version": "0.24.1", @@ -10144,7 +10544,6 @@ "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -10178,11 +10577,31 @@ "request": "2.88.0" } }, + "request-promise": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.5.tgz", + "integrity": "sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg==", + "requires": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "requires": { + "lodash": "^4.17.15" + } + } + } + }, "request-promise-core": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", - "dev": true, "requires": { "lodash": "^4.17.11" } @@ -10191,7 +10610,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", - "dev": true, "requires": { "request-promise-core": "1.1.2", "stealthy-require": "^1.1.1", @@ -10809,11 +11227,23 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "spawn-wrap": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", + "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -10822,14 +11252,12 @@ "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -10838,8 +11266,7 @@ "spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, "speedometer": { "version": "1.0.0", @@ -10883,7 +11310,6 @@ "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -10945,8 +11371,7 @@ "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, "stream-each": { "version": "1.2.3", @@ -11252,7 +11677,6 @@ "version": "4.4.10", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", - "dev": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", @@ -11586,7 +12010,6 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -11595,8 +12018,7 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" } } }, @@ -11708,7 +12130,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -11716,8 +12137,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type": { "version": "1.0.3", @@ -12088,7 +12508,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -12296,7 +12715,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", diff --git a/package.json b/package.json index 73943480448d..d8155d6e4804 100644 --- a/package.json +++ b/package.json @@ -112,6 +112,7 @@ "is-glob": "^4.0.0", "isbinaryfile": "^4.0.2", "jfs": "^0.2.6", + "librarian": "github:teambit/librarian#release", "lodash.assignwith": "^4.2.0", "lodash.groupby": "^4.6.0", "lodash.merge": "^4.6.2", diff --git a/src/app.ts b/src/app.ts index 4c728cbdee52..d1b957c93e45 100644 --- a/src/app.ts +++ b/src/app.ts @@ -4,6 +4,8 @@ import buildRegistrar from './cli/command-registrar-builder'; import loadExtensions from './extensions/extensions-loader'; import HooksManager from './hooks'; +process.env.MEMFS_DONT_WARN = 'true'; // suppress fs experimental warnings from memfs + // removing this, default to longStackTraces also when env is `development`, which impacts the // performance dramatically. (see http://bluebirdjs.com/docs/api/promise.longstacktraces.html) Promise.config({ diff --git a/src/cli/commands/public-cmds/isolate-cmd.ts b/src/cli/commands/public-cmds/isolate-cmd.ts index 8552a9543f9f..af50c7c39fd3 100644 --- a/src/cli/commands/public-cmds/isolate-cmd.ts +++ b/src/cli/commands/public-cmds/isolate-cmd.ts @@ -11,7 +11,7 @@ export default class Isolate extends Command { ['d', 'directory [directory] ', 'path to store isolated component'], ['w', 'write-bit-dependencies [boolean] ', 'write bit components dependencies to package.json file'], ['l', 'npm-links [boolean]', 'point dependencies link files to npm package'], - ['i', 'install-packages [boolean]', 'install npm package dependencies'], + ['s', 'skip-npm-install [boolean]', 'do not install npm package dependencies'], ['', 'install-peer-dependencies [boolean]', 'install peer npm package dependencies'], ['', 'dist', 'write dist files (when exist) to the configured directory'], ['', 'conf', 'write the configuration file (bit.json)'], @@ -40,7 +40,7 @@ export default class Isolate extends Command { directory?: string; writeBitDependencies?: boolean; npmLinks?: boolean; - installPackages?: boolean; + skipNpmInstall?: boolean; installPeerDependencies?: boolean; dist?: boolean; conf?: boolean; @@ -53,9 +53,6 @@ export default class Isolate extends Command { useCapsule?: boolean; } ): Promise { - // console.log('im here'); - // console.log(opts); - // return ''; const concreteOpts: WorkspaceIsolateOptions = { writeToPath: opts.directory, override: opts.override === true, @@ -65,8 +62,8 @@ export default class Isolate extends Command { createNpmLinkFiles: opts.npmLinks === true, saveDependenciesAsComponents: opts.saveDependenciesAsComponents !== false, writeDists: opts.dist === true, - installNpmPackages: !!opts.installPackages, // convert to boolean - installPeerDependencies: !!opts.installPackages, // convert to boolean + installNpmPackages: !opts.skipNpmInstall, + installPeerDependencies: !opts.skipNpmInstall, verbose: opts.verbose === true, excludeRegistryPrefix: !!opts.excludeRegistryPrefix, silentPackageManagerResult: false, diff --git a/src/consumer/component-ops/build-component.ts b/src/consumer/component-ops/build-component.ts index 697ef2be023f..59ffb0575866 100644 --- a/src/consumer/component-ops/build-component.ts +++ b/src/consumer/component-ops/build-component.ts @@ -299,16 +299,22 @@ async function _runBuild({ let shouldBuildUponDependenciesChanges; const isolateFunc = async ({ targetDir, - shouldBuildDependencies + shouldBuildDependencies, + installNpmPackages, + keepExistingCapsule }: { targetDir?: string; shouldBuildDependencies?: boolean; + installNpmPackages?: boolean; + keepExistingCapsule?: boolean; }): Promise<{ capsule: Capsule; componentWithDependencies: ComponentWithDependencies }> => { shouldBuildUponDependenciesChanges = shouldBuildDependencies; const isolator = await Isolator.getInstance('fs', scope, consumer, targetDir); const componentWithDependencies = await isolator.isolate(component.id, { shouldBuildDependencies, - writeDists: false + writeDists: false, + installNpmPackages, + keepExistingCapsule }); return new ExtensionIsolateResult(isolator, componentWithDependencies); }; diff --git a/src/consumer/component/sources/data-to-persist.ts b/src/consumer/component/sources/data-to-persist.ts index 645b8232f4f9..0ee4896cf954 100644 --- a/src/consumer/component/sources/data-to-persist.ts +++ b/src/consumer/component/sources/data-to-persist.ts @@ -71,14 +71,25 @@ export default class DataToPersist { await this._persistFilesToFS(); await this._persistSymlinksToFS(); } - async persistAllToCapsule(capsule: Capsule) { + async persistAllToCapsule(capsule: Capsule, opts = { keepExistingCapsule: false }) { this._log(); this._validateRelative(); - await Promise.all(this.remove.map(pathToRemove => capsule.removePath(pathToRemove.path))); - await Promise.all(this.files.map(file => this._writeFileToCapsule(capsule, file))); + if (!opts.keepExistingCapsule) { + await Promise.all(this.remove.map(pathToRemove => capsule.removePath(pathToRemove.path))); + } + await Promise.all( + this.files.map(file => + this._writeFileToCapsule(capsule, file, { overwriteExistingFile: !!opts.keepExistingCapsule }) + ) + ); await Promise.all(this.symlinks.map(symlink => this.atomicSymlink(capsule, symlink))); } - async _writeFileToCapsule(capsule: Capsule, file: AbstractVinyl) { + async _writeFileToCapsule(capsule: Capsule, file: AbstractVinyl, opts = { overwriteExistingFile: false }) { + // overwriteExistingFile: if a file with the same name exists in the capsule, overwrite it + if (opts.overwriteExistingFile) { + await capsule.removePath(file.path); + return capsule.outputFile(file.path, file.contents, {}); + } if (file.override === false) { // @todo, capsule hack. use capsule.fs once you get it as a component. // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! diff --git a/src/environment/isolator.ts b/src/environment/isolator.ts index 5028eeb9baa2..2bfa6a338c32 100644 --- a/src/environment/isolator.ts +++ b/src/environment/isolator.ts @@ -2,6 +2,7 @@ import R from 'ramda'; import * as path from 'path'; import semver from 'semver'; import pMapSeries from 'p-map-series'; +import { runModule } from 'librarian'; import Capsule from '../../components/core/capsule'; import createCapsule from './capsule-factory'; import Consumer from '../consumer/consumer'; @@ -22,6 +23,7 @@ import BitMap from '../consumer/bit-map'; import { getManipulateDirForComponentWithDependencies } from '../consumer/component-ops/manipulate-dir'; import GeneralError from '../error/general-error'; import { PathOsBased } from '../utils/path'; +import loader from '../cli/loader'; export interface IsolateOptions { writeToPath?: PathOsBased; // Path to write the component to @@ -34,6 +36,7 @@ export interface IsolateOptions { writeDists?: boolean; // Write dist files shouldBuildDependencies?: boolean; // Build all depedencies before the isolation (used by tools like ts compiler) installNpmPackages?: boolean; // Install the package dependencies + keepExistingCapsule?: boolean; // Do not delete the capsule after using it (useful for incremental builds) installPeerDependencies?: boolean; // Install the peer package dependencies verbose?: boolean; // Print more logs excludeRegistryPrefix?: boolean; // exclude the registry prefix from the component's name in the package.json @@ -55,19 +58,30 @@ export default class Isolator { _npmVersionHasValidated = false; // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! componentRootDir: string; - constructor(capsule: Capsule, scope: Scope, consumer?: Consumer) { + dir?: string; + constructor(capsule: Capsule, scope: Scope, consumer?: Consumer, dir?: string) { this.capsule = capsule; this.scope = scope; this.consumer = consumer; + this.dir = dir; } static async getInstance(containerType = 'fs', scope: Scope, consumer?: Consumer, dir?: string): Promise { logger.debug(`Isolator.getInstance, creating a capsule with an ${containerType} container, dir ${dir || 'N/A'}`); const capsule = await createCapsule(containerType, dir); - return new Isolator(capsule, scope, consumer); + return new Isolator(capsule, scope, consumer, dir); } async isolate(componentId: BitId, opts: IsolateOptions): Promise { + const loaderPrefix = `isolating component - ${componentId.name}`; + loader.setText(loaderPrefix); + const log = message => loader.setText(`${loaderPrefix}: ${message}`); + // @ts-ignore TODO: this should be part of the capsule interface + this.capsule.execNode = async (executable, args) => { + const onScriptRun = () => loader.setText(`building component - ${componentId.name}`); + // TODO: do this from the compiler/tester so that the isolator doesn't need to know if it's a builder/tester/*... + await runModule(executable, { args, cwd: this.dir, log, onScriptRun }); + }; const componentWithDependencies: ComponentWithDependencies = await this._loadComponent(componentId); if (opts.shouldBuildDependencies) { topologicalSortComponentDependencies(componentWithDependencies); @@ -83,6 +97,8 @@ export default class Isolator { }); } const writeToPath = opts.writeToPath; + // default should be true + const installNpmPackages = typeof opts.installNpmPackages === 'undefined' ? true : opts.installNpmPackages; const concreteOpts: ManyComponentsWriterParams = { componentsWithDependencies: [componentWithDependencies], writeToPath, @@ -93,7 +109,7 @@ export default class Isolator { createNpmLinkFiles: opts.createNpmLinkFiles, saveDependenciesAsComponents: opts.saveDependenciesAsComponents !== false, writeDists: opts.writeDists, - installNpmPackages: !!opts.installNpmPackages, // convert to boolean + installNpmPackages, installPeerDependencies: !!opts.installPeerDependencies, // convert to boolean addToRootPackageJson: false, verbose: opts.verbose, @@ -103,34 +119,40 @@ export default class Isolator { }; this.componentWithDependencies = componentWithDependencies; this.manyComponentsWriter = new ManyComponentsWriter(concreteOpts); - await this.writeComponentsAndDependencies(); - await this.installComponentPackages(); - await this.writeLinks(); + await this.writeComponentsAndDependencies({ keepExistingCapsule: !!opts.keepExistingCapsule }); + await this.installComponentPackages({ + installNpmPackages, + keepExistingCapsule: !!opts.keepExistingCapsule + }); + await this.writeLinks({ keepExistingCapsule: !!opts.keepExistingCapsule }); this.capsuleBitMap = this.manyComponentsWriter.bitMap; return componentWithDependencies; } - async writeComponentsAndDependencies() { + async writeComponentsAndDependencies(opts = { keepExistingCapsule: false }) { logger.debug('ManyComponentsWriter, writeAllToIsolatedCapsule'); this._manipulateDir(); await this.manyComponentsWriter._populateComponentsFilesToWrite(); await this.manyComponentsWriter._populateComponentsDependenciesToWrite(); - await this._persistComponentsDataToCapsule(); + await this._persistComponentsDataToCapsule({ keepExistingCapsule: !!opts.keepExistingCapsule }); } - async installComponentPackages() { + async installComponentPackages(opts = { installNpmPackages: true, keepExistingCapsule: false }) { // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! this.capsulePackageJson = this.componentWithDependencies.component.packageJsonFile; // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! this.componentRootDir = this.componentWithDependencies.component.writtenPath; - await this._addComponentsToRoot(); + await this._addComponentsToRoot({ keepExistingCapsule: !!opts.keepExistingCapsule }); logger.debug('ManyComponentsWriter, install packages on capsule'); - await this._installWithPeerOption(); + if (opts.installNpmPackages) { + await this._installWithPeerOption(); + } } - async writeLinks() { + async writeLinks(opts = { keepExistingCapsule: false }) { const links = await this.manyComponentsWriter._getAllLinks(); - await links.persistAllToCapsule(this.capsule); + // links is a DataToPersist instance + await links.persistAllToCapsule(this.capsule, { keepExistingCapsule: !!opts.keepExistingCapsule }); } /** @@ -175,14 +197,14 @@ export default class Isolator { return loadFlattenedDependenciesForCapsule(consumer, component); } - async _persistComponentsDataToCapsule() { + async _persistComponentsDataToCapsule(opts = { keepExistingCapsule: false }) { const dataToPersist = new DataToPersist(); const allComponents = [this.componentWithDependencies.component, ...this.componentWithDependencies.allDependencies]; allComponents.forEach(component => dataToPersist.merge(component.dataToPersist)); - await dataToPersist.persistAllToCapsule(this.capsule); + await dataToPersist.persistAllToCapsule(this.capsule, { keepExistingCapsule: !!opts.keepExistingCapsule }); } - async _addComponentsToRoot(): Promise { + async _addComponentsToRoot(opts = { keepExistingCapsule: false }): Promise { // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! const capsulePath = this.capsule.container.getPath(); @@ -203,13 +225,13 @@ export default class Isolator { }, {}); if (R.isEmpty(componentsToAdd)) return; this.capsulePackageJson.addDependencies(componentsToAdd); - await this._writeCapsulePackageJson(); + await this._writeCapsulePackageJson({ keepExistingCapsule: !!opts.keepExistingCapsule }); } - async _writeCapsulePackageJson() { + async _writeCapsulePackageJson(opts = { keepExistingCapsule: false }) { const dataToPersist = new DataToPersist(); dataToPersist.addFile(this.capsulePackageJson.toVinylFile()); - dataToPersist.persistAllToCapsule(this.capsule); + return dataToPersist.persistAllToCapsule(this.capsule, { keepExistingCapsule: !!opts.keepExistingCapsule }); } async _getNpmVersion() {