@alauda-fe/common 1.4.27 → 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.
Files changed (30) hide show
  1. package/code/code-editor-configs.d.ts +2 -0
  2. package/code/managed-fields-folder.util.d.ts +35 -0
  3. package/code/public-api.d.ts +4 -0
  4. package/code/resource-yaml-display/component.d.ts +62 -6
  5. package/code/resource-yaml-editor/component.d.ts +93 -0
  6. package/code/yaml-examples.d.ts +8 -0
  7. package/code/yaml-sidebar/component.d.ts +57 -0
  8. package/code/yaml-sidebar/types.d.ts +21 -0
  9. package/core/directives/scroll-to-first-invalid.directive.d.ts +1 -1
  10. package/core/services/feature-gate.service.d.ts +1 -1
  11. package/core/services/kubernetes-schema.service.d.ts +43 -0
  12. package/core/services/public-api.d.ts +1 -0
  13. package/core/types/openapi.d.ts +37 -0
  14. package/core/types/public-api.d.ts +1 -0
  15. package/esm2022/code/code-editor-configs.mjs +12 -2
  16. package/esm2022/code/managed-fields-folder.util.mjs +136 -0
  17. package/esm2022/code/public-api.mjs +5 -1
  18. package/esm2022/code/resource-yaml-display/component.mjs +247 -43
  19. package/esm2022/code/resource-yaml-editor/component.mjs +379 -0
  20. package/esm2022/code/yaml-examples.mjs +337 -0
  21. package/esm2022/code/yaml-sidebar/component.mjs +482 -0
  22. package/esm2022/code/yaml-sidebar/types.mjs +2 -0
  23. package/esm2022/core/services/kubernetes-schema.service.mjs +125 -0
  24. package/esm2022/core/services/public-api.mjs +2 -1
  25. package/esm2022/core/types/openapi.mjs +2 -0
  26. package/esm2022/core/types/public-api.mjs +2 -1
  27. package/package.json +1 -1
  28. package/styles/global.scss +4 -0
  29. package/table/component.d.ts +1 -1
  30. 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
+ }
@@ -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 { 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
+ /**
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,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
+ }
@@ -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,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
+ }
@@ -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';
@@ -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==
@@ -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==