build_worker.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. const fs = require('fs');
  2. const UglifyJS = require("uglify-js");
  3. const packageFile = require("../package.json");
  4. const buildFolder = 'build/player/';
  5. const rootFolder = 'player/';
  6. const bm_version = packageFile.version;
  7. const defaultBuilds = [ 'canvas_worker', 'lottie_worker']
  8. const scripts = [
  9. ]
  10. function wrapScriptWithModule(code, build) {
  11. return new Promise((resolve, reject)=>{
  12. try {
  13. // Wrapping with module
  14. let moduleFileName = 'worker_wrapper';
  15. let wrappedCode = fs.readFileSync(`${rootFolder}js/${moduleFileName}.js`, "utf8");
  16. wrappedCode = wrappedCode.replace('/* <%= contents %> */',code);
  17. wrappedCode = wrappedCode.replace('[[BM_VERSION]]',bm_version);
  18. resolve(wrappedCode);
  19. } catch(err) {
  20. reject(err);
  21. }
  22. });
  23. }
  24. function uglifyCode(code) {
  25. return new Promise((resolve, reject)=>{
  26. try {
  27. const result = UglifyJS.minify(code, {
  28. output:
  29. {
  30. ascii_only:true
  31. },
  32. toplevel:true,
  33. mangle: {
  34. reserved: ['lottie']
  35. }
  36. });
  37. if (result.error) {
  38. reject(result.error)
  39. } else {
  40. resolve(result.code)
  41. }
  42. } catch(err) {
  43. reject(err)
  44. }
  45. })
  46. }
  47. async function modularizeCode(code, build) {
  48. const globalScope = (build =='canvas_worker' || build =='lottie_worker') ? 'self' : 'window'
  49. return `(typeof navigator !== "undefined") && (function(root, factory) {
  50. if (typeof define === "function" && define.amd) {
  51. define(function() {
  52. return factory(root);
  53. });
  54. } else if (typeof module === "object" && module.exports) {
  55. module.exports = factory(root);
  56. } else {
  57. root.lottie = factory(root);
  58. root.bodymovin = root.lottie;
  59. }
  60. }((${globalScope} || {}), function(window) {
  61. ${code}
  62. return lottie;
  63. }));`
  64. }
  65. async function getCode() {
  66. try {
  67. let scriptsString = '';
  68. scriptsString += fs.readFileSync(`${buildFolder}lottie.js`, {encoding: 'utf8'});
  69. scriptsString += '\r\n';
  70. return scriptsString;
  71. } catch(err) {
  72. throw err;
  73. }
  74. }
  75. async function buildVersion(version) {
  76. try {
  77. const code = await getCode(version.build)
  78. const wrappedCode = await wrapScriptWithModule(code, version.build)
  79. const processedCode = await version.process(wrappedCode)
  80. const modularizedCode = await modularizeCode(processedCode, version.build)
  81. const saved = await save(modularizedCode, version.fileName)
  82. return saved
  83. } catch (error) {
  84. console.log(error);
  85. return null;
  86. }
  87. }
  88. function save(code, fileName) {
  89. return new Promise((resolve, reject)=> {
  90. fs.writeFile(`${buildFolder}${fileName}`, code, (err) => {
  91. if (err) {
  92. reject(err)
  93. } else {
  94. resolve(true)
  95. }
  96. });
  97. })
  98. }
  99. function noop(code) {
  100. return Promise.resolve(code)
  101. }
  102. function buildVersions() {
  103. return new Promise((resolve, reject) => {
  104. let versions = [
  105. {
  106. fileName: 'lottie_canvas_worker.js',
  107. build: 'canvas_worker',
  108. process: noop
  109. },
  110. {
  111. fileName: 'lottie_canvas_worker.min.js',
  112. build: 'canvas_worker',
  113. process: uglifyCode
  114. },
  115. {
  116. fileName: 'lottie_worker.js',
  117. build: 'lottie_worker',
  118. process: noop
  119. },
  120. {
  121. fileName: 'lottie_worker.min.js',
  122. build: 'lottie_worker',
  123. process: uglifyCode
  124. }
  125. ];
  126. const buildProcesses = versions.map((version)=>{
  127. return buildVersion(version)
  128. })
  129. Promise.all(buildProcesses)
  130. .then(() => {
  131. resolve('Build Process Ended')
  132. })
  133. .catch((err)=>{
  134. reject(err)
  135. })
  136. })
  137. }
  138. function handleError(err) {
  139. console.log(err);
  140. }
  141. async function build() {
  142. try {
  143. const result = await buildVersions();
  144. } catch(err) {
  145. handleError(err);
  146. }
  147. }
  148. build()