build.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. const fs = require('fs');
  2. const log = require('@vladmandic/pilogger');
  3. const Build = require('@vladmandic/build').Build;
  4. const APIExtractor = require('@microsoft/api-extractor');
  5. const regEx = [
  6. { search: 'types="@webgpu/types/dist"', replace: 'path="../src/types/webgpu.d.ts"' },
  7. { search: 'types="offscreencanvas"', replace: 'path="../src/types/offscreencanvas.d.ts"' },
  8. ];
  9. function copyFile(src, dst) {
  10. if (!fs.existsSync(src)) {
  11. log.warn('Copy:', { input: src, output: dst });
  12. return;
  13. }
  14. log.state('Copy:', { input: src, output: dst });
  15. const buffer = fs.readFileSync(src);
  16. fs.writeFileSync(dst, buffer);
  17. }
  18. function writeFile(str, dst) {
  19. log.state('Write:', { output: dst });
  20. fs.writeFileSync(dst, str);
  21. }
  22. function regExFile(src, entries) {
  23. if (!fs.existsSync(src)) {
  24. log.warn('Filter:', { src });
  25. return;
  26. }
  27. log.state('Filter:', { input: src });
  28. for (const entry of entries) {
  29. const buffer = fs.readFileSync(src, 'UTF-8');
  30. const lines = buffer.split(/\r?\n/);
  31. const out = [];
  32. for (const line of lines) {
  33. if (line.includes(entry.search)) out.push(line.replace(entry.search, entry.replace));
  34. else out.push(line);
  35. }
  36. fs.writeFileSync(src, out.join('\n'));
  37. }
  38. }
  39. const apiIgnoreList = ['ae-forgotten-export', 'ae-unresolved-link', 'tsdoc-param-tag-missing-hyphen'];
  40. async function main() {
  41. // run production build
  42. const build = new Build();
  43. await build.run('production');
  44. // patch tfjs typedefs
  45. log.state('Copy:', { input: 'types/lib/dist/tfjs.esm.d.ts' });
  46. copyFile('types/lib/dist/tfjs.esm.d.ts', 'dist/tfjs.esm.d.ts');
  47. // run api-extractor to create typedef rollup
  48. const extractorConfig = APIExtractor.ExtractorConfig.loadFileAndPrepare('api-extractor.json');
  49. const extractorResult = APIExtractor.Extractor.invoke(extractorConfig, {
  50. localBuild: true,
  51. showVerboseMessages: false,
  52. messageCallback: (msg) => {
  53. msg.handled = true;
  54. if (msg.logLevel === 'none' || msg.logLevel === 'verbose' || msg.logLevel === 'info') return;
  55. if (msg.sourceFilePath?.includes('/node_modules/')) return;
  56. if (apiIgnoreList.reduce((prev, curr) => prev || msg.messageId.includes(curr), false)) return;
  57. log.data('API', { level: msg.logLevel, category: msg.category, id: msg.messageId, file: msg.sourceFilePath, line: msg.sourceFileLine, text: msg.text });
  58. },
  59. });
  60. log.state('API-Extractor:', { succeeeded: extractorResult.succeeded, errors: extractorResult.errorCount, warnings: extractorResult.warningCount });
  61. regExFile('types/face-api.d.ts', regEx);
  62. writeFile('export * from \'../types/face-api\';', 'dist/face-api.esm-nobundle.d.ts');
  63. writeFile('export * from \'../types/face-api\';', 'dist/face-api.esm.d.ts');
  64. writeFile('export * from \'../types/face-api\';', 'dist/face-api.d.ts');
  65. writeFile('export * from \'../types/face-api\';', 'dist/face-api.node.d.ts');
  66. writeFile('export * from \'../types/face-api\';', 'dist/face-api.node-gpu.d.ts');
  67. writeFile('export * from \'../types/face-api\';', 'dist/face-api.node-wasm.d.ts');
  68. log.info('FaceAPI Build complete...');
  69. }
  70. main();