Mailspring/app/spec/spec-runner/spec-loader.ts

109 lines
3 KiB
TypeScript
Raw Normal View History

2016-10-18 08:59:33 +08:00
/* eslint global-require: 0 */
/* eslint import/no-dynamic-require: 0 */
import _ from 'underscore';
import fs from 'fs-plus';
import path from 'path';
class N1SpecLoader {
loadSpecs(loadSettings, jasmineEnv) {
2017-09-27 02:33:08 +08:00
this.jasmineEnv = jasmineEnv;
this.loadSettings = loadSettings;
if (this.loadSettings.specDirectory) {
this._loadSpecsInDir(this.loadSettings.specDirectory);
this._setSpecType('user');
} else {
2017-09-27 02:33:08 +08:00
this._loadAllSpecs();
}
}
_loadAllSpecs() {
2017-09-27 02:33:08 +08:00
const { resourcePath } = this.loadSettings;
this._loadSpecsInDir(path.join(resourcePath, 'spec'));
this._setSpecType('core');
const fixturesPackagesPath = path.join(__dirname, 'fixtures', 'packages');
// EDGEHILL_CORE: Look in internal_packages instead of node_modules
let packagePaths = [];
2017-09-27 02:33:08 +08:00
const iterable = fs.listSync(path.join(resourcePath, 'internal_packages'));
for (let i = 0; i < iterable.length; i++) {
const packagePath = iterable[i];
if (fs.isDirectorySync(packagePath)) {
packagePaths.push(packagePath);
}
}
packagePaths = _.uniq(packagePaths);
2017-09-27 02:33:08 +08:00
packagePaths = _.groupBy(packagePaths, packagePath => {
if (packagePath.indexOf(`${fixturesPackagesPath}${path.sep}`) === 0) {
return 'fixtures';
} else if (packagePath.indexOf(`${resourcePath}${path.sep}`) === 0) {
return 'bundled';
}
return 'user';
});
// Run bundled package specs
const iterable1 = packagePaths.bundled != null ? packagePaths.bundled : [];
for (let j = 0; j < iterable1.length; j++) {
const packagePath = iterable1[j];
this._loadSpecsInDir(path.join(packagePath, 'specs'));
}
this._setSpecType('bundled');
// Run user package specs
const iterable2 = packagePaths.user != null ? packagePaths.user : [];
for (let k = 0; k < iterable2.length; k++) {
const packagePath = iterable2[k];
this._loadSpecsInDir(path.join(packagePath, 'specs'));
}
return this._setSpecType('user');
}
_loadSpecsInDir(specDirectory) {
const { specFilePattern } = this.loadSettings;
Replace Babel with TypeScript compiler, switch entire app to TypeScript 🎉 (#1404) * Switch to using Typescript instead of Babel * Switch all es6 / jsx file extensions to ts / tsx * Convert Utils to a TS module from module.exports style module * Move everything from module.exports to typescript exports * Define .d.ts files for mailspring-exports and component kit… Yes it seems this is the best option :( * Load up on those @types * Synthesize TS types from PropTypes for standard components * Add types to Model classes and move constructor constants to instance vars * 9800 => 7700 TS errors * 7700 => 5600 TS errors * 5600 => 5330 TS errors * 5330 => 4866 TS errors * 4866 => 4426 TS errors * 4426 => 2411 TS errors * 2411 > 1598 TS errors * 1598 > 769 TS errors * 769 > 129 TS errors * 129 > 22 TS errors * Fix runtime errors * More runtime error fixes * Remove support for custom .es6 file extension * Remove a few odd remaining references to Nylas * Don’t ship Typescript support in the compiled app for now * Fix issues in compiled app - module resolution in TS is case sensitive? * README updates * Fix a few more TS errors * Make “No Signature” option clickable + selectable * Remove flicker when saving file and reloading keymaps * Fix mail rule item height in preferences * Fix missing spacing in thread sharing popover * Fix scrollbar ticks being nested incorrectly * Add Japanese as a manually reviewed language * Prevent the thread list from “sticking” * Re-use Sheet when switching root tabs, prevent sidebar from resetting * Ensure specs run * Update package configuration to avoid shpping types * Turn eslint back on - we will opt-in to the TS rules one by one
2019-03-05 03:03:12 +08:00
let regex = /-spec\.(js|jsx|es6|es|ts|tsx)$/;
if (typeof specFilePattern === 'string' && specFilePattern.length > 0) {
regex = new RegExp(specFilePattern);
}
for (const specFilePath of fs.listTreeSync(specDirectory)) {
if (regex.test(specFilePath)) {
try {
require(specFilePath);
} catch (err) {
throw new Error(`Error requiring spec file: ${specFilePath}: ${err.toString()}`);
}
}
}
2017-09-27 02:33:08 +08:00
this._setSpecDirectory(specDirectory);
}
_setSpecDirectory(specDirectory) {
this._setSpecField('specDirectory', specDirectory);
}
_setSpecField(name, value) {
const specs = this.jasmineEnv.currentRunner().specs();
2017-09-27 02:33:08 +08:00
if (specs.length === 0) {
return;
}
for (let i = 0; i < specs.length; i++) {
if (specs[i][name]) break;
2017-09-27 02:33:08 +08:00
specs[i][name] = value;
}
}
_setSpecType(specType) {
this._setSpecField('specType', specType);
}
}
2017-09-27 02:33:08 +08:00
export default new N1SpecLoader();