188c88e8eSopenharmony_ci/*
288c88e8eSopenharmony_ci * Licensed to the Apache Software Foundation (ASF) under one
388c88e8eSopenharmony_ci * or more contributor license agreements.  See the NOTICE file
488c88e8eSopenharmony_ci * distributed with this work for additional information
588c88e8eSopenharmony_ci * regarding copyright ownership.  The ASF licenses this file
688c88e8eSopenharmony_ci * to you under the Apache License, Version 2.0 (the
788c88e8eSopenharmony_ci * "License"); you may not use this file except in compliance
888c88e8eSopenharmony_ci * with the License.  You may obtain a copy of the License at
988c88e8eSopenharmony_ci *
1088c88e8eSopenharmony_ci *   http://www.apache.org/licenses/LICENSE-2.0
1188c88e8eSopenharmony_ci *
1288c88e8eSopenharmony_ci * Unless required by applicable law or agreed to in writing,
1388c88e8eSopenharmony_ci * software distributed under the License is distributed on an
1488c88e8eSopenharmony_ci * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1588c88e8eSopenharmony_ci * KIND, either express or implied.  See the License for the
1688c88e8eSopenharmony_ci * specific language governing permissions and limitations
1788c88e8eSopenharmony_ci * under the License.
1888c88e8eSopenharmony_ci */
1988c88e8eSopenharmony_ci
2088c88e8eSopenharmony_ciimport loaderUtils from 'loader-utils'
2188c88e8eSopenharmony_ciimport path from 'path'
2288c88e8eSopenharmony_ciimport fs from 'fs'
2388c88e8eSopenharmony_ci
2488c88e8eSopenharmony_ciimport * as legacy from './legacy'
2588c88e8eSopenharmony_ciimport {
2688c88e8eSopenharmony_ci  parseFragment
2788c88e8eSopenharmony_ci}
2888c88e8eSopenharmony_cifrom './parser'
2988c88e8eSopenharmony_ciimport {
3088c88e8eSopenharmony_ci  getNameByPath,
3188c88e8eSopenharmony_ci  getRequireString,
3288c88e8eSopenharmony_ci  stringifyLoaders,
3388c88e8eSopenharmony_ci  logWarn,
3488c88e8eSopenharmony_ci  loadBabelModule,
3588c88e8eSopenharmony_ci  elements
3688c88e8eSopenharmony_ci}
3788c88e8eSopenharmony_cifrom './util'
3888c88e8eSopenharmony_ciimport { isReservedTag } from './templater/component_validator'
3988c88e8eSopenharmony_ci
4088c88e8eSopenharmony_ciconst { DEVICE_LEVEL } = require('./lite/lite-enum')
4188c88e8eSopenharmony_ciconst loaderPath = __dirname
4288c88e8eSopenharmony_ciconst defaultLoaders = {
4388c88e8eSopenharmony_ci  none: '',
4488c88e8eSopenharmony_ci  main: path.resolve(loaderPath, 'loader.js'),
4588c88e8eSopenharmony_ci  template: path.resolve(loaderPath, 'template.js'),
4688c88e8eSopenharmony_ci  style: path.resolve(loaderPath, 'style.js'),
4788c88e8eSopenharmony_ci  script: path.resolve(loaderPath, 'script.js'),
4888c88e8eSopenharmony_ci  json: path.resolve(loaderPath, 'json.js'),
4988c88e8eSopenharmony_ci  babel: loadBabelModule('babel-loader'),
5088c88e8eSopenharmony_ci  manifest: path.resolve(loaderPath, 'manifest-loader.js'),
5188c88e8eSopenharmony_ci  resourceReferenceScript: path.resolve(loaderPath, 'resource-reference-script.js')
5288c88e8eSopenharmony_ci}
5388c88e8eSopenharmony_ci
5488c88e8eSopenharmony_cifunction getLoaderString (type, config) {
5588c88e8eSopenharmony_ci  config = config || {}
5688c88e8eSopenharmony_ci  const customLoader = loadCustomLoader(config)
5788c88e8eSopenharmony_ci  let loaders
5888c88e8eSopenharmony_ci  switch (type) {
5988c88e8eSopenharmony_ci    case 'main':
6088c88e8eSopenharmony_ci      return mainLoaderString(loaders)
6188c88e8eSopenharmony_ci    case 'element':
6288c88e8eSopenharmony_ci      return elementLoaderString(loaders, config)
6388c88e8eSopenharmony_ci    case 'template':
6488c88e8eSopenharmony_ci      return templateLoaderString(loaders, config, customLoader)
6588c88e8eSopenharmony_ci    case 'style':
6688c88e8eSopenharmony_ci      return styleLoaderString(loaders, config, customLoader)
6788c88e8eSopenharmony_ci    case 'script':
6888c88e8eSopenharmony_ci      return scriptLoaderString(loaders, config, customLoader)
6988c88e8eSopenharmony_ci    case 'config':
7088c88e8eSopenharmony_ci      return configLoaderString(loaders, config)
7188c88e8eSopenharmony_ci    case 'data':
7288c88e8eSopenharmony_ci      return dataLoaderString(loaders, config)
7388c88e8eSopenharmony_ci  }
7488c88e8eSopenharmony_ci}
7588c88e8eSopenharmony_ci
7688c88e8eSopenharmony_cifunction loadCustomLoader (config) {
7788c88e8eSopenharmony_ci  if (config.lang && config.customLang[config.lang]) {
7888c88e8eSopenharmony_ci    return loadBabelModule(config.customLang[config.lang][0])
7988c88e8eSopenharmony_ci  }
8088c88e8eSopenharmony_ci}
8188c88e8eSopenharmony_ci
8288c88e8eSopenharmony_cifunction mainLoaderString (loaders) {
8388c88e8eSopenharmony_ci  loaders = [{
8488c88e8eSopenharmony_ci    name: defaultLoaders.main
8588c88e8eSopenharmony_ci  }]
8688c88e8eSopenharmony_ci  return stringifyLoaders(loaders)
8788c88e8eSopenharmony_ci}
8888c88e8eSopenharmony_ci
8988c88e8eSopenharmony_cifunction elementLoaderString (loaders, config) {
9088c88e8eSopenharmony_ci  loaders = [{
9188c88e8eSopenharmony_ci    name: defaultLoaders.main,
9288c88e8eSopenharmony_ci    query: {
9388c88e8eSopenharmony_ci      element: config.source ? undefined : true
9488c88e8eSopenharmony_ci    }
9588c88e8eSopenharmony_ci  }]
9688c88e8eSopenharmony_ci  return stringifyLoaders(loaders)
9788c88e8eSopenharmony_ci}
9888c88e8eSopenharmony_ci
9988c88e8eSopenharmony_cifunction templateLoaderString (loaders, config, customLoader) {
10088c88e8eSopenharmony_ci  loaders = [{
10188c88e8eSopenharmony_ci    name: defaultLoaders.json
10288c88e8eSopenharmony_ci  }, {
10388c88e8eSopenharmony_ci    name: defaultLoaders.template
10488c88e8eSopenharmony_ci  }]
10588c88e8eSopenharmony_ci  if (customLoader) {
10688c88e8eSopenharmony_ci    loaders = loaders.concat(customLoader)
10788c88e8eSopenharmony_ci  }
10888c88e8eSopenharmony_ci  return stringifyLoaders(loaders)
10988c88e8eSopenharmony_ci}
11088c88e8eSopenharmony_ci
11188c88e8eSopenharmony_cifunction styleLoaderString (loaders, config, customLoader) {
11288c88e8eSopenharmony_ci  loaders = [{
11388c88e8eSopenharmony_ci    name: defaultLoaders.json
11488c88e8eSopenharmony_ci  }, {
11588c88e8eSopenharmony_ci    name: defaultLoaders.style
11688c88e8eSopenharmony_ci  }]
11788c88e8eSopenharmony_ci  if (customLoader) {
11888c88e8eSopenharmony_ci    loaders = loaders.concat(customLoader)
11988c88e8eSopenharmony_ci  }
12088c88e8eSopenharmony_ci  return stringifyLoaders(loaders)
12188c88e8eSopenharmony_ci}
12288c88e8eSopenharmony_ci
12388c88e8eSopenharmony_cifunction scriptLoaderString (loaders, config, customLoader) {
12488c88e8eSopenharmony_ci  loaders = [{
12588c88e8eSopenharmony_ci    name: defaultLoaders.script
12688c88e8eSopenharmony_ci  }]
12788c88e8eSopenharmony_ci  if (customLoader) {
12888c88e8eSopenharmony_ci    loaders = loaders.concat(customLoader)
12988c88e8eSopenharmony_ci  }
13088c88e8eSopenharmony_ci  else {
13188c88e8eSopenharmony_ci    const isTargets = {
13288c88e8eSopenharmony_ci      'extends': path.resolve(__dirname, "../babel.config.js")
13388c88e8eSopenharmony_ci    }
13488c88e8eSopenharmony_ci    if (process.env.DEVICE_LEVEL === DEVICE_LEVEL.RICH) {
13588c88e8eSopenharmony_ci      isTargets['targets'] = 'node 8';
13688c88e8eSopenharmony_ci    }
13788c88e8eSopenharmony_ci    loaders.push({
13888c88e8eSopenharmony_ci      name: defaultLoaders.babel,
13988c88e8eSopenharmony_ci      query: isTargets,
14088c88e8eSopenharmony_ci    })
14188c88e8eSopenharmony_ci    loaders.push({
14288c88e8eSopenharmony_ci      name: defaultLoaders.resourceReferenceScript
14388c88e8eSopenharmony_ci    })
14488c88e8eSopenharmony_ci  }
14588c88e8eSopenharmony_ci  if (config.app && process.env.abilityType === 'page' &&
14688c88e8eSopenharmony_ci    fs.existsSync(process.env.aceManifestPath)) {
14788c88e8eSopenharmony_ci    loaders.push({
14888c88e8eSopenharmony_ci      name: defaultLoaders.manifest,
14988c88e8eSopenharmony_ci      query: {
15088c88e8eSopenharmony_ci        path: config.source
15188c88e8eSopenharmony_ci      }
15288c88e8eSopenharmony_ci    })
15388c88e8eSopenharmony_ci  }
15488c88e8eSopenharmony_ci  return stringifyLoaders(loaders)
15588c88e8eSopenharmony_ci}
15688c88e8eSopenharmony_ci
15788c88e8eSopenharmony_cifunction configLoaderString (loaders, config) {
15888c88e8eSopenharmony_ci  loaders = [{
15988c88e8eSopenharmony_ci    name: defaultLoaders.json
16088c88e8eSopenharmony_ci  }]
16188c88e8eSopenharmony_ci  return stringifyLoaders(loaders)
16288c88e8eSopenharmony_ci}
16388c88e8eSopenharmony_ci
16488c88e8eSopenharmony_cifunction dataLoaderString (loaders, config) {
16588c88e8eSopenharmony_ci  loaders = [{
16688c88e8eSopenharmony_ci    name: defaultLoaders.json
16788c88e8eSopenharmony_ci  }]
16888c88e8eSopenharmony_ci  return stringifyLoaders(loaders)
16988c88e8eSopenharmony_ci}
17088c88e8eSopenharmony_ci
17188c88e8eSopenharmony_cifunction loader (source) {
17288c88e8eSopenharmony_ci  this.cacheable && this.cacheable()
17388c88e8eSopenharmony_ci
17488c88e8eSopenharmony_ci  const options = {
17588c88e8eSopenharmony_ci    lang: {
17688c88e8eSopenharmony_ci      sass:['sass-loader'],
17788c88e8eSopenharmony_ci      scss:['sass-loader'],
17888c88e8eSopenharmony_ci      less:['less-loader']
17988c88e8eSopenharmony_ci    }
18088c88e8eSopenharmony_ci  }
18188c88e8eSopenharmony_ci  const customLang = options.lang || {}
18288c88e8eSopenharmony_ci  const resourceQuery = this.resourceQuery && loaderUtils.parseQuery(this.resourceQuery) || {}
18388c88e8eSopenharmony_ci  const isEntry = resourceQuery.entry
18488c88e8eSopenharmony_ci  const dirName = path.parse(this.resourcePath)
18588c88e8eSopenharmony_ci  const name = isEntry ? dirName.name : resourceQuery.name || getNameByPath(this.resourcePath)
18688c88e8eSopenharmony_ci  let parentPath = resourceQuery.parentPath || this.resourcePath;
18788c88e8eSopenharmony_ci  if (isEntry) {
18888c88e8eSopenharmony_ci    elements[this.resourcePath] = elements[this.resourcePath] || {};
18988c88e8eSopenharmony_ci    elements[this.resourcePath][name] = true;
19088c88e8eSopenharmony_ci  } else {
19188c88e8eSopenharmony_ci    elements[this.resourcePath] = elements[this.resourcePath] || {};
19288c88e8eSopenharmony_ci    elements[this.resourcePath]["parent"] = parentPath;
19388c88e8eSopenharmony_ci    if (elements[parentPath] && elements[parentPath]["parent"]) {
19488c88e8eSopenharmony_ci      elements[this.resourcePath]["parent"] = elements[elements[parentPath]["parent"]];
19588c88e8eSopenharmony_ci      parentPath = elements[this.resourcePath]["parent"];
19688c88e8eSopenharmony_ci    }
19788c88e8eSopenharmony_ci  }
19888c88e8eSopenharmony_ci  if (isReservedTag(name) && process.env.abilityType === 'page') {
19988c88e8eSopenharmony_ci    logWarn(this, [{
20088c88e8eSopenharmony_ci      reason: 'ERROR: The file name cannot contain reserved tag name: ' + name
20188c88e8eSopenharmony_ci    }])
20288c88e8eSopenharmony_ci    return ''
20388c88e8eSopenharmony_ci  }
20488c88e8eSopenharmony_ci  let output = ''
20588c88e8eSopenharmony_ci  //  import app.js
20688c88e8eSopenharmony_ci  output += loadApp(this, name, isEntry, customLang, source)
20788c88e8eSopenharmony_ci  output += loadPage(this, name, isEntry, customLang, source, parentPath);
20888c88e8eSopenharmony_ci  return output
20988c88e8eSopenharmony_ci}
21088c88e8eSopenharmony_ci
21188c88e8eSopenharmony_cifunction checkApp(_this) {
21288c88e8eSopenharmony_ci  if (process.env.abilityType === 'testrunner') {
21388c88e8eSopenharmony_ci    return true;
21488c88e8eSopenharmony_ci  }
21588c88e8eSopenharmony_ci  return _this.resourcePath === path.resolve(process.env.projectPath,
21688c88e8eSopenharmony_ci    process.env.abilityType === 'page' ? 'app.js' : `${process.env.abilityType}.js`)
21788c88e8eSopenharmony_ci}
21888c88e8eSopenharmony_ci
21988c88e8eSopenharmony_cifunction loadApp (_this, name, isEntry, customLang, source) {
22088c88e8eSopenharmony_ci  let output = ''
22188c88e8eSopenharmony_ci  let extcss = false
22288c88e8eSopenharmony_ci  if (checkApp(_this)) {
22388c88e8eSopenharmony_ci    const filename = _this.resourcePath.replace(path.extname(_this.resourcePath).toString(), '')
22488c88e8eSopenharmony_ci     // find css
22588c88e8eSopenharmony_ci    const cssFileName = filename + '.css'
22688c88e8eSopenharmony_ci    if (!fs.existsSync(cssFileName)) {
22788c88e8eSopenharmony_ci      extcss = false
22888c88e8eSopenharmony_ci    }
22988c88e8eSopenharmony_ci    else {
23088c88e8eSopenharmony_ci      extcss = true
23188c88e8eSopenharmony_ci      output += 'var $app_style$ = ' + getRequireString(_this, getLoaderString('style', {
23288c88e8eSopenharmony_ci        customLang,
23388c88e8eSopenharmony_ci        lang: undefined,
23488c88e8eSopenharmony_ci        element: undefined,
23588c88e8eSopenharmony_ci        elementName: undefined,
23688c88e8eSopenharmony_ci        source: cssFileName
23788c88e8eSopenharmony_ci      }), cssFileName)
23888c88e8eSopenharmony_ci    }
23988c88e8eSopenharmony_ci    output += 'var $app_script$ = ' + getRequireString(_this, getLoaderString('script', {
24088c88e8eSopenharmony_ci      customLang,
24188c88e8eSopenharmony_ci      lang: undefined,
24288c88e8eSopenharmony_ci      element: undefined,
24388c88e8eSopenharmony_ci      elementName: undefined,
24488c88e8eSopenharmony_ci      source: _this.resourcePath,
24588c88e8eSopenharmony_ci      app: true
24688c88e8eSopenharmony_ci    }), _this.resourcePath)
24788c88e8eSopenharmony_ci
24888c88e8eSopenharmony_ci    if (process.env.DEVICE_LEVEL === DEVICE_LEVEL.RICH || process.env.DEVICE_LEVEL === 'card') {
24988c88e8eSopenharmony_ci      output += `
25088c88e8eSopenharmony_ci      $app_define$('@app-application/${name}', [], function($app_require$, $app_exports$, $app_module$) {
25188c88e8eSopenharmony_ci      ` + `
25288c88e8eSopenharmony_ci      $app_script$($app_module$, $app_exports$, $app_require$)
25388c88e8eSopenharmony_ci      if ($app_exports$.__esModule && $app_exports$.default) {
25488c88e8eSopenharmony_ci        $app_module$.exports = $app_exports$.default
25588c88e8eSopenharmony_ci      }
25688c88e8eSopenharmony_ci      ` + (extcss ? `
25788c88e8eSopenharmony_ci      $app_module$.exports.style = $app_style$
25888c88e8eSopenharmony_ci      ` : '')
25988c88e8eSopenharmony_ci      + `
26088c88e8eSopenharmony_ci      })
26188c88e8eSopenharmony_ci      `
26288c88e8eSopenharmony_ci      if (isEntry) {
26388c88e8eSopenharmony_ci        output += `$app_bootstrap$('@app-application/${name}'` + ',undefined' + ',undefined' + `)`
26488c88e8eSopenharmony_ci      }
26588c88e8eSopenharmony_ci    }
26688c88e8eSopenharmony_ci    if (process.env.DEVICE_LEVEL === DEVICE_LEVEL.LITE) {
26788c88e8eSopenharmony_ci      output += `var options=$app_script$\n if ($app_script$.__esModule) {\n
26888c88e8eSopenharmony_ci        options = $app_script$.default;\n }\n` +
26988c88e8eSopenharmony_ci      (extcss ? `options.styleSheet=$app_style$\n` : ``) +
27088c88e8eSopenharmony_ci      `module.exports=new ViewModel(options);`
27188c88e8eSopenharmony_ci    }
27288c88e8eSopenharmony_ci    return output
27388c88e8eSopenharmony_ci  } else if (/\.js$/.test(_this.resourcePath)) {
27488c88e8eSopenharmony_ci    return source
27588c88e8eSopenharmony_ci  } else {
27688c88e8eSopenharmony_ci    return output
27788c88e8eSopenharmony_ci  }
27888c88e8eSopenharmony_ci}
27988c88e8eSopenharmony_ci
28088c88e8eSopenharmony_cifunction loadPage (_this, name, isEntry, customLang, source, parentPath) {
28188c88e8eSopenharmony_ci  let output = ''
28288c88e8eSopenharmony_ci  if (path.extname(_this.resourcePath).match(/\.hml/)) {
28388c88e8eSopenharmony_ci    const filename = _this.resourcePath.replace(path.extname(_this.resourcePath).toString(), '')
28488c88e8eSopenharmony_ci    const resourcePath = _this.resourcePath
28588c88e8eSopenharmony_ci    const loaderQuery = loaderUtils.getOptions(_this) || {}
28688c88e8eSopenharmony_ci    const isElement = loaderQuery.element
28788c88e8eSopenharmony_ci    const frag = parseFragment(source)
28888c88e8eSopenharmony_ci    const elementNames = []
28988c88e8eSopenharmony_ci    const elementLength = frag.element.length
29088c88e8eSopenharmony_ci    output += loadPageCheckElementLength(_this, elementLength, frag, elementNames, resourcePath,
29188c88e8eSopenharmony_ci      customLang, parentPath);
29288c88e8eSopenharmony_ci
29388c88e8eSopenharmony_ci    output += 'var $app_template$ = ' + getRequireString(_this, getLoaderString('template', {
29488c88e8eSopenharmony_ci      customLang,
29588c88e8eSopenharmony_ci      lang: undefined,
29688c88e8eSopenharmony_ci      element: isElement,
29788c88e8eSopenharmony_ci      elementName: isElement ? name : undefined,
29888c88e8eSopenharmony_ci      source: _this.resourcePath
29988c88e8eSopenharmony_ci    }), _this.resourcePath)
30088c88e8eSopenharmony_ci
30188c88e8eSopenharmony_ci    // find css
30288c88e8eSopenharmony_ci    const cssContent = loadPageFindCss(_this, filename, customLang)
30388c88e8eSopenharmony_ci    const extcss = cssContent.extcss
30488c88e8eSopenharmony_ci    output += cssContent.output
30588c88e8eSopenharmony_ci
30688c88e8eSopenharmony_ci    // find js
30788c88e8eSopenharmony_ci    const scriptContent = loadPageFindJs(_this, filename, customLang)
30888c88e8eSopenharmony_ci    const extscript = scriptContent.extscript
30988c88e8eSopenharmony_ci    output += scriptContent.output
31088c88e8eSopenharmony_ci
31188c88e8eSopenharmony_ci    output += process.env.DEVICE_LEVEL === DEVICE_LEVEL.RICH ? loadPageCheckRich(name, extscript, extcss, isEntry) :
31288c88e8eSopenharmony_ci      loadPageCheckLite(extscript, extcss)
31388c88e8eSopenharmony_ci    return output
31488c88e8eSopenharmony_ci  }
31588c88e8eSopenharmony_ci  return output
31688c88e8eSopenharmony_ci}
31788c88e8eSopenharmony_ci
31888c88e8eSopenharmony_cifunction loadPageCheckElementLength (_this, elementLength, frag, elementNames, resourcePath,
31988c88e8eSopenharmony_ci  customLang, parentPath) {
32088c88e8eSopenharmony_ci  let output = ''
32188c88e8eSopenharmony_ci  if (elementLength) {
32288c88e8eSopenharmony_ci    for (let i = 0; i < elementLength; i++) {
32388c88e8eSopenharmony_ci      const element = frag.element[i]
32488c88e8eSopenharmony_ci      let src = resourcePath
32588c88e8eSopenharmony_ci      if (element.src) {
32688c88e8eSopenharmony_ci        src = element.src
32788c88e8eSopenharmony_ci        if (!src.match(/\.hml$/)) {
32888c88e8eSopenharmony_ci          src = src.concat('.hml')
32988c88e8eSopenharmony_ci        }
33088c88e8eSopenharmony_ci        const filePath = path.join(path.dirname(resourcePath), src)
33188c88e8eSopenharmony_ci        if (!fs.existsSync(filePath) && src.match(/^(\/|\.)/)) {
33288c88e8eSopenharmony_ci          logWarn(_this, [{
33388c88e8eSopenharmony_ci            reason: 'ERROR: The file path of custom element does not exist, src: ' + src
33488c88e8eSopenharmony_ci          }])
33588c88e8eSopenharmony_ci          return ''
33688c88e8eSopenharmony_ci        }
33788c88e8eSopenharmony_ci        if (!element.name) {
33888c88e8eSopenharmony_ci          element.name = path.parse(src).name
33988c88e8eSopenharmony_ci        }
34088c88e8eSopenharmony_ci        element.name = element.name.toLowerCase();
34188c88e8eSopenharmony_ci        elements[parentPath] = elements[parentPath] || {};
34288c88e8eSopenharmony_ci        if (elements[parentPath][element.name]) {
34388c88e8eSopenharmony_ci          logWarn(_this, [{
34488c88e8eSopenharmony_ci            reason: `ERROR: The element name can not be same with the page ` +
34588c88e8eSopenharmony_ci              `"${element.name}" (ignore case).`
34688c88e8eSopenharmony_ci          }]);
34788c88e8eSopenharmony_ci        } else {
34888c88e8eSopenharmony_ci          elements[parentPath][element.name] = true;
34988c88e8eSopenharmony_ci        }
35088c88e8eSopenharmony_ci        checkEntry(_this, filePath, element.src)
35188c88e8eSopenharmony_ci      }
35288c88e8eSopenharmony_ci      else {
35388c88e8eSopenharmony_ci        logWarn(_this, [{
35488c88e8eSopenharmony_ci          reason: 'ERROR: src attributes must be set for custom elements.'
35588c88e8eSopenharmony_ci        }])
35688c88e8eSopenharmony_ci        return ''
35788c88e8eSopenharmony_ci      }
35888c88e8eSopenharmony_ci      elementNames.push(element.name)
35988c88e8eSopenharmony_ci      output += getRequireString(_this, getLoaderString('element', {
36088c88e8eSopenharmony_ci        customLang,
36188c88e8eSopenharmony_ci        name: element.name,
36288c88e8eSopenharmony_ci        source: src
36388c88e8eSopenharmony_ci      }), `${src}?name=${element.name}&parentPath=${parentPath}`)
36488c88e8eSopenharmony_ci    }
36588c88e8eSopenharmony_ci  }
36688c88e8eSopenharmony_ci  return output
36788c88e8eSopenharmony_ci}
36888c88e8eSopenharmony_ci
36988c88e8eSopenharmony_cifunction loadPageFindCss (_this, filename, customLang) {
37088c88e8eSopenharmony_ci  let output = ''
37188c88e8eSopenharmony_ci  let extcss = false
37288c88e8eSopenharmony_ci  const cssFileName = filename + '.css'
37388c88e8eSopenharmony_ci  if (fs.existsSync(cssFileName)) {
37488c88e8eSopenharmony_ci    extcss = true
37588c88e8eSopenharmony_ci    output = 'var $app_style$ = ' + getRequireString(_this, getLoaderString('style', {
37688c88e8eSopenharmony_ci      customLang,
37788c88e8eSopenharmony_ci      lang: undefined,
37888c88e8eSopenharmony_ci      element: undefined,
37988c88e8eSopenharmony_ci      elementName: undefined,
38088c88e8eSopenharmony_ci      source: cssFileName
38188c88e8eSopenharmony_ci    }), cssFileName)
38288c88e8eSopenharmony_ci  }
38388c88e8eSopenharmony_ci  else {
38488c88e8eSopenharmony_ci    // find less
38588c88e8eSopenharmony_ci    const lessFileName = filename + '.less'
38688c88e8eSopenharmony_ci    if (fs.existsSync(lessFileName)) {
38788c88e8eSopenharmony_ci      extcss = true
38888c88e8eSopenharmony_ci      output = 'var $app_style$ = ' + getRequireString(_this, getLoaderString('style', {
38988c88e8eSopenharmony_ci        customLang,
39088c88e8eSopenharmony_ci        lang: 'less',
39188c88e8eSopenharmony_ci        element: undefined,
39288c88e8eSopenharmony_ci        elementName: undefined,
39388c88e8eSopenharmony_ci        source: lessFileName
39488c88e8eSopenharmony_ci      }), lessFileName)
39588c88e8eSopenharmony_ci    }
39688c88e8eSopenharmony_ci    else {
39788c88e8eSopenharmony_ci      // find scss
39888c88e8eSopenharmony_ci      const scssFileName = filename + '.scss'
39988c88e8eSopenharmony_ci      if (fs.existsSync(scssFileName)) {
40088c88e8eSopenharmony_ci        extcss = true
40188c88e8eSopenharmony_ci        output = 'var $app_style$ = ' + getRequireString(_this, getLoaderString('style', {
40288c88e8eSopenharmony_ci          customLang,
40388c88e8eSopenharmony_ci          lang: 'scss',
40488c88e8eSopenharmony_ci          element: undefined,
40588c88e8eSopenharmony_ci          elementName: undefined,
40688c88e8eSopenharmony_ci          source: scssFileName
40788c88e8eSopenharmony_ci        }), scssFileName)
40888c88e8eSopenharmony_ci      }
40988c88e8eSopenharmony_ci      else {
41088c88e8eSopenharmony_ci        // find sass
41188c88e8eSopenharmony_ci        const sassFileName = filename + '.sass'
41288c88e8eSopenharmony_ci        if (fs.existsSync(sassFileName)) {
41388c88e8eSopenharmony_ci          extcss = true
41488c88e8eSopenharmony_ci          output = 'var $app_style$ = ' + getRequireString(_this, getLoaderString('style', {
41588c88e8eSopenharmony_ci            customLang,
41688c88e8eSopenharmony_ci            lang: 'sass',
41788c88e8eSopenharmony_ci            element: undefined,
41888c88e8eSopenharmony_ci            elementName: undefined,
41988c88e8eSopenharmony_ci            source: sassFileName
42088c88e8eSopenharmony_ci          }), sassFileName)
42188c88e8eSopenharmony_ci        }
42288c88e8eSopenharmony_ci        else {
42388c88e8eSopenharmony_ci          extcss = false
42488c88e8eSopenharmony_ci        }
42588c88e8eSopenharmony_ci      }
42688c88e8eSopenharmony_ci    }
42788c88e8eSopenharmony_ci  }
42888c88e8eSopenharmony_ci  return {
42988c88e8eSopenharmony_ci    extcss: extcss,
43088c88e8eSopenharmony_ci    output: output
43188c88e8eSopenharmony_ci  }
43288c88e8eSopenharmony_ci}
43388c88e8eSopenharmony_ci
43488c88e8eSopenharmony_cifunction loadPageFindJs (_this, filename, customLang) {
43588c88e8eSopenharmony_ci  let output = ''
43688c88e8eSopenharmony_ci  let extscript = false
43788c88e8eSopenharmony_ci  const jsFileName = filename + '.js'
43888c88e8eSopenharmony_ci  if (!fs.existsSync(jsFileName)) {
43988c88e8eSopenharmony_ci    extscript = false
44088c88e8eSopenharmony_ci    console.log('missing ' + jsFileName)
44188c88e8eSopenharmony_ci  }
44288c88e8eSopenharmony_ci  else {
44388c88e8eSopenharmony_ci    extscript = true
44488c88e8eSopenharmony_ci    output = 'var $app_script$ = ' + getRequireString(_this, getLoaderString('script', {
44588c88e8eSopenharmony_ci      customLang,
44688c88e8eSopenharmony_ci      lang: undefined,
44788c88e8eSopenharmony_ci      element: undefined,
44888c88e8eSopenharmony_ci      elementName: undefined,
44988c88e8eSopenharmony_ci      source: jsFileName
45088c88e8eSopenharmony_ci    }), jsFileName)
45188c88e8eSopenharmony_ci  }
45288c88e8eSopenharmony_ci  return {
45388c88e8eSopenharmony_ci    extscript: extscript,
45488c88e8eSopenharmony_ci    output: output
45588c88e8eSopenharmony_ci  }
45688c88e8eSopenharmony_ci}
45788c88e8eSopenharmony_ci
45888c88e8eSopenharmony_cifunction loadPageCheckRich (name, extscript, extcss, isEntry) {
45988c88e8eSopenharmony_ci  let output = ''
46088c88e8eSopenharmony_ci  output += `
46188c88e8eSopenharmony_ci$app_define$('@app-component/${name}', [], function($app_require$, $app_exports$, $app_module$) {
46288c88e8eSopenharmony_ci` + (extscript ? `
46388c88e8eSopenharmony_ci$app_script$($app_module$, $app_exports$, $app_require$)
46488c88e8eSopenharmony_ciif ($app_exports$.__esModule && $app_exports$.default) {
46588c88e8eSopenharmony_ci$app_module$.exports = $app_exports$.default
46688c88e8eSopenharmony_ci}
46788c88e8eSopenharmony_ci` : '') + `
46888c88e8eSopenharmony_ci$app_module$.exports.template = $app_template$
46988c88e8eSopenharmony_ci` + (extcss ? `
47088c88e8eSopenharmony_ci$app_module$.exports.style = $app_style$
47188c88e8eSopenharmony_ci` : '') + `
47288c88e8eSopenharmony_ci})
47388c88e8eSopenharmony_ci`
47488c88e8eSopenharmony_ci  if (isEntry) {
47588c88e8eSopenharmony_ci    output += `$app_bootstrap$('@app-component/${name}'` + ',undefined' + ',undefined' + `)`
47688c88e8eSopenharmony_ci  }
47788c88e8eSopenharmony_ci  return output
47888c88e8eSopenharmony_ci}
47988c88e8eSopenharmony_ci
48088c88e8eSopenharmony_cifunction loadPageCheckLite (extscript, extcss) {
48188c88e8eSopenharmony_ci  return (extscript ? `var options=$app_script$\n if ($app_script$.__esModule) {\n
48288c88e8eSopenharmony_ci      options = $app_script$.default;\n }\n` : `var options={}\n`) +
48388c88e8eSopenharmony_ci    (extcss ? `options.styleSheet=$app_style$\n` : ``) +
48488c88e8eSopenharmony_ci    `options.render=$app_template$;\nmodule.exports=new ViewModel(options);`
48588c88e8eSopenharmony_ci}
48688c88e8eSopenharmony_ci
48788c88e8eSopenharmony_cifor (const key in legacy) {
48888c88e8eSopenharmony_ci  loader[key] = legacy[key]
48988c88e8eSopenharmony_ci}
49088c88e8eSopenharmony_ci
49188c88e8eSopenharmony_cifunction checkEntry(_this, filePath, elementSrc) {
49288c88e8eSopenharmony_ci  if (_this._compilation.entries) {
49388c88e8eSopenharmony_ci    for (var key of _this._compilation.entries.keys()) {
49488c88e8eSopenharmony_ci      const entryPath = path.join(path.resolve(process.env.projectPath), key + '.hml');
49588c88e8eSopenharmony_ci      if (entryPath === filePath) {
49688c88e8eSopenharmony_ci        logWarn(_this, [{
49788c88e8eSopenharmony_ci          reason: `WARNING: The page "${elementSrc}" configured in 'config.json'` +
49888c88e8eSopenharmony_ci            ` can not be uesd as a custom component.` +
49988c88e8eSopenharmony_ci            `To ensure that the debugging function is normal, please delete this page in 'config.json'.`
50088c88e8eSopenharmony_ci        }]);
50188c88e8eSopenharmony_ci      }
50288c88e8eSopenharmony_ci    }
50388c88e8eSopenharmony_ci  }
50488c88e8eSopenharmony_ci}
50588c88e8eSopenharmony_ci
50688c88e8eSopenharmony_cimodule.exports = loader