@sussudio/platform
Version:
Internal APIs for VS Code's service injection the base services.
120 lines (119 loc) • 4.17 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as strings from '@sussudio/base/common/strings.mjs';
import { createDecorator } from '../../instantiation/common/instantiation.mjs';
import { getRemoteName } from '../../remote/common/remoteHosts.mjs';
export const MANIFEST_CACHE_FOLDER = 'CachedExtensions';
export const USER_MANIFEST_CACHE_FILE = 'user';
export const BUILTIN_MANIFEST_CACHE_FILE = 'builtin';
export const UNDEFINED_PUBLISHER = 'undefined_publisher';
export const ALL_EXTENSION_KINDS = ['ui', 'workspace', 'web'];
export function getWorkspaceSupportTypeMessage(supportType) {
if (typeof supportType === 'object' && supportType !== null) {
if (supportType.supported !== true) {
return supportType.description;
}
}
return undefined;
}
export function isIExtensionIdentifier(thing) {
return (
thing &&
typeof thing === 'object' &&
typeof thing.id === 'string' &&
(!thing.uuid || typeof thing.uuid === 'string')
);
}
export const EXTENSION_CATEGORIES = [
'Azure',
'Data Science',
'Debuggers',
'Extension Packs',
'Education',
'Formatters',
'Keymaps',
'Language Packs',
'Linters',
'Machine Learning',
'Notebooks',
'Programming Languages',
'SCM Providers',
'Snippets',
'Testing',
'Themes',
'Visualization',
'Other',
];
/**
* **!Do not construct directly!**
*
* **!Only static methods because it gets serialized!**
*
* This represents the "canonical" version for an extension identifier. Extension ids
* have to be case-insensitive (due to the marketplace), but we must ensure case
* preservation because the extension API is already public at this time.
*
* For example, given an extension with the publisher `"Hello"` and the name `"World"`,
* its canonical extension identifier is `"Hello.World"`. This extension could be
* referenced in some other extension's dependencies using the string `"hello.world"`.
*
* To make matters more complicated, an extension can optionally have an UUID. When two
* extensions have the same UUID, they are considered equal even if their identifier is different.
*/
export class ExtensionIdentifier {
value;
_lower;
constructor(value) {
this.value = value;
this._lower = value.toLowerCase();
}
static equals(a, b) {
if (typeof a === 'undefined' || a === null) {
return typeof b === 'undefined' || b === null;
}
if (typeof b === 'undefined' || b === null) {
return false;
}
if (typeof a === 'string' || typeof b === 'string') {
// At least one of the arguments is an extension id in string form,
// so we have to use the string comparison which ignores case.
const aValue = typeof a === 'string' ? a : a.value;
const bValue = typeof b === 'string' ? b : b.value;
return strings.equalsIgnoreCase(aValue, bValue);
}
// Now we know both arguments are ExtensionIdentifier
return a._lower === b._lower;
}
/**
* Gives the value by which to index (for equality).
*/
static toKey(id) {
if (typeof id === 'string') {
return id.toLowerCase();
}
return id._lower;
}
}
export function isApplicationScopedExtension(manifest) {
return isLanguagePackExtension(manifest);
}
export function isLanguagePackExtension(manifest) {
return manifest.contributes && manifest.contributes.localizations
? manifest.contributes.localizations.length > 0
: false;
}
export function isAuthenticationProviderExtension(manifest) {
return manifest.contributes && manifest.contributes.authentication
? manifest.contributes.authentication.length > 0
: false;
}
export function isResolverExtension(manifest, remoteAuthority) {
if (remoteAuthority) {
const activationEvent = `onResolveRemoteAuthority:${getRemoteName(remoteAuthority)}`;
return manifest.activationEvents?.indexOf(activationEvent) !== -1;
}
return false;
}
export const IBuiltinExtensionsScannerService = createDecorator('IBuiltinExtensionsScannerService');