customBlocks.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. const qs = require('querystring')
  2. const { attrsToQuery, genMatchResource } = require('./utils')
  3. module.exports = function genCustomBlocksCode(
  4. loaderContext,
  5. blocks,
  6. resourcePath,
  7. resourceQuery,
  8. stringifyRequest,
  9. enableInlineMatchResource
  10. ) {
  11. return (
  12. `\n/* custom blocks */\n` +
  13. blocks
  14. .map((block, i) => {
  15. const src = block.attrs.src || resourcePath
  16. const attrsQuery = attrsToQuery(block.attrs)
  17. const issuerQuery = block.attrs.src
  18. ? `&issuerPath=${qs.escape(resourcePath)}`
  19. : ''
  20. const inheritQuery = resourceQuery ? `&${resourceQuery.slice(1)}` : ''
  21. const externalQuery = block.attrs.src ? `&external` : ``
  22. const query = `?vue&type=custom&index=${i}&blockType=${qs.escape(
  23. block.type
  24. )}${issuerQuery}${attrsQuery}${inheritQuery}${externalQuery}`
  25. let customRequest
  26. if (enableInlineMatchResource) {
  27. customRequest = stringifyRequest(
  28. genMatchResource(loaderContext, src, query, block.attrs.lang)
  29. )
  30. } else {
  31. customRequest = stringifyRequest(src + query)
  32. }
  33. return (
  34. `import block${i} from ${customRequest}\n` +
  35. `if (typeof block${i} === 'function') block${i}(component)`
  36. )
  37. })
  38. .join(`\n`) +
  39. `\n`
  40. )
  41. }