Mailspring/app/build/tasks/docs-build-task.js
Ben Gotow 149b389508
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-04 11:03:12 -08:00

150 lines
4.4 KiB
JavaScript

const path = require('path');
const rimraf = require('rimraf');
const fs = require('fs-plus');
var fs_extra = require('fs-extra');
const joanna = require('joanna');
const tello = require('tello');
module.exports = function(grunt) {
let { cp, mkdir, rm } = grunt.config('taskHelpers');
let getClassesToInclude = function() {
let modulesPath = path.resolve(__dirname, '..', '..', 'internal_packages');
let classes = {};
fs.traverseTreeSync(modulesPath, function(modulePath) {
// Don't traverse inside dependencies
if (modulePath.match(/node_modules/g)) {
return false;
}
// Don't traverse blacklisted packages (that have docs, but we don't want to include)
if (path.basename(modulePath) !== 'package.json') {
return true;
}
if (!fs.isFileSync(modulePath)) {
return true;
}
let apiPath = path.join(path.dirname(modulePath), 'api.json');
if (fs.isFileSync(apiPath)) {
Object.assign(classes, grunt.file.readJSON(apiPath).classes);
}
return true;
});
return classes;
};
let sortClasses = function(classes) {
let sortedClasses = {};
for (let className of Array.from(Object.keys(classes).sort())) {
sortedClasses[className] = classes[className];
}
return sortedClasses;
};
return grunt.registerTask('docs-build', 'Builds the API docs in src', function() {
grunt.log.writeln('Time to build the docs!');
let done = this.async();
let classDocsOutputDir = grunt.config.get('classDocsOutputDir');
let cjsxOutputDir = path.join(classDocsOutputDir, 'temp-cjsx');
return rimraf(cjsxOutputDir, function() {
let api;
fs.mkdir(cjsxOutputDir);
let srcPath = path.resolve(__dirname, '..', '..', 'src');
const blacklist = ['legacy-edgehill-api', 'edgehill-api'];
let in_blacklist = function(file) {
for (var i = 0; i < blacklist.length; i++) {
if (file.indexOf(blacklist[i]) >= 0) {
return true;
}
}
return false;
};
fs.traverseTreeSync(srcPath, function(file) {
if (in_blacklist(file)) {
console.log('Skipping ' + file);
// Skip K2
} else if (path.extname(file) === '.jsx') {
console.log('Transforming ' + file);
let fileStr = grunt.file.read(file);
let transformed = require('babel-core').transform(fileStr, {
plugins: ['transform-react-jsx', 'transform-class-properties'],
presets: ['react', 'electron'],
});
grunt.file.write(
path.join(cjsxOutputDir, path.basename(file).slice(0, -3 || undefined) + 'js'),
transformed.code
);
} else if (path.extname(file) === '.js') {
let dest_path = path.join(cjsxOutputDir, path.basename(file));
console.log('Copying ' + file + ' to ' + dest_path);
fs_extra.copySync(file, dest_path);
}
return true;
});
// DEBUG
// Use to check individual files
var js_files = [];
fs.traverseTreeSync(cjsxOutputDir, function(file) {
if (path.extname(file) === '.js') {
console.log('testing joanna on ' + file);
let meta = joanna([file]);
console.log('testing tello on ' + file);
tello.digest(meta);
console.log('passed');
}
});
fs.traverseTreeSync(cjsxOutputDir, function(file) {
if (path.extname(file) === '.js') {
js_files.push(file.toString());
}
});
console.log(js_files);
grunt.log.ok('---- Starting Jonna (jsx metadata)----');
let metadata = joanna(js_files);
grunt.log.ok('---- Done with Joanna (jsx metadata)----');
grunt.file.write('/tmp/metadata.json', JSON.stringify(metadata, null, 2));
try {
api = tello.digest(metadata);
} catch (e) {
console.log(e);
console.log(e.stack);
console.log(metadata);
return;
}
console.log('---- Done with Tello ----');
Object.assign(api.classes, getClassesToInclude());
console.log(api.classes);
api.classes = sortClasses(api.classes);
console.log(api.classes);
let apiJson = JSON.stringify(api, null, 2);
let apiJsonPath = path.join(classDocsOutputDir, 'api.json');
grunt.file.write(apiJsonPath, apiJson);
return done();
});
});
};