'use strict'; const donna = require('donna'); const tello = require('tello'); const joanna = require('joanna'); const glob = require('glob'); const fs = require('fs-extra'); const path = require('path'); const CONFIG = require('../config'); module.exports = function() { const generatedJSONPath = path.join(CONFIG.docsOutputPath, 'atom-api.json'); console.log(`Generating API docs at ${generatedJSONPath}`); // Unfortunately, correct relative paths depend on a specific working // directory, but this script should be able to run from anywhere, so we // muck with the cwd temporarily. const oldWorkingDirectoryPath = process.cwd(); process.chdir(CONFIG.repositoryRootPath); const coffeeMetadata = donna.generateMetadata(['.'])[0]; const jsMetadata = joanna(glob.sync(`src/**/*.js`)); process.chdir(oldWorkingDirectoryPath); const metadata = { repository: coffeeMetadata.repository, version: coffeeMetadata.version, files: Object.assign(coffeeMetadata.files, jsMetadata.files) }; const api = tello.digest([metadata]); Object.assign(api.classes, getAPIDocsForDependencies()); api.classes = sortObjectByKey(api.classes); fs.mkdirpSync(CONFIG.docsOutputPath); fs.writeFileSync(generatedJSONPath, JSON.stringify(api, null, 2)); }; function getAPIDocsForDependencies() { const classes = {}; for (let apiJSONPath of glob.sync( `${CONFIG.repositoryRootPath}/node_modules/*/api.json` )) { Object.assign(classes, require(apiJSONPath).classes); } return classes; } function sortObjectByKey(object) { const sortedObject = {}; for (let keyName of Object.keys(object).sort()) { sortedObject[keyName] = object[keyName]; } return sortedObject; }