@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,584 +1,586 @@
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({ ...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
- if (this.list[path] === true) {
211
- resolve(this.cached[path]);
212
- return;
213
- }
214
- this.list[path] = true;
215
- const node = this.doc.createElement('link');
216
- node.rel = options.rel ?? 'stylesheet';
217
- node.type = 'text/css';
218
- node.href = path;
219
- this.attachAttributes(node, options.attributes);
220
- if (options.innerContent) {
221
- node.innerHTML = options.innerContent;
222
- }
223
- this.doc.getElementsByTagName('head')[0].appendChild(node);
224
- const item = {
225
- path,
226
- status: 'ok'
227
- };
228
- this.cached[path] = item;
229
- resolve(item);
230
- });
231
- }
232
- }
233
- LazyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: LazyService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
234
- LazyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: LazyService, providedIn: 'root' });
235
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: LazyService, decorators: [{
236
- type: Injectable,
237
- args: [{ providedIn: 'root' }]
238
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
239
- type: Inject,
240
- args: [DOCUMENT]
241
- }] }]; } });
242
-
243
- function throwError(msg, actual, expected, comparison) {
244
- if (ngDevMode) {
245
- throw new Error(`ASSERTION ERROR: ${msg}${comparison == null ? '' : ` [Expected=> ${expected} ${comparison} ${actual} <=Actual]`}`);
246
- }
247
- }
248
- /**
249
- * Assert whether the expression and throw an error into console in dev mode
250
- *
251
- * 断言表达式是否符合预期,并在开发模式下会在控制台抛出一个错误
252
- */
253
- function assert(expression, msg) {
254
- if (!expression) {
255
- throwError(msg);
256
- }
257
- }
258
- /**
259
- * Assert whether empty (`null` or `undefined`)
260
- *
261
- * 断言是否空值(`null` `undefined`)
262
- */
263
- function assertEmpty(actual, msg) {
264
- if (actual == null) {
265
- throwError(msg, typeof actual, 'NULL', '==');
266
- }
267
- }
268
- /**
269
- * Assert whether `number` type
270
- *
271
- * 断言是否 `number` 类型
272
- */
273
- function assertNumber(actual, msg) {
274
- if (!(typeof actual === 'number')) {
275
- throwError(msg, typeof actual, 'number', '===');
276
- }
277
- }
278
- /**
279
- * Assert whether `string` type
280
- *
281
- * 断言是否 `string` 类型
282
- */
283
- function assertString(actual, msg) {
284
- if (!(typeof actual === 'string')) {
285
- throwError(msg, actual === null ? 'null' : typeof actual, 'string', '===');
286
- }
287
- }
288
- /**
289
- * Assert whether `array` type
290
- *
291
- * 断言是否 `array` 类型
292
- */
293
- function assertArray(actual, msg) {
294
- if (!Array.isArray(actual)) {
295
- throwError(msg, actual === null ? 'null' : typeof actual, 'array', '===');
296
- }
297
- }
298
- /**
299
- * Assert whether `Observable` type
300
- *
301
- * 断言是否 `Observable` 类型
302
- */
303
- function assertObservable(obj, msg) {
304
- if (!isObservable(obj)) {
305
- throwError(msg, obj === null ? 'null' : typeof obj, 'Observable', '===');
306
- }
307
- }
308
-
309
- const resizeWindow = () => {
310
- window.dispatchEvent(new Event('resize'));
311
- };
312
-
313
- /* eslint-disable @typescript-eslint/explicit-function-return-type */
314
- class PathToRegexpService {
315
- constructor() {
316
- this.DEFAULT_DELIMITER = '/';
317
- this.PATH_REGEXP = new RegExp(['(\\\\.)', '(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?'].join('|'), 'g');
318
- }
319
- parse(str, options) {
320
- const tokens = [];
321
- let key = 0;
322
- let index = 0;
323
- let path = '';
324
- const defaultDelimiter = (options && options.delimiter) || this.DEFAULT_DELIMITER;
325
- const whitelist = (options && options.whitelist) || undefined;
326
- let pathEscaped = false;
327
- let res;
328
- while ((res = this.PATH_REGEXP.exec(str)) !== null) {
329
- const m = res[0];
330
- const escaped = res[1];
331
- const offset = res.index;
332
- path += str.slice(index, offset);
333
- index = offset + m.length;
334
- // Ignore already escaped sequences.
335
- if (escaped) {
336
- path += escaped[1];
337
- pathEscaped = true;
338
- continue;
339
- }
340
- let prev = '';
341
- const name = res[2];
342
- const capture = res[3];
343
- const group = res[4];
344
- const modifier = res[5];
345
- if (!pathEscaped && path.length) {
346
- const k = path.length - 1;
347
- const c = path[k];
348
- const matches = whitelist ? whitelist.indexOf(c) > -1 : true;
349
- if (matches) {
350
- prev = c;
351
- path = path.slice(0, k);
352
- }
353
- }
354
- // Push the current path onto the tokens.
355
- if (path) {
356
- tokens.push(path);
357
- path = '';
358
- pathEscaped = false;
359
- }
360
- const repeat = modifier === '+' || modifier === '*';
361
- const optional = modifier === '?' || modifier === '*';
362
- const pattern = capture || group;
363
- const delimiter = prev || defaultDelimiter;
364
- tokens.push({
365
- name: name || key++,
366
- prefix: prev,
367
- delimiter: delimiter,
368
- optional: optional,
369
- repeat: repeat,
370
- pattern: pattern
371
- ? this.escapeGroup(pattern)
372
- : `[^${this.escapeString(delimiter === defaultDelimiter ? delimiter : delimiter + defaultDelimiter)}]+?`
373
- });
374
- }
375
- // Push any remaining characters.
376
- if (path || index < str.length) {
377
- tokens.push(path + str.substr(index));
378
- }
379
- return tokens;
380
- }
381
- compile(str, options) {
382
- return this.tokensToFunction(this.parse(str, options), options);
383
- }
384
- tokensToFunction(tokens, options) {
385
- const matches = new Array(tokens.length);
386
- for (let i = 0; i < tokens.length; i++) {
387
- if (typeof tokens[i] === 'object') {
388
- matches[i] = new RegExp(`^(?:${tokens[i].pattern})$`, this.flags(options));
389
- }
390
- }
391
- return function (data, options) {
392
- let path = '';
393
- const encode = (options && options.encode) || encodeURIComponent;
394
- const validate = options ? options.validate !== false : true;
395
- for (let i = 0; i < tokens.length; i++) {
396
- const token = tokens[i];
397
- if (typeof token === 'string') {
398
- path += token;
399
- continue;
400
- }
401
- const value = data ? data[token.name] : undefined;
402
- let segment;
403
- if (Array.isArray(value)) {
404
- if (!token.repeat) {
405
- throw new TypeError(`Expected "${token.name}" to not repeat, but got array`);
406
- }
407
- if (value.length === 0) {
408
- if (token.optional) {
409
- continue;
410
- }
411
- throw new TypeError(`Expected "${token.name}" to not be empty`);
412
- }
413
- for (let j = 0; j < value.length; j++) {
414
- segment = encode(value[j], token);
415
- if (validate && !matches[i].test(segment)) {
416
- throw new TypeError(`Expected all "${token.name}" to match "${token.pattern}"`);
417
- }
418
- path += (j === 0 ? token.prefix : token.delimiter) + segment;
419
- }
420
- continue;
421
- }
422
- if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
423
- segment = encode(String(value), token);
424
- if (validate && !matches[i].test(segment)) {
425
- throw new TypeError(`Expected "${token.name}" to match "${token.pattern}", but got "${segment}"`);
426
- }
427
- path += token.prefix + segment;
428
- continue;
429
- }
430
- if (token.optional) {
431
- continue;
432
- }
433
- throw new TypeError(`Expected "${token.name}" to be ${token.repeat ? 'an array' : 'a string'}`);
434
- }
435
- return path;
436
- };
437
- }
438
- escapeString(str) {
439
- return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1');
440
- }
441
- escapeGroup(group) {
442
- return group.replace(/([=!:$/()])/g, '\\$1');
443
- }
444
- flags(options) {
445
- return options && options.sensitive ? '' : 'i';
446
- }
447
- regexpToRegexp(path, keys) {
448
- if (!keys) {
449
- return path;
450
- }
451
- const groups = path.source.match(/\((?!\?)/g);
452
- if (groups) {
453
- for (let i = 0; i < groups.length; i++) {
454
- keys.push({
455
- name: i,
456
- prefix: null,
457
- delimiter: null,
458
- optional: false,
459
- repeat: false,
460
- pattern: null
461
- });
462
- }
463
- }
464
- return path;
465
- }
466
- arrayToRegexp(path, keys, options) {
467
- const parts = [];
468
- for (let i = 0; i < path.length; i++) {
469
- parts.push(this.pathToRegexp(path[i], keys, options).source);
470
- }
471
- return new RegExp(`(?:${parts.join('|')})`, this.flags(options));
472
- }
473
- stringToRegexp(path, keys, options) {
474
- return this.tokensToRegExp(this.parse(path, options), keys, options);
475
- }
476
- tokensToRegExp(tokens, keys, options) {
477
- options = options || {};
478
- const strict = options.strict;
479
- const start = options.start !== false;
480
- const end = options.end !== false;
481
- const delimiter = options.delimiter || this.DEFAULT_DELIMITER;
482
- const endsWith = []
483
- .concat(options.endsWith || [])
484
- .map(this.escapeString)
485
- .concat('$')
486
- .join('|');
487
- let route = start ? '^' : '';
488
- for (let i = 0; i < tokens.length; i++) {
489
- const token = tokens[i];
490
- if (typeof token === 'string') {
491
- route += this.escapeString(token);
492
- }
493
- else {
494
- const capture = token.repeat
495
- ? `(?:${token.pattern})(?:${this.escapeString(token.delimiter)}(?:${token.pattern}))*`
496
- : token.pattern;
497
- if (keys) {
498
- keys.push(token);
499
- }
500
- if (token.optional) {
501
- if (!token.prefix) {
502
- route += `(${capture})?`;
503
- }
504
- else {
505
- route += `(?:${this.escapeString(token.prefix)}(${capture}))?`;
506
- }
507
- }
508
- else {
509
- route += `${this.escapeString(token.prefix)}(${capture})`;
510
- }
511
- }
512
- }
513
- if (end) {
514
- if (!strict) {
515
- route += `(?:${this.escapeString(delimiter)})?`;
516
- }
517
- route += endsWith === '$' ? '$' : `(?=${endsWith})`;
518
- }
519
- else {
520
- const endToken = tokens[tokens.length - 1];
521
- const isEndDelimited = typeof endToken === 'string' ? endToken[endToken.length - 1] === delimiter : endToken === undefined;
522
- if (!strict) {
523
- route += `(?:${this.escapeString(delimiter)}(?=${endsWith}))?`;
524
- }
525
- if (!isEndDelimited) {
526
- route += `(?=${this.escapeString(delimiter)}|${endsWith})`;
527
- }
528
- }
529
- return new RegExp(route, this.flags(options));
530
- }
531
- pathToRegexp(path, keys, options) {
532
- if (path instanceof RegExp) {
533
- return this.regexpToRegexp(path, keys);
534
- }
535
- if (Array.isArray(path)) {
536
- return this.arrayToRegexp(/** @type {!Array} */ path, keys, options);
537
- }
538
- return this.stringToRegexp(/** @type {string} */ path, keys, options);
539
- }
540
- }
541
- PathToRegexpService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: PathToRegexpService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
542
- PathToRegexpService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: PathToRegexpService, providedIn: 'root' });
543
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: PathToRegexpService, decorators: [{
544
- type: Injectable,
545
- args: [{
546
- providedIn: 'root'
547
- }]
548
- }], ctorParameters: function () { return []; } });
549
-
550
- function setFavicon(path) {
551
- const link = document.querySelector("link[rel*='icon']") || document.createElement('link');
552
- link.type = 'image/x-icon';
553
- link.rel = 'shortcut icon';
554
- link.href = path;
555
- document.getElementsByTagName('head')[0].appendChild(link);
556
- }
557
- function hasFavicon(url) {
558
- return new Promise(resolve => {
559
- let xmlHttp;
560
- if (window['XMLHttpRequest']) {
561
- xmlHttp = new XMLHttpRequest();
562
- }
563
- if (xmlHttp) {
564
- xmlHttp.open('Get', url, false);
565
- xmlHttp.send();
566
- if (xmlHttp.status == 404) {
567
- resolve(false);
568
- }
569
- else {
570
- resolve(true);
571
- }
572
- }
573
- else {
574
- resolve(false);
575
- }
576
- });
577
- }
578
-
579
- /**
580
- * Generated bundle index. Do not edit.
581
- */
582
-
583
- export { LazyService, PREFIX, PathToRegexpService, assert, assertArray, assertEmpty, assertNumber, assertObservable, assertString, deepCopy, deepGet, deepMerge, deepMergeKey, hasFavicon, log, resizeWindow, setFavicon, warn, warnDeprecation };
584
- //# 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({ ...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
+ }
235
+ LazyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LazyService, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
236
+ LazyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LazyService, providedIn: 'root' });
237
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: LazyService, decorators: [{
238
+ type: Injectable,
239
+ args: [{ providedIn: 'root' }]
240
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
241
+ type: Inject,
242
+ args: [DOCUMENT]
243
+ }] }]; } });
244
+
245
+ function throwError(msg, actual, expected, comparison) {
246
+ if (ngDevMode) {
247
+ throw new Error(`ASSERTION ERROR: ${msg}${comparison == null ? '' : ` [Expected=> ${expected} ${comparison} ${actual} <=Actual]`}`);
248
+ }
249
+ }
250
+ /**
251
+ * Assert whether the expression and throw an error into console in dev mode
252
+ *
253
+ * 断言表达式是否符合预期,并在开发模式下会在控制台抛出一个错误
254
+ */
255
+ function assert(expression, msg) {
256
+ if (!expression) {
257
+ throwError(msg);
258
+ }
259
+ }
260
+ /**
261
+ * Assert whether empty (`null` or `undefined`)
262
+ *
263
+ * 断言是否空值(`null` 或 `undefined`)
264
+ */
265
+ function assertEmpty(actual, msg) {
266
+ if (actual == null) {
267
+ throwError(msg, typeof actual, 'NULL', '==');
268
+ }
269
+ }
270
+ /**
271
+ * Assert whether `number` type
272
+ *
273
+ * 断言是否 `number` 类型
274
+ */
275
+ function assertNumber(actual, msg) {
276
+ if (!(typeof actual === 'number')) {
277
+ throwError(msg, typeof actual, 'number', '===');
278
+ }
279
+ }
280
+ /**
281
+ * Assert whether `string` type
282
+ *
283
+ * 断言是否 `string` 类型
284
+ */
285
+ function assertString(actual, msg) {
286
+ if (!(typeof actual === 'string')) {
287
+ throwError(msg, actual === null ? 'null' : typeof actual, 'string', '===');
288
+ }
289
+ }
290
+ /**
291
+ * Assert whether `array` type
292
+ *
293
+ * 断言是否 `array` 类型
294
+ */
295
+ function assertArray(actual, msg) {
296
+ if (!Array.isArray(actual)) {
297
+ throwError(msg, actual === null ? 'null' : typeof actual, 'array', '===');
298
+ }
299
+ }
300
+ /**
301
+ * Assert whether `Observable` type
302
+ *
303
+ * 断言是否 `Observable` 类型
304
+ */
305
+ function assertObservable(obj, msg) {
306
+ if (!isObservable(obj)) {
307
+ throwError(msg, obj === null ? 'null' : typeof obj, 'Observable', '===');
308
+ }
309
+ }
310
+
311
+ const resizeWindow = () => {
312
+ window.dispatchEvent(new Event('resize'));
313
+ };
314
+
315
+ /* eslint-disable @typescript-eslint/explicit-function-return-type */
316
+ class PathToRegexpService {
317
+ constructor() {
318
+ this.DEFAULT_DELIMITER = '/';
319
+ this.PATH_REGEXP = new RegExp(['(\\\\.)', '(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?'].join('|'), 'g');
320
+ }
321
+ parse(str, options) {
322
+ const tokens = [];
323
+ let key = 0;
324
+ let index = 0;
325
+ let path = '';
326
+ const defaultDelimiter = (options && options.delimiter) || this.DEFAULT_DELIMITER;
327
+ const whitelist = (options && options.whitelist) || undefined;
328
+ let pathEscaped = false;
329
+ let res;
330
+ while ((res = this.PATH_REGEXP.exec(str)) !== null) {
331
+ const m = res[0];
332
+ const escaped = res[1];
333
+ const offset = res.index;
334
+ path += str.slice(index, offset);
335
+ index = offset + m.length;
336
+ // Ignore already escaped sequences.
337
+ if (escaped) {
338
+ path += escaped[1];
339
+ pathEscaped = true;
340
+ continue;
341
+ }
342
+ let prev = '';
343
+ const name = res[2];
344
+ const capture = res[3];
345
+ const group = res[4];
346
+ const modifier = res[5];
347
+ if (!pathEscaped && path.length) {
348
+ const k = path.length - 1;
349
+ const c = path[k];
350
+ const matches = whitelist ? whitelist.indexOf(c) > -1 : true;
351
+ if (matches) {
352
+ prev = c;
353
+ path = path.slice(0, k);
354
+ }
355
+ }
356
+ // Push the current path onto the tokens.
357
+ if (path) {
358
+ tokens.push(path);
359
+ path = '';
360
+ pathEscaped = false;
361
+ }
362
+ const repeat = modifier === '+' || modifier === '*';
363
+ const optional = modifier === '?' || modifier === '*';
364
+ const pattern = capture || group;
365
+ const delimiter = prev || defaultDelimiter;
366
+ tokens.push({
367
+ name: name || key++,
368
+ prefix: prev,
369
+ delimiter: delimiter,
370
+ optional: optional,
371
+ repeat: repeat,
372
+ pattern: pattern
373
+ ? this.escapeGroup(pattern)
374
+ : `[^${this.escapeString(delimiter === defaultDelimiter ? delimiter : delimiter + defaultDelimiter)}]+?`
375
+ });
376
+ }
377
+ // Push any remaining characters.
378
+ if (path || index < str.length) {
379
+ tokens.push(path + str.substr(index));
380
+ }
381
+ return tokens;
382
+ }
383
+ compile(str, options) {
384
+ return this.tokensToFunction(this.parse(str, options), options);
385
+ }
386
+ tokensToFunction(tokens, options) {
387
+ const matches = new Array(tokens.length);
388
+ for (let i = 0; i < tokens.length; i++) {
389
+ if (typeof tokens[i] === 'object') {
390
+ matches[i] = new RegExp(`^(?:${tokens[i].pattern})$`, this.flags(options));
391
+ }
392
+ }
393
+ return function (data, options) {
394
+ let path = '';
395
+ const encode = (options && options.encode) || encodeURIComponent;
396
+ const validate = options ? options.validate !== false : true;
397
+ for (let i = 0; i < tokens.length; i++) {
398
+ const token = tokens[i];
399
+ if (typeof token === 'string') {
400
+ path += token;
401
+ continue;
402
+ }
403
+ const value = data ? data[token.name] : undefined;
404
+ let segment;
405
+ if (Array.isArray(value)) {
406
+ if (!token.repeat) {
407
+ throw new TypeError(`Expected "${token.name}" to not repeat, but got array`);
408
+ }
409
+ if (value.length === 0) {
410
+ if (token.optional) {
411
+ continue;
412
+ }
413
+ throw new TypeError(`Expected "${token.name}" to not be empty`);
414
+ }
415
+ for (let j = 0; j < value.length; j++) {
416
+ segment = encode(value[j], token);
417
+ if (validate && !matches[i].test(segment)) {
418
+ throw new TypeError(`Expected all "${token.name}" to match "${token.pattern}"`);
419
+ }
420
+ path += (j === 0 ? token.prefix : token.delimiter) + segment;
421
+ }
422
+ continue;
423
+ }
424
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
425
+ segment = encode(String(value), token);
426
+ if (validate && !matches[i].test(segment)) {
427
+ throw new TypeError(`Expected "${token.name}" to match "${token.pattern}", but got "${segment}"`);
428
+ }
429
+ path += token.prefix + segment;
430
+ continue;
431
+ }
432
+ if (token.optional) {
433
+ continue;
434
+ }
435
+ throw new TypeError(`Expected "${token.name}" to be ${token.repeat ? 'an array' : 'a string'}`);
436
+ }
437
+ return path;
438
+ };
439
+ }
440
+ escapeString(str) {
441
+ return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1');
442
+ }
443
+ escapeGroup(group) {
444
+ return group.replace(/([=!:$/()])/g, '\\$1');
445
+ }
446
+ flags(options) {
447
+ return options && options.sensitive ? '' : 'i';
448
+ }
449
+ regexpToRegexp(path, keys) {
450
+ if (!keys) {
451
+ return path;
452
+ }
453
+ const groups = path.source.match(/\((?!\?)/g);
454
+ if (groups) {
455
+ for (let i = 0; i < groups.length; i++) {
456
+ keys.push({
457
+ name: i,
458
+ prefix: null,
459
+ delimiter: null,
460
+ optional: false,
461
+ repeat: false,
462
+ pattern: null
463
+ });
464
+ }
465
+ }
466
+ return path;
467
+ }
468
+ arrayToRegexp(path, keys, options) {
469
+ const parts = [];
470
+ for (let i = 0; i < path.length; i++) {
471
+ parts.push(this.pathToRegexp(path[i], keys, options).source);
472
+ }
473
+ return new RegExp(`(?:${parts.join('|')})`, this.flags(options));
474
+ }
475
+ stringToRegexp(path, keys, options) {
476
+ return this.tokensToRegExp(this.parse(path, options), keys, options);
477
+ }
478
+ tokensToRegExp(tokens, keys, options) {
479
+ options = options || {};
480
+ const strict = options.strict;
481
+ const start = options.start !== false;
482
+ const end = options.end !== false;
483
+ const delimiter = options.delimiter || this.DEFAULT_DELIMITER;
484
+ const endsWith = []
485
+ .concat(options.endsWith || [])
486
+ .map(this.escapeString)
487
+ .concat('$')
488
+ .join('|');
489
+ let route = start ? '^' : '';
490
+ for (let i = 0; i < tokens.length; i++) {
491
+ const token = tokens[i];
492
+ if (typeof token === 'string') {
493
+ route += this.escapeString(token);
494
+ }
495
+ else {
496
+ const capture = token.repeat
497
+ ? `(?:${token.pattern})(?:${this.escapeString(token.delimiter)}(?:${token.pattern}))*`
498
+ : token.pattern;
499
+ if (keys) {
500
+ keys.push(token);
501
+ }
502
+ if (token.optional) {
503
+ if (!token.prefix) {
504
+ route += `(${capture})?`;
505
+ }
506
+ else {
507
+ route += `(?:${this.escapeString(token.prefix)}(${capture}))?`;
508
+ }
509
+ }
510
+ else {
511
+ route += `${this.escapeString(token.prefix)}(${capture})`;
512
+ }
513
+ }
514
+ }
515
+ if (end) {
516
+ if (!strict) {
517
+ route += `(?:${this.escapeString(delimiter)})?`;
518
+ }
519
+ route += endsWith === '$' ? '$' : `(?=${endsWith})`;
520
+ }
521
+ else {
522
+ const endToken = tokens[tokens.length - 1];
523
+ const isEndDelimited = typeof endToken === 'string' ? endToken[endToken.length - 1] === delimiter : endToken === undefined;
524
+ if (!strict) {
525
+ route += `(?:${this.escapeString(delimiter)}(?=${endsWith}))?`;
526
+ }
527
+ if (!isEndDelimited) {
528
+ route += `(?=${this.escapeString(delimiter)}|${endsWith})`;
529
+ }
530
+ }
531
+ return new RegExp(route, this.flags(options));
532
+ }
533
+ pathToRegexp(path, keys, options) {
534
+ if (path instanceof RegExp) {
535
+ return this.regexpToRegexp(path, keys);
536
+ }
537
+ if (Array.isArray(path)) {
538
+ return this.arrayToRegexp(/** @type {!Array} */ path, keys, options);
539
+ }
540
+ return this.stringToRegexp(/** @type {string} */ path, keys, options);
541
+ }
542
+ }
543
+ PathToRegexpService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PathToRegexpService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
544
+ PathToRegexpService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PathToRegexpService, providedIn: 'root' });
545
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: PathToRegexpService, decorators: [{
546
+ type: Injectable,
547
+ args: [{
548
+ providedIn: 'root'
549
+ }]
550
+ }], ctorParameters: function () { return []; } });
551
+
552
+ function setFavicon(path) {
553
+ const link = document.querySelector("link[rel*='icon']") || document.createElement('link');
554
+ link.type = 'image/x-icon';
555
+ link.rel = 'shortcut icon';
556
+ link.href = path;
557
+ document.getElementsByTagName('head')[0].appendChild(link);
558
+ }
559
+ function hasFavicon(url) {
560
+ return new Promise(resolve => {
561
+ let xmlHttp;
562
+ if (window['XMLHttpRequest']) {
563
+ xmlHttp = new XMLHttpRequest();
564
+ }
565
+ if (xmlHttp) {
566
+ xmlHttp.open('Get', url, false);
567
+ xmlHttp.send();
568
+ if (xmlHttp.status == 404) {
569
+ resolve(false);
570
+ }
571
+ else {
572
+ resolve(true);
573
+ }
574
+ }
575
+ else {
576
+ resolve(false);
577
+ }
578
+ });
579
+ }
580
+
581
+ /**
582
+ * Generated bundle index. Do not edit.
583
+ */
584
+
585
+ export { LazyService, PREFIX, PathToRegexpService, assert, assertArray, assertEmpty, assertNumber, assertObservable, assertString, deepCopy, deepGet, deepMerge, deepMergeKey, hasFavicon, log, resizeWindow, setFavicon, warn, warnDeprecation };
586
+ //# sourceMappingURL=other.mjs.map