@cloudbase/framework-plugin-low-code 0.6.44-alpha.0 → 0.6.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/builder/config/common.js +0 -1
- package/lib/builder/config/index.js +0 -1
- package/lib/builder/config/mp.js +0 -1
- package/lib/builder/core/copy.js +0 -1
- package/lib/builder/core/generate.js +0 -1
- package/lib/builder/core/index.js +0 -1
- package/lib/builder/core/material.js +0 -1
- package/lib/builder/core/plugin.js +0 -1
- package/lib/builder/core/prepare.js +0 -1
- package/lib/builder/core/webpack.js +0 -1
- package/lib/builder/mp/BuildContext.js +0 -1
- package/lib/builder/mp/index.js +0 -1
- package/lib/builder/mp/lowcode.d.ts.map +1 -1
- package/lib/builder/mp/lowcode.js +2 -3
- package/lib/builder/mp/materials.js +0 -1
- package/lib/builder/mp/mixMode.js +0 -1
- package/lib/builder/mp/mp_config.js +0 -1
- package/lib/builder/mp/util.js +0 -1
- package/lib/builder/mp/wxml.js +0 -1
- package/lib/builder/service/builder/copy.js +0 -1
- package/lib/builder/service/builder/generate.js +2 -3
- package/lib/builder/service/builder/index.js +0 -1
- package/lib/builder/service/builder/plugin.js +0 -1
- package/lib/builder/service/builder/webpack.js +0 -1
- package/lib/builder/types/common.js +0 -1
- package/lib/builder/util/common.js +0 -1
- package/lib/builder/util/console.js +0 -1
- package/lib/builder/util/generateFiles.js +0 -1
- package/lib/builder/util/index.js +0 -1
- package/lib/builder/util/junk.js +0 -1
- package/lib/builder/util/mp.js +0 -1
- package/lib/builder/util/name-mangler.js +0 -1
- package/lib/builder/util/net.js +0 -1
- package/lib/builder/util/process.js +0 -1
- package/lib/builder/util/style.js +0 -1
- package/lib/builder/util/weapp.js +0 -1
- package/lib/generate.js +0 -1
- package/lib/generator/config/common.js +0 -1
- package/lib/generator/config/index.js +0 -1
- package/lib/generator/config/mp.js +0 -1
- package/lib/generator/core/generate.d.ts.map +1 -1
- package/lib/generator/core/generate.js +4 -6
- package/lib/generator/core/index.js +0 -1
- package/lib/generator/core/material.d.ts.map +1 -1
- package/lib/generator/core/material.js +2 -2
- package/lib/generator/template.d.ts +1 -101
- package/lib/generator/template.d.ts.map +1 -1
- package/lib/generator/template.js +1 -102
- package/lib/generator/types/common.js +0 -1
- package/lib/generator/util/common.js +0 -1
- package/lib/generator/util/console.js +0 -1
- package/lib/generator/util/index.js +0 -1
- package/lib/generator/util/name-mangler.js +0 -1
- package/lib/generator/util/postcss-rpx.js +0 -1
- package/lib/generator/util/style.js +0 -1
- package/lib/generator/util/weapp.js +0 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +51 -41
- package/lib/types.js +0 -1
- package/lib/utils/common.js +0 -1
- package/lib/utils/dataSource.js +0 -1
- package/lib/utils/index.js +0 -1
- package/lib/utils/postProcess.js +0 -1
- package/lib/weapps-core/config/index.js +0 -1
- package/lib/weapps-core/config/style.js +0 -1
- package/lib/weapps-core/index.js +0 -1
- package/lib/weapps-core/types/action.js +0 -1
- package/lib/weapps-core/types/app.js +0 -1
- package/lib/weapps-core/types/appbuild.js +0 -1
- package/lib/weapps-core/types/code_types.js +0 -1
- package/lib/weapps-core/types/git.js +0 -1
- package/lib/weapps-core/types/index.js +0 -1
- package/lib/weapps-core/types/lowcode.js +0 -1
- package/lib/weapps-core/types/material.js +0 -1
- package/lib/weapps-core/types/plugins.js +0 -1
- package/lib/weapps-core/types/style.js +0 -1
- package/lib/weapps-core/types/web.js +0 -1
- package/lib/weapps-core/utils/appbuild.js +0 -1
- package/lib/weapps-core/utils/common.js +0 -1
- package/lib/weapps-core/utils/file.js +0 -1
- package/lib/weapps-core/utils/formily.js +0 -1
- package/lib/weapps-core/utils/index.js +0 -1
- package/lib/weapps-core/utils/lowcdoe.js +0 -1
- package/lib/weapps-core/utils/style.js +0 -1
- package/package.json +1 -1
- package/template/html/index.html.ejs +1 -14
- package/template/mp/package.json +1 -1
- package/lib/builder/config/common.js.map +0 -1
- package/lib/builder/config/index.js.map +0 -1
- package/lib/builder/config/mp.js.map +0 -1
- package/lib/builder/core/copy.js.map +0 -1
- package/lib/builder/core/generate.js.map +0 -1
- package/lib/builder/core/index.js.map +0 -1
- package/lib/builder/core/material.js.map +0 -1
- package/lib/builder/core/plugin.js.map +0 -1
- package/lib/builder/core/prepare.js.map +0 -1
- package/lib/builder/core/webpack.js.map +0 -1
- package/lib/builder/mp/BuildContext.js.map +0 -1
- package/lib/builder/mp/index.js.map +0 -1
- package/lib/builder/mp/lowcode.js.map +0 -1
- package/lib/builder/mp/materials.js.map +0 -1
- package/lib/builder/mp/mixMode.js.map +0 -1
- package/lib/builder/mp/mp_config.js.map +0 -1
- package/lib/builder/mp/util.js.map +0 -1
- package/lib/builder/mp/wxml.js.map +0 -1
- package/lib/builder/service/builder/copy.js.map +0 -1
- package/lib/builder/service/builder/generate.js.map +0 -1
- package/lib/builder/service/builder/index.js.map +0 -1
- package/lib/builder/service/builder/plugin.js.map +0 -1
- package/lib/builder/service/builder/webpack.js.map +0 -1
- package/lib/builder/types/common.js.map +0 -1
- package/lib/builder/util/common.js.map +0 -1
- package/lib/builder/util/console.js.map +0 -1
- package/lib/builder/util/generateFiles.js.map +0 -1
- package/lib/builder/util/index.js.map +0 -1
- package/lib/builder/util/junk.js.map +0 -1
- package/lib/builder/util/mp.js.map +0 -1
- package/lib/builder/util/name-mangler.js.map +0 -1
- package/lib/builder/util/net.js.map +0 -1
- package/lib/builder/util/process.js.map +0 -1
- package/lib/builder/util/style.js.map +0 -1
- package/lib/builder/util/weapp.js.map +0 -1
- package/lib/generate.js.map +0 -1
- package/lib/generator/config/common.js.map +0 -1
- package/lib/generator/config/index.js.map +0 -1
- package/lib/generator/config/mp.js.map +0 -1
- package/lib/generator/core/generate.js.map +0 -1
- package/lib/generator/core/index.js.map +0 -1
- package/lib/generator/core/material.js.map +0 -1
- package/lib/generator/template.js.map +0 -1
- package/lib/generator/types/common.js.map +0 -1
- package/lib/generator/util/common.js.map +0 -1
- package/lib/generator/util/console.js.map +0 -1
- package/lib/generator/util/index.js.map +0 -1
- package/lib/generator/util/name-mangler.js.map +0 -1
- package/lib/generator/util/postcss-rpx.js.map +0 -1
- package/lib/generator/util/style.js.map +0 -1
- package/lib/generator/util/weapp.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/types.js.map +0 -1
- package/lib/utils/common.js.map +0 -1
- package/lib/utils/dataSource.js.map +0 -1
- package/lib/utils/index.js.map +0 -1
- package/lib/utils/postProcess.js.map +0 -1
- package/lib/weapps-core/config/index.js.map +0 -1
- package/lib/weapps-core/config/style.js.map +0 -1
- package/lib/weapps-core/index.js.map +0 -1
- package/lib/weapps-core/types/action.js.map +0 -1
- package/lib/weapps-core/types/app.js.map +0 -1
- package/lib/weapps-core/types/appbuild.js.map +0 -1
- package/lib/weapps-core/types/code_types.js.map +0 -1
- package/lib/weapps-core/types/git.js.map +0 -1
- package/lib/weapps-core/types/index.js.map +0 -1
- package/lib/weapps-core/types/lowcode.js.map +0 -1
- package/lib/weapps-core/types/material.js.map +0 -1
- package/lib/weapps-core/types/plugins.js.map +0 -1
- package/lib/weapps-core/types/style.js.map +0 -1
- package/lib/weapps-core/types/web.js.map +0 -1
- package/lib/weapps-core/utils/appbuild.js.map +0 -1
- package/lib/weapps-core/utils/common.js.map +0 -1
- package/lib/weapps-core/utils/file.js.map +0 -1
- package/lib/weapps-core/utils/formily.js.map +0 -1
- package/lib/weapps-core/utils/index.js.map +0 -1
- package/lib/weapps-core/utils/lowcdoe.js.map +0 -1
- package/lib/weapps-core/utils/style.js.map +0 -1
|
@@ -1,104 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.default = {
|
|
4
|
-
"/src/app/common.js": {
|
|
5
|
-
"code": "<% mods.forEach((mod) => {%>\n import * as <%= mod %> from '../lowcode/common/<%= mod %>'<%}) %>\n\n // 支持 ESM 和 WEBPACK_EMS\n function getModule(targetModule) {\n if(\n Object.prototype.toString.call(targetModule) === '[object Module]'\n || targetModule.__esModule) {\n return targetModule.default ? targetModule.default : targetModule\n }\n return targetModule.default ? targetModule.default : targetModule\n }\n\n export default {\n <% mods.forEach((mod) => {%>\n <%= mod %>: getModule(<%= mod %>),<%}) %>\n }\n"
|
|
6
|
-
},
|
|
7
|
-
"/src/app/global-api.js": {
|
|
8
|
-
"code": "import sdk from '@tcwd/weapps-sdk/lib/app-h5-sdk';\nimport { DS_SDK, CLOUD_SDK, createDataset, EXTRA_API } from '../datasources';\nimport { formatDate } from '../utils/date';\nimport { getter, setter, _isMobile } from '../utils';\nimport { scanCodeApi } from '../utils/scan-code-action';\n\nexport const subPackageName = '<%= subPackageName %>';\nexport const app = createGlboalApi();\nmountAPIs(sdk);\nfunction createGlboalApi() {\n const globalAPI = {\n id: '<%= appId %>',\n domain: '<%= domain %>',\n platform: 'WEB',\n\n formActions: {},\n pages: {},\n state: {},\n computed: {},\n common: {},\n // i18n,\n dataSources: DS_SDK,\n utils: {\n formatDate,\n get: getter,\n set: setter,\n },\n };\n\n const dataset = createDataset('$global');\n globalAPI.dataset = dataset;\n globalAPI.state.dataset = dataset;\n globalAPI.setState = (userSetState) => {\n Object.keys(userSetState).forEach((keyPath) => {\n globalAPI.utils.set(\n globalAPI.dataset.state,\n keyPath,\n userSetState[keyPath]\n );\n });\n };\n /**\n * 内部通用的设置状态变量值的方法\n * varPath 结构为 $global.<变量名> 即全局变量\n * $page.<变量名> 即当前页面变量\n * <pageId>.<变量名> 指定页面 pageId 的变量 (应当避免修改非当前页面的变量值)\n */\n globalAPI._setStateVal = (config) => {\n EXTRA_API.setState(config.varPath, config.val);\n };\n // 给全局挂上 mainApp/subApp\n // The global api exposed to lowcode\n if (subPackageName) {\n globalAPI.mainApp = window[`$$app`];\n window[`$$subapp_${subPackageName}`] = globalAPI;\n } else {\n window['app'] = globalAPI;\n window[`$$app`] = globalAPI;\n }\n\n // 挂运营平台上报对象到app里\n globalAPI.yyptReport = window.yyptReport;\n\n // 预览区调试栏可调试\n // 暴露给复合组件,代码组件来引用\n window.app = window.app || globalAPI;\n\n // 避免被wx.cloud 覆盖\n globalAPI.cloud = CLOUD_SDK;\n return globalAPI;\n}\n\nexport function createPageApi() {\n const $page = {\n state: {},\n computed: {},\n handler: {},\n props: {},\n widgets: {},\n // 页面数据源变量存储位置\n dataVar: {},\n };\n return $page;\n}\n\n// 分app 和 wx 挂载app\nfunction mountAPIs(sdks) {\n Object.keys(sdks).forEach((item) => {\n let action = sdks[item];\n\n switch (item) {\n case 'showToast': {\n action = function (obj) {\n if (obj.icon === 'error' && !obj.image) {\n return sdks[item]({\n ...obj,\n image:\n 'data:image/svg+xml,%3Csvg%20width%3D%22120%22%20height%3D%22120%22%20viewBox%3D%220,0,24,24%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M12%2010.586l5.657-5.657%201.414%201.414L13.414%2012l5.657%205.657-1.414%201.414L12%2013.414l-5.657%205.657-1.414-1.414L10.586%2012%204.929%206.343%206.343%204.93%2012%2010.586z%22%20fill-rule%3D%22evenodd%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E',\n });\n }\n return sdks[item](obj);\n };\n break;\n }\n case 'showModal': {\n const LIB_KEY = `@weapps-materials-main-gsd-h5-react`;\n const showModal =\n window[LIB_KEY] &&\n window[LIB_KEY].actions &&\n window[LIB_KEY].actions.showModal;\n\n if (!_isMobile() && showModal) {\n action = function (params) {\n return showModal({ data: params });\n };\n }\n break;\n }\n case 'scanCode': {\n action = (options) => {\n if (\n !options ||\n (!options.success && !options.fail && !options.complete)\n ) {\n return new Promise((resolve, reject) => {\n scanCodeApi({\n ...options,\n success: resolve,\n fail: reject,\n });\n });\n }\n scanCodeApi(options);\n };\n break;\n }\n case 'navigateTo':\n case 'reLaunch':\n case 'redirectTo': {\n action = function (obj) {\n const { url, ...restOpts } = obj;\n if (obj.mode === 'web') {\n if (item === 'navigateTo') {\n window.open(url);\n } else {\n window.location.href = url;\n }\n } else {\n return sdks[item]({\n ...restOpts,\n pageId: restOpts.pageId\n ? restOpts.pageId.replace(/^(\\.)?\\//, '')\n : restOpts.pageId,\n });\n }\n };\n break;\n }\n }\n app[item] = action;\n });\n return app;\n}\n"
|
|
9
|
-
},
|
|
10
|
-
"/src/app/handlers.js": {
|
|
11
|
-
"code": "<%for(const pageId in pageModules) {\n pageModules[pageId].filter(mod => mod.type === 'handler-fn' && mod.name !== '____index____').forEach(mod => {%>\nimport <%= pageId%>_<%= mod.name%> from '../lowcode/<%= pageId%>/handler/<%= mod.name%>'<%\n })\n}%>\n\n<% for(const pageId in pageModules) {%>\nexport const $$_<%=pageId %> = {<%\n pageModules[pageId].filter(mod => mod.type === 'handler-fn' && mod.name !== '____index____').forEach(mod => {%>\n ['<%= mod.name%>']: <%= pageId%>_<%= mod.name%>,<%\n }) %>\n}\n<%}%>\n"
|
|
12
|
-
},
|
|
13
|
-
"/src/datasources/config.js.tpl": {
|
|
14
|
-
"code": "import dataSourceProfiles from './datasource-profiles'\nimport datasetProfiles from './dataset-profiles'\n\n/**\n * 数据源基本配置\n */\nexport default {\n /** 当前是否处于正式发布模式 */\n isProd: <%= isProd %>,\n /** 低码应用ID */\n appID: '<%= appID %>',\n /** 云开发环境ID */\n envID: '<%= envID %>',\n /** 数据源描述对象数组 */\n dataSourceProfiles: dataSourceProfiles,\n /**\n * 新的dataset变量配置对象\n * key 为页面ID(全局为$global), val 为变量配置数组\n */\n datasetProfiles: datasetProfiles,\n}\n"
|
|
15
|
-
},
|
|
16
|
-
"/src/datasources/dataset-profiles.js.tpl": {
|
|
17
|
-
"code": "/**\n * 全局及页面的数据源变量定义文件\n */\n\nexport default <%= datasetProfiles %>\n"
|
|
18
|
-
},
|
|
19
|
-
"/src/datasources/datasource-profiles.js.tpl": {
|
|
20
|
-
"code": "/**\n * 数据源摘要描述数组\n */\nexport default <%= datasourceProfiles %>\n"
|
|
21
|
-
},
|
|
22
|
-
"/src/datasources/index.js.tpl": {
|
|
23
|
-
"code": "import { setConfig, initTcb, CLOUD_SDK } from '@cloudbase/weda-cloud-sdk/dist/h5';\nimport config from './config';\nexport {\n createDataset,\n createStateDataSourceVar,\n generateParamsParser,\n EXTRA_API,\n CLOUD_SDK,\n DS_API,\n DS_SDK,\n} from '@cloudbase/weda-cloud-sdk/dist/h5';\n\nsetConfig(config);\ninitTcb();\n"
|
|
24
|
-
},
|
|
25
|
-
"/src/handlers/NodeRenderer.jsx": {
|
|
26
|
-
"code": "import * as React from 'react';\nimport {\n useContext,\n useCallback,\n createContext,\n useState,\n useRef,\n} from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { emitEvent, translateStyleToRem, checkVisible } from '../utils';\nimport { get, set } from 'lodash';\nimport { getDom } from '../utils/widgets';\n\nexport const ForContext = createContext({});\n\nexport const CompRenderer = observer(function (props) {\n const {\n id: compId,\n xProps,\n virtualFields,\n slots = {},\n codeContext = {},\n scopeContext = {},\n genericComp = {},\n emitEvents = [],\n componentSchema = {},\n context = {},\n updateContext,\n } = props;\n\n const [blockIndex, setBlockIndex] = useState();\n const [blockType, setBlockType] = useState();\n const indexRef = useRef();\n const typeRef = useRef();\n indexRef.current = blockIndex;\n typeRef.current = blockType;\n\n const isInComposite = !!codeContext.$WEAPPS_COMP;\n // 判断 widgets 是从 page 来的,还是组件来的\n const widgetsData = !isInComposite\n ? codeContext.$page.widgets[compId]\n : codeContext.$WEAPPS_COMP.widgets[compId];\n\n const isRootNode = widgetsData && !widgetsData.parent;\n\n if (!xProps) {\n return props.children;\n }\n\n const {\n commonStyle = {},\n sourceKey,\n listenerInstances,\n classNameList = [],\n staticResourceAttribute = [],\n } = xProps;\n const dataBinds =\n (codeContext._dataBinds && codeContext._dataBinds[compId]) || {};\n const FieldKey = genericComp.propName\n ? codeContext.node[genericComp.propName]\n : sourceKey;\n const Field = virtualFields[FieldKey];\n const parentForItems = useContext(ForContext);\n\n // 组件最终用于执行的事件函数\n const emit = useCallback(\n (trigger, eventData, forItems, domEvent, scopeContext) => {\n // 如果是数据容器,则将传过来的data,赋值给容器上下文context\n if (\n trigger === 'onDataChange' &&\n componentSchema?.compConfig?.isDataContainer\n ) {\n updateContext(compId, eventData?.data);\n }\n\n const listeners = listenerInstances;\n const event = {\n detail: eventData,\n name: trigger,\n target: widgetsData,\n currentTarget: widgetsData,\n domEvent,\n };\n forItems = {\n ...forItems,\n forIndexes: getForIndexes(forItems, widgetsData),\n };\n emitEvent(\n trigger,\n listeners,\n {\n event,\n customEventData: event,\n forItems,\n domEvent,\n },\n scopeContext\n );\n },\n [props]\n );\n\n // 选区最终用于执行的事件函数\n const emitSB = useCallback(\n (trigger, eventData, forItems, domEvent, scopeContext, fieldData) => {\n const listeners =\n typeRef?.current &&\n indexRef?.current !== undefined &&\n fieldData?.[typeRef.current]?.[indexRef.current]?.selectableBlock?.[\n 'x-props'\n ]?.listenerInstances;\n const event = {\n detail: eventData,\n name: trigger,\n target: widgetsData,\n currentTarget: widgetsData,\n domEvent,\n };\n forItems = {\n ...forItems,\n forIndexes: getForIndexes(forItems, widgetsData),\n };\n emitEvent(\n trigger,\n listeners,\n {\n event,\n customEventData: event,\n forItems,\n domEvent,\n },\n scopeContext\n );\n },\n [props]\n );\n\n function getSafeComponentProps({\n style,\n classNameList,\n staticResourceAttribute,\n }) {\n const componentProps = {};\n if (classNameList.length) {\n componentProps.className = classNameList.join(' ');\n }\n\n if (style && Object.keys(style).length) {\n componentProps.style = style;\n }\n\n if (staticResourceAttribute && staticResourceAttribute.length > 0) {\n componentProps.staticResourceAttribute = staticResourceAttribute;\n }\n return componentProps;\n }\n\n // 选区的预览的click事件\n const onCustomEvent = ({ order: index, blockKey }) => {\n if (index !== undefined) {\n setBlockIndex(index);\n setBlockType(blockKey);\n }\n };\n\n // For循环渲染\n let forList;\n try {\n forList = dataBinds && dataBinds._waFor && dataBinds._waFor(parentForItems, undefined, context);\n } catch (e) {\n forList = [];\n console.error('_waFor data', e);\n }\n if (forList) {\n if (!Array.isArray(forList)) {\n console.warn(`${compId}循环绑定非数组值:`, forList);\n forList = [];\n }\n return forList.map((item, index) => {\n const forItemsIndexes = (parentForItems.forIndexes || []).concat(index);\n const forItems = {\n ...parentForItems,\n [compId]: item,\n forIndexes: forItemsIndexes,\n };\n const {\n fieldData: forItemData,\n finalStyle: forItemStyle,\n finalClassNameList: forItemClassNameList,\n } = getBindData(forItems, scopeContext);\n if (!checkVisible(forItemData)) {\n return null;\n }\n // 多个组件的 slot 属性\n Object.keys(slots).forEach((slotProp) => {\n set(forItemData, slotProp, slots[slotProp]);\n });\n const emitWithForItems = (trigger, eventData, domEvent) =>\n emit(trigger, eventData, forItems, domEvent, scopeContext);\n\n const _selectableBlockEventsForItems = {\n onCustomEvent,\n events:\n componentSchema?.selectableBlock?.events.map((item) => item.name) ||\n [],\n emit: (trigger, eventData, domEvent) =>\n emitSB(\n trigger,\n eventData,\n forItems,\n domEvent,\n scopeContext,\n forItemData\n ),\n };\n\n delete forItemData.style;\n\n // 获取当前元素的 ref\n const currentWidget = Array.isArray(widgetsData)\n ? get(widgetsData, forItemsIndexes)\n : widgetsData;\n const domRef = setGetDomApi(currentWidget, props);\n\n // 判断为容器组件,则增加一个onDataChange事件\n if (\n componentSchema?.compConfig?.isDataContainer &&\n !emitEvents?.includes('onDataChange')\n ) {\n emitEvents.push('onDataChange');\n }\n\n return (\n <ForContext.Provider key={index} value={forItems}>\n <Field\n data={{\n ...forItemData,\n _selectableBlockEvents: _selectableBlockEventsForItems,\n }}\n id={compId}\n {...getSafeComponentProps({\n style: forItemStyle,\n classNameList: forItemClassNameList,\n staticResourceAttribute,\n })}\n emit={emitWithForItems}\n events={emitEvents}\n compositeParent={codeContext}\n forIndexes={forItemsIndexes}\n $node={currentWidget}\n domRef={domRef}\n >\n {props.children}\n </Field>\n </ForContext.Provider>\n );\n });\n }\n\n // 单节点渲染\n const { fieldData, finalClassNameList, finalStyle } = getBindData(\n parentForItems,\n scopeContext\n );\n const emitWithFiedle = (trigger, eventData, domEvent) =>\n emit(trigger, eventData, parentForItems, domEvent, scopeContext);\n\n const _selectableBlockEventsWithFiedle = {\n onCustomEvent,\n events:\n componentSchema?.selectableBlock?.events.map((item) => item.name) || [],\n emit: (trigger, eventData, domEvent) =>\n emitSB(\n trigger,\n eventData,\n parentForItems,\n domEvent,\n scopeContext,\n fieldData\n ),\n };\n\n // false 或空字符串时\n if (!checkVisible(fieldData)) {\n return null;\n }\n\n // 单个组件的 slot 属性\n Object.keys(slots).forEach((slotProp) => {\n set(fieldData, slotProp, slots[slotProp]);\n });\n\n // 防止渲染时 data 的 style 与实际的 style 冲突\n delete fieldData.style;\n\n // 修正 forIndexes\n const forIndexes = getForIndexes(parentForItems, widgetsData);\n\n // 获取 Element Ref\n const currentWidget = Array.isArray(widgetsData)\n ? get(widgetsData, forIndexes)\n : widgetsData;\n const domRef = setGetDomApi(currentWidget, props);\n\n // 判断为容器组件,则增加一个onDataChange事件\n if (\n componentSchema?.compConfig?.isDataContainer &&\n !emitEvents?.includes('onDataChange')\n ) {\n emitEvents.push('onDataChange');\n }\n\n return (\n <Field\n data={{\n ...fieldData,\n _selectableBlockEvents: _selectableBlockEventsWithFiedle,\n }}\n id={compId}\n {...getSafeComponentProps({\n style: finalStyle,\n classNameList: finalClassNameList,\n staticResourceAttribute,\n })}\n emit={emitWithFiedle}\n events={emitEvents}\n compositeParent={codeContext}\n forIndexes={forIndexes}\n $node={currentWidget}\n domRef={domRef}\n >\n {props.children}\n </Field>\n );\n\n // TODO: 需要不断移除 dataBinds(style/classList)\n function getBindData(forItems, scopeContext) {\n // bindData\n let wData = widgetsData;\n if (Array.isArray(wData)) {\n wData =\n forItems.forIndexes === void 0 || wData.length === 0\n ? {}\n : get(wData, getForIndexes(forItems, wData));\n }\n wData = wData || {};\n const fieldData = { ...wData };\n\n // 再次计算 scope value\n for (let key in fieldData) {\n if (Object.prototype.hasOwnProperty.call(fieldData, key)) {\n const value = fieldData[key];\n if (value && value.__type === 'scopedValue') {\n try {\n fieldData[key] = value.getValue(scopeContext);\n } catch (e) {\n console.warn(`Error computing data bind '${key}' error:`, e);\n fieldData[key] = '';\n }\n }\n }\n }\n\n // bindStyle\n let bindStyle = fieldData.style || {};\n // 复合组件第一层需要将最外层样式 style 挂到节点上\n let cssStyle = commonStyle;\n if (isInComposite && wData && !wData.parent) {\n cssStyle = {\n ...cssStyle,\n ...(codeContext.$WEAPPS_COMP.props?.style || {}),\n };\n bindStyle = {\n ...bindStyle,\n ...(codeContext.$WEAPPS_COMP.props?.style || {}),\n };\n }\n const finalStyle = getFinalStyle(cssStyle, bindStyle);\n\n // bindClassList\n const bindClassList = fieldData.classList || [];\n const finalClassNameList = getFinalClassNameList(\n classNameList,\n bindClassList\n );\n\n // 当前在复合组件中,且当前节点为根节点\n if (isInComposite && isRootNode) {\n if (wData.ownerWidget) {\n Object.keys(wData.ownerWidget).forEach((propName) => {\n if (\n propName === 'role' ||\n ['aria-', 'data-'].some((prefix) => propName.startsWith(prefix))\n ) {\n wData[propName] = wData.ownerWidget[propName];\n }\n });\n }\n }\n\n return { fieldData, finalStyle, finalClassNameList };\n }\n});\n\nexport function getFinalStyle(\n commonStyle = {},\n bindStyle = {},\n widgetStyle = {}\n) {\n const remBindStyle =\n typeof bindStyle === 'object' ? translateStyleToRem(bindStyle) : {};\n\n return {\n ...(translateStyleToRem(commonStyle) || {}),\n ...(translateStyleToRem(widgetStyle) || {}),\n ...remBindStyle,\n };\n}\n\nexport function getFinalClassNameList(\n classNameList = [],\n bindClassList = [],\n widgetClassList = []\n) {\n return [].concat(classNameList, bindClassList, widgetClassList);\n}\n\n// HACK: 从后向前保证循环的深度与 forIndexes 一致\n// 后续需要将 For 循环迁移到外层\nfunction getForIndexes(parentForItems, widgetsData) {\n return Array.isArray(widgetsData) && widgetsData.length > 0\n ? (parentForItems.forIndexes || []).slice(0 - getDeepArrLen(widgetsData))\n : undefined;\n}\n\nfunction getDeepArrLen(arr, len = 0) {\n if (Array.isArray(arr)) {\n return getDeepArrLen(arr[0], len + 1);\n } else {\n return len;\n }\n}\n\nfunction setGetDomApi(currentWidget, props) {\n if (!currentWidget) return React.createRef();\n const isComposite = !currentWidget.widgetType.startsWith('gsd-h5-react');\n const isInComposite = !!(props.codeContext || {}).$WEAPPS_COMP;\n\n // 如果当前是复合组件,不做 getDom 的挂载\n if (!isComposite) {\n if (!currentWidget.domRef) {\n currentWidget.domRef = React.createRef();\n }\n if (!currentWidget.getDom) {\n currentWidget.getDom = (options) =>\n getDom(currentWidget.domRef.current, options);\n }\n\n if (\n isInComposite && // 当前在复合组件内\n !currentWidget.parent && // 当前节点为复合组件的根节点\n props.codeContext.node && // 复合组件的 node 已经创建\n !props.codeContext.node.getDom // 复合组件的 node 未挂载 getDom 方法\n ) {\n props.codeContext.node.domRef = currentWidget.domRef;\n props.codeContext.node.getDom = currentWidget.getDom;\n }\n }\n\n return currentWidget.domRef;\n}\n"
|
|
27
|
-
},
|
|
28
|
-
"/src/handlers/RenderWrapper.jsx": {
|
|
29
|
-
"code": "import * as React from 'react';\nimport { useRef } from 'react';\nimport { CompRenderer } from './NodeRenderer';\nimport lodashSet from 'lodash.set';\nimport cloneDeep from 'lodash.clonedeep';\nimport { isScopeSlot } from '../utils/common';\n\nfunction getComponentChildren(component) {\n const { properties } = component;\n if (!properties) {\n return [];\n }\n return Object.values(properties).sort(\n (a, b) => (a['x-index'] || 0) - (b['x-index'] || 0)\n );\n}\n\nexport function AppRender(props) {\n const {\n className,\n virtualFields,\n componentSchema,\n renderSlot,\n rootNode = true,\n codeContext,\n scopeContext = {},\n context = {},\n updateContext,\n } = props;\n const {\n 'x-props': xProps,\n properties = {},\n genericComp = {},\n } = componentSchema;\n // 判断是否为 slot\n const isSlot = !xProps;\n if (isSlot && !(renderSlot || rootNode)) {\n return null;\n }\n\n const preClassName = useRef();\n\n // wrapperClass\n const containerEl = Object.values(properties)[0];\n if (containerEl && containerEl['x-props'] && className) {\n let { classNameList = [] } = containerEl['x-props'];\n\n // 先替换掉先前计算出来的className部分\n if (preClassName.current) {\n if (preClassName.current !== className) {\n classNameList = classNameList.filter(\n (clsName) => clsName !== preClassName.current\n );\n preClassName.current = className;\n }\n } else {\n preClassName.current = className;\n }\n\n containerEl['x-props'].classNameList = [className, ...classNameList];\n }\n\n if (xProps && xProps.sourceKey) {\n const { sourceKey } = xProps;\n const Field = virtualFields[sourceKey];\n if (!Field) {\n return (\n <div style={{ color: 'red' }}>\n 组件<em>{sourceKey}</em>未找到\n </div>\n );\n }\n }\n const children = getComponentChildren(componentSchema);\n const slots = {};\n // eslint-disable-next-line guard-for-in\n for (const key in properties) {\n const child = properties[key];\n if (!child['x-props'] && child.properties) {\n slots[key] = isScopeSlot(componentSchema, key) ? (\n (props) => {\n let clonedScopeContext = cloneDeep(scopeContext);\n lodashSet(\n clonedScopeContext,\n `${componentSchema.key}.${child.key}`,\n props\n );\n return (\n <AppRender\n key={child.key}\n componentSchema={child}\n renderSlot\n virtualFields={virtualFields}\n codeContext={codeContext}\n scopeContext={clonedScopeContext}\n context={context}\n updateContext={updateContext}\n />\n );\n }\n ) : (\n <AppRender\n key={child.key}\n componentSchema={child}\n renderSlot\n virtualFields={virtualFields}\n codeContext={codeContext}\n scopeContext={scopeContext}\n context={context}\n updateContext={updateContext}\n />\n );\n }\n }\n\n return (\n <CompRenderer\n id={componentSchema.key}\n xProps={xProps}\n emitEvents={componentSchema.emitEvents || []}\n componentSchema={componentSchema}\n virtualFields={virtualFields}\n slots={slots}\n codeContext={codeContext}\n scopeContext={scopeContext}\n genericComp={genericComp}\n context={context}\n updateContext={updateContext}\n >\n {children.map((comp) => (\n <AppRender\n key={comp.key}\n componentSchema={comp}\n rootNode={false}\n renderSlot={false}\n virtualFields={virtualFields}\n codeContext={codeContext}\n scopeContext={scopeContext}\n context={context}\n updateContext={updateContext}\n />\n ))}\n </CompRenderer>\n );\n}\n"
|
|
30
|
-
},
|
|
31
|
-
"/src/index.jsx": {
|
|
32
|
-
"code": "import * as React from 'react'\nimport * as ReactDOM from 'react-dom'\nimport { setConfig } from '@cloudbase/weda-cloud-sdk/dist/h5'\nimport App from './router'\n<% if(!isSandbox){ %>\nimport './utils/monitor-jssdk.min'\n<% } %>\nimport './lowcode/style.css'\n// 引入数据源管理器并进行初始化\nimport './datasources'\nimport './utils/initGlobalVar'\n// import i18nData from './i18n/index.js'\nimport { initAppLifeCycle } from './utils/lifecycle'\n<% subAppDataList.forEach(subApp => { %>\n import './packages/<%= subApp.rootPath %>/lowcode/style.css'\n<% }) %>\n\n<% if(!isSandbox){ %>\nimport attachFastClick from 'fastclick'\nattachFastClick && attachFastClick.attach && attachFastClick.attach(document.body)\n<% } %>\nimport { app } from './app/global-api'\nimport { createStateDataSourceVar, generateParamsParser, EXTRA_API } from './datasources'\n\n\n// 初始化应用生命周期\ninitAppLifeCycle(app,{\n beforeCustomLaunch: (query)=>{\n EXTRA_API.setParams('$global', query || {})\n createStateDataSourceVar('$global',generateParamsParser({app}))\n }\n})\n\n<% if(!isSandbox && isBuildApp){ %>\n// app 中注册配置页面以及app的全局配置miniprogram.config,h5里分app以及web页分别处理,使用process.env.isApp 区分判断\nimport { initWebConfig } from './utils/lifecycle'\nimport AppConfig from '../webpack/miniprogram.config'\ninitWebConfig(app, AppConfig);\n<% } %>\n// 设置数据源请求的 loading 及 toast 处理\nsetConfig({\n beforeDSRequest: (cfg) => {\n if (!cfg.options || !cfg.options.showLoading) return\n app.showLoading()\n },\n afterDSRequest: (cfg, error, result) => {\n if (!cfg.options) return\n if (cfg.options.showLoading) app.hideLoading()\n if (!cfg.options.showToast) return\n const isSuccess = !error && result && !result.code\n app.showToast({icon: isSuccess ? 'success' : 'error'})\n }\n})\n\n\n<% if(!isSandbox){ %>\nif (yyptReport && typeof yyptReport.pgvMain == 'function') {\n // report_url,appKey必填\n yyptReport.pgvMain({\n appKey: '<%= yyptAppKey %>', // 填入你申请的运营平台的应用key(必填)\n report_url: '<%= reportUrl %><%= yyptAppKey %>', // 上报url(把后端上报接口需要先挂网关,该url填写网关地址)\n autoReportPv: true, // 单页应用监听页面路径改变自动上报Pv,默认为false\n stopReport: <%= stopReport %>, // 停止上报\n // 其他参数说明\n // customUserPrams: null, // 用户自定义的额外属性--对于小马的用户属性,比如用户的部门编码(customUserPrams: { deptno: 1100 })需要在小马系统事先配置好\n //userKey: \"user_id\", // cookie里面用户的唯一标示\n //autoWatchClick: true, // 默认开启自动监听hottag\n //isWxEnv: false// 是否微信环境,微信环境会通过wx.getNetworkType获取网络环境\n // 通过传入函数,可以让业务方写代码传入要上报的属性,比如返回自定义属性,这里主要也是自定义属性,让sdk获取并且进行上报,减少重复编码\n //getCusParams: function () {\n // return {kv:{money:1}}; //kv:Key-Value,自定义事件Key-Value参数对\tmap\tJSON格式,在报表页面的事件参数分析页和页面参数分析页中可以看到上报的kv值\n //},\n })\n}\n<% } %>\n\n;(function() {\n function flex() {\n try {\n let htmlDom = document.documentElement\n let width = window.innerWidth || htmlDom.clientWidth\n let fontSize = width / (375 / 14)\n if (\n !navigator.userAgent.match(\n /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|IEMobile)/i\n ) &&\n fontSize > 14\n ) {\n htmlDom.style.fontSize = `14px`\n } else {\n htmlDom.style.fontSize = fontSize + `px`\n }\n } catch (e) {\n console.error(e)\n }\n }\n\n flex()\n window.addEventListener('resize', flex)\n})()\nReactDOM.render(<App/>, document.getElementById('root'))\n\n<% if(!isSandbox){ %>\n// 使用HMR\nif(process.env.compileTool === 'vite') {\n if (import.meta.hot) {\n import.meta.hot.accept()\n }\n} else {\n if (process.env.NODE_ENV !== 'production') {\n if (module.hot) {\n module.hot.accept()\n }\n }\n}\n<% } %>\n"
|
|
33
|
-
},
|
|
34
|
-
"/src/index.less": {
|
|
35
|
-
"code": "// 针对小程序样式做适配\n// 请注意与weapps/src/pages/editor/components/Main/EditAndPreview/index.iframe.scss的一致性,以确保小程序端样式与\n\nbody {\n margin: 0;\n padding: 0;\n}\n\n#weapp-scancode-video {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.weapp-scancode {\n &-close-button {\n background: white;\n color: black;\n display: flex;\n position: absolute;\n top: 14px;\n left: 14px;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n cursor: pointer;\n justify-content: center;\n align-items: center;\n z-index: 500;\n }\n &-modal {\n position: fixed;\n background-color: black;\n left: 0px;\n right: 0px;\n top: 0px;\n bottom: 0px;\n &-main {\n height: 100%;\n position: relative;\n }\n }\n &-scan {\n &-wrapper {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 100%;\n position: absolute;\n top: 0;\n left: 0;\n }\n &-square {\n --square-size: 16rem;\n width: var(--square-size);\n height: var(--square-size);\n position: relative;\n }\n &-bar {\n position: absolute;\n height: 10px;\n width: 100%;\n background: linear-gradient(90deg, transparent, #07c160 50%, transparent);\n top: 0%;\n border-top-left-radius: 50%;\n border-top-right-radius: 50%;\n animation: slideinout-top-down 2s;\n animation-direction: normal;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n }\n &-tip {\n margin-top: 10rem;\n color: white;\n }\n &-not-found {\n color: white;\n }\n &-not-found + p {\n color: #999;\n }\n }\n\n &-img-selector {\n position: absolute;\n bottom: 32px;\n right: 32px;\n z-index: 500;\n }\n &-img-picker {\n z-index: 500;\n padding: 5px;\n display: block;\n cursor: pointer;\n }\n}\n\n@keyframes slideinout-top-down {\n // use transform to prevent relayout\n 0% {\n transform: translateY(0px);\n opacity: 0;\n }\n 50% {\n transform: translateY(calc(var(--square-size) / 2));\n opacity: 0.5;\n }\n 100% {\n transform: translateY(var(--square-size));\n opacity: 0;\n }\n}\n\n@media (min-width: 1024px) {\n .weda-responsive_flex_flow {\n flex-flow: row !important;\n }\n}\n"
|
|
36
|
-
},
|
|
37
|
-
"/src/pages/app.tpl": {
|
|
38
|
-
"code": "// Import Libs and Handlers\nimport * as React from 'react'\nimport { observable, autorun, reaction } from 'mobx'\nimport { observer } from \"mobx-react-lite\";\nimport get from 'lodash.get'\nimport { app } from '../../app/global-api' // 取对应子包app\nimport '../../utils/initGlobalVar'\nimport { AppRender } from '/src/handlers/RenderWrapper'\nimport { createDataset, createStateDataSourceVar, generateParamsParser, EXTRA_API } from '../../datasources'\nimport { createComputed, createWidgets, retryDataBinds, bindFuncObj, resolveComponentProps } from '/src/utils/index'\nimport { pageLifeCycleMount } from '/src/utils/lifecycle'\nimport { useScrollTop } from '/src/utils/hooks'\nimport PageLifeCycle from '../../lowcode/<%= pageName %>/lifecycle'\nimport initPageState from '../../lowcode/<%= pageName %>/state'\nimport computed from '../../lowcode/<%= pageName %>/computed'\nimport pageAPI from '../../lowcode/<%= pageName %>/index';\nimport { $$_<%= pageName %> as handler } from '../../app/handlers'\nimport { createPageApi } from '/src/app/global-api' // 取主包app\n\nimport '../../lowcode/<%= pageName %>/style.css'\n\n// Import Components\n<% useComponents.forEach(compItem => {%>\n<% if(isSandbox) { %>\nconst <%= upperFirst(compItem.variableName) %> = window[\"@weapps-materials-main-<%= compItem.materialName %>\"].components[\"<%= compItem.name %>\"];\n<% } else if(!isSandbox) { %>\nimport <%= upperFirst(compItem.variableName) %> from \"/src/libraries/<%= compItem.materialName %>@<%= compItem.materialVersion %>/components/<%= compItem.name %>\";\n<% }}) %>\n\n// Import Actions\n<% useActions.forEach(action => {%>\n<% if(isSandbox) { %>\nconst <%= action.variableName %> = window[\"@weapps-materials-main-<%= action.materialName %>\"].actions[\"<%= action.name %>\"];\n<% } else { %>\nimport <%= action.variableName %> from \"/src/libraries/<%= action.materialName %>@<%= action.materialVersion %>/actions/<%= action.name %>\";\n<% }}) %>\n\nconst virtualFields = {\n <% useComponents.forEach(compItem => {%>\n <% if(compItem.isPlainProps) { %>\n '<%= compItem.materialName %>:<%= compItem.name %>': (props) => <<%= upperFirst(compItem.variableName) %> {...resolveComponentProps(props, 1)} pageVirtualFields={virtualFields}/>,\n <% } else { %>\n '<%= compItem.materialName %>:<%= compItem.name %>': (props) => <<%= upperFirst(compItem.variableName) %> {...resolveComponentProps(props, 0)} pageVirtualFields={virtualFields}/>,\n <% }}) %>\n};\n\n// Init\nexport default function App() {\n // 检查权限\n // const [weDaHasLogin, setWeDaHasLogin] = React.useState(false);\n const [context, setContext] = React.useState({});\n // 兼容 this.state / $page.state 两种模式\n const pageCodeContext = createPageApi()\n const $page = pageCodeContext\n Object.defineProperty(pageCodeContext, '$page', {\n get() {\n return pageCodeContext\n }\n })\n\n const widgetsContext = <%= widgets %>;\n const dataBinds = $page._dataBinds = <%= dataBinds %>;\n const componentSchema = <%= componentSchema %>;\n\n /**\n * 更新数据容器的上下文的方法\n * 会传递到事件emit的地方,将从组件获取到的数据data赋值给上下文\n * 当组件卸载时,传过来的data为undefined即可\n * {\n * id1: [{...}],\n * id2: {...},\n * id3: undefined,\n * id4: null,\n * ...\n * }\n * @param id\n * @param data\n */\n const updateContext = (id, data) => {\n if(id) {\n context[id] = { data };\n }\n setContext({ ...context });\n }\n\n Object.assign($page, {\n id:'<%= pageName %>',\n state: observable(initPageState),\n computed: createComputed(computed, pageCodeContext),\n handler: bindFuncObj(handler, pageCodeContext)\n })\n let dataset = createDataset('<%= pageName %>', {app, $page: pageCodeContext})\n $page.dataset = dataset\n $page.state.dataset = dataset\n $page.setState = (userSetState) => {\n Object.keys(userSetState).forEach((keyPath) => {\n app.utils.set($page.dataset.state, keyPath, userSetState[keyPath]);\n });\n };\n\n $page.widgets = createWidgets(widgetsContext, dataBinds, context)\n // widgets 内的 dataBinds 可能需要关联 widgets,需要重新执行 dataBinds\n retryDataBinds()\n\n // Web 环境页面级别生命周期\n React.useEffect(() => {\n document.title = \"<%= title %>\";\n initWatchMethods(pageCodeContext)\n /*checkAuth(app, app.id, '<%= pageName %>').then((checkAuthResult) =>\n setWeDaHasLogin(checkAuthResult)\n );*/\n }, [])\n\n pageLifeCycleMount(\n React.useEffect,\n {\n ...PageLifeCycle,\n beforePageCustomLaunch: (query) => {\n EXTRA_API.setParams('<%= pageName %>', query || {})\n createStateDataSourceVar('<%= pageName %>', generateParamsParser({ app, $page: pageCodeContext }))\n },\n },\n app,\n pageCodeContext\n )\n // 切换页面滚动到顶部\n useScrollTop()\n return (\n <div className=\"weapps-page weapps-page-<%= pageClass %>\">\n <style\n type=\"text/css\"\n dangerouslySetInnerHTML={{\n __html: `<%= pageStyleText %>`,\n }}\n />\n <AppRender\n virtualFields={virtualFields}\n componentSchema={componentSchema}\n codeContext={pageCodeContext}\n context={context}\n updateContext={updateContext}\n />\n </div>\n );\n\n function initWatchMethods(pageContext) {\n const { watch = {}, watchState = {}, watchWidget = {}, watchEffects = {}} = pageAPI\n\n\n // # watch effect\n const watchEffectDisposers = Object.keys(watchEffects).map(fnName => {\n return autorun(watchEffects[fnName].bind(pageContext))\n })\n const disposers = watchEffectDisposers\n\n // # watch state\n Object.keys(watchState).map(key => runWatcher(parseWatcher(watchState[key]), pageContext.state, key, 'watchState'))\n\n // # watch widgets\n Object.keys(watchWidget).map(key => runWatcher(parseWatcher(watchWidget[key]), pageContext.widgets, key, 'watchWidgets'))\n\n function runWatcher({ handler, immediate } = {}, target, key, label) {\n if (!handler) {\n console.error(`Invalid ${label}(${key}) of ${pageContext.node.widgetType}, watch must a function or {handler: function}`)\n return\n }\n const disposer = reaction(() => get(target, key), handler.bind(pageContext), { fireImmediately: immediate })\n disposers.push(disposer)\n }\n }\n}\n\nfunction parseWatcher(watcher) {\n if (!watcher) return\n if (watcher instanceof Function) {\n return { handler: watcher, immediate: false }\n }\n const { handler, immediate = false } = watcher\n if (!(handler instanceof Function)) return\n return { handler, immediate }\n}\n"
|
|
39
|
-
},
|
|
40
|
-
"/src/pages/composite.tpl": {
|
|
41
|
-
"code": "import * as React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { observable, autorun, reaction, runInAction } from \"mobx\";\nimport { AppRender } from \"/src/handlers/RenderWrapper\";\nimport { createWidgets, retryDataBinds, WidgetsContext, bindFuncObj, createComputed, resolveComponentProps} from '/src/utils/index'\nimport getStateFn from \"./lowcode/state.js\";\nimport computed from \"./lowcode/computed.js\";\nimport lifecycle from \"./lowcode/lifecycle.js\";\n// import i18n from '@tcwd/weapps-sdk/lib/i18n'\n<% if(isSandbox) { %>\nimport { ErrorBoundary } from 'react-error-boundary'\nimport { createErrorFallback } from '/src/utils/error'\n<% } %>\nimport componentAPI from './lowcode/index';\nimport get from 'lodash.get'\n\n<% handlersImports.forEach(handler => { %>\nimport handler$<%= handler.name %> from \"./lowcode/handler/<%= handler.name %>.js\";\n<% }) %>\n\n// Import Components outof sandbox\n<% useComponents.forEach(compItem => {%>\n<% if(!isSandbox && compItem.isComposite){ %>\nimport <%= compItem.var %> from \"/src/libraries/<%= compItem.moduleName %>@<%= compItem.version %>/components/<%= compItem.name %>\";\n<% } else if(!isSandbox) { %>\nconst <%= compItem.var %> = window[\"@weapps-materials-main-<%= compItem.moduleName %>\"].components[\"<%= compItem.name %>\"];\n<% } %>\n<%}) %>\n\nimport * as constObj from '../../libCommonRes/const'\nimport * as toolsObj from '../../libCommonRes/tools'\n\nimport \"./lowcode/style.css\";\n\nconst libCode = '<%= materialName %>'\n\nclass CompositeCompWrapper extends React.Component {\n\n $WEAPPS_COMP = {}\n\n componentDidUpdate() {\n runInAction(() => {\n const { data } = this.props\n for(let prop in data) {\n // 更新 propsData\n if (typeof data[prop] !== 'function') {\n this.propsData[prop] = data[prop]\n }\n }\n })\n }\n\n\n constructor(props) {\n super(props);\n\n this.compConfig = <%= JSON.stringify(compConfig, null, 2) %>\n\n // Import Components in sandbox\n <% useComponents.forEach(compItem => {%>\n <% if(isSandbox){ %>\n const <%= compItem.var %> = window[\"@weapps-materials-main-<%= compItem.moduleName %>\"].components[\"<%= compItem.name %>\"];\n <% } %>\n <%}) %>\n\n this.virtualFields = Object.assign({}, props.pageVirtualFields || {}, {\n <% useComponents.forEach(compItem => {%>\n \"<%= compItem.key %>\": <% if(compItem.isPlainProps) {%> (props) => <<%= compItem.var %> {...resolveComponentProps(props, 1)} /> <% } else {%> (props) => <<%= compItem.var %>{...resolveComponentProps(props, 0)} /> <% }%>,\n <%}) %>\n });\n\n // 挂载给到 $comp.props.events 使用\n this.events = (<%= emitEvents %>).reduce((obj, trigger) => {\n obj[trigger] = (eventData, domEvent) => {\n this.props.emit(trigger, eventData, domEvent);\n this.node._listeners && this.node._listeners.emit(trigger, eventData, domEvent)\n };\n return obj;\n }, {});\n this.handler = this.$WEAPPS_COMP.handler = {\n <% handlersImports.forEach(handler => { %>\n <%= handler.name %>: handler$<%= handler.name %>.bind(this),\n <% }) %>\n };\n const widgetContext = <%= widgets %>\n const dataBinds = this._dataBinds = <%= dataBinds %>\n this.componentSchema = <%= componentSchema %>;\n\n const defaultProps = <%= JSON.stringify(defaultProps, null, 2) %>\n this.propsData = observable(Object.assign({}, defaultProps, this.props.data || {}))\n this.$WEAPPS_COMP.lib = { const: constObj, tools: toolsObj }\n /*\n this.i18n = this.$WEAPPS_COMP.i18n = {\n ...i18n,\n t (key, data) {\n return i18n.t(libCode + ':' + key, data)\n },\n }\n */\n this.$WEAPPS_COMP.props = { ...this.props, events: this.events, data: this.propsData }\n\n this.state = this.$WEAPPS_COMP.state = observable(getStateFn.bind(this)())\n this.computed = this.$WEAPPS_COMP.computed = createComputed(computed, this)\n this.node = this.$WEAPPS_COMP.node = this.createWidgetNode(this) || {}\n this.initPublicMethods()\n\n this.widgets = this.$WEAPPS_COMP.widgets = createWidgets(widgetContext, dataBinds)\n // widgets 内的 dataBinds 可能需要关联 widgets,需要重新执行 dataBinds\n retryDataBinds()\n Object.keys(this.widgets || {}).forEach(widgetId => {\n // 将实例 ownerWidget 挂到内部组件上。内部组件就可以通过 $comp.node.ownerWidget 获取到所在的组件实例\n const node = this.widgets[widgetId]\n if (Array.isArray(node)) {\n node.forEach(item => {\n item.ownerWidget = this.node;\n item.getOwnerWidget = () => this.node;\n })\n }\n else {\n node.ownerWidget = this.node\n node.getOwnerWidget = () => this.node\n }\n // this.widgets[widgetId].ownerWidget = this.node\n // this.widgets[widgetId].getOwnerWidget = () => this.node\n })\n\n this.pageListenerInstances = [];\n this.createCompAPI(this)\n }\n\n // publicMthods 挂载内部,使用 $comp.api。挂载到外部使用 $comp.node.api\n initPublicMethods() {\n const publicMethods = componentAPI.publicMethods || {}\n Object.keys(publicMethods).map(fnName => {\n const bindFunc = publicMethods[fnName].bind(this)\n this[fnName] = bindFunc\n this.$WEAPPS_COMP[fnName] = bindFunc\n if(this.node) this.node[fnName] = bindFunc\n })\n }\n\n // 创建自身节点\n createWidgetNode(compThis) {\n // 当为数组时,需要判断自己属于 widgets 的哪一项\n const {\n compositeParent,\n forIndexes,\n id\n } = compThis.props\n let widgetData = compositeParent.$WEAPPS_COMP\n ? compositeParent.$WEAPPS_COMP.widgets[id]\n : compositeParent.$page.widgets[id]\n if(Array.isArray(widgetData)) {\n widgetData = widgetData.length > 0 ? get(widgetData, forIndexes) : {}\n }\n widgetData = widgetData || {}\n Object.assign(widgetData, {\n getConfig: () => compThis.compConfig,\n }, bindFuncObj(componentAPI.publicMethods || {}, compThis)\n )\n\n return widgetData\n }\n\n createCompAPI(compThis) {\n compThis.$WEAPPS_COMP = {\n _dataBinds: compThis._dataBinds,\n compConfig: compThis.compConfig,\n widgets: compThis.widgets,\n node: compThis.node,\n handler: compThis.handler,\n lib: { const: constObj, tools: toolsObj },\n // i18n: compThis.i18n,\n get props() {\n return {...compThis.props, events: compThis.events, data: compThis.propsData }\n },\n get state() {\n return compThis.state\n },\n get computed() {\n return compThis.computed\n },\n };\n }\n\n initWatchMethods() {\n const { watch = {}, watchState = {}, watchWidget = {}, watchEffects = {}} = componentAPI\n const _this = this\n const weappInst = _this.$WEAPPS_COMP\n\n // # watch effect\n this.watchEffectDisposers = Object.keys(watchEffects).map(fnName => {\n return autorun(watchEffects[fnName].bind(this))\n })\n const disposers = this.watchEffectDisposers\n\n // # watch props\n Object.keys(watch).map(key => runWatcher(parseWatcher(watch[key]), weappInst.props.data, key, 'watch'))\n\n // # watch state\n Object.keys(watchState).map(key => runWatcher(parseWatcher(watchState[key]), weappInst.state, key, 'watchState'))\n\n // # watch widgets\n Object.keys(watchWidget).map(key => runWatcher(parseWatcher(watchWidget[key]), weappInst.widgets, key, 'watchWidgets'))\n\n function runWatcher({ handler, immediate } = {}, target, key, label) {\n if (!handler) {\n console.error(`Invalid ${label}(${key}) of ${weappInst.node.widgetType}, watch must a function or {handler: function}`)\n return\n }\n const disposer = reaction(() => get(target, key), handler.bind(_this), { fireImmediately: immediate })\n disposers.push(disposer)\n }\n }\n\n componentDidMount() {\n this.initPublicMethods()\n this.initWatchMethods()\n\n lifecycle.onAttached && lifecycle.onAttached.bind(this)()\n lifecycle.onReady && lifecycle.onReady.bind(this)()\n }\n\n componentWillUnmount() {\n if(this.watchEffectDisposers) {\n this.watchEffectDisposers.forEach(disposer => disposer())\n this.watchEffectDisposers = null\n }\n this.node._listeners && this.node._listeners.clear()\n lifecycle.onDetached && lifecycle.onDetached.bind(this)()\n }\n\n render() {\n return (\n <WidgetsContext.Provider value={{ parent: this }}>\n <AppRender\n className={this.props.className}\n virtualFields={this.virtualFields}\n componentSchema={this.componentSchema}\n codeContext={this}\n />\n </WidgetsContext.Provider>\n );\n }\n}\n\nCompositeCompWrapper.contextType = WidgetsContext\n\nexport default observer((props) => (\n <% if(isSandbox) { %>\n <ErrorBoundary FallbackComponent={createErrorFallback('<%= name %>', '<%= id %>')}>\n <% } %>\n <CompositeCompWrapper {...props}></CompositeCompWrapper>\n <% if(isSandbox) { %>\n </ErrorBoundary>\n <% } %>\n));\n\nfunction parseWatcher(watcher) {\n if (!watcher) return\n if (watcher instanceof Function) {\n return { handler: watcher, immediate: false }\n }\n const { handler, immediate = false } = watcher\n if (!(handler instanceof Function)) return\n return { handler, immediate }\n}\n"
|
|
42
|
-
},
|
|
43
|
-
"/src/router/index.tpl": {
|
|
44
|
-
"code": "import * as React from 'react';\nimport { BrowserRouter, Router, Route, Redirect, Switch, HashRouter } from 'react-router-dom';\nimport { history, generateBrowserHistory, createHistory } from '../utils/index';\nimport { wx } from '@tcwd/weapps-sdk'\n\n<%= mountApis %>\n<%= routerImports %>\n\nimport lifecycle from '../lowcode/lifecycle'\nfunction NotFound() {\n lifecycle.onAppPageNotFound && lifecycle.onAppPageNotFound()\n console.error('页面 404,可以在生命周期配置 onAppPageNotFound 并跳转到对应页面')\n return <>页面404</>\n}\nfunction Loading() {\n React.useEffect(() => {\n wx.showLoading()\n return () => wx.hideLoading()\n }, [])\n return <></>\n}\nexport default () => {\n window.$$global.homePageId = '<%= homePageId %>'\n // 显式声明HASH 或 app 的 路由使用 hash router,而其他web应用使用 BrowserRouter\n if (process.env.isApp || process.env.isAdminPortal || <%= isHash %>) {\n return (\n <Router history={history}>\n <React.Suspense fallback={<Loading/>}>\n <Switch>\n <%= routerRenders %>\n <Route component={NotFound} />\n </Switch>\n </React.Suspense>\n </Router>\n )\n } else {\n return (\n <Router history={generateBrowserHistory({basename: \"<%= basename %>\"})}>\n <React.Suspense fallback={<Loading/>}>\n <Switch>\n <%= routerRenders %>\n <Route component={NotFound} />\n </Switch>\n </React.Suspense>\n </Router>\n )\n }\n\n}\n"
|
|
45
|
-
},
|
|
46
|
-
"/src/store/computed.js": {
|
|
47
|
-
"code": "// import all state of all pages & global\nimport globalComputed from '../lowcode/computed'\n<% pageIds.forEach(function(pageId) { %>import <%= pageId %>Computed from '../lowcode/<%= pageId%>/computed';\n<% }); %>\n\nconst computed = {\n global: globalComputed,<% pageIds.forEach(function(pageId) { %>\n <%= pageId %>: <%= pageId %>Computed,<% }); %>\n};\n\nexport default computed;\n"
|
|
48
|
-
},
|
|
49
|
-
"/src/store/index.js": {
|
|
50
|
-
"code": "import { observable } from 'mobx';\nimport initState from '../lowcode/state';\n\nconst globalState = observable(initState);\nexport default globalState;\n"
|
|
51
|
-
},
|
|
52
|
-
"/src/utils/actionHandler.js": {
|
|
53
|
-
"code": "import { resolveDataBinds } from './common';\nimport lodashSet from 'lodash.set';\n\nconst DEFAULT_MAX_TIMEOUT = 10 * 1000;\n\nexport function getMetaInfoBySourceKey(sourceKey) {\n const [materialName, name] = sourceKey.split(':');\n return {\n materialName,\n name,\n };\n}\n\nexport function emitEvent(trigger, listeners = [], args, scopeContext = {}) {\n const targetListeners = listeners.filter((l) => l.trigger === trigger);\n targetListeners.forEach(async (listener) => {\n // 当前非捕获Event,再判断冒泡行为\n if (!args?.event?.detail?.isCapturePhase && listener.noPropagation) {\n args?.domEvent?.stopPropagation && args?.domEvent?.stopPropagation();\n }\n\n // 判断捕获的执行,只有执行的捕获与配置的捕获一致时。才会执行。\n if (\n (listener?.isCapturePhase || false) ===\n (args?.customEventData?.detail?.isCapturePhase || false)\n ) {\n try {\n const res = await invokeListener(listener, args, scopeContext);\n const eventName = `${listener.key}.success`;\n const event = {\n detail: {\n value: res,\n origin: args.event,\n isCapturePhase: !!args.event?.isCapturePhase,\n },\n name: eventName,\n };\n emitEvent(\n eventName,\n listeners,\n {\n ...args,\n event,\n customEventData: event,\n },\n scopeContext\n );\n } catch (e) {\n const eventName = `${listener.key}.fail`;\n const event = {\n detail: {\n value: e,\n origin: args.event,\n isCapturePhase: !!args.event?.isCapturePhase,\n },\n name: eventName,\n };\n emitEvent(\n eventName,\n listeners,\n {\n ...args,\n event,\n customEventData: event,\n },\n scopeContext\n );\n // 之前 invoke 内部catch 了错误,不会抛错\n // throw e\n console.error(`Action error: [${listener.trigger}]`, e);\n }\n }\n });\n}\n\nfunction invokeListener(\n { instanceFunction, data = {}, dataBinds = {} },\n args,\n scopeContext\n) {\n // ToDo resolve databinds\n const action = instanceFunction;\n const resolvedData = {\n ...data,\n };\n const resolvedDataBinds = resolveDataBinds(\n dataBinds,\n args.forItems,\n { event: args.event },\n scopeContext,\n true\n );\n\n // eslint-disable-next-line no-restricted-syntax\n for (const key in resolvedDataBinds) {\n if (\n resolvedDataBinds[key] &&\n resolvedDataBinds[key].__type === 'scopedValue'\n ) {\n try {\n lodashSet(\n resolvedData,\n key,\n resolvedDataBinds[key].getValue(scopeContext)\n );\n } catch (e) {\n lodashSet(resolvedData, key, '');\n }\n } else {\n lodashSet(resolvedData, key, resolvedDataBinds[key]);\n }\n }\n const params = {\n data: resolvedData,\n ...args,\n };\n\n return action(params);\n}\n"
|
|
54
|
-
},
|
|
55
|
-
"/src/utils/common.js": {
|
|
56
|
-
"code": "/**\n * All data bindings are generated as functions: (forItems) => any\n * @param {*} dataBinds\n * @param {*} forItems\n */\nexport function resolveDataBinds(\n dataBinds,\n forItems,\n codeContext,\n scopeContext,\n throwError\n) {\n const resolvedProps = {};\n for (const prop in dataBinds) {\n let fn = dataBinds[prop];\n try {\n if (codeContext && codeContext.$WEAPPS_COMP) {\n fn = fn.bind(codeContext.$WEAPPS_COMP);\n }\n resolvedProps[prop] = fn(\n forItems,\n codeContext && codeContext.event,\n scopeContext\n );\n } catch (e) {\n console.error('Error resolving data binding', prop, dataBinds[prop], e);\n if (throwError) {\n throw e;\n }\n }\n }\n return resolvedProps;\n}\n\n/**\n * 对函数进行批量绑定\n * @param {*} funcObj\n * @param {*} context\n */\nexport function bindFuncObj(funcObj = {}, context) {\n return Object.keys(funcObj).reduce((obj, fnName) => {\n obj[fnName] = funcObj[fnName].bind(context);\n return obj;\n }, {});\n}\n\nexport function kebabCase(str) {\n return str.replace(KEBAB_REGEX, function (match) {\n return '-' + match.toLowerCase();\n });\n}\n\nexport function camelcase(str, firstUpperCase = false) {\n str = str.replace(/[_-]([a-z])/g, function (l) {\n return l[1].toUpperCase();\n });\n\n if (firstUpperCase) str = str.charAt(0).toUpperCase() + str.slice(1);\n\n return str;\n}\n\nexport const isEmptyObj = (obj) => {\n if (!isPlainObject(obj)) {\n return false;\n }\n for (const i in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, i)) {\n return false;\n }\n }\n return true;\n};\n\nexport function isPlainObject(src) {\n return Object.prototype.toString.call(src) === '[object Object]';\n}\n\n/**\n * 用于处理自定义组件props传参结构,对系统变量进行保留\n */\nexport function resolveComponentProps(props, isPlainProps) {\n const { staticResourceAttribute } = props;\n staticResourceAttribute &&\n staticResourceAttribute.map((property) => {\n if (props.data && props.data[property]) {\n props.data[property] = getStaticResourceAttribute(props.data[property]);\n }\n });\n if (!isPlainProps) {\n return {\n ...props,\n };\n }\n const { data = {}, events = [], ...restProps } = props;\n const customProps = { ...data };\n const builtinProps = [\n // react 保留字\n 'ref',\n 'key',\n 'dangerouslySetInnerHTML',\n 'className',\n 'htmlFor',\n 'style',\n 'contentEditable',\n // lowcode 保留字\n 'events',\n 'children',\n '_parentId',\n '_visible',\n 'classList',\n 'widgetType',\n 'getWidgetsByType',\n 'getDom',\n 'domRef',\n 'extends',\n // 小程序保留字\n 'id',\n 'class',\n 'hidden',\n 'slot',\n ];\n // delete builtin props\n builtinProps.map((prop) => delete customProps[prop]);\n // 选区events处理\n const { _selectableBlockEvents, ...restData } = data;\n const { emit: _selectableBlockEmit } = _selectableBlockEvents;\n _selectableBlockEvents.events = new Proxy(\n _selectableBlockEvents.events.reduce((events, item) => {\n const propName = item;\n events[propName] = (e) => _selectableBlockEmit(propName, e);\n return events;\n }, {}),\n {\n get(obj, prop) {\n return prop in obj ? obj[prop] : (e) => _selectableBlockEmit(prop, e);\n },\n }\n );\n return {\n ...restData,\n ...restProps,\n _selectableBlockEvents,\n events: new Proxy(\n events.reduce((events, item) => {\n const propName = item;\n events[propName] = (e) => restProps.emit(propName, e);\n return events;\n }, {}),\n {\n get(obj, prop) {\n return prop in obj ? obj[prop] : (e) => restProps.emit(prop, e);\n },\n }\n ),\n };\n}\n\nconst SCOPE_SLOT_COMPONENT_LIB = ['tea_basis', 'tea_shop', 'crm_basis'];\n\nconst SCOPE_SLOT_MAP = SCOPE_SLOT_COMPONENT_LIB.reduce((map, lib) => {\n map[`${lib}:TableMatching`] = {\n headerSlot: true,\n recordSlot: true,\n };\n\n map[`${lib}:TableExpanded`] = {\n headerSlot: true,\n recordSlot: true,\n };\n\n map[`${lib}:TabsTable`] = {\n headerSlot: true,\n recordSlot: true,\n };\n\n map[`${lib}:Table`] = {\n headerSlot: true,\n recordSlot: true,\n };\n\n return map;\n}, {});\n\nexport function isScopeSlot(comp, slot) {\n const { 'x-props': xProps } = comp;\n const sourceKey = xProps && xProps.sourceKey;\n const map = SCOPE_SLOT_MAP[sourceKey];\n return map && map[slot];\n}\n\nexport function getStaticResourceAttribute(staticUrl) {\n if (/^\\//.test(staticUrl)) {\n const { domain = '' } = window.app || {};\n const url = `https://${domain}${staticUrl}`;\n return url;\n }\n return staticUrl;\n}\n/**\n * 检查页面权限\n **/\nexport async function checkAuth(app, appId, pageId) {\n app.showNavigationBarLoading();\n const checkAuthResult = await app.cloud.callWedaApi({\n action: 'DescribeResourcesPermission',\n data: {\n ResourceType: `<%= isAdminPortal? 'modelApp' : 'app'%>`,\n ResourceIdList: [`${appId}-${pageId}`],\n },\n });\n let isLogin = false;\n if (Array.isArray(checkAuthResult) && checkAuthResult.length > 0) {\n isLogin = checkAuthResult[0]?.IsAccess ?? false;\n }\n app.hideNavigationBarLoading();\n\n if (!isLogin) {\n app.showToast({\n title: '页面无访问权限',\n icon: 'error',\n });\n }\n return isLogin;\n}\n"
|
|
57
|
-
},
|
|
58
|
-
"/src/utils/computed.js": {
|
|
59
|
-
"code": "export function createComputed(funcs, bindContext = null) {\n const obj = {}\n for (const name in funcs) {\n Object.defineProperty(obj, name, {\n get: bindContext ? funcs[name].bind(bindContext) : funcs[name],\n })\n }\n return obj\n}\n"
|
|
60
|
-
},
|
|
61
|
-
"/src/utils/date.js": {
|
|
62
|
-
"code": "// 日期转换\nclass CustomDate {\n constructor() {\n this.i18n = {\n dayNames: [\n 'Sun',\n 'Mon',\n 'Tue',\n 'Wed',\n 'Thu',\n 'Fri',\n 'Sat',\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ],\n monthNames: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n timeNames: ['a', 'p', 'am', 'pm', 'A', 'P', 'AM', 'PM'],\n };\n this.masks = {\n default: 'ddd mmm dd yyyy HH:MM:ss',\n shortDate: 'm/d/yy',\n paddedShortDate: 'mm/dd/yyyy',\n mediumDate: 'mmm d, yyyy',\n longDate: 'mmmm d, yyyy',\n fullDate: 'dddd, mmmm d, yyyy',\n shortTime: 'h:MM TT',\n mediumTime: 'h:MM:ss TT',\n longTime: 'h:MM:ss TT Z',\n isoDate: 'yyyy-mm-dd',\n isoTime: 'HH:MM:ss',\n isoDateTime: \"yyyy-mm-dd'T'HH:MM:sso\",\n isoUtcDateTime: \"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'\",\n expiresHeaderFormat: 'ddd, dd mmm yyyy HH:MM:ss Z',\n };\n this.token = /d{1,4}|D{3,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\\1?|W{1,2}|[LlopSZN]|\"[^\"]*\"|'[^']*'/g;\n this.timezone = /\\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\\d{4})?)\\b/g;\n this.timezoneClip = /[^-+\\dA-Z]/g;\n }\n\n /*\n *\n | Name | Mask | Example |\n | ----------------- | ------------------------------ | ------------------------ |\n | `default` | `ddd mmm dd yyyy HH:MM:ss` | Sat Jun 09 2007 17:46:21 |\n | `shortDate` | `m/d/yy` | 6/9/07 |\n | `paddedShortDate` | `mm/dd/yyyy` | 06/09/2007 |\n | `mediumDate` | `mmm d, yyyy` | Jun 9, 2007 |\n | `longDate` | `mmmm d, yyyy` | June 9, 2007 |\n | `fullDate` | `dddd, mmmm d, yyyy` | Saturday, June 9, 2007 |\n | `shortTime` | `h:MM TT` | 5:46 PM |\n | `mediumTime` | `h:MM:ss TT` | 5:46:21 PM |\n | `longTime` | `h:MM:ss TT Z` | 5:46:21 PM EST |\n | `isoDate` | `yyyy-mm-dd` | 2007-06-09 |\n | `isoTime` | `HH:MM:ss` | 17:46:21 |\n | `isoDateTime` | `yyyy-mm-dd'T'HH:MM:sso` | 2007-06-09T17:46:21+0700 |\n | `isoUtcDateTime` | `UTC:yyyy-mm-dd'T'HH:MM:ss'Z'` | 2007-06-09T22:46:21Z |\n *\n */\n format(date, mask, utc, gmt) {\n let newMask = mask;\n let newDate = date;\n let newUtc = utc;\n let newGmt = gmt;\n if (\n arguments.length === 1 &&\n this._kindOf(newDate) === 'string' &&\n !/\\d/.test(newDate)\n ) {\n newDate = undefined;\n }\n newDate = newDate || newDate === 0 ? newDate : new Date();\n if (!(newDate instanceof Date)) newDate = new Date(newDate);\n if (isNaN(newDate)) throw TypeError('Invalid date');\n newMask = String(this.masks[newMask] || newMask || this.masks['default']);\n const maskSlice = newMask.slice(0, 4);\n if (maskSlice === 'UTC:' || maskSlice === 'GMT:') {\n newMask = newMask.slice(4);\n newUtc = true;\n if (maskSlice === 'GMT:') newGmt = true;\n }\n const _ = newUtc ? 'getUTC' : 'get';\n const _d = newDate[`${_}Date`]();\n const D = newDate[`${_}Day`]();\n const _m = newDate[`${_}Month`]();\n const y = newDate[`${_}FullYear`]();\n const _H = newDate[`${_}Hours`]();\n const _M = newDate[`${_}Minutes`]();\n const _s = newDate[`${_}Seconds`]();\n const _L = newDate[`${_}Milliseconds`]();\n const _o = newUtc ? 0 : newDate.getTimezoneOffset();\n const _W = this._getWeek(newDate);\n const _N = this._getDayOfWeek(newDate);\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n // @ts-ignore\n // @ts-ignore\n const flags = {\n d: () => _d,\n dd: () => self._pad(_d),\n ddd: () => self.i18n.dayNames[D],\n DDD: () =>\n self._getDayName({\n y,\n m: _m,\n d: _d,\n _,\n dayName: self.i18n.dayNames[D],\n short: true,\n }),\n dddd: () => self.i18n.dayNames[D + 7],\n DDDD: () =>\n self._getDayName({\n y: y,\n m: _m,\n d: _d,\n _: _,\n dayName: self.i18n.dayNames[D + 7],\n }),\n m: () => _m + 1,\n mm: () => self._pad(_m + 1),\n mmm: () => self.i18n.monthNames[_m],\n mmmm: () => self.i18n.monthNames[_m + 12],\n yy: () => String(y).slice(2),\n yyyy: () => self._pad(y, 4),\n h: () => _H % 12 || 12,\n hh: () => self._pad(_H % 12 || 12),\n H: () => _H,\n HH: () => self._pad(_H),\n M: () => _M,\n MM: () => self._pad(_M),\n s: () => _s,\n ss: () => self._pad(_s),\n l: () => self._pad(_L, 3),\n L: () => self._pad(Math.floor(_L / 10)),\n t: () => (_H < 12 ? self.i18n.timeNames[0] : self.i18n.timeNames[1]),\n tt: () => (_H < 12 ? self.i18n.timeNames[2] : self.i18n.timeNames[3]),\n T: () => (_H < 12 ? self.i18n.timeNames[4] : self.i18n.timeNames[5]),\n TT: () => (_H < 12 ? self.i18n.timeNames[6] : self.i18n.timeNames[7]),\n // eslint-disable-next-line no-nested-ternary\n Z: () =>\n newGmt\n ? 'GMT'\n : newUtc\n ? 'UTC'\n : (String(newDate).match(self.timezone) || [''])\n .pop()\n .replace(self.timezoneClip, '')\n .replace(/GMT\\+0000/g, 'UTC'),\n o: () =>\n (_o > 0 ? '-' : '+') +\n self._pad(Math.floor(Math.abs(_o) / 60) * 100 + (Math.abs(_o) % 60), 4),\n p: () =>\n `${\n (_o > 0 ? '-' : '+') + self._pad(Math.floor(Math.abs(_o) / 60), 2)\n }:${self._pad(Math.floor(Math.abs(_o) % 60), 2)}`,\n // @ts-ignore\n S: () =>\n ['th', 'st', 'nd', 'rd'][\n _d % 10 > 3 ? 0 : (((_d % 100) - (_d % 10) != 10) * _d) % 10\n ],\n W: () => _W,\n WW: () => self._pad(_W),\n N: () => _N,\n };\n return mask.replace(this.token, (match) => {\n if (match in flags) {\n return flags[match]();\n }\n return match.slice(1, match.length - 1);\n });\n }\n\n _pad(val, len) {\n let newVal = String(val);\n const newLen = len || 2;\n while (newVal.length < newLen) {\n newVal = `0${newVal}`;\n }\n return newVal;\n }\n\n _getDayName(_ref) {\n const { y, m, d, _, dayName } = _ref;\n const _ref$short = _ref['short'];\n const _short = _ref$short === void 0 ? false : _ref$short;\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(yesterday[`${_}Date`]() - 1);\n const tomorrow = new Date();\n tomorrow.setDate(tomorrow[`${_}Date`]() + 1);\n const today_d = function today_d() {\n return today[`${_}Date`]();\n };\n const today_m = function today_m() {\n return today[`${_}Month`]();\n };\n const today_y = function today_y() {\n return today[`${_}FullYear`]();\n };\n const yesterday_d = function yesterday_d() {\n return yesterday[`${_}Date`]();\n };\n const yesterday_m = function yesterday_m() {\n return yesterday[`${_}Month`]();\n };\n const yesterday_y = function yesterday_y() {\n return yesterday[`${_}FullYear`]();\n };\n const tomorrow_d = function tomorrow_d() {\n return tomorrow[`${_}Date`]();\n };\n const tomorrow_m = function tomorrow_m() {\n return tomorrow[`${_}Month`]();\n };\n const tomorrow_y = function tomorrow_y() {\n return tomorrow[`${_}FullYear`]();\n };\n if (today_y() === y && today_m() === m && today_d() === d) {\n return _short ? 'Tdy' : 'Today';\n }\n if (yesterday_y() === y && yesterday_m() === m && yesterday_d() === d) {\n return _short ? 'Ysd' : 'Yesterday';\n }\n if (tomorrow_y() === y && tomorrow_m() === m && tomorrow_d() === d) {\n return _short ? 'Tmw' : 'Tomorrow';\n }\n return dayName;\n }\n\n _getWeek(date) {\n const targetThursday = new Date(\n date.getFullYear(),\n date.getMonth(),\n date.getDate()\n );\n targetThursday.setDate(\n targetThursday.getDate() - ((targetThursday.getDay() + 6) % 7) + 3\n );\n const firstThursday = new Date(targetThursday.getFullYear(), 0, 4);\n firstThursday.setDate(\n firstThursday.getDate() - ((firstThursday.getDay() + 6) % 7) + 3\n );\n const ds =\n targetThursday.getTimezoneOffset() - firstThursday.getTimezoneOffset();\n targetThursday.setHours(targetThursday.getHours() - ds);\n const weekDiff = (targetThursday - firstThursday) / (864e5 * 7);\n return 1 + Math.floor(weekDiff);\n }\n\n _getDayOfWeek(date) {\n let dow = date.getDay();\n if (dow === 0) {\n dow = 7;\n }\n return dow;\n }\n\n _kindOf(val) {\n if (val === null) {\n return 'null';\n }\n if (val === undefined) {\n return 'undefined';\n }\n if (this._typeof(val) !== 'object') {\n return this._typeof(val);\n }\n if (Array.isArray(val)) {\n return 'array';\n }\n return {}.toString.call(val).slice(8, -1).toLowerCase();\n }\n\n _typeof(obj) {\n if (typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol') {\n this._typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n this._typeof = function _typeof(obj) {\n return obj &&\n typeof Symbol === 'function' &&\n obj.constructor === Symbol &&\n obj !== Symbol.prototype\n ? 'symbol'\n : typeof obj;\n };\n }\n return this._typeof(obj);\n }\n}\n\nconst dataInstance = new CustomDate();\nexport const formatDate = new CustomDate().format.bind(dataInstance);\n"
|
|
63
|
-
},
|
|
64
|
-
"/src/utils/error.jsx": {
|
|
65
|
-
"code": "import React from 'react'\n\nexport function createErrorFallback(cmpKey, id) {\n return function ComponentErrorFallback(props) {\n return (\n <div\n style={{ color: 'red', display: 'flex', alignItems: 'center' }}\n title={`组件${cmpKey} ${id}发生了错误,错误信息:${props.error}`}\n >\n {cmpKey}组件错误\n </div>\n )\n }\n}\n"
|
|
66
|
-
},
|
|
67
|
-
"/src/utils/eventProxy.js": {
|
|
68
|
-
"code": "/**\n * @author elliothu@tencent.com\n * @date 2019-05-07\n * @desc 事件系统,用于全局通信\n */\n\nexport class EventProxy {\n proxies = {};\n\n onceProxies = {};\n\n on = (eventName, handler) => {\n if (this.proxies[eventName]) {\n return this.proxies[eventName].push(handler);\n }\n this.proxies[eventName] = [handler];\n };\n\n only = (eventName, handler) => {\n this.proxies[eventName] = [handler];\n };\n\n once = (eventName, handler) => {\n if (this.onceProxies[eventName]) {\n return this.onceProxies[eventName].push(handler);\n }\n this.onceProxies[eventName] = [handler];\n };\n\n emit = (eventName, ...args) => {\n if (this.proxies[eventName]) {\n this.proxies[eventName].forEach(handler => handler(...args));\n }\n if (this.onceProxies[eventName]) {\n this.onceProxies[eventName].forEach(handler => handler(...args));\n this.onceProxies[eventName] = [];\n }\n };\n\n cancel = (eventName, handler) => {\n if (!this.proxies[eventName]) { return; }\n this.proxies[eventName] = this.proxies[eventName].filter(h => h !== handler);\n };\n\n cancelOnce = (eventName, handler) => {\n if (!this.onceProxies[eventName]) { return; }\n this.onceProxies[eventName] = this.onceProxies[eventName].filter(h => h !== handler);\n };\n\n cancelAll = eventName => {\n if (!this.proxies[eventName]) { return; }\n this.proxies[eventName] = [];\n };\n\n cancelAllOnce = eventName => {\n if (!this.onceProxies[eventName]) { return; }\n this.onceProxies[eventName] = [];\n };\n\n clear = () => {\n this.proxies = {};\n this.onceProxies = {};\n };\n}\n"
|
|
69
|
-
},
|
|
70
|
-
"/src/utils/history.js": {
|
|
71
|
-
"code": "import { createHashHistory, createBrowserHistory } from 'history';\n\nconst createHistory = (options, isHash = false) => {\n if (process.env.isApp || process.env.isAdminPortal || isHash) {\n return createHashHistory({\n basename: '', // The base URL of the app (see below)\n ...options,\n });\n }\n return createBrowserHistory(options);\n};\n\nlet history = createHistory(\n {\n basename: '', // The base URL of the app (see below)\n // forceRefresh: false, // Set true to force full page refreshes\n // keyLength: 6, // The length of location.key\n },\n true\n);\nwindow._WEAPPS_HISTORY = history;\n\nfunction generateBrowserHistory(param) {\n history = createBrowserHistory(param);\n window._WEAPPS_HISTORY = history;\n return history;\n}\n\nfunction generateHashHistory(param) {\n history = createHashHistory(param);\n window._WEAPPS_HISTORY = history;\n return history;\n}\n\nexport { history, createHistory, generateBrowserHistory, generateHashHistory };\n"
|
|
72
|
-
},
|
|
73
|
-
"/src/utils/hooks.js": {
|
|
74
|
-
"code": "import * as React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nexport function useScrollTop() {\n const { pathname } = useLocation()\n React.useEffect(() => {\n window.scrollTo(0, 0)\n }, [pathname])\n return null\n}"
|
|
75
|
-
},
|
|
76
|
-
"/src/utils/index.js": {
|
|
77
|
-
"code": "import { get as lodashGet, set as lodashSet } from 'lodash';\n\nexport * from './actionHandler';\nexport * from './common';\nexport * from './computed';\nexport * from './history';\nexport * from './widgets';\nexport * from './style';\n\n/*\n根据 object对象的path路径获取值。 如果解析 value 是 undefined 会以 defaultValue 取代。\n*/\nexport function getter(context, path, defaultValue = undefined) {\n return lodashGet(context, path, defaultValue);\n}\n\n/*\n设置 object对象中对应 path 属性路径上的值,如果path不存在,则创建。 缺少的索引属性会创建为数组,而缺少的属性会创建为对象。 使用_.setWith 定制path创建\n*/\nexport function setter(context, path, value = undefined) {\n return lodashSet(context, path, value);\n}\n\nexport function _isMobile() {\n if (window.matchMedia) {\n return Boolean(window.matchMedia('(max-width: 1024px)')?.matches);\n }\n let check = false;\n (function (a) {\n if (\n /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(\n a\n ) ||\n /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(\n a.substr(0, 4)\n )\n )\n check = true;\n })(navigator.userAgent || navigator.vendor || window.opera);\n return check;\n}\n"
|
|
78
|
-
},
|
|
79
|
-
"/src/utils/initGlobalVar.js": {
|
|
80
|
-
"code": "import { app } from '../app/global-api'\nimport { createComputed } from '/src/utils/computed'\nimport globalCommon from '../app/common'\nimport globalState from '../store'\nimport globalComputed from '../lowcode/computed'\n\n// 防止页面重复引用\nlet isInit = false\nif(!isInit) {\n window.$$global = window.$$global || {}\n app.common = globalCommon\n app.state = globalState\n app.computed = createComputed(globalComputed)\n}\n"
|
|
81
|
-
},
|
|
82
|
-
"/src/utils/lifecycle.js": {
|
|
83
|
-
"code": "/* eslint-disable @typescript-eslint/no-empty-function */\n/**\n * 生命周期处理函数\n */\nimport throttle from 'lodash.throttle';\nimport * as querystring from 'query-string';\nimport appLifeCycle from '../lowcode/lifecycle';\n\n// 小程序 端使用lifeCycle\nlet alreadyInitAppLifeCycle = false;\nexport function initAppLifeCycle(app, { beforeCustomLaunch }) {\n const onAppLaunch = (query) => {\n beforeCustomLaunch(query);\n appLifeCycle?.onAppLaunch(query);\n };\n // 应用级别事件监听\n if (!alreadyInitAppLifeCycle) {\n onAppLaunch(app.getLaunchOptionsSync());\n appLifeCycle?.onAppShow(app.getLaunchOptionsSync());\n\n // 预留等客户端来触发\n // window.addEventListener('appLaunch', (...args) => onAppLaunch(...args))\n window.addEventListener('appShow', (...args) =>\n appLifeCycle?.onAppShow(...args)\n );\n window.addEventListener('appHide', (...args) =>\n appLifeCycle?.onAppHide(...args)\n );\n window.addEventListener('error', (...args) =>\n appLifeCycle?.onAppError(...args)\n );\n window.addEventListener('unhandledrejection', (event) =>\n appLifeCycle?.onAppUnhandledRejection(event?.reason)\n );\n alreadyInitAppLifeCycle = true;\n }\n}\n\nlet isReachBottom = false;\n// web 端使用lifeCycle\nexport function pageLifeCycleMount(\n useEffect,\n {\n beforePageCustomLaunch,\n onPageLoad,\n onPageShow,\n onPageReady,\n onPageHide,\n onPageUnload,\n onPullDownRefresh,\n onReachBottom,\n onShareAppMessage,\n onPageScroll,\n onResize,\n onAddToFavorites,\n onShareTimeline,\n onTabItemTap,\n },\n app = {},\n pageCodeContext\n) {\n // 预览区调试栏可调试\n window.$page = pageCodeContext;\n // royhyang 此处个人认为应该走调用一次的方案\n useEffect(() => {\n const _onPageLoad = async function (query) {\n await (beforePageCustomLaunch && beforePageCustomLaunch(query));\n return typeof onPageLoad === 'function' ? onPageLoad(query) : () => {};\n };\n _onPageLoad.call(pageCodeContext, getCurrentPageQuery());\n }, []);\n\n useEffect(() => {\n typeof onPageReady === 'function' && onPageReady.call(pageCodeContext);\n typeof onPageShow === 'function' && onPageShow.call(pageCodeContext);\n if (typeof onPullDownRefresh === 'function') {\n app.onPullDownRefresh && app.onPullDownRefresh(onPullDownRefresh);\n }\n if (\n typeof onPageScroll === 'function' ||\n typeof onReachBottom === 'function'\n ) {\n window.onscroll = throttle(() => {\n //变量scrollTop是滚动条滚动时,滚动条上端距离顶部的距离\n let scrollTop =\n document.documentElement.scrollTop || document.body.scrollTop;\n\n //变量windowHeight是可视区的高度\n let windowHeight =\n document.documentElement.clientHeight || document.body.clientHeight;\n\n //变量scrollHeight是滚动条的总高度(当前可滚动的页面的总高度)\n let scrollHeight =\n document.documentElement.scrollHeight || document.body.scrollHeight;\n if (typeof onPageScroll === 'function') {\n onPageScroll.call(pageCodeContext, {\n scrollTop: window.pageYOffset,\n });\n }\n\n // console.log(scrollTop, windowHeight, scrollTop + windowHeight, scrollHeight, isReachBottom)\n //滚动条到底部\n if (scrollTop + windowHeight >= scrollHeight && !isReachBottom) {\n //要进行的操作\n isReachBottom = true;\n if (typeof onReachBottom === 'function') {\n onReachBottom.call(pageCodeContext);\n }\n }\n // 容许用户回弹50然后执行ReachBottom, 50为测试最佳值\n if (scrollTop + windowHeight < scrollHeight - 50) {\n isReachBottom = false;\n }\n }, 300);\n }\n // todo\n if (typeof onShareAppMessage === 'function') {\n window.onShareAppMessage = onShareAppMessage.bind(pageCodeContext);\n }\n\n if (typeof onResize === 'function') {\n window.onresize = () => {\n onResize.call(pageCodeContext, {\n size: {\n windowWidth: window.innerWidth,\n windowHeight: window.innerHeight,\n },\n });\n };\n }\n return () => {\n typeof onPageHide === 'function' && onPageHide.call(pageCodeContext, {});\n typeof onPageUnload === 'function' &&\n onPageUnload.call(pageCodeContext, {});\n if (typeof onPullDownRefresh === 'function') {\n app.offPullDownRefresh &&\n app.offPullDownRefresh(onPullDownRefresh.bind(pageCodeContext));\n }\n\n window.onscroll = null;\n window.onresize = null;\n };\n }, []);\n}\n\nfunction getCurrentPageQuery() {\n let queryText = location.href.split('?')[1];\n let query = querystring.parse(queryText) || {};\n Object.keys(query).forEach((key) => {\n query[key] = decodeURIComponent(query[key]);\n });\n return query;\n}\n\nexport function initWebConfig(app, appConfig) {\n // miniprogram.config 配置截取\n app.setConfig(appConfig);\n}\n"
|
|
84
|
-
},
|
|
85
|
-
"/src/utils/monitor-jssdk.min.js": {
|
|
86
|
-
"code": "/**\n * @license @govcloud/gsd-monitor v1.0.0\n * @modify: sdk完善\n * @release 2020-08-13 14:16\n */\n\nvar yyptReport = (function () {\n 'use strict';\n\n var storage = {\n /**\n * 获取cookie信息\n * @method carLoanLib.Cookie.getCookie\n * @param {String} name 获取的cookie的键值\n * @return {String} 获取的cookie值\n */\n getCookie: function (name) {\n var re = new RegExp('(?:^|;+|\\\\s+)' + name + '=([^;]*)');\n var result = document.cookie.match(re);\n return !result ? '' : result[1];\n },\n /**\n * 设置cookie信息\n *\n * @method setCookie\n * @param {String} name 设置cookie的键值\n * @param {String} value 设置的cookie的值\n * @param {String} domain 设置cookie的域名\n * @param {String} [path:/] cookie存放的路径\n * @param {Number} minute 设置的cookie的有效期\n */\n setCookie: function (name, value, domain, path, minute) {\n if (domain === void 0) {\n domain = '';\n }\n if (path === void 0) {\n path = '';\n }\n if (minute === void 0) {\n minute = null;\n }\n var expire;\n if (minute) {\n expire = new Date();\n expire.setTime(Date.now() + 60 * 1000 * minute);\n }\n document.cookie =\n name +\n '=' +\n value +\n '; ' +\n (expire ? 'expires=' + expire.toUTCString() + '; ' : '') +\n ('path=' +\n (path || '/') +\n '; domain=' +\n (domain || location.host).split(':')[0] +\n ';');\n },\n /**\n * 删除cookie\n *\n * @method carLoanLib.Cookie.delCookie\n * @param {String} name 设置cookie的键值\n * @param {String} domain 设置cookie的域名\n * @param {String} path cookie存放的路径\n */\n delCookie: function (name, domain, path) {\n if (domain === void 0) {\n domain = '';\n }\n if (path === void 0) {\n path = '';\n }\n document.cookie =\n name +\n '=; expires=Mon, 26 Jul 1997 05:00:00 GMT; ' +\n ('path=' +\n (path || '/') +\n '; domain=' +\n (domain || location.host).split(':')[0] +\n ';');\n },\n set: function (key, val) {\n if (!!window.localStorage) {\n try {\n localStorage.setItem(key, val);\n } catch (e) {}\n } else {\n //只能存cookie\n // 30天\n this.setCookie(key, val, '', '', 30 * 24 * 60);\n }\n },\n get: function (key) {\n if (!!window.localStorage) {\n return localStorage.getItem(key);\n } else {\n return this.getCookie(key);\n }\n return null;\n },\n remove: function (key) {\n if (!!window.localStorage) {\n try {\n localStorage.removeItem(key);\n } catch (e) {}\n } else {\n this.delCookie(key);\n }\n },\n };\n\n var ajax = function (opt) {\n opt = opt || {};\n opt.method = opt.method.toUpperCase() || 'POST';\n opt.url = opt.url || '';\n opt.async = opt.async || true;\n opt.data = opt.data || null;\n opt.success = opt.success || function () {};\n opt.error = opt.error || function () {};\n var xmlHttp = null;\n if (XMLHttpRequest) {\n xmlHttp = new XMLHttpRequest();\n } else {\n xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');\n }\n var params = [];\n for (var key in opt.data) {\n params.push(key + '=' + opt.data[key]);\n }\n var postData = params.join('&');\n if (opt.method.toUpperCase() === 'POST') {\n xmlHttp.open(opt.method, opt.url, opt.async);\n xmlHttp.setRequestHeader(\n 'Content-Type',\n 'application/x-www-form-urlencoded;charset=utf-8'\n );\n xmlHttp.send(postData);\n } else if (opt.method.toUpperCase() === 'GET') {\n xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async);\n xmlHttp.send(null);\n }\n xmlHttp.onreadystatechange = function () {\n if (xmlHttp.readyState == 4) {\n if (xmlHttp.status == 200) {\n opt.success(JSON.parse(xmlHttp.responseText));\n } else {\n opt.error(xmlHttp);\n }\n }\n };\n };\n\n var utils = {\n wrapHistory: function () {\n // 处理replaceState和pushState行为的监听\n var _wr = function (type) {\n var orig = window.history[type];\n return function () {\n var rv = orig.apply(this, arguments);\n var e = document.createEvent('HTMLEvents');\n e.initEvent(type, false, true);\n e.arguments = arguments;\n window.dispatchEvent(e);\n return rv;\n };\n };\n window.history.pushState = _wr('pushState');\n window.history.replaceState = _wr('replaceState');\n },\n // 删除无用数据\n _delUselessParam: function (obj) {\n var cookiedObj = {};\n for (var item in obj) {\n var temVal = obj[item];\n if (temVal) {\n cookiedObj[item] = temVal;\n }\n }\n return cookiedObj;\n },\n // 获取操作系统\n _getOsName: function () {\n var name = 'unknown';\n var userAgent = window.navigator.userAgent;\n if (userAgent.indexOf('Android') != -1) {\n name = 'Android';\n } else if (userAgent.indexOf('iPhone') != -1) {\n name = 'iPhone';\n } else if (userAgent.indexOf('SymbianOS') != -1) {\n name = 'SymbianOS';\n } else if (userAgent.indexOf('Windows Phone') != -1) {\n name = 'Windows Phone';\n } else if (userAgent.indexOf('iPad') != -1) {\n name = 'iPad';\n } else if (userAgent.indexOf('iPod') != -1) {\n name = 'iPod';\n } else if (userAgent.indexOf('Windows NT 10.0') != -1) {\n name = 'Windows 10';\n } else if (userAgent.indexOf('Windows NT 6.2') != -1) {\n name = 'Windows 8';\n } else if (userAgent.indexOf('Windows NT 6.1') != -1) {\n name = 'Windows 7';\n } else if (userAgent.indexOf('Windows NT 6.0') != -1) {\n name = 'Windows Vista';\n } else if (userAgent.indexOf('Windows NT 5.1') != -1) {\n name = 'Windows XP';\n } else if (userAgent.indexOf('Windows NT 5.0') != -1) {\n name = 'Windows 2000';\n } else if (userAgent.indexOf('Mac') != -1) {\n name = 'Mac/iOS';\n } else if (userAgent.indexOf('X11') != -1) {\n name = 'UNIX';\n } else if (userAgent.indexOf('Linux') != -1) {\n name = 'Linux';\n }\n return name;\n },\n _objectMerge: function (object, source) {\n if (source) {\n for (var key in source) {\n if (typeof source[key] === 'object') {\n object[key] = Object.assign({}, source[key], object[key]);\n } else {\n object[key] = source[key];\n }\n }\n }\n return object;\n },\n _randomString: function (len) {\n if (len === void 0) {\n len = 10;\n }\n var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz123456789';\n var maxPos = $chars.length;\n var pwd = '';\n for (var i = 0; i < len; i++) {\n pwd = pwd + $chars.charAt(Math.floor(Math.random() * maxPos));\n }\n return pwd + new Date().getTime();\n },\n // get query param\n getQueryString: function (key, search) {\n var reg = new RegExp('(?:^|[&\\\\?])' + key + '=([^&#]*)(?:[&#].*|$)');\n var arrVal = (search || location.href || '').match(reg);\n var result = '';\n if (arrVal) {\n result = arrVal[1] || '';\n }\n return decodeURIComponent(result);\n },\n /** 图片发送请求 */\n request: function (url) {\n var _image = new Image();\n _image.onload =\n _image.onerror =\n _image.onabort =\n function () {\n _image.onload = _image.onerror = _image.onabort = null;\n };\n _image.src = url;\n },\n _getPixelSize: function () {\n var winWidth = 0,\n winHeight = 0;\n if (\n document.documentElement &&\n document.documentElement.clientHeight &&\n document.documentElement.clientWidth\n ) {\n winHeight = document.documentElement.clientHeight;\n winWidth = document.documentElement.clientWidth;\n } else {\n //获取窗口宽度\n if (window.innerWidth) {\n winWidth = window.innerWidth;\n } else if (document.body && document.body.clientWidth) {\n winWidth = document.body.clientWidth;\n }\n //获取窗口高度\n if (window.innerHeight) {\n winHeight = window.innerHeight;\n } else if (document.body && document.body.clientHeight) {\n winHeight = document.body.clientHeight;\n }\n }\n return winWidth + '*' + winHeight;\n },\n // 获取元素坐标\n _getElementPos: function (e) {\n if (e.parentNode === null || !e.style || e.style.display == 'none')\n return !1;\n var t = navigator.userAgent.toLowerCase(),\n n = null,\n r = [],\n i;\n if (e.getBoundingClientRect) {\n var s = void 0,\n o = void 0,\n u = void 0,\n a = void 0;\n return (\n (i = e.getBoundingClientRect()),\n (s = Math.max(\n document.documentElement.scrollTop,\n document.body.scrollTop\n )),\n (o = Math.max(\n document.documentElement.scrollLeft,\n document.body.scrollLeft\n )),\n (u = document.body.clientTop),\n (a = document.body.clientLeft),\n {\n htx: i.left + o - a,\n hty: i.top + s - u,\n }\n );\n }\n if (document['getBoxObjectFor']) {\n i = document['getBoxObjectFor'](e);\n var f = e.style.borderLeftWidth\n ? Math.floor(e.style.borderLeftWidth)\n : 0,\n l = e.style.borderTopWidth ? Math.floor(e.style.borderTopWidth) : 0;\n r = [i.x - f, i.y - l];\n } else {\n (r = [e.offsetLeft, e.offsetTop]), (n = e.offsetParent);\n if (n != e)\n while (n)\n (r[0] += n.offsetLeft), (r[1] += n.offsetTop), (n = n.offsetParent);\n if (\n t.indexOf('opera') > -1 ||\n (t.indexOf('safari') > -1 && e.style.position == 'absolute')\n )\n (r[0] -= document.body.offsetLeft), (r[1] -= document.body.offsetTop);\n }\n e.parentNode ? (n = e.parentNode) : (n = null);\n while (n && n.tagName != 'BODY' && n.tagName != 'HTML')\n (r[0] -= n.scrollLeft),\n (r[1] -= n.scrollTop),\n n.parentNode ? (n = n.parentNode) : (n = null);\n return {\n htx: r[0],\n hty: r[1],\n };\n },\n };\n\n var errorHandler = {\n logObj: null,\n init: function (logObj) {\n this.logObj = logObj;\n this.startListen();\n },\n // 监听错误\n startListen: function () {\n // 监听js执行错误\n var orgError = window.onerror;\n var self = this;\n window.onerror = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n self.logObj._logReport(\n {\n type: 'error',\n msg:\n (args[0] || '') +\n ' @ (' +\n (args[1] || '') +\n ':' +\n (args[2] || 0) +\n ':' +\n (args[3] || 0) +\n ')',\n },\n true\n );\n orgError && orgError.call.apply(orgError, [window].concat(args));\n };\n // 监听未被catch的promise错误\n window.addEventListener('unhandledrejection', function (event) {\n var reason = event && self.stringifyPlus(event.reason);\n // 给每一个实例发送 Promise 未被 catch 错误日志\n self.logObj._logReport(\n {\n type: 'error',\n msg: 'unhandledrejection promise_error: ' + reason,\n },\n true\n );\n });\n // 监听静态资源加载错误\n window.document.addEventListener(\n 'error',\n function (event) {\n if (!event || !event.target || !event.srcElement) return;\n var target = event.target || event.srcElement;\n // @ts-ignore\n var url = target.src || target.href;\n // @ts-ignore\n var tagName = target.tagName;\n // 将错误上报到错误日志\n if (url && tagName) {\n self.logObj._logReport(\n {\n type: 'error',\n msg: tagName + ' load fail: ' + url,\n },\n true\n );\n }\n },\n true\n );\n },\n stringifyPlus: function (target) {\n try {\n return (\n JSON.stringify(target, this.stringifyHandler(), 4) || 'undefined'\n ).replace(/\"/gim, ''); // 这里之所以要去掉字符串中的所有 “ \" ” ,是因为传进来的是 Error 对象时会 stringify 两次\n } catch (e) {\n return (\n 'error happen when stringify: \\n ' + e.message + ' \\n ' + e.stack\n );\n }\n },\n stringifyHandler: function () {\n var cache = [];\n var keyCache = [];\n return function (key, value) {\n if (value instanceof Error) {\n // 处理Error对象\n return (\n 'Error.message\\u3010 ' +\n value.message +\n ' \\u3011; Error.stack\\u3010 ' +\n value.stack +\n ' \\u3011'\n );\n }\n if (typeof value === 'object' && value !== null) {\n // 处理循环引用\n var index = cache.indexOf(value);\n if (index !== -1) {\n return '[Circular ' + keyCache[index] + ']';\n }\n cache.push(value);\n keyCache.push(key || 'root');\n }\n return value;\n };\n },\n };\n\n var MonitorJSSDK = /** @class */ (function () {\n function MonitorJSSDK(config) {\n this._reportParams = [];\n this._storeMark = '_monitor_report_cache_data_v2';\n this._sdkConf = {\n report_url: '',\n appKey: '',\n env: 'prod',\n userKey: 'user_id',\n autoWatchClick: true,\n autoReportPv: false,\n customUserPrams: null,\n isWxEnv: false,\n reportNum: 5,\n // 通过传入函数,可以让业务方写代码传入要上报的属性\n getCusParams: function () {},\n stopReport: false, // 停止上报\n };\n // 默认的参数\n this._defReportParams = {\n ky: '',\n pf: utils.getQueryString('pf') || 'H5',\n id: '',\n cui: '',\n geo: '',\n my_appid: utils.getQueryString('appid'),\n scene: utils.getQueryString('scene'),\n region: utils.getQueryString('region'),\n ua: navigator.userAgent,\n ev: {\n cn: 'unknown',\n lg: (\n navigator.language || navigator['browserLanguage']\n ).toLowerCase(),\n sr: '',\n tz: new Date().getTimezoneOffset(),\n os: '',\n ua: '',\n av: '', //app version,应用的版本(App版本号)\n },\n ui: '',\n si: '',\n ts: '',\n pi: '',\n rf: '',\n et: '1',\n ht: '',\n htx: '',\n hty: '',\n dm: location.hostname,\n rdm: document.referrer,\n ei: '',\n kv: '',\n du: '',\n er: '',\n ea: '',\n sp: '',\n ext: '',\n cp: '',\n adt: '', // 渠道来源\n };\n if (config.env === 'dev') {\n console.info('当前JSSDK[env]为dev:非正式环境不做上报!');\n return;\n }\n this._sdkConf = Object.assign(this._sdkConf, config);\n if (this._sdkConf.stopReport) return;\n this._defReportParams.cp = config.customUserPrams;\n if (this._sdkConf.report_url && this._sdkConf.appKey) {\n utils.wrapHistory();\n this._run();\n this._reportCp();\n errorHandler.init(this);\n } else {\n this._sdkConf.stopReport = true;\n console.error('report_url或appKey为空,不进行上报');\n }\n }\n // 上报自定义的用户属性,只有在用户属性变化的时候才会上报\n MonitorJSSDK.prototype._reportCp = function (params) {\n if (params === void 0) {\n params = {};\n }\n if (!this._defReportParams.cp) {\n return;\n }\n var cpKey = '_monitor_cp_v2';\n var cp = storage.get(cpKey);\n var newCp = JSON.stringify(this._defReportParams.cp);\n if (cp === newCp) {\n return;\n }\n var reportParams = this._cookiedReportParams(\n Object.assign(params, { et: '6' })\n );\n this._requestCgi(this._sdkConf.report_url, reportParams);\n storage.set(cpKey, newCp);\n };\n MonitorJSSDK.prototype._wrapGetCusParams = function () {\n return (\n typeof this._sdkConf.getCusParams === 'function' &&\n this._sdkConf.getCusParams()\n );\n };\n // 上报页面PV\n MonitorJSSDK.prototype._reportPV = function (params) {\n if (params === void 0) {\n params = {};\n }\n var reportParams = this._cookiedReportParams(\n utils._objectMerge(params, this._wrapGetCusParams())\n );\n this._requestCgi(this._sdkConf.report_url, reportParams);\n };\n // 单页应用监听页面路径改变自动上报\n MonitorJSSDK.prototype._watchPathChange = function () {\n var _self = this;\n //或者\n window.addEventListener('hashchange', function (e) {\n _self._reportPV();\n });\n window.addEventListener('replaceState', function (e) {\n _self._reportPV();\n });\n window.addEventListener('pushState', function (e) {\n _self._reportPV();\n });\n };\n // 获得Uv\n MonitorJSSDK.prototype._markUv = function () {\n var date = new Date();\n var markUv = storage.get('ps_markUv') || '';\n var datatime = storage.get('ps_markUvTime') || '';\n var today =\n date.getFullYear() +\n '/' +\n (date.getMonth() + 1) +\n '/' +\n date.getDate() +\n ' 23:59:59';\n if ((!markUv && !datatime) || date.getTime() > +datatime) {\n markUv = utils._randomString();\n storage.set('ps_markUv', markUv);\n storage.set('ps_markUvTime', new Date(today).getTime() + '');\n }\n return markUv;\n };\n // 加工上报参数\n MonitorJSSDK.prototype._cookiedReportParams = function (params) {\n if (params === void 0) {\n params = {};\n }\n var idx = Number(storage.getCookie('_monitor_idx_v2') || '0') + 1;\n storage.setCookie('_monitor_idx_v2', idx);\n return Object.assign(\n {},\n this._defReportParams,\n {\n adt:\n utils.getQueryString('adt') ||\n storage.getCookie('adt') ||\n sessionStorage.getItem('adt'),\n ts: Date.now(),\n pi: location.href,\n idx: idx,\n rf: document.referrer,\n rdm: document.referrer\n .replace(/https?:\\/\\//, '')\n .replace(/(\\/.+)|(\\?.+)|(#.+)/g, ''), // \t来源域名\tstring\n },\n params\n );\n };\n // 日志上报\n MonitorJSSDK.prototype._logReport = function (params, immediate) {\n if (params === void 0) {\n params = {};\n }\n if (immediate === void 0) {\n immediate = false;\n }\n var cookiedObj = { kv: params };\n utils._objectMerge(cookiedObj, this._wrapGetCusParams());\n var reportParams = this._cookiedReportParams(\n Object.assign(cookiedObj, { et: '2000' })\n );\n reportParams.ev.ua = reportParams.ua;\n delete reportParams.ua;\n var storeArr = this.getStoreArr();\n // 非立刻上报,且目前缓存的条数不够\n if (!immediate && storeArr.length < this._sdkConf.reportNum - 1) {\n storeArr.push(utils._delUselessParam(reportParams));\n storage.set(this._storeMark, JSON.stringify(storeArr));\n return;\n }\n this._requestCgi(this._sdkConf.report_url, reportParams);\n };\n /*点击流上报\n * ei 自定义事件id\tstring\n * params 额外参数对象\n * cache 缓存,下次在上报\n * target 事件源对象\n * */\n MonitorJSSDK.prototype._eventClick = function (ei, params, cache, target) {\n if (params === void 0) {\n params = {};\n }\n if (cache === void 0) {\n cache = false;\n }\n if (this._sdkConf.stopReport) return;\n if (target) {\n Object.assign(params, utils._getElementPos(target));\n }\n utils._objectMerge(params, this._wrapGetCusParams());\n var reportParams = this._cookiedReportParams(\n Object.assign(params, { ei: ei, et: '1000' })\n );\n // 先缓存\n if (cache) {\n var storeArr = this.getStoreArr();\n storeArr.push(utils._delUselessParam(reportParams));\n storage.set(this._storeMark, JSON.stringify(storeArr));\n return;\n }\n this._requestCgi(this._sdkConf.report_url, reportParams);\n };\n // 获取缓存数据\n MonitorJSSDK.prototype.getStoreArr = function () {\n var storeArr = storage.get(this._storeMark);\n if (!storeArr) {\n storeArr = [];\n } else {\n storeArr = JSON.parse(storeArr);\n }\n return storeArr;\n };\n // 保存缓存数据\n MonitorJSSDK.prototype.setStoreArr = function (arr) {\n var newArr = this.getStoreArr();\n storage.set(this._storeMark, JSON.stringify(newArr.concat(arr)));\n };\n MonitorJSSDK.prototype._run = function () {\n this._getPageBaseInfo();\n if (this._sdkConf.autoWatchClick) {\n this._watchClick();\n }\n if (this._sdkConf.autoReportPv) {\n this._watchPathChange();\n }\n };\n // 获取页面基本信息\n MonitorJSSDK.prototype._getPageBaseInfo = function () {\n if (this._sdkConf.isWxEnv) {\n this._getNetworkType();\n }\n var realUserId =\n utils.getQueryString('id') ||\n storage.getCookie(this._sdkConf['userKey']) ||\n this._getUUID();\n Object.assign(this._defReportParams, {\n dm: location.hostname,\n ky: this._sdkConf.appKey,\n si: this._getSessionId(),\n id: realUserId + '_id',\n cui: realUserId + '_cui',\n ui: realUserId + '_ui', // 一个随机生成的id,因为大多数没有id,cui,所以用ui计算uv\n });\n this._defReportParams.ev.sr = utils._getPixelSize();\n this._defReportParams.ev.os = utils._getOsName();\n };\n // 获取sessionid\n MonitorJSSDK.prototype._getSessionId = function () {\n var sessionKey = '_monitor_sessionid_v2';\n var sessionId = storage.getCookie(sessionKey);\n if (!sessionId) {\n sessionId = utils._randomString();\n storage.setCookie(sessionKey, sessionId);\n storage.setCookie('_monitor_idx_v2', 1);\n }\n return sessionId;\n };\n // 生成唯一id\n MonitorJSSDK.prototype._getUUID = function () {\n var uuidKey = '_monitor_uuid_v2';\n var uuid = storage.get(uuidKey);\n if (uuid) {\n return uuid;\n }\n var d = new Date().getTime();\n if (window.performance && typeof window.performance.now === 'function') {\n d += performance.now(); //use high-precision timer if available\n }\n uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(\n /[xy]/g,\n function (c) {\n var r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);\n }\n );\n uuid = 'mc_' + uuid;\n storage.set(uuidKey, uuid);\n return uuid;\n };\n // 获取网络类型\n MonitorJSSDK.prototype._getNetworkType = function () {\n var self = this;\n if (this._sdkConf.isWxEnv) {\n wx.getNetworkType({\n success: function (res) {\n self._defReportParams.ev.cn = res.networkType; // 返回网络类型2g,3g,4g,wifi\n },\n });\n }\n };\n MonitorJSSDK.prototype._requestCgi = function (url, data) {\n var _self = this;\n if (_self._sdkConf.stopReport) return;\n var storeArr = this.getStoreArr();\n storeArr.push(utils._delUselessParam(data));\n var reportInfo = storeArr.splice(0 - _self._sdkConf.reportNum);\n storage.set(this._storeMark, JSON.stringify(storeArr));\n ajax({\n method: 'POST',\n url: url,\n data: {\n reportInfo: encodeURIComponent(JSON.stringify(reportInfo)),\n },\n success: function (response) {\n if (+response.errcode !== 0) {\n _self.setStoreArr(reportInfo);\n }\n },\n error: function () {\n _self.setStoreArr(reportInfo);\n },\n });\n };\n // 监听有hottag的标签\n MonitorJSSDK.prototype._watchClick = function () {\n var _self = this;\n document.addEventListener(\n 'click',\n function (e) {\n var target = e.srcElement || e.target; // src 就是事件的触发源\n var hottag = target.getAttribute('hottag');\n var ht = target.getAttribute('ht');\n hottag && _self._eventClick(hottag, { ht: ht }, false, target);\n },\n false\n );\n };\n return MonitorJSSDK;\n })();\n var yyptReport = {\n g_monitor: null,\n // 初始化\n initMonitor: function (config) {\n if (!this.g_monitor) {\n this.g_monitor = new MonitorJSSDK(config);\n }\n },\n // 初始化并进行pv上报\n pgvMain: function (config, params) {\n if (params === void 0) {\n params = {};\n }\n this.initMonitor(config);\n if (config.autoReportPv) {\n this.g_monitor._reportPV(params);\n }\n },\n // 手动上报pv\n reportPV: function (params) {\n this.g_monitor._reportPV(params);\n },\n // 点击上报\n eventClick: function () {\n var params = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n params[_i] = arguments[_i];\n }\n var _a;\n if (!this.g_monitor) {\n console.error('请先运行initMonitor方法!!');\n return;\n }\n (_a = this.g_monitor)._eventClick.apply(_a, params);\n },\n logInfo: function (msg, params, immediate) {\n if (params === void 0) {\n params = {};\n }\n this.g_monitor._logReport(\n Object.assign(params, { type: 'info', msg: msg }),\n immediate\n );\n },\n logWarn: function (msg, params, immediate) {\n if (params === void 0) {\n params = {};\n }\n this.g_monitor._logReport(\n Object.assign(params, { type: 'warn', msg: msg }),\n immediate\n );\n },\n logError: function (msg, params, immediate) {\n if (params === void 0) {\n params = {};\n }\n this.g_monitor._logReport(\n Object.assign(params, { type: 'error', msg: msg }),\n immediate\n );\n },\n };\n\n return yyptReport;\n})();\n\nwindow.yyptReport = yyptReport;\n"
|
|
87
|
-
},
|
|
88
|
-
"/src/utils/page.js": {
|
|
89
|
-
"code": "export function createPageApi() {\n const $page = {\n state: {},\n computed: {},\n handler: {},\n props: {},\n widgets: {},\n };\n return $page;\n}\n"
|
|
90
|
-
},
|
|
91
|
-
"/src/utils/scan-code-action.js": {
|
|
92
|
-
"code": "import React from \"react\";\nimport { Suspense } from \"react\";\nimport ReactDOM from 'react-dom';\n\nconst ScanCode = React.lazy(() => import('./ScanCodeComponent'));\nconst WEAPP_SCAN_CODE_ELEMENT_ID = 'weapp-scan-code-modal-root';\nexport function scanCodeApi(opts) {\n const options = {\n onlyFromCamera: false,\n scanType: ['barCode', 'qrCode'],\n success: () => {},\n fail: () => {},\n complete: () => {},\n enableDefaultBehavior: true,\n ...opts,\n };\n if (typeof options.scanType === 'string') {\n options.scanType = [options.scanType];\n }\n let root = document.getElementById(WEAPP_SCAN_CODE_ELEMENT_ID);\n if (!root) {\n root = document.createElement('div');\n root.id = WEAPP_SCAN_CODE_ELEMENT_ID;\n }\n document.body.appendChild(root);\n ReactDOM.render(<Suspense fallback={<></>}><ScanCode root={root} options={options} /></Suspense>, root);\n}\n"
|
|
93
|
-
},
|
|
94
|
-
"/src/utils/ScanCodeComponent.js": {
|
|
95
|
-
"code": "import React, { useMemo, useRef, useEffect, useImperativeHandle, useState, useCallback } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { BrowserMultiFormatReader, NotFoundException, BarcodeFormat, DecodeHintType } from '@zxing/library';\nimport { app } from '../app/global-api';\n\n\nexport const FORMAT = {\n 0: { scanType: 'AZTEC', wxtype: null },\n 1: { scanType: 'CODABAR', wxtype: 'barCode' },\n 2: { scanType: 'CODE_39', wxtype: 'barCode' },\n 3: { scanType: 'CODE_93', wxtype: 'barCode' },\n 4: { scanType: 'CODE_128', wxtype: 'barCode' },\n 5: { scanType: 'DATA_MATRIX', wxtype: 'qrCode' },\n 6: { scanType: 'EAN_8', wxtype: 'barCode' },\n 7: { scanType: 'EAN_13', wxtype: 'barCode' },\n 8: { scanType: 'ITF', wxtype: 'barCode' },\n 9: { scanType: 'MAXICODE', wxtype: null },\n 10: { scanType: 'PDF_417', wxtype: 'qrCode' },\n 11: { scanType: 'QR_CODE', wxtype: 'qrCode' },\n 12: { scanType: 'RSS_14', wxtype: 'barCode' },\n 13: { scanType: 'RSS_EXPANDED', wxtype: 'barCode' },\n 14: { scanType: 'UPC_A', wxtype: 'barCode' },\n 15: { scanType: 'UPC_E', wxtype: 'barCode' },\n 16: { scanType: 'UPC_EAN_EXTENSION', wxtype: 'barCode' },\n};\n\nconst hints = new Map();\nconst formats = [\n BarcodeFormat.QR_CODE,\n BarcodeFormat.UPC_A,\n BarcodeFormat.UPC_E,\n BarcodeFormat.EAN_8,\n BarcodeFormat.EAN_13,\n BarcodeFormat.CODE_39,\n BarcodeFormat.CODE_93,\n BarcodeFormat.CODE_128,\n BarcodeFormat.DATA_MATRIX,\n BarcodeFormat.PDF_417,\n];\nhints.set(DecodeHintType.POSSIBLE_FORMATS, formats);\n\nconst Codescanner = React.forwardRef(({ events = {}, closeScanCode, scanType, onInit }, fref) => {\n const ref = useRef();\n const {\n fail = () => {},\n success = () => {},\n complete = () => {},\n } = events;\n\n const inited = useRef(false);\n const codeReader = new BrowserMultiFormatReader(hints);\n const start = async () => {\n setTimeout(() => {\n // try harder after 5 sceonds\n hints.set(DecodeHintType.TRY_HARDER, true);\n codeReader.timeBetweenDecodingAttempts = 1500;\n codeReader.hints = hints;\n }, 5000);\n const devices = await codeReader.listVideoInputDevices();\n\n if (devices.length) {\n try {\n await codeReader.decodeFromConstraints(\n { video: { facingMode: 'environment' } },\n ref.current,\n (result, err) => {\n if (!inited.current) {\n inited.current = true;\n onInit();\n }\n if (result) {\n if (scanType.includes(FORMAT[result.format].wxtype)) {\n success(wechatLikeResult(result));\n complete();\n closeScanCode();\n }\n }\n \n if (err && !err instanceof NotFoundException) {\n fail(err);\n complete();\n }\n },\n );\n } catch (err) {\n fail(err);\n complete();\n }\n } else {\n fail(new Error('No camera detect'));\n complete();\n }\n };\n\n const stop = () => {\n codeReader.reset();\n };\n\n useImperativeHandle(fref, () => ({\n start,\n stop,\n }));\n\n useEffect(() => {\n start().catch(fail);\n return () => {\n stop();\n };\n }, []);\n return (\n <>\n <video\n autoPlay\n ref={ref}\n id=\"weapp-scancode-video\"\n ></video>\n </>\n );\n});\n\n\nfunction fileToImage(file) {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = async (ev) => {\n const img = new Image();\n img.src = ev.target.result;\n resolve(img);\n };\n reader.onerror = reject;\n });\n}\n\nconst SCAN_CODE_STATE = 'scan-code-modal';\nexport default function ScanCode({ root, options }) {\n const {\n onlyFromCamera,\n scanType,\n success: successCallback,\n fail,\n complete,\n enableDefaultBehavior,\n } = options;\n useEffect(() => {\n // 覆盖一次返回按键为关闭\n if (history.state?.SCANCODE !== SCAN_CODE_STATE) {\n history.pushState({ SCANCODE: SCAN_CODE_STATE }, null);\n }\n const onPopState = () => {\n closeScanCode();\n };\n window.addEventListener('popstate', onPopState);\n return () => {\n if (history.state?.SCANCODE === SCAN_CODE_STATE) {\n history.back();\n }\n window.removeEventListener('popstate', onPopState);\n };\n }, [closeScanCode]);\n const ref = useRef();\n const closeScanCode = () => {\n ref.current?.stop?.();\n ReactDOM.render(null, root);\n };\n const success = useCallback((res) => {\n const {result} = res;\n if (enableDefaultBehavior) {\n if (/^https?:\\/\\//.test(result)) {\n window.open(result);\n } else {\n app.showModal({\n title: '扫描到以下内容',\n content: result,\n showCancel: false,\n confirmColor: '#006eff',\n });\n }\n }\n successCallback(res);\n });\n const [isCameraInit, setIscameraInit] = useState(false);\n const onInitCamera = () => {\n setIscameraInit(true);\n };\n const [modalErrMessage, setModalErrMessage] = useState('');\n const handleModalClick = () => {\n setModalErrMessage('');\n };\n const fileChanged = async (ev) => {\n const { files } = ev.target;\n if (files.length <= 0) return;\n const file = files[0];\n const img = await fileToImage(file);\n hints.set(DecodeHintType.TRY_HARDER, true);\n const codeReader = new BrowserMultiFormatReader(hints);\n try {\n const result = await codeReader.decodeFromImage(img);\n success(wechatLikeResult(result));\n closeScanCode();\n } catch (err) {\n onScanFail(err);\n }\n };\n const scanTypeText = useMemo(() => scanType.map((type) => {\n switch (type) {\n case 'qrCode':\n return '二维码';\n case 'barCode':\n return '条码';\n default:\n return type;\n }\n }).join(' / '), [scanType]);\n const onScanFail = (err) => {\n if (err instanceof NotFoundException) {\n setModalErrMessage(`未发现${scanTypeText}`);\n setIscameraInit(false);\n } else if (err.message === 'Permission denied') {\n setModalErrMessage('请打开相机权限以获取扫码功能');\n } else if (err.message === 'No camera detect') {\n setModalErrMessage('未能检测到相机设备');\n } else {\n setModalErrMessage(err.message);\n }\n setIscameraInit(false);\n fail(err);\n };\n if (modalErrMessage) {\n return <div className=\"weapp-scancode-modal\" onClick={handleModalClick}>\n <div className=\"weapp-scancode-modal-main\">\n <div className=\"weapp-scancode-scan-wrapper\">\n <p className=\"weapp-scancode-scan-not-found\">{modalErrMessage}</p>\n <p>点击重新扫码</p>\n </div>\n <CloseButton onClick={closeScanCode} />\n </div>\n </div>;\n }\n return (\n <div className=\"weapp-scancode-modal\">\n <div className=\"weapp-scancode-modal-main\">\n <Codescanner\n events={{ fail: onScanFail, success, complete }}\n ref={ref}\n closeScanCode={closeScanCode}\n scanType={scanType}\n onInit={(onInitCamera)}\n />\n\n {isCameraInit && <><CloseButton onClick={closeScanCode} />\n <div className=\"weapp-scancode-scan-wrapper\">\n <div className=\"weapp-scancode-scan-square\">\n <div className=\"weapp-scancode-scan-bar\"></div>\n </div>\n <p className=\"weapp-scancode-scan-tip\">扫${scanTypeText}</p>\n </div>\n </>\n }\n {!onlyFromCamera && isCameraInit && <div\n className=\"weapp-scancode-img-selector\"\n >\n <input onChange={fileChanged} type=\"file\" id=\"weapp-scancode-img-picker-input\" accept=\"image/*\" style={{ display: 'none' }} />\n <label\n htmlFor=\"weapp-scancode-img-picker-input\"\n className=\"weapp-scancode-img-picker\"\n >\n <span>\n <svg width=\"24px\" height=\"24px\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n <title>icon/album</title>\n <g id=\"icon/album\" stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n <rect id=\"矩形\" x=\"0\" y=\"0\" width=\"24\" height=\"24\"></rect>\n <path d=\"M21,4 C21.5522847,4 22,4.44771525 22,5 L22,19 C22,19.5522847 21.5522847,20 21,20 L3,20 C2.44771525,20 2,19.5522847 2,19 L2,5 C2,4.44771525 2.44771525,4 3,4 L21,4 Z M20.5,5.5 L3.5,5.5 L3.5,13.932 L8.34720227,9.89314397 C8.69729746,9.60139798 9.19512095,9.58601647 9.56028418,9.84165631 L9.65637439,9.91809179 L14.036,13.86 L16.8907001,11.8207928 C17.2650251,11.5533999 17.7734822,11.5758744 18.1227552,11.8752513 L18.1227552,11.8752513 L20.5,13.913 L20.5,5.5 Z\" id=\"形状结合\" fill=\"#FFFFFF\" fillRule=\"nonzero\"></path>\n </g>\n </svg>\n </span>\n </label>\n </div>}\n </div>\n </div>\n );\n}\n\nfunction CloseButton({ onClick }) {\n return (\n <a\n className=\"weapp-scancode-close-button\"\n aria-label=\"close modal\"\n onClick={onClick}\n >\n <svg width=\"12px\" height=\"12px\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M12.5348 2.04999L7.9998 6.58499L3.4638 2.04999L2.0498 3.46499L6.5858 8.00099L2.0498 12.536L3.4638 13.95L7.9998 9.41499L12.5348 13.95L13.9498 12.536L9.4138 8.00099L13.9498 3.46499L12.5348 2.04999Z\" fill=\"currentColor\"/>\n </svg>\n </a>\n );\n}\n\nfunction wechatLikeResult(zxingResult) {\n const wechatResult = {\n result: zxingResult.text || zxingResult.result,\n scanType: FORMAT[zxingResult.format].wxtype,\n };\n return wechatResult;\n}\n\n// https://github.com/AlloyTeam/AlloyImage/blob/master/src/module/filter/toGray.js\nfunction toGray(imgData) {\n const { data } = imgData;\n\n for (let i = 0, n = data.length;i < n;i += 4) {\n const gray = parseInt((0.299 * data[i] + 0.578 * data[i + 1] + 0.114 * data[i + 2]), 10);\n // eslint-disable-next-line no-multi-assign\n data[i + 2] = data[i + 1] = data[i] = gray;\n }\n\n imgData.data.set(data);\n\n return imgData;\n}\n\n// https://github.com/AlloyTeam/AlloyImage/blob/master/src/module/filter/sharp.js\nfunction sharp(imgData, arg = []) {\n const lamta = arg[0] || 0.6;\n const { data } = imgData;\n const { width } = imgData;\n\n for (let i = 0, n = data.length;i < n;i += 4) {\n const ii = i / 4;\n const row = parseInt(ii / width, 10);\n const col = ii % width;\n if (row === 0 || col === 0) continue;\n\n const A = ((row - 1) * width + (col - 1)) * 4;\n const B = ((row - 1) * width + col) * 4;\n const E = (ii - 1) * 4;\n\n for (let j = 0;j < 3;j ++) {\n const delta = data[i + j] - (data[B + j] + data[E + j] + data[A + j]) / 3;\n data[i + j] += delta * lamta;\n }\n }\n\n return imgData;\n}\n"
|
|
96
|
-
},
|
|
97
|
-
"/src/utils/style.js": {
|
|
98
|
-
"code": "import { kebabCase, camelcase, isEmptyObj } from './common';\n\nconst PERCENTAGE_KEY_LIST = [\n 'opacity',\n 'order',\n 'flex',\n 'flexGrow',\n 'flexShrink',\n 'zIndex',\n 'fontWeight',\n 'borderImage',\n];\n\nexport function translateStyleToRem(style) {\n return translateStyleByHandler(style, toREM);\n}\n\nexport function translateStyleByHandler(style, handler) {\n return Object.keys(style).reduce((result, key) => {\n const value = style[key];\n if (PERCENTAGE_KEY_LIST.includes(key)) {\n setStyleValue(result, key, value);\n } else if (value !== undefined && value !== null) {\n setStyleValue(result, key, handler(value));\n }\n return result;\n }, {});\n}\n\nfunction setStyleValue(object, key, value) {\n if (value === undefined || value === null || value === '') {\n return;\n }\n // 特殊样式移除\n if (key === 'open') {\n return;\n }\n\n if (isEmptyObj(value)) {\n return;\n }\n\n object[camelcase(key)] = value;\n}\n\nfunction calPxToREM(px) {\n if (Number.isNaN(px / 28)) return px.toString();\n if (+px === 0) {\n return '0';\n }\n return (px / 28).toFixed(4) + 'rem';\n}\n\nexport function toREM(cssLen) {\n if (typeof cssLen === 'string') {\n const cssLenArr = cssLen.split(' ');\n return cssLenArr\n .map((attr) => {\n const matchResult = attr.match(/^(-?\\d+)(px)?$/);\n if (matchResult && matchResult[1]) {\n return calPxToREM(+matchResult[1]);\n }\n return attr;\n })\n .join(' ');\n }\n\n if (typeof cssLen === 'number') {\n return calPxToREM(cssLen);\n }\n}\n\nexport function toCssText(style, className = '.some-class-name') {\n const attrText = Object.keys(style)\n .map((key) => {\n const value = style[key];\n return `${kebabCase(key)}: ${value};`;\n })\n .join('\\n');\n return `${className} { ${attrText} }\\n`;\n}\n"
|
|
99
|
-
},
|
|
100
|
-
"/src/utils/widgets.js": {
|
|
101
|
-
"code": "import * as React from 'react';\nimport { observable, autorun, untracked } from 'mobx';\nimport remove from 'lodash.remove';\nimport { EventProxy } from './eventProxy';\n\nexport const widgetKeys = [\n 'getConfig',\n 'findWidgets',\n 'getWidgetsByType',\n 'extends',\n 'on',\n 'off',\n 'getOwnerWidget',\n 'getDom',\n 'domRef',\n];\n\nexport const WidgetsContext = React.createContext({ parent: null });\n\nexport function isSlot(comp) {\n return !comp['x-props'];\n}\n\nexport function checkVisible({ _visible }) {\n return _visible !== false && _visible !== '';\n}\n\n// 实现和小程序一致的 API,以兼容多端\n// widget.getDom({ rect: true })\n// https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.fields.html\nexport function getDom(element, options) {\n if (!element) {\n console.warn('getDom 接口未传入有效的 element');\n return Promise.resolve({});\n }\n\n let result = {};\n if (options.id) result.id = element.id;\n if (options.dataset) result.dataset = element.dataset;\n if (options.rect) {\n const rect = element.getBoundingClientRect();\n Object.assign(result, {\n left: rect.left,\n right: rect.right,\n top: rect.top,\n bottom: rect.bottom,\n });\n }\n if (options.size) {\n const rect = element.getBoundingClientRect();\n Object.assign(result, {\n width: rect.width,\n height: rect.height,\n });\n }\n if (options.scrollOffset) {\n Object.assign(result, {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop,\n });\n }\n if (options.properties && Array.isArray(options.properties)) {\n options.properties.forEach((propName) => {\n result[propName] = element.getAttribute(propName);\n });\n }\n if (options.computedStyle && Array.isArray(options.computedStyle)) {\n const computedStyle = window.getComputedStyle(element);\n options.computedStyle.forEach((propName) => {\n result[propName] = computedStyle[propName];\n });\n }\n\n return Promise.resolve(result);\n}\n\nexport function findWidgets(\n widget,\n parentType,\n filterFn,\n includeInvisibleDescendants\n) {\n if (!widget) return [];\n\n let { children = [] } = widget;\n let matched = children.filter(filterFn);\n\n // 过滤掉不可见后代\n if (!includeInvisibleDescendants) {\n children = children.filter((item) => checkVisible(item));\n }\n\n children.forEach((child) => {\n // 如果递归过程中发现了自己,则停止递归\n matched = matched.concat(\n findWidgets(child, parentType, filterFn, includeInvisibleDescendants)\n );\n });\n\n // 过滤掉不可见的匹配项\n if (!includeInvisibleDescendants) {\n matched = matched.filter((item) => checkVisible(item));\n }\n\n return matched;\n}\n\nconst retryQueue = [];\n// 递归执行\nexport function retryDataBinds(tryTime = 10) {\n const fn = retryQueue.shift();\n if (!fn || tryTime <= 0) return;\n try {\n fn({ showLog: tryTime <= 1 });\n } catch (e) {\n console.error('retryDataBinds', e);\n }\n retryDataBinds(tryTime - 1);\n}\nexport function createWidgets(widgetProps, dataBinds, context) {\n const nodeTree = createWidgetTree(widgetProps, dataBinds);\n const widgets = runFor(nodeTree, {}, null, null, context);\n return widgets;\n\n /**\n *\n * @param {*} curForNode\n * @param {*} forItems\n * @param {*} parentLevelWidgets\n * @param {*} parentWidget\n * @param {*} context\n * @returns top level widgets or for dispose\n */\n function runFor(curForNode, forItems, parentLevelWidgets, parentWidget, context) {\n const nodeId = curForNode.id;\n if (!curForNode.value) {\n return createSubTree(curForNode, {});\n }\n const dispose = autorun(() => {\n let forList = [];\n try {\n forList = dataBinds[nodeId]._waFor(forItems, undefined, context);\n } catch (e) {\n console.error('waFor error', e);\n }\n\n if (!Array.isArray(forList)) {\n console.warn(nodeId, 'For 循环绑定的数据并不是数组,请检查');\n return;\n }\n\n // 让 forList 进行监听\n forList.forEach(() => {});\n untracked(() => {\n disposeWidgets(parentLevelWidgets[curForNode.id]);\n\n // clean nodes of previouse for run\n dfsTree(curForNode, (node) => {\n const arr = parentLevelWidgets[node.id];\n arr.splice(0, arr.length);\n parentWidget &&\n remove(parentWidget.children, ({ id }) => id === node.id);\n });\n\n forList.forEach((item, index) => {\n const subForItems = { ...forItems, [nodeId]: item };\n createSubTree(curForNode, subForItems);\n });\n\n // 非初始化时遇到需要重新构建 dataBinds\n retryDataBinds();\n });\n });\n\n return dispose;\n\n function createSubTree(curForNode, subForItems) {\n const widgets = {};\n\n // traverse down the tree to set all widgets\n dfsTree(curForNode, (node, parentNode) => {\n if (node.forCount === curForNode.forCount) {\n // Leaf node\n const w = observable(widgetProps[node.id]);\n w.id = node.id;\n if (node === curForNode) {\n w._disposers = [];\n }\n widgets[node.id] = w;\n w._listeners = new EventProxy();\n // 提供一个给 Node 挂载 API 的方式\n untracked(() => {\n w.getConfig = () => ({}); // 兼容非复合组件调用 getConfig 能力\n w.findWidgets = (type, includeInvisibleDescendants) =>\n findWidgets(w, w.widgetType, type, includeInvisibleDescendants);\n w.getWidgetsByType = (type, includeInvisibleDescendants) =>\n w.findWidgets(\n (currentWidget) => currentWidget.widgetType === type,\n includeInvisibleDescendants\n );\n w.extends = (name, fnOrData) =>\n Object.defineProperty(w, name, {\n value: fnOrData,\n writable: true,\n });\n w.on = (name, listener) => w._listeners.on(name, listener);\n w.off = (name, listener) => w._listeners.cancel(name, listener);\n w.getOwnerWidget = () => null; // 默认带上一个 widget\n });\n w.children = [];\n const parent = parentNode ? widgets[parentNode.id] : parentWidget;\n if (parent) {\n w.parent = parent;\n // 只有可显示 visible 的才存入 children 里\n if (checkVisible(w)) {\n parent.children.push(w);\n }\n }\n parentLevelWidgets && parentLevelWidgets[node.id].push(w);\n\n // Setup data binds\n Object.keys(dataBinds[node.id] || {}).map((prop) => {\n if (prop === '_waFor') {\n return;\n }\n function getBindData(options = {}) {\n let disposeError = false;\n const dispose = autorun(() => {\n try {\n // Computed data bind in the next tick since data bind may read widgets data\n w[prop] = dataBinds[node.id][prop](subForItems);\n disposeError = false;\n } catch (e) {\n console.warn(`Error computing data bind ${w.id}.${prop}`, e);\n if (prop === '_waIf') {\n w[prop] = false;\n } else {\n options.showLog && console.warn(e);\n retryQueue.push(getBindData);\n disposeError = true;\n }\n }\n });\n if (!disposeError && curForNode.id) {\n widgets[curForNode.id]._disposers.push(dispose);\n }\n }\n getBindData();\n });\n } else {\n if (parentLevelWidgets) {\n const len = parentLevelWidgets[node.id].push([]);\n widgets[node.id] = parentLevelWidgets[node.id][len - 1];\n } else {\n widgets[node.id] = observable([]);\n }\n }\n });\n\n // run for of next level\n dfsTree(curForNode, (node, parentNode) => {\n if (\n node.forCount === curForNode.forCount + 1 &&\n dataBinds[node.id] &&\n dataBinds[node.id]._waFor\n ) {\n widgets[node.id]._disposers = { dataBinds: [] };\n const dispose = runFor(\n node,\n subForItems,\n widgets,\n node.parent && widgets[node.parent.id],\n context\n );\n curForNode.id && widgets[curForNode.id]._disposers.push(dispose);\n }\n });\n\n return widgets;\n }\n }\n}\n\n/**\n * Add parent, children to widget\n */\nfunction createWidgetTree(widgets, dataBinds) {\n const virtualRoot = { children: [], forCount: 0 };\n const nodes = Object.keys(widgets).reduce((result, id) => {\n result[id] = {\n id,\n value: widgets[id],\n children: [],\n parent: null,\n forCount: 0,\n };\n return result;\n }, {});\n\n // Create widgets tree API\n Object.keys(nodes).map((id) => {\n const curNode = nodes[id];\n const parent = nodes[widgets[id]._parentId];\n if (!parent) {\n virtualRoot.children.push(curNode);\n return;\n }\n curNode.parent = parent;\n parent.children.push(curNode);\n });\n\n virtualRoot.children.map(addForCount);\n\n // dfs, add forCount\n function addForCount(node) {\n if (node.parent) {\n node.forCount = node.parent.forCount;\n }\n if (dataBinds[node.id] && dataBinds[node.id]._waFor) {\n node.forCount++;\n }\n node.children.map(addForCount);\n }\n\n return virtualRoot;\n}\n\nfunction dfsTree(node, fn, parent) {\n node.value && fn(node, parent);\n node.children.map((e) => dfsTree(e, fn, node.value ? node : null));\n}\n\n// dispose autorun\nfunction disposeWidgets(widgets = []) {\n widgets.forEach((widget) => {\n const disposers = widget._disposers;\n if (disposers) {\n disposers.map((dispose) => dispose());\n disposers.splice(0, disposers.length);\n }\n disposeWidgets(widget.children);\n });\n}\n"
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
//# sourceMappingURL=template.js.map
|
|
3
|
+
exports.default = {};
|
package/lib/index.d.ts
CHANGED
|
@@ -45,7 +45,6 @@ export interface IFrameworkPluginLowCodeInputs {
|
|
|
45
45
|
generateMpPath?: string;
|
|
46
46
|
plugins?: IPlugin[];
|
|
47
47
|
mpDeployPrivateKey?: string;
|
|
48
|
-
publicPath?: string;
|
|
49
48
|
deployOptions: {
|
|
50
49
|
mode: DEPLOY_MODE;
|
|
51
50
|
version?: string;
|
|
@@ -53,6 +52,7 @@ export interface IFrameworkPluginLowCodeInputs {
|
|
|
53
52
|
mpAppId?: string;
|
|
54
53
|
mpDeployPrivateKey?: string;
|
|
55
54
|
targetMpAppId?: string;
|
|
55
|
+
publicPath?: string;
|
|
56
56
|
};
|
|
57
57
|
credential?: {
|
|
58
58
|
secretId: string;
|
|
@@ -116,6 +116,7 @@ declare class LowCodePlugin extends Plugin {
|
|
|
116
116
|
_zipDir(src: any, dist: any): Promise<unknown>;
|
|
117
117
|
_postProcessAdminPortal(): Promise<void>;
|
|
118
118
|
_postProcessWebsiteConfig(): Promise<void>;
|
|
119
|
+
_checkBroswerHisroty(): boolean;
|
|
119
120
|
}
|
|
120
121
|
export declare const plugin: typeof LowCodePlugin;
|
|
121
122
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAOA,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAUrE,OAAO,EACL,SAAS,EAET,cAAc,EAIf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAYvD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAgB,MAAM,SAAS,CAAC;AAK7D,eAAO,MAAM,SAAS,WAAW,CAAC;AAClC,eAAO,MAAM,2BAA2B,IAAK,CAAC;AAoB9C,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;CAoBnB,CAAC;AAEF,MAAM,WAAW,6BAA6B;IAM5C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAMhB,OAAO,CAAC,EAAE,OAAO,CAAC;IAIlB,KAAK,EAAE,MAAM,CAAC;IAId,oBAAoB,EAAE,GAAG,CAAC;IAI1B,uBAAuB,CAAC,EAAE,GAAG,EAAE,CAAC;IAIhC,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC;IAK/B,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC;IAK5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAIhC,OAAO,CAAC,EAAE,MAAM,CAAC;IAIjB,cAAc,CAAC,EAAE,MAAM,CAAC;IAIxB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IAIpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAOA,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAC;AACpD,OAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAUrE,OAAO,EACL,SAAS,EAET,cAAc,EAIf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAYvD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAgB,MAAM,SAAS,CAAC;AAK7D,eAAO,MAAM,SAAS,WAAW,CAAC;AAClC,eAAO,MAAM,2BAA2B,IAAK,CAAC;AAoB9C,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;CAoBnB,CAAC;AAEF,MAAM,WAAW,6BAA6B;IAM5C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAMhB,OAAO,CAAC,EAAE,OAAO,CAAC;IAIlB,KAAK,EAAE,MAAM,CAAC;IAId,oBAAoB,EAAE,GAAG,CAAC;IAI1B,uBAAuB,CAAC,EAAE,GAAG,EAAE,CAAC;IAIhC,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC;IAK/B,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC;IAK5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAIhC,OAAO,CAAC,EAAE,MAAM,CAAC;IAIjB,cAAc,CAAC,EAAE,MAAM,CAAC;IAIxB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IAIpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAK5B,aAAa,EAAE;QAIb,IAAI,EAAE,WAAW,CAAC;QAIlB,OAAO,CAAC,EAAE,MAAM,CAAC;QAIjB,WAAW,CAAC,EAAE,MAAM,CAAC;QAIrB,OAAO,CAAC,EAAE,MAAM,CAAC;QAIjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAI5B,aAAa,CAAC,EAAE,MAAM,CAAC;QAIvB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAKF,UAAU,CAAC,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAIlB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IAKF,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAIF,SAAS,CAAC,EAAE;QACV,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,EAAE,OAAO,CAAC;QACrB,SAAS,EAAE,GAAG,CAAC;KAChB,CAAC;IAIF,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,oBAAY,cAAc,GAAG,6BAA6B,GACxD,OAAO,cAAc,CAAC;AAExB,cAAM,aAAc,SAAQ,MAAM;IAmBvB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,gBAAgB;IACrB,MAAM,EAAE,6BAA6B;IApB9C,SAAS,CAAC,eAAe,EAAE,cAAc,CAAC;IAC1C,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,WAAW,MAAC;IACtB,SAAS,CAAC,mBAAmB,MAAC;IAC9B,SAAS,CAAC,UAAU,MAAC;IACrB,SAAS,CAAC,eAAe,MAAC;IAC1B,SAAS,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACpC,SAAS,CAAC,QAAQ,KAAM;IACxB,SAAS,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,CAAM;IAC9B,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC;IACxB,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC;IACtB,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC;IAC/B,SAAS,CAAC,cAAc,CAAC,EAAE;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;gBAEO,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,6BAA6B;IA8J9C,QAAQ;IAMR,qBAAqB,CAAC,aAAa,EAAE,cAAc;IAmGnD,eAAe;IAUf,KAAK,CAAC,KAAK,KAAA;IASX,QAAQ,CAAC,KAAK,KAAA;IAWR,IAAI;IAKJ,GAAG;IAKH,MAAM;IAKN,OAAO;IAKP,KAAK;IAqTL,OAAO;IA8FP,MAAM;IAwGN,qBAAqB,CAAC,OAAO,EAAE,MAAM;IA4CrC,mBAAmB,CAAC,KAAK,KAAA,EAAE,KAAK,GAAE,OAAe;IAgBjD,eAAe,CAAC,KAAK,KAAA,EAAE,KAAK,GAAE,OAAe;IAqBnD,eAAe,CAAC,OAAO,KAAA;IAIjB,gBAAgB;IA4HhB,2BAA2B;IAuE3B,UAAU;IAwBV,OAAO,CAAC,GAAG,KAAA,EAAE,IAAI,KAAA;IAejB,uBAAuB;IA2CvB,yBAAyB;IAqF/B,oBAAoB;CAOrB;AAgCD,eAAO,MAAM,MAAM,sBAAgB,CAAC"}
|