@serve.zone/dcrouter 13.0.4 → 13.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.
Files changed (45) hide show
  1. package/dist_serve/bundle.js +1059 -972
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/classes.dcrouter.js +5 -2
  4. package/dist_ts/opsserver/handlers/certificate.handler.js +31 -23
  5. package/dist_ts_web/00_commitinfo_data.js +1 -1
  6. package/dist_ts_web/elements/ops-view-apitokens.js +1 -1
  7. package/dist_ts_web/elements/ops-view-certificates.js +1 -1
  8. package/dist_ts_web/elements/ops-view-config.js +1 -1
  9. package/dist_ts_web/elements/ops-view-emails.js +1 -1
  10. package/dist_ts_web/elements/ops-view-logs.js +1 -1
  11. package/dist_ts_web/elements/ops-view-network.js +1 -1
  12. package/dist_ts_web/elements/ops-view-networktargets.js +1 -1
  13. package/dist_ts_web/elements/ops-view-overview.js +1 -1
  14. package/dist_ts_web/elements/ops-view-remoteingress.js +1 -1
  15. package/dist_ts_web/elements/ops-view-routes.js +1 -1
  16. package/dist_ts_web/elements/ops-view-security.js +1 -1
  17. package/dist_ts_web/elements/ops-view-sourceprofiles.js +1 -1
  18. package/dist_ts_web/elements/ops-view-targetprofiles.d.ts +1 -0
  19. package/dist_ts_web/elements/ops-view-targetprofiles.js +51 -52
  20. package/dist_ts_web/elements/ops-view-vpn.js +1 -1
  21. package/dist_ts_web/elements/shared/index.d.ts +0 -1
  22. package/dist_ts_web/elements/shared/index.js +1 -2
  23. package/package.json +5 -5
  24. package/ts/00_commitinfo_data.ts +1 -1
  25. package/ts/classes.dcrouter.ts +4 -1
  26. package/ts/opsserver/handlers/certificate.handler.ts +30 -22
  27. package/ts_web/00_commitinfo_data.ts +1 -1
  28. package/ts_web/elements/ops-view-apitokens.ts +1 -1
  29. package/ts_web/elements/ops-view-certificates.ts +1 -1
  30. package/ts_web/elements/ops-view-config.ts +1 -1
  31. package/ts_web/elements/ops-view-emails.ts +1 -1
  32. package/ts_web/elements/ops-view-logs.ts +1 -1
  33. package/ts_web/elements/ops-view-network.ts +1 -1
  34. package/ts_web/elements/ops-view-networktargets.ts +1 -1
  35. package/ts_web/elements/ops-view-overview.ts +1 -1
  36. package/ts_web/elements/ops-view-remoteingress.ts +1 -1
  37. package/ts_web/elements/ops-view-routes.ts +1 -1
  38. package/ts_web/elements/ops-view-security.ts +1 -1
  39. package/ts_web/elements/ops-view-sourceprofiles.ts +1 -1
  40. package/ts_web/elements/ops-view-targetprofiles.ts +51 -48
  41. package/ts_web/elements/ops-view-vpn.ts +1 -1
  42. package/ts_web/elements/shared/index.ts +1 -2
  43. package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +0 -5
  44. package/dist_ts_web/elements/shared/ops-sectionheading.js +0 -82
  45. package/ts_web/elements/shared/ops-sectionheading.ts +0 -38
