No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

186 líneas
4.4 KiB

  1. const path = require('path');
  2. const fs = require('fs');
  3. const chalk = require('chalk');
  4. const log = console.log; // eslint-disable-line
  5. const multi_entry = require('rollup-plugin-multi-entry');
  6. const commonjs = require('rollup-plugin-commonjs');
  7. const node_resolve = require('rollup-plugin-node-resolve');
  8. const postcss = require('rollup-plugin-postcss');
  9. const buble = require('rollup-plugin-buble');
  10. const uglify = require('rollup-plugin-uglify');
  11. const vue = require('rollup-plugin-vue');
  12. const frappe_html = require('./frappe-html-plugin');
  13. const production = process.env.FRAPPE_ENV === 'production';
  14. const {
  15. apps_list,
  16. assets_path,
  17. bench_path,
  18. get_public_path,
  19. get_app_path,
  20. get_build_json
  21. } = require('./rollup.utils');
  22. function get_rollup_options(output_file, input_files) {
  23. if (output_file.endsWith('.js')) {
  24. return get_rollup_options_for_js(output_file, input_files);
  25. } else if(output_file.endsWith('.css')) {
  26. return get_rollup_options_for_css(output_file, input_files);
  27. }
  28. }
  29. function get_rollup_options_for_js(output_file, input_files) {
  30. const node_resolve_paths = [].concat(
  31. // node_modules of apps directly importable
  32. apps_list.map(app => path.resolve(get_app_path(app), '../node_modules')).filter(fs.existsSync),
  33. // import js file of any app if you provide the full path
  34. apps_list.map(app => path.resolve(get_app_path(app), '..')).filter(fs.existsSync)
  35. );
  36. const plugins = [
  37. // enables array of inputs
  38. multi_entry(),
  39. // .html -> .js
  40. frappe_html(),
  41. // ignore css imports
  42. ignore_css(),
  43. // .vue -> .js
  44. vue.default(),
  45. // ES6 -> ES5
  46. buble({
  47. objectAssign: 'Object.assign',
  48. transforms: {
  49. dangerousForOf: true
  50. },
  51. exclude: [path.resolve(bench_path, '**/*.css'), path.resolve(bench_path, '**/*.less')]
  52. }),
  53. commonjs(),
  54. node_resolve({
  55. customResolveOptions: {
  56. paths: node_resolve_paths
  57. }
  58. }),
  59. production && uglify()
  60. ];
  61. return {
  62. inputOptions: {
  63. input: input_files,
  64. plugins: plugins,
  65. context: 'window',
  66. external: ['jquery'],
  67. onwarn({ code, message, loc, frame }) {
  68. // skip warnings
  69. if (['EVAL', 'SOURCEMAP_BROKEN', 'NAMESPACE_CONFLICT'].includes(code)) return;
  70. if (loc) {
  71. log(`${loc.file} (${loc.line}:${loc.column}) ${message}`);
  72. if (frame) log(frame);
  73. } else {
  74. log(chalk.yellow.underline(code), ':', message);
  75. }
  76. }
  77. },
  78. outputOptions: {
  79. file: path.resolve(assets_path, output_file),
  80. format: 'iife',
  81. name: 'Rollup',
  82. globals: {
  83. 'jquery': 'window.jQuery'
  84. },
  85. sourcemap: true
  86. }
  87. };
  88. }
  89. function get_rollup_options_for_css(output_file, input_files) {
  90. const output_path = path.resolve(assets_path, output_file);
  91. const minimize_css = output_path.startsWith('css/') && production;
  92. const plugins = [
  93. // enables array of inputs
  94. multi_entry(),
  95. // less -> css
  96. postcss({
  97. extract: output_path,
  98. use: [['less', {
  99. // import other less/css files starting from these folders
  100. paths: [
  101. path.resolve(get_public_path('frappe'), 'less')
  102. ]
  103. }], 'sass'],
  104. include: [
  105. path.resolve(bench_path, '**/*.less'),
  106. path.resolve(bench_path, '**/*.scss'),
  107. path.resolve(bench_path, '**/*.css')
  108. ],
  109. minimize: minimize_css
  110. })
  111. ];
  112. return {
  113. inputOptions: {
  114. input: input_files,
  115. plugins: plugins,
  116. onwarn(warning) {
  117. // skip warnings
  118. if (['EMPTY_BUNDLE'].includes(warning.code)) return;
  119. // console.warn everything else
  120. log(chalk.yellow.underline(warning.code), ':', warning.message);
  121. }
  122. },
  123. outputOptions: {
  124. // this file is always empty, remove it later?
  125. file: path.resolve(assets_path, `css/rollup.manifest.css`),
  126. format: 'cjs'
  127. }
  128. };
  129. }
  130. function get_options_for(app) {
  131. const build_json = get_build_json(app);
  132. if (!build_json) return [];
  133. return Object.keys(build_json)
  134. .map(output_file => {
  135. if (output_file.startsWith('concat:')) return null;
  136. const input_files = build_json[output_file]
  137. .map(input_file => {
  138. let prefix = get_app_path(app);
  139. if (input_file.startsWith('node_modules/')) {
  140. prefix = path.resolve(get_app_path(app), '..');
  141. }
  142. return path.resolve(prefix, input_file);
  143. });
  144. return Object.assign(
  145. get_rollup_options(output_file, input_files), {
  146. output_file
  147. });
  148. })
  149. .filter(Boolean);
  150. }
  151. function ignore_css() {
  152. return {
  153. name: 'ignore-css',
  154. transform(code, id) {
  155. if (!['.css', '.scss', '.sass', '.less'].some(ext => id.endsWith(ext))) {
  156. return null;
  157. }
  158. return `
  159. // ignored ${id}
  160. `;
  161. }
  162. };
  163. };
  164. module.exports = {
  165. get_options_for
  166. };