16a23e08bSopenharmony_ci/*
26a23e08bSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
36a23e08bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
46a23e08bSopenharmony_ci * you may not use this file except in compliance with the License.
56a23e08bSopenharmony_ci * You may obtain a copy of the License at
66a23e08bSopenharmony_ci *
76a23e08bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
86a23e08bSopenharmony_ci *
96a23e08bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
106a23e08bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
116a23e08bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126a23e08bSopenharmony_ci * See the License for the specific language governing permissions and
136a23e08bSopenharmony_ci * limitations under the License.
146a23e08bSopenharmony_ci */
156a23e08bSopenharmony_ci
166a23e08bSopenharmony_ciimport loaderUtils from 'loader-utils'
176a23e08bSopenharmony_ciimport path from 'path'
186a23e08bSopenharmony_ci
196a23e08bSopenharmony_ciimport {
206a23e08bSopenharmony_ci  getNameByPath,
216a23e08bSopenharmony_ci  getRequireString,
226a23e08bSopenharmony_ci  stringifyLoaders,
236a23e08bSopenharmony_ci  jsonLoaders,
246a23e08bSopenharmony_ci  loadBabelModule
256a23e08bSopenharmony_ci}
266a23e08bSopenharmony_cifrom './util'
276a23e08bSopenharmony_ci
286a23e08bSopenharmony_ciconst loaderPath = __dirname
296a23e08bSopenharmony_ciconst defaultLoaders = {
306a23e08bSopenharmony_ci  none: '',
316a23e08bSopenharmony_ci  main: path.resolve(loaderPath, 'loader.js'),
326a23e08bSopenharmony_ci  template: path.resolve(loaderPath, 'template.js'),
336a23e08bSopenharmony_ci  style: path.resolve(loaderPath, 'style.js'),
346a23e08bSopenharmony_ci  script: path.resolve(loaderPath, 'script.js'),
356a23e08bSopenharmony_ci  json: path.resolve(loaderPath, 'json.js'),
366a23e08bSopenharmony_ci  babel: loadBabelModule('babel-loader'),
376a23e08bSopenharmony_ci  manifest: path.resolve(loaderPath, 'manifest-loader.js'),
386a23e08bSopenharmony_ci  extgen: path.resolve(loaderPath, 'extgen.js')
396a23e08bSopenharmony_ci}
406a23e08bSopenharmony_ci
416a23e08bSopenharmony_cifunction getLoaderString (type, config) {
426a23e08bSopenharmony_ci  config = config || {}
436a23e08bSopenharmony_ci  const customLoader = loadCustomLoader(config)
446a23e08bSopenharmony_ci  let loaders
456a23e08bSopenharmony_ci  switch (type) {
466a23e08bSopenharmony_ci    case 'main':
476a23e08bSopenharmony_ci      return mainLoaderString(loaders)
486a23e08bSopenharmony_ci    case 'element':
496a23e08bSopenharmony_ci      return elementLoaderString(loaders, config)
506a23e08bSopenharmony_ci    case 'template':
516a23e08bSopenharmony_ci      return templateLoaderString(loaders, config, customLoader)
526a23e08bSopenharmony_ci    case 'style':
536a23e08bSopenharmony_ci      return styleLoaderString(loaders, config, customLoader)
546a23e08bSopenharmony_ci    case 'script':
556a23e08bSopenharmony_ci      return scriptLoaderString(loaders, config, customLoader)
566a23e08bSopenharmony_ci    case 'config':
576a23e08bSopenharmony_ci      return configLoaderString(loaders, config)
586a23e08bSopenharmony_ci    case 'data':
596a23e08bSopenharmony_ci      return dataLoaderString(loaders, config)
606a23e08bSopenharmony_ci  }
616a23e08bSopenharmony_ci}
626a23e08bSopenharmony_ci
636a23e08bSopenharmony_cifunction loadCustomLoader (config) {
646a23e08bSopenharmony_ci  if (config.lang && config.customLang[config.lang]) {
656a23e08bSopenharmony_ci    return loadBabelModule(config.customLang[config.lang][0])
666a23e08bSopenharmony_ci  }
676a23e08bSopenharmony_ci}
686a23e08bSopenharmony_ci
696a23e08bSopenharmony_cifunction mainLoaderString (loaders) {
706a23e08bSopenharmony_ci  loaders = [{
716a23e08bSopenharmony_ci    name: defaultLoaders.main
726a23e08bSopenharmony_ci  }]
736a23e08bSopenharmony_ci  return stringifyLoaders(loaders)
746a23e08bSopenharmony_ci}
756a23e08bSopenharmony_ci
766a23e08bSopenharmony_cifunction elementLoaderString (loaders, config) {
776a23e08bSopenharmony_ci  loaders = [{
786a23e08bSopenharmony_ci    name: defaultLoaders.main,
796a23e08bSopenharmony_ci    query: {
806a23e08bSopenharmony_ci      element: config.source ? undefined : true
816a23e08bSopenharmony_ci    }
826a23e08bSopenharmony_ci  }]
836a23e08bSopenharmony_ci  return stringifyLoaders(loaders)
846a23e08bSopenharmony_ci}
856a23e08bSopenharmony_ci
866a23e08bSopenharmony_cifunction templateLoaderString (loaders, config, customLoader) {
876a23e08bSopenharmony_ci  loaders = [{
886a23e08bSopenharmony_ci    name: defaultLoaders.json
896a23e08bSopenharmony_ci  }, {
906a23e08bSopenharmony_ci    name: defaultLoaders.template
916a23e08bSopenharmony_ci  }]
926a23e08bSopenharmony_ci  if (customLoader) {
936a23e08bSopenharmony_ci    loaders = loaders.concat(customLoader)
946a23e08bSopenharmony_ci  }
956a23e08bSopenharmony_ci  loaders.push({
966a23e08bSopenharmony_ci    name: defaultLoaders.extgen,
976a23e08bSopenharmony_ci    query: {
986a23e08bSopenharmony_ci      type: 'template'
996a23e08bSopenharmony_ci    }
1006a23e08bSopenharmony_ci  })
1016a23e08bSopenharmony_ci
1026a23e08bSopenharmony_ci  return stringifyLoaders(loaders)
1036a23e08bSopenharmony_ci}
1046a23e08bSopenharmony_ci
1056a23e08bSopenharmony_cifunction styleLoaderString (loaders, config, customLoader) {
1066a23e08bSopenharmony_ci  loaders = [{
1076a23e08bSopenharmony_ci    name: defaultLoaders.json
1086a23e08bSopenharmony_ci  }, {
1096a23e08bSopenharmony_ci    name: defaultLoaders.style
1106a23e08bSopenharmony_ci  }]
1116a23e08bSopenharmony_ci  if (customLoader) {
1126a23e08bSopenharmony_ci    loaders = loaders.concat(customLoader)
1136a23e08bSopenharmony_ci  }
1146a23e08bSopenharmony_ci  loaders.push({
1156a23e08bSopenharmony_ci    name: defaultLoaders.extgen,
1166a23e08bSopenharmony_ci    query: {
1176a23e08bSopenharmony_ci      type: 'style'
1186a23e08bSopenharmony_ci    }
1196a23e08bSopenharmony_ci  })
1206a23e08bSopenharmony_ci  return stringifyLoaders(loaders)
1216a23e08bSopenharmony_ci}
1226a23e08bSopenharmony_ci
1236a23e08bSopenharmony_cifunction scriptLoaderString (loaders, config, customLoader) {
1246a23e08bSopenharmony_ci  if (process.env.DEVICE_LEVEL === 'card') {
1256a23e08bSopenharmony_ci    loaders = [{
1266a23e08bSopenharmony_ci      name: defaultLoaders.json
1276a23e08bSopenharmony_ci    }]
1286a23e08bSopenharmony_ci    if (customLoader) {
1296a23e08bSopenharmony_ci      loaders = loaders.concat(customLoader);
1306a23e08bSopenharmony_ci    }
1316a23e08bSopenharmony_ci    loaders.push({
1326a23e08bSopenharmony_ci      name: defaultLoaders.extgen,
1336a23e08bSopenharmony_ci      query: {
1346a23e08bSopenharmony_ci        type: 'json'
1356a23e08bSopenharmony_ci      }
1366a23e08bSopenharmony_ci    })
1376a23e08bSopenharmony_ci  } else {
1386a23e08bSopenharmony_ci    loaders = [{
1396a23e08bSopenharmony_ci      name: defaultLoaders.script
1406a23e08bSopenharmony_ci    }]
1416a23e08bSopenharmony_ci    if (customLoader) {
1426a23e08bSopenharmony_ci      loaders = loaders.concat(customLoader)
1436a23e08bSopenharmony_ci    } else {
1446a23e08bSopenharmony_ci      loaders.push({
1456a23e08bSopenharmony_ci        name: defaultLoaders.babel,
1466a23e08bSopenharmony_ci        query: {
1476a23e08bSopenharmony_ci          presets: [loadBabelModule('@babel/preset-env')],
1486a23e08bSopenharmony_ci          targets: 'node 8',
1496a23e08bSopenharmony_ci          plugins: [loadBabelModule('@babel/plugin-transform-modules-commonjs')],
1506a23e08bSopenharmony_ci          comments: 'false'
1516a23e08bSopenharmony_ci        }
1526a23e08bSopenharmony_ci      })
1536a23e08bSopenharmony_ci    }
1546a23e08bSopenharmony_ci  }
1556a23e08bSopenharmony_ci  return stringifyLoaders(loaders)
1566a23e08bSopenharmony_ci}
1576a23e08bSopenharmony_ci
1586a23e08bSopenharmony_cifunction configLoaderString (loaders) {
1596a23e08bSopenharmony_ci  loaders = [{
1606a23e08bSopenharmony_ci    name: defaultLoaders.json
1616a23e08bSopenharmony_ci  }]
1626a23e08bSopenharmony_ci  return stringifyLoaders(loaders)
1636a23e08bSopenharmony_ci}
1646a23e08bSopenharmony_ci
1656a23e08bSopenharmony_cifunction dataLoaderString (loaders) {
1666a23e08bSopenharmony_ci  loaders = [{
1676a23e08bSopenharmony_ci    name: defaultLoaders.json
1686a23e08bSopenharmony_ci  }]
1696a23e08bSopenharmony_ci  return stringifyLoaders(loaders)
1706a23e08bSopenharmony_ci}
1716a23e08bSopenharmony_ci
1726a23e08bSopenharmony_cifunction codegenHmlAndCss() {
1736a23e08bSopenharmony_ci  const options = {
1746a23e08bSopenharmony_ci    lang: {
1756a23e08bSopenharmony_ci      sass:['sass-loader'],
1766a23e08bSopenharmony_ci      scss:['sass-loader'],
1776a23e08bSopenharmony_ci      less:['less-loader']
1786a23e08bSopenharmony_ci    }
1796a23e08bSopenharmony_ci  }
1806a23e08bSopenharmony_ci  const customLang = options.lang || {}
1816a23e08bSopenharmony_ci  const loaderQuery = loaderUtils.getOptions(this) || {}
1826a23e08bSopenharmony_ci  const isElement = loaderQuery.element
1836a23e08bSopenharmony_ci  const resourceQuery = this.resourceQuery && loaderUtils.parseQuery(this.resourceQuery) || {}
1846a23e08bSopenharmony_ci  const isEntry = resourceQuery.entry
1856a23e08bSopenharmony_ci  let output = ''
1866a23e08bSopenharmony_ci  let jsFileName = this.resourcePath.replace(process.env.aceSuperVisualPath, process.env.projectPath)
1876a23e08bSopenharmony_ci  jsFileName = jsFileName.substr(0, jsFileName.length - 6) + 'js';
1886a23e08bSopenharmony_ci
1896a23e08bSopenharmony_ci  if (process.env.DEVICE_LEVEL === 'card') {
1906a23e08bSopenharmony_ci    output = '//card_start\n'
1916a23e08bSopenharmony_ci    output += `var card_template =` + getRequireString(this,
1926a23e08bSopenharmony_ci      jsonLoaders('template', undefined, true, 'template'), this.resourcePath)
1936a23e08bSopenharmony_ci    output += `var card_style =` + getRequireString(this,
1946a23e08bSopenharmony_ci      jsonLoaders('style', undefined, true, 'style'), this.resourcePath)
1956a23e08bSopenharmony_ci    output += `var card_json =` + getRequireString(this,
1966a23e08bSopenharmony_ci      jsonLoaders('json', undefined, true, 'json'), this.resourcePath)
1976a23e08bSopenharmony_ci    output += '\n//card_end'
1986a23e08bSopenharmony_ci  } else {
1996a23e08bSopenharmony_ci    const that = this
2006a23e08bSopenharmony_ci    output = 'var $app_script$ = ' + generateOutput(that, 'script', jsFileName, isElement)
2016a23e08bSopenharmony_ci    output += 'var $app_template$ = ' + generateOutput(that, 'template', jsFileName, isElement)
2026a23e08bSopenharmony_ci    output += 'var $app_style$ = ' + generateOutput(that, 'style', jsFileName, isElement)
2036a23e08bSopenharmony_ci    output += generateOutput(that, 'others', jsFileName, isElement)
2046a23e08bSopenharmony_ci    if (isEntry) {
2056a23e08bSopenharmony_ci      output += `$app_bootstrap$('@app-component/${getNameByPath(this.resourcePath)}'`
2066a23e08bSopenharmony_ci        + ',undefined' + ',undefined' + `)`
2076a23e08bSopenharmony_ci    }
2086a23e08bSopenharmony_ci  }
2096a23e08bSopenharmony_ci  return output
2106a23e08bSopenharmony_ci}
2116a23e08bSopenharmony_ci
2126a23e08bSopenharmony_cifunction generateOutput(that, type, jsFileName, isElement, customLang) {
2136a23e08bSopenharmony_ci  let result
2146a23e08bSopenharmony_ci  switch (type) {
2156a23e08bSopenharmony_ci    case 'script':
2166a23e08bSopenharmony_ci      result = getRequireString(that, getLoaderString('script', {
2176a23e08bSopenharmony_ci        customLang,
2186a23e08bSopenharmony_ci        lang: undefined,
2196a23e08bSopenharmony_ci        element: undefined,
2206a23e08bSopenharmony_ci        elementName: undefined,
2216a23e08bSopenharmony_ci        source: jsFileName
2226a23e08bSopenharmony_ci      }), jsFileName)
2236a23e08bSopenharmony_ci      break
2246a23e08bSopenharmony_ci    case 'template':
2256a23e08bSopenharmony_ci      result = getRequireString(that, getLoaderString('template', {
2266a23e08bSopenharmony_ci        customLang,
2276a23e08bSopenharmony_ci        lang: undefined,
2286a23e08bSopenharmony_ci        element: isElement,
2296a23e08bSopenharmony_ci        elementName: undefined,
2306a23e08bSopenharmony_ci        source: that.resourcePath
2316a23e08bSopenharmony_ci      }), that.resourcePath)
2326a23e08bSopenharmony_ci      break
2336a23e08bSopenharmony_ci    case 'style':
2346a23e08bSopenharmony_ci      result = getRequireString(that, getLoaderString('style', {
2356a23e08bSopenharmony_ci        customLang,
2366a23e08bSopenharmony_ci        lang: undefined,
2376a23e08bSopenharmony_ci        element: isElement,
2386a23e08bSopenharmony_ci        elementName: undefined,
2396a23e08bSopenharmony_ci        source: that.resourcePath
2406a23e08bSopenharmony_ci      }), that.resourcePath)
2416a23e08bSopenharmony_ci      break
2426a23e08bSopenharmony_ci    case 'others':
2436a23e08bSopenharmony_ci      result = `
2446a23e08bSopenharmony_ci      $app_define$('@app-component/${getNameByPath(that.resourcePath)}', [],
2456a23e08bSopenharmony_ci        function($app_require$, $app_exports$, $app_module$) {
2466a23e08bSopenharmony_ci      ` + `
2476a23e08bSopenharmony_ci      $app_script$($app_module$, $app_exports$, $app_require$)
2486a23e08bSopenharmony_ci      if ($app_exports$.__esModule && $app_exports$.default) {
2496a23e08bSopenharmony_ci      $app_module$.exports = $app_exports$.default
2506a23e08bSopenharmony_ci      }
2516a23e08bSopenharmony_ci      ` + `
2526a23e08bSopenharmony_ci      $app_module$.exports.template = $app_template$
2536a23e08bSopenharmony_ci      ` + `
2546a23e08bSopenharmony_ci      $app_module$.exports.style = $app_style$
2556a23e08bSopenharmony_ci      ` + `
2566a23e08bSopenharmony_ci      })
2576a23e08bSopenharmony_ci      `
2586a23e08bSopenharmony_ci      break
2596a23e08bSopenharmony_ci  }
2606a23e08bSopenharmony_ci  return result
2616a23e08bSopenharmony_ci}
2626a23e08bSopenharmony_ci
2636a23e08bSopenharmony_cimodule.exports = codegenHmlAndCss