material-icon-theme 4.16.0 → 4.18.1

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