build.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // this file configures require.js based on environment
  2. 'use strict';
  3. var inBrowser = typeof define === 'function' && typeof define.amd === 'object';
  4. var _extend = function(a, b) {
  5. for (var prop in b) {
  6. var supplied = b[prop];
  7. if (Object.prototype.toString.call(supplied) === '[object Object]') {
  8. a[prop] = a[prop] || {};
  9. _extend(a[prop], supplied);
  10. } else {
  11. a[prop] = b[prop];
  12. }
  13. }
  14. };
  15. var baseRequireConfig = {
  16. optimize: 'none',
  17. generateSourceMaps: false,
  18. optimizeCss: 'none',
  19. useStrict: true,
  20. include: ['modernizr-init'],
  21. fileExclusionRegExp: /^(.git|node_modules|modulizr|media|test)$/,
  22. wrap: {
  23. start: '\n;(function(window, document, undefined){',
  24. end: '})(window, document);'
  25. },
  26. onBuildWrite: function(id, path, contents) {
  27. if (this.optimize === 'uglify') {
  28. // strip out documentation comments
  29. contents = contents.replace(/\/\*\![\s\S]*\!\*\//m, '');
  30. }
  31. if ((/define\(.*?\{/).test(contents)) {
  32. // remove AMD ceremony for use without require.js or almond.js
  33. contents = contents.replace(/define\(.*?\{/, '');
  34. contents = contents.replace(/\}\);\s*?$/, '');
  35. if (!contents.match(/Modernizr\.add(Async)?Test\(/)) {
  36. // remove last return statement and trailing })
  37. contents = contents.replace(/return.*[^return]*$/, '');
  38. }
  39. } else if ((/require\([^\{]*?\{/).test(contents)) {
  40. contents = contents.replace(/require[^\{]+\{/, '');
  41. contents = contents.replace(/\}\);\s*$/, '');
  42. }
  43. contents = contents.replace(/return addTest;/, '');
  44. return contents;
  45. }
  46. };
  47. function build(generate, generateBanner, pkg) {
  48. return function build(config, cb) {
  49. var requireConfig = {};
  50. var banner;
  51. config = config || {};
  52. cb = cb || function noop() {};
  53. _extend(requireConfig, baseRequireConfig);
  54. requireConfig.rawText = {
  55. 'modernizr-init': generate(config)
  56. };
  57. if (config.minify) {
  58. banner = generateBanner('compact', config);
  59. requireConfig.optimize = 'uglify';
  60. requireConfig.uglify = {
  61. mangle: {
  62. except: ['Modernizr']
  63. },
  64. beautify: {
  65. ascii_only: true
  66. }
  67. };
  68. } else {
  69. banner = generateBanner('full', config);
  70. requireConfig.optimize = 'none';
  71. }
  72. if(config.scriptGlobalName) {
  73. requireConfig.wrap.end = '})(' + config.scriptGlobalName + ', document);';
  74. }
  75. requireConfig.out = function(output) {
  76. output = banner + output;
  77. // Remove `define('modernizr-init' ...)` and `define('modernizr-build' ...)`
  78. output = output.replace(/(,\s*)?define\("modernizr-(init|build)",\s*function\(\)\{\};?\)/g, '');
  79. output = output.replace(/__VERSION__/g, pkg.version);
  80. // Hack the prefix into place. Anything is way too big for something so small.
  81. if (config && config.classPrefix) {
  82. output = output.replace(/(classPrefix'?:\s?)['"]{2}(,)/, '$1\'' + config.classPrefix.replace(/'/g, '\\\'') + '\'$2');
  83. }
  84. ['enableClasses', 'enableJSClass', 'usePrefixes'].forEach(function(configName) {
  85. if (config && typeof config[configName] === 'boolean') {
  86. output = output.replace(new RegExp('(' + configName + '\\\'?\\s?:\\s?)(true|false)([,\\n])'), '$1' + Boolean(config[configName]) + '$3');
  87. }
  88. });
  89. cb(output);
  90. };
  91. requirejs.optimize(requireConfig);
  92. };
  93. }
  94. if (inBrowser) {
  95. var suppliedConfig = self._modernizrConfig;
  96. var metadataUrl = 'i/js/metadata.json';
  97. var packageUrl = 'i/js/modernizr-git/package.json';
  98. baseRequireConfig.baseUrl = '/i/js/modernizr-git/src';
  99. baseRequireConfig.paths = {
  100. text: '/i/js/requirejs-plugins/lib/text',
  101. lib: '/i/js/modernizr-git/lib',
  102. json: '/i/js/requirejs-plugins/src/json',
  103. lodash: '/i/js/lodash',
  104. test: '/i/js/modernizr-git/feature-detects'
  105. };
  106. if (suppliedConfig) {
  107. metadataUrl = suppliedConfig.metadataUrl || metadataUrl;
  108. packageUrl = suppliedConfig.packageUrl || packageUrl;
  109. _extend(baseRequireConfig, suppliedConfig);
  110. }
  111. if (self._modernizrMetadata) {
  112. requirejs.define('metadata', [], function() {return self._modernizrMetadata;});
  113. } else {
  114. requirejs.define('metadata', ['json!' + metadataUrl], function(pkg) {return pkg;});
  115. }
  116. requirejs.define('package', ['json!' + packageUrl], function(pkg) {return pkg;});
  117. } else {
  118. var requirejs = require('requirejs');
  119. var metadata = require('./metadata')();
  120. var pkg = require('../package.json');
  121. requirejs.define('metadata', [], function() {return metadata;});
  122. requirejs.define('package', function() {return pkg;});
  123. baseRequireConfig.baseUrl = __dirname + '/../src';
  124. baseRequireConfig.paths = {
  125. lodash: __dirname + '/../node_modules/lodash/lodash',
  126. test: __dirname + '/../feature-detects',
  127. lib: __dirname
  128. };
  129. }
  130. requirejs.config(baseRequireConfig);
  131. if (inBrowser) {
  132. define('build', ['generate', 'lib/generate-banner', 'package'], build);
  133. } else {
  134. var generateBanner = requirejs(__dirname + '/generate-banner.js');
  135. var generate = requirejs('generate');
  136. var pkg = requirejs('package');
  137. var _build = build;
  138. module.exports = function build() {
  139. return _build(generate, generateBanner, pkg).apply(undefined, arguments);
  140. };
  141. }