UNPKG

bit-bin

Version:

<a href="https://opensource.org/licenses/Apache-2.0"><img alt="apache" src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a> <a href="https://github.com/teambit/bit/blob/master/CONTRIBUTING.md"><img alt="prs" src="https://img.shields.io/b

1,125 lines (948 loc) 33.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); function _assert() { const data = _interopRequireDefault(require("assert")); _assert = function () { return data; }; return data; } function _sinon() { const data = _interopRequireDefault(require("sinon")); _sinon = function () { return data; }; return data; } function _path() { const data = _interopRequireDefault(require("path")); _path = function () { return data; }; return data; } function _mockFs() { const data = _interopRequireDefault(require("mock-fs")); _mockFs = function () { return data; }; return data; } function _rewire() { const data = _interopRequireDefault(require("rewire")); _rewire = function () { return data; }; return data; } function _Config() { const data = _interopRequireDefault(require("./Config")); _Config = function () { return data; }; return data; } function _precinct() { const data = _interopRequireDefault(require("../precinct")); _precinct = function () { return data; }; return data; } const expect = require('chai').expect; // needed for the lazy loading. require('module-definition'); require('detective-stylus'); require('../../../../../constants'); require('../../../../../utils'); require('../../../../../utils/is-relative-import'); require('../detectives/detective-css-and-preprocessors'); require('../detectives/detective-typescript'); require('../detectives/detective-css'); require('../detectives/detective-sass'); require('../detectives/detective-scss'); require('../detectives/detective-less'); require('../detectives/parser-helper'); require('../dependency-tree/Config'); require('../precinct'); require('../filing-cabinet'); const dependencyTreeRewired = (0, _rewire().default)('./'); const dependencyTree = dependencyTreeRewired.default; const fixtures = _path().default.resolve(`${__dirname}/../../../../../../fixtures/dependency-tree`); describe('dependencyTree', function () { this.timeout(8000); function testTreesForFormat(format, ext = '.js') { it('returns an object form of the dependency tree for a file', () => { const root = `${fixtures}/${format}`; const filename = _path().default.normalize(`${root}/a${ext}`); const tree = dependencyTree({ filename, root }); (0, _assert().default)(tree instanceof Object); const aSubTree = tree[filename]; _assert().default.ok(aSubTree instanceof Object); const filesInSubTree = Object.keys(aSubTree); _assert().default.equal(filesInSubTree.length, 2); }); } function mockStylus() { (0, _mockFs().default)({ [`${fixtures}/stylus`]: { 'a.styl': ` @import "b" @require "c.styl" `, 'b.styl': '@import "c"', 'c.styl': '' } }); } function mockSass() { (0, _mockFs().default)({ [`${fixtures}/sass`]: { 'a.scss': ` @import "_b"; @import "_c.scss"; `, '_b.scss': 'body { color: blue; }', '_c.scss': 'body { color: pink; }' } }); } function mockLess() { (0, _mockFs().default)({ [`${fixtures}/less`]: { 'a.less': ` @import "b.css"; @import "c.less"; `, 'b.css': 'body { color: blue; }', 'c.less': 'body { color: pink; }' } }); } function mockes6() { (0, _mockFs().default)({ [`${fixtures}/es6`]: { 'a.js': ` import b from './b'; import c from './c'; `, 'b.js': 'export default () => {};', 'c.js': 'export default () => {};', 'jsx.js': "import c from './c';\n export default <jsx />;", 'foo.jsx': "import React from 'react';\n import b from './b';\n export default <jsx />;", 'es7.js': "import c from './c';\n export default async function foo() {};" } }); } function mockTS() { (0, _mockFs().default)({ [`${fixtures}/ts`]: { 'a.ts': ` import b from './b'; import c from './c'; `, 'b.ts': 'export default () => {};', 'c.ts': 'export default () => {};' } }); } afterEach(() => { _mockFs().default.restore(); }); it('returns an empty object for a non-existent filename', () => { (0, _mockFs().default)({ imaginary: {} }); const root = `${__dirname}/imaginary`; const filename = `${root}/notafile.js`; const tree = dependencyTree({ filename, root }); (0, _assert().default)(tree instanceof Object); (0, _assert().default)(!Object.keys(tree).length); }); it('handles nested tree structures', () => { (0, _mockFs().default)({ [`${__dirname}/extended`]: { 'a.js': `var b = require('./b'); var c = require('./c');`, 'b.js': `var d = require('./d'); var e = require('./e');`, 'c.js': `var f = require('./f'); var g = require('./g');`, 'd.js': '', 'e.js': '', 'f.js': '', 'g.js': '' } }); const directory = `${__dirname}/extended`; const filename = _path().default.normalize(`${directory}/a.js`); const tree = dependencyTree({ filename, directory }); (0, _assert().default)(tree[filename] instanceof Object); // b and c const subTree = tree[filename]; _assert().default.equal(subTree.length, 2); const bTree = tree[_path().default.normalize(`${directory}/b.js`)]; const cTree = tree[_path().default.normalize(`${directory}/c.js`)]; // d and e _assert().default.equal(bTree.length, 2); // f ang g _assert().default.equal(cTree.length, 2); }); it('does not include files that are not real (#13)', () => { (0, _mockFs().default)({ [`${__dirname}/onlyRealDeps`]: { 'a.js': 'var notReal = require("./notReal");' } }); const directory = `${__dirname}/onlyRealDeps`; const filename = _path().default.normalize(`${directory}/a.js`); const tree = dependencyTree({ filename, directory }); const subTree = tree[filename]; _assert().default.ok(!Object.keys(subTree).some(dep => dep.indexOf('notReal') !== -1)); }); it('does not choke on cyclic dependencies', () => { (0, _mockFs().default)({ [`${__dirname}/cyclic`]: { 'a.js': 'var b = require("./b");', 'b.js': 'var a = require("./a");' } }); const directory = `${__dirname}/cyclic`; const filename = _path().default.normalize(`${directory}/a.js`); const spy = _sinon().default.spy(dependencyTreeRewired, '_getDependencies'); const tree = dependencyTreeRewired.default({ filename, directory }); (0, _assert().default)(spy.callCount === 2); (0, _assert().default)(Object.keys(tree[filename]).length); dependencyTreeRewired._getDependencies.restore(); }); it('excludes Nodejs core modules by default', () => { const directory = `${fixtures}/commonjs`; const filename = _path().default.normalize(`${directory}/b.js`); const tree = dependencyTree({ filename, directory }); (0, _assert().default)(Object.keys(tree[filename]).length === 0); (0, _assert().default)(Object.keys(tree)[0].indexOf('b.js') !== -1); }); it('traverses installed 3rd party node modules', () => { const directory = `${fixtures}/onlyRealDeps`; const filename = _path().default.normalize(`${directory}/a.js`); const tree = dependencyTree({ filename, directory }); const subTree = tree[filename]; (0, _assert().default)(subTree.includes(require.resolve('debug'))); }); it('returns a list of absolutely pathed files', () => { const directory = `${fixtures}/commonjs`; const filename = `${directory}/b.js`; const tree = dependencyTree({ filename, directory }); // eslint-disable-next-line for (const node in tree.nodes) { (0, _assert().default)(node.indexOf(process.cwd()) !== -1); } }); describe('when given a detective configuration', () => { it('passes it through to precinct', () => { const spy = _sinon().default.spy(_precinct().default, 'paperwork'); const directory = _path().default.normalize(`${fixtures}/onlyRealDeps`); const filename = _path().default.normalize(`${directory}/a.js`); const detectiveConfig = { amd: { skipLazyLoaded: true } }; dependencyTree({ filename, directory, detective: detectiveConfig }); _assert().default.ok(spy.calledWith(filename, detectiveConfig)); spy.restore(); }); }); describe('when given a list to store non existent partials', () => { describe('and the file contains no valid partials', () => { it('stores the invalid partials', () => { (0, _mockFs().default)({ [`${__dirname}/onlyRealDeps`]: { 'a.js': 'var notReal = require("./notReal");' } }); const directory = _path().default.normalize(`${__dirname}/onlyRealDeps`); const filename = _path().default.normalize(`${directory}/a.js`); const nonExistent = []; dependencyTree({ filename, directory, nonExistent }); _assert().default.equal(Object.keys(nonExistent).length, 1); _assert().default.equal(nonExistent[filename][0], './notReal'); }); }); describe('and the file contains all valid partials', () => { it('does not store anything', () => { (0, _mockFs().default)({ [`${__dirname}/onlyRealDeps`]: { 'a.js': 'var b = require("./b");', 'b.js': 'export default 1;' } }); const directory = `${__dirname}/onlyRealDeps`; const filename = `${directory}/a.js`; const nonExistent = []; dependencyTree({ filename, directory, nonExistent }); _assert().default.equal(nonExistent.length, 0); }); }); describe('and the file contains a mix of invalid and valid partials', () => { it('stores the invalid ones', () => { (0, _mockFs().default)({ [`${__dirname}/onlyRealDeps`]: { 'a.js': 'var b = require("./b");', 'b.js': 'var c = require("./c"); export default 1;', 'c.js': 'var crap = require("./notRealMan");' } }); const directory = _path().default.normalize(`${__dirname}/onlyRealDeps`); const filename = _path().default.normalize(`${directory}/a.js`); const nonExistent = []; dependencyTree({ filename, directory, nonExistent }); _assert().default.equal(Object.keys(nonExistent).length, 1); _assert().default.equal(nonExistent[_path().default.normalize(`${directory}/c.js`)][0], './notRealMan'); }); }); describe('and there is more than one reference to the invalid partial', () => { it('should include the non-existent partial per file', () => { (0, _mockFs().default)({ [`${__dirname}/onlyRealDeps`]: { 'a.js': 'var b = require("./b");\nvar crap = require("./notRealMan");', 'b.js': 'var c = require("./c"); export default 1;', 'c.js': 'var crap = require("./notRealMan");' } }); const directory = _path().default.normalize(`${__dirname}/onlyRealDeps`); const filename = _path().default.normalize(`${directory}/a.js`); const nonExistent = []; dependencyTree({ filename, directory, nonExistent }); _assert().default.equal(Object.keys(nonExistent).length, 2); _assert().default.equal(nonExistent[filename][0], './notRealMan'); _assert().default.equal(nonExistent[_path().default.normalize(`${directory}/c.js`)][0], './notRealMan'); }); }); }); describe('throws', () => { beforeEach(() => { // @ts-ignore this._directory = `${fixtures}/commonjs`; // @ts-ignore this._revert = dependencyTreeRewired.__set__('traverse', () => []); }); afterEach(() => { // @ts-ignore this._revert(); }); it('throws if the filename is missing', () => { _assert().default.throws(() => { dependencyTree({ filename: undefined, // @ts-ignore directory: this._directory }); }); }); it('throws if the root is missing', () => { _assert().default.throws(() => { dependencyTree({ filename: undefined }); }); }); it('throws if a supplied filter is not a function', () => { _assert().default.throws(() => { const directory = `${fixtures}/onlyRealDeps`; const filename = `${directory}/a.js`; dependencyTree({ filename, directory, filter: 'foobar' }); }); }); it('does not throw on the legacy `root` option', () => { _assert().default.doesNotThrow(() => { const directory = `${fixtures}/onlyRealDeps`; const filename = `${directory}/a.js`; dependencyTree({ filename, root: directory }); }); }); }); describe('on file error', () => { beforeEach(() => { // @ts-ignore this._directory = `${fixtures}/commonjs`; }); it('does not throw', () => { _assert().default.doesNotThrow(() => { dependencyTree({ filename: 'foo', // @ts-ignore directory: this._directory }); }); }); it('returns no dependencies', () => { // @ts-ignore const tree = dependencyTree({ filename: 'foo', directory: this._directory }); (0, _assert().default)(!tree.length); }); }); describe('memoization (#2)', () => { beforeEach(() => { // @ts-ignore this._spy = _sinon().default.spy(dependencyTreeRewired, '_getDependencies'); }); afterEach(() => { dependencyTreeRewired._getDependencies.restore(); }); it('accepts a cache object for memoization (#2)', () => { const filename = _path().default.normalize(`${fixtures}/amd/a.js`); const directory = _path().default.normalize(`${fixtures}/amd`); const cache = {}; cache[_path().default.normalize(`${fixtures}/amd/b.js`)] = { pathMap: { dependencies: [_path().default.normalize(`${fixtures}/amd/b.js`), _path().default.normalize(`${fixtures}/amd/c.js`)] } }; const tree = dependencyTree({ filename, directory, visited: cache }); _assert().default.equal(Object.keys(tree[filename]).length, 2); // @ts-ignore (0, _assert().default)(this._spy.neverCalledWith(_path().default.normalize(`${fixtures}/amd/b.js`))); }); it('returns the precomputed list of a cached entry point', () => { const filename = `${fixtures}/amd/a.js`; const directory = `${fixtures}/amd`; const cache = { // Shouldn't process the first file's tree [filename]: { pathMap: { dependencies: [] } } }; const tree = dependencyTree({ filename, directory, visited: cache }); (0, _assert().default)(!tree.length); }); }); describe('module formats', () => { describe('amd', () => { testTreesForFormat('amd'); }); describe('commonjs', () => { testTreesForFormat('commonjs'); }); describe('es6', () => { beforeEach(() => { // @ts-ignore this._directory = _path().default.normalize(`${fixtures}/es6`); mockes6(); }); testTreesForFormat('es6'); it('resolves files that have jsx', () => { // @ts-ignore const filename = _path().default.normalize(`${this._directory}/jsx.js`); const tree = dependencyTree({ filename, // @ts-ignore directory: this._directory }); // @ts-ignore _assert().default.ok(tree[filename].includes(_path().default.normalize(`${this._directory}/c.js`))); }); it('resolves files with a jsx extension', () => { // @ts-ignore const filename = _path().default.normalize(`${this._directory}/foo.jsx`); const tree = dependencyTree({ filename, // @ts-ignore directory: this._directory }); // @ts-ignore _assert().default.ok(tree[filename].includes(_path().default.normalize(`${this._directory}/b.js`))); }); it('resolves files that have es7', () => { // @ts-ignore const filename = _path().default.normalize(`${this._directory}/es7.js`); const tree = dependencyTree({ filename, // @ts-ignore directory: this._directory }); // @ts-ignore _assert().default.ok(tree[filename].includes(_path().default.normalize(`${this._directory}/c.js`))); }); }); describe('sass', () => { beforeEach(() => { mockSass(); }); testTreesForFormat('sass', '.scss'); }); describe('stylus', () => { beforeEach(() => { mockStylus(); }); testTreesForFormat('stylus', '.styl'); }); describe('less', () => { beforeEach(() => { mockLess(); }); testTreesForFormat('less', '.less'); }); describe('typescript', () => { beforeEach(() => { mockTS(); }); testTreesForFormat('ts', '.ts'); }); }); // skipping the webpack unit tests for now as it's not easy to wire up all the files together. // originally, in dependency-tree, the webpack.config.js is in the same directory of the index.js. // doing the same here will be confusing. instead, we have already e2e-tests in bit-bin of custom // module resolution, which takes advantage of the webpack config. describe.skip('webpack', () => { beforeEach(() => { // Note: not mocking because webpack's resolver needs a real project with dependencies; // otherwise, we'd have to mock a ton of files. // @ts-ignore this._root = _path().default.join(__dirname, '../'); // @ts-ignore this._webpackConfig = `${this._root}/webpack.config.js`; // @ts-ignore this._testResolution = name => { const results = dependencyTree.toList({ filename: `${fixtures}/webpack/${name}.js`, // @ts-ignore directory: this._root, // @ts-ignore webpackConfig: this._webpackConfig, filter: filename => filename.indexOf('filing-cabinet') !== -1 }); _assert().default.ok(results.some(filename => filename.indexOf('node_modules/filing-cabinet') !== -1)); }; }); it('resolves aliased modules', () => { this.timeout(5000); // @ts-ignore this._testResolution('aliased'); }); it('resolves unaliased modules', () => { this.timeout(5000); // @ts-ignore this._testResolution('unaliased'); }); }); describe('requirejs', () => { beforeEach(() => { (0, _mockFs().default)({ root: { 'lodizzle.js': 'define({})', 'require.config.js': ` requirejs.config({ baseUrl: './', paths: { F: './lodizzle.js' } }); `, 'a.js': ` define([ 'F' ], function(F) { }); `, 'b.js': ` define([ './lodizzle' ], function(F) { }); ` } }); }); it('resolves aliased modules', () => { const tree = dependencyTree({ filename: 'root/a.js', directory: 'root', config: 'root/require.config.js' }); const filename = _path().default.resolve(process.cwd(), 'root/a.js'); (0, _assert().default)(tree[filename].includes(_path().default.normalize('root/lodizzle.js'))); }); it('resolves non-aliased paths', () => { const tree = dependencyTree({ filename: 'root/b.js', directory: 'root', config: 'root/require.config.js' }); const filename = _path().default.resolve(process.cwd(), 'root/b.js'); _assert().default.ok(tree[filename].includes(_path().default.normalize('root/lodizzle.js'))); }); }); describe('when a filter function is supplied', () => { it('uses the filter to determine if a file should be included in the results', () => { const directory = _path().default.normalize(`${fixtures}/onlyRealDeps`); const filename = _path().default.normalize(`${directory}/a.js`); const tree = dependencyTree({ filename, directory, // Skip all 3rd party deps filter: (filePath, moduleFile) => { _assert().default.ok(require.resolve('debug')); _assert().default.ok(moduleFile.includes(_path().default.normalize('onlyRealDeps/a.js'))); return filePath.indexOf('node_modules') === -1; } }); const subTree = tree[filename]; _assert().default.ok(Object.keys(tree).length); const has3rdPartyDep = Object.keys(subTree).some(dep => dep === require.resolve('debug')); _assert().default.ok(!has3rdPartyDep); }); }); describe('when given a CJS file with lazy requires', () => { beforeEach(() => { (0, _mockFs().default)({ [`${__dirname}/cjs`]: { 'foo.js': 'module.exports = function(bar = require("./bar")) {};', 'bar.js': 'module.exports = 1;' } }); }); it('includes the lazy dependency', () => { const directory = `${__dirname}/cjs`; const filename = _path().default.normalize(`${directory}/foo.js`); const tree = dependencyTree({ filename, directory }); _assert().default.ok(tree[filename].includes(_path().default.normalize(`${directory}/bar.js`))); }); }); describe('when given an es6 file using CJS lazy requires', () => { beforeEach(() => { (0, _mockFs().default)({ [`${__dirname}/es6`]: { 'foo.js': 'export default function(bar = require("./bar")) {};', 'bar.js': 'export default 1;' } }); }); describe('and mixedImport mode is turned on', () => { it('includes the lazy dependency', () => { const directory = `${__dirname}/es6`; const filename = _path().default.normalize(`${directory}/foo.js`); const tree = dependencyTree({ filename, directory, detective: { es6: { mixedImports: true } } }); _assert().default.ok(tree[filename].includes(_path().default.normalize(`${directory}/bar.js`))); }); }); }); describe('when given an es6 file using dynamic imports', () => { beforeEach(() => { (0, _mockFs().default)({ [`${__dirname}/es6`]: { 'foo.js': 'import("./bar");', 'bar.js': 'export default 1;' } }); }); it('includes the dynamic import', () => { const directory = _path().default.normalize(`${__dirname}/es6`); const filename = _path().default.normalize(`${directory}/foo.js`); const tree = dependencyTree({ filename, directory }); const subTree = tree[filename]; _assert().default.ok(!(`${directory}/bar.js` in subTree)); }); }); describe('when a dependency of the main file is not supported', () => { beforeEach(() => { (0, _mockFs().default)({ [`${__dirname}/baz`]: { 'foo.js': 'require("./bar.json");', 'bar.json': '{ "main": "I\'m a simple JSON object" }' } }); }); it('should include it as a dependency and not throw an error', () => { const directory = _path().default.normalize(`${__dirname}/baz`); const filename = _path().default.normalize(`${directory}/foo.js`); const tree = dependencyTree({ filename, directory }); _assert().default.ok(`${directory}/bar.json` in tree); }); }); // nodeModulesConfig is a feature added to dependency-tree and filing-cabinet to support // "module" attribute of package.json, see here what this attribute is good for: // https://github.com/rollup/rollup/wiki/pkg.module // the commit of supporting it in filing-cabinet is here: https://github.com/dependents/node-filing-cabinet/commit/abef861a5a725b29c2342d01de94c6e2dd881aa0 describe.skip('when given a CJS file with module property in package.json', () => { beforeEach(() => { (0, _mockFs().default)({ [`${__dirname}/es6`]: { 'module.entry.js': 'import * as module from "module.entry"', node_modules: { 'module.entry': { 'index.main.js': 'module.exports = () => {};', 'index.module.js': 'module.exports = () => {};', 'package.json': '{ "main": "index.main.js", "module": "index.module.js" }' } } } }); }); it('it includes the module entry as dependency', () => { const directory = `${__dirname}/es6`; const filename = `${directory}/module.entry.js`; const tree = dependencyTree({ filename, directory, nodeModulesConfig: { entry: 'module' } }); const subTree = tree[filename]; _assert().default.ok(`${directory}/node_modules/module.entry/index.module.js` in subTree); }); }); describe('Config', () => { describe('when cloning', () => { describe('and a detective config was set', () => { it('retains the detective config in the clone', () => { const detectiveConfig = { es6: { mixedImports: true } }; const config = new (_Config().default)({ detectiveConfig, filename: 'foo', directory: 'bar' }); const clone = config.clone(); _assert().default.deepEqual(clone.detectiveConfig, detectiveConfig); }); }); }); }); describe('when a dependency has missing packages and is retrieved from the cache (visited)', () => { beforeEach(() => { (0, _mockFs().default)({ [`${__dirname}/baz`]: { 'foo.js': 'require("non-exist-foo-pkg");', 'bar.js': 'require("./foo"); require("non-exist-bar-pkg")', 'baz.js': 'require("./foo"); require("./bar"); require("non-exist-baz-pkg")' } }); }); it('should not override the cache with wrong packages', () => { const directory = _path().default.normalize(`${__dirname}/baz`); const fooFile = _path().default.normalize(`${directory}/foo.js`); const barFile = _path().default.normalize(`${directory}/bar.js`); const bazFile = _path().default.normalize(`${directory}/baz.js`); const nonExistent = {}; const config = { directory, nonExistent, visited: {} }; // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! config.filename = fooFile; dependencyTree(config); expect(nonExistent[fooFile]).to.deep.equal(['non-exist-foo-pkg']); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! config.filename = barFile; dependencyTree(config); expect(nonExistent[fooFile]).to.deep.equal(['non-exist-foo-pkg']); expect(nonExistent[barFile]).to.deep.equal(['non-exist-bar-pkg']); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! config.filename = bazFile; dependencyTree(config); expect(nonExistent[fooFile]).to.deep.equal(['non-exist-foo-pkg']); expect(nonExistent[barFile]).to.deep.equal(['non-exist-bar-pkg']); expect(nonExistent[bazFile]).to.deep.equal(['non-exist-baz-pkg']); }); }); describe('passing css files and then javascript files', () => { beforeEach(() => { (0, _mockFs().default)({ [`${__dirname}/baz`]: { 'base.scss': 'li {} a {}', // don't change the content. it crash only with this for some reason 'index.jsx': "require('some-module');" } }); }); it('should not crash with "RangeError: Maximum call stack size exceeded" error', () => { const directory = _path().default.normalize(`${__dirname}/baz`); const baseFile = _path().default.normalize(`${directory}/base.scss`); const indexFile = _path().default.normalize(`${directory}/index.jsx`); const config = { directory }; // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! config.filename = baseFile; dependencyTree(config); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! config.filename = indexFile; const dependencies = dependencyTree(config); expect(dependencies).to.be.ok; }); }); describe('files with dynamic import', () => { it('should not show missing dependencies', () => { (0, _mockFs().default)({ [`${__dirname}/dynamic`]: { 'foo.js': 'const a = "./b"; import(a); require(a);' } }); const directory = _path().default.normalize(`${__dirname}/dynamic`); const filename = _path().default.normalize(`${directory}/foo.js`); const visited = {}; dependencyTree({ filename, directory, visited }); expect(visited[filename].missing).to.be.undefined; }); }); describe('files with import from cdn (http, https)', () => { it('should not show missing dependencies when importing from https', () => { (0, _mockFs().default)({ [`${__dirname}/cdn`]: { 'foo.js': 'import { a } from "https://unpkg.com";' } }); const directory = _path().default.normalize(`${__dirname}/cdn`); const filename = _path().default.normalize(`${directory}/foo.js`); const visited = {}; dependencyTree({ filename, directory, visited }); expect(visited[filename].missing).to.be.undefined; }); it('should not show missing dependencies when importing from http', () => { (0, _mockFs().default)({ [`${__dirname}/cdn`]: { 'bar.js': 'const b = require("http://pkg.com");' } }); const directory = _path().default.normalize(`${__dirname}/cdn`); const filename = _path().default.normalize(`${directory}/bar.js`); const visited = {}; dependencyTree({ filename, directory, visited }); expect(visited[filename].missing).to.be.undefined; }); }); describe('resolve config when the dependency is "."', () => { it('should not set the dependency with isCustomResolveUsed=true', () => { (0, _mockFs().default)({ [`${__dirname}/src`]: { 'foo.js': "require('.');", 'index.js': 'module.exports = {}' } }); const directory = _path().default.normalize(`${__dirname}/src`); const filename = _path().default.normalize(`${directory}/foo.js`); const config = { filename, directory, pathMap: [], resolveConfig: { aliases: { something: 'anything' } } }; dependencyTree(config); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! const pathMapRecord = config.pathMap.find(f => f.file === filename); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! expect(pathMapRecord.dependencies).to.have.lengthOf(1); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! const dependency = pathMapRecord.dependencies[0]; expect(dependency).to.not.have.property('isCustomResolveUsed'); }); }); describe('resolve config when the dependency is ".."', () => { it('should not set the dependency with isCustomResolveUsed=true', () => { (0, _mockFs().default)({ [`${__dirname}/src`]: { 'index.js': 'module.exports = {}', bar: { 'foo.js': "require('..');" } } }); const directory = _path().default.normalize(`${__dirname}/src`); const filename = _path().default.normalize(`${directory}/bar/foo.js`); const config = { filename, directory, pathMap: [], resolveConfig: { aliases: { something: 'anything' } } }; dependencyTree(config); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! const pathMapRecord = config.pathMap.find(f => f.file === filename); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! expect(pathMapRecord.dependencies).to.have.lengthOf(1); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! const dependency = pathMapRecord.dependencies[0]; expect(dependency).to.not.have.property('isCustomResolveUsed'); }); }); });