Fix documentation generation, clean up ./app package dependencies

This commit is contained in:
Ben Gotow 2017-08-11 11:38:25 -07:00
parent 9292885494
commit c549fcc8ba
10 changed files with 172 additions and 252 deletions

1
.gitignore vendored
View file

@ -65,3 +65,4 @@ scripts/venv
client_secret.json
/app/MailSync
/logfile.txt
/app/dist-docs

View file

@ -23,7 +23,7 @@ module.exports = (grunt) => {
'rootDir': path.resolve('./'),
'buildDir': buildDir,
'appDir': appDir,
'classDocsOutputDir': './docs_src/classes',
'classDocsOutputDir': path.join(buildDir, 'docs_src', 'classes'),
'outputDir': path.join(appDir, 'dist'),
'appJSON': grunt.file.readJSON(path.join(appDir, 'package.json')),
'source:coffeescript': [
@ -59,7 +59,11 @@ module.exports = (grunt) => {
grunt.loadTasks(tasksDir);
grunt.file.setBase(appDir);
grunt.registerTask('docs', ['docs-build', 'docs-render']);
grunt.registerTask('docs', [
'docs-build',
'docs-render',
]);
grunt.registerTask('lint', [
'eslint',
'lesslint',

View file

@ -0,0 +1,100 @@
# Nylas Mail SDK
* Nylas Mail SDK Guides
* [Introduction](/README.md)
* [Getting Started](/guides/GettingStarted.md)
* [Getting Started Part 2](/guides/GettingStarted-2.md)
* [Building a Package](/guides/PackageOverview.md)
* [Interface Concepts](/guides/InterfaceConcepts.md)
* [UI Components](/guides/React.md)
* [Application Architecture](/guides/Architecture.md)
* [Debugging Nylas Mail](/guides/Debugging.md)
* [Accessing the Database](/guides/Database.md)
* [Extending the Composer](/guides/ComposerExtensions.md)
* [Writing Tests](/guides/WritingSpecs.md)
* [Integration Testing](/guides/IntegrationTesting.md)
* [Developing on Windows](/guides/Windows.md)
* [FAQ](/guides/FAQ.md)
----
### Full Class Reference
* General
* [Actions](/classes/Actions.md)
* [BufferedProcess](/classes/BufferedProcess.md)
* [ChangeFolderTask](/classes/ChangeFolderTask.md)
* [ChangeLabelsTask](/classes/ChangeLabelsTask.md)
* [ChangeMailTask](/classes/ChangeMailTask.md)
* [Color](/classes/Color.md)
* [Config](/classes/Config.md)
* [Contenteditable](/classes/Contenteditable.md)
* [KeyCommandsRegion](/classes/KeyCommandsRegion.md)
* [NylasEnvConstructor](/classes/NylasEnvConstructor.md)
* [QueryResultSet](/classes/QueryResultSet.md)
* [QuerySubscriptionPool](/classes/QuerySubscriptionPool.md)
* [StyleManager](/classes/StyleManager.md)
* [Task](/classes/Task.md)
* [TaskQueueStatusStore](/classes/TaskQueueStatusStore.md)
* [ThemeManager](/classes/ThemeManager.md)
* Component Kit
* [EventedIFrame](/classes/EventedIFrame.md)
* [Flexbox](/classes/Flexbox.md)
* [InjectedComponent](/classes/InjectedComponent.md)
* [InjectedComponentSet](/classes/InjectedComponentSet.md)
* [Menu](/classes/Menu.md)
* [MenuItem](/classes/MenuItem.md)
* [MenuNameEmailItem](/classes/MenuNameEmailItem.md)
* [MultiselectActionBar](/classes/MultiselectActionBar.md)
* [MultiselectList](/classes/MultiselectList.md)
* [ResizableRegion](/classes/ResizableRegion.md)
* [RetinaImg](/classes/RetinaImg.md)
* [Spinner](/classes/Spinner.md)
* [UnsafeComponent](/classes/UnsafeComponent.md)
* Extensions
* [ComposerExtension](/classes/ComposerExtension.md)
* [ContenteditableExtension](/classes/ContenteditableExtension.md)
* [DraftStoreExtension](/classes/DraftStoreExtension.md)
* [MessageStoreExtension](/classes/MessageStoreExtension.md)
* [MessageViewExtension](/classes/MessageViewExtension.md)
* Models
* [Contact](/classes/Contact.md)
* [Message](/classes/Message.md)
* [Model](/classes/Model.md)
* [Thread](/classes/Thread.md)
* Stores
* [AccountStore](/classes/AccountStore.md)
* [ComponentRegistry](/classes/ComponentRegistry.md)
* [ContactStore](/classes/ContactStore.md)
* [FocusedContentStore](/classes/FocusedContentStore.md)
* [TaskQueue](/classes/TaskQueue.md)
* [WorkspaceStore](/classes/WorkspaceStore.md)
* Database
* [Attribute](/classes/Attribute.md)
* [AttributeBoolean](/classes/AttributeBoolean.md)
* [AttributeCollection](/classes/AttributeCollection.md)
* [AttributeDateTime](/classes/AttributeDateTime.md)
* [AttributeJoinedData](/classes/AttributeJoinedData.md)
* [AttributeNumber](/classes/AttributeNumber.md)
* [AttributeObject](/classes/AttributeObject.md)
* [AttributeServerId](/classes/AttributeServerId.md)
* [AttributeString](/classes/AttributeString.md)
* [DatabaseStore](/classes/DatabaseStore.md)
* [Matcher](/classes/Matcher.md)
* [ModelQuery](/classes/ModelQuery.md)
* [SortOrder](/classes/SortOrder.md)
* Drafts
* [DraftChangeSet](/classes/DraftChangeSet.md)
* [DraftEditingSession](/classes/DraftEditingSession.md)
* [DraftStore](/classes/DraftStore.md)
* NylasEnv
* [PackageManager](/classes/PackageManager.md)
* Atom

View file

@ -99,7 +99,7 @@ module.exports = function(grunt) {
let transformed = require("babel-core").transform(fileStr, {
plugins: ["transform-react-jsx",
"transform-class-properties"],
presets: ['react', 'stage-2']
presets: ['react', 'electron']
});
grunt.file.write(path.join(cjsxOutputDir, path.basename(file).slice(0, -3 || undefined)+'js'), transformed.code);
@ -112,7 +112,7 @@ module.exports = function(grunt) {
let transformed = require("babel-core").transform(fileStr, {
plugins: ["transform-class-properties",
"transform-function-bind"],
presets: ['react', 'stage-2']
presets: ['react', 'electron']
});

View file

@ -1,177 +0,0 @@
const path = require('path');
const cjsxtransform = require('coffee-react-transform');
const rimraf = require('rimraf');
const fs = require('fs-plus');
const _ = require('underscore');
const donna = require('donna');
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.join(grunt.config('appDir'), '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;
};
var processFields = function(json, fields, tasks) {
let val;
if (fields == null) { fields = []; }
if (tasks == null) { tasks = []; }
if (json instanceof Array) {
return (() => {
let result = [];
for (val of Array.from(json)) {
result.push(processFields(val, fields, tasks));
}
return result;
})();
} else {
return (() => {
let result1 = [];
for (let key in json) {
val = json[key];
let item;
if (Array.from(fields).includes(key)) {
for (let task of Array.from(tasks)) {
val = task(val);
}
json[key] = val;
}
if (_.isObject(val)) {
item = processFields(val, fields, tasks);
}
result1.push(item);
}
return result1;
})();
}
};
return grunt.registerTask('docs', 'Builds the API docs in src', function() {
grunt.log.writeln("Time to build the docs!")
let done = this.async();
// Convert CJSX into coffeescript that can be read by Donna
// let classDocsOutputDir = grunt.config.get('classDocsOutputDir');
let classDocsOutputDir = '~/Desktop/Nylas Mail Docs/'
let cjsxOutputDir = path.join(classDocsOutputDir, 'temp-cjsx');
return rimraf(cjsxOutputDir, function() {
let api;
fs.mkdir(cjsxOutputDir);
let srcPath = path.resolve(grunt.config('appDir'), 'src');
fs.traverseTreeSync(srcPath, function(file) {
if (file.indexOf('/K2/') > 0) {
// Skip K2
}
else if (path.extname(file) === '.cjsx') { // Should also look for jsx and es6
let transformed = cjsxtransform(grunt.file.read(file));
// Only attempt to parse this file as documentation if it contains
// real Coffeescript classes.
if (transformed.indexOf('\nclass ') > 0) {
grunt.log.writeln("Found class in file: " + file)
grunt.file.write(path.join(cjsxOutputDir, path.basename(file).slice(0, -5 + 1 || undefined)+'coffee'), transformed);
}
}
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', 'stage-2']
});
if (transformed.code.indexOf('class ') > 0) {
grunt.log.writeln("Found class in file: " + file)
grunt.file.write(path.join(cjsxOutputDir, path.basename(file).slice(0, -3 || undefined)+'js'), transformed.code);
}
}
return true;
});
grunt.log.ok('Done transforming, starting donna extraction')
grunt.log.writeln('cjsxOutputDir: ' + cjsxOutputDir)
// Process coffeescript source
let metadata = donna.generateMetadata([cjsxOutputDir]);
grunt.log.ok('---- Done with Donna (cjsx metadata)----');
console.log(js_files);
var js_files = []
fs.traverseTreeSync(cjsxOutputDir, function(file) {
if (path.extname(file) === '.js') {
js_files.push(file.toString())
}
});
console.log(js_files);
let jsx_metadata = joanna(js_files);
grunt.log.ok('---- Done with Joanna (jsx metadata)----');
Object.assign(metadata, jsx_metadata);
console.log(metadata);
try {
api = tello.digest(metadata);
} catch (e) {
console.log(e.stack);
}
console.log('---- Done with Tello ----');
Object.assign(api.classes, getClassesToInclude());
api.classes = sortClasses(api.classes);
let apiJson = JSON.stringify(api, null, 2);
let apiJsonPath = path.join(classDocsOutputDir, 'api.json');
grunt.file.write(apiJsonPath, apiJson);
return done();
});
});
};

View file

@ -5,13 +5,6 @@
"description": "The best email app for people and teams at work",
"license": "GPL-3.0",
"main": "./src/browser/main.js",
"repository": {
"type": "git",
"url": "https://github.com/nylas/nylas-mail.git"
},
"bugs": {
"url": "https://github.com/nylas/nylas-mail/issues"
},
"dependencies": {
"async": "^0.9",
"babel-core": "6.22.0",
@ -81,32 +74,7 @@
"underscore.string": "^3.0",
"windows-shortcuts": "emorikawa/windows-shortcuts#b0a0fc7"
},
"devDependencies": {
"donna": "^1.0.15",
"esdoc": "^0.5.2",
"esdoc-es7-plugin": "0.0.3",
"gitbook": "^3.2.2",
"gitbook-cli": "^2.3.0",
"gitbook-plugin-anchors": "^0.7.1",
"gitbook-plugin-editlink": "^1.0.2",
"gitbook-plugin-favicon": "0.0.2",
"gitbook-plugin-github": "^2.0.0",
"gitbook-plugin-theme-api": "^1.1.2",
"handlebars": "4.0.6",
"joanna": "0.0.8",
"meta-marked": "0.4.2",
"tello": "1.0.6"
},
"optionalDependencies": {
"node-mac-notifier": "0.0.13"
},
"packageDependencies": {},
"scripts": {
"test": "electron . --test --enable-logging",
"test-window": "electron . --test=window --enable-logging",
"test-junit": "electron . --test --enable-logging --junit-xml=junitxml",
"start": "electron . --dev --enable-logging",
"lint": "script/grunt lint",
"build": "script/grunt build"
}
}

View file

@ -1,19 +0,0 @@
#!/bin/bash
set -e
# Builds docs and moves the output to gh-pages branch (overwrites)
mkdir -p _docs_output
script/grunt docs
./node_modules/.bin/gitbook --gitbook=latest build . ./_docs_output --log=debug --debug
rm -r docs_src/classes
git checkout gh-pages --quiet
cp -rf _docs_output/* .
# rm -r _docs_output
git add .
git status -s
printf "\nDocs updated! \n\n"
git commit -m 'Update Docs'
git push origin gh-pages
git checkout master

36
book.json Normal file
View file

@ -0,0 +1,36 @@
{
"gitbook": "3.2.2",
"title": "Merani Plugin SDK",
"root": "./app/build/docs_src/",
"plugins": [
"search",
"lunr",
"-fontsettings",
"-sharing",
"anchors",
"github",
"editlink",
"favicon"
],
"pluginsConfig": {
"editlink": {
"base": "https://github.com/Foundry376/Merani/tree/master",
"label": "Edit This Page",
"multilingual": false
},
"github": {
"url": "https://github.com/Foundry376/Merani"
},
"favicon": {
"shortcut": "/img/favicon.png"
}
},
"links": {
"sharing": {
"facebook": false,
"twitter": false
}
}
}

View file

@ -1,7 +1,17 @@
{
"name": "nylas-mail-all",
"name": "merani-root",
"version": "0.0.1",
"description": "All components required to run Nylas Mail",
"description": "Packages required to develop and build Merani",
"author": "Merani",
"license": "GPL-3.0",
"repository": {
"type": "git",
"url": "git+https://github.com/Foundry376/Merani.git"
},
"engines": {
"node": "6.9.1",
"npm": "3.10.8"
},
"devDependencies": {
"babel-cli": "6.x.x",
"babel-core": "6.x.x",
@ -12,6 +22,7 @@
"coffeelint-cjsx": "2.x.x",
"commander": "^2.9.0",
"devtron": "^1.4.0",
"donna": "^1.0.16",
"electron-installer-dmg": "0.2.x",
"electron-packager": "8.4.x",
"electron-winstaller": "2.x.x",
@ -23,6 +34,12 @@
"eslint_d": "4.2.0",
"fs-extra": "2.x.x",
"fs-plus": "2.x.x",
"gitbook-cli": "^2.3.2",
"gitbook-plugin-anchors": "^0.7.1",
"gitbook-plugin-editlink": "^1.0.2",
"gitbook-plugin-favicon": "0.0.2",
"gitbook-plugin-github": "^2.0.0",
"gitbook-plugin-theme-api": "^1.1.2",
"glob": "7.x.x",
"grunt": "0.4.x",
"grunt-cli": "0.1.x",
@ -32,35 +49,25 @@
"grunt-contrib-csslint": "0.5.x",
"grunt-contrib-less": "0.8.x",
"grunt-lesslint": "0.13.x",
"handlebars": "^4.0.10",
"jasmine": "2.x.x",
"joanna": "0.0.9",
"load-grunt-parent-tasks": "0.1.1",
"meta-marked": "^0.4.2",
"mkdirp": "^0.5.1",
"pm2": "2.4.0",
"request": "2.x.x",
"rimraf": "^2.6.1",
"temp": "0.8.x",
"underscore": "1.8.x"
},
"scripts": {
"postinstall": "node scripts/postinstall.js",
"start": "app/node_modules/.bin/electron ./app --enable-logging --dev",
"lint": "grunt lint --gruntfile=app/build/Gruntfile.js --base=./",
"test": "app/node_modules/.bin/electron ./app --enable-logging --test",
"test-window": "app/node_modules/.bin/electron ./app --enable-logging --test=window",
"test-junit": "",
"lint": "grunt lint --gruntfile=app/build/Gruntfile.js --base=./",
"build": "grunt build-client --gruntfile=app/build/Gruntfile.js --base=./",
"upload": "grunt upload-client --gruntfile=app/build/Gruntfile.js --base=./",
"postinstall": "node scripts/postinstall.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/nylas/nylas-mail-all.git"
},
"author": "Nylas",
"license": "GPL-3.0",
"engines": {
"node": "6.9.1",
"npm": "3.10.8"
},
"dependencies": {
"rimraf": "^2.6.1"
"build-docs": "grunt docs --gruntfile=app/build/Gruntfile.js --base=./ && mkdir -p app/dist-docs && cp README.md ./app/build/docs_src/README.md && gitbook --gitbook=latest build . ./app/dist-docs --log=debug --debug && rm ./app/build/docs_src/README.md && rm -rf ./app/build/docs_src/classes"
}
}

View file

@ -209,7 +209,7 @@ async function main(args) {
await spawn('npm', ['install'], {env: {}})
await spawn('npm', ['run', 'build-client'], {env: {SIGN_BUILD: true}})
await spawn('codesign', ['--verify', '--deep', '--verbose=2', '"app/dist/Nylas Mail-darwin-x64/Nylas Mail.app"'])
await spawn('npm', ['run', 'upload-client'])
// await spawn('npm', ['run', 'upload-client'])
} catch (err) {
console.error('Errored while running build')
console.error(err)