@opensumi/ide-debug 2.24.6-rc-1685671765.0 → 2.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/lib/browser/components/floating-click-widget/index.d.ts.map +1 -1
  2. package/lib/browser/components/floating-click-widget/index.js +3 -2
  3. package/lib/browser/components/floating-click-widget/index.js.map +1 -1
  4. package/lib/browser/components/floating-click-widget/index.module.less +4 -0
  5. package/lib/browser/debug-configuration-manager.d.ts +6 -0
  6. package/lib/browser/debug-configuration-manager.d.ts.map +1 -1
  7. package/lib/browser/debug-configuration-manager.js +64 -17
  8. package/lib/browser/debug-configuration-manager.js.map +1 -1
  9. package/lib/browser/debug-contribution.d.ts.map +1 -1
  10. package/lib/browser/debug-contribution.js +11 -3
  11. package/lib/browser/debug-contribution.js.map +1 -1
  12. package/lib/browser/{debug-schema-updater.d.ts → debug-schema-manager.d.ts} +2 -2
  13. package/lib/browser/debug-schema-manager.d.ts.map +1 -0
  14. package/lib/browser/{debug-schema-updater.js → debug-schema-manager.js} +10 -10
  15. package/lib/browser/debug-schema-manager.js.map +1 -0
  16. package/lib/browser/debugUtils.d.ts +1 -0
  17. package/lib/browser/debugUtils.d.ts.map +1 -1
  18. package/lib/browser/debugUtils.js +22 -1
  19. package/lib/browser/debugUtils.js.map +1 -1
  20. package/lib/browser/editor/debug-breakpoint-zone-widget.d.ts +2 -0
  21. package/lib/browser/editor/debug-breakpoint-zone-widget.d.ts.map +1 -1
  22. package/lib/browser/editor/debug-breakpoint-zone-widget.js +14 -0
  23. package/lib/browser/editor/debug-breakpoint-zone-widget.js.map +1 -1
  24. package/lib/browser/index.d.ts.map +1 -1
  25. package/lib/browser/index.js +5 -0
  26. package/lib/browser/index.js.map +1 -1
  27. package/lib/browser/preferences/components/checkbox-widget.d.ts +4 -0
  28. package/lib/browser/preferences/components/checkbox-widget.d.ts.map +1 -0
  29. package/lib/browser/preferences/components/checkbox-widget.js +27 -0
  30. package/lib/browser/preferences/components/checkbox-widget.js.map +1 -0
  31. package/lib/browser/preferences/components/fields/any-of-field.d.ts +4 -0
  32. package/lib/browser/preferences/components/fields/any-of-field.d.ts.map +1 -0
  33. package/lib/browser/preferences/components/fields/any-of-field.js +28 -0
  34. package/lib/browser/preferences/components/fields/any-of-field.js.map +1 -0
  35. package/lib/browser/preferences/components/fields/array-field.d.ts +5 -0
  36. package/lib/browser/preferences/components/fields/array-field.d.ts.map +1 -0
  37. package/lib/browser/preferences/components/fields/array-field.js +19 -0
  38. package/lib/browser/preferences/components/fields/array-field.js.map +1 -0
  39. package/lib/browser/preferences/components/fields/object-filed.d.ts +5 -0
  40. package/lib/browser/preferences/components/fields/object-filed.d.ts.map +1 -0
  41. package/lib/browser/preferences/components/fields/object-filed.js +26 -0
  42. package/lib/browser/preferences/components/fields/object-filed.js.map +1 -0
  43. package/lib/browser/preferences/components/fields/title-field.d.ts +4 -0
  44. package/lib/browser/preferences/components/fields/title-field.d.ts.map +1 -0
  45. package/lib/browser/preferences/components/fields/title-field.js +12 -0
  46. package/lib/browser/preferences/components/fields/title-field.js.map +1 -0
  47. package/lib/browser/preferences/components/json-widget.module.less +36 -0
  48. package/lib/browser/preferences/components/select-widget.d.ts +4 -0
  49. package/lib/browser/preferences/components/select-widget.d.ts.map +1 -0
  50. package/lib/browser/preferences/components/select-widget.js +28 -0
  51. package/lib/browser/preferences/components/select-widget.js.map +1 -0
  52. package/lib/browser/preferences/components/text-widget.d.ts +4 -0
  53. package/lib/browser/preferences/components/text-widget.d.ts.map +1 -0
  54. package/lib/browser/preferences/components/text-widget.js +41 -0
  55. package/lib/browser/preferences/components/text-widget.js.map +1 -0
  56. package/lib/browser/preferences/launch-preferences-contribution.d.ts +14 -2
  57. package/lib/browser/preferences/launch-preferences-contribution.d.ts.map +1 -1
  58. package/lib/browser/preferences/launch-preferences-contribution.js +61 -2
  59. package/lib/browser/preferences/launch-preferences-contribution.js.map +1 -1
  60. package/lib/browser/preferences/launch.module.less +102 -0
  61. package/lib/browser/preferences/launch.service.d.ts +31 -0
  62. package/lib/browser/preferences/launch.service.d.ts.map +1 -0
  63. package/lib/browser/preferences/launch.service.js +109 -0
  64. package/lib/browser/preferences/launch.service.js.map +1 -0
  65. package/lib/browser/preferences/launch.view.d.ts +3 -0
  66. package/lib/browser/preferences/launch.view.d.ts.map +1 -0
  67. package/lib/browser/preferences/launch.view.js +287 -0
  68. package/lib/browser/preferences/launch.view.js.map +1 -0
  69. package/lib/browser/preferences/model/configuration-items.d.ts +12 -0
  70. package/lib/browser/preferences/model/configuration-items.d.ts.map +1 -0
  71. package/lib/browser/preferences/model/configuration-items.js +22 -0
  72. package/lib/browser/preferences/model/configuration-items.js.map +1 -0
  73. package/lib/browser/preferences/templates/additional-template.d.ts +4 -0
  74. package/lib/browser/preferences/templates/additional-template.d.ts.map +1 -0
  75. package/lib/browser/preferences/templates/additional-template.js +30 -0
  76. package/lib/browser/preferences/templates/additional-template.js.map +1 -0
  77. package/lib/browser/preferences/templates/array-field-item-template.d.ts +4 -0
  78. package/lib/browser/preferences/templates/array-field-item-template.d.ts.map +1 -0
  79. package/lib/browser/preferences/templates/array-field-item-template.js +31 -0
  80. package/lib/browser/preferences/templates/array-field-item-template.js.map +1 -0
  81. package/lib/browser/preferences/templates/array-field-template.d.ts +4 -0
  82. package/lib/browser/preferences/templates/array-field-template.d.ts.map +1 -0
  83. package/lib/browser/preferences/templates/array-field-template.js +31 -0
  84. package/lib/browser/preferences/templates/array-field-template.js.map +1 -0
  85. package/lib/browser/preferences/templates/base-input-template.d.ts +4 -0
  86. package/lib/browser/preferences/templates/base-input-template.d.ts.map +1 -0
  87. package/lib/browser/preferences/templates/base-input-template.js +29 -0
  88. package/lib/browser/preferences/templates/base-input-template.js.map +1 -0
  89. package/lib/browser/preferences/templates/button-template.d.ts +12 -0
  90. package/lib/browser/preferences/templates/button-template.d.ts.map +1 -0
  91. package/lib/browser/preferences/templates/button-template.js +71 -0
  92. package/lib/browser/preferences/templates/button-template.js.map +1 -0
  93. package/lib/browser/preferences/templates/description-field-template.d.ts +4 -0
  94. package/lib/browser/preferences/templates/description-field-template.d.ts.map +1 -0
  95. package/lib/browser/preferences/templates/description-field-template.js +16 -0
  96. package/lib/browser/preferences/templates/description-field-template.js.map +1 -0
  97. package/lib/browser/preferences/templates/field-template.d.ts +4 -0
  98. package/lib/browser/preferences/templates/field-template.d.ts.map +1 -0
  99. package/lib/browser/preferences/templates/field-template.js +19 -0
  100. package/lib/browser/preferences/templates/field-template.js.map +1 -0
  101. package/lib/browser/preferences/templates/json-templates.module.less +133 -0
  102. package/lib/browser/preferences/templates/object-field-template.d.ts +4 -0
  103. package/lib/browser/preferences/templates/object-field-template.d.ts.map +1 -0
  104. package/lib/browser/preferences/templates/object-field-template.js +74 -0
  105. package/lib/browser/preferences/templates/object-field-template.js.map +1 -0
  106. package/lib/browser/view/breakpoints/debug-breakpoints.module.less +19 -17
  107. package/lib/browser/view/breakpoints/debug-breakpoints.view.d.ts.map +1 -1
  108. package/lib/browser/view/breakpoints/debug-breakpoints.view.js +15 -7
  109. package/lib/browser/view/breakpoints/debug-breakpoints.view.js.map +1 -1
  110. package/lib/browser/view/configuration/debug-configuration.service.d.ts +1 -0
  111. package/lib/browser/view/configuration/debug-configuration.service.d.ts.map +1 -1
  112. package/lib/browser/view/configuration/debug-configuration.service.js +3 -0
  113. package/lib/browser/view/configuration/debug-configuration.service.js.map +1 -1
  114. package/lib/common/constants.d.ts +2 -0
  115. package/lib/common/constants.d.ts.map +1 -1
  116. package/lib/common/constants.js +4 -2
  117. package/lib/common/constants.js.map +1 -1
  118. package/lib/common/debug-schema.d.ts +5 -0
  119. package/lib/common/debug-schema.d.ts.map +1 -0
  120. package/lib/common/debug-schema.js +7 -0
  121. package/lib/common/debug-schema.js.map +1 -0
  122. package/lib/common/debug-service.d.ts +10 -0
  123. package/lib/common/debug-service.d.ts.map +1 -1
  124. package/lib/common/debug-service.js +8 -1
  125. package/lib/common/debug-service.js.map +1 -1
  126. package/lib/common/index.d.ts +1 -1
  127. package/lib/common/index.d.ts.map +1 -1
  128. package/lib/common/index.js +1 -1
  129. package/lib/common/index.js.map +1 -1
  130. package/package.json +26 -23
  131. package/src/browser/components/floating-click-widget/index.module.less +4 -0
  132. package/src/browser/components/floating-click-widget/index.tsx +4 -1
  133. package/src/browser/debug-configuration-manager.ts +82 -18
  134. package/src/browser/debug-contribution.ts +12 -4
  135. package/src/browser/{debug-schema-updater.ts → debug-schema-manager.ts} +5 -4
  136. package/src/browser/debugUtils.ts +23 -0
  137. package/src/browser/editor/debug-breakpoint-zone-widget.tsx +16 -1
  138. package/src/browser/index.ts +6 -0
  139. package/src/browser/preferences/components/checkbox-widget.tsx +78 -0
  140. package/src/browser/preferences/components/fields/any-of-field.tsx +90 -0
  141. package/src/browser/preferences/components/fields/array-field.tsx +25 -0
  142. package/src/browser/preferences/components/fields/object-filed.tsx +33 -0
  143. package/src/browser/preferences/components/fields/title-field.tsx +16 -0
  144. package/src/browser/preferences/components/json-widget.module.less +36 -0
  145. package/src/browser/preferences/components/select-widget.tsx +68 -0
  146. package/src/browser/preferences/components/text-widget.tsx +114 -0
  147. package/src/browser/preferences/launch-preferences-contribution.ts +84 -3
  148. package/src/browser/preferences/launch.module.less +102 -0
  149. package/src/browser/preferences/launch.service.ts +133 -0
  150. package/src/browser/preferences/launch.view.tsx +494 -0
  151. package/src/browser/preferences/model/configuration-items.ts +24 -0
  152. package/src/browser/preferences/templates/additional-template.tsx +77 -0
  153. package/src/browser/preferences/templates/array-field-item-template.tsx +90 -0
  154. package/src/browser/preferences/templates/array-field-template.tsx +92 -0
  155. package/src/browser/preferences/templates/base-input-template.tsx +79 -0
  156. package/src/browser/preferences/templates/button-template.tsx +107 -0
  157. package/src/browser/preferences/templates/description-field-template.tsx +29 -0
  158. package/src/browser/preferences/templates/field-template.tsx +71 -0
  159. package/src/browser/preferences/templates/json-templates.module.less +133 -0
  160. package/src/browser/preferences/templates/object-field-template.tsx +156 -0
  161. package/src/browser/view/breakpoints/debug-breakpoints.module.less +19 -17
  162. package/src/browser/view/breakpoints/debug-breakpoints.view.tsx +22 -10
  163. package/src/browser/view/configuration/debug-configuration.service.ts +4 -0
  164. package/src/common/constants.ts +3 -0
  165. package/src/common/debug-schema.ts +5 -0
  166. package/src/common/debug-service.ts +13 -0
  167. package/src/common/index.ts +1 -1
  168. package/lib/browser/debug-schema-updater.d.ts.map +0 -1
  169. package/lib/browser/debug-schema-updater.js.map +0 -1
  170. package/lib/common/debug-schema-updater.d.ts +0 -3
  171. package/lib/common/debug-schema-updater.d.ts.map +0 -1
  172. package/lib/common/debug-schema-updater.js +0 -5
  173. package/lib/common/debug-schema-updater.js.map +0 -1
  174. package/src/common/debug-schema-updater.ts +0 -3
