diff --git a/builder/dependencies.js b/builder/dependencies.js index 7cd877d..f4d9f48 100644 --- a/builder/dependencies.js +++ b/builder/dependencies.js @@ -1,55 +1,76 @@ "use strict"; -var YAML = require('js-yaml'); +var fs = require('fs'); var path = require('path'); -var fs = require("fs"); -var getFiles = require('../lib/getFiles'); -var projectPath = require('../lib/projectPath'); -var packager = require('mootools-packager'); +var async = require('async'); +var YAML = require('js-yaml'); +var pkg = require('../package.json'); var DESC_REGEXP = /\/\*\s*^---([\s\S]+?)^(?:\.\.\.|---)\s*\*\//mg; function makeString(type){ if (!type) return ''; return typeof type == 'string' ? type : type.join(', '); } -function capitalise(name){ - return name.charAt(0).toUpperCase() + name.slice(1); -} - - -module.exports = function(project, version){ - var isCore = project == 'core'; - var sourcePath = { - Core: projectPath('core', version) - }; - if (!isCore) sourcePath[capitalise(project)] = projectPath(project, version); +function getPackageYML(project, version, callback){ + var file = path.join(__dirname, '..', pkg._buildOutput, project, 'docs', project + '-' + version, 'package.yml'); + fs.readFile(file, 'utf-8', function(err, data){ + var modules = YAML.load(data).sources.map(function(module){ + return path.basename(module, '.js'); + }); + callback(err, modules); + }); +} - var packagerOptions = { - name: sourcePath, - noOutput: true, - removeCoreDependencies: !isCore, - callback: function(src){ - var headers = src.match(DESC_REGEXP); - headers.forEach(function(header){ - var yamlHeader = YAML.load(header.slice(2, -2)); - filesInfo[yamlHeader.name] = { - req: makeString(yamlHeader.requires), - prov: makeString(yamlHeader.provides), - desc: yamlHeader.description - }; +function getHeaders(project, version, callback){ + var SourceFolder = path.join(__dirname, '..', pkg._buildOutput, project, 'docs', project + '-' + version, 'Source'); + fs.readdir(SourceFolder, function(err, subFolders){ + subFolders = subFolders.filter(function(file){ + var filePath = path.join(SourceFolder, file); + return fs.statSync(filePath).isDirectory(); + }); + async.map(subFolders, function(folder, cbFolder){ + var subFolder = path.join(SourceFolder, folder); + fs.readdir(subFolder, function(err, files){ + async.map(files, function(file, cbFile){ + var filePath = path.join(subFolder, file); + fs.readFile(filePath, 'utf-8', function(err, src){ + var header = src.match(DESC_REGEXP)[0]; + var yaml = YAML.load(header.slice(2, -2)); + cbFile(err, !err && { + name: yaml.name, + file: path.basename(file, '.js'), + req: makeString(yaml.requires), + prov: makeString(yaml.provides), + desc: yaml.description + }); + }); + }, function(err, files){ + cbFolder(err, files); + }); }); - } - }; - - var sourceFiles = Object.keys(sourcePath).map(function(proj){ - return sourcePath[proj]; - }).reduce(function(files, folder){ - var folderPath = path.join(__dirname, '/../', folder); - return getFiles(folderPath, files, '.js'); - }, []); + }, function(err, headers){ + callback(err, headers); + }); + }); +} - var filesInfo = {}; - packager(sourceFiles, packagerOptions); - return filesInfo; +module.exports = function(project, version, callback){ + async.parallel([ + async.apply(getPackageYML, project, version), + async.apply(getHeaders, project, version) + ], function(err, res){ + + var headers = res[1].reduce(function(a, b){ + return a.concat(b); + }); + var orderedModules = res[0].map(function(module, i){ + return headers.filter(function(obj){ + return obj.name == module || obj.file == module; + })[0]; + }); + if (orderedModules.length != headers.length) console.log('Err: package.yml and Source files missmatch'); + callback(err, !err && orderedModules); + }); }; + diff --git a/core/index.js b/core/index.js index 221cc6f..880a7ae 100644 --- a/core/index.js +++ b/core/index.js @@ -10,21 +10,39 @@ var guides = require('../middleware/guides')(project, { title: "MooTools Core Guides" }); +var fs = require('fs'); +var path = require('path'); +var async = require('async'); +var debounce = require('../lib/debounce'); +var waitForIt = require('../lib/waitForIt'); var hash = require('../middleware/buildHash')(project); -var pkgProject = require('../package.json')._projects[project]; -var versions = pkgProject.versions; +var pkgReader = require('../middleware/packageJSONreader')(project); +var pkgProject = pkgReader(); -var links = versions.slice(1).map(function(version){ - return { - version: version, - files: ['compat', 'yui-compressed', 'nocompat', 'nocompat-yui-compressed'].map(function(key){ - return { - link: 'http://ajax.googleapis.com/ajax/libs/mootools/'+ version + '/mootools' + ((key == 'compat') ? '' : '-' + key) + '.js', - label: key - }; - }) - }; -}); +var loadPackages = waitForIt(async.apply(require('../builder/dependencies.js'), project, pkgProject.lastVersion)); +var dir = path.join(__dirname, '..', pkgProject.buildOutput, project, 'docs'); + +function getLinks(versions){ + return versions.slice(1).map(function(version){ + return { + version: version, + files: ['compat', 'yui-compressed', 'nocompat', 'nocompat-yui-compressed'].map(function(key){ + var link = 'http://ajax.googleapis.com/ajax/libs/mootools/'+ version + '/mootools' + ((key == 'compat') ? '' : '-' + key) + '.js'; + return {link: link, label: key}; + }) + }; + }); +}; +var links = getLinks(pkgProject.versions); + +fs.watch(dir, debounce(function(){ + console.log('resetting ' + dir + ' docs data'); + loadPackages.reset(); + + console.log('resetting package.json data'); + pkgProject = pkgReader(); + links = getLinks(pkgProject.versions); +})); module.exports = function(app){ @@ -38,20 +56,22 @@ module.exports = function(app){ title: "MooTools Core", navigation: 'core', project: 'Core', - version: versions[0], + version: pkgProject.lastVersion, versions: links }); }); app.get('/core/builder/:hash?', hash, core, function(req, res){ - res.render('builder/index', { - title: 'MooTools Core Builder', - navigation: 'builder', - project: 'Core', - hashDependencies: res.locals.hash || [], - version: versions[0], - versions: links, - dependencies: require('../builder/dependencies.js')(project, versions[0]) + loadPackages.get(function(err, packages){ + res.render('builder/index', { + title: 'MooTools Core Builder', + navigation: 'builder', + project: 'Core', + hashDependencies: res.locals.hash || [], + version: pkgProject.lastVersion, + versions: links, + dependencies: packages + }); }); }); diff --git a/middleware/packageJSONreader.js b/middleware/packageJSONreader.js new file mode 100644 index 0000000..ddd6ad3 --- /dev/null +++ b/middleware/packageJSONreader.js @@ -0,0 +1,19 @@ +"use strict"; + +var fs = require('fs'); +var path = require('path'); + +module.exports = function(project){ + + return function(){ + var pkgPath = path.join(__dirname, '..', 'package.json'); + if (require.cache[pkgPath]) delete require.cache[pkgPath]; + var pkg = require(pkgPath); + + return { + buildOutput: pkg._buildOutput, + versions: pkg._projects[project].versions, + lastVersion: pkg._projects[project].versions[0] + } + } +}; diff --git a/more/index.js b/more/index.js index 2ca2e2d..5fc4a57 100644 --- a/more/index.js +++ b/more/index.js @@ -10,10 +10,26 @@ var guides = require('../middleware/guides')(project, { title: "MooTools More Guides" }); +var fs = require('fs'); +var path = require('path'); +var async = require('async'); +var debounce = require('../lib/debounce'); +var waitForIt = require('../lib/waitForIt'); var hash = require('../middleware/buildHash')(project); +var pkgReader = require('../middleware/packageJSONreader')(project); +var pkgProject = pkgReader(); -var pkgProject = require('../package.json')._projects[project]; -var lastVersion = pkgProject.versions[0]; +var loadPackages = waitForIt(async.apply(require('../builder/dependencies.js'), project, pkgProject.lastVersion)); +var dir = path.join(__dirname, '..', pkgProject.buildOutput, project, 'docs'); + +fs.watch(dir, debounce(function(){ + console.log('resetting ' + dir + ' docs data'); + loadPackages.reset(); + + console.log('resetting package.json data'); + pkgProject = pkgReader(); + console.log(pkgProject); +})); module.exports = function(app){ @@ -26,19 +42,21 @@ module.exports = function(app){ res.render('more/index', { navigation: 'more', project: 'More', - version: lastVersion, + version: pkgProject.lastVersion, title: "MooTools More" }); }); app.get('/more/builder/:hash?', hash, more, function(req, res){ - res.render('builder/index', { - title: 'MooTools More Builder', - navigation: 'builder', - project: 'More', - hashDependencies: res.locals.hash || [], - version: lastVersion, - dependencies: require('../builder/dependencies.js')(project, lastVersion) + loadPackages.get(function(err, packages){ + res.render('builder/index', { + title: 'MooTools More Builder', + navigation: 'builder', + project: 'More', + hashDependencies: res.locals.hash || [], + version: pkgProject.lastVersion, + dependencies: packages + }); }); }); diff --git a/views/builder/index.jade b/views/builder/index.jade index 11f98a0..29bb91d 100644 --- a/views/builder/index.jade +++ b/views/builder/index.jade @@ -51,13 +51,13 @@ block main td Provides td Description - each yaml, module in dependencies - - var file = project + "/" + module; + each yaml in dependencies + - var file = project + "/" + yaml.name; - var hashRequested = hashDependencies.indexOf(file) != -1; tr td input(type="checkbox", value=file, name="modules[]", data-provides="#{yaml.prov}", data-requires="#{yaml.req}", checked=hashRequested, class=hashRequested ? "activeChoice" : "") - td #{module} + td #{yaml.name} td #{yaml.prov} td #{yaml.desc}