@alauda-fe/common 1.4.28-beta.5 → 1.4.28-beta.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/array-form-table/form/component.d.ts +1 -1
- package/code/code-editor-configs.d.ts +0 -2
- package/code/public-api.d.ts +0 -4
- package/code/resource-yaml-display/component.d.ts +6 -64
- package/core/abstract/base-nested-form-control.d.ts +1 -1
- package/core/constants/constants.d.ts +0 -3
- package/core/services/intercept-deactivate.service.d.ts +2 -2
- package/core/services/public-api.d.ts +0 -1
- package/core/services/time.service.d.ts +2 -8
- package/core/types/public-api.d.ts +0 -1
- package/esm2022/code/code-editor-configs.mjs +2 -12
- package/esm2022/code/public-api.mjs +1 -5
- package/esm2022/code/resource-yaml-display/component.mjs +42 -256
- package/esm2022/core/constants/constants.mjs +1 -4
- package/esm2022/core/guards/intercept-deactivate.guard.mjs +2 -2
- package/esm2022/core/services/intercept-deactivate.service.mjs +1 -1
- package/esm2022/core/services/public-api.mjs +1 -2
- package/esm2022/core/services/time.service.mjs +36 -13
- package/esm2022/core/services/workspace-helper.service.mjs +3 -4
- package/esm2022/core/types/public-api.mjs +1 -2
- package/esm2022/exec/terminal-group/component.mjs +2 -2
- package/esm2022/page-scaffold/page/page.module.mjs +6 -5
- package/esm2022/page-scaffold/page-header/help-menu/module.mjs +9 -8
- package/esm2022/table/module.mjs +12 -11
- package/esm2022/translate/constants.mjs +1 -2
- package/esm2022/translate/intl-format.pipes.mjs +293 -0
- package/esm2022/translate/public-api.mjs +4 -3
- package/esm2022/translate/relative-time-manager.service.mjs +87 -0
- package/esm2022/translate/translate.directive.mjs +5 -4
- package/esm2022/translate/translate.module.mjs +22 -3
- package/esm2022/translate/translate.pipe.mjs +7 -8
- package/esm2022/translate/translate.service.mjs +721 -142
- package/esm2022/translate/types.mjs +1 -1
- package/package.json +2 -2
- package/page-scaffold/page/page.module.d.ts +4 -3
- package/page-scaffold/page-header/help-menu/module.d.ts +2 -1
- package/styles/global.scss +0 -4
- package/table/component.d.ts +1 -1
- package/table/module.d.ts +2 -1
- package/translate/intl-format.pipes.d.ts +122 -0
- package/translate/public-api.d.ts +3 -2
- package/translate/relative-time-manager.service.d.ts +32 -0
- package/translate/translate.module.d.ts +4 -2
- package/translate/translate.pipe.d.ts +4 -5
- package/translate/translate.service.d.ts +292 -20
- package/translate/types.d.ts +16 -0
- package/code/managed-fields-folder.util.d.ts +0 -35
- package/code/resource-yaml-display/schema/component.d.ts +0 -61
- package/code/resource-yaml-editor/component.d.ts +0 -95
- package/code/yaml-examples.d.ts +0 -8
- package/code/yaml-sidebar/component.d.ts +0 -57
- package/code/yaml-sidebar/types.d.ts +0 -21
- package/code/yaml-sidebar/yaml-examples.d.ts +0 -8
- package/core/services/kubernetes-schema.service.d.ts +0 -44
- package/core/types/openapi.d.ts +0 -37
- package/esm2022/code/managed-fields-folder.util.mjs +0 -147
- package/esm2022/code/resource-yaml-display/schema/component.mjs +0 -531
- package/esm2022/code/resource-yaml-editor/component.mjs +0 -392
- package/esm2022/code/yaml-examples.mjs +0 -337
- package/esm2022/code/yaml-sidebar/component.mjs +0 -482
- package/esm2022/code/yaml-sidebar/types.mjs +0 -2
- package/esm2022/code/yaml-sidebar/yaml-examples.mjs +0 -340
- package/esm2022/core/services/kubernetes-schema.service.mjs +0 -129
- package/esm2022/core/types/openapi.mjs +0 -2
package/translate/types.d.ts
CHANGED
|
@@ -9,6 +9,22 @@ export interface Translation {
|
|
|
9
9
|
}
|
|
10
10
|
export type Translations = Record<string, Translation>;
|
|
11
11
|
export type TranslateKey = string | Translation;
|
|
12
|
+
/**
|
|
13
|
+
* 模板插值数据类型
|
|
14
|
+
* 参考主流 i18n 库的类型定义
|
|
15
|
+
*/
|
|
16
|
+
export type TemplateData = string | number | boolean | Date | null | undefined | TemplateDataObject | TemplateData[] | unknown;
|
|
17
|
+
export interface TemplateDataObject {
|
|
18
|
+
[key: string]: TemplateData;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* ICU 兼容的简化数据类型
|
|
22
|
+
* ICU MessageFormat 原生支持的数据类型
|
|
23
|
+
*/
|
|
24
|
+
export type IcuValue = string | number | Date;
|
|
25
|
+
export interface IcuData {
|
|
26
|
+
[key: string]: IcuValue;
|
|
27
|
+
}
|
|
12
28
|
export interface TranslateOptions {
|
|
13
29
|
locale?: string;
|
|
14
30
|
fallbackLocale?: string;
|
|
@@ -1,35 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
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 * as i0 from "@angular/core";
|
|
7
|
-
interface YamlExample {
|
|
8
|
-
title: string;
|
|
9
|
-
description: string;
|
|
10
|
-
yaml: string;
|
|
11
|
-
snippet?: boolean;
|
|
12
|
-
}
|
|
13
|
-
export declare class ResourceYamlSchemaComponent implements OnInit, OnChanges {
|
|
14
|
-
private schemaService;
|
|
15
|
-
private http;
|
|
16
|
-
private cdr;
|
|
17
|
-
resource: KubernetesResource;
|
|
18
|
-
schema: OpenAPIV3SchemaObject;
|
|
19
|
-
close: EventEmitter<void>;
|
|
20
|
-
tryYaml: EventEmitter<string>;
|
|
21
|
-
private readonly DEFINITIONS_PREFIX;
|
|
22
|
-
currentSchema: OpenAPIV3SchemaObject;
|
|
23
|
-
properties: {
|
|
24
|
-
[key: string]: OpenAPIV3SchemaObject;
|
|
25
|
-
};
|
|
26
|
-
path: string[];
|
|
27
|
-
resourceKind: string;
|
|
28
|
-
examples: YamlExample[];
|
|
29
|
-
hasSchema: boolean;
|
|
30
|
-
hasExamples: boolean;
|
|
31
|
-
private readonly builtInExamples;
|
|
32
|
-
constructor(schemaService: KubernetesSchemaService, http: HttpClient, cdr: ChangeDetectorRef);
|
|
33
|
-
ngOnInit(): void;
|
|
34
|
-
ngOnChanges(changes: SimpleChanges): void;
|
|
35
|
-
refresh(): void;
|
|
36
|
-
private loadExamples;
|
|
37
|
-
private loadConsoleYAMLSamples;
|
|
38
|
-
drilldownToProperty(name: string): void;
|
|
39
|
-
navigateToPath(index: number): void;
|
|
40
|
-
hasNestedProperties(property: OpenAPIV3SchemaObject): boolean;
|
|
41
|
-
getPropertyType(property: OpenAPIV3SchemaObject): string;
|
|
42
|
-
isRequired(propertyName: string): boolean;
|
|
43
|
-
/**
|
|
44
|
-
* 检查属性是否有 $ref 引用或嵌套属性
|
|
45
|
-
*/
|
|
46
|
-
hasViewableContent(property: OpenAPIV3SchemaObject): boolean;
|
|
47
|
-
/**
|
|
48
|
-
* 检查属性是否有 $ref 引用
|
|
49
|
-
*/
|
|
50
|
-
hasRefProperty(property: OpenAPIV3SchemaObject): boolean;
|
|
51
|
-
/**
|
|
52
|
-
* 获取 $ref 引用的定义名称
|
|
53
|
-
*/
|
|
54
|
-
getRefDefinitionName(property: OpenAPIV3SchemaObject): string;
|
|
55
|
-
tryExample(example: YamlExample): void;
|
|
56
|
-
downloadYaml(example: YamlExample): void;
|
|
57
|
-
processDescription(description: string): string;
|
|
58
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ResourceYamlSchemaComponent, never>;
|
|
59
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ResourceYamlSchemaComponent, "acl-resource-yaml-schema", never, { "resource": { "alias": "resource"; "required": false; }; "schema": { "alias": "schema"; "required": false; }; }, { "close": "close"; "tryYaml": "tryYaml"; }, never, never, true, never>;
|
|
60
|
-
}
|
|
61
|
-
export {};
|
|
@@ -1,95 +0,0 @@
|
|
|
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
|
-
}
|
package/code/yaml-examples.d.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
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
|
-
}
|
package/core/types/openapi.d.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 自动折叠 managedFields 字段
|
|
3
|
-
* @param monacoEditor Monaco 编辑器实例
|
|
4
|
-
*/
|
|
5
|
-
export function foldManagedFields(monacoEditor) {
|
|
6
|
-
if (!monacoEditor) {
|
|
7
|
-
return;
|
|
8
|
-
}
|
|
9
|
-
const model = monacoEditor.getModel();
|
|
10
|
-
if (!model) {
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
try {
|
|
14
|
-
// 查找所有 managedFields 字段(只在 metadata 下的)
|
|
15
|
-
const managedFieldsMatches = model.findMatches('^(\\s+)managedFields:', false, true, false, null, true);
|
|
16
|
-
if (managedFieldsMatches && managedFieldsMatches.length > 0) {
|
|
17
|
-
const foldingRanges = [];
|
|
18
|
-
for (const match of managedFieldsMatches) {
|
|
19
|
-
const startLine = match.range.startLineNumber;
|
|
20
|
-
const endLine = findManagedFieldsEndLine(model, startLine);
|
|
21
|
-
if (endLine > startLine) {
|
|
22
|
-
foldingRanges.push({
|
|
23
|
-
startLineNumber: startLine,
|
|
24
|
-
startColumn: 1,
|
|
25
|
-
endLineNumber: endLine,
|
|
26
|
-
endColumn: model.getLineMaxColumn(endLine),
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
if (foldingRanges.length > 0) {
|
|
31
|
-
// 递归折叠每个 managedFields 区域,确保每次折叠完成后再进行下一次
|
|
32
|
-
foldRangesSequentially(monacoEditor, foldingRanges?.reverse(), 0);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
catch (error) {
|
|
37
|
-
console.warn('Failed to fold managedFields:', error);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* 递归折叠多个区域,确保每次折叠完成后再进行下一次
|
|
42
|
-
* @param monacoEditor Monaco 编辑器实例
|
|
43
|
-
* @param foldingRanges 折叠区域数组
|
|
44
|
-
* @param index 当前折叠的索引
|
|
45
|
-
*/
|
|
46
|
-
async function foldRangesSequentially(monacoEditor, foldingRanges, index) {
|
|
47
|
-
if (index >= foldingRanges.length) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
const range = foldingRanges[index];
|
|
51
|
-
monacoEditor.setSelection(range);
|
|
52
|
-
await Promise.resolve(monacoEditor.getAction('editor.fold')?.run());
|
|
53
|
-
return foldRangesSequentially(monacoEditor, foldingRanges, index + 1);
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* 查找 managedFields 字段的结束行
|
|
57
|
-
* @param model Monaco 编辑器模型
|
|
58
|
-
* @param startLine 起始行号
|
|
59
|
-
* @returns 结束行号
|
|
60
|
-
*/
|
|
61
|
-
function findManagedFieldsEndLine(model, startLine) {
|
|
62
|
-
const totalLines = model.getLineCount();
|
|
63
|
-
const startIndent = getLineIndentation(model, startLine);
|
|
64
|
-
// 从下一行开始查找
|
|
65
|
-
for (let line = startLine + 1; line <= totalLines; line++) {
|
|
66
|
-
const lineContent = model.getLineContent(line).trim();
|
|
67
|
-
// 跳过空行
|
|
68
|
-
if (!lineContent) {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
const currentIndent = getLineIndentation(model, line);
|
|
72
|
-
// 如果缩进小于等于起始行,说明 managedFields 字段结束
|
|
73
|
-
if (currentIndent <= startIndent) {
|
|
74
|
-
return line - 1;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return totalLines;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* 获取行的缩进级别
|
|
81
|
-
* @param model Monaco 编辑器模型
|
|
82
|
-
* @param lineNumber 行号
|
|
83
|
-
* @returns 缩进级别(空格数)
|
|
84
|
-
*/
|
|
85
|
-
function getLineIndentation(model, lineNumber) {
|
|
86
|
-
const lineContent = model.getLineContent(lineNumber);
|
|
87
|
-
const match = lineContent.match(/^(\s*)/);
|
|
88
|
-
return match ? match[1].length : 0;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* ManagedFields 自动折叠器
|
|
92
|
-
* 用于在内容变化时自动折叠 managedFields 字段
|
|
93
|
-
*/
|
|
94
|
-
export class ManagedFieldsAutoFolder {
|
|
95
|
-
constructor() {
|
|
96
|
-
this.lastFoldedContent = '';
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* 开始监听内容变化并自动折叠
|
|
100
|
-
* @param editorProvider 编辑器实例提供者
|
|
101
|
-
* @param contentObservable 内容变化的 Observable
|
|
102
|
-
*/
|
|
103
|
-
startAutoFold(editorProvider, contentObservable) {
|
|
104
|
-
this.stopAutoFold();
|
|
105
|
-
this.subscription = contentObservable.subscribe(() => {
|
|
106
|
-
setTimeout(() => {
|
|
107
|
-
const editor = editorProvider.getEditorInstance();
|
|
108
|
-
if (editor) {
|
|
109
|
-
const model = editor.getModel();
|
|
110
|
-
if (model) {
|
|
111
|
-
const currentContent = model.getValue();
|
|
112
|
-
// 只有当内容真正发生变化时才执行折叠
|
|
113
|
-
if (currentContent.includes('managedFields:') &&
|
|
114
|
-
currentContent !== this.lastFoldedContent) {
|
|
115
|
-
foldManagedFields(editor);
|
|
116
|
-
this.lastFoldedContent = currentContent;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}, 100);
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* 停止自动折叠
|
|
125
|
-
*/
|
|
126
|
-
stopAutoFold() {
|
|
127
|
-
if (this.subscription) {
|
|
128
|
-
this.subscription.unsubscribe();
|
|
129
|
-
this.subscription = undefined;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* 手动执行一次折叠
|
|
134
|
-
* @param editorProvider 编辑器实例提供者
|
|
135
|
-
*/
|
|
136
|
-
foldOnce(editorProvider) {
|
|
137
|
-
const editor = editorProvider.getEditorInstance();
|
|
138
|
-
if (editor) {
|
|
139
|
-
foldManagedFields(editor);
|
|
140
|
-
const model = editor.getModel();
|
|
141
|
-
if (model) {
|
|
142
|
-
this.lastFoldedContent = model.getValue();
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC1maWVsZHMtZm9sZGVyLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29kZS9tYW5hZ2VkLWZpZWxkcy1mb2xkZXIudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLFlBQTBDO0lBRTFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILHdDQUF3QztRQUN4QyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQzVDLHVCQUF1QixFQUN2QixLQUFLLEVBQ0wsSUFBSSxFQUNKLEtBQUssRUFDTCxJQUFJLEVBQ0osSUFBSSxDQUNMLENBQUM7UUFFRixJQUFJLG9CQUFvQixJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLGFBQWEsR0FBVSxFQUFFLENBQUM7WUFFaEMsS0FBSyxNQUFNLEtBQUssSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztnQkFFOUMsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUUzRCxJQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztvQkFDeEIsYUFBYSxDQUFDLElBQUksQ0FBQzt3QkFDakIsZUFBZSxFQUFFLFNBQVM7d0JBQzFCLFdBQVcsRUFBRSxDQUFDO3dCQUNkLGFBQWEsRUFBRSxPQUFPO3dCQUN0QixTQUFTLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztxQkFDM0MsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM3QiwwQ0FBMEM7Z0JBQzFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxzQkFBc0IsQ0FDbkMsWUFBMEMsRUFDMUMsYUFBb0IsRUFDcEIsS0FBYTtJQUViLElBQUksS0FBSyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFFcEUsT0FBTyxzQkFBc0IsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHdCQUF3QixDQUMvQixLQUF3QixFQUN4QixTQUFpQjtJQUVqQixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEMsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXpELFdBQVc7SUFDWCxLQUFLLElBQUksSUFBSSxHQUFHLFNBQVMsR0FBRyxDQUFDLEVBQUUsSUFBSSxJQUFJLFVBQVUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzFELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFdEQsT0FBTztRQUNQLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixTQUFTO1FBQ1gsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV0RCxvQ0FBb0M7UUFDcEMsSUFBSSxhQUFhLElBQUksV0FBVyxFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FDekIsS0FBd0IsRUFDeEIsVUFBa0I7SUFFbEIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQVNEOzs7R0FHRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFBcEM7UUFFVSxzQkFBaUIsR0FBRyxFQUFFLENBQUM7SUEwRGpDLENBQUM7SUF4REM7Ozs7T0FJRztJQUNILGFBQWEsQ0FDWCxjQUFzQyxFQUN0QyxpQkFBc0I7UUFFdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBCLElBQUksQ0FBQyxZQUFZLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNuRCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNsRCxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUNYLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxLQUFLLEVBQUUsQ0FBQzt3QkFDVixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3hDLG9CQUFvQjt3QkFDcEIsSUFDRSxjQUFjLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDOzRCQUN6QyxjQUFjLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUN6QyxDQUFDOzRCQUNELGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDOzRCQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxDQUFDO3dCQUMxQyxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsY0FBc0M7UUFDN0MsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbEQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlZGl0b3IgfSBmcm9tICdtb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvZWRpdG9yLmFwaSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiDoh6rliqjmipjlj6AgbWFuYWdlZEZpZWxkcyDlrZfmrrVcbiAqIEBwYXJhbSBtb25hY29FZGl0b3IgTW9uYWNvIOe8lui+keWZqOWunuS+i1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9sZE1hbmFnZWRGaWVsZHMoXG4gIG1vbmFjb0VkaXRvcjogZWRpdG9yLklTdGFuZGFsb25lQ29kZUVkaXRvcixcbik6IHZvaWQge1xuICBpZiAoIW1vbmFjb0VkaXRvcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1vZGVsID0gbW9uYWNvRWRpdG9yLmdldE1vZGVsKCk7XG4gIGlmICghbW9kZWwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIC8vIOafpeaJvuaJgOaciSBtYW5hZ2VkRmllbGRzIOWtl+aute+8iOWPquWcqCBtZXRhZGF0YSDkuIvnmoTvvIlcbiAgICBjb25zdCBtYW5hZ2VkRmllbGRzTWF0Y2hlcyA9IG1vZGVsLmZpbmRNYXRjaGVzKFxuICAgICAgJ14oXFxcXHMrKW1hbmFnZWRGaWVsZHM6JyxcbiAgICAgIGZhbHNlLFxuICAgICAgdHJ1ZSxcbiAgICAgIGZhbHNlLFxuICAgICAgbnVsbCxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIGlmIChtYW5hZ2VkRmllbGRzTWF0Y2hlcyAmJiBtYW5hZ2VkRmllbGRzTWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmb2xkaW5nUmFuZ2VzOiBhbnlbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hbmFnZWRGaWVsZHNNYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0TGluZSA9IG1hdGNoLnJhbmdlLnN0YXJ0TGluZU51bWJlcjtcblxuICAgICAgICBjb25zdCBlbmRMaW5lID0gZmluZE1hbmFnZWRGaWVsZHNFbmRMaW5lKG1vZGVsLCBzdGFydExpbmUpO1xuXG4gICAgICAgIGlmIChlbmRMaW5lID4gc3RhcnRMaW5lKSB7XG4gICAgICAgICAgZm9sZGluZ1Jhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogc3RhcnRMaW5lLFxuICAgICAgICAgICAgc3RhcnRDb2x1bW46IDEsXG4gICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiBlbmRMaW5lLFxuICAgICAgICAgICAgZW5kQ29sdW1uOiBtb2RlbC5nZXRMaW5lTWF4Q29sdW1uKGVuZExpbmUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm9sZGluZ1Jhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIOmAkuW9kuaKmOWPoOavj+S4qiBtYW5hZ2VkRmllbGRzIOWMuuWfn++8jOehruS/neavj+asoeaKmOWPoOWujOaIkOWQjuWGjei/m+ihjOS4i+S4gOasoVxuICAgICAgICBmb2xkUmFuZ2VzU2VxdWVudGlhbGx5KG1vbmFjb0VkaXRvciwgZm9sZGluZ1Jhbmdlcz8ucmV2ZXJzZSgpLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gZm9sZCBtYW5hZ2VkRmllbGRzOicsIGVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIOmAkuW9kuaKmOWPoOWkmuS4quWMuuWfn++8jOehruS/neavj+asoeaKmOWPoOWujOaIkOWQjuWGjei/m+ihjOS4i+S4gOasoVxuICogQHBhcmFtIG1vbmFjb0VkaXRvciBNb25hY28g57yW6L6R5Zmo5a6e5L6LXG4gKiBAcGFyYW0gZm9sZGluZ1JhbmdlcyDmipjlj6DljLrln5/mlbDnu4RcbiAqIEBwYXJhbSBpbmRleCDlvZPliY3mipjlj6DnmoTntKLlvJVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZm9sZFJhbmdlc1NlcXVlbnRpYWxseShcbiAgbW9uYWNvRWRpdG9yOiBlZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yLFxuICBmb2xkaW5nUmFuZ2VzOiBhbnlbXSxcbiAgaW5kZXg6IG51bWJlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoaW5kZXggPj0gZm9sZGluZ1Jhbmdlcy5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByYW5nZSA9IGZvbGRpbmdSYW5nZXNbaW5kZXhdO1xuICBtb25hY29FZGl0b3Iuc2V0U2VsZWN0aW9uKHJhbmdlKTtcbiAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKG1vbmFjb0VkaXRvci5nZXRBY3Rpb24oJ2VkaXRvci5mb2xkJyk/LnJ1bigpKTtcblxuICByZXR1cm4gZm9sZFJhbmdlc1NlcXVlbnRpYWxseShtb25hY29FZGl0b3IsIGZvbGRpbmdSYW5nZXMsIGluZGV4ICsgMSk7XG59XG5cbi8qKlxuICog5p+l5om+IG1hbmFnZWRGaWVsZHMg5a2X5q6155qE57uT5p2f6KGMXG4gKiBAcGFyYW0gbW9kZWwgTW9uYWNvIOe8lui+keWZqOaooeWei1xuICogQHBhcmFtIHN0YXJ0TGluZSDotbflp4vooYzlj7dcbiAqIEByZXR1cm5zIOe7k+adn+ihjOWPt1xuICovXG5mdW5jdGlvbiBmaW5kTWFuYWdlZEZpZWxkc0VuZExpbmUoXG4gIG1vZGVsOiBlZGl0b3IuSVRleHRNb2RlbCxcbiAgc3RhcnRMaW5lOiBudW1iZXIsXG4pOiBudW1iZXIge1xuICBjb25zdCB0b3RhbExpbmVzID0gbW9kZWwuZ2V0TGluZUNvdW50KCk7XG4gIGNvbnN0IHN0YXJ0SW5kZW50ID0gZ2V0TGluZUluZGVudGF0aW9uKG1vZGVsLCBzdGFydExpbmUpO1xuXG4gIC8vIOS7juS4i+S4gOihjOW8gOWni+afpeaJvlxuICBmb3IgKGxldCBsaW5lID0gc3RhcnRMaW5lICsgMTsgbGluZSA8PSB0b3RhbExpbmVzOyBsaW5lKyspIHtcbiAgICBjb25zdCBsaW5lQ29udGVudCA9IG1vZGVsLmdldExpbmVDb250ZW50KGxpbmUpLnRyaW0oKTtcblxuICAgIC8vIOi3s+i/h+epuuihjFxuICAgIGlmICghbGluZUNvbnRlbnQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRJbmRlbnQgPSBnZXRMaW5lSW5kZW50YXRpb24obW9kZWwsIGxpbmUpO1xuXG4gICAgLy8g5aaC5p6c57yp6L+b5bCP5LqO562J5LqO6LW35aeL6KGM77yM6K+05piOIG1hbmFnZWRGaWVsZHMg5a2X5q6157uT5p2fXG4gICAgaWYgKGN1cnJlbnRJbmRlbnQgPD0gc3RhcnRJbmRlbnQpIHtcbiAgICAgIHJldHVybiBsaW5lIC0gMTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG90YWxMaW5lcztcbn1cblxuLyoqXG4gKiDojrflj5booYznmoTnvKnov5vnuqfliKtcbiAqIEBwYXJhbSBtb2RlbCBNb25hY28g57yW6L6R5Zmo5qih5Z6LXG4gKiBAcGFyYW0gbGluZU51bWJlciDooYzlj7dcbiAqIEByZXR1cm5zIOe8qei/m+e6p+WIq++8iOepuuagvOaVsO+8iVxuICovXG5mdW5jdGlvbiBnZXRMaW5lSW5kZW50YXRpb24oXG4gIG1vZGVsOiBlZGl0b3IuSVRleHRNb2RlbCxcbiAgbGluZU51bWJlcjogbnVtYmVyLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgbGluZUNvbnRlbnQgPSBtb2RlbC5nZXRMaW5lQ29udGVudChsaW5lTnVtYmVyKTtcbiAgY29uc3QgbWF0Y2ggPSBsaW5lQ29udGVudC5tYXRjaCgvXihcXHMqKS8pO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXS5sZW5ndGggOiAwO1xufVxuXG4vKipcbiAqIOe8lui+keWZqOWunuS+i+iOt+WPluWZqOaOpeWPo1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRvckluc3RhbmNlUHJvdmlkZXIge1xuICBnZXRFZGl0b3JJbnN0YW5jZSgpOiBlZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBNYW5hZ2VkRmllbGRzIOiHquWKqOaKmOWPoOWZqFxuICog55So5LqO5Zyo5YaF5a655Y+Y5YyW5pe26Ieq5Yqo5oqY5Y+gIG1hbmFnZWRGaWVsZHMg5a2X5q61XG4gKi9cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkRmllbGRzQXV0b0ZvbGRlciB7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGxhc3RGb2xkZWRDb250ZW50ID0gJyc7XG5cbiAgLyoqXG4gICAqIOW8gOWni+ebkeWQrOWGheWuueWPmOWMluW5tuiHquWKqOaKmOWPoFxuICAgKiBAcGFyYW0gZWRpdG9yUHJvdmlkZXIg57yW6L6R5Zmo5a6e5L6L5o+Q5L6b6ICFXG4gICAqIEBwYXJhbSBjb250ZW50T2JzZXJ2YWJsZSDlhoXlrrnlj5jljJbnmoQgT2JzZXJ2YWJsZVxuICAgKi9cbiAgc3RhcnRBdXRvRm9sZChcbiAgICBlZGl0b3JQcm92aWRlcjogRWRpdG9ySW5zdGFuY2VQcm92aWRlcixcbiAgICBjb250ZW50T2JzZXJ2YWJsZTogYW55LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BBdXRvRm9sZCgpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSBjb250ZW50T2JzZXJ2YWJsZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IGVkaXRvclByb3ZpZGVyLmdldEVkaXRvckluc3RhbmNlKCk7XG4gICAgICAgIGlmIChlZGl0b3IpIHtcbiAgICAgICAgICBjb25zdCBtb2RlbCA9IGVkaXRvci5nZXRNb2RlbCgpO1xuICAgICAgICAgIGlmIChtb2RlbCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudENvbnRlbnQgPSBtb2RlbC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgLy8g5Y+q5pyJ5b2T5YaF5a6555yf5q2j5Y+R55Sf5Y+Y5YyW5pe25omN5omn6KGM5oqY5Y+gXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50LmluY2x1ZGVzKCdtYW5hZ2VkRmllbGRzOicpICYmXG4gICAgICAgICAgICAgIGN1cnJlbnRDb250ZW50ICE9PSB0aGlzLmxhc3RGb2xkZWRDb250ZW50XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZm9sZE1hbmFnZWRGaWVsZHMoZWRpdG9yKTtcbiAgICAgICAgICAgICAgdGhpcy5sYXN0Rm9sZGVkQ29udGVudCA9IGN1cnJlbnRDb250ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgMTAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlgZzmraLoh6rliqjmipjlj6BcbiAgICovXG4gIHN0b3BBdXRvRm9sZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5omL5Yqo5omn6KGM5LiA5qyh5oqY5Y+gXG4gICAqIEBwYXJhbSBlZGl0b3JQcm92aWRlciDnvJbovpHlmajlrp7kvovmj5DkvpvogIVcbiAgICovXG4gIGZvbGRPbmNlKGVkaXRvclByb3ZpZGVyOiBFZGl0b3JJbnN0YW5jZVByb3ZpZGVyKTogdm9pZCB7XG4gICAgY29uc3QgZWRpdG9yID0gZWRpdG9yUHJvdmlkZXIuZ2V0RWRpdG9ySW5zdGFuY2UoKTtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICBmb2xkTWFuYWdlZEZpZWxkcyhlZGl0b3IpO1xuICAgICAgY29uc3QgbW9kZWwgPSBlZGl0b3IuZ2V0TW9kZWwoKTtcbiAgICAgIGlmIChtb2RlbCkge1xuICAgICAgICB0aGlzLmxhc3RGb2xkZWRDb250ZW50ID0gbW9kZWwuZ2V0VmFsdWUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|