chore(): begin adding ionic components to mono-repo.

This commit is contained in:
Josh Thomas
2017-06-21 09:33:06 -05:00
parent 1181fe98fc
commit bd5b67304d
2159 changed files with 15687 additions and 147 deletions

View File

@ -0,0 +1,75 @@
module.exports = function collectInputsOutputs() {
return {
$runBefore: ['rendering-docs'],
$process: function(docs) {
docs.forEach(function(doc) {
if (doc.members && doc.members.length) {
var members = [];
var inputs = [];
var outputs = [];
memberLoop:
for (var i in doc.members) {
// identify properties to differentiate from methods
if (typeof doc.members[i].parameters == 'undefined') {
doc.members[i].isProperty = true;
}
if (doc.members[i].decorators && doc.members[i].decorators.length) {
decoratorLoop:
for (var ii in doc.members[i].decorators) {
if (doc.members[i].decorators[ii].name == 'Input') {
inputs.push(parseMember(doc.members[i]));
continue memberLoop;
}
if (doc.members[i].decorators[ii].name == 'Output') {
outputs.push(parseMember(doc.members[i]));
continue memberLoop;
}
}
// not an input or output, must be a plain member
members.push(doc.members[i]);
} else {
members.push(doc.members[i]);
};
}
// update doc with pruned members list and add inputs and outputs
doc.members = members.sort(alphabetize);
doc.inputs = inputs.sort(alphabetize);
doc.outputs = outputs.sort(alphabetize);
}
function alphabetize(a, b) {
if (!a.name) {
return 1;
} else if (!b.name) {
return -1;
} else if (a.name < b.name) {
return -1;
} else if (a.name > b.name) {
return 1;
}
return 0;
}
function parseMember(member) {
member.type = member.content.substring(
member.content.indexOf('{') + 1,
member.content.indexOf('}')
);
member.description = member.content.substring(
member.content.indexOf('}') + 1,
member.content.length
);
return member;
}
});
}
};
};

View File

@ -0,0 +1,19 @@
module.exports = function removePrivateApi() {
return {
name: 'remove-private-api',
description: 'Prevent the private apis from being rendered',
$runAfter: ['paths-computed'],
$runBefore: ['rendering-docs'],
$process: function(docs) {
var publicDocs = [];
docs.forEach(function(doc){
if (!doc.private && (!doc.tags || !doc.tags.tagsByName.get('hidden'))){
publicDocs.push(doc);
return doc
}
})
docs = publicDocs;
return docs;
}
}
};

View File

@ -0,0 +1,26 @@
module.exports = function indexPage(renderDocsProcessor) {
return {
name: 'index-page',
description: 'Create documentation index page',
$runAfter: ['adding-extra-docs'],
$runBefore: ['extra-docs-added'],
$process: function(docs) {
//TODO(tlancina): move versionData into its own service
var versionData = renderDocsProcessor.extraData.version;
var currentVersion = versionData.current.name;
var latestVersion = versionData.latest.name;
// var versionPath = currentVersion == 'nightly' ? '' : currentVersion;
// If latest and not initial build, set path to docs root
var versionPath = (currentVersion == latestVersion) && !versionData.initialVersionBuild ? '' : currentVersion;
docs.push({
docType: 'index-page',
id: 'index-page',
currentVersion: currentVersion,
template: 'api_index.template.html',
outputPath: 'content/docs/' + versionPath + '/api/index.md'
});
}
}
};

View File

@ -0,0 +1,58 @@
module.exports = function jekyll(renderDocsProcessor) {
return {
name: 'jekyll',
description: 'Create jekyll includes',
$runAfter: ['paths-computed'],
$runBefore: ['rendering-docs'],
$process: function(docs) {
var currentVersion = renderDocsProcessor.extraData.version.current.name;
// pretty up and sort the docs object for menu generation
docs = docs.filter(function(doc) {
return (!!doc.name && !!doc.outputPath) || doc.docType === 'index-page';
});
docs.sort(function(a, b) {
textA = a.name ? a.name.toUpperCase() : '';
textB = b.name ? b.name.toUpperCase() : '';
return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
});
docs.forEach(function(doc, i) {
docs[i].URL = doc.outputPath.replace('docs//', 'docs/')
.replace('/index.md', '')
.replace('//home/ubuntu/ionic/src', '')
.replace('//', '/')
.replace('content/', '');
if (docs[i].relativePath) {
docs[i].relativePath = doc.relativePath
.replace('/home/ubuntu/ionic', '');
}
if (docs[i].href) {
docs[i].href = doc.href.replace('content/', '');
}
});
docs.push({
docType: 'api-menu',
id: 'api-menu',
template: 'api_menu.template.html',
outputPath: 'content/_includes/fluid/api_menu.html'
});
docs.push({
docType: 'api-menu-flat-version',
id: 'api-menu-flat-version',
template: 'api_menu_flat_version.template.html',
outputPath: 'content/_includes/fluid/api_menu_flat_' + currentVersion +
'.html'
});
docs.push({
docType: 'api-version-select',
id: 'api-version-select',
template: 'api_version_select.template.html',
outputPath: 'content/_includes/fluid/api_version_select.html'
});
// returning docs will replace docs object in the next process
return docs;
}
};
};

