diff --git a/README.md b/README.md index 250efb2..8fb40ff 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ project.files; // => read or write the set of files further // if you don't set this, a new temp dir will be made for you when you writeSync() project.baseDir = 'some/root/'; -project.writeSync(); +await project.write(); // after writeSync(), you can read project.baseDir even if you didn't set it expect(fs.existsSync(join(project.baseDir, 'index.js'))).to.eql(true); @@ -57,7 +57,7 @@ let a = project.addDependency('a'); let b = a.addDependency('b'); let c = b.addDependency('c'); -project.writeSync(); +await project.write(); ``` Which produces: @@ -91,7 +91,7 @@ project.linkDependency('c', { baseDir: '/example' }); // this will follow node resolution rules to lookup "my-aliased-name" from "../elsewhere" project.linkDependency('d', { baseDir: '/example', resolveName: 'my-aliased-name' }); -project.writeSync(); +await project.write(); ``` Produces: @@ -111,7 +111,7 @@ dependencies instead of copying them in as Projects: ```js let project = Project.fromDir('./sample-project', { linkDeps: true }); project.files['extra.js'] = '// stuff'; -project.write(); +await project.write(); ``` This will generate a new copy of sample-project, with symlinks to all its diff --git a/index.ts b/index.ts index 84ae7de..7d00d00 100644 --- a/index.ts +++ b/index.ts @@ -4,6 +4,7 @@ import fs = require('fs-extra'); import path = require('path'); import resolvePackagePath = require('resolve-package-path'); import CacheGroup = require('resolve-package-path/lib/cache-group'); +import binLinks = require('bin-links'); import { PackageJson as BasePackageJson } from 'type-fest'; import { entries } from 'walk-sync'; @@ -223,7 +224,7 @@ export class Project { get baseDir() { if (!this._baseDir) { throw new Error( - `this project has no baseDir yet. Either set one manually or call writeSync to have one chosen for you` + `this project has no baseDir yet. Either set one manually or call write to have one chosen for you` ); } return this._baseDir; @@ -253,23 +254,40 @@ export class Project { this.pkg.version = value; } + async write() { + this.writeProject(); + await this.binLinks(); + } + + /** + * @deprecated please use `await project.write()` instead. + */ writeSync() { + console.warn('this method is deprecated, please use write instead'); + this.writeProject(); + } + + private writeProject() { this.autoBaseDir(); fixturify.writeSync(this.baseDir, this.files); fs.outputJSONSync(path.join(this.baseDir, 'package.json'), this.pkgJSONWithDeps(), { spaces: 2 }); for (let dep of this.dependencyProjects()) { dep.baseDir = path.join(this.baseDir, 'node_modules', dep.name); - dep.writeSync(); + dep.writeProject(); } for (let dep of this.devDependencyProjects()) { dep.baseDir = path.join(this.baseDir, 'node_modules', dep.name); - dep.writeSync(); + dep.writeProject(); } for (let [name, { dir: target }] of this.dependencyLinks) { this.writeLinkedPackage(name, target); } } + private async binLinks() { + await binLinks({ pkg: this.pkg, path: this.baseDir, top: false, global: false }); + } + private writeLinkedPackage(name: string, target: string) { let targetPkg = fs.readJsonSync(`${target}/package.json`); let peers = new Set(Object.keys(targetPkg.peerDependencies ?? {})); diff --git a/package.json b/package.json index 410049f..a7a2899 100644 --- a/package.json +++ b/package.json @@ -6,11 +6,12 @@ "author": "Stefan Penner ", "license": "MIT", "dependencies": { + "bin-links": "^3.0.0", "fixturify": "^2.1.1", "resolve-package-path": "^3.1.0", "tmp": "^0.0.33", - "walk-sync": "^3.0.0", - "type-fest": "^2.3.2" + "type-fest": "^2.3.2", + "walk-sync": "^3.0.0" }, "devDependencies": { "@types/chai": "^4.2.18", diff --git a/test.ts b/test.ts index 22dea26..5ce2939 100644 --- a/test.ts +++ b/test.ts @@ -6,7 +6,7 @@ import { readSync } from 'fixturify'; const expect = chai.expect; -describe('Project', function () { +describe('Project', async () => { function readJSON(file: string) { return JSON.parse(fs.readFileSync(file, 'utf-8')); } @@ -19,7 +19,7 @@ describe('Project', function () { return fs.readdirSync(path); } - it('has the basic', function () { + it('has the basic', async () => { let project = new Project({ name: 'rsvp', version: '3.1.4', @@ -34,7 +34,7 @@ describe('Project', function () { let source = project.addDevDependency('ember-source', '3.1.1'); project.addDevDependency('@ember/ordered-set', '3.1.1'); - project.writeSync(); + await project.write(); let index = read(`${project.baseDir}/index.js`); let nodeModules = readDir(`${project.baseDir}/node_modules`); @@ -101,7 +101,7 @@ describe('Project', function () { }); describe('project constructor with callback DSL', function () { - it('name, version, cb', function () { + it('name, version, cb', async () => { const projects: { [key: string]: Project } = {}; const project = new Project('my-project', '0.0.1', project => { projects.default = project; @@ -130,7 +130,7 @@ describe('Project', function () { expect(projects.e.version).to.eql('0.0.6'); }); - it('ProjectArgs, cb', function () { + it('ProjectArgs, cb', async () => { const projects: { [key: string]: Project } = {}; const project = new Project({ name: 'my-project', version: '0.0.0' }, project => { projects.default = project; @@ -139,7 +139,7 @@ describe('Project', function () { expect(project).to.eql(projects.default); }); - it('name, projectArgs - name, cb', function () { + it('name, projectArgs - name, cb', async () => { const projects: { [key: string]: Project } = {}; const project = new Project({ name: 'my-project', version: '0.0.0' }, project => { projects.default = project; @@ -148,7 +148,7 @@ describe('Project', function () { expect(project).to.eql(projects.default); }); - it('name, version, projectArgs - name - version, cb', function () { + it('name, version, projectArgs - name - version, cb', async () => { const projects: { [key: string]: Project } = {}; const project = new Project('my-project', '0.0.0', { files: {} }, project => { projects.default = project; @@ -159,7 +159,7 @@ describe('Project', function () { }); describe('.pkg', function () { - it('flattened usage', function () { + it('flattened usage', async () => { const app = new Project('app', '3.1.1'); const rsvp = app.addDependency('rsvp', '3.2.2'); const a = rsvp.addDependency('a', '1.1.1'); @@ -182,7 +182,7 @@ describe('Project', function () { keywords: [], }); - app.writeSync(); + await app.write(); expect(app.pkg).to.eql({ name: 'app', @@ -213,7 +213,7 @@ describe('Project', function () { }); }); - it('callback usage', function () { + it('callback usage', async () => { let rsvp!: Project, a!: Project; const app = new Project('app', '3.1.1', app => { @@ -240,7 +240,7 @@ describe('Project', function () { keywords: [], }); - app.writeSync(); + await app.write(); expect(app.pkg).to.eql({ name: 'app', @@ -272,14 +272,14 @@ describe('Project', function () { }); }); - it('supports default version', function () { + it('supports default version', async () => { const input = new Project(); expect(input.version).to.eql('0.0.0'); - input.writeSync(); + await input.write(); expect(fs.readJSONSync(path.join(input.baseDir, 'package.json'))).to.have.property('version', '0.0.0'); }); - it('supports removing packages', function () { + it('supports removing packages', async () => { const input = new Project(); input.addDependency('rsvp').addDependency(); @@ -295,7 +295,7 @@ describe('Project', function () { expect(input.devDependencyProjects().map(dep => dep.name)).to.eql([]); }); - it('it supports deep cloning', function () { + it('it supports deep cloning', async () => { const input = new Project('foo', '3.1.2', { files: { 'index.js': 'OMG', @@ -312,8 +312,8 @@ describe('Project', function () { const output = input.clone(); - output.writeSync(); - input.writeSync(); + await output.write(); + await input.write(); expect(readSync(output.baseDir)).deep.equals(readSync(input.baseDir)); @@ -327,7 +327,7 @@ describe('Project', function () { expect(output.dependencyProjects().map(x => x.name)).to.not.contain('-no-such-package-'); }); - it('supports fromDir', function () { + it('supports fromDir', async () => { const input = new Project({ files: { 'index.js': 'OMG', @@ -340,7 +340,7 @@ describe('Project', function () { }); input.addDependency('rsvp', '4.4.4').addDependency('mkdirp', '4.4.4'); input.addDevDependency('omg', '4.4.4').addDependency('fs-extra', '5.5.5.'); - input.writeSync(); + await input.write(); const output = Project.fromDir(input.baseDir); @@ -348,7 +348,7 @@ describe('Project', function () { expect(output.dependencyProjects().map(p => p.name)).to.have.members(input.dependencyProjects().map(p => p.name)); }); - it('supports inferring package#name if Project.fromDir is invoked without a second argument', function () { + it('supports inferring package#name if Project.fromDir is invoked without a second argument', async () => { const input = new Project('foo', '3.1.2', { files: { 'index.js': 'OMG', @@ -361,7 +361,7 @@ describe('Project', function () { }); input.addDependency('rsvp', '4.4.4').addDependency('mkdirp', '4.4.4'); input.addDevDependency('omg', '4.4.4').addDependency('fs-extra', '5.5.5.'); - input.writeSync(); + await input.write(); const output = Project.fromDir(input.baseDir); @@ -371,13 +371,13 @@ describe('Project', function () { expect(output.pkg).to.eql(input.pkg); }); - it('supports custom PKG properties', function () { + it('supports custom PKG properties', async () => { let project = new Project('foo', '123'); project.pkg['ember-addon'] = { version: 1, }; - project.writeSync(); + await project.write(); expect(readJSON(`${project.baseDir}/package.json`)).to.eql({ dependencies: {}, devDependencies: {}, @@ -405,82 +405,82 @@ describe('Project', function () { expect(project.pkg.version, '1'); }); - it('handles scoped deps', function () { + it('handles scoped deps', async () => { let project = new Project('foo', '123'); project.addDependency('@test/foo', '1.0.0'); project.addDependency('@test/bar', '1.0.0'); - project.writeSync(); + await project.write(); expect(fs.readdirSync(path.join(project.baseDir, 'node_modules', '@test'))).to.have.members(['foo', 'bar']); }); - it('handles scoped devDeps', function () { + it('handles scoped devDeps', async () => { let project = new Project('foo', '123'); project.addDevDependency('@test/foo', '1.0.0'); project.addDevDependency('@test/bar', '1.0.0'); - project.writeSync(); + await project.write(); expect(fs.readdirSync(path.join(project.baseDir, 'node_modules', '@test'))).to.have.members(['foo', 'bar']); }); - it('has a working dispose to allow early cleanup', function () { + it('has a working dispose to allow early cleanup', async () => { let project = new Project('foo', '123'); project.addDependency('rsvp', '1.2.3'); project.addDevDependency('q', '1.2.4'); - project.writeSync(); + await project.write(); expect(fs.existsSync(project.baseDir)).to.eql(true); project.dispose(); expect(fs.existsSync(project.baseDir)).to.eql(false); }); - it('supports linking to existing dependency via baseDir', function () { + it('supports linking to existing dependency via baseDir', async () => { let baseProject = new Project('base'); baseProject.addDependency('moment'); - baseProject.writeSync(); + await baseProject.write(); let project = new Project('my-app'); project.linkDependency('moment', { baseDir: baseProject.baseDir }); - project.writeSync(); + await project.write(); expect(fs.readlinkSync(path.join(project.baseDir, 'node_modules', 'moment'))).to.eql( path.join(baseProject.baseDir, 'node_modules', 'moment') ); }); - it('supports linking to existing dependency via baseDir and resolveName', function () { + it('supports linking to existing dependency via baseDir and resolveName', async () => { let baseProject = new Project('base'); baseProject.addDependency('moment-x'); - baseProject.writeSync(); + await baseProject.write(); let project = new Project('my-app'); project.linkDependency('moment', { baseDir: baseProject.baseDir, resolveName: 'moment-x' }); - project.writeSync(); + await project.write(); expect(fs.readlinkSync(path.join(project.baseDir, 'node_modules', 'moment'))).to.eql( path.join(baseProject.baseDir, 'node_modules', 'moment-x') ); }); - it('supports linking to existing dependency via target', function () { + it('supports linking to existing dependency via target', async () => { let baseProject = new Project('base'); - baseProject.writeSync(); + await baseProject.write(); let project = new Project('my-app'); project.linkDependency('moment', { target: baseProject.baseDir }); - project.writeSync(); + await project.write(); expect(fs.readlinkSync(path.join(project.baseDir, 'node_modules', 'moment'))).to.eql(baseProject.baseDir); }); - it('supports linking to existing dependency from within nested project', function () { + it('supports linking to existing dependency from within nested project', async () => { let baseProject = new Project('base'); baseProject.addDependency('moment'); - baseProject.writeSync(); + await baseProject.write(); let project = new Project('my-app'); let inner = project.addDependency('inner'); inner.linkDependency('moment', { baseDir: baseProject.baseDir }); - project.writeSync(); + await project.write(); expect(fs.readlinkSync(path.join(project.baseDir, 'node_modules', 'inner', 'node_modules', 'moment'))).to.eql( path.join(baseProject.baseDir, 'node_modules', 'moment') ); }); - it('adjusts peerDependencies of linked dependencies', function () { + it('adjusts peerDependencies of linked dependencies', async () => { let baseProject = new Project('base'); let alpha = baseProject.addDependency('alpha', { files: { @@ -504,7 +504,7 @@ describe('Project', function () { alpha.pkg.peerDependencies = { beta: '^1.0.0' }; alpha.addDependency('gamma'); baseProject.addDependency('beta', { version: '1.1.0' }); - baseProject.writeSync(); + await baseProject.write(); // precondition: in the baseProject, alpha sees its beta peerDep as beta@1.1.0 expect(require(require.resolve('alpha', { paths: [baseProject.baseDir] })).betaVersion()).to.eql('1.1.0'); @@ -512,7 +512,7 @@ describe('Project', function () { let project = new Project('my-app'); project.linkDependency('alpha', { baseDir: baseProject.baseDir }); project.addDependency('beta', { version: '1.2.0' }); - project.writeSync(); + await project.write(); // in our linked project, alpha sees its beta peerDep as beta@1.2.0 expect(require(require.resolve('alpha', { paths: [project.baseDir] })).betaVersion()).to.eql('1.2.0'); @@ -526,48 +526,48 @@ describe('Project', function () { ); }); - it('adds linked dependencies to package.json', function () { + it('adds linked dependencies to package.json', async () => { let baseProject = new Project('base'); baseProject.addDependency('moment', '1.2.3'); - baseProject.writeSync(); + await baseProject.write(); let project = new Project('my-app'); project.linkDependency('moment', { baseDir: baseProject.baseDir }); - project.writeSync(); + await project.write(); expect(fs.readJSONSync(path.join(project.baseDir, 'package.json')).dependencies.moment).to.eql('1.2.3'); }); - it('adds linked devDependencies to package.json', function () { + it('adds linked devDependencies to package.json', async () => { let baseProject = new Project('base'); baseProject.addDependency('moment', '1.2.3'); - baseProject.writeSync(); + await baseProject.write(); let project = new Project('my-app'); project.linkDevDependency('moment', { baseDir: baseProject.baseDir }); - project.writeSync(); + await project.write(); expect(fs.readJSONSync(path.join(project.baseDir, 'package.json')).devDependencies.moment).to.eql('1.2.3'); }); - it('supports linking to existing devDependencies', function () { + it('supports linking to existing devDependencies', async () => { let baseProject = new Project('base'); baseProject.addDependency('moment', '1.2.3'); - baseProject.writeSync(); + await baseProject.write(); let project = new Project('my-app'); project.linkDevDependency('moment', { baseDir: baseProject.baseDir }); - project.writeSync(); + await project.write(); expect(fs.readlinkSync(path.join(project.baseDir, 'node_modules', 'moment'))).to.eql( path.join(baseProject.baseDir, 'node_modules', 'moment') ); }); - it('can read a project with linked dependencies', function () { + it('can read a project with linked dependencies', async () => { // start with a template addon let addonTemplate = new Project('stock-addon'); addonTemplate.addDependency('helper-lib', '1.2.3'); addonTemplate.addDevDependency('test-lib'); addonTemplate.files['hello.js'] = '// it works'; - addonTemplate.writeSync(); + await addonTemplate.write(); // build a new addon from the template let myAddon = Project.fromDir(addonTemplate.baseDir, { linkDeps: true }); @@ -577,7 +577,7 @@ describe('Project', function () { // use the new addon in an app let myApp = new Project('my-app'); myApp.addDependency(myAddon); - myApp.writeSync(); + await myApp.write(); expect( fs.readlinkSync(path.join(myApp.baseDir, 'node_modules', 'custom-addon', 'node_modules', 'helper-lib')) @@ -592,19 +592,19 @@ describe('Project', function () { expect(fs.existsSync(path.join(myApp.baseDir, 'node_modules', 'custom-addon', 'layered-extra.js'))).to.eql(true); }); - it('can read a project with linked dev dependencies', function () { + it('can read a project with linked dev dependencies', async () => { // start with a template app let appTemplate = new Project('stock-app'); appTemplate.addDependency('helper-lib', '1.2.3'); appTemplate.addDevDependency('test-lib'); appTemplate.files['hello.js'] = '// it works'; - appTemplate.writeSync(); + await appTemplate.write(); // build a new addon from the template let myApp = Project.fromDir(appTemplate.baseDir, { linkDevDeps: true }); myApp.name = 'custom-addon'; myApp.files['layered-extra.js'] = '// extra stuff'; - myApp.writeSync(); + await myApp.write(); expect(fs.readlinkSync(path.join(myApp.baseDir, 'node_modules', 'helper-lib'))).to.eql( path.join(appTemplate.baseDir, 'node_modules', 'helper-lib') @@ -618,30 +618,30 @@ describe('Project', function () { expect(fs.existsSync(path.join(myApp.baseDir, 'layered-extra.js'))).to.eql(true); }); - it('can override a linked dependency with a new Project dependency', function () { + it('can override a linked dependency with a new Project dependency', async () => { let baseProject = new Project('base'); baseProject.addDependency('moment', '1.2.3'); - baseProject.writeSync(); + await baseProject.write(); let project = Project.fromDir(baseProject.baseDir, { linkDeps: true }); project.addDependency('moment', '4.5.6'); - project.writeSync(); + await project.write(); expect(fs.lstatSync(path.join(project.baseDir, 'node_modules', 'moment')).isSymbolicLink()).to.eql(false); expect(fs.readJSONSync(path.join(project.baseDir, 'node_modules', 'moment', 'package.json')).version).to.eql( '4.5.6' ); }); - it('can override a Project dependency with a linked dependency', function () { + it('can override a Project dependency with a linked dependency', async () => { let dep = new Project('dep', '1.2.3'); dep.files['first.js'] = ''; - dep.writeSync(); + await dep.write(); let project = new Project('app'); let dep2 = project.addDependency('dep', '4.5.6'); dep2.files['second.js'] = ''; project.linkDependency('dep', { target: dep.baseDir }); - project.writeSync(); + await project.write(); expect(fs.lstatSync(path.join(project.baseDir, 'node_modules', 'dep')).isSymbolicLink(), 'is symlink').is.true; expect( fs.readJSONSync(path.join(project.baseDir, 'node_modules', 'dep', 'package.json')).version, @@ -651,44 +651,44 @@ describe('Project', function () { expect(fs.existsSync(path.join(project.baseDir, 'node_modules', 'dep', 'second.js')), 'second.js').is.false; }); - it('can remove a linked dependency', function () { + it('can remove a linked dependency', async () => { let dep = new Project('dep', '1.2.3'); dep.files['first.js'] = ''; - dep.writeSync(); + await dep.write(); let project = new Project('app'); project.linkDependency('dep', { target: dep.baseDir }); project.removeDependency('dep'); - project.writeSync(); + await project.write(); expect(fs.readJSONSync(path.join(project.baseDir, 'package.json')).dependencies?.dep).to.be.undefined; expect(fs.existsSync(path.join(project.baseDir, 'node_modules', 'dep'))).is.false; }); - it('preserves linking behaviors through clone', function () { + it('preserves linking behaviors through clone', async () => { let baseProject = new Project('base'); - baseProject.writeSync(); + await baseProject.write(); let project = new Project('my-app'); project.linkDependency('moment', { target: baseProject.baseDir }); let cloned = project.clone(); - cloned.writeSync(); + await cloned.write(); expect(fs.readlinkSync(path.join(cloned.baseDir, 'node_modules', 'moment'))).to.eql(baseProject.baseDir); }); - it('can choose the requested semver range of a dependency', function () { + it('can choose the requested semver range of a dependency', async () => { let proj = new Project(); proj.addDependency('mylib', { version: '1.2.3', requestedRange: '^1' }); - proj.writeSync(); + await proj.write(); expect(fs.readJSONSync(path.join(proj.baseDir, 'package.json')).dependencies.mylib).to.eql('^1'); }); - it('can choose the requested semver range of a linked dependency', function () { + it('can choose the requested semver range of a linked dependency', async () => { let baseProject = new Project('moment', '1.2.3'); - baseProject.writeSync(); + await baseProject.write(); let project = new Project('my-app'); project.linkDependency('moment', { target: baseProject.baseDir, requestedRange: '^1' }); - project.writeSync(); + await project.write(); expect(fs.readJSONSync(path.join(project.baseDir, 'package.json')).dependencies.moment).to.eql('^1'); }); }); diff --git a/tsconfig.json b/tsconfig.json index c348f3b..bc0c2b1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,6 @@ "target": "es2018", "module": "commonjs", "declaration": true, - "typeRoots": ["node_modules/@types"], "esModuleInterop": true, "noUnusedLocals": true, "noUnusedParameters": true, diff --git a/yarn.lock b/yarn.lock index ff531b8..f15e842 100644 --- a/yarn.lock +++ b/yarn.lock @@ -107,6 +107,18 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bin-links@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-3.0.0.tgz#8273063638919f6ba4fbe890de9438c1b3adf0b7" + integrity sha512-fC7kPWcEkAWBgCKxmAMqZldlIeHsXwQy9JXzrppAVQiukGiDKxmYesJcBKWu6UMwx/5GOfo10wtK/4zy+Xt/mg== + dependencies: + cmd-shim "^4.0.1" + mkdirp-infer-owner "^2.0.0" + npm-normalize-package-bin "^1.0.0" + read-cmd-shim "^2.0.0" + rimraf "^3.0.0" + write-file-atomic "^4.0.0" + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -182,6 +194,11 @@ chokidar@3.5.2: optionalDependencies: fsevents "~2.3.2" +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -191,6 +208,13 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cmd-shim@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-4.1.0.tgz#b3a904a6743e9fede4148c6f3800bf2a08135bdd" + integrity sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw== + dependencies: + mkdirp-infer-owner "^2.0.0" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -346,6 +370,18 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + 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@^4.1.6, graceful-fs@^4.2.0: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" @@ -373,6 +409,16 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -495,6 +541,20 @@ minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +mkdirp-infer-owner@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" + integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== + dependencies: + chownr "^2.0.0" + infer-owner "^1.0.4" + mkdirp "^1.0.3" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mocha@^9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.1.tgz#33df2eb9c6262434630510c5f4283b36efda9b61" @@ -546,6 +606,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-normalize-package-bin@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -621,6 +686,11 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +read-cmd-shim@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz#4a50a71d6f0965364938e9038476f7eede3928d9" + integrity sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw== + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -649,6 +719,13 @@ resolve@^1.17.0: is-core-module "^2.2.0" path-parse "^1.0.6" +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + safe-buffer@^5.1.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -661,6 +738,11 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" +signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + source-map-support@^0.5.19: version "0.5.20" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" @@ -816,6 +898,14 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +write-file-atomic@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" + integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"