material-icon-theme 4.23.1 → 4.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/.eslintrc.json +51 -51
  2. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +7 -0
  3. package/.github/workflows/build.yml +45 -45
  4. package/.github/workflows/color-check.yml +22 -22
  5. package/.github/workflows/release.yml +73 -73
  6. package/.vscodeignore +21 -21
  7. package/CHANGELOG.md +1305 -1292
  8. package/CONTRIBUTING.md +199 -29
  9. package/README.md +199 -199
  10. package/icons/craco.svg +45 -45
  11. package/icons/folder-changesets-open.svg +5 -5
  12. package/icons/folder-changesets.svg +2 -2
  13. package/icons/folder-decorators-open.svg +2 -2
  14. package/icons/folder-decorators.svg +5 -5
  15. package/icons/folder-supabase-open.svg +5 -5
  16. package/icons/folder-supabase.svg +2 -2
  17. package/icons/sonarcloud.svg +4 -4
  18. package/icons/stylable.svg +10 -10
  19. package/icons/supabase.svg +4 -4
  20. package/icons/vitest.svg +6 -6
  21. package/images/contributors.png +0 -0
  22. package/images/how-tos/folder-icon-parts.png +0 -0
  23. package/images/how-tos/pick-folder-colors.png +0 -0
  24. package/images/how-tos/pick-folder-colors.svg +301 -0
  25. package/images/how-tos/svg-folder-icon-with-correct-colors.png +0 -0
  26. package/images/how-tos/svg-folder-icon-with-wrong-colors.png +0 -0
  27. package/images/how-tos/svg-with-light-color.png +0 -0
  28. package/images/how-tos/svg-with-spacing.png +0 -0
  29. package/images/how-tos/svg-with-too-dark-color.png +0 -0
  30. package/images/how-tos/svg-with-wrong-color.png +0 -0
  31. package/images/how-tos/svg-without-spacing.png +0 -0
  32. package/package.json +252 -252
  33. package/package.nls.de.json +32 -32
  34. package/package.nls.es.json +29 -29
  35. package/package.nls.fr.json +29 -29
  36. package/package.nls.ja.json +32 -32
  37. package/package.nls.json +32 -32
  38. package/package.nls.nl.json +32 -32
  39. package/package.nls.pl.json +32 -32
  40. package/package.nls.pt-BR.json +29 -29
  41. package/package.nls.pt-PT.json +29 -29
  42. package/package.nls.ru.json +29 -29
  43. package/package.nls.zh-CN.json +29 -29
  44. package/package.nls.zh-TW.json +29 -29
  45. package/src/commands/activate.ts +28 -28
  46. package/src/commands/explorerArrows.ts +55 -55
  47. package/src/commands/folderColor.ts +96 -96
  48. package/src/commands/folders.ts +55 -55
  49. package/src/commands/grayscale.ts +55 -55
  50. package/src/commands/iconPacks.ts +64 -64
  51. package/src/commands/index.ts +30 -30
  52. package/src/commands/opacity.ts +46 -46
  53. package/src/commands/saturation.ts +46 -46
  54. package/src/extension.ts +37 -37
  55. package/src/helpers/customIcons.ts +8 -8
  56. package/src/helpers/index.ts +88 -88
  57. package/src/i18n/index.ts +78 -78
  58. package/src/i18n/lang-de.ts +43 -43
  59. package/src/i18n/lang-en.ts +43 -43
  60. package/src/i18n/lang-es.ts +43 -43
  61. package/src/i18n/lang-fr.ts +43 -43
  62. package/src/i18n/lang-ja.ts +43 -43
  63. package/src/i18n/lang-nl.ts +43 -43
  64. package/src/i18n/lang-pl.ts +43 -43
  65. package/src/i18n/lang-pt-br.ts +43 -43
  66. package/src/i18n/lang-pt-pt.ts +43 -43
  67. package/src/i18n/lang-ru.ts +43 -43
  68. package/src/i18n/lang-uk.ts +43 -43
  69. package/src/i18n/lang-zh-cn.ts +43 -43
  70. package/src/i18n/lang-zh-tw.ts +43 -43
  71. package/src/icons/fileIcons.ts +2206 -2197
  72. package/src/icons/folderIcons.ts +818 -806
  73. package/src/icons/generator/folderGenerator.ts +340 -340
  74. package/src/icons/generator/iconOpacity.ts +111 -111
  75. package/src/icons/generator/iconSaturation.ts +140 -140
  76. package/src/icons/generator/jsonGenerator.ts +191 -191
  77. package/src/icons/languageIcons.ts +141 -141
  78. package/src/models/i18n/translation.ts +41 -41
  79. package/src/models/iconConfiguration.ts +37 -37
  80. package/src/models/icons/iconJsonOptions.ts +21 -21
  81. package/src/models/index.ts +3 -3
  82. package/src/scripts/contributors/index.ts +138 -138
  83. package/src/scripts/helpers/screenshots.ts +32 -32
  84. package/src/scripts/icons/checks/checkIconAvailability.ts +215 -215
  85. package/src/scripts/icons/checks/checkIconConflicts.ts +152 -152
  86. package/src/scripts/icons/checks/checkIconUsage.ts +137 -137
  87. package/src/scripts/icons/checks/index.ts +7 -7
  88. package/src/scripts/preview/index.ts +40 -40
  89. package/src/scripts/preview/preview.ts +163 -163
  90. package/src/test/runTest.ts +26 -26
  91. package/src/test/spec/i18n/i18n.spec.ts +54 -54
  92. package/src/test/spec/icons/fileIcons.spec.ts +250 -250
  93. package/src/test/spec/icons/folderIcons.spec.ts +418 -418
  94. package/src/test/spec/icons/languageIcons.spec.ts +184 -184