View File

@ -0,0 +1,33 @@
var copy = require('cpr').cpr;
var mkdirp = require('mkdirp');
var path = require('canonical-path');
var q = require('q');
var fs = require('fs');
module.exports = function latestVersion(renderDocsProcessor) {
return {
name: 'latest-version',
$runAfter: ['files-written'],
description: 'Copy the latest version (that was compiled to docs/) into docs/versionName',
$process: function(docs) {
var versionData = renderDocsProcessor.extraData.version;
var docsBase = 'dist/ionic-site/content/docs/';
var versionDir = path.resolve(docsBase, versionData.latest.name);
var latestDir = path.resolve(docsBase, 'api');
var deferred = q.defer();
mkdirp(versionDir, function() {
copy(latestDir, path.join(versionDir, 'api'), {
deleteFirst: true,
overwrite: true
}, function(err, files) {
deferred.resolve(docs);
});
});
return deferred.promise;
}
}
};

View File

@ -0,0 +1,21 @@
module.exports = function parseOptional() {
return {
$runBefore: ['rendering-docs'],
$process: function(docs) {
docs.forEach(function(doc) {
if(doc.members && doc.members.length) {
for (var i in doc.members) {
if(doc.members[i].params && doc.members[i].params.length) {
for (var ii in doc.members[i].params) {
if(doc.members[i].params[ii].optional){
doc.members[i].params[ii].description += '<strong class="tag">Optional</strong>';
}
}
}
}
}
});
return docs;
}
}
};

View File

@ -0,0 +1,50 @@
module.exports = function parseReturnsObject() {
/*
* This processor assumes the format:
* @returns {object} object general description
* {number} objectName.propertyName property description
* {number} objectName.propertyName objectName.propertyName
* ...
*
*/
return {
name: 'parse-returns-object',
description: 'If a method returns an object, and the values are listed ' +
'out, parse them in to anobject that can be iterated by dgeni',
$runBefore: ['rendering-docs'],
$process: function(docs) {
var publicDocs = [];
docs.forEach(function(doc, i) {
if (doc.members) {
docs[i].members.forEach(function(member, ii) {
if (member.returns && member.returns.typeExpression == 'object') {
var params = docs[i].members[ii].returns.description.split('\n{');
docs[i].members[ii].returns.description = params.shift();
if (params.length) {
docs[i].members[ii].returns.description = docs[i].members[ii]
.returns.description
.replace(/^(\w+)/, '<span class="fixed-width">$1</span>');
docs[i].members[ii].returnsObjectParams = parseReturn(params);
}
}
});
}
});
return docs;
function parseReturn(lineArray) {
var params = [];
lineArray.forEach(function(line, l) {
params.push({
type: line.substr(0, line.indexOf('} ')),
key: line.substr(line.indexOf('} ') + 2,
line.indexOf(' ') - line.indexOf('} ') - 2),
description: line.substr(line.indexOf(' ') + 2)
});
});
return params;
}
}
};
};

View File

