postinstall-fix.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/usr/bin/env node
  2. const fs = require('fs');
  3. const path = require('path');
  4. function findRemoveScopedFiles() {
  5. const files = [];
  6. const localPath = path.join(__dirname, 'node_modules', '@dcloudio',
  7. 'vue-cli-plugin-uni', 'packages', '@vue', 'component-compiler-utils',
  8. 'dist', 'stylePlugins', 'remove-scoped.js');
  9. if (fs.existsSync(localPath)) files.push(localPath);
  10. return files;
  11. }
  12. function patchFile(filePath) {
  13. let content = fs.readFileSync(filePath, 'utf8');
  14. if (content.includes("selector.first.spaces.before = '';")) {
  15. content = content.replace(
  16. /selector\.first\.spaces\.before = '';/,
  17. "if (selector.first) { selector.first.spaces.before = ''; }"
  18. );
  19. fs.writeFileSync(filePath, content, 'utf8');
  20. console.log(` ✅ ${filePath}`);
  21. return true;
  22. } else if (content.includes("if (selector.first) { selector.first.spaces.before = ''; }")) {
  23. console.log(` ⏭️ ${filePath} (already patched)`);
  24. return true;
  25. }
  26. return false;
  27. }
  28. function patchTemplateLoader(filePath) {
  29. let content = fs.readFileSync(filePath, 'utf8');
  30. if (content.includes("export { render, staticRenderFns }") && !content.includes("recyclableRender")) {
  31. return true;
  32. }
  33. const oldExport = /export \{ render, staticRenderFns, recyclableRender, components \}/;
  34. if (oldExport.test(content)) {
  35. content = content.replace(oldExport, "export { render, staticRenderFns }");
  36. fs.writeFileSync(filePath, content, 'utf8');
  37. console.log(` ✅ ${filePath}`);
  38. return true;
  39. }
  40. return false;
  41. }
  42. const files = findRemoveScopedFiles();
  43. if (files.length === 0) {
  44. console.log('remove-scoped.js not found, skipping');
  45. } else {
  46. let patched = 0;
  47. for (const f of files) { if (patchFile(f)) patched++; }
  48. console.log(`Done: ${patched}/${files.length} patched`);
  49. }
  50. const templateLoaderPath = path.join(__dirname, 'node_modules', '@dcloudio',
  51. 'vue-cli-plugin-uni', 'packages', 'vue-loader', 'lib', 'loaders', 'templateLoader.js');
  52. if (fs.existsSync(templateLoaderPath)) {
  53. patchTemplateLoader(templateLoaderPath);
  54. }