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
|
@@ -1,215 +1,215 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import * as path from 'path';
|
|
3
|
-
import {
|
|
4
|
-
DefaultIcon,
|
|
5
|
-
FileIcon,
|
|
6
|
-
FolderIcon,
|
|
7
|
-
FolderTheme,
|
|
8
|
-
} from '../../../models/index';
|
|
9
|
-
import * as painter from '../../helpers/painter';
|
|
10
|
-
import { similarity } from '../../helpers/similarity';
|
|
11
|
-
import {
|
|
12
|
-
fileIcons,
|
|
13
|
-
folderIcons,
|
|
14
|
-
highContrastColorFileEnding,
|
|
15
|
-
languageIcons,
|
|
16
|
-
lightColorFileEnding,
|
|
17
|
-
openedFolder,
|
|
18
|
-
} from './../../../icons';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Defines the folder where all icon files are located.
|
|
22
|
-
*/
|
|
23
|
-
const folderPath = path.join('icons');
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Defines an array with all icons that can be found in the file system.
|
|
27
|
-
*/
|
|
28
|
-
const availableIcons: Record<string, string> = {};
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Save the misconfigured icons.
|
|
32
|
-
*/
|
|
33
|
-
const wrongIconNames: Record<string, string[]> = {
|
|
34
|
-
fileIcons: [],
|
|
35
|
-
folderIcons: [],
|
|
36
|
-
languageIcons: [],
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Get all icon file names from the file system.
|
|
41
|
-
*/
|
|
42
|
-
const fsReadAllIconFiles = (
|
|
43
|
-
err: NodeJS.ErrnoException | null,
|
|
44
|
-
files: string[]
|
|
45
|
-
) => {
|
|
46
|
-
if (err) {
|
|
47
|
-
throw Error(err.message);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
files.forEach((file) => {
|
|
51
|
-
const fileName = file;
|
|
52
|
-
const iconName = path.parse(file).name;
|
|
53
|
-
availableIcons[iconName] = fileName;
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// check icon configurations
|
|
57
|
-
checkFileIcons();
|
|
58
|
-
checkFolderIcons();
|
|
59
|
-
checkLanguageIcons();
|
|
60
|
-
|
|
61
|
-
// show error messages
|
|
62
|
-
handleErrors();
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
// read from the file system
|
|
66
|
-
export const check = () => fs.readdir(folderPath, fsReadAllIconFiles);
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Check if the file icons from the configuration are available on the file system.
|
|
70
|
-
*/
|
|
71
|
-
const checkFileIcons = () => {
|
|
72
|
-
[...fileIcons.icons, fileIcons.defaultIcon].forEach((icon) => {
|
|
73
|
-
isIconAvailable(icon, IconType.fileIcons, IconColor.default);
|
|
74
|
-
isIconAvailable(icon, IconType.fileIcons, IconColor.light);
|
|
75
|
-
isIconAvailable(icon, IconType.fileIcons, IconColor.highContrast);
|
|
76
|
-
});
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
const isIconAvailable = (
|
|
80
|
-
icon: FileIcon | FolderIcon | DefaultIcon,
|
|
81
|
-
iconType: IconType,
|
|
82
|
-
iconColor: IconColor,
|
|
83
|
-
hasOpenedFolder?: boolean
|
|
84
|
-
) => {
|
|
85
|
-
let iconName = `${icon.name}${hasOpenedFolder ? openedFolder : ''}`;
|
|
86
|
-
if (icon.light && iconColor === IconColor.light) {
|
|
87
|
-
iconName += lightColorFileEnding;
|
|
88
|
-
}
|
|
89
|
-
if (icon.highContrast && iconColor === IconColor.highContrast) {
|
|
90
|
-
iconName += highContrastColorFileEnding;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (
|
|
94
|
-
!availableIcons[iconName] &&
|
|
95
|
-
wrongIconNames[iconType].indexOf(iconName) === -1
|
|
96
|
-
) {
|
|
97
|
-
wrongIconNames[iconType].push(iconName);
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Check if the folder icons from the configuration are available on the file system.
|
|
103
|
-
*/
|
|
104
|
-
const checkFolderIcons = () => {
|
|
105
|
-
folderIcons
|
|
106
|
-
.map((theme) => (theme.name === 'none' ? [] : getAllFolderIcons(theme)))
|
|
107
|
-
.reduce((a, b) => a.concat(b))
|
|
108
|
-
.forEach((icon) => {
|
|
109
|
-
if (icon) {
|
|
110
|
-
isIconAvailable(icon, IconType.folderIcons, IconColor.default);
|
|
111
|
-
isIconAvailable(icon, IconType.folderIcons, IconColor.default, true);
|
|
112
|
-
isIconAvailable(icon, IconType.folderIcons, IconColor.light);
|
|
113
|
-
isIconAvailable(icon, IconType.folderIcons, IconColor.light, true);
|
|
114
|
-
isIconAvailable(icon, IconType.folderIcons, IconColor.highContrast);
|
|
115
|
-
isIconAvailable(
|
|
116
|
-
icon,
|
|
117
|
-
IconType.folderIcons,
|
|
118
|
-
IconColor.highContrast,
|
|
119
|
-
true
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
const getAllFolderIcons = (theme: FolderTheme) => {
|
|
126
|
-
const icons = theme.icons ? theme.icons : [];
|
|
127
|
-
return [theme.defaultIcon, theme.rootFolder, ...icons].filter(
|
|
128
|
-
(icon) => icon !== undefined
|
|
129
|
-
); // filter undefined root folder icons
|
|
130
|
-
};
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Check if the language icons from the configuration are available on the file system.
|
|
134
|
-
*/
|
|
135
|
-
const checkLanguageIcons = () => {
|
|
136
|
-
languageIcons.forEach((lang) => {
|
|
137
|
-
const icon = lang.icon;
|
|
138
|
-
isIconAvailable(icon, IconType.languageIcons, IconColor.default);
|
|
139
|
-
isIconAvailable(icon, IconType.languageIcons, IconColor.light);
|
|
140
|
-
isIconAvailable(icon, IconType.languageIcons, IconColor.highContrast);
|
|
141
|
-
});
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Show error messages in the terminal.
|
|
146
|
-
*/
|
|
147
|
-
const handleErrors = () => {
|
|
148
|
-
const amountOfErrors =
|
|
149
|
-
wrongIconNames.fileIcons.length +
|
|
150
|
-
wrongIconNames.folderIcons.length +
|
|
151
|
-
wrongIconNames.languageIcons.length;
|
|
152
|
-
if (amountOfErrors > 0) {
|
|
153
|
-
console.log(
|
|
154
|
-
'> Material Icon Theme:',
|
|
155
|
-
painter.red(`Found ${amountOfErrors} error(s) in the icon configuration!`)
|
|
156
|
-
);
|
|
157
|
-
} else {
|
|
158
|
-
console.log(
|
|
159
|
-
'> Material Icon Theme:',
|
|
160
|
-
painter.green('Passed icon availability checks!')
|
|
161
|
-
);
|
|
162
|
-
}
|
|
163
|
-
logIconInformation(wrongIconNames.fileIcons, 'File icons');
|
|
164
|
-
logIconInformation(wrongIconNames.folderIcons, 'Folder icons');
|
|
165
|
-
logIconInformation(wrongIconNames.languageIcons, 'Language icons');
|
|
166
|
-
|
|
167
|
-
if (amountOfErrors > 0) {
|
|
168
|
-
throw new Error(
|
|
169
|
-
'Found some wrong file definitions in the icon configuration.'
|
|
170
|
-
);
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
const logIconInformation = (wrongIcons: string[], title: string) => {
|
|
175
|
-
if (wrongIcons.length === 0) return;
|
|
176
|
-
console.log(`\n${title}:\n--------------------------------`);
|
|
177
|
-
wrongIcons.forEach((icon) => {
|
|
178
|
-
const suggestion = Object.keys(availableIcons).find((i) => {
|
|
179
|
-
return similarity(icon, i) > 0.75;
|
|
180
|
-
});
|
|
181
|
-
const suggestionString = suggestion
|
|
182
|
-
? ` (Did you mean ${painter.green(suggestion)}?)`
|
|
183
|
-
: '';
|
|
184
|
-
const isWrongLightVersion = icon.endsWith(lightColorFileEnding);
|
|
185
|
-
const isWrongLightVersionString = isWrongLightVersion
|
|
186
|
-
? ` (There is no light icon for ${painter.green(
|
|
187
|
-
icon.slice(0, -6)
|
|
188
|
-
)}! Set the light option to false!)`
|
|
189
|
-
: '';
|
|
190
|
-
const isWrongHighContrastVersion = icon.endsWith(
|
|
191
|
-
highContrastColorFileEnding
|
|
192
|
-
);
|
|
193
|
-
const isWrongHighContrastVersionString = isWrongHighContrastVersion
|
|
194
|
-
? ` (There is no high contrast icon for ${painter.green(
|
|
195
|
-
icon.slice(0, -13)
|
|
196
|
-
)}! Set the highContrast option to false!)`
|
|
197
|
-
: '';
|
|
198
|
-
console.log(
|
|
199
|
-
painter.red(`Icon not found: ${icon}.svg`) +
|
|
200
|
-
`${suggestionString}${isWrongLightVersionString}${isWrongHighContrastVersionString}`
|
|
201
|
-
);
|
|
202
|
-
});
|
|
203
|
-
};
|
|
204
|
-
|
|
205
|
-
enum IconType {
|
|
206
|
-
fileIcons = 'fileIcons',
|
|
207
|
-
folderIcons = 'folderIcons',
|
|
208
|
-
languageIcons = 'languageIcons',
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
enum IconColor {
|
|
212
|
-
default = 'default',
|
|
213
|
-
light = 'light',
|
|
214
|
-
highContrast = 'highContrast',
|
|
215
|
-
}
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import {
|
|
4
|
+
DefaultIcon,
|
|
5
|
+
FileIcon,
|
|
6
|
+
FolderIcon,
|
|
7
|
+
FolderTheme,
|
|
8
|
+
} from '../../../models/index';
|
|
9
|
+
import * as painter from '../../helpers/painter';
|
|
10
|
+
import { similarity } from '../../helpers/similarity';
|
|
11
|
+
import {
|
|
12
|
+
fileIcons,
|
|
13
|
+
folderIcons,
|
|
14
|
+
highContrastColorFileEnding,
|
|
15
|
+
languageIcons,
|
|
16
|
+
lightColorFileEnding,
|
|
17
|
+
openedFolder,
|
|
18
|
+
} from './../../../icons';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Defines the folder where all icon files are located.
|
|
22
|
+
*/
|
|
23
|
+
const folderPath = path.join('icons');
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Defines an array with all icons that can be found in the file system.
|
|
27
|
+
*/
|
|
28
|
+
const availableIcons: Record<string, string> = {};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Save the misconfigured icons.
|
|
32
|
+
*/
|
|
33
|
+
const wrongIconNames: Record<string, string[]> = {
|
|
34
|
+
fileIcons: [],
|
|
35
|
+
folderIcons: [],
|
|
36
|
+
languageIcons: [],
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Get all icon file names from the file system.
|
|
41
|
+
*/
|
|
42
|
+
const fsReadAllIconFiles = (
|
|
43
|
+
err: NodeJS.ErrnoException | null,
|
|
44
|
+
files: string[]
|
|
45
|
+
) => {
|
|
46
|
+
if (err) {
|
|
47
|
+
throw Error(err.message);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
files.forEach((file) => {
|
|
51
|
+
const fileName = file;
|
|
52
|
+
const iconName = path.parse(file).name;
|
|
53
|
+
availableIcons[iconName] = fileName;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// check icon configurations
|
|
57
|
+
checkFileIcons();
|
|
58
|
+
checkFolderIcons();
|
|
59
|
+
checkLanguageIcons();
|
|
60
|
+
|
|
61
|
+
// show error messages
|
|
62
|
+
handleErrors();
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// read from the file system
|
|
66
|
+
export const check = () => fs.readdir(folderPath, fsReadAllIconFiles);
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Check if the file icons from the configuration are available on the file system.
|
|
70
|
+
*/
|
|
71
|
+
const checkFileIcons = () => {
|
|
72
|
+
[...fileIcons.icons, fileIcons.defaultIcon].forEach((icon) => {
|
|
73
|
+
isIconAvailable(icon, IconType.fileIcons, IconColor.default);
|
|
74
|
+
isIconAvailable(icon, IconType.fileIcons, IconColor.light);
|
|
75
|
+
isIconAvailable(icon, IconType.fileIcons, IconColor.highContrast);
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const isIconAvailable = (
|
|
80
|
+
icon: FileIcon | FolderIcon | DefaultIcon,
|
|
81
|
+
iconType: IconType,
|
|
82
|
+
iconColor: IconColor,
|
|
83
|
+
hasOpenedFolder?: boolean
|
|
84
|
+
) => {
|
|
85
|
+
let iconName = `${icon.name}${hasOpenedFolder ? openedFolder : ''}`;
|
|
86
|
+
if (icon.light && iconColor === IconColor.light) {
|
|
87
|
+
iconName += lightColorFileEnding;
|
|
88
|
+
}
|
|
89
|
+
if (icon.highContrast && iconColor === IconColor.highContrast) {
|
|
90
|
+
iconName += highContrastColorFileEnding;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (
|
|
94
|
+
!availableIcons[iconName] &&
|
|
95
|
+
wrongIconNames[iconType].indexOf(iconName) === -1
|
|
96
|
+
) {
|
|
97
|
+
wrongIconNames[iconType].push(iconName);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Check if the folder icons from the configuration are available on the file system.
|
|
103
|
+
*/
|
|
104
|
+
const checkFolderIcons = () => {
|
|
105
|
+
folderIcons
|
|
106
|
+
.map((theme) => (theme.name === 'none' ? [] : getAllFolderIcons(theme)))
|
|
107
|
+
.reduce((a, b) => a.concat(b))
|
|
108
|
+
.forEach((icon) => {
|
|
109
|
+
if (icon) {
|
|
110
|
+
isIconAvailable(icon, IconType.folderIcons, IconColor.default);
|
|
111
|
+
isIconAvailable(icon, IconType.folderIcons, IconColor.default, true);
|
|
112
|
+
isIconAvailable(icon, IconType.folderIcons, IconColor.light);
|
|
113
|
+
isIconAvailable(icon, IconType.folderIcons, IconColor.light, true);
|
|
114
|
+
isIconAvailable(icon, IconType.folderIcons, IconColor.highContrast);
|
|
115
|
+
isIconAvailable(
|
|
116
|
+
icon,
|
|
117
|
+
IconType.folderIcons,
|
|
118
|
+
IconColor.highContrast,
|
|
119
|
+
true
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
const getAllFolderIcons = (theme: FolderTheme) => {
|
|
126
|
+
const icons = theme.icons ? theme.icons : [];
|
|
127
|
+
return [theme.defaultIcon, theme.rootFolder, ...icons].filter(
|
|
128
|
+
(icon) => icon !== undefined
|
|
129
|
+
); // filter undefined root folder icons
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Check if the language icons from the configuration are available on the file system.
|
|
134
|
+
*/
|
|
135
|
+
const checkLanguageIcons = () => {
|
|
136
|
+
languageIcons.forEach((lang) => {
|
|
137
|
+
const icon = lang.icon;
|
|
138
|
+
isIconAvailable(icon, IconType.languageIcons, IconColor.default);
|
|
139
|
+
isIconAvailable(icon, IconType.languageIcons, IconColor.light);
|
|
140
|
+
isIconAvailable(icon, IconType.languageIcons, IconColor.highContrast);
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Show error messages in the terminal.
|
|
146
|
+
*/
|
|
147
|
+
const handleErrors = () => {
|
|
148
|
+
const amountOfErrors =
|
|
149
|
+
wrongIconNames.fileIcons.length +
|
|
150
|
+
wrongIconNames.folderIcons.length +
|
|
151
|
+
wrongIconNames.languageIcons.length;
|
|
152
|
+
if (amountOfErrors > 0) {
|
|
153
|
+
console.log(
|
|
154
|
+
'> Material Icon Theme:',
|
|
155
|
+
painter.red(`Found ${amountOfErrors} error(s) in the icon configuration!`)
|
|
156
|
+
);
|
|
157
|
+
} else {
|
|
158
|
+
console.log(
|
|
159
|
+
'> Material Icon Theme:',
|
|
160
|
+
painter.green('Passed icon availability checks!')
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
logIconInformation(wrongIconNames.fileIcons, 'File icons');
|
|
164
|
+
logIconInformation(wrongIconNames.folderIcons, 'Folder icons');
|
|
165
|
+
logIconInformation(wrongIconNames.languageIcons, 'Language icons');
|
|
166
|
+
|
|
167
|
+
if (amountOfErrors > 0) {
|
|
168
|
+
throw new Error(
|
|
169
|
+
'Found some wrong file definitions in the icon configuration.'
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const logIconInformation = (wrongIcons: string[], title: string) => {
|
|
175
|
+
if (wrongIcons.length === 0) return;
|
|
176
|
+
console.log(`\n${title}:\n--------------------------------`);
|
|
177
|
+
wrongIcons.forEach((icon) => {
|
|
178
|
+
const suggestion = Object.keys(availableIcons).find((i) => {
|
|
179
|
+
return similarity(icon, i) > 0.75;
|
|
180
|
+
});
|
|
181
|
+
const suggestionString = suggestion
|
|
182
|
+
? ` (Did you mean ${painter.green(suggestion)}?)`
|
|
183
|
+
: '';
|
|
184
|
+
const isWrongLightVersion = icon.endsWith(lightColorFileEnding);
|
|
185
|
+
const isWrongLightVersionString = isWrongLightVersion
|
|
186
|
+
? ` (There is no light icon for ${painter.green(
|
|
187
|
+
icon.slice(0, -6)
|
|
188
|
+
)}! Set the light option to false!)`
|
|
189
|
+
: '';
|
|
190
|
+
const isWrongHighContrastVersion = icon.endsWith(
|
|
191
|
+
highContrastColorFileEnding
|
|
192
|
+
);
|
|
193
|
+
const isWrongHighContrastVersionString = isWrongHighContrastVersion
|
|
194
|
+
? ` (There is no high contrast icon for ${painter.green(
|
|
195
|
+
icon.slice(0, -13)
|
|
196
|
+
)}! Set the highContrast option to false!)`
|
|
197
|
+
: '';
|
|
198
|
+
console.log(
|
|
199
|
+
painter.red(`Icon not found: ${icon}.svg`) +
|
|
200
|
+
`${suggestionString}${isWrongLightVersionString}${isWrongHighContrastVersionString}`
|
|
201
|
+
);
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
enum IconType {
|
|
206
|
+
fileIcons = 'fileIcons',
|
|
207
|
+
folderIcons = 'folderIcons',
|
|
208
|
+
languageIcons = 'languageIcons',
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
enum IconColor {
|
|
212
|
+
default = 'default',
|
|
213
|
+
light = 'light',
|
|
214
|
+
highContrast = 'highContrast',
|
|
215
|
+
}
|