web-component-tester
Version:
web-component-tester makes testing your web components a breeze!
80 lines (72 loc) • 2.75 kB
text/typescript
/**
* @license
* Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at
* http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at
* http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at
* http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt
*/
import * as fs from 'fs';
import * as glob from 'glob';
import * as _ from 'lodash';
import * as path from 'path';
import {promisify} from 'util';
/**
* Expands a series of path patterns (globs, files, directories) into a set of
* files that represent those patterns.
*
* @param baseDir The directory that patterns are relative to.
* @param patterns The patterns to expand.
* @returns The expanded paths.
*/
export async function expand(
baseDir: string, patterns: string[]): Promise<string[]> {
return expandDirectories(baseDir, await unglob(baseDir, patterns));
}
/**
* Expands any glob expressions in `patterns`.
*/
async function unglob(baseDir: string, patterns: string[]): Promise<string[]> {
const strs: string[][] = [];
const pGlob: any = promisify(glob);
for (const pattern of patterns) {
strs.push(await pGlob(String(pattern), {cwd: baseDir, root: baseDir}));
}
// for non-POSIX support, replacing path separators
return _.union(_.flatten(strs)).map((str) => str.replace(/\//g, path.sep));
}
/**
* Expands any directories in `patterns`, following logic similar to a web
* server.
*
* If a pattern resolves to a directory, that directory is expanded. If the
* directory contains an `index.html`, it is expanded to that. Otheriwse, the
* it expands into its children (recursively).
*/
async function expandDirectories(baseDir: string, paths: string[]) {
const listsOfPaths: string[][] = [];
for (const aPath of paths) {
listsOfPaths.push(await expandDirectory(baseDir, aPath));
}
const files = _.union(_.flatten(listsOfPaths));
return files.filter((file) => /\.(js|html)$/.test(file));
}
async function expandDirectory(
baseDir: string, aPath: string): Promise<string[]> {
const stat = await promisify(fs.stat)(path.resolve(baseDir, aPath));
if (!stat.isDirectory()) {
return [aPath];
}
const files = await promisify(fs.readdir)(path.resolve(baseDir, aPath));
// We have an index; defer to that.
if (_.includes(files, 'index.html')) {
return [path.join(aPath, 'index.html')];
}
const children = await expandDirectories(path.join(baseDir, aPath), files);
return children.map((child) => path.join(aPath, child));
}