@workbench-kit/shell-react 0.0.2-prototype.0.2.18 → 0.0.2-prototype.0.2.20

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/package.json +9 -8
  2. package/src/extensions/builtin/accounts/src/index.ts +13 -0
  3. package/src/extensions/builtin/accounts/workbench.extension.json +45 -0
  4. package/src/extensions/builtin/chat/src/index.ts +40 -0
  5. package/src/extensions/builtin/chat/workbench.extension.json +66 -0
  6. package/src/extensions/builtin/commands/src/command-inspector-editor-host.ts +79 -0
  7. package/src/extensions/builtin/commands/src/index.ts +65 -0
  8. package/src/extensions/builtin/commands/workbench.extension.json +64 -0
  9. package/src/extensions/builtin/editor/src/index.ts +95 -0
  10. package/src/extensions/builtin/editor/src/missing-resource-editor-host.ts +58 -0
  11. package/src/extensions/builtin/editor/src/resource-uri.ts +16 -0
  12. package/src/extensions/builtin/editor/src/text-editor-host.ts +86 -0
  13. package/src/extensions/builtin/editor/workbench.extension.json +32 -0
  14. package/src/extensions/builtin/explorer/src/index.ts +466 -0
  15. package/src/extensions/builtin/explorer/workbench.extension.json +132 -0
  16. package/src/extensions/builtin/extensions/src/index.ts +28 -0
  17. package/src/extensions/builtin/extensions/workbench.extension.json +53 -0
  18. package/src/extensions/builtin/keybindings/src/index.ts +6 -0
  19. package/src/extensions/builtin/keybindings/workbench.extension.json +21 -0
  20. package/src/extensions/builtin/search/src/index.ts +22 -0
  21. package/src/extensions/builtin/search/workbench.extension.json +43 -0
  22. package/src/extensions/builtin/settings/src/index.ts +23 -0
  23. package/src/extensions/builtin/settings/workbench.extension.json +41 -0
  24. package/src/extensions/builtin/workspace/src/index.ts +12 -0
  25. package/src/extensions/builtin/workspace/workbench.extension.json +37 -0
  26. package/src/extensions/builtin-extensions.ts +591 -0
  27. package/src/extensions/management-model.ts +41 -35
  28. package/src/extensions/use-extension-management.ts +11 -4
  29. package/src/index.ts +2 -0
  30. package/src/shell/provider.tsx +6 -6
@@ -1,6 +1,4 @@
1
1
  import {
2
- BUILTIN_WORKBENCH_EXTENSIONS,
3
- SAMPLE_WORKBENCH_EXTENSIONS,
4
2
  createExtensionFeatureSpec,
5
3
  createExtensionInstallPlan,
6
4
  resolveBundledExtensionByManifestUrl,
@@ -20,12 +18,8 @@ import type {
20
18
  ExtensionManagementFeatureSummary,
21
19
  } from '@workbench-kit/react/workbench/management';
22
20
 
23
- export const BUNDLED_EXTENSIONS = [
24
- ...BUILTIN_WORKBENCH_EXTENSIONS,
25
- ...SAMPLE_WORKBENCH_EXTENSIONS,
26
- ] as const;
27
-
28
21
  export interface CreateExtensionManagementEntriesInput {
22
+ readonly availableExtensions: readonly WorkbenchExtensionDescription[];
29
23
  readonly extensionRegistry: ExtensionRegistry;
30
24
  readonly installedRecords: readonly InstalledExtensionRecord[];
31
25
  }
@@ -42,38 +36,44 @@ export interface ExtensionInstallPlanningContext extends CreateExtensionManageme
42
36
  }
43
37
 
44
38
  export function createExtensionManagementEntries({
39
+ availableExtensions,
45
40
  extensionRegistry,
46
41
  installedRecords,
47
42
  }: CreateExtensionManagementEntriesInput): readonly ExtensionManagementEntry[] {
48
43
  const installedById = new Map(installedRecords.map((record) => [record.id, record]));
49
- const extensionFeatures = createExtensionManagementFeatureMaps(extensionRegistry);
50
- const bundledEntries = BUNDLED_EXTENSIONS.map((extension) => {
51
- const installed = installedById.get(extension.manifest.id);
52
- const isBuiltin = extension.manifest.id.startsWith('workbench-kit.builtin.');
53
- const featureState = resolveExtensionManagementFeatureState(
54
- extension.manifest.id,
55
- extensionFeatures,
56
- );
44
+ const extensionFeatures = createExtensionManagementFeatureMaps(
45
+ availableExtensions,
46
+ extensionRegistry,
47
+ );
48
+ const bundledEntries = availableExtensions
49
+ .map((extension) => {
50
+ const installed = installedById.get(extension.manifest.id);
51
+ const isBuiltin = extension.manifest.id.startsWith('workbench-kit.builtin.');
52
+ const featureState = resolveExtensionManagementFeatureState(
53
+ extension.manifest.id,
54
+ extensionFeatures,
55
+ );
57
56
 
58
- return {
59
- category: installed?.category ?? (isBuiltin ? 'builtin' : 'sample'),
60
- description: extension.manifest.displayName,
61
- diagnostics: featureState.diagnostics,
62
- displayName: extension.manifest.displayName,
63
- enabled: isBuiltin ? true : (installed?.enabled ?? false),
64
- features: featureState.features,
65
- id: extension.manifest.id,
66
- installedAt: installed?.installedAt,
67
- manifestUrl: installed?.manifestUrl,
68
- source: isBuiltin ? ('bundled' as const) : ('installed' as const),
69
- } satisfies ExtensionManagementEntry;
70
- }).filter((entry) => entry.source === 'bundled' || installedById.has(entry.id));
57
+ return {
58
+ category: installed?.category ?? (isBuiltin ? 'builtin' : 'sample'),
59
+ description: extension.manifest.displayName,
60
+ diagnostics: featureState.diagnostics,
61
+ displayName: extension.manifest.displayName,
62
+ enabled: isBuiltin ? true : (installed?.enabled ?? false),
63
+ features: featureState.features,
64
+ id: extension.manifest.id,
65
+ installedAt: installed?.installedAt,
66
+ manifestUrl: installed?.manifestUrl,
67
+ source: isBuiltin ? ('bundled' as const) : ('installed' as const),
68
+ } satisfies ExtensionManagementEntry;
69
+ })
70
+ .filter((entry) => entry.source === 'bundled' || installedById.has(entry.id));
71
71
 
72
72
  const activeExtensions = extensionRegistry
73
73
  .getExtensions()
74
74
  .filter(
75
75
  (extension) =>
76
- !BUNDLED_EXTENSIONS.some((bundled) => bundled.manifest.id === extension.manifest.id),
76
+ !availableExtensions.some((bundled) => bundled.manifest.id === extension.manifest.id),
77
77
  )
78
78
  .map((extension) => {
79
79
  const installed = installedById.get(extension.manifest.id);
@@ -102,12 +102,14 @@ export function createExtensionManagementEntries({
102
102
  }
103
103
 
104
104
  export function createExtensionCatalogBrowseEntries({
105
+ availableExtensions,
105
106
  catalogEntries,
106
107
  extensionRegistry,
107
108
  installedRecords,
108
109
  }: CreateExtensionCatalogBrowseEntriesInput): readonly ExtensionCatalogBrowseEntry[] {
109
110
  const installedIds = new Set(installedRecords.map((record) => record.id));
110
111
  const installContext = createExtensionInstallPlanningContext({
112
+ availableExtensions,
111
113
  catalogEntries,
112
114
  extensionRegistry,
113
115
  installedRecords,
@@ -135,23 +137,24 @@ export function createExtensionCatalogBrowseEntries({
135
137
  }
136
138
 
137
139
  export function createExtensionInstallPlanningContext({
140
+ availableExtensions,
138
141
  catalogEntries,
139
142
  extensionRegistry,
140
143
  installedRecords,
141
144
  }: CreateExtensionCatalogBrowseEntriesInput): ExtensionInstallPlanningContext {
142
- const availableExtensions = mergeUniqueExtensionDescriptions([
143
- ...BUNDLED_EXTENSIONS,
145
+ const installableExtensions = mergeUniqueExtensionDescriptions([
146
+ ...availableExtensions,
144
147
  ...extensionRegistry.getExtensions(),
145
148
  ]);
146
149
 
147
150
  return {
148
- availableExtensions,
151
+ availableExtensions: installableExtensions,
149
152
  enabledExtensionIds: extensionRegistry
150
153
  .getExtensions()
151
154
  .map((extension) => extension.manifest.id),
152
155
  extensionRegistry,
153
156
  hostCapabilityIds: extensionRegistry.capabilityRegistry.listProviderIds(),
154
- installSources: createExtensionInstallSources(catalogEntries, availableExtensions),
157
+ installSources: createExtensionInstallSources(catalogEntries, installableExtensions),
155
158
  installedRecords,
156
159
  };
157
160
  }
@@ -215,10 +218,13 @@ function mergeUniqueExtensionDescriptions(
215
218
  return [...byId.values()];
216
219
  }
217
220
 
218
- function createExtensionManagementFeatureMaps(extensionRegistry: ExtensionRegistry) {
221
+ function createExtensionManagementFeatureMaps(
222
+ availableExtensions: readonly WorkbenchExtensionDescription[],
223
+ extensionRegistry: ExtensionRegistry,
224
+ ) {
219
225
  return {
220
226
  bundledFeaturesById: new Map(
221
- BUNDLED_EXTENSIONS.map((extension) => [
227
+ availableExtensions.map((extension) => [
222
228
  extension.manifest.id,
223
229
  createExtensionFeatureSpec(extension),
224
230
  ]),
@@ -51,7 +51,7 @@ export function useExtensionManagementModel({
51
51
  installTrustStorageKey = DEFAULT_EXTENSION_INSTALL_TRUST_STORAGE_KEY,
52
52
  }: UseExtensionManagementModelOptions = {}) {
53
53
  const workbench = useWorkbench();
54
- const { extensionRegistry } = workbench;
54
+ const { availableExtensions, extensionRegistry } = workbench;
55
55
  const resolvedInstalledExtensionsStorage =
56
56
  installedExtensionsStorage ?? workbench.installedExtensionsStorage;
57
57
  const resolvedInstalledExtensionsStorageKey =
@@ -138,20 +138,26 @@ export function useExtensionManagementModel({
138
138
  }, [catalogTrustPolicy, catalogUrl]);
139
139
 
140
140
  const installedEntries = useMemo<readonly ExtensionManagementEntry[]>(() => {
141
- return createExtensionManagementEntries({ extensionRegistry, installedRecords });
142
- }, [extensionRegistry, installedRecords]);
141
+ return createExtensionManagementEntries({
142
+ availableExtensions,
143
+ extensionRegistry,
144
+ installedRecords,
145
+ });
146
+ }, [availableExtensions, extensionRegistry, installedRecords]);
143
147
 
144
148
  const browseEntries = useMemo<readonly ExtensionCatalogBrowseEntry[]>(() => {
145
149
  return createExtensionCatalogBrowseEntries({
150
+ availableExtensions,
146
151
  catalogEntries,
147
152
  extensionRegistry,
148
153
  installedRecords,
149
154
  });
150
- }, [catalogEntries, extensionRegistry, installedRecords]);
155
+ }, [availableExtensions, catalogEntries, extensionRegistry, installedRecords]);
151
156
 
152
157
  const installCatalogEntry = useCallback(
153
158
  (entry: ExtensionCatalogBrowseEntry, options?: ExtensionInstallOptions) => {
154
159
  const installContext = createExtensionInstallPlanningContext({
160
+ availableExtensions,
155
161
  catalogEntries,
156
162
  extensionRegistry,
157
163
  installedRecords,
@@ -186,6 +192,7 @@ export function useExtensionManagementModel({
186
192
  }
187
193
  },
188
194
  [
195
+ availableExtensions,
189
196
  catalogEntries,
190
197
  extensionRegistry,
191
198
  installedRecords,
package/src/index.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export const WORKBENCH_KIT_WORKBENCH_REACT_VERSION = '0.0.0' as const;
2
2
 
3
+ export { BUILTIN_WORKBENCH_EXTENSIONS } from './extensions/builtin-extensions.js';
4
+
3
5
  export {
4
6
  WorkbenchProvider,
5
7
  useWorkbench,
@@ -9,7 +9,6 @@ import {
9
9
  type ReactNode,
10
10
  } from 'react';
11
11
  import {
12
- BUILTIN_WORKBENCH_EXTENSIONS,
13
12
  collectConfigurationDefaults,
14
13
  createEditorService,
15
14
  ExtensionRegistry,
@@ -21,7 +20,6 @@ import {
21
20
  registerHostWorkbenchThemes,
22
21
  resolveInstalledAvailableExtensions,
23
22
  resolveWorkbenchExtensions,
24
- SAMPLE_WORKBENCH_EXTENSIONS,
25
23
  DEFAULT_INSTALLED_EXTENSIONS_STORAGE_KEY,
26
24
  WORKBENCH_EDITOR_SERVICE_CAPABILITY_ID,
27
25
  verifyWorkbenchExtensionsAgainstLock,
@@ -36,6 +34,7 @@ import {
36
34
  type WorkbenchLayoutStateInput,
37
35
  type ViewHostFactory,
38
36
  } from '@workbench-kit/workbench-core';
37
+ import { BUILTIN_WORKBENCH_EXTENSIONS } from '../extensions/builtin-extensions.js';
39
38
  import {
40
39
  ContextKeyService,
41
40
  createWorkbenchPermissionContextKeys,
@@ -97,10 +96,7 @@ export interface WorkbenchWorkspaceHostPort extends WorkbenchEditorSavePort {
97
96
 
98
97
  export type { WorkbenchStorageAdapter };
99
98
 
100
- const DEFAULT_AVAILABLE_EXTENSIONS = [
101
- ...BUILTIN_WORKBENCH_EXTENSIONS,
102
- ...SAMPLE_WORKBENCH_EXTENSIONS,
103
- ] as const;
99
+ const DEFAULT_AVAILABLE_EXTENSIONS = BUILTIN_WORKBENCH_EXTENSIONS;
104
100
 
105
101
  const EMPTY_HOST_THEMES: readonly WorkbenchHostThemeRegistration[] = Object.freeze([]);
106
102
  const EMPTY_USER_COMMANDS: readonly WorkbenchUserCommandDefinition[] = Object.freeze([]);
@@ -151,6 +147,7 @@ export interface WorkbenchProviderProps {
151
147
 
152
148
  export interface WorkbenchContextValue {
153
149
  activateCommand(commandId: string): Promise<readonly { readonly extensionId: string }[]>;
150
+ availableExtensions: readonly WorkbenchExtensionDescription[];
154
151
  contextKeyService: ContextKeyService;
155
152
  editorDocumentViewProviders: EditorDocumentViewProviderRegistry;
156
153
  editorService: EditorService;
@@ -170,6 +167,7 @@ export interface WorkbenchContextValue {
170
167
 
171
168
  interface WorkbenchProviderServices {
172
169
  activateStartup(): void;
170
+ availableExtensions: readonly WorkbenchExtensionDescription[];
173
171
  dispose(): void;
174
172
  editorDocumentViewProviders: EditorDocumentViewProviderRegistry;
175
173
  editorService: EditorService;
@@ -429,6 +427,7 @@ export function WorkbenchProvider({
429
427
  activateStartup: () => {
430
428
  void ensureStartupActivation();
431
429
  },
430
+ availableExtensions: resolvedAvailableExtensions,
432
431
  dispose: () => {
433
432
  saveCommandDisposable?.dispose();
434
433
  userCommandDisposables.dispose();
@@ -565,6 +564,7 @@ export function WorkbenchProvider({
565
564
  const value = useMemo<WorkbenchContextValue>(
566
565
  () => ({
567
566
  activateCommand: (commandId) => services.extensionRegistry.activateCommand(commandId),
567
+ availableExtensions: services.availableExtensions,
568
568
  contextKeyService,
569
569
  editorDocumentViewProviders: services.editorDocumentViewProviders,
570
570
  editorService: services.editorService,