material-icon-theme 4.18.0 → 4.20.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 +1213 -1171
- package/CONTRIBUTING.md +62 -62
- package/LICENSE.md +8 -8
- package/README.md +208 -208
- 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 +4 -4
- package/icons/astyle.svg +4 -4
- package/icons/auto.svg +10 -0
- package/icons/auto_light.svg +10 -0
- package/icons/azure.svg +9 -9
- package/icons/blitz.svg +4 -4
- package/icons/buildkite.svg +8 -8
- package/icons/cypress.svg +4 -4
- package/icons/dart_generated.svg +9 -9
- 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 +8 -8
- package/icons/folder-buildkite.svg +7 -7
- package/icons/folder-cypress-open.svg +5 -5
- package/icons/folder-cypress.svg +5 -5
- package/icons/folder-gitlab-open.svg +2 -1
- package/icons/folder-gitlab.svg +2 -1
- 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 -2
- package/icons/folder-nuxt.svg +2 -2
- 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 +7 -7
- package/icons/folder-shader.svg +6 -6
- 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 -8
- package/icons/folder-verdaccio.svg +8 -8
- package/icons/gitlab.svg +1 -1
- 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/mdsvex.svg +5 -0
- package/icons/ndst.svg +7 -7
- package/icons/next.svg +3 -3
- package/icons/next_light.svg +2 -2
- package/icons/nuxt.svg +5 -5
- package/icons/odin.svg +6 -6
- package/icons/otne.svg +16 -16
- package/icons/parcel.svg +4 -4
- package/icons/playwright.svg +7 -7
- package/icons/plop.svg +4 -4
- 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/rescript-interface.svg +5 -5
- package/icons/rome.svg +5 -5
- package/icons/serverless.svg +4 -4
- package/icons/shader.svg +4 -4
- 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/tree.svg +2 -0
- package/icons/turborepo.svg +12 -12
- package/icons/turborepo_light.svg +12 -12
- package/icons/verdaccio.svg +5 -5
- 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 +267 -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 +42 -42
- package/src/helpers/changeDetection.ts +109 -73
- 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 +2095 -2046
- package/src/icons/folderIcons.ts +781 -773
- 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 +137 -136
- 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
|
@@ -1,187 +1,187 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import merge from 'lodash.merge';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import { getCustomIconPaths } from '../../helpers/customIcons';
|
|
5
|
-
import { getFileConfigHash } from '../../helpers/fileConfig';
|
|
6
|
-
import { IconConfiguration, IconJsonOptions } from '../../models/index';
|
|
7
|
-
import { fileIcons } from '../fileIcons';
|
|
8
|
-
import { folderIcons } from '../folderIcons';
|
|
9
|
-
import { languageIcons } from '../languageIcons';
|
|
10
|
-
import { iconJsonName } from './constants';
|
|
11
|
-
import {
|
|
12
|
-
generateFolderIcons,
|
|
13
|
-
loadFileIconDefinitions,
|
|
14
|
-
loadFolderIconDefinitions,
|
|
15
|
-
loadLanguageIconDefinitions,
|
|
16
|
-
setIconOpacity,
|
|
17
|
-
setIconSaturation,
|
|
18
|
-
validateHEXColorCode,
|
|
19
|
-
validateOpacityValue,
|
|
20
|
-
validateSaturationValue,
|
|
21
|
-
} from './index';
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Generate the complete icon configuration object that can be written as JSON file.
|
|
25
|
-
*/
|
|
26
|
-
export const generateIconConfigurationObject = (
|
|
27
|
-
options: IconJsonOptions
|
|
28
|
-
): IconConfiguration => {
|
|
29
|
-
const iconConfig = merge({}, new IconConfiguration(), { options });
|
|
30
|
-
const languageIconDefinitions = loadLanguageIconDefinitions(
|
|
31
|
-
languageIcons,
|
|
32
|
-
iconConfig,
|
|
33
|
-
options
|
|
34
|
-
);
|
|
35
|
-
const fileIconDefinitions = loadFileIconDefinitions(
|
|
36
|
-
fileIcons,
|
|
37
|
-
iconConfig,
|
|
38
|
-
options
|
|
39
|
-
);
|
|
40
|
-
const folderIconDefinitions = loadFolderIconDefinitions(
|
|
41
|
-
folderIcons,
|
|
42
|
-
iconConfig,
|
|
43
|
-
options
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
return merge(
|
|
47
|
-
{},
|
|
48
|
-
languageIconDefinitions,
|
|
49
|
-
fileIconDefinitions,
|
|
50
|
-
folderIconDefinitions
|
|
51
|
-
);
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Create the JSON file that is responsible for the icons in the editor.
|
|
56
|
-
* @param updatedConfigs Options that have been changed.
|
|
57
|
-
* @param updatedJSONConfig New JSON options that already include the updatedConfigs.
|
|
58
|
-
*/
|
|
59
|
-
export const createIconFile = (
|
|
60
|
-
updatedConfigs?: IconJsonOptions,
|
|
61
|
-
updatedJSONConfig: IconJsonOptions = {}
|
|
62
|
-
) => {
|
|
63
|
-
// override the default options with the new options
|
|
64
|
-
const options: IconJsonOptions = merge(
|
|
65
|
-
{},
|
|
66
|
-
getDefaultIconOptions(),
|
|
67
|
-
updatedJSONConfig
|
|
68
|
-
);
|
|
69
|
-
const json = generateIconConfigurationObject(options);
|
|
70
|
-
|
|
71
|
-
// make sure that the folder color, opacity and saturation values are entered correctly
|
|
72
|
-
if (
|
|
73
|
-
updatedConfigs?.opacity &&
|
|
74
|
-
!validateOpacityValue(updatedConfigs?.opacity)
|
|
75
|
-
) {
|
|
76
|
-
throw Error('Material Icons: Invalid opacity value!');
|
|
77
|
-
}
|
|
78
|
-
if (
|
|
79
|
-
updatedConfigs?.saturation &&
|
|
80
|
-
!validateSaturationValue(updatedConfigs?.saturation)
|
|
81
|
-
) {
|
|
82
|
-
throw Error('Material Icons: Invalid saturation value!');
|
|
83
|
-
}
|
|
84
|
-
if (
|
|
85
|
-
updatedConfigs?.folders?.color &&
|
|
86
|
-
!validateHEXColorCode(updatedConfigs?.folders?.color)
|
|
87
|
-
) {
|
|
88
|
-
throw Error('Material Icons: Invalid folder color value!');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
let iconJsonPath = __dirname;
|
|
93
|
-
// if executed via script
|
|
94
|
-
if (path.basename(__dirname) !== 'dist') {
|
|
95
|
-
iconJsonPath = path.join(__dirname, '..', '..', '..', 'dist');
|
|
96
|
-
}
|
|
97
|
-
if (!updatedConfigs || (updatedConfigs.folders || {}).color) {
|
|
98
|
-
// if updatedConfigs do not exist (because of initial setup)
|
|
99
|
-
// or new config value was detected by the change detection
|
|
100
|
-
generateFolderIcons(options.folders?.color);
|
|
101
|
-
setIconOpacity(options, [
|
|
102
|
-
'folder.svg',
|
|
103
|
-
'folder-open.svg',
|
|
104
|
-
'folder-root.svg',
|
|
105
|
-
'folder-root-open.svg',
|
|
106
|
-
]);
|
|
107
|
-
}
|
|
108
|
-
if (!updatedConfigs || updatedConfigs.opacity !== undefined) {
|
|
109
|
-
setIconOpacity(options);
|
|
110
|
-
}
|
|
111
|
-
if (!updatedConfigs || updatedConfigs.saturation !== undefined) {
|
|
112
|
-
setIconSaturation(options);
|
|
113
|
-
}
|
|
114
|
-
renameIconFiles(iconJsonPath, options);
|
|
115
|
-
} catch (error) {
|
|
116
|
-
throw new Error('Failed to update icons: ' + error);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
try {
|
|
120
|
-
let iconJsonPath = __dirname;
|
|
121
|
-
// if executed via script
|
|
122
|
-
if (path.basename(__dirname) !== 'dist') {
|
|
123
|
-
iconJsonPath = path.join(__dirname, '..', '..', '..', 'dist');
|
|
124
|
-
}
|
|
125
|
-
fs.writeFileSync(
|
|
126
|
-
path.join(iconJsonPath, iconJsonName),
|
|
127
|
-
JSON.stringify(json, undefined, 2),
|
|
128
|
-
'utf-8'
|
|
129
|
-
);
|
|
130
|
-
} catch (error) {
|
|
131
|
-
throw new Error('Failed to create icon file: ' + error);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
return iconJsonName;
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* The options control the generator and decide which icons are disabled or not.
|
|
139
|
-
*/
|
|
140
|
-
export const getDefaultIconOptions = (): Required<IconJsonOptions> => ({
|
|
141
|
-
folders: {
|
|
142
|
-
theme: 'specific',
|
|
143
|
-
color: '#90a4ae',
|
|
144
|
-
associations: {},
|
|
145
|
-
},
|
|
146
|
-
activeIconPack: 'angular',
|
|
147
|
-
hidesExplorerArrows: false,
|
|
148
|
-
opacity: 1,
|
|
149
|
-
saturation: 1,
|
|
150
|
-
files: { associations: {} },
|
|
151
|
-
languages: { associations: {} },
|
|
152
|
-
showUpdateMessage: false,
|
|
153
|
-
showWelcomeMessage: false,
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Rename all icon files according their respective config
|
|
158
|
-
* @param iconJsonPath Path of icon json folder
|
|
159
|
-
* @param options Icon Json Options
|
|
160
|
-
*/
|
|
161
|
-
const renameIconFiles = (iconJsonPath: string, options: IconJsonOptions) => {
|
|
162
|
-
const customPaths = getCustomIconPaths(options);
|
|
163
|
-
const defaultIconPath = path.join(iconJsonPath, '..', 'icons');
|
|
164
|
-
const iconPaths = [defaultIconPath, ...customPaths];
|
|
165
|
-
|
|
166
|
-
iconPaths.forEach((iconPath) => {
|
|
167
|
-
fs.readdirSync(iconPath)
|
|
168
|
-
.filter((f) => f.match(/\.svg/gi))
|
|
169
|
-
.forEach((f) => {
|
|
170
|
-
const filePath = path.join(iconPath, f);
|
|
171
|
-
const fileConfigHash = getFileConfigHash(options);
|
|
172
|
-
|
|
173
|
-
// append file config to file name
|
|
174
|
-
const newFilePath = path.join(
|
|
175
|
-
iconPath,
|
|
176
|
-
f.replace(/(^[^\.~]+)(.*)\.svg/, `$1${fileConfigHash}.svg`)
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
// if generated files are already in place, do not overwrite them
|
|
180
|
-
if (filePath !== newFilePath && fs.existsSync(newFilePath)) {
|
|
181
|
-
fs.unlinkSync(filePath);
|
|
182
|
-
} else {
|
|
183
|
-
fs.renameSync(filePath, newFilePath);
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
};
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import merge from 'lodash.merge';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { getCustomIconPaths } from '../../helpers/customIcons';
|
|
5
|
+
import { getFileConfigHash } from '../../helpers/fileConfig';
|
|
6
|
+
import { IconConfiguration, IconJsonOptions } from '../../models/index';
|
|
7
|
+
import { fileIcons } from '../fileIcons';
|
|
8
|
+
import { folderIcons } from '../folderIcons';
|
|
9
|
+
import { languageIcons } from '../languageIcons';
|
|
10
|
+
import { iconJsonName } from './constants';
|
|
11
|
+
import {
|
|
12
|
+
generateFolderIcons,
|
|
13
|
+
loadFileIconDefinitions,
|
|
14
|
+
loadFolderIconDefinitions,
|
|
15
|
+
loadLanguageIconDefinitions,
|
|
16
|
+
setIconOpacity,
|
|
17
|
+
setIconSaturation,
|
|
18
|
+
validateHEXColorCode,
|
|
19
|
+
validateOpacityValue,
|
|
20
|
+
validateSaturationValue,
|
|
21
|
+
} from './index';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Generate the complete icon configuration object that can be written as JSON file.
|
|
25
|
+
*/
|
|
26
|
+
export const generateIconConfigurationObject = (
|
|
27
|
+
options: IconJsonOptions
|
|
28
|
+
): IconConfiguration => {
|
|
29
|
+
const iconConfig = merge({}, new IconConfiguration(), { options });
|
|
30
|
+
const languageIconDefinitions = loadLanguageIconDefinitions(
|
|
31
|
+
languageIcons,
|
|
32
|
+
iconConfig,
|
|
33
|
+
options
|
|
34
|
+
);
|
|
35
|
+
const fileIconDefinitions = loadFileIconDefinitions(
|
|
36
|
+
fileIcons,
|
|
37
|
+
iconConfig,
|
|
38
|
+
options
|
|
39
|
+
);
|
|
40
|
+
const folderIconDefinitions = loadFolderIconDefinitions(
|
|
41
|
+
folderIcons,
|
|
42
|
+
iconConfig,
|
|
43
|
+
options
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
return merge(
|
|
47
|
+
{},
|
|
48
|
+
languageIconDefinitions,
|
|
49
|
+
fileIconDefinitions,
|
|
50
|
+
folderIconDefinitions
|
|
51
|
+
);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Create the JSON file that is responsible for the icons in the editor.
|
|
56
|
+
* @param updatedConfigs Options that have been changed.
|
|
57
|
+
* @param updatedJSONConfig New JSON options that already include the updatedConfigs.
|
|
58
|
+
*/
|
|
59
|
+
export const createIconFile = (
|
|
60
|
+
updatedConfigs?: IconJsonOptions,
|
|
61
|
+
updatedJSONConfig: IconJsonOptions = {}
|
|
62
|
+
) => {
|
|
63
|
+
// override the default options with the new options
|
|
64
|
+
const options: IconJsonOptions = merge(
|
|
65
|
+
{},
|
|
66
|
+
getDefaultIconOptions(),
|
|
67
|
+
updatedJSONConfig
|
|
68
|
+
);
|
|
69
|
+
const json = generateIconConfigurationObject(options);
|
|
70
|
+
|
|
71
|
+
// make sure that the folder color, opacity and saturation values are entered correctly
|
|
72
|
+
if (
|
|
73
|
+
updatedConfigs?.opacity &&
|
|
74
|
+
!validateOpacityValue(updatedConfigs?.opacity)
|
|
75
|
+
) {
|
|
76
|
+
throw Error('Material Icons: Invalid opacity value!');
|
|
77
|
+
}
|
|
78
|
+
if (
|
|
79
|
+
updatedConfigs?.saturation &&
|
|
80
|
+
!validateSaturationValue(updatedConfigs?.saturation)
|
|
81
|
+
) {
|
|
82
|
+
throw Error('Material Icons: Invalid saturation value!');
|
|
83
|
+
}
|
|
84
|
+
if (
|
|
85
|
+
updatedConfigs?.folders?.color &&
|
|
86
|
+
!validateHEXColorCode(updatedConfigs?.folders?.color)
|
|
87
|
+
) {
|
|
88
|
+
throw Error('Material Icons: Invalid folder color value!');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
try {
|
|
92
|
+
let iconJsonPath = __dirname;
|
|
93
|
+
// if executed via script
|
|
94
|
+
if (path.basename(__dirname) !== 'dist') {
|
|
95
|
+
iconJsonPath = path.join(__dirname, '..', '..', '..', 'dist');
|
|
96
|
+
}
|
|
97
|
+
if (!updatedConfigs || (updatedConfigs.folders || {}).color) {
|
|
98
|
+
// if updatedConfigs do not exist (because of initial setup)
|
|
99
|
+
// or new config value was detected by the change detection
|
|
100
|
+
generateFolderIcons(options.folders?.color);
|
|
101
|
+
setIconOpacity(options, [
|
|
102
|
+
'folder.svg',
|
|
103
|
+
'folder-open.svg',
|
|
104
|
+
'folder-root.svg',
|
|
105
|
+
'folder-root-open.svg',
|
|
106
|
+
]);
|
|
107
|
+
}
|
|
108
|
+
if (!updatedConfigs || updatedConfigs.opacity !== undefined) {
|
|
109
|
+
setIconOpacity(options);
|
|
110
|
+
}
|
|
111
|
+
if (!updatedConfigs || updatedConfigs.saturation !== undefined) {
|
|
112
|
+
setIconSaturation(options);
|
|
113
|
+
}
|
|
114
|
+
renameIconFiles(iconJsonPath, options);
|
|
115
|
+
} catch (error) {
|
|
116
|
+
throw new Error('Failed to update icons: ' + error);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
let iconJsonPath = __dirname;
|
|
121
|
+
// if executed via script
|
|
122
|
+
if (path.basename(__dirname) !== 'dist') {
|
|
123
|
+
iconJsonPath = path.join(__dirname, '..', '..', '..', 'dist');
|
|
124
|
+
}
|
|
125
|
+
fs.writeFileSync(
|
|
126
|
+
path.join(iconJsonPath, iconJsonName),
|
|
127
|
+
JSON.stringify(json, undefined, 2),
|
|
128
|
+
'utf-8'
|
|
129
|
+
);
|
|
130
|
+
} catch (error) {
|
|
131
|
+
throw new Error('Failed to create icon file: ' + error);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return iconJsonName;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* The options control the generator and decide which icons are disabled or not.
|
|
139
|
+
*/
|
|
140
|
+
export const getDefaultIconOptions = (): Required<IconJsonOptions> => ({
|
|
141
|
+
folders: {
|
|
142
|
+
theme: 'specific',
|
|
143
|
+
color: '#90a4ae',
|
|
144
|
+
associations: {},
|
|
145
|
+
},
|
|
146
|
+
activeIconPack: 'angular',
|
|
147
|
+
hidesExplorerArrows: false,
|
|
148
|
+
opacity: 1,
|
|
149
|
+
saturation: 1,
|
|
150
|
+
files: { associations: {} },
|
|
151
|
+
languages: { associations: {} },
|
|
152
|
+
showUpdateMessage: false,
|
|
153
|
+
showWelcomeMessage: false,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Rename all icon files according their respective config
|
|
158
|
+
* @param iconJsonPath Path of icon json folder
|
|
159
|
+
* @param options Icon Json Options
|
|
160
|
+
*/
|
|
161
|
+
const renameIconFiles = (iconJsonPath: string, options: IconJsonOptions) => {
|
|
162
|
+
const customPaths = getCustomIconPaths(options);
|
|
163
|
+
const defaultIconPath = path.join(iconJsonPath, '..', 'icons');
|
|
164
|
+
const iconPaths = [defaultIconPath, ...customPaths];
|
|
165
|
+
|
|
166
|
+
iconPaths.forEach((iconPath) => {
|
|
167
|
+
fs.readdirSync(iconPath)
|
|
168
|
+
.filter((f) => f.match(/\.svg/gi))
|
|
169
|
+
.forEach((f) => {
|
|
170
|
+
const filePath = path.join(iconPath, f);
|
|
171
|
+
const fileConfigHash = getFileConfigHash(options);
|
|
172
|
+
|
|
173
|
+
// append file config to file name
|
|
174
|
+
const newFilePath = path.join(
|
|
175
|
+
iconPath,
|
|
176
|
+
f.replace(/(^[^\.~]+)(.*)\.svg/, `$1${fileConfigHash}.svg`)
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
// if generated files are already in place, do not overwrite them
|
|
180
|
+
if (filePath !== newFilePath && fs.existsSync(newFilePath)) {
|
|
181
|
+
fs.unlinkSync(filePath);
|
|
182
|
+
} else {
|
|
183
|
+
fs.renameSync(filePath, newFilePath);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
};
|
|
@@ -1,127 +1,127 @@
|
|
|
1
|
-
import merge from 'lodash.merge';
|
|
2
|
-
import { getFileConfigHash } from '../../helpers/fileConfig';
|
|
3
|
-
import {
|
|
4
|
-
DefaultIcon,
|
|
5
|
-
IconAssociations,
|
|
6
|
-
IconConfiguration,
|
|
7
|
-
IconJsonOptions,
|
|
8
|
-
LanguageIcon,
|
|
9
|
-
} from '../../models/index';
|
|
10
|
-
import {
|
|
11
|
-
highContrastColorFileEnding,
|
|
12
|
-
iconFolderPath,
|
|
13
|
-
lightColorFileEnding,
|
|
14
|
-
} from './constants';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Get all file icons that can be used in this theme.
|
|
18
|
-
*/
|
|
19
|
-
export const loadLanguageIconDefinitions = (
|
|
20
|
-
languages: LanguageIcon[],
|
|
21
|
-
config: IconConfiguration,
|
|
22
|
-
options: IconJsonOptions
|
|
23
|
-
): IconConfiguration => {
|
|
24
|
-
config = merge({}, config);
|
|
25
|
-
const enabledLanguages = disableLanguagesByPack(
|
|
26
|
-
languages,
|
|
27
|
-
options.activeIconPack
|
|
28
|
-
);
|
|
29
|
-
const customIcons = getCustomIcons(options.languages?.associations);
|
|
30
|
-
const allLanguageIcons = [...enabledLanguages, ...customIcons];
|
|
31
|
-
|
|
32
|
-
allLanguageIcons.forEach((lang) => {
|
|
33
|
-
if (lang.disabled) return;
|
|
34
|
-
config = setIconDefinitions(config, lang.icon);
|
|
35
|
-
config = merge(
|
|
36
|
-
{},
|
|
37
|
-
config,
|
|
38
|
-
setLanguageIdentifiers(lang.icon.name, lang.ids)
|
|
39
|
-
);
|
|
40
|
-
config.light = lang.icon.light
|
|
41
|
-
? merge(
|
|
42
|
-
{},
|
|
43
|
-
config.light,
|
|
44
|
-
setLanguageIdentifiers(
|
|
45
|
-
lang.icon.name + lightColorFileEnding,
|
|
46
|
-
lang.ids
|
|
47
|
-
)
|
|
48
|
-
)
|
|
49
|
-
: config.light;
|
|
50
|
-
config.highContrast = lang.icon.highContrast
|
|
51
|
-
? merge(
|
|
52
|
-
{},
|
|
53
|
-
config.highContrast,
|
|
54
|
-
setLanguageIdentifiers(
|
|
55
|
-
lang.icon.name + highContrastColorFileEnding,
|
|
56
|
-
lang.ids
|
|
57
|
-
)
|
|
58
|
-
)
|
|
59
|
-
: config.highContrast;
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
return config;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const setIconDefinitions = (config: IconConfiguration, icon: DefaultIcon) => {
|
|
66
|
-
config = merge({}, config);
|
|
67
|
-
config = createIconDefinitions(config, icon.name);
|
|
68
|
-
config = merge(
|
|
69
|
-
{},
|
|
70
|
-
config,
|
|
71
|
-
icon.light
|
|
72
|
-
? createIconDefinitions(config, icon.name + lightColorFileEnding)
|
|
73
|
-
: config.light
|
|
74
|
-
);
|
|
75
|
-
config = merge(
|
|
76
|
-
{},
|
|
77
|
-
config,
|
|
78
|
-
icon.highContrast
|
|
79
|
-
? createIconDefinitions(config, icon.name + highContrastColorFileEnding)
|
|
80
|
-
: config.highContrast
|
|
81
|
-
);
|
|
82
|
-
return config;
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
const createIconDefinitions = (config: IconConfiguration, iconName: string) => {
|
|
86
|
-
config = merge({}, config);
|
|
87
|
-
const fileConfigHash = getFileConfigHash(config.options ?? {});
|
|
88
|
-
if (config.iconDefinitions) {
|
|
89
|
-
config.iconDefinitions[iconName] = {
|
|
90
|
-
iconPath: `${iconFolderPath}${iconName}${fileConfigHash}.svg`,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
return config;
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
const setLanguageIdentifiers = (iconName: string, languageIds: string[]) => {
|
|
97
|
-
const obj: Partial<IconConfiguration> = { languageIds: {} };
|
|
98
|
-
languageIds.forEach((id) => {
|
|
99
|
-
obj.languageIds![id as keyof IconConfiguration] = iconName;
|
|
100
|
-
});
|
|
101
|
-
return obj;
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
const getCustomIcons = (languageAssociations: IconAssociations | undefined) => {
|
|
105
|
-
if (!languageAssociations) return [];
|
|
106
|
-
|
|
107
|
-
const icons: LanguageIcon[] = Object.keys(languageAssociations).map((fa) => ({
|
|
108
|
-
icon: { name: languageAssociations[fa].toLowerCase() },
|
|
109
|
-
ids: [fa.toLowerCase()],
|
|
110
|
-
}));
|
|
111
|
-
|
|
112
|
-
return icons;
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Disable all file icons that are in a pack which is disabled.
|
|
117
|
-
*/
|
|
118
|
-
const disableLanguagesByPack = (
|
|
119
|
-
languageIcons: LanguageIcon[],
|
|
120
|
-
activatedIconPack: string | undefined
|
|
121
|
-
) => {
|
|
122
|
-
return languageIcons.filter((language) => {
|
|
123
|
-
return !language.enabledFor
|
|
124
|
-
? true
|
|
125
|
-
: language.enabledFor.some((p) => p === activatedIconPack);
|
|
126
|
-
});
|
|
127
|
-
};
|
|
1
|
+
import merge from 'lodash.merge';
|
|
2
|
+
import { getFileConfigHash } from '../../helpers/fileConfig';
|
|
3
|
+
import {
|
|
4
|
+
DefaultIcon,
|
|
5
|
+
IconAssociations,
|
|
6
|
+
IconConfiguration,
|
|
7
|
+
IconJsonOptions,
|
|
8
|
+
LanguageIcon,
|
|
9
|
+
} from '../../models/index';
|
|
10
|
+
import {
|
|
11
|
+
highContrastColorFileEnding,
|
|
12
|
+
iconFolderPath,
|
|
13
|
+
lightColorFileEnding,
|
|
14
|
+
} from './constants';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Get all file icons that can be used in this theme.
|
|
18
|
+
*/
|
|
19
|
+
export const loadLanguageIconDefinitions = (
|
|
20
|
+
languages: LanguageIcon[],
|
|
21
|
+
config: IconConfiguration,
|
|
22
|
+
options: IconJsonOptions
|
|
23
|
+
): IconConfiguration => {
|
|
24
|
+
config = merge({}, config);
|
|
25
|
+
const enabledLanguages = disableLanguagesByPack(
|
|
26
|
+
languages,
|
|
27
|
+
options.activeIconPack
|
|
28
|
+
);
|
|
29
|
+
const customIcons = getCustomIcons(options.languages?.associations);
|
|
30
|
+
const allLanguageIcons = [...enabledLanguages, ...customIcons];
|
|
31
|
+
|
|
32
|
+
allLanguageIcons.forEach((lang) => {
|
|
33
|
+
if (lang.disabled) return;
|
|
34
|
+
config = setIconDefinitions(config, lang.icon);
|
|
35
|
+
config = merge(
|
|
36
|
+
{},
|
|
37
|
+
config,
|
|
38
|
+
setLanguageIdentifiers(lang.icon.name, lang.ids)
|
|
39
|
+
);
|
|
40
|
+
config.light = lang.icon.light
|
|
41
|
+
? merge(
|
|
42
|
+
{},
|
|
43
|
+
config.light,
|
|
44
|
+
setLanguageIdentifiers(
|
|
45
|
+
lang.icon.name + lightColorFileEnding,
|
|
46
|
+
lang.ids
|
|
47
|
+
)
|
|
48
|
+
)
|
|
49
|
+
: config.light;
|
|
50
|
+
config.highContrast = lang.icon.highContrast
|
|
51
|
+
? merge(
|
|
52
|
+
{},
|
|
53
|
+
config.highContrast,
|
|
54
|
+
setLanguageIdentifiers(
|
|
55
|
+
lang.icon.name + highContrastColorFileEnding,
|
|
56
|
+
lang.ids
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
: config.highContrast;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
return config;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const setIconDefinitions = (config: IconConfiguration, icon: DefaultIcon) => {
|
|
66
|
+
config = merge({}, config);
|
|
67
|
+
config = createIconDefinitions(config, icon.name);
|
|
68
|
+
config = merge(
|
|
69
|
+
{},
|
|
70
|
+
config,
|
|
71
|
+
icon.light
|
|
72
|
+
? createIconDefinitions(config, icon.name + lightColorFileEnding)
|
|
73
|
+
: config.light
|
|
74
|
+
);
|
|
75
|
+
config = merge(
|
|
76
|
+
{},
|
|
77
|
+
config,
|
|
78
|
+
icon.highContrast
|
|
79
|
+
? createIconDefinitions(config, icon.name + highContrastColorFileEnding)
|
|
80
|
+
: config.highContrast
|
|
81
|
+
);
|
|
82
|
+
return config;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const createIconDefinitions = (config: IconConfiguration, iconName: string) => {
|
|
86
|
+
config = merge({}, config);
|
|
87
|
+
const fileConfigHash = getFileConfigHash(config.options ?? {});
|
|
88
|
+
if (config.iconDefinitions) {
|
|
89
|
+
config.iconDefinitions[iconName] = {
|
|
90
|
+
iconPath: `${iconFolderPath}${iconName}${fileConfigHash}.svg`,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return config;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const setLanguageIdentifiers = (iconName: string, languageIds: string[]) => {
|
|
97
|
+
const obj: Partial<IconConfiguration> = { languageIds: {} };
|
|
98
|
+
languageIds.forEach((id) => {
|
|
99
|
+
obj.languageIds![id as keyof IconConfiguration] = iconName;
|
|
100
|
+
});
|
|
101
|
+
return obj;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const getCustomIcons = (languageAssociations: IconAssociations | undefined) => {
|
|
105
|
+
if (!languageAssociations) return [];
|
|
106
|
+
|
|
107
|
+
const icons: LanguageIcon[] = Object.keys(languageAssociations).map((fa) => ({
|
|
108
|
+
icon: { name: languageAssociations[fa].toLowerCase() },
|
|
109
|
+
ids: [fa.toLowerCase()],
|
|
110
|
+
}));
|
|
111
|
+
|
|
112
|
+
return icons;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Disable all file icons that are in a pack which is disabled.
|
|
117
|
+
*/
|
|
118
|
+
const disableLanguagesByPack = (
|
|
119
|
+
languageIcons: LanguageIcon[],
|
|
120
|
+
activatedIconPack: string | undefined
|
|
121
|
+
) => {
|
|
122
|
+
return languageIcons.filter((language) => {
|
|
123
|
+
return !language.enabledFor
|
|
124
|
+
? true
|
|
125
|
+
: language.enabledFor.some((p) => p === activatedIconPack);
|
|
126
|
+
});
|
|
127
|
+
};
|
package/src/icons/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './generator';
|
|
2
|
-
export * from './fileIcons';
|
|
3
|
-
export * from './folderIcons';
|
|
4
|
-
export * from './languageIcons';
|
|
1
|
+
export * from './generator';
|
|
2
|
+
export * from './fileIcons';
|
|
3
|
+
export * from './folderIcons';
|
|
4
|
+
export * from './languageIcons';
|