docs.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import { createReadStream, writeFileSync } from 'fs';
  2. import { join, relative } from 'path';
  3. import * as Dgeni from 'dgeni';
  4. import { split, map } from 'event-stream';
  5. import { src, dest, task } from 'gulp';
  6. import { AllHtmlEntities } from 'html-entities';
  7. import * as mkdirp from 'mkdirp';
  8. import { valid }from 'semver';
  9. import { argv } from 'yargs';
  10. import { DIST_DEMOS_ROOT } from '../constants';
  11. import { SITE_ROOT } from '../constants';
  12. import { PROJECT_ROOT } from '../constants';
  13. task('docs', ['docs.dgeni', 'docs.demos', 'docs.sassVariables']);
  14. task('docs.dgeni', () => {
  15. const docVersion = argv['doc-version'] || 'nightly';
  16. const initialVersionBuild = argv['initial-build'] || false;
  17. if (docVersion !== 'nightly' && ! valid(docVersion)) {
  18. console.log('Usage: gulp docs --doc-version=(nightly|versionName)\nversionName must be a valid semver version.');
  19. return process.exit(1);
  20. }
  21. try {
  22. const ionicPackage = require('../../docs/dgeni-config')(docVersion, initialVersionBuild);
  23. const dgeni = new Dgeni([ionicPackage]);
  24. return dgeni.generate();
  25. } catch (err) {
  26. console.log(err.stack);
  27. }
  28. });
  29. task('docs.demos', (done: Function) => {
  30. // Copy demos already built from gulp demos.prod task to ionic-site
  31. const config = require('../../config.json');
  32. const outputDir = join(config.docsDest, 'demos');
  33. let promises = [];
  34. promises.push(copyDemoCss(join(outputDir, 'css')));
  35. promises.push(copyDemoFonts(join(outputDir, 'fonts')));
  36. promises.push(copyDemoPolyfills(join(outputDir, 'polyfills')));
  37. promises.push(copyDemoContent(join(outputDir, 'src')));
  38. Promise.all(promises).then(() => {
  39. done();
  40. }).catch(err => {
  41. done(err);
  42. });
  43. });
  44. function copyDemoCss(outputDir: string) {
  45. return new Promise((resolve, reject) => {
  46. const stream = src(`${DIST_DEMOS_ROOT}/css/*`).pipe(dest(outputDir));
  47. stream.on('end', () => {
  48. resolve();
  49. });
  50. });
  51. }
  52. function copyDemoFonts(outputDir: string) {
  53. return new Promise((resolve, reject) => {
  54. const stream = src(`${DIST_DEMOS_ROOT}/fonts/*`).pipe(dest(outputDir));
  55. stream.on('end', () => {
  56. resolve();
  57. });
  58. });
  59. }
  60. function copyDemoPolyfills(outputDir: string) {
  61. return new Promise((resolve, reject) => {
  62. const stream = src(`${DIST_DEMOS_ROOT}/polyfills/*`).pipe(dest(outputDir));
  63. stream.on('end', () => {
  64. resolve();
  65. });
  66. });
  67. }
  68. function copyDemoContent(outputDir: string) {
  69. return new Promise((resolve, reject) => {
  70. const stream = src([
  71. `${DIST_DEMOS_ROOT}/src/**/*`
  72. ]).pipe(dest(outputDir));
  73. stream.on('end', () => {
  74. resolve();
  75. });
  76. });
  77. }
  78. task('docs.sassVariables', () => {
  79. let variables = [];
  80. const outputFile = 'tmp/sass.json';
  81. function addVariable(variableName, defaultValue, file) {
  82. const entities = new AllHtmlEntities();
  83. defaultValue = entities.encode(defaultValue);
  84. defaultValue = defaultValue.replace('!default;', '');
  85. variables.push({
  86. name: variableName,
  87. defaultValue: defaultValue.trim(),
  88. file: relative('./', file.path)
  89. });
  90. }
  91. return src('./src/**/*.scss')
  92. .pipe(map((file, callback) => {
  93. let variableLine, variableName, defaultValue, multiline;
  94. createReadStream(file.path, { flags: 'r'})
  95. .pipe(split())
  96. .pipe(map((line, callback) => {
  97. if (line.charAt(0) === '$') {
  98. variableLine = line.split(/:(.+)/);
  99. variableName = variableLine[0];
  100. defaultValue = variableLine[1];
  101. // If there is a semicolon then it isn't a multiline value
  102. multiline = line.indexOf(';') > -1 ? false : true;
  103. if (!multiline && line.indexOf('!default') > -1) {
  104. addVariable(variableName, defaultValue, file);
  105. }
  106. } else if (multiline === true) {
  107. defaultValue += '\n' + line;
  108. // If the line has a semicolon then we've found the end of the value
  109. if (line.indexOf(';') > -1 && line.indexOf('!default') > -1) {
  110. addVariable(variableName, defaultValue, file);
  111. multiline = false;
  112. }
  113. }
  114. callback();
  115. }));
  116. callback();
  117. }).on('end', () => {
  118. const config = require('../../config.json');
  119. console.log(`Writing to file at /ionic-team/ionic/${outputFile}`);
  120. console.log(`Place this file in /ionic-team/ionic-site/${config.v2DocsDir}/theming/overriding-ionic-variables in order to update the docs`);
  121. mkdirp.sync('tmp');
  122. writeFileSync(outputFile, JSON.stringify(variables));
  123. }));
  124. });
  125. task('docs.homepageVersionUpdate', () => {
  126. // This assumes you're currently releasing
  127. const sourcePackageJSON = require(`${PROJECT_ROOT}/package.json`);
  128. let now = new Date();
  129. const frameworkInfo = JSON.stringify({
  130. version: sourcePackageJSON.version,
  131. date: now.toISOString().split('T')[0]
  132. }, null, 2);
  133. writeFileSync(`${SITE_ROOT}/server/data/framework-info.json`, frameworkInfo);
  134. });