@@ -0,0 +1,68 @@
1
+ import {
2
+ descriptionId,
3
+ FormContextType,
4
+ getTemplate,
5
+ RJSFSchema,
6
+ StrictRJSFSchema,
7
+ titleId,
8
+ WidgetProps,
9
+ } from '@rjsf/utils';
10
+ import React, { useMemo } from 'react';
11
+
12
+ import { Option, Select } from '@opensumi/ide-components';
13
+
14
+ import styles from './json-widget.module.less';
15
+
16
+ export const SelectWidget = <T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
17
+ props: WidgetProps<T, S, F>,
18
+ ) => {
19
+ const { schema, value, id, registry, uiOptions, name, required, onChange } = props;
20
+ const description = schema.description;
21
+
22
+ const TitleFieldTemplate = getTemplate<'TitleFieldTemplate', T, S, F>('TitleFieldTemplate', registry, uiOptions);
23
+ const DescriptionFieldTemplate = getTemplate<'DescriptionFieldTemplate', T, S, F>(
24
+ 'DescriptionFieldTemplate',
25
+ registry,
26
+ uiOptions,
27
+ );
28
+
29
+ const enumValue = useMemo(() => {
30
+ if (schema && schema.enum) {
31
+ return schema.enum;
32
+ }
33
+ return [];
34
+ }, [schema, schema.enum]);
35
+
36
+ return (
37
+ <div className={styles.select_widget_control}>
38
+ {name && (
39
+ <div className={styles.object_title}>
40
+ <TitleFieldTemplate
41
+ id={titleId<T>(id)}
42
+ title={name}
43
+ required={required}
44
+ schema={schema}
45
+ registry={registry}
46
+ />
47
+ </div>
48
+ )}
49
+ {description && (
50
+ <div className={styles.object_description}>
51
+ <DescriptionFieldTemplate
52
+ id={descriptionId<T>(id)}
53
+ description={description}
54
+ schema={schema}
55
+ registry={registry}
56
+ />
57
+ </div>
58
+ )}
59
+ <Select key={id} value={value} dropdownRenderType='absolute' onChange={onChange}>
60
+ {enumValue.map((data: string) => (
61
+ <Option value={data} label={data} key={data}>
62
+ {data}
63
+ </Option>
64
+ ))}
65
+ </Select>
66
+ </div>
67
+ );
68
+ };
@@ -0,0 +1,114 @@
1
+ import {
2
+ descriptionId,
3
+ FormContextType,
4
+ GenericObjectType,
5
+ getTemplate,
6
+ RJSFSchema,
7
+ StrictRJSFSchema,
8
+ titleId,
9
+ WidgetProps,
10
+ } from '@rjsf/utils';
11
+ import React, { useMemo } from 'react';
12
+
13
+ import { Input } from '@opensumi/ide-components';
14
+
15
+ import { parseSnippet } from '../../debugUtils';
16
+
17
+ import styles from './json-widget.module.less';
18
+
19
+ export const TextWidget = <T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(
20
+ props: WidgetProps<T, S, F>,
21
+ ) => {
22
+ const {
23
+ disabled,
24
+ formContext,
25
+ id,
26
+ onBlur,
27
+ onChange,
28
+ onFocus,
29
+ options,
30
+ placeholder,
31
+ readonly,
32
+ schema,
33
+ value,
34
+ registry,
35
+ label,
36
+ hideLabel,
37
+ required,
38
+ uiSchema,
39
+ uiOptions,
40
+ } = props;
41
+ const { readonlyAsDisabled = true } = formContext as GenericObjectType;
42
+
43
+ const TitleFieldTemplate = getTemplate<'TitleFieldTemplate', T, S, F>('TitleFieldTemplate', registry, uiOptions);
44
+ const DescriptionFieldTemplate = getTemplate<'DescriptionFieldTemplate', T, S, F>(
45
+ 'DescriptionFieldTemplate',
46
+ registry,
47
+ uiOptions,
48
+ );
49
+
50
+ const parseValue = useMemo(() => {
51
+ if (typeof value !== 'string') {
52
+ return value;
53
+ }
54
+
55
+ return parseSnippet(value);
56
+ }, [value]);
57
+
58
+ const handleBlur = ({ target }: React.FocusEvent<HTMLInputElement>) => {
59
+ onChange(target.value === '' ? options.emptyValue : target.value);
60
+ onBlur(id, target.value);
61
+ };
62
+
63
+ const handleFocus = ({ target }: React.FocusEvent<HTMLInputElement>) => onFocus(id, target.value);
64
+
65
+ const type = useMemo(() => {
66
+ if (schema.type !== 'string' && schema.type !== 'number') {
67
+ return 'string';
68
+ }
69
+
70
+ return schema.type;
71
+ }, [schema, schema.type]);
72
+
73
+ const description = useMemo(() => schema.description || '', [schema, schema.description]);
74
+
75
+ return (
76
+ <div>
77
+ {!hideLabel && label && (
78
+ <div className={styles.object_title}>
79
+ <TitleFieldTemplate
80
+ id={titleId<T>(id)}
81
+ title={label}
82
+ required={required}
83
+ schema={schema}
84
+ uiSchema={uiSchema}
85
+ registry={registry}
86
+ />
87
+ </div>
88
+ )}
89
+ {description && (
90
+ <div className={styles.object_description}>
91
+ <DescriptionFieldTemplate
92
+ id={descriptionId<T>(id)}
93
+ description={description}
94
+ schema={schema}
95
+ uiSchema={uiSchema}
96
+ registry={registry}
97
+ />
98
+ </div>
99
+ )}
100
+ <Input
101
+ disabled={disabled || (readonlyAsDisabled && readonly)}
102
+ id={id}
103
+ name={id}
104
+ onBlur={!readonly ? handleBlur : undefined}
105
+ onFocus={!readonly ? handleFocus : undefined}
106
+ placeholder={placeholder}
107
+ type={type}
108
+ value={parseValue}
109
+ className={styles.text_widget_control}
110
+ autoComplete='off'
111
+ />
112
+ </div>
113
+ );
114
+ };
@@ -1,9 +1,90 @@
1
- import { PreferenceContribution, PreferenceSchema, Domain, PreferenceConfiguration } from '@opensumi/ide-core-browser';
1
+ import { Autowired, Injectable } from '@opensumi/di';
2
+ import {
3
+ PreferenceContribution,
4
+ PreferenceSchema,
5
+ Domain,
6
+ PreferenceConfiguration,
7
+ URI,
8
+ MaybePromise,
9
+ localize,
10
+ getIcon,
11
+ COMMON_COMMANDS,
12
+ } from '@opensumi/ide-core-browser';
13
+ import { IMenuRegistry, MenuContribution } from '@opensumi/ide-core-browser/lib/menu/next/base';
14
+ import { MenuId } from '@opensumi/ide-core-browser/lib/menu/next/menu-id';
15
+ import {
16
+ BrowserEditorContribution,
17
+ EditorComponentRegistry,
18
+ EditorOpenType,
19
+ IResource,
20
+ IResourceProvider,
21
+ ResourceService,
22
+ } from '@opensumi/ide-editor/lib/browser';
23
+
24
+ import { LAUNCH_VIEW_COMPONENT_ID, LAUNCH_VIEW_SCHEME } from '../../common/constants';
2
25
 