@ -0,0 +1,170 @@
var path = require('path');
var fs = require('fs');
var Q = require('q');
var sassdoc = require('sassdoc');
module.exports = function parseSass () {
return {
$runBefore: ['rendering-docs'],
$process: function (docs) {
var folders = [];
var docsByComponent = [];
var promises = [];
var returnPromise = Q.defer();
// for each doc, check if new folder(component)
// if yes, get styles promises
docs.forEach( function(doc, index) {
if (doc.fileInfo) {
var folder = doc.fileInfo.filePath
.split('/')
.filter( function (item, index, self) {
return index !== self.length - 1;
})
.join('/');
if(folders.indexOf(folder) === -1) {
folders.push(folder);
docsByComponent.push([doc]);
promises.push( getStyles(folder, docsByComponent.length - 1) );
} else {
docsByComponent[folders.indexOf(folder)].push(doc);
}
}
});
// when all promises are completed, add sass info
Q.allSettled(promises).spread( function () {
var folders = Array.prototype.map.bind(arguments)(function (item) {
return item.value;
});
appendStyles(folders, docsByComponent);
returnPromise.resolve(docs);
}).catch( function (error) {
console.log('SASS ERROR: ' + error);
returnPromise.resolve(docs);
});
return returnPromise.promise;
}
}
};
function appendStyles(folders, docsByComponent) {
folders.forEach( function (folder) {
var styles = formatStyles(folder);
if (styles.length) {
docsByComponent[folder.index].forEach( function (doc) {
doc.sassVariables = styles;
});
}
});
}
function formatStyles (folder) {
// container for holding styles by platform
var concatenatedStyles = {};
// extract styles
folder.styles.filter( function (file) {
return file.data && file.data.length;
}).forEach( function (file) {
var props = file.data.filter( function (item) {
return item.property && item.property.length;
}).map( function (item) {
var property = item.property[0];
return {
name: item.context.name || '',
default: item.context.value || '',
description: property.description || '',
};
});
if( concatenatedStyles[file.platform] ) {
concatenatedStyles[file.platform] = concatenatedStyles[file.platform].concat(props);
} else {
concatenatedStyles[file.platform] = props;
}
});
// place in Array
var formattedStyles = [];
['base', 'ios', 'md', 'wp'].forEach( function (platform) {
if ( concatenatedStyles[platform] ) {
formattedStyles.push({
platform: platform,
props: concatenatedStyles[platform]
});
}
});
return formattedStyles;
}
function getStyles (folder, docIndex) {
var returnPromise = Q.defer();
// generate file names to check
var extension = 'scss';
var allFiles = fs.readdirSync(folder);
var removeNonSass = function (filename) {
return filename.split('.').pop() === extension;
};
var toFileObject = function (filename) {
// determine platform
var platform = filename.split('.')[1];
if ( ['ios', 'md', 'wp'].indexOf(platform) === -1 ) {
platform = 'base';
}
return {
platform: platform,
path: path.join(folder, filename)
};
};
var files = allFiles.filter(removeNonSass).map(toFileObject);
// for each file, fetch styles
var promises = files.map( function (file) {
return Q.promise( function (resolve, reject) {
fs.access(file.path, function (err) {
if (!err) {
sassdoc.parse(file.path )
.then( function (data) {
resolve( { platform: file.platform, data: data });
}).catch( function (error) {
reject(error);
});
} else {
// file doesn't exist
resolve({ platform: file.platform, data: null });
}
});
});
});
// when all promises are finished, return the results
Q.allSettled(promises).then( function (results) {
var styles = results.map( function (style) {
return style.value;
});
returnPromise.resolve({ index: docIndex, styles: styles });
}).catch( function (error) {
returnPromise.reject(error);
});
return returnPromise.promise;
}

View File

@ -0,0 +1,24 @@
module.exports = function removePrivateMembers() {
return {
name: 'remove-private-members',
description: 'Remove member docs with @private tags',
$runAfter: ['tags-parsed'],
$runBefore: ['rendering-docs'],
$process: function(docs) {
docs.forEach(function(doc) {
if (doc.members) {
doc.members = doc.members.filter(function(member) {
return !member.tags.tagsByName.get('hidden') && !member.tags.tagsByName.get('internal');
});
}
if (doc.statics) {
doc.statics = doc.statics.filter(function(staticMethod) {
return !staticMethod.tags.tagsByName.get('hidden') && !staticMethod.tags.tagsByName.get('internal')
});
}
});
return docs;
}
};
};

View File

@ -0,0 +1,52 @@
// var _ = require('lodash');
// var fs = require('fs');
// var semver = require('semver');
// var path = require('canonical-path');
//
// module.exports = {
// name: 'version-data',
// runBefore: ['reading-files'],
// description: 'Expose version data to templates',
// process: function(extraData, config) {
// var basePath = config.get('basePath');
// var outputFolder = config.get('rendering.outputFolder');
// var currentVersion = config.get('currentVersion');
//
// var docsBaseFolder = path.resolve(basePath, outputFolder, 'docs');
//
// var versions;
// try {
// versions = fs.readdirSync(docsBaseFolder)
// .filter(semver.valid)
// .sort(semver.rcompare);
// } catch(e) {
// versions = [];
// }
//
// !_.contains(versions, currentVersion) && versions.unshift(currentVersion);
// !_.contains(versions, 'nightly') && versions.unshift('nightly');
//
// //First semver valid version is latest
// var latestVersion = _.find(versions, semver.valid);
// versions = versions.map(function(version) {
// //Latest version is in docs root
// var folder = version == latestVersion ? '' : version;
// return {
// href: path.join('/', config.get('versionFolderBase') || '', folder),
// folder: folder,
// name: version
// };
// });
//
// var versionData = {
// list: versions,
// current: _.find(versions, { name: currentVersion }),
// latest: _.find(versions, {name: latestVersion}) || _.first(versions)
// };
//
// config.set('rendering.contentsFolder',
// path.join(config.get('versionFolderBase') || '', versionData.current.folder || ''));
// config.set('versionData', versionData);
// extraData.version = versionData;
// }
// };