版博士V2.0程序
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.
 
 
 
 

275 lines
13 KiB

  1. "use strict";
  2. /**
  3. * Code generator for i18n yaml resource
  4. */
  5. var __importDefault = (this && this.__importDefault) || function (mod) {
  6. return (mod && mod.__esModule) ? mod : { "default": mod };
  7. };
  8. Object.defineProperty(exports, "__esModule", { value: true });
  9. exports.generate = void 0;
  10. const shared_1 = require("@intlify/shared");
  11. const codegen_1 = require("./codegen");
  12. const yaml_eslint_parser_1 = require("yaml-eslint-parser");
  13. const legacy_1 = require("./legacy");
  14. const magic_string_1 = __importDefault(require("magic-string"));
  15. /**
  16. * @internal
  17. */
  18. function generate(targetSource, { type = 'plain', legacy = false, bridge = false, exportESM = false, useClassComponent = false, filename = 'vue-i18n-loader.yaml', inSourceMap = undefined, locale = '', isGlobal = false, sourceMap = false, env = 'development', forceStringify = false, onError = undefined, strictMessage = true, escapeHtml = false }, injector) {
  19. const value = Buffer.isBuffer(targetSource)
  20. ? targetSource.toString()
  21. : targetSource;
  22. const options = {
  23. type,
  24. bridge,
  25. exportESM,
  26. source: value,
  27. sourceMap,
  28. locale,
  29. isGlobal,
  30. inSourceMap,
  31. env,
  32. filename,
  33. forceStringify,
  34. onError,
  35. strictMessage,
  36. escapeHtml,
  37. useClassComponent
  38. };
  39. const generator = (0, codegen_1.createCodeGenerator)(options);
  40. const ast = (0, yaml_eslint_parser_1.parseYAML)(value, { filePath: filename });
  41. // for vue 2.x
  42. if (legacy && type === 'sfc') {
  43. const gen = () => (0, shared_1.friendlyJSONstringify)((0, yaml_eslint_parser_1.getStaticYAMLValue)(ast));
  44. const code = (0, legacy_1.generateLegacyCode)(options, gen);
  45. const s = new magic_string_1.default(code);
  46. return {
  47. ast,
  48. code: s.toString(),
  49. map: s.generateMap({
  50. file: filename,
  51. source: value,
  52. includeContent: true
  53. })
  54. };
  55. }
  56. const codeMaps = generateNode(generator, ast, options, injector);
  57. const { code, map } = generator.context();
  58. // prettier-ignore
  59. const newMap = map
  60. ? (0, codegen_1.mapLinesColumns)(map.toJSON(), codeMaps, inSourceMap) || null // eslint-disable-line @typescript-eslint/no-explicit-any
  61. : null;
  62. return {
  63. ast,
  64. code,
  65. map: newMap != null ? newMap : undefined
  66. };
  67. }
  68. exports.generate = generate;
  69. function generateNode(generator, node, options, injector) {
  70. const propsCountStack = [];
  71. const pathStack = [];
  72. const itemsCountStack = [];
  73. const { forceStringify } = generator.context();
  74. const codeMaps = new Map();
  75. const { type, bridge, exportESM, sourceMap, isGlobal, locale, useClassComponent } = options;
  76. const componentNamespace = '_Component';
  77. (0, yaml_eslint_parser_1.traverseNodes)(node, {
  78. enterNode(node, parent) {
  79. switch (node.type) {
  80. case 'Program':
  81. if (type === 'plain') {
  82. generator.push(`const resource = `);
  83. }
  84. else if (type === 'sfc') {
  85. const variableName = type === 'sfc' ? (!isGlobal ? '__i18n' : '__i18nGlobal') : '';
  86. const localeName = type === 'sfc' ? (locale != null ? locale : `""`) : '';
  87. const exportSyntax = bridge
  88. ? exportESM
  89. ? `export default`
  90. : `module.exports =`
  91. : `export default`;
  92. generator.push(`${exportSyntax} function (Component) {`);
  93. generator.indent();
  94. // prettier-ignore
  95. const componentVariable = bridge
  96. ? `Component.options || Component`
  97. : useClassComponent
  98. ? `Component.__o || Component`
  99. : `Component`;
  100. // prettier-ignore
  101. generator.pushline(`const ${componentNamespace} = ${componentVariable}`);
  102. generator.pushline(`${componentNamespace}.${variableName} = ${componentNamespace}.${variableName} || []`);
  103. generator.push(`${componentNamespace}.${variableName}.push({`);
  104. generator.indent();
  105. generator.pushline(`"locale": ${JSON.stringify(localeName)},`);
  106. generator.push(`"resource": `);
  107. }
  108. break;
  109. case 'YAMLMapping':
  110. generator.push(`{`);
  111. generator.indent();
  112. propsCountStack.push(node.pairs.length);
  113. if (parent.type === 'YAMLSequence') {
  114. const lastIndex = itemsCountStack.length - 1;
  115. const currentCount = parent.entries.length - itemsCountStack[lastIndex];
  116. pathStack.push(currentCount.toString());
  117. itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
  118. }
  119. break;
  120. case 'YAMLPair':
  121. if (node.value &&
  122. node.value.type === 'YAMLScalar' &&
  123. node.key &&
  124. node.key.type === 'YAMLScalar') {
  125. const name = node.key.value;
  126. const value = node.value.value;
  127. if ((0, shared_1.isString)(value)) {
  128. generator.push(`${JSON.stringify(name)}: `);
  129. name && pathStack.push(name.toString());
  130. const { code, map } = (0, codegen_1.generateMessageFunction)(value, options, pathStack);
  131. sourceMap && map != null && codeMaps.set(value, map);
  132. generator.push(`${code}`, node.value, value);
  133. }
  134. else {
  135. if (forceStringify) {
  136. const strValue = JSON.stringify(value);
  137. generator.push(`${JSON.stringify(name)}: `);
  138. name && pathStack.push(name.toString());
  139. const { code, map } = (0, codegen_1.generateMessageFunction)(strValue, options, pathStack);
  140. sourceMap && map != null && codeMaps.set(strValue, map);
  141. generator.push(`${code}`, node.value, strValue);
  142. }
  143. else {
  144. generator.push(`${JSON.stringify(name)}: ${JSON.stringify(value)}`);
  145. name && pathStack.push(name.toString());
  146. }
  147. }
  148. }
  149. else if (node.value &&
  150. (node.value.type === 'YAMLMapping' ||
  151. node.value.type === 'YAMLSequence') &&
  152. node.key &&
  153. node.key.type === 'YAMLScalar') {
  154. const name = node.key.value;
  155. generator.push(`${JSON.stringify(name)}: `);
  156. name && pathStack.push(name.toString());
  157. }
  158. const lastIndex = propsCountStack.length - 1;
  159. propsCountStack[lastIndex] = --propsCountStack[lastIndex];
  160. break;
  161. case 'YAMLSequence':
  162. generator.push(`[`);
  163. generator.indent();
  164. if (parent.type === 'YAMLSequence') {
  165. const lastIndex = itemsCountStack.length - 1;
  166. const currentCount = parent.entries.length - itemsCountStack[lastIndex];
  167. pathStack.push(currentCount.toString());
  168. itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
  169. }
  170. itemsCountStack.push(node.entries.length);
  171. break;
  172. case 'YAMLScalar':
  173. if (parent.type === 'YAMLSequence') {
  174. const lastIndex = itemsCountStack.length - 1;
  175. const currentCount = parent.entries.length - itemsCountStack[lastIndex];
  176. pathStack.push(currentCount.toString());
  177. if (node.type === 'YAMLScalar') {
  178. const value = node.value;
  179. if ((0, shared_1.isString)(value)) {
  180. const { code, map } = (0, codegen_1.generateMessageFunction)(value, options, pathStack);
  181. sourceMap && map != null && codeMaps.set(value, map);
  182. generator.push(`${code}`, node, value);
  183. }
  184. else {
  185. if (forceStringify) {
  186. const strValue = JSON.stringify(value);
  187. const { code, map } = (0, codegen_1.generateMessageFunction)(strValue, options, pathStack);
  188. sourceMap && map != null && codeMaps.set(strValue, map);
  189. generator.push(`${code}`, node, strValue);
  190. }
  191. else {
  192. generator.push(`${JSON.stringify(value)}`);
  193. }
  194. }
  195. }
  196. itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
  197. }
  198. break;
  199. default:
  200. break;
  201. }
  202. },
  203. leaveNode(node, parent) {
  204. switch (node.type) {
  205. case 'Program':
  206. if (type === 'sfc') {
  207. generator.deindent();
  208. generator.push(`})`);
  209. if (bridge && injector) {
  210. generator.newline();
  211. generator.pushline(`${componentNamespace}.__i18nBridge = ${componentNamespace}.__i18nBridge || []`);
  212. generator.pushline(`${componentNamespace}.__i18nBridge.push('${injector()}')`);
  213. generator.pushline(`delete ${componentNamespace}._Ctor`);
  214. }
  215. generator.deindent();
  216. generator.push(`}`);
  217. }
  218. else if (type === 'plain') {
  219. generator.push(`\n`);
  220. generator.push('export default resource');
  221. }
  222. break;
  223. case 'YAMLMapping':
  224. if (propsCountStack[propsCountStack.length - 1] === 0) {
  225. pathStack.pop();
  226. propsCountStack.pop();
  227. }
  228. generator.deindent();
  229. generator.push(`}`);
  230. if (parent.type === 'YAMLSequence') {
  231. if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
  232. pathStack.pop();
  233. generator.pushline(`,`);
  234. }
  235. }
  236. break;
  237. case 'YAMLPair':
  238. if (propsCountStack[propsCountStack.length - 1] !== 0) {
  239. pathStack.pop();
  240. generator.pushline(`,`);
  241. }
  242. break;
  243. case 'YAMLSequence':
  244. if (itemsCountStack[itemsCountStack.length - 1] === 0) {
  245. pathStack.pop();
  246. itemsCountStack.pop();
  247. }
  248. generator.deindent();
  249. generator.push(`]`);
  250. if (parent.type === 'YAMLSequence') {
  251. if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
  252. pathStack.pop();
  253. generator.pushline(`,`);
  254. }
  255. }
  256. break;
  257. case 'YAMLScalar':
  258. if (parent.type === 'YAMLSequence') {
  259. if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
  260. pathStack.pop();
  261. generator.pushline(`,`);
  262. }
  263. else {
  264. generator.pushline(`,`);
  265. }
  266. }
  267. break;
  268. default:
  269. break;
  270. }
  271. }
  272. });
  273. return codeMaps;
  274. }