@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.
Files changed (64) hide show
  1. package/array-form-table/form/component.d.ts +1 -1
  2. package/code/code-editor-configs.d.ts +0 -2
  3. package/code/public-api.d.ts +0 -4
  4. package/code/resource-yaml-display/component.d.ts +6 -64
  5. package/core/abstract/base-nested-form-control.d.ts +1 -1
  6. package/core/constants/constants.d.ts +0 -3
  7. package/core/services/intercept-deactivate.service.d.ts +2 -2
  8. package/core/services/public-api.d.ts +0 -1
  9. package/core/services/time.service.d.ts +2 -8
  10. package/core/types/public-api.d.ts +0 -1
  11. package/esm2022/code/code-editor-configs.mjs +2 -12
  12. package/esm2022/code/public-api.mjs +1 -5
  13. package/esm2022/code/resource-yaml-display/component.mjs +42 -256
  14. package/esm2022/core/constants/constants.mjs +1 -4
  15. package/esm2022/core/guards/intercept-deactivate.guard.mjs +2 -2
  16. package/esm2022/core/services/intercept-deactivate.service.mjs +1 -1
  17. package/esm2022/core/services/public-api.mjs +1 -2
  18. package/esm2022/core/services/time.service.mjs +36 -13
  19. package/esm2022/core/services/workspace-helper.service.mjs +3 -4
  20. package/esm2022/core/types/public-api.mjs +1 -2
  21. package/esm2022/exec/terminal-group/component.mjs +2 -2
  22. package/esm2022/page-scaffold/page/page.module.mjs +6 -5
  23. package/esm2022/page-scaffold/page-header/help-menu/module.mjs +9 -8
  24. package/esm2022/table/module.mjs +12 -11
  25. package/esm2022/translate/constants.mjs +1 -2
  26. package/esm2022/translate/intl-format.pipes.mjs +293 -0
  27. package/esm2022/translate/public-api.mjs +4 -3
  28. package/esm2022/translate/relative-time-manager.service.mjs +87 -0
  29. package/esm2022/translate/translate.directive.mjs +5 -4
  30. package/esm2022/translate/translate.module.mjs +22 -3
  31. package/esm2022/translate/translate.pipe.mjs +7 -8
  32. package/esm2022/translate/translate.service.mjs +721 -142
  33. package/esm2022/translate/types.mjs +1 -1
  34. package/package.json +2 -2
  35. package/page-scaffold/page/page.module.d.ts +4 -3
  36. package/page-scaffold/page-header/help-menu/module.d.ts +2 -1
  37. package/styles/global.scss +0 -4
  38. package/table/component.d.ts +1 -1
  39. package/table/module.d.ts +2 -1
  40. package/translate/intl-format.pipes.d.ts +122 -0
  41. package/translate/public-api.d.ts +3 -2
  42. package/translate/relative-time-manager.service.d.ts +32 -0
  43. package/translate/translate.module.d.ts +4 -2
  44. package/translate/translate.pipe.d.ts +4 -5
  45. package/translate/translate.service.d.ts +292 -20
  46. package/translate/types.d.ts +16 -0
  47. package/code/managed-fields-folder.util.d.ts +0 -35
  48. package/code/resource-yaml-display/schema/component.d.ts +0 -61
  49. package/code/resource-yaml-editor/component.d.ts +0 -95
  50. package/code/yaml-examples.d.ts +0 -8
  51. package/code/yaml-sidebar/component.d.ts +0 -57
  52. package/code/yaml-sidebar/types.d.ts +0 -21
  53. package/code/yaml-sidebar/yaml-examples.d.ts +0 -8
  54. package/core/services/kubernetes-schema.service.d.ts +0 -44
  55. package/core/types/openapi.d.ts +0 -37
  56. package/esm2022/code/managed-fields-folder.util.mjs +0 -147
  57. package/esm2022/code/resource-yaml-display/schema/component.mjs +0 -531
  58. package/esm2022/code/resource-yaml-editor/component.mjs +0 -392
  59. package/esm2022/code/yaml-examples.mjs +0 -337
  60. package/esm2022/code/yaml-sidebar/component.mjs +0 -482
  61. package/esm2022/code/yaml-sidebar/types.mjs +0 -2
  62. package/esm2022/code/yaml-sidebar/yaml-examples.mjs +0 -340
  63. package/esm2022/core/services/kubernetes-schema.service.mjs +0 -129
  64. package/esm2022/core/types/openapi.mjs +0 -2
@@ -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
- }
@@ -1,8 +0,0 @@
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
- };
@@ -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,8 +0,0 @@
1
- import { YamlExample } from './types';
2
- /**
3
- * Kubernetes 资源的内置 YAML 示例
4
- * 按照 apiVersion.kind 的格式组织
5
- */
6
- export declare const BUILT_IN_YAML_EXAMPLES: {
7
- [key: string]: YamlExample[];
8
- };
@@ -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
- }
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC1maWVsZHMtZm9sZGVyLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29kZS9tYW5hZ2VkLWZpZWxkcy1mb2xkZXIudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLFlBQTBDO0lBRTFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILHdDQUF3QztRQUN4QyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQzVDLHVCQUF1QixFQUN2QixLQUFLLEVBQ0wsSUFBSSxFQUNKLEtBQUssRUFDTCxJQUFJLEVBQ0osSUFBSSxDQUNMLENBQUM7UUFFRixJQUFJLG9CQUFvQixJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxNQUFNLGFBQWEsR0FBVSxFQUFFLENBQUM7WUFFaEMsS0FBSyxNQUFNLEtBQUssSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztnQkFFOUMsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUUzRCxJQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztvQkFDeEIsYUFBYSxDQUFDLElBQUksQ0FBQzt3QkFDakIsZUFBZSxFQUFFLFNBQVM7d0JBQzFCLFdBQVcsRUFBRSxDQUFDO3dCQUNkLGFBQWEsRUFBRSxPQUFPO3dCQUN0QixTQUFTLEVBQUUsS0FBSyxD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QUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlZGl0b3IgfSBmcm9tICdtb25hY28tZWRpdG9yL2VzbS92cy9lZGl0b3IvZWRpdG9yLmFwaSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiDoh6rliqjmipjlj6AgbWFuYWdlZEZpZWxkcyDlrZfmrrVcbiAqIEBwYXJhbSBtb25hY29FZGl0b3IgTW9uYWNvIOe8lui+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==