material-icon-theme 4.16.0 → 4.17.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.
- package/.eslintrc.json +51 -51
- package/.github/FUNDING.yml +3 -3
- package/.github/ISSUE_TEMPLATE/bug_report.md +34 -34
- package/.github/ISSUE_TEMPLATE/icon_request.md +27 -27
- package/.github/workflows/build.yml +45 -45
- package/.github/workflows/color-check.yml +22 -22
- package/.github/workflows/release.yml +73 -73
- package/.prettierrc +7 -7
- package/.vscode/extensions.json +3 -3
- package/.vscode/launch.json +43 -43
- package/.vscode/settings.json +14 -14
- package/.vscode/tasks.json +32 -32
- package/.vscodeignore +20 -20
- package/CHANGELOG.md +1152 -1135
- package/CONTRIBUTING.md +62 -62
- package/LICENSE.md +8 -8
- package/README.md +208 -209
- package/build/web-extension.webpack.config.js +62 -62
- package/build/webpack.config.js +39 -39
- package/changelog.config.json +4 -4
- package/icons/architecture.svg +5 -0
- package/icons/astyle.svg +4 -4
- package/icons/azure.svg +10 -1
- package/icons/blitz.svg +4 -4
- package/icons/buildkite.svg +9 -1
- package/icons/cypress.svg +4 -4
- package/icons/dart_generated.svg +9 -0
- package/icons/dependabot.svg +4 -4
- package/icons/dinophp.svg +16 -16
- package/icons/figma.svg +10 -10
- package/icons/folder-angular-open.svg +2 -2
- package/icons/folder-angular.svg +2 -2
- package/icons/folder-buildkite-open.svg +9 -0
- package/icons/folder-buildkite.svg +8 -0
- package/icons/folder-cypress-open.svg +5 -5
- package/icons/folder-cypress.svg +5 -5
- package/icons/folder-java-open.svg +2 -2
- package/icons/folder-java.svg +2 -2
- package/icons/folder-next-open.svg +2 -2
- package/icons/folder-next.svg +2 -2
- package/icons/folder-nuxt-open.svg +2 -1
- package/icons/folder-nuxt.svg +2 -1
- package/icons/folder-queue-open.svg +2 -2
- package/icons/folder-queue.svg +2 -2
- package/icons/folder-resolver-open.svg +2 -2
- package/icons/folder-resolver.svg +2 -2
- package/icons/folder-serverless-open.svg +5 -5
- package/icons/folder-serverless.svg +5 -5
- package/icons/folder-shader-open.svg +8 -0
- package/icons/folder-shader.svg +7 -0
- package/icons/folder-target-open.svg +2 -2
- package/icons/folder-target.svg +2 -2
- package/icons/folder-unity-open.svg +2 -2
- package/icons/folder-unity.svg +2 -2
- package/icons/folder-vercel-open.svg +4 -4
- package/icons/folder-vercel.svg +4 -4
- package/icons/folder-verdaccio-open.svg +8 -0
- package/icons/folder-verdaccio.svg +8 -0
- package/icons/gleam.svg +4 -4
- package/icons/gridsome.svg +4 -4
- package/icons/hardhat.svg +3 -3
- package/icons/lighthouse.svg +2 -2
- package/icons/ndst.svg +7 -7
- package/icons/next.svg +3 -3
- package/icons/next_light.svg +2 -2
- package/icons/nuxt.svg +5 -1
- package/icons/odin.svg +6 -6
- package/icons/otne.svg +16 -0
- package/icons/parcel.svg +4 -4
- package/icons/playwright.svg +7 -7
- package/icons/plop.svg +4 -0
- package/icons/pnpm.svg +9 -9
- package/icons/pnpm_light.svg +7 -7
- package/icons/poetry.svg +1 -1
- package/icons/processing.svg +10 -10
- package/icons/remix.svg +4 -4
- package/icons/remix_light.svg +4 -4
- package/icons/rome.svg +5 -5
- package/icons/serverless.svg +4 -4
- package/icons/shader.svg +4 -0
- package/icons/siyuan.svg +9 -9
- package/icons/steadybit.svg +1 -1
- package/icons/svgr.svg +4 -4
- package/icons/tauri.svg +9 -9
- package/icons/template.svg +4 -4
- package/icons/tobi.svg +4 -4
- package/icons/tobimake.svg +14 -14
- package/icons/turborepo.svg +12 -12
- package/icons/turborepo_light.svg +12 -12
- package/icons/verdaccio.svg +5 -0
- package/images/contributors.png +0 -0
- package/images/fileIcons.png +0 -0
- package/images/folderIcons.png +0 -0
- package/logo.svg +21 -21
- package/material-colors.yml +257 -257
- package/package.json +264 -264
- package/package.nls.de.json +35 -35
- package/package.nls.es.json +32 -32
- package/package.nls.fr.json +32 -32
- package/package.nls.ja.json +35 -35
- package/package.nls.json +35 -35
- package/package.nls.nl.json +35 -35
- package/package.nls.pl.json +35 -35
- package/package.nls.pt-BR.json +32 -32
- package/package.nls.pt-PT.json +32 -32
- package/package.nls.ru.json +32 -32
- package/package.nls.zh-CN.json +32 -32
- package/package.nls.zh-TW.json +32 -32
- package/src/commands/activate.ts +26 -26
- package/src/commands/explorerArrows.ts +55 -55
- package/src/commands/folderColor.ts +96 -96
- package/src/commands/folders.ts +55 -55
- package/src/commands/grayscale.ts +55 -55
- package/src/commands/iconPacks.ts +68 -68
- package/src/commands/index.ts +30 -30
- package/src/commands/opacity.ts +46 -46
- package/src/commands/restoreConfig.ts +14 -14
- package/src/commands/saturation.ts +46 -46
- package/src/extension.ts +35 -35
- package/src/helpers/changeDetection.ts +68 -68
- package/src/helpers/customIcons.ts +8 -8
- package/src/helpers/fileConfig.ts +37 -37
- package/src/helpers/index.ts +100 -100
- package/src/helpers/objects.ts +58 -58
- package/src/helpers/types.ts +7 -7
- package/src/helpers/versioning.ts +73 -73
- package/src/i18n/index.ts +78 -78
- package/src/i18n/lang-de.ts +54 -54
- package/src/i18n/lang-en.ts +53 -53
- package/src/i18n/lang-es.ts +53 -53
- package/src/i18n/lang-fr.ts +53 -53
- package/src/i18n/lang-ja.ts +54 -54
- package/src/i18n/lang-nl.ts +54 -54
- package/src/i18n/lang-pl.ts +52 -52
- package/src/i18n/lang-pt-br.ts +53 -53
- package/src/i18n/lang-pt-pt.ts +53 -53
- package/src/i18n/lang-ru.ts +52 -52
- package/src/i18n/lang-uk.ts +54 -54
- package/src/i18n/lang-zh-cn.ts +52 -52
- package/src/i18n/lang-zh-tw.ts +52 -52
- package/src/icons/fileIcons.ts +1909 -1854
- package/src/icons/folderIcons.ts +769 -754
- package/src/icons/generator/constants.ts +29 -29
- package/src/icons/generator/fileGenerator.ts +216 -216
- package/src/icons/generator/folderGenerator.ts +340 -340
- package/src/icons/generator/iconOpacity.ts +111 -111
- package/src/icons/generator/iconSaturation.ts +140 -140
- package/src/icons/generator/index.ts +7 -7
- package/src/icons/generator/jsonGenerator.ts +187 -187
- package/src/icons/generator/languageGenerator.ts +127 -127
- package/src/icons/index.ts +4 -4
- package/src/icons/languageIcons.ts +136 -134
- package/src/messages/outdated.ts +33 -33
- package/src/messages/reload.ts +32 -32
- package/src/messages/start.ts +12 -12
- package/src/messages/update.ts +48 -48
- package/src/messages/welcome.ts +47 -47
- package/src/models/helpers/index.ts +1 -1
- package/src/models/helpers/themeStatus.ts +5 -5
- package/src/models/i18n/index.ts +1 -1
- package/src/models/i18n/translation.ts +50 -50
- package/src/models/iconConfiguration.ts +37 -37
- package/src/models/icons/defaultIcon.ts +16 -16
- package/src/models/icons/files/fileIcon.ts +49 -49
- package/src/models/icons/files/fileTypes.ts +14 -14
- package/src/models/icons/files/index.ts +2 -2
- package/src/models/icons/folders/folderIcon.ts +34 -34
- package/src/models/icons/folders/folderTheme.ts +23 -23
- package/src/models/icons/folders/index.ts +2 -2
- package/src/models/icons/iconJsonOptions.ts +23 -23
- package/src/models/icons/iconPack.ts +12 -12
- package/src/models/icons/index.ts +6 -6
- package/src/models/icons/languages/index.ts +1 -1
- package/src/models/icons/languages/languageIdentifier.ts +26 -26
- package/src/models/index.ts +4 -4
- package/src/models/scripts/contributors/contributor.ts +22 -22
- package/src/models/scripts/contributors/contributorsConfig.ts +10 -10
- package/src/scripts/contributors/contributors.css +24 -24
- package/src/scripts/contributors/index.ts +138 -138
- package/src/scripts/helpers/painter.ts +5 -5
- package/src/scripts/helpers/screenshots.ts +32 -32
- package/src/scripts/helpers/similarity.ts +47 -47
- package/src/scripts/helpers/titleCase.ts +7 -7
- package/src/scripts/icons/checks/checkIconAvailability.ts +215 -215
- package/src/scripts/icons/checks/checkIconConflicts.ts +154 -154
- package/src/scripts/icons/checks/checkIconUsage.ts +141 -141
- package/src/scripts/icons/checks/index.ts +7 -7
- package/src/scripts/icons/generateJson.ts +11 -11
- package/src/scripts/preview/index.ts +40 -40
- package/src/scripts/preview/preview.ts +165 -165
- package/src/scripts/preview/style.css +48 -48
- package/src/test/runTest.ts +26 -26
- package/src/test/spec/i18n/i18n.spec.ts +61 -61
- package/src/test/spec/icons/fileIcons.spec.ts +250 -250
- package/src/test/spec/icons/folderIcons.spec.ts +418 -418
- package/src/test/spec/icons/languageIcons.spec.ts +184 -184
- package/src/test/spec/index.ts +36 -36
- package/src/web/extension.ts +10 -10
- package/svgo.config.js +11 -11
- package/tsconfig.json +23 -23
- package/icons/nuxt_light.svg +0 -1
package/src/extension.ts
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
import * as vscode from 'vscode';
|
|
4
|
-
import * as commands from './commands';
|
|
5
|
-
import { detectConfigChanges } from './helpers/changeDetection';
|
|
6
|
-
import { checkThemeStatus, versionKey } from './helpers/versioning';
|
|
7
|
-
import * as i18n from './i18n';
|
|
8
|
-
import { showStartMessages } from './messages/start';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* This method is called when the extension is activated.
|
|
12
|
-
* It initializes the core functionality of the extension.
|
|
13
|
-
*/
|
|
14
|
-
export const activate = async (context: vscode.ExtensionContext) => {
|
|
15
|
-
try {
|
|
16
|
-
await i18n.initTranslations();
|
|
17
|
-
context.globalState.setKeysForSync([versionKey]);
|
|
18
|
-
const status = await checkThemeStatus(context.globalState);
|
|
19
|
-
showStartMessages(status);
|
|
20
|
-
|
|
21
|
-
// Subscribe to the extension commands
|
|
22
|
-
context.subscriptions.push(...commands.registered);
|
|
23
|
-
|
|
24
|
-
// Initially trigger the config change detection
|
|
25
|
-
detectConfigChanges();
|
|
26
|
-
|
|
27
|
-
// Observe changes in the config
|
|
28
|
-
vscode.workspace.onDidChangeConfiguration(detectConfigChanges);
|
|
29
|
-
} catch (error) {
|
|
30
|
-
console.error(error);
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
/** This method is called when the extension is deactivated */
|
|
35
|
-
export const deactivate = () => {};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import * as vscode from 'vscode';
|
|
4
|
+
import * as commands from './commands';
|
|
5
|
+
import { detectConfigChanges } from './helpers/changeDetection';
|
|
6
|
+
import { checkThemeStatus, versionKey } from './helpers/versioning';
|
|
7
|
+
import * as i18n from './i18n';
|
|
8
|
+
import { showStartMessages } from './messages/start';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* This method is called when the extension is activated.
|
|
12
|
+
* It initializes the core functionality of the extension.
|
|
13
|
+
*/
|
|
14
|
+
export const activate = async (context: vscode.ExtensionContext) => {
|
|
15
|
+
try {
|
|
16
|
+
await i18n.initTranslations();
|
|
17
|
+
context.globalState.setKeysForSync([versionKey]);
|
|
18
|
+
const status = await checkThemeStatus(context.globalState);
|
|
19
|
+
showStartMessages(status);
|
|
20
|
+
|
|
21
|
+
// Subscribe to the extension commands
|
|
22
|
+
context.subscriptions.push(...commands.registered);
|
|
23
|
+
|
|
24
|
+
// Initially trigger the config change detection
|
|
25
|
+
detectConfigChanges();
|
|
26
|
+
|
|
27
|
+
// Observe changes in the config
|
|
28
|
+
vscode.workspace.onDidChangeConfiguration(detectConfigChanges);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.error(error);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/** This method is called when the extension is deactivated */
|
|
35
|
+
export const deactivate = () => {};
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
import { getConfigProperties, getMaterialIconsJSON, getThemeConfig } from '.';
|
|
2
|
-
import { createIconFile } from '../icons/index';
|
|
3
|
-
import { IconJsonOptions } from '../models';
|
|
4
|
-
import { getObjectPropertyValue, setObjectPropertyValue } from './objects';
|
|
5
|
-
|
|
6
|
-
/** Compare the workspace and the user configurations with the current setup of the icons. */
|
|
7
|
-
export const detectConfigChanges = () => {
|
|
8
|
-
const changes = compareConfigs();
|
|
9
|
-
|
|
10
|
-
// if there's nothing to update
|
|
11
|
-
if (Object.keys(changes.updatedConfigs).length === 0) return;
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
// update icon json file with new options
|
|
15
|
-
createIconFile(changes.updatedConfigs, changes.updatedJSONConfig);
|
|
16
|
-
} catch (error) {
|
|
17
|
-
console.error(error);
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Compares a specific configuration in the settings with a current configuration state.
|
|
23
|
-
* The current configuration state is read from the icons json file.
|
|
24
|
-
* @returns List of configurations that needs to be updated.
|
|
25
|
-
*/
|
|
26
|
-
const compareConfigs = (): {
|
|
27
|
-
updatedConfigs: IconJsonOptions;
|
|
28
|
-
updatedJSONConfig: IconJsonOptions;
|
|
29
|
-
} => {
|
|
30
|
-
const configs = Object.keys(getConfigProperties())
|
|
31
|
-
.map((c) => c.split('.').slice(1).join('.'))
|
|
32
|
-
// remove configurable notification messages
|
|
33
|
-
.filter((c) => !/show(Welcome|Update|Reload)Message/g.test(c));
|
|
34
|
-
|
|
35
|
-
const json = getMaterialIconsJSON();
|
|
36
|
-
return configs.reduce(
|
|
37
|
-
(result, configName) => {
|
|
38
|
-
try {
|
|
39
|
-
const themeConfig = getThemeConfig(configName) ?? {
|
|
40
|
-
globalValue: '',
|
|
41
|
-
defaultValue: '',
|
|
42
|
-
};
|
|
43
|
-
const configValue = themeConfig.globalValue ?? themeConfig.defaultValue;
|
|
44
|
-
const currentState = getObjectPropertyValue(
|
|
45
|
-
json.options ?? {},
|
|
46
|
-
configName
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
if (JSON.stringify(configValue) !== JSON.stringify(currentState)) {
|
|
50
|
-
setObjectPropertyValue(json.options as {}, configName, configValue);
|
|
51
|
-
setObjectPropertyValue(
|
|
52
|
-
result.updatedConfigs,
|
|
53
|
-
configName,
|
|
54
|
-
configValue
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
} catch (error) {
|
|
58
|
-
console.error(error);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return result;
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
updatedConfigs: {} as IconJsonOptions,
|
|
65
|
-
updatedJSONConfig: json.options as IconJsonOptions,
|
|
66
|
-
}
|
|
67
|
-
);
|
|
68
|
-
};
|
|
1
|
+
import { getConfigProperties, getMaterialIconsJSON, getThemeConfig } from '.';
|
|
2
|
+
import { createIconFile } from '../icons/index';
|
|
3
|
+
import { IconJsonOptions } from '../models';
|
|
4
|
+
import { getObjectPropertyValue, setObjectPropertyValue } from './objects';
|
|
5
|
+
|
|
6
|
+
/** Compare the workspace and the user configurations with the current setup of the icons. */
|
|
7
|
+
export const detectConfigChanges = () => {
|
|
8
|
+
const changes = compareConfigs();
|
|
9
|
+
|
|
10
|
+
// if there's nothing to update
|
|
11
|
+
if (Object.keys(changes.updatedConfigs).length === 0) return;
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
// update icon json file with new options
|
|
15
|
+
createIconFile(changes.updatedConfigs, changes.updatedJSONConfig);
|
|
16
|
+
} catch (error) {
|
|
17
|
+
console.error(error);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Compares a specific configuration in the settings with a current configuration state.
|
|
23
|
+
* The current configuration state is read from the icons json file.
|
|
24
|
+
* @returns List of configurations that needs to be updated.
|
|
25
|
+
*/
|
|
26
|
+
const compareConfigs = (): {
|
|
27
|
+
updatedConfigs: IconJsonOptions;
|
|
28
|
+
updatedJSONConfig: IconJsonOptions;
|
|
29
|
+
} => {
|
|
30
|
+
const configs = Object.keys(getConfigProperties())
|
|
31
|
+
.map((c) => c.split('.').slice(1).join('.'))
|
|
32
|
+
// remove configurable notification messages
|
|
33
|
+
.filter((c) => !/show(Welcome|Update|Reload)Message/g.test(c));
|
|
34
|
+
|
|
35
|
+
const json = getMaterialIconsJSON();
|
|
36
|
+
return configs.reduce(
|
|
37
|
+
(result, configName) => {
|
|
38
|
+
try {
|
|
39
|
+
const themeConfig = getThemeConfig(configName) ?? {
|
|
40
|
+
globalValue: '',
|
|
41
|
+
defaultValue: '',
|
|
42
|
+
};
|
|
43
|
+
const configValue = themeConfig.globalValue ?? themeConfig.defaultValue;
|
|
44
|
+
const currentState = getObjectPropertyValue(
|
|
45
|
+
json.options ?? {},
|
|
46
|
+
configName
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
if (JSON.stringify(configValue) !== JSON.stringify(currentState)) {
|
|
50
|
+
setObjectPropertyValue(json.options as {}, configName, configValue);
|
|
51
|
+
setObjectPropertyValue(
|
|
52
|
+
result.updatedConfigs,
|
|
53
|
+
configName,
|
|
54
|
+
configValue
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
} catch (error) {
|
|
58
|
+
console.error(error);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return result;
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
updatedConfigs: {} as IconJsonOptions,
|
|
65
|
+
updatedJSONConfig: json.options as IconJsonOptions,
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { IconJsonOptions } from '../models';
|
|
2
|
-
import * as path from 'path';
|
|
3
|
-
|
|
4
|
-
export const getCustomIconPaths = (options: IconJsonOptions) => {
|
|
5
|
-
return Object.values(options?.files?.associations ?? {})
|
|
6
|
-
.filter((v) => v.match(/^[.\/]+/)) // <- custom dirs have a relative path to the dist folder
|
|
7
|
-
.map((v) => path.dirname(path.join(__dirname, v)));
|
|
8
|
-
};
|
|
1
|
+
import { IconJsonOptions } from '../models';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
|
|
4
|
+
export const getCustomIconPaths = (options: IconJsonOptions) => {
|
|
5
|
+
return Object.values(options?.files?.associations ?? {})
|
|
6
|
+
.filter((v) => v.match(/^[.\/]+/)) // <- custom dirs have a relative path to the dist folder
|
|
7
|
+
.map((v) => path.dirname(path.join(__dirname, v)));
|
|
8
|
+
};
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import { getDefaultIconOptions } from '../icons';
|
|
2
|
-
import { IconJsonOptions } from '../models';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Generate a config hashed string that is appended to each icon file name.
|
|
6
|
-
* @param config Icon Configuration object
|
|
7
|
-
*/
|
|
8
|
-
export const getFileConfigHash = (options: IconJsonOptions): string => {
|
|
9
|
-
try {
|
|
10
|
-
const defaults = getDefaultIconOptions();
|
|
11
|
-
let fileConfigString = '';
|
|
12
|
-
if (
|
|
13
|
-
options.saturation !== defaults.saturation ||
|
|
14
|
-
options.opacity !== defaults.opacity ||
|
|
15
|
-
options.folders?.color !== defaults.folders.color
|
|
16
|
-
) {
|
|
17
|
-
fileConfigString += `~${getHash(JSON.stringify(options))}`;
|
|
18
|
-
}
|
|
19
|
-
return fileConfigString;
|
|
20
|
-
} catch (error) {
|
|
21
|
-
console.error(error);
|
|
22
|
-
return '';
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
const getHash = (value: string) => {
|
|
27
|
-
let hash = 0;
|
|
28
|
-
let chr = 0;
|
|
29
|
-
|
|
30
|
-
if (value.length === 0) return hash;
|
|
31
|
-
for (let i = 0; i < value.length; i++) {
|
|
32
|
-
chr = value.charCodeAt(i);
|
|
33
|
-
hash = (hash << 5) - hash + chr;
|
|
34
|
-
hash |= 0; // Convert to 32bit integer
|
|
35
|
-
}
|
|
36
|
-
return hash;
|
|
37
|
-
};
|
|
1
|
+
import { getDefaultIconOptions } from '../icons';
|
|
2
|
+
import { IconJsonOptions } from '../models';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Generate a config hashed string that is appended to each icon file name.
|
|
6
|
+
* @param config Icon Configuration object
|
|
7
|
+
*/
|
|
8
|
+
export const getFileConfigHash = (options: IconJsonOptions): string => {
|
|
9
|
+
try {
|
|
10
|
+
const defaults = getDefaultIconOptions();
|
|
11
|
+
let fileConfigString = '';
|
|
12
|
+
if (
|
|
13
|
+
options.saturation !== defaults.saturation ||
|
|
14
|
+
options.opacity !== defaults.opacity ||
|
|
15
|
+
options.folders?.color !== defaults.folders.color
|
|
16
|
+
) {
|
|
17
|
+
fileConfigString += `~${getHash(JSON.stringify(options))}`;
|
|
18
|
+
}
|
|
19
|
+
return fileConfigString;
|
|
20
|
+
} catch (error) {
|
|
21
|
+
console.error(error);
|
|
22
|
+
return '';
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const getHash = (value: string) => {
|
|
27
|
+
let hash = 0;
|
|
28
|
+
let chr = 0;
|
|
29
|
+
|
|
30
|
+
if (value.length === 0) return hash;
|
|
31
|
+
for (let i = 0; i < value.length; i++) {
|
|
32
|
+
chr = value.charCodeAt(i);
|
|
33
|
+
hash = (hash << 5) - hash + chr;
|
|
34
|
+
hash |= 0; // Convert to 32bit integer
|
|
35
|
+
}
|
|
36
|
+
return hash;
|
|
37
|
+
};
|
package/src/helpers/index.ts
CHANGED
|
@@ -1,100 +1,100 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import * as path from 'path';
|
|
3
|
-
import * as vscode from 'vscode';
|
|
4
|
-
import { iconJsonName } from '../icons/index';
|
|
5
|
-
import { IconConfiguration } from '../models/index';
|
|
6
|
-
import * as reloadMessages from './../messages/reload';
|
|
7
|
-
|
|
8
|
-
/** Get configuration of vs code. */
|
|
9
|
-
export const getConfig = (section?: string) => {
|
|
10
|
-
return vscode.workspace.getConfiguration(section);
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
/** Get list of configuration entries of package.json */
|
|
14
|
-
export const getConfigProperties = (): { [config: string]: unknown } => {
|
|
15
|
-
return vscode.extensions.getExtension('PKief.material-icon-theme')
|
|
16
|
-
?.packageJSON?.contributes?.configuration?.properties;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
/** Update configuration of vs code. */
|
|
20
|
-
export const setConfig = (
|
|
21
|
-
section: string,
|
|
22
|
-
value: any,
|
|
23
|
-
global: boolean = false
|
|
24
|
-
) => {
|
|
25
|
-
return getConfig().update(section, value, global);
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export const getThemeConfig = (section: string) => {
|
|
29
|
-
return getConfig('material-icon-theme').inspect(section);
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/** Set the config of the theme. */
|
|
33
|
-
export const setThemeConfig = (
|
|
34
|
-
section: string,
|
|
35
|
-
value: any,
|
|
36
|
-
global: boolean = false
|
|
37
|
-
) => {
|
|
38
|
-
return getConfig('material-icon-theme').update(section, value, global);
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Checks if the theme is the active icon theme
|
|
43
|
-
* @param{boolean} global false by default
|
|
44
|
-
*/
|
|
45
|
-
export const isThemeActivated = (global: boolean = false): boolean => {
|
|
46
|
-
return global
|
|
47
|
-
? getConfig().inspect('workbench.iconTheme')?.globalValue ===
|
|
48
|
-
'material-icon-theme'
|
|
49
|
-
: getConfig().inspect('workbench.iconTheme')?.workspaceValue ===
|
|
50
|
-
'material-icon-theme';
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
/** Checks if the theme is not the active icon theme */
|
|
54
|
-
export const isThemeNotVisible = (): boolean => {
|
|
55
|
-
const config = getConfig().inspect('workbench.iconTheme');
|
|
56
|
-
return (
|
|
57
|
-
(!isThemeActivated(true) && !config?.workspaceValue) || // no workspace and not global
|
|
58
|
-
(!isThemeActivated() && !!config?.workspaceValue)
|
|
59
|
-
);
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
/** Return the path of the extension in the file system. */
|
|
63
|
-
export const getExtensionPath = () =>
|
|
64
|
-
vscode.extensions.getExtension('PKief.material-icon-theme')?.extensionPath ??
|
|
65
|
-
'';
|
|
66
|
-
|
|
67
|
-
/** Get the configuration of the icons as JSON Object */
|
|
68
|
-
export const getMaterialIconsJSON = (): IconConfiguration => {
|
|
69
|
-
const iconJSONPath = path.join(getExtensionPath(), 'dist', iconJsonName);
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
const data = fs.readFileSync(iconJSONPath, 'utf8');
|
|
73
|
-
return JSON.parse(data);
|
|
74
|
-
} catch (error) {
|
|
75
|
-
console.error(error);
|
|
76
|
-
return {};
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
/** Reload vs code window */
|
|
81
|
-
export const promptToReload = async () => {
|
|
82
|
-
const result = await reloadMessages.showConfirmToReloadMessage();
|
|
83
|
-
if (result) reloadWindow();
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
const reloadWindow = () => {
|
|
87
|
-
return vscode.commands.executeCommand('workbench.action.reloadWindow');
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
/** Capitalize the first letter of a string */
|
|
91
|
-
export const capitalizeFirstLetter = (name: string): string =>
|
|
92
|
-
name.charAt(0).toUpperCase() + name.slice(1);
|
|
93
|
-
|
|
94
|
-
/** TitleCase all words in a string */
|
|
95
|
-
export const toTitleCase = (value: string) => {
|
|
96
|
-
return value.replace(
|
|
97
|
-
/\w\S*/g,
|
|
98
|
-
(text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase()
|
|
99
|
-
);
|
|
100
|
-
};
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as vscode from 'vscode';
|
|
4
|
+
import { iconJsonName } from '../icons/index';
|
|
5
|
+
import { IconConfiguration } from '../models/index';
|
|
6
|
+
import * as reloadMessages from './../messages/reload';
|
|
7
|
+
|
|
8
|
+
/** Get configuration of vs code. */
|
|
9
|
+
export const getConfig = (section?: string) => {
|
|
10
|
+
return vscode.workspace.getConfiguration(section);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/** Get list of configuration entries of package.json */
|
|
14
|
+
export const getConfigProperties = (): { [config: string]: unknown } => {
|
|
15
|
+
return vscode.extensions.getExtension('PKief.material-icon-theme')
|
|
16
|
+
?.packageJSON?.contributes?.configuration?.properties;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/** Update configuration of vs code. */
|
|
20
|
+
export const setConfig = (
|
|
21
|
+
section: string,
|
|
22
|
+
value: any,
|
|
23
|
+
global: boolean = false
|
|
24
|
+
) => {
|
|
25
|
+
return getConfig().update(section, value, global);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const getThemeConfig = (section: string) => {
|
|
29
|
+
return getConfig('material-icon-theme').inspect(section);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/** Set the config of the theme. */
|
|
33
|
+
export const setThemeConfig = (
|
|
34
|
+
section: string,
|
|
35
|
+
value: any,
|
|
36
|
+
global: boolean = false
|
|
37
|
+
) => {
|
|
38
|
+
return getConfig('material-icon-theme').update(section, value, global);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Checks if the theme is the active icon theme
|
|
43
|
+
* @param{boolean} global false by default
|
|
44
|
+
*/
|
|
45
|
+
export const isThemeActivated = (global: boolean = false): boolean => {
|
|
46
|
+
return global
|
|
47
|
+
? getConfig().inspect('workbench.iconTheme')?.globalValue ===
|
|
48
|
+
'material-icon-theme'
|
|
49
|
+
: getConfig().inspect('workbench.iconTheme')?.workspaceValue ===
|
|
50
|
+
'material-icon-theme';
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/** Checks if the theme is not the active icon theme */
|
|
54
|
+
export const isThemeNotVisible = (): boolean => {
|
|
55
|
+
const config = getConfig().inspect('workbench.iconTheme');
|
|
56
|
+
return (
|
|
57
|
+
(!isThemeActivated(true) && !config?.workspaceValue) || // no workspace and not global
|
|
58
|
+
(!isThemeActivated() && !!config?.workspaceValue)
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/** Return the path of the extension in the file system. */
|
|
63
|
+
export const getExtensionPath = () =>
|
|
64
|
+
vscode.extensions.getExtension('PKief.material-icon-theme')?.extensionPath ??
|
|
65
|
+
'';
|
|
66
|
+
|
|
67
|
+
/** Get the configuration of the icons as JSON Object */
|
|
68
|
+
export const getMaterialIconsJSON = (): IconConfiguration => {
|
|
69
|
+
const iconJSONPath = path.join(getExtensionPath(), 'dist', iconJsonName);
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
const data = fs.readFileSync(iconJSONPath, 'utf8');
|
|
73
|
+
return JSON.parse(data);
|
|
74
|
+
} catch (error) {
|
|
75
|
+
console.error(error);
|
|
76
|
+
return {};
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
/** Reload vs code window */
|
|
81
|
+
export const promptToReload = async () => {
|
|
82
|
+
const result = await reloadMessages.showConfirmToReloadMessage();
|
|
83
|
+
if (result) reloadWindow();
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const reloadWindow = () => {
|
|
87
|
+
return vscode.commands.executeCommand('workbench.action.reloadWindow');
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/** Capitalize the first letter of a string */
|
|
91
|
+
export const capitalizeFirstLetter = (name: string): string =>
|
|
92
|
+
name.charAt(0).toUpperCase() + name.slice(1);
|
|
93
|
+
|
|
94
|
+
/** TitleCase all words in a string */
|
|
95
|
+
export const toTitleCase = (value: string) => {
|
|
96
|
+
return value.replace(
|
|
97
|
+
/\w\S*/g,
|
|
98
|
+
(text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase()
|
|
99
|
+
);
|
|
100
|
+
};
|
package/src/helpers/objects.ts
CHANGED
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get the nested properties of an object.
|
|
3
|
-
* This solution is lighter than the lodash get-version.
|
|
4
|
-
* Source: http://stackoverflow.com/a/6491621/6942210
|
|
5
|
-
*/
|
|
6
|
-
export const getObjectPropertyValue = (obj: Object, path: string) => {
|
|
7
|
-
const pathArray = path
|
|
8
|
-
.replace(/\[(\w+)\]/g, '.$1') // convert indexes to properties
|
|
9
|
-
.replace(/^\./, '') // strip a leading dot
|
|
10
|
-
.split('.'); // separate paths in array
|
|
11
|
-
|
|
12
|
-
/** Avoid errors in the getValue function. */
|
|
13
|
-
const isObject = (object: unknown) => {
|
|
14
|
-
return object === Object(object);
|
|
15
|
-
};
|
|
16
|
-
let result = JSON.parse(JSON.stringify(obj));
|
|
17
|
-
|
|
18
|
-
for (let i = 0; i < pathArray.length; ++i) {
|
|
19
|
-
const k = pathArray[i];
|
|
20
|
-
if (isObject(result) && k in result) {
|
|
21
|
-
result = result[k];
|
|
22
|
-
} else {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return result;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Set a value for a nested object property.
|
|
31
|
-
* @param obj Object
|
|
32
|
-
* @param path Properties as string e.g. `'a.b.c'`
|
|
33
|
-
* @param value Value to be set for the given property
|
|
34
|
-
* Source: https://stackoverflow.com/a/13719799/6942210
|
|
35
|
-
*/
|
|
36
|
-
export const setObjectPropertyValue = (
|
|
37
|
-
obj: { [key: string]: any },
|
|
38
|
-
path: string | string[],
|
|
39
|
-
value: any
|
|
40
|
-
) => {
|
|
41
|
-
if (typeof path === 'string') {
|
|
42
|
-
path = path.split('.');
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (path.length > 1) {
|
|
46
|
-
const e = path.shift() ?? '';
|
|
47
|
-
setObjectPropertyValue(
|
|
48
|
-
(obj[e] =
|
|
49
|
-
Object.prototype.toString.call(obj[e]) === '[object Object]'
|
|
50
|
-
? obj[e]
|
|
51
|
-
: {}),
|
|
52
|
-
path,
|
|
53
|
-
value
|
|
54
|
-
);
|
|
55
|
-
} else {
|
|
56
|
-
obj[path[0]] = value;
|
|
57
|
-
}
|
|
58
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Get the nested properties of an object.
|
|
3
|
+
* This solution is lighter than the lodash get-version.
|
|
4
|
+
* Source: http://stackoverflow.com/a/6491621/6942210
|
|
5
|
+
*/
|
|
6
|
+
export const getObjectPropertyValue = (obj: Object, path: string) => {
|
|
7
|
+
const pathArray = path
|
|
8
|
+
.replace(/\[(\w+)\]/g, '.$1') // convert indexes to properties
|
|
9
|
+
.replace(/^\./, '') // strip a leading dot
|
|
10
|
+
.split('.'); // separate paths in array
|
|
11
|
+
|
|
12
|
+
/** Avoid errors in the getValue function. */
|
|
13
|
+
const isObject = (object: unknown) => {
|
|
14
|
+
return object === Object(object);
|
|
15
|
+
};
|
|
16
|
+
let result = JSON.parse(JSON.stringify(obj));
|
|
17
|
+
|
|
18
|
+
for (let i = 0; i < pathArray.length; ++i) {
|
|
19
|
+
const k = pathArray[i];
|
|
20
|
+
if (isObject(result) && k in result) {
|
|
21
|
+
result = result[k];
|
|
22
|
+
} else {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Set a value for a nested object property.
|
|
31
|
+
* @param obj Object
|
|
32
|
+
* @param path Properties as string e.g. `'a.b.c'`
|
|
33
|
+
* @param value Value to be set for the given property
|
|
34
|
+
* Source: https://stackoverflow.com/a/13719799/6942210
|
|
35
|
+
*/
|
|
36
|
+
export const setObjectPropertyValue = (
|
|
37
|
+
obj: { [key: string]: any },
|
|
38
|
+
path: string | string[],
|
|
39
|
+
value: any
|
|
40
|
+
) => {
|
|
41
|
+
if (typeof path === 'string') {
|
|
42
|
+
path = path.split('.');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (path.length > 1) {
|
|
46
|
+
const e = path.shift() ?? '';
|
|
47
|
+
setObjectPropertyValue(
|
|
48
|
+
(obj[e] =
|
|
49
|
+
Object.prototype.toString.call(obj[e]) === '[object Object]'
|
|
50
|
+
? obj[e]
|
|
51
|
+
: {}),
|
|
52
|
+
path,
|
|
53
|
+
value
|
|
54
|
+
);
|
|
55
|
+
} else {
|
|
56
|
+
obj[path[0]] = value;
|
|
57
|
+
}
|
|
58
|
+
};
|
package/src/helpers/types.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<
|
|
2
|
-
T,
|
|
3
|
-
Exclude<keyof T, Keys>
|
|
4
|
-
> &
|
|
5
|
-
{
|
|
6
|
-
[K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;
|
|
7
|
-
}[Keys];
|
|
1
|
+
export type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<
|
|
2
|
+
T,
|
|
3
|
+
Exclude<keyof T, Keys>
|
|
4
|
+
> &
|
|
5
|
+
{
|
|
6
|
+
[K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;
|
|
7
|
+
}[Keys];
|