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