@@ -192,7 +192,7 @@ export class OpsViewSecurity extends DeesElement {
192
192
 
193
193
  public render() {
194
194
  return html`
195
- <ops-sectionheading>Security</ops-sectionheading>
195
+ <dees-heading level="2">Security</dees-heading>
196
196
 
197
197
  <div class="tabs">
198
198
  <button
@@ -64,7 +64,7 @@ export class OpsViewSourceProfiles extends DeesElement {
64
64
  ];
65
65
 
66
66
  return html`
67
- <ops-sectionheading>Source Profiles</ops-sectionheading>
67
+ <dees-heading level="2">Source Profiles</dees-heading>
68
68
  <div class="profilesContainer">
69
69
  <dees-statsgrid .tiles=${statsTiles}></dees-statsgrid>
70
70
  <dees-table
@@ -77,7 +77,7 @@ export class OpsViewTargetProfiles extends DeesElement {
77
77
  ];
78
78
 
79
79
  return html`
80
- <ops-sectionheading>Target Profiles</ops-sectionheading>
80
+ <dees-heading level="2">Target Profiles</dees-heading>
81
81
  <div class="profilesContainer">
82
82
  <dees-statsgrid .tiles=${statsTiles}></dees-statsgrid>
83
83
  <dees-table
@@ -148,17 +148,27 @@ export class OpsViewTargetProfiles extends DeesElement {
148
148
  `;
149
149
  }
150
150
 
151
+ private getRouteCandidates() {
152
+ const routeState = appstate.routeManagementStatePart.getState();
153
+ const routes = routeState?.mergedRoutes || [];
154
+ return routes
155
+ .filter((mr) => mr.route.name)
156
+ .map((mr) => ({ viewKey: mr.route.name! }));
157
+ }
158
+
151
159
  private async showCreateProfileDialog() {
152
160
  const { DeesModal } = await import('@design.estate/dees-catalog');
161
+ const routeCandidates = this.getRouteCandidates();
162
+
153
163
  DeesModal.createAndShow({
154
164
  heading: 'Create Target Profile',
155
165
  content: html`
156
166
  <dees-form>
157
167
  <dees-input-text .key=${'name'} .label=${'Name'} .required=${true}></dees-input-text>
158
168
  <dees-input-text .key=${'description'} .label=${'Description'}></dees-input-text>
159
- <dees-input-text .key=${'domains'} .label=${'Domains (comma-separated, e.g. *.example.com)'} ></dees-input-text>
160
- <dees-input-text .key=${'targets'} .label=${'Targets (comma-separated host:port, e.g. 10.0.0.1:443)'}></dees-input-text>
161
- <dees-input-text .key=${'routeRefs'} .label=${'Route Refs (comma-separated route names/IDs)'}></dees-input-text>
169
+ <dees-input-list .key=${'domains'} .label=${'Domains'} .placeholder=${'e.g. *.example.com'} .allowFreeform=${true}></dees-input-list>
170
+ <dees-input-list .key=${'targets'} .label=${'Targets (host:port)'} .placeholder=${'e.g. 10.0.0.1:443'} .allowFreeform=${true}></dees-input-list>
171
+ <dees-input-list .key=${'routeRefs'} .label=${'Route Refs'} .placeholder=${'Type to search routes...'} .candidates=${routeCandidates} .allowFreeform=${true}></dees-input-list>
162
172
  </dees-form>
163
173
  `,
164
174
  menuOptions: [
@@ -172,30 +182,26 @@ export class OpsViewTargetProfiles extends DeesElement {
172
182
  const data = await form.collectFormData();
173
183
  if (!data.name) return;
174
184
 
175
- const domains = data.domains
176
- ? String(data.domains).split(',').map((s: string) => s.trim()).filter(Boolean)
177
- : undefined;
178
- const targets = data.targets
179
- ? String(data.targets).split(',').map((s: string) => {
180
- const trimmed = s.trim();
181
- const lastColon = trimmed.lastIndexOf(':');
182
- if (lastColon === -1) return null;
183
- return {
184
- host: trimmed.substring(0, lastColon),
185
- port: parseInt(trimmed.substring(lastColon + 1), 10),
186
- };
187
- }).filter((t): t is { host: string; port: number } => t !== null && !isNaN(t.port))
188
- : undefined;
189
- const routeRefs = data.routeRefs
190
- ? String(data.routeRefs).split(',').map((s: string) => s.trim()).filter(Boolean)
191
- : undefined;
185
+ const domains: string[] = Array.isArray(data.domains) ? data.domains : [];
186
+ const targetStrings: string[] = Array.isArray(data.targets) ? data.targets : [];
187
+ const targets = targetStrings
188
+ .map((s: string) => {
189
+ const lastColon = s.lastIndexOf(':');
190
+ if (lastColon === -1) return null;
191
+ return {
192
+ host: s.substring(0, lastColon),
193
+ port: parseInt(s.substring(lastColon + 1), 10),
194
+ };
195
+ })
196
+ .filter((t): t is { host: string; port: number } => t !== null && !isNaN(t.port));
197
+ const routeRefs: string[] = Array.isArray(data.routeRefs) ? data.routeRefs : [];
192
198
 
193
199
  await appstate.targetProfilesStatePart.dispatchAction(appstate.createTargetProfileAction, {
194
200
  name: String(data.name),
195
201
  description: data.description ? String(data.description) : undefined,
196
- domains,
197
- targets,
198
- routeRefs,
202
+ domains: domains.length > 0 ? domains : undefined,
203
+ targets: targets.length > 0 ? targets : undefined,
204
+ routeRefs: routeRefs.length > 0 ? routeRefs : undefined,
199
205
  });
200
206
  modalArg.destroy();
201
207
  },
@@ -205,20 +211,22 @@ export class OpsViewTargetProfiles extends DeesElement {
205
211
  }
206
212
 
207
213
  private async showEditProfileDialog(profile: interfaces.data.ITargetProfile) {
208
- const currentDomains = profile.domains?.join(', ') ?? '';
209
- const currentTargets = profile.targets?.map(t => `${t.host}:${t.port}`).join(', ') ?? '';
210
- const currentRouteRefs = profile.routeRefs?.join(', ') ?? '';
214
+ const currentDomains = profile.domains || [];
215
+ const currentTargets = profile.targets?.map(t => `${t.host}:${t.port}`) || [];
216
+ const currentRouteRefs = profile.routeRefs || [];
211
217
 
212
218
  const { DeesModal } = await import('@design.estate/dees-catalog');
219
+ const routeCandidates = this.getRouteCandidates();
220
+
213
221
  DeesModal.createAndShow({
214
222
  heading: `Edit Profile: ${profile.name}`,
215
223
  content: html`
216
224
  <dees-form>
217
225
  <dees-input-text .key=${'name'} .label=${'Name'} .value=${profile.name}></dees-input-text>
218
226
  <dees-input-text .key=${'description'} .label=${'Description'} .value=${profile.description || ''}></dees-input-text>
219
- <dees-input-text .key=${'domains'} .label=${'Domains (comma-separated, e.g. *.example.com)'} .value=${currentDomains}></dees-input-text>
220
- <dees-input-text .key=${'targets'} .label=${'Targets (comma-separated host:port, e.g. 10.0.0.1:443)'} .value=${currentTargets}></dees-input-text>
221
- <dees-input-text .key=${'routeRefs'} .label=${'Route Refs (comma-separated route names/IDs)'} .value=${currentRouteRefs}></dees-input-text>
227
+ <dees-input-list .key=${'domains'} .label=${'Domains'} .placeholder=${'e.g. *.example.com'} .allowFreeform=${true} .value=${currentDomains}></dees-input-list>
228
+ <dees-input-list .key=${'targets'} .label=${'Targets (host:port)'} .placeholder=${'e.g. 10.0.0.1:443'} .allowFreeform=${true} .value=${currentTargets}></dees-input-list>
229
+ <dees-input-list .key=${'routeRefs'} .label=${'Route Refs'} .placeholder=${'Type to search routes...'} .candidates=${routeCandidates} .allowFreeform=${true} .value=${currentRouteRefs}></dees-input-list>
222
230
  </dees-form>
223
231
  `,
224
232
  menuOptions: [
@@ -231,24 +239,19 @@ export class OpsViewTargetProfiles extends DeesElement {
231
239
  if (!form) return;
232
240
  const data = await form.collectFormData();
233
241
 
234
- const domains = data.domains
235
- ? String(data.domains).split(',').map((s: string) => s.trim()).filter(Boolean)
236
- : [];
237
- const targets = data.targets
238
- ? String(data.targets).split(',').map((s: string) => {
239
- const trimmed = s.trim();
240
- if (!trimmed) return null;
241
- const lastColon = trimmed.lastIndexOf(':');
242
- if (lastColon === -1) return null;
243
- return {
244
- host: trimmed.substring(0, lastColon),
245
- port: parseInt(trimmed.substring(lastColon + 1), 10),
246
- };
247
- }).filter((t): t is { host: string; port: number } => t !== null && !isNaN(t.port))
248
- : [];
249
- const routeRefs = data.routeRefs
250
- ? String(data.routeRefs).split(',').map((s: string) => s.trim()).filter(Boolean)
251
- : [];
242
+ const domains: string[] = Array.isArray(data.domains) ? data.domains : [];
243
+ const targetStrings: string[] = Array.isArray(data.targets) ? data.targets : [];
244
+ const targets = targetStrings
245
+ .map((s: string) => {
246
+ const lastColon = s.lastIndexOf(':');
247
+ if (lastColon === -1) return null;
248
+ return {
249
+ host: s.substring(0, lastColon),
250
+ port: parseInt(s.substring(lastColon + 1), 10),
251
+ };
252
+ })
253
+ .filter((t): t is { host: string; port: number } => t !== null && !isNaN(t.port));
254
+ const routeRefs: string[] = Array.isArray(data.routeRefs) ? data.routeRefs : [];
252
255
 
253
256
  await appstate.targetProfilesStatePart.dispatchAction(appstate.updateTargetProfileAction, {
254
257
  id: profile.id,
@@ -221,7 +221,7 @@ export class OpsViewVpn extends DeesElement {
221
221
  ];
222
222
 
223
223
  return html`
224
- <ops-sectionheading>VPN</ops-sectionheading>
224
+ <dees-heading level="2">VPN</dees-heading>
225
225
  <div class="vpnContainer">
226
226
 
227
227
  ${this.vpnState.newClientConfig ? html`
@@ -1,2 +1 @@
1
- export * from './css.js';
2
- export * from './ops-sectionheading.js';
1
+ export * from './css.js';
@@ -1,5 +0,0 @@
1
- import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
2
- export declare class OpsSectionHeading extends DeesElement {
3
- static styles: import("@design.estate/dees-element").CSSResult[];
4
- render(): TemplateResult;
5
- }
@@ -1,82 +0,0 @@
1
- var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
- function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
- var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
- var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
- var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
- var _, done = false;
7
- for (var i = decorators.length - 1; i >= 0; i--) {
8
- var context = {};
9
- for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
- for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
- context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
- var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
- if (kind === "accessor") {
14
- if (result === void 0) continue;
15
- if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
- if (_ = accept(result.get)) descriptor.get = _;
17
- if (_ = accept(result.set)) descriptor.set = _;
18
- if (_ = accept(result.init)) initializers.unshift(_);
19
- }
20
- else if (_ = accept(result)) {
21
- if (kind === "field") initializers.unshift(_);
22
- else descriptor[key] = _;
23
- }
24
- }
25
- if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
- done = true;
27
- };
28
- var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
- var useValue = arguments.length > 2;
30
- for (var i = 0; i < initializers.length; i++) {
31
- value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
- }
33
- return useValue ? value : void 0;
34
- };
35
- import { DeesElement, css, cssManager, customElement, html } from '@design.estate/dees-element';
36
- let OpsSectionHeading = (() => {
37
- let _classDecorators = [customElement('ops-sectionheading')];
38
- let _classDescriptor;
39
- let _classExtraInitializers = [];
40
- let _classThis;
41
- let _classSuper = DeesElement;
42
- var OpsSectionHeading = class extends _classSuper {
43
- static { _classThis = this; }
44
- static {
45
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
46
- __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
47
- OpsSectionHeading = _classThis = _classDescriptor.value;
48
- if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
49
- }
50
- static styles = [
51
- cssManager.defaultStyles,
52
- css `
53
- :host {
54
- display: block;
55
- margin-bottom: 24px;
56
- }
57
-
58
- .heading {
59
- font-family: 'Cal Sans', 'Inter', sans-serif;
60
- font-size: 28px;
61
- font-weight: 600;
62
- color: ${cssManager.bdTheme('#111', '#fff')};
63
- margin: 0;
64
- padding: 0;
65
- }
66
- `,
67
- ];
68
- render() {
69
- return html `
70
- <h1 class="heading">
71
- <slot></slot>
72
- </h1>
73
- `;
74
- }
75
- static {
76
- __runInitializers(_classThis, _classExtraInitializers);
77
- }
78
- };
79
- return OpsSectionHeading = _classThis;
80
- })();
81
- export { OpsSectionHeading };
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXNlY3Rpb25oZWFkaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzL3NoYXJlZC9vcHMtc2VjdGlvbmhlYWRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFDTCxXQUFXLEVBQ1gsR0FBRyxFQUNILFVBQVUsRUFDVixhQUFhLEVBQ2IsSUFBSSxFQUVMLE1BQU0sNkJBQTZCLENBQUM7SUFHeEIsaUJBQWlCOzRCQUQ3QixhQUFhLENBQUMsb0JBQW9CLENBQUM7Ozs7c0JBQ0csV0FBVztpQ0FBbkIsU0FBUSxXQUFXOzs7O1lBQWxELDZLQTJCQzs7OztRQTFCUSxNQUFNLENBQUMsTUFBTSxHQUFHO1lBQ3JCLFVBQVUsQ0FBQyxhQUFhO1lBQ3hCLEdBQUcsQ0FBQTs7Ozs7Ozs7OztpQkFVVSxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7Ozs7S0FJOUM7U0FDRixDQUFDO1FBRUssTUFBTTtZQUNYLE9BQU8sSUFBSSxDQUFBOzs7O0tBSVYsQ0FBQztRQUNKLENBQUM7O1lBMUJVLHVEQUFpQjs7Ozs7U0FBakIsaUJBQWlCIn0=
@@ -1,38 +0,0 @@
1
- import {
2
- DeesElement,
3
- css,
4
- cssManager,
5
- customElement,
6
- html,
7
- type TemplateResult
8
- } from '@design.estate/dees-element';
9
-
10
- @customElement('ops-sectionheading')
11
- export class OpsSectionHeading extends DeesElement {
12
- public static styles = [
13
- cssManager.defaultStyles,
14
- css`
15
- :host {
16
- display: block;
17
- margin-bottom: 24px;
18
- }
19
-
20
- .heading {
21
- font-family: 'Cal Sans', 'Inter', sans-serif;
22
- font-size: 28px;
23
- font-weight: 600;
24
- color: ${cssManager.bdTheme('#111', '#fff')};
25
- margin: 0;
26
- padding: 0;
27
- }
28
- `,
29
- ];
30
-
31
- public render(): TemplateResult {
32
- return html`
33
- <h1 class="heading">
34
- <slot></slot>
35
- </h1>
36
- `;
37
- }
38
- }