@yelon/util 17.3.1 → 18.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (236) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +27 -27
  3. package/array/array-type.service.d.ts +68 -68
  4. package/array/array.service.d.ts +78 -78
  5. package/array/index.d.ts +2 -2
  6. package/browser/cookie.service.d.ts +64 -64
  7. package/browser/copy.d.ts +6 -6
  8. package/browser/index.d.ts +5 -5
  9. package/browser/is-empty.d.ts +6 -6
  10. package/browser/scroll.service.d.ts +34 -34
  11. package/browser/style.d.ts +21 -21
  12. package/config/abc/cell.type.d.ts +118 -118
  13. package/config/abc/date-picker.type.d.ts +52 -52
  14. package/config/abc/error-collect.type.d.ts +10 -10
  15. package/config/abc/exception.type.d.ts +9 -9
  16. package/config/abc/image.type.d.ts +15 -15
  17. package/config/abc/index.d.ts +17 -18
  18. package/config/abc/loading.type.d.ts +31 -31
  19. package/config/abc/lodop.type.d.ts +33 -33
  20. package/config/abc/media.type.d.ts +11 -11
  21. package/config/abc/onboarding.type.d.ts +4 -4
  22. package/config/abc/page-header.type.d.ts +39 -39
  23. package/config/abc/pdf.type.d.ts +35 -35
  24. package/config/abc/se.type.d.ts +32 -32
  25. package/config/abc/sg.type.d.ts +10 -10
  26. package/config/abc/st.type.d.ts +465 -465
  27. package/config/abc/sv.type.d.ts +14 -14
  28. package/config/abc/xlsx.type.d.ts +12 -12
  29. package/config/abc/zip.type.d.ts +10 -10
  30. package/config/acl/acl.type.d.ts +32 -32
  31. package/config/auth/auth.type.d.ts +51 -51
  32. package/config/bis/bis.type.d.ts +11 -11
  33. package/config/cache/cache.type.d.ts +66 -66
  34. package/config/chart/chart.type.d.ts +33 -33
  35. package/config/config.service.d.ts +13 -13
  36. package/config/config.types.d.ts +51 -52
  37. package/config/index.d.ts +14 -14
  38. package/config/mock/mock.type.d.ts +14 -14
  39. package/config/sf/sf.type.d.ts +133 -133
  40. package/config/socket/socket.type.d.ts +4 -4
  41. package/config/theme/http.type.d.ts +15 -15
  42. package/config/theme/i18n.type.d.ts +14 -14
  43. package/config/theme/index.d.ts +3 -3
  44. package/config/theme/pipe.type.d.ts +3 -3
  45. package/config/theme/responsive.type.d.ts +12 -12
  46. package/config/util/array.type.d.ts +22 -22
  47. package/config/util/currency.type.d.ts +39 -39
  48. package/date-time/index.d.ts +2 -2
  49. package/date-time/picker.d.ts +68 -68
  50. package/date-time/time.d.ts +39 -39
  51. package/decorator/convert.d.ts +32 -32
  52. package/decorator/index.d.ts +2 -2
  53. package/decorator/zone-outside.d.ts +35 -35
  54. package/esm2022/array/array-type.service.mjs +1 -1
  55. package/esm2022/array/array.mjs +4 -4
  56. package/esm2022/array/array.service.mjs +277 -277
  57. package/esm2022/array/index.mjs +2 -2
  58. package/esm2022/browser/browser.mjs +4 -4
  59. package/esm2022/browser/cookie.service.mjs +99 -99
  60. package/esm2022/browser/copy.mjs +27 -27
  61. package/esm2022/browser/index.mjs +5 -5
  62. package/esm2022/browser/is-empty.mjs +18 -18
  63. package/esm2022/browser/scroll.service.mjs +84 -84
  64. package/esm2022/browser/style.mjs +37 -37
  65. package/esm2022/config/abc/cell.type.mjs +1 -1
  66. package/esm2022/config/abc/date-picker.type.mjs +1 -1
  67. package/esm2022/config/abc/error-collect.type.mjs +1 -1
  68. package/esm2022/config/abc/exception.type.mjs +1 -1
  69. package/esm2022/config/abc/image.type.mjs +1 -1
  70. package/esm2022/config/abc/index.mjs +18 -19
  71. package/esm2022/config/abc/loading.type.mjs +1 -1
  72. package/esm2022/config/abc/lodop.type.mjs +1 -1
  73. package/esm2022/config/abc/media.type.mjs +1 -1
  74. package/esm2022/config/abc/onboarding.type.mjs +1 -1
  75. package/esm2022/config/abc/page-header.type.mjs +1 -1
  76. package/esm2022/config/abc/pdf.type.mjs +1 -1
  77. package/esm2022/config/abc/se.type.mjs +1 -1
  78. package/esm2022/config/abc/sg.type.mjs +1 -1
  79. package/esm2022/config/abc/st.type.mjs +1 -1
  80. package/esm2022/config/abc/sv.type.mjs +2 -2
  81. package/esm2022/config/abc/xlsx.type.mjs +1 -1
  82. package/esm2022/config/abc/zip.type.mjs +1 -1
  83. package/esm2022/config/acl/acl.type.mjs +1 -1
  84. package/esm2022/config/auth/auth.type.mjs +1 -1
  85. package/esm2022/config/bis/bis.type.mjs +1 -1
  86. package/esm2022/config/cache/cache.type.mjs +1 -1
  87. package/esm2022/config/chart/chart.type.mjs +1 -1
  88. package/esm2022/config/config.mjs +4 -4
  89. package/esm2022/config/config.service.mjs +37 -37
  90. package/esm2022/config/config.types.mjs +12 -12
  91. package/esm2022/config/index.mjs +14 -14
  92. package/esm2022/config/mock/mock.type.mjs +1 -1
  93. package/esm2022/config/sf/sf.type.mjs +1 -1
  94. package/esm2022/config/socket/socket.type.mjs +1 -1
  95. package/esm2022/config/theme/http.type.mjs +1 -1
  96. package/esm2022/config/theme/i18n.type.mjs +1 -1
  97. package/esm2022/config/theme/index.mjs +3 -3
  98. package/esm2022/config/theme/pipe.type.mjs +1 -1
  99. package/esm2022/config/theme/responsive.type.mjs +1 -1
  100. package/esm2022/config/util/array.type.mjs +1 -1
  101. package/esm2022/config/util/currency.type.mjs +1 -1
  102. package/esm2022/date-time/date-time.mjs +4 -4
  103. package/esm2022/date-time/index.mjs +2 -2
  104. package/esm2022/date-time/picker.mjs +115 -115
  105. package/esm2022/date-time/time.mjs +100 -100
  106. package/esm2022/decorator/convert.mjs +65 -65
  107. package/esm2022/decorator/decorator.mjs +4 -4
  108. package/esm2022/decorator/index.mjs +2 -2
  109. package/esm2022/decorator/zone-outside.mjs +56 -56
  110. package/esm2022/form/form.mjs +4 -4
  111. package/esm2022/form/index.mjs +2 -2
  112. package/esm2022/form/match-control.mjs +29 -29
  113. package/esm2022/form/validators.mjs +80 -80
  114. package/esm2022/format/currency.service.mjs +232 -232
  115. package/esm2022/format/currency.types.mjs +7 -7
  116. package/esm2022/format/format.mjs +4 -4
  117. package/esm2022/format/index.mjs +4 -4
  118. package/esm2022/format/string.mjs +84 -84
  119. package/esm2022/format/validate.mjs +93 -93
  120. package/esm2022/index.mjs +13 -13
  121. package/esm2022/math/in-range.mjs +24 -24
  122. package/esm2022/math/index.mjs +2 -2
  123. package/esm2022/math/math.mjs +4 -4
  124. package/esm2022/math/round.mjs +52 -52
  125. package/esm2022/mcache/index.mjs +1 -1
  126. package/esm2022/mcache/localStorageUtils.mjs +58 -58
  127. package/esm2022/mcache/mcache.mjs +4 -4
  128. package/esm2022/mtypes/authority.type.mjs +1 -1
  129. package/esm2022/mtypes/header-menu.type.mjs +1 -1
  130. package/esm2022/mtypes/index.mjs +9 -9
  131. package/esm2022/mtypes/menu.type.mjs +1 -1
  132. package/esm2022/mtypes/mtypes.mjs +4 -4
  133. package/esm2022/mtypes/nav.types.mjs +8 -8
  134. package/esm2022/mtypes/page.mjs +41 -41
  135. package/esm2022/mtypes/project-info.types.mjs +1 -1
  136. package/esm2022/mtypes/response.mjs +1 -1
  137. package/esm2022/mtypes/role.type.mjs +1 -1
  138. package/esm2022/mtypes/user.types.mjs +1 -1
  139. package/esm2022/other/assert.mjs +66 -66
  140. package/esm2022/other/deep.mjs +77 -77
  141. package/esm2022/other/favicon.mjs +28 -28
  142. package/esm2022/other/index.mjs +7 -7
  143. package/esm2022/other/lazy.service.mjs +128 -128
  144. package/esm2022/other/logger.mjs +32 -32
  145. package/esm2022/other/other.mjs +4 -4
  146. package/esm2022/other/path-to-regexp.service.mjs +238 -238
  147. package/esm2022/other/resize.mjs +3 -3
  148. package/esm2022/pipes/currency/cny.pipe.mjs +22 -22
  149. package/esm2022/pipes/currency/index.mjs +4 -4
  150. package/esm2022/pipes/currency/mega.pipe.mjs +24 -24
  151. package/esm2022/pipes/currency/module.mjs +18 -18
  152. package/esm2022/pipes/currency/pipe-currency.mjs +4 -4
  153. package/esm2022/pipes/currency/price.pipe.mjs +26 -26
  154. package/esm2022/pipes/filter/filter.pipe.mjs +19 -19
  155. package/esm2022/pipes/filter/index.mjs +2 -2
  156. package/esm2022/pipes/filter/module.mjs +16 -16
  157. package/esm2022/pipes/filter/pipe-filter.mjs +4 -4
  158. package/esm2022/pipes/format/index.mjs +2 -2
  159. package/esm2022/pipes/format/mask.pipe.mjs +33 -33
  160. package/esm2022/pipes/format/module.mjs +16 -16
  161. package/esm2022/pipes/format/pipe-format.mjs +4 -4
  162. package/esm2022/pipes/index.mjs +3 -3
  163. package/esm2022/pipes/pipes.mjs +4 -4
  164. package/esm2022/token/index.mjs +2 -2
  165. package/esm2022/token/page-visibility.mjs +14 -14
  166. package/esm2022/token/token.mjs +4 -4
  167. package/esm2022/token/window.mjs +16 -16
  168. package/esm2022/yelon-util.mjs +4 -4
  169. package/fesm2022/array.mjs +285 -285
  170. package/fesm2022/browser.mjs +273 -273
  171. package/fesm2022/config.mjs +58 -58
  172. package/fesm2022/config.mjs.map +1 -1
  173. package/fesm2022/date-time.mjs +223 -223
  174. package/fesm2022/decorator.mjs +129 -129
  175. package/fesm2022/form.mjs +118 -118
  176. package/fesm2022/format.mjs +426 -426
  177. package/fesm2022/math.mjs +85 -85
  178. package/fesm2022/mcache.mjs +65 -65
  179. package/fesm2022/mtypes.mjs +57 -57
  180. package/fesm2022/other.mjs +583 -583
  181. package/fesm2022/pipe-currency.mjs +90 -90
  182. package/fesm2022/pipe-filter.mjs +41 -41
  183. package/fesm2022/pipe-format.mjs +55 -55
  184. package/fesm2022/pipes.mjs +8 -8
  185. package/fesm2022/token.mjs +37 -37
  186. package/fesm2022/yelon-util.mjs +18 -18
  187. package/form/index.d.ts +2 -2
  188. package/form/match-control.d.ts +15 -15
  189. package/form/validators.d.ts +62 -62
  190. package/format/currency.service.d.ts +38 -38
  191. package/format/currency.types.d.ts +82 -82
  192. package/format/index.d.ts +4 -4
  193. package/format/string.d.ts +44 -44
  194. package/format/validate.d.ts +72 -72
  195. package/index.d.ts +13 -13
  196. package/math/in-range.d.ts +14 -14
  197. package/math/index.d.ts +2 -2
  198. package/math/round.d.ts +33 -33
  199. package/mcache/index.d.ts +1 -1
  200. package/mcache/localStorageUtils.d.ts +18 -18
  201. package/mtypes/authority.type.d.ts +3 -3
  202. package/mtypes/header-menu.type.d.ts +13 -13
  203. package/mtypes/index.d.ts +9 -9
  204. package/mtypes/menu.type.d.ts +41 -41
  205. package/mtypes/nav.types.d.ts +29 -29
  206. package/mtypes/page.d.ts +47 -47
  207. package/mtypes/project-info.types.d.ts +22 -22
  208. package/mtypes/response.d.ts +7 -7
  209. package/mtypes/role.type.d.ts +10 -10
  210. package/mtypes/user.types.d.ts +22 -22
  211. package/other/assert.d.ts +36 -36
  212. package/other/deep.d.ts +35 -35
  213. package/other/favicon.d.ts +2 -2
  214. package/other/index.d.ts +7 -7
  215. package/other/lazy.service.d.ts +47 -47
  216. package/other/logger.d.ts +5 -5
  217. package/other/path-to-regexp.service.d.ts +27 -27
  218. package/other/resize.d.ts +1 -1
  219. package/package.json +135 -135
  220. package/pipes/currency/cny.pipe.d.ts +14 -14
  221. package/pipes/currency/index.d.ts +4 -4
  222. package/pipes/currency/mega.pipe.d.ts +15 -15
  223. package/pipes/currency/module.d.ts +9 -9
  224. package/pipes/currency/price.pipe.d.ts +18 -18
  225. package/pipes/filter/filter.pipe.d.ts +13 -13
  226. package/pipes/filter/index.d.ts +2 -2
  227. package/pipes/filter/module.d.ts +7 -7
  228. package/pipes/format/index.d.ts +2 -2
  229. package/pipes/format/mask.pipe.d.ts +27 -27
  230. package/pipes/format/module.d.ts +7 -7
  231. package/pipes/index.d.ts +3 -3
  232. package/token/index.d.ts +2 -2
  233. package/token/page-visibility.d.ts +8 -8
  234. package/token/window.d.ts +7 -7
  235. package/config/abc/qr.type.d.ts +0 -25
  236. package/esm2022/config/abc/qr.type.mjs +0 -2
