UNPKG

npm-submodules

Version:

Simple way to manage typescipt and angular2 submodules from one repository

93 lines (92 loc) 3.22 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // import { TsmOptions } from '../types'; const constants_1 = require("./constants"); const fs = require('fs'); const path = require('path'); const tsconfig = require('tsconfig'); const readPkg = require('read-pkg'); // todo: order by cross dependencies // todo: add --use-local-dependencies alias --local // should in the same folder as dist const _tmp = '.tmp'; /** * Will try to find package.json in src folder * if not found will search in 1st level of directories * Returns list of directories with package.json * project - string, relative path to folder */ function findSubmodules(project, options) { return listDirs(project) .then(dirs => orderByCrossDeps(dirs .filter(dir => isModuleRoot(dir)) .map(dir => ({ dir, tsconfig: tsconfig.loadSync(dir) })) .map(opt => resolveOptions(project, opt)))); } exports.findSubmodules = findSubmodules; function listDirs(project) { return Promise.resolve([project].concat(fs .readdirSync(path.resolve(project)) .filter(file => fs.statSync(path.resolve(project, file)) .isDirectory()) .map(dir => path.join(project, dir)))); } function isModuleRoot(dir) { if (fs.existsSync(path.join(dir, constants_1.pkgFileName))) { return !!tsconfig.resolveSync(dir); } return false; } function resolveOptions(project, opt) { const tsOutDir = opt.tsconfig.config.compilerOptions.outDir; const tsConfigDir = path.dirname(opt.tsconfig.path); const relTsOutDir = path.relative(constants_1.ROOT, path.resolve(tsConfigDir, tsOutDir)); const moduleDir = path.relative(project, opt.dir); // submodule root const src = opt.dir; // tsc out dir const dist = relTsOutDir.indexOf(moduleDir) == -1 ? path.join(relTsOutDir, moduleDir) : relTsOutDir; // convert tsout ( '../dist' --> '../.tmp' ) const _distParsed = path.parse(tsOutDir); let tmp = moduleDir && moduleDir === _distParsed.base ? path.join(src, path.format(Object.assign(path.parse(_distParsed.dir), { base: _tmp })), moduleDir) : path.resolve(src, path.format(Object.assign({}, _distParsed, { base: _tmp }))); // tsconfig project return { src, dist, tmp, tsconfig: opt.tsconfig, project: path.relative(constants_1.ROOT, tsConfigDir), pkg: readPkg.sync(src) }; } // todo: split it in // 1. building cross dependencies // 2. sorting by cross dependencies count /** * */ function orderByCrossDeps(options) { const pkgName = options.map(opt => opt.pkg.name); return options .map(option => { option.cross = []; constants_1.dependencyKeys.forEach(depKey => { if (!option.pkg[depKey]) { return; } pkgName.forEach(name => { if (name in option.pkg[depKey]) { option.cross.push(name); } }); }); return option; }) .sort((a, b) => { if (a.cross.length === b.cross.length) { return 0; } return a.cross.length > b.cross.length ? 1 : -1; }); }