{ "statistics": { "detectionDate": "2021-12-02T02:55:54.966Z", "formats": { "less": { "sources": { "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/src/styles/mixins/hover.less": { "lines": 4, "tokens": 39, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/src/styles/mixins/hairline.less": { "lines": 172, "tokens": 1037, "sources": 1, "clones": 1, "duplicatedLines": 172, "duplicatedTokens": 1037, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/src/styles/theme.less": { "lines": 19, "tokens": 63, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/src/styles/reset.less": { "lines": 141, "tokens": 412, "sources": 1, "clones": 1, "duplicatedLines": 141, "duplicatedTokens": 412, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/src/styles/common.less": { "lines": 44, "tokens": 270, "sources": 1, "clones": 1, "duplicatedLines": 44, "duplicatedTokens": 270, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-icon/Icon/icon.less": { "lines": 49, "tokens": 278, "sources": 1, "clones": 1, "duplicatedLines": 49, "duplicatedTokens": 278, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/styles/mixins/hover.less": { "lines": 4, "tokens": 39, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/styles/mixins/hairline.less": { "lines": 172, "tokens": 1037, "sources": 1, "clones": 1, "duplicatedLines": 172, "duplicatedTokens": 1037, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-icon/src/runtime/Icon/icon.less": { "lines": 49, "tokens": 278, "sources": 1, "clones": 1, "duplicatedLines": 49, "duplicatedTokens": 278, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/styles/theme.less": { "lines": 19, "tokens": 63, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/styles/reset.less": { "lines": 141, "tokens": 412, "sources": 1, "clones": 1, "duplicatedLines": 141, "duplicatedTokens": 412, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/styles/common.less": { "lines": 44, "tokens": 270, "sources": 1, "clones": 1, "duplicatedLines": 44, "duplicatedTokens": 270, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 } }, "total": { "lines": 858, "tokens": 4198, "sources": 12, "clones": 4, "duplicatedLines": 406, "duplicatedTokens": 1997, "percentage": 47.32, "percentageTokens": 47.57, "newDuplicatedLines": 0, "newClones": 0 } }, "smarty": { "sources": { "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/misc/route/template/runtime.tpl": { "lines": 5, "tokens": 53, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/misc/route/template/routes.tpl": { "lines": 61, "tokens": 447, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/generateFiles/core/plugin/pluginRegister.tpl": { "lines": 10, "tokens": 71, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/generateFiles/core/plugin/plugin.tpl": { "lines": 6, "tokens": 50, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/coreExports.tpl": { "lines": 16, "tokens": 63, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/generateFiles/fes/fes.tpl": { "lines": 92, "tokens": 713, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/micro/runtime/runtime.tpl": { "lines": 31, "tokens": 232, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/micro/runtime/qiankunModel.tpl": { "lines": 9, "tokens": 72, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/micro/runtime/lifecycles.tpl": { "lines": 123, "tokens": 963, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/main/runtime/qiankunModel.tpl": { "lines": 9, "tokens": 65, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/main/runtime/getMicroAppRouteComponent.tpl": { "lines": 11, "tokens": 80, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/main/runtime/MicroAppWithMemoHistory.tpl": { "lines": 31, "tokens": 252, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/main/runtime/MicroApp.tpl": { "lines": 167, "tokens": 1411, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-model/src/runtime/models/initialState.tpl": { "lines": 4, "tokens": 41, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-vuex/src/runtime/core.tpl": { "lines": 27, "tokens": 146, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-monaco-editor/src/runtime/loader.tpl": { "lines": 6, "tokens": 41, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-monaco-editor/src/runtime/editor.tpl": { "lines": 303, "tokens": 2240, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-monaco-editor/src/runtime/core.tpl": { "lines": 5, "tokens": 38, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-model/src/runtime/runtime.tpl": { "lines": 4, "tokens": 35, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-model/src/runtime/core.tpl": { "lines": 36, "tokens": 257, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-locale/src/runtime/core.tpl": { "lines": 99, "tokens": 740, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/runtime/index.tpl": { "lines": 37, "tokens": 313, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-icon/src/runtime/runtime.tpl": { "lines": 4, "tokens": 37, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-icon/src/runtime/icons.tpl": { "lines": 8, "tokens": 40, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-enums/src/runtime/core.tpl": { "lines": 177, "tokens": 1951, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-access/src/runtime/core.tpl": { "lines": 156, "tokens": 1321, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "total": { "lines": 1437, "tokens": 11672, "sources": 26, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "javascript": { "sources": { "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/generateFiles/core/plugin/index.js": { "lines": 71, "tokens": 494, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/pluginExports.js": { "lines": 22, "tokens": 154, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/generateFiles/core/exports/coreExports.js": { "lines": 27, "tokens": 241, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/src/common/utils.js": { "lines": 58, "tokens": 656, "sources": 1, "clones": 1, "duplicatedLines": 58, "duplicatedTokens": 656, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-icon/Icon/index.js": { "lines": 3, "tokens": 20, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/core/routes/runtime.js": { "lines": 5, "tokens": 54, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/core/routes/routes.js": { "lines": 83, "tokens": 552, "sources": 1, "clones": 2, "duplicatedLines": 58, "duplicatedTokens": 367, "percentage": 69.88, "percentageTokens": 66.49, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-monaco-editor/theme/default.js": { "lines": 109, "tokens": 576, "sources": 1, "clones": 1, "duplicatedLines": 109, "duplicatedTokens": 576, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-model/models/initialState.js": { "lines": 4, "tokens": 41, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/helpers/svg.js": { "lines": 48, "tokens": 456, "sources": 1, "clones": 1, "duplicatedLines": 48, "duplicatedTokens": 456, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/helpers/pluginLocale.js": { "lines": 32, "tokens": 290, "sources": 1, "clones": 1, "duplicatedLines": 28, "duplicatedTokens": 259, "percentage": 87.5, "percentageTokens": 89.31, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/helpers/pluginAccess.js": { "lines": 39, "tokens": 368, "sources": 1, "clones": 1, "duplicatedLines": 39, "duplicatedTokens": 368, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/core/routes/runtime.js": { "lines": 5, "tokens": 54, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/core/routes/routes.js": { "lines": 132, "tokens": 883, "sources": 1, "clones": 2, "duplicatedLines": 58, "duplicatedTokens": 367, "percentage": 43.94, "percentageTokens": 41.56, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/misc/route/index.js": { "lines": 298, "tokens": 2566, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/generateFiles/fes/index.js": { "lines": 60, "tokens": 524, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/webpackConfig/vue.js": { "lines": 18, "tokens": 129, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/webpackConfig/resolveDefine.js": { "lines": 40, "tokens": 335, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/webpackConfig/minimizer.js": { "lines": 61, "tokens": 387, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/webpackConfig/index.js": { "lines": 326, "tokens": 2306, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/webpackConfig/html.js": { "lines": 98, "tokens": 743, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/webpackConfig/getBabelOpts.js": { "lines": 99, "tokens": 595, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/webpackConfig/define.js": { "lines": 11, "tokens": 71, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/webpackConfig/css.js": { "lines": 122, "tokens": 783, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/webpack/index.js": { "lines": 49, "tokens": 488, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/info/index.js": { "lines": 22, "tokens": 175, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/help/index.js": { "lines": 8, "tokens": 63, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/dev/watchPkg.js": { "lines": 55, "tokens": 547, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/dev/index.js": { "lines": 226, "tokens": 1659, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/dev/devServer.js": { "lines": 58, "tokens": 446, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/dev/createRouteMiddleware.js": { "lines": 18, "tokens": 225, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/build/index.js": { "lines": 67, "tokens": 534, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/build/build.js": { "lines": 18, "tokens": 170, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/pc/src/app.js": { "lines": 22, "tokens": 166, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/src/app.js": { "lines": 6, "tokens": 39, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-request/throttle.js": { "lines": 14, "tokens": 139, "sources": 1, "clones": 2, "duplicatedLines": 28, "duplicatedTokens": 278, "percentage": 200, "percentageTokens": 200, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-request/setDataField.js": { "lines": 10, "tokens": 134, "sources": 1, "clones": 2, "duplicatedLines": 20, "duplicatedTokens": 268, "percentage": 200, "percentageTokens": 200, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-request/scheduler.js": { "lines": 31, "tokens": 306, "sources": 1, "clones": 2, "duplicatedLines": 62, "duplicatedTokens": 612, "percentage": 200, "percentageTokens": 200, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-request/resErrorProcess.js": { "lines": 16, "tokens": 133, "sources": 1, "clones": 2, "duplicatedLines": 32, "duplicatedTokens": 266, "percentage": 200, "percentageTokens": 200, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-request/resDataAdaptor.js": { "lines": 7, "tokens": 107, "sources": 1, "clones": 2, "duplicatedLines": 14, "duplicatedTokens": 214, "percentage": 200, "percentageTokens": 200, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-request/request.js": { "lines": 217, "tokens": 1763, "sources": 1, "clones": 7, "duplicatedLines": 347, "duplicatedTokens": 2749, "percentage": 159.91, "percentageTokens": 155.93, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-request/preventRepeatReq.js": { "lines": 63, "tokens": 546, "sources": 1, "clones": 2, "duplicatedLines": 126, "duplicatedTokens": 1092, "percentage": 200, "percentageTokens": 200, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-request/paramsProcess.js": { "lines": 10, "tokens": 97, "sources": 1, "clones": 2, "duplicatedLines": 20, "duplicatedTokens": 194, "percentage": 200, "percentageTokens": 200, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-request/helpers.js": { "lines": 85, "tokens": 594, "sources": 1, "clones": 2, "duplicatedLines": 170, "duplicatedTokens": 1188, "percentage": 200, "percentageTokens": 200, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-request/genRequestKey.js": { "lines": 33, "tokens": 211, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-request/cacheControl.js": { "lines": 208, "tokens": 1521, "sources": 1, "clones": 2, "duplicatedLines": 416, "duplicatedTokens": 3042, "percentage": 200, "percentageTokens": 200, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-icon/runtime.js": { "lines": 4, "tokens": 37, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-icon/icons.js": { "lines": 6, "tokens": 34, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/core/pluginRegister.js": { "lines": 16, "tokens": 129, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/core/plugin.js": { "lines": 6, "tokens": 66, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/core/coreExports.js": { "lines": 17, "tokens": 96, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/stores/foo/bar.js": { "lines": 22, "tokens": 147, "sources": 1, "clones": 2, "duplicatedLines": 39, "duplicatedTokens": 263, "percentage": 177.27, "percentageTokens": 178.91, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-vuex/runtime.js": { "lines": 4, "tokens": 36, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-vuex/core.js": { "lines": 29, "tokens": 293, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-request/throttle.js": { "lines": 14, "tokens": 139, "sources": 1, "clones": 1, "duplicatedLines": 14, "duplicatedTokens": 139, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-request/setDataField.js": { "lines": 10, "tokens": 134, "sources": 1, "clones": 1, "duplicatedLines": 10, "duplicatedTokens": 134, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-request/scheduler.js": { "lines": 31, "tokens": 306, "sources": 1, "clones": 1, "duplicatedLines": 31, "duplicatedTokens": 306, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-request/resErrorProcess.js": { "lines": 16, "tokens": 133, "sources": 1, "clones": 1, "duplicatedLines": 16, "duplicatedTokens": 133, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-request/resDataAdaptor.js": { "lines": 7, "tokens": 107, "sources": 1, "clones": 1, "duplicatedLines": 7, "duplicatedTokens": 107, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-request/request.js": { "lines": 235, "tokens": 1965, "sources": 1, "clones": 4, "duplicatedLines": 130, "duplicatedTokens": 995, "percentage": 55.32, "percentageTokens": 50.64, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-request/preventRepeatReq.js": { "lines": 63, "tokens": 546, "sources": 1, "clones": 1, "duplicatedLines": 63, "duplicatedTokens": 546, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-request/paramsProcess.js": { "lines": 10, "tokens": 97, "sources": 1, "clones": 1, "duplicatedLines": 10, "duplicatedTokens": 97, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-request/helpers.js": { "lines": 85, "tokens": 594, "sources": 1, "clones": 1, "duplicatedLines": 85, "duplicatedTokens": 594, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-request/genRequestKey.js": { "lines": 28, "tokens": 172, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-request/cacheControl.js": { "lines": 208, "tokens": 1521, "sources": 1, "clones": 1, "duplicatedLines": 208, "duplicatedTokens": 1521, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-monaco-editor/loader.js": { "lines": 6, "tokens": 39, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-monaco-editor/core.js": { "lines": 5, "tokens": 40, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-model/runtime.js": { "lines": 4, "tokens": 35, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-model/core.js": { "lines": 32, "tokens": 270, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-locale/runtime.js": { "lines": 4, "tokens": 36, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-locale/langUConfigMap.js": { "lines": 313, "tokens": 1930, "sources": 1, "clones": 1, "duplicatedLines": 313, "duplicatedTokens": 1930, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-locale/core.js": { "lines": 115, "tokens": 850, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/runtime.js": { "lines": 70, "tokens": 616, "sources": 1, "clones": 1, "duplicatedLines": 70, "duplicatedTokens": 616, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/index.js": { "lines": 37, "tokens": 455, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/icons.js": { "lines": 3, "tokens": 19, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-enums/core.js": { "lines": 162, "tokens": 1439, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-access/runtime.js": { "lines": 38, "tokens": 366, "sources": 1, "clones": 1, "duplicatedLines": 38, "duplicatedTokens": 366, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-access/createDirective.js": { "lines": 45, "tokens": 429, "sources": 1, "clones": 1, "duplicatedLines": 45, "duplicatedTokens": 429, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-access/createComponent.js": { "lines": 6, "tokens": 82, "sources": 1, "clones": 1, "duplicatedLines": 6, "duplicatedTokens": 82, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-access/core.js": { "lines": 156, "tokens": 1350, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/core/pluginRegister.js": { "lines": 41, "tokens": 324, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/core/pluginExports.js": { "lines": 6, "tokens": 103, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/core/plugin.js": { "lines": 6, "tokens": 74, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/core/coreExports.js": { "lines": 17, "tokens": 96, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/vueLoader.js": { "lines": 13, "tokens": 77, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/terserOptions.js": { "lines": 9, "tokens": 62, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/targets.js": { "lines": 16, "tokens": 106, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/singular.js": { "lines": 11, "tokens": 71, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/runtimePublicPath.js": { "lines": 10, "tokens": 69, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/publicPath.js": { "lines": 13, "tokens": 90, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/proxy.js": { "lines": 12, "tokens": 80, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/postcssLoader.js": { "lines": 9, "tokens": 62, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/plugins.js": { "lines": 9, "tokens": 71, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/outputPath.js": { "lines": 13, "tokens": 97, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/nodeModulesTransform.js": { "lines": 14, "tokens": 102, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/mountElementId.js": { "lines": 10, "tokens": 74, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/mock.js": { "lines": 213, "tokens": 1870, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/lessLoader.js": { "lines": 10, "tokens": 70, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/inlineLimit.js": { "lines": 9, "tokens": 62, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/html.js": { "lines": 15, "tokens": 85, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/globalCSS.js": { "lines": 27, "tokens": 211, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/extraPostCSSPlugins.js": { "lines": 9, "tokens": 62, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/extraBabelPresets.js": { "lines": 9, "tokens": 62, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/extraBabelPlugins.js": { "lines": 9, "tokens": 62, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/externals.js": { "lines": 10, "tokens": 84, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/exportStatic.js": { "lines": 16, "tokens": 129, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/dynamicImport.js": { "lines": 10, "tokens": 69, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/devtool.js": { "lines": 9, "tokens": 62, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/devServer.js": { "lines": 27, "tokens": 211, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/devScripts.js": { "lines": 12, "tokens": 85, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/define.js": { "lines": 11, "tokens": 72, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/cssLoader.js": { "lines": 35, "tokens": 252, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/copy.js": { "lines": 17, "tokens": 117, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/checkVuePackage.js": { "lines": 29, "tokens": 236, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/chainWebpack.js": { "lines": 9, "tokens": 62, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/base.js": { "lines": 10, "tokens": 74, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/babelPluginImport.js": { "lines": 19, "tokens": 142, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/autoprefixer.js": { "lines": 14, "tokens": 87, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/analyze.js": { "lines": 39, "tokens": 399, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/features/alias.js": { "lines": 21, "tokens": 154, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/buildDevUtils.js": { "lines": 201, "tokens": 1753, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-monaco-editor/src/runtime/theme/default.js": { "lines": 109, "tokens": 576, "sources": 1, "clones": 1, "duplicatedLines": 109, "duplicatedTokens": 576, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/runtime/helpers/svg.js": { "lines": 48, "tokens": 456, "sources": 1, "clones": 1, "duplicatedLines": 48, "duplicatedTokens": 456, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/runtime/helpers/pluginLocale.js": { "lines": 32, "tokens": 292, "sources": 1, "clones": 1, "duplicatedLines": 28, "duplicatedTokens": 259, "percentage": 87.5, "percentageTokens": 88.7, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/runtime/helpers/pluginAccess.js": { "lines": 39, "tokens": 368, "sources": 1, "clones": 1, "duplicatedLines": 39, "duplicatedTokens": 368, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-icon/src/runtime/Icon/index.js": { "lines": 3, "tokens": 20, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/service/utils/pluginUtils.js": { "lines": 134, "tokens": 1221, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/service/utils/loadDotEnv.js": { "lines": 15, "tokens": 126, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/service/utils/isPromise.js": { "lines": 6, "tokens": 63, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/config/utils/mergeDefault.js": { "lines": 8, "tokens": 96, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/config/utils/isEqual.js": { "lines": 15, "tokens": 161, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/config/utils/configUtils.js": { "lines": 16, "tokens": 97, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/pc/.fes.prod.js": { "lines": 2, "tokens": 13, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/pc/.fes.js": { "lines": 22, "tokens": 144, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/pc/.eslintrc.js": { "lines": 13, "tokens": 65, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/.fes.js": { "lines": 34, "tokens": 194, "sources": 1, "clones": 1, "duplicatedLines": 24, "duplicatedTokens": 148, "percentage": 70.59, "percentageTokens": 76.29, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/.eslintrc.js": { "lines": 17, "tokens": 86, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/vuex.md": { "lines": 26, "tokens": 217, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/qiankun.md": { "lines": 141, "tokens": 468, "sources": 1, "clones": 3, "duplicatedLines": 301, "duplicatedTokens": 942, "percentage": 213.48, "percentageTokens": 201.28, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/model.md": { "lines": 7, "tokens": 42, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/locale.md": { "lines": 11, "tokens": 49, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/enums.md": { "lines": 48, "tokens": 229, "sources": 1, "clones": 1, "duplicatedLines": 48, "duplicatedTokens": 229, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/editor.md": { "lines": 13, "tokens": 50, "sources": 1, "clones": 1, "duplicatedLines": 13, "duplicatedTokens": 50, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/access.md": { "lines": 262, "tokens": 966, "sources": 1, "clones": 1, "duplicatedLines": 262, "duplicatedTokens": 966, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/common/utils.js": { "lines": 58, "tokens": 656, "sources": 1, "clones": 1, "duplicatedLines": 58, "duplicatedTokens": 656, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/fes.js": { "lines": 87, "tokens": 688, "sources": 1, "clones": 1, "duplicatedLines": 75, "duplicatedTokens": 620, "percentage": 86.21, "percentageTokens": 90.12, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/stores/user.js": { "lines": 53, "tokens": 371, "sources": 1, "clones": 1, "duplicatedLines": 17, "duplicatedTokens": 116, "percentage": 32.08, "percentageTokens": 31.27, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/stores/counter.js": { "lines": 22, "tokens": 147, "sources": 1, "clones": 1, "duplicatedLines": 22, "duplicatedTokens": 147, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/models/user.js": { "lines": 7, "tokens": 51, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/locales/zh-TW.js": { "lines": 6, "tokens": 41, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/locales/zh-CN.js": { "lines": 10, "tokens": 69, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/locales/pt-BR.js": { "lines": 6, "tokens": 41, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/locales/id-ID.js": { "lines": 9, "tokens": 56, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/locales/en-US.js": { "lines": 10, "tokens": 69, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/common/service.js": { "lines": 18, "tokens": 77, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/fes.js": { "lines": 88, "tokens": 698, "sources": 1, "clones": 1, "duplicatedLines": 75, "duplicatedTokens": 620, "percentage": 85.23, "percentageTokens": 88.83, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-runtime/src/plugin/index.js": { "lines": 144, "tokens": 1209, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/utils/generateFiles.js": { "lines": 59, "tokens": 434, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/utils/generateExports.js": { "lines": 59, "tokens": 448, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/utils/constants.js": { "lines": 5, "tokens": 50, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/registerMethods.js": { "lines": 93, "tokens": 681, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-vuex/src/runtime/runtime.js": { "lines": 4, "tokens": 36, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/template/throttle.js": { "lines": 14, "tokens": 139, "sources": 1, "clones": 1, "duplicatedLines": 14, "duplicatedTokens": 139, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/template/setDataField.js": { "lines": 10, "tokens": 134, "sources": 1, "clones": 1, "duplicatedLines": 10, "duplicatedTokens": 134, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/template/scheduler.js": { "lines": 31, "tokens": 306, "sources": 1, "clones": 1, "duplicatedLines": 31, "duplicatedTokens": 306, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/template/resErrorProcess.js": { "lines": 16, "tokens": 133, "sources": 1, "clones": 1, "duplicatedLines": 16, "duplicatedTokens": 133, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/template/resDataAdaptor.js": { "lines": 7, "tokens": 107, "sources": 1, "clones": 1, "duplicatedLines": 7, "duplicatedTokens": 107, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/template/request.js": { "lines": 217, "tokens": 1763, "sources": 1, "clones": 3, "duplicatedLines": 217, "duplicatedTokens": 1754, "percentage": 100, "percentageTokens": 99.49, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/template/preventRepeatReq.js": { "lines": 63, "tokens": 546, "sources": 1, "clones": 1, "duplicatedLines": 63, "duplicatedTokens": 546, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/template/paramsProcess.js": { "lines": 10, "tokens": 97, "sources": 1, "clones": 1, "duplicatedLines": 10, "duplicatedTokens": 97, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/template/helpers.js": { "lines": 85, "tokens": 594, "sources": 1, "clones": 1, "duplicatedLines": 85, "duplicatedTokens": 594, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/template/genRequestKey.js": { "lines": 23, "tokens": 162, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/template/cacheControl.js": { "lines": 208, "tokens": 1521, "sources": 1, "clones": 1, "duplicatedLines": 208, "duplicatedTokens": 1521, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/micro/index.js": { "lines": 177, "tokens": 1261, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/main/modifyRoutes.js": { "lines": 58, "tokens": 420, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/main/index.js": { "lines": 130, "tokens": 841, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-model/src/utils/index.js": { "lines": 224, "tokens": 2127, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-model/src/utils/getTmpFile.js": { "lines": 52, "tokens": 456, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-model/src/utils/getModels.js": { "lines": 15, "tokens": 127, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-locale/src/utils/index.js": { "lines": 32, "tokens": 278, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-locale/src/runtime/runtime.js": { "lines": 4, "tokens": 36, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-locale/src/runtime/langUConfigMap.js": { "lines": 313, "tokens": 1930, "sources": 1, "clones": 1, "duplicatedLines": 313, "duplicatedTokens": 1930, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/runtime/runtime.js": { "lines": 70, "tokens": 616, "sources": 1, "clones": 1, "duplicatedLines": 70, "duplicatedTokens": 616, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/node/helper.js": { "lines": 83, "tokens": 873, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-jest/helpers/transformers/javascript.js": { "lines": 9, "tokens": 83, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-access/src/runtime/runtime.js": { "lines": 38, "tokens": 366, "sources": 1, "clones": 1, "duplicatedLines": 38, "duplicatedTokens": 366, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-access/src/runtime/createDirective.js": { "lines": 45, "tokens": 429, "sources": 1, "clones": 1, "duplicatedLines": 45, "duplicatedTokens": 429, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-access/src/runtime/createComponent.js": { "lines": 6, "tokens": 82, "sources": 1, "clones": 1, "duplicatedLines": 6, "duplicatedTokens": 82, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/service/pluginAPI.js": { "lines": 159, "tokens": 1283, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/service/index.js": { "lines": 559, "tokens": 4131, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/service/getPaths.js": { "lines": 37, "tokens": 323, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/service/enums.js": { "lines": 31, "tokens": 188, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/service/babelRegister.js": { "lines": 42, "tokens": 268, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/logger/index.js": { "lines": 87, "tokens": 709, "sources": 1, "clones": 1, "duplicatedLines": 10, "duplicatedTokens": 96, "percentage": 11.49, "percentageTokens": 13.54, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/config/index.js": { "lines": 276, "tokens": 2274, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes/src/utils/getPkg.js": { "lines": 15, "tokens": 118, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes/src/utils/getCwd.js": { "lines": 12, "tokens": 114, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes/src/utils/fork.js": { "lines": 59, "tokens": 458, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/src/generator/App.js": { "lines": 23, "tokens": 154, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/qiankun.md": { "lines": 141, "tokens": 468, "sources": 1, "clones": 1, "duplicatedLines": 141, "duplicatedTokens": 468, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/model.md": { "lines": 7, "tokens": 42, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/locale.md": { "lines": 11, "tokens": 49, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/enums.md": { "lines": 48, "tokens": 229, "sources": 1, "clones": 1, "duplicatedLines": 48, "duplicatedTokens": 229, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/editor.md": { "lines": 13, "tokens": 50, "sources": 1, "clones": 1, "duplicatedLines": 13, "duplicatedTokens": 50, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/access.md": { "lines": 262, "tokens": 966, "sources": 1, "clones": 1, "duplicatedLines": 262, "duplicatedTokens": 966, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-utils/src/winPath.js": { "lines": 7, "tokens": 60, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-utils/src/resolvePkg.js": { "lines": 5, "tokens": 57, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-utils/src/parseRequireDeps.js": { "lines": 34, "tokens": 315, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-utils/src/mergeConfig.js": { "lines": 14, "tokens": 156, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-utils/src/index.js": { "lines": 54, "tokens": 333, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-utils/src/cleanRequireCache.js": { "lines": 20, "tokens": 194, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-utils/src/Generator.js": { "lines": 60, "tokens": 535, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/app.js": { "lines": 18, "tokens": 134, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/app.js": { "lines": 30, "tokens": 221, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-runtime/src/index.js": { "lines": 14, "tokens": 73, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/index.js": { "lines": 62, "tokens": 471, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-windicss/src/index.js": { "lines": 26, "tokens": 190, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-vuex/src/index.js": { "lines": 62, "tokens": 557, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-vuex/src/helper.js": { "lines": 159, "tokens": 1424, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-sass/src/index.js": { "lines": 35, "tokens": 265, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/src/index.js": { "lines": 68, "tokens": 531, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/index.js": { "lines": 19, "tokens": 136, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/src/constants.js": { "lines": 3, "tokens": 42, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-monaco-editor/src/index.js": { "lines": 99, "tokens": 701, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-model/src/index.js": { "lines": 85, "tokens": 662, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-locale/src/index.js": { "lines": 84, "tokens": 617, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/index.js": { "lines": 90, "tokens": 645, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-jest/src/jestArgs.js": { "lines": 614, "tokens": 3179, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-jest/src/index.js": { "lines": 96, "tokens": 892, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-jest/src/createDefaultConfig.js": { "lines": 53, "tokens": 337, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-icon/src/optimizeSvg.js": { "lines": 36, "tokens": 286, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-icon/src/index.js": { "lines": 67, "tokens": 608, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-enums/src/index.js": { "lines": 47, "tokens": 331, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-access/src/index.js": { "lines": 58, "tokens": 423, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/src/index.js": { "lines": 14, "tokens": 91, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes/src/serviceWithBuiltIn.js": { "lines": 19, "tokens": 165, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes/src/index.js": { "lines": 2, "tokens": 18, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes/src/forkedDev.js": { "lines": 49, "tokens": 403, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes/src/cli.js": { "lines": 63, "tokens": 520, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes/bin/fes.js": { "lines": 12, "tokens": 117, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/src/utils.js": { "lines": 12, "tokens": 120, "sources": 1, "clones": 1, "duplicatedLines": 10, "duplicatedTokens": 96, "percentage": 83.33, "percentageTokens": 80, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/src/index.js": { "lines": 97, "tokens": 936, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/src/cli.js": { "lines": 48, "tokens": 390, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/.fes.prod.js": { "lines": 4, "tokens": 22, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/.fes.js": { "lines": 36, "tokens": 208, "sources": 1, "clones": 1, "duplicatedLines": 24, "duplicatedTokens": 148, "percentage": 66.67, "percentageTokens": 71.15, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/mock.js": { "lines": 129, "tokens": 934, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/.fes.prod.js": { "lines": 2, "tokens": 13, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/.fes.local.js": { "lines": 4, "tokens": 15, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/.fes.js": { "lines": 90, "tokens": 548, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/.eslintrc.js": { "lines": 13, "tokens": 65, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-runtime/build.config.js": { "lines": 2, "tokens": 15, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-windicss/windi.config.js": { "lines": 7, "tokens": 45, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-vuex/build.config.js": { "lines": 2, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/build.config.js": { "lines": 2, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/build.config.js": { "lines": 2, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-monaco-editor/build.config.js": { "lines": 2, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-model/build.config.js": { "lines": 2, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-locale/build.config.js": { "lines": 2, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/build.config.js": { "lines": 2, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-icon/build.config.js": { "lines": 2, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-enums/build.config.js": { "lines": 2, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-access/build.config.js": { "lines": 2, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes/build.config.js": { "lines": 2, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/scripts/randomColor.js": { "lines": 33, "tokens": 223, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/scripts/compiler.js": { "lines": 44, "tokens": 303, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/scripts/build.js": { "lines": 174, "tokens": 1743, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/vetur.config.js": { "lines": 13, "tokens": 61, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/jest.config.js": { "lines": 6, "tokens": 29, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/build.config.js": { "lines": 24, "tokens": 104, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/.eslintrc.js": { "lines": 22, "tokens": 116, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "total": { "lines": 14261, "tokens": 106717, "sources": 270, "clones": 47, "duplicatedLines": 2739, "duplicatedTokens": 19085, "percentage": 19.21, "percentageTokens": 17.88, "newDuplicatedLines": 0, "newClones": 0 } }, "markup": { "sources": { "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/pc/src/pages/index.vue": { "lines": 42, "tokens": 241, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/pc/src/components/UserCenter.vue": { "lines": 20, "tokens": 106, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/pc/src/components/PageLoading.vue": { "lines": 26, "tokens": 126, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/src/pages/onepiece.vue": { "lines": 20, "tokens": 100, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/src/pages/index.vue": { "lines": 61, "tokens": 368, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/src/icons/smile.svg": { "lines": 3, "tokens": 37, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/src/icons/hello.svg": { "lines": 3, "tokens": 37, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/.fes/plugin-icon/Icon/Icon.vue": { "lines": 40, "tokens": 278, "sources": 1, "clones": 1, "duplicatedLines": 40, "duplicatedTokens": 278, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-locale/views/SelectLang.vue": { "lines": 73, "tokens": 446, "sources": 1, "clones": 1, "duplicatedLines": 73, "duplicatedTokens": 446, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/views/MultiTabProvider.vue": { "lines": 179, "tokens": 1090, "sources": 1, "clones": 2, "duplicatedLines": 92, "duplicatedTokens": 532, "percentage": 51.4, "percentageTokens": 48.81, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/views/MenuIcon.vue": { "lines": 60, "tokens": 347, "sources": 1, "clones": 1, "duplicatedLines": 60, "duplicatedTokens": 347, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/views/Menu.vue": { "lines": 105, "tokens": 667, "sources": 1, "clones": 1, "duplicatedLines": 105, "duplicatedTokens": 667, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/views/BaseLayout.vue": { "lines": 377, "tokens": 2314, "sources": 1, "clones": 3, "duplicatedLines": 437, "duplicatedTokens": 2606, "percentage": 115.92, "percentageTokens": 112.62, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/views/404.vue": { "lines": 34, "tokens": 202, "sources": 1, "clones": 2, "duplicatedLines": 67, "duplicatedTokens": 380, "percentage": 197.06, "percentageTokens": 188.12, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-layout/views/403.vue": { "lines": 34, "tokens": 202, "sources": 1, "clones": 2, "duplicatedLines": 67, "duplicatedTokens": 380, "percentage": 197.06, "percentageTokens": 188.12, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/src/plugins/commands/webpackConfig/index-default.html": { "lines": 11, "tokens": 100, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/pages/b/index.vue": { "lines": 7, "tokens": 32, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/pages/a/b.vue": { "lines": 7, "tokens": 32, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/.fes/plugin-monaco-editor/editor.vue": { "lines": 303, "tokens": 1662, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-locale/src/runtime/views/SelectLang.vue": { "lines": 73, "tokens": 446, "sources": 1, "clones": 1, "duplicatedLines": 73, "duplicatedTokens": 446, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/runtime/views/MultiTabProvider.vue": { "lines": 189, "tokens": 1145, "sources": 1, "clones": 2, "duplicatedLines": 92, "duplicatedTokens": 532, "percentage": 48.68, "percentageTokens": 46.46, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/runtime/views/MenuIcon.vue": { "lines": 60, "tokens": 347, "sources": 1, "clones": 1, "duplicatedLines": 60, "duplicatedTokens": 347, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/runtime/views/Menu.vue": { "lines": 105, "tokens": 667, "sources": 1, "clones": 1, "duplicatedLines": 105, "duplicatedTokens": 667, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/runtime/views/BaseLayout.vue": { "lines": 377, "tokens": 2314, "sources": 1, "clones": 1, "duplicatedLines": 377, "duplicatedTokens": 2314, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/runtime/views/404.vue": { "lines": 34, "tokens": 202, "sources": 1, "clones": 1, "duplicatedLines": 34, "duplicatedTokens": 202, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/src/runtime/views/403.vue": { "lines": 34, "tokens": 202, "sources": 1, "clones": 1, "duplicatedLines": 34, "duplicatedTokens": 202, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-icon/src/runtime/Icon/Icon.vue": { "lines": 40, "tokens": 278, "sources": 1, "clones": 1, "duplicatedLines": 40, "duplicatedTokens": 278, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/pages/onepiece.vue": { "lines": 22, "tokens": 120, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/pages/index.vue": { "lines": 155, "tokens": 923, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/icons/smile.svg": { "lines": 3, "tokens": 37, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/icons/hello.svg": { "lines": 3, "tokens": 37, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/src/components/helloWorld.vue": { "lines": 13, "tokens": 75, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/pages/test.vue": { "lines": 15, "tokens": 65, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/pages/store.vue": { "lines": 49, "tokens": 353, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/pages/onepiece.vue": { "lines": 20, "tokens": 100, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/pages/index.vue": { "lines": 142, "tokens": 928, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/pages/editor.vue": { "lines": 40, "tokens": 198, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/components/UserCenter.vue": { "lines": 14, "tokens": 72, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/src/components/PageLoading.vue": { "lines": 30, "tokens": 142, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "total": { "lines": 2823, "tokens": 17038, "sources": 39, "clones": 11, "duplicatedLines": 878, "duplicatedTokens": 5312, "percentage": 31.1, "percentageTokens": 31.18, "newDuplicatedLines": 0, "newClones": 0 } }, "json": { "sources": { "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/pc/tsconfig.json": { "lines": 36, "tokens": 233, "sources": 1, "clones": 3, "duplicatedLines": 108, "duplicatedTokens": 699, "percentage": 300, "percentageTokens": 300, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/pc/package.json": { "lines": 58, "tokens": 315, "sources": 1, "clones": 2, "duplicatedLines": 58, "duplicatedTokens": 276, "percentage": 100, "percentageTokens": 87.62, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/tsconfig.json": { "lines": 36, "tokens": 233, "sources": 1, "clones": 1, "duplicatedLines": 36, "duplicatedTokens": 233, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/templates/app/h5/package.json": { "lines": 53, "tokens": 280, "sources": 1, "clones": 2, "duplicatedLines": 60, "duplicatedTokens": 285, "percentage": 113.21, "percentageTokens": 101.79, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-utils/package.json": { "lines": 44, "tokens": 266, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/tsconfig.json": { "lines": 36, "tokens": 233, "sources": 1, "clones": 1, "duplicatedLines": 36, "duplicatedTokens": 233, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template-h5/package.json": { "lines": 53, "tokens": 280, "sources": 1, "clones": 1, "duplicatedLines": 37, "duplicatedTokens": 180, "percentage": 69.81, "percentageTokens": 64.29, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/tsconfig.json": { "lines": 36, "tokens": 233, "sources": 1, "clones": 1, "duplicatedLines": 36, "duplicatedTokens": 233, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/package.json": { "lines": 66, "tokens": 371, "sources": 1, "clones": 1, "duplicatedLines": 35, "duplicatedTokens": 171, "percentage": 53.03, "percentageTokens": 46.09, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-runtime/package.json": { "lines": 34, "tokens": 188, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/package.json": { "lines": 76, "tokens": 485, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-windicss/package.json": { "lines": 35, "tokens": 190, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-vuex/package.json": { "lines": 36, "tokens": 200, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-sass/package.json": { "lines": 35, "tokens": 193, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/package.json": { "lines": 37, "tokens": 207, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-qiankun/package.json": { "lines": 43, "tokens": 244, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-monaco-editor/package.json": { "lines": 36, "tokens": 206, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-model/package.json": { "lines": 35, "tokens": 193, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-locale/package.json": { "lines": 38, "tokens": 214, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/package.json": { "lines": 37, "tokens": 207, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-jest/package.json": { "lines": 43, "tokens": 245, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-icon/package.json": { "lines": 34, "tokens": 186, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-enums/package.json": { "lines": 32, "tokens": 177, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-access/package.json": { "lines": 36, "tokens": 200, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-compiler/package.json": { "lines": 36, "tokens": 210, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes/package.json": { "lines": 50, "tokens": 275, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/create-fes-app/package.json": { "lines": 38, "tokens": 213, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/tsconfig.json": { "lines": 3, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/tsconfig.base.json": { "lines": 18, "tokens": 120, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/package.json": { "lines": 119, "tokens": 686, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/lerna.json": { "lines": 35, "tokens": 189, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "total": { "lines": 1304, "tokens": 7489, "sources": 31, "clones": 6, "duplicatedLines": 203, "duplicatedTokens": 1155, "percentage": 15.57, "percentageTokens": 15.42, "newDuplicatedLines": 0, "newClones": 0 } }, "markdown": { "sources": { "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/windicss.md": { "lines": 22, "tokens": 54, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/vuex.md": { "lines": 189, "tokens": 632, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/sass.md": { "lines": 21, "tokens": 74, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/request.md": { "lines": 210, "tokens": 585, "sources": 1, "clones": 1, "duplicatedLines": 209, "duplicatedTokens": 584, "percentage": 99.52, "percentageTokens": 99.83, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/qiankun.md": { "lines": 268, "tokens": 794, "sources": 1, "clones": 1, "duplicatedLines": 268, "duplicatedTokens": 794, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/model.md": { "lines": 62, "tokens": 263, "sources": 1, "clones": 1, "duplicatedLines": 62, "duplicatedTokens": 263, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/locale.md": { "lines": 198, "tokens": 811, "sources": 1, "clones": 2, "duplicatedLines": 197, "duplicatedTokens": 809, "percentage": 99.49, "percentageTokens": 99.75, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/layout.md": { "lines": 275, "tokens": 1069, "sources": 1, "clones": 2, "duplicatedLines": 307, "duplicatedTokens": 1186, "percentage": 111.64, "percentageTokens": 110.94, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/jest.md": { "lines": 352, "tokens": 2531, "sources": 1, "clones": 1, "duplicatedLines": 352, "duplicatedTokens": 2531, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/icon.md": { "lines": 27, "tokens": 140, "sources": 1, "clones": 1, "duplicatedLines": 27, "duplicatedTokens": 140, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/enums.md": { "lines": 223, "tokens": 711, "sources": 1, "clones": 1, "duplicatedLines": 223, "duplicatedTokens": 711, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/editor.md": { "lines": 115, "tokens": 574, "sources": 1, "clones": 1, "duplicatedLines": 115, "duplicatedTokens": 574, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/access.md": { "lines": 275, "tokens": 1042, "sources": 1, "clones": 2, "duplicatedLines": 307, "duplicatedTokens": 1159, "percentage": 111.64, "percentageTokens": 111.23, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/dev/api.md": { "lines": 487, "tokens": 1269, "sources": 1, "clones": 1, "duplicatedLines": 487, "duplicatedTokens": 1269, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/dev/README.md": { "lines": 39, "tokens": 209, "sources": 1, "clones": 1, "duplicatedLines": 39, "duplicatedTokens": 209, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/plugin/README.md": { "lines": 8, "tokens": 47, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/config/README.md": { "lines": 361, "tokens": 1001, "sources": 1, "clones": 1, "duplicatedLines": 361, "duplicatedTokens": 1001, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/cli/README.md": { "lines": 173, "tokens": 720, "sources": 1, "clones": 2, "duplicatedLines": 207, "duplicatedTokens": 820, "percentage": 119.65, "percentageTokens": 113.89, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/api/README.md": { "lines": 189, "tokens": 731, "sources": 1, "clones": 1, "duplicatedLines": 189, "duplicatedTokens": 731, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/windicss.md": { "lines": 22, "tokens": 50, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/vuex.md": { "lines": 59, "tokens": 175, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/sass.md": { "lines": 21, "tokens": 74, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/request.md": { "lines": 209, "tokens": 584, "sources": 1, "clones": 1, "duplicatedLines": 209, "duplicatedTokens": 584, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/qiankun.md": { "lines": 268, "tokens": 794, "sources": 1, "clones": 1, "duplicatedLines": 268, "duplicatedTokens": 794, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/model.md": { "lines": 62, "tokens": 263, "sources": 1, "clones": 1, "duplicatedLines": 62, "duplicatedTokens": 263, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/locale.md": { "lines": 198, "tokens": 811, "sources": 1, "clones": 2, "duplicatedLines": 197, "duplicatedTokens": 809, "percentage": 99.49, "percentageTokens": 99.75, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/layout.md": { "lines": 275, "tokens": 1069, "sources": 1, "clones": 1, "duplicatedLines": 275, "duplicatedTokens": 1069, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/jest.md": { "lines": 352, "tokens": 2531, "sources": 1, "clones": 1, "duplicatedLines": 352, "duplicatedTokens": 2531, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/icon.md": { "lines": 27, "tokens": 140, "sources": 1, "clones": 1, "duplicatedLines": 27, "duplicatedTokens": 140, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/enums.md": { "lines": 223, "tokens": 711, "sources": 1, "clones": 1, "duplicatedLines": 223, "duplicatedTokens": 711, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/editor.md": { "lines": 115, "tokens": 574, "sources": 1, "clones": 1, "duplicatedLines": 115, "duplicatedTokens": 574, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/access.md": { "lines": 275, "tokens": 1042, "sources": 1, "clones": 1, "duplicatedLines": 275, "duplicatedTokens": 1042, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/dev/api.md": { "lines": 487, "tokens": 1269, "sources": 1, "clones": 1, "duplicatedLines": 487, "duplicatedTokens": 1269, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/dev/README.md": { "lines": 39, "tokens": 209, "sources": 1, "clones": 1, "duplicatedLines": 39, "duplicatedTokens": 209, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/reference/cli.md": { "lines": 78, "tokens": 589, "sources": 1, "clones": 1, "duplicatedLines": 78, "duplicatedTokens": 589, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/template.md": { "lines": 80, "tokens": 329, "sources": 1, "clones": 1, "duplicatedLines": 80, "duplicatedTokens": 329, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/runtime-config.md": { "lines": 146, "tokens": 427, "sources": 1, "clones": 1, "duplicatedLines": 146, "duplicatedTokens": 427, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/route.md": { "lines": 258, "tokens": 789, "sources": 1, "clones": 1, "duplicatedLines": 258, "duplicatedTokens": 789, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/plugin.md": { "lines": 67, "tokens": 266, "sources": 1, "clones": 1, "duplicatedLines": 67, "duplicatedTokens": 266, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/mock.md": { "lines": 180, "tokens": 404, "sources": 1, "clones": 1, "duplicatedLines": 180, "duplicatedTokens": 404, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/getting-started.md": { "lines": 191, "tokens": 739, "sources": 1, "clones": 1, "duplicatedLines": 191, "duplicatedTokens": 739, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/env.md": { "lines": 119, "tokens": 393, "sources": 1, "clones": 1, "duplicatedLines": 119, "duplicatedTokens": 393, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/directory-structure.md": { "lines": 67, "tokens": 211, "sources": 1, "clones": 1, "duplicatedLines": 67, "duplicatedTokens": 211, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/css.md": { "lines": 38, "tokens": 140, "sources": 1, "clones": 1, "duplicatedLines": 38, "duplicatedTokens": 140, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/contributing.md": { "lines": 65, "tokens": 259, "sources": 1, "clones": 1, "duplicatedLines": 65, "duplicatedTokens": 259, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/config.md": { "lines": 90, "tokens": 279, "sources": 1, "clones": 1, "duplicatedLines": 90, "duplicatedTokens": 279, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/README.md": { "lines": 68, "tokens": 324, "sources": 1, "clones": 1, "duplicatedLines": 68, "duplicatedTokens": 324, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/README.md": { "lines": 8, "tokens": 47, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/config/README.md": { "lines": 361, "tokens": 1001, "sources": 1, "clones": 1, "duplicatedLines": 361, "duplicatedTokens": 1001, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/cli/README.md": { "lines": 173, "tokens": 720, "sources": 1, "clones": 1, "duplicatedLines": 173, "duplicatedTokens": 720, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/api/README.md": { "lines": 189, "tokens": 731, "sources": 1, "clones": 1, "duplicatedLines": 189, "duplicatedTokens": 731, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-template/README.md": { "lines": 9, "tokens": 24, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-preset-built-in/README.md": { "lines": 6, "tokens": 21, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-request/README.md": { "lines": 9, "tokens": 49, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-locale/README.md": { "lines": 5, "tokens": 16, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes-plugin-layout/README.md": { "lines": 14, "tokens": 52, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/README.md": { "lines": 64, "tokens": 269, "sources": 1, "clones": 2, "duplicatedLines": 98, "duplicatedTokens": 369, "percentage": 153.13, "percentageTokens": 137.17, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/cli.md": { "lines": 78, "tokens": 589, "sources": 1, "clones": 1, "duplicatedLines": 78, "duplicatedTokens": 589, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/template.md": { "lines": 80, "tokens": 329, "sources": 1, "clones": 1, "duplicatedLines": 80, "duplicatedTokens": 329, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/runtime-config.md": { "lines": 146, "tokens": 427, "sources": 1, "clones": 1, "duplicatedLines": 146, "duplicatedTokens": 427, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/route.md": { "lines": 258, "tokens": 789, "sources": 1, "clones": 1, "duplicatedLines": 258, "duplicatedTokens": 789, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/plugin.md": { "lines": 67, "tokens": 266, "sources": 1, "clones": 1, "duplicatedLines": 67, "duplicatedTokens": 266, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/mock.md": { "lines": 180, "tokens": 404, "sources": 1, "clones": 1, "duplicatedLines": 180, "duplicatedTokens": 404, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/getting-started.md": { "lines": 191, "tokens": 739, "sources": 1, "clones": 1, "duplicatedLines": 191, "duplicatedTokens": 739, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/env.md": { "lines": 119, "tokens": 393, "sources": 1, "clones": 1, "duplicatedLines": 119, "duplicatedTokens": 393, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/directory-structure.md": { "lines": 67, "tokens": 211, "sources": 1, "clones": 1, "duplicatedLines": 67, "duplicatedTokens": 211, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/css.md": { "lines": 38, "tokens": 140, "sources": 1, "clones": 1, "duplicatedLines": 38, "duplicatedTokens": 140, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/contributing.md": { "lines": 65, "tokens": 259, "sources": 1, "clones": 1, "duplicatedLines": 65, "duplicatedTokens": 259, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/config.md": { "lines": 90, "tokens": 279, "sources": 1, "clones": 1, "duplicatedLines": 90, "duplicatedTokens": 279, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/README.md": { "lines": 68, "tokens": 324, "sources": 1, "clones": 1, "duplicatedLines": 68, "duplicatedTokens": 324, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/scripts/docs.md": { "lines": 21, "tokens": 96, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/README.md": { "lines": 64, "tokens": 269, "sources": 1, "clones": 1, "duplicatedLines": 64, "duplicatedTokens": 269, "percentage": 100, "percentageTokens": 100, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/README.md": { "lines": 119, "tokens": 588, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/README.en-US.md": { "lines": 120, "tokens": 1688, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/CHANGELOG.md": { "lines": 78, "tokens": 329, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "total": { "lines": 10260, "tokens": 39751, "sources": 75, "clones": 32, "duplicatedLines": 4829, "duplicatedTokens": 18082, "percentage": 47.07, "percentageTokens": 45.49, "newDuplicatedLines": 0, "newClones": 0 } }, "css": { "sources": { "/Users/qlin/code/fes.js/docs/zh/reference/plugin/plugins/sass.md": { "lines": 1, "tokens": 0, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/reference/plugin/plugins/sass.md": { "lines": 1, "tokens": 0, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/zh/guide/css.md": { "lines": 4, "tokens": 11, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/guide/css.md": { "lines": 4, "tokens": 11, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "total": { "lines": 10, "tokens": 22, "sources": 4, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "tsx": { "sources": { "/Users/qlin/code/fes.js/packages/fes-template-h5/src/components/helloTSX.tsx": { "lines": 8, "tokens": 49, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "total": { "lines": 8, "tokens": 49, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "typescript": { "sources": { "/Users/qlin/code/fes.js/packages/fes-template-h5/src/components/helloTS.ts": { "lines": 6, "tokens": 45, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/.vuepress/configs/sidebar/zh.ts": { "lines": 80, "tokens": 358, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/.vuepress/configs/sidebar/en.ts": { "lines": 80, "tokens": 358, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/.vuepress/configs/navbar/zh.ts": { "lines": 37, "tokens": 200, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/.vuepress/configs/navbar/en.ts": { "lines": 37, "tokens": 200, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/packages/fes/types.d.ts": { "lines": 2, "tokens": 18, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 }, "/Users/qlin/code/fes.js/docs/.vuepress/config.ts": { "lines": 126, "tokens": 602, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "total": { "lines": 368, "tokens": 1781, "sources": 7, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "scss": { "sources": { "/Users/qlin/code/fes.js/packages/fes-template/src/global.scss": { "lines": 4, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "total": { "lines": 4, "tokens": 17, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "bash": { "sources": { "/Users/qlin/code/fes.js/deploy.sh": { "lines": 18, "tokens": 60, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } }, "total": { "lines": 18, "tokens": 60, "sources": 1, "clones": 0, "duplicatedLines": 0, "duplicatedTokens": 0, "percentage": 0, "percentageTokens": 0, "newDuplicatedLines": 0, "newClones": 0 } } }, "total": { "lines": 31351, "tokens": 188794, "sources": 467, "clones": 100, "duplicatedLines": 9055, "duplicatedTokens": 45631, "percentage": 28.88, "percentageTokens": 24.17, "newDuplicatedLines": 0, "newClones": 0 } }, "duplicates": [ { "format": "markup", "lines": 31, "fragment": ".layout-header {\n padding-left: 24px;\n color: hsla(0,0%,100%,.65);\n background: #001529;\n .layout-menu {\n line-height: 48px;\n }\n .layout-logo {\n display: flex;\n justify-content: flex-start;\n align-items: center;\n min-width: 165px;\n height: 100%;\n overflow: hidden;\n transition: all .3s;\n .logo-img {\n height: 32px;\n width: auto;\n }\n .logo-name {\n overflow: hidden;\n margin: 0 0 0 12px;\n color: #fff;\n font-weight: 600;\n font-size: 18px;\n line-height: 32px;\n }\n }\n }\n }\n .layout-sider-fixed-stuff", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-layout/views/BaseLayout.vue", "start": 268, "end": 298, "startLoc": { "line": 268, "column": 9, "position": 1782 }, "endLoc": { "line": 298, "column": 26, "position": 1928 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/views/BaseLayout.vue", "start": 233, "end": 263, "startLoc": { "line": 233, "column": 9, "position": 1601 }, "endLoc": { "line": 263, "column": 31, "position": 1747 } } }, { "format": "markup", "lines": 34, "fragment": "\">\n \n 上一页\n \n \n\n\n{\n \"layout\": false\n}\n\n", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-layout/views/403.vue", "start": 2, "end": 35, "startLoc": { "line": 2, "column": 16, "position": 24 }, "endLoc": { "line": 35, "column": 2, "position": 202 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/views/404.vue", "start": 2, "end": 35, "startLoc": { "line": 2, "column": 15, "position": 24 }, "endLoc": { "line": 35, "column": 2, "position": 202 } } }, { "format": "javascript", "lines": 19, "fragment": "}\n];\n return routes;\n}\n\nconst ROUTER_BASE = '';\nlet router = null;\nlet history = null;\nexport const createRouter = (routes) => {\n if (router) {\n return router;\n }\n const createHistory = plugin.applyPlugins({\n key: 'modifyCreateHistroy',\n type: ApplyPluginsType.modify,\n args: {\n base: ROUTER_BASE\n },\n initialValue: createWebHistory", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/core/routes/routes.js", "start": 75, "end": 93, "startLoc": { "line": 75, "column": 3, "position": 515 }, "endLoc": { "line": 93, "column": 17, "position": 639 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/core/routes/routes.js", "start": 26, "end": 44, "startLoc": { "line": 26, "column": 3, "position": 184 }, "endLoc": { "line": 44, "column": 21, "position": 308 } } }, { "format": "javascript", "lines": 41, "fragment": ",\n });\n history = createHistory(ROUTER_BASE);\n // 修改routes\n plugin.applyPlugins({\n key: 'patchRoutes',\n type: ApplyPluginsType.event,\n args: { routes },\n });\n router = createVueRouter({\n history,\n routes\n });\n\n plugin.applyPlugins({\n key: 'onRouterCreated',\n type: ApplyPluginsType.event,\n args: { router },\n });\n\n return router;\n};\n\nexport const getRouter = ()=>{\n if(!router){\n console.warn(`[preset-build-in] router is null`)\n }\n return router;\n}\n\nexport const getHistory = ()=>{\n if(!history){\n console.warn(`[preset-build-in] history is null`)\n }\n return history;\n}\n\nexport const destroyRouter = ()=>{\n router = null;\n history = null;\n}", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/core/routes/routes.js", "start": 93, "end": 133, "startLoc": { "line": 93, "column": 17, "position": 640 }, "endLoc": { "line": 133, "column": 2, "position": 883 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/core/routes/routes.js", "start": 44, "end": 84, "startLoc": { "line": 44, "column": 21, "position": 309 }, "endLoc": { "line": 84, "column": 2, "position": 552 } } }, { "format": "less", "lines": 173, "fragment": "@import \"../theme\";\n\n.scale-hairline-common(@color, @top, @right, @bottom, @left) {\n content: '';\n position: absolute;\n background-color: @color;\n display: block;\n z-index: 1;\n top: @top;\n right: @right;\n bottom: @bottom;\n left: @left;\n}\n\n.hairline(@direction, @color: @border-color-base) when (@direction ='top') {\n border-top: 1PX solid @color;\n\n html:not([data-scale]) & {\n @media (min-resolution: 2dppx) {\n border-top: none;\n position: relative;\n\n &::before {\n .scale-hairline-common(@color, 0, auto, auto, 0);\n width: 100%;\n height: 1PX;\n transform-origin: 50% 50%;\n transform: scaleY(0.5);\n\n @media (min-resolution: 3dppx) {\n transform: scaleY(0.33);\n }\n }\n }\n }\n}\n\n.hairline(@direction, @color: @border-color-base) when (@direction ='right') {\n border-right: 1PX solid @color;\n\n html:not([data-scale]) & {\n @media (min-resolution: 2dppx) {\n border-right: none;\n position: relative;\n\n &::after {\n .scale-hairline-common(@color, 0, 0, auto, auto);\n width: 1PX;\n height: 100%;\n background: @color;\n transform-origin: 100% 50%;\n transform: scaleX(0.5);\n\n @media (min-resolution: 3dppx) {\n transform: scaleX(0.33);\n }\n }\n }\n }\n}\n\n.hairline(@direction, @color: @border-color-base) when (@direction ='bottom') {\n border-bottom: 1PX solid @color;\n\n html:not([data-scale]) & {\n @media (min-resolution: 2dppx) {\n border-bottom: none;\n position: relative;\n\n &::after {\n .scale-hairline-common(@color, auto, auto, 0, 0);\n width: 100%;\n height: 1PX;\n transform-origin: 50% 100%;\n transform: scaleY(0.5);\n\n @media (min-resolution: 3dppx) {\n transform: scaleY(0.33);\n }\n }\n }\n }\n}\n\n.hairline(@direction, @color: @border-color-base) when (@direction ='left') {\n border-left: 1PX solid @color;\n\n html:not([data-scale]) & {\n @media (min-resolution: 2dppx) {\n border-left: none;\n position: relative;\n\n &::before {\n .scale-hairline-common(@color, 0, auto, auto, 0);\n width: 1PX;\n height: 100%;\n transform-origin: 100% 50%;\n transform: scaleX(0.5);\n\n @media (min-resolution: 3dppx) {\n transform: scaleX(0.33);\n }\n }\n }\n }\n}\n\n.hairline(@direction, @color: @border-color-base, @radius: 0) when (@direction ='all') {\n border: 1PX solid @color;\n border-radius: @radius;\n\n html:not([data-scale]) & {\n @media (min-resolution: 2dppx) {\n position: relative;\n border: none;\n\n &::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n width: 200%;\n height: 200%;\n border: 1PX solid @color;\n border-radius: @radius * 2;\n transform-origin: 0 0;\n transform: scale(0.5);\n box-sizing: border-box;\n pointer-events: none;\n }\n }\n }\n}\n\n.hairline-remove(@position) when (@position ='left') {\n border-left: 0;\n\n &:before {\n display: none !important;\n }\n}\n\n.hairline-remove(@position) when (@position ='right') {\n border-right: 0;\n\n &:after {\n display: none !important;\n }\n}\n\n.hairline-remove(@position) when (@position ='top') {\n border-top: 0;\n\n &:before {\n display: none !important;\n }\n}\n\n.hairline-remove(@position) when (@position ='bottom') {\n border-bottom: 0;\n\n &:after {\n display: none !important;\n }\n}\n\n.hairline-remove(@position) when (@position ='all') {\n border: 0;\n\n &:before {\n display: none !important;\n }\n}", "tokens": 0, "firstFile": { "name": "packages/fes-template-h5/src/styles/mixins/hairline.less", "start": 1, "end": 173, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 173, "column": 2, "position": 1037 } }, "secondFile": { "name": "packages/create-fes-app/templates/app/h5/src/styles/mixins/hairline.less", "start": 1, "end": 173, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 173, "column": 2, "position": 1037 } } }, { "format": "javascript", "lines": 15, "fragment": "const throttleMap = new Map();\n\nexport default async (ctx, next) => {\n if (ctx.config.throttle) {\n if (throttleMap.get(ctx.key) >= Date.now()) {\n ctx.error = {\n type: 'FREQUENTLY',\n msg: '请求过于频繁'\n };\n return;\n }\n }\n await next();\n throttleMap.set(ctx.key, Date.now() + ctx.config.throttle);\n};", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/throttle.js", "start": 2, "end": 16, "startLoc": { "line": 2, "column": 1, "position": 1 }, "endLoc": { "line": 16, "column": 2, "position": 140 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/throttle.js", "start": 2, "end": 16, "startLoc": { "line": 2, "column": 1, "position": 1 }, "endLoc": { "line": 16, "column": 2, "position": 140 } } }, { "format": "javascript", "lines": 11, "fragment": "import { isObject } from './helpers';\n\n// FEATURE: 后续支持 a.b.c\nexport default async (ctx, next) => {\n const dataField = ctx.config.dataField ?? ctx.dataField;\n if (!ctx.error && ctx.response && isObject(ctx.response.data) && dataField) {\n ctx.response._rawData = ctx.response.data;\n ctx.response.data = ctx.response.data[dataField];\n }\n await next();\n};", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/setDataField.js", "start": 1, "end": 11, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 11, "column": 2, "position": 134 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/setDataField.js", "start": 1, "end": 11, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 11, "column": 2, "position": 134 } } }, { "format": "javascript", "lines": 32, "fragment": "class Scheduler {\n constructor() {\n this.middlewares = [];\n }\n\n use(fn) {\n if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');\n this.middlewares.push(fn);\n return this;\n }\n\n compose() {\n return (context, next) => {\n let index = -1;\n const dispatch = (i) => {\n if (i <= index) return Promise.reject(new Error('next() called multiple times'));\n index = i;\n let fn = this.middlewares[i];\n if (index === this.middlewares.length) fn = next;\n if (!fn) return Promise.resolve();\n try {\n return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));\n } catch (e) {\n return Promise.reject(e);\n }\n };\n return dispatch(0);\n };\n }\n}\n\nexport default new Scheduler();", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/scheduler.js", "start": 2, "end": 33, "startLoc": { "line": 2, "column": 1, "position": 1 }, "endLoc": { "line": 33, "column": 2, "position": 307 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/scheduler.js", "start": 2, "end": 33, "startLoc": { "line": 2, "column": 1, "position": 1 }, "endLoc": { "line": 33, "column": 2, "position": 307 } } }, { "format": "javascript", "lines": 17, "fragment": "import { isObject } from './helpers';\n\n// 错误处理等副作用网上提\nexport default async (ctx, next) => {\n const {\n response,\n config\n } = ctx;\n if (!config.closeResDataCheck && response && isObject(response.data)) {\n const code = response.data.code;\n if (code !== '0') {\n ctx.error = response; // code 不为零进入 reject\n }\n }\n\n await next();\n};", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/resErrorProcess.js", "start": 1, "end": 17, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 17, "column": 2, "position": 133 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/resErrorProcess.js", "start": 1, "end": 17, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 17, "column": 2, "position": 133 } } }, { "format": "javascript", "lines": 8, "fragment": "import { isFunction, isObject, isString } from './helpers';\n\nexport default async ({ response, responseDataAdaptor }, next) => {\n if (isFunction(responseDataAdaptor) && response && (isObject(response.data) || isString(response.data))) {\n response.data = responseDataAdaptor(response.data);\n }\n await next();\n};", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/resDataAdaptor.js", "start": 1, "end": 8, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 8, "column": 2, "position": 107 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/resDataAdaptor.js", "start": 1, "end": 8, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 8, "column": 2, "position": 107 } } }, { "format": "javascript", "lines": 32, "fragment": "(fn)) {\n instance.interceptors[type].use(fn);\n }\n });\n}\n\nfunction addRequestInterceptors(instance, interceptors) {\n addInterceptors(instance, interceptors, 'request');\n}\n\nfunction addResponseInterceptors(instance, interceptors) {\n addInterceptors(instance, interceptors, 'response');\n}\n\nasync function axiosMiddleware(context, next) {\n try {\n context.response = await context.instance.request(context.config);\n } catch (error) {\n context.error = error;\n }\n\n await next();\n}\n\nfunction getRequestInstance() {\n const {\n responseDataAdaptor,\n requestInterceptors = [],\n responseInterceptors = [],\n errorHandler,\n ...otherConfigs\n } = _fes", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/request.js", "start": 40, "end": 71, "startLoc": { "line": 40, "column": 2, "position": 356 }, "endLoc": { "line": 71, "column": 5, "position": 568 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/request.js", "start": 23, "end": 53, "startLoc": { "line": 23, "column": 11, "position": 209 }, "endLoc": { "line": 53, "column": 7, "position": 420 } } }, { "format": "javascript", "lines": 13, "fragment": ".compose()\n };\n} // DEPRECATED 废弃,使用 axios baseURL\n\n\nfunction handleApiPathBase(url, options = {}) {\n if (url.startsWith('http')) return url;\n\n if (options.base) {\n return `${options.base}${url}`;\n }\n\n return `", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/request.js", "start": 98, "end": 110, "startLoc": { "line": 98, "column": 8, "position": 798 }, "endLoc": { "line": 110, "column": 2, "position": 881 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/request.js", "start": 88, "end": 99, "startLoc": { "line": 88, "column": 10, "position": 641 }, "endLoc": { "line": 99, "column": 10, "position": 722 } } }, { "format": "javascript", "lines": 65, "fragment": "(options.method)) {\n options.data = data;\n } else {\n options.params = data;\n }\n\n return options;\n}\n\nlet currentRequestInstance = null;\n\nfunction createContext(userConfig) {\n return { ...currentRequestInstance.context,\n config: { ...currentRequestInstance.context.defaultConfig,\n ...userConfig\n }\n };\n}\n\nfunction getResponseCode(response) {\n if (response) {\n if (response._rawData) return response._rawData.code;\n if (response.data) return response.data.code;\n }\n\n return null;\n}\n\nfunction skipErrorHandlerToObj(skipErrorHandler = []) {\n if (!Array.isArray(skipErrorHandler)) {\n skipErrorHandler = [skipErrorHandler];\n }\n\n return skipErrorHandler.reduce((acc, cur) => {\n acc[cur] = true;\n return acc;\n }, {});\n}\n\nfunction handleRequestError({\n errorHandler = {},\n error,\n response,\n config\n}) {\n // 跳过所有错误类型处理\n if (config.skipErrorHandler === true) return;\n const skipObj = skipErrorHandlerToObj(config.skipErrorHandler);\n const resCode = getResponseCode(response);\n let errorKey = 'default';\n\n if (resCode && errorHandler[resCode]) {\n errorKey = resCode;\n } else if (error.type && errorHandler[error.type]) {\n errorKey = error.type;\n } else if (error.response && errorHandler[error.response.status]) {\n errorKey = error.response.status;\n }\n\n if (!skipObj[errorKey] && errorHandler[errorKey]) {\n return errorHandler[errorKey](error);\n }\n}\n\nconst", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/request.js", "start": 117, "end": 181, "startLoc": { "line": 117, "column": 2, "position": 962 }, "endLoc": { "line": 181, "column": 6, "position": 1453 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/request.js", "start": 105, "end": 171, "startLoc": { "line": 105, "column": 24, "position": 795 }, "endLoc": { "line": 171, "column": 7, "position": 1288 } } }, { "format": "javascript", "lines": 24, "fragment": "const request = (url, data, options = {}) => {\n if (typeof options === 'string') {\n options = {\n method: options\n };\n }\n\n if (!currentRequestInstance) {\n currentRequestInstance = getRequestInstance();\n }\n\n const userConfig = userConfigHandler(url, data, options);\n const context = createContext(userConfig);\n return currentRequestInstance.request(context).then(async () => {\n if (!context.error) {\n return context.config.useResonse ? context.response : context.response.data;\n }\n\n await handleRequestError(context);\n return Promise.reject(context.error);\n });\n};\n\nexports", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/request.js", "start": 181, "end": 204, "startLoc": { "line": 181, "column": 1, "position": 1453 }, "endLoc": { "line": 204, "column": 8, "position": 1662 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/request.js", "start": 171, "end": 192, "startLoc": { "line": 171, "column": 2, "position": 1290 }, "endLoc": { "line": 192, "column": 9, "position": 1497 } } }, { "format": "javascript", "lines": 64, "fragment": "const requestMap = new Map();\n\nconst mergeRequestMap = new Map();\nconst requestQueue = new Map();\n\nfunction handleCachingStart(ctx) {\n const isRequesting = mergeRequestMap.get(ctx.key);\n if (isRequesting) {\n return new Promise((resolve) => {\n const queue = requestQueue.get(ctx.key) || [];\n requestQueue.set(ctx.key, queue.concat(resolve));\n });\n }\n mergeRequestMap.set(ctx.key, true);\n}\n\nfunction handleRepeatRequest(ctx) {\n const queue = requestQueue.get(ctx.key);\n if (queue && queue.length > 0) {\n queue.forEach((resolve) => {\n if (ctx.error) {\n resolve({\n error: ctx.error\n });\n } else {\n resolve({\n response: ctx.response\n });\n }\n });\n }\n requestQueue.delete(ctx.key);\n mergeRequestMap.delete(ctx.key);\n}\n\nexport default async (ctx, next) => {\n if (ctx.config.mergeRequest) {\n const result = await handleCachingStart(ctx);\n if (result) {\n Object.keys(result).forEach((key) => {\n ctx[key] = result[key];\n });\n return;\n }\n } else {\n if (requestMap.get(ctx.key) && !ctx.config.mergeRequest) {\n ctx.error = {\n type: 'REPEAT',\n msg: '重复请求',\n config: ctx.config\n };\n return;\n }\n requestMap.set(ctx.key, true);\n }\n\n await next();\n\n if (ctx.config.mergeRequest) {\n handleRepeatRequest(ctx);\n } else {\n requestMap.delete(ctx.key);\n }\n};", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/preventRepeatReq.js", "start": 1, "end": 64, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 64, "column": 2, "position": 546 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/preventRepeatReq.js", "start": 1, "end": 64, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 64, "column": 2, "position": 546 } } }, { "format": "javascript", "lines": 11, "fragment": "import { checkHttpRequestHasBody, trimObj } from './helpers';\n\nexport default async (ctx, next) => {\n const config = ctx.config;\n if (checkHttpRequestHasBody(config.method)) {\n trimObj(config.data);\n } else {\n trimObj(config.params);\n }\n await next();\n};", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/paramsProcess.js", "start": 1, "end": 11, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 11, "column": 2, "position": 97 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/paramsProcess.js", "start": 1, "end": 11, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 11, "column": 2, "position": 97 } } }, { "format": "javascript", "lines": 86, "fragment": "export function typeOf(obj) {\n const map = {\n '[object Boolean]': 'boolean',\n '[object Number]': 'number',\n '[object String]': 'string',\n '[object Function]': 'function',\n '[object Array]': 'array',\n '[object Date]': 'date',\n '[object RegExp]': 'regExp',\n '[object Undefined]': 'undefined',\n '[object Null]': 'null',\n '[object Object]': 'object',\n '[object URLSearchParams]': 'URLSearchParams'\n };\n return map[Object.prototype.toString.call(obj)];\n}\n\nexport function isFunction(obj) {\n return typeOf(obj) === 'function';\n}\n\nexport function isDate(obj) {\n return typeOf(obj) === 'date';\n}\n\nexport function isString(obj) {\n return typeOf(obj) === 'string';\n}\n\nexport function isArray(obj) {\n return typeOf(obj) === 'array';\n}\n\nexport function isObject(obj) {\n return typeOf(obj) === 'object';\n}\n\nexport function isURLSearchParams(obj) {\n return typeOf(obj) === 'URLSearchParams';\n}\n\n// eslint-disable-next-line\nexport const isUndefined = val => val === undefined;\n\nexport const isDefined = val => val != null;\n\n\nexport function checkHttpRequestHasBody(method) {\n method = method.toUpperCase();\n const HTTP_METHOD = {\n GET: {\n request_body: false\n },\n POST: {\n request_body: true\n },\n PUT: {\n request_body: true\n },\n DELETE: {\n request_body: true\n },\n HEAD: {\n request_body: false\n },\n OPTIONS: {\n request_body: false\n },\n PATCH: {\n request_body: true\n }\n };\n return HTTP_METHOD[method].request_body;\n}\n\nexport function trimObj(obj) {\n if (isObject(obj)) {\n Object.entries(obj).forEach(([key, value]) => {\n if (isString(value)) {\n obj[key] = value.trim();\n } else if (isObject(value)) {\n trimObj(value);\n }\n });\n }\n}", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/helpers.js", "start": 5, "end": 90, "startLoc": { "line": 5, "column": 1, "position": 2 }, "endLoc": { "line": 90, "column": 2, "position": 596 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/helpers.js", "start": 5, "end": 90, "startLoc": { "line": 5, "column": 1, "position": 2 }, "endLoc": { "line": 90, "column": 2, "position": 596 } } }, { "format": "javascript", "lines": 209, "fragment": "import {\n isObject, isString, isURLSearchParams, checkHttpRequestHasBody\n} from './helpers';\n/**\n * 缓存实现的功能\n * 1. 唯一定位一个请求(url, data | params, method)\n * 其中请求参数根据请求方法使用其中一个就够了\n * 一个请求同时包含 data | params 参数的设计本身不合理\n * 不对这种情况进行兼容\n * 2. 控制缓存内容的大小,localStorage 只有5M\n * 3. 控制缓存时间\n * session(存在内存中)\n * expireTime 存在localStoreage 中\n * 4. 成功的、且响应内容为json的请求进行缓存\n */\n\n/**\n * 配置数据\n * type: 'ram' | 'sessionStorage' | 'localStorage'\n * cacheTime: ''\n */\n\n\n/**\n * 缓存数据结构\n * cache: {\n * url: 'url', // 缓存 url\n * data: data, // 数据\n * expire: '' // 缓存时间\n * }\n */\n\n/**\n * 请求参数可以为如下类型\n * - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams\n * - Browser only: FormData, File, Blob\n * 只缓存参数类型为: string、plain object、URLSearchParams 或者无参数的 请求\n */\n\nconst CACHE_KEY_PREFIX = '__FES_REQUEST_CACHE:';\nconst CACHE_TYPE = {\n ram: 'ram',\n session: 'sessionStorage',\n local: 'localStorage'\n};\n\nconst CACHE_DATA_MAP = new Map();\n\nfunction genInnerKey(key, cacheType = 'ram') {\n if (cacheType !== CACHE_TYPE.ram) {\n return `${CACHE_KEY_PREFIX}${key}`;\n }\n return key;\n}\n\nfunction canCache(data) {\n return !data || isObject(data) || isString(data) || Array.isArray(data) || isURLSearchParams(data);\n}\n\nfunction setCacheData({\n key,\n cacheType = 'ram',\n data,\n cacheTime = 1000 * 60 * 3\n}) {\n const _key = genInnerKey(key, cacheType);\n\n const currentCacheData = {\n cacheType,\n data,\n cacheTime,\n expire: Date.now() + cacheTime\n };\n if (cacheType !== CACHE_TYPE.ram) {\n const cacheInstance = window[CACHE_TYPE[cacheType]];\n try {\n cacheInstance.setItem(_key, JSON.stringify(currentCacheData));\n } catch (e) {\n // setItem 出现异常,清理缓存\n for (const item in cacheInstance) {\n if (item.startsWith(CACHE_KEY_PREFIX) && Object.prototype.hasOwnProperty.call(cacheInstance, item)) {\n cacheInstance.removeItem(item);\n }\n }\n }\n } else {\n CACHE_DATA_MAP.set(_key, currentCacheData);\n }\n}\n\nfunction isExpire({ expire, cacheTime }) {\n if (!cacheTime || expire >= Date.now()) {\n return false;\n }\n return true;\n}\n\nfunction getCacheData({ key, cacheType = 'ram' }) {\n const _key = genInnerKey(key, cacheType);\n if (cacheType !== CACHE_TYPE.ram) {\n const cacheInstance = window[CACHE_TYPE[cacheType]];\n const text = cacheInstance.getItem(_key) || null;\n try {\n const currentCacheData = JSON.parse(text);\n if (currentCacheData && !isExpire(currentCacheData)) {\n return currentCacheData.data;\n }\n cacheInstance.removeItem(_key);\n return null;\n } catch (e) {\n cacheInstance.removeItem(_key);\n return null;\n }\n } else {\n const currentCacheData = CACHE_DATA_MAP.get(_key);\n if (currentCacheData && !isExpire(currentCacheData)) {\n return currentCacheData.data;\n }\n CACHE_DATA_MAP.delete(_key);\n return null;\n }\n}\n\n// 存储缓存队列\nconst cacheStartFlag = new Map();\nconst cachingQueue = new Map();\n\n/**\n * 等上一次请求结果\n * 1. 如果上一次请求成功,直接使用上一次的请求结果\n * 2. 如果上一次请求失败,重启本次请求\n */\nfunction handleCachingStart(ctx, config) {\n const _key = genInnerKey(ctx.key, config.cache.cacheType);\n const caching = cacheStartFlag.get(_key);\n if (caching) {\n return new Promise((resolve) => {\n const queue = cachingQueue.get(_key) || [];\n cachingQueue.set(_key, queue.concat(resolve));\n });\n }\n cacheStartFlag.set(_key, true);\n}\n\n// 有请求成功的\nfunction handleCachingQueueSuccess(ctx, config) {\n // 移除首次缓存 flag\n const _key = genInnerKey(ctx.key, config.cache.cacheType);\n const queue = cachingQueue.get(_key);\n if (queue && queue.length > 0) {\n queue.forEach((resolve) => {\n resolve({\n response: ctx.response\n });\n });\n }\n cachingQueue.delete(_key);\n cacheStartFlag.delete(_key);\n}\n\n// 处理请求失败\nfunction handleCachingQueueError(ctx, config) {\n const _key = genInnerKey(ctx.key, config.cache.cacheType);\n const queue = cachingQueue.get(_key);\n if (queue && queue.length > 0) {\n const firstResolve = queue.shift();\n firstResolve();\n cachingQueue.set(_key, queue);\n } else {\n cachingQueue.delete(_key);\n cacheStartFlag.delete(_key);\n }\n}\n\nexport default async (ctx, next) => {\n const { config } = ctx;\n if (config.cache) {\n const cacheData = getCacheData({ key: ctx.key, cacheType: config.cache.cacheType });\n if (cacheData) {\n ctx.response = {\n data: cacheData\n };\n return;\n }\n const result = await handleCachingStart(ctx, config);\n if (result) {\n Object.keys(result).forEach((key) => {\n ctx[key] = result[key];\n });\n return;\n }\n }\n await next();\n\n if (config.cache) {\n const requestdata = checkHttpRequestHasBody(config.method) ? config.data : config.params;\n if (!ctx.error && ctx.response && canCache(requestdata) && canCache(ctx.response.data)) {\n handleCachingQueueSuccess(ctx, config);\n\n setCacheData({\n key: ctx.key,\n data: ctx.response.data,\n ...config.cache\n });\n } else {\n handleCachingQueueError(ctx, config);\n }\n }\n};", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/plugin-request/cacheControl.js", "start": 1, "end": 209, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 209, "column": 2, "position": 1521 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/cacheControl.js", "start": 1, "end": 209, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 209, "column": 2, "position": 1521 } } }, { "format": "javascript", "lines": 110, "fragment": "export default {\n register(monaco) {\n monaco.editor.defineTheme('defaultTheme', {\n base: 'vs',\n inherit: true,\n rules: [\n {\n foreground: 'c41a16',\n token: 'string'\n },\n {\n foreground: '1c00cf',\n token: 'constant.numeric'\n },\n {\n foreground: 'aa0d91',\n token: 'keyword'\n },\n {\n foreground: '000000',\n token: 'keyword.operator'\n },\n {\n foreground: 'aa0d91',\n token: 'constant.language'\n },\n {\n foreground: '990000',\n token: 'support.class.exception'\n },\n {\n foreground: '000000',\n token: 'entity.name.function'\n },\n {\n fontStyle: 'bold underline',\n token: 'entity.name.type'\n },\n {\n fontStyle: 'italic',\n token: 'variable.parameter'\n },\n {\n foreground: '007400',\n token: 'comment'\n },\n {\n foreground: 'ff0000',\n token: 'invalid'\n },\n {\n background: 'e71a1100',\n token: 'invalid.deprecated.trailing-whitespace'\n },\n {\n foreground: '000000',\n background: 'fafafafc',\n token: 'text source'\n },\n {\n foreground: 'aa0d91',\n token: 'meta.tag'\n },\n {\n foreground: 'aa0d91',\n token: 'declaration.tag'\n },\n {\n foreground: '000000',\n fontStyle: 'bold',\n token: 'support'\n },\n {\n foreground: 'aa0d91',\n token: 'storage'\n },\n {\n fontStyle: 'bold underline',\n token: 'entity.name.section'\n },\n {\n foreground: '000000',\n fontStyle: 'bold',\n token: 'entity.name.function.frame'\n },\n {\n foreground: '333333',\n token: 'meta.tag.preprocessor.xml'\n },\n {\n foreground: '994500',\n fontStyle: 'italic',\n token: 'entity.other.attribute-name'\n },\n {\n foreground: '881280',\n token: 'entity.name.tag'\n }\n ],\n colors: {\n 'editor.foreground': '#000000',\n 'editor.background': '#FFFFFF',\n 'editor.selectionBackground': '#BAD6FD',\n 'editor.lineHighlightBackground': '#0000001A',\n 'editorCursor.foreground': '#000000',\n 'editorWhitespace.foreground': '#B3B3B3F4'\n }\n });\n }\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-monaco-editor/src/runtime/theme/default.js", "start": 2, "end": 111, "startLoc": { "line": 2, "column": 1, "position": 2 }, "endLoc": { "line": 111, "column": 2, "position": 578 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-monaco-editor/theme/default.js", "start": 2, "end": 111, "startLoc": { "line": 2, "column": 1, "position": 2 }, "endLoc": { "line": 111, "column": 2, "position": 578 } } }, { "format": "markup", "lines": 74, "fragment": "\n \n \n \n \n \n {{item.icon}}\n {{item.label}}\n \n \n \n \n\n\n\n\n", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-locale/src/runtime/views/SelectLang.vue", "start": 1, "end": 74, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 74, "column": 2, "position": 446 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-locale/views/SelectLang.vue", "start": 1, "end": 74, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 74, "column": 2, "position": 446 } } }, { "format": "markup", "lines": 34, "fragment": "\n \n \n \n \n \n \n \n \n \n \n 关闭其他\n \n \n 刷新当前页\n \n \n \n \n \n \n \n \n \n \n \n\n\n", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-layout/src/runtime/views/MultiTabProvider.vue", "start": 131, "end": 190, "startLoc": { "line": 131, "column": 9, "position": 842 }, "endLoc": { "line": 190, "column": 2, "position": 1145 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/views/MultiTabProvider.vue", "start": 121, "end": 180, "startLoc": { "line": 121, "column": 9, "position": 787 }, "endLoc": { "line": 180, "column": 2, "position": 1090 } } }, { "format": "markup", "lines": 61, "fragment": "\n", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-layout/src/runtime/views/MenuIcon.vue", "start": 1, "end": 61, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 61, "column": 2, "position": 347 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/views/MenuIcon.vue", "start": 1, "end": 61, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 61, "column": 2, "position": 347 } } }, { "format": "markup", "lines": 106, "fragment": "\n \n \n \n \n \n \n \n \n \n \n \n \n {{item2.title}}\n \n \n \n \n {{item1.title}}\n \n \n \n \n \n \n {{item.title}}\n \n \n \n \n\n\n\n\n", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-layout/src/runtime/views/Menu.vue", "start": 1, "end": 106, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 106, "column": 2, "position": 667 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/views/Menu.vue", "start": 1, "end": 106, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 106, "column": 2, "position": 667 } } }, { "format": "markup", "lines": 378, "fragment": "\n \n \n \n \n \n \n {{title}}\n \n \n \n \n \n \n \n \n \n \n {{title}}\n \n \n \n \n {{title}}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {{footer}}\n \n \n \n \n \n \n\n\n\n\n\n", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-layout/src/runtime/views/BaseLayout.vue", "start": 1, "end": 378, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 378, "column": 2, "position": 2314 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/views/BaseLayout.vue", "start": 1, "end": 378, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 378, "column": 2, "position": 2314 } } }, { "format": "markup", "lines": 35, "fragment": "\n \n \n 上一页\n \n \n\n\n{\n \"layout\": false\n}\n\n", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-layout/src/runtime/views/404.vue", "start": 1, "end": 35, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 35, "column": 2, "position": 202 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/views/404.vue", "start": 1, "end": 35, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 35, "column": 2, "position": 202 } } }, { "format": "markup", "lines": 35, "fragment": "\n \n \n 上一页\n \n \n\n\n{\n \"layout\": false\n}\n\n", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-layout/src/runtime/views/403.vue", "start": 1, "end": 35, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 35, "column": 2, "position": 202 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/views/403.vue", "start": 1, "end": 35, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 35, "column": 2, "position": 202 } } }, { "format": "javascript", "lines": 49, "fragment": "const isStr = function (str) {\n return typeof str === 'string';\n};\n\nexport const isValid = (elm) => {\n if (elm.nodeType === 1) {\n if (elm.nodeName.toLowerCase() === 'script') {\n return false;\n }\n\n for (let i = 0; i < elm.attributes.length; i++) {\n const val = elm.attributes[i].value;\n if (isStr(val) && val.toLowerCase().indexOf('on') === 0) {\n return false;\n }\n }\n\n for (let i = 0; i < elm.childNodes.length; i++) {\n if (!isValid(elm.childNodes[i])) {\n return false;\n }\n }\n }\n return true;\n};\n\nexport const validateContent = (svgContent) => {\n const div = document.createElement('div');\n div.innerHTML = svgContent;\n\n // setup this way to ensure it works on our buddy IE\n for (let i = div.childNodes.length - 1; i >= 0; i--) {\n if (div.childNodes[i].nodeName.toLowerCase() !== 'svg') {\n div.removeChild(div.childNodes[i]);\n }\n }\n\n // must only have 1 root element\n const svgElm = div.firstElementChild;\n if (svgElm && svgElm.nodeName.toLowerCase() === 'svg') {\n // root element must be an svg\n // lets double check we've got valid elements\n // do not allow scripts\n if (isValid(svgElm)) {\n return div.innerHTML;\n }\n }\n return '';\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-layout/src/runtime/helpers/svg.js", "start": 1, "end": 49, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 49, "column": 2, "position": 456 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/helpers/svg.js", "start": 1, "end": 49, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 49, "column": 2, "position": 456 } } }, { "format": "javascript", "lines": 29, "fragment": "const transTitle = (name) => {\n const sharedLocale = plugin.getShared('locale');\n if (sharedLocale) {\n const { t } = sharedLocale.useI18n();\n return t(name);\n }\n return name;\n};\n\n\nconst _transform = (arr) => {\n if (Array.isArray(arr)) {\n arr.forEach((item) => {\n if (item.title) {\n item._title = item.title;\n item.title = computed(() => transTitle(item._title));\n }\n if (item.children && item.children.length > 0) {\n _transform(item.children);\n }\n });\n }\n};\n\nexport const transform = (menus) => {\n const originData = unref(menus);\n _transform(originData);\n return originData;\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-layout/src/runtime/helpers/pluginLocale.js", "start": 5, "end": 33, "startLoc": { "line": 5, "column": 2, "position": 33 }, "endLoc": { "line": 33, "column": 2, "position": 292 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/helpers/pluginLocale.js", "start": 5, "end": 33, "startLoc": { "line": 5, "column": 1, "position": 31 }, "endLoc": { "line": 33, "column": 2, "position": 290 } } }, { "format": "javascript", "lines": 40, "fragment": "import { unref, computed } from 'vue';\n// eslint-disable-next-line\nimport { useAccess } from '../../plugin-access/core';\n\nif (!useAccess) {\n throw new Error(\n '[plugin-layout]: pLugin-layout depends on plugin-access,please install plugin-access first!'\n );\n}\n\nexport const hasAccessByMenuItem = (item) => {\n let res;\n if (item.path && (!item.children || item.children.length === 0)) {\n res = useAccess(item.path);\n } else if (item.children && item.children.length > 0) {\n res = computed(() => item.children.some((child) => {\n const rst = hasAccessByMenuItem(child);\n return rst && rst.value;\n }));\n }\n return res;\n};\n\nconst _addAccessTag = (arr) => {\n if (Array.isArray(arr)) {\n arr.forEach((item) => {\n item.access = hasAccessByMenuItem(item);\n if (item.children && item.children.length > 0) {\n _addAccessTag(item.children);\n }\n });\n }\n};\n\nexport const transform = (menus) => {\n const originData = unref(menus);\n _addAccessTag(originData);\n\n return originData;\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-layout/src/runtime/helpers/pluginAccess.js", "start": 1, "end": 40, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 40, "column": 2, "position": 368 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/helpers/pluginAccess.js", "start": 1, "end": 40, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 40, "column": 2, "position": 368 } } }, { "format": "less", "lines": 50, "fragment": ".inner-icon {\n display: inline-block;\n color: inherit;\n font-style: normal;\n line-height: 0;\n text-align: center;\n text-transform: none;\n outline: none;\n vertical-align: -0.125em;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n\n > * {\n line-height: 1;\n }\n\n svg {\n display: inline-block;\n width: 1em;\n height: 1em;\n fill: currentColor;\n }\n\n &::before {\n display: none; // dont display old icon.\n }\n\n &[tabindex] {\n cursor: pointer;\n }\n &--spin {\n display: inline-block;\n animation: loadingCircle 1s infinite linear;\n }\n\n @-webkit-keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n }\n @keyframes loadingCircle {\n 100% {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n }\n \n}", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-icon/src/runtime/Icon/icon.less", "start": 1, "end": 50, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 50, "column": 2, "position": 278 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-icon/Icon/icon.less", "start": 1, "end": 50, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 50, "column": 2, "position": 278 } } }, { "format": "markup", "lines": 41, "fragment": "", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-icon/src/runtime/Icon/Icon.vue", "start": 1, "end": 41, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 41, "column": 2, "position": 278 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-icon/Icon/Icon.vue", "start": 1, "end": 41, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 41, "column": 2, "position": 278 } } }, { "format": "json", "lines": 37, "fragment": "{\n \"compilerOptions\": {\n \"outDir\": \"build/dist\",\n \"module\": \"esnext\",\n \"target\": \"esnext\",\n \"lib\": [\"esnext\", \"dom\"],\n \"sourceMap\": true,\n \"baseUrl\": \".\",\n \"jsx\": \"preserve\",\n \"allowSyntheticDefaultImports\": true,\n \"moduleResolution\": \"node\",\n \"forceConsistentCasingInFileNames\": true,\n \"noImplicitReturns\": true,\n \"suppressImplicitAnyIndexErrors\": true,\n \"noUnusedLocals\": true,\n \"allowJs\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"strict\": true,\n \"paths\": {\n \"@/*\": [\"./src/*\"],\n \"@@/*\": [\"./src/.fes/*\"]\n }\n },\n \"include\": [\n \"src/**/*\",\n \"tests/**/*\",\n \"test/**/*\",\n \"__test__/**/*\",\n \"typings/**/*\",\n \"config/**/*\",\n \".eslintrc.js\",\n \".stylelintrc.js\",\n \".prettierrc.js\"\n ],\n \"exclude\": [\"node_modules\", \"build\", \"dist\", \"scripts\", \"src/.fes/*\", \"webpack\", \"jest\"]\n}", "tokens": 0, "firstFile": { "name": "packages/create-fes-app/templates/app/h5/tsconfig.json", "start": 1, "end": 37, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 37, "column": 2, "position": 233 } }, "secondFile": { "name": "packages/create-fes-app/templates/app/pc/tsconfig.json", "start": 1, "end": 37, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 37, "column": 2, "position": 233 } } }, { "format": "json", "lines": 24, "fragment": "},\n \"keywords\": [\n \"管理端\",\n \"fes\",\n \"fast\",\n \"easy\",\n \"strong\"\n ],\n \"files\": [\n \".eslintrc.js\",\n \".gitignore\",\n \".fes.js\",\n \".fes.prod.js\",\n \"mock.js\",\n \"package.json\",\n \"README.md\",\n \"tsconfig.json\",\n \"/src\",\n \"/config\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/WeBankFinTech/fes.js.git\",\n \"directory\": \"packages/fes-template-h5\"", "tokens": 0, "firstFile": { "name": "packages/create-fes-app/templates/app/h5/package.json", "start": 8, "end": 31, "startLoc": { "line": 8, "column": 3, "position": 43 }, "endLoc": { "line": 31, "column": 27, "position": 148 } }, "secondFile": { "name": "packages/create-fes-app/templates/app/pc/package.json", "start": 11, "end": 34, "startLoc": { "line": 11, "column": 3, "position": 64 }, "endLoc": { "line": 34, "column": 24, "position": 169 } } }, { "format": "javascript", "lines": 81, "fragment": "l` 参数,用于指定加载子应用什么路由页面。\n\n ```vue\n\n \n\n\n```\n\n## 子应用配置\n\n### 第一步:插件注册\n```js\nexport default {\n qiankun: {\n micro: {},\n }\n};\n```\n\n### 第二步:配置运行时生命周期钩子(可选)\n插件会自动为你创建好 `qiankun` 子应用需要的生命周期钩子,但是如果你想在生命周期期间加一些自定义逻辑,可以在子应用的 `src/app.js` 里导出 `qiankun` 对象,并实现每一个生命周期钩子,其中钩子函数的入参 `props` 由主应用自动注入。\n```js\nexport const qiankun = {\n // 应用加载之前\n async bootstrap(props) {\n console.log('app1 bootstrap', props);\n },\n // 应用 render 之前触发\n async mount(props) {\n console.log('app1 mount', props);\n },\n // 当 props 更新时触发\n async update(props){\n console.log('app1 update', props);\n },\n // 应用卸载之后触发\n async unmount(props) {\n console.log('app1 unmount', props);\n },\n};\n\n```\n\n## 父子应用通讯\n\n有两种方式实现\n\n### 配合 [useModel](./model.md) 使用\n\n确保已经安装了 `@fesjs/plugin-model`:\n```json\n{\n \"dependencies\": {\n \"@fesjs/fes\": \"^2.0.0\",\n \"@fesjs/plugin-model\": \"^2.0.0\"\n },\n}\n```\n\n#### 主应用传递 props\n\n- 如果使用 `MicroApp` 组件模式消费子应用,直接通过 props 传递即可:\n```vue\n\n ", "tokens": 0, "firstFile": { "name": "docs/zh/reference/plugin/plugins/qiankun.md", "start": 149, "end": 229, "startLoc": { "line": 149, "column": 2, "position": 405 }, "endLoc": { "line": 229, "column": 6, "position": 642 } }, "secondFile": { "name": "docs/zh/reference/plugin/plugins/qiankun.md", "start": 124, "end": 156, "startLoc": { "line": 124, "column": 2, "position": 305 }, "endLoc": { "line": 156, "column": 7, "position": 441 } } }, { "format": "markdown", "lines": 33, "fragment": "认值**:`{}`\n\n- **详情**: \n \n 角色预定义列表。`key` 是角色 Id ,`value`是角色 Id 对应的资源列表。\n\n\n### 运行时配置\n在 `app.js` 中配置\n\n#### unAccessHandler\n- **类型**:`Function`\n \n- **默认值**:`null`\n\n- **详情**: \n \n 当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 `unAccessHandler` 函数。\n- **参数**\n - router:createRouter 创建的路由实例\n - to: 准备进入的路由\n - from:离开的路由\n - next: [next函数](https://next.router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%8F%AF%E9%80%89%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%8F%82%E6%95%B0-next)\n\n比如:\n```js\nexport const access = {\n unAccessHandler({ to, next }) {\n const accesssIds = accessApi.getAccess();\n if (to.path === '/404') {\n accessApi.setAccess(accesssIds.concat(['/404']));\n return next('/404');\n }\n if (!accesssIds.includes('/403", "tokens": 0, "firstFile": { "name": "docs/zh/reference/plugin/plugins/access.md", "start": 102, "end": 134, "startLoc": { "line": 102, "column": 1, "position": 331 }, "endLoc": { "line": 134, "column": 2, "position": 448 } }, "secondFile": { "name": "docs/zh/reference/plugin/plugins/layout.md", "start": 222, "end": 254, "startLoc": { "line": 222, "column": 1, "position": 862 }, "endLoc": { "line": 254, "column": 4, "position": 979 } } }, { "format": "less", "lines": 142, "fragment": "@charset \"UTF-8\";\n\n// 所有元素为border-box\n* {\n box-sizing: border-box;\n}\n\nhtml {\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n}\n\nbody,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nul,\nol,\nli,\ndl,\ndd,\np,\nform,\nth,\ntd,\nfieldset,\nlegend,\nblockquote,\nbutton,\ninput,\nselect,\ntextarea {\n margin: 0;\n padding: 0;\n}\n\nbody,\nbutton,\ninput,\nselect,\ntextarea {\n font: 14*@PX/1.5 tahoma, arial, \"Hiragino Sans GB\", \"Microsoft YaHei\";\n}\n\n\nbody {\n color: @txt-color;\n background-color: @bg-color;\n font-size: 14px;\n word-wrap: break-word;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: 100%;\n font-weight: normal;\n}\n\nol,\nul {\n list-style: none;\n}\n\nimg {\n border: 0;\n vertical-align: middle;\n}\n\naddress,\ncite,\ndfn,\nem,\ni,\nvar {\n font-style: normal;\n}\n\na {\n text-decoration: none;\n cursor: pointer;\n}\n\na:hover {\n text-decoration: none;\n}\n\na:focus {\n outline: none;\n}\n\ntable {\n border-spacing: 0;\n word-wrap: break-word;\n border-collapse: separate;\n}\n\ninput,\nselect,\nbutton {\n outline: none;\n vertical-align: middle;\n}\n\ninput[type='search']::-webkit-search-decoration,\ninput[type='search']::-webkit-search-cancel-button,\ninput[type='search']::-webkit-search-results-button,\ninput[type='search']::-webkit-search-results-decoration {\n display: none;\n}\n\ninput::-ms-clear {\n display: none;\n}\n\nselect::-ms-expand {\n display: none;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n margin: 0;\n font-size: 100%;\n font-family: inherit;\n outline-offset: 0;\n outline-style: none;\n outline-width: 0;\n background-image: none;\n}\n\ninput[readonly],\ntextarea[readonly] {\n background-color: #F1F1F1;\n}", "tokens": 0, "firstFile": { "name": "packages/fes-template-h5/src/styles/reset.less", "start": 1, "end": 142, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 142, "column": 2, "position": 412 } }, "secondFile": { "name": "packages/create-fes-app/templates/app/h5/src/styles/reset.less", "start": 1, "end": 142, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 142, "column": 2, "position": 412 } } }, { "format": "less", "lines": 45, "fragment": "a,\nimg {\n -webkit-touch-callout: none;\n}\n\nhtml {\n touch-action: manipulation; // 处理 IOS10+,click点击 300ms 问题\n}\nbody {\n background-color: #f7f7f7;\n}\n\ninput {\n line-height: normal;\n border: none;\n}\n\na {\n color: #0af;\n text-decoration: none;\n}\n\n* {\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\n/* 适配 iPhone X 顶部填充*/\n@supports (top: env(safe-area-inset-top)){\n body,\n .alien-screen-header {\n padding-top: constant(safe-area-inset-top, 40px);\n padding-top: env(safe-area-inset-top, 40px);\n padding-top: var(safe-area-inset-top, 40px);\n }\n}\n\n/* 判断iPhoneX 将 footer 的 padding-bottom 填充到最底部 */\n@supports (bottom: env(safe-area-inset-bottom)){\n body,\n .alien-screen-footer {\n padding-bottom: constant(safe-area-inset-bottom, 20px);\n padding-bottom: env(safe-area-inset-bottom, 20px);\n padding-top: var(safe-area-inset-bottom, 20px);\n }\n}", "tokens": 0, "firstFile": { "name": "packages/fes-template-h5/src/styles/common.less", "start": 1, "end": 45, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 45, "column": 2, "position": 270 } }, "secondFile": { "name": "packages/create-fes-app/templates/app/h5/src/styles/common.less", "start": 1, "end": 45, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 45, "column": 2, "position": 270 } } }, { "format": "javascript", "lines": 59, "fragment": "export function resetContainerHeight(dom) {\n const originalHeight = document.body.clientHeight || document.documentElement.clientHeight;\n\n window.onresize = function () {\n const resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;\n if (resizeHeight < originalHeight) {\n // 恢复内容区域高度\n const container = document.querySelector(dom);\n container.style.height = originalHeight;\n }\n };\n}\n\n\nexport function resetInputBlur() {\n const isWechat = window.navigator.userAgent.match(/MicroMessenger\\/([\\d.]+)/i);\n if (!isWechat) return;\n const wechatVersion = isWechat[1];\n const version = (navigator.appVersion).match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n\n // 如果设备类型为iOS 12+ 和wechat 6.7.4+,恢复成原来的视口\n if (+wechatVersion.replace(/\\./g, '') >= 674 && +version[1] >= 12) {\n window.scrollTo(0, Math.max(document.body.clientHeight, document.documentElement.clientHeight));\n }\n}\n\nexport function getQueryString(name) {\n const reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`, 'i');\n const r = window.location.search.substr(1).match(reg);\n if (r != null) {\n return decodeURIComponent(r[2]);\n }\n return null;\n}\n\nexport function simpleRequest(options) {\n const xhr = new XMLHttpRequest();\n xhr.timeout = 3000;\n if (options.type === 'GET') {\n xhr.open(options.type, options.url, options.async || true);\n xhr.send(null);\n } else if (options.type === 'POST') {\n xhr.open(options.type, options.url, options.async || true);\n xhr.setRequestHeader('Content-Type', 'application/json');\n xhr.send(JSON.stringify(options.data || {}));\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n if (xhr.status >= 200 && xhr.status < 300) {\n options.successed(xhr.responseText);\n } else {\n options.failed && options.failed(xhr);\n }\n }\n };\n xhr.ontimeout = function () {\n options.failed && options.failed(xhr);\n };\n}", "tokens": 0, "firstFile": { "name": "packages/fes-template-h5/src/common/utils.js", "start": 8, "end": 66, "startLoc": { "line": 8, "column": 1, "position": 12 }, "endLoc": { "line": 66, "column": 2, "position": 668 } }, "secondFile": { "name": "packages/create-fes-app/templates/app/h5/src/common/utils.js", "start": 8, "end": 66, "startLoc": { "line": 8, "column": 1, "position": 12 }, "endLoc": { "line": 66, "column": 2, "position": 668 } } }, { "format": "javascript", "lines": 18, "fragment": "count: 0\n }),\n mutations: {\n increment(state) {\n state.count++;\n }\n },\n getters: {\n doubleCount(state) {\n return state.count * 2;\n }\n },\n actions: {\n asyncIncrement({ commit }) {\n setTimeout(() => {\n commit('increment');\n }, 2000);\n },", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/stores/user.js", "start": 6, "end": 23, "startLoc": { "line": 6, "column": 9, "position": 40 }, "endLoc": { "line": 23, "column": 2, "position": 156 } }, "secondFile": { "name": "packages/fes-template/src/stores/foo/bar.js", "start": 4, "end": 22, "startLoc": { "line": 4, "column": 9, "position": 26 }, "endLoc": { "line": 22, "column": 2, "position": 144 } } }, { "format": "javascript", "lines": 23, "fragment": "export default {\n namespaced: true,\n state: () => ({\n count: 0\n }),\n mutations: {\n increment(state) {\n state.count++;\n }\n },\n getters: {\n doubleCount(state) {\n return state.count * 2;\n }\n },\n actions: {\n asyncIncrement({ commit }) {\n setTimeout(() => {\n commit('increment');\n }, 2000);\n }\n }\n};", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/stores/counter.js", "start": 1, "end": 23, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 23, "column": 2, "position": 147 } }, "secondFile": { "name": "packages/fes-template/src/stores/foo/bar.js", "start": 1, "end": 23, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 23, "column": 2, "position": 147 } } }, { "format": "javascript", "lines": 76, "fragment": ";\n\nconst renderClient = (opts = {}) => {\n const { plugin, routes, rootElement, initialState } = opts;\n const rootContainer = plugin.applyPlugins({\n type: ApplyPluginsType.modify,\n key: 'rootContainer',\n initialValue: defineComponent(() => () => ()),\n args: {\n routes: routes,\n plugin: plugin\n }\n });\n\n const app = createApp(rootContainer);\n app.provide(\"initialState\", initialState);\n\n plugin.applyPlugins({\n key: 'onAppCreated',\n type: ApplyPluginsType.event,\n args: { app, routes },\n });\n\n if (rootElement) {\n app.mount(rootElement);\n }\n return app;\n}\n\nconst beforeRender = async ({rootElement}) => {\n const beforeRenderConfig = plugin.applyPlugins({\n key: \"beforeRender\",\n type: ApplyPluginsType.modify,\n initialValue: {\n loading: null,\n action: null\n },\n });\n let initialState = {};\n if (typeof beforeRenderConfig.action === \"function\") {\n const app = createApp(beforeRenderConfig.loading);\n app.mount(rootElement);\n try {\n initialState = await beforeRenderConfig.action();\n } catch(e){\n console.error(`[fes] beforeRender执行出现异常:`);\n console.error(e);\n }\n app.unmount();\n }\n return initialState;\n};\n\nconst getClientRender = (args = {}) => plugin.applyPlugins({\n key: 'render',\n type: ApplyPluginsType.compose,\n initialValue: async () => {\n const opts = plugin.applyPlugins({\n key: 'modifyClientRenderOpts',\n type: ApplyPluginsType.modify,\n initialValue: {\n routes: args.routes || getRoutes(),\n plugin,\n rootElement: '#app',\n defaultTitle: ``,\n },\n });\n const initialState = await beforeRender(opts); \n return renderClient({...opts, initialState});\n },\n args,\n});\n\nconst clientRender = getClientRender();\n\nconst app = clientRender();", "tokens": 0, "firstFile": { "name": "packages/fes-template/src/.fes/fes.js", "start": 14, "end": 89, "startLoc": { "line": 14, "column": 2, "position": 78 }, "endLoc": { "line": 89, "column": 2, "position": 698 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/fes.js", "start": 10, "end": 89, "startLoc": { "line": 10, "column": 23, "position": 65 }, "endLoc": { "line": 89, "column": 2, "position": 689 } } }, { "format": "javascript", "lines": 15, "fragment": "const throttleMap = new Map();\n\nexport default async (ctx, next) => {\n if (ctx.config.throttle) {\n if (throttleMap.get(ctx.key) >= Date.now()) {\n ctx.error = {\n type: 'FREQUENTLY',\n msg: '请求过于频繁'\n };\n return;\n }\n }\n await next();\n throttleMap.set(ctx.key, Date.now() + ctx.config.throttle);\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/throttle.js", "start": 2, "end": 16, "startLoc": { "line": 2, "column": 1, "position": 1 }, "endLoc": { "line": 16, "column": 2, "position": 140 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/throttle.js", "start": 2, "end": 16, "startLoc": { "line": 2, "column": 1, "position": 1 }, "endLoc": { "line": 16, "column": 2, "position": 140 } } }, { "format": "javascript", "lines": 11, "fragment": "import { isObject } from './helpers';\n\n// FEATURE: 后续支持 a.b.c\nexport default async (ctx, next) => {\n const dataField = ctx.config.dataField ?? ctx.dataField;\n if (!ctx.error && ctx.response && isObject(ctx.response.data) && dataField) {\n ctx.response._rawData = ctx.response.data;\n ctx.response.data = ctx.response.data[dataField];\n }\n await next();\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/setDataField.js", "start": 1, "end": 11, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 11, "column": 2, "position": 134 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/setDataField.js", "start": 1, "end": 11, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 11, "column": 2, "position": 134 } } }, { "format": "javascript", "lines": 32, "fragment": "class Scheduler {\n constructor() {\n this.middlewares = [];\n }\n\n use(fn) {\n if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');\n this.middlewares.push(fn);\n return this;\n }\n\n compose() {\n return (context, next) => {\n let index = -1;\n const dispatch = (i) => {\n if (i <= index) return Promise.reject(new Error('next() called multiple times'));\n index = i;\n let fn = this.middlewares[i];\n if (index === this.middlewares.length) fn = next;\n if (!fn) return Promise.resolve();\n try {\n return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));\n } catch (e) {\n return Promise.reject(e);\n }\n };\n return dispatch(0);\n };\n }\n}\n\nexport default new Scheduler();", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/scheduler.js", "start": 2, "end": 33, "startLoc": { "line": 2, "column": 1, "position": 1 }, "endLoc": { "line": 33, "column": 2, "position": 307 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/scheduler.js", "start": 2, "end": 33, "startLoc": { "line": 2, "column": 1, "position": 1 }, "endLoc": { "line": 33, "column": 2, "position": 307 } } }, { "format": "javascript", "lines": 17, "fragment": "import { isObject } from './helpers';\n\n// 错误处理等副作用网上提\nexport default async (ctx, next) => {\n const {\n response,\n config\n } = ctx;\n if (!config.closeResDataCheck && response && isObject(response.data)) {\n const code = response.data.code;\n if (code !== '0') {\n ctx.error = response; // code 不为零进入 reject\n }\n }\n\n await next();\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/resErrorProcess.js", "start": 1, "end": 17, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 17, "column": 2, "position": 133 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/resErrorProcess.js", "start": 1, "end": 17, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 17, "column": 2, "position": 133 } } }, { "format": "javascript", "lines": 8, "fragment": "import { isFunction, isObject, isString } from './helpers';\n\nexport default async ({ response, responseDataAdaptor }, next) => {\n if (isFunction(responseDataAdaptor) && response && (isObject(response.data) || isString(response.data))) {\n response.data = responseDataAdaptor(response.data);\n }\n await next();\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/resDataAdaptor.js", "start": 1, "end": 8, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 8, "column": 2, "position": 107 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/resDataAdaptor.js", "start": 1, "end": 8, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 8, "column": 2, "position": 107 } } }, { "format": "javascript", "lines": 84, "fragment": ";\nimport { ApplyPluginsType, plugin } from '@fesjs/fes';\nimport { ref } from 'vue';\nimport scheduler from './scheduler';\nimport {\n checkHttpRequestHasBody,\n isFunction\n} from './helpers';\n\nimport setDataField from './setDataField';\nimport paramsProcess from './paramsProcess';\nimport genRequestKey from './genRequestKey';\nimport preventRepeatReq from './preventRepeatReq';\nimport throttle from './throttle';\nimport cacheControl from './cacheControl';\nimport resDataAdaptor from './resDataAdaptor';\nimport resErrorProcess from './resErrorProcess';\n\nfunction addInterceptors(instance, interceptors, type = 'request') {\n interceptors.forEach((fn) => {\n if (Array.isArray(fn)) {\n instance.interceptors[type].use(...fn);\n } else if (isFunction(fn)) {\n instance.interceptors[type].use(fn);\n }\n });\n}\n\nfunction addRequestInterceptors(instance, interceptors) {\n addInterceptors(instance, interceptors, 'request');\n}\n\nfunction addResponseInterceptors(instance, interceptors) {\n addInterceptors(instance, interceptors, 'response');\n}\n\nasync function axiosMiddleware(context, next) {\n try {\n context.response = await context.instance.request(context.config);\n } catch (error) {\n context.error = error;\n }\n await next();\n}\n\nfunction getRequestInstance() {\n const {\n responseDataAdaptor,\n requestInterceptors = [],\n responseInterceptors = [],\n errorHandler,\n ...otherConfigs\n } = plugin.applyPlugins({\n key: 'request',\n type: ApplyPluginsType.modify,\n initialValue: {}\n });\n\n const defaultConfig = Object.assign({\n timeout: 10000,\n withCredentials: true\n }, otherConfigs);\n const instance = axios.create(defaultConfig);\n\n addRequestInterceptors(instance, requestInterceptors);\n addResponseInterceptors(instance, responseInterceptors);\n\n // 洋葱模型内部应该这是对数据的处理,避免有副作用调用\n scheduler\n .use(paramsProcess)\n .use(genRequestKey)\n .use(cacheControl)\n .use(preventRepeatReq)\n .use(throttle)\n .use(axiosMiddleware)\n .use(resDataAdaptor)\n .use(resErrorProcess)\n .use(setDataField);\n\n return {\n context: {\n instance,\n defaultConfig,\n dataField: REPLACE_DATA_FIELD", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/request.js", "start": 1, "end": 84, "startLoc": { "line": 1, "column": 13, "position": 7 }, "endLoc": { "line": 84, "column": 19, "position": 620 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/request.js", "start": 1, "end": 84, "startLoc": { "line": 1, "column": 45, "position": 7 }, "endLoc": { "line": 84, "column": 9, "position": 620 } } }, { "format": "javascript", "lines": 16, "fragment": ", // eslint-disable-line\n responseDataAdaptor,\n errorHandler\n },\n request: scheduler.compose()\n };\n}\n\n// DEPRECATED 废弃,使用 axios baseURL\nfunction handleApiPathBase(url, options = {}) {\n if (url.startsWith('http')) return url;\n\n if (options.base) {\n return `${options.base}${url}`;\n }\n return `REPLACE_BASE", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/request.js", "start": 84, "end": 99, "startLoc": { "line": 84, "column": 19, "position": 621 }, "endLoc": { "line": 99, "column": 14, "position": 722 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/request.js", "start": 84, "end": 99, "startLoc": { "line": 84, "column": 9, "position": 621 }, "endLoc": { "line": 99, "column": 10, "position": 722 } } }, { "format": "javascript", "lines": 120, "fragment": "${url}`;\n}\n\nfunction userConfigHandler(url, data, options = {}) {\n options.url = handleApiPathBase(url, options);\n options.method = (options.method || 'post').toUpperCase();\n if (checkHttpRequestHasBody(options.method)) {\n options.data = data;\n } else {\n options.params = data;\n }\n return options;\n}\n\nlet currentRequestInstance = null;\n\nfunction createContext(userConfig) {\n return {\n ...currentRequestInstance.context,\n config: {\n ...currentRequestInstance.context.defaultConfig,\n ...userConfig\n }\n };\n}\n\n\nfunction getResponseCode(response) {\n if (response) {\n if (response._rawData) return response._rawData.code;\n if (response.data) return response.data.code;\n }\n return null;\n}\n\nfunction skipErrorHandlerToObj(skipErrorHandler = []) {\n if (!Array.isArray(skipErrorHandler)) {\n skipErrorHandler = [skipErrorHandler];\n }\n\n return skipErrorHandler.reduce((acc, cur) => {\n acc[cur] = true;\n return acc;\n }, {});\n}\n\nfunction handleRequestError({\n errorHandler = {},\n error,\n response,\n config\n}) {\n // 跳过所有错误类型处理\n if (config.skipErrorHandler === true) return;\n\n const skipObj = skipErrorHandlerToObj(config.skipErrorHandler);\n const resCode = getResponseCode(response);\n\n let errorKey = 'default';\n if (resCode && errorHandler[resCode]) {\n errorKey = resCode;\n } else if (error.type && errorHandler[error.type]) {\n errorKey = error.type;\n } else if (error.response && errorHandler[error.response.status]) {\n errorKey = error.response.status;\n }\n\n if (!skipObj[errorKey] && errorHandler[errorKey]) {\n return errorHandler[errorKey](error);\n }\n}\n\nexport const request = (url, data, options = {}) => {\n if (typeof options === 'string') {\n options = {\n method: options\n };\n }\n if (!currentRequestInstance) {\n currentRequestInstance = getRequestInstance();\n }\n const userConfig = userConfigHandler(url, data, options);\n const context = createContext(userConfig);\n\n return currentRequestInstance.request(context).then(async () => {\n if (!context.error) {\n return context.config.useResonse ? context.response : context.response.data;\n }\n await handleRequestError(context);\n return Promise.reject(context.error);\n });\n};\n\nfunction isPromiseLike(obj) {\n return !!obj && typeof obj === 'object' && typeof obj.then === 'function';\n}\n\nexport const useRequest = (url, data, options = {}) => {\n const loadingRef = ref(true);\n const errorRef = ref(null);\n const dataRef = ref(null);\n let promise;\n if (isPromiseLike(url)) {\n promise = url;\n } else {\n promise = request(url, data, options);\n }\n promise.then((res) => {\n dataRef.value = res;\n }).catch((error) => {\n errorRef.value = error;\n }).finally(() => {\n loadingRef.value = false;\n });\n return {\n loading: loadingRef,\n error: errorRef,\n data: dataRef\n };\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/request.js", "start": 99, "end": 218, "startLoc": { "line": 99, "column": 14, "position": 723 }, "endLoc": { "line": 218, "column": 2, "position": 1763 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/request.js", "start": 99, "end": 218, "startLoc": { "line": 99, "column": 10, "position": 723 }, "endLoc": { "line": 218, "column": 2, "position": 1763 } } }, { "format": "javascript", "lines": 64, "fragment": "const requestMap = new Map();\n\nconst mergeRequestMap = new Map();\nconst requestQueue = new Map();\n\nfunction handleCachingStart(ctx) {\n const isRequesting = mergeRequestMap.get(ctx.key);\n if (isRequesting) {\n return new Promise((resolve) => {\n const queue = requestQueue.get(ctx.key) || [];\n requestQueue.set(ctx.key, queue.concat(resolve));\n });\n }\n mergeRequestMap.set(ctx.key, true);\n}\n\nfunction handleRepeatRequest(ctx) {\n const queue = requestQueue.get(ctx.key);\n if (queue && queue.length > 0) {\n queue.forEach((resolve) => {\n if (ctx.error) {\n resolve({\n error: ctx.error\n });\n } else {\n resolve({\n response: ctx.response\n });\n }\n });\n }\n requestQueue.delete(ctx.key);\n mergeRequestMap.delete(ctx.key);\n}\n\nexport default async (ctx, next) => {\n if (ctx.config.mergeRequest) {\n const result = await handleCachingStart(ctx);\n if (result) {\n Object.keys(result).forEach((key) => {\n ctx[key] = result[key];\n });\n return;\n }\n } else {\n if (requestMap.get(ctx.key) && !ctx.config.mergeRequest) {\n ctx.error = {\n type: 'REPEAT',\n msg: '重复请求',\n config: ctx.config\n };\n return;\n }\n requestMap.set(ctx.key, true);\n }\n\n await next();\n\n if (ctx.config.mergeRequest) {\n handleRepeatRequest(ctx);\n } else {\n requestMap.delete(ctx.key);\n }\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/preventRepeatReq.js", "start": 1, "end": 64, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 64, "column": 2, "position": 546 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/preventRepeatReq.js", "start": 1, "end": 64, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 64, "column": 2, "position": 546 } } }, { "format": "javascript", "lines": 11, "fragment": "import { checkHttpRequestHasBody, trimObj } from './helpers';\n\nexport default async (ctx, next) => {\n const config = ctx.config;\n if (checkHttpRequestHasBody(config.method)) {\n trimObj(config.data);\n } else {\n trimObj(config.params);\n }\n await next();\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/paramsProcess.js", "start": 1, "end": 11, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 11, "column": 2, "position": 97 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/paramsProcess.js", "start": 1, "end": 11, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 11, "column": 2, "position": 97 } } }, { "format": "javascript", "lines": 86, "fragment": "export function typeOf(obj) {\n const map = {\n '[object Boolean]': 'boolean',\n '[object Number]': 'number',\n '[object String]': 'string',\n '[object Function]': 'function',\n '[object Array]': 'array',\n '[object Date]': 'date',\n '[object RegExp]': 'regExp',\n '[object Undefined]': 'undefined',\n '[object Null]': 'null',\n '[object Object]': 'object',\n '[object URLSearchParams]': 'URLSearchParams'\n };\n return map[Object.prototype.toString.call(obj)];\n}\n\nexport function isFunction(obj) {\n return typeOf(obj) === 'function';\n}\n\nexport function isDate(obj) {\n return typeOf(obj) === 'date';\n}\n\nexport function isString(obj) {\n return typeOf(obj) === 'string';\n}\n\nexport function isArray(obj) {\n return typeOf(obj) === 'array';\n}\n\nexport function isObject(obj) {\n return typeOf(obj) === 'object';\n}\n\nexport function isURLSearchParams(obj) {\n return typeOf(obj) === 'URLSearchParams';\n}\n\n// eslint-disable-next-line\nexport const isUndefined = val => val === undefined;\n\nexport const isDefined = val => val != null;\n\n\nexport function checkHttpRequestHasBody(method) {\n method = method.toUpperCase();\n const HTTP_METHOD = {\n GET: {\n request_body: false\n },\n POST: {\n request_body: true\n },\n PUT: {\n request_body: true\n },\n DELETE: {\n request_body: true\n },\n HEAD: {\n request_body: false\n },\n OPTIONS: {\n request_body: false\n },\n PATCH: {\n request_body: true\n }\n };\n return HTTP_METHOD[method].request_body;\n}\n\nexport function trimObj(obj) {\n if (isObject(obj)) {\n Object.entries(obj).forEach(([key, value]) => {\n if (isString(value)) {\n obj[key] = value.trim();\n } else if (isObject(value)) {\n trimObj(value);\n }\n });\n }\n}", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/helpers.js", "start": 5, "end": 90, "startLoc": { "line": 5, "column": 1, "position": 2 }, "endLoc": { "line": 90, "column": 2, "position": 596 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/helpers.js", "start": 5, "end": 90, "startLoc": { "line": 5, "column": 1, "position": 2 }, "endLoc": { "line": 90, "column": 2, "position": 596 } } }, { "format": "javascript", "lines": 209, "fragment": "import {\n isObject, isString, isURLSearchParams, checkHttpRequestHasBody\n} from './helpers';\n/**\n * 缓存实现的功能\n * 1. 唯一定位一个请求(url, data | params, method)\n * 其中请求参数根据请求方法使用其中一个就够了\n * 一个请求同时包含 data | params 参数的设计本身不合理\n * 不对这种情况进行兼容\n * 2. 控制缓存内容的大小,localStorage 只有5M\n * 3. 控制缓存时间\n * session(存在内存中)\n * expireTime 存在localStoreage 中\n * 4. 成功的、且响应内容为json的请求进行缓存\n */\n\n/**\n * 配置数据\n * type: 'ram' | 'sessionStorage' | 'localStorage'\n * cacheTime: ''\n */\n\n\n/**\n * 缓存数据结构\n * cache: {\n * url: 'url', // 缓存 url\n * data: data, // 数据\n * expire: '' // 缓存时间\n * }\n */\n\n/**\n * 请求参数可以为如下类型\n * - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams\n * - Browser only: FormData, File, Blob\n * 只缓存参数类型为: string、plain object、URLSearchParams 或者无参数的 请求\n */\n\nconst CACHE_KEY_PREFIX = '__FES_REQUEST_CACHE:';\nconst CACHE_TYPE = {\n ram: 'ram',\n session: 'sessionStorage',\n local: 'localStorage'\n};\n\nconst CACHE_DATA_MAP = new Map();\n\nfunction genInnerKey(key, cacheType = 'ram') {\n if (cacheType !== CACHE_TYPE.ram) {\n return `${CACHE_KEY_PREFIX}${key}`;\n }\n return key;\n}\n\nfunction canCache(data) {\n return !data || isObject(data) || isString(data) || Array.isArray(data) || isURLSearchParams(data);\n}\n\nfunction setCacheData({\n key,\n cacheType = 'ram',\n data,\n cacheTime = 1000 * 60 * 3\n}) {\n const _key = genInnerKey(key, cacheType);\n\n const currentCacheData = {\n cacheType,\n data,\n cacheTime,\n expire: Date.now() + cacheTime\n };\n if (cacheType !== CACHE_TYPE.ram) {\n const cacheInstance = window[CACHE_TYPE[cacheType]];\n try {\n cacheInstance.setItem(_key, JSON.stringify(currentCacheData));\n } catch (e) {\n // setItem 出现异常,清理缓存\n for (const item in cacheInstance) {\n if (item.startsWith(CACHE_KEY_PREFIX) && Object.prototype.hasOwnProperty.call(cacheInstance, item)) {\n cacheInstance.removeItem(item);\n }\n }\n }\n } else {\n CACHE_DATA_MAP.set(_key, currentCacheData);\n }\n}\n\nfunction isExpire({ expire, cacheTime }) {\n if (!cacheTime || expire >= Date.now()) {\n return false;\n }\n return true;\n}\n\nfunction getCacheData({ key, cacheType = 'ram' }) {\n const _key = genInnerKey(key, cacheType);\n if (cacheType !== CACHE_TYPE.ram) {\n const cacheInstance = window[CACHE_TYPE[cacheType]];\n const text = cacheInstance.getItem(_key) || null;\n try {\n const currentCacheData = JSON.parse(text);\n if (currentCacheData && !isExpire(currentCacheData)) {\n return currentCacheData.data;\n }\n cacheInstance.removeItem(_key);\n return null;\n } catch (e) {\n cacheInstance.removeItem(_key);\n return null;\n }\n } else {\n const currentCacheData = CACHE_DATA_MAP.get(_key);\n if (currentCacheData && !isExpire(currentCacheData)) {\n return currentCacheData.data;\n }\n CACHE_DATA_MAP.delete(_key);\n return null;\n }\n}\n\n// 存储缓存队列\nconst cacheStartFlag = new Map();\nconst cachingQueue = new Map();\n\n/**\n * 等上一次请求结果\n * 1. 如果上一次请求成功,直接使用上一次的请求结果\n * 2. 如果上一次请求失败,重启本次请求\n */\nfunction handleCachingStart(ctx, config) {\n const _key = genInnerKey(ctx.key, config.cache.cacheType);\n const caching = cacheStartFlag.get(_key);\n if (caching) {\n return new Promise((resolve) => {\n const queue = cachingQueue.get(_key) || [];\n cachingQueue.set(_key, queue.concat(resolve));\n });\n }\n cacheStartFlag.set(_key, true);\n}\n\n// 有请求成功的\nfunction handleCachingQueueSuccess(ctx, config) {\n // 移除首次缓存 flag\n const _key = genInnerKey(ctx.key, config.cache.cacheType);\n const queue = cachingQueue.get(_key);\n if (queue && queue.length > 0) {\n queue.forEach((resolve) => {\n resolve({\n response: ctx.response\n });\n });\n }\n cachingQueue.delete(_key);\n cacheStartFlag.delete(_key);\n}\n\n// 处理请求失败\nfunction handleCachingQueueError(ctx, config) {\n const _key = genInnerKey(ctx.key, config.cache.cacheType);\n const queue = cachingQueue.get(_key);\n if (queue && queue.length > 0) {\n const firstResolve = queue.shift();\n firstResolve();\n cachingQueue.set(_key, queue);\n } else {\n cachingQueue.delete(_key);\n cacheStartFlag.delete(_key);\n }\n}\n\nexport default async (ctx, next) => {\n const { config } = ctx;\n if (config.cache) {\n const cacheData = getCacheData({ key: ctx.key, cacheType: config.cache.cacheType });\n if (cacheData) {\n ctx.response = {\n data: cacheData\n };\n return;\n }\n const result = await handleCachingStart(ctx, config);\n if (result) {\n Object.keys(result).forEach((key) => {\n ctx[key] = result[key];\n });\n return;\n }\n }\n await next();\n\n if (config.cache) {\n const requestdata = checkHttpRequestHasBody(config.method) ? config.data : config.params;\n if (!ctx.error && ctx.response && canCache(requestdata) && canCache(ctx.response.data)) {\n handleCachingQueueSuccess(ctx, config);\n\n setCacheData({\n key: ctx.key,\n data: ctx.response.data,\n ...config.cache\n });\n } else {\n handleCachingQueueError(ctx, config);\n }\n }\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-request/src/template/cacheControl.js", "start": 1, "end": 209, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 209, "column": 2, "position": 1521 } }, "secondFile": { "name": "packages/fes-template-h5/src/.fes/plugin-request/cacheControl.js", "start": 1, "end": 209, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 209, "column": 2, "position": 1521 } } }, { "format": "javascript", "lines": 314, "fragment": "export default {\n 'ar-EG': {\n lang: 'ar-EG',\n label: 'العربية',\n icon: '🇪🇬',\n title: 'لغة'\n },\n 'az-AZ': {\n lang: 'az-AZ',\n label: 'Azərbaycan dili',\n icon: '🇦🇿',\n title: 'Dil'\n },\n 'bg-BG': {\n lang: 'bg-BG',\n label: 'Български език',\n icon: '🇧🇬',\n title: 'език'\n },\n 'ca-ES': {\n lang: 'ca-ES',\n label: 'Catalá',\n icon: '🇨🇦',\n title: 'llengua'\n },\n 'cs-CZ': {\n lang: 'cs-CZ',\n label: 'Čeština',\n icon: '🇨🇿',\n title: 'Jazyk'\n },\n 'da-DK': {\n lang: 'da-DK',\n label: 'Dansk',\n icon: '🇩🇰',\n title: 'Sprog'\n },\n 'de-DE': {\n lang: 'de-DE',\n label: 'Deutsch',\n icon: '🇩🇪',\n title: 'Sprache'\n },\n 'el-GR': {\n lang: 'el-GR',\n label: 'Ελληνικά',\n icon: '🇬🇷',\n title: 'Γλώσσα'\n },\n 'en-GB': {\n lang: 'en-GB',\n label: 'English',\n icon: '🇬🇧',\n title: 'Language'\n },\n 'en-US': {\n lang: 'en-US',\n label: 'English',\n icon: '🇺🇸',\n title: 'Language'\n },\n 'es-ES': {\n lang: 'es-ES',\n label: 'Español',\n icon: '🇪🇸',\n title: 'Idioma'\n },\n 'et-EE': {\n lang: 'et-EE',\n label: 'Eesti',\n icon: '🇪🇪',\n title: 'Keel'\n },\n 'fa-IR': {\n lang: 'fa-IR',\n label: 'فارسی',\n icon: '🇮🇷',\n title: 'زبان'\n },\n 'fi-FI': {\n lang: 'fi-FI',\n label: 'Suomi',\n icon: '🇫🇮',\n title: 'Kieli'\n },\n 'fr-BE': {\n lang: 'fr-BE',\n label: 'Français',\n icon: '🇧🇪',\n title: 'Langue'\n },\n 'fr-FR': {\n lang: 'fr-FR',\n label: 'Français',\n icon: '🇫🇷',\n title: 'Langue'\n },\n 'ga-IE': {\n lang: 'ga-IE',\n label: 'Gaeilge',\n icon: '🇮🇪',\n title: 'Teanga'\n },\n 'he-IL': {\n lang: 'he-IL',\n label: 'עברית',\n icon: '🇮🇱',\n title: 'שפה'\n },\n 'hi-IN': {\n lang: 'hi-IN',\n label: 'हिन्दी, हिंदी',\n icon: '🇮🇳',\n title: 'भाषा: हिन्दी'\n },\n 'hr-HR': {\n lang: 'hr-HR',\n label: 'Hrvatski jezik',\n icon: '🇭🇷',\n title: 'Jezik'\n },\n 'hu-HU': {\n lang: 'hu-HU',\n label: 'Magyar',\n icon: '🇭🇺',\n title: 'Nyelv'\n },\n 'hy-AM': {\n lang: 'hu-HU',\n label: 'Հայերեն',\n icon: '🇦🇲',\n title: 'Լեզու'\n },\n 'id-ID': {\n lang: 'id-ID',\n label: 'Bahasa Indonesia',\n icon: '🇮🇩',\n title: 'Bahasa'\n },\n 'it-IT': {\n lang: 'it-IT',\n label: 'Italiano',\n icon: '🇮🇹',\n title: 'Linguaggio'\n },\n 'is-IS': {\n lang: 'is-IS',\n label: 'Íslenska',\n icon: '🇮🇸',\n title: 'Tungumál'\n },\n 'ja-JP': {\n lang: 'ja-JP',\n label: '日本語',\n icon: '🇯🇵',\n title: '言語'\n },\n 'ku-IQ': {\n lang: 'ku-IQ',\n label: 'کوردی',\n icon: '🇮🇶',\n title: 'Ziman'\n },\n 'kn-IN': {\n lang: 'zh-TW',\n label: 'ಕನ್ನಡ',\n icon: '🇮🇳',\n title: 'ಭಾಷೆ'\n },\n 'ko-KR': {\n lang: 'ko-KR',\n label: '한국어',\n icon: '🇰🇷',\n title: '언어'\n },\n 'lv-LV': {\n lang: 'lv-LV',\n label: 'Latviešu valoda',\n icon: '🇱🇮',\n title: 'Kalba'\n },\n 'mk-MK': {\n lang: 'mk-MK',\n label: 'македонски јазик',\n icon: '🇲🇰',\n title: 'Јазик'\n },\n 'mn-MN': {\n lang: 'mn-MN',\n label: 'Монгол хэл',\n icon: '🇲🇳',\n title: 'Хэл'\n },\n 'ms-MY': {\n lang: 'ms-MY',\n label: 'بهاس ملايو',\n icon: '🇲🇾',\n title: 'Bahasa'\n },\n 'nb-NO': {\n lang: 'nb-NO',\n label: 'Norsk',\n icon: '🇳🇴',\n title: 'Språk'\n },\n 'ne-NP': {\n lang: 'ne-NP',\n label: 'नेपाली',\n icon: '🇳🇵',\n title: 'भाषा'\n },\n 'nl-BE': {\n lang: 'nl-BE',\n label: 'Vlaams',\n icon: '🇧🇪',\n title: 'Taal'\n },\n 'nl-NL': {\n lang: 'nl-NL',\n label: 'Vlaams',\n icon: '🇳🇱',\n title: 'Taal'\n },\n 'pt-BR': {\n lang: 'pt-BR',\n label: 'Português',\n icon: '🇧🇷',\n title: 'Idiomas'\n },\n 'pt-PT': {\n lang: 'pt-PT',\n label: 'Português',\n icon: '🇵🇹',\n title: 'Idiomas'\n },\n 'ro-RO': {\n lang: 'ro-RO',\n label: 'Română',\n icon: '🇷🇴',\n title: 'Limba'\n },\n 'ru-RU': {\n lang: 'ru-RU',\n label: 'русский',\n icon: '🇷🇺',\n title: 'язык'\n },\n 'sk-SK': {\n lang: 'sk-SK',\n label: 'Slovenčina',\n icon: '🇸🇰',\n title: 'Jazyk'\n },\n 'sr-RS': {\n lang: 'sr-RS',\n label: 'српски језик',\n icon: '🇸🇷',\n title: 'Језик'\n },\n 'sl-SI': {\n lang: 'sl-SI',\n label: 'Slovenščina',\n icon: '🇸🇱',\n title: 'Jezik'\n },\n 'sv-SE': {\n lang: 'sv-SE',\n label: 'Svenska',\n icon: '🇸🇪',\n title: 'Språk'\n },\n 'ta-IN': {\n lang: 'ta-IN',\n label: 'தமிழ்',\n icon: '🇮🇳',\n title: 'மொழி'\n },\n 'th-TH': {\n lang: 'th-TH',\n label: 'ไทย',\n icon: '🇹🇭',\n title: 'ภาษา'\n },\n 'tr-TR': {\n lang: 'tr-TR',\n label: 'Türkçe',\n icon: '🇹🇷',\n title: 'Dil'\n },\n 'uk-UA': {\n lang: 'uk-UA',\n label: 'Українська',\n icon: '🇺🇰',\n title: 'Мова'\n },\n 'vi-VN': {\n lang: 'vi-VN',\n label: 'Tiếng Việt',\n icon: '🇻🇳',\n title: 'Ngôn ngữ'\n },\n 'zh-CN': {\n lang: 'zh-CN',\n label: '简体中文',\n icon: '🇨🇳',\n title: '语言'\n },\n 'zh-TW': {\n lang: 'zh-TW',\n label: '繁体中文',\n icon: '🇭🇰',\n title: '語言'\n }\n};", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-locale/src/runtime/langUConfigMap.js", "start": 1, "end": 314, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 314, "column": 2, "position": 1930 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-locale/langUConfigMap.js", "start": 1, "end": 314, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 314, "column": 2, "position": 1930 } } }, { "format": "javascript", "lines": 71, "fragment": "import { plugin, ApplyPluginsType } from '@@/core/coreExports';\n// eslint-disable-next-line import/extensions\nimport { access as accessApi } from '../plugin-access/core';\nimport Exception404 from './views/404';\nimport Exception403 from './views/403';\n\nif (!accessApi) {\n throw new Error(\n '[plugin-layout]: pLugin-layout depends on plugin-access,please install plugin-access first!'\n );\n}\n\nconst handle = (type, router) => {\n const accesssIds = accessApi.getAccess();\n const path = `/${type}`;\n const name = `Exception${type}`;\n const components = {\n 404: Exception404,\n 403: Exception403\n };\n if (!accesssIds.includes(path)) {\n accessApi.setAccess(accesssIds.concat([path]));\n }\n if (!router.hasRoute(name)) {\n router.addRoute({ path, name, component: components[type] });\n }\n};\n\nexport const access = memo => ({\n unAccessHandler({\n router, to, from, next\n }) {\n const runtimeConfig = plugin.applyPlugins({\n key: 'layout',\n type: ApplyPluginsType.modify,\n initialValue: {}\n });\n if (runtimeConfig.unAccessHandler && typeof runtimeConfig.unAccessHandler === 'function') {\n return runtimeConfig.unAccessHandler({\n router, to, from, next\n });\n }\n if (to.path === '/404') {\n handle(404, router);\n return next('/404');\n }\n handle(403, router);\n next('/403');\n },\n noFoundHandler({\n router, to, from, next\n }) {\n const runtimeConfig = plugin.applyPlugins({\n key: 'layout',\n type: ApplyPluginsType.modify,\n initialValue: {}\n });\n if (runtimeConfig.noFoundHandler && typeof runtimeConfig.noFoundHandler === 'function') {\n return runtimeConfig.noFoundHandler({\n router, to, from, next\n });\n }\n if (to.path === '/403') {\n handle(403, router);\n return next('/403');\n }\n handle(404, router);\n next('/404');\n },\n ...memo\n});", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-layout/src/runtime/runtime.js", "start": 1, "end": 71, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 71, "column": 2, "position": 616 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-layout/runtime.js", "start": 1, "end": 71, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 71, "column": 2, "position": 616 } } }, { "format": "javascript", "lines": 39, "fragment": "import { plugin, ApplyPluginsType } from '@@/core/coreExports';\nimport { access, install } from './core';\n\nexport function onRouterCreated({ router }) {\n router.beforeEach(async (to, from, next) => {\n const runtimeConfig = plugin.applyPlugins({\n key: 'access',\n type: ApplyPluginsType.modify,\n initialValue: {}\n });\n if (to.matched.length === 0) {\n if (runtimeConfig.noFoundHandler && typeof runtimeConfig.noFoundHandler === 'function') {\n return runtimeConfig.noFoundHandler({\n router, to, from, next\n });\n }\n }\n let path;\n if (to.matched.length === 1) {\n path = to.matched[0].path;\n } else {\n path = to.path;\n }\n const canRoute = await access.hasAccess(path);\n if (canRoute) {\n return next();\n }\n if (runtimeConfig.unAccessHandler && typeof runtimeConfig.unAccessHandler === 'function') {\n return runtimeConfig.unAccessHandler({\n router, to, from, next\n });\n }\n next(false);\n });\n}\n\nexport function onAppCreated({ app }) {\n install(app);\n}", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-access/src/runtime/runtime.js", "start": 1, "end": 39, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 39, "column": 2, "position": 366 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-access/runtime.js", "start": 1, "end": 39, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 39, "column": 2, "position": 366 } } }, { "format": "javascript", "lines": 46, "fragment": "import { watch } from 'vue';\n\nconst cache = new WeakMap();\nconst setDispaly = (el, access) => {\n if (access.value) {\n el.style.display = el._display;\n } else {\n el.style.display = 'none';\n }\n};\nexport default function createDirective(useAccess) {\n return {\n beforeMount(el) {\n const ctx = {};\n ctx.watch = (path) => {\n el._display = el._display || el.style.display;\n const access = useAccess(path);\n setDispaly(el, access);\n return watch(access, () => {\n setDispaly(el, access);\n });\n };\n cache.set(el, ctx);\n },\n mounted(el, binding) {\n const ctx = cache.get(el);\n if (ctx.unwatch) {\n ctx.unwatch();\n }\n ctx.unwatch = ctx.watch(binding.value);\n },\n updated(el, binding) {\n const ctx = cache.get(el);\n if (ctx.unwatch) {\n ctx.unwatch();\n }\n ctx.unwatch = ctx.watch(binding.value);\n },\n beforeUnmount(el) {\n const ctx = cache.get(el);\n if (ctx.unwatch) {\n ctx.unwatch();\n }\n }\n };\n}", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-access/src/runtime/createDirective.js", "start": 1, "end": 46, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 46, "column": 2, "position": 429 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-access/createDirective.js", "start": 1, "end": 46, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 46, "column": 2, "position": 429 } } }, { "format": "javascript", "lines": 7, "fragment": "export default function createComponent(useAccess) {\n return (props, { slots }) => {\n const access = useAccess(props.id);\n if (!access.value || !slots.default) return null;\n return slots.default();\n };\n}", "tokens": 0, "firstFile": { "name": "packages/fes-plugin-access/src/runtime/createComponent.js", "start": 1, "end": 7, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 7, "column": 2, "position": 82 } }, "secondFile": { "name": "packages/fes-template/src/.fes/plugin-access/createComponent.js", "start": 1, "end": 7, "startLoc": { "line": 1, "column": 1, "position": 0 }, "endLoc": { "line": 7, "column": 2, "position": 82 } } }, { "format": "markdown", "lines": 210, "fragment": "@fesjs/plugin-request\n\n基于 axios 封装的 request,内置防止重复请求、请求节流、错误处理等功能。\n## 启用方式\n\n在 `package.json` 中引入依赖:\n```json\n{\n \"dependencies\": {\n \"@fesjs/fes\": \"^2.0.0\",\n \"@fesjs/plugin-request\": \"^2.0.0\"\n },\n}\n```\n## 配置\n\n### 构建时配置\n\n```js\nexport default {\n request: {\n dataField: 'result'\n },\n}\n```\n\n#### dataField\n\n- 类型: `string`\n- 默认值: `''`\n- 详情:\n\n `dataField` 对应接口统一格式中的数据字段,比如接口如果统一的规范是 `{ success: boolean, result: any}` ,那么就不需要配置,这样你通过 `useRequest` 消费的时候会生成一个默认的 `formatResult`,直接返回 `result` 中的数据,方便使用。如果你的后端接口不符合这个规范,可以自行配置 `dataField`。配置为 `''`(空字符串)的时候不做处理。\n\n\n#### base(即将废弃)\n\n- 类型: `string`\n- 默认值: `''`\n- 详情:\n\n `base` 接口前缀。 \n\n::: warning 即将废弃\n这个字段将在下个版本废弃,推荐使用 [axios baseURL](https://github.com/axios/axios)。\n:::\n\n### 运行时配置\n\n在 `app.js` 中进行运行时配置。\n \n```js\nexport const request = {\n // 格式化 response.data (只有 response.data 类型为 object 才会调用)\n responseDataAdaptor: (data) => {\n\n },\n // 关闭 response data 校验(只判断 xhr status)\n closeResDataCheck: false,\n // 请求拦截器\n requestInterceptors: [],\n // 相应拦截器\n responseInterceptors: [],\n // 错误处理\n // 内部以 reponse.data.code === '0' 判断请求是否成功\n // 若使用其他字段判断,可以使用 responseDataAdaptor 对响应数据进行格式\n errorHandler: {\n 11199(response) {\n // 特殊 code 处理逻辑\n },\n 404(error) {\n },\n default(error) {\n // 异常统一处理\n }\n },\n // 其他 axios 配置\n ...otherConfigs\n}\n```\n\n#### skipErrorHandler\n\n- 类型: `boolean | string | number | array`\n- 默认值: ``\n- 详情:\n\n 指定当前请求的某些错误状态不走 `errorHandler`,单独进行处理。如果设置为 `true`,当前请求的错误处理都不走 `errorHandler`。\n\n- 示列:\n\n```js\nimport {request} from '@fesjs/fes';\n\nrequest('/api/login', null, {\n skipErrorHandler: '110'\n}).then((res) => {\n // do something\n}).catch((err) => {\n // \b这里处理 code 为 110 的异常\n // 此时 errorHandler[110] 函数不会生效,也不会执行 errorHandler.default\n})\n```\n\n\n\n## 使用\n\n### 发起一个普通 post 请求\n\n```js\nimport {request} from '@fesjs/fes';\n\nrequest('/api/login', {\n username: 'robby',\n password: '123456'\n}).then((res) => {\n // do something\n}).catch((err) => {\n // 处理异常\n})\n```\n\n### merge 重复请求\n\n连续发送多个请求,会被合并成一个请求,不会报 `REPEAT` 接口错误。\n\n当发生 `REPEAT` 请求异常,并且确保自身代码合理的情况下,可以使用该配置。\n\n```js\nimport {request} from '@fesjs/fes';\n\nrequest('/api/login', {\n username: 'robby',\n password: '123456'\n}, {\n mergeRequest: true, // 在一个请求没有回来前,重复发送的请求会合并成一个请求\n}).then((res) => {\n // do something\n}).catch((err) => {\n // 处理异常\n})\n```\n\n### 请求节流(即将废弃)\n\n\n::: warning 即将废弃\n因为 request 的请求总会有一个 promise 结果,要么成功,要么失败,和防抖、节流的语义不一致,防抖、节流只是函数的不执行\n:::\n\n### 请求缓存\n\n```js\nimport {request} from '@fesjs/fes';\n\nrequest('/api/login', {\n username: 'robby',\n password: '123456'\n}, {\n cache: {\n cacheType: 'ram', // ram: 内存,session: sessionStorage,local:localStorage\n cacheTime: 1000 * 60 * 3 // 缓存时间:默认3min\n },\n}).then((res) => {\n // do something\n}).catch((err) => {\n // 处理异常\n})\n```\n\n若 `cache` 传 `true`,则默认使用 `ram` 缓存类型,缓存时间 3min。\n\n\n### 结合 use 使用\n\n```js\nimport {useRequest} from '@fesjs/fes';\n\n\nexport default {\n setup() {\n const {loading, data, error} = useRequest('/api/login', {\n username: 'robby',\n password: '123456'\n })\n\n return {\n loading,\n data,\n error\n }\n }\n}\n``", "tokens": 0, "firstFile": { "name": "docs/reference/plugin/plugins/request.md", "start": 3, "end": 212, "startLoc": { "line": 3, "column": 1, "position": 2 }, "endLoc": { "line": 212, "column": 7, "position": 586 } }, "secondFile": { "name": "docs/zh/reference/plugin/plugins/request.md", "start": 3, "end": 213, "startLoc": { "line": 3, "column": 1, "position": 2 }, "endLoc": { "line": 213, "column": 7, "position": 587 } } }, { "format": "javascript", "lines": 142, "fragment": "用加载了,但是页面没有渲染出来的情况。\n:::\n```vue\n\n \n\n\n```\n\n#### 使用 `` 组件的方式\n如果我们的路由使用 `history` 模式,那么在使用乾坤时还算方便,主应用和子应用的路由根据base可以很方便的匹配起来,而且不存在冲突。但是当我们使用 `hash` 模式时,就问题很大,主应用和子应用的路由必须一样才可以匹配上,用起来贼不方便。而且不能在一个页面上同时加载多个子应用,路由存在冲突!这时候,`` 出现了,完美解决上面的问题。\n\n\n`` 相比 `` ,需要多传入 `url` 参数,用于指定加载子应用什么路由页面。\n\n ```vue\n\n \n\n\n```\n\n## 子应用配置\n\n### 第一步:插件注册\n```js\nexport default {\n qiankun: {\n micro: {},\n }\n};\n```\n\n### 第二步:配置运行时生命周期钩子(可选)\n插件会自动为你创建好 `qiankun` 子应用需要的生命周期钩子,但是如果你想在生命周期期间加一些自定义逻辑,可以在子应用的 `src/app.js` 里导出 `qiankun` 对象,并实现每一个生命周期钩子,其中钩子函数的入参 `props` 由主应用自动注入。\n```js\nexport const qiankun = {\n // 应用加载之前\n async bootstrap(props) {\n console.log('app1 bootstrap', props);\n },\n // 应用 render 之前触发\n async mount(props) {\n console.log('app1 mount', props);\n },\n // 当 props 更新时触发\n async update(props){\n console.log('app1 update', props);\n },\n // 应用卸载之后触发\n async unmount(props) {\n console.log('app1 unmount', props);\n },\n};\n\n```\n\n## 父子应用通讯\n\n有两种方式实现\n\n### 配合 [useModel](./model.md) 使用\n\n确保已经安装了 `@fesjs/plugin-model`:\n```json\n{\n \"dependencies\": {\n \"@fesjs/fes\": \"^2.0.0\",\n \"@fesjs/plugin-model\": \"^2.0.0\"\n },\n}\n```\n\n#### 主应用传递 props\n\n- 如果使用 `MicroApp` 组件模式消费子应用,直接通过 props 传递即可:\n```vue\n\n \n\n\n```\n\n- 如果使用路由绑定式消费子应用,那么约定`src/models/qiankunStateForMicro.js` 的模型数据将作为 `props` 船体给子应用,如:\n```js\nimport { reactive } from 'vue';\n\nexport default () => {\n const state = reactive({ c: 1 });\n return {\n state\n };\n};\n```\n\n#### 子应用消费 props\n\n子应用中会自动生成一个全局名为 `qiankunSta", "tokens": 0, "firstFile": { "name": "docs/reference/plugin/plugins/qiankun.md", "start": 124, "end": 265, "startLoc": { "line": 124, "column": 2, "position": 305 }, "endLoc": { "line": 265, "column": 1, "position": 773 } }, "secondFile": { "name": "docs/zh/reference/plugin/plugins/qiankun.md", "start": 124, "end": 265, "startLoc": { "line": 124, "column": 2, "position": 305 }, "endLoc": { "line": 265, "column": 1, "position": 773 } } }, { "format": "markdown", "lines": 269, "fragment": "@fesjs/plugin-qiankun\n\nFes.js plugin for [qiankun](https://qiankun.umijs.org/),参考[@umijs/plugin-qiankun](https://umijs.org/zh-CN/plugins/plugin-qiankun#MicroApp) 实现,喜欢 React 的同学推荐直接用 Umi。\n\n## 启用方式\n在 `package.json` 中引入依赖:\n```json\n{\n \"dependencies\": {\n \"@fesjs/fes\": \"^2.0.0\",\n \"@fesjs/plugin-qiankun\": \"^2.0.0\"\n },\n}\n```\n\n## 介绍\n有一种痛叫接手老项目,技术栈老旧,内容多,还要继续维护~\n\n可能目前迁移、升级老项目最好的解决方案就是微前端。`plugin-qiankun` 是基于 `qiankun` 实现的 Fes.js 微前端解决方案。\n\n## 主应用配置\n\n### 第一步:注册子应用\n```js\nexport default {\n qiankun: {\n main: {\n // 注册子应用信息\n apps: [\n {\n name: 'app1', // 唯一 id\n entry: '//localhost:8001', // html entry\n props: {} // 传递给子应用的数据\n },\n {\n name: 'app2', // 唯一 id\n entry: '//localhost:8002', // html entry\n },\n ],\n },\n },\n};\n```\n\n### 第二步:装载子应用\n\n#### 使用路由绑定的方式\n:::warning\n主应用和子应用需要自行适配路由路径!!!待完善...\n:::\n\n假设我们的系统之前有这样的一些路由:\n```js\nexport default {\n router: {\n routes: [{\n \"path\": \"/\",\n \"component\": () => import('@/src/.fes/plugin-layout/index.js'),\n \"children\": [\n {\n \"path\": \"/onepiece\",\n \"component\": () => import('@/pages/onepiece'),\n \"name\": \"onepiece\",\n \"meta\": {\n \"name\": \"onepiece\",\n \"title\": \"onepiece\"\n }\n }\n ]\n }]\n }\n}\n```\n我们现在想在 `/son` 加载子应用 `app1`,只需要增加这样一些配置即可:\n```js {16-23}\nexport default {\n router: {\n routes: [{\n \"path\": \"/\",\n \"component\": () => import('@/src/.fes/plugin-layout/index.js'),\n \"children\": [\n {\n \"path\": \"/onepiece\",\n \"component\": () => import('@/pages/onepiece'),\n \"name\": \"onepiece\",\n \"meta\": {\n \"name\": \"onepiece\",\n \"title\": \"onepiece\"\n }\n },\n {\n \"path\": \"/son\",\n \"meta\": {\n \"name\": \"son\",\n \"title\": \"子应用\",\n \"microApp\": \"app1\"\n }\n }\n ]\n }]\n }\n}\n```\n当前我们依然提倡约定路由的方式,在`src/pages` 目录新建 `son.vue`:\n```vue\n\n{\n \"name\": \"son\",\n \"title\": \"子应用\",\n \"microApp\": \"app1\"\n}\n\n```\n\n\n#### 使用 `` 组件的方式\n:::tip\n建议使用这种方式来引入不带路由的子应用。 否则请自行关注子应用依赖的路由跟当前浏览器 url 是否能正确匹配上,否则很容易出现子应用加载了,但是页面没有渲染出来的情况。\n:::\n```vue\n\n \n\n\n```\n\n#### 使用 `` 组件的方式\n如果我们的路由使用 `history` 模式,那么在使用乾坤时还算方便,主应用和子应用的路由根据base可以很方便的匹配起来,而且不存在冲突。但是当我们使用 `hash` 模式时,就问题很大,主应用和子应用的路由必须一样才可以匹配上,用起来贼不方便。而且不能在一个页面上同时加载多个子应用,路由存在冲突!这时候,`` 出现了,完美解决上面的问题。\n\n\n`` 相比 `` ,需要多传入 `url` 参数,用于指定加载子应用什么路由页面。\n\n ```vue\n\n \n\n\n```\n\n## 子应用配置\n\n### 第一步:插件注册\n```js\nexport default {\n qiankun: {\n micro: {},\n }\n};\n```\n\n### 第二步:配置运行时生命周期钩子(可选)\n插件会自动为你创建好 `qiankun` 子应用需要的生命周期钩子,但是如果你想在生命周期期间加一些自定义逻辑,可以在子应用的 `src/app.js` 里导出 `qiankun` 对象,并实现每一个生命周期钩子,其中钩子函数的入参 `props` 由主应用自动注入。\n```js\nexport const qiankun = {\n // 应用加载之前\n async bootstrap(props) {\n console.log('app1 bootstrap', props);\n },\n // 应用 render 之前触发\n async mount(props) {\n console.log('app1 mount', props);\n },\n // 当 props 更新时触发\n async update(props){\n console.log('app1 update', props);\n },\n // 应用卸载之后触发\n async unmount(props) {\n console.log('app1 unmount', props);\n },\n};\n\n```\n\n## 父子应用通讯\n\n有两种方式实现\n\n### 配合 [useModel](./model.md) 使用\n\n确保已经安装了 `@fesjs/plugin-model`:\n```json\n{\n \"dependencies\": {\n \"@fesjs/fes\": \"^2.0.0\",\n \"@fesjs/plugin-model\": \"^2.0.0\"\n },\n}\n```\n\n#### 主应用传递 props\n\n- 如果使用 `MicroApp` 组件模式消费子应用,直接通过 props 传递即可:\n```vue\n\n \n\n\n```\n\n- 如果使用路由绑定式消费子应用,那么约定`src/models/qiankunStateForMicro.js` 的模型数据将作为 `props` 船体给子应用,如:\n```js\nimport { reactive } from 'vue';\n\nexport default () => {\n const state = reactive({ c: 1 });\n return {\n state\n };\n};\n```\n\n#### 子应用消费 props\n\n子应用中会自动生成一个全局名为 `qiankunStateFromMain` 的 `model`, 可以在任意组件中获取主应用透传的 `props` 的值。\n\n```vue\n\n```\n\n\n## API\n\n### useModel\n\n**useModel(name)**\n- **类型**:函数\n \n", "tokens": 0, "firstFile": { "name": "docs/reference/plugin/plugins/model.md", "start": 4, "end": 66, "startLoc": { "line": 4, "column": 1, "position": 3 }, "endLoc": { "line": 66, "column": 4, "position": 266 } }, "secondFile": { "name": "docs/zh/reference/plugin/plugins/model.md", "start": 4, "end": 66, "startLoc": { "line": 4, "column": 1, "position": 3 }, "endLoc": { "line": 66, "column": 4, "position": 266 } } }, { "format": "markdown", "lines": 45, "fragment": "fesjs/plugin-locale\n\n## 介绍\n国际化插件,基于 [Vue I18n](https://github.com/intlify/vue-i18n-next),用于解决 i18n 问题。\n## 启用方式\n在 `package.json` 中引入依赖:\n```json\n{\n \"dependencies\": {\n \"@fesjs/fes\": \"^2.0.0\",\n \"@fesjs/plugin-locale\": \"^2.0.0\"\n },\n}\n```\n\n\n## 配置\n\n### 约定式配置\nFes.js 约定如下目录,项目就拥有了 `zh-CN` 与 `en-US` 国际化语言切换:\n```\nsrc\n ├── locales\n │ ├── zh-CN.js\n │ └── en-US.js\n └── pages\n │ └── index.vue\n └── app.js\n```\n多语言文件的命名规范:`-.js`\n\n多语言文件的内容规范:键值组成的字面量,如下:\n```js\n// src/locales/zh-CN.js\nexport default {\n menu: {\n interface: '接口'\n },\n overview: '概述',\n i18n: {\n internationalization: '国际化,基于',\n achieve: '实现。',\n ui: '", "tokens": 0, "firstFile": { "name": "docs/reference/plugin/plugins/locale.md", "start": 4, "end": 48, "startLoc": { "line": 4, "column": 1, "position": 3 }, "endLoc": { "line": 48, "column": 21, "position": 138 } }, "secondFile": { "name": "docs/zh/reference/plugin/plugins/locale.md", "start": 4, "end": 48, "startLoc": { "line": 4, "column": 1, "position": 3 }, "endLoc": { "line": 48, "column": 21, "position": 138 } } }, { "format": "markdown", "lines": 154, "fragment": "I组件'\n }\n};\n```\n```js\n// src/locales/zh-CN.js\nexport default {\n menu: {\n interface: 'interface'\n },\n overview: 'Overview',\n i18n: {\n internationalization: 'internationalization,base on',\n achieve: 'to achieve.',\n ui: 'UI components'\n }\n};\n```\n想了解更多语言信息配置、匹配规则,请参考 [Vue I18n](https://vue-i18n.intlify.dev/guide/essentials/syntax.html) 文档。\n\n\n### 编译时配置\n在执行 `fes dev` 或者 `fes build` 时,通过此配置生成运行时的代码,在配置文件`.fes.js` 中配置:\n```js\nexport default {\n locale: {\n }\n}\n```\n默认配置为:\n```js\nexport default {\n locale: {\n locale: 'zh-CN', // default locale\n fallbackLocale: 'zh-CN', // set fallback locale\n baseNavigator: true, // 开启浏览器语言检测\n share: true, // 用户是否需要手动改变语言\n }\n} \n```\n所有配置项如下:\n\n#### locale\n- **类型**:`String`\n \n- **默认值**:`zh-CN`\n\n- **详情**:当前的语言。\n\n#### fallbackLocale\n- **类型**:`String`\n \n- **默认值**:`zh-CN`\n\n- **详情**:兜底的语言,如果当前语言找不到配置,则使用默认语言,需要保证默认语言配置文件存在。\n\n#### baseNavigator\n- **类型**:`Boolean`\n \n- **默认值**:`true`\n\n- **详情**:开启浏览器语言检测。\n\n默认情况下,当前语言环境的识别按照:`localStorage` 中 `fes_locale` 值 > 浏览器检测 > `default` 设置的默认语言 > `zh-CN` 中文。\n\n#### share\n- **类型**:`Boolean`\n \n- **默认值**:`true`\n\n- **详情**:是否共享API,共享语言选择器 `{ SelectLang } `,其他插件可以获取到共享内容。\n \n比如:\n```js\nimport { plugin } from \"@@/core/coreExports\";\nconst localeShared = plugin.getShared(\"locale\");\n```\n\n\n### 运行时配置\n暂无。\n\n## API\n\n### locale\n插件 API 通过 `@fesjs/fes` 导出:\n```js\nimport { locale } from '@fesjs/fes'\n```\n\n#### locale.messages\n- **类型**:`Object`\n \n- **详情**:当前的配置的语言信息。\n\n#### locale.setLocale\n- **类型**:`Function`\n \n- **详情**:设置当前的语言。\n- **参数**:\n - locale,语言的名称,应该是符合 `-` 规范的名称。\n- **返回值**:`null`\n```js\nimport { locale } from '@fesjs/fes';\nlocale.setLocale({ locale: 'en-US' });\n```\n\n#### locale.addLocale\n- **类型**:`Function`\n \n- **详情**:手动添加语言配置。\n- **参数**:\n - locale,语言的名称,符合 `-` 规范的名称。\n - messages, 语言信息。\n- **返回值**:`null`\n```js\nimport { locale } from '@fesjs/fes'\nlocale.addLocale({ locale: 'ja-JP', messages: { test: 'テスト' } });\n```\n\n\n#### locale.getAllLocales\n- **类型**:`Function`\n \n- **详情**:获取当前获得所有国际化文件的列表,默认会在 locales 文件夹下寻找类似 `en-US.js` 文件。\n- **参数**:null\n- **返回值**:`Array`\n```js\nimport { locale } from '@fesjs/fes';\nconsole.log(locale.getAllLocales());\n// [\"en-US\", \"id-ID\", \"ja-JP\", \"pt-BR\", \"zh-CN\", \"zh-TW\"]\n```\n\n\n### useI18n\nComposition API, 只能在 `setup` 函数中使用,更多细节参考 [Vue I18n](https://vue-i18n.intlify.dev/api/composition.html#usei18n)。\n\b举个 🌰:\n```vue\n\n \n {{ t('language') }}\n \n message: {{ t('hello') }}\n\n\n\n\n```\n## API\n### get\n* `get(name: string)` 获取指定名字的枚举\n\n* `get(name: string, key: string)` 获取指定名字及键枚举默认值\n\n* `get(name: string, opt: {extend: Array})` 获取指定名字的自定义格式枚举,[查看extend配置](#extend配置)\n\n* `get(name: string, key: string, opt: {dir: string})` 获取指定名字及键枚举[dir规则](#dir规则)的值\n\n```js\nget('status')\nget('status', '1')\nget('status', {\n extend: [\n {\n key: 'name',\n dir: 'value',\n },\n {\n key: 'disabled',\n transfer: item => item === '0'\n }\n ]\n})\nget('status', '1', {dir: 'value'})\n```\n\n### push\n动态添加枚举,重复添加会覆盖\n* `push(name: string, _enum: Array)`\n* `push(name: string, _enum: Array, opt?: Object)`\n * opt.keyName 指定key的取值属性,默认是key\n * opt.valueName 指定value的取值属性\n\n枚举项为数组,枚举项的[0]解析为key,枚举项的[1]解析为value\n\n枚举项为对象时,根据opt配置keyName、valueName取枚举项属性值分别作为key和value,`如果valueName未设置则value就是枚举项`\n\n### remove\n* remove(name: string)\n\n移除指定的枚举\n### concat\n基于现有的枚举,连接上新的枚举后返回新的枚举\n* `concat(name: string, _enum: Array, opt?: Object))`\n * opt.keyName 指定key的取值属性,默认是key\n * opt.valueName 指定value的取值属性\n * opt.before 是否添加在现有的之前,默认是false\n * opt.extend:返回的枚举[extend配置](#extend配置)\n\n### convert\n将传入的枚举格式转换为{key, value}的形式\n* `convert(name: string, _enum: Array, opt?: Object))`\n * opt.keyName 指定key的取值属性,默认是key\n * opt.valueName 指定value的取值属性\n\n### extend配置\n扩展枚举项属性的配置\n* `extend: Array`\n * `key` 指定扩展的属性名\n * `dir` 指定该属性的取值路径\n * `transfer(item: {key: any, value: any})` 转换函数,参数未枚举项,返回就是该属性的值\n::: tip\n同时设置[dir](#dir规则)和transfer,transfer优先\n:::\n\n```js\nget('status', {\n extend: [\n {\n key: 'name',\n dir: 'value',\n },\n {\n key: 'disabled',\n transfer: item => item.key === '0'\n }\n ]\n})\n```\n\n\n### dir规则\ndir是指定枚举项value的取值方式,规则如下:\n* 对象属性 `A`、`A.B`\n* 数组 `[0]`、`[0][1]`\n* 混合 `A[0]`、`[0].A`、`A[0].B`\n\n```js\n// 假如枚举项value的结构如下\nconst user = {\n age: 18,\n name: 'aring',\n role: [\n {\n id: 1,\n name: '管理员'\n },\n {\n id: 2,\n name: '业务操作员'\n }\n ]\n}\n// 那么规则解析是:\ndir ", "tokens": 0, "firstFile": { "name": "docs/reference/plugin/plugins/enums.md", "start": 3, "end": 226, "startLoc": { "line": 3, "column": 1, "position": 2 }, "endLoc": { "line": 226, "column": 4, "position": 713 } }, "secondFile": { "name": "docs/zh/reference/plugin/plugins/enums.md", "start": 3, "end": 226, "startLoc": { "line": 3, "column": 1, "position": 2 }, "endLoc": { "line": 226, "column": 4, "position": 713 } } }, { "format": "javascript", "lines": 14, "fragment": "ditor \n v-model=\"json\"\n language=\"json\"\n height=\"400px\"\n check>\n \n\n\n```\n\n#### props\n| 属性 | 说明 | 类型 | 默认值 |\n| ------------- | ------------- | ------------- | ------------- |\n| theme | 编辑器的主题,使用其他主题需要先使用`monaco.editor.defineTheme`定义主题 | string | `defaultTheme` |\n| language | 编辑器的语言 | string | - |\n| height | 编辑器的高度 | string | `100%` |\n| width | 编辑器的宽度 | string | `100%` |\n| modelValue(v-model) | 编辑器的代码 | string | - |\n| readOnly | 是否只读 | boolean | `false` |\n| options | 编辑器的配置对象 | object | `{}` |\n| check | 是否检查代码,如果检查不通过则不更新数据,目前只支持`json` | boolean | `false` |\n\n#### events\n\n| 事件名称 | 说明 | 回调参数 |\n| ", "tokens": 0, "firstFile": { "name": "docs/reference/plugin/plugins/editor.md", "start": 5, "end": 120, "startLoc": { "line": 5, "column": 1, "position": 4 }, "endLoc": { "line": 120, "column": 2, "position": 578 } }, "secondFile": { "name": "docs/zh/reference/plugin/plugins/editor.md", "start": 5, "end": 120, "startLoc": { "line": 5, "column": 1, "position": 4 }, "endLoc": { "line": 120, "column": 2, "position": 578 } } }, { "format": "javascript", "lines": 263, "fragment": "cess2 \n\n\n```\n\n\n### 匹配规则\n\n#### 全等匹配\n资源的匹配规则默认是使用全等匹配,比如页面 `pages/a.vue` 对应路由 `path` 是 `/a`,则 `/a` 就是页面的资源ID。如果我们设置:\n```js\naccess.setAccess(['/a'])\n```\n由于权限列表中包含`/a`,则表示拥有此页面权限。\n\n#### 模糊匹配\n页面`@id.vue`会映射为动态路由`/:id`,想匹配此页面有两种办法:\n- **access.setAccess(['/:id'])**\n- **access.setAccess(['/*'])**\n\n第二种是模糊匹配,`*`表示任意路径。比如角色`admin`需要全部权限,则可以:\n```js\nexport default {\n access: {\n roles: {\n admin: [\"*\"]\n }\n }\n}\n```\n\n\n### 角色\n通常我们会用角色来控制权限,相应的Fes.js 用角色定义一组资源。当访问 Fes.js 应用时,使用插件提供的 API 设置用户的角色,角色对应的资源才可见,非角色对应的资源不可见。\n\n\n当然有时候业务比较复杂,角色对应的权限是动态的。不要怕!插件提供粒度更细的 API 来设置当前用户能访问的资源。\n\n\n## 启用方式\n在 `package.json` 中引入依赖:\n```json\n{\n \"dependencies\": {\n \"@fesjs/fes\": \"^2.0.0\",\n \"@fesjs/plugin-access\": \"^2.0.0\"\n },\n}\n```\n\n## 配置\n\n### 编译时配置\n在执行 `fes dev` 或者 `fes build` 时,通过此配置生成运行时的代码,在配置文件`.fes.js` 中配置:\n```js\nexport default {\n access: {\n roles: {\n admin: [\"/\", \"/onepiece\", '/store']\n }\n }\n}\n```\n\n#### roles\n- **类型**:对象\n \n- **默认值**:`{}`\n\n- **详情**: \n \n 角色预定义列表。`key` 是角色 Id ,`value`是角色 Id 对应的资源列表。\n\n\n### 运行时配置\n在 `app.js` 中配置\n\n#### unAccessHandler\n- **类型**:`Function`\n \n- **默认值**:`null`\n\n- **详情**: \n \n 当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 `unAccessHandler` 函数。\n- **参数**\n - router:createRouter 创建的路由实例\n - to: 准备进入的路由\n - from:离开的路由\n - next: [next函数](https://next.router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%8F%AF%E9%80%89%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%8F%82%E6%95%B0-next)\n\n比如:\n```js\nexport const access = {\n unAccessHandler({ to, next }) {\n const accesssIds = accessApi.getAccess();\n if (to.path === '/404') {\n accessApi.setAccess(accesssIds.concat(['/404']));\n return next('/404');\n }\n if (!accesssIds.includes('/403')) {\n accessApi.setAccess(accesssIds.concat(['/403']));\n }\n next('/403');\n }\n};\n\n```\n\n#### noFoundHandler\n- **类型**:`Function`\n \n- **默认值**:`null`\n\n- **详情**: \n \n 当进入某个路由时,如果路由对应的页面不存在,则会调用 `noFoundHandler` 函数。\n- **参数**\n - router:createRouter 创建的路由实例\n - to: 准备进入的路由\n - from:离开的路由\n - next: [next函数](https://next.router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%8F%AF%E9%80%89%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%8F%82%E6%95%B0-next)\n\n比如:\n```js\nexport const access = {\n noFoundHandler({ next }) {\n const accesssIds = accessApi.getAccess();\n if (!accesssIds.includes('/404')) {\n accessApi.setAccess(accesssIds.concat(['/404']));\n }\n next('/404');\n }\n};\n\n```\n\n## API\n\n### access\n插件 API 通过 `@fesjs/fes` 导出:\n```js\nimport { access } from '@fesjs/fes'\n```\n\n#### access.hasAccess\n- **类型**:函数\n \n- **详情**: 判断某个资源是否可见。\n- **参数**:\n - accessId,资源Id\n- **返回值**:Boolean\n\n#### access.isDataReady\n- **类型**:函数\n \n- **详情**:可以用异步数据来设置权限,`isDataReady` 用来判断异步数据是否已经加载完毕。\n- **参数**:null\n- **返回值**:Boolean\n```js\nimport { access } from '@fesjs/fes';\nconsole.log(access.isDataReady())\n```\n\n#### access.setRole\n- **类型**:函数\n \n- **详情**:设置当前的角色。\n- **参数**:\n - roleId,角色Id,有两种类型:\n - String,对应着 `roles` 配置对象中的 `key`。\n - Promise,Promise resolve 的结果应对应着 `roles` 配置对象中的 `key`。\n```js\nimport { access } from '@fesjs/fes';\naccess.setRole(['admin'])\n```\n\n#### access.setAccess\n- **类型**:函数\n \n- **详情**:设置当前的角色。\n- **参数**:\n - accessIds,资源Id数组,有两种类型:\n - Array,数组项对应着 `roles` 配置对象中的 `key`。\n - Promise,Promise resolve 的结果应该是`Array`。\n```js\nimport { access } from '@fesjs/fes';\naccess.setAccess(['/a', '/b', '/c'])\n```\n\n#### access.getAccess\n- **类型**:函数\n \n- **详情**:返回当前可见的资源列表。\n- **参数**:null\n\n```js\nimport { access } from '@fesjs/fes';\naccess.getAccess();\n```\n\n### useAccess\n- **类型**:[composition]((https://v3.cn.vuejs.org/guide/composition-api-introduction.html)) 函数\n \n- **详情**:判断某个资源是否可见。\n- **参数**:\n - accessId,资源Id\n- **返回值**:`ref`\n \n```vue\n\n accessOnepicess\n\n\n```\n### v-access\n在指令 `v-access` 中传入 `accessId`,则当 `accessId` 拥有权限时显示DOM,当没有权限时隐藏此DOM。\n```vue\n\n accessOnepicess \n\n\n```\n\n\n### 匹配规则\n\n#### 全等匹配\n资源的匹配规则默认是使用全等匹配,比如页面 `pages/a.vue` 对应路由 `path` 是 `/a`,则 `/a` 就是页面的资源ID。如果我们设置:\n```js\naccess.setAccess(['/a'])\n```\n由于权限列表中包含`/a`,则表示拥有此页面权限。\n\n#### 模糊匹配\n页面`@id.vue`会映射为动态路由`/:id`,想匹配此页面有两种办法:\n- **access.setAccess(['/:id'])**\n- **access.setAccess(['/*'])**\n\n第二种是模糊匹配,`*`表示任意路径。比如角色`admin`需要全部权限,则可以:\n```js\nexport default {\n access: {\n roles: {\n admin: [\"*\"]\n }\n }\n}\n```\n\n\n### 角色\n通常我们会用角色来控制权限,相应的Fes.js 用角色定义一组资源。当访问 Fes.js 应用时,使用插件提供的 API 设置用户的角色,角色对应的资源才可见,非角色对应的资源不可见。\n\n\n当然有时候业务比较复杂,角色对应的权限是动态的。不要怕!插件提供粒度更细的 API 来设置当前用户能访问的资源。\n\n\n## 启用方式\n在 `package.json` 中引入依赖:\n```json\n{\n \"dependencies\": {\n \"@fesjs/fes\": \"^2.0.0\",\n \"@fesjs/plugin-access\": \"^2.0.0\"\n },\n}\n```\n\n## 配置\n\n### 编译时配置\n在执行 `fes dev` 或者 `fes build` 时,通过此配置生成运行时的代码,在配置文件`.fes.js` 中配置:\n```js\nexport default {\n access: {\n roles: {\n admin: [\"/\", \"/onepiece\", '/store']\n }\n }\n}\n```\n\n#### roles\n- **类型**:对象\n \n- **默认值**:`{}`\n\n- **详情**: \n \n 角色预定义列表。`key` 是角色 Id ,`value`是角色 Id 对应的资源列表。\n\n\n### 运行时配置\n在 `app.js` 中配置\n\n#### unAccessHandler\n- **类型**:`Function`\n \n- **默认值**:`null`\n\n- **详情**: \n \n 当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 `unAccessHandler` 函数。\n- **参数**\n - router:createRouter 创建的路由实例\n - to: 准备进入的路由\n - from:离开的路由\n - next: [next函数](https://next.router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%8F%AF%E9%80%89%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%8F%82%E6%95%B0-next)\n\n比如:\n```js\nexport const access = {\n unAccessHandler({ to, next }) {\n const accesssIds = accessApi.getAccess();\n if (to.path === '/404') {\n accessApi.setAccess(accesssIds.concat(['/404']));\n return next('/404');\n }\n if (!accesssIds.includes('/403')) {\n accessApi.setAccess(accesssIds.concat(['/403']));\n }\n next('/403');\n }\n};\n\n```\n\n#### noFoundHandler\n- **类型**:`Function`\n \n- **默认值**:`null`\n\n- **详情**: \n \n 当进入某个路由时,如果路由对应的页面不存在,则会调用 `noFoundHandler` 函数。\n- **参数**\n - router:createRouter 创建的路由实例\n - to: 准备进入的路由\n - from:离开的路由\n - next: [next函数](https://next.router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%8F%AF%E9%80%89%E7%9A%84%E7%AC%AC%E4%B8%89%E4%B8%AA%E5%8F%82%E6%95%B0-next)\n\n比如:\n```js\nexport const access = {\n noFoundHandler({ next }) {\n const accesssIds = accessApi.getAccess();\n if (!accesssIds.includes('/404')) {\n accessApi.setAccess(accesssIds.concat(['/404']));\n }\n next('/404');\n }\n};\n\n```\n\n## API\n\n### access\n插件 API 通过 `@fesjs/fes` 导出:\n```js\nimport { access } from '@fesjs/fes'\n```\n\n#### access.hasAccess\n- **类型**:函数\n \n- **详情**: 判断某个资源是否可见。\n- **参数**:\n - accessId,资源Id\n- **返回值**:Boolean\n\n#### access.isDataReady\n- **类型**:函数\n \n- **详情**:可以用异步数据来设置权限,`isDataReady` 用来判断异步数据是否已经加载完毕。\n- **参数**:null\n- **返回值**:Boolean\n```js\nimport { access } from '@fesjs/fes';\nconsole.log(access.isDataReady())\n```\n\n#### access.setRole\n- **类型**:函数\n \n- **详情**:设置当前的角色。\n- **参数**:\n - roleId,角色Id,有两种类型:\n - String,对应着 `roles` 配置对象中的 `key`。\n - Promise,Promise resolve 的结果应对应着 `roles` 配置对象中的 `key`。\n```js\nimport { access } from '@fesjs/fes';\naccess.setRole(['admin'])\n```\n\n#### access.setAccess\n- **类型**:函数\n \n- **详情**:设置当前的角色。\n- **参数**:\n - accessIds,资源Id数组,有两种类型:\n - Array,数组项对应着 `roles` 配置对象中的 `key`。\n - Promise,Promise resolve 的结果应该是`Array`。\n```js\nimport { access } from '@fesjs/fes';\naccess.setAccess(['/a', '/b', '/c'])\n```\n\n#### access.getAccess\n- **类型**:函数\n \n- **详情**:返回当前可见的资源列表。\n- **参数**:null\n\n```js\nimport { access } from '@fesjs/fes';\naccess.getAccess();\n```\n\n### useAccess\n- **类型**:[composition]((https://v3.cn.vuejs.org/guide/composition-api-introduction.html)) 函数\n \n- **详情**:判断某个资源是否可见。\n- **参数**:\n - accessId,资源Id\n- **返回值**:`ref`\n \n```vue\n\n accessOnepicess\n\n\n```\n### v-access\n在指令 `v-access` 中传入 `accessId`,则当 `accessId` 拥有权限时显示DOM,当没有权限时隐藏此DOM。\n```vue\n\n accessOnepicess \n\n
message: {{ t('hello') }}