@yelon/util 15.1.2 → 15.2.1

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