@@ -1,583 +1,583 @@
1
- import extend from 'extend';
2
- import { DOCUMENT } from '@angular/common';
3
- import * as i0 from '@angular/core';
4
- import { inject, Injectable } from '@angular/core';
5
- import { BehaviorSubject, share, filter, isObservable } from 'rxjs';
6
-
7
- /**
8
- * Gets the value at `path` of `object`, like `_.get` in lodash.
9
- *
10
- * 类似 `_.get`,根据 `path` 获取安全值
11
- */
12
- function deepGet(obj, path, defaultValue) {
13
- if (!obj || path == null || path.length === 0)
14
- return defaultValue;
15
- if (!Array.isArray(path)) {
16
- path = ~path.indexOf('.') ? path.split('.') : [path];
17
- }
18
- if (path.length === 1) {
19
- const checkObj = obj[path[0]];
20
- return typeof checkObj === 'undefined' ? defaultValue : checkObj;
21
- }
22
- const res = path.reduce((o, k) => (o || {})[k], obj);
23
- return typeof res === 'undefined' ? defaultValue : res;
24
- }
25
- /**
26
- * Base on [extend](https://github.com/justmoon/node-extend) deep copy.
27
- *
28
- * 基于 [extend](https://github.com/justmoon/node-extend) 的深度拷贝
29
- *
30
- * NOTE: Don't a lot of recursion, maybe performance issues
31
- */
32
- function deepCopy(obj) {
33
- const result = extend(true, {}, { _: obj });
34
- return result._;
35
- }
36
- /**
37
- * Deep merge object.
38
- *
39
- * 深度合并对象
40
- *
41
- * @param original 原始对象
42
- * @param arrayProcessMethod 数组处理方式
43
- * - `true` 表示替换新值,不管新值为哪种类型
44
- * - `false` 表示会合并整个数组(将旧数据与新数据合并成新数组)
45
- * @param objects 要合并的对象
46
- */
47
- function deepMergeKey(original, arrayProcessMethod, ...objects) {
48
- if (Array.isArray(original) || typeof original !== 'object')
49
- return original;
50
- const isObject = (v) => typeof v === 'object';
51
- const merge = (target, obj) => {
52
- Object.keys(obj)
53
- .filter(key => key !== '__proto__' && Object.prototype.hasOwnProperty.call(obj, key))
54
- .forEach(key => {
55
- const fromValue = obj[key];
56
- const toValue = target[key];
57
- if (Array.isArray(toValue)) {
58
- target[key] = arrayProcessMethod ? fromValue : [...toValue, ...fromValue];
59
- }
60
- else if (typeof fromValue === 'function') {
61
- target[key] = fromValue;
62
- }
63
- else if (fromValue != null && isObject(fromValue) && toValue != null && isObject(toValue)) {
64
- target[key] = merge(toValue, fromValue);
65
- }
66
- else {
67
- target[key] = deepCopy(fromValue);
68
- }
69
- });
70
- return target;
71
- };
72
- objects.filter(v => v != null && isObject(v)).forEach(v => merge(original, v));
73
- return original;
74
- }
75
- /**
76
- * Deep merge object.
77
- *
78
- * 深度合并对象
79
- */
80
- function deepMerge(original, ...objects) {
81
- return deepMergeKey(original, false, ...objects);
82
- }
83
-
84
- const record = {};
85
- const PREFIX = '[@YELON]:';
86
- function notRecorded(...args) {
87
- const asRecord = args.reduce((acc, c) => acc + c.toString(), '');
88
- if (record[asRecord]) {
89
- return false;
90
- }
91
- else {
92
- record[asRecord] = true;
93
- return true;
94
- }
95
- }
96
- function consoleCommonBehavior(consoleFunc, ...args) {
97
- if ((typeof ngDevMode === 'undefined' || ngDevMode) && notRecorded(...args)) {
98
- consoleFunc(...args);
99
- }
100
- }
101
- // Warning should only be printed in dev mode and only once.
102
- const warn = (...args) => consoleCommonBehavior((...arg) => console.warn(PREFIX, ...arg), ...args);
103
- const warnDeprecation = (...args) => {
104
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
105
- return () => { };
106
- }
107
- const stack = new Error().stack;
108
- return consoleCommonBehavior((...arg) => console.warn(PREFIX, 'deprecated:', ...arg, stack), ...args);
109
- };
110
- // Log should only be printed in dev mode.
111
- const log = (...args) => {
112
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
113
- console.log(PREFIX, ...args);
114
- }
115
- };
116
-
117
- /**
118
- * `LazyService` delay loading JS or CSS files.
119
- *
120
- * 延迟加载资源(js 或 css)服务
121
- */
122
- class LazyService {
123
- constructor() {
124
- this.doc = inject(DOCUMENT);
125
- this.list = {};
126
- this.cached = {};
127
- this._notify = new BehaviorSubject([]);
128
- }
129
- get change() {
130
- return this._notify.asObservable().pipe(share(), filter(ls => ls.length !== 0));
131
- }
132
- clear() {
133
- this.list = {};
134
- this.cached = {};
135
- }
136
- attachAttributes(el, attributes) {
137
- if (attributes == null)
138
- return;
139
- Object.entries(attributes).forEach(([key, value]) => {
140
- el.setAttribute(key, value);
141
- });
142
- }
143
- /**
144
- * Load script or style files
145
- */
146
- load(paths) {
147
- if (!Array.isArray(paths)) {
148
- paths = [paths];
149
- }
150
- const promises = [];
151
- paths
152
- .map(v => (typeof v !== 'object' ? { path: v } : v))
153
- .forEach(item => {
154
- if (item.path.endsWith('.js')) {
155
- promises.push(this.loadScript(item.path, item.options));
156
- }
157
- else {
158
- promises.push(this.loadStyle(item.path, item.options));
159
- }
160
- });
161
- return Promise.all(promises).then(res => {
162
- this._notify.next(res);
163
- return Promise.resolve(res);
164
- });
165
- }
166
- loadScript(path, innerContent, attributes) {
167
- const options = typeof innerContent === 'object'
168
- ? innerContent
169
- : {
170
- innerContent,
171
- attributes
172
- };
173
- return new Promise(resolve => {
174
- if (this.list[path] === true) {
175
- resolve({ ...this.cached[path], status: 'loading' });
176
- return;
177
- }
178
- this.list[path] = true;
179
- const onSuccess = (item) => {
180
- this.cached[path] = item;
181
- resolve(item);
182
- this._notify.next([item]);
183
- };
184
- const node = this.doc.createElement('script');
185
- node.type = 'text/javascript';
186
- node.src = path;
187
- this.attachAttributes(node, options.attributes);
188
- if (options.innerContent) {
189
- node.innerHTML = options.innerContent;
190
- }
191
- node.onload = () => onSuccess({
192
- path,
193
- status: 'ok'
194
- });
195
- node.onerror = error => onSuccess({
196
- path,
197
- status: 'error',
198
- error
199
- });
200
- this.doc.getElementsByTagName('head')[0].appendChild(node);
201
- });
202
- }
203
- loadStyle(path, rel, innerContent, attributes) {
204
- const options = typeof rel === 'object'
205
- ? rel
206
- : {
207
- rel,
208
- innerContent,
209
- attributes
210
- };
211
- return new Promise(resolve => {
212
- if (this.list[path] === true) {
213
- resolve(this.cached[path]);
214
- return;
215
- }
216
- this.list[path] = true;
217
- const node = this.doc.createElement('link');
218
- node.rel = options.rel ?? 'stylesheet';
219
- node.type = 'text/css';
220
- node.href = path;
221
- this.attachAttributes(node, options.attributes);
222
- if (options.innerContent) {
223
- node.innerHTML = options.innerContent;
224
- }
225
- this.doc.getElementsByTagName('head')[0].appendChild(node);
226
- const item = {
227
- path,
228
- status: 'ok'
229
- };
230
- this.cached[path] = item;
231
- resolve(item);
232
- });
233
- }
234
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: LazyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
235
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: LazyService, providedIn: 'root' }); }
236
- }
237
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: LazyService, decorators: [{
238
- type: Injectable,
239
- args: [{ providedIn: 'root' }]
240
- }] });
241
-
242
- function throwError(msg, actual, expected, comparison) {
243
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
244
- throw new Error(`ASSERTION ERROR: ${msg}${comparison == null ? '' : ` [Expected=> ${expected} ${comparison} ${actual} <=Actual]`}`);
245
- }
246
- }
247
- /**
248
- * Assert whether the expression and throw an error into console in dev mode
249
- *
250
- * 断言表达式是否符合预期,并在开发模式下会在控制台抛出一个错误
251
- */
252
- function assert(expression, msg) {
253
- if (!expression) {
254
- throwError(msg);
255
- }
256
- }
257
- /**
258
- * Assert whether empty (`null` or `undefined`)
259
- *
260
- * 断言是否空值(`null` 或 `undefined`)
261
- */
262
- function assertEmpty(actual, msg) {
263
- if (actual == null) {
264
- throwError(msg, typeof actual, 'NULL', '==');
265
- }
266
- }
267
- /**
268
- * Assert whether `number` type
269
- *
270
- * 断言是否 `number` 类型
271
- */
272
- function assertNumber(actual, msg) {
273
- if (!(typeof actual === 'number')) {
274
- throwError(msg, typeof actual, 'number', '===');
275
- }
276
- }
277
- /**
278
- * Assert whether `string` type
279
- *
280
- * 断言是否 `string` 类型
281
- */
282
- function assertString(actual, msg) {
283
- if (!(typeof actual === 'string')) {
284
- throwError(msg, actual === null ? 'null' : typeof actual, 'string', '===');
285
- }
286
- }
287
- /**
288
- * Assert whether `array` type
289
- *
290
- * 断言是否 `array` 类型
291
- */
292
- function assertArray(actual, msg) {
293
- if (!Array.isArray(actual)) {
294
- throwError(msg, actual === null ? 'null' : typeof actual, 'array', '===');
295
- }
296
- }
297
- /**
298
- * Assert whether `Observable` type
299
- *
300
- * 断言是否 `Observable` 类型
301
- */
302
- function assertObservable(obj, msg) {
303
- if (!isObservable(obj)) {
304
- throwError(msg, obj === null ? 'null' : typeof obj, 'Observable', '===');
305
- }
306
- }
307
-
308
- /* eslint-disable @typescript-eslint/explicit-function-return-type */
309
- class PathToRegexpService {
310
- constructor() {
311
- this.DEFAULT_DELIMITER = '/';
312
- this.PATH_REGEXP = new RegExp(['(\\\\.)', '(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?'].join('|'), 'g');
313
- }
314
- parse(str, options) {
315
- const tokens = [];
316
- let key = 0;
317
- let index = 0;
318
- let path = '';
319
- const defaultDelimiter = (options && options.delimiter) || this.DEFAULT_DELIMITER;
320
- const whitelist = (options && options.whitelist) || undefined;
321
- let pathEscaped = false;
322
- let res;
323
- while ((res = this.PATH_REGEXP.exec(str)) !== null) {
324
- const m = res[0];
325
- const escaped = res[1];
326
- const offset = res.index;
327
- path += str.slice(index, offset);
328
- index = offset + m.length;
329
- // Ignore already escaped sequences.
330
- if (escaped) {
331
- path += escaped[1];
332
- pathEscaped = true;
333
- continue;
334
- }
335
- let prev = '';
336
- const name = res[2];
337
- const capture = res[3];
338
- const group = res[4];
339
- const modifier = res[5];
340
- if (!pathEscaped && path.length) {
341
- const k = path.length - 1;
342
- const c = path[k];
343
- const matches = whitelist ? whitelist.indexOf(c) > -1 : true;
344
- if (matches) {
345
- prev = c;
346
- path = path.slice(0, k);
347
- }
348
- }
349
- // Push the current path onto the tokens.
350
- if (path) {
351
- tokens.push(path);
352
- path = '';
353
- pathEscaped = false;
354
- }
355
- const repeat = modifier === '+' || modifier === '*';
356
- const optional = modifier === '?' || modifier === '*';
357
- const pattern = capture || group;
358
- const delimiter = prev || defaultDelimiter;
359
- tokens.push({
360
- name: name || key++,
361
- prefix: prev,
362
- delimiter: delimiter,
363
- optional: optional,
364
- repeat: repeat,
365
- pattern: pattern
366
- ? this.escapeGroup(pattern)
367
- : `[^${this.escapeString(delimiter === defaultDelimiter ? delimiter : delimiter + defaultDelimiter)}]+?`
368
- });
369
- }
370
- // Push NzSafeAny remaining characters.
371
- if (path || index < str.length) {
372
- tokens.push(path + str.substr(index));
373
- }
374
- return tokens;
375
- }
376
- compile(str, options) {
377
- return this.tokensToFunction(this.parse(str, options), options);
378
- }
379
- tokensToFunction(tokens, options) {
380
- const matches = new Array(tokens.length);
381
- for (let i = 0; i < tokens.length; i++) {
382
- if (typeof tokens[i] === 'object') {
383
- matches[i] = new RegExp(`^(?:${tokens[i].pattern})$`, this.flags(options));
384
- }
385
- }
386
- return function (data, options) {
387
- let path = '';
388
- const encode = (options && options.encode) || encodeURIComponent;
389
- const validate = options ? options.validate !== false : true;
390
- for (let i = 0; i < tokens.length; i++) {
391
- const token = tokens[i];
392
- if (typeof token === 'string') {
393
- path += token;
394
- continue;
395
- }
396
- const value = data ? data[token.name] : undefined;
397
- let segment;
398
- if (Array.isArray(value)) {
399
- if (!token.repeat) {
400
- throw new TypeError(`Expected "${token.name}" to not repeat, but got array`);
401
- }
402
- if (value.length === 0) {
403
- if (token.optional) {
404
- continue;
405
- }
406
- throw new TypeError(`Expected "${token.name}" to not be empty`);
407
- }
408
- for (let j = 0; j < value.length; j++) {
409
- segment = encode(value[j], token);
410
- if (validate && !matches[i].test(segment)) {
411
- throw new TypeError(`Expected all "${token.name}" to match "${token.pattern}"`);
412
- }
413
- path += (j === 0 ? token.prefix : token.delimiter) + segment;
414
- }
415
- continue;
416
- }
417
- if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
418
- segment = encode(String(value), token);
419
- if (validate && !matches[i].test(segment)) {
420
- throw new TypeError(`Expected "${token.name}" to match "${token.pattern}", but got "${segment}"`);
421
- }
422
- path += token.prefix + segment;
423
- continue;
424
- }
425
- if (token.optional) {
426
- continue;
427
- }
428
- throw new TypeError(`Expected "${token.name}" to be ${token.repeat ? 'an array' : 'a string'}`);
429
- }
430
- return path;
431
- };
432
- }
433
- escapeString(str) {
434
- return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1');
435
- }
436
- escapeGroup(group) {
437
- return group.replace(/([=!:$/()])/g, '\\$1');
438
- }
439
- flags(options) {
440
- return options && options.sensitive ? '' : 'i';
441
- }
442
- regexpToRegexp(path, keys) {
443
- if (!keys) {
444
- return path;
445
- }
446
- const groups = path.source.match(/\((?!\?)/g);
447
- if (groups) {
448
- for (let i = 0; i < groups.length; i++) {
449
- keys.push({
450
- name: i,
451
- prefix: null,
452
- delimiter: null,
453
- optional: false,
454
- repeat: false,
455
- pattern: null
456
- });
457
- }
458
- }
459
- return path;
460
- }
461
- arrayToRegexp(path, keys, options) {
462
- const parts = [];
463
- for (let i = 0; i < path.length; i++) {
464
- parts.push(this.pathToRegexp(path[i], keys, options).source);
465
- }
466
- return new RegExp(`(?:${parts.join('|')})`, this.flags(options));
467
- }
468
- stringToRegexp(path, keys, options) {
469
- return this.tokensToRegExp(this.parse(path, options), keys, options);
470
- }
471
- tokensToRegExp(tokens, keys, options) {
472
- options = options || {};
473
- const strict = options.strict;
474
- const start = options.start !== false;
475
- const end = options.end !== false;
476
- const delimiter = options.delimiter || this.DEFAULT_DELIMITER;
477
- const endsWith = []
478
- .concat(options.endsWith || [])
479
- .map(this.escapeString)
480
- .concat('$')
481
- .join('|');
482
- let route = start ? '^' : '';
483
- for (let i = 0; i < tokens.length; i++) {
484
- const token = tokens[i];
485
- if (typeof token === 'string') {
486
- route += this.escapeString(token);
487
- }
488
- else {
489
- const capture = token.repeat
490
- ? `(?:${token.pattern})(?:${this.escapeString(token.delimiter)}(?:${token.pattern}))*`
491
- : token.pattern;
492
- if (keys) {
493
- keys.push(token);
494
- }
495
- if (token.optional) {
496
- if (!token.prefix) {
497
- route += `(${capture})?`;
498
- }
499
- else {
500
- route += `(?:${this.escapeString(token.prefix)}(${capture}))?`;
501
- }
502
- }
503
- else {
504
- route += `${this.escapeString(token.prefix)}(${capture})`;
505
- }
506
- }
507
- }
508
- if (end) {
509
- if (!strict) {
510
- route += `(?:${this.escapeString(delimiter)})?`;
511
- }
512
- route += endsWith === '$' ? '$' : `(?=${endsWith})`;
513
- }
514
- else {
515
- const endToken = tokens[tokens.length - 1];
516
- const isEndDelimited = typeof endToken === 'string' ? endToken[endToken.length - 1] === delimiter : endToken === undefined;
517
- if (!strict) {
518
- route += `(?:${this.escapeString(delimiter)}(?=${endsWith}))?`;
519
- }
520
- if (!isEndDelimited) {
521
- route += `(?=${this.escapeString(delimiter)}|${endsWith})`;
522
- }
523
- }
524
- return new RegExp(route, this.flags(options));
525
- }
526
- pathToRegexp(path, keys, options) {
527
- if (path instanceof RegExp) {
528
- return this.regexpToRegexp(path, keys);
529
- }
530
- if (Array.isArray(path)) {
531
- return this.arrayToRegexp(/** @type {!Array} */ path, keys, options);
532
- }
533
- return this.stringToRegexp(/** @type {string} */ path, keys, options);
534
- }
535
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: PathToRegexpService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
536
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: PathToRegexpService, providedIn: 'root' }); }
537
- }
538
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: PathToRegexpService, decorators: [{
539
- type: Injectable,
540
- args: [{
541
- providedIn: 'root'
542
- }]
543
- }], ctorParameters: () => [] });
544
-
545
- const resizeWindow = () => {
546
- window.dispatchEvent(new Event('resize'));
547
- };
548
-
549
- function setFavicon(path) {
550
- const link = document.querySelector("link[rel*='icon']") || document.createElement('link');
551
- link.type = 'image/x-icon';
552
- link.rel = 'shortcut icon';
553
- link.href = path;
554
- document.getElementsByTagName('head')[0].appendChild(link);
555
- }
556
- function hasFavicon(url) {
557
- return new Promise(resolve => {
558
- let xmlHttp;
559
- if (window['XMLHttpRequest']) {
560
- xmlHttp = new XMLHttpRequest();
561
- }
562
- if (xmlHttp) {
563
- xmlHttp.open('Get', url, false);
564
- xmlHttp.send();
565
- if (xmlHttp.status == 404) {
566
- resolve(false);
567
- }
568
- else {
569
- resolve(true);
570
- }
571
- }
572
- else {
573
- resolve(false);
574
- }
575
- });
576
- }
577
-
578
- /**
579
- * Generated bundle index. Do not edit.
580
- */
581
-
582
- export { LazyService, PREFIX, PathToRegexpService, assert, assertArray, assertEmpty, assertNumber, assertObservable, assertString, deepCopy, deepGet, deepMerge, deepMergeKey, hasFavicon, log, resizeWindow, setFavicon, warn, warnDeprecation };
583
- //# sourceMappingURL=other.mjs.map
1
+ import extend from 'extend';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { inject, Injectable } from '@angular/core';
5
+ import { BehaviorSubject, share, filter, isObservable } from 'rxjs';
6
+
7
+ /**
8
+ * Gets the value at `path` of `object`, like `_.get` in lodash.
9
+ *
10
+ * 类似 `_.get`,根据 `path` 获取安全值
11
+ */
12
+ function deepGet(obj, path, defaultValue) {
13
+ if (!obj || path == null || path.length === 0)
14
+ return defaultValue;
15
+ if (!Array.isArray(path)) {
16
+ path = ~path.indexOf('.') ? path.split('.') : [path];
17
+ }
18
+ if (path.length === 1) {
19
+ const checkObj = obj[path[0]];
20
+ return typeof checkObj === 'undefined' ? defaultValue : checkObj;
21
+ }
22
+ const res = path.reduce((o, k) => (o || {})[k], obj);
23
+ return typeof res === 'undefined' ? defaultValue : res;
24
+ }
25
+ /**
26
+ * Base on [extend](https://github.com/justmoon/node-extend) deep copy.
27
+ *
28
+ * 基于 [extend](https://github.com/justmoon/node-extend) 的深度拷贝
29
+ *
30
+ * NOTE: Don't a lot of recursion, maybe performance issues
31
+ */
32
+ function deepCopy(obj) {
33
+ const result = extend(true, {}, { _: obj });
34
+ return result._;
35
+ }
36
+ /**
37
+ * Deep merge object.
38
+ *
39
+ * 深度合并对象
40
+ *
41
+ * @param original 原始对象
42
+ * @param arrayProcessMethod 数组处理方式
43
+ * - `true` 表示替换新值,不管新值为哪种类型
44
+ * - `false` 表示会合并整个数组(将旧数据与新数据合并成新数组)
45
+ * @param objects 要合并的对象
46
+ */
47
+ function deepMergeKey(original, arrayProcessMethod, ...objects) {
48
+ if (Array.isArray(original) || typeof original !== 'object')
49
+ return original;
50
+ const isObject = (v) => typeof v === 'object';
51
+ const merge = (target, obj) => {
52
+ Object.keys(obj)
53
+ .filter(key => key !== '__proto__' && Object.prototype.hasOwnProperty.call(obj, key))
54
+ .forEach(key => {
55
+ const fromValue = obj[key];
56
+ const toValue = target[key];
57
+ if (Array.isArray(toValue)) {
58
+ target[key] = arrayProcessMethod ? fromValue : [...toValue, ...fromValue];
59
+ }
60
+ else if (typeof fromValue === 'function') {
61
+ target[key] = fromValue;
62
+ }
63
+ else if (fromValue != null && isObject(fromValue) && toValue != null && isObject(toValue)) {
64
+ target[key] = merge(toValue, fromValue);
65
+ }
66
+ else {
67
+ target[key] = deepCopy(fromValue);
68
+ }
69
+ });
70
+ return target;
71
+ };
72
+ objects.filter(v => v != null && isObject(v)).forEach(v => merge(original, v));
73
+ return original;
74
+ }
75
+ /**
76
+ * Deep merge object.
77
+ *
78
+ * 深度合并对象
79
+ */
80
+ function deepMerge(original, ...objects) {
81
+ return deepMergeKey(original, false, ...objects);
82
+ }
83
+
84
+ const record = {};
85
+ const PREFIX = '[@YELON]:';
86
+ function notRecorded(...args) {
87
+ const asRecord = args.reduce((acc, c) => acc + c.toString(), '');
88
+ if (record[asRecord]) {
89
+ return false;
90
+ }
91
+ else {
92
+ record[asRecord] = true;
93
+ return true;
94
+ }
95
+ }
96
+ function consoleCommonBehavior(consoleFunc, ...args) {
97
+ if ((typeof ngDevMode === 'undefined' || ngDevMode) && notRecorded(...args)) {
98
+ consoleFunc(...args);
99
+ }
100
+ }
101
+ // Warning should only be printed in dev mode and only once.
102
+ const warn = (...args) => consoleCommonBehavior((...arg) => console.warn(PREFIX, ...arg), ...args);
103
+ const warnDeprecation = (...args) => {
104
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
105
+ return () => { };
106
+ }
107
+ const stack = new Error().stack;
108
+ return consoleCommonBehavior((...arg) => console.warn(PREFIX, 'deprecated:', ...arg, stack), ...args);
109
+ };
110
+ // Log should only be printed in dev mode.
111
+ const log = (...args) => {
112
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
113
+ console.log(PREFIX, ...args);
114
+ }
115
+ };
116
+
117
+ /**
118
+ * `LazyService` delay loading JS or CSS files.
119
+ *
120
+ * 延迟加载资源(js 或 css)服务
121
+ */
122
+ class LazyService {
123
+ constructor() {
124
+ this.doc = inject(DOCUMENT);
125
+ this.list = {};
126
+ this.cached = {};
127
+ this._notify = new BehaviorSubject([]);
128
+ }
129
+ get change() {
130
+ return this._notify.asObservable().pipe(share(), filter(ls => ls.length !== 0));
131
+ }
132
+ clear() {
133
+ this.list = {};
134
+ this.cached = {};
135
+ }
136
+ attachAttributes(el, attributes) {
137
+ if (attributes == null)
138
+ return;
139
+ Object.entries(attributes).forEach(([key, value]) => {
140
+ el.setAttribute(key, value);
141
+ });
142
+ }
143
+ /**
144
+ * Load script or style files
145
+ */
146
+ load(paths) {
147
+ if (!Array.isArray(paths)) {
148
+ paths = [paths];
149
+ }
150
+ const promises = [];
151
+ paths
152
+ .map(v => (typeof v !== 'object' ? { path: v } : v))
153
+ .forEach(item => {
154
+ if (item.path.endsWith('.js')) {
155
+ promises.push(this.loadScript(item.path, item.options));
156
+ }
157
+ else {
158
+ promises.push(this.loadStyle(item.path, item.options));
159
+ }
160
+ });
161
+ return Promise.all(promises).then(res => {
162
+ this._notify.next(res);
163
+ return Promise.resolve(res);
164
+ });
165
+ }
166
+ loadScript(path, innerContent, attributes) {
167
+ const options = typeof innerContent === 'object'
168
+ ? innerContent
169
+ : {
170
+ innerContent,
171
+ attributes
172
+ };
173
+ return new Promise(resolve => {
174
+ if (this.list[path] === true) {
175
+ resolve({ ...this.cached[path], status: 'loading' });
176
+ return;
177
+ }
178
+ this.list[path] = true;
179
+ const onSuccess = (item) => {
180
+ this.cached[path] = item;
181
+ resolve(item);
182
+ this._notify.next([item]);
183
+ };
184
+ const node = this.doc.createElement('script');
185
+ node.type = 'text/javascript';
186
+ node.src = path;
187
+ this.attachAttributes(node, options.attributes);
188
+ if (options.innerContent) {
189
+ node.innerHTML = options.innerContent;
190
+ }
191
+ node.onload = () => onSuccess({
192
+ path,
193
+ status: 'ok'
194
+ });
195
+ node.onerror = error => onSuccess({
196
+ path,
197
+ status: 'error',
198
+ error
199
+ });
200
+ this.doc.getElementsByTagName('head')[0].appendChild(node);
201
+ });
202
+ }
203
+ loadStyle(path, rel, innerContent, attributes) {
204
+ const options = typeof rel === 'object'
205
+ ? rel
206
+ : {
207
+ rel,
208
+ innerContent,
209
+ attributes
210
+ };
211
+ return new Promise(resolve => {
212
+ if (this.list[path] === true) {
213
+ resolve(this.cached[path]);
214
+ return;
215
+ }
216
+ this.list[path] = true;
217
+ const node = this.doc.createElement('link');
218
+ node.rel = options.rel ?? 'stylesheet';
219
+ node.type = 'text/css';
220
+ node.href = path;
221
+ this.attachAttributes(node, options.attributes);
222
+ if (options.innerContent) {
223
+ node.innerHTML = options.innerContent;
224
+ }
225
+ this.doc.getElementsByTagName('head')[0].appendChild(node);
226
+ const item = {
227
+ path,
228
+ status: 'ok'
229
+ };
230
+ this.cached[path] = item;
231
+ resolve(item);
232
+ });
233
+ }
234
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: LazyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
235
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: LazyService, providedIn: 'root' }); }
236
+ }
237
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: LazyService, decorators: [{
238
+ type: Injectable,
239
+ args: [{ providedIn: 'root' }]
240
+ }] });
241
+
242
+ function throwError(msg, actual, expected, comparison) {
243
+ if (typeof ngDevMode === 'undefined' || ngDevMode) {
244
+ throw new Error(`ASSERTION ERROR: ${msg}${comparison == null ? '' : ` [Expected=> ${expected} ${comparison} ${actual} <=Actual]`}`);
245
+ }
246
+ }
247
+ /**
248
+ * Assert whether the expression and throw an error into console in dev mode
249
+ *
250
+ * 断言表达式是否符合预期,并在开发模式下会在控制台抛出一个错误
251
+ */
252
+ function assert(expression, msg) {
253
+ if (!expression) {
254
+ throwError(msg);
255
+ }
256
+ }
257
+ /**
258
+ * Assert whether empty (`null` or `undefined`)
259
+ *
260
+ * 断言是否空值(`null` 或 `undefined`)
261
+ */
262
+ function assertEmpty(actual, msg) {
263
+ if (actual == null) {
264
+ throwError(msg, typeof actual, 'NULL', '==');
265
+ }
266
+ }
267
+ /**
268
+ * Assert whether `number` type
269
+ *
270
+ * 断言是否 `number` 类型
271
+ */
272
+ function assertNumber(actual, msg) {
273
+ if (!(typeof actual === 'number')) {
274
+ throwError(msg, typeof actual, 'number', '===');
275
+ }
276
+ }
277
+ /**
278
+ * Assert whether `string` type
279
+ *
280
+ * 断言是否 `string` 类型
281
+ */
282
+ function assertString(actual, msg) {
283
+ if (!(typeof actual === 'string')) {
284
+ throwError(msg, actual === null ? 'null' : typeof actual, 'string', '===');
285
+ }
286
+ }
287
+ /**
288
+ * Assert whether `array` type
289
+ *
290
+ * 断言是否 `array` 类型
291
+ */
292
+ function assertArray(actual, msg) {
293
+ if (!Array.isArray(actual)) {
294
+ throwError(msg, actual === null ? 'null' : typeof actual, 'array', '===');
295
+ }
296
+ }
297
+ /**
298
+ * Assert whether `Observable` type
299
+ *
300
+ * 断言是否 `Observable` 类型
301
+ */
302
+ function assertObservable(obj, msg) {
303
+ if (!isObservable(obj)) {
304
+ throwError(msg, obj === null ? 'null' : typeof obj, 'Observable', '===');
305
+ }
306
+ }
307
+
308
+ /* eslint-disable @typescript-eslint/explicit-function-return-type */
309
+ class PathToRegexpService {
310
+ constructor() {
311
+ this.DEFAULT_DELIMITER = '/';
312
+ this.PATH_REGEXP = new RegExp(['(\\\\.)', '(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?'].join('|'), 'g');
313
+ }
314
+ parse(str, options) {
315
+ const tokens = [];
316
+ let key = 0;
317
+ let index = 0;
318
+ let path = '';
319
+ const defaultDelimiter = (options && options.delimiter) || this.DEFAULT_DELIMITER;
320
+ const whitelist = (options && options.whitelist) || undefined;
321
+ let pathEscaped = false;
322
+ let res;
323
+ while ((res = this.PATH_REGEXP.exec(str)) !== null) {
324
+ const m = res[0];
325
+ const escaped = res[1];
326
+ const offset = res.index;
327
+ path += str.slice(index, offset);
328
+ index = offset + m.length;
329
+ // Ignore already escaped sequences.
330
+ if (escaped) {
331
+ path += escaped[1];
332
+ pathEscaped = true;
333
+ continue;
334
+ }
335
+ let prev = '';
336
+ const name = res[2];
337
+ const capture = res[3];
338
+ const group = res[4];
339
+ const modifier = res[5];
340
+ if (!pathEscaped && path.length) {
341
+ const k = path.length - 1;
342
+ const c = path[k];
343
+ const matches = whitelist ? whitelist.indexOf(c) > -1 : true;
344
+ if (matches) {
345
+ prev = c;
346
+ path = path.slice(0, k);
347
+ }
348
+ }
349
+ // Push the current path onto the tokens.
350
+ if (path) {
351
+ tokens.push(path);
352
+ path = '';
353
+ pathEscaped = false;
354
+ }
355
+ const repeat = modifier === '+' || modifier === '*';
356
+ const optional = modifier === '?' || modifier === '*';
357
+ const pattern = capture || group;
358
+ const delimiter = prev || defaultDelimiter;
359
+ tokens.push({
360
+ name: name || key++,
361
+ prefix: prev,
362
+ delimiter: delimiter,
363
+ optional: optional,
364
+ repeat: repeat,
365
+ pattern: pattern
366
+ ? this.escapeGroup(pattern)
367
+ : `[^${this.escapeString(delimiter === defaultDelimiter ? delimiter : delimiter + defaultDelimiter)}]+?`
368
+ });
369
+ }
370
+ // Push NzSafeAny remaining characters.
371
+ if (path || index < str.length) {
372
+ tokens.push(path + str.substr(index));
373
+ }
374
+ return tokens;
375
+ }
376
+ compile(str, options) {
377
+ return this.tokensToFunction(this.parse(str, options), options);
378
+ }
379
+ tokensToFunction(tokens, options) {
380
+ const matches = new Array(tokens.length);
381
+ for (let i = 0; i < tokens.length; i++) {
382
+ if (typeof tokens[i] === 'object') {
383
+ matches[i] = new RegExp(`^(?:${tokens[i].pattern})$`, this.flags(options));
384
+ }
385
+ }
386
+ return function (data, options) {
387
+ let path = '';
388
+ const encode = (options && options.encode) || encodeURIComponent;
389
+ const validate = options ? options.validate !== false : true;
390
+ for (let i = 0; i < tokens.length; i++) {
391
+ const token = tokens[i];
392
+ if (typeof token === 'string') {
393
+ path += token;
394
+ continue;
395
+ }
396
+ const value = data ? data[token.name] : undefined;
397
+ let segment;
398
+ if (Array.isArray(value)) {
399
+ if (!token.repeat) {
400
+ throw new TypeError(`Expected "${token.name}" to not repeat, but got array`);
401
+ }
402
+ if (value.length === 0) {
403
+ if (token.optional) {
404
+ continue;
405
+ }
406
+ throw new TypeError(`Expected "${token.name}" to not be empty`);
407
+ }
408
+ for (let j = 0; j < value.length; j++) {
409
+ segment = encode(value[j], token);
410
+ if (validate && !matches[i].test(segment)) {
411
+ throw new TypeError(`Expected all "${token.name}" to match "${token.pattern}"`);
412
+ }
413
+ path += (j === 0 ? token.prefix : token.delimiter) + segment;
414
+ }
415
+ continue;
416
+ }
417
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
418
+ segment = encode(String(value), token);
419
+ if (validate && !matches[i].test(segment)) {
420
+ throw new TypeError(`Expected "${token.name}" to match "${token.pattern}", but got "${segment}"`);
421
+ }
422
+ path += token.prefix + segment;
423
+ continue;
424
+ }
425
+ if (token.optional) {
426
+ continue;
427
+ }
428
+ throw new TypeError(`Expected "${token.name}" to be ${token.repeat ? 'an array' : 'a string'}`);
429
+ }
430
+ return path;
431
+ };
432
+ }
433
+ escapeString(str) {
434
+ return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1');
435
+ }
436
+ escapeGroup(group) {
437
+ return group.replace(/([=!:$/()])/g, '\\$1');
438
+ }
439
+ flags(options) {
440
+ return options && options.sensitive ? '' : 'i';
441
+ }
442
+ regexpToRegexp(path, keys) {
443
+ if (!keys) {
444
+ return path;
445
+ }
446
+ const groups = path.source.match(/\((?!\?)/g);
447
+ if (groups) {
448
+ for (let i = 0; i < groups.length; i++) {
449
+ keys.push({
450
+ name: i,
451
+ prefix: null,
452
+ delimiter: null,
453
+ optional: false,
454
+ repeat: false,
455
+ pattern: null
456
+ });
457
+ }
458
+ }
459
+ return path;
460
+ }
461
+ arrayToRegexp(path, keys, options) {
462
+ const parts = [];
463
+ for (let i = 0; i < path.length; i++) {
464
+ parts.push(this.pathToRegexp(path[i], keys, options).source);
465
+ }
466
+ return new RegExp(`(?:${parts.join('|')})`, this.flags(options));
467
+ }
468
+ stringToRegexp(path, keys, options) {
469
+ return this.tokensToRegExp(this.parse(path, options), keys, options);
470
+ }
471
+ tokensToRegExp(tokens, keys, options) {
472
+ options = options || {};
473
+ const strict = options.strict;
474
+ const start = options.start !== false;
475
+ const end = options.end !== false;
476
+ const delimiter = options.delimiter || this.DEFAULT_DELIMITER;
477
+ const endsWith = []
478
+ .concat(options.endsWith || [])
479
+ .map(this.escapeString)
480
+ .concat('$')
481
+ .join('|');
482
+ let route = start ? '^' : '';
483
+ for (let i = 0; i < tokens.length; i++) {
484
+ const token = tokens[i];
485
+ if (typeof token === 'string') {
486
+ route += this.escapeString(token);
487
+ }
488
+ else {
489
+ const capture = token.repeat
490
+ ? `(?:${token.pattern})(?:${this.escapeString(token.delimiter)}(?:${token.pattern}))*`
491
+ : token.pattern;
492
+ if (keys) {
493
+ keys.push(token);
494
+ }
495
+ if (token.optional) {
496
+ if (!token.prefix) {
497
+ route += `(${capture})?`;
498
+ }
499
+ else {
500
+ route += `(?:${this.escapeString(token.prefix)}(${capture}))?`;
501
+ }
502
+ }
503
+ else {
504
+ route += `${this.escapeString(token.prefix)}(${capture})`;
505
+ }
506
+ }
507
+ }
508
+ if (end) {
509
+ if (!strict) {
510
+ route += `(?:${this.escapeString(delimiter)})?`;
511
+ }
512
+ route += endsWith === '$' ? '$' : `(?=${endsWith})`;
513
+ }
514
+ else {
515
+ const endToken = tokens[tokens.length - 1];
516
+ const isEndDelimited = typeof endToken === 'string' ? endToken[endToken.length - 1] === delimiter : endToken === undefined;
517
+ if (!strict) {
518
+ route += `(?:${this.escapeString(delimiter)}(?=${endsWith}))?`;
519
+ }
520
+ if (!isEndDelimited) {
521
+ route += `(?=${this.escapeString(delimiter)}|${endsWith})`;
522
+ }
523
+ }
524
+ return new RegExp(route, this.flags(options));
525
+ }
526
+ pathToRegexp(path, keys, options) {
527
+ if (path instanceof RegExp) {
528
+ return this.regexpToRegexp(path, keys);
529
+ }
530
+ if (Array.isArray(path)) {
531
+ return this.arrayToRegexp(/** @type {!Array} */ path, keys, options);
532
+ }
533
+ return this.stringToRegexp(/** @type {string} */ path, keys, options);
534
+ }
535
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: PathToRegexpService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
536
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: PathToRegexpService, providedIn: 'root' }); }
537
+ }
538
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: PathToRegexpService, decorators: [{
539
+ type: Injectable,
540
+ args: [{
541
+ providedIn: 'root'
542
+ }]
543
+ }], ctorParameters: () => [] });
544
+
545
+ const resizeWindow = () => {
546
+ window.dispatchEvent(new Event('resize'));
547
+ };
548
+
549
+ function setFavicon(path) {
550
+ const link = document.querySelector("link[rel*='icon']") || document.createElement('link');
551
+ link.type = 'image/x-icon';
552
+ link.rel = 'shortcut icon';
553
+ link.href = path;
554
+ document.getElementsByTagName('head')[0].appendChild(link);
555
+ }
556
+ function hasFavicon(url) {
557
+ return new Promise(resolve => {
558
+ let xmlHttp;
559
+ if (window['XMLHttpRequest']) {
560
+ xmlHttp = new XMLHttpRequest();
561
+ }
562
+ if (xmlHttp) {
563
+ xmlHttp.open('Get', url, false);
564
+ xmlHttp.send();
565
+ if (xmlHttp.status == 404) {
566
+ resolve(false);
567
+ }
568
+ else {
569
+ resolve(true);
570
+ }
571
+ }
572
+ else {
573
+ resolve(false);
574
+ }
575
+ });
576
+ }
577
+
578
+ /**
579
+ * Generated bundle index. Do not edit.
580
+ */
581
+
582
+ export { LazyService, PREFIX, PathToRegexpService, assert, assertArray, assertEmpty, assertNumber, assertObservable, assertString, deepCopy, deepGet, deepMerge, deepMergeKey, hasFavicon, log, resizeWindow, setFavicon, warn, warnDeprecation };
583
+ //# sourceMappingURL=other.mjs.map