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