@sumaris-net/ngx-components 18.12.4 → 18.12.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/doc/changelog.md +7 -1
- package/esm2022/src/app/shared/file/url.utils.mjs +34 -3
- package/esm2022/src/app/shared/pipes/url.pipes.mjs +3 -11
- package/fesm2022/sumaris-net.ngx-components.mjs +195 -172
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/src/app/shared/file/url.utils.d.ts +22 -0
- package/src/assets/manifest.json +1 -1
package/doc/changelog.md
CHANGED
|
@@ -1438,7 +1438,7 @@ enh: Environment: add useHash property to configure Angular router to use hash U
|
|
|
1438
1438
|
- enh(inputs) `canHaveFocus()`: add `isNotEmpty` option
|
|
1439
1439
|
|
|
1440
1440
|
# 18.12.2
|
|
1441
|
-
- enh(MapPipe) Allow to pass arguments to the `map` pipe (e.g. `value | map:
|
|
1441
|
+
- enh(MapPipe) Allow to pass arguments to the `map` pipe (e.g. `value | map: converToSomething: 'arg2'` will call `converToSomething(value, 'arg2'`)
|
|
1442
1442
|
|
|
1443
1443
|
# 18.12.3
|
|
1444
1444
|
- enh(AppTable, AppAsyncTable) FUnction `trackFn()` can now return `any` (instead of `number`) - like the official Angular `TrackByFunction`
|
|
@@ -1446,3 +1446,9 @@ enh: Environment: add useHash property to configure Angular router to use hash U
|
|
|
1446
1446
|
# 18.12.4
|
|
1447
1447
|
- enh(deps) Fix version of webpack
|
|
1448
1448
|
- enh(deps) Upgrade ngx-material-table into 18.0.4
|
|
1449
|
+
|
|
1450
|
+
# 18.12.5
|
|
1451
|
+
- enh(functions) Add function `UrlUtils.appendQueryParams()` to append q queryParams (as a map) to an url
|
|
1452
|
+
|
|
1453
|
+
# 18.12.6
|
|
1454
|
+
- enh(functions) Allow `UrlUtils.appendQueryParams()` to get url as `string | any[]`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isNilOrBlank } from '../functions';
|
|
1
|
+
import { isNilOrBlank, isNotNil } from '../functions';
|
|
2
2
|
export class UrlUtils {
|
|
3
3
|
/**
|
|
4
4
|
* Determines if a given URL is a relative URL.
|
|
@@ -65,7 +65,7 @@ export class UrlUtils {
|
|
|
65
65
|
if (!relativePath)
|
|
66
66
|
throw new Error("Missing 'relativePath' argument");
|
|
67
67
|
if (!this.isRelativeUrl(relativePath))
|
|
68
|
-
throw new Error(
|
|
68
|
+
throw new Error('Should be a relative path');
|
|
69
69
|
// Detect absolute URL
|
|
70
70
|
if (relativePath.startsWith('/') || (opts?.absoluteByDefault && !relativePath.startsWith('.'))) {
|
|
71
71
|
baseUrl = this.getRootUrl(baseUrl);
|
|
@@ -93,6 +93,37 @@ export class UrlUtils {
|
|
|
93
93
|
}, [])
|
|
94
94
|
.join('/');
|
|
95
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* This function completes a base URL with an object containing key-value pairs
|
|
98
|
+
* representing the query parameters to add. It properly encodes the
|
|
99
|
+
* parameters and ensures they are added with the appropriate separator ('?' or '&').
|
|
100
|
+
* Parameters with null or undefined values are automatically filtered out.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* // In a template
|
|
104
|
+
* <a [href]="'https://example.com' | appendQueryParams:{id: 123, name: 'test'}">Link</a>
|
|
105
|
+
* // Result: https://example.com?id=123&name=test
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* // If the URL already contains parameters
|
|
109
|
+
* <a [href]="'https://example.com?page=1' | appendQueryParams:{sort: 'asc'}">Link</a>
|
|
110
|
+
* // Result: https://example.com?page=1&sort=asc
|
|
111
|
+
*
|
|
112
|
+
* @param url
|
|
113
|
+
* @param queryParams
|
|
114
|
+
*/
|
|
115
|
+
static appendQueryParams(url, queryParams) {
|
|
116
|
+
const urlStr = typeof url === 'string' ? url : this.addStartingSlash(url.join('/'));
|
|
117
|
+
if (isNilOrBlank(urlStr) || !queryParams)
|
|
118
|
+
return urlStr;
|
|
119
|
+
const queryString = Object.entries(queryParams)
|
|
120
|
+
.filter(([_, value]) => isNotNil(value))
|
|
121
|
+
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
122
|
+
.join('&');
|
|
123
|
+
if (isNilOrBlank(queryString))
|
|
124
|
+
return urlStr;
|
|
125
|
+
return urlStr + (urlStr.includes('?') ? '&' : '?') + queryString;
|
|
126
|
+
}
|
|
96
127
|
/**
|
|
97
128
|
* Extracts and returns the root URL from the given complete URL string.
|
|
98
129
|
*
|
|
@@ -161,4 +192,4 @@ export class UrlUtils {
|
|
|
161
192
|
return this.addTrailingSlash(basePath) + this.removeStartingSlash(relativePath);
|
|
162
193
|
}
|
|
163
194
|
}
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZmlsZS91cmwudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU1QyxNQUFNLE9BQWdCLFFBQVE7SUFDNUI7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQW1CO1FBQ3RDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFtQjtRQUN0QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBbUI7UUFDdEMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQVc7UUFDM0IsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FB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QUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzdDLENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsR0FBVztRQUNqQyxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0lBRUQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQVc7UUFDcEMsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBZ0IsRUFBRSxZQUFvQjtRQUNsRCxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xGLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzTmlsT3JCbGFuayB9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBVcmxVdGlscyB7XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gVVJMIGlzIGEgcmVsYXRpdmUgVVJMLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGhyZWYgLSBUaGUgVVJMIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBVUkwgaXMgcmVsYXRpdmUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHN0YXRpYyBpc1JlbGF0aXZlVXJsKGhyZWY6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIWhyZWYpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIWhyZWYuc3RhcnRzV2l0aCgnaHR0cDonKSAmJiAhaHJlZi5zdGFydHNXaXRoKCdodHRwczonKSAmJiAhaHJlZi5zdGFydHNXaXRoKCdtYWlsdG86JykgJiYgIWhyZWYuc3RhcnRzV2l0aCgndGVsOicpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYSBnaXZlbiBVUkwgaXMgYW4gaW50ZXJuYWwgVVJMLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGx9IGhyZWYgLSBUaGUgVVJMIHRvIGJlIGNoZWNrZWQuIENhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFVSTCBvciBudWxsLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIFVSTCBpcyBpbnRlcm5hbCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgKi9cbiAgc3RhdGljIGlzSW50ZXJuYWxVcmwoaHJlZjogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmICghaHJlZikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBocmVmLnN0YXJ0c1dpdGgod2luZG93LmxvY2F0aW9uLm9yaWdpbikgfHwgdGhpcy5pc1JlbGF0aXZlVXJsKGhyZWYpO1xuICB9XG5cbiAgc3RhdGljIGlzRXh0ZXJuYWxVcmwoaHJlZjogc3RyaW5nIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGlmICghaHJlZikgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhdGhpcy5pc0ludGVybmFsVXJsKGhyZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHF1ZXJ5IHN0cmluZyBmcm9tIHRoZSBnaXZlbiBVUkwsIHJldHVybmluZyBvbmx5IHRoZSBiYXNlIFVSTC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgZnJvbSB3aGljaCB0aGUgcXVlcnkgc3RyaW5nIHdpbGwgYmUgc3RyaXBwZWQuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVSTCB3aXRob3V0IHRoZSBxdWVyeSBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgc3RyaXBRdWVyeSh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIC9bXj9dKi8uZXhlYyh1cmwpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGZyYWdtZW50IGFuZCBxdWVyeSBjb21wb25lbnRzIGZyb20gYSBnaXZlbiBVUkwgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCBzdHJpbmcgdG8gcHJvY2Vzcy5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgVVJMIHdpdGhvdXQgaXRzIGZyYWdtZW50IGFuZCBxdWVyeSBjb21wb25lbnRzLlxuICAgKi9cbiAgc3RhdGljIHN0cmlwRnJhZ21lbnRBbmRRdWVyeSh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF1cmwpIHJldHVybiB1cmw7XG4gICAgcmV0dXJuIHRoaXMuc3RyaXBRdWVyeSgvW14jXSovLmV4ZWModXJsKVswXSk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIGZyYWdtZW50IGlkZW50aWZpZXIgZnJvbSB0aGUgZ2l2ZW4gVVJMLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGhlIGZyYWdtZW50LlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmcmFnbWVudCBpZGVudGlmaWVyIG9mIHRoZSBVUkwsIGV4Y2x1ZGluZyB0aGUgJyMnIHN5bWJvbC5cbiAgICovXG4gIHN0YXRpYyBnZXRGcmFnbWVudCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGlzTmlsT3JCbGFuayh1cmwpKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBtYXRjaCA9IHVybC5tYXRjaCgvIyguKikkLyk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiAnJztcbiAgfVxuXG4gIHN0YXRpYyByZXNvbHZlUmVsYXRpdmVVcmwoYmFzZVVybDogc3RyaW5nLCByZWxhdGl2ZVBhdGg6IHN0cmluZywgb3B0cz86IHthYnNvbHV0ZUJ5RGVmYXVsdDogYm9vbGVhbn0pOiBzdHJpbmcge1xuICAgIGlmICghYmFzZVVybCkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyAnYmFzZVVybCcgYXJndW1lbnRcIik7XG4gICAgaWYgKCFyZWxhdGl2ZVBhdGgpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgJ3JlbGF0aXZlUGF0aCcgYXJndW1lbnRcIik7XG4gICAgaWYgKCF0aGlzLmlzUmVsYXRpdmVVcmwocmVsYXRpdmVQYXRoKSkgdGhyb3cgbmV3IEVycm9yKFwiU2hvdWxkIGJlIGEgcmVsYXRpdmUgcGF0aFwiKTtcblxuICAgIC8vIERldGVjdCBhYnNvbHV0ZSBVUkxcbiAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy8nKSB8fCAob3B0cz8uYWJzb2x1dGVCeURlZmF1bHQgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuJykpKSB7XG4gICAgICBiYXNlVXJsID0gdGhpcy5nZXRSb290VXJsKGJhc2VVcmwpO1xuICAgIH1cblxuICAgIHJldHVybiBVcmxVdGlscy5ub3JtYWxpemVVcmwoVXJsVXRpbHMuY29uY2F0KGJhc2VVcmwsIHJlbGF0aXZlUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgZ2l2ZW4gVVJMIGJ5IG5vcm1hbGl6aW5nIGl0cyBwYXJ0cywgcmVtb3ZpbmcgdW5uZWNlc3NhcnkgcGF0aCBzZWdtZW50cyBsaWtlIFwiLlwiIGFuZCBcIi4uXCIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGJlIHJlc29sdmVkLiBNdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgcmVzb2x2ZWQgYW5kIGNsZWFuZWQgVVJMIHN0cmluZy5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwcm92aWRlZCBVUkwgaXMgbWlzc2luZyBvciB1bmRlZmluZWQuXG4gICAqL1xuICBzdGF0aWMgbm9ybWFsaXplVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXVybCkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyAndXJsJyBhcmd1bWVudFwiKTtcbiAgICByZXR1cm4gdGhpcy5jbGVhblVybCh1cmwpXG4gICAgICAuc3BsaXQoJy8nKVxuICAgICAgLnJlZHVjZSgocmVzLCBwYXJ0KSA9PiB7XG4gICAgICAgIGlmIChwYXJ0ID09PSAnLicpIHJldHVybiByZXM7XG4gICAgICAgIGlmIChwYXJ0ID09PSAnLi4nICYmIHJlcy5sZW5ndGggPiAwKSByZXR1cm4gcmVzLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgcmV0dXJuIHJlcy5jb25jYXQocGFydCk7XG4gICAgICB9LCBbXSlcbiAgICAgIC5qb2luKCcvJyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgYW5kIHJldHVybnMgdGhlIHJvb3QgVVJMIGZyb20gdGhlIGdpdmVuIGNvbXBsZXRlIFVSTCBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgY29tcGxldGUgVVJMIHN0cmluZyBmcm9tIHdoaWNoIHRoZSByb290IFVSTCB3aWxsIGJlIGV4dHJhY3RlZC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgcm9vdCBVUkwgaW5jbHVkaW5nIHRoZSBwcm90b2NvbCBhbmQgaG9zdCAoYW5kIHBvcnQgaWYgcHJlc2VudCkuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHByb3ZpZGVkIFVSTCBpcyBtaXNzaW5nIG9yIGlzIGluIGFuIGludmFsaWQgZm9ybWF0LlxuICAgKi9cbiAgc3RhdGljIGdldFJvb3RVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nICd1cmwnIGFyZ3VtZW50XCIpO1xuICAgIGxldCBbcHJvdG9jb2wsIHBhdGhdID0gdXJsLnNwbGl0KCcvLycsIDIpO1xuICAgIGlmICghcHJvdG9jb2wgfHwgaXNOaWxPckJsYW5rKHBhdGgpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgVVJMIGZvcm1hdDogJHt1cmx9YCk7XG4gICAgY29uc3QgaG9zdEFuZFBvcnQgPSBwYXRoLnNwbGl0KCcvJywgMilbMF07XG4gICAgcmV0dXJuIGAke3Byb3RvY29sfS8vJHtob3N0QW5kUG9ydH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcGFyZW50IFVSTCBvciBkaXJlY3RvcnkgcGF0aCBmcm9tIHRoZSBwcm92aWRlZCBVUkwuXG4gICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgYm90aCByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgVVJMcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgZnJvbSB3aGljaCB0byBkZXJpdmUgdGhlIHBhcmVudCBwYXRoLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgTXVzdCBiZSBhIHZhbGlkIFVSTCBvciByZWxhdGl2ZSBwYXRoLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYXJlbnQgVVJMIG9yIGRpcmVjdG9yeSBwYXRoLiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGlucHV0IGlzIGludmFsaWQuXG4gICAqL1xuICBzdGF0aWMgZ2V0UGFyZW50KHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXVybCkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyAndXJsJyBhcmd1bWVudFwiKTtcbiAgICBjb25zdCBjbGVhblVybCA9IHRoaXMuc3RyaXBGcmFnbWVudEFuZFF1ZXJ5KHVybCk7XG4gICAgaWYgKGNsZWFuVXJsLmVuZHNXaXRoKCcvJykpIHJldHVybiBjbGVhblVybDsgLy8gU2tpcCBpZiBhbHJlYWR5IGEgcGFyZW50IGRpcmVjdG9yeVxuICAgIGNvbnN0IHBhcmVudFBhdGggPSBjbGVhblVybCArICcvJyArICcuLic7XG4gICAgaWYgKHRoaXMuaXNSZWxhdGl2ZVVybCh1cmwpKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlUmVsYXRpdmVVcmwod2luZG93LmxvY2F0aW9uLmhyZWYsIHBhcmVudFBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ub3JtYWxpemVVcmwocGFyZW50UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHRoZSBwcm92aWRlZCBVUkwgYnkgZW5jb2RpbmcgaXQgc2FmZWx5IGFuZCByZXBsYWNpbmcgc3BlY2lmaWMgcGF0dGVybnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIC0gVGhlIFVSTCBzdHJpbmcgdG8gYmUgY2xlYW5lZC5cbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9IFRoZSBjbGVhbmVkIGFuZCBlbmNvZGVkIFVSTCBzdHJpbmcsIG9yIG51bGwgaWYgYW4gZXJyb3Igb2NjdXJzLlxuICAgKi9cbiAgc3RhdGljIGNsZWFuVXJsKGhyZWY6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGhyZWYgPSBlbmNvZGVVUkkoaHJlZikucmVwbGFjZSgvJTI1L2csICclJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBocmVmO1xuICB9XG5cbiAgc3RhdGljIGFkZFRyYWlsaW5nU2xhc2godXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmwuZW5kc1dpdGgoJy8nKSA/IHVybCA6IHVybCArICcvJztcbiAgfVxuXG4gIHN0YXRpYyBhZGRTdGFydGluZ1NsYXNoKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXJsLnN0YXJ0c1dpdGgoJy8nKSA/IHVybCA6ICcvJyArIHVybDtcbiAgfVxuXG4gIHN0YXRpYyByZW1vdmVTdGFydGluZ1NsYXNoKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXJsLnN0YXJ0c1dpdGgoJy8nKSA/IHVybC5zdWJzdHJpbmcoMSkgOiB1cmw7XG4gIH1cblxuICBzdGF0aWMgY29uY2F0KGJhc2VQYXRoOiBzdHJpbmcsIHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIWJhc2VQYXRoKSByZXR1cm4gcmVsYXRpdmVQYXRoO1xuICAgIGlmICghcmVsYXRpdmVQYXRoKSByZXR1cm4gYmFzZVBhdGg7XG4gICAgcmV0dXJuIHRoaXMuYWRkVHJhaWxpbmdTbGFzaChiYXNlUGF0aCkgKyB0aGlzLnJlbW92ZVN0YXJ0aW5nU2xhc2gocmVsYXRpdmVQYXRoKTtcbiAgfVxufVxuIl19
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZmlsZS91cmwudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEQsTUFBTSxPQUFnQixRQUFRO0lBQzVCOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFtQjtRQUN0QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBbUI7UUFDdEMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLElBQW1CO1FBQ3RDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFXO1FBQzNCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FB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QUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUMvQyxDQUFDO0lBRUQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQVc7UUFDcEMsT0FBTyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBZ0IsRUFBRSxZQUFvQjtRQUNsRCxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU8sWUFBWSxDQUFDO1FBQ25DLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xGLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzTmlsT3JCbGFuaywgaXNOb3ROaWwgfSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVXJsVXRpbHMge1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIFVSTCBpcyBhIHJlbGF0aXZlIFVSTC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBocmVmIC0gVGhlIFVSTCB0byBjaGVjay5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgVVJMIGlzIHJlbGF0aXZlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBzdGF0aWMgaXNSZWxhdGl2ZVVybChocmVmOiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCFocmVmKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICFocmVmLnN0YXJ0c1dpdGgoJ2h0dHA6JykgJiYgIWhyZWYuc3RhcnRzV2l0aCgnaHR0cHM6JykgJiYgIWhyZWYuc3RhcnRzV2l0aCgnbWFpbHRvOicpICYmICFocmVmLnN0YXJ0c1dpdGgoJ3RlbDonKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gVVJMIGlzIGFuIGludGVybmFsIFVSTC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsfSBocmVmIC0gVGhlIFVSTCB0byBiZSBjaGVja2VkLiBDYW4gYmUgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVUkwgb3IgbnVsbC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBVUkwgaXMgaW50ZXJuYWwsIG90aGVyd2lzZSBmYWxzZS5cbiAgICovXG4gIHN0YXRpYyBpc0ludGVybmFsVXJsKGhyZWY6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIWhyZWYpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gaHJlZi5zdGFydHNXaXRoKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pIHx8IHRoaXMuaXNSZWxhdGl2ZVVybChocmVmKTtcbiAgfVxuXG4gIHN0YXRpYyBpc0V4dGVybmFsVXJsKGhyZWY6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgICBpZiAoIWhyZWYpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXRoaXMuaXNJbnRlcm5hbFVybChocmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBxdWVyeSBzdHJpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMLCByZXR1cm5pbmcgb25seSB0aGUgYmFzZSBVUkwuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIGZyb20gd2hpY2ggdGhlIHF1ZXJ5IHN0cmluZyB3aWxsIGJlIHN0cmlwcGVkLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBVUkwgd2l0aG91dCB0aGUgcXVlcnkgc3RyaW5nLlxuICAgKi9cbiAgc3RhdGljIHN0cmlwUXVlcnkodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAvW14/XSovLmV4ZWModXJsKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBmcmFnbWVudCBhbmQgcXVlcnkgY29tcG9uZW50cyBmcm9tIGEgZ2l2ZW4gVVJMIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgc3RyaW5nIHRvIHByb2Nlc3MuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFVSTCB3aXRob3V0IGl0cyBmcmFnbWVudCBhbmQgcXVlcnkgY29tcG9uZW50cy5cbiAgICovXG4gIHN0YXRpYyBzdHJpcEZyYWdtZW50QW5kUXVlcnkodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsKSByZXR1cm4gdXJsO1xuICAgIHJldHVybiB0aGlzLnN0cmlwUXVlcnkoL1teI10qLy5leGVjKHVybClbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIHRoZSBmcmFnbWVudCBpZGVudGlmaWVyIGZyb20gdGhlIGdpdmVuIFVSTC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBVUkwgZnJvbSB3aGljaCB0byBleHRyYWN0IHRoZSBmcmFnbWVudC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnJhZ21lbnQgaWRlbnRpZmllciBvZiB0aGUgVVJMLCBleGNsdWRpbmcgdGhlICcjJyBzeW1ib2wuXG4gICAqL1xuICBzdGF0aWMgZ2V0RnJhZ21lbnQodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChpc05pbE9yQmxhbmsodXJsKSkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goLyMoLiopJC8pO1xuICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogJyc7XG4gIH1cblxuICBzdGF0aWMgcmVzb2x2ZVJlbGF0aXZlVXJsKGJhc2VVcmw6IHN0cmluZywgcmVsYXRpdmVQYXRoOiBzdHJpbmcsIG9wdHM/OiB7IGFic29sdXRlQnlEZWZhdWx0OiBib29sZWFuIH0pOiBzdHJpbmcge1xuICAgIGlmICghYmFzZVVybCkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyAnYmFzZVVybCcgYXJndW1lbnRcIik7XG4gICAgaWYgKCFyZWxhdGl2ZVBhdGgpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgJ3JlbGF0aXZlUGF0aCcgYXJndW1lbnRcIik7XG4gICAgaWYgKCF0aGlzLmlzUmVsYXRpdmVVcmwocmVsYXRpdmVQYXRoKSkgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgYmUgYSByZWxhdGl2ZSBwYXRoJyk7XG5cbiAgICAvLyBEZXRlY3QgYWJzb2x1dGUgVVJMXG4gICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcvJykgfHwgKG9wdHM/LmFic29sdXRlQnlEZWZhdWx0ICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLicpKSkge1xuICAgICAgYmFzZVVybCA9IHRoaXMuZ2V0Um9vdFVybChiYXNlVXJsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gVXJsVXRpbHMubm9ybWFsaXplVXJsKFVybFV0aWxzLmNvbmNhdChiYXNlVXJsLCByZWxhdGl2ZVBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIGdpdmVuIFVSTCBieSBub3JtYWxpemluZyBpdHMgcGFydHMsIHJlbW92aW5nIHVubmVjZXNzYXJ5IHBhdGggc2VnbWVudHMgbGlrZSBcIi5cIiBhbmQgXCIuLlwiLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCB0byBiZSByZXNvbHZlZC4gTXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHJlc29sdmVkIGFuZCBjbGVhbmVkIFVSTCBzdHJpbmcuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvdmlkZWQgVVJMIGlzIG1pc3Npbmcgb3IgdW5kZWZpbmVkLlxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF1cmwpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgJ3VybCcgYXJndW1lbnRcIik7XG4gICAgcmV0dXJuIHRoaXMuY2xlYW5VcmwodXJsKVxuICAgICAgLnNwbGl0KCcvJylcbiAgICAgIC5yZWR1Y2UoKHJlcywgcGFydCkgPT4ge1xuICAgICAgICBpZiAocGFydCA9PT0gJy4nKSByZXR1cm4gcmVzO1xuICAgICAgICBpZiAocGFydCA9PT0gJy4uJyAmJiByZXMubGVuZ3RoID4gMCkgcmV0dXJuIHJlcy5zbGljZSgwLCAtMSk7XG4gICAgICAgIHJldHVybiByZXMuY29uY2F0KHBhcnQpO1xuICAgICAgfSwgW10pXG4gICAgICAuam9pbignLycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gY29tcGxldGVzIGEgYmFzZSBVUkwgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnNcbiAgICogcmVwcmVzZW50aW5nIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIHRvIGFkZC4gSXQgcHJvcGVybHkgZW5jb2RlcyB0aGVcbiAgICogcGFyYW1ldGVycyBhbmQgZW5zdXJlcyB0aGV5IGFyZSBhZGRlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzZXBhcmF0b3IgKCc/JyBvciAnJicpLlxuICAgKiBQYXJhbWV0ZXJzIHdpdGggbnVsbCBvciB1bmRlZmluZWQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IGZpbHRlcmVkIG91dC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gSW4gYSB0ZW1wbGF0ZVxuICAgKiA8YSBbaHJlZl09XCInaHR0cHM6Ly9leGFtcGxlLmNvbScgfCBhcHBlbmRRdWVyeVBhcmFtczp7aWQ6IDEyMywgbmFtZTogJ3Rlc3QnfVwiPkxpbms8L2E+XG4gICAqIC8vIFJlc3VsdDogaHR0cHM6Ly9leGFtcGxlLmNvbT9pZD0xMjMmbmFtZT10ZXN0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIElmIHRoZSBVUkwgYWxyZWFkeSBjb250YWlucyBwYXJhbWV0ZXJzXG4gICAqIDxhIFtocmVmXT1cIidodHRwczovL2V4YW1wbGUuY29tP3BhZ2U9MScgfCBhcHBlbmRRdWVyeVBhcmFtczp7c29ydDogJ2FzYyd9XCI+TGluazwvYT5cbiAgICogLy8gUmVzdWx0OiBodHRwczovL2V4YW1wbGUuY29tP3BhZ2U9MSZzb3J0PWFzY1xuICAgKlxuICAgKiBAcGFyYW0gdXJsXG4gICAqIEBwYXJhbSBxdWVyeVBhcmFtc1xuICAgKi9cbiAgc3RhdGljIGFwcGVuZFF1ZXJ5UGFyYW1zKHVybDogc3RyaW5nIHwgYW55W10sIHF1ZXJ5UGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogc3RyaW5nIHtcbiAgICBjb25zdCB1cmxTdHIgPSB0eXBlb2YgdXJsID09PSAnc3RyaW5nJyA/IHVybCA6IHRoaXMuYWRkU3RhcnRpbmdTbGFzaCh1cmwuam9pbignLycpKTtcbiAgICBpZiAoaXNOaWxPckJsYW5rKHVybFN0cikgfHwgIXF1ZXJ5UGFyYW1zKSByZXR1cm4gdXJsU3RyO1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gT2JqZWN0LmVudHJpZXMocXVlcnlQYXJhbXMpXG4gICAgICAuZmlsdGVyKChbXywgdmFsdWVdKSA9PiBpc05vdE5pbCh2YWx1ZSkpXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YClcbiAgICAgIC5qb2luKCcmJyk7XG4gICAgaWYgKGlzTmlsT3JCbGFuayhxdWVyeVN0cmluZykpIHJldHVybiB1cmxTdHI7XG4gICAgcmV0dXJuIHVybFN0ciArICh1cmxTdHIuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JykgKyBxdWVyeVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBhbmQgcmV0dXJucyB0aGUgcm9vdCBVUkwgZnJvbSB0aGUgZ2l2ZW4gY29tcGxldGUgVVJMIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIFRoZSBjb21wbGV0ZSBVUkwgc3RyaW5nIGZyb20gd2hpY2ggdGhlIHJvb3QgVVJMIHdpbGwgYmUgZXh0cmFjdGVkLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSByb290IFVSTCBpbmNsdWRpbmcgdGhlIHByb3RvY29sIGFuZCBob3N0IChhbmQgcG9ydCBpZiBwcmVzZW50KS5cbiAgICogQHRocm93cyB7RXJyb3J9IFRocm93cyBhbiBlcnJvciBpZiB0aGUgcHJvdmlkZWQgVVJMIGlzIG1pc3Npbmcgb3IgaXMgaW4gYW4gaW52YWxpZCBmb3JtYXQuXG4gICAqL1xuICBzdGF0aWMgZ2V0Um9vdFVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF1cmwpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgJ3VybCcgYXJndW1lbnRcIik7XG4gICAgbGV0IFtwcm90b2NvbCwgcGF0aF0gPSB1cmwuc3BsaXQoJy8vJywgMik7XG4gICAgaWYgKCFwcm90b2NvbCB8fCBpc05pbE9yQmxhbmsocGF0aCkpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVUkwgZm9ybWF0OiAke3VybH1gKTtcbiAgICBjb25zdCBob3N0QW5kUG9ydCA9IHBhdGguc3BsaXQoJy8nLCAyKVswXTtcbiAgICByZXR1cm4gYCR7cHJvdG9jb2x9Ly8ke2hvc3RBbmRQb3J0fWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBwYXJlbnQgVVJMIG9yIGRpcmVjdG9yeSBwYXRoIGZyb20gdGhlIHByb3ZpZGVkIFVSTC5cbiAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBVUkxzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCBmcm9tIHdoaWNoIHRvIGRlcml2ZSB0aGUgcGFyZW50IHBhdGguXG4gICAqICAgICAgICAgICAgICAgICAgICAgICBNdXN0IGJlIGEgdmFsaWQgVVJMIG9yIHJlbGF0aXZlIHBhdGguXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhcmVudCBVUkwgb3IgZGlyZWN0b3J5IHBhdGguIFRocm93cyBhbiBlcnJvciBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZC5cbiAgICovXG4gIHN0YXRpYyBnZXRQYXJlbnQodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nICd1cmwnIGFyZ3VtZW50XCIpO1xuICAgIGNvbnN0IGNsZWFuVXJsID0gdGhpcy5zdHJpcEZyYWdtZW50QW5kUXVlcnkodXJsKTtcbiAgICBpZiAoY2xlYW5VcmwuZW5kc1dpdGgoJy8nKSkgcmV0dXJuIGNsZWFuVXJsOyAvLyBTa2lwIGlmIGFscmVhZHkgYSBwYXJlbnQgZGlyZWN0b3J5XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IGNsZWFuVXJsICsgJy8nICsgJy4uJztcbiAgICBpZiAodGhpcy5pc1JlbGF0aXZlVXJsKHVybCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVSZWxhdGl2ZVVybCh3aW5kb3cubG9jYXRpb24uaHJlZiwgcGFyZW50UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZVVybChwYXJlbnRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnMgdGhlIHByb3ZpZGVkIFVSTCBieSBlbmNvZGluZyBpdCBzYWZlbHkgYW5kIHJlcGxhY2luZyBzcGVjaWZpYyBwYXR0ZXJucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhyZWYgLSBUaGUgVVJMIHN0cmluZyB0byBiZSBjbGVhbmVkLlxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH0gVGhlIGNsZWFuZWQgYW5kIGVuY29kZWQgVVJMIHN0cmluZywgb3IgbnVsbCBpZiBhbiBlcnJvciBvY2N1cnMuXG4gICAqL1xuICBzdGF0aWMgY2xlYW5VcmwoaHJlZjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgaHJlZiA9IGVuY29kZVVSSShocmVmKS5yZXBsYWNlKC8lMjUvZywgJyUnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGhyZWY7XG4gIH1cblxuICBzdGF0aWMgYWRkVHJhaWxpbmdTbGFzaCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybC5lbmRzV2l0aCgnLycpID8gdXJsIDogdXJsICsgJy8nO1xuICB9XG5cbiAgc3RhdGljIGFkZFN0YXJ0aW5nU2xhc2godXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmwuc3RhcnRzV2l0aCgnLycpID8gdXJsIDogJy8nICsgdXJsO1xuICB9XG5cbiAgc3RhdGljIHJlbW92ZVN0YXJ0aW5nU2xhc2godXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1cmwuc3RhcnRzV2l0aCgnLycpID8gdXJsLnN1YnN0cmluZygxKSA6IHVybDtcbiAgfVxuXG4gIHN0YXRpYyBjb25jYXQoYmFzZVBhdGg6IHN0cmluZywgcmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghYmFzZVBhdGgpIHJldHVybiByZWxhdGl2ZVBhdGg7XG4gICAgaWYgKCFyZWxhdGl2ZVBhdGgpIHJldHVybiBiYXNlUGF0aDtcbiAgICByZXR1cm4gdGhpcy5hZGRUcmFpbGluZ1NsYXNoKGJhc2VQYXRoKSArIHRoaXMucmVtb3ZlU3RhcnRpbmdTbGFzaChyZWxhdGl2ZVBhdGgpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Pipe } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { UrlUtils } from '../file/url.utils';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
/**
|
|
5
5
|
* Pipe permettant d'ajouter des paramètres de requête à une URL.
|
|
@@ -21,15 +21,7 @@ import * as i0 from "@angular/core";
|
|
|
21
21
|
*/
|
|
22
22
|
export class AppendQueryParamsPipePipe {
|
|
23
23
|
transform(url, queryParams) {
|
|
24
|
-
|
|
25
|
-
return url;
|
|
26
|
-
let queryString = Object.entries(queryParams)
|
|
27
|
-
.filter(([_, value]) => isNotNil(value))
|
|
28
|
-
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
29
|
-
.join('&');
|
|
30
|
-
if (isNilOrBlank(queryString))
|
|
31
|
-
return url;
|
|
32
|
-
return url + (url.includes('?') ? '&' : '?') + queryString;
|
|
24
|
+
return UrlUtils.appendQueryParams(url, queryParams);
|
|
33
25
|
}
|
|
34
26
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppendQueryParamsPipePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
35
27
|
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AppendQueryParamsPipePipe, name: "appendQueryParams" });
|
|
@@ -40,4 +32,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
40
32
|
name: 'appendQueryParams',
|
|
41
33
|
}]
|
|
42
34
|
}] });
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLnBpcGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvcGlwZXMvdXJsLnBpcGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBSUgsTUFBTSxPQUFPLHlCQUF5QjtJQUNwQyxTQUFTLENBQUMsR0FBVyxFQUFFLFdBQW1DO1FBQ3hELE9BQU8sUUFBUSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN0RCxDQUFDO3dHQUhVLHlCQUF5QjtzR0FBekIseUJBQXlCOzs0RkFBekIseUJBQXlCO2tCQUhyQyxJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxtQkFBbUI7aUJBQzFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVXJsVXRpbHMgfSBmcm9tICcuLi9maWxlL3VybC51dGlscyc7XG5cbi8qKlxuICogUGlwZSBwZXJtZXR0YW50IGQnYWpvdXRlciBkZXMgcGFyYW3DqHRyZXMgZGUgcmVxdcOqdGUgw6AgdW5lIFVSTC5cbiAqXG4gKiBDZXR0ZSBwaXBlIHByZW5kIHVuZSBVUkwgZGUgYmFzZSBldCB1biBvYmpldCBjb250ZW5hbnQgZGVzIHBhaXJlcyBjbMOpLXZhbGV1clxuICogcmVwcsOpc2VudGFudCBsZXMgcGFyYW3DqHRyZXMgZGUgcmVxdcOqdGUgw6AgYWpvdXRlci4gRWxsZSBlbmNvZGUgY29ycmVjdGVtZW50IGxlc1xuICogcGFyYW3DqHRyZXMgZXQgcydhc3N1cmUgZGUgbGVzIGFqb3V0ZXIgYXZlYyBsZSBzw6lwYXJhdGV1ciBhcHByb3ByacOpICgnPycgb3UgJyYnKS5cbiAqIExlcyBwYXJhbcOodHJlcyBhdmVjIGRlcyB2YWxldXJzIG51bGxlcyBvdSB1bmRlZmluZWQgc29udCBhdXRvbWF0aXF1ZW1lbnQgZmlsdHLDqXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIERhbnMgdW4gdGVtcGxhdGVcbiAqIDxhIFtocmVmXT1cIidodHRwczovL2V4YW1wbGUuY29tJyB8IGFwcGVuZFF1ZXJ5UGFyYW1zOntpZDogMTIzLCBuYW1lOiAndGVzdCd9XCI+TGllbjwvYT5cbiAqIC8vIFLDqXN1bHRhdDogaHR0cHM6Ly9leGFtcGxlLmNvbT9pZD0xMjMmbmFtZT10ZXN0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNpIGwnVVJMIGNvbnRpZW50IGTDqWrDoCBkZXMgcGFyYW3DqHRyZXNcbiAqIDxhIFtocmVmXT1cIidodHRwczovL2V4YW1wbGUuY29tP3BhZ2U9MScgfCBhcHBlbmRRdWVyeVBhcmFtczp7c29ydDogJ2FzYyd9XCI+TGllbjwvYT5cbiAqIC8vIFLDqXN1bHRhdDogaHR0cHM6Ly9leGFtcGxlLmNvbT9wYWdlPTEmc29ydD1hc2NcbiAqL1xuQFBpcGUoe1xuICBuYW1lOiAnYXBwZW5kUXVlcnlQYXJhbXMnLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBlbmRRdWVyeVBhcmFtc1BpcGVQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSh1cmw6IHN0cmluZywgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBhbnkge1xuICAgIHJldHVybiBVcmxVdGlscy5hcHBlbmRRdWVyeVBhcmFtcyh1cmwsIHF1ZXJ5UGFyYW1zKTtcbiAgfVxufVxuIl19
|
|
@@ -5568,6 +5568,200 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
5568
5568
|
}]
|
|
5569
5569
|
}] });
|
|
5570
5570
|
|
|
5571
|
+
class UrlUtils {
|
|
5572
|
+
/**
|
|
5573
|
+
* Determines if a given URL is a relative URL.
|
|
5574
|
+
*
|
|
5575
|
+
* @param {string | null} href - The URL to check.
|
|
5576
|
+
* @return {boolean} True if the URL is relative, false otherwise.
|
|
5577
|
+
*/
|
|
5578
|
+
static isRelativeUrl(href) {
|
|
5579
|
+
if (!href)
|
|
5580
|
+
return false;
|
|
5581
|
+
return !href.startsWith('http:') && !href.startsWith('https:') && !href.startsWith('mailto:') && !href.startsWith('tel:');
|
|
5582
|
+
}
|
|
5583
|
+
/**
|
|
5584
|
+
* Determines if a given URL is an internal URL.
|
|
5585
|
+
*
|
|
5586
|
+
* @param {string | null} href - The URL to be checked. Can be a string representing the URL or null.
|
|
5587
|
+
* @return {boolean} Returns true if the URL is internal, otherwise false.
|
|
5588
|
+
*/
|
|
5589
|
+
static isInternalUrl(href) {
|
|
5590
|
+
if (!href)
|
|
5591
|
+
return false;
|
|
5592
|
+
return href.startsWith(window.location.origin) || this.isRelativeUrl(href);
|
|
5593
|
+
}
|
|
5594
|
+
static isExternalUrl(href) {
|
|
5595
|
+
if (!href)
|
|
5596
|
+
return false;
|
|
5597
|
+
return !this.isInternalUrl(href);
|
|
5598
|
+
}
|
|
5599
|
+
/**
|
|
5600
|
+
* Removes the query string from the given URL, returning only the base URL.
|
|
5601
|
+
*
|
|
5602
|
+
* @param {string} url - The URL from which the query string will be stripped.
|
|
5603
|
+
* @return {string} The URL without the query string.
|
|
5604
|
+
*/
|
|
5605
|
+
static stripQuery(url) {
|
|
5606
|
+
return /[^?]*/.exec(url)[0];
|
|
5607
|
+
}
|
|
5608
|
+
/**
|
|
5609
|
+
* Removes the fragment and query components from a given URL string.
|
|
5610
|
+
*
|
|
5611
|
+
* @param {string} url - The URL string to process.
|
|
5612
|
+
* @return {string} The URL without its fragment and query components.
|
|
5613
|
+
*/
|
|
5614
|
+
static stripFragmentAndQuery(url) {
|
|
5615
|
+
if (!url)
|
|
5616
|
+
return url;
|
|
5617
|
+
return this.stripQuery(/[^#]*/.exec(url)[0]);
|
|
5618
|
+
}
|
|
5619
|
+
/**
|
|
5620
|
+
* Extracts the fragment identifier from the given URL.
|
|
5621
|
+
*
|
|
5622
|
+
* @param {string} url - The URL from which to extract the fragment.
|
|
5623
|
+
* @return {string} The fragment identifier of the URL, excluding the '#' symbol.
|
|
5624
|
+
*/
|
|
5625
|
+
static getFragment(url) {
|
|
5626
|
+
if (isNilOrBlank(url))
|
|
5627
|
+
return '';
|
|
5628
|
+
const match = url.match(/#(.*)$/);
|
|
5629
|
+
return match ? match[1] : '';
|
|
5630
|
+
}
|
|
5631
|
+
static resolveRelativeUrl(baseUrl, relativePath, opts) {
|
|
5632
|
+
if (!baseUrl)
|
|
5633
|
+
throw new Error("Missing 'baseUrl' argument");
|
|
5634
|
+
if (!relativePath)
|
|
5635
|
+
throw new Error("Missing 'relativePath' argument");
|
|
5636
|
+
if (!this.isRelativeUrl(relativePath))
|
|
5637
|
+
throw new Error('Should be a relative path');
|
|
5638
|
+
// Detect absolute URL
|
|
5639
|
+
if (relativePath.startsWith('/') || (opts?.absoluteByDefault && !relativePath.startsWith('.'))) {
|
|
5640
|
+
baseUrl = this.getRootUrl(baseUrl);
|
|
5641
|
+
}
|
|
5642
|
+
return UrlUtils.normalizeUrl(UrlUtils.concat(baseUrl, relativePath));
|
|
5643
|
+
}
|
|
5644
|
+
/**
|
|
5645
|
+
* Resolves a given URL by normalizing its parts, removing unnecessary path segments like "." and "..".
|
|
5646
|
+
*
|
|
5647
|
+
* @param {string} url - The URL to be resolved. Must be a non-empty string.
|
|
5648
|
+
* @return {string} The resolved and cleaned URL string.
|
|
5649
|
+
* @throws {Error} If the provided URL is missing or undefined.
|
|
5650
|
+
*/
|
|
5651
|
+
static normalizeUrl(url) {
|
|
5652
|
+
if (!url)
|
|
5653
|
+
throw new Error("Missing 'url' argument");
|
|
5654
|
+
return this.cleanUrl(url)
|
|
5655
|
+
.split('/')
|
|
5656
|
+
.reduce((res, part) => {
|
|
5657
|
+
if (part === '.')
|
|
5658
|
+
return res;
|
|
5659
|
+
if (part === '..' && res.length > 0)
|
|
5660
|
+
return res.slice(0, -1);
|
|
5661
|
+
return res.concat(part);
|
|
5662
|
+
}, [])
|
|
5663
|
+
.join('/');
|
|
5664
|
+
}
|
|
5665
|
+
/**
|
|
5666
|
+
* This function completes a base URL with an object containing key-value pairs
|
|
5667
|
+
* representing the query parameters to add. It properly encodes the
|
|
5668
|
+
* parameters and ensures they are added with the appropriate separator ('?' or '&').
|
|
5669
|
+
* Parameters with null or undefined values are automatically filtered out.
|
|
5670
|
+
*
|
|
5671
|
+
* @example
|
|
5672
|
+
* // In a template
|
|
5673
|
+
* <a [href]="'https://example.com' | appendQueryParams:{id: 123, name: 'test'}">Link</a>
|
|
5674
|
+
* // Result: https://example.com?id=123&name=test
|
|
5675
|
+
*
|
|
5676
|
+
* @example
|
|
5677
|
+
* // If the URL already contains parameters
|
|
5678
|
+
* <a [href]="'https://example.com?page=1' | appendQueryParams:{sort: 'asc'}">Link</a>
|
|
5679
|
+
* // Result: https://example.com?page=1&sort=asc
|
|
5680
|
+
*
|
|
5681
|
+
* @param url
|
|
5682
|
+
* @param queryParams
|
|
5683
|
+
*/
|
|
5684
|
+
static appendQueryParams(url, queryParams) {
|
|
5685
|
+
const urlStr = typeof url === 'string' ? url : this.addStartingSlash(url.join('/'));
|
|
5686
|
+
if (isNilOrBlank(urlStr) || !queryParams)
|
|
5687
|
+
return urlStr;
|
|
5688
|
+
const queryString = Object.entries(queryParams)
|
|
5689
|
+
.filter(([_, value]) => isNotNil(value))
|
|
5690
|
+
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
5691
|
+
.join('&');
|
|
5692
|
+
if (isNilOrBlank(queryString))
|
|
5693
|
+
return urlStr;
|
|
5694
|
+
return urlStr + (urlStr.includes('?') ? '&' : '?') + queryString;
|
|
5695
|
+
}
|
|
5696
|
+
/**
|
|
5697
|
+
* Extracts and returns the root URL from the given complete URL string.
|
|
5698
|
+
*
|
|
5699
|
+
* @param {string} url - The complete URL string from which the root URL will be extracted.
|
|
5700
|
+
* @return {string} The root URL including the protocol and host (and port if present).
|
|
5701
|
+
* @throws {Error} Throws an error if the provided URL is missing or is in an invalid format.
|
|
5702
|
+
*/
|
|
5703
|
+
static getRootUrl(url) {
|
|
5704
|
+
if (!url)
|
|
5705
|
+
throw new Error("Missing 'url' argument");
|
|
5706
|
+
let [protocol, path] = url.split('//', 2);
|
|
5707
|
+
if (!protocol || isNilOrBlank(path))
|
|
5708
|
+
throw new Error(`Invalid URL format: ${url}`);
|
|
5709
|
+
const hostAndPort = path.split('/', 2)[0];
|
|
5710
|
+
return `${protocol}//${hostAndPort}`;
|
|
5711
|
+
}
|
|
5712
|
+
/**
|
|
5713
|
+
* Retrieves the parent URL or directory path from the provided URL.
|
|
5714
|
+
* This method handles both relative and absolute URLs.
|
|
5715
|
+
*
|
|
5716
|
+
* @param {string} url - The URL from which to derive the parent path.
|
|
5717
|
+
* Must be a valid URL or relative path.
|
|
5718
|
+
* @return {string} The parent URL or directory path. Throws an error if the input is invalid.
|
|
5719
|
+
*/
|
|
5720
|
+
static getParent(url) {
|
|
5721
|
+
if (!url)
|
|
5722
|
+
throw new Error("Missing 'url' argument");
|
|
5723
|
+
const cleanUrl = this.stripFragmentAndQuery(url);
|
|
5724
|
+
if (cleanUrl.endsWith('/'))
|
|
5725
|
+
return cleanUrl; // Skip if already a parent directory
|
|
5726
|
+
const parentPath = cleanUrl + '/' + '..';
|
|
5727
|
+
if (this.isRelativeUrl(url)) {
|
|
5728
|
+
return this.resolveRelativeUrl(window.location.href, parentPath);
|
|
5729
|
+
}
|
|
5730
|
+
return this.normalizeUrl(parentPath);
|
|
5731
|
+
}
|
|
5732
|
+
/**
|
|
5733
|
+
* Cleans the provided URL by encoding it safely and replacing specific patterns.
|
|
5734
|
+
*
|
|
5735
|
+
* @param {string} href - The URL string to be cleaned.
|
|
5736
|
+
* @return {string|null} The cleaned and encoded URL string, or null if an error occurs.
|
|
5737
|
+
*/
|
|
5738
|
+
static cleanUrl(href) {
|
|
5739
|
+
try {
|
|
5740
|
+
href = encodeURI(href).replace(/%25/g, '%');
|
|
5741
|
+
}
|
|
5742
|
+
catch (e) {
|
|
5743
|
+
return null;
|
|
5744
|
+
}
|
|
5745
|
+
return href;
|
|
5746
|
+
}
|
|
5747
|
+
static addTrailingSlash(url) {
|
|
5748
|
+
return url.endsWith('/') ? url : url + '/';
|
|
5749
|
+
}
|
|
5750
|
+
static addStartingSlash(url) {
|
|
5751
|
+
return url.startsWith('/') ? url : '/' + url;
|
|
5752
|
+
}
|
|
5753
|
+
static removeStartingSlash(url) {
|
|
5754
|
+
return url.startsWith('/') ? url.substring(1) : url;
|
|
5755
|
+
}
|
|
5756
|
+
static concat(basePath, relativePath) {
|
|
5757
|
+
if (!basePath)
|
|
5758
|
+
return relativePath;
|
|
5759
|
+
if (!relativePath)
|
|
5760
|
+
return basePath;
|
|
5761
|
+
return this.addTrailingSlash(basePath) + this.removeStartingSlash(relativePath);
|
|
5762
|
+
}
|
|
5763
|
+
}
|
|
5764
|
+
|
|
5571
5765
|
/**
|
|
5572
5766
|
* Pipe permettant d'ajouter des paramètres de requête à une URL.
|
|
5573
5767
|
*
|
|
@@ -5588,15 +5782,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
5588
5782
|
*/
|
|
5589
5783
|
class AppendQueryParamsPipePipe {
|
|
5590
5784
|
transform(url, queryParams) {
|
|
5591
|
-
|
|
5592
|
-
return url;
|
|
5593
|
-
let queryString = Object.entries(queryParams)
|
|
5594
|
-
.filter(([_, value]) => isNotNil(value))
|
|
5595
|
-
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
5596
|
-
.join('&');
|
|
5597
|
-
if (isNilOrBlank(queryString))
|
|
5598
|
-
return url;
|
|
5599
|
-
return url + (url.includes('?') ? '&' : '?') + queryString;
|
|
5785
|
+
return UrlUtils.appendQueryParams(url, queryParams);
|
|
5600
5786
|
}
|
|
5601
5787
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppendQueryParamsPipePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
5602
5788
|
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: AppendQueryParamsPipePipe, name: "appendQueryParams" });
|
|
@@ -27934,169 +28120,6 @@ class CsvUtils {
|
|
|
27934
28120
|
}
|
|
27935
28121
|
}
|
|
27936
28122
|
|
|
27937
|
-
class UrlUtils {
|
|
27938
|
-
/**
|
|
27939
|
-
* Determines if a given URL is a relative URL.
|
|
27940
|
-
*
|
|
27941
|
-
* @param {string | null} href - The URL to check.
|
|
27942
|
-
* @return {boolean} True if the URL is relative, false otherwise.
|
|
27943
|
-
*/
|
|
27944
|
-
static isRelativeUrl(href) {
|
|
27945
|
-
if (!href)
|
|
27946
|
-
return false;
|
|
27947
|
-
return !href.startsWith('http:') && !href.startsWith('https:') && !href.startsWith('mailto:') && !href.startsWith('tel:');
|
|
27948
|
-
}
|
|
27949
|
-
/**
|
|
27950
|
-
* Determines if a given URL is an internal URL.
|
|
27951
|
-
*
|
|
27952
|
-
* @param {string | null} href - The URL to be checked. Can be a string representing the URL or null.
|
|
27953
|
-
* @return {boolean} Returns true if the URL is internal, otherwise false.
|
|
27954
|
-
*/
|
|
27955
|
-
static isInternalUrl(href) {
|
|
27956
|
-
if (!href)
|
|
27957
|
-
return false;
|
|
27958
|
-
return href.startsWith(window.location.origin) || this.isRelativeUrl(href);
|
|
27959
|
-
}
|
|
27960
|
-
static isExternalUrl(href) {
|
|
27961
|
-
if (!href)
|
|
27962
|
-
return false;
|
|
27963
|
-
return !this.isInternalUrl(href);
|
|
27964
|
-
}
|
|
27965
|
-
/**
|
|
27966
|
-
* Removes the query string from the given URL, returning only the base URL.
|
|
27967
|
-
*
|
|
27968
|
-
* @param {string} url - The URL from which the query string will be stripped.
|
|
27969
|
-
* @return {string} The URL without the query string.
|
|
27970
|
-
*/
|
|
27971
|
-
static stripQuery(url) {
|
|
27972
|
-
return /[^?]*/.exec(url)[0];
|
|
27973
|
-
}
|
|
27974
|
-
/**
|
|
27975
|
-
* Removes the fragment and query components from a given URL string.
|
|
27976
|
-
*
|
|
27977
|
-
* @param {string} url - The URL string to process.
|
|
27978
|
-
* @return {string} The URL without its fragment and query components.
|
|
27979
|
-
*/
|
|
27980
|
-
static stripFragmentAndQuery(url) {
|
|
27981
|
-
if (!url)
|
|
27982
|
-
return url;
|
|
27983
|
-
return this.stripQuery(/[^#]*/.exec(url)[0]);
|
|
27984
|
-
}
|
|
27985
|
-
/**
|
|
27986
|
-
* Extracts the fragment identifier from the given URL.
|
|
27987
|
-
*
|
|
27988
|
-
* @param {string} url - The URL from which to extract the fragment.
|
|
27989
|
-
* @return {string} The fragment identifier of the URL, excluding the '#' symbol.
|
|
27990
|
-
*/
|
|
27991
|
-
static getFragment(url) {
|
|
27992
|
-
if (isNilOrBlank(url))
|
|
27993
|
-
return '';
|
|
27994
|
-
const match = url.match(/#(.*)$/);
|
|
27995
|
-
return match ? match[1] : '';
|
|
27996
|
-
}
|
|
27997
|
-
static resolveRelativeUrl(baseUrl, relativePath, opts) {
|
|
27998
|
-
if (!baseUrl)
|
|
27999
|
-
throw new Error("Missing 'baseUrl' argument");
|
|
28000
|
-
if (!relativePath)
|
|
28001
|
-
throw new Error("Missing 'relativePath' argument");
|
|
28002
|
-
if (!this.isRelativeUrl(relativePath))
|
|
28003
|
-
throw new Error("Should be a relative path");
|
|
28004
|
-
// Detect absolute URL
|
|
28005
|
-
if (relativePath.startsWith('/') || (opts?.absoluteByDefault && !relativePath.startsWith('.'))) {
|
|
28006
|
-
baseUrl = this.getRootUrl(baseUrl);
|
|
28007
|
-
}
|
|
28008
|
-
return UrlUtils.normalizeUrl(UrlUtils.concat(baseUrl, relativePath));
|
|
28009
|
-
}
|
|
28010
|
-
/**
|
|
28011
|
-
* Resolves a given URL by normalizing its parts, removing unnecessary path segments like "." and "..".
|
|
28012
|
-
*
|
|
28013
|
-
* @param {string} url - The URL to be resolved. Must be a non-empty string.
|
|
28014
|
-
* @return {string} The resolved and cleaned URL string.
|
|
28015
|
-
* @throws {Error} If the provided URL is missing or undefined.
|
|
28016
|
-
*/
|
|
28017
|
-
static normalizeUrl(url) {
|
|
28018
|
-
if (!url)
|
|
28019
|
-
throw new Error("Missing 'url' argument");
|
|
28020
|
-
return this.cleanUrl(url)
|
|
28021
|
-
.split('/')
|
|
28022
|
-
.reduce((res, part) => {
|
|
28023
|
-
if (part === '.')
|
|
28024
|
-
return res;
|
|
28025
|
-
if (part === '..' && res.length > 0)
|
|
28026
|
-
return res.slice(0, -1);
|
|
28027
|
-
return res.concat(part);
|
|
28028
|
-
}, [])
|
|
28029
|
-
.join('/');
|
|
28030
|
-
}
|
|
28031
|
-
/**
|
|
28032
|
-
* Extracts and returns the root URL from the given complete URL string.
|
|
28033
|
-
*
|
|
28034
|
-
* @param {string} url - The complete URL string from which the root URL will be extracted.
|
|
28035
|
-
* @return {string} The root URL including the protocol and host (and port if present).
|
|
28036
|
-
* @throws {Error} Throws an error if the provided URL is missing or is in an invalid format.
|
|
28037
|
-
*/
|
|
28038
|
-
static getRootUrl(url) {
|
|
28039
|
-
if (!url)
|
|
28040
|
-
throw new Error("Missing 'url' argument");
|
|
28041
|
-
let [protocol, path] = url.split('//', 2);
|
|
28042
|
-
if (!protocol || isNilOrBlank(path))
|
|
28043
|
-
throw new Error(`Invalid URL format: ${url}`);
|
|
28044
|
-
const hostAndPort = path.split('/', 2)[0];
|
|
28045
|
-
return `${protocol}//${hostAndPort}`;
|
|
28046
|
-
}
|
|
28047
|
-
/**
|
|
28048
|
-
* Retrieves the parent URL or directory path from the provided URL.
|
|
28049
|
-
* This method handles both relative and absolute URLs.
|
|
28050
|
-
*
|
|
28051
|
-
* @param {string} url - The URL from which to derive the parent path.
|
|
28052
|
-
* Must be a valid URL or relative path.
|
|
28053
|
-
* @return {string} The parent URL or directory path. Throws an error if the input is invalid.
|
|
28054
|
-
*/
|
|
28055
|
-
static getParent(url) {
|
|
28056
|
-
if (!url)
|
|
28057
|
-
throw new Error("Missing 'url' argument");
|
|
28058
|
-
const cleanUrl = this.stripFragmentAndQuery(url);
|
|
28059
|
-
if (cleanUrl.endsWith('/'))
|
|
28060
|
-
return cleanUrl; // Skip if already a parent directory
|
|
28061
|
-
const parentPath = cleanUrl + '/' + '..';
|
|
28062
|
-
if (this.isRelativeUrl(url)) {
|
|
28063
|
-
return this.resolveRelativeUrl(window.location.href, parentPath);
|
|
28064
|
-
}
|
|
28065
|
-
return this.normalizeUrl(parentPath);
|
|
28066
|
-
}
|
|
28067
|
-
/**
|
|
28068
|
-
* Cleans the provided URL by encoding it safely and replacing specific patterns.
|
|
28069
|
-
*
|
|
28070
|
-
* @param {string} href - The URL string to be cleaned.
|
|
28071
|
-
* @return {string|null} The cleaned and encoded URL string, or null if an error occurs.
|
|
28072
|
-
*/
|
|
28073
|
-
static cleanUrl(href) {
|
|
28074
|
-
try {
|
|
28075
|
-
href = encodeURI(href).replace(/%25/g, '%');
|
|
28076
|
-
}
|
|
28077
|
-
catch (e) {
|
|
28078
|
-
return null;
|
|
28079
|
-
}
|
|
28080
|
-
return href;
|
|
28081
|
-
}
|
|
28082
|
-
static addTrailingSlash(url) {
|
|
28083
|
-
return url.endsWith('/') ? url : url + '/';
|
|
28084
|
-
}
|
|
28085
|
-
static addStartingSlash(url) {
|
|
28086
|
-
return url.startsWith('/') ? url : '/' + url;
|
|
28087
|
-
}
|
|
28088
|
-
static removeStartingSlash(url) {
|
|
28089
|
-
return url.startsWith('/') ? url.substring(1) : url;
|
|
28090
|
-
}
|
|
28091
|
-
static concat(basePath, relativePath) {
|
|
28092
|
-
if (!basePath)
|
|
28093
|
-
return relativePath;
|
|
28094
|
-
if (!relativePath)
|
|
28095
|
-
return basePath;
|
|
28096
|
-
return this.addTrailingSlash(basePath) + this.removeStartingSlash(relativePath);
|
|
28097
|
-
}
|
|
28098
|
-
}
|
|
28099
|
-
|
|
28100
28123
|
/**
|
|
28101
28124
|
* Define here theme colors
|
|
28102
28125
|
*/
|