template.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.resolveTemplateCompilerOptions = exports.resolveGenTemplateCodeOptions = void 0;
  7. const path_1 = __importDefault(require("path"));
  8. const uni_cli_shared_1 = require("@dcloudio/uni-cli-shared");
  9. const script_1 = require("./script");
  10. const utils_1 = require("../../utils");
  11. function resolveGenTemplateCodeOptions(relativeFileName, code, descriptor, options) {
  12. const inputRoot = (0, uni_cli_shared_1.normalizePath)(options.rootDir);
  13. const templateStartLine = descriptor.template?.loc.start.line ?? 0;
  14. return {
  15. ...options,
  16. filename: relativeFileName,
  17. inMap: descriptor.template?.map,
  18. matchEasyCom: (tag, uts) => {
  19. const source = (0, uni_cli_shared_1.matchEasycom)(tag);
  20. if (uts && source) {
  21. if (source.startsWith(inputRoot)) {
  22. return '@/' + (0, uni_cli_shared_1.normalizePath)(path_1.default.relative(inputRoot, source));
  23. }
  24. return (0, utils_1.parseUTSImportFilename)(source);
  25. }
  26. return source;
  27. },
  28. onWarn(warning) {
  29. onTemplateLog('warn', warning, code, relativeFileName, templateStartLine);
  30. },
  31. onError(error) {
  32. onTemplateLog('error', error, code, relativeFileName, templateStartLine);
  33. },
  34. parseUTSComponent: uni_cli_shared_1.parseUTSComponent,
  35. };
  36. }
  37. exports.resolveGenTemplateCodeOptions = resolveGenTemplateCodeOptions;
  38. function onTemplateLog(type, error, code, relativeFileName, templateStartLine) {
  39. console.error(type + ': ' + error.message);
  40. if (error.loc) {
  41. const start = error.loc.start;
  42. console.log('at ' +
  43. relativeFileName +
  44. ':' +
  45. (start.line + templateStartLine - 1) +
  46. ':' +
  47. (start.column - 1));
  48. console.log((0, uni_cli_shared_1.generateCodeFrameColumns)(code, error.loc));
  49. }
  50. }
  51. function resolveTemplateCompilerOptions(descriptor, options) {
  52. const block = descriptor.template;
  53. if (!block) {
  54. return;
  55. }
  56. const resolvedScript = (0, script_1.getResolvedScript)(descriptor);
  57. const hasScoped = descriptor.styles.some((s) => s.scoped);
  58. const { id, filename, cssVars } = descriptor;
  59. let transformAssetUrls = options.template?.transformAssetUrls;
  60. // compiler-sfc should export `AssetURLOptions`
  61. let assetUrlOptions; //: AssetURLOptions | undefined
  62. if (transformAssetUrls !== false) {
  63. // build: force all asset urls into import requests so that they go through
  64. // the assets plugin for asset registration
  65. assetUrlOptions = {
  66. includeAbsolute: true,
  67. };
  68. }
  69. if (transformAssetUrls && typeof transformAssetUrls === 'object') {
  70. // presence of array fields means this is raw tags config
  71. if (Object.values(transformAssetUrls).some((val) => Array.isArray(val))) {
  72. transformAssetUrls = {
  73. ...assetUrlOptions,
  74. tags: transformAssetUrls,
  75. };
  76. }
  77. else {
  78. transformAssetUrls = { ...assetUrlOptions, ...transformAssetUrls };
  79. }
  80. }
  81. else {
  82. transformAssetUrls = assetUrlOptions;
  83. }
  84. let preprocessOptions = block.lang && options.template?.preprocessOptions;
  85. if (block.lang === 'pug') {
  86. preprocessOptions = {
  87. doctype: 'html',
  88. ...preprocessOptions,
  89. };
  90. }
  91. // if using TS, support TS syntax in template expressions
  92. const expressionPlugins = options.template?.compilerOptions?.expressionPlugins || [];
  93. const lang = descriptor.scriptSetup?.lang || descriptor.script?.lang;
  94. if (lang && /tsx?$/.test(lang) && !expressionPlugins.includes('typescript')) {
  95. expressionPlugins.push('typescript');
  96. }
  97. return {
  98. ...options.template,
  99. id,
  100. // @ts-ignore TODO remove ignore when dep is updated to 3.4
  101. ast: descriptor.template?.ast,
  102. filename,
  103. scoped: hasScoped,
  104. slotted: descriptor.slotted,
  105. isProd: options.isProduction,
  106. inMap: block.src ? undefined : block.map,
  107. ssrCssVars: cssVars,
  108. transformAssetUrls,
  109. preprocessLang: block.lang === 'html' ? undefined : block.lang,
  110. preprocessOptions,
  111. compilerOptions: {
  112. ...options.template?.compilerOptions,
  113. scopeId: hasScoped ? `data-v-${id}` : undefined,
  114. bindingMetadata: resolvedScript ? resolvedScript.bindings : undefined,
  115. expressionPlugins,
  116. sourceMap: options.sourceMap,
  117. },
  118. };
  119. }
  120. exports.resolveTemplateCompilerOptions = resolveTemplateCompilerOptions;