刮刮前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

396 lines
9.9 KiB

const fs = require('fs')
const path = require('path')
const merge = require('merge')
const {
parsePages,
normalizePath,
getPlatformProject,
isSupportSubPackages
} = require('@dcloudio/uni-cli-shared')
const {
updateAppJsonUsingComponents
} = require('@dcloudio/uni-cli-shared/lib/cache')
const {
darkmode,
hasTheme
} = require('@dcloudio/uni-cli-shared/lib/theme')
const {
hasOwn,
parseStyle,
trimMPJson,
NON_APP_JSON_KEYS
} = require('../util')
const uniI18n = require('@dcloudio/uni-cli-i18n')
function defaultCopy (name, value, json) {
json[name] = value
}
function isPlainObject (a) {
if (a === null) {
return false
}
return typeof a === 'object'
}
function deepCopy (name, value, json) {
if (isPlainObject(value) && isPlainObject(json[name])) {
json[name] = merge.recursive(true, json[name], value)
} else {
defaultCopy(name, value, json)
}
}
const pagesJson2AppJson = {
globalStyle: function (name, value, json) {
json.window = parseStyle(value)
if (json.window.usingComponents || json.window.usingSwanComponents) {
// 暂定 usingComponents 优先级高于 usingSwanComponents
json.usingComponents = Object.assign({}, json.window.usingSwanComponents, json.window.usingComponents)
delete json.window.usingComponents
delete json.window.usingSwanComponents
} else {
json.usingComponents = {}
}
},
tabBar: function (name, value, json, fromJson) {
if (value && value.list && value.list.length) {
if (value.list.length < 2) {
console.error(
uniI18n.__('pagesLoader.pagesTabbarMinItem2', {
0: 'tabBar.list'
})
)
}
const pages = json.pages
value.list.forEach((page, index) => {
if (!pages.includes(page.pagePath)) {
if (
!(
fromJson &&
fromJson.nvue &&
fromJson.nvue.pages &&
fromJson.nvue.pages.find(
({
path
}) => path === page.pagePath + '.html'
)
)
) {
console.error(
uniI18n.__('pagesLoader.needInPagesNode', {
0: `pages.json tabBar['list'][${index}]['pagePath'] "${page.pagePath}"`
})
)
}
}
})
}
json[name] = value
},
preloadRule: defaultCopy,
workers: defaultCopy,
plugins: defaultCopy,
entryPagePath: defaultCopy
}
const manifestJson2AppJson = {
networkTimeout: defaultCopy,
debug: defaultCopy
}
function parseCondition (projectJson, pagesJson) {
if (process.env.NODE_ENV === 'development') {
// 仅开发期间 condition 生效
// 启动Condition
const condition = getCondition(pagesJson)
if (condition) {
if (!projectJson.condition) {
projectJson.condition = {}
}
projectJson.condition.miniprogram = condition
}
}
}
const pagesJson2ProjectJson = {}
const manifestJson2ProjectJson = {
name: function (name, value, json) {
if (!value) {
value = path.basename(process.env.UNI_INPUT_DIR)
if (value === 'src') {
value = path.basename(path.dirname(process.env.UNI_INPUT_DIR))
}
}
json.projectname = value
}
}
const platformJson2ProjectJson = {
appid: defaultCopy,
setting: deepCopy,
miniprogramRoot: defaultCopy,
cloudfunctionRoot: defaultCopy,
qcloudRoot: defaultCopy,
pluginRoot: defaultCopy,
compileType: defaultCopy,
libVersion: defaultCopy,
projectname: defaultCopy,
packOptions: deepCopy,
debugOptions: deepCopy,
scripts: deepCopy,
cloudbaseRoot: defaultCopy
}
function copyToJson (json, fromJson, options) {
Object.keys(options).forEach(name => {
if (hasOwn(fromJson, name)) {
options[name](name, fromJson[name], json, fromJson)
}
})
}
function getCondition (pagesJson) {
const condition = pagesJson.condition
const launchPagePath = process.env.UNI_CLI_LAUNCH_PAGE_PATH || ''
const launchPageQuery = process.env.UNI_CLI_LAUNCH_PAGE_QUERY || ''
const launchPageOptions = {
id: 0,
name: launchPagePath, // 模式名称
pathName: launchPagePath, // 启动页面,必选
query: launchPageQuery // 启动参数,在页面的onLoad函数里面得到。
}
if (condition) {
let current = -1
if (Array.isArray(condition.list) && condition.list.length) {
condition.list.forEach(function (item, index) {
item.id = item.id || index
if (item.path) {
item.pathName = item.path
delete item.path
}
if (launchPagePath) {
if (
item.pathName === launchPagePath &&
item.query === launchPageQuery
) {
// 指定了入口页
current = index
}
}
})
if (launchPagePath) {
if (current !== -1) {
// 已存在
condition.current = current
} else {
// 不存在
condition.list.push(
Object.assign(launchPageOptions, {
id: condition.list.length
})
)
condition.current = condition.list.length - 1
}
}
return condition
}
}
if (launchPagePath) {
pagesJson.condition = {
current: 0,
list: [launchPageOptions]
}
return pagesJson.condition
}
return false
}
function weixinSkyline (config) {
return config.renderer === 'skyline' && config.lazyCodeLoading === 'requiredComponents'
}
function openES62ES5 (config) {
if (!config.setting) {
config.setting = {}
}
if (!config.setting.es6) {
config.setting.es6 = true
}
}
module.exports = function (pagesJson, manifestJson, project = {}) {
const app = {
pages: [],
subPackages: []
}
const subPackages = {}
parsePages(
pagesJson,
function (page) {
app.pages.push(page.path)
},
function (root, page, subPackage) {
if (!isSupportSubPackages()) {
// 不支持分包
app.pages.push(normalizePath(path.join(root, page.path)))
} else {
if (!subPackages[root]) {
subPackages[root] = {
root,
pages: []
}
Object.keys(subPackage).forEach(name => {
if (['root', 'pages'].indexOf(name) === -1) {
subPackages[root][name] = subPackage[name]
}
})
}
subPackages[root].pages.push(page.path)
}
}
)
Object.keys(subPackages).forEach(root => {
app.subPackages.push(subPackages[root])
})
copyToJson(app, pagesJson, pagesJson2AppJson)
copyToJson(app, manifestJson, manifestJson2AppJson)
if (app.usingComponents) {
updateAppJsonUsingComponents(app.usingComponents)
}
const themeLocation = (manifestJson[process.env.UNI_PLATFORM] || {}).themeLocation
if (darkmode() && hasTheme(themeLocation)) {
app.themeLocation = themeLocation || 'theme.json'
}
const projectName = getPlatformProject()
const projectPath =
projectName &&
path.resolve(process.env.VUE_CLI_CONTEXT || process.cwd(), projectName)
if (projectPath && fs.existsSync(projectPath)) {
// 自定义 project.config.json
const platform = process.env.UNI_PLATFORM
// app-plus时不需要处理平台配置到 app 中
if (platform !== 'app-plus' && hasOwn(manifestJson, platform)) {
const platformJson = manifestJson[platform] || {}
const projectKeys = Object.keys(platformJson2ProjectJson)
Object.keys(platformJson).forEach(key => {
if (
!projectKeys.includes(key) && !NON_APP_JSON_KEYS.includes(key)
) {
// usingComponents 是编译模式开关,需要过滤,不能拷贝到 app
app[key] = platformJson[key]
}
})
}
if (
platform === 'mp-weixin' ||
platform === 'mp-qq'
) {
// 微信不需要生成,其他平台做拷贝
return {
app: {
name: 'app',
content: trimMPJson(app)
}
}
}
return {
app: {
name: 'app',
content: trimMPJson(app)
},
project: {
name: 'project.config',
content: require(projectPath)
}
}
} else {
parseCondition(project, pagesJson)
copyToJson(project, pagesJson, pagesJson2ProjectJson)
copyToJson(project, manifestJson, manifestJson2ProjectJson)
const platform = process.env.UNI_PLATFORM
// app-plus时不需要处理平台配置到 app 中
if (platform !== 'app-plus' && hasOwn(manifestJson, platform)) {
const platformJson = manifestJson[platform] || {}
copyToJson(project, platformJson, platformJson2ProjectJson)
const projectKeys = Object.keys(platformJson2ProjectJson)
Object.keys(platformJson).forEach(key => {
if (
!projectKeys.includes(key) && !NON_APP_JSON_KEYS.includes(key)
) {
// usingComponents 是编译模式开关,需要过滤,不能拷贝到 app
app[key] = platformJson[key]
}
})
}
// 引用了原生小程序组件,自动开启 ES6=>ES5
const wxcomponentsPath = path.resolve(
process.env.UNI_INPUT_DIR,
'./wxcomponents'
)
if (fs.existsSync(wxcomponentsPath)) {
const wxcomponentsFiles = fs.readdirSync(wxcomponentsPath)
if (wxcomponentsFiles.length) {
if (!project.setting) {
project.setting = {}
}
project.setting.es6 = true
}
}
// 使用了微信小程序手势系统,自动开启 ES6=>ES5
platform === 'mp-weixin' && weixinSkyline(manifestJson[platform]) && openES62ES5(project)
if (process.env.UNI_AUTOMATOR_WS_ENDPOINT) {
if (!project.setting) {
project.setting = {}
}
// automator时,强制不检测域名
project.setting.urlCheck = false
}
if (!project.appid) {
project.appid = 'touristappid'
}
return {
app: {
name: 'app',
content: trimMPJson(app)
},
project: {
name: 'project.config',
content: project
}
}
}
}