material-icon-theme 4.23.1 → 4.25.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 (108) 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 +1325 -1292
  8. package/CONTRIBUTING.md +199 -29
  9. package/README.md +198 -199
  10. package/icons/bitbucket.svg +13 -1
  11. package/icons/bun.svg +2 -0
  12. package/icons/bun_light.svg +2 -0
  13. package/icons/craco.svg +45 -45
  14. package/icons/folder-changesets-open.svg +5 -5
  15. package/icons/folder-changesets.svg +2 -2
  16. package/icons/folder-decorators-open.svg +2 -2
  17. package/icons/folder-decorators.svg +5 -5
  18. package/icons/folder-gamemaker-open.svg +2 -0
  19. package/icons/folder-gamemaker.svg +2 -0
  20. package/icons/folder-supabase-open.svg +5 -5
  21. package/icons/folder-supabase.svg +2 -2
  22. package/icons/gamemaker.svg +4 -0
  23. package/icons/objective-c.svg +1 -0
  24. package/icons/objective-cpp.svg +1 -0
  25. package/icons/pascal.svg +6 -1
  26. package/icons/sonarcloud.svg +4 -4
  27. package/icons/stylable.svg +10 -10
  28. package/icons/supabase.svg +4 -4
  29. package/icons/tldraw.svg +4 -0
  30. package/icons/tldraw_light.svg +4 -0
  31. package/icons/vitest.svg +6 -6
  32. package/images/contributors.png +0 -0
  33. package/images/fileIcons.png +0 -0
  34. package/images/folderIcons.png +0 -0
  35. package/images/how-tos/folder-icon-parts.png +0 -0
  36. package/images/how-tos/pick-folder-colors.png +0 -0
  37. package/images/how-tos/pick-folder-colors.svg +301 -0
  38. package/images/how-tos/svg-folder-icon-with-correct-colors.png +0 -0
  39. package/images/how-tos/svg-folder-icon-with-wrong-colors.png +0 -0
  40. package/images/how-tos/svg-with-light-color.png +0 -0
  41. package/images/how-tos/svg-with-spacing.png +0 -0
  42. package/images/how-tos/svg-with-too-dark-color.png +0 -0
  43. package/images/how-tos/svg-with-wrong-color.png +0 -0
  44. package/images/how-tos/svg-without-spacing.png +0 -0
  45. package/package.json +252 -252
  46. package/package.nls.de.json +32 -32
  47. package/package.nls.es.json +29 -29
  48. package/package.nls.fr.json +29 -29
  49. package/package.nls.ja.json +32 -32
  50. package/package.nls.json +32 -32
  51. package/package.nls.nl.json +32 -32
  52. package/package.nls.pl.json +32 -32
  53. package/package.nls.pt-BR.json +29 -29
  54. package/package.nls.pt-PT.json +29 -29
  55. package/package.nls.ru.json +29 -29
  56. package/package.nls.zh-CN.json +29 -29
  57. package/package.nls.zh-TW.json +29 -29
  58. package/src/commands/activate.ts +28 -28
  59. package/src/commands/explorerArrows.ts +55 -55
  60. package/src/commands/folderColor.ts +96 -96
  61. package/src/commands/folders.ts +55 -55
  62. package/src/commands/grayscale.ts +55 -55
  63. package/src/commands/iconPacks.ts +64 -64
  64. package/src/commands/index.ts +30 -30
  65. package/src/commands/opacity.ts +46 -46
  66. package/src/commands/saturation.ts +46 -46
  67. package/src/extension.ts +37 -37
  68. package/src/helpers/customIcons.ts +8 -8
  69. package/src/helpers/index.ts +88 -88
  70. package/src/i18n/index.ts +78 -78
  71. package/src/i18n/lang-de.ts +43 -43
  72. package/src/i18n/lang-en.ts +43 -43
  73. package/src/i18n/lang-es.ts +43 -43
  74. package/src/i18n/lang-fr.ts +43 -43
  75. package/src/i18n/lang-ja.ts +43 -43
  76. package/src/i18n/lang-nl.ts +43 -43
  77. package/src/i18n/lang-pl.ts +43 -43
  78. package/src/i18n/lang-pt-br.ts +43 -43
  79. package/src/i18n/lang-pt-pt.ts +43 -43
  80. package/src/i18n/lang-ru.ts +43 -43
  81. package/src/i18n/lang-uk.ts +43 -43
  82. package/src/i18n/lang-zh-cn.ts +43 -43
  83. package/src/i18n/lang-zh-tw.ts +43 -43
  84. package/src/icons/fileIcons.ts +2240 -2197
  85. package/src/icons/folderIcons.ts +823 -806
  86. package/src/icons/generator/folderGenerator.ts +340 -340
  87. package/src/icons/generator/iconOpacity.ts +111 -111
  88. package/src/icons/generator/iconSaturation.ts +140 -140
  89. package/src/icons/generator/jsonGenerator.ts +191 -191
  90. package/src/icons/languageIcons.ts +144 -141
  91. package/src/models/i18n/translation.ts +41 -41
  92. package/src/models/iconConfiguration.ts +37 -37
  93. package/src/models/icons/iconJsonOptions.ts +21 -21
  94. package/src/models/index.ts +3 -3
  95. package/src/scripts/contributors/index.ts +138 -138
  96. package/src/scripts/helpers/screenshots.ts +32 -32
  97. package/src/scripts/icons/checks/checkIconAvailability.ts +215 -215
  98. package/src/scripts/icons/checks/checkIconConflicts.ts +152 -152
  99. package/src/scripts/icons/checks/checkIconUsage.ts +137 -137
  100. package/src/scripts/icons/checks/index.ts +7 -7
  101. package/src/scripts/preview/index.ts +40 -40
  102. package/src/scripts/preview/preview.ts +163 -163
  103. package/src/test/runTest.ts +26 -26
  104. package/src/test/spec/i18n/i18n.spec.ts +54 -54
  105. package/src/test/spec/icons/fileIcons.spec.ts +250 -250
  106. package/src/test/spec/icons/folderIcons.spec.ts +418 -418
  107. package/src/test/spec/icons/languageIcons.spec.ts +184 -184
  108. package/images/bloop.png +0 -0
@@ -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
+ };