3
26
  import { launchPreferencesSchema } from './launch-preferences';
27
+ import { LaunchViewContainer } from './launch.view';
28
+
29
+ @Injectable()
30
+ export class LaunchResourceProvider implements IResourceProvider {
31
+ readonly scheme: string = LAUNCH_VIEW_SCHEME;
32
+
33
+ provideResource(uri: URI): MaybePromise<IResource<any>> {
34
+ return {
35
+ supportsRevive: true,
36
+ name: localize('menu-bar.title.debug'),
37
+ icon: getIcon('debug'),
38
+ uri,
39
+ };
40
+ }
41
+
42
+ provideResourceSubname(): string | null {
43
+ return null;
44
+ }
45
+
46
+ async shouldCloseResource(): Promise<boolean> {
47
+ return true;
48
+ }
49
+ }
50
+
51
+ @Domain(PreferenceContribution, PreferenceConfiguration, BrowserEditorContribution, MenuContribution)
52
+ export class LaunchPreferencesContribution
53
+ implements PreferenceContribution, PreferenceConfiguration, BrowserEditorContribution, MenuContribution
54
+ {
55
+ @Autowired(LaunchResourceProvider)
56
+ private readonly prefResourceProvider: LaunchResourceProvider;
4
57
 
5
- @Domain(PreferenceContribution, PreferenceConfiguration)
6
- export class LaunchPreferencesContribution implements PreferenceContribution, PreferenceConfiguration {
7
58
  schema: PreferenceSchema = launchPreferencesSchema;
8
59
  name = 'launch';
60
+
61
+ registerResource(resourceService: ResourceService): void {
62
+ resourceService.registerResourceProvider(this.prefResourceProvider);
63
+ }
64
+
65
+ registerEditorComponent(editorComponentRegistry: EditorComponentRegistry): void {
66
+ editorComponentRegistry.registerEditorComponent({
67
+ component: LaunchViewContainer,
68
+ uid: LAUNCH_VIEW_COMPONENT_ID,
69
+ scheme: LAUNCH_VIEW_SCHEME,
70
+ });
71
+
72
+ editorComponentRegistry.registerEditorComponentResolver(LAUNCH_VIEW_SCHEME, (_, __, resolve) => {
73
+ resolve([
74
+ {
75
+ type: EditorOpenType.component,
76
+ componentId: LAUNCH_VIEW_COMPONENT_ID,
77
+ },
78
+ ]);
79
+ });
80
+ }
81
+
82
+ registerMenus(menus: IMenuRegistry) {
83
+ menus.registerMenuItem(MenuId.EditorTitle, {
84
+ command: COMMON_COMMANDS.OPEN_LAUNCH_CONFIGURATION.id,
85
+ iconClass: getIcon('open'),
86
+ group: 'navigation',
87
+ when: `resourceScheme == ${LAUNCH_VIEW_SCHEME}`,
88
+ });
89
+ }
9
90
  }
@@ -0,0 +1,102 @@
1
+ @base-font-size: 14px;
2
+ @small-base-font-size: 12px;
3
+
4
+ .launch_container {
5
+ height: 100%;
6
+ font-size: @base-font-size;
7
+ overflow: hidden;
8
+ padding: 16px 16px 0 16px;
9
+ box-sizing: border-box;
10
+ min-width: 500px;
11
+
12
+ .no_onfiguration {
13
+ padding: 0 16px;
14
+ }
15
+
16
+ .launch_panel {
17
+ height: 100%;
18
+ margin-top: 8px;
19
+
20
+ .launch_indexes_container {
21
+ height: 100%;
22
+ margin-right: 16px;
23
+ .not_configuration_content {
24
+ text-align: center;
25
+ font-size: @small-base-font-size;
26
+ }
27
+ .configuration_items_box {
28
+ height: calc(100% - 50px) !important;
29
+ .configuration_item {
30
+ height: 26px;
31
+ display: flex;
32
+ align-items: center;
33
+ cursor: pointer;
34
+ flex-direction: row;
35
+ padding: 4px 8px;
36
+
37
+ &:hover {
38
+ background: var(--list-hoverBackground);
39
+ color: var(--list-hoverForeground);
40
+ }
41
+ &.selected {
42
+ background: var(--kt-tree-inactiveSelectionBackground);
43
+ color: var(--list-activeSelectionForeground);
44
+ }
45
+
46
+ .configuration_wrapper {
47
+ overflow: hidden;
48
+ text-overflow: ellipsis;
49
+ white-space: nowrap;
50
+ flex: 1;
51
+ }
52
+
53
+ .configuration_description {
54
+ display: inline;
55
+ font-size: 12px;
56
+ }
57
+ }
58
+ }
59
+ .foot_box {
60
+ position: relative;
61
+ z-index: 1;
62
+ .button {
63
+ width: 100%;
64
+ }
65
+ }
66
+ }
67
+
68
+ .launch_schema_body_container {
69
+ overflow: auto;
70
+ height: 100%;
71
+ padding: 0 16px 22px 0px;
72
+ }
73
+ }
74
+ }
75
+
76
+ .devider {
77
+ box-sizing: border-box;
78
+ font-size: 14px;
79
+ font-variant: tabular-nums;
80
+ list-style: none;
81
+ font-feature-settings: 'tnum';
82
+ position: relative;
83
+ margin: 0 3px;
84
+ display: inline-block;
85
+ vertical-align: middle;
86
+ &:after {
87
+ content: '';
88
+ display: block;
89
+ position: absolute;
90
+ top: 0px;
91
+ left: 0px;
92
+ width: 100%;
93
+ height: 100%;
94
+ border-top: 0;
95
+ border-left: 1px solid var(--editorGroup-border);
96
+ pointer-events: none;
97
+ transform: translateX(1.5px);
98
+ }
99
+ &:hover:after {
100
+ border-color: transparent;
101
+ }
102
+ }
@@ -0,0 +1,133 @@
1
+ import { IChangeEvent } from '@rjsf/core';
2
+ import { GenericObjectType, StrictRJSFSchema } from '@rjsf/utils';
3
+ import * as jsoncparser from 'jsonc-parser';
4
+ import lodashSet from 'lodash/set';
5
+
6
+ import { Injectable, Autowired } from '@opensumi/di';
7
+ import { Emitter, Event, FileType, IJSONSchema, URI } from '@opensumi/ide-core-common';
8
+ import { IFileServiceClient } from '@opensumi/ide-file-service';
9
+
10
+ import { ILaunchService } from '../../common/debug-service';
11
+
12
+ type TFormData = { [key in string]: any };
13
+ const CONFIGURATIONS_FIELD = 'configurations';
14
+
15
+ @Injectable()
16
+ export class LaunchService implements ILaunchService {
17
+ @Autowired(IFileServiceClient)
18
+ private readonly fileSystem: IFileServiceClient;
19
+
20
+ private readonly _onRawSchemaProperties = new Emitter<IJSONSchema>();
21
+ public readonly onRawSchemaProperties: Event<IJSONSchema> = this._onRawSchemaProperties.event;
22
+
23
+ private readonly _onChangeSchema = new Emitter<StrictRJSFSchema>();
24
+ public readonly onChangeSchema: Event<StrictRJSFSchema> = this._onChangeSchema.event;
25
+
26
+ private readonly _onChangeFormData = new Emitter<TFormData>();
27
+ public readonly onChangeFormData: Event<TFormData> = this._onChangeFormData.event;
28
+
29
+ private _rawSchemaProperties: IJSONSchema;
30
+ private _schema: StrictRJSFSchema;
31
+ private _formData: TFormData;
32
+
33
+ public get rawSchemaProperties(): IJSONSchema {
34
+ return this._rawSchemaProperties;
35
+ }
36
+ public get schema(): StrictRJSFSchema {
37
+ return this._schema;
38
+ }
39
+ public get formData(): TFormData {
40
+ return this._formData;
41
+ }
42
+
43
+ public setRawSchemaProperties(sp: IJSONSchema) {
44
+ this._rawSchemaProperties = sp;
45
+ this._onRawSchemaProperties.fire(sp);
46
+ }
47
+
48
+ public nextNewSchema(data: StrictRJSFSchema): void {
49
+ this._schema = data;
50
+ this._onChangeSchema.fire(data);
51
+ }
52
+
53
+ public nextNewFormData(data: TFormData, isEmit = true): void {
54
+ this._formData = data;
55
+ if (isEmit) {
56
+ this._onChangeFormData.fire(data);
57
+ }
58
+ }
59
+
60
+ public addNewItem(name: string): void {
61
+ if (name === '') {
62
+ return;
63
+ }
64
+
65
+ const { properties } = this.rawSchemaProperties;
66
+ const newFormData = { ...this.formData };
67
+
68
+ const preSchemaValue = properties![name];
69
+
70
+ lodashSet(newFormData as GenericObjectType, name, preSchemaValue['default'] || '');
71
+ lodashSet(this.schema.properties!, name, preSchemaValue);
72
+
73
+ this.nextNewSchema(this.schema);
74
+ this.nextNewFormData(newFormData);
75
+ }
76
+
77
+ public delItem(name: string): void {
78
+ if (name === '') {
79
+ return;
80
+ }
81
+
82
+ const { properties } = this.schema;
83
+ const newFormData = { ...this.formData };
84
+
85
+ delete newFormData[name];
86
+ delete properties![name];
87
+
88
+ this.nextNewSchema(this.schema);
89
+ this.nextNewFormData(newFormData);
90
+ }
91
+
92
+ private async readResourceContent(resource: URI): Promise<string> {
93
+ try {
94
+ const { content } = await this.fileSystem.readFile(resource.toString());
95
+ return content.toString();
96
+ } catch (error) {
97
+ return '';
98
+ }
99
+ }
100
+
101
+ public async modifyConfigurationsInResource(resource: URI, data: IChangeEvent, index: number): Promise<void> {
102
+ const stat = await this.fileSystem.getFileStat(resource.toString());
103
+
104
+ if (stat && stat.type === FileType.File) {
105
+ const { formData } = data;
106
+
107
+ const fileContent = await this.readResourceContent(resource);
108
+
109
+ const parseContent = jsoncparser.parse(fileContent);
110
+ const preConfigurations = parseContent[CONFIGURATIONS_FIELD];
111
+
112
+ if (!preConfigurations) {
113
+ return;
114
+ }
115
+
116
+ if (Array.isArray(preConfigurations) && preConfigurations.length - 1 >= index) {
117
+ preConfigurations.splice(index, 1, formData);
118
+ }
119
+
120
+ const edits = jsoncparser.modify(fileContent, [CONFIGURATIONS_FIELD], preConfigurations, {
121
+ isArrayInsertion: false,
122
+ formattingOptions: {
123
+ tabSize: 2,
124
+ insertSpaces: true,
125
+ eol: '\n',
126
+ },
127
+ });
128
+
129
+ const newContent = jsoncparser.applyEdits(fileContent, edits);
130
+ await this.fileSystem.setContent(stat, newContent);
131
+ }
132
+ }
133
+ }