process.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. const vueCompiler = require('vue-template-compiler')
  2. const compileTemplate = require('./template-compiler')
  3. const generateSourceMap = require('./generate-source-map')
  4. const addTemplateMapping = require('./add-template-mapping')
  5. const compileBabel = require('./compilers/babel-compiler')
  6. const compileTypescript = require('./compilers/typescript-compiler')
  7. const compileCoffeeScript = require('./compilers/coffee-compiler')
  8. const extractPropsFromFunctionalTemplate = require('./extract-props')
  9. const fs = require('fs')
  10. const join = require('path').join
  11. const splitRE = /\r?\n/g
  12. function processScript (scriptPart) {
  13. if (!scriptPart) {
  14. return { code: '' }
  15. }
  16. if (/^typescript|tsx?$/.test(scriptPart.lang)) {
  17. return compileTypescript(scriptPart.content)
  18. }
  19. if (scriptPart.lang === 'coffee' || scriptPart.lang === 'coffeescript') {
  20. return compileCoffeeScript(scriptPart.content)
  21. }
  22. return compileBabel(scriptPart.content)
  23. }
  24. function changePartsIfFunctional (parts) {
  25. const isFunctional = parts.template && parts.template.attrs && parts.template.attrs.functional
  26. if (isFunctional) {
  27. parts.lang = 'javascript'
  28. const functionalProps = extractPropsFromFunctionalTemplate(parts.template.content)
  29. parts.template.content = parts.template.content.replace(/props./g, '')
  30. parts.script = { type: 'script', content: `export default { props: ${functionalProps} }` }
  31. }
  32. }
  33. module.exports = function (src, path) {
  34. var parts = vueCompiler.parseComponent(src, { pad: true })
  35. changePartsIfFunctional(parts)
  36. if (parts.script && parts.script.src) {
  37. parts.script.content = fs.readFileSync(join(path, '..', parts.script.src), 'utf8')
  38. }
  39. const result = processScript(parts.script)
  40. const script = result.code
  41. const inputMap = result.sourceMap
  42. let scriptSrc = src
  43. if (parts.script && parts.script.src) {
  44. scriptSrc = parts.script.content
  45. }
  46. const map = generateSourceMap(script, '', path, scriptSrc, inputMap)
  47. let output = ';(function(){\n' + script + '\n})()\n' +
  48. 'if (module.exports.__esModule) module.exports = module.exports.default\n' +
  49. 'var __vue__options__ = (typeof module.exports === "function"' +
  50. '? module.exports.options' +
  51. ': module.exports)\n'
  52. if (parts.template) {
  53. if (parts.template.src) {
  54. parts.template.content = fs.readFileSync(join(path, '..', parts.template.src), 'utf8')
  55. }
  56. const renderFunctions = compileTemplate(parts.template)
  57. output += '__vue__options__.render = ' + renderFunctions.render + '\n' +
  58. '__vue__options__.staticRenderFns = ' + renderFunctions.staticRenderFns + '\n'
  59. if (map) {
  60. const beforeLines = output.split(splitRE).length
  61. addTemplateMapping(script, parts, output, map, beforeLines)
  62. }
  63. }
  64. return { code: output, map }
  65. }