@alauda-fe/common 1.4.28-beta.6 → 1.4.29-beta.0

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 (39) hide show
  1. package/array-form-table/form/component.d.ts +1 -1
  2. package/chart/common/series/bar-path.component.d.ts +1 -1
  3. package/chart/common/tooltip/tooltip.component.d.ts +1 -1
  4. package/code/code-editor-configs.d.ts +2 -0
  5. package/code/managed-fields-folder.util.d.ts +35 -0
  6. package/code/public-api.d.ts +4 -0
  7. package/code/resource-yaml-display/component.d.ts +64 -6
  8. package/code/resource-yaml-editor/component.d.ts +95 -0
  9. package/code/yaml-examples.d.ts +8 -0
  10. package/code/yaml-sidebar/component.d.ts +57 -0
  11. package/code/yaml-sidebar/types.d.ts +21 -0
  12. package/core/abstract/base-nested-form-control.d.ts +1 -1
  13. package/core/directives/scroll-to-first-invalid.directive.d.ts +1 -1
  14. package/core/services/feature-gate.service.d.ts +1 -1
  15. package/core/services/kubernetes-schema.service.d.ts +44 -0
  16. package/core/services/public-api.d.ts +1 -0
  17. package/core/types/openapi.d.ts +37 -0
  18. package/core/types/public-api.d.ts +1 -0
  19. package/core/utils/version.d.ts +1 -1
  20. package/esm2022/code/code-editor-configs.mjs +12 -2
  21. package/esm2022/code/managed-fields-folder.util.mjs +147 -0
  22. package/esm2022/code/public-api.mjs +5 -1
  23. package/esm2022/code/resource-yaml-display/component.mjs +256 -42
  24. package/esm2022/code/resource-yaml-editor/component.mjs +392 -0
  25. package/esm2022/code/yaml-examples.mjs +337 -0
  26. package/esm2022/code/yaml-sidebar/component.mjs +482 -0
  27. package/esm2022/code/yaml-sidebar/types.mjs +2 -0
  28. package/esm2022/core/services/kubernetes-schema.service.mjs +129 -0
  29. package/esm2022/core/services/public-api.mjs +2 -1
  30. package/esm2022/core/services/workspace-helper.service.mjs +4 -3
  31. package/esm2022/core/types/openapi.mjs +2 -0
  32. package/esm2022/core/types/public-api.mjs +2 -1
  33. package/esm2022/exec/terminal-group/component.mjs +2 -2
  34. package/esm2022/translate/translate.service.mjs +2 -2
  35. package/package.json +1 -1
  36. package/styles/global.scss +4 -0
  37. package/table/component.d.ts +1 -1
  38. package/table/helper.d.ts +1 -1
  39. package/view-chart/view-chart.component.d.ts +1 -1
