提交学习笔记专用
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
1.3 KiB

  1. 'use strict';
  2. const compilerSfc = require('@vue/compiler-sfc');
  3. const MagicString = require('magic-string');
  4. function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e["default"] : e; }
  5. const MagicString__default = /*#__PURE__*/_interopDefaultLegacy(MagicString);
  6. function supportScriptName(code, id) {
  7. let s;
  8. const str = () => s || (s = new MagicString__default(code));
  9. const { descriptor } = compilerSfc.parse(code);
  10. if (!descriptor.script && descriptor.scriptSetup) {
  11. const result = compilerSfc.compileScript(descriptor, { id });
  12. const name = result.attrs.name;
  13. const lang = result.attrs.lang;
  14. if (name) {
  15. str().appendLeft(0, `<script ${lang ? `lang="${lang}"` : ""}>
  16. import { defineComponent } from 'vue'
  17. export default defineComponent({
  18. name: '${name}',
  19. })
  20. <\/script>
  21. `);
  22. }
  23. return {
  24. map: str().generateMap(),
  25. code: str().toString()
  26. };
  27. } else {
  28. return null;
  29. }
  30. }
  31. const index = (options = {}) => {
  32. return {
  33. name: "vite:setup-name-support",
  34. enforce: "pre",
  35. async transform(code, id) {
  36. if (!/\.vue$/.test(id)) {
  37. return null;
  38. }
  39. const { name = true } = options;
  40. if (name) {
  41. return supportScriptName.call(this, code, id);
  42. }
  43. return null;
  44. }
  45. };
  46. };
  47. module.exports = index;