fix-esm-extensions.mjs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { existsSync } from 'node:fs';
  2. import { readdir, readFile, writeFile } from 'node:fs/promises';
  3. import { dirname, extname, join, resolve } from 'node:path';
  4. import { fileURLToPath } from 'node:url';
  5. const packageDir = resolve(dirname(fileURLToPath(import.meta.url)), '..');
  6. const distDir = join(packageDir, 'dist');
  7. const relativeSpecifierPattern = /(\bfrom\s*['"]|\bimport\s*\(\s*['"])(\.{1,2}\/[^'"]+)(['"])/g;
  8. const hasKnownExtension = specifier => extname(specifier) !== '';
  9. const resolveJsSpecifier = (fileDir, specifier) => {
  10. if (hasKnownExtension(specifier)) {
  11. return specifier;
  12. }
  13. const candidate = resolve(fileDir, `${specifier}.js`);
  14. if (existsSync(candidate)) {
  15. return `${specifier}.js`;
  16. }
  17. const indexCandidate = resolve(fileDir, specifier, 'index.js');
  18. return existsSync(indexCandidate) ? `${specifier}/index.js` : specifier;
  19. };
  20. async function collectJsFiles(dir) {
  21. const entries = await readdir(dir, { withFileTypes: true });
  22. const files = [];
  23. for (const entry of entries) {
  24. const path = join(dir, entry.name);
  25. if (entry.isDirectory()) {
  26. files.push(...await collectJsFiles(path));
  27. continue;
  28. }
  29. if (entry.isFile() && extname(entry.name) === '.js') {
  30. files.push(path);
  31. }
  32. }
  33. return files;
  34. }
  35. let changedCount = 0;
  36. for (const file of await collectJsFiles(distDir)) {
  37. const source = await readFile(file, 'utf8');
  38. const fileDir = dirname(file);
  39. const fixed = source.replace(relativeSpecifierPattern, (_match, prefix, specifier, suffix) => {
  40. return `${prefix}${resolveJsSpecifier(fileDir, specifier)}${suffix}`;
  41. });
  42. if (fixed !== source) {
  43. await writeFile(file, fixed, 'utf8');
  44. changedCount += 1;
  45. }
  46. }
  47. console.log(`[pptx-esm] Normalized relative import extensions in ${changedCount} file${changedCount === 1 ? '' : 's'}.`);