@@ -83,7 +83,7 @@ export declare class ArrayFormTableComponent implements OnDestroy {
83
83
  addDisabled: boolean | '';
84
84
  actionColumnDivider: boolean | '';
85
85
  showZeroState: boolean;
86
- get formDirective(): FormGroupDirective | NgForm;
86
+ get formDirective(): NgForm | FormGroupDirective;
87
87
  /**
88
88
  * 自定义是否展示错误内容
89
89
  * 例如 control 是 FormGroup,只有在内部子 control 错误时才需要展示错误内容
@@ -40,7 +40,7 @@ export declare class BarPathComponent implements OnInit {
40
40
  ngOnInit(): void;
41
41
  getRectY: (index: number, y: number) => number;
42
42
  getStackedRectY: (index: number) => number;
43
- handleVisibility: (name: string) => "" | "hidden";
43
+ handleVisibility: (name: string) => "hidden" | "";
44
44
  handleOpacity: (name: string | number | Date, activateLegend: string) => 1 | 0.2;
45
45
  static ɵfac: i0.ɵɵFactoryDeclaration<BarPathComponent, never>;
46
46
  static ɵcmp: i0.ɵɵComponentDeclaration<BarPathComponent, "g[aclBarPath]", never, { "stroke": { "alias": "stroke"; "required": false; }; "data": { "alias": "data"; "required": false; }; "barPadding": { "alias": "barPadding"; "required": false; }; "groupName": { "alias": "groupName"; "required": false; }; "type": { "alias": "type"; "required": false; }; "bandWidth": { "alias": "bandWidth"; "required": false; }; "adaptiveBandWidth": { "alias": "adaptiveBandWidth"; "required": false; }; }, {}, never, never, false, never>;
@@ -55,7 +55,7 @@ export declare class ChartTooltipComponent implements OnInit, OnDestroy {
55
55
  activeLegend: string;
56
56
  get typeStandard(): boolean;
57
57
  get isBand(): boolean;
58
- get anchorVisibility(): "" | "hidden";
58
+ get anchorVisibility(): "hidden" | "";
59
59
  get groupPosition(): {
60
60
  x1: number;
61
61
  x2: number;
@@ -15,5 +15,7 @@ export declare const commonOptions: IEditorConstructionOptions;
15
15
  export declare const readonlyOptions: IEditorConstructionOptions;
16
16
  export declare const yamlReadOptions: IEditorConstructionOptions;
17
17
  export declare const yamlWriteOptions: IEditorConstructionOptions;
18
+ export declare const yamlWriteMinimapOptions: IEditorConstructionOptions;
19
+ export declare const yamlReadMinimapOptions: IEditorConstructionOptions;
18
20
  export declare const textWriteOptions: IEditorConstructionOptions;
19
21
  export declare const logsReadOptions: IEditorConstructionOptions;
@@ -0,0 +1,35 @@
1
+ import { editor } from 'monaco-editor/esm/vs/editor/editor.api';
2
+ /**
3
+ * 自动折叠 managedFields 字段
4
+ * @param monacoEditor Monaco 编辑器实例
5
+ */
6
+ export declare function foldManagedFields(monacoEditor: editor.IStandaloneCodeEditor): void;
7
+ /**
8
+ * 编辑器实例获取器接口
9
+ */
10
+ export interface EditorInstanceProvider {
11
+ getEditorInstance(): editor.IStandaloneCodeEditor | null;
12
+ }
13
+ /**
14
+ * ManagedFields 自动折叠器
15
+ * 用于在内容变化时自动折叠 managedFields 字段
16
+ */
17
+ export declare class ManagedFieldsAutoFolder {
18
+ private subscription?;
19
+ private lastFoldedContent;
20
+ /**
21
+ * 开始监听内容变化并自动折叠
22
+ * @param editorProvider 编辑器实例提供者
23
+ * @param contentObservable 内容变化的 Observable
24
+ */
25
+ startAutoFold(editorProvider: EditorInstanceProvider, contentObservable: any): void;
26
+ /**
27
+ * 停止自动折叠
28
+ */
29
+ stopAutoFold(): void;
30
+ /**
31
+ * 手动执行一次折叠
32
+ * @param editorProvider 编辑器实例提供者
33
+ */
34
+ foldOnce(editorProvider: EditorInstanceProvider): void;
35
+ }
@@ -9,3 +9,7 @@ export * from './code-display-dialog/component';
9
9
  export * from './code-editor-configs';
10
10
  export * from './k8s-yaml-display-dialog/component';
11
11
  export * from './resource-yaml-display/component';
12
+ export * from './resource-yaml-editor/component';
13
+ export * from './yaml-sidebar/component';
14
+ export * from './yaml-sidebar/types';
15
+ export * from './yaml-examples';
@@ -1,20 +1,78 @@
1
+ import { MonacoLanguageService } from '@alauda/code-editor';
2
+ import { OnDestroy, AfterViewInit } from '@angular/core';
3
+ import { editor } from 'monaco-editor/esm/vs/editor/editor.api';
1
4
  import { BehaviorSubject, Observable } from 'rxjs';
2
- import { KubernetesResource, YamlUtilService, Arrayable } from '../../core/public-api';
5
+ import { KubernetesSchemaService } from '../../core/services/kubernetes-schema.service';
6
+ import { YamlUtilService } from '../../core/services/yaml-util.service';
7
+ import { Arrayable } from '../../core/types/helpers';
8
+ import { KubernetesResource } from '../../core/types/k8s/core';
9
+ import { OpenAPIV3SchemaObject } from '../../core/types/schema';
10
+ import { EditorInstanceProvider } from '../managed-fields-folder.util';
3
11
  import * as i0 from "@angular/core";
4
- export declare class ResourceYamlDisplayComponent<T extends KubernetesResource> {
5
- private readonly yamlUtil;
12
+ export declare class ResourceYamlDisplayComponent<T extends KubernetesResource> implements OnDestroy, AfterViewInit, EditorInstanceProvider {
13
+ readonly yamlUtil: YamlUtilService;
14
+ readonly schemaService: KubernetesSchemaService;
15
+ private readonly monacoLanguageService;
16
+ private destroy$;
6
17
  concise$$: BehaviorSubject<boolean>;
7
18
  reduce$$: BehaviorSubject<boolean>;
19
+ showSidebar$$: BehaviorSubject<boolean>;
20
+ showDebugPanel$$: BehaviorSubject<boolean>;
21
+ modelUri: string;
22
+ private yamlSchemaService;
23
+ private monacoEditor;
24
+ private registeredSchemas;
25
+ codeEditorRef: {
26
+ editor: editor.IStandaloneCodeEditor;
27
+ };
8
28
  hasWrapper: boolean;
29
+ showDebugInfo: boolean;
9
30
  conciseEnable: boolean;
10
31
  manageFieldActionEnable: boolean;
32
+ sidebarEnable: boolean;
33
+ schemaEnable: boolean;
34
+ exampleEnable: boolean;
35
+ autoFoldManagedFields: boolean;
36
+ schema: OpenAPIV3SchemaObject;
11
37
  resource: Arrayable<T>;
12
38
  readonly resource$: Observable<Arrayable<T>>;
13
- constructor(yamlUtil: YamlUtilService);
39
+ readonly schema$: Observable<OpenAPIV3SchemaObject>;
40
+ minimap: boolean;
41
+ yamlReadMinimapOptions: import("../code-editor-configs").IEditorConstructionOptions;
42
+ yamlReadOptions: import("../code-editor-configs").IEditorConstructionOptions;
43
+ hasFolded: boolean;
44
+ /**
45
+ * 自动获取的 schema,当没有手动提供 schema 时使用
46
+ */
47
+ autoSchema$: Observable<OpenAPIV3SchemaObject>;
48
+ /**
49
+ * 最终使用的 schema,优先使用手动提供的,否则使用自动获取的
50
+ */
51
+ finalSchema$: Observable<OpenAPIV3SchemaObject>;
52
+ constructor(yamlUtil: YamlUtilService, schemaService: KubernetesSchemaService, monacoLanguageService: MonacoLanguageService);
14
53
  yaml$: Observable<string>;
15
- editorOptions: import("../code-editor-configs").IEditorConstructionOptions;
54
+ get editorOptions(): import("../code-editor-configs").IEditorConstructionOptions;
16
55
  viewActions: import("@alauda/code-editor").CodeEditorActionsConfig;
17
56
  conciseChange(value: boolean): void;
57
+ toggleSidebar(): void;
58
+ toggleDebugInfo(): void;
59
+ getCurrentResource(): T | null;
60
+ getCurrentSchema(): OpenAPIV3SchemaObject | null;
61
+ selfFoldManagedFields(): void;
62
+ /**
63
+ * 设置 YAML schema 以提供 hover 提示和自动完成
64
+ */
65
+ setYamlSchema(resource: T, schema: OpenAPIV3SchemaObject): void;
66
+ ngAfterViewInit(): void;
67
+ /**
68
+ * 获取 Monaco Editor 实例
69
+ */
70
+ getEditorInstance(): editor.IStandaloneCodeEditor | null;
71
+ /**
72
+ * 自动折叠 managedFields 字段
73
+ */
74
+ foldManagedFields(): void;
75
+ ngOnDestroy(): void;
18
76
  static ɵfac: i0.ɵɵFactoryDeclaration<ResourceYamlDisplayComponent<any>, never>;
19
- static ɵcmp: i0.ɵɵComponentDeclaration<ResourceYamlDisplayComponent<any>, "acl-resource-yaml-display", never, { "hasWrapper": { "alias": "hasWrapper"; "required": false; }; "conciseEnable": { "alias": "conciseEnable"; "required": false; }; "manageFieldActionEnable": { "alias": "manageFieldActionEnable"; "required": false; }; "resource": { "alias": "resource"; "required": false; }; }, {}, never, never, true, never>;
77
+ static ɵcmp: i0.ɵɵComponentDeclaration<ResourceYamlDisplayComponent<any>, "acl-resource-yaml-display", never, { "hasWrapper": { "alias": "hasWrapper"; "required": false; }; "showDebugInfo": { "alias": "showDebugInfo"; "required": false; }; "conciseEnable": { "alias": "conciseEnable"; "required": false; }; "manageFieldActionEnable": { "alias": "manageFieldActionEnable"; "required": false; }; "sidebarEnable": { "alias": "sidebarEnable"; "required": false; }; "schemaEnable": { "alias": "schemaEnable"; "required": false; }; "exampleEnable": { "alias": "exampleEnable"; "required": false; }; "autoFoldManagedFields": { "alias": "autoFoldManagedFields"; "required": false; }; "schema": { "alias": "schema"; "required": false; }; "resource": { "alias": "resource"; "required": false; }; "minimap": { "alias": "minimap"; "required": false; }; }, {}, never, never, true, never>;
20
78
  }
@@ -0,0 +1,95 @@
1
+ import { MonacoLanguageService } from '@alauda/code-editor';
2
+ import { EventEmitter, OnDestroy, AfterViewInit } from '@angular/core';
3
+ import { ControlValueAccessor } from '@angular/forms';
4
+ import { BehaviorSubject, Observable } from 'rxjs';
5
+ import { KubernetesSchemaService } from '../../core/services/kubernetes-schema.service';
6
+ import { YamlUtilService } from '../../core/services/yaml-util.service';
7
+ import { Arrayable } from '../../core/types/helpers';
8
+ import { KubernetesResource } from '../../core/types/k8s/core';
9
+ import { OpenAPIV3SchemaObject } from '../../core/types/schema';
10
+ import { EditorInstanceProvider } from '../managed-fields-folder.util';
11
+ import { YamlExample } from '../yaml-sidebar/types';
12
+ import * as i0 from "@angular/core";
13
+ export declare class ResourceYamlEditorComponent<T extends KubernetesResource> implements ControlValueAccessor, OnDestroy, EditorInstanceProvider, AfterViewInit {
14
+ readonly yamlUtil: YamlUtilService;
15
+ readonly schemaService: KubernetesSchemaService;
16
+ private readonly monacoLanguageService;
17
+ private destroy$;
18
+ private _value;
19
+ private _originalValue;
20
+ private onChange;
21
+ private onTouched;
22
+ showSidebar$$: BehaviorSubject<boolean>;
23
+ showDebugPanel$$: BehaviorSubject<boolean>;
24
+ modelUri: string;
25
+ private yamlSchemaService;
26
+ private monacoEditor;
27
+ private registeredSchemas;
28
+ private codeEditorRef;
29
+ hasWrapper: boolean;
30
+ showDebugInfo: boolean;
31
+ sidebarEnable: boolean;
32
+ schema: OpenAPIV3SchemaObject;
33
+ schemaEnable: boolean;
34
+ exampleEnable: boolean;
35
+ resource: Arrayable<T>;
36
+ autoFoldManagedFields: boolean;
37
+ set originalValue(value: string);
38
+ get originalValue(): string;
39
+ options: import("../code-editor-configs").IEditorConstructionOptions;
40
+ actionsConfig: import("@alauda/code-editor").CodeEditorActionsConfig;
41
+ tryYaml: EventEmitter<string>;
42
+ readonly resource$: Observable<Arrayable<T>>;
43
+ readonly schema$: Observable<OpenAPIV3SchemaObject>;
44
+ autoFillNamespace: boolean;
45
+ extraExamples: YamlExample[];
46
+ hasFolded: boolean;
47
+ /**
48
+ * 自动获取的 schema,当没有手动提供 schema 时使用
49
+ */
50
+ autoSchema$: Observable<OpenAPIV3SchemaObject>;
51
+ /**
52
+ * 最终使用的 schema,优先使用手动提供的,否则使用自动获取的
53
+ */
54
+ finalSchema$: Observable<OpenAPIV3SchemaObject>;
55
+ constructor(yamlUtil: YamlUtilService, schemaService: KubernetesSchemaService, monacoLanguageService: MonacoLanguageService);
56
+ ngAfterViewInit(): void;
57
+ selfFoldManagedFields(): void;
58
+ get value(): string;
59
+ set value(val: string);
60
+ writeValue(value: string): void;
61
+ registerOnChange(fn: (value: string) => void): void;
62
+ registerOnTouched(fn: () => void): void;
63
+ toggleSidebar(): void;
64
+ toggleDebugInfo(): void;
65
+ getCurrentResource(): T | null;
66
+ getCurrentSchema(): OpenAPIV3SchemaObject | null;
67
+ getDebugInfo(): {
68
+ hasResource: boolean;
69
+ resourceApiVersion: string;
70
+ resourceKind: string;
71
+ hasManualSchema: boolean;
72
+ workspaceHelperAvailable: boolean;
73
+ currentWorkspace: Readonly<{
74
+ project: string;
75
+ cluster: string;
76
+ namespace: string;
77
+ }>;
78
+ };
79
+ onTryYaml(yamlContent: string): void;
80
+ /**
81
+ * 设置 YAML schema 以提供 hover 提示和自动完成
82
+ */
83
+ setYamlSchema(resource: T, schema: OpenAPIV3SchemaObject): void;
84
+ /**
85
+ * 获取 Monaco 编辑器实例
86
+ */
87
+ getEditorInstance(): import('monaco-editor').editor.IStandaloneCodeEditor | null;
88
+ /**
89
+ * 手动折叠 managedFields
90
+ */
91
+ foldManagedFields(): void;
92
+ ngOnDestroy(): void;
93
+ static ɵfac: i0.ɵɵFactoryDeclaration<ResourceYamlEditorComponent<any>, never>;
94
+ static ɵcmp: i0.ɵɵComponentDeclaration<ResourceYamlEditorComponent<any>, "acl-resource-yaml-editor", never, { "hasWrapper": { "alias": "hasWrapper"; "required": false; }; "showDebugInfo": { "alias": "showDebugInfo"; "required": false; }; "sidebarEnable": { "alias": "sidebarEnable"; "required": false; }; "schema": { "alias": "schema"; "required": false; }; "schemaEnable": { "alias": "schemaEnable"; "required": false; }; "exampleEnable": { "alias": "exampleEnable"; "required": false; }; "resource": { "alias": "resource"; "required": false; }; "autoFoldManagedFields": { "alias": "autoFoldManagedFields"; "required": false; }; "originalValue": { "alias": "originalValue"; "required": false; }; "options": { "alias": "options"; "required": false; }; "actionsConfig": { "alias": "actionsConfig"; "required": false; }; "autoFillNamespace": { "alias": "autoFillNamespace"; "required": false; }; "extraExamples": { "alias": "extraExamples"; "required": false; }; }, { "tryYaml": "tryYaml"; }, never, never, true, never>;
95
+ }
@@ -0,0 +1,8 @@
1
+ import { YamlExample } from './yaml-sidebar/types';
2
+ /**
3
+ * Kubernetes 资源的内置 YAML 示例
4
+ * 按照 apiVersion.kind 的格式组织
5
+ */
6
+ export declare const BUILT_IN_YAML_EXAMPLES: {
7
+ [key: string]: YamlExample[];
8
+ };
@@ -0,0 +1,57 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { OnInit, OnChanges, SimpleChanges, EventEmitter, ChangeDetectorRef } from '@angular/core';
3
+ import { KubernetesSchemaService } from '../../core/services/kubernetes-schema.service';
4
+ import { KubernetesResource } from '../../core/types/k8s/core';
5
+ import { OpenAPIV3SchemaObject } from '../../core/types/schema';
6
+ import { YamlExample } from './types';
7
+ import * as i0 from "@angular/core";
8
+ export declare class ResourceYamlSidebarComponent implements OnInit, OnChanges {
9
+ private schemaService;
10
+ private http;
11
+ private cdr;
12
+ resource: KubernetesResource;
13
+ schema: OpenAPIV3SchemaObject;
14
+ close: EventEmitter<void>;
15
+ tryYaml: EventEmitter<string>;
16
+ schemaEnable: boolean;
17
+ exampleEnable: boolean;
18
+ extraExamples: YamlExample[];
19
+ private readonly DEFINITIONS_PREFIX;
20
+ currentSchema: OpenAPIV3SchemaObject;
21
+ properties: {
22
+ [key: string]: OpenAPIV3SchemaObject;
23
+ };
24
+ path: string[];
25
+ resourceKind: string;
26
+ examples: YamlExample[];
27
+ hasSchema: boolean;
28
+ hasExamples: boolean;
29
+ constructor(schemaService: KubernetesSchemaService, http: HttpClient, cdr: ChangeDetectorRef);
30
+ ngOnInit(): void;
31
+ ngOnChanges(changes: SimpleChanges): void;
32
+ refresh(): void;
33
+ private loadExamples;
34
+ private loadConsoleYAMLSamples;
35
+ drillDownToProperty(name: string): void;
36
+ navigateToPath(index: number): void;
37
+ hasNestedProperties(property: OpenAPIV3SchemaObject): boolean;
38
+ getPropertyType(property: OpenAPIV3SchemaObject): string;
39
+ isRequired(propertyName: string): boolean;
40
+ /**
41
+ * 检查属性是否有 $ref 引用或嵌套属性
42
+ */
43
+ hasViewableContent(property: OpenAPIV3SchemaObject): boolean;
44
+ /**
45
+ * 检查属性是否有 $ref 引用
46
+ */
47
+ hasRefProperty(property: OpenAPIV3SchemaObject): boolean;
48
+ /**
49
+ * 获取 $ref 引用的定义名称
50
+ */
51
+ getRefDefinitionName(property: OpenAPIV3SchemaObject): string;
52
+ tryExample(example: YamlExample): void;
53
+ downloadYaml(example: YamlExample): void;
54
+ processDescription(description: string): string;
55
+ static ɵfac: i0.ɵɵFactoryDeclaration<ResourceYamlSidebarComponent, never>;
56
+ static ɵcmp: i0.ɵɵComponentDeclaration<ResourceYamlSidebarComponent, "acl-resource-yaml-sidebar", never, { "resource": { "alias": "resource"; "required": false; }; "schema": { "alias": "schema"; "required": false; }; "schemaEnable": { "alias": "schemaEnable"; "required": false; }; "exampleEnable": { "alias": "exampleEnable"; "required": false; }; "extraExamples": { "alias": "extraExamples"; "required": false; }; }, { "close": "close"; "tryYaml": "tryYaml"; }, never, never, true, never>;
57
+ }
@@ -0,0 +1,21 @@
1
+ export interface YamlExample {
2
+ title: string;
3
+ description: string;
4
+ yaml: string;
5
+ snippet?: boolean;
6
+ }
7
+ export interface ConsoleYAMLSample {
8
+ metadata: {
9
+ name: string;
10
+ };
11
+ spec: {
12
+ title: string;
13
+ description: string;
14
+ yaml: string;
15
+ snippet?: boolean;
16
+ targetResource: {
17
+ apiVersion: string;
18
+ kind: string;
19
+ };
20
+ };
21
+ }
@@ -21,7 +21,7 @@ export declare class BaseNestedFormControl<V, M = V> implements AfterViewInit, O
21
21
  protected asyncValidator: boolean;
22
22
  protected cdr: ChangeDetectorRef;
23
23
  protected destroy$$: Subject<void>;
24
- protected hostForm: FormGroupDirective | NgForm;
24
+ protected hostForm: NgForm | FormGroupDirective;
25
25
  constructor();
26
26
  ngAfterViewInit(): void;
27
27
  ngOnDestroy(): void;
@@ -13,7 +13,7 @@ export declare class ScrollToFirstInvalidDirective {
13
13
  private readonly cdkScrollable;
14
14
  labelOffset: number;
15
15
  aclScrollToFirstInvalid: boolean | '';
16
- get containerEl(): HTMLElement | (Window & typeof globalThis);
16
+ get containerEl(): (Window & typeof globalThis) | HTMLElement;
17
17
  onSubmit(): void;
18
18
  constructor(elRef: ElementRef<HTMLElement>, controlContainer: ControlContainer, cdkScrollable: CdkScrollable);
19
19
  scrollToFirstInvalid(): void;
@@ -9,7 +9,7 @@ export declare class FeatureGateService {
9
9
  private readonly http;
10
10
  private readonly cacheStore;
11
11
  constructor(http: HttpClient);
12
- loadState(cluster?: string): Observable<"loaded" | "loadFailed" | "loading">;
12
+ loadState(cluster?: string): Observable<"loading" | "loaded" | "loadFailed">;
13
13
  /**
14
14
  * check gate status
15
15
  * @param gate - specified feature gate
@@ -0,0 +1,44 @@
1
+ import { Observable } from 'rxjs';
2
+ import { OpenAPIV2Document } from '../types/openapi';
3
+ import { OpenAPIV3SchemaObject } from '../types/schema';
4
+ import { WorkspaceHelperService } from './workspace-helper.service';
5
+ import * as i0 from "@angular/core";
6
+ export declare class KubernetesSchemaService {
7
+ private readonly http;
8
+ readonly workspaceHelper: WorkspaceHelperService;
9
+ private initialized;
10
+ private readonly schemaCache;
11
+ private readonly schemaCache$$;
12
+ get definitions(): Record<string, OpenAPIV3SchemaObject>;
13
+ private ensureInitialized;
14
+ /**
15
+ * 获取当前集群的 OpenAPI schema
16
+ */
17
+ getOpenAPISchema(): Observable<OpenAPIV2Document | null>;
18
+ /**
19
+ * 根据 Kubernetes 资源类型获取对应的 schema
20
+ */
21
+ getResourceSchema(apiVersion: string, kind: string): Observable<OpenAPIV3SchemaObject | null>;
22
+ /**
23
+ * 获取所有可用的资源定义
24
+ */
25
+ getAllResourceDefinitions(): Observable<Record<string, OpenAPIV3SchemaObject> | null>;
26
+ /**
27
+ * 清理缓存
28
+ */
29
+ clearCache(): void;
30
+ /**
31
+ * 获取缓存状态
32
+ */
33
+ getCacheStatus(): Observable<Map<string, OpenAPIV2Document>>;
34
+ /**
35
+ * 检查 WorkspaceHelperService 是否可用
36
+ */
37
+ isWorkspaceHelperAvailable(): boolean;
38
+ /**
39
+ * 从 Kubernetes API 获取 OpenAPI schema
40
+ */
41
+ private fetchOpenAPISchema;
42
+ static ɵfac: i0.ɵɵFactoryDeclaration<KubernetesSchemaService, never>;
43
+ static ɵprov: i0.ɵɵInjectableDeclaration<KubernetesSchemaService>;
44
+ }
@@ -4,6 +4,7 @@ export * from './custom-code-editor-intl.service';
4
4
  export * from './feature-gate.service';
5
5
  export * from './intercept-deactivate.service';
6
6
  export * from './k8s-util.service';
7
+ export * from './kubernetes-schema.service';
7
8
  export * from './silently-navigate.service';
8
9
  export * from './time.service';
9
10
  export * from './ui-state.service';
@@ -0,0 +1,37 @@
1
+ import { OpenAPIV3SchemaObject } from './schema';
2
+ export interface OpenAPIV2Document {
3
+ swagger: string;
4
+ info: {
5
+ title: string;
6
+ version: string;
7
+ description?: string;
8
+ };
9
+ host?: string;
10
+ basePath?: string;
11
+ schemes?: string[];
12
+ consumes?: string[];
13
+ produces?: string[];
14
+ paths: Record<string, any>;
15
+ definitions: Record<string, OpenAPIV3SchemaObject>;
16
+ parameters?: Record<string, any>;
17
+ responses?: Record<string, any>;
18
+ securityDefinitions?: Record<string, any>;
19
+ security?: any[];
20
+ tags?: any[];
21
+ externalDocs?: any;
22
+ }
23
+ export interface SchemaProperty {
24
+ name: string;
25
+ type: string;
26
+ description?: string;
27
+ required: boolean;
28
+ properties?: {
29
+ [key: string]: OpenAPIV3SchemaObject;
30
+ };
31
+ items?: OpenAPIV3SchemaObject;
32
+ }
33
+ export interface SchemaBreadcrumb {
34
+ name: string;
35
+ path: string[];
36
+ schema: OpenAPIV3SchemaObject;
37
+ }
@@ -5,6 +5,7 @@
5
5
  */
6
6
  export * from './commons';
7
7
  export * from './helpers';
8
+ export * from './openapi';
8
9
  export * from './schema';
9
10
  export * from './resource-definitions';
10
11
  export * from './k8s/public-api';
@@ -36,4 +36,4 @@ export declare const compareVersion: {
36
36
  gte: (v1: string, v2: string) => boolean;
37
37
  cmp: (v1: string, v2: string, operator: CompareOperator) => boolean;
38
38
  };
39
- export declare const compareMinorVersion: (v1: string, v2: string) => 0 | 1 | -1;
39
+ export declare const compareMinorVersion: (v1: string, v2: string) => 1 | 0 | -1;
@@ -34,9 +34,9 @@ export const logsActions = {
34
34
  };
35
35
  export const commonOptions = {
36
36
  folding: true,
37
- minimap: { enabled: false },
38
37
  wordWrap: 'on',
39
38
  tabSize: 2,
39
+ minimap: { enabled: false },
40
40
  scrollbar: {
41
41
  alwaysConsumeMouseWheel: false,
42
42
  },
@@ -53,6 +53,16 @@ export const yamlWriteOptions = {
53
53
  language: 'yaml',
54
54
  ...commonOptions,
55
55
  };
56
+ export const yamlWriteMinimapOptions = {
57
+ language: 'yaml',
58
+ ...commonOptions,
59
+ minimap: { enabled: true },
60
+ };
61
+ export const yamlReadMinimapOptions = {
62
+ language: 'yaml',
63
+ ...readonlyOptions,
64
+ minimap: { enabled: true },
65
+ };
56
66
  export const textWriteOptions = {
57
67
  language: 'text',
58
68
  ...commonOptions,
@@ -63,4 +73,4 @@ export const logsReadOptions = {
63
73
  readOnly: true,
64
74
  renderLineHighlight: 'none',
65
75
  };
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3ItY29uZmlncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jb2RlL2NvZGUtZWRpdG9yLWNvbmZpZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBVUgsTUFBTSxhQUFhLEdBQTRCO0lBQzdDLElBQUksRUFBRSxJQUFJO0lBQ1YsSUFBSSxFQUFFLElBQUk7SUFDVixNQUFNLEVBQUUsSUFBSTtDQUNiLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQTRCO0lBQ3BELFFBQVEsRUFBRSxLQUFLO0lBQ2YsS0FBSyxFQUFFLElBQUk7SUFDWCxPQUFPLEVBQUUsS0FBSztJQUNkLE1BQU0sRUFBRSxJQUFJO0lBQ1osR0FBRyxhQUFhO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQTRCO0lBQ2xELFFBQVEsRUFBRSxLQUFLO0lBQ2YsS0FBSyxFQUFFLEtBQUs7SUFDWixPQUFPLEVBQUUsS0FBSztJQUNkLE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxhQUFhO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQTRCO0lBQ3BELFFBQVEsRUFBRSxJQUFJLEVBQUUsaUlBQWlJO0lBQ2pKLEtBQUssRUFBRSxJQUFJO0lBQ1gsT0FBTyxFQUFFLElBQUk7SUFDYixNQUFNLEVBQUUsSUFBSTtJQUNaLEdBQUcsYUFBYTtDQUNqQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUE0QjtJQUNsRCxHQUFHLFdBQVc7SUFDZCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQStCO0lBQ3ZELE9BQU8sRUFBRSxJQUFJO0lBQ2IsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtJQUMzQixRQUFRLEVBQUUsSUFBSTtJQUNkLE9BQU8sRUFBRSxDQUFDO0lBQ1YsU0FBUyxFQUFFO1FBQ1QsdUJBQXVCLEVBQUUsS0FBSztLQUMvQjtDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQStCO0lBQ3pELEdBQUcsYUFBYTtJQUNoQixRQUFRLEVBQUUsSUFBSTtDQUNmLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQStCO0lBQ3pELFFBQVEsRUFBRSxNQUFNO0lBQ2hCLEdBQUcsZUFBZTtDQUNuQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQStCO0lBQzFELFFBQVEsRUFBRSxNQUFNO0lBQ2hCLEdBQUcsYUFBYTtDQUNqQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQStCO0lBQzFELFFBQVEsRUFBRSxNQUFNO0lBQ2hCLEdBQUcsYUFBYTtDQUNqQixDQUFDO0FBRUYsV0FBVztBQUNYLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBK0I7SUFDekQsUUFBUSxFQUFFLElBQUk7SUFDZCxRQUFRLEVBQUUsSUFBSTtJQUNkLG1CQUFtQixFQUFFLE1BQU07Q0FDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBAbW9kdWxlIGNvZGVcbiAqL1xuXG5pbXBvcnQgeyBDb2RlRWRpdG9yQWN0aW9uc0NvbmZpZyB9IGZyb20gJ0BhbGF1ZGEvY29kZS1lZGl0b3InO1xuXG5leHBvcnQgdHlwZSBJRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9XG4gIGltcG9ydCgnbW9uYWNvLWVkaXRvci9lc20vdnMvZWRpdG9yL2VkaXRvci5hcGknKS5lZGl0b3IuSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgJiB7XG4gICAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG4gICAgdGFiU2l6ZT86IG51bWJlcjtcbiAgfTtcblxuY29uc3QgY29tbW9uQWN0aW9uczogQ29kZUVkaXRvckFjdGlvbnNDb25maWcgPSB7XG4gIGNvcHk6IHRydWUsXG4gIGZpbmQ6IHRydWUsXG4gIGV4cG9ydDogdHJ1ZSxcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVBY3Rpb25zOiBDb2RlRWRpdG9yQWN0aW9uc0NvbmZpZyA9IHtcbiAgZGlmZk1vZGU6IGZhbHNlLFxuICBjbGVhcjogdHJ1ZSxcbiAgcmVjb3ZlcjogZmFsc2UsXG4gIGltcG9ydDogdHJ1ZSxcbiAgLi4uY29tbW9uQWN0aW9ucyxcbn07XG5cbmV4cG9ydCBjb25zdCB2aWV3QWN0aW9uczogQ29kZUVkaXRvckFjdGlvbnNDb25maWcgPSB7XG4gIGRpZmZNb2RlOiBmYWxzZSxcbiAgY2xlYXI6IGZhbHNlLFxuICByZWNvdmVyOiBmYWxzZSxcbiAgaW1wb3J0OiBmYWxzZSxcbiAgLi4uY29tbW9uQWN0aW9ucyxcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY3Rpb25zOiBDb2RlRWRpdG9yQWN0aW9uc0NvbmZpZyA9IHtcbiAgZGlmZk1vZGU6IHRydWUsIC8vIGlmIHRydWUsIHlvdSBzaG91bGQgYWxzbyBzZXQgJ29yaWdpbmFsVmFsdWUnIGF0dHJpYnV0ZSwgZWc6IDxhdWktY29kZS1lZGl0b3IgW29yaWdpbmFsVmFsdWVdPVwib3JpZ2luYWxGaWxlXCI+PC9hdWktY29kZS1lZGl0b3I+XG4gIGNsZWFyOiB0cnVlLFxuICByZWNvdmVyOiB0cnVlLFxuICBpbXBvcnQ6IHRydWUsXG4gIC4uLmNvbW1vbkFjdGlvbnMsXG59O1xuXG5leHBvcnQgY29uc3QgbG9nc0FjdGlvbnM6IENvZGVFZGl0b3JBY3Rpb25zQ29uZmlnID0ge1xuICAuLi52aWV3QWN0aW9ucyxcbiAgdGhlbWU6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgY29tbW9uT3B0aW9uczogSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIGZvbGRpbmc6IHRydWUsXG4gIG1pbmltYXA6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgd29yZFdyYXA6ICdvbicsXG4gIHRhYlNpemU6IDIsXG4gIHNjcm9sbGJhcjoge1xuICAgIGFsd2F5c0NvbnN1bWVNb3VzZVdoZWVsOiBmYWxzZSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCByZWFkb25seU9wdGlvbnM6IElFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zID0ge1xuICAuLi5jb21tb25PcHRpb25zLFxuICByZWFkT25seTogdHJ1ZSxcbn07XG5cbmV4cG9ydCBjb25zdCB5YW1sUmVhZE9wdGlvbnM6IElFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zID0ge1xuICBsYW5ndWFnZTogJ3lhbWwnLFxuICAuLi5yZWFkb25seU9wdGlvbnMsXG59O1xuXG5leHBvcnQgY29uc3QgeWFtbFdyaXRlT3B0aW9uczogSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIGxhbmd1YWdlOiAneWFtbCcsXG4gIC4uLmNvbW1vbk9wdGlvbnMsXG59O1xuXG5leHBvcnQgY29uc3QgdGV4dFdyaXRlT3B0aW9uczogSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIGxhbmd1YWdlOiAndGV4dCcsXG4gIC4uLmNvbW1vbk9wdGlvbnMsXG59O1xuXG4vLyBmb3IgbG9nc1xuZXhwb3J0IGNvbnN0IGxvZ3NSZWFkT3B0aW9uczogSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIHdvcmRXcmFwOiAnb24nLFxuICByZWFkT25seTogdHJ1ZSxcbiAgcmVuZGVyTGluZUhpZ2hsaWdodDogJ25vbmUnLFxufTtcbiJdfQ==
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3ItY29uZmlncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jb2RlL2NvZGUtZWRpdG9yLWNvbmZpZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBVUgsTUFBTSxhQUFhLEdBQTRCO0lBQzdDLElBQUksRUFBRSxJQUFJO0lBQ1YsSUFBSSxFQUFFLElBQUk7SUFDVixNQUFNLEVBQUUsSUFBSTtDQUNiLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQTRCO0lBQ3BELFFBQVEsRUFBRSxLQUFLO0lBQ2YsS0FBSyxFQUFFLElBQUk7SUFDWCxPQUFPLEVBQUUsS0FBSztJQUNkLE1BQU0sRUFBRSxJQUFJO0lBQ1osR0FBRyxhQUFhO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQTRCO0lBQ2xELFFBQVEsRUFBRSxLQUFLO0lBQ2YsS0FBSyxFQUFFLEtBQUs7SUFDWixPQUFPLEVBQUUsS0FBSztJQUNkLE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxhQUFhO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQTRCO0lBQ3BELFFBQVEsRUFBRSxJQUFJLEVBQUUsaUlBQWlJO0lBQ2pKLEtBQUssRUFBRSxJQUFJO0lBQ1gsT0FBTyxFQUFFLElBQUk7SUFDYixNQUFNLEVBQUUsSUFBSTtJQUNaLEdBQUcsYUFBYTtDQUNqQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUE0QjtJQUNsRCxHQUFHLFdBQVc7SUFDZCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQStCO0lBQ3ZELE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLElBQUk7SUFDZCxPQUFPLEVBQUUsQ0FBQztJQUNWLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDM0IsU0FBUyxFQUFFO1FBQ1QsdUJBQXVCLEVBQUUsS0FBSztLQUMvQjtDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQStCO0lBQ3pELEdBQUcsYUFBYTtJQUNoQixRQUFRLEVBQUUsSUFBSTtDQUNmLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQStCO0lBQ3pELFFBQVEsRUFBRSxNQUFNO0lBQ2hCLEdBQUcsZUFBZTtDQUNuQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQStCO0lBQzFELFFBQVEsRUFBRSxNQUFNO0lBQ2hCLEdBQUcsYUFBYTtDQUNqQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQStCO0lBQ2pFLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLEdBQUcsYUFBYTtJQUNoQixPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO0NBQzNCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBK0I7SUFDaEUsUUFBUSxFQUFFLE1BQU07SUFDaEIsR0FBRyxlQUFlO0lBQ2xCLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7Q0FDM0IsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUErQjtJQUMxRCxRQUFRLEVBQUUsTUFBTTtJQUNoQixHQUFHLGFBQWE7Q0FDakIsQ0FBQztBQUVGLFdBQVc7QUFDWCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQStCO0lBQ3pELFFBQVEsRUFBRSxJQUFJO0lBQ2QsUUFBUSxFQUFFLElBQUk7SUFDZCxtQkFBbUIsRUFBRSxNQUFNO0NBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSBjb2RlXG4gKi9cblxuaW1wb3J0IHsgQ29kZUVkaXRvckFjdGlvbnNDb25maWcgfSBmcm9tICdAYWxhdWRhL2NvZGUtZWRpdG9yJztcblxuZXhwb3J0IHR5cGUgSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPVxuICBpbXBvcnQoJ21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9lZGl0b3IuYXBpJykuZWRpdG9yLklFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zICYge1xuICAgIGxhbmd1YWdlPzogc3RyaW5nO1xuICAgIHRhYlNpemU/OiBudW1iZXI7XG4gIH07XG5cbmNvbnN0IGNvbW1vbkFjdGlvbnM6IENvZGVFZGl0b3JBY3Rpb25zQ29uZmlnID0ge1xuICBjb3B5OiB0cnVlLFxuICBmaW5kOiB0cnVlLFxuICBleHBvcnQ6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQWN0aW9uczogQ29kZUVkaXRvckFjdGlvbnNDb25maWcgPSB7XG4gIGRpZmZNb2RlOiBmYWxzZSxcbiAgY2xlYXI6IHRydWUsXG4gIHJlY292ZXI6IGZhbHNlLFxuICBpbXBvcnQ6IHRydWUsXG4gIC4uLmNvbW1vbkFjdGlvbnMsXG59O1xuXG5leHBvcnQgY29uc3Qgdmlld0FjdGlvbnM6IENvZGVFZGl0b3JBY3Rpb25zQ29uZmlnID0ge1xuICBkaWZmTW9kZTogZmFsc2UsXG4gIGNsZWFyOiBmYWxzZSxcbiAgcmVjb3ZlcjogZmFsc2UsXG4gIGltcG9ydDogZmFsc2UsXG4gIC4uLmNvbW1vbkFjdGlvbnMsXG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aW9uczogQ29kZUVkaXRvckFjdGlvbnNDb25maWcgPSB7XG4gIGRpZmZNb2RlOiB0cnVlLCAvLyBpZiB0cnVlLCB5b3Ugc2hvdWxkIGFsc28gc2V0ICdvcmlnaW5hbFZhbHVlJyBhdHRyaWJ1dGUsIGVnOiA8YXVpLWNvZGUtZWRpdG9yIFtvcmlnaW5hbFZhbHVlXT1cIm9yaWdpbmFsRmlsZVwiPjwvYXVpLWNvZGUtZWRpdG9yPlxuICBjbGVhcjogdHJ1ZSxcbiAgcmVjb3ZlcjogdHJ1ZSxcbiAgaW1wb3J0OiB0cnVlLFxuICAuLi5jb21tb25BY3Rpb25zLFxufTtcblxuZXhwb3J0IGNvbnN0IGxvZ3NBY3Rpb25zOiBDb2RlRWRpdG9yQWN0aW9uc0NvbmZpZyA9IHtcbiAgLi4udmlld0FjdGlvbnMsXG4gIHRoZW1lOiB0cnVlLFxufTtcblxuZXhwb3J0IGNvbnN0IGNvbW1vbk9wdGlvbnM6IElFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zID0ge1xuICBmb2xkaW5nOiB0cnVlLFxuICB3b3JkV3JhcDogJ29uJyxcbiAgdGFiU2l6ZTogMixcbiAgbWluaW1hcDogeyBlbmFibGVkOiBmYWxzZSB9LFxuICBzY3JvbGxiYXI6IHtcbiAgICBhbHdheXNDb25zdW1lTW91c2VXaGVlbDogZmFsc2UsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgcmVhZG9ubHlPcHRpb25zOiBJRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHtcbiAgLi4uY29tbW9uT3B0aW9ucyxcbiAgcmVhZE9ubHk6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgeWFtbFJlYWRPcHRpb25zOiBJRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHtcbiAgbGFuZ3VhZ2U6ICd5YW1sJyxcbiAgLi4ucmVhZG9ubHlPcHRpb25zLFxufTtcblxuZXhwb3J0IGNvbnN0IHlhbWxXcml0ZU9wdGlvbnM6IElFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zID0ge1xuICBsYW5ndWFnZTogJ3lhbWwnLFxuICAuLi5jb21tb25PcHRpb25zLFxufTtcblxuZXhwb3J0IGNvbnN0IHlhbWxXcml0ZU1pbmltYXBPcHRpb25zOiBJRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHtcbiAgbGFuZ3VhZ2U6ICd5YW1sJyxcbiAgLi4uY29tbW9uT3B0aW9ucyxcbiAgbWluaW1hcDogeyBlbmFibGVkOiB0cnVlIH0sXG59O1xuXG5leHBvcnQgY29uc3QgeWFtbFJlYWRNaW5pbWFwT3B0aW9uczogSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIGxhbmd1YWdlOiAneWFtbCcsXG4gIC4uLnJlYWRvbmx5T3B0aW9ucyxcbiAgbWluaW1hcDogeyBlbmFibGVkOiB0cnVlIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGV4dFdyaXRlT3B0aW9uczogSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIGxhbmd1YWdlOiAndGV4dCcsXG4gIC4uLmNvbW1vbk9wdGlvbnMsXG59O1xuXG4vLyBmb3IgbG9nc1xuZXhwb3J0IGNvbnN0IGxvZ3NSZWFkT3B0aW9uczogSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIHdvcmRXcmFwOiAnb24nLFxuICByZWFkT25seTogdHJ1ZSxcbiAgcmVuZGVyTGluZUhpZ2hsaWdodDogJ25vbmUnLFxufTtcbiJdfQ==