@lvce-editor/extension-host-worker 8.58.0 → 8.60.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 (33) hide show
  1. package/dist/extension-api/index.js +112 -35
  2. package/dist/extension-api/parts/ExtensionApiCommandMap/ExtensionApiCommandMap.js +5 -0
  3. package/dist/extension-api/parts/FileSystemProvider/FileSystemProvider.js +0 -0
  4. package/dist/extension-api/parts/FileSystemProviderRegistry/FileSystemProviderRegistry.js +56 -0
  5. package/dist/extension-api/parts/FileSystemProviderRegistrySnapshot/FileSystemProviderRegistrySnapshot.js +0 -0
  6. package/dist/extension-api/parts/RegisteredFileSystemProvider/RegisteredFileSystemProvider.js +0 -0
  7. package/dist/extension-api/parts/SourceControl/SourceControl.js +2 -0
  8. package/dist/extension-api/parts/SourceControlProviderRegistry/SourceControlProviderRegistry.js +19 -0
  9. package/dist/extensionHostWorkerMain.js +70 -20
  10. package/extension-api/dist/index.d.ts +5 -1
  11. package/extension-api/dist/index.js +2 -1
  12. package/extension-api/dist/parts/CommandMap/CommandMap.d.ts +3 -0
  13. package/extension-api/dist/parts/ExtensionApiCommandMap/ExtensionApiCommandMap.d.ts +3 -0
  14. package/extension-api/dist/parts/ExtensionApiCommandMap/ExtensionApiCommandMap.js +5 -1
  15. package/extension-api/dist/parts/ExtensionApiWorkerCommandMap/ExtensionApiWorkerCommandMap.d.ts +3 -0
  16. package/extension-api/dist/parts/FileSystemProvider/FileSystemProvider.d.ts +4 -0
  17. package/extension-api/dist/parts/FileSystemProvider/FileSystemProvider.js +1 -0
  18. package/extension-api/dist/parts/FileSystemProviderRegistry/FileSystemProviderRegistry.d.ts +7 -0
  19. package/extension-api/dist/parts/FileSystemProviderRegistry/FileSystemProviderRegistry.js +50 -0
  20. package/extension-api/dist/parts/FileSystemProviderRegistrySnapshot/FileSystemProviderRegistrySnapshot.d.ts +5 -0
  21. package/extension-api/dist/parts/FileSystemProviderRegistrySnapshot/FileSystemProviderRegistrySnapshot.js +1 -0
  22. package/extension-api/dist/parts/RegisteredFileSystemProvider/RegisteredFileSystemProvider.d.ts +4 -0
  23. package/extension-api/dist/parts/RegisteredFileSystemProvider/RegisteredFileSystemProvider.js +1 -0
  24. package/extension-api/dist/parts/RegisteredSourceControlProvider/RegisteredSourceControlProvider.d.ts +1 -0
  25. package/extension-api/dist/parts/ShowQuickPickOptions/ShowQuickPickOptions.d.ts +1 -0
  26. package/extension-api/dist/parts/SourceControl/SourceControl.d.ts +1 -1
  27. package/extension-api/dist/parts/SourceControl/SourceControl.js +1 -1
  28. package/extension-api/dist/parts/SourceControlProvider/SourceControlProvider.d.ts +1 -0
  29. package/extension-api/dist/parts/SourceControlProviderRegistry/SourceControlProviderRegistry.d.ts +1 -0
  30. package/extension-api/dist/parts/SourceControlProviderRegistry/SourceControlProviderRegistry.js +18 -0
  31. package/extension-api/package.json +1 -1
  32. package/extension-api/tsconfig.tsbuildinfo +1 -1
  33. package/package.json +1 -1
