@scania-nl/tegel-angular-extensions 0.0.4 → 0.0.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/README.md +390 -33
- package/docker/docker-entrypoint.sh +13 -0
- package/docker/extract-env-vars.sh +114 -0
- package/docker/nginx.conf +69 -0
- package/esm2022/index.mjs +24 -5
- package/esm2022/lib/components/tae-footer/tae-footer.component.mjs +48 -0
- package/esm2022/lib/directives/hard-refresh.directive.mjs +83 -0
- package/esm2022/lib/env/angular/provide-runtime-config.mjs +161 -0
- package/esm2022/lib/env/angular/provide-static-config.mjs +44 -0
- package/esm2022/lib/env/core/create-env-kit.mjs +81 -0
- package/esm2022/lib/env/core/env-types.mjs +2 -0
- package/esm2022/lib/env/core/parse-env-file.mjs +140 -0
- package/esm2022/lib/toast/toast.component.mjs +5 -5
- package/esm2022/lib/toast/toast.service.mjs +3 -3
- package/index.d.ts +547 -4
- package/package.json +18 -6
- package/lib/toast/models/toast-state.enum.d.ts +0 -17
- package/lib/toast/models/toast-type.d.ts +0 -8
- package/lib/toast/models/toast.model.d.ts +0 -73
- package/lib/toast/provide-toast.d.ts +0 -3
- package/lib/toast/toast.component.d.ts +0 -24
- package/lib/toast/toast.config.d.ts +0 -35
- package/lib/toast/toast.service.d.ts +0 -98
- package/lib/utils/bootstrap-global-component.d.ts +0 -23
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
worker_processes auto;
|
|
2
|
+
|
|
3
|
+
pid /tmp/nginx.pid;
|
|
4
|
+
|
|
5
|
+
events {
|
|
6
|
+
worker_connections 1024;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
http {
|
|
10
|
+
include /etc/nginx/mime.types;
|
|
11
|
+
default_type application/octet-stream;
|
|
12
|
+
|
|
13
|
+
# Logging
|
|
14
|
+
access_log off;
|
|
15
|
+
error_log /dev/stderr warn;
|
|
16
|
+
|
|
17
|
+
# Performance
|
|
18
|
+
sendfile on;
|
|
19
|
+
tcp_nopush on;
|
|
20
|
+
tcp_nodelay on;
|
|
21
|
+
keepalive_timeout 65;
|
|
22
|
+
keepalive_requests 1000;
|
|
23
|
+
|
|
24
|
+
# Compression
|
|
25
|
+
gzip on;
|
|
26
|
+
gzip_vary on;
|
|
27
|
+
gzip_proxied any;
|
|
28
|
+
gzip_min_length 256;
|
|
29
|
+
gzip_comp_level 6;
|
|
30
|
+
gzip_types
|
|
31
|
+
text/plain
|
|
32
|
+
text/css
|
|
33
|
+
text/xml
|
|
34
|
+
text/javascript
|
|
35
|
+
application/javascript
|
|
36
|
+
application/x-javascript
|
|
37
|
+
application/json
|
|
38
|
+
application/xml
|
|
39
|
+
application/xml+rss
|
|
40
|
+
font/ttf
|
|
41
|
+
font/otf
|
|
42
|
+
image/svg+xml;
|
|
43
|
+
|
|
44
|
+
server {
|
|
45
|
+
# listen 8080;
|
|
46
|
+
server_name localhost;
|
|
47
|
+
|
|
48
|
+
root /usr/share/nginx/html;
|
|
49
|
+
index index.html;
|
|
50
|
+
|
|
51
|
+
# Angular Routing
|
|
52
|
+
location / {
|
|
53
|
+
try_files $uri $uri/ /index.html;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
# Static Assets Caching
|
|
57
|
+
location ~* \.(?:ico|css|js|gif|jpe?g|png|woff2?|eot|ttf|svg|map)$ {
|
|
58
|
+
expires 1y;
|
|
59
|
+
access_log off;
|
|
60
|
+
add_header Cache-Control "public, immutable";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
# Optional: Explicit asset route
|
|
64
|
+
location /assets/ {
|
|
65
|
+
expires 1y;
|
|
66
|
+
add_header Cache-Control "public, immutable";
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
package/esm2022/index.mjs
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
|
|
1
|
+
// --------------------------------------------------
|
|
2
|
+
// Toast Module Exports
|
|
3
|
+
// --------------------------------------------------
|
|
4
|
+
export { provideToast } from './lib/toast/provide-toast';
|
|
5
|
+
export { DEFAULT_TOAST_CONFIG, TOAST_CONFIG, } from './lib/toast/toast.config';
|
|
6
|
+
export { ToastService } from './lib/toast/toast.service';
|
|
7
|
+
// --------------------------------------------------
|
|
8
|
+
// Env Module Exports
|
|
9
|
+
// --------------------------------------------------
|
|
10
|
+
// Core
|
|
11
|
+
export { createEnvKit } from './lib/env/core/create-env-kit';
|
|
12
|
+
export { parseEnvFile } from './lib/env/core/parse-env-file';
|
|
13
|
+
// Angular
|
|
14
|
+
export { provideRuntimeConfig } from './lib/env/angular/provide-runtime-config';
|
|
15
|
+
export { provideStaticConfig } from './lib/env/angular/provide-static-config';
|
|
16
|
+
// --------------------------------------------------
|
|
17
|
+
// Directive Module Exports
|
|
18
|
+
// --------------------------------------------------
|
|
19
|
+
export { HardRefreshDirective } from './lib/directives/hard-refresh.directive';
|
|
20
|
+
// --------------------------------------------------
|
|
21
|
+
// Component Module Exports
|
|
22
|
+
// --------------------------------------------------
|
|
23
|
+
export { TaeFooterComponent } from './lib/components/tae-footer/tae-footer.component';
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscURBQXFEO0FBQ3JELHVCQUF1QjtBQUN2QixxREFBcUQ7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsWUFBWSxHQUViLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBS3pELHFEQUFxRDtBQUNyRCxxQkFBcUI7QUFDckIscURBQXFEO0FBQ3JELE9BQU87QUFDUCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTdELFVBQVU7QUFDVixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUU5RSxxREFBcUQ7QUFDckQsMkJBQTJCO0FBQzNCLHFEQUFxRDtBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUUvRSxxREFBcUQ7QUFDckQsMkJBQTJCO0FBQzNCLHFEQUFxRDtBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUb2FzdCBNb2R1bGUgRXhwb3J0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4cG9ydCB7IHByb3ZpZGVUb2FzdCB9IGZyb20gJy4vbGliL3RvYXN0L3Byb3ZpZGUtdG9hc3QnO1xuZXhwb3J0IHtcbiAgREVGQVVMVF9UT0FTVF9DT05GSUcsXG4gIFRPQVNUX0NPTkZJRyxcbiAgVG9hc3RDb25maWcsXG59IGZyb20gJy4vbGliL3RvYXN0L3RvYXN0LmNvbmZpZyc7XG5leHBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuL2xpYi90b2FzdC90b2FzdC5zZXJ2aWNlJztcblxuLy8gTW9kZWxzXG5leHBvcnQgeyBUb2FzdCwgVG9hc3RPcHRpb25zIH0gZnJvbSAnLi9saWIvdG9hc3QvbW9kZWxzL3RvYXN0Lm1vZGVsJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVudiBNb2R1bGUgRXhwb3J0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvcmVcbmV4cG9ydCB7IGNyZWF0ZUVudktpdCB9IGZyb20gJy4vbGliL2Vudi9jb3JlL2NyZWF0ZS1lbnYta2l0JztcbmV4cG9ydCB7IHBhcnNlRW52RmlsZSB9IGZyb20gJy4vbGliL2Vudi9jb3JlL3BhcnNlLWVudi1maWxlJztcblxuLy8gQW5ndWxhclxuZXhwb3J0IHsgcHJvdmlkZVJ1bnRpbWVDb25maWcgfSBmcm9tICcuL2xpYi9lbnYvYW5ndWxhci9wcm92aWRlLXJ1bnRpbWUtY29uZmlnJztcbmV4cG9ydCB7IHByb3ZpZGVTdGF0aWNDb25maWcgfSBmcm9tICcuL2xpYi9lbnYvYW5ndWxhci9wcm92aWRlLXN0YXRpYy1jb25maWcnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGlyZWN0aXZlIE1vZHVsZSBFeHBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IHsgSGFyZFJlZnJlc2hEaXJlY3RpdmUgfSBmcm9tICcuL2xpYi9kaXJlY3RpdmVzL2hhcmQtcmVmcmVzaC5kaXJlY3RpdmUnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29tcG9uZW50IE1vZHVsZSBFeHBvcnRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IHsgVGFlRm9vdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9saWIvY29tcG9uZW50cy90YWUtZm9vdGVyL3RhZS1mb290ZXIuY29tcG9uZW50JztcbiJdfQ==
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, input } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
/**
|
|
6
|
+
* An enhanced standalone footer component based on the Tegel `TdsFooterComponent`.
|
|
7
|
+
*
|
|
8
|
+
* `TaeFooterComponent` maintains the same visual style as the original
|
|
9
|
+
* Tegel footer, but adds two key improvements:
|
|
10
|
+
*
|
|
11
|
+
* - A **compact “small” variant** for layouts where vertical space is limited.
|
|
12
|
+
* - Optional **version display**, allowing applications to show their
|
|
13
|
+
* build or release version directly in the footer.
|
|
14
|
+
*
|
|
15
|
+
* Example:
|
|
16
|
+
* ```html
|
|
17
|
+
* <tae-footer variant="small" version="v1.0.0" />
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export class TaeFooterComponent {
|
|
21
|
+
/**
|
|
22
|
+
* Determines the visual layout of the footer.
|
|
23
|
+
*
|
|
24
|
+
* - `"normal"` displays the standard footer layout (aligned to tds-footer)
|
|
25
|
+
* - `"small"` produces a more compact version suitable for tight layouts
|
|
26
|
+
*
|
|
27
|
+
* @default 'normal'
|
|
28
|
+
*/
|
|
29
|
+
variant = input('normal');
|
|
30
|
+
/**
|
|
31
|
+
* Optional application version string to display in the footer.
|
|
32
|
+
*
|
|
33
|
+
* When provided, it appears left of the Scania logo.
|
|
34
|
+
* If omitted or `undefined`, the version section is not shown.
|
|
35
|
+
*/
|
|
36
|
+
version = input();
|
|
37
|
+
/**
|
|
38
|
+
* The current year used in the copyright section.
|
|
39
|
+
*/
|
|
40
|
+
currentYear = new Date().getFullYear();
|
|
41
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: TaeFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
42
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: TaeFooterComponent, isStandalone: true, selector: "tae-footer", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, version: { classPropertyName: "version", publicName: "version", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@let versionValue = version();\n<footer>\n <div class=\"footer-main\" [ngClass]=\"'footer-' + variant()\">\n <div class=\"footer-main-bottom\">\n <small class=\"copyright\">Copyright © {{ currentYear }} Scania</small>\n @if (versionValue) {\n <small class=\"version\">Version: {{ versionValue }}</small>\n }\n <div class=\"brand\"></div>\n </div>\n </div>\n</footer>\n", styles: [":host{display:grid}.footer-main{background-color:var(--tds-footer-main-background);padding:0 40px}.footer-main .footer-main-bottom{padding:40px 0;display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--tds-footer-main-divider)}.footer-main .footer-main-bottom .copyright,.footer-main .footer-main-bottom .version{margin:0;font:var(--tds-detail-02);letter-spacing:var(--tds-detail-02-ls);color:var(--tds-footer-main-copyright)}.footer-main .footer-main-bottom .version{font-size:smaller;margin-left:auto;margin-right:40px}.footer-main .footer-main-bottom .brand{background-image:var(--tds-background-image-scania-wordmark-white-svg);background-repeat:no-repeat;background-size:117px;background-position:right center;width:117px;height:20px}.footer-main.footer-small .footer-main-bottom{padding:20px 0}.footer-main.footer-small .footer-main-bottom .copyright{font:var(--tds-detail-05);letter-spacing:var(--tds-detail-05-ls)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
43
|
+
}
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: TaeFooterComponent, decorators: [{
|
|
45
|
+
type: Component,
|
|
46
|
+
args: [{ selector: 'tae-footer', imports: [CommonModule], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "@let versionValue = version();\n<footer>\n <div class=\"footer-main\" [ngClass]=\"'footer-' + variant()\">\n <div class=\"footer-main-bottom\">\n <small class=\"copyright\">Copyright © {{ currentYear }} Scania</small>\n @if (versionValue) {\n <small class=\"version\">Version: {{ versionValue }}</small>\n }\n <div class=\"brand\"></div>\n </div>\n </div>\n</footer>\n", styles: [":host{display:grid}.footer-main{background-color:var(--tds-footer-main-background);padding:0 40px}.footer-main .footer-main-bottom{padding:40px 0;display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--tds-footer-main-divider)}.footer-main .footer-main-bottom .copyright,.footer-main .footer-main-bottom .version{margin:0;font:var(--tds-detail-02);letter-spacing:var(--tds-detail-02-ls);color:var(--tds-footer-main-copyright)}.footer-main .footer-main-bottom .version{font-size:smaller;margin-left:auto;margin-right:40px}.footer-main .footer-main-bottom .brand{background-image:var(--tds-background-image-scania-wordmark-white-svg);background-repeat:no-repeat;background-size:117px;background-position:right center;width:117px;height:20px}.footer-main.footer-small .footer-main-bottom{padding:20px 0}.footer-main.footer-small .footer-main-bottom .copyright{font:var(--tds-detail-05);letter-spacing:var(--tds-detail-05-ls)}\n"] }]
|
|
47
|
+
}] });
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFlLWZvb3Rlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL2NvbXBvbmVudHMvdGFlLWZvb3Rlci90YWUtZm9vdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvY29tcG9uZW50cy90YWUtZm9vdGVyL3RhZS1mb290ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFFMUU7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFTSCxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCOzs7Ozs7O09BT0c7SUFFTSxPQUFPLEdBQUcsS0FBSyxDQUFxQixRQUFRLENBQUMsQ0FBQztJQUN2RDs7Ozs7T0FLRztJQUNNLE9BQU8sR0FBRyxLQUFLLEVBQXNCLENBQUM7SUFFL0M7O09BRUc7SUFDTSxXQUFXLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3R0F0QnJDLGtCQUFrQjs0RkFBbEIsa0JBQWtCLDhVQzFCL0IsMFpBWUEscy9CRFFZLFlBQVk7OzRGQU1YLGtCQUFrQjtrQkFSOUIsU0FBUzsrQkFDRSxZQUFZLFdBQ2IsQ0FBQyxZQUFZLENBQUMsY0FDWCxJQUFJLG1CQUdDLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBBbiBlbmhhbmNlZCBzdGFuZGFsb25lIGZvb3RlciBjb21wb25lbnQgYmFzZWQgb24gdGhlIFRlZ2VsIGBUZHNGb290ZXJDb21wb25lbnRgLlxuICpcbiAqIGBUYWVGb290ZXJDb21wb25lbnRgIG1haW50YWlucyB0aGUgc2FtZSB2aXN1YWwgc3R5bGUgYXMgdGhlIG9yaWdpbmFsXG4gKiBUZWdlbCBmb290ZXIsIGJ1dCBhZGRzIHR3byBrZXkgaW1wcm92ZW1lbnRzOlxuICpcbiAqIC0gQSAqKmNvbXBhY3Qg4oCcc21hbGzigJ0gdmFyaWFudCoqIGZvciBsYXlvdXRzIHdoZXJlIHZlcnRpY2FsIHNwYWNlIGlzIGxpbWl0ZWQuXG4gKiAtIE9wdGlvbmFsICoqdmVyc2lvbiBkaXNwbGF5KiosIGFsbG93aW5nIGFwcGxpY2F0aW9ucyB0byBzaG93IHRoZWlyXG4gKiAgIGJ1aWxkIG9yIHJlbGVhc2UgdmVyc2lvbiBkaXJlY3RseSBpbiB0aGUgZm9vdGVyLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBodG1sXG4gKiA8dGFlLWZvb3RlciB2YXJpYW50PVwic21hbGxcIiB2ZXJzaW9uPVwidjEuMC4wXCIgLz5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YWUtZm9vdGVyJyxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWUtZm9vdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFlLWZvb3Rlci5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFlRm9vdGVyQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIHZpc3VhbCBsYXlvdXQgb2YgdGhlIGZvb3Rlci5cbiAgICpcbiAgICogLSBgXCJub3JtYWxcImAgZGlzcGxheXMgdGhlIHN0YW5kYXJkIGZvb3RlciBsYXlvdXQgKGFsaWduZWQgdG8gdGRzLWZvb3RlcilcbiAgICogLSBgXCJzbWFsbFwiYCBwcm9kdWNlcyBhIG1vcmUgY29tcGFjdCB2ZXJzaW9uIHN1aXRhYmxlIGZvciB0aWdodCBsYXlvdXRzXG4gICAqXG4gICAqIEBkZWZhdWx0ICdub3JtYWwnXG4gICAqL1xuXG4gIHJlYWRvbmx5IHZhcmlhbnQgPSBpbnB1dDwnbm9ybWFsJyB8ICdzbWFsbCc+KCdub3JtYWwnKTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGFwcGxpY2F0aW9uIHZlcnNpb24gc3RyaW5nIHRvIGRpc3BsYXkgaW4gdGhlIGZvb3Rlci5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCwgaXQgYXBwZWFycyBsZWZ0IG9mIHRoZSBTY2FuaWEgbG9nby5cbiAgICogSWYgb21pdHRlZCBvciBgdW5kZWZpbmVkYCwgdGhlIHZlcnNpb24gc2VjdGlvbiBpcyBub3Qgc2hvd24uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCB5ZWFyIHVzZWQgaW4gdGhlIGNvcHlyaWdodCBzZWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG59XG4iLCJAbGV0IHZlcnNpb25WYWx1ZSA9IHZlcnNpb24oKTtcbjxmb290ZXI+XG4gIDxkaXYgY2xhc3M9XCJmb290ZXItbWFpblwiIFtuZ0NsYXNzXT1cIidmb290ZXItJyArIHZhcmlhbnQoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJmb290ZXItbWFpbi1ib3R0b21cIj5cbiAgICAgIDxzbWFsbCBjbGFzcz1cImNvcHlyaWdodFwiPkNvcHlyaWdodCAmY29weTsge3sgY3VycmVudFllYXIgfX0gU2NhbmlhPC9zbWFsbD5cbiAgICAgIEBpZiAodmVyc2lvblZhbHVlKSB7XG4gICAgICAgIDxzbWFsbCBjbGFzcz1cInZlcnNpb25cIj5WZXJzaW9uOiB7eyB2ZXJzaW9uVmFsdWUgfX08L3NtYWxsPlxuICAgICAgfVxuICAgICAgPGRpdiBjbGFzcz1cImJyYW5kXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9mb290ZXI+XG4iXX0=
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { Directive, input } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { filter, map, pairwise, scan, startWith, Subject, throttleTime, timestamp, } from 'rxjs';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Directive that triggers a hard page refresh when the host element is clicked
|
|
7
|
+
* a specified number of times within a configurable time window.
|
|
8
|
+
*
|
|
9
|
+
* This is useful for adding developer-oriented shortcuts, diagnostics entry points,
|
|
10
|
+
* hidden "triple-click to reload" behaviors, or fallback mechanisms in production.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* ```html
|
|
14
|
+
* <div taeHardRefresh [clicksRequired]="3" [clickWindowMs]="500">...</div>
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export class HardRefreshDirective {
|
|
18
|
+
/**
|
|
19
|
+
* The number of rapid consecutive clicks required to trigger a hard refresh.
|
|
20
|
+
* A "rapid" click is one that occurs within `clickWindowMs` of the previous click.
|
|
21
|
+
*
|
|
22
|
+
* @default 3
|
|
23
|
+
*/
|
|
24
|
+
clicksRequired = input(3);
|
|
25
|
+
/**
|
|
26
|
+
* The maximum time interval (in milliseconds) allowed between consecutive clicks
|
|
27
|
+
* for them to be considered part of the same "streak".
|
|
28
|
+
*
|
|
29
|
+
* If the interval between two clicks exceeds this value, the streak resets.
|
|
30
|
+
*
|
|
31
|
+
* @default 500
|
|
32
|
+
*/
|
|
33
|
+
clickWindowMs = input(500);
|
|
34
|
+
/**
|
|
35
|
+
* Internal click event stream used to build the rapid-click detection pipeline.
|
|
36
|
+
* Emits one value per host click (via the `(click)` host listener).
|
|
37
|
+
*/
|
|
38
|
+
clicks$ = new Subject();
|
|
39
|
+
constructor() {
|
|
40
|
+
/**
|
|
41
|
+
* Rapid-click detection pipeline:
|
|
42
|
+
*
|
|
43
|
+
* - Timestamps each click.
|
|
44
|
+
* - Compares consecutive timestamps to determine whether they fall within the
|
|
45
|
+
* configured `clickWindowMs` threshold.
|
|
46
|
+
* - Maintains a streak count using a reducer (`scan`).
|
|
47
|
+
* - Emits once the streak count reaches or exceeds `clicksRequired`.
|
|
48
|
+
* - Uses `throttleTime` to prevent duplicate triggers within the same burst.
|
|
49
|
+
*/
|
|
50
|
+
this.clicks$
|
|
51
|
+
.pipe(takeUntilDestroyed(),
|
|
52
|
+
// Turn click events into raw timestamps (epoch ms)
|
|
53
|
+
timestamp(), map((t) => t.timestamp),
|
|
54
|
+
// Work in pairs: [previousTimestamp, currentTimestamp]
|
|
55
|
+
startWith(0), pairwise(),
|
|
56
|
+
// Maintain a streak of clicks within the time window
|
|
57
|
+
scan((acc, [prev, curr]) => curr - prev <= this.clickWindowMs() ? acc + 1 : 1, 0),
|
|
58
|
+
// Only continue when we reach the threshold number of clicks
|
|
59
|
+
filter((streak) => streak >= this.clicksRequired()),
|
|
60
|
+
// Avoid multiple triggers for the same "burst" of clicks
|
|
61
|
+
throttleTime(this.clickWindowMs(), undefined, {
|
|
62
|
+
leading: true,
|
|
63
|
+
trailing: false,
|
|
64
|
+
}))
|
|
65
|
+
.subscribe(() => {
|
|
66
|
+
// Reload the window
|
|
67
|
+
window.location.reload();
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: HardRefreshDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
71
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.2.17", type: HardRefreshDirective, isStandalone: true, selector: "[taeHardRefresh]", inputs: { clicksRequired: { classPropertyName: "clicksRequired", publicName: "clicksRequired", isSignal: true, isRequired: false, transformFunction: null }, clickWindowMs: { classPropertyName: "clickWindowMs", publicName: "clickWindowMs", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "clicks$.next()" } }, ngImport: i0 });
|
|
72
|
+
}
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: HardRefreshDirective, decorators: [{
|
|
74
|
+
type: Directive,
|
|
75
|
+
args: [{
|
|
76
|
+
selector: '[taeHardRefresh]',
|
|
77
|
+
standalone: true,
|
|
78
|
+
host: {
|
|
79
|
+
'(click)': 'clicks$.next()',
|
|
80
|
+
},
|
|
81
|
+
}]
|
|
82
|
+
}], ctorParameters: () => [] });
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFyZC1yZWZyZXNoLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvZGlyZWN0aXZlcy9oYXJkLXJlZnJlc2guZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFDTCxNQUFNLEVBQ04sR0FBRyxFQUNILFFBQVEsRUFDUixJQUFJLEVBQ0osU0FBUyxFQUNULE9BQU8sRUFDUCxZQUFZLEVBQ1osU0FBUyxHQUNWLE1BQU0sTUFBTSxDQUFDOztBQUVkOzs7Ozs7Ozs7OztHQVdHO0FBUUgsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQjs7Ozs7T0FLRztJQUNNLGNBQWMsR0FBRyxLQUFLLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFFM0M7Ozs7Ozs7T0FPRztJQUNNLGFBQWEsR0FBRyxLQUFLLENBQVMsR0FBRyxDQUFDLENBQUM7SUFFNUM7OztPQUdHO0lBQ2dCLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRWpEO1FBQ0U7Ozs7Ozs7OztXQVNHO1FBQ0gsSUFBSSxDQUFDLE9BQU87YUFDVCxJQUFJLENBQ0gsa0JBQWtCLEVBQUU7UUFDcEIsbURBQW1EO1FBQ25ELFNBQVMsRUFBRSxFQUNYLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN2Qix1REFBdUQ7UUFDdkQsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUNaLFFBQVEsRUFBRTtRQUNWLHFEQUFxRDtRQUNyRCxJQUFJLENBQ0YsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUNwQixJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNuRCxDQUFDLENBQ0Y7UUFDRCw2REFBNkQ7UUFDN0QsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25ELHlEQUF5RDtRQUN6RCxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLFNBQVMsRUFBRTtZQUM1QyxPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FDSDthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxvQkFBb0I7WUFDcEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7d0dBL0RVLG9CQUFvQjs0RkFBcEIsb0JBQW9COzs0RkFBcEIsb0JBQW9CO2tCQVBoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixJQUFJLEVBQUU7d0JBQ0osU0FBUyxFQUFFLGdCQUFnQjtxQkFDNUI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICBmaWx0ZXIsXG4gIG1hcCxcbiAgcGFpcndpc2UsXG4gIHNjYW4sXG4gIHN0YXJ0V2l0aCxcbiAgU3ViamVjdCxcbiAgdGhyb3R0bGVUaW1lLFxuICB0aW1lc3RhbXAsXG59IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIERpcmVjdGl2ZSB0aGF0IHRyaWdnZXJzIGEgaGFyZCBwYWdlIHJlZnJlc2ggd2hlbiB0aGUgaG9zdCBlbGVtZW50IGlzIGNsaWNrZWRcbiAqIGEgc3BlY2lmaWVkIG51bWJlciBvZiB0aW1lcyB3aXRoaW4gYSBjb25maWd1cmFibGUgdGltZSB3aW5kb3cuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIGFkZGluZyBkZXZlbG9wZXItb3JpZW50ZWQgc2hvcnRjdXRzLCBkaWFnbm9zdGljcyBlbnRyeSBwb2ludHMsXG4gKiBoaWRkZW4gXCJ0cmlwbGUtY2xpY2sgdG8gcmVsb2FkXCIgYmVoYXZpb3JzLCBvciBmYWxsYmFjayBtZWNoYW5pc21zIGluIHByb2R1Y3Rpb24uXG4gKlxuICogVXNhZ2U6XG4gKiBgYGBodG1sXG4gKiA8ZGl2IHRhZUhhcmRSZWZyZXNoIFtjbGlja3NSZXF1aXJlZF09XCIzXCIgW2NsaWNrV2luZG93TXNdPVwiNTAwXCI+Li4uPC9kaXY+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3RhZUhhcmRSZWZyZXNoXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGhvc3Q6IHtcbiAgICAnKGNsaWNrKSc6ICdjbGlja3MkLm5leHQoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEhhcmRSZWZyZXNoRGlyZWN0aXZlIHtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcmFwaWQgY29uc2VjdXRpdmUgY2xpY2tzIHJlcXVpcmVkIHRvIHRyaWdnZXIgYSBoYXJkIHJlZnJlc2guXG4gICAqIEEgXCJyYXBpZFwiIGNsaWNrIGlzIG9uZSB0aGF0IG9jY3VycyB3aXRoaW4gYGNsaWNrV2luZG93TXNgIG9mIHRoZSBwcmV2aW91cyBjbGljay5cbiAgICpcbiAgICogQGRlZmF1bHQgM1xuICAgKi9cbiAgcmVhZG9ubHkgY2xpY2tzUmVxdWlyZWQgPSBpbnB1dDxudW1iZXI+KDMpO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIGludGVydmFsIChpbiBtaWxsaXNlY29uZHMpIGFsbG93ZWQgYmV0d2VlbiBjb25zZWN1dGl2ZSBjbGlja3NcbiAgICogZm9yIHRoZW0gdG8gYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBzYW1lIFwic3RyZWFrXCIuXG4gICAqXG4gICAqIElmIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIHR3byBjbGlja3MgZXhjZWVkcyB0aGlzIHZhbHVlLCB0aGUgc3RyZWFrIHJlc2V0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgNTAwXG4gICAqL1xuICByZWFkb25seSBjbGlja1dpbmRvd01zID0gaW5wdXQ8bnVtYmVyPig1MDApO1xuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBjbGljayBldmVudCBzdHJlYW0gdXNlZCB0byBidWlsZCB0aGUgcmFwaWQtY2xpY2sgZGV0ZWN0aW9uIHBpcGVsaW5lLlxuICAgKiBFbWl0cyBvbmUgdmFsdWUgcGVyIGhvc3QgY2xpY2sgKHZpYSB0aGUgYChjbGljaylgIGhvc3QgbGlzdGVuZXIpLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsaWNrcyQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKlxuICAgICAqIFJhcGlkLWNsaWNrIGRldGVjdGlvbiBwaXBlbGluZTpcbiAgICAgKlxuICAgICAqIC0gVGltZXN0YW1wcyBlYWNoIGNsaWNrLlxuICAgICAqIC0gQ29tcGFyZXMgY29uc2VjdXRpdmUgdGltZXN0YW1wcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGV5IGZhbGwgd2l0aGluIHRoZVxuICAgICAqICAgY29uZmlndXJlZCBgY2xpY2tXaW5kb3dNc2AgdGhyZXNob2xkLlxuICAgICAqIC0gTWFpbnRhaW5zIGEgc3RyZWFrIGNvdW50IHVzaW5nIGEgcmVkdWNlciAoYHNjYW5gKS5cbiAgICAgKiAtIEVtaXRzIG9uY2UgdGhlIHN0cmVhayBjb3VudCByZWFjaGVzIG9yIGV4Y2VlZHMgYGNsaWNrc1JlcXVpcmVkYC5cbiAgICAgKiAtIFVzZXMgYHRocm90dGxlVGltZWAgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJpZ2dlcnMgd2l0aGluIHRoZSBzYW1lIGJ1cnN0LlxuICAgICAqL1xuICAgIHRoaXMuY2xpY2tzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICAvLyBUdXJuIGNsaWNrIGV2ZW50cyBpbnRvIHJhdyB0aW1lc3RhbXBzIChlcG9jaCBtcylcbiAgICAgICAgdGltZXN0YW1wKCksXG4gICAgICAgIG1hcCgodCkgPT4gdC50aW1lc3RhbXApLFxuICAgICAgICAvLyBXb3JrIGluIHBhaXJzOiBbcHJldmlvdXNUaW1lc3RhbXAsIGN1cnJlbnRUaW1lc3RhbXBdXG4gICAgICAgIHN0YXJ0V2l0aCgwKSxcbiAgICAgICAgcGFpcndpc2UoKSxcbiAgICAgICAgLy8gTWFpbnRhaW4gYSBzdHJlYWsgb2YgY2xpY2tzIHdpdGhpbiB0aGUgdGltZSB3aW5kb3dcbiAgICAgICAgc2NhbihcbiAgICAgICAgICAoYWNjLCBbcHJldiwgY3Vycl0pID0+XG4gICAgICAgICAgICBjdXJyIC0gcHJldiA8PSB0aGlzLmNsaWNrV2luZG93TXMoKSA/IGFjYyArIDEgOiAxLFxuICAgICAgICAgIDBcbiAgICAgICAgKSxcbiAgICAgICAgLy8gT25seSBjb250aW51ZSB3aGVuIHdlIHJlYWNoIHRoZSB0aHJlc2hvbGQgbnVtYmVyIG9mIGNsaWNrc1xuICAgICAgICBmaWx0ZXIoKHN0cmVhaykgPT4gc3RyZWFrID49IHRoaXMuY2xpY2tzUmVxdWlyZWQoKSksXG4gICAgICAgIC8vIEF2b2lkIG11bHRpcGxlIHRyaWdnZXJzIGZvciB0aGUgc2FtZSBcImJ1cnN0XCIgb2YgY2xpY2tzXG4gICAgICAgIHRocm90dGxlVGltZSh0aGlzLmNsaWNrV2luZG93TXMoKSwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgbGVhZGluZzogdHJ1ZSxcbiAgICAgICAgICB0cmFpbGluZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gUmVsb2FkIHRoZSB3aW5kb3dcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { inject, Injectable, InjectionToken, makeEnvironmentProviders, provideAppInitializer, } from '@angular/core';
|
|
2
|
+
import { catchError, defer, firstValueFrom, from, map, of, switchMap, tap, } from 'rxjs';
|
|
3
|
+
import { parseEnvFile } from '../core/parse-env-file';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Builds styled console arguments for RuntimeConfig logs.
|
|
7
|
+
*
|
|
8
|
+
* The returned tuple can be spread directly into `console.log`,
|
|
9
|
+
* allowing the browser to render a colored `[RuntimeConfig]` prefix
|
|
10
|
+
* while preserving the original caller location in DevTools.
|
|
11
|
+
*
|
|
12
|
+
* Example:
|
|
13
|
+
* ```ts
|
|
14
|
+
* console.log(...rcArgs('Runtime overrides loaded.'));
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @param msg - The message text to append after the colored prefix.
|
|
18
|
+
* @returns A tuple of arguments (`[format, style, reset]`) for `console.log`.
|
|
19
|
+
*/
|
|
20
|
+
const rcArgs = (msg) => [
|
|
21
|
+
'%c[RuntimeConfig]%c ' + msg,
|
|
22
|
+
'color:#0cf;',
|
|
23
|
+
'',
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Registers providers that:
|
|
27
|
+
* - Fetch a runtime `.env` file at startup,
|
|
28
|
+
* - Parse it to a deep-partial structure via the kit,
|
|
29
|
+
* - Enforce runtime-required keys when appropriate,
|
|
30
|
+
* - Merge with the static environment,
|
|
31
|
+
* - Validate the **final** configuration against the Zod schema,
|
|
32
|
+
* - Expose the resulting config via a generated `InjectionToken`.
|
|
33
|
+
*
|
|
34
|
+
* @typeParam S - Zod schema type describing the full config shape.
|
|
35
|
+
* @typeParam K - List of runtime-required top-level keys.
|
|
36
|
+
*
|
|
37
|
+
* @param kit
|
|
38
|
+
* The `EnvKit` created by `createEnvKit(schema, runtimeRequiredKeys)`.
|
|
39
|
+
*
|
|
40
|
+
* @param options
|
|
41
|
+
* Runtime loading behavior and DI token description. See {@link ProvideRuntimeConfigOptions}.
|
|
42
|
+
*
|
|
43
|
+
* @returns The `EnvironmentProviders` to be added to `appConfig.providers`,
|
|
44
|
+
*
|
|
45
|
+
* @remarks
|
|
46
|
+
* - This uses an Angular **functional app initializer** to perform the load step.
|
|
47
|
+
* - If the server returns an HTML SPA fallback (instead of the `.env` file), the provider
|
|
48
|
+
* quietly uses the static environment (no runtime overrides).
|
|
49
|
+
*/
|
|
50
|
+
export function provideRuntimeConfig(kit, staticEnv, { envPath = '/env/runtime.env', debug = false, stopOnError = true, token, } = {}) {
|
|
51
|
+
// Typed token used to expose the final validated config via DI.
|
|
52
|
+
const configToken = token ?? new InjectionToken('ENV_CONFIG');
|
|
53
|
+
/**
|
|
54
|
+
* Angular service that handles fetching, parsing, validating, and caching
|
|
55
|
+
* of the runtime environment configuration.
|
|
56
|
+
*/
|
|
57
|
+
class RuntimeConfigService {
|
|
58
|
+
// Cached instance of the validated configuration.
|
|
59
|
+
config;
|
|
60
|
+
/**
|
|
61
|
+
* Loads, parses, merges and validates the runtime configuration.
|
|
62
|
+
* Returns an `Observable<ConfigShape>` and caches the final result.
|
|
63
|
+
*/
|
|
64
|
+
load() {
|
|
65
|
+
return defer(() => from(fetch(envPath).then((res) => {
|
|
66
|
+
// Handle HTTP errors explicitly so they go through catchError
|
|
67
|
+
if (!res.ok) {
|
|
68
|
+
throw new Error(`Failed to load runtime config: ${res.status} ${res.statusText}`);
|
|
69
|
+
}
|
|
70
|
+
return res.text();
|
|
71
|
+
})).pipe(
|
|
72
|
+
// 1. SPA fallback guard (server returned HTML instead of .env)
|
|
73
|
+
map((raw) => {
|
|
74
|
+
const trimmed = raw.trim();
|
|
75
|
+
const looksHtml = /^\s*<!doctype/i.test(trimmed) || /^\s*<html[\s>]/i.test(trimmed);
|
|
76
|
+
if (looksHtml) {
|
|
77
|
+
if (debug) {
|
|
78
|
+
console.log(...rcArgs('No runtime environment file detected, using static environment only.'));
|
|
79
|
+
}
|
|
80
|
+
// Signal “no runtime.env, use static only”
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
return raw;
|
|
84
|
+
}), tap((v) => {
|
|
85
|
+
if (!debug)
|
|
86
|
+
return;
|
|
87
|
+
console.log(...rcArgs(v === null
|
|
88
|
+
? 'No runtime environment file defined, using static environment'
|
|
89
|
+
: 'Runtime environment file loaded, applying overrides.'));
|
|
90
|
+
}),
|
|
91
|
+
// 2. Either continue the pipe or return defaults
|
|
92
|
+
switchMap((raw) => {
|
|
93
|
+
if (raw === null) {
|
|
94
|
+
return from(kit.mergeAndValidateAsync(staticEnv)).pipe(tap((cfg) => (this.config = cfg)));
|
|
95
|
+
}
|
|
96
|
+
// 3. Parse raw `.env` text -> object, then deep-partial-parse via kit
|
|
97
|
+
const runtimeConfigRaw = parseEnvFile(raw);
|
|
98
|
+
return from(kit.parseRuntimeOverridesAsync(runtimeConfigRaw)).pipe(tap((overrides) => {
|
|
99
|
+
if (debug)
|
|
100
|
+
console.log(...rcArgs('Runtime config (parsed):'), overrides);
|
|
101
|
+
}),
|
|
102
|
+
// 4. Merge static + overrides and validate the final config (async)
|
|
103
|
+
switchMap((overrides) => from(kit.mergeAndValidateAsync(staticEnv, overrides))),
|
|
104
|
+
// 5. Cache the validated config for synchronous access later
|
|
105
|
+
tap((mergedConfig) => {
|
|
106
|
+
if (debug)
|
|
107
|
+
console.log(...rcArgs('Merged config:'), mergedConfig);
|
|
108
|
+
this.config = mergedConfig;
|
|
109
|
+
}));
|
|
110
|
+
}),
|
|
111
|
+
// 6. Error handling: fail fast or gracefully fall back to static-only
|
|
112
|
+
catchError((err) => {
|
|
113
|
+
if (stopOnError) {
|
|
114
|
+
// Reject app initialization (recommended for production)
|
|
115
|
+
throw err;
|
|
116
|
+
}
|
|
117
|
+
console.error(...rcArgs('Error occurred while loading runtime config:'), err);
|
|
118
|
+
return of(this.useDefaults());
|
|
119
|
+
})));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Returns the current configuration.
|
|
123
|
+
* If not yet loaded, returns a validated static-only configuration.
|
|
124
|
+
*/
|
|
125
|
+
get() {
|
|
126
|
+
if (!this.config) {
|
|
127
|
+
throw new Error('RuntimeConfigService.get() called before configuration was loaded. ' +
|
|
128
|
+
'Ensure provideAppInitializer waits for RuntimeConfigService.load().');
|
|
129
|
+
}
|
|
130
|
+
return this.config;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Sets the current configuration to a validated static-only configuration
|
|
134
|
+
* Used when the runtime `.env` file is missing.
|
|
135
|
+
*/
|
|
136
|
+
useDefaults() {
|
|
137
|
+
// Note: this uses the static env; merge+validate is performed in `get()` if needed.
|
|
138
|
+
this.config ??= staticEnv;
|
|
139
|
+
return this.config;
|
|
140
|
+
}
|
|
141
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: RuntimeConfigService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
142
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: RuntimeConfigService, providedIn: 'root' });
|
|
143
|
+
}
|
|
144
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: RuntimeConfigService, decorators: [{
|
|
145
|
+
type: Injectable,
|
|
146
|
+
args: [{ providedIn: 'root' }]
|
|
147
|
+
}] });
|
|
148
|
+
// Register the service + initializer + token exposure with Angular DI.
|
|
149
|
+
return makeEnvironmentProviders([
|
|
150
|
+
RuntimeConfigService,
|
|
151
|
+
// Angular 19+ functional initializer (subscribes to the load Observable)
|
|
152
|
+
// Using firstValueFrom to enforece "await until loaded" semantics
|
|
153
|
+
provideAppInitializer(() => firstValueFrom(inject(RuntimeConfigService).load())),
|
|
154
|
+
// Expose the final validated config via the generated token
|
|
155
|
+
{
|
|
156
|
+
provide: configToken,
|
|
157
|
+
useFactory: () => inject(RuntimeConfigService).get(),
|
|
158
|
+
},
|
|
159
|
+
]);
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1ydW50aW1lLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvdGVnZWwtYW5ndWxhci1leHRlbnNpb25zL3NyYy9saWIvZW52L2FuZ3VsYXIvcHJvdmlkZS1ydW50aW1lLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLHFCQUFxQixHQUN0QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxjQUFjLEVBQ2QsSUFBSSxFQUNKLEdBQUcsRUFFSCxFQUFFLEVBQ0YsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUdkLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVcsRUFBa0MsRUFBRSxDQUFDO0lBQzlELHNCQUFzQixHQUFHLEdBQUc7SUFDNUIsYUFBYTtJQUNiLEVBQUU7Q0FDSCxDQUFDO0FBa0NGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBSWxDLEdBQWlCLEVBQ2pCLFNBQThCLEVBQzlCLEVBQ0UsT0FBTyxHQUFHLGtCQUFrQixFQUM1QixLQUFLLEdBQUcsS0FBSyxFQUNiLFdBQVcsR0FBRyxJQUFJLEVBQ2xCLEtBQUssTUFDNkIsRUFBRTtJQUt0QyxnRUFBZ0U7SUFDaEUsTUFBTSxXQUFXLEdBQUcsS0FBSyxJQUFJLElBQUksY0FBYyxDQUFZLFlBQVksQ0FBQyxDQUFDO0lBRXpFOzs7T0FHRztJQUNILE1BQ00sb0JBQW9CO1FBQ3hCLGtEQUFrRDtRQUMxQyxNQUFNLENBQWE7UUFFM0I7OztXQUdHO1FBQ0gsSUFBSTtZQUNGLE9BQU8s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LE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRTtTQUNyRDtLQUNGLENBQUMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIGluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgcHJvdmlkZUFwcEluaXRpYWxpemVyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlZmVyLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgZnJvbSxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHogZnJvbSAnem9kJztcbmltcG9ydCB7IEVudktpdCwgU2NoZW1hT3V0cHV0LCBTdGF0aWNFbnZGcm9tIH0gZnJvbSAnLi4vY29yZS9lbnYtdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VFbnZGaWxlIH0gZnJvbSAnLi4vY29yZS9wYXJzZS1lbnYtZmlsZSc7XG5cbi8qKlxuICogQnVpbGRzIHN0eWxlZCBjb25zb2xlIGFyZ3VtZW50cyBmb3IgUnVudGltZUNvbmZpZyBsb2dzLlxuICpcbiAqIFRoZSByZXR1cm5lZCB0dXBsZSBjYW4gYmUgc3ByZWFkIGRpcmVjdGx5IGludG8gYGNvbnNvbGUubG9nYCxcbiAqIGFsbG93aW5nIHRoZSBicm93c2VyIHRvIHJlbmRlciBhIGNvbG9yZWQgYFtSdW50aW1lQ29uZmlnXWAgcHJlZml4XG4gKiB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBjYWxsZXIgbG9jYXRpb24gaW4gRGV2VG9vbHMuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYHRzXG4gKiBjb25zb2xlLmxvZyguLi5yY0FyZ3MoJ1J1bnRpbWUgb3ZlcnJpZGVzIGxvYWRlZC4nKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdGV4dCB0byBhcHBlbmQgYWZ0ZXIgdGhlIGNvbG9yZWQgcHJlZml4LlxuICogQHJldHVybnMgQSB0dXBsZSBvZiBhcmd1bWVudHMgKGBbZm9ybWF0LCBzdHlsZSwgcmVzZXRdYCkgZm9yIGBjb25zb2xlLmxvZ2AuXG4gKi9cbmNvbnN0IHJjQXJncyA9IChtc2c6IHN0cmluZyk6IFBhcmFtZXRlcnM8dHlwZW9mIGNvbnNvbGUubG9nPiA9PiBbXG4gICclY1tSdW50aW1lQ29uZmlnXSVjICcgKyBtc2csXG4gICdjb2xvcjojMGNmOycsXG4gICcnLFxuXTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgQW5ndWxhciBydW50aW1lLWNvbmZpZyBwcm92aWRlci5cbiAqXG4gKiBAcHJvcGVydHkgZW52UGF0aFxuICogVGhlIFVSTCAob3IgcGF0aCkgdG8gdGhlIHJ1bnRpbWUgYC5lbnZgIGZpbGUgdGhhdCB3aWxsIGJlIGZldGNoZWQgYXQgYXBwIHN0YXJ0LlxuICogRGVmYXVsdHMgdG8gYFwiL2Vudi9ydW50aW1lLmVudlwiYC5cbiAqXG4gKiBAcHJvcGVydHkgZGVidWdcbiAqIEVuYWJsZXMgdmVyYm9zZSBjb25zb2xlIGxvZ2dpbmcgd2hlbiBgdHJ1ZWAuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKlxuICogQHByb3BlcnR5IHN0b3BPbkVycm9yXG4gKiBJZiBgdHJ1ZWAsIGFueSBmYWlsdXJlIHdoaWxlIGxvYWRpbmcvcGFyc2luZy92YWxpZGF0aW5nIHRoZSBydW50aW1lIGNvbmZpZ1xuICogd2lsbCByZWplY3QgdGhlIGFwcCBpbml0aWFsaXplciBhbmQgKiphYm9ydCBib290KiogKHJlY29tbWVuZGVkIGZvciBwcm9kKS5cbiAqIElmIGBmYWxzZWAsIHRoZSBwcm92aWRlciBmYWxscyBiYWNrIHRvIHRoZSBzdGF0aWMgZW52aXJvbm1lbnQgb25seS5cbiAqIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAqXG4gKiBAcHJvcGVydHkgdG9rZW5cbiAqIE9wdGlvbmFsIGBJbmplY3Rpb25Ub2tlbmAgdXNlZCB0byBleHBvc2UgdGhlIHZhbGlkYXRlZCBjb25maWd1cmF0aW9uXG4gKiB2aWEgQW5ndWxhciBkZXBlbmRlbmN5IGluamVjdGlvbi4gSWYgb21pdHRlZCwgdGhlIHByb3ZpZGVyIHdpbGwgY3JlYXRlIG9uZVxuICogYXV0b21hdGljYWxseSBuYW1lZCBgRU5WX0NPTkZJR2AuXG4gKi9cbmludGVyZmFjZSBQcm92aWRlUnVudGltZUNvbmZpZ09wdGlvbnM8UyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+PiB7XG4gIC8qKiBQYXRoIHRvIHRoZSBydW50aW1lIGVudiBmaWxlIChkZWZhdWx0OiAvZW52L3J1bnRpbWUuZW52KSAqL1xuICBlbnZQYXRoPzogc3RyaW5nO1xuICAvKiogTG9nIGRlYnVnIGluZm8gdG8gY29uc29sZSAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIC8qKiBUaHJvdyBvbiBlcnJvciB0byBzdG9wIGFwcCBib290IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25FcnJvcj86IGJvb2xlYW47XG4gIC8qKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBwcm92aWRlIHRoZSB2YWxpZGF0ZWQgY29uZmlnIHZpYSBBbmd1bGFyIERJICovXG4gIHRva2VuPzogSW5qZWN0aW9uVG9rZW48U2NoZW1hT3V0cHV0PFM+Pjtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgcHJvdmlkZXJzIHRoYXQ6XG4gKiAtIEZldGNoIGEgcnVudGltZSBgLmVudmAgZmlsZSBhdCBzdGFydHVwLFxuICogLSBQYXJzZSBpdCB0byBhIGRlZXAtcGFydGlhbCBzdHJ1Y3R1cmUgdmlhIHRoZSBraXQsXG4gKiAtIEVuZm9yY2UgcnVudGltZS1yZXF1aXJlZCBrZXlzIHdoZW4gYXBwcm9wcmlhdGUsXG4gKiAtIE1lcmdlIHdpdGggdGhlIHN0YXRpYyBlbnZpcm9ubWVudCxcbiAqIC0gVmFsaWRhdGUgdGhlICoqZmluYWwqKiBjb25maWd1cmF0aW9uIGFnYWluc3QgdGhlIFpvZCBzY2hlbWEsXG4gKiAtIEV4cG9zZSB0aGUgcmVzdWx0aW5nIGNvbmZpZyB2aWEgYSBnZW5lcmF0ZWQgYEluamVjdGlvblRva2VuYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFMgLSBab2Qgc2NoZW1hIHR5cGUgZGVzY3JpYmluZyB0aGUgZnVsbCBjb25maWcgc2hhcGUuXG4gKiBAdHlwZVBhcmFtIEsgLSBMaXN0IG9mIHJ1bnRpbWUtcmVxdWlyZWQgdG9wLWxldmVsIGtleXMuXG4gKlxuICogQHBhcmFtIGtpdFxuICogVGhlIGBFbnZLaXRgIGNyZWF0ZWQgYnkgYGNyZWF0ZUVudktpdChzY2hlbWEsIHJ1bnRpbWVSZXF1aXJlZEtleXMpYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogUnVudGltZSBsb2FkaW5nIGJlaGF2aW9yIGFuZCBESSB0b2tlbiBkZXNjcmlwdGlvbi4gU2VlIHtAbGluayBQcm92aWRlUnVudGltZUNvbmZpZ09wdGlvbnN9LlxuICpcbiAqIEByZXR1cm5zIFRoZSBgRW52aXJvbm1lbnRQcm92aWRlcnNgIHRvIGJlIGFkZGVkIHRvIGBhcHBDb25maWcucHJvdmlkZXJzYCxcbiAqXG4gKiBAcmVtYXJrc1xuICogLSBUaGlzIHVzZXMgYW4gQW5ndWxhciAqKmZ1bmN0aW9uYWwgYXBwIGluaXRpYWxpemVyKiogdG8gcGVyZm9ybSB0aGUgbG9hZCBzdGVwLlxuICogLSBJZiB0aGUgc2VydmVyIHJldHVybnMgYW4gSFRNTCBTUEEgZmFsbGJhY2sgKGluc3RlYWQgb2YgdGhlIGAuZW52YCBmaWxlKSwgdGhlIHByb3ZpZGVyXG4gKiAgIHF1aWV0bHkgdXNlcyB0aGUgc3RhdGljIGVudmlyb25tZW50IChubyBydW50aW1lIG92ZXJyaWRlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlUnVudGltZUNvbmZpZzxcbiAgUyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+LFxuICBLIGV4dGVuZHMgcmVhZG9ubHkgKGtleW9mIHoub3V0cHV0PFM+KVtdXG4+KFxuICBraXQ6IEVudktpdDxTLCBLPixcbiAgc3RhdGljRW52OiBTdGF0aWNFbnZGcm9tPFMsIEs+LFxuICB7XG4gICAgZW52UGF0aCA9ICcvZW52L3J1bnRpbWUuZW52JyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIHN0b3BPbkVycm9yID0gdHJ1ZSxcbiAgICB0b2tlbixcbiAgfTogUHJvdmlkZVJ1bnRpbWVDb25maWdPcHRpb25zPFM+ID0ge31cbik6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgLy8gVGhlIHZhbGlkYXRlZCBjb25maWcgdHlwZSBkZXJpdmVkIGZyb20gdGhlIHNjaGVtYS5cbiAgdHlwZSBFbnZDb25maWcgPSBTY2hlbWFPdXRwdXQ8Uz47XG5cbiAgLy8gVHlwZWQgdG9rZW4gdXNlZCB0byBleHBvc2UgdGhlIGZpbmFsIHZhbGlkYXRlZCBjb25maWcgdmlhIERJLlxuICBjb25zdCBjb25maWdUb2tlbiA9IHRva2VuID8/IG5ldyBJbmplY3Rpb25Ub2tlbjxFbnZDb25maWc+KCdFTlZfQ09ORklHJyk7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgc2VydmljZSB0aGF0IGhhbmRsZXMgZmV0Y2hpbmcsIHBhcnNpbmcsIHZhbGlkYXRpbmcsIGFuZCBjYWNoaW5nXG4gICAqIG9mIHRoZSBydW50aW1lIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuICBjbGFzcyBSdW50aW1lQ29uZmlnU2VydmljZSB7XG4gICAgLy8gQ2FjaGVkIGluc3RhbmNlIG9mIHRoZSB2YWxpZGF0ZWQgY29uZmlndXJhdGlvbi5cbiAgICBwcml2YXRlIGNvbmZpZz86IEVudkNvbmZpZztcblxuICAgIC8qKlxuICAgICAqIExvYWRzLCBwYXJzZXMsIG1lcmdlcyBhbmQgdmFsaWRhdGVzIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uXG4gICAgICogUmV0dXJucyBhbiBgT2JzZXJ2YWJsZTxDb25maWdTaGFwZT5gIGFuZCBjYWNoZXMgdGhlIGZpbmFsIHJlc3VsdC5cbiAgICAgKi9cbiAgICBsb2FkKCk6IE9ic2VydmFibGU8RW52Q29uZmlnPiB7XG4gICAgICByZXR1cm4gZGVmZXIoKCkgPT5cbiAgICAgICAgZnJvbShcbiAgICAgICAgICBmZXRjaChlbnZQYXRoKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBIVFRQIGVycm9ycyBleHBsaWNpdGx5IHNvIHRoZXkgZ28gdGhyb3VnaCBjYXRjaEVycm9yXG4gICAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJ1bnRpbWUgY29uZmlnOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcy50ZXh0KCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIC8vIDEuIFNQQSBmYWxsYmFjayBndWFyZCAoc2VydmVyIHJldHVybmVkIEhUTUwgaW5zdGVhZCBvZiAuZW52KVxuICAgICAgICAgIG1hcCgocmF3OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgbG9va3NIdG1sID1cbiAgICAgICAgICAgICAgL15cXHMqPCFkb2N0eXBlL2kudGVzdCh0cmltbWVkKSB8fCAvXlxccyo8aHRtbFtcXHM+XS9pLnRlc3QodHJpbW1lZCk7XG4gICAgICAgICAgICBpZiAobG9va3NIdG1sKSB7XG4gICAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgLi4ucmNBcmdzKFxuICAgICAgICAgICAgICAgICAgICAnTm8gcnVudGltZSBlbnZpcm9ubWVudCBmaWxlIGRldGVjdGVkLCB1c2luZyBzdGF0aWMgZW52aXJvbm1lbnQgb25seS4nXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBTaWduYWwg4oCcbm8gcnVudGltZS5lbnYsIHVzZSBzdGF0aWMgb25seeKAnVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByYXc7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFwKCh2OiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRlYnVnKSByZXR1cm47XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgLi4ucmNBcmdzKFxuICAgICAgICAgICAgICAgIHYgPT09IG51bGxcbiAgICAgICAgICAgICAgICAgID8gJ05vIHJ1bnRpbWUgZW52aXJvbm1lbnQgZmlsZSBkZWZpbmVkLCB1c2luZyBzdGF0aWMgZW52aXJvbm1lbnQnXG4gICAgICAgICAgICAgICAgICA6ICdSdW50aW1lIGVudmlyb25tZW50IGZpbGUgbG9hZGVkLCBhcHBseWluZyBvdmVycmlkZXMuJ1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIC8vIDIuIEVpdGhlciBjb250aW51ZSB0aGUgcGlwZSBvciByZXR1cm4gZGVmYXVsdHNcbiAgICAgICAgICBzd2l0Y2hNYXAoKHJhdzogc3RyaW5nIHwgbnVsbCk6IE9ic2VydmFibGU8RW52Q29uZmlnPiA9PiB7XG4gICAgICAgICAgICBpZiAocmF3ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmcm9tKGtpdC5tZXJnZUFuZFZhbGlkYXRlQXN5bmMoc3RhdGljRW52KSkucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKGNmZykgPT4gKHRoaXMuY29uZmlnID0gY2ZnKSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMy4gUGFyc2UgcmF3IGAuZW52YCB0ZXh0IC0+IG9iamVjdCwgdGhlbiBkZWVwLXBhcnRpYWwtcGFyc2UgdmlhIGtpdFxuICAgICAgICAgICAgY29uc3QgcnVudGltZUNvbmZpZ1JhdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBwYXJzZUVudkZpbGUocmF3KTtcbiAgICAgICAgICAgIHJldHVybiBmcm9tKGtpdC5wYXJzZVJ1bnRpbWVPdmVycmlkZXNBc3luYyhydW50aW1lQ29uZmlnUmF3KSkucGlwZShcbiAgICAgICAgICAgICAgdGFwKChvdmVycmlkZXM6IFBhcnRpYWw8RW52Q29uZmlnPikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLnJjQXJncygnUnVudGltZSBjb25maWcgKHBhcnNlZCk6JyksIG92ZXJyaWRlcyk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAvLyA0LiBNZXJnZSBzdGF0aWMgKyBvdmVycmlkZXMgYW5kIHZhbGlkYXRlIHRoZSBmaW5hbCBjb25maWcgKGFzeW5jKVxuICAgICAgICAgICAgICBzd2l0Y2hNYXAoXG4gICAgICAgICAgICAgICAgKG92ZXJyaWRlczogUGFydGlhbDxFbnZDb25maWc+KTogT2JzZXJ2YWJsZTxFbnZDb25maWc+ID0+XG4gICAgICAgICAgICAgICAgICBmcm9tKGtpdC5tZXJnZUFuZFZhbGlkYXRlQXN5bmMoc3RhdGljRW52LCBvdmVycmlkZXMpKVxuICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgIC8vIDUuIENhY2hlIHRoZSB2YWxpZGF0ZWQgY29uZmlnIGZvciBzeW5jaHJvbm91cyBhY2Nlc3MgbGF0ZXJcbiAgICAgICAgICAgICAgdGFwKChtZXJnZWRDb25maWc6IEVudkNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLnJjQXJncygnTWVyZ2VkIGNvbmZpZzonKSwgbWVyZ2VkQ29uZmlnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IG1lcmdlZENvbmZpZztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG5cbiAgICAgICAgICAvLyA2LiBFcnJvciBoYW5kbGluZzogZmFpbCBmYXN0IG9yIGdyYWNlZnVsbHkgZmFsbCBiYWNrIHRvIHN0YXRpYy1vbmx5XG4gICAgICAgICAgY2F0Y2hFcnJvcigoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RvcE9uRXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gUmVqZWN0IGFwcCBpbml0aWFsaXphdGlvbiAocmVjb21tZW5kZWQgZm9yIHByb2R1Y3Rpb24pXG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIC4uLnJjQXJncygnRXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyBydW50aW1lIGNvbmZpZzonKSxcbiAgICAgICAgICAgICAgZXJyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICByZXR1cm4gb2YodGhpcy51c2VEZWZhdWx0cygpKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAgICAgKiBJZiBub3QgeWV0IGxvYWRlZCwgcmV0dXJucyBhIHZhbGlkYXRlZCBzdGF0aWMtb25seSBjb25maWd1cmF0aW9uLlxuICAgICAqL1xuICAgIGdldCgpOiBFbnZDb25maWcge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1J1bnRpbWVDb25maWdTZXJ2aWNlLmdldCgpIGNhbGxlZCBiZWZvcmUgY29uZmlndXJhdGlvbiB3YXMgbG9hZGVkLiAnICtcbiAgICAgICAgICAgICdFbnN1cmUgcHJvdmlkZUFwcEluaXRpYWxpemVyIHdhaXRzIGZvciBSdW50aW1lQ29uZmlnU2VydmljZS5sb2FkKCkuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIGEgdmFsaWRhdGVkIHN0YXRpYy1vbmx5IGNvbmZpZ3VyYXRpb25cbiAgICAgKiBVc2VkIHdoZW4gdGhlIHJ1bnRpbWUgYC5lbnZgIGZpbGUgaXMgbWlzc2luZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVzZURlZmF1bHRzKCk6IEVudkNvbmZpZyB7XG4gICAgICAvLyBOb3RlOiB0aGlzIHVzZXMgdGhlIHN0YXRpYyBlbnY7IG1lcmdlK3ZhbGlkYXRlIGlzIHBlcmZvcm1lZCBpbiBgZ2V0KClgIGlmIG5lZWRlZC5cbiAgICAgIHRoaXMuY29uZmlnID8/PSBzdGF0aWNFbnYgYXMgRW52Q29uZmlnO1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlZ2lzdGVyIHRoZSBzZXJ2aWNlICsgaW5pdGlhbGl6ZXIgKyB0b2tlbiBleHBvc3VyZSB3aXRoIEFuZ3VsYXIgREkuXG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIFJ1bnRpbWVDb25maWdTZXJ2aWNlLFxuXG4gICAgLy8gQW5ndWxhciAxOSsgZnVuY3Rpb25hbCBpbml0aWFsaXplciAoc3Vic2NyaWJlcyB0byB0aGUgbG9hZCBPYnNlcnZhYmxlKVxuICAgIC8vIFVzaW5nIGZpcnN0VmFsdWVGcm9tIHRvIGVuZm9yZWNlIFwiYXdhaXQgdW50aWwgbG9hZGVkXCIgc2VtYW50aWNzXG4gICAgcHJvdmlkZUFwcEluaXRpYWxpemVyKCgpID0+XG4gICAgICBmaXJzdFZhbHVlRnJvbShpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpLmxvYWQoKSlcbiAgICApLFxuXG4gICAgLy8gRXhwb3NlIHRoZSBmaW5hbCB2YWxpZGF0ZWQgY29uZmlnIHZpYSB0aGUgZ2VuZXJhdGVkIHRva2VuXG4gICAge1xuICAgICAgcHJvdmlkZTogY29uZmlnVG9rZW4sXG4gICAgICB1c2VGYWN0b3J5OiAoKSA9PiBpbmplY3QoUnVudGltZUNvbmZpZ1NlcnZpY2UpLmdldCgpLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { makeEnvironmentProviders, } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* Registers providers that:
|
|
4
|
+
* - Expose a **static** environment configuration object via Angular DI,
|
|
5
|
+
* - Perform **no** runtime `.env` fetching or asynchronous initialization,
|
|
6
|
+
* - Mirror Angular’s standard build-time pattern:
|
|
7
|
+
*
|
|
8
|
+
* { provide: SOME_TOKEN, useValue: environment }
|
|
9
|
+
*
|
|
10
|
+
* This is intended for applications that:
|
|
11
|
+
* - Use only `environment.ts` build-time configuration,
|
|
12
|
+
* - Do not require runtime overrides or external `.env` files,
|
|
13
|
+
* - Wish to keep bootstrap logic minimal and predictable,
|
|
14
|
+
* - Or are running in unit tests where a fixed static config is sufficient.
|
|
15
|
+
*
|
|
16
|
+
* @typeParam T - The shape of the static configuration object.
|
|
17
|
+
*
|
|
18
|
+
* @param env
|
|
19
|
+
* The static configuration instance to expose via DI. Defaults to an empty
|
|
20
|
+
* object if omitted, enabling callers to provide minimal configuration
|
|
21
|
+
* without boilerplate.
|
|
22
|
+
*
|
|
23
|
+
* @param options
|
|
24
|
+
* A `ProvideStaticConfigOptions<T>` containing the **required**
|
|
25
|
+
* `InjectionToken<T>` under which the configuration will be registered.
|
|
26
|
+
* Angular DI resolves providers solely by token instance identity, so the
|
|
27
|
+
* caller must supply the exact token that consumers will inject.
|
|
28
|
+
*
|
|
29
|
+
* @returns The `EnvironmentProviders` to be added to `appConfig.providers`.
|
|
30
|
+
*
|
|
31
|
+
* @remarks
|
|
32
|
+
* The static provider is intentionally minimal, offering a lightweight
|
|
33
|
+
* counterpart to `provideRuntimeConfig` for apps that rely on build-time
|
|
34
|
+
* environment values only.
|
|
35
|
+
*/
|
|
36
|
+
export function provideStaticConfig(env = {}, options) {
|
|
37
|
+
return makeEnvironmentProviders([
|
|
38
|
+
{
|
|
39
|
+
provide: options.token,
|
|
40
|
+
useValue: env,
|
|
41
|
+
},
|
|
42
|
+
]);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZS1zdGF0aWMtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi9lbnYvYW5ndWxhci9wcm92aWRlLXN0YXRpYy1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHdCQUF3QixHQUN6QixNQUFNLGVBQWUsQ0FBQztBQWN2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxNQUFZLEVBQUUsRUFDZCxPQUFzQztJQUV0QyxPQUFPLHdCQUF3QixDQUFDO1FBQzlCO1lBQ0UsT0FBTyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3RCLFFBQVEsRUFBRSxHQUFHO1NBQ2Q7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIEluamVjdGlvblRva2VuLFxuICBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBBbmd1bGFyIHN0YXRpYy1jb25maWcgcHJvdmlkZXIuXG4gKlxuICogQHByb3BlcnR5IHRva2VuXG4gKiBBIHJlcXVpcmVkIGBJbmplY3Rpb25Ub2tlbjxUPmAgdW5kZXIgd2hpY2ggdGhlIHN0YXRpYyBlbnZpcm9ubWVudFxuICogY29uZmlndXJhdGlvbiB3aWxsIGJlIHJlZ2lzdGVyZWQuIEFuZ3VsYXIgcmVzb2x2ZXMgcHJvdmlkZXJzIGV4Y2x1c2l2ZWx5XG4gKiBieSAqKnRva2VuIGluc3RhbmNlIGlkZW50aXR5KiosIG5vdCBieSB0b2tlbiBuYW1lIG9yIGRlc2NyaXB0aW9uLCBzbyB0aGVcbiAqIGNhbGxlciBtdXN0IHN1cHBseSB0aGUgZXhhY3QgYEluamVjdGlvblRva2VuPFQ+YCB0aGF0IGNvbnN1bWVycyB3aWxsIHVzZVxuICogd2hlbiBpbmplY3RpbmcgdGhlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFByb3ZpZGVTdGF0aWNDb25maWdPcHRpb25zPFQ+ID0geyB0b2tlbjogSW5qZWN0aW9uVG9rZW48VD4gfTtcblxuLyoqXG4gKiBSZWdpc3RlcnMgcHJvdmlkZXJzIHRoYXQ6XG4gKiAtIEV4cG9zZSBhICoqc3RhdGljKiogZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbiBvYmplY3QgdmlhIEFuZ3VsYXIgREksXG4gKiAtIFBlcmZvcm0gKipubyoqIHJ1bnRpbWUgYC5lbnZgIGZldGNoaW5nIG9yIGFzeW5jaHJvbm91cyBpbml0aWFsaXphdGlvbixcbiAqIC0gTWlycm9yIEFuZ3VsYXLigJlzIHN0YW5kYXJkIGJ1aWxkLXRpbWUgcGF0dGVybjpcbiAqXG4gKiAgICAgeyBwcm92aWRlOiBTT01FX1RPS0VOLCB1c2VWYWx1ZTogZW52aXJvbm1lbnQgfVxuICpcbiAqIFRoaXMgaXMgaW50ZW5kZWQgZm9yIGFwcGxpY2F0aW9ucyB0aGF0OlxuICogLSBVc2Ugb25seSBgZW52aXJvbm1lbnQudHNgIGJ1aWxkLXRpbWUgY29uZmlndXJhdGlvbixcbiAqIC0gRG8gbm90IHJlcXVpcmUgcnVudGltZSBvdmVycmlkZXMgb3IgZXh0ZXJuYWwgYC5lbnZgIGZpbGVzLFxuICogLSBXaXNoIHRvIGtlZXAgYm9vdHN0cmFwIGxvZ2ljIG1pbmltYWwgYW5kIHByZWRpY3RhYmxlLFxuICogLSBPciBhcmUgcnVubmluZyBpbiB1bml0IHRlc3RzIHdoZXJlIGEgZml4ZWQgc3RhdGljIGNvbmZpZyBpcyBzdWZmaWNpZW50LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSBzaGFwZSBvZiB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBlbnZcbiAqIFRoZSBzdGF0aWMgY29uZmlndXJhdGlvbiBpbnN0YW5jZSB0byBleHBvc2UgdmlhIERJLiBEZWZhdWx0cyB0byBhbiBlbXB0eVxuICogb2JqZWN0IGlmIG9taXR0ZWQsIGVuYWJsaW5nIGNhbGxlcnMgdG8gcHJvdmlkZSBtaW5pbWFsIGNvbmZpZ3VyYXRpb25cbiAqIHdpdGhvdXQgYm9pbGVycGxhdGUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEEgYFByb3ZpZGVTdGF0aWNDb25maWdPcHRpb25zPFQ+YCBjb250YWluaW5nIHRoZSAqKnJlcXVpcmVkKipcbiAqIGBJbmplY3Rpb25Ub2tlbjxUPmAgdW5kZXIgd2hpY2ggdGhlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSByZWdpc3RlcmVkLlxuICogQW5ndWxhciBESSByZXNvbHZlcyBwcm92aWRlcnMgc29sZWx5IGJ5IHRva2VuIGluc3RhbmNlIGlkZW50aXR5LCBzbyB0aGVcbiAqIGNhbGxlciBtdXN0IHN1cHBseSB0aGUgZXhhY3QgdG9rZW4gdGhhdCBjb25zdW1lcnMgd2lsbCBpbmplY3QuXG4gKlxuICogQHJldHVybnMgVGhlIGBFbnZpcm9ubWVudFByb3ZpZGVyc2AgdG8gYmUgYWRkZWQgdG8gYGFwcENvbmZpZy5wcm92aWRlcnNgLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgc3RhdGljIHByb3ZpZGVyIGlzIGludGVudGlvbmFsbHkgbWluaW1hbCwgb2ZmZXJpbmcgYSBsaWdodHdlaWdodFxuICogY291bnRlcnBhcnQgdG8gYHByb3ZpZGVSdW50aW1lQ29uZmlnYCBmb3IgYXBwcyB0aGF0IHJlbHkgb24gYnVpbGQtdGltZVxuICogZW52aXJvbm1lbnQgdmFsdWVzIG9ubHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlU3RhdGljQ29uZmlnPFQ+KFxuICBlbnY6IFQgPSA8VD57fSxcbiAgb3B0aW9uczogUHJvdmlkZVN0YXRpY0NvbmZpZ09wdGlvbnM8VD5cbik6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgcmV0dXJuIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycyhbXG4gICAge1xuICAgICAgcHJvdmlkZTogb3B0aW9ucy50b2tlbixcbiAgICAgIHVzZVZhbHVlOiBlbnYsXG4gICAgfSxcbiAgXSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { zx } from '@traversable/zod';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a **type-safe environment kit** around a Zod schema.
|
|
4
|
+
*
|
|
5
|
+
* This utility encapsulates all environment configuration logic in a reusable,
|
|
6
|
+
* strongly-typed structure that:
|
|
7
|
+
* - Validates **deep-partial** runtime overrides using `zx.deepPartial(schema)`.
|
|
8
|
+
* - Ensures that **runtime-required keys** are provided when `production=true`.
|
|
9
|
+
* - Merges static defaults with runtime overrides and validates the **final config** asynchronously.
|
|
10
|
+
*
|
|
11
|
+
* @typeParam S - The Zod schema type describing the full environment configuration.
|
|
12
|
+
* @typeParam K - The list of top-level keys that must be supplied at runtime in production builds.
|
|
13
|
+
*
|
|
14
|
+
* @param params.schema - The full Zod schema defining the configuration structure.
|
|
15
|
+
* @param params.runtimeRequiredKeys - Keys that must be present in runtime overrides for production.
|
|
16
|
+
*
|
|
17
|
+
* @returns A fully-typed {@link EnvKit} instance exposing validation helpers, runtime parsers, and type tokens.
|
|
18
|
+
*/
|
|
19
|
+
export function createEnvKit(params) {
|
|
20
|
+
const { schema, runtimeRequiredKeys } = params;
|
|
21
|
+
/** Deep-partial schema — allows validation of incomplete runtime overrides. */
|
|
22
|
+
const runtimeOverridesSchema = zx.deepPartial(schema);
|
|
23
|
+
/**
|
|
24
|
+
* Parses a raw `.env` object into a **deep-partial** structure matching the schema.
|
|
25
|
+
* @param raw - The raw key-value object parsed from a `.env` file.
|
|
26
|
+
* @returns A validated deep-partial configuration matching the schema shape.
|
|
27
|
+
* @throws ZodError if the structure is invalid.
|
|
28
|
+
*/
|
|
29
|
+
function parseRuntimeOverridesAsync(raw) {
|
|
30
|
+
return runtimeOverridesSchema.parseAsync(raw);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validates that all runtime-required keys are defined when `production=true`.
|
|
34
|
+
* Prevents missing values from being silently filled from static defaults.
|
|
35
|
+
*
|
|
36
|
+
* @param overrides - The runtime overrides to inspect.
|
|
37
|
+
* @param production - Whether the environment is running in production mode.
|
|
38
|
+
* @throws Error if any runtime-required key is missing.
|
|
39
|
+
*/
|
|
40
|
+
function ensureRuntimeKeysPresent(overrides, production) {
|
|
41
|
+
if (!production)
|
|
42
|
+
return;
|
|
43
|
+
const missing = runtimeRequiredKeys.filter((k) => overrides[k] === undefined);
|
|
44
|
+
console.log('Overrides', overrides);
|
|
45
|
+
if (missing.length) {
|
|
46
|
+
throw new Error(`Missing required runtime overrides for production: ${missing.join(', ')}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Merges the provided static environment with runtime overrides,
|
|
51
|
+
* enforces runtime key presence when necessary, and validates the
|
|
52
|
+
* **final merged configuration** against the full schema.
|
|
53
|
+
*
|
|
54
|
+
* @param staticEnv - The static environment configuration (dev or prod).
|
|
55
|
+
* @param overrides - The runtime overrides to merge in.
|
|
56
|
+
* @returns A fully validated, strongly typed configuration object.
|
|
57
|
+
* @throws ZodError if validation fails, or Error if required keys are missing in production.
|
|
58
|
+
*/
|
|
59
|
+
function mergeAndValidateAsync(staticEnv, overrides = {}) {
|
|
60
|
+
// Determine production mode; runtime override takes precedence if defined
|
|
61
|
+
const effectiveProduction = (overrides['production'] ?? staticEnv.production) === true;
|
|
62
|
+
ensureRuntimeKeysPresent(overrides, effectiveProduction);
|
|
63
|
+
// Validate the merged result asynchronously with the full schema
|
|
64
|
+
return schema.parseAsync({ ...staticEnv, ...overrides });
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
/** The full Zod schema provided by the consumer. */
|
|
68
|
+
schema,
|
|
69
|
+
/** Deep-partial schema used for validating runtime overrides (via `zx.deepPartial`). */
|
|
70
|
+
runtimeOverridesSchema,
|
|
71
|
+
/** Keys that must be provided in runtime overrides when `production=true`. */
|
|
72
|
+
runtimeRequiredKeys,
|
|
73
|
+
/** Parses a raw `.env` object into deep-partial runtime overrides (async). */
|
|
74
|
+
parseRuntimeOverridesAsync,
|
|
75
|
+
/** Merges static + runtime configs and validates the final schema (async). */
|
|
76
|
+
mergeAndValidateAsync,
|
|
77
|
+
/** Type tokens for compile-time inference; erased at runtime. */
|
|
78
|
+
types: {},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWVudi1raXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3RlZ2VsLWFuZ3VsYXItZXh0ZW5zaW9ucy9zcmMvbGliL2Vudi9jb3JlL2NyZWF0ZS1lbnYta2l0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVd0Qzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxZQUFZLENBRzFCLE1BS0Q7SUFDQyxNQUFNLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsTUFBTSxDQUFDO0lBSy9DLCtFQUErRTtJQUMvRSxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEQ7Ozs7O09BS0c7SUFDSCxTQUFTLDBCQUEwQixDQUNqQyxHQUE0QjtRQUU1QixPQUFPLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFNBQVMsd0JBQXdCLENBQy9CLFNBQTZCLEVBQzdCLFVBQW1CO1FBRW5CLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUN4QixNQUFNLE9BQU8sR0FDWCxtQkFDRCxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBRTVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXBDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0RBQXNELE9BQU8sQ0FBQyxJQUFJLENBQ2hFLElBQUksQ0FDTCxFQUFFLENBQ0osQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsU0FBUyxxQkFBcUIsQ0FDNUIsU0FBMkQsRUFDM0QsWUFBZ0MsRUFBRTtRQUVsQywwRUFBMEU7UUFDMUUsTUFBTSxtQkFBbUIsR0FDdkIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLElBQUksQ0FBQztRQUU3RCx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUV6RCxpRUFBaUU7UUFDakUsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxPQUFPO1FBQ0wsb0RBQW9EO1FBQ3BELE1BQU07UUFFTix3RkFBd0Y7UUFDeEYsc0JBQXNCO1FBRXRCLDhFQUE4RTtRQUM5RSxtQkFBbUI7UUFFbkIsOEVBQThFO1FBQzlFLDBCQUEwQjtRQUUxQiw4RUFBOEU7UUFDOUUscUJBQXFCO1FBRXJCLGlFQUFpRTtRQUNqRSxLQUFLLEVBQUUsRUFPTjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgenggfSBmcm9tICdAdHJhdmVyc2FibGUvem9kJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHtcbiAgRGV2RGVmYXVsdHNGcm9tLFxuICBEZXZTdGF0aWNFbnZGcm9tLFxuICBFbnZLaXQsXG4gIFByb2RTdGF0aWNFbnZGcm9tLFxuICBTY2hlbWFPdXRwdXQsXG4gIFN0YXRpY0VudkZyb20sXG59IGZyb20gJy4vZW52LXR5cGVzJztcblxuLyoqXG4gKiBCdWlsZHMgYSAqKnR5cGUtc2FmZSBlbnZpcm9ubWVudCBraXQqKiBhcm91bmQgYSBab2Qgc2NoZW1hLlxuICpcbiAqIFRoaXMgdXRpbGl0eSBlbmNhcHN1bGF0ZXMgYWxsIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gbG9naWMgaW4gYSByZXVzYWJsZSxcbiAqIHN0cm9uZ2x5LXR5cGVkIHN0cnVjdHVyZSB0aGF0OlxuICogLSBWYWxpZGF0ZXMgKipkZWVwLXBhcnRpYWwqKiBydW50aW1lIG92ZXJyaWRlcyB1c2luZyBgenguZGVlcFBhcnRpYWwoc2NoZW1hKWAuXG4gKiAtIEVuc3VyZXMgdGhhdCAqKnJ1bnRpbWUtcmVxdWlyZWQga2V5cyoqIGFyZSBwcm92aWRlZCB3aGVuIGBwcm9kdWN0aW9uPXRydWVgLlxuICogLSBNZXJnZXMgc3RhdGljIGRlZmF1bHRzIHdpdGggcnVudGltZSBvdmVycmlkZXMgYW5kIHZhbGlkYXRlcyB0aGUgKipmaW5hbCBjb25maWcqKiBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFMgLSBUaGUgWm9kIHNjaGVtYSB0eXBlIGRlc2NyaWJpbmcgdGhlIGZ1bGwgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbi5cbiAqIEB0eXBlUGFyYW0gSyAtIFRoZSBsaXN0IG9mIHRvcC1sZXZlbCBrZXlzIHRoYXQgbXVzdCBiZSBzdXBwbGllZCBhdCBydW50aW1lIGluIHByb2R1Y3Rpb24gYnVpbGRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMuc2NoZW1hIC0gVGhlIGZ1bGwgWm9kIHNjaGVtYSBkZWZpbmluZyB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuXG4gKiBAcGFyYW0gcGFyYW1zLnJ1bnRpbWVSZXF1aXJlZEtleXMgLSBLZXlzIHRoYXQgbXVzdCBiZSBwcmVzZW50IGluIHJ1bnRpbWUgb3ZlcnJpZGVzIGZvciBwcm9kdWN0aW9uLlxuICpcbiAqIEByZXR1cm5zIEEgZnVsbHktdHlwZWQge0BsaW5rIEVudktpdH0gaW5zdGFuY2UgZXhwb3NpbmcgdmFsaWRhdGlvbiBoZWxwZXJzLCBydW50aW1lIHBhcnNlcnMsIGFuZCB0eXBlIHRva2Vucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVudktpdDxcbiAgUyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+LFxuICBLIGV4dGVuZHMgcmVhZG9ubHkgKGtleW9mIHoub3V0cHV0PFM+KVtdXG4+KHBhcmFtczoge1xuICAvKiogVGhlIGZ1bGwgWm9kIHNjaGVtYSBkZXNjcmliaW5nIHRoZSBhcHAncyBjb25maWd1cmF0aW9uIHNoYXBlLiAqL1xuICBzY2hlbWE6IFM7XG4gIC8qKiBLZXlzIHRoYXQgbXVzdCBiZSBwcm92aWRlZCBhdCBydW50aW1lIHdoZW4gYHByb2R1Y3Rpb249dHJ1ZWAuICovXG4gIHJ1bnRpbWVSZXF1aXJlZEtleXM6IEs7XG59KTogRW52S2l0PFMsIEs+IHtcbiAgY29uc3QgeyBzY2hlbWEsIHJ1bnRpbWVSZXF1aXJlZEtleXMgfSA9IHBhcmFtcztcblxuICAvKiogQ29uY3JldGUgc2NoZW1hIG91dHB1dCB0eXBlIGZvciBjb252ZW5pZW5jZSBpbnNpZGUgdGhpcyBmYWN0b3J5LiAqL1xuICB0eXBlIEVudkNvbmZpZyA9IFNjaGVtYU91dHB1dDxTPjtcblxuICAvKiogRGVlcC1wYXJ0aWFsIHNjaGVtYSDigJQgYWxsb3dzIHZhbGlkYXRpb24gb2YgaW5jb21wbGV0ZSBydW50aW1lIG92ZXJyaWRlcy4gKi9cbiAgY29uc3QgcnVudGltZU92ZXJyaWRlc1NjaGVtYSA9IHp4LmRlZXBQYXJ0aWFsKHNjaGVtYSk7XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhIHJhdyBgLmVudmAgb2JqZWN0IGludG8gYSAqKmRlZXAtcGFydGlhbCoqIHN0cnVjdHVyZSBtYXRjaGluZyB0aGUgc2NoZW1hLlxuICAgKiBAcGFyYW0gcmF3IC0gVGhlIHJhdyBrZXktdmFsdWUgb2JqZWN0IHBhcnNlZCBmcm9tIGEgYC5lbnZgIGZpbGUuXG4gICAqIEByZXR1cm5zIEEgdmFsaWRhdGVkIGRlZXAtcGFydGlhbCBjb25maWd1cmF0aW9uIG1hdGNoaW5nIHRoZSBzY2hlbWEgc2hhcGUuXG4gICAqIEB0aHJvd3MgWm9kRXJyb3IgaWYgdGhlIHN0cnVjdHVyZSBpcyBpbnZhbGlkLlxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VSdW50aW1lT3ZlcnJpZGVzQXN5bmMoXG4gICAgcmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPFBhcnRpYWw8RW52Q29uZmlnPj4ge1xuICAgIHJldHVybiBydW50aW1lT3ZlcnJpZGVzU2NoZW1hLnBhcnNlQXN5bmMocmF3KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCBhbGwgcnVudGltZS1yZXF1aXJlZCBrZXlzIGFyZSBkZWZpbmVkIHdoZW4gYHByb2R1Y3Rpb249dHJ1ZWAuXG4gICAqIFByZXZlbnRzIG1pc3NpbmcgdmFsdWVzIGZyb20gYmVpbmcgc2lsZW50bHkgZmlsbGVkIGZyb20gc3RhdGljIGRlZmF1bHRzLlxuICAgKlxuICAgKiBAcGFyYW0gb3ZlcnJpZGVzIC0gVGhlIHJ1bnRpbWUgb3ZlcnJpZGVzIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSBwcm9kdWN0aW9uIC0gV2hldGhlciB0aGUgZW52aXJvbm1lbnQgaXMgcnVubmluZyBpbiBwcm9kdWN0aW9uIG1vZGUuXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IHJ1bnRpbWUtcmVxdWlyZWQga2V5IGlzIG1pc3NpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBlbnN1cmVSdW50aW1lS2V5c1ByZXNlbnQoXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEVudkNvbmZpZz4sXG4gICAgcHJvZHVjdGlvbjogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBpZiAoIXByb2R1Y3Rpb24pIHJldHVybjtcbiAgICBjb25zdCBtaXNzaW5nID0gKFxuICAgICAgcnVudGltZVJlcXVpcmVkS2V5cyBhcyByZWFkb25seSAoa2V5b2YgRW52Q29uZmlnKVtdXG4gICAgKS5maWx0ZXIoKGspID0+IG92ZXJyaWRlc1trXSA9PT0gdW5kZWZpbmVkKTtcblxuICAgIGNvbnNvbGUubG9nKCdPdmVycmlkZXMnLCBvdmVycmlkZXMpO1xuXG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHJ1bnRpbWUgb3ZlcnJpZGVzIGZvciBwcm9kdWN0aW9uOiAke21pc3Npbmcuam9pbihcbiAgICAgICAgICAnLCAnXG4gICAgICAgICl9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2VzIHRoZSBwcm92aWRlZCBzdGF0aWMgZW52aXJvbm1lbnQgd2l0aCBydW50aW1lIG92ZXJyaWRlcyxcbiAgICogZW5mb3JjZXMgcnVudGltZSBrZXkgcHJlc2VuY2Ugd2hlbiBuZWNlc3NhcnksIGFuZCB2YWxpZGF0ZXMgdGhlXG4gICAqICoqZmluYWwgbWVyZ2VkIGNvbmZpZ3VyYXRpb24qKiBhZ2FpbnN0IHRoZSBmdWxsIHNjaGVtYS5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRpY0VudiAtIFRoZSBzdGF0aWMgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbiAoZGV2IG9yIHByb2QpLlxuICAgKiBAcGFyYW0gb3ZlcnJpZGVzIC0gVGhlIHJ1bnRpbWUgb3ZlcnJpZGVzIHRvIG1lcmdlIGluLlxuICAgKiBAcmV0dXJucyBBIGZ1bGx5IHZhbGlkYXRlZCwgc3Ryb25nbHkgdHlwZWQgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gICAqIEB0aHJvd3MgWm9kRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlscywgb3IgRXJyb3IgaWYgcmVxdWlyZWQga2V5cyBhcmUgbWlzc2luZyBpbiBwcm9kdWN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VBbmRWYWxpZGF0ZUFzeW5jKFxuICAgIHN0YXRpY0VudjogRGV2U3RhdGljRW52RnJvbTxTLCBLPiB8IFByb2RTdGF0aWNFbnZGcm9tPFMsIEs+LFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxFbnZDb25maWc+ID0ge31cbiAgKTogUHJvbWlzZTxFbnZDb25maWc+IHtcbiAgICAvLyBEZXRlcm1pbmUgcHJvZHVjdGlvbiBtb2RlOyBydW50aW1lIG92ZXJyaWRlIHRha2VzIHByZWNlZGVuY2UgaWYgZGVmaW5lZFxuICAgIGNvbnN0IGVmZmVjdGl2ZVByb2R1Y3Rpb24gPVxuICAgICAgKG92ZXJyaWRlc1sncHJvZHVjdGlvbiddID8/IHN0YXRpY0Vudi5wcm9kdWN0aW9uKSA9PT0gdHJ1ZTtcblxuICAgIGVuc3VyZVJ1bnRpbWVLZXlzUHJlc2VudChvdmVycmlkZXMsIGVmZmVjdGl2ZVByb2R1Y3Rpb24pO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIG1lcmdlZCByZXN1bHQgYXN5bmNocm9ub3VzbHkgd2l0aCB0aGUgZnVsbCBzY2hlbWFcbiAgICByZXR1cm4gc2NoZW1hLnBhcnNlQXN5bmMoeyAuLi5zdGF0aWNFbnYsIC4uLm92ZXJyaWRlcyB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLyoqIFRoZSBmdWxsIFpvZCBzY2hlbWEgcHJvdmlkZWQgYnkgdGhlIGNvbnN1bWVyLiAqL1xuICAgIHNjaGVtYSxcblxuICAgIC8qKiBEZWVwLXBhcnRpYWwgc2NoZW1hIHVzZWQgZm9yIHZhbGlkYXRpbmcgcnVudGltZSBvdmVycmlkZXMgKHZpYSBgenguZGVlcFBhcnRpYWxgKS4gKi9cbiAgICBydW50aW1lT3ZlcnJpZGVzU2NoZW1hLFxuXG4gICAgLyoqIEtleXMgdGhhdCBtdXN0IGJlIHByb3ZpZGVkIGluIHJ1bnRpbWUgb3ZlcnJpZGVzIHdoZW4gYHByb2R1Y3Rpb249dHJ1ZWAuICovXG4gICAgcnVudGltZVJlcXVpcmVkS2V5cyxcblxuICAgIC8qKiBQYXJzZXMgYSByYXcgYC5lbnZgIG9iamVjdCBpbnRvIGRlZXAtcGFydGlhbCBydW50aW1lIG92ZXJyaWRlcyAoYXN5bmMpLiAqL1xuICAgIHBhcnNlUnVudGltZU92ZXJyaWRlc0FzeW5jLFxuXG4gICAgLyoqIE1lcmdlcyBzdGF0aWMgKyBydW50aW1lIGNvbmZpZ3MgYW5kIHZhbGlkYXRlcyB0aGUgZmluYWwgc2NoZW1hIChhc3luYykuICovXG4gICAgbWVyZ2VBbmRWYWxpZGF0ZUFzeW5jLFxuXG4gICAgLyoqIFR5cGUgdG9rZW5zIGZvciBjb21waWxlLXRpbWUgaW5mZXJlbmNlOyBlcmFzZWQgYXQgcnVudGltZS4gKi9cbiAgICB0eXBlczoge30gYXMge1xuICAgICAgRW52Q29uZmlnOiBFbnZDb25maWc7XG4gICAgICBEZXZEZWZhdWx0czogRGV2RGVmYXVsdHNGcm9tPFMsIEs+O1xuICAgICAgRGV2U3RhdGljRW52OiBEZXZTdGF0aWNFbnZGcm9tPFMsIEs+O1xuICAgICAgUHJvZFN0YXRpY0VudjogUHJvZFN0YXRpY0VudkZyb208UywgSz47XG4gICAgICBTdGF0aWNFbnY6IFN0YXRpY0VudkZyb208UywgSz47XG4gICAgICBSdW50aW1lUmVxdWlyZWQ6IEtbbnVtYmVyXTtcbiAgICB9LFxuICB9O1xufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy90ZWdlbC1hbmd1bGFyLWV4dGVuc2lvbnMvc3JjL2xpYi9lbnYvY29yZS9lbnYtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHp4IH0gZnJvbSAnQHRyYXZlcnNhYmxlL3pvZCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcblxuLy8gPT09PT09PT09PSBDb3JlIHR5cGUgaGVscGVycyA9PT09PT09PT09XG4vKipcbiAqIEV4dHJhY3RzIHRoZSAqKm91dHB1dCB0eXBlKiogKHZhbGlkYXRlZCBydW50aW1lIHNoYXBlKVxuICogZnJvbSBhIFpvZCBvYmplY3Qgc2NoZW1hIOKAlCBlLmcuIGB6Lm91dHB1dDx0eXBlb2YgTXlTY2hlbWE+YC5cbiAqL1xuZXhwb3J0IHR5cGUgU2NoZW1hT3V0cHV0PFMgZXh0ZW5kcyB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPj4gPSB6Lm91dHB1dDxTPjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSAqKnRvcC1sZXZlbCBwcm9wZXJ0eSBrZXlzKiogb2YgdGhlIFpvZCBzY2hlbWHigJlzIG91dHB1dCB0eXBlLlxuICogRXF1aXZhbGVudCB0byBga2V5b2Ygei5vdXRwdXQ8dHlwZW9mIE15U2NoZW1hPmAuXG4gKi9cbmV4cG9ydCB0eXBlIEtleXNPZjxTIGV4dGVuZHMgei5ab2RPYmplY3Q8ei5ab2RSYXdTaGFwZT4+ID1cbiAga2V5b2YgU2NoZW1hT3V0cHV0PFM+O1xuXG4vKipcbiAqIEEgcmVhZG9ubHkgbGlzdCBvZiBrZXlzIHJlcHJlc2VudGluZyAqKnJ1bnRpbWUtcmVxdWlyZWQgcHJvcGVydGllcyoqXG4gKiB0aGF0IG11c3QgYmUgcHJvdmlkZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgd2hlbiBgcHJvZHVjdGlvbj10cnVlYC5cbiAqL1xuZXhwb3J0IHR5cGUgUnVudGltZUtleUxpc3Q8UyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+PiA9XG4gIHJlYWRvbmx5IChrZXlvZiBTY2hlbWFPdXRwdXQ8Uz4pW107XG5cbi8qKlxuICogUmVwcmVzZW50cyBhICoqZGV2ZWxvcG1lbnQtdGltZSBzdGF0aWMgZW52aXJvbm1lbnQqKiBjb25maWd1cmF0aW9uLlxuICogLSBgcHJvZHVjdGlvbmAgaXMgYWx3YXlzIGBmYWxzZWAuXG4gKiAtIFJ1bnRpbWUtcmVxdWlyZWQga2V5cyAoZS5nLiBBUEkgVVJMcykgYXJlICoqb3B0aW9uYWwqKiBhbmQgbWF5IGJlIHNldCBmb3IgbG9jYWwgZGV2LlxuICovXG5leHBvcnQgdHlwZSBEZXZTdGF0aWNFbnZGcm9tPFxuICBTIGV4dGVuZHMgei5ab2RPYmplY3Q8ei5ab2RSYXdTaGFwZT4sXG4gIEsgZXh0ZW5kcyByZWFkb25seSAoa2V5b2YgU2NoZW1hT3V0cHV0PFM+KVtdXG4+ID0gT21pdDxTY2hlbWFPdXRwdXQ8Uz4sIEtbbnVtYmVyXT4gJiB7IHByb2R1Y3Rpb246IGZhbHNlIH0gJiBQYXJ0aWFsPFxuICAgIFBpY2s8U2NoZW1hT3V0cHV0PFM+LCBLW251bWJlcl0+XG4gID47XG5cbi8qKlxuICogUmVwcmVzZW50cyBhICoqcHJvZHVjdGlvbi10aW1lIHN0YXRpYyBlbnZpcm9ubWVudCoqIGNvbmZpZ3VyYXRpb24uXG4gKiAtIGBwcm9kdWN0aW9uYCBpcyBhbHdheXMgYHRydWVgLlxuICogLSBSdW50aW1lLXJlcXVpcmVkIGtleXMgYXJlICoqZm9yYmlkZGVuKiogaGVyZSBhbmQgbXVzdCBiZSBwcm92aWRlZCBhdCBydW50aW1lLlxuICovXG5leHBvcnQgdHlwZSBQcm9kU3RhdGljRW52RnJvbTxcbiAgUyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+LFxuICBLIGV4dGVuZHMgcmVhZG9ubHkgKGtleW9mIFNjaGVtYU91dHB1dDxTPilbXVxuPiA9IE9taXQ8U2NoZW1hT3V0cHV0PFM+LCBLW251bWJlcl0+ICYgeyBwcm9kdWN0aW9uOiB0cnVlIH0gJiB7XG4gIFtQIGluIEtbbnVtYmVyXV0/OiBuZXZlcjtcbn07XG5cbi8qKlxuICogVW5pb24gdHlwZSBjb21iaW5pbmcgYm90aCBkZXZlbG9wbWVudCBhbmQgcHJvZHVjdGlvbiBzdGF0aWMgZW52aXJvbm1lbnRzLlxuICogVXNlZCBieSBgZW52aXJvbm1lbnQudHNgIGFuZCBgZW52aXJvbm1lbnQucHJvZC50c2AgdG8gZW5zdXJlIGNvcnJlY3Qga2V5IHJ1bGVzIHBlciBtb2RlLlxuICovXG5leHBvcnQgdHlwZSBTdGF0aWNFbnZGcm9tPFxuICBTIGV4dGVuZHMgei5ab2RPYmplY3Q8ei5ab2RSYXdTaGFwZT4sXG4gIEsgZXh0ZW5kcyByZWFkb25seSAoa2V5b2YgU2NoZW1hT3V0cHV0PFM+KVtdXG4+ID0gRGV2U3RhdGljRW52RnJvbTxTLCBLPiB8IFByb2RTdGF0aWNFbnZGcm9tPFMsIEs+O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlICoqYmFzZSBkZWZhdWx0IGVudmlyb25tZW50KiogZm9yIGRldmVsb3BtZW50IGJ1aWxkcy5cbiAqIC0gQ29udGFpbnMgYWxsIGNvbW1vbiBkZWZhdWx0cy5cbiAqIC0gRXhjbHVkZXMgcnVudGltZS1yZXF1aXJlZCBrZXlzIGVudGlyZWx5IGZyb20gaXRzIHR5cGUuXG4gKiAtIGBwcm9kdWN0aW9uYCBpcyBmaXhlZCB0byBgZmFsc2VgLlxuICovXG5leHBvcnQgdHlwZSBEZXZEZWZhdWx0c0Zyb208XG4gIFMgZXh0ZW5kcyB6LlpvZE9iamVjdDx6LlpvZFJhd1NoYXBlPixcbiAgSyBleHRlbmRzIHJlYWRvbmx5IChrZXlvZiBTY2hlbWFPdXRwdXQ8Uz4pW11cbj4gPSBPbWl0PFNjaGVtYU91dHB1dDxTPiwgS1tudW1iZXJdPiAmIHsgcHJvZHVjdGlvbjogZmFsc2UgfTtcblxuLy8gPT09PT09PT09PSBQdWJsaWMgS2l0IEludGVyZmFjZSA9PT09PT09PT09XG4vKipcbiAqIEdlbmVyaWMgaW50ZXJmYWNlIHJldHVybmVkIGJ5IGBjcmVhdGVFbnZLaXRgLlxuICogRGVmaW5lcyBhbGwgaGVscGVyIG1ldGhvZHMgYW5kIHN0YXRpYyB0eXBpbmcgZm9yIGEgZnVsbHkgdHlwZS1zYWZlIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gc3lzdGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudktpdDxcbiAgUyBleHRlbmRzIHouWm9kT2JqZWN0PHouWm9kUmF3U2hhcGU+LFxuICBLIGV4dGVuZHMgcmVhZG9ubHkgKGtleW9mIFNjaGVtYU91dHB1dDxTPilbXVxuPiB7XG4gIC8qKiBGdWxsIFpvZCBzY2hlbWEgcHJvdmlkZWQgYnkgdGhlIGNvbnN1bWVyICovXG4gIHNjaGVtYTogUztcblxuICAvKiogRGVlcC1wYXJ0aWFsIHNjaGVtYSAoY3JlYXRlZCB2aWEgYHp4LmRlZXBQYXJ0aWFsKHNjaGVtYSlgKSB1c2VkIGZvciBydW50aW1lIG92ZXJyaWRlIHZhbGlkYXRpb24gKi9cbiAgcnVudGltZU92ZXJyaWRlc1NjaGVtYTogenguZGVlcFBhcnRpYWwuU2VtYW50aWM8Uz47XG5cbiAgLyoqIExpc3Qgb2YgdG9wLWxldmVsIGtleXMgdGhhdCBtdXN0IGJlIGRlZmluZWQgYXQgcnVudGltZSB3aGVuIGBwcm9kdWN0aW9uPXRydWVgICovXG4gIHJ1bnRpbWVSZXF1aXJlZEtleXM6IEs7XG5cbiAgLyoqIFBhcnNlIHJhdyBgLmVudmAgY29udGVudCBpbnRvIGEgdmFsaWRhdGVkLCBkZWVwLXBhcnRpYWwgb3ZlcnJpZGUgb2JqZWN0ICovXG4gIHBhcnNlUnVudGltZU92ZXJyaWRlc0FzeW5jKFxuICAgIHJhdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTxQYXJ0aWFsPFNjaGVtYU91dHB1dDxTPj4+O1xuXG4gIC8qKiBNZXJnZSBzdGF0aWMgZW52aXJvbm1lbnQgKyBydW50aW1lIG92ZXJyaWRlcywgdGhlbiB2YWxpZGF0ZSB1c2luZyB0aGUgWm9kIHNjaGVtYSAoYXN5bmMpICovXG4gIG1lcmdlQW5kVmFsaWRhdGVBc3luYyhcbiAgICBzdGF0aWNFbnY6IFN0YXRpY0VudkZyb208UywgSz4sXG4gICAgb3ZlcnJpZGVzPzogUGFydGlhbDxTY2hlbWFPdXRwdXQ8Uz4+XG4gICk6IFByb21pc2U8U2NoZW1hT3V0cHV0PFM+PjtcblxuICAvKiogVHlwZSB0b2tlbnMgKGVyYXNlZCBhdCBydW50aW1lKSBmb3IgY29tcGlsZS10aW1lIGluZmVyZW5jZSBjb252ZW5pZW5jZSAqL1xuICB0eXBlczoge1xuICAgIC8qKiBUaGUgZnVsbCB2YWxpZGF0ZWQgY29uZmlnIHR5cGUgKFpvZCBvdXRwdXQpICovXG4gICAgRW52Q29uZmlnOiBTY2hlbWFPdXRwdXQ8Uz47XG4gICAgLyoqIFRoZSBkZXYtb25seSBkZWZhdWx0cyB0eXBlIChubyBydW50aW1lLXJlcXVpcmVkIGtleXMpICovXG4gICAgRGV2RGVmYXVsdHM6IERldkRlZmF1bHRzRnJvbTxTLCBLPjtcbiAgICAvKiogRGV2IGVudmlyb25tZW50IHR5cGUgKHJ1bnRpbWUga2V5cyBvcHRpb25hbCkgKi9cbiAgICBEZXZTdGF0aWNFbnY6IERldlN0YXRpY0VudkZyb208UywgSz47XG4gICAgLyoqIFByb2QgZW52aXJvbm1lbnQgdHlwZSAocnVudGltZSBrZXlzIGZvcmJpZGRlbikgKi9cbiAgICBQcm9kU3RhdGljRW52OiBQcm9kU3RhdGljRW52RnJvbTxTLCBLPjtcbiAgICAvKiogQ29tYmluZWQgdHlwZSBvZiBhbGwgc3RhdGljIGVudnMgKi9cbiAgICBTdGF0aWNFbnY6IFN0YXRpY0VudkZyb208UywgSz47XG4gICAgLyoqIFRoZSB1bmlvbiBvZiBhbGwgcnVudGltZS1yZXF1aXJlZCBrZXkgbmFtZXMgKi9cbiAgICBSdW50aW1lUmVxdWlyZWQ6IEtbbnVtYmVyXTtcbiAgfTtcbn1cbiJdfQ==
|