@tdesign/uniapp 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/README.md +43 -34
- package/dist/action-sheet/README.md +8 -3
- package/dist/avatar/README.md +3 -1
- package/dist/back-top/README.md +3 -1
- package/dist/badge/README.en-US.md +1 -0
- package/dist/badge/README.md +4 -1
- package/dist/badge/badge.css +1 -1
- package/dist/button/README.md +3 -1
- package/dist/button/button.vue +5 -0
- package/dist/calendar/README.md +3 -1
- package/dist/calendar/calendar.vue +6 -2
- package/dist/cascader/README.md +3 -1
- package/dist/cell/README.md +3 -1
- package/dist/checkbox/README.md +3 -1
- package/dist/col/README.md +3 -1
- package/dist/collapse/README.md +3 -1
- package/dist/color-picker/README.md +3 -1
- package/dist/common/common.ts +121 -5
- package/dist/common/src/index.js +0 -1
- package/dist/common/style/theme/index-light.css +282 -0
- package/dist/common/style/theme/index-light.less +9 -0
- package/dist/common/style/theme/raw/_components-light.less +8 -0
- package/dist/common/style/theme/raw/_light-only.less +181 -0
- package/dist/common/validator.ts +496 -0
- package/dist/config-provider/README.md +3 -1
- package/dist/count-down/README.md +3 -1
- package/dist/date-time-picker/README.md +3 -1
- package/dist/dialog/README.md +3 -1
- package/dist/divider/README.md +3 -1
- package/dist/drawer/README.md +3 -1
- package/dist/dropdown-item/dropdown-item.vue +2 -0
- package/dist/dropdown-menu/README.md +2 -2
- package/dist/dropdown-menu/dropdown-menu.vue +1 -1
- package/dist/empty/README.md +3 -1
- package/dist/fab/README.md +3 -1
- package/dist/fab/fab.vue +2 -2
- package/dist/fab/props.ts +1 -1
- package/dist/fab/type.ts +1 -1
- package/dist/footer/README.md +3 -1
- package/dist/form/README.en-US.md +2 -2
- package/dist/form/README.md +5 -3
- package/dist/form/form.vue +1 -1
- package/dist/form/type.ts +3 -3
- package/dist/form-item/form-item.css +6 -2
- package/dist/form-item/form-item.vue +30 -24
- package/dist/form-item/type.ts +2 -2
- package/dist/grid/README.md +3 -1
- package/dist/guide/README.md +3 -1
- package/dist/icon/README.md +10 -7
- package/dist/icon/icon.css +1633 -1624
- package/dist/image/README.md +3 -1
- package/dist/image-viewer/README.md +3 -1
- package/dist/index.js +13 -0
- package/dist/indexes/README.md +3 -1
- package/dist/indexes/computed.js +6 -2
- package/dist/indexes/indexes.css +7 -2
- package/dist/indexes/indexes.vue +1 -1
- package/dist/indexes/props.ts +5 -0
- package/dist/indexes/type.ts +5 -0
- package/dist/input/README.md +3 -1
- package/dist/input/input.vue +8 -32
- package/dist/link/README.md +3 -1
- package/dist/loading/README.md +3 -1
- package/dist/message/README.md +8 -3
- package/dist/mixins/page-scroll.d.ts +19 -0
- package/dist/mixins/skyline.js +1 -1
- package/dist/navbar/README.md +3 -1
- package/dist/notice-bar/README.md +3 -1
- package/dist/overlay/README.md +3 -1
- package/dist/picker/README.md +3 -1
- package/dist/popover/README.md +3 -1
- package/dist/popup/README.md +3 -1
- package/dist/progress/README.md +2 -2
- package/dist/pull-down-refresh/README.md +3 -1
- package/dist/qrcode/README.md +3 -1
- package/dist/radio/README.md +3 -1
- package/dist/rate/README.md +3 -1
- package/dist/rate/rate.css +1 -0
- package/dist/result/README.md +3 -1
- package/dist/search/README.md +3 -1
- package/dist/search/search.css +5 -0
- package/dist/search/search.vue +7 -12
- package/dist/segmented/README.en-US.md +42 -0
- package/dist/segmented/README.md +75 -0
- package/dist/segmented/props.ts +31 -0
- package/dist/segmented/segmented.css +66 -0
- package/dist/segmented/segmented.vue +174 -0
- package/dist/segmented/type.ts +41 -0
- package/dist/side-bar/README.md +3 -1
- package/dist/skeleton/README.md +3 -1
- package/dist/slider/README.md +3 -1
- package/dist/stepper/README.md +3 -1
- package/dist/steps/README.md +3 -1
- package/dist/sticky/README.md +3 -1
- package/dist/swipe-cell/README.md +3 -1
- package/dist/swiper/README.md +3 -1
- package/dist/switch/README.md +3 -1
- package/dist/tab-bar/README.md +3 -1
- package/dist/tab-bar-item/tab-bar-item.vue +4 -6
- package/dist/table/README.en-US.md +72 -0
- package/dist/table/README.md +117 -0
- package/dist/table/base-table-props.ts +105 -0
- package/dist/table/props.ts +94 -0
- package/dist/table/table.css +251 -0
- package/dist/table/table.vue +551 -0
- package/dist/table/type.ts +180 -0
- package/dist/tabs/README.md +3 -1
- package/dist/tabs/tabs.css +4 -0
- package/dist/tag/README.md +3 -1
- package/dist/textarea/README.md +3 -1
- package/dist/textarea/textarea.vue +1 -25
- package/dist/theme-light.css +282 -0
- package/dist/theme-light.css.d.ts +2 -0
- package/dist/theme-light.less +1 -0
- package/dist/theme-light.less.d.ts +2 -0
- package/dist/theme.css +467 -0
- package/dist/theme.css.d.ts +2 -0
- package/dist/theme.less +1 -0
- package/dist/theme.less.d.ts +2 -0
- package/dist/toast/README.md +3 -1
- package/dist/transition/README.md +4 -6
- package/dist/tree-select/README.md +3 -1
- package/dist/types/index.d.ts +17 -0
- package/dist/types/segmented.d.ts +7 -0
- package/dist/types/table.d.ts +7 -0
- package/dist/upload/README.md +3 -1
- package/dist/watermark/README.md +3 -1
- package/global.d.ts +2 -0
- package/package.json +66 -8
- package/script/postinstall.js +87 -0
- package/dist/common/src/superComponent.js +0 -5
- package/dist/common/validator.js +0 -210
- package/dist/script/postinstall.js +0 -46
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tdesign/uniapp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"id": "tdesign-uniapp",
|
|
5
5
|
"title": "tdesign-uniapp",
|
|
6
6
|
"description": "TDesign Component for UniApp",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
],
|
|
15
15
|
"files": [
|
|
16
16
|
"dist",
|
|
17
|
+
"script",
|
|
17
18
|
"global.d.ts",
|
|
18
19
|
"LICENSE",
|
|
19
20
|
"README.md",
|
|
@@ -42,6 +43,47 @@
|
|
|
42
43
|
"./global": {
|
|
43
44
|
"types": "./global.d.ts"
|
|
44
45
|
},
|
|
46
|
+
"./mixins/page-scroll": {
|
|
47
|
+
"types": "./dist/mixins/page-scroll.d.ts",
|
|
48
|
+
"import": "./dist/mixins/page-scroll.js",
|
|
49
|
+
"default": "./dist/mixins/page-scroll.js"
|
|
50
|
+
},
|
|
51
|
+
"./dialog": {
|
|
52
|
+
"types": "./dist/dialog/index.d.ts",
|
|
53
|
+
"import": "./dist/dialog/index.js",
|
|
54
|
+
"default": "./dist/dialog/index.js"
|
|
55
|
+
},
|
|
56
|
+
"./message": {
|
|
57
|
+
"types": "./dist/message/index.d.ts",
|
|
58
|
+
"import": "./dist/message/index.js",
|
|
59
|
+
"default": "./dist/message/index.js"
|
|
60
|
+
},
|
|
61
|
+
"./toast": {
|
|
62
|
+
"types": "./dist/toast/index.d.ts",
|
|
63
|
+
"import": "./dist/toast/index.js",
|
|
64
|
+
"default": "./dist/toast/index.js"
|
|
65
|
+
},
|
|
66
|
+
"./action-sheet": {
|
|
67
|
+
"types": "./dist/action-sheet/index.d.ts",
|
|
68
|
+
"import": "./dist/action-sheet/index.js",
|
|
69
|
+
"default": "./dist/action-sheet/index.js"
|
|
70
|
+
},
|
|
71
|
+
"./theme.css": {
|
|
72
|
+
"types": "./dist/theme.css.d.ts",
|
|
73
|
+
"default": "./dist/theme.css"
|
|
74
|
+
},
|
|
75
|
+
"./theme.less": {
|
|
76
|
+
"types": "./dist/theme.less.d.ts",
|
|
77
|
+
"default": "./dist/theme.less"
|
|
78
|
+
},
|
|
79
|
+
"./theme-light.css": {
|
|
80
|
+
"types": "./dist/theme-light.css.d.ts",
|
|
81
|
+
"default": "./dist/theme-light.css"
|
|
82
|
+
},
|
|
83
|
+
"./theme-light.less": {
|
|
84
|
+
"types": "./dist/theme-light.less.d.ts",
|
|
85
|
+
"default": "./dist/theme-light.less"
|
|
86
|
+
},
|
|
45
87
|
"./action-sheet/action-sheet.vue": {
|
|
46
88
|
"types": "./dist/types/action-sheet.d.ts",
|
|
47
89
|
"import": "./dist/action-sheet/action-sheet.vue",
|
|
@@ -122,16 +164,16 @@
|
|
|
122
164
|
"import": "./dist/collapse-panel/collapse-panel.vue",
|
|
123
165
|
"default": "./dist/collapse-panel/collapse-panel.vue"
|
|
124
166
|
},
|
|
125
|
-
"./config-provider/config-provider.vue": {
|
|
126
|
-
"types": "./dist/types/config-provider.d.ts",
|
|
127
|
-
"import": "./dist/config-provider/config-provider.vue",
|
|
128
|
-
"default": "./dist/config-provider/config-provider.vue"
|
|
129
|
-
},
|
|
130
167
|
"./color-picker/color-picker.vue": {
|
|
131
168
|
"types": "./dist/types/color-picker.d.ts",
|
|
132
169
|
"import": "./dist/color-picker/color-picker.vue",
|
|
133
170
|
"default": "./dist/color-picker/color-picker.vue"
|
|
134
171
|
},
|
|
172
|
+
"./config-provider/config-provider.vue": {
|
|
173
|
+
"types": "./dist/types/config-provider.d.ts",
|
|
174
|
+
"import": "./dist/config-provider/config-provider.vue",
|
|
175
|
+
"default": "./dist/config-provider/config-provider.vue"
|
|
176
|
+
},
|
|
135
177
|
"./count-down/count-down.vue": {
|
|
136
178
|
"types": "./dist/types/count-down.d.ts",
|
|
137
179
|
"import": "./dist/count-down/count-down.vue",
|
|
@@ -277,6 +319,11 @@
|
|
|
277
319
|
"import": "./dist/picker-item/picker-item.vue",
|
|
278
320
|
"default": "./dist/picker-item/picker-item.vue"
|
|
279
321
|
},
|
|
322
|
+
"./popover/popover.vue": {
|
|
323
|
+
"types": "./dist/types/popover.d.ts",
|
|
324
|
+
"import": "./dist/popover/popover.vue",
|
|
325
|
+
"default": "./dist/popover/popover.vue"
|
|
326
|
+
},
|
|
280
327
|
"./popup/popup.vue": {
|
|
281
328
|
"types": "./dist/types/popup.d.ts",
|
|
282
329
|
"import": "./dist/popup/popup.vue",
|
|
@@ -327,6 +374,11 @@
|
|
|
327
374
|
"import": "./dist/search/search.vue",
|
|
328
375
|
"default": "./dist/search/search.vue"
|
|
329
376
|
},
|
|
377
|
+
"./segmented/segmented.vue": {
|
|
378
|
+
"types": "./dist/types/segmented.d.ts",
|
|
379
|
+
"import": "./dist/segmented/segmented.vue",
|
|
380
|
+
"default": "./dist/segmented/segmented.vue"
|
|
381
|
+
},
|
|
330
382
|
"./side-bar/side-bar.vue": {
|
|
331
383
|
"types": "./dist/types/side-bar.d.ts",
|
|
332
384
|
"import": "./dist/side-bar/side-bar.vue",
|
|
@@ -402,6 +454,11 @@
|
|
|
402
454
|
"import": "./dist/tab-panel/tab-panel.vue",
|
|
403
455
|
"default": "./dist/tab-panel/tab-panel.vue"
|
|
404
456
|
},
|
|
457
|
+
"./table/table.vue": {
|
|
458
|
+
"types": "./dist/types/table.d.ts",
|
|
459
|
+
"import": "./dist/table/table.vue",
|
|
460
|
+
"default": "./dist/table/table.vue"
|
|
461
|
+
},
|
|
405
462
|
"./tabs/tabs.vue": {
|
|
406
463
|
"types": "./dist/types/tabs.d.ts",
|
|
407
464
|
"import": "./dist/tabs/tabs.vue",
|
|
@@ -458,7 +515,7 @@
|
|
|
458
515
|
"eslint-import-resolver-node": "0.3.9",
|
|
459
516
|
"eslint-plugin-import": "^2.31.0",
|
|
460
517
|
"eslint-plugin-jest": "25",
|
|
461
|
-
"eslint-plugin-light": "
|
|
518
|
+
"eslint-plugin-light": "1.0.22",
|
|
462
519
|
"eslint-plugin-prettier": "^4.2.1",
|
|
463
520
|
"eslint-plugin-react": "7.26.1",
|
|
464
521
|
"eslint-plugin-react-hooks": "4.2.0",
|
|
@@ -522,6 +579,7 @@
|
|
|
522
579
|
"watch": "node ./example/script/watch/watch.js",
|
|
523
580
|
"release:prepare": "node ./example/script/release/prepare.js",
|
|
524
581
|
"gen:types": "node ./example/script/types/index.js",
|
|
525
|
-
"commit": "git-cz"
|
|
582
|
+
"commit": "git-cz",
|
|
583
|
+
"postinstall": "node script/postinstall.js || true"
|
|
526
584
|
}
|
|
527
585
|
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 判断当前脚本是否以"用户侧安装"的形式被执行。
|
|
6
|
+
*
|
|
7
|
+
* 场景:
|
|
8
|
+
* - 用户安装:脚本物理位置在 node_modules/@tdesign/uniapp/script/postinstall.js,
|
|
9
|
+
* __dirname 必然包含 /node_modules/
|
|
10
|
+
* - 本仓库本地开发 monorepo install:脚本物理位置在 packages/tdesign-uniapp/script/postinstall.js,
|
|
11
|
+
* __dirname 不包含 /node_modules/,应直接跳过,避免误导性日志
|
|
12
|
+
*/
|
|
13
|
+
function isUserInstall() {
|
|
14
|
+
const { sep } = path;
|
|
15
|
+
return __dirname.split(sep).includes('node_modules');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function printVue2PostCSSWarning() {
|
|
19
|
+
console.warn('\n');
|
|
20
|
+
console.warn('⚠️ [TDesign UniApp] 检测到当前使用 Vue2 环境');
|
|
21
|
+
console.warn(' Vue2 项目需要在 postcss.config.js 中进行适配,否则样式可能无法正常工作。');
|
|
22
|
+
console.warn('');
|
|
23
|
+
console.warn(' 📖 适配指南: https://juejin.cn/post/7602901195154030644');
|
|
24
|
+
console.warn(' 📦 Vue2 CLI 参考项目: https://github.com/TDesignOteam/tdesign-uniapp-starter-vue2-cli');
|
|
25
|
+
console.warn('\n');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 多重检测 Vue 版本,提升准确性
|
|
30
|
+
* 优先级:环境变量 > require('vue') > 用户项目 package.json
|
|
31
|
+
*/
|
|
32
|
+
function detectVueVersion() {
|
|
33
|
+
// 1. 环境变量优先
|
|
34
|
+
if (process.env.npm_config_vueVersion) {
|
|
35
|
+
return process.env.npm_config_vueVersion;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// 2. 尝试直接 require vue
|
|
39
|
+
try {
|
|
40
|
+
const Vue = require('vue');
|
|
41
|
+
if (Vue && Vue.version) return Vue.version;
|
|
42
|
+
} catch (e) {}
|
|
43
|
+
|
|
44
|
+
// 3. 读用户项目的 package.json 中的 vue 版本声明
|
|
45
|
+
try {
|
|
46
|
+
const userPkgPath = path.resolve(process.cwd(), 'package.json');
|
|
47
|
+
const userPkg = JSON.parse(fs.readFileSync(userPkgPath, 'utf-8'));
|
|
48
|
+
const vueDep = (userPkg.dependencies && userPkg.dependencies.vue)
|
|
49
|
+
|| (userPkg.devDependencies && userPkg.devDependencies.vue);
|
|
50
|
+
if (vueDep) return vueDep;
|
|
51
|
+
} catch (e) {}
|
|
52
|
+
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function isVue2(version) {
|
|
57
|
+
if (!version || typeof version !== 'string') return false;
|
|
58
|
+
// 匹配 "2.x"、"^2.x"、"~2.x"、">=2.x" 等
|
|
59
|
+
return /(?:^|[~^>=\s])2\./.test(version);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function isVue3(version) {
|
|
63
|
+
if (!version || typeof version !== 'string') return false;
|
|
64
|
+
return /(?:^|[~^>=\s])3\./.test(version);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function main() {
|
|
68
|
+
// 仅当作为依赖被用户安装时才执行检测,避免本地 monorepo install 时产生噪音
|
|
69
|
+
if (!isUserInstall()) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const version = detectVueVersion();
|
|
74
|
+
|
|
75
|
+
if (!version) {
|
|
76
|
+
console.warn('[TDesign UniApp] Vue is not found. Please run "npm install vue" to install.');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (isVue2(version)) {
|
|
81
|
+
printVue2PostCSSWarning();
|
|
82
|
+
} else if (!isVue3(version)) {
|
|
83
|
+
console.warn(`[TDesign UniApp] Vue version ${version} is not supported.`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
main();
|
package/dist/common/validator.js
DELETED
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
export function isFunction(val) {
|
|
2
|
-
return typeof val === 'function';
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
export const isString = val => typeof val === 'string';
|
|
6
|
-
|
|
7
|
-
export const isNull = value => value === null;
|
|
8
|
-
|
|
9
|
-
export const isUndefined = value => value === undefined;
|
|
10
|
-
|
|
11
|
-
export function isDef(value) {
|
|
12
|
-
return !isUndefined(value) && !isNull(value);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function isInteger(value) {
|
|
16
|
-
return Number.isInteger(value);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function isNumeric(value) {
|
|
20
|
-
return !Number.isNaN(Number(value));
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function isNumber(value) {
|
|
24
|
-
return typeof value === 'number';
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function isBoolean(value) {
|
|
28
|
-
return typeof value === 'boolean';
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function isObject(x) {
|
|
32
|
-
const type = typeof x;
|
|
33
|
-
return x !== null && (type === 'object' || type === 'function');
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function isPlainObject(val) {
|
|
37
|
-
return val !== null && typeof val === 'object' && Object.prototype.toString.call(val) === '[object Object]';
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function isEmpty(val) {
|
|
41
|
-
if (val === null || val === undefined) return true;
|
|
42
|
-
if (typeof val === 'string' || Array.isArray(val)) return val.length === 0;
|
|
43
|
-
if (val instanceof Map || val instanceof Set) return val.size === 0;
|
|
44
|
-
if (typeof val === 'object') return Object.keys(val).length === 0;
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* 验证是否为有效日期
|
|
50
|
-
* 支持字符串格式(YYYY/MM/DD、YYYY-MM-DD 等)和 Date 对象
|
|
51
|
-
*/
|
|
52
|
-
export function isDate(input, options) {
|
|
53
|
-
const defaultOptions = {
|
|
54
|
-
format: 'YYYY/MM/DD',
|
|
55
|
-
delimiters: ['/', '-'],
|
|
56
|
-
strictMode: false,
|
|
57
|
-
};
|
|
58
|
-
const opts = { ...defaultOptions, ...options };
|
|
59
|
-
|
|
60
|
-
if (typeof input === 'string') {
|
|
61
|
-
const delimiter = opts.delimiters.find((d) => opts.format.includes(d));
|
|
62
|
-
if (!delimiter) return false;
|
|
63
|
-
|
|
64
|
-
const formatParts = opts.format.split(delimiter);
|
|
65
|
-
const dateParts = input.split(delimiter);
|
|
66
|
-
if (formatParts.length !== dateParts.length) return false;
|
|
67
|
-
|
|
68
|
-
let year = '';
|
|
69
|
-
let month = '';
|
|
70
|
-
let day = '';
|
|
71
|
-
for (let i = 0; i < formatParts.length; i += 1) {
|
|
72
|
-
const fmt = formatParts[i].toUpperCase();
|
|
73
|
-
const val = dateParts[i];
|
|
74
|
-
if (fmt.includes('Y')) year = val;
|
|
75
|
-
else if (fmt.includes('M')) month = val;
|
|
76
|
-
else if (fmt.includes('D')) day = val;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (month.length === 1) month = `0${month}`;
|
|
80
|
-
if (day.length === 1) day = `0${day}`;
|
|
81
|
-
|
|
82
|
-
if (year.length === 2) {
|
|
83
|
-
const currentYearSuffix = new Date().getFullYear() % 100;
|
|
84
|
-
year = Number(year) <= currentYearSuffix ? `20${year}` : `19${year}`;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const date = new Date(`${year}-${month}-${day}T00:00:00.000Z`);
|
|
88
|
-
return (
|
|
89
|
-
date.getUTCFullYear() === Number(year)
|
|
90
|
-
&& date.getUTCMonth() + 1 === Number(month)
|
|
91
|
-
&& date.getUTCDate() === Number(day)
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (!opts.strictMode) {
|
|
96
|
-
if (Object.prototype.toString.call(input) === '[object Date]' && Number.isFinite(input.getTime())) {
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* 验证是否为有效邮箱地址
|
|
106
|
-
*/
|
|
107
|
-
export function isEmail(str) {
|
|
108
|
-
if (typeof str !== 'string') return false;
|
|
109
|
-
if (str.length > 254) return false;
|
|
110
|
-
|
|
111
|
-
const parts = str.split('@');
|
|
112
|
-
if (parts.length !== 2) return false;
|
|
113
|
-
|
|
114
|
-
const [user, domain] = parts;
|
|
115
|
-
if (!user || user.length > 64) return false;
|
|
116
|
-
if (!domain) return false;
|
|
117
|
-
|
|
118
|
-
if (/^[-.]/.test(domain) || /[-.]$/.test(domain)) return false;
|
|
119
|
-
if (!/^[a-zA-Z0-9.-]+$/.test(domain)) return false;
|
|
120
|
-
if (!domain.includes('.')) return false;
|
|
121
|
-
|
|
122
|
-
const tld = domain.split('.').pop();
|
|
123
|
-
if (!tld || tld.length < 2) return false;
|
|
124
|
-
|
|
125
|
-
const emailUserReg = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+$/;
|
|
126
|
-
return emailUserReg.test(user);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* 验证是否为有效 URL
|
|
131
|
-
*/
|
|
132
|
-
export function isURL(str, options) {
|
|
133
|
-
if (typeof str !== 'string') return false;
|
|
134
|
-
if (str.length === 0 || /\s/.test(str)) return false;
|
|
135
|
-
if (str.length > 2084) return false;
|
|
136
|
-
|
|
137
|
-
const defaultOpts = {
|
|
138
|
-
protocols: ['http', 'https', 'ftp'],
|
|
139
|
-
require_tld: true,
|
|
140
|
-
require_protocol: false,
|
|
141
|
-
require_host: true,
|
|
142
|
-
allow_protocol_relative_urls: false,
|
|
143
|
-
};
|
|
144
|
-
const opts = { ...defaultOpts, ...options };
|
|
145
|
-
|
|
146
|
-
let url = str;
|
|
147
|
-
|
|
148
|
-
const protocolRegex = /^([a-z][a-z0-9+\-.]*):\/\//i;
|
|
149
|
-
const protocolMatch = url.match(protocolRegex);
|
|
150
|
-
if (protocolMatch) {
|
|
151
|
-
const protocol = protocolMatch[1].toLowerCase();
|
|
152
|
-
if (!opts.protocols.includes(protocol)) return false;
|
|
153
|
-
url = url.slice(protocolMatch[0].length);
|
|
154
|
-
} else if (opts.require_protocol) {
|
|
155
|
-
if (opts.allow_protocol_relative_urls && str.startsWith('//')) {
|
|
156
|
-
url = url.slice(2);
|
|
157
|
-
} else {
|
|
158
|
-
return false;
|
|
159
|
-
}
|
|
160
|
-
} else if (str.startsWith('//')) {
|
|
161
|
-
if (!opts.allow_protocol_relative_urls) return false;
|
|
162
|
-
url = url.slice(2);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
if (!url && opts.require_host) return false;
|
|
166
|
-
|
|
167
|
-
const [hostPart] = url.split(/[/?#]/);
|
|
168
|
-
if (!hostPart && opts.require_host) return false;
|
|
169
|
-
|
|
170
|
-
let host = hostPart;
|
|
171
|
-
if (host.includes('@')) {
|
|
172
|
-
host = host.split('@').pop() || '';
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
let hostname = host;
|
|
176
|
-
const portMatch = host.match(/:(\d+)$/);
|
|
177
|
-
if (portMatch) {
|
|
178
|
-
const port = Number(portMatch[1]);
|
|
179
|
-
if (port < 0 || port > 65535) return false;
|
|
180
|
-
hostname = host.slice(0, host.lastIndexOf(':'));
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (!hostname) return false;
|
|
184
|
-
|
|
185
|
-
const ipv4Regex = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
|
|
186
|
-
const ipv4Match = hostname.match(ipv4Regex);
|
|
187
|
-
if (ipv4Match) {
|
|
188
|
-
return ipv4Match.slice(1).every((part) => Number(part) >= 0 && Number(part) <= 255);
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
if (hostname.startsWith('[') && hostname.endsWith(']')) {
|
|
192
|
-
return true;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const domainParts = hostname.split('.');
|
|
196
|
-
if (opts.require_tld && domainParts.length < 2) return false;
|
|
197
|
-
const hasInvalidPart = domainParts.some((part) => {
|
|
198
|
-
if (!part || part.length > 63) return true;
|
|
199
|
-
if (!/^[a-zA-Z0-9-]+$/.test(part)) return true;
|
|
200
|
-
if (part.startsWith('-') || part.endsWith('-')) return true;
|
|
201
|
-
return false;
|
|
202
|
-
});
|
|
203
|
-
if (hasInvalidPart) return false;
|
|
204
|
-
if (opts.require_tld) {
|
|
205
|
-
const tld = domainParts[domainParts.length - 1];
|
|
206
|
-
if (/^\d+$/.test(tld)) return false;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
return true;
|
|
210
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
function switchVersion(version) {
|
|
6
|
-
const pkg = require('../package.json');
|
|
7
|
-
if (version != 2) {
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
delete pkg.exports;
|
|
12
|
-
|
|
13
|
-
const pkgStr = JSON.stringify(pkg, null, 2);
|
|
14
|
-
|
|
15
|
-
fs.writeFileSync(path.resolve(__dirname, '../package.json'), pkgStr, 'utf-8');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
function loadModule(name) {
|
|
20
|
-
try {
|
|
21
|
-
return require(name);
|
|
22
|
-
} catch (e) {
|
|
23
|
-
return undefined;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const Vue = loadModule('vue');
|
|
28
|
-
|
|
29
|
-
function main() {
|
|
30
|
-
const version = process.env.npm_config_vueVersion || (Vue ? Vue.version : '2.7.');
|
|
31
|
-
if (!Vue || typeof version !== 'string') {
|
|
32
|
-
console.warn('Vue is not found. Please run "npm install vue" to install.');
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (version.startsWith('2.')) {
|
|
37
|
-
switchVersion(2);
|
|
38
|
-
} else if (version.startsWith('3.')) {
|
|
39
|
-
switchVersion(3);
|
|
40
|
-
} else {
|
|
41
|
-
console.warn(`Vue version v${version} is not supported.`);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
main();
|
|
46
|
-
|