@@ -1573,9 +1573,9 @@ var createProviderRegistry = ({
1573
1573
  requiredMethods,
1574
1574
  requireLanguageId = false
1575
1575
  }) => {
1576
- const providers3 = /* @__PURE__ */ Object.create(null);
1576
+ const providers4 = /* @__PURE__ */ Object.create(null);
1577
1577
  const hasProvider = (id2) => {
1578
- return id2 in providers3;
1578
+ return id2 in providers4;
1579
1579
  };
1580
1580
  const registerProvider2 = (provider) => {
1581
1581
  if (!provider) {
@@ -1599,14 +1599,14 @@ var createProviderRegistry = ({
1599
1599
  throw new ExtensionApiError(`${providerName} ${id2} is already registered`);
1600
1600
  }
1601
1601
  const registeredProvider = mapProvider(provider);
1602
- providers3[registeredProvider.id] = registeredProvider;
1602
+ providers4[registeredProvider.id] = registeredProvider;
1603
1603
  return registeredProvider;
1604
1604
  };
1605
1605
  const deleteProvider = (id2) => {
1606
- delete providers3[id2];
1606
+ delete providers4[id2];
1607
1607
  };
1608
1608
  const getProviders = () => {
1609
- return Object.values(providers3);
1609
+ return Object.values(providers4);
1610
1610
  };
1611
1611
  const getProviderByLanguageId = (languageId) => {
1612
1612
  return getProviders().find((provider) => {
@@ -1614,8 +1614,8 @@ var createProviderRegistry = ({
1614
1614
  });
1615
1615
  };
1616
1616
  const reset = () => {
1617
- for (const id2 of Object.keys(providers3)) {
1618
- delete providers3[id2];
1617
+ for (const id2 of Object.keys(providers4)) {
1618
+ delete providers4[id2];
1619
1619
  }
1620
1620
  };
1621
1621
  const executeProviderByLanguageId = async (languageId, methodName, args, validateResult) => {
@@ -1798,6 +1798,57 @@ var getDiagnosticProviderRegistrySnapshot = () => {
1798
1798
  };
1799
1799
  var resetDiagnosticProviderRegistry = registry2.reset;
1800
1800
 
1801
+ // packages/extension-api/src/parts/FileSystemProviderRegistry/FileSystemProviderRegistry.ts
1802
+ var providers = /* @__PURE__ */ Object.create(null);
1803
+ var assertFileSystemProvider = (provider) => {
1804
+ if (!provider) {
1805
+ throw new ExtensionApiError("file system provider is not defined");
1806
+ }
1807
+ if (typeof provider.id !== "string" || provider.id.length === 0) {
1808
+ throw new ExtensionApiError("file system provider is missing id");
1809
+ }
1810
+ if (typeof provider.readFile !== "function") {
1811
+ throw new ExtensionApiError(`file system provider ${provider.id} is missing readFile function`);
1812
+ }
1813
+ if (provider.id in providers) {
1814
+ throw new ExtensionApiError(`file system provider ${provider.id} is already registered`);
1815
+ }
1816
+ };
1817
+ var getProvider = (id2) => {
1818
+ const provider = providers[id2];
1819
+ if (!provider) {
1820
+ throw new ExtensionApiError(`file system provider ${id2} not found`);
1821
+ }
1822
+ return provider;
1823
+ };
1824
+ var executeFileSystemProviderReadFile = async (id2, uri) => {
1825
+ return getProvider(id2).readFile(uri);
1826
+ };
1827
+ var getFileSystemProviderRegistrySnapshot = () => {
1828
+ return {
1829
+ providers: Object.values(providers).map((provider) => ({
1830
+ id: provider.id
1831
+ }))
1832
+ };
1833
+ };
1834
+ var registerFileSystemProvider = (provider) => {
1835
+ assertFileSystemProvider(provider);
1836
+ providers[provider.id] = {
1837
+ id: provider.id,
1838
+ readFile: (uri) => provider.readFile(uri)
1839
+ };
1840
+ return {
1841
+ dispose() {
1842
+ delete providers[provider.id];
1843
+ }
1844
+ };
1845
+ };
1846
+ var resetFileSystemProviderRegistry = () => {
1847
+ for (const id2 of Object.keys(providers)) {
1848
+ delete providers[id2];
1849
+ }
1850
+ };
1851
+
1801
1852
  // packages/extension-api/src/parts/FormattingProviderRegistry/FormattingProviderRegistry.ts
1802
1853
  var registry3 = createProviderRegistry({
1803
1854
  mapProvider(provider) {
@@ -1947,9 +1998,9 @@ var getHoverProviderRegistrySnapshot = () => {
1947
1998
  var resetHoverProviderRegistry = registry5.reset;
1948
1999
 
1949
2000
  // packages/extension-api/src/parts/LanguageProvider/LanguageProvider.ts
1950
- var providers = /* @__PURE__ */ Object.create(null);
1951
- var getProvider = (kind, languageId) => {
1952
- return providers[kind]?.find((provider) => provider.languageId === languageId);
2001
+ var providers2 = /* @__PURE__ */ Object.create(null);
2002
+ var getProvider2 = (kind, languageId) => {
2003
+ return providers2[kind]?.find((provider) => provider.languageId === languageId);
1953
2004
  };
1954
2005
  var registerProvider = (kind, provider, requiredMethods) => {
1955
2006
  if (!provider || typeof provider !== "object") {
@@ -1966,7 +2017,7 @@ var registerProvider = (kind, provider, requiredMethods) => {
1966
2017
  throw new ExtensionApiError(`${kind} provider ${provider.id} is missing ${methodName} function`);
1967
2018
  }
1968
2019
  }
1969
- const kindProviders = providers[kind] ||= [];
2020
+ const kindProviders = providers2[kind] ||= [];
1970
2021
  if (kindProviders.some((registeredProvider) => registeredProvider.id === provider.id)) {
1971
2022
  throw new ExtensionApiError(`${kind} provider ${provider.id} is already registered`);
1972
2023
  }
@@ -1981,7 +2032,7 @@ var registerProvider = (kind, provider, requiredMethods) => {
1981
2032
  };
1982
2033
  };
1983
2034
  var executeLanguageProvider = async (kind, methodName, textDocument, ...args) => {
1984
- const provider = getProvider(kind, textDocument.languageId);
2035
+ const provider = getProvider2(kind, textDocument.languageId);
1985
2036
  if (!provider) {
1986
2037
  throw new ExtensionApiError(`No ${kind} provider found for ${textDocument.languageId}`);
1987
2038
  }
@@ -1992,7 +2043,7 @@ var executeLanguageProvider = async (kind, methodName, textDocument, ...args) =>
1992
2043
  return method(textDocument, ...args);
1993
2044
  };
1994
2045
  var executeOrganizeImportsProvider = async (textDocument) => {
1995
- const provider = getProvider("code action", textDocument.languageId);
2046
+ const provider = getProvider2("code action", textDocument.languageId);
1996
2047
  if (!provider) {
1997
2048
  throw new ExtensionApiError(`No code action provider found for ${textDocument.languageId}`);
1998
2049
  }
@@ -2019,8 +2070,8 @@ var registerSelectionProvider = (provider) => registerProvider("selection", prov
2019
2070
  var registerTabCompletionProvider = (provider) => registerProvider("tab completion", provider, ["provideTabCompletion"]);
2020
2071
  var registerTypeDefinitionProvider = (provider) => registerProvider("type definition", provider, ["provideTypeDefinition"]);
2021
2072
  var resetLanguageProviderRegistry = () => {
2022
- for (const kind of Object.keys(providers)) {
2023
- delete providers[kind];
2073
+ for (const kind of Object.keys(providers2)) {
2074
+ delete providers2[kind];
2024
2075
  }
2025
2076
  };
2026
2077
 
@@ -2145,7 +2196,7 @@ var resetOutputChannelRegistry = () => {
2145
2196
  };
2146
2197
 
2147
2198
  // packages/extension-api/src/parts/SourceControlProviderRegistry/SourceControlProviderRegistry.ts
2148
- var providers2 = /* @__PURE__ */ Object.create(null);
2199
+ var providers3 = /* @__PURE__ */ Object.create(null);
2149
2200
  var optionalMethods = [
2150
2201
  "acceptInput",
2151
2202
  "add",
@@ -2154,6 +2205,7 @@ var optionalMethods = [
2154
2205
  "getBadgeCount",
2155
2206
  "getFeatures",
2156
2207
  "getFileBefore",
2208
+ "getFileBeforeUri",
2157
2209
  "getFileDecorations",
2158
2210
  "getGroups",
2159
2211
  "isActive"
@@ -2178,12 +2230,12 @@ var assertSourceControlProvider = (provider) => {
2178
2230
  for (const methodName of optionalMethods) {
2179
2231
  assertOptionalProviderMethod2(providerRecord, id2, methodName);
2180
2232
  }
2181
- if (id2 in providers2) {
2233
+ if (id2 in providers3) {
2182
2234
  throw new ExtensionApiError(`source control provider ${id2} is already registered`);
2183
2235
  }
2184
2236
  };
2185
- var getProvider2 = (id2) => {
2186
- const provider = providers2[id2];
2237
+ var getProvider3 = (id2) => {
2238
+ const provider = providers3[id2];
2187
2239
  if (!provider) {
2188
2240
  throw new ExtensionApiError(`source control provider ${id2} not found`);
2189
2241
  }
@@ -2215,6 +2267,9 @@ var mapSourceControlProvider = (provider) => {
2215
2267
  if (provider.getFileBefore) {
2216
2268
  registeredProvider.getFileBefore = (uri) => provider.getFileBefore(uri);
2217
2269
  }
2270
+ if (provider.getFileBeforeUri) {
2271
+ registeredProvider.getFileBeforeUri = (uri) => provider.getFileBeforeUri(uri);
2272
+ }
2218
2273
  if (provider.getFileDecorations) {
2219
2274
  registeredProvider.getFileDecorations = (uris) => provider.getFileDecorations(uris);
2220
2275
  }
@@ -2228,30 +2283,30 @@ var mapSourceControlProvider = (provider) => {
2228
2283
  };
2229
2284
  var registerSourceControlProvider = (provider) => {
2230
2285
  assertSourceControlProvider(provider);
2231
- providers2[provider.id] = mapSourceControlProvider(provider);
2286
+ providers3[provider.id] = mapSourceControlProvider(provider);
2232
2287
  return {
2233
2288
  dispose() {
2234
- delete providers2[provider.id];
2289
+ delete providers3[provider.id];
2235
2290
  }
2236
2291
  };
2237
2292
  };
2238
2293
  var executeSourceControlAcceptInput = async (id2, value) => {
2239
- return getProvider2(id2).acceptInput?.(value);
2294
+ return getProvider3(id2).acceptInput?.(value);
2240
2295
  };
2241
2296
  var executeSourceControlAdd = async (id2, path) => {
2242
- return getProvider2(id2).add?.(path);
2297
+ return getProvider3(id2).add?.(path);
2243
2298
  };
2244
2299
  var executeSourceControlDiscard = async (id2, path) => {
2245
- return getProvider2(id2).discard?.(path);
2300
+ return getProvider3(id2).discard?.(path);
2246
2301
  };
2247
2302
  var executeSourceControlGenerateCommitMessage = async (id2) => {
2248
- return getProvider2(id2).generateCommitMessage?.();
2303
+ return getProvider3(id2).generateCommitMessage?.();
2249
2304
  };
2250
2305
  var executeSourceControlGetChangedFiles = async (id2) => {
2251
- return getProvider2(id2).getChangedFiles();
2306
+ return getProvider3(id2).getChangedFiles();
2252
2307
  };
2253
2308
  var executeSourceControlGetBadgeCount = async (id2) => {
2254
- const provider = getProvider2(id2);
2309
+ const provider = getProvider3(id2);
2255
2310
  if (provider.getBadgeCount) {
2256
2311
  return provider.getBadgeCount();
2257
2312
  }
@@ -2259,16 +2314,30 @@ var executeSourceControlGetBadgeCount = async (id2) => {
2259
2314
  return files.length;
2260
2315
  };
2261
2316
  var executeSourceControlGetFeatures = async (id2) => {
2262
- return getProvider2(id2).getFeatures?.() ?? {};
2317
+ return getProvider3(id2).getFeatures?.() ?? {};
2263
2318
  };
2264
2319
  var executeSourceControlGetFileBefore = async (id2, uri) => {
2265
- return getProvider2(id2).getFileBefore?.(uri);
2320
+ return getProvider3(id2).getFileBefore?.(uri);
2321
+ };
2322
+ var executeSourceControlGetFileBeforeUri = async (id2, uri) => {
2323
+ const provider = getProvider3(id2);
2324
+ if (provider.getFileBeforeUri) {
2325
+ return provider.getFileBeforeUri(uri);
2326
+ }
2327
+ const content = await provider.getFileBefore?.(uri);
2328
+ if (content === void 0) {
2329
+ return "data://";
2330
+ }
2331
+ if (typeof content !== "string") {
2332
+ throw new ExtensionApiError(`source control provider ${id2} returned an invalid getFileBefore result`);
2333
+ }
2334
+ return `data://${content}`;
2266
2335
  };
2267
2336
  var executeSourceControlGetFileDecorations = async (id2, uris) => {
2268
- return getProvider2(id2).getFileDecorations?.(uris) ?? [];
2337
+ return getProvider3(id2).getFileDecorations?.(uris) ?? [];
2269
2338
  };
2270
2339
  var executeSourceControlGetGroups = async (id2, cwd) => {
2271
- const provider = getProvider2(id2);
2340
+ const provider = getProvider3(id2);
2272
2341
  if (provider.getGroups) {
2273
2342
  return provider.getGroups(cwd);
2274
2343
  }
@@ -2281,18 +2350,18 @@ var executeSourceControlGetGroups = async (id2, cwd) => {
2281
2350
  ];
2282
2351
  };
2283
2352
  var executeSourceControlIsActive = async (id2, scheme, root) => {
2284
- return Boolean(await getProvider2(id2).isActive?.(scheme, root));
2353
+ return Boolean(await getProvider3(id2).isActive?.(scheme, root));
2285
2354
  };
2286
2355
  var getSourceControlProviderRegistrySnapshot = () => {
2287
2356
  return {
2288
- providers: Object.values(providers2).map((provider) => ({
2357
+ providers: Object.values(providers3).map((provider) => ({
2289
2358
  id: provider.id
2290
2359
  }))
2291
2360
  };
2292
2361
  };
2293
2362
  var resetSourceControlProviderRegistry = () => {
2294
- for (const id2 of Object.keys(providers2)) {
2295
- delete providers2[id2];
2363
+ for (const id2 of Object.keys(providers3)) {
2364
+ delete providers3[id2];
2296
2365
  }
2297
2366
  };
2298
2367
 
@@ -3115,6 +3184,7 @@ var commandMap = {
3115
3184
  "ExtensionApi.executeCommand": executeCommand,
3116
3185
  "ExtensionApi.executeCompletionProvider": executeCompletionProvider,
3117
3186
  "ExtensionApi.executeDiagnosticProvider": executeDiagnosticProvider,
3187
+ "ExtensionApi.executeFileSystemProviderReadFile": executeFileSystemProviderReadFile,
3118
3188
  "ExtensionApi.executeFormattingProvider": executeFormattingProvider,
3119
3189
  "ExtensionApi.executeHoverProvider": executeHoverProvider,
3120
3190
  "ExtensionApi.executeLanguageProvider": executeLanguageProvider,
@@ -3128,6 +3198,7 @@ var commandMap = {
3128
3198
  "ExtensionApi.executeSourceControlGetChangedFiles": executeSourceControlGetChangedFiles,
3129
3199
  "ExtensionApi.executeSourceControlGetFeatures": executeSourceControlGetFeatures,
3130
3200
  "ExtensionApi.executeSourceControlGetFileBefore": executeSourceControlGetFileBefore,
3201
+ "ExtensionApi.executeSourceControlGetFileBeforeUri": executeSourceControlGetFileBeforeUri,
3131
3202
  "ExtensionApi.executeSourceControlGetFileDecorations": executeSourceControlGetFileDecorations,
3132
3203
  "ExtensionApi.executeSourceControlGetGroups": executeSourceControlGetGroups,
3133
3204
  "ExtensionApi.executeSourceControlIsActive": executeSourceControlIsActive,
@@ -3135,6 +3206,7 @@ var commandMap = {
3135
3206
  "ExtensionApi.getCommandRegistrySnapshot": getCommandRegistrySnapshot,
3136
3207
  "ExtensionApi.getCompletionProviderRegistrySnapshot": getCompletionProviderRegistrySnapshot,
3137
3208
  "ExtensionApi.getDiagnosticProviderRegistrySnapshot": getDiagnosticProviderRegistrySnapshot,
3209
+ "ExtensionApi.getFileSystemProviderRegistrySnapshot": getFileSystemProviderRegistrySnapshot,
3138
3210
  "ExtensionApi.getFormattingProviderRegistrySnapshot": getFormattingProviderRegistrySnapshot,
3139
3211
  "ExtensionApi.getHoverProviderRegistrySnapshot": getHoverProviderRegistrySnapshot,
3140
3212
  "ExtensionApi.getLanguageServerRegistrySnapshot": getLanguageServerRegistrySnapshot,
@@ -3510,6 +3582,7 @@ export {
3510
3582
  executeCommand2 as executeCommand,
3511
3583
  executeCompletionProvider,
3512
3584
  executeDiagnosticProvider,
3585
+ executeFileSystemProviderReadFile,
3513
3586
  executeFormattingProvider,
3514
3587
  executeHoverProvider,
3515
3588
  executeResolveCompletionItemProvider,
@@ -3521,6 +3594,7 @@ export {
3521
3594
  executeSourceControlGetChangedFiles,
3522
3595
  executeSourceControlGetFeatures,
3523
3596
  executeSourceControlGetFileBefore,
3597
+ executeSourceControlGetFileBeforeUri,
3524
3598
  executeSourceControlGetFileDecorations,
3525
3599
  executeSourceControlGetGroups,
3526
3600
  executeSourceControlIsActive,
@@ -3529,6 +3603,7 @@ export {
3529
3603
  getAccessToken,
3530
3604
  getCompletionProviderRegistrySnapshot,
3531
3605
  getDiagnosticProviderRegistrySnapshot,
3606
+ getFileSystemProviderRegistrySnapshot,
3532
3607
  getFormattingProviderRegistrySnapshot,
3533
3608
  getHoverProviderRegistrySnapshot,
3534
3609
  getLanguageServerRegistrySnapshot,
@@ -3553,6 +3628,7 @@ export {
3553
3628
  registerCompletionProvider,
3554
3629
  registerDefinitionProvider,
3555
3630
  registerDiagnosticProvider,
3631
+ registerFileSystemProvider,
3556
3632
  registerFormattingProvider,
3557
3633
  registerHoverProvider,
3558
3634
  registerImplementationProvider,
@@ -3569,6 +3645,7 @@ export {
3569
3645
  renderViewInstance,
3570
3646
  resetCompletionProviderRegistry,
3571
3647
  resetDiagnosticProviderRegistry,
3648
+ resetFileSystemProviderRegistry,
3572
3649
  resetFormattingProviderRegistry,
3573
3650
  resetHoverProviderRegistry,
3574
3651
  resetLanguageProviderRegistry,
@@ -1,6 +1,7 @@
1
1
  import { executeCommand, getCommandRegistrySnapshot } from "../CommandRegistry/CommandRegistry.js";
2
2
  import { executeCompletionProvider, executeResolveCompletionItemProvider, getCompletionProviderRegistrySnapshot } from "../Completion/Completion.js";
3
3
  import { executeDiagnosticProvider, getDiagnosticProviderRegistrySnapshot } from "../Diagnostic/Diagnostic.js";
4
+ import { executeFileSystemProviderReadFile, getFileSystemProviderRegistrySnapshot } from "../FileSystemProviderRegistry/FileSystemProviderRegistry.js";
4
5
  import { executeFormattingProvider, getFormattingProviderRegistrySnapshot } from "../Formatting/Formatting.js";
5
6
  import { getStatusBarItems } from "../GetStatusBarItems/GetStatusBarItems.js";
6
7
  import { executeHoverProvider, getHoverProviderRegistrySnapshot } from "../Hover/Hover.js";
@@ -16,6 +17,7 @@ import {
16
17
  executeSourceControlGetChangedFiles,
17
18
  executeSourceControlGetFeatures,
18
19
  executeSourceControlGetFileBefore,
20
+ executeSourceControlGetFileBeforeUri,
19
21
  executeSourceControlGetFileDecorations,
20
22
  executeSourceControlGetGroups,
21
23
  executeSourceControlIsActive,
@@ -40,6 +42,7 @@ const commandMap = {
40
42
  "ExtensionApi.executeCommand": executeCommand,
41
43
  "ExtensionApi.executeCompletionProvider": executeCompletionProvider,
42
44
  "ExtensionApi.executeDiagnosticProvider": executeDiagnosticProvider,
45
+ "ExtensionApi.executeFileSystemProviderReadFile": executeFileSystemProviderReadFile,
43
46
  "ExtensionApi.executeFormattingProvider": executeFormattingProvider,
44
47
  "ExtensionApi.executeHoverProvider": executeHoverProvider,
45
48
  "ExtensionApi.executeLanguageProvider": executeLanguageProvider,
@@ -53,6 +56,7 @@ const commandMap = {
53
56
  "ExtensionApi.executeSourceControlGetChangedFiles": executeSourceControlGetChangedFiles,
54
57
  "ExtensionApi.executeSourceControlGetFeatures": executeSourceControlGetFeatures,
55
58
  "ExtensionApi.executeSourceControlGetFileBefore": executeSourceControlGetFileBefore,
59
+ "ExtensionApi.executeSourceControlGetFileBeforeUri": executeSourceControlGetFileBeforeUri,
56
60
  "ExtensionApi.executeSourceControlGetFileDecorations": executeSourceControlGetFileDecorations,
57
61
  "ExtensionApi.executeSourceControlGetGroups": executeSourceControlGetGroups,
58
62
  "ExtensionApi.executeSourceControlIsActive": executeSourceControlIsActive,
@@ -60,6 +64,7 @@ const commandMap = {
60
64
  "ExtensionApi.getCommandRegistrySnapshot": getCommandRegistrySnapshot,
61
65
  "ExtensionApi.getCompletionProviderRegistrySnapshot": getCompletionProviderRegistrySnapshot,
62
66
  "ExtensionApi.getDiagnosticProviderRegistrySnapshot": getDiagnosticProviderRegistrySnapshot,
67
+ "ExtensionApi.getFileSystemProviderRegistrySnapshot": getFileSystemProviderRegistrySnapshot,
63
68
  "ExtensionApi.getFormattingProviderRegistrySnapshot": getFormattingProviderRegistrySnapshot,
64
69
  "ExtensionApi.getHoverProviderRegistrySnapshot": getHoverProviderRegistrySnapshot,
65
70
  "ExtensionApi.getLanguageServerRegistrySnapshot": getLanguageServerRegistrySnapshot,
@@ -0,0 +1,56 @@
1
+ import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
2
+ const providers = /* @__PURE__ */ Object.create(null);
3
+ const assertFileSystemProvider = (provider) => {
4
+ if (!provider) {
5
+ throw new ExtensionApiError("file system provider is not defined");
6
+ }
7
+ if (typeof provider.id !== "string" || provider.id.length === 0) {
8
+ throw new ExtensionApiError("file system provider is missing id");
9
+ }
10
+ if (typeof provider.readFile !== "function") {
11
+ throw new ExtensionApiError(`file system provider ${provider.id} is missing readFile function`);
12
+ }
13
+ if (provider.id in providers) {
14
+ throw new ExtensionApiError(`file system provider ${provider.id} is already registered`);
15
+ }
16
+ };
17
+ const getProvider = (id) => {
18
+ const provider = providers[id];
19
+ if (!provider) {
20
+ throw new ExtensionApiError(`file system provider ${id} not found`);
21
+ }
22
+ return provider;
23
+ };
24
+ const executeFileSystemProviderReadFile = async (id, uri) => {
25
+ return getProvider(id).readFile(uri);
26
+ };
27
+ const getFileSystemProviderRegistrySnapshot = () => {
28
+ return {
29
+ providers: Object.values(providers).map((provider) => ({
30
+ id: provider.id
31
+ }))
32
+ };
33
+ };
34
+ const registerFileSystemProvider = (provider) => {
35
+ assertFileSystemProvider(provider);
36
+ providers[provider.id] = {
37
+ id: provider.id,
38
+ readFile: (uri) => provider.readFile(uri)
39
+ };
40
+ return {
41
+ dispose() {
42
+ delete providers[provider.id];
43
+ }
44
+ };
45
+ };
46
+ const resetFileSystemProviderRegistry = () => {
47
+ for (const id of Object.keys(providers)) {
48
+ delete providers[id];
49
+ }
50
+ };
51
+ export {
52
+ executeFileSystemProviderReadFile,
53
+ getFileSystemProviderRegistrySnapshot,
54
+ registerFileSystemProvider,
55
+ resetFileSystemProviderRegistry
56
+ };
@@ -7,6 +7,7 @@ import {
7
7
  executeSourceControlGetChangedFiles,
8
8
  executeSourceControlGetFeatures,
9
9
  executeSourceControlGetFileBefore,
10
+ executeSourceControlGetFileBeforeUri,
10
11
  executeSourceControlGetFileDecorations,
11
12
  executeSourceControlGetGroups,
12
13
  executeSourceControlIsActive,
@@ -23,6 +24,7 @@ export {
23
24
  executeSourceControlGetChangedFiles,
24
25
  executeSourceControlGetFeatures,
25
26
  executeSourceControlGetFileBefore,
27
+ executeSourceControlGetFileBeforeUri,
26
28
  executeSourceControlGetFileDecorations,
27
29
  executeSourceControlGetGroups,
28
30
  executeSourceControlIsActive,
@@ -8,6 +8,7 @@ const optionalMethods = [
8
8
  "getBadgeCount",
9
9
  "getFeatures",
10
10
  "getFileBefore",
11
+ "getFileBeforeUri",
11
12
  "getFileDecorations",
12
13
  "getGroups",
13
14
  "isActive"
@@ -69,6 +70,9 @@ const mapSourceControlProvider = (provider) => {
69
70
  if (provider.getFileBefore) {
70
71
  registeredProvider.getFileBefore = (uri) => provider.getFileBefore(uri);
71
72
  }
73
+ if (provider.getFileBeforeUri) {
74
+ registeredProvider.getFileBeforeUri = (uri) => provider.getFileBeforeUri(uri);
75
+ }
72
76
  if (provider.getFileDecorations) {
73
77
  registeredProvider.getFileDecorations = (uris) => provider.getFileDecorations(uris);
74
78
  }
@@ -118,6 +122,20 @@ const executeSourceControlGetFeatures = async (id) => {
118
122
  const executeSourceControlGetFileBefore = async (id, uri) => {
119
123
  return getProvider(id).getFileBefore?.(uri);
120
124
  };
125
+ const executeSourceControlGetFileBeforeUri = async (id, uri) => {
126
+ const provider = getProvider(id);
127
+ if (provider.getFileBeforeUri) {
128
+ return provider.getFileBeforeUri(uri);
129
+ }
130
+ const content = await provider.getFileBefore?.(uri);
131
+ if (content === void 0) {
132
+ return "data://";
133
+ }
134
+ if (typeof content !== "string") {
135
+ throw new ExtensionApiError(`source control provider ${id} returned an invalid getFileBefore result`);
136
+ }
137
+ return `data://${content}`;
138
+ };
121
139
  const executeSourceControlGetFileDecorations = async (id, uris) => {
122
140
  return getProvider(id).getFileDecorations?.(uris) ?? [];
123
141
  };
@@ -158,6 +176,7 @@ export {
158
176
  executeSourceControlGetChangedFiles,
159
177
  executeSourceControlGetFeatures,
160
178
  executeSourceControlGetFileBefore,
179
+ executeSourceControlGetFileBeforeUri,
161
180
  executeSourceControlGetFileDecorations,
162
181
  executeSourceControlGetGroups,
163
182
  executeSourceControlIsActive,