From 9ec2a55427a00719edb2627157a4be1f61df54a6 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Sun, 25 Jul 2021 16:29:43 +0800 Subject: [PATCH] feat(uni-cloud): support validateFunction --- .prettierignore | 7 ++- .../uni-app-plus/dist/uni-app-service.es.js | 47 +++++++++++++++++++ packages/uni-cloud/lib/uni.plugin.js | 2 + packages/uni-cloud/lib/validateFunction.js | 16 +++++++ packages/uni-h5/dist/uni-h5.cjs.js | 42 +++++++++++++++++ packages/uni-h5/dist/uni-h5.es.js | 42 +++++++++++++++++ packages/vite-plugin-uni/src/config/index.ts | 3 +- .../vite-plugin-uni/src/config/resolve.ts | 8 ++-- packages/vite-plugin-uni/src/index.ts | 2 + .../vite-plugin-uni/src/resolveId/index.ts | 16 +++++++ 10 files changed, 178 insertions(+), 7 deletions(-) create mode 100644 packages/uni-cloud/lib/validateFunction.js create mode 100644 packages/vite-plugin-uni/src/resolveId/index.ts diff --git a/.prettierignore b/.prettierignore index 90d45b85a..07e3cd247 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,7 @@ dist -lib \ No newline at end of file +packages/uni-app-vite/lib +packages/uni-app-vue/lib +packages/uni-cli-nvue/lib +packages/uni-cli-shared/lib +packages/uni-components/lib +packages/uni-mp-vue/lib \ No newline at end of file diff --git a/packages/uni-app-plus/dist/uni-app-service.es.js b/packages/uni-app-plus/dist/uni-app-service.es.js index af71bf453..42049c0ab 100644 --- a/packages/uni-app-plus/dist/uni-app-service.es.js +++ b/packages/uni-app-plus/dist/uni-app-service.es.js @@ -8136,12 +8136,59 @@ var serviceContext = (function (vue) { } } + function b64DecodeUnicode(str) { + return decodeURIComponent(atob(str) + .split('') + .map(function (c) { + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); + }) + .join('')); + } + function getCurrentUserInfo() { + const token = uni.getStorageSync('uni_id_token') || ''; + const tokenArr = token.split('.'); + if (!token || tokenArr.length !== 3) { + return { + uid: null, + role: [], + permission: [], + tokenExpired: 0, + }; + } + let userInfo; + try { + userInfo = JSON.parse(b64DecodeUnicode(tokenArr[1])); + } + catch (error) { + throw new Error('获取当前用户信息出错,详细错误信息为:' + error.message); + } + userInfo.tokenExpired = userInfo.exp * 1000; + delete userInfo.exp; + delete userInfo.iat; + return userInfo; + } + function uniIdMixin(globalProperties) { + globalProperties.uniIDHasRole = function (roleId) { + const { role } = getCurrentUserInfo(); + return role.indexOf(roleId) > -1; + }; + globalProperties.uniIDHasPermission = function (permissionId) { + const { permission } = getCurrentUserInfo(); + return this.uniIDHasRole('admin') || permission.indexOf(permissionId) > -1; + }; + globalProperties.uniIDTokenValid = function () { + const { tokenExpired } = getCurrentUserInfo(); + return tokenExpired > Date.now(); + }; + } + function initApp(app) { const appConfig = app._context.config; if (isFunction(app._component.onError)) { appConfig.errorHandler = errorHandler; } const globalProperties = appConfig.globalProperties; + uniIdMixin(globalProperties); { globalProperties.$set = set; globalProperties.$applyOptions = applyOptions; diff --git a/packages/uni-cloud/lib/uni.plugin.js b/packages/uni-cloud/lib/uni.plugin.js index 18d17844e..5daed3acd 100644 --- a/packages/uni-cloud/lib/uni.plugin.js +++ b/packages/uni-cloud/lib/uni.plugin.js @@ -3,6 +3,7 @@ const { COMMON_EXCLUDE, uniViteInjectPlugin, } = require('@dcloudio/uni-cli-shared') +const { uniValidateFunctionPlugin } = require('./validateFunction') /** * @type {import('vite').Plugin} */ @@ -115,4 +116,5 @@ module.exports = [ exclude: [...COMMON_EXCLUDE], uniCloud: ['@dcloudio/uni-cloud', 'default'], }), + uniValidateFunctionPlugin(), ] diff --git a/packages/uni-cloud/lib/validateFunction.js b/packages/uni-cloud/lib/validateFunction.js new file mode 100644 index 000000000..f7e4a098c --- /dev/null +++ b/packages/uni-cloud/lib/validateFunction.js @@ -0,0 +1,16 @@ +function replaceModuleExports(code) { + return code.replace(/module\.exports\s*=/, 'export default ') +} +module.exports = { + uniValidateFunctionPlugin() { + return { + name: 'vite:uni-cloud-vf', + enforce: 'pre', + transform(code, id) { + if (id.includes('validator/validateFunction')) { + return replaceModuleExports(code) + } + }, + } + }, +} diff --git a/packages/uni-h5/dist/uni-h5.cjs.js b/packages/uni-h5/dist/uni-h5.cjs.js index f8f3b6e28..e5ce54d6f 100644 --- a/packages/uni-h5/dist/uni-h5.cjs.js +++ b/packages/uni-h5/dist/uni-h5.cjs.js @@ -6560,12 +6560,54 @@ function errorHandler(err, instance, info) { invokeHook(app.$vm, uniShared.ON_ERROR, err); } } +function b64DecodeUnicode(str) { + return decodeURIComponent(atob(str).split("").map(function(c) { + return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2); + }).join("")); +} +function getCurrentUserInfo() { + const token = uni.getStorageSync("uni_id_token") || ""; + const tokenArr = token.split("."); + if (!token || tokenArr.length !== 3) { + return { + uid: null, + role: [], + permission: [], + tokenExpired: 0 + }; + } + let userInfo; + try { + userInfo = JSON.parse(b64DecodeUnicode(tokenArr[1])); + } catch (error) { + throw new Error("\u83B7\u53D6\u5F53\u524D\u7528\u6237\u4FE1\u606F\u51FA\u9519\uFF0C\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F\u4E3A\uFF1A" + error.message); + } + userInfo.tokenExpired = userInfo.exp * 1e3; + delete userInfo.exp; + delete userInfo.iat; + return userInfo; +} +function uniIdMixin(globalProperties) { + globalProperties.uniIDHasRole = function(roleId) { + const { role } = getCurrentUserInfo(); + return role.indexOf(roleId) > -1; + }; + globalProperties.uniIDHasPermission = function(permissionId) { + const { permission } = getCurrentUserInfo(); + return this.uniIDHasRole("admin") || permission.indexOf(permissionId) > -1; + }; + globalProperties.uniIDTokenValid = function() { + const { tokenExpired } = getCurrentUserInfo(); + return tokenExpired > Date.now(); + }; +} function initApp$1(app) { const appConfig = app._context.config; if (shared.isFunction(app._component.onError)) { appConfig.errorHandler = errorHandler; } const globalProperties = appConfig.globalProperties; + uniIdMixin(globalProperties); { globalProperties.$set = set; globalProperties.$applyOptions = applyOptions; diff --git a/packages/uni-h5/dist/uni-h5.es.js b/packages/uni-h5/dist/uni-h5.es.js index 10f107052..6b91b95cd 100644 --- a/packages/uni-h5/dist/uni-h5.es.js +++ b/packages/uni-h5/dist/uni-h5.es.js @@ -13113,12 +13113,54 @@ function errorHandler(err, instance2, info) { invokeHook(app.$vm, ON_ERROR, err); } } +function b64DecodeUnicode(str) { + return decodeURIComponent(atob(str).split("").map(function(c) { + return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2); + }).join("")); +} +function getCurrentUserInfo() { + const token = uni.getStorageSync("uni_id_token") || ""; + const tokenArr = token.split("."); + if (!token || tokenArr.length !== 3) { + return { + uid: null, + role: [], + permission: [], + tokenExpired: 0 + }; + } + let userInfo; + try { + userInfo = JSON.parse(b64DecodeUnicode(tokenArr[1])); + } catch (error) { + throw new Error("\u83B7\u53D6\u5F53\u524D\u7528\u6237\u4FE1\u606F\u51FA\u9519\uFF0C\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F\u4E3A\uFF1A" + error.message); + } + userInfo.tokenExpired = userInfo.exp * 1e3; + delete userInfo.exp; + delete userInfo.iat; + return userInfo; +} +function uniIdMixin(globalProperties) { + globalProperties.uniIDHasRole = function(roleId) { + const { role } = getCurrentUserInfo(); + return role.indexOf(roleId) > -1; + }; + globalProperties.uniIDHasPermission = function(permissionId) { + const { permission } = getCurrentUserInfo(); + return this.uniIDHasRole("admin") || permission.indexOf(permissionId) > -1; + }; + globalProperties.uniIDTokenValid = function() { + const { tokenExpired } = getCurrentUserInfo(); + return tokenExpired > Date.now(); + }; +} function initApp$1(app) { const appConfig = app._context.config; if (isFunction(app._component.onError)) { appConfig.errorHandler = errorHandler; } const globalProperties = appConfig.globalProperties; + uniIdMixin(globalProperties); { globalProperties.$set = set; globalProperties.$applyOptions = applyOptions; diff --git a/packages/vite-plugin-uni/src/config/index.ts b/packages/vite-plugin-uni/src/config/index.ts index 09ea17d36..4047c7b3d 100644 --- a/packages/vite-plugin-uni/src/config/index.ts +++ b/packages/vite-plugin-uni/src/config/index.ts @@ -1,5 +1,4 @@ -import path from 'path' -import { Plugin, UserConfig } from 'vite' +import { Plugin } from 'vite' import { // initPreContext, diff --git a/packages/vite-plugin-uni/src/config/resolve.ts b/packages/vite-plugin-uni/src/config/resolve.ts index 6b7e3736c..acfad9616 100644 --- a/packages/vite-plugin-uni/src/config/resolve.ts +++ b/packages/vite-plugin-uni/src/config/resolve.ts @@ -7,10 +7,10 @@ export function createResolve( _config: UserConfig ): UserConfig['resolve'] { return { - alias: { - '@': '', - '~@': '', // src: url('~@/static/uni.ttf') format('truetype'); - }, + // alias: { + // '@': '', + // '~@': '', // src: url('~@/static/uni.ttf') format('truetype'); + // }, extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json'].concat( EXTNAME_VUE ), diff --git a/packages/vite-plugin-uni/src/index.ts b/packages/vite-plugin-uni/src/index.ts index 3c3ec0f11..a2a9dedf0 100644 --- a/packages/vite-plugin-uni/src/index.ts +++ b/packages/vite-plugin-uni/src/index.ts @@ -14,6 +14,7 @@ import { createConfigResolved } from './configResolved' import { createConfigureServer } from './configureServer' import { initExtraPlugins } from './utils' import { initPluginVueOptions } from './vue' +import { createResolveId } from './resolveId' const debugUni = debug('vite:uni:plugin') @@ -92,6 +93,7 @@ export default function uniPlugin( plugins.push({ name: 'vite:uni', config: createConfig(options, uniPlugins), + resolveId: createResolveId(options), configResolved: createConfigResolved(options), configureServer: createConfigureServer(options), }) diff --git a/packages/vite-plugin-uni/src/resolveId/index.ts b/packages/vite-plugin-uni/src/resolveId/index.ts new file mode 100644 index 000000000..9d5d97166 --- /dev/null +++ b/packages/vite-plugin-uni/src/resolveId/index.ts @@ -0,0 +1,16 @@ +import slash from 'slash' +import { Plugin } from 'vite' +import { VitePluginUniResolvedOptions } from '..' + +export function createResolveId( + options: VitePluginUniResolvedOptions +): Plugin['resolveId'] { + const inputDir = slash(options.inputDir) + return function (id) { + if (id.startsWith('@/')) { + return inputDir + id.substr(1) + } else if (id.startsWith('~@/')) { + return inputDir + id.substr(2) + } + } +} -- GitLab