@alauda-fe/common 1.4.28-beta.0 → 1.4.28-beta.1
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/code/code-editor-configs.d.ts +2 -0
- package/code/managed-fields-folder.util.d.ts +35 -0
- package/code/public-api.d.ts +4 -0
- package/code/resource-yaml-display/component.d.ts +62 -6
- package/code/resource-yaml-editor/component.d.ts +93 -0
- package/code/yaml-examples.d.ts +8 -0
- package/code/yaml-sidebar/component.d.ts +57 -0
- package/code/yaml-sidebar/types.d.ts +21 -0
- package/core/directives/scroll-to-first-invalid.directive.d.ts +1 -1
- package/core/services/feature-gate.service.d.ts +1 -1
- package/core/services/kubernetes-schema.service.d.ts +43 -0
- package/core/services/public-api.d.ts +1 -0
- package/core/types/openapi.d.ts +37 -0
- package/core/types/public-api.d.ts +1 -0
- package/esm2022/code/code-editor-configs.mjs +12 -2
- package/esm2022/code/managed-fields-folder.util.mjs +136 -0
- package/esm2022/code/public-api.mjs +5 -1
- package/esm2022/code/resource-yaml-display/component.mjs +247 -43
- package/esm2022/code/resource-yaml-editor/component.mjs +379 -0
- package/esm2022/code/yaml-examples.mjs +337 -0
- package/esm2022/code/yaml-sidebar/component.mjs +482 -0
- package/esm2022/code/yaml-sidebar/types.mjs +2 -0
- package/esm2022/core/services/kubernetes-schema.service.mjs +125 -0
- package/esm2022/core/services/public-api.mjs +2 -1
- package/esm2022/core/types/openapi.mjs +2 -0
- package/esm2022/core/types/public-api.mjs +2 -1
- package/package.json +1 -1
- package/styles/global.scss +4 -0
- package/table/component.d.ts +1 -1
- package/view-chart/view-chart.component.d.ts +1 -1
|
@@ -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
|
+
}
|
package/code/public-api.d.ts
CHANGED
|
@@ -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,76 @@
|
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
39
|
+
readonly schema$: Observable<OpenAPIV3SchemaObject>;
|
|
40
|
+
minimap: boolean;
|
|
41
|
+
yamlReadMinimapOptions: import("../code-editor-configs").IEditorConstructionOptions;
|
|
42
|
+
yamlReadOptions: import("../code-editor-configs").IEditorConstructionOptions;
|
|
43
|
+
/**
|
|
44
|
+
* 自动获取的 schema,当没有手动提供 schema 时使用
|
|
45
|
+
*/
|
|
46
|
+
autoSchema$: Observable<OpenAPIV3SchemaObject>;
|
|
47
|
+
/**
|
|
48
|
+
* 最终使用的 schema,优先使用手动提供的,否则使用自动获取的
|
|
49
|
+
*/
|
|
50
|
+
finalSchema$: Observable<OpenAPIV3SchemaObject>;
|
|
51
|
+
constructor(yamlUtil: YamlUtilService, schemaService: KubernetesSchemaService, monacoLanguageService: MonacoLanguageService);
|
|
14
52
|
yaml$: Observable<string>;
|
|
15
|
-
editorOptions: import("../code-editor-configs").IEditorConstructionOptions;
|
|
53
|
+
get editorOptions(): import("../code-editor-configs").IEditorConstructionOptions;
|
|
16
54
|
viewActions: import("@alauda/code-editor").CodeEditorActionsConfig;
|
|
17
55
|
conciseChange(value: boolean): void;
|
|
56
|
+
toggleSidebar(): void;
|
|
57
|
+
toggleDebugInfo(): void;
|
|
58
|
+
getCurrentResource(): T | null;
|
|
59
|
+
getCurrentSchema(): OpenAPIV3SchemaObject | null;
|
|
60
|
+
/**
|
|
61
|
+
* 设置 YAML schema 以提供 hover 提示和自动完成
|
|
62
|
+
*/
|
|
63
|
+
setYamlSchema(resource: T, schema: OpenAPIV3SchemaObject): void;
|
|
64
|
+
ngAfterViewInit(): void;
|
|
65
|
+
/**
|
|
66
|
+
* 获取 Monaco Editor 实例
|
|
67
|
+
*/
|
|
68
|
+
getEditorInstance(): editor.IStandaloneCodeEditor | null;
|
|
69
|
+
/**
|
|
70
|
+
* 自动折叠 managedFields 字段
|
|
71
|
+
*/
|
|
72
|
+
foldManagedFields(): void;
|
|
73
|
+
ngOnDestroy(): void;
|
|
18
74
|
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>;
|
|
75
|
+
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
76
|
}
|
|
@@ -0,0 +1,93 @@
|
|
|
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
|
+
/**
|
|
47
|
+
* 自动获取的 schema,当没有手动提供 schema 时使用
|
|
48
|
+
*/
|
|
49
|
+
autoSchema$: Observable<OpenAPIV3SchemaObject>;
|
|
50
|
+
/**
|
|
51
|
+
* 最终使用的 schema,优先使用手动提供的,否则使用自动获取的
|
|
52
|
+
*/
|
|
53
|
+
finalSchema$: Observable<OpenAPIV3SchemaObject>;
|
|
54
|
+
constructor(yamlUtil: YamlUtilService, schemaService: KubernetesSchemaService, monacoLanguageService: MonacoLanguageService);
|
|
55
|
+
ngAfterViewInit(): void;
|
|
56
|
+
get value(): string;
|
|
57
|
+
set value(val: string);
|
|
58
|
+
writeValue(value: string): void;
|
|
59
|
+
registerOnChange(fn: (value: string) => void): void;
|
|
60
|
+
registerOnTouched(fn: () => void): void;
|
|
61
|
+
toggleSidebar(): void;
|
|
62
|
+
toggleDebugInfo(): void;
|
|
63
|
+
getCurrentResource(): T | null;
|
|
64
|
+
getCurrentSchema(): OpenAPIV3SchemaObject | null;
|
|
65
|
+
getDebugInfo(): {
|
|
66
|
+
hasResource: boolean;
|
|
67
|
+
resourceApiVersion: string;
|
|
68
|
+
resourceKind: string;
|
|
69
|
+
hasManualSchema: boolean;
|
|
70
|
+
workspaceHelperAvailable: boolean;
|
|
71
|
+
currentWorkspace: Readonly<{
|
|
72
|
+
project: string;
|
|
73
|
+
cluster: string;
|
|
74
|
+
namespace: string;
|
|
75
|
+
}>;
|
|
76
|
+
};
|
|
77
|
+
onTryYaml(yamlContent: string): void;
|
|
78
|
+
/**
|
|
79
|
+
* 设置 YAML schema 以提供 hover 提示和自动完成
|
|
80
|
+
*/
|
|
81
|
+
setYamlSchema(resource: T, schema: OpenAPIV3SchemaObject): void;
|
|
82
|
+
/**
|
|
83
|
+
* 获取 Monaco 编辑器实例
|
|
84
|
+
*/
|
|
85
|
+
getEditorInstance(): import('monaco-editor').editor.IStandaloneCodeEditor | null;
|
|
86
|
+
/**
|
|
87
|
+
* 手动折叠 managedFields
|
|
88
|
+
*/
|
|
89
|
+
foldManagedFields(): void;
|
|
90
|
+
ngOnDestroy(): void;
|
|
91
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ResourceYamlEditorComponent<any>, never>;
|
|
92
|
+
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>;
|
|
93
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -13,7 +13,7 @@ export declare class ScrollToFirstInvalidDirective {
|
|
|
13
13
|
private readonly cdkScrollable;
|
|
14
14
|
labelOffset: number;
|
|
15
15
|
aclScrollToFirstInvalid: boolean | '';
|
|
16
|
-
get containerEl():
|
|
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<"
|
|
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,43 @@
|
|
|
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 readonly schemaCache;
|
|
10
|
+
private readonly schemaCache$$;
|
|
11
|
+
get definitions(): Record<string, OpenAPIV3SchemaObject>;
|
|
12
|
+
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* 获取当前集群的 OpenAPI schema
|
|
15
|
+
*/
|
|
16
|
+
getOpenAPISchema(): Observable<OpenAPIV2Document | null>;
|
|
17
|
+
/**
|
|
18
|
+
* 根据 Kubernetes 资源类型获取对应的 schema
|
|
19
|
+
*/
|
|
20
|
+
getResourceSchema(apiVersion: string, kind: string): Observable<OpenAPIV3SchemaObject | null>;
|
|
21
|
+
/**
|
|
22
|
+
* 获取所有可用的资源定义
|
|
23
|
+
*/
|
|
24
|
+
getAllResourceDefinitions(): Observable<Record<string, OpenAPIV3SchemaObject> | null>;
|
|
25
|
+
/**
|
|
26
|
+
* 清理缓存
|
|
27
|
+
*/
|
|
28
|
+
clearCache(): void;
|
|
29
|
+
/**
|
|
30
|
+
* 获取缓存状态
|
|
31
|
+
*/
|
|
32
|
+
getCacheStatus(): Observable<Map<string, OpenAPIV2Document>>;
|
|
33
|
+
/**
|
|
34
|
+
* 检查 WorkspaceHelperService 是否可用
|
|
35
|
+
*/
|
|
36
|
+
isWorkspaceHelperAvailable(): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* 从 Kubernetes API 获取 OpenAPI schema
|
|
39
|
+
*/
|
|
40
|
+
private fetchOpenAPISchema;
|
|
41
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<KubernetesSchemaService, never>;
|
|
42
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<KubernetesSchemaService>;
|
|
43
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -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,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3ItY29uZmlncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jb2RlL2NvZGUtZWRpdG9yLWNvbmZpZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBVUgsTUFBTSxhQUFhLEdBQTRCO0lBQzdDLElBQUksRUFBRSxJQUFJO0lBQ1YsSUFBSSxFQUFFLElBQUk7SUFDVixNQUFNLEVBQUUsSUFBSTtDQUNiLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQTRCO0lBQ3BELFFBQVEsRUFBRSxLQUFLO0lBQ2YsS0FBSyxFQUFFLElBQUk7SUFDWCxPQUFPLEVBQUUsS0FBSztJQUNkLE1BQU0sRUFBRSxJQUFJO0lBQ1osR0FBRyxhQUFhO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQTRCO0lBQ2xELFFBQVEsRUFBRSxLQUFLO0lBQ2YsS0FBSyxFQUFFLEtBQUs7SUFDWixPQUFPLEVBQUUsS0FBSztJQUNkLE1BQU0sRUFBRSxLQUFLO0lBQ2IsR0FBRyxhQUFhO0NBQ2pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQTRCO0lBQ3BELFFBQVEsRUFBRSxJQUFJLEVBQUUsaUlBQWlJO0lBQ2pKLEtBQUssRUFBRSxJQUFJO0lBQ1gsT0FBTyxFQUFFLElBQUk7SUFDYixNQUFNLEVBQUUsSUFBSTtJQUNaLEdBQUcsYUFBYTtDQUNqQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUE0QjtJQUNsRCxHQUFHLFdBQVc7SUFDZCxLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQStCO0lBQ3ZELE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLElBQUk7SUFDZCxPQUFPLEVBQUUsQ0FBQztJQUNWLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUU7SUFDM0IsU0FBUyxFQUFFO1FBQ1QsdUJBQXVCLEVBQUUsS0FBSztLQUMvQjtDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQStCO0lBQ3pELEdBQUcsYUFBYTtJQUNoQixRQUFRLEVBQUUsSUFBSTtDQUNmLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQStCO0lBQ3pELFFBQVEsRUFBRSxNQUFNO0lBQ2hCLEdBQUcsZUFBZTtDQUNuQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQStCO0lBQzFELFFBQVEsRUFBRSxNQUFNO0lBQ2hCLEdBQUcsYUFBYTtDQUNqQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQStCO0lBQ2pFLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLEdBQUcsYUFBYTtJQUNoQixPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFO0NBQzNCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBK0I7SUFDaEUsUUFBUSxFQUFFLE1BQU07SUFDaEIsR0FBRyxlQUFlO0lBQ2xCLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7Q0FDM0IsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUErQjtJQUMxRCxRQUFRLEVBQUUsTUFBTTtJQUNoQixHQUFHLGFBQWE7Q0FDakIsQ0FBQztBQUVGLFdBQVc7QUFDWCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQStCO0lBQ3pELFFBQVEsRUFBRSxJQUFJO0lBQ2QsUUFBUSxFQUFFLElBQUk7SUFDZCxtQkFBbUIsRUFBRSxNQUFNO0NBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogQG1vZHVsZSBjb2RlXG4gKi9cblxuaW1wb3J0IHsgQ29kZUVkaXRvckFjdGlvbnNDb25maWcgfSBmcm9tICdAYWxhdWRhL2NvZGUtZWRpdG9yJztcblxuZXhwb3J0IHR5cGUgSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPVxuICBpbXBvcnQoJ21vbmFjby1lZGl0b3IvZXNtL3ZzL2VkaXRvci9lZGl0b3IuYXBpJykuZWRpdG9yLklFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zICYge1xuICAgIGxhbmd1YWdlPzogc3RyaW5nO1xuICAgIHRhYlNpemU/OiBudW1iZXI7XG4gIH07XG5cbmNvbnN0IGNvbW1vbkFjdGlvbnM6IENvZGVFZGl0b3JBY3Rpb25zQ29uZmlnID0ge1xuICBjb3B5OiB0cnVlLFxuICBmaW5kOiB0cnVlLFxuICBleHBvcnQ6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQWN0aW9uczogQ29kZUVkaXRvckFjdGlvbnNDb25maWcgPSB7XG4gIGRpZmZNb2RlOiBmYWxzZSxcbiAgY2xlYXI6IHRydWUsXG4gIHJlY292ZXI6IGZhbHNlLFxuICBpbXBvcnQ6IHRydWUsXG4gIC4uLmNvbW1vbkFjdGlvbnMsXG59O1xuXG5leHBvcnQgY29uc3Qgdmlld0FjdGlvbnM6IENvZGVFZGl0b3JBY3Rpb25zQ29uZmlnID0ge1xuICBkaWZmTW9kZTogZmFsc2UsXG4gIGNsZWFyOiBmYWxzZSxcbiAgcmVjb3ZlcjogZmFsc2UsXG4gIGltcG9ydDogZmFsc2UsXG4gIC4uLmNvbW1vbkFjdGlvbnMsXG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aW9uczogQ29kZUVkaXRvckFjdGlvbnNDb25maWcgPSB7XG4gIGRpZmZNb2RlOiB0cnVlLCAvLyBpZiB0cnVlLCB5b3Ugc2hvdWxkIGFsc28gc2V0ICdvcmlnaW5hbFZhbHVlJyBhdHRyaWJ1dGUsIGVnOiA8YXVpLWNvZGUtZWRpdG9yIFtvcmlnaW5hbFZhbHVlXT1cIm9yaWdpbmFsRmlsZVwiPjwvYXVpLWNvZGUtZWRpdG9yPlxuICBjbGVhcjogdHJ1ZSxcbiAgcmVjb3ZlcjogdHJ1ZSxcbiAgaW1wb3J0OiB0cnVlLFxuICAuLi5jb21tb25BY3Rpb25zLFxufTtcblxuZXhwb3J0IGNvbnN0IGxvZ3NBY3Rpb25zOiBDb2RlRWRpdG9yQWN0aW9uc0NvbmZpZyA9IHtcbiAgLi4udmlld0FjdGlvbnMsXG4gIHRoZW1lOiB0cnVlLFxufTtcblxuZXhwb3J0IGNvbnN0IGNvbW1vbk9wdGlvbnM6IElFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zID0ge1xuICBmb2xkaW5nOiB0cnVlLFxuICB3b3JkV3JhcDogJ29uJyxcbiAgdGFiU2l6ZTogMixcbiAgbWluaW1hcDogeyBlbmFibGVkOiBmYWxzZSB9LFxuICBzY3JvbGxiYXI6IHtcbiAgICBhbHdheXNDb25zdW1lTW91c2VXaGVlbDogZmFsc2UsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgcmVhZG9ubHlPcHRpb25zOiBJRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHtcbiAgLi4uY29tbW9uT3B0aW9ucyxcbiAgcmVhZE9ubHk6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgeWFtbFJlYWRPcHRpb25zOiBJRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHtcbiAgbGFuZ3VhZ2U6ICd5YW1sJyxcbiAgLi4ucmVhZG9ubHlPcHRpb25zLFxufTtcblxuZXhwb3J0IGNvbnN0IHlhbWxXcml0ZU9wdGlvbnM6IElFZGl0b3JDb25zdHJ1Y3Rpb25PcHRpb25zID0ge1xuICBsYW5ndWFnZTogJ3lhbWwnLFxuICAuLi5jb21tb25PcHRpb25zLFxufTtcblxuZXhwb3J0IGNvbnN0IHlhbWxXcml0ZU1pbmltYXBPcHRpb25zOiBJRWRpdG9yQ29uc3RydWN0aW9uT3B0aW9ucyA9IHtcbiAgbGFuZ3VhZ2U6ICd5YW1sJyxcbiAgLi4uY29tbW9uT3B0aW9ucyxcbiAgbWluaW1hcDogeyBlbmFibGVkOiB0cnVlIH0sXG59O1xuXG5leHBvcnQgY29uc3QgeWFtbFJlYWRNaW5pbWFwT3B0aW9uczogSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIGxhbmd1YWdlOiAneWFtbCcsXG4gIC4uLnJlYWRvbmx5T3B0aW9ucyxcbiAgbWluaW1hcDogeyBlbmFibGVkOiB0cnVlIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdGV4dFdyaXRlT3B0aW9uczogSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIGxhbmd1YWdlOiAndGV4dCcsXG4gIC4uLmNvbW1vbk9wdGlvbnMsXG59O1xuXG4vLyBmb3IgbG9nc1xuZXhwb3J0IGNvbnN0IGxvZ3NSZWFkT3B0aW9uczogSUVkaXRvckNvbnN0cnVjdGlvbk9wdGlvbnMgPSB7XG4gIHdvcmRXcmFwOiAnb24nLFxuICByZWFkT25seTogdHJ1ZSxcbiAgcmVuZGVyTGluZUhpZ2hsaWdodDogJ25vbmUnLFxufTtcbiJdfQ==
|
|
@@ -0,0 +1,136 @@
|
|
|
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
|
+
setTimeout(() => {
|
|
32
|
+
foldingRanges.forEach(range => {
|
|
33
|
+
monacoEditor.setSelection(range);
|
|
34
|
+
monacoEditor.getAction('editor.fold')?.run();
|
|
35
|
+
});
|
|
36
|
+
}, 0);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
console.warn('Failed to fold managedFields:', error);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 查找 managedFields 字段的结束行
|
|
46
|
+
* @param model Monaco 编辑器模型
|
|
47
|
+
* @param startLine 起始行号
|
|
48
|
+
* @returns 结束行号
|
|
49
|
+
*/
|
|
50
|
+
function findManagedFieldsEndLine(model, startLine) {
|
|
51
|
+
const totalLines = model.getLineCount();
|
|
52
|
+
const startIndent = getLineIndentation(model, startLine);
|
|
53
|
+
// 从下一行开始查找
|
|
54
|
+
for (let line = startLine + 1; line <= totalLines; line++) {
|
|
55
|
+
const lineContent = model.getLineContent(line).trim();
|
|
56
|
+
// 跳过空行
|
|
57
|
+
if (!lineContent) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const currentIndent = getLineIndentation(model, line);
|
|
61
|
+
// 如果缩进小于等于起始行,说明 managedFields 字段结束
|
|
62
|
+
if (currentIndent <= startIndent) {
|
|
63
|
+
return line - 1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return totalLines;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 获取行的缩进级别
|
|
70
|
+
* @param model Monaco 编辑器模型
|
|
71
|
+
* @param lineNumber 行号
|
|
72
|
+
* @returns 缩进级别(空格数)
|
|
73
|
+
*/
|
|
74
|
+
function getLineIndentation(model, lineNumber) {
|
|
75
|
+
const lineContent = model.getLineContent(lineNumber);
|
|
76
|
+
const match = lineContent.match(/^(\s*)/);
|
|
77
|
+
return match ? match[1].length : 0;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* ManagedFields 自动折叠器
|
|
81
|
+
* 用于在内容变化时自动折叠 managedFields 字段
|
|
82
|
+
*/
|
|
83
|
+
export class ManagedFieldsAutoFolder {
|
|
84
|
+
constructor() {
|
|
85
|
+
this.lastFoldedContent = '';
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* 开始监听内容变化并自动折叠
|
|
89
|
+
* @param editorProvider 编辑器实例提供者
|
|
90
|
+
* @param contentObservable 内容变化的 Observable
|
|
91
|
+
*/
|
|
92
|
+
startAutoFold(editorProvider, contentObservable) {
|
|
93
|
+
this.stopAutoFold();
|
|
94
|
+
this.subscription = contentObservable.subscribe(() => {
|
|
95
|
+
setTimeout(() => {
|
|
96
|
+
const editor = editorProvider.getEditorInstance();
|
|
97
|
+
if (editor) {
|
|
98
|
+
const model = editor.getModel();
|
|
99
|
+
if (model) {
|
|
100
|
+
const currentContent = model.getValue();
|
|
101
|
+
// 只有当内容真正发生变化时才执行折叠
|
|
102
|
+
if (currentContent.includes('managedFields:') &&
|
|
103
|
+
currentContent !== this.lastFoldedContent) {
|
|
104
|
+
foldManagedFields(editor);
|
|
105
|
+
this.lastFoldedContent = currentContent;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}, 100);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 停止自动折叠
|
|
114
|
+
*/
|
|
115
|
+
stopAutoFold() {
|
|
116
|
+
if (this.subscription) {
|
|
117
|
+
this.subscription.unsubscribe();
|
|
118
|
+
this.subscription = undefined;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 手动执行一次折叠
|
|
123
|
+
* @param editorProvider 编辑器实例提供者
|
|
124
|
+
*/
|
|
125
|
+
foldOnce(editorProvider) {
|
|
126
|
+
const editor = editorProvider.getEditorInstance();
|
|
127
|
+
if (editor) {
|
|
128
|
+
foldManagedFields(editor);
|
|
129
|
+
const model = editor.getModel();
|
|
130
|
+
if (model) {
|
|
131
|
+
this.lastFoldedContent = model.getValue();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC1maWVsZHMtZm9sZGVyLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29kZS9tYW5hZ2VkLWZpZWxkcy1mb2xkZXIudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLFlBQTBDO0lBRTFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILHdDQUF3QztRQUN4QyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQzVDLHVCQUF1QixFQUN2QixLQUFLLEVBQ0wsSUFBSSxFQUNKLEtBQUssRUFDTCxJQUFJLEVBQ0osSUFBSSxDQUNMLENBQUM7UUFFRixJQUFJLG9CQUFvQixJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLGFBQWEsR0FBVSxFQUFFLENBQUM7WUFFaEMsS0FBSyxNQUFNLEtBQUssSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztnQkFFOUMsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUUzRCxJQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztvQkFDeEIsYUFBYSxDQUFDLElBQUksQ0FBQzt3QkFDakIsZUFBZSxFQUFFLFNBQVM7d0JBQzFCLFdBQVcsRUFBRSxDQUFDO3dCQUNkLGFBQWEsRUFBRSxPQUFPO3dCQUN0QixTQUFTLEVBQUUsS0FBSyxD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QUFjLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUN6QyxDQUFDOzRCQUNELGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDOzRCQUMxQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxDQUFDO3dCQUMxQyxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNWLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsY0FBc0M7UUFDN0MsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbEQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlZGl0b3IgfSBmcm9tICdtb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvZWRpdG9yLmFwaSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiDoh6rliqjmipjlj6AgbWFuYWdlZEZpZWxkcyDlrZfmrrVcbiAqIEBwYXJhbSBtb25hY29FZGl0b3IgTW9uYWNvIOe8lui+keWZqOWunuS+i1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9sZE1hbmFnZWRGaWVsZHMoXG4gIG1vbmFjb0VkaXRvcjogZWRpdG9yLklTdGFuZGFsb25lQ29kZUVkaXRvcixcbik6IHZvaWQge1xuICBpZiAoIW1vbmFjb0VkaXRvcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1vZGVsID0gbW9uYWNvRWRpdG9yLmdldE1vZGVsKCk7XG4gIGlmICghbW9kZWwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIC8vIOafpeaJvuaJgOaciSBtYW5hZ2VkRmllbGRzIOWtl+aute+8iOWPquWcqCBtZXRhZGF0YSDkuIvnmoTvvIlcbiAgICBjb25zdCBtYW5hZ2VkRmllbGRzTWF0Y2hlcyA9IG1vZGVsLmZpbmRNYXRjaGVzKFxuICAgICAgJ14oXFxcXHMrKW1hbmFnZWRGaWVsZHM6JyxcbiAgICAgIGZhbHNlLFxuICAgICAgdHJ1ZSxcbiAgICAgIGZhbHNlLFxuICAgICAgbnVsbCxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIGlmIChtYW5hZ2VkRmllbGRzTWF0Y2hlcyAmJiBtYW5hZ2VkRmllbGRzTWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmb2xkaW5nUmFuZ2VzOiBhbnlbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hbmFnZWRGaWVsZHNNYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0TGluZSA9IG1hdGNoLnJhbmdlLnN0YXJ0TGluZU51bWJlcjtcblxuICAgICAgICBjb25zdCBlbmRMaW5lID0gZmluZE1hbmFnZWRGaWVsZHNFbmRMaW5lKG1vZGVsLCBzdGFydExpbmUpO1xuXG4gICAgICAgIGlmIChlbmRMaW5lID4gc3RhcnRMaW5lKSB7XG4gICAgICAgICAgZm9sZGluZ1Jhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogc3RhcnRMaW5lLFxuICAgICAgICAgICAgc3RhcnRDb2x1bW46IDEsXG4gICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiBlbmRMaW5lLFxuICAgICAgICAgICAgZW5kQ29sdW1uOiBtb2RlbC5nZXRMaW5lTWF4Q29sdW1uKGVuZExpbmUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmb2xkaW5nUmFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgZm9sZGluZ1Jhbmdlcy5mb3JFYWNoKHJhbmdlID0+IHtcbiAgICAgICAgICAgIG1vbmFjb0VkaXRvci5zZXRTZWxlY3Rpb24ocmFuZ2UpO1xuICAgICAgICAgICAgbW9uYWNvRWRpdG9yLmdldEFjdGlvbignZWRpdG9yLmZvbGQnKT8ucnVuKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBmb2xkIG1hbmFnZWRGaWVsZHM6JywgZXJyb3IpO1xuICB9XG59XG5cbi8qKlxuICog5p+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==
|