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.
Files changed (208) hide show
  1. package/.eslintrc.json +51 -51
  2. package/.github/FUNDING.yml +3 -3
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +34 -34
  4. package/.github/ISSUE_TEMPLATE/icon_request.md +27 -27
  5. package/.github/workflows/build.yml +45 -45
  6. package/.github/workflows/color-check.yml +22 -22
  7. package/.github/workflows/release.yml +73 -73
  8. package/.prettierrc +7 -7
  9. package/.vscode/extensions.json +3 -3
  10. package/.vscode/launch.json +43 -43
  11. package/.vscode/settings.json +14 -14
  12. package/.vscode/tasks.json +32 -32
  13. package/.vscodeignore +20 -20
  14. package/CHANGELOG.md +1213 -1171
  15. package/CONTRIBUTING.md +62 -62
  16. package/LICENSE.md +8 -8
  17. package/README.md +208 -208
  18. package/build/web-extension.webpack.config.js +62 -62
  19. package/build/webpack.config.js +39 -39
  20. package/changelog.config.json +4 -4
  21. package/icons/architecture.svg +4 -4
  22. package/icons/astyle.svg +4 -4
  23. package/icons/auto.svg +10 -0
  24. package/icons/auto_light.svg +10 -0
  25. package/icons/azure.svg +9 -9
  26. package/icons/blitz.svg +4 -4
  27. package/icons/buildkite.svg +8 -8
  28. package/icons/cypress.svg +4 -4
  29. package/icons/dart_generated.svg +9 -9
  30. package/icons/dependabot.svg +4 -4
  31. package/icons/dinophp.svg +16 -16
  32. package/icons/figma.svg +10 -10
  33. package/icons/folder-angular-open.svg +2 -2
  34. package/icons/folder-angular.svg +2 -2
  35. package/icons/folder-buildkite-open.svg +8 -8
  36. package/icons/folder-buildkite.svg +7 -7
  37. package/icons/folder-cypress-open.svg +5 -5
  38. package/icons/folder-cypress.svg +5 -5
  39. package/icons/folder-gitlab-open.svg +2 -1
  40. package/icons/folder-gitlab.svg +2 -1
  41. package/icons/folder-java-open.svg +2 -2
  42. package/icons/folder-java.svg +2 -2
  43. package/icons/folder-next-open.svg +2 -2
  44. package/icons/folder-next.svg +2 -2
  45. package/icons/folder-nuxt-open.svg +2 -2
  46. package/icons/folder-nuxt.svg +2 -2
  47. package/icons/folder-queue-open.svg +2 -2
  48. package/icons/folder-queue.svg +2 -2
  49. package/icons/folder-resolver-open.svg +2 -2
  50. package/icons/folder-resolver.svg +2 -2
  51. package/icons/folder-serverless-open.svg +5 -5
  52. package/icons/folder-serverless.svg +5 -5
  53. package/icons/folder-shader-open.svg +7 -7
  54. package/icons/folder-shader.svg +6 -6
  55. package/icons/folder-target-open.svg +2 -2
  56. package/icons/folder-target.svg +2 -2
  57. package/icons/folder-unity-open.svg +2 -2
  58. package/icons/folder-unity.svg +2 -2
  59. package/icons/folder-vercel-open.svg +4 -4
  60. package/icons/folder-vercel.svg +4 -4
  61. package/icons/folder-verdaccio-open.svg +8 -8
  62. package/icons/folder-verdaccio.svg +8 -8
  63. package/icons/gitlab.svg +1 -1
  64. package/icons/gleam.svg +4 -4
  65. package/icons/gridsome.svg +4 -4
  66. package/icons/hardhat.svg +3 -3
  67. package/icons/lighthouse.svg +2 -2
  68. package/icons/mdsvex.svg +5 -0
  69. package/icons/ndst.svg +7 -7
  70. package/icons/next.svg +3 -3
  71. package/icons/next_light.svg +2 -2
  72. package/icons/nuxt.svg +5 -5
  73. package/icons/odin.svg +6 -6
  74. package/icons/otne.svg +16 -16
  75. package/icons/parcel.svg +4 -4
  76. package/icons/playwright.svg +7 -7
  77. package/icons/plop.svg +4 -4
  78. package/icons/pnpm.svg +9 -9
  79. package/icons/pnpm_light.svg +7 -7
  80. package/icons/poetry.svg +1 -1
  81. package/icons/processing.svg +10 -10
  82. package/icons/remix.svg +4 -4
  83. package/icons/remix_light.svg +4 -4
  84. package/icons/rescript-interface.svg +5 -5
  85. package/icons/rome.svg +5 -5
  86. package/icons/serverless.svg +4 -4
  87. package/icons/shader.svg +4 -4
  88. package/icons/siyuan.svg +9 -9
  89. package/icons/steadybit.svg +1 -1
  90. package/icons/svgr.svg +4 -4
  91. package/icons/tauri.svg +9 -9
  92. package/icons/template.svg +4 -4
  93. package/icons/tobi.svg +4 -4
  94. package/icons/tobimake.svg +14 -14
  95. package/icons/tree.svg +2 -0
  96. package/icons/turborepo.svg +12 -12
  97. package/icons/turborepo_light.svg +12 -12
  98. package/icons/verdaccio.svg +5 -5
  99. package/images/contributors.png +0 -0
  100. package/images/fileIcons.png +0 -0
  101. package/images/folderIcons.png +0 -0
  102. package/logo.svg +21 -21
  103. package/material-colors.yml +257 -257
  104. package/package.json +267 -264
  105. package/package.nls.de.json +35 -35
  106. package/package.nls.es.json +32 -32
  107. package/package.nls.fr.json +32 -32
  108. package/package.nls.ja.json +35 -35
  109. package/package.nls.json +35 -35
  110. package/package.nls.nl.json +35 -35
  111. package/package.nls.pl.json +35 -35
  112. package/package.nls.pt-BR.json +32 -32
  113. package/package.nls.pt-PT.json +32 -32
  114. package/package.nls.ru.json +32 -32
  115. package/package.nls.zh-CN.json +32 -32
  116. package/package.nls.zh-TW.json +32 -32
  117. package/src/commands/activate.ts +26 -26
  118. package/src/commands/explorerArrows.ts +55 -55
  119. package/src/commands/folderColor.ts +96 -96
  120. package/src/commands/folders.ts +55 -55
  121. package/src/commands/grayscale.ts +55 -55
  122. package/src/commands/iconPacks.ts +68 -68
  123. package/src/commands/index.ts +30 -30
  124. package/src/commands/opacity.ts +46 -46
  125. package/src/commands/restoreConfig.ts +14 -14
  126. package/src/commands/saturation.ts +46 -46
  127. package/src/extension.ts +42 -42
  128. package/src/helpers/changeDetection.ts +109 -73
  129. package/src/helpers/customIcons.ts +8 -8
  130. package/src/helpers/fileConfig.ts +37 -37
  131. package/src/helpers/index.ts +100 -100
  132. package/src/helpers/objects.ts +58 -58
  133. package/src/helpers/types.ts +7 -7
  134. package/src/helpers/versioning.ts +73 -73
  135. package/src/i18n/index.ts +78 -78
  136. package/src/i18n/lang-de.ts +54 -54
  137. package/src/i18n/lang-en.ts +53 -53
  138. package/src/i18n/lang-es.ts +53 -53
  139. package/src/i18n/lang-fr.ts +53 -53
  140. package/src/i18n/lang-ja.ts +54 -54
  141. package/src/i18n/lang-nl.ts +54 -54
  142. package/src/i18n/lang-pl.ts +52 -52
  143. package/src/i18n/lang-pt-br.ts +53 -53
  144. package/src/i18n/lang-pt-pt.ts +53 -53
  145. package/src/i18n/lang-ru.ts +52 -52
  146. package/src/i18n/lang-uk.ts +54 -54
  147. package/src/i18n/lang-zh-cn.ts +52 -52
  148. package/src/i18n/lang-zh-tw.ts +52 -52
  149. package/src/icons/fileIcons.ts +2095 -2046
  150. package/src/icons/folderIcons.ts +781 -773
  151. package/src/icons/generator/constants.ts +29 -29
  152. package/src/icons/generator/fileGenerator.ts +216 -216
  153. package/src/icons/generator/folderGenerator.ts +340 -340
  154. package/src/icons/generator/iconOpacity.ts +111 -111
  155. package/src/icons/generator/iconSaturation.ts +140 -140
  156. package/src/icons/generator/index.ts +7 -7
  157. package/src/icons/generator/jsonGenerator.ts +187 -187
  158. package/src/icons/generator/languageGenerator.ts +127 -127
  159. package/src/icons/index.ts +4 -4
  160. package/src/icons/languageIcons.ts +137 -136
  161. package/src/messages/outdated.ts +33 -33
  162. package/src/messages/reload.ts +32 -32
  163. package/src/messages/start.ts +12 -12
  164. package/src/messages/update.ts +48 -48
  165. package/src/messages/welcome.ts +47 -47
  166. package/src/models/helpers/index.ts +1 -1
  167. package/src/models/helpers/themeStatus.ts +5 -5
  168. package/src/models/i18n/index.ts +1 -1
  169. package/src/models/i18n/translation.ts +50 -50
  170. package/src/models/iconConfiguration.ts +37 -37
  171. package/src/models/icons/defaultIcon.ts +16 -16
  172. package/src/models/icons/files/fileIcon.ts +49 -49
  173. package/src/models/icons/files/fileTypes.ts +14 -14
  174. package/src/models/icons/files/index.ts +2 -2
  175. package/src/models/icons/folders/folderIcon.ts +34 -34
  176. package/src/models/icons/folders/folderTheme.ts +23 -23
  177. package/src/models/icons/folders/index.ts +2 -2
  178. package/src/models/icons/iconJsonOptions.ts +23 -23
  179. package/src/models/icons/iconPack.ts +12 -12
  180. package/src/models/icons/index.ts +6 -6
  181. package/src/models/icons/languages/index.ts +1 -1
  182. package/src/models/icons/languages/languageIdentifier.ts +26 -26
  183. package/src/models/index.ts +4 -4
  184. package/src/models/scripts/contributors/contributor.ts +22 -22
  185. package/src/models/scripts/contributors/contributorsConfig.ts +10 -10
  186. package/src/scripts/contributors/contributors.css +24 -24
  187. package/src/scripts/contributors/index.ts +138 -138
  188. package/src/scripts/helpers/painter.ts +5 -5
  189. package/src/scripts/helpers/screenshots.ts +32 -32
  190. package/src/scripts/helpers/similarity.ts +47 -47
  191. package/src/scripts/helpers/titleCase.ts +7 -7
  192. package/src/scripts/icons/checks/checkIconAvailability.ts +215 -215
  193. package/src/scripts/icons/checks/checkIconConflicts.ts +154 -154
  194. package/src/scripts/icons/checks/checkIconUsage.ts +141 -141
  195. package/src/scripts/icons/checks/index.ts +7 -7
  196. package/src/scripts/icons/generateJson.ts +11 -11
  197. package/src/scripts/preview/index.ts +40 -40
  198. package/src/scripts/preview/preview.ts +165 -165
  199. package/src/scripts/preview/style.css +48 -48
  200. package/src/test/runTest.ts +26 -26
  201. package/src/test/spec/i18n/i18n.spec.ts +61 -61
  202. package/src/test/spec/icons/fileIcons.spec.ts +250 -250
  203. package/src/test/spec/icons/folderIcons.spec.ts +418 -418
  204. package/src/test/spec/icons/languageIcons.spec.ts +184 -184
  205. package/src/test/spec/index.ts +36 -36
  206. package/src/web/extension.ts +10 -10
  207. package/svgo.config.js +11 -11
  208. 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
+ };
@@ -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';