@tmagic/utils 1.0.4 → 1.1.0-beta.1
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/dist/tmagic-utils.es.js +64 -29
- package/dist/tmagic-utils.es.js.map +1 -1
- package/dist/tmagic-utils.umd.js +70 -28
- package/dist/tmagic-utils.umd.js.map +1 -1
- package/dist/types/src/dom.d.ts +10 -0
- package/dist/types/src/index.d.ts +3 -2
- package/package.json +2 -2
- package/src/dom.ts +110 -0
- package/src/index.ts +12 -81
package/dist/tmagic-utils.es.js
CHANGED
|
@@ -1,34 +1,6 @@
|
|
|
1
1
|
import moment from 'moment';
|
|
2
2
|
import { NodeType } from '@tmagic/schema';
|
|
3
3
|
|
|
4
|
-
const sleep = (ms) => new Promise((resolve) => {
|
|
5
|
-
const timer = setTimeout(() => {
|
|
6
|
-
clearTimeout(timer);
|
|
7
|
-
resolve();
|
|
8
|
-
}, ms);
|
|
9
|
-
});
|
|
10
|
-
const datetimeFormatter = (v, defaultValue = "-", f = "YYYY-MM-DD HH:mm:ss") => {
|
|
11
|
-
let format = f;
|
|
12
|
-
if (format === "timestamp") {
|
|
13
|
-
format = "x";
|
|
14
|
-
}
|
|
15
|
-
if (v) {
|
|
16
|
-
let time = null;
|
|
17
|
-
if (typeof v === "string" && v.includes("Z") || v.constructor === Date) {
|
|
18
|
-
time = moment(v).utcOffset("+08:00").format(format);
|
|
19
|
-
} else {
|
|
20
|
-
time = moment(v).format(format);
|
|
21
|
-
}
|
|
22
|
-
if (format === "x") {
|
|
23
|
-
return +time;
|
|
24
|
-
}
|
|
25
|
-
if (time !== "Invalid date") {
|
|
26
|
-
return time;
|
|
27
|
-
}
|
|
28
|
-
return defaultValue;
|
|
29
|
-
}
|
|
30
|
-
return defaultValue;
|
|
31
|
-
};
|
|
32
4
|
const asyncLoadJs = (() => {
|
|
33
5
|
const documentMap = /* @__PURE__ */ new Map();
|
|
34
6
|
return (url, crossOrigin, document = globalThis.document) => {
|
|
@@ -96,6 +68,62 @@ const asyncLoadCss = (() => {
|
|
|
96
68
|
return loaded.get(url);
|
|
97
69
|
};
|
|
98
70
|
})();
|
|
71
|
+
const addClassName = (el, doc, className) => {
|
|
72
|
+
const oldEl = doc.querySelector(`.${className}`);
|
|
73
|
+
if (oldEl && oldEl !== el)
|
|
74
|
+
removeClassName(oldEl, className);
|
|
75
|
+
if (!el.classList.contains(className))
|
|
76
|
+
el.classList.add(className);
|
|
77
|
+
};
|
|
78
|
+
const removeClassName = (el, className) => {
|
|
79
|
+
el.classList.remove(className);
|
|
80
|
+
};
|
|
81
|
+
const removeClassNameByClassName = (doc, className) => {
|
|
82
|
+
const el = doc.querySelector(`.${className}`);
|
|
83
|
+
el?.classList.remove(className);
|
|
84
|
+
return el;
|
|
85
|
+
};
|
|
86
|
+
const injectStyle = (doc, style) => {
|
|
87
|
+
const styleEl = doc.createElement("style");
|
|
88
|
+
styleEl.innerHTML = style;
|
|
89
|
+
doc.head.appendChild(styleEl);
|
|
90
|
+
return styleEl;
|
|
91
|
+
};
|
|
92
|
+
const createDiv = ({ className, cssText }) => {
|
|
93
|
+
const el = globalThis.document.createElement("div");
|
|
94
|
+
el.className = className;
|
|
95
|
+
el.style.cssText = cssText;
|
|
96
|
+
return el;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const sleep = (ms) => new Promise((resolve) => {
|
|
100
|
+
const timer = setTimeout(() => {
|
|
101
|
+
clearTimeout(timer);
|
|
102
|
+
resolve();
|
|
103
|
+
}, ms);
|
|
104
|
+
});
|
|
105
|
+
const datetimeFormatter = (v, defaultValue = "-", f = "YYYY-MM-DD HH:mm:ss") => {
|
|
106
|
+
let format = f;
|
|
107
|
+
if (format === "timestamp") {
|
|
108
|
+
format = "x";
|
|
109
|
+
}
|
|
110
|
+
if (v) {
|
|
111
|
+
let time = null;
|
|
112
|
+
if (typeof v === "string" && v.includes("Z") || v.constructor === Date) {
|
|
113
|
+
time = moment(v).utcOffset("+08:00").format(format);
|
|
114
|
+
} else {
|
|
115
|
+
time = moment(v).format(format);
|
|
116
|
+
}
|
|
117
|
+
if (format === "x") {
|
|
118
|
+
return +time;
|
|
119
|
+
}
|
|
120
|
+
if (time !== "Invalid date") {
|
|
121
|
+
return time;
|
|
122
|
+
}
|
|
123
|
+
return defaultValue;
|
|
124
|
+
}
|
|
125
|
+
return defaultValue;
|
|
126
|
+
};
|
|
99
127
|
const toLine = (name = "") => name.replace(/\B([A-Z])/g, "-$1").toLowerCase();
|
|
100
128
|
const toHump = (name = "") => name.replace(/-(\w)/g, (all, letter) => letter.toUpperCase());
|
|
101
129
|
const emptyFn = () => void 0;
|
|
@@ -142,6 +170,13 @@ const getUrlParam = (param, url) => {
|
|
|
142
170
|
const isPop = (node) => Boolean(node.type?.toLowerCase().endsWith("pop"));
|
|
143
171
|
const isPage = (node) => Boolean(node.type?.toLowerCase() === NodeType.PAGE);
|
|
144
172
|
const isNumber = (value) => /^(-?\d+)(\.\d+)?$/.test(value);
|
|
173
|
+
const getHost = (targetUrl) => targetUrl.match(/\/\/([^/]+)/)?.[1];
|
|
174
|
+
const isSameDomain = (targetUrl = "", source = globalThis.location.host) => {
|
|
175
|
+
const isHttpUrl = /^(http[s]?:)?\/\//.test(targetUrl);
|
|
176
|
+
if (!isHttpUrl)
|
|
177
|
+
return true;
|
|
178
|
+
return getHost(targetUrl) === source;
|
|
179
|
+
};
|
|
145
180
|
|
|
146
|
-
export { asyncLoadCss, asyncLoadJs, datetimeFormatter, emptyFn, filterXSS, getNodePath, getUrlParam, isNumber, isPage, isPop, sleep, toHump, toLine };
|
|
181
|
+
export { addClassName, asyncLoadCss, asyncLoadJs, createDiv, datetimeFormatter, emptyFn, filterXSS, getHost, getNodePath, getUrlParam, injectStyle, isNumber, isPage, isPop, isSameDomain, removeClassName, removeClassNameByClassName, sleep, toHump, toLine };
|
|
147
182
|
//# sourceMappingURL=tmagic-utils.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmagic-utils.es.js","sources":["../src/index.ts"],"sourcesContent":["/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport moment from 'moment';\n\nimport type { MNode } from '@tmagic/schema';\nimport { NodeType } from '@tmagic/schema';\n\nexport const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => {\n const timer = setTimeout(() => {\n clearTimeout(timer);\n resolve();\n }, ms);\n });\n\nexport const datetimeFormatter = (v: string | Date, defaultValue = '-', f = 'YYYY-MM-DD HH:mm:ss') => {\n let format = f;\n if (format === 'timestamp') {\n format = 'x';\n }\n\n if (v) {\n let time = null;\n if ((typeof v === 'string' && v.includes('Z')) || v.constructor === Date) {\n // UTC字符串时间或Date对象格式化为北京时间\n time = moment(v).utcOffset('+08:00').format(format);\n } else {\n time = moment(v).format(format);\n }\n\n if (format === 'x') {\n return +time;\n }\n // 格式化为北京时间\n if (time !== 'Invalid date') {\n return time;\n }\n return defaultValue;\n }\n return defaultValue;\n};\n\nexport const asyncLoadJs = (() => {\n // 正在加载或加载成功的存入此Map中\n const documentMap = new Map();\n\n return (url: string, crossOrigin?: string, document = globalThis.document) => {\n let loaded = documentMap.get(document);\n if (!loaded) {\n loaded = new Map();\n documentMap.set(document, loaded);\n }\n\n // 正在加载或已经加载成功的,直接返回\n if (loaded.get(url)) return loaded.get(url);\n\n const load = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.type = 'text/javascript';\n if (crossOrigin) {\n script.crossOrigin = crossOrigin;\n }\n script.src = url;\n document.body.appendChild(script);\n script.onload = () => {\n resolve();\n };\n script.onerror = () => {\n reject(new Error('加载失败'));\n };\n setTimeout(() => {\n reject(new Error('timeout'));\n }, 60 * 1000);\n }).catch((err) => {\n // 加载失败的,从map中移除,第二次加载时,可以再次执行加载\n loaded.delete(url);\n throw err;\n });\n\n loaded.set(url, load);\n return loaded.get(url);\n };\n})();\n\nexport const asyncLoadCss = (() => {\n // 正在加载或加载成功的存入此Map中\n const documentMap = new Map();\n\n return (url: string, document = globalThis.document) => {\n let loaded = documentMap.get(document);\n if (!loaded) {\n loaded = new Map();\n documentMap.set(document, loaded);\n }\n\n // 正在加载或已经加载成功的,直接返回\n if (loaded.get(url)) return loaded.get(url);\n\n const load = new Promise<void>((resolve, reject) => {\n const node = document.createElement('link');\n node.rel = 'stylesheet';\n node.href = url;\n document.head.appendChild(node);\n node.onload = () => {\n resolve();\n };\n node.onerror = () => {\n reject(new Error('加载失败'));\n };\n setTimeout(() => {\n reject(new Error('timeout'));\n }, 60 * 1000);\n }).catch((err) => {\n // 加载失败的,从map中移除,第二次加载时,可以再次执行加载\n loaded.delete(url);\n throw err;\n });\n\n loaded.set(url, load);\n return loaded.get(url);\n };\n})();\n\n// 驼峰转换横线\nexport const toLine = (name = '') => name.replace(/\\B([A-Z])/g, '-$1').toLowerCase();\n\nexport const toHump = (name = ''): string => name.replace(/-(\\w)/g, (all, letter) => letter.toUpperCase());\n\nexport const emptyFn = (): any => undefined;\n\n/**\n * 通过id获取组件在应用的子孙路径\n * @param {number | string} id 组件id\n * @param {Array} data 要查找的根容器节点\n * @return {Array} 组件在data中的子孙路径\n */\nexport const getNodePath = (id: number | string, data: MNode[] = []): MNode[] => {\n const path: MNode[] = [];\n\n const get = function (id: number | string, data: MNode[]): MNode | null {\n if (!Array.isArray(data)) {\n return null;\n }\n\n for (let i = 0, l = data.length; i < l; i++) {\n const item: any = data[i];\n\n path.push(item);\n if (`${item.id}` === `${id}`) {\n return item;\n }\n\n if (item.items) {\n const node = get(id, item.items);\n if (node) {\n return node;\n }\n }\n\n path.pop();\n }\n\n return null;\n };\n\n get(id, data);\n\n return path;\n};\n\nexport const filterXSS = (str: string) =>\n str.replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n\nexport const getUrlParam = (param: string, url?: string) => {\n const u = url || location.href;\n const reg = new RegExp(`[?&#]${param}=([^&#]+)`, 'gi');\n\n const matches = u.match(reg);\n let strArr;\n if (matches && matches.length > 0) {\n strArr = matches[matches.length - 1].split('=');\n if (strArr && strArr.length > 1) {\n // 过滤XSS字符\n return filterXSS(strArr[1]);\n }\n return '';\n }\n return '';\n};\n\nexport const isPop = (node: MNode): boolean => Boolean(node.type?.toLowerCase().endsWith('pop'));\n\nexport const isPage = (node: MNode): boolean => Boolean(node.type?.toLowerCase() === NodeType.PAGE);\n\nexport const isNumber = (value: string) => /^(-?\\d+)(\\.\\d+)?$/.test(value);\n"],"names":[],"mappings":";;;AAuBO,MAAM,QAAQ,CAAC,EAAA,KACpB,IAAI,OAAA,CAAQ,CAAC,OAAY,KAAA;AACvB,EAAM,MAAA,KAAA,GAAQ,WAAW,MAAM;AAC7B,IAAA,YAAA,CAAa,KAAK,CAAA,CAAA;AAClB,IAAQ,OAAA,EAAA,CAAA;AAAA,KACP,EAAE,CAAA,CAAA;AACP,CAAC,EAAA;AAEI,MAAM,oBAAoB,CAAC,CAAA,EAAkB,YAAe,GAAA,GAAA,EAAK,IAAI,qBAA0B,KAAA;AACpG,EAAA,IAAI,MAAS,GAAA,CAAA,CAAA;AACb,EAAA,IAAI,WAAW,WAAa,EAAA;AAC1B,IAAS,MAAA,GAAA,GAAA,CAAA;AAAA,GACX;AAEA,EAAA,IAAI,CAAG,EAAA;AACL,IAAA,IAAI,IAAO,GAAA,IAAA,CAAA;AACX,IAAK,IAAA,OAAO,MAAM,QAAY,IAAA,CAAA,CAAE,SAAS,GAAG,CAAA,IAAM,CAAE,CAAA,WAAA,KAAgB,IAAM,EAAA;AAExE,MAAA,IAAA,GAAO,OAAO,CAAC,CAAA,CAAE,UAAU,QAAQ,CAAA,CAAE,OAAO,MAAM,CAAA,CAAA;AAAA,KAC7C,MAAA;AACL,MAAA,IAAA,GAAO,MAAO,CAAA,CAAC,CAAE,CAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,KAChC;AAEA,IAAA,IAAI,WAAW,GAAK,EAAA;AAClB,MAAA,OAAO,CAAC,IAAA,CAAA;AAAA,KACV;AAEA,IAAA,IAAI,SAAS,cAAgB,EAAA;AAC3B,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AACA,IAAO,OAAA,YAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,YAAA,CAAA;AACT,EAAA;AAEO,MAAM,cAAe,CAAM,MAAA;AAEhC,EAAM,MAAA,WAAA,uBAAkB,GAAI,EAAA,CAAA;AAE5B,EAAA,OAAO,CAAC,GAAA,EAAa,WAAsB,EAAA,QAAA,GAAW,WAAW,QAAa,KAAA;AAC5E,IAAI,IAAA,MAAA,GAAS,WAAY,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AACrC,IAAA,IAAI,CAAC,MAAQ,EAAA;AACX,MAAA,MAAA,uBAAa,GAAI,EAAA,CAAA;AACjB,MAAY,WAAA,CAAA,GAAA,CAAI,UAAU,MAAM,CAAA,CAAA;AAAA,KAClC;AAGA,IAAI,IAAA,MAAA,CAAO,IAAI,GAAG,CAAA;AAAG,MAAO,OAAA,MAAA,CAAO,IAAI,GAAG,CAAA,CAAA;AAE1C,IAAA,MAAM,IAAO,GAAA,IAAI,OAAc,CAAA,CAAC,SAAS,MAAW,KAAA;AAClD,MAAM,MAAA,MAAA,GAAS,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAC9C,MAAA,MAAA,CAAO,IAAO,GAAA,iBAAA,CAAA;AACd,MAAA,IAAI,WAAa,EAAA;AACf,QAAA,MAAA,CAAO,WAAc,GAAA,WAAA,CAAA;AAAA,OACvB;AACA,MAAA,MAAA,CAAO,GAAM,GAAA,GAAA,CAAA;AACb,MAAS,QAAA,CAAA,IAAA,CAAK,YAAY,MAAM,CAAA,CAAA;AAChC,MAAA,MAAA,CAAO,SAAS,MAAM;AACpB,QAAQ,OAAA,EAAA,CAAA;AAAA,OACV,CAAA;AACA,MAAA,MAAA,CAAO,UAAU,MAAM;AACrB,QAAO,MAAA,CAAA,IAAI,KAAM,CAAA,0BAAM,CAAC,CAAA,CAAA;AAAA,OAC1B,CAAA;AACA,MAAA,UAAA,CAAW,MAAM;AACf,QAAO,MAAA,CAAA,IAAI,KAAM,CAAA,SAAS,CAAC,CAAA,CAAA;AAAA,OAC7B,EAAG,KAAK,GAAI,CAAA,CAAA;AAAA,KACb,CAAA,CAAE,KAAM,CAAA,CAAC,GAAQ,KAAA;AAEhB,MAAA,MAAA,CAAO,OAAO,GAAG,CAAA,CAAA;AACjB,MAAM,MAAA,GAAA,CAAA;AAAA,KACP,CAAA,CAAA;AAED,IAAO,MAAA,CAAA,GAAA,CAAI,KAAK,IAAI,CAAA,CAAA;AACpB,IAAO,OAAA,MAAA,CAAO,IAAI,GAAG,CAAA,CAAA;AAAA,GACvB,CAAA;AACF,CAAG,IAAA;AAEI,MAAM,eAAgB,CAAM,MAAA;AAEjC,EAAM,MAAA,WAAA,uBAAkB,GAAI,EAAA,CAAA;AAE5B,EAAA,OAAO,CAAC,GAAA,EAAa,QAAW,GAAA,UAAA,CAAW,QAAa,KAAA;AACtD,IAAI,IAAA,MAAA,GAAS,WAAY,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AACrC,IAAA,IAAI,CAAC,MAAQ,EAAA;AACX,MAAA,MAAA,uBAAa,GAAI,EAAA,CAAA;AACjB,MAAY,WAAA,CAAA,GAAA,CAAI,UAAU,MAAM,CAAA,CAAA;AAAA,KAClC;AAGA,IAAI,IAAA,MAAA,CAAO,IAAI,GAAG,CAAA;AAAG,MAAO,OAAA,MAAA,CAAO,IAAI,GAAG,CAAA,CAAA;AAE1C,IAAA,MAAM,IAAO,GAAA,IAAI,OAAc,CAAA,CAAC,SAAS,MAAW,KAAA;AAClD,MAAM,MAAA,IAAA,GAAO,QAAS,CAAA,aAAA,CAAc,MAAM,CAAA,CAAA;AAC1C,MAAA,IAAA,CAAK,GAAM,GAAA,YAAA,CAAA;AACX,MAAA,IAAA,CAAK,IAAO,GAAA,GAAA,CAAA;AACZ,MAAS,QAAA,CAAA,IAAA,CAAK,YAAY,IAAI,CAAA,CAAA;AAC9B,MAAA,IAAA,CAAK,SAAS,MAAM;AAClB,QAAQ,OAAA,EAAA,CAAA;AAAA,OACV,CAAA;AACA,MAAA,IAAA,CAAK,UAAU,MAAM;AACnB,QAAO,MAAA,CAAA,IAAI,KAAM,CAAA,0BAAM,CAAC,CAAA,CAAA;AAAA,OAC1B,CAAA;AACA,MAAA,UAAA,CAAW,MAAM;AACf,QAAO,MAAA,CAAA,IAAI,KAAM,CAAA,SAAS,CAAC,CAAA,CAAA;AAAA,OAC7B,EAAG,KAAK,GAAI,CAAA,CAAA;AAAA,KACb,CAAA,CAAE,KAAM,CAAA,CAAC,GAAQ,KAAA;AAEhB,MAAA,MAAA,CAAO,OAAO,GAAG,CAAA,CAAA;AACjB,MAAM,MAAA,GAAA,CAAA;AAAA,KACP,CAAA,CAAA;AAED,IAAO,MAAA,CAAA,GAAA,CAAI,KAAK,IAAI,CAAA,CAAA;AACpB,IAAO,OAAA,MAAA,CAAO,IAAI,GAAG,CAAA,CAAA;AAAA,GACvB,CAAA;AACF,CAAG,IAAA;AAGU,MAAA,MAAA,GAAS,CAAC,IAAO,GAAA,EAAA,KAAO,KAAK,OAAQ,CAAA,YAAA,EAAc,KAAK,CAAA,CAAE,WAAY,GAAA;AAE5E,MAAM,MAAS,GAAA,CAAC,IAAO,GAAA,EAAA,KAAe,IAAK,CAAA,OAAA,CAAQ,QAAU,EAAA,CAAC,GAAK,EAAA,MAAA,KAAW,MAAO,CAAA,WAAA,EAAa,EAAA;AAElG,MAAM,UAAU,MAAW,KAAA,EAAA;AAQ3B,MAAM,WAAc,GAAA,CAAC,EAAqB,EAAA,IAAA,GAAgB,EAAgB,KAAA;AAC/E,EAAA,MAAM,OAAgB,EAAC,CAAA;AAEvB,EAAM,MAAA,GAAA,GAAM,SAAU,GAAA,EAAqB,KAA6B,EAAA;AACtE,IAAA,IAAI,CAAC,KAAA,CAAM,OAAQ,CAAA,KAAI,CAAG,EAAA;AACxB,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,MAAK,MAAQ,EAAA,CAAA,GAAI,GAAG,CAAK,EAAA,EAAA;AAC3C,MAAA,MAAM,OAAY,KAAK,CAAA,CAAA,CAAA,CAAA;AAEvB,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA,CAAA;AACd,MAAA,IAAI,CAAG,EAAA,IAAA,CAAK,EAAS,CAAA,CAAA,KAAA,CAAA,EAAG,GAAM,CAAA,CAAA,EAAA;AAC5B,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAEA,MAAA,IAAI,KAAK,KAAO,EAAA;AACd,QAAA,MAAM,IAAO,GAAA,GAAA,CAAI,GAAI,EAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAC/B,QAAA,IAAI,IAAM,EAAA;AACR,UAAO,OAAA,IAAA,CAAA;AAAA,SACT;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,GAAI,EAAA,CAAA;AAAA,KACX;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAA,GAAA,CAAI,IAAI,IAAI,CAAA,CAAA;AAEZ,EAAO,OAAA,IAAA,CAAA;AACT,EAAA;AAEO,MAAM,YAAY,CAAC,GAAA,KACxB,IAAI,OAAQ,CAAA,IAAA,EAAM,MAAM,CAAE,CAAA,OAAA,CAAQ,IAAM,EAAA,MAAM,EAAE,OAAQ,CAAA,IAAA,EAAM,QAAQ,CAAE,CAAA,OAAA,CAAQ,MAAM,QAAQ,EAAA;AAEnF,MAAA,WAAA,GAAc,CAAC,KAAA,EAAe,GAAiB,KAAA;AAC1D,EAAM,MAAA,CAAA,GAAI,OAAO,QAAS,CAAA,IAAA,CAAA;AAC1B,EAAA,MAAM,GAAM,GAAA,IAAI,MAAO,CAAA,CAAA,KAAA,EAAQ,kBAAkB,IAAI,CAAA,CAAA;AAErD,EAAM,MAAA,OAAA,GAAU,CAAE,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAC3B,EAAI,IAAA,MAAA,CAAA;AACJ,EAAI,IAAA,OAAA,IAAW,OAAQ,CAAA,MAAA,GAAS,CAAG,EAAA;AACjC,IAAA,MAAA,GAAS,OAAQ,CAAA,OAAA,CAAQ,MAAS,GAAA,CAAA,CAAA,CAAG,MAAM,GAAG,CAAA,CAAA;AAC9C,IAAI,IAAA,MAAA,IAAU,MAAO,CAAA,MAAA,GAAS,CAAG,EAAA;AAE/B,MAAO,OAAA,SAAA,CAAU,OAAO,CAAE,CAAA,CAAA,CAAA;AAAA,KAC5B;AACA,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACA,EAAO,OAAA,EAAA,CAAA;AACT,EAAA;AAEa,MAAA,KAAA,GAAQ,CAAC,IAAA,KAAyB,OAAQ,CAAA,IAAA,CAAK,MAAM,WAAY,EAAA,CAAE,QAAS,CAAA,KAAK,CAAC,EAAA;AAElF,MAAA,MAAA,GAAS,CAAC,IAAyB,KAAA,OAAA,CAAQ,KAAK,IAAM,EAAA,WAAA,EAAkB,KAAA,QAAA,CAAS,IAAI,EAAA;AAE3F,MAAM,QAAW,GAAA,CAAC,KAAkB,KAAA,mBAAA,CAAoB,KAAK,KAAK;;;;"}
|
|
1
|
+
{"version":3,"file":"tmagic-utils.es.js","sources":["../src/dom.ts","../src/index.ts"],"sourcesContent":["export const asyncLoadJs = (() => {\n // 正在加载或加载成功的存入此Map中\n const documentMap = new Map();\n\n return (url: string, crossOrigin?: string, document = globalThis.document) => {\n let loaded = documentMap.get(document);\n if (!loaded) {\n loaded = new Map();\n documentMap.set(document, loaded);\n }\n\n // 正在加载或已经加载成功的,直接返回\n if (loaded.get(url)) return loaded.get(url);\n\n const load = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.type = 'text/javascript';\n if (crossOrigin) {\n script.crossOrigin = crossOrigin;\n }\n script.src = url;\n document.body.appendChild(script);\n script.onload = () => {\n resolve();\n };\n script.onerror = () => {\n reject(new Error('加载失败'));\n };\n setTimeout(() => {\n reject(new Error('timeout'));\n }, 60 * 1000);\n }).catch((err) => {\n // 加载失败的,从map中移除,第二次加载时,可以再次执行加载\n loaded.delete(url);\n throw err;\n });\n\n loaded.set(url, load);\n return loaded.get(url);\n };\n})();\n\nexport const asyncLoadCss = (() => {\n // 正在加载或加载成功的存入此Map中\n const documentMap = new Map();\n\n return (url: string, document = globalThis.document) => {\n let loaded = documentMap.get(document);\n if (!loaded) {\n loaded = new Map();\n documentMap.set(document, loaded);\n }\n\n // 正在加载或已经加载成功的,直接返回\n if (loaded.get(url)) return loaded.get(url);\n\n const load = new Promise<void>((resolve, reject) => {\n const node = document.createElement('link');\n node.rel = 'stylesheet';\n node.href = url;\n document.head.appendChild(node);\n node.onload = () => {\n resolve();\n };\n node.onerror = () => {\n reject(new Error('加载失败'));\n };\n setTimeout(() => {\n reject(new Error('timeout'));\n }, 60 * 1000);\n }).catch((err) => {\n // 加载失败的,从map中移除,第二次加载时,可以再次执行加载\n loaded.delete(url);\n throw err;\n });\n\n loaded.set(url, load);\n return loaded.get(url);\n };\n})();\n\nexport const addClassName = (el: Element, doc: Document, className: string) => {\n const oldEl = doc.querySelector(`.${className}`);\n if (oldEl && oldEl !== el) removeClassName(oldEl, className);\n if (!el.classList.contains(className)) el.classList.add(className);\n};\n\nexport const removeClassName = (el: Element, className: string) => {\n el.classList.remove(className);\n};\n\nexport const removeClassNameByClassName = (doc: Document, className: string) => {\n const el: HTMLElement | null = doc.querySelector(`.${className}`);\n el?.classList.remove(className);\n return el;\n};\n\nexport const injectStyle = (doc: Document, style: string) => {\n const styleEl = doc.createElement('style');\n styleEl.innerHTML = style;\n doc.head.appendChild(styleEl);\n return styleEl;\n};\n\nexport const createDiv = ({ className, cssText }: { className: string; cssText: string }) => {\n const el = globalThis.document.createElement('div');\n el.className = className;\n el.style.cssText = cssText;\n return el;\n};\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport moment from 'moment';\n\nimport type { MNode } from '@tmagic/schema';\nimport { NodeType } from '@tmagic/schema';\n\nexport * from './dom';\n\nexport const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => {\n const timer = setTimeout(() => {\n clearTimeout(timer);\n resolve();\n }, ms);\n });\n\nexport const datetimeFormatter = (v: string | Date, defaultValue = '-', f = 'YYYY-MM-DD HH:mm:ss') => {\n let format = f;\n if (format === 'timestamp') {\n format = 'x';\n }\n\n if (v) {\n let time = null;\n if ((typeof v === 'string' && v.includes('Z')) || v.constructor === Date) {\n // UTC字符串时间或Date对象格式化为北京时间\n time = moment(v).utcOffset('+08:00').format(format);\n } else {\n time = moment(v).format(format);\n }\n\n if (format === 'x') {\n return +time;\n }\n // 格式化为北京时间\n if (time !== 'Invalid date') {\n return time;\n }\n return defaultValue;\n }\n return defaultValue;\n};\n\n// 驼峰转换横线\nexport const toLine = (name = '') => name.replace(/\\B([A-Z])/g, '-$1').toLowerCase();\n\nexport const toHump = (name = ''): string => name.replace(/-(\\w)/g, (all, letter) => letter.toUpperCase());\n\nexport const emptyFn = (): any => undefined;\n\n/**\n * 通过id获取组件在应用的子孙路径\n * @param {number | string} id 组件id\n * @param {Array} data 要查找的根容器节点\n * @return {Array} 组件在data中的子孙路径\n */\nexport const getNodePath = (id: number | string, data: MNode[] = []): MNode[] => {\n const path: MNode[] = [];\n\n const get = function (id: number | string, data: MNode[]): MNode | null {\n if (!Array.isArray(data)) {\n return null;\n }\n\n for (let i = 0, l = data.length; i < l; i++) {\n const item: any = data[i];\n\n path.push(item);\n if (`${item.id}` === `${id}`) {\n return item;\n }\n\n if (item.items) {\n const node = get(id, item.items);\n if (node) {\n return node;\n }\n }\n\n path.pop();\n }\n\n return null;\n };\n\n get(id, data);\n\n return path;\n};\n\nexport const filterXSS = (str: string) =>\n str.replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n\nexport const getUrlParam = (param: string, url?: string) => {\n const u = url || location.href;\n const reg = new RegExp(`[?&#]${param}=([^&#]+)`, 'gi');\n\n const matches = u.match(reg);\n let strArr;\n if (matches && matches.length > 0) {\n strArr = matches[matches.length - 1].split('=');\n if (strArr && strArr.length > 1) {\n // 过滤XSS字符\n return filterXSS(strArr[1]);\n }\n return '';\n }\n return '';\n};\n\nexport const isPop = (node: MNode): boolean => Boolean(node.type?.toLowerCase().endsWith('pop'));\n\nexport const isPage = (node: MNode): boolean => Boolean(node.type?.toLowerCase() === NodeType.PAGE);\n\nexport const isNumber = (value: string) => /^(-?\\d+)(\\.\\d+)?$/.test(value);\n\nexport const getHost = (targetUrl: string) => targetUrl.match(/\\/\\/([^/]+)/)?.[1];\n\nexport const isSameDomain = (targetUrl = '', source = globalThis.location.host) => {\n const isHttpUrl = /^(http[s]?:)?\\/\\//.test(targetUrl);\n\n if (!isHttpUrl) return true;\n\n return getHost(targetUrl) === source;\n};\n"],"names":[],"mappings":"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"}
|
package/dist/tmagic-utils.umd.js
CHANGED
|
@@ -8,34 +8,6 @@
|
|
|
8
8
|
|
|
9
9
|
var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment);
|
|
10
10
|
|
|
11
|
-
const sleep = (ms) => new Promise((resolve) => {
|
|
12
|
-
const timer = setTimeout(() => {
|
|
13
|
-
clearTimeout(timer);
|
|
14
|
-
resolve();
|
|
15
|
-
}, ms);
|
|
16
|
-
});
|
|
17
|
-
const datetimeFormatter = (v, defaultValue = "-", f = "YYYY-MM-DD HH:mm:ss") => {
|
|
18
|
-
let format = f;
|
|
19
|
-
if (format === "timestamp") {
|
|
20
|
-
format = "x";
|
|
21
|
-
}
|
|
22
|
-
if (v) {
|
|
23
|
-
let time = null;
|
|
24
|
-
if (typeof v === "string" && v.includes("Z") || v.constructor === Date) {
|
|
25
|
-
time = moment__default["default"](v).utcOffset("+08:00").format(format);
|
|
26
|
-
} else {
|
|
27
|
-
time = moment__default["default"](v).format(format);
|
|
28
|
-
}
|
|
29
|
-
if (format === "x") {
|
|
30
|
-
return +time;
|
|
31
|
-
}
|
|
32
|
-
if (time !== "Invalid date") {
|
|
33
|
-
return time;
|
|
34
|
-
}
|
|
35
|
-
return defaultValue;
|
|
36
|
-
}
|
|
37
|
-
return defaultValue;
|
|
38
|
-
};
|
|
39
11
|
const asyncLoadJs = (() => {
|
|
40
12
|
const documentMap = /* @__PURE__ */ new Map();
|
|
41
13
|
return (url, crossOrigin, document = globalThis.document) => {
|
|
@@ -103,6 +75,62 @@
|
|
|
103
75
|
return loaded.get(url);
|
|
104
76
|
};
|
|
105
77
|
})();
|
|
78
|
+
const addClassName = (el, doc, className) => {
|
|
79
|
+
const oldEl = doc.querySelector(`.${className}`);
|
|
80
|
+
if (oldEl && oldEl !== el)
|
|
81
|
+
removeClassName(oldEl, className);
|
|
82
|
+
if (!el.classList.contains(className))
|
|
83
|
+
el.classList.add(className);
|
|
84
|
+
};
|
|
85
|
+
const removeClassName = (el, className) => {
|
|
86
|
+
el.classList.remove(className);
|
|
87
|
+
};
|
|
88
|
+
const removeClassNameByClassName = (doc, className) => {
|
|
89
|
+
const el = doc.querySelector(`.${className}`);
|
|
90
|
+
el?.classList.remove(className);
|
|
91
|
+
return el;
|
|
92
|
+
};
|
|
93
|
+
const injectStyle = (doc, style) => {
|
|
94
|
+
const styleEl = doc.createElement("style");
|
|
95
|
+
styleEl.innerHTML = style;
|
|
96
|
+
doc.head.appendChild(styleEl);
|
|
97
|
+
return styleEl;
|
|
98
|
+
};
|
|
99
|
+
const createDiv = ({ className, cssText }) => {
|
|
100
|
+
const el = globalThis.document.createElement("div");
|
|
101
|
+
el.className = className;
|
|
102
|
+
el.style.cssText = cssText;
|
|
103
|
+
return el;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const sleep = (ms) => new Promise((resolve) => {
|
|
107
|
+
const timer = setTimeout(() => {
|
|
108
|
+
clearTimeout(timer);
|
|
109
|
+
resolve();
|
|
110
|
+
}, ms);
|
|
111
|
+
});
|
|
112
|
+
const datetimeFormatter = (v, defaultValue = "-", f = "YYYY-MM-DD HH:mm:ss") => {
|
|
113
|
+
let format = f;
|
|
114
|
+
if (format === "timestamp") {
|
|
115
|
+
format = "x";
|
|
116
|
+
}
|
|
117
|
+
if (v) {
|
|
118
|
+
let time = null;
|
|
119
|
+
if (typeof v === "string" && v.includes("Z") || v.constructor === Date) {
|
|
120
|
+
time = moment__default["default"](v).utcOffset("+08:00").format(format);
|
|
121
|
+
} else {
|
|
122
|
+
time = moment__default["default"](v).format(format);
|
|
123
|
+
}
|
|
124
|
+
if (format === "x") {
|
|
125
|
+
return +time;
|
|
126
|
+
}
|
|
127
|
+
if (time !== "Invalid date") {
|
|
128
|
+
return time;
|
|
129
|
+
}
|
|
130
|
+
return defaultValue;
|
|
131
|
+
}
|
|
132
|
+
return defaultValue;
|
|
133
|
+
};
|
|
106
134
|
const toLine = (name = "") => name.replace(/\B([A-Z])/g, "-$1").toLowerCase();
|
|
107
135
|
const toHump = (name = "") => name.replace(/-(\w)/g, (all, letter) => letter.toUpperCase());
|
|
108
136
|
const emptyFn = () => void 0;
|
|
@@ -149,17 +177,31 @@
|
|
|
149
177
|
const isPop = (node) => Boolean(node.type?.toLowerCase().endsWith("pop"));
|
|
150
178
|
const isPage = (node) => Boolean(node.type?.toLowerCase() === schema.NodeType.PAGE);
|
|
151
179
|
const isNumber = (value) => /^(-?\d+)(\.\d+)?$/.test(value);
|
|
180
|
+
const getHost = (targetUrl) => targetUrl.match(/\/\/([^/]+)/)?.[1];
|
|
181
|
+
const isSameDomain = (targetUrl = "", source = globalThis.location.host) => {
|
|
182
|
+
const isHttpUrl = /^(http[s]?:)?\/\//.test(targetUrl);
|
|
183
|
+
if (!isHttpUrl)
|
|
184
|
+
return true;
|
|
185
|
+
return getHost(targetUrl) === source;
|
|
186
|
+
};
|
|
152
187
|
|
|
188
|
+
exports.addClassName = addClassName;
|
|
153
189
|
exports.asyncLoadCss = asyncLoadCss;
|
|
154
190
|
exports.asyncLoadJs = asyncLoadJs;
|
|
191
|
+
exports.createDiv = createDiv;
|
|
155
192
|
exports.datetimeFormatter = datetimeFormatter;
|
|
156
193
|
exports.emptyFn = emptyFn;
|
|
157
194
|
exports.filterXSS = filterXSS;
|
|
195
|
+
exports.getHost = getHost;
|
|
158
196
|
exports.getNodePath = getNodePath;
|
|
159
197
|
exports.getUrlParam = getUrlParam;
|
|
198
|
+
exports.injectStyle = injectStyle;
|
|
160
199
|
exports.isNumber = isNumber;
|
|
161
200
|
exports.isPage = isPage;
|
|
162
201
|
exports.isPop = isPop;
|
|
202
|
+
exports.isSameDomain = isSameDomain;
|
|
203
|
+
exports.removeClassName = removeClassName;
|
|
204
|
+
exports.removeClassNameByClassName = removeClassNameByClassName;
|
|
163
205
|
exports.sleep = sleep;
|
|
164
206
|
exports.toHump = toHump;
|
|
165
207
|
exports.toLine = toLine;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmagic-utils.umd.js","sources":["../src/index.ts"],"sourcesContent":["/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport moment from 'moment';\n\nimport type { MNode } from '@tmagic/schema';\nimport { NodeType } from '@tmagic/schema';\n\nexport const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => {\n const timer = setTimeout(() => {\n clearTimeout(timer);\n resolve();\n }, ms);\n });\n\nexport const datetimeFormatter = (v: string | Date, defaultValue = '-', f = 'YYYY-MM-DD HH:mm:ss') => {\n let format = f;\n if (format === 'timestamp') {\n format = 'x';\n }\n\n if (v) {\n let time = null;\n if ((typeof v === 'string' && v.includes('Z')) || v.constructor === Date) {\n // UTC字符串时间或Date对象格式化为北京时间\n time = moment(v).utcOffset('+08:00').format(format);\n } else {\n time = moment(v).format(format);\n }\n\n if (format === 'x') {\n return +time;\n }\n // 格式化为北京时间\n if (time !== 'Invalid date') {\n return time;\n }\n return defaultValue;\n }\n return defaultValue;\n};\n\nexport const asyncLoadJs = (() => {\n // 正在加载或加载成功的存入此Map中\n const documentMap = new Map();\n\n return (url: string, crossOrigin?: string, document = globalThis.document) => {\n let loaded = documentMap.get(document);\n if (!loaded) {\n loaded = new Map();\n documentMap.set(document, loaded);\n }\n\n // 正在加载或已经加载成功的,直接返回\n if (loaded.get(url)) return loaded.get(url);\n\n const load = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.type = 'text/javascript';\n if (crossOrigin) {\n script.crossOrigin = crossOrigin;\n }\n script.src = url;\n document.body.appendChild(script);\n script.onload = () => {\n resolve();\n };\n script.onerror = () => {\n reject(new Error('加载失败'));\n };\n setTimeout(() => {\n reject(new Error('timeout'));\n }, 60 * 1000);\n }).catch((err) => {\n // 加载失败的,从map中移除,第二次加载时,可以再次执行加载\n loaded.delete(url);\n throw err;\n });\n\n loaded.set(url, load);\n return loaded.get(url);\n };\n})();\n\nexport const asyncLoadCss = (() => {\n // 正在加载或加载成功的存入此Map中\n const documentMap = new Map();\n\n return (url: string, document = globalThis.document) => {\n let loaded = documentMap.get(document);\n if (!loaded) {\n loaded = new Map();\n documentMap.set(document, loaded);\n }\n\n // 正在加载或已经加载成功的,直接返回\n if (loaded.get(url)) return loaded.get(url);\n\n const load = new Promise<void>((resolve, reject) => {\n const node = document.createElement('link');\n node.rel = 'stylesheet';\n node.href = url;\n document.head.appendChild(node);\n node.onload = () => {\n resolve();\n };\n node.onerror = () => {\n reject(new Error('加载失败'));\n };\n setTimeout(() => {\n reject(new Error('timeout'));\n }, 60 * 1000);\n }).catch((err) => {\n // 加载失败的,从map中移除,第二次加载时,可以再次执行加载\n loaded.delete(url);\n throw err;\n });\n\n loaded.set(url, load);\n return loaded.get(url);\n };\n})();\n\n// 驼峰转换横线\nexport const toLine = (name = '') => name.replace(/\\B([A-Z])/g, '-$1').toLowerCase();\n\nexport const toHump = (name = ''): string => name.replace(/-(\\w)/g, (all, letter) => letter.toUpperCase());\n\nexport const emptyFn = (): any => undefined;\n\n/**\n * 通过id获取组件在应用的子孙路径\n * @param {number | string} id 组件id\n * @param {Array} data 要查找的根容器节点\n * @return {Array} 组件在data中的子孙路径\n */\nexport const getNodePath = (id: number | string, data: MNode[] = []): MNode[] => {\n const path: MNode[] = [];\n\n const get = function (id: number | string, data: MNode[]): MNode | null {\n if (!Array.isArray(data)) {\n return null;\n }\n\n for (let i = 0, l = data.length; i < l; i++) {\n const item: any = data[i];\n\n path.push(item);\n if (`${item.id}` === `${id}`) {\n return item;\n }\n\n if (item.items) {\n const node = get(id, item.items);\n if (node) {\n return node;\n }\n }\n\n path.pop();\n }\n\n return null;\n };\n\n get(id, data);\n\n return path;\n};\n\nexport const filterXSS = (str: string) =>\n str.replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n\nexport const getUrlParam = (param: string, url?: string) => {\n const u = url || location.href;\n const reg = new RegExp(`[?&#]${param}=([^&#]+)`, 'gi');\n\n const matches = u.match(reg);\n let strArr;\n if (matches && matches.length > 0) {\n strArr = matches[matches.length - 1].split('=');\n if (strArr && strArr.length > 1) {\n // 过滤XSS字符\n return filterXSS(strArr[1]);\n }\n return '';\n }\n return '';\n};\n\nexport const isPop = (node: MNode): boolean => Boolean(node.type?.toLowerCase().endsWith('pop'));\n\nexport const isPage = (node: MNode): boolean => Boolean(node.type?.toLowerCase() === NodeType.PAGE);\n\nexport const isNumber = (value: string) => /^(-?\\d+)(\\.\\d+)?$/.test(value);\n"],"names":["moment","NodeType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tmagic-utils.umd.js","sources":["../src/dom.ts","../src/index.ts"],"sourcesContent":["export const asyncLoadJs = (() => {\n // 正在加载或加载成功的存入此Map中\n const documentMap = new Map();\n\n return (url: string, crossOrigin?: string, document = globalThis.document) => {\n let loaded = documentMap.get(document);\n if (!loaded) {\n loaded = new Map();\n documentMap.set(document, loaded);\n }\n\n // 正在加载或已经加载成功的,直接返回\n if (loaded.get(url)) return loaded.get(url);\n\n const load = new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.type = 'text/javascript';\n if (crossOrigin) {\n script.crossOrigin = crossOrigin;\n }\n script.src = url;\n document.body.appendChild(script);\n script.onload = () => {\n resolve();\n };\n script.onerror = () => {\n reject(new Error('加载失败'));\n };\n setTimeout(() => {\n reject(new Error('timeout'));\n }, 60 * 1000);\n }).catch((err) => {\n // 加载失败的,从map中移除,第二次加载时,可以再次执行加载\n loaded.delete(url);\n throw err;\n });\n\n loaded.set(url, load);\n return loaded.get(url);\n };\n})();\n\nexport const asyncLoadCss = (() => {\n // 正在加载或加载成功的存入此Map中\n const documentMap = new Map();\n\n return (url: string, document = globalThis.document) => {\n let loaded = documentMap.get(document);\n if (!loaded) {\n loaded = new Map();\n documentMap.set(document, loaded);\n }\n\n // 正在加载或已经加载成功的,直接返回\n if (loaded.get(url)) return loaded.get(url);\n\n const load = new Promise<void>((resolve, reject) => {\n const node = document.createElement('link');\n node.rel = 'stylesheet';\n node.href = url;\n document.head.appendChild(node);\n node.onload = () => {\n resolve();\n };\n node.onerror = () => {\n reject(new Error('加载失败'));\n };\n setTimeout(() => {\n reject(new Error('timeout'));\n }, 60 * 1000);\n }).catch((err) => {\n // 加载失败的,从map中移除,第二次加载时,可以再次执行加载\n loaded.delete(url);\n throw err;\n });\n\n loaded.set(url, load);\n return loaded.get(url);\n };\n})();\n\nexport const addClassName = (el: Element, doc: Document, className: string) => {\n const oldEl = doc.querySelector(`.${className}`);\n if (oldEl && oldEl !== el) removeClassName(oldEl, className);\n if (!el.classList.contains(className)) el.classList.add(className);\n};\n\nexport const removeClassName = (el: Element, className: string) => {\n el.classList.remove(className);\n};\n\nexport const removeClassNameByClassName = (doc: Document, className: string) => {\n const el: HTMLElement | null = doc.querySelector(`.${className}`);\n el?.classList.remove(className);\n return el;\n};\n\nexport const injectStyle = (doc: Document, style: string) => {\n const styleEl = doc.createElement('style');\n styleEl.innerHTML = style;\n doc.head.appendChild(styleEl);\n return styleEl;\n};\n\nexport const createDiv = ({ className, cssText }: { className: string; cssText: string }) => {\n const el = globalThis.document.createElement('div');\n el.className = className;\n el.style.cssText = cssText;\n return el;\n};\n","/*\n * Tencent is pleased to support the open source community by making TMagicEditor available.\n *\n * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport moment from 'moment';\n\nimport type { MNode } from '@tmagic/schema';\nimport { NodeType } from '@tmagic/schema';\n\nexport * from './dom';\n\nexport const sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => {\n const timer = setTimeout(() => {\n clearTimeout(timer);\n resolve();\n }, ms);\n });\n\nexport const datetimeFormatter = (v: string | Date, defaultValue = '-', f = 'YYYY-MM-DD HH:mm:ss') => {\n let format = f;\n if (format === 'timestamp') {\n format = 'x';\n }\n\n if (v) {\n let time = null;\n if ((typeof v === 'string' && v.includes('Z')) || v.constructor === Date) {\n // UTC字符串时间或Date对象格式化为北京时间\n time = moment(v).utcOffset('+08:00').format(format);\n } else {\n time = moment(v).format(format);\n }\n\n if (format === 'x') {\n return +time;\n }\n // 格式化为北京时间\n if (time !== 'Invalid date') {\n return time;\n }\n return defaultValue;\n }\n return defaultValue;\n};\n\n// 驼峰转换横线\nexport const toLine = (name = '') => name.replace(/\\B([A-Z])/g, '-$1').toLowerCase();\n\nexport const toHump = (name = ''): string => name.replace(/-(\\w)/g, (all, letter) => letter.toUpperCase());\n\nexport const emptyFn = (): any => undefined;\n\n/**\n * 通过id获取组件在应用的子孙路径\n * @param {number | string} id 组件id\n * @param {Array} data 要查找的根容器节点\n * @return {Array} 组件在data中的子孙路径\n */\nexport const getNodePath = (id: number | string, data: MNode[] = []): MNode[] => {\n const path: MNode[] = [];\n\n const get = function (id: number | string, data: MNode[]): MNode | null {\n if (!Array.isArray(data)) {\n return null;\n }\n\n for (let i = 0, l = data.length; i < l; i++) {\n const item: any = data[i];\n\n path.push(item);\n if (`${item.id}` === `${id}`) {\n return item;\n }\n\n if (item.items) {\n const node = get(id, item.items);\n if (node) {\n return node;\n }\n }\n\n path.pop();\n }\n\n return null;\n };\n\n get(id, data);\n\n return path;\n};\n\nexport const filterXSS = (str: string) =>\n str.replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n\nexport const getUrlParam = (param: string, url?: string) => {\n const u = url || location.href;\n const reg = new RegExp(`[?&#]${param}=([^&#]+)`, 'gi');\n\n const matches = u.match(reg);\n let strArr;\n if (matches && matches.length > 0) {\n strArr = matches[matches.length - 1].split('=');\n if (strArr && strArr.length > 1) {\n // 过滤XSS字符\n return filterXSS(strArr[1]);\n }\n return '';\n }\n return '';\n};\n\nexport const isPop = (node: MNode): boolean => Boolean(node.type?.toLowerCase().endsWith('pop'));\n\nexport const isPage = (node: MNode): boolean => Boolean(node.type?.toLowerCase() === NodeType.PAGE);\n\nexport const isNumber = (value: string) => /^(-?\\d+)(\\.\\d+)?$/.test(value);\n\nexport const getHost = (targetUrl: string) => targetUrl.match(/\\/\\/([^/]+)/)?.[1];\n\nexport const isSameDomain = (targetUrl = '', source = globalThis.location.host) => {\n const isHttpUrl = /^(http[s]?:)?\\/\\//.test(targetUrl);\n\n if (!isHttpUrl) return true;\n\n return getHost(targetUrl) === source;\n};\n"],"names":["moment","NodeType"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const asyncLoadJs: (url: string, crossOrigin?: string | undefined, document?: Document) => any;
|
|
2
|
+
export declare const asyncLoadCss: (url: string, document?: Document) => any;
|
|
3
|
+
export declare const addClassName: (el: Element, doc: Document, className: string) => void;
|
|
4
|
+
export declare const removeClassName: (el: Element, className: string) => void;
|
|
5
|
+
export declare const removeClassNameByClassName: (doc: Document, className: string) => HTMLElement | null;
|
|
6
|
+
export declare const injectStyle: (doc: Document, style: string) => HTMLStyleElement;
|
|
7
|
+
export declare const createDiv: ({ className, cssText }: {
|
|
8
|
+
className: string;
|
|
9
|
+
cssText: string;
|
|
10
|
+
}) => HTMLDivElement;
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import type { MNode } from '@tmagic/schema';
|
|
2
|
+
export * from './dom';
|
|
2
3
|
export declare const sleep: (ms: number) => Promise<void>;
|
|
3
4
|
export declare const datetimeFormatter: (v: string | Date, defaultValue?: string, f?: string) => string | number;
|
|
4
|
-
export declare const asyncLoadJs: (url: string, crossOrigin?: string | undefined, document?: Document) => any;
|
|
5
|
-
export declare const asyncLoadCss: (url: string, document?: Document) => any;
|
|
6
5
|
export declare const toLine: (name?: string) => string;
|
|
7
6
|
export declare const toHump: (name?: string) => string;
|
|
8
7
|
export declare const emptyFn: () => any;
|
|
@@ -18,3 +17,5 @@ export declare const getUrlParam: (param: string, url?: string | undefined) => s
|
|
|
18
17
|
export declare const isPop: (node: MNode) => boolean;
|
|
19
18
|
export declare const isPage: (node: MNode) => boolean;
|
|
20
19
|
export declare const isNumber: (value: string) => boolean;
|
|
20
|
+
export declare const getHost: (targetUrl: string) => string | undefined;
|
|
21
|
+
export declare const isSameDomain: (targetUrl?: string, source?: string) => boolean;
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.0.
|
|
2
|
+
"version": "1.1.0-beta.1",
|
|
3
3
|
"name": "@tmagic/utils",
|
|
4
4
|
"main": "dist/tmagic-utils.umd.js",
|
|
5
5
|
"module": "dist/tmagic-utils.es.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"url": "https://github.com/Tencent/tmagic-editor.git"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@tmagic/schema": "1.0.
|
|
25
|
+
"@tmagic/schema": "1.1.0-beta.1",
|
|
26
26
|
"moment": "^2.29.2"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
package/src/dom.ts
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export const asyncLoadJs = (() => {
|
|
2
|
+
// 正在加载或加载成功的存入此Map中
|
|
3
|
+
const documentMap = new Map();
|
|
4
|
+
|
|
5
|
+
return (url: string, crossOrigin?: string, document = globalThis.document) => {
|
|
6
|
+
let loaded = documentMap.get(document);
|
|
7
|
+
if (!loaded) {
|
|
8
|
+
loaded = new Map();
|
|
9
|
+
documentMap.set(document, loaded);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// 正在加载或已经加载成功的,直接返回
|
|
13
|
+
if (loaded.get(url)) return loaded.get(url);
|
|
14
|
+
|
|
15
|
+
const load = new Promise<void>((resolve, reject) => {
|
|
16
|
+
const script = document.createElement('script');
|
|
17
|
+
script.type = 'text/javascript';
|
|
18
|
+
if (crossOrigin) {
|
|
19
|
+
script.crossOrigin = crossOrigin;
|
|
20
|
+
}
|
|
21
|
+
script.src = url;
|
|
22
|
+
document.body.appendChild(script);
|
|
23
|
+
script.onload = () => {
|
|
24
|
+
resolve();
|
|
25
|
+
};
|
|
26
|
+
script.onerror = () => {
|
|
27
|
+
reject(new Error('加载失败'));
|
|
28
|
+
};
|
|
29
|
+
setTimeout(() => {
|
|
30
|
+
reject(new Error('timeout'));
|
|
31
|
+
}, 60 * 1000);
|
|
32
|
+
}).catch((err) => {
|
|
33
|
+
// 加载失败的,从map中移除,第二次加载时,可以再次执行加载
|
|
34
|
+
loaded.delete(url);
|
|
35
|
+
throw err;
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
loaded.set(url, load);
|
|
39
|
+
return loaded.get(url);
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
|
|
43
|
+
export const asyncLoadCss = (() => {
|
|
44
|
+
// 正在加载或加载成功的存入此Map中
|
|
45
|
+
const documentMap = new Map();
|
|
46
|
+
|
|
47
|
+
return (url: string, document = globalThis.document) => {
|
|
48
|
+
let loaded = documentMap.get(document);
|
|
49
|
+
if (!loaded) {
|
|
50
|
+
loaded = new Map();
|
|
51
|
+
documentMap.set(document, loaded);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// 正在加载或已经加载成功的,直接返回
|
|
55
|
+
if (loaded.get(url)) return loaded.get(url);
|
|
56
|
+
|
|
57
|
+
const load = new Promise<void>((resolve, reject) => {
|
|
58
|
+
const node = document.createElement('link');
|
|
59
|
+
node.rel = 'stylesheet';
|
|
60
|
+
node.href = url;
|
|
61
|
+
document.head.appendChild(node);
|
|
62
|
+
node.onload = () => {
|
|
63
|
+
resolve();
|
|
64
|
+
};
|
|
65
|
+
node.onerror = () => {
|
|
66
|
+
reject(new Error('加载失败'));
|
|
67
|
+
};
|
|
68
|
+
setTimeout(() => {
|
|
69
|
+
reject(new Error('timeout'));
|
|
70
|
+
}, 60 * 1000);
|
|
71
|
+
}).catch((err) => {
|
|
72
|
+
// 加载失败的,从map中移除,第二次加载时,可以再次执行加载
|
|
73
|
+
loaded.delete(url);
|
|
74
|
+
throw err;
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
loaded.set(url, load);
|
|
78
|
+
return loaded.get(url);
|
|
79
|
+
};
|
|
80
|
+
})();
|
|
81
|
+
|
|
82
|
+
export const addClassName = (el: Element, doc: Document, className: string) => {
|
|
83
|
+
const oldEl = doc.querySelector(`.${className}`);
|
|
84
|
+
if (oldEl && oldEl !== el) removeClassName(oldEl, className);
|
|
85
|
+
if (!el.classList.contains(className)) el.classList.add(className);
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const removeClassName = (el: Element, className: string) => {
|
|
89
|
+
el.classList.remove(className);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export const removeClassNameByClassName = (doc: Document, className: string) => {
|
|
93
|
+
const el: HTMLElement | null = doc.querySelector(`.${className}`);
|
|
94
|
+
el?.classList.remove(className);
|
|
95
|
+
return el;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export const injectStyle = (doc: Document, style: string) => {
|
|
99
|
+
const styleEl = doc.createElement('style');
|
|
100
|
+
styleEl.innerHTML = style;
|
|
101
|
+
doc.head.appendChild(styleEl);
|
|
102
|
+
return styleEl;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export const createDiv = ({ className, cssText }: { className: string; cssText: string }) => {
|
|
106
|
+
const el = globalThis.document.createElement('div');
|
|
107
|
+
el.className = className;
|
|
108
|
+
el.style.cssText = cssText;
|
|
109
|
+
return el;
|
|
110
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -21,6 +21,8 @@ import moment from 'moment';
|
|
|
21
21
|
import type { MNode } from '@tmagic/schema';
|
|
22
22
|
import { NodeType } from '@tmagic/schema';
|
|
23
23
|
|
|
24
|
+
export * from './dom';
|
|
25
|
+
|
|
24
26
|
export const sleep = (ms: number): Promise<void> =>
|
|
25
27
|
new Promise((resolve) => {
|
|
26
28
|
const timer = setTimeout(() => {
|
|
@@ -56,87 +58,6 @@ export const datetimeFormatter = (v: string | Date, defaultValue = '-', f = 'YYY
|
|
|
56
58
|
return defaultValue;
|
|
57
59
|
};
|
|
58
60
|
|
|
59
|
-
export const asyncLoadJs = (() => {
|
|
60
|
-
// 正在加载或加载成功的存入此Map中
|
|
61
|
-
const documentMap = new Map();
|
|
62
|
-
|
|
63
|
-
return (url: string, crossOrigin?: string, document = globalThis.document) => {
|
|
64
|
-
let loaded = documentMap.get(document);
|
|
65
|
-
if (!loaded) {
|
|
66
|
-
loaded = new Map();
|
|
67
|
-
documentMap.set(document, loaded);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// 正在加载或已经加载成功的,直接返回
|
|
71
|
-
if (loaded.get(url)) return loaded.get(url);
|
|
72
|
-
|
|
73
|
-
const load = new Promise<void>((resolve, reject) => {
|
|
74
|
-
const script = document.createElement('script');
|
|
75
|
-
script.type = 'text/javascript';
|
|
76
|
-
if (crossOrigin) {
|
|
77
|
-
script.crossOrigin = crossOrigin;
|
|
78
|
-
}
|
|
79
|
-
script.src = url;
|
|
80
|
-
document.body.appendChild(script);
|
|
81
|
-
script.onload = () => {
|
|
82
|
-
resolve();
|
|
83
|
-
};
|
|
84
|
-
script.onerror = () => {
|
|
85
|
-
reject(new Error('加载失败'));
|
|
86
|
-
};
|
|
87
|
-
setTimeout(() => {
|
|
88
|
-
reject(new Error('timeout'));
|
|
89
|
-
}, 60 * 1000);
|
|
90
|
-
}).catch((err) => {
|
|
91
|
-
// 加载失败的,从map中移除,第二次加载时,可以再次执行加载
|
|
92
|
-
loaded.delete(url);
|
|
93
|
-
throw err;
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
loaded.set(url, load);
|
|
97
|
-
return loaded.get(url);
|
|
98
|
-
};
|
|
99
|
-
})();
|
|
100
|
-
|
|
101
|
-
export const asyncLoadCss = (() => {
|
|
102
|
-
// 正在加载或加载成功的存入此Map中
|
|
103
|
-
const documentMap = new Map();
|
|
104
|
-
|
|
105
|
-
return (url: string, document = globalThis.document) => {
|
|
106
|
-
let loaded = documentMap.get(document);
|
|
107
|
-
if (!loaded) {
|
|
108
|
-
loaded = new Map();
|
|
109
|
-
documentMap.set(document, loaded);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// 正在加载或已经加载成功的,直接返回
|
|
113
|
-
if (loaded.get(url)) return loaded.get(url);
|
|
114
|
-
|
|
115
|
-
const load = new Promise<void>((resolve, reject) => {
|
|
116
|
-
const node = document.createElement('link');
|
|
117
|
-
node.rel = 'stylesheet';
|
|
118
|
-
node.href = url;
|
|
119
|
-
document.head.appendChild(node);
|
|
120
|
-
node.onload = () => {
|
|
121
|
-
resolve();
|
|
122
|
-
};
|
|
123
|
-
node.onerror = () => {
|
|
124
|
-
reject(new Error('加载失败'));
|
|
125
|
-
};
|
|
126
|
-
setTimeout(() => {
|
|
127
|
-
reject(new Error('timeout'));
|
|
128
|
-
}, 60 * 1000);
|
|
129
|
-
}).catch((err) => {
|
|
130
|
-
// 加载失败的,从map中移除,第二次加载时,可以再次执行加载
|
|
131
|
-
loaded.delete(url);
|
|
132
|
-
throw err;
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
loaded.set(url, load);
|
|
136
|
-
return loaded.get(url);
|
|
137
|
-
};
|
|
138
|
-
})();
|
|
139
|
-
|
|
140
61
|
// 驼峰转换横线
|
|
141
62
|
export const toLine = (name = '') => name.replace(/\B([A-Z])/g, '-$1').toLowerCase();
|
|
142
63
|
|
|
@@ -209,3 +130,13 @@ export const isPop = (node: MNode): boolean => Boolean(node.type?.toLowerCase().
|
|
|
209
130
|
export const isPage = (node: MNode): boolean => Boolean(node.type?.toLowerCase() === NodeType.PAGE);
|
|
210
131
|
|
|
211
132
|
export const isNumber = (value: string) => /^(-?\d+)(\.\d+)?$/.test(value);
|
|
133
|
+
|
|
134
|
+
export const getHost = (targetUrl: string) => targetUrl.match(/\/\/([^/]+)/)?.[1];
|
|
135
|
+
|
|
136
|
+
export const isSameDomain = (targetUrl = '', source = globalThis.location.host) => {
|
|
137
|
+
const isHttpUrl = /^(http[s]?:)?\/\//.test(targetUrl);
|
|
138
|
+
|
|
139
|
+
if (!isHttpUrl) return true;
|
|
140
|
+
|
|
141
|
+
return getHost(targetUrl) === source;
|
|
142
|
+
};
|