@@ -1,191 +1,191 @@
1
- import {
2
- existsSync,
3
- readdirSync,
4
- renameSync,
5
- unlinkSync,
6
- writeFileSync,
7
- } from 'fs';
8
- import merge from 'lodash.merge';
9
- import { basename, join } from 'path';
10
- import { getCustomIconPaths } from '../../helpers/customIcons';
11
- import { getFileConfigHash } from '../../helpers/fileConfig';
12
- import { IconConfiguration, IconJsonOptions } from '../../models/index';
13
- import { fileIcons } from '../fileIcons';
14
- import { folderIcons } from '../folderIcons';
15
- import { languageIcons } from '../languageIcons';
16
- import { iconJsonName } from './constants';
17
- import {
18
- generateFolderIcons,
19
- loadFileIconDefinitions,
20
- loadFolderIconDefinitions,
21
- loadLanguageIconDefinitions,
22
- setIconOpacity,
23
- setIconSaturation,
24
- validateHEXColorCode,
25
- validateOpacityValue,
26
- validateSaturationValue,
27
- } from './index';
28
-
29
- /**
30
- * Generate the complete icon configuration object that can be written as JSON file.
31
- */
32
- export const generateIconConfigurationObject = (
33
- options: IconJsonOptions
34
- ): IconConfiguration => {
35
- const iconConfig = merge({}, new IconConfiguration(), { options });
36
- const languageIconDefinitions = loadLanguageIconDefinitions(
37
- languageIcons,
38
- iconConfig,
39
- options
40
- );
41
- const fileIconDefinitions = loadFileIconDefinitions(
42
- fileIcons,
43
- iconConfig,
44
- options
45
- );
46
- const folderIconDefinitions = loadFolderIconDefinitions(
47
- folderIcons,
48
- iconConfig,
49
- options
50
- );
51
-
52
- return merge(
53
- {},
54
- languageIconDefinitions,
55
- fileIconDefinitions,
56
- folderIconDefinitions
57
- );
58
- };
59
-
60
- /**
61
- * Create the JSON file that is responsible for the icons in the editor.
62
- * @param updatedConfigs Options that have been changed.
63
- * @param updatedJSONConfig New JSON options that already include the updatedConfigs.
64
- */
65
- export const createIconFile = (
66
- updatedConfigs?: IconJsonOptions,
67
- updatedJSONConfig: IconJsonOptions = {}
68
- ) => {
69
- // override the default options with the new options
70
- const options: IconJsonOptions = merge(
71
- {},
72
- getDefaultIconOptions(),
73
- updatedJSONConfig
74
- );
75
- const json = generateIconConfigurationObject(options);
76
-
77
- // make sure that the folder color, opacity and saturation values are entered correctly
78
- if (
79
- updatedConfigs?.opacity &&
80
- !validateOpacityValue(updatedConfigs?.opacity)
81
- ) {
82
- throw Error('Material Icons: Invalid opacity value!');
83
- }
84
- if (
85
- updatedConfigs?.saturation &&
86
- !validateSaturationValue(updatedConfigs?.saturation)
87
- ) {
88
- throw Error('Material Icons: Invalid saturation value!');
89
- }
90
- if (
91
- updatedConfigs?.folders?.color &&
92
- !validateHEXColorCode(updatedConfigs?.folders?.color)
93
- ) {
94
- throw Error('Material Icons: Invalid folder color value!');
95
- }
96
-
97
- try {
98
- let iconJsonPath = __dirname;
99
- // if executed via script
100
- if (basename(__dirname) !== 'dist') {
101
- iconJsonPath = join(__dirname, '..', '..', '..', 'dist');
102
- }
103
- if (!updatedConfigs || (updatedConfigs.folders || {}).color) {
104
- // if updatedConfigs do not exist (because of initial setup)
105
- // or new config value was detected by the change detection
106
- generateFolderIcons(options.folders?.color);
107
- setIconOpacity(options, [
108
- 'folder.svg',
109
- 'folder-open.svg',
110
- 'folder-root.svg',
111
- 'folder-root-open.svg',
112
- ]);
113
- }
114
- if (!updatedConfigs || updatedConfigs.opacity !== undefined) {
115
- setIconOpacity(options);
116
- }
117
- if (!updatedConfigs || updatedConfigs.saturation !== undefined) {
118
- setIconSaturation(options);
119
- }
120
- renameIconFiles(iconJsonPath, options);
121
- } catch (error) {
122
- throw new Error('Failed to update icons: ' + error);
123
- }
124
-
125
- try {
126
- let iconJsonPath = __dirname;
127
- // if executed via script
128
- if (basename(__dirname) !== 'dist') {
129
- iconJsonPath = join(__dirname, '..', '..', '..', 'dist');
130
- }
131
- writeFileSync(
132
- join(iconJsonPath, iconJsonName),
133
- JSON.stringify(json, undefined, 2),
134
- 'utf-8'
135
- );
136
- } catch (error) {
137
- throw new Error('Failed to create icon file: ' + error);
138
- }
139
-
140
- return iconJsonName;
141
- };
142
-
143
- /**
144
- * The options control the generator and decide which icons are disabled or not.
145
- */
146
- export const getDefaultIconOptions = (): Required<IconJsonOptions> => ({
147
- folders: {
148
- theme: 'specific',
149
- color: '#90a4ae',
150
- associations: {},
151
- },
152
- activeIconPack: 'angular',
153
- hidesExplorerArrows: false,
154
- opacity: 1,
155
- saturation: 1,
156
- files: { associations: {} },
157
- languages: { associations: {} },
158
- });
159
-
160
- /**
161
- * Rename all icon files according their respective config
162
- * @param iconJsonPath Path of icon json folder
163
- * @param options Icon Json Options
164
- */
165
- const renameIconFiles = (iconJsonPath: string, options: IconJsonOptions) => {
166
- const customPaths = getCustomIconPaths(options);
167
- const defaultIconPath = join(iconJsonPath, '..', 'icons');
168
- const iconPaths = [defaultIconPath, ...customPaths];
169
-
170
- iconPaths.forEach((iconPath) => {
171
- readdirSync(iconPath)
172
- .filter((f) => f.match(/\.svg/gi))
173
- .forEach((f) => {
174
- const filePath = join(iconPath, f);
175
- const fileConfigHash = getFileConfigHash(options);
176
-
177
- // append file config to file name
178
- const newFilePath = join(
179
- iconPath,
180
- f.replace(/(^[^\.~]+)(.*)\.svg/, `$1${fileConfigHash}.svg`)
181
- );
182
-
183
- // if generated files are already in place, do not overwrite them
184
- if (filePath !== newFilePath && existsSync(newFilePath)) {
185
- unlinkSync(filePath);
186
- } else {
187
- renameSync(filePath, newFilePath);
188
- }
189
- });
190
- });
191
- };
1
+ import {
2
+ existsSync,
3
+ readdirSync,
4
+ renameSync,
5
+ unlinkSync,
6
+ writeFileSync,
7
+ } from 'fs';
8
+ import merge from 'lodash.merge';
9
+ import { basename, join } from 'path';
10
+ import { getCustomIconPaths } from '../../helpers/customIcons';
11
+ import { getFileConfigHash } from '../../helpers/fileConfig';
12
+ import { IconConfiguration, IconJsonOptions } from '../../models/index';
13
+ import { fileIcons } from '../fileIcons';
14
+ import { folderIcons } from '../folderIcons';
15
+ import { languageIcons } from '../languageIcons';
16
+ import { iconJsonName } from './constants';
17
+ import {
18
+ generateFolderIcons,
19
+ loadFileIconDefinitions,
20
+ loadFolderIconDefinitions,
21
+ loadLanguageIconDefinitions,
22
+ setIconOpacity,
23
+ setIconSaturation,
24
+ validateHEXColorCode,
25
+ validateOpacityValue,
26
+ validateSaturationValue,
27
+ } from './index';
28
+
29
+ /**
30
+ * Generate the complete icon configuration object that can be written as JSON file.
31
+ */
32
+ export const generateIconConfigurationObject = (
33
+ options: IconJsonOptions
34
+ ): IconConfiguration => {
35
+ const iconConfig = merge({}, new IconConfiguration(), { options });
36
+ const languageIconDefinitions = loadLanguageIconDefinitions(
37
+ languageIcons,
38
+ iconConfig,
39
+ options
40
+ );
41
+ const fileIconDefinitions = loadFileIconDefinitions(
42
+ fileIcons,
43
+ iconConfig,
44
+ options
45
+ );
46
+ const folderIconDefinitions = loadFolderIconDefinitions(
47
+ folderIcons,
48
+ iconConfig,
49
+ options
50
+ );
51
+
52
+ return merge(
53
+ {},
54
+ languageIconDefinitions,
55
+ fileIconDefinitions,
56
+ folderIconDefinitions
57
+ );
58
+ };
59
+
60
+ /**
61
+ * Create the JSON file that is responsible for the icons in the editor.
62
+ * @param updatedConfigs Options that have been changed.
63
+ * @param updatedJSONConfig New JSON options that already include the updatedConfigs.
64
+ */
65
+ export const createIconFile = (
66
+ updatedConfigs?: IconJsonOptions,
67
+ updatedJSONConfig: IconJsonOptions = {}
68
+ ) => {
69
+ // override the default options with the new options
70
+ const options: IconJsonOptions = merge(
71
+ {},
72
+ getDefaultIconOptions(),
73
+ updatedJSONConfig
74
+ );
75
+ const json = generateIconConfigurationObject(options);
76
+
77
+ // make sure that the folder color, opacity and saturation values are entered correctly
78
+ if (
79
+ updatedConfigs?.opacity &&
80
+ !validateOpacityValue(updatedConfigs?.opacity)
81
+ ) {
82
+ throw Error('Material Icons: Invalid opacity value!');
83
+ }
84
+ if (
85
+ updatedConfigs?.saturation &&
86
+ !validateSaturationValue(updatedConfigs?.saturation)
87
+ ) {
88
+ throw Error('Material Icons: Invalid saturation value!');
89
+ }
90
+ if (
91
+ updatedConfigs?.folders?.color &&
92
+ !validateHEXColorCode(updatedConfigs?.folders?.color)
93
+ ) {
94
+ throw Error('Material Icons: Invalid folder color value!');
95
+ }
96
+
97
+ try {
98
+ let iconJsonPath = __dirname;
99
+ // if executed via script
100
+ if (basename(__dirname) !== 'dist') {
101
+ iconJsonPath = join(__dirname, '..', '..', '..', 'dist');
102
+ }
103
+ if (!updatedConfigs || (updatedConfigs.folders || {}).color) {
104
+ // if updatedConfigs do not exist (because of initial setup)
105
+ // or new config value was detected by the change detection
106
+ generateFolderIcons(options.folders?.color);
107
+ setIconOpacity(options, [
108
+ 'folder.svg',
109
+ 'folder-open.svg',
110
+ 'folder-root.svg',
111
+ 'folder-root-open.svg',
112
+ ]);
113
+ }
114
+ if (!updatedConfigs || updatedConfigs.opacity !== undefined) {
115
+ setIconOpacity(options);
116
+ }
117
+ if (!updatedConfigs || updatedConfigs.saturation !== undefined) {
118
+ setIconSaturation(options);
119
+ }
120
+ renameIconFiles(iconJsonPath, options);
121
+ } catch (error) {
122
+ throw new Error('Failed to update icons: ' + error);
123
+ }
124
+
125
+ try {
126
+ let iconJsonPath = __dirname;
127
+ // if executed via script
128
+ if (basename(__dirname) !== 'dist') {
129
+ iconJsonPath = join(__dirname, '..', '..', '..', 'dist');
130
+ }
131
+ writeFileSync(
132
+ join(iconJsonPath, iconJsonName),
133
+ JSON.stringify(json, undefined, 2),
134
+ 'utf-8'
135
+ );
136
+ } catch (error) {
137
+ throw new Error('Failed to create icon file: ' + error);
138
+ }
139
+
140
+ return iconJsonName;
141
+ };
142
+
143
+ /**
144
+ * The options control the generator and decide which icons are disabled or not.
145
+ */
146
+ export const getDefaultIconOptions = (): Required<IconJsonOptions> => ({
147
+ folders: {
148
+ theme: 'specific',
149
+ color: '#90a4ae',
150
+ associations: {},
151
+ },
152
+ activeIconPack: 'angular',
153
+ hidesExplorerArrows: false,
154
+ opacity: 1,
155
+ saturation: 1,
156
+ files: { associations: {} },
157
+ languages: { associations: {} },
158
+ });
159
+
160
+ /**
161
+ * Rename all icon files according their respective config
162
+ * @param iconJsonPath Path of icon json folder
163
+ * @param options Icon Json Options
164
+ */
165
+ const renameIconFiles = (iconJsonPath: string, options: IconJsonOptions) => {
166
+ const customPaths = getCustomIconPaths(options);
167
+ const defaultIconPath = join(iconJsonPath, '..', 'icons');
168
+ const iconPaths = [defaultIconPath, ...customPaths];
169
+
170
+ iconPaths.forEach((iconPath) => {
171
+ readdirSync(iconPath)
172
+ .filter((f) => f.match(/\.svg/gi))
173
+ .forEach((f) => {
174
+ const filePath = join(iconPath, f);
175
+ const fileConfigHash = getFileConfigHash(options);
176
+
177
+ // append file config to file name
178
+ const newFilePath = join(
179
+ iconPath,
180
+ f.replace(/(^[^\.~]+)(.*)\.svg/, `$1${fileConfigHash}.svg`)
181
+ );
182
+
183
+ // if generated files are already in place, do not overwrite them
184
+ if (filePath !== newFilePath && existsSync(newFilePath)) {
185
+ unlinkSync(filePath);
186
+ } else {
187
+ renameSync(filePath, newFilePath);
188
+ }
189
+ });
190
+ });
191
+ };