@quasar/icongenie 4.0.0 → 5.0.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 (61) hide show
  1. package/README.md +7 -1
  2. package/bin/icongenie.js +22 -22
  3. package/lib/cmd/generate.js +36 -41
  4. package/lib/cmd/help.js +1 -1
  5. package/lib/cmd/profile.js +34 -38
  6. package/lib/cmd/verify.js +18 -17
  7. package/lib/generators/icns.js +7 -3
  8. package/lib/generators/ico.js +7 -3
  9. package/lib/generators/index.js +0 -1
  10. package/lib/generators/png.js +7 -6
  11. package/lib/generators/splashscreen.js +6 -12
  12. package/lib/generators/svg.js +3 -4
  13. package/lib/modes/index.js +1 -8
  14. package/lib/modes/{quasar-app-v2 → v2}/bex.js +1 -2
  15. package/lib/modes/{quasar-app-v1 → v2}/capacitor.js +28 -35
  16. package/lib/modes/{quasar-app-v1 → v2}/cordova.js +40 -47
  17. package/lib/modes/v2/electron.js +32 -0
  18. package/lib/modes/{quasar-app-v1 → v2}/index.js +0 -1
  19. package/lib/modes/v2/pwa.js +71 -0
  20. package/lib/modes/{quasar-app-v2 → v2}/spa.js +1 -2
  21. package/lib/modes/{quasar-app-v1 → v2}/ssr.js +1 -2
  22. package/lib/mount/index.js +4 -7
  23. package/lib/mount/mount-cordova.js +71 -63
  24. package/lib/mount/mount-tag.js +3 -6
  25. package/lib/runner/generate.js +57 -55
  26. package/lib/runner/profile.js +18 -26
  27. package/lib/runner/verify.js +29 -27
  28. package/lib/utils/app-paths.js +8 -9
  29. package/lib/utils/default-params.js +0 -1
  30. package/lib/utils/filter-argv-params.js +3 -4
  31. package/lib/utils/get-argv.js +47 -0
  32. package/lib/utils/get-assets-files.js +9 -12
  33. package/lib/utils/get-compression.js +31 -19
  34. package/lib/utils/get-file-size.js +5 -6
  35. package/lib/utils/get-files-options.js +18 -21
  36. package/lib/utils/get-png-size.js +10 -12
  37. package/lib/utils/get-profile-content.js +3 -7
  38. package/lib/utils/get-profile-files.js +10 -13
  39. package/lib/utils/get-square-icon.js +5 -4
  40. package/lib/utils/logger.js +6 -7
  41. package/lib/utils/merge-objects.js +5 -6
  42. package/lib/utils/node-version-check.js +11 -11
  43. package/lib/utils/package-json.js +1 -5
  44. package/lib/utils/parse-argv.js +63 -74
  45. package/lib/utils/spawn-sync.js +8 -10
  46. package/lib/utils/validate-profile-object.js +34 -27
  47. package/package.json +46 -48
  48. package/samples/icongenie-profile.json +9 -17
  49. package/.editorconfig +0 -13
  50. package/.eslintignore +0 -1
  51. package/.eslintrc.cjs +0 -50
  52. package/lib/modes/quasar-app-v1/bex.js +0 -9
  53. package/lib/modes/quasar-app-v1/electron.js +0 -24
  54. package/lib/modes/quasar-app-v1/pwa.js +0 -74
  55. package/lib/modes/quasar-app-v1/spa.js +0 -17
  56. package/lib/modes/quasar-app-v2/capacitor.js +0 -155
  57. package/lib/modes/quasar-app-v2/cordova.js +0 -159
  58. package/lib/modes/quasar-app-v2/electron.js +0 -24
  59. package/lib/modes/quasar-app-v2/index.js +0 -45
  60. package/lib/modes/quasar-app-v2/pwa.js +0 -74
  61. package/lib/modes/quasar-app-v2/ssr.js +0 -4
@@ -1,27 +1,27 @@
1
1
  // version-check
2
2
 
3
3
  const version = process.version.split('.')
4
- const major = parseInt(version[ 0 ].replace(/\D/g, ''), 10)
5
- const minor = parseInt(version[ 1 ].replace(/\D/g,''), 10)
6
- const patch = parseInt(version[ 2 ].replace(/\D/g,''), 10)
4
+ const major = Number.parseInt(version[0].replaceAll(/\D/g, ''), 10)
5
+ const minor = Number.parseInt(version[1].replaceAll(/\D/g, ''), 10)
6
+ const patch = Number.parseInt(version[2].replaceAll(/\D/g, ''), 10)
7
7
 
8
8
  const min = {
9
- major: 18,
10
- minor: 12,
9
+ major: 22,
10
+ minor: 22,
11
11
  patch: 0
12
12
  }
13
13
 
14
14
  if (
15
- major < min.major || (
16
- major === min.major && (
17
- minor < min.minor || (minor === min.minor && patch < min.patch)
18
- )
19
- )
15
+ major < min.major ||
16
+ (major === min.major &&
17
+ (minor < min.minor || (minor === min.minor && patch < min.patch)))
20
18
  ) {
21
19
  console.error()
22
20
  console.error('--------------------------------------------------------')
23
21
  console.error(' INCOMPATIBLE NODE VERSION')
24
- console.error(` @quasar/icongenie requires Node ${ min.major }.${ min.minor }.${ min.patch } or superior`)
22
+ console.error(
23
+ ` @quasar/icongenie requires Node ${min.major}.${min.minor}.${min.patch} or superior`
24
+ )
25
25
  console.error()
26
26
  console.error(' You are running Node ' + process.version)
27
27
  console.error(' Please install a compatible Node version and try again')
@@ -1,9 +1,5 @@
1
-
2
1
  import { readFileSync } from 'node:fs'
3
2
 
4
3
  export const packageJson = JSON.parse(
5
- readFileSync(
6
- new URL('../../package.json', import.meta.url),
7
- 'utf-8'
8
- )
4
+ readFileSync(new URL('../../package.json', import.meta.url), 'utf8')
9
5
  )
@@ -1,7 +1,5 @@
1
-
2
1
  import { existsSync, lstatSync } from 'node:fs'
3
- import { resolve, normalize, isAbsolute } from 'node:path'
4
- import { fileURLToPath } from 'node:url'
2
+ import { isAbsolute, join, normalize, resolve } from 'node:path'
5
3
  import untildify from 'untildify'
6
4
 
7
5
  import { getPngSize } from './get-png-size.js'
@@ -13,16 +11,14 @@ import { modes } from '../modes/index.js'
13
11
 
14
12
  const modesList = Object.keys(modes)
15
13
 
16
- function die (msg) {
14
+ function die(msg) {
17
15
  warn(msg)
18
16
  warn()
19
17
  process.exit(1)
20
18
  }
21
19
 
22
- function profile (value, argv) {
23
- if (!value) {
24
- return
25
- }
20
+ function profile(value, argv) {
21
+ if (!value) return
26
22
 
27
23
  const profilePath = resolve(process.cwd(), untildify(value))
28
24
 
@@ -30,17 +26,14 @@ function profile (value, argv) {
30
26
  die(`Profile param does not point to a file or folder that exists!`)
31
27
  }
32
28
 
33
- if (
34
- !value.endsWith('.json')
35
- && !lstatSync(profilePath).isDirectory()
36
- ) {
37
- die(`Specified profile (${ value }) is not a .json file`)
29
+ if (!value.endsWith('.json') && !lstatSync(profilePath).isDirectory()) {
30
+ die(`Specified profile (${value}) is not a .json file`)
38
31
  }
39
32
 
40
33
  argv.profile = profilePath
41
34
  }
42
35
 
43
- function mode (value, argv) {
36
+ function mode(value, argv) {
44
37
  if (!value) {
45
38
  argv.mode = modesList
46
39
  return
@@ -53,67 +46,66 @@ function mode (value, argv) {
53
46
  return
54
47
  }
55
48
 
56
- if (list.some(mode => !modesList.includes(mode))) {
57
- die(`Invalid mode requested: "${ value }"`)
49
+ if (list.some(item => !modesList.includes(item))) {
50
+ die(`Invalid mode requested: "${value}"`)
58
51
  }
59
52
 
60
53
  argv.mode = list
61
54
  }
62
55
 
63
- function include (value, argv) {
64
- if (!value) {
65
- return
66
- }
56
+ function include(value, argv) {
57
+ if (!value) return
67
58
 
68
59
  if (value.includes('all')) {
69
60
  argv.include = modesList
70
61
  return
71
62
  }
72
63
 
73
- if (value.some(mode => !modesList.includes(mode))) {
74
- die(`Invalid include requested: "${ value }"`)
64
+ if (value.some(item => !modesList.includes(item))) {
65
+ die(`Invalid include requested: "${value}"`)
75
66
  }
76
67
  }
77
68
 
78
- function quality (value, argv) {
69
+ function quality(value, argv) {
79
70
  if (!value) {
80
71
  argv.quality = defaultParams.quality
81
72
  return
82
73
  }
83
74
 
84
- const numeric = parseInt(value, 10)
75
+ const numeric = Number.parseInt(value, 10)
85
76
 
86
- if (isNaN(numeric)) {
77
+ if (Number.isNaN(numeric)) {
87
78
  die(`Invalid quality level number specified`)
88
79
  }
89
80
  if (numeric < 1 || numeric > 12) {
90
- die(`Invalid quality level specified (${ value }) - should be between 1 - 12`)
81
+ die(`Invalid quality level specified (${value}) - should be between 1 - 12`)
91
82
  }
92
83
 
93
84
  argv.quality = numeric
94
85
  }
95
86
 
96
- function filter (value) {
87
+ function filter(value) {
97
88
  if (value && !Object.keys(generators).includes(value)) {
98
- die(`Unknown filter value specified (${ value }); there is no such generator`)
89
+ die(`Unknown filter value specified (${value}); there is no such generator`)
99
90
  }
100
91
  }
101
92
 
102
- function padding (value, argv) {
93
+ function padding(value, argv) {
103
94
  if (!value) {
104
- argv.padding = [ 0, 0 ]
95
+ argv.padding = [0, 0]
105
96
  return
106
97
  }
107
98
 
108
- const sizes = (Array.isArray(value) ? value : value.split(','))
109
- .map(val => parseInt(val, 10))
99
+ const sizes = (Array.isArray(value) ? value : value.split(',')).map(val =>
100
+ Number.parseInt(val, 10)
101
+ )
110
102
 
111
103
  if (sizes.length > 2) {
112
104
  die(`Invalid padding specified`)
113
105
  }
114
106
 
115
107
  sizes.forEach(size => {
116
- if (isNaN(size)) {
108
+ if (Number.isNaN(size)) {
117
109
  die(`Invalid padding specified (not numbers)`)
118
110
  }
119
111
  if (size < 0) {
@@ -121,38 +113,32 @@ function padding (value, argv) {
121
113
  }
122
114
  })
123
115
 
124
- argv.padding = sizes.length === 1
125
- ? [ sizes[ 0 ], sizes[ 0 ] ]
126
- : sizes
116
+ argv.padding = sizes.length === 1 ? [sizes[0], sizes[0]] : sizes
127
117
  }
128
118
 
129
- function parseIconPath (value) {
119
+ function parseIconPath(value) {
130
120
  const __path = untildify(value)
131
121
 
132
122
  if (isAbsolute(__path)) {
133
- return existsSync(__path) === true
134
- ? __path
135
- : null
123
+ return existsSync(__path) ? __path : null
136
124
  }
137
125
 
138
- let icon = resolve(process.cwd(), __path)
126
+ let localIcon = resolve(process.cwd(), __path)
139
127
 
140
- if (existsSync(icon)) {
141
- return icon
128
+ if (existsSync(localIcon)) {
129
+ return localIcon
142
130
  }
143
131
 
144
- icon = resolve(appDir, __path)
132
+ localIcon = resolve(appDir, __path)
145
133
 
146
- return existsSync(icon) ? icon : null
134
+ return existsSync(localIcon) ? localIcon : null
147
135
  }
148
136
 
149
- function icon (value, argv) {
137
+ function icon(value, argv) {
150
138
  if (!value) {
151
139
  warn(`No source icon file specified, so using the sample one`)
152
140
  argv.icon = normalize(
153
- fileURLToPath(
154
- new URL('../../samples/icongenie-icon.png', import.meta.url)
155
- )
141
+ join(import.meta.dirname, '../../samples/icongenie-icon.png')
156
142
  )
157
143
  return
158
144
  }
@@ -160,7 +146,7 @@ function icon (value, argv) {
160
146
  argv.icon = parseIconPath(value)
161
147
 
162
148
  if (!argv.icon) {
163
- die(`Path to source icon file does not exists: "${ value }"`)
149
+ die(`Path to source icon file does not exists: "${value}"`)
164
150
  }
165
151
 
166
152
  const { width, height } = getPngSize(argv.icon)
@@ -174,15 +160,13 @@ function icon (value, argv) {
174
160
  }
175
161
  }
176
162
 
177
- function background (value, argv) {
178
- if (!value) {
179
- return
180
- }
163
+ function background(value, argv) {
164
+ if (!value) return
181
165
 
182
166
  argv.background = resolve(appDir, untildify(value))
183
167
 
184
168
  if (!existsSync(argv.background)) {
185
- die(`Path to background source file does not exists: "${ value }"`)
169
+ die(`Path to background source file does not exists: "${value}"`)
186
170
  }
187
171
 
188
172
  const { width, height } = getPngSize(argv.background)
@@ -196,49 +180,51 @@ function background (value, argv) {
196
180
  }
197
181
  }
198
182
 
199
- function getColorParser (name, defaultValue) {
183
+ function getColorParser(name, defaultValue) {
200
184
  return (value, argv) => {
201
185
  if (!value) {
202
- argv[ name ] = argv.themeColor || defaultValue
186
+ argv[name] = argv.themeColor || defaultValue
203
187
  return
204
188
  }
205
189
 
206
190
  if (
207
- (value.length !== 3 && value.length !== 6)
208
- || /^[0-9A-Fa-f]+$/.test(value) !== true
191
+ (value.length !== 3 && value.length !== 6) ||
192
+ /^[0-9A-Fa-f]+$/.test(value) !== true
209
193
  ) {
210
- die(`Invalid ${ name } color specified: "${ value }"`)
194
+ die(`Invalid ${name} color specified: "${value}"`)
211
195
  }
212
196
 
213
- argv[ name ] = '#' + value
197
+ argv[name] = '#' + value
214
198
  }
215
199
  }
216
200
 
217
- function splashscreenIconRatio (value, argv) {
201
+ function splashscreenIconRatio(value, argv) {
218
202
  if (!value && value !== 0) {
219
203
  argv.splashscreenIconRatio = defaultParams.splashscreenIconRatio
220
204
  return
221
205
  }
222
206
 
223
- const numeric = parseFloat(value)
207
+ const numeric = Number.parseFloat(value)
224
208
 
225
- if (isNaN(numeric)) {
209
+ if (Number.isNaN(numeric)) {
226
210
  die(`Invalid splashscreen icon ratio number specified`)
227
211
  }
228
212
  if (numeric < 0 || numeric > 100) {
229
- die(`Invalid splashscreen icon ratio specified (${ value }) - should be between 0 - 100`)
213
+ die(
214
+ `Invalid splashscreen icon ratio specified (${value}) - should be between 0 - 100`
215
+ )
230
216
  }
231
217
 
232
218
  argv.splashscreenIconRatio = numeric
233
219
  }
234
220
 
235
- function output (value) {
221
+ function output(value) {
236
222
  if (!value) {
237
223
  die(`The "output" param is required`)
238
224
  }
239
225
  }
240
226
 
241
- function assets (value, argv) {
227
+ function assets(value, argv) {
242
228
  if (!value) {
243
229
  argv.assets = []
244
230
  return
@@ -251,8 +237,8 @@ function assets (value, argv) {
251
237
  return
252
238
  }
253
239
 
254
- if (list.some(mode => !modesList.includes(mode))) {
255
- die(`Invalid assets requested: "${ value }"`)
240
+ if (list.some(item => !modesList.includes(item))) {
241
+ die(`Invalid assets requested: "${value}"`)
256
242
  }
257
243
 
258
244
  argv.assets = list
@@ -270,7 +256,10 @@ const parsers = {
270
256
 
271
257
  themeColor: getColorParser('themeColor'),
272
258
  pngColor: getColorParser('pngColor', defaultParams.pngColor),
273
- splashscreenColor: getColorParser('splashscreenColor', defaultParams.splashscreenColor),
259
+ splashscreenColor: getColorParser(
260
+ 'splashscreenColor',
261
+ defaultParams.splashscreenColor
262
+ ),
274
263
  svgColor: getColorParser('svgColor', defaultParams.svgColor),
275
264
 
276
265
  include, // profile file param
@@ -279,13 +268,13 @@ const parsers = {
279
268
  assets // profile cmd
280
269
  }
281
270
 
282
- export function parseArgv (argv, list) {
271
+ export function parseArgv(argv, list) {
283
272
  list.forEach(name => {
284
- const fn = parsers[ name ]
273
+ const fn = parsers[name]
285
274
  if (fn === void 0) {
286
- die(`Invalid command parameter specified (${ name })`)
275
+ die(`Invalid command parameter specified (${name})`)
287
276
  }
288
277
 
289
- fn(argv[ name ], argv)
278
+ fn(argv[name], argv)
290
279
  })
291
280
  }
@@ -1,20 +1,18 @@
1
-
2
1
  import crossSpawn from 'cross-spawn'
3
2
 
4
3
  import { log, warn } from './logger.js'
5
4
 
6
- export function spawnSync (cmd, params, opts, onFail) {
7
- log(`[sync] Running "${ cmd } ${ params.join(' ') }"\n`)
5
+ export function spawnSync(cmd, params, opts, onFail) {
6
+ log(`[sync] Running "${cmd} ${params.join(' ')}"\n`)
8
7
 
9
- const runner = crossSpawn.sync(
10
- cmd,
11
- params,
12
- { stdio: 'inherit', stdout: 'inherit', stderr: 'inherit', ...opts }
13
- )
8
+ const runner = crossSpawn.sync(cmd, params, {
9
+ stdio: 'inherit',
10
+ ...opts
11
+ })
14
12
 
15
13
  if (runner.status || runner.error) {
16
14
  warn()
17
- warn(`Command "${ cmd }" failed with exit code: ${ runner.status }`)
18
- onFail && onFail()
15
+ warn(`Command "${cmd}" failed with exit code: ${runner.status}`)
16
+ onFail?.()
19
17
  }
20
18
  }
@@ -1,18 +1,19 @@
1
+ // oxlint-disable unicorn/no-thenable
1
2
 
2
- import Joi from '@hapi/joi'
3
+ import Joi from 'joi'
3
4
  import { red } from 'kolorist'
4
5
 
5
6
  import { generators } from '../generators/index.js'
6
7
  import { modes } from '../modes/index.js'
7
8
 
8
9
  const generatorsList = Object.keys(generators)
9
- const modesList = [ 'all' ].concat(Object.keys(modes))
10
- const platformsList = [ 'cordova-ios', 'cordova-android' ]
10
+ const modesList = ['all', ...Object.keys(modes)]
11
+ const platformsList = ['cordova-ios', 'cordova-android']
11
12
 
12
13
  const baseParamsSchema = {
13
- include: Joi.array().min(1).items(
14
- Joi.string().valid(...modesList)
15
- ),
14
+ include: Joi.array()
15
+ .min(1)
16
+ .items(Joi.string().valid(...modesList)),
16
17
 
17
18
  icon: Joi.string().min(1),
18
19
  background: Joi.string().min(1),
@@ -21,15 +22,15 @@ const baseParamsSchema = {
21
22
  quality: Joi.number().integer().min(1).max(12),
22
23
 
23
24
  skipTrim: Joi.boolean(),
24
- padding: Joi.array().items(
25
- Joi.number().integer().min(0)
26
- ).min(1).max(2),
25
+ padding: Joi.array().items(Joi.number().integer().min(0)).min(1).max(2),
27
26
 
28
27
  splashscreenIconRatio: Joi.number().integer().min(0).max(100)
29
28
  }
30
29
 
31
30
  const assetsSchema = Joi.array().items({
32
- generator: Joi.string().required().valid(...generatorsList),
31
+ generator: Joi.string()
32
+ .required()
33
+ .valid(...generatorsList),
33
34
  name: Joi.string().required().min(1),
34
35
  folder: Joi.string().required().min(1),
35
36
 
@@ -46,12 +47,13 @@ const assetsSchema = Joi.array().items({
46
47
 
47
48
  sizes: Joi.when('generator', {
48
49
  is: Joi.valid('png', 'splashscreen'),
49
- then: Joi.array().required().min(1).items(
50
- Joi.number().integer().min(1),
51
- Joi.array().items(
52
- Joi.number().integer().min(1)
53
- ).length(2)
54
- )
50
+ then: Joi.array()
51
+ .required()
52
+ .min(1)
53
+ .items(
54
+ Joi.number().integer().min(1),
55
+ Joi.array().items(Joi.number().integer().min(1)).length(2)
56
+ )
55
57
  }),
56
58
 
57
59
  tag: Joi.string()
@@ -61,8 +63,10 @@ const assetsSchema = Joi.array().items({
61
63
  * When generating the profile file, we don't want to validate with # on the hex color.
62
64
  * When generating the icon, we're expecting a hash on the color (automatically added to user input via the CLI)
63
65
  */
64
- const getColorParamsSchema = (requireHash) => {
65
- const colorPattern = Joi.string().pattern(new RegExp(`^${ requireHash ? '#' : '' }[0-9A-Fa-f]{3}([0-9A-Fa-f]{3})?$`))
66
+ const getColorParamsSchema = requireHash => {
67
+ const colorPattern = Joi.string().pattern(
68
+ new RegExp(`^${requireHash ? '#' : ''}[0-9A-Fa-f]{3}([0-9A-Fa-f]{3})?$`)
69
+ )
66
70
  return {
67
71
  themeColor: colorPattern,
68
72
  pngColor: colorPattern,
@@ -71,14 +75,15 @@ const getColorParamsSchema = (requireHash) => {
71
75
  }
72
76
  }
73
77
 
74
- const getParamsSchema = (isGeneratingProfileFile) => {
75
- return {
76
- ...baseParamsSchema,
77
- ...getColorParamsSchema(isGeneratingProfileFile === false)
78
- }
79
- }
78
+ const getParamsSchema = isGeneratingProfileFile => ({
79
+ ...baseParamsSchema,
80
+ ...getColorParamsSchema(!isGeneratingProfileFile)
81
+ })
80
82
 
81
- export function validateProfileObject (profileObject, generatingProfileFile = false) {
83
+ export function validateProfileObject(
84
+ profileObject,
85
+ generatingProfileFile = false
86
+ ) {
82
87
  const profileSchema = Joi.object({
83
88
  params: getParamsSchema(generatingProfileFile),
84
89
  assets: assetsSchema
@@ -86,8 +91,10 @@ export function validateProfileObject (profileObject, generatingProfileFile = fa
86
91
 
87
92
  const { error } = profileSchema.validate(profileObject)
88
93
  if (error) {
89
- console.error(` ${ red('ERROR') }: Input parameters are not valid. Please correct them.`)
90
- console.error(` ${ error }`)
94
+ console.error(
95
+ ` ${red('ERROR')}: Input parameters are not valid. Please correct them.`
96
+ )
97
+ console.error(` ${error}`)
91
98
  console.log()
92
99
  process.exit(1)
93
100
  }
package/package.json CHANGED
@@ -1,73 +1,71 @@
1
1
  {
2
2
  "name": "@quasar/icongenie",
3
- "version": "4.0.0",
3
+ "version": "5.0.1",
4
4
  "description": "A Quasar tool for generating all your Quasar App's icons and splashscreens",
5
- "bin": {
6
- "icongenie": "./bin/icongenie.js"
7
- },
8
- "type": "module",
9
- "scripts": {
10
- "lint": "eslint --ext .js ./ --fix --report-unused-disable-directives"
11
- },
12
- "repository": {
13
- "type": "git",
14
- "url": "git+https://github.com/quasarframework/quasar.git"
15
- },
16
- "engines": {
17
- "node": ">= 18.12.0"
18
- },
19
5
  "keywords": [
20
- "vuejs",
21
- "vue",
6
+ "bex",
7
+ "desktop",
8
+ "electron",
22
9
  "icons",
23
- "quasar",
24
10
  "js",
25
11
  "phone",
26
- "tablet",
27
- "desktop",
28
- "spa",
29
12
  "pwa",
30
- "website",
31
- "electron",
32
- "bex"
13
+ "quasar",
14
+ "spa",
15
+ "tablet",
16
+ "vue",
17
+ "vuejs",
18
+ "website"
33
19
  ],
20
+ "homepage": "https://quasar.dev/icongenie/introduction",
21
+ "bugs": {
22
+ "url": "https://github.com/quasarframework/quasar/issues"
23
+ },
24
+ "license": "MIT",
34
25
  "author": "Razvan Stoenescu <razvan.stoenescu@gmail.com>",
35
26
  "contributors": [
36
27
  "Razvan Stoenescu <razvan.stoenescu@gmail.com>",
37
28
  "Daniel Thompson-Yvetot <35242872+nothingismagick@users.noreply.github.com>"
38
29
  ],
39
- "license": "MIT",
40
- "bugs": {
41
- "url": "https://github.com/quasarframework/quasar/issues"
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/quasarframework/quasar.git"
33
+ },
34
+ "bin": {
35
+ "icongenie": "./bin/icongenie.js"
36
+ },
37
+ "files": [
38
+ "bin",
39
+ "lib",
40
+ "samples",
41
+ "README.md",
42
+ "LICENSE"
43
+ ],
44
+ "type": "module",
45
+ "publishConfig": {
46
+ "access": "public"
42
47
  },
43
- "homepage": "https://quasar.dev/icongenie/introduction",
44
48
  "dependencies": {
45
- "@hapi/joi": "^17.1.1",
46
- "cross-spawn": "^7.0.2",
49
+ "@quasar/art": "^1.0.0",
50
+ "ci-info": "^4.4.0",
51
+ "cross-spawn": "^7.0.6",
47
52
  "elementtree": "^0.1.7",
48
- "fast-glob": "^3.3.2",
49
53
  "fs-extra": "^11.2.0",
50
- "imagemin": "^8.0.1",
51
- "imagemin-pngquant": "^9.0.2",
54
+ "imagemin": "^9.0.1",
55
+ "imagemin-pngquant": "^10.0.0",
52
56
  "is-png": "^3.0.1",
57
+ "joi": "^18.2.1",
53
58
  "kolorist": "^1.8.0",
54
- "minimist": "^1.2.8",
55
59
  "png2icons": "^2.0.1",
56
60
  "potrace": "^2.1.5",
57
- "read-chunk": "^4.0.3",
58
- "sharp": "^0.32.6",
59
- "svgo": "^3.2.0",
60
- "untildify": "^5.0.0",
61
+ "read-chunk": "^5.0.0",
62
+ "sharp": "^0.34.5",
63
+ "svgo": "^4.0.1",
64
+ "tinyglobby": "^0.2.10",
65
+ "untildify": "^6.0.0",
61
66
  "update-notifier": "^7.0.0"
62
67
  },
63
- "devDependencies": {
64
- "eslint": "^8.57.0",
65
- "eslint-plugin-n": "^16.6.2"
66
- },
67
- "resolutions": {
68
- "minimist": "^1.2.8"
69
- },
70
- "publishConfig": {
71
- "access": "public"
68
+ "engines": {
69
+ "node": ">= 22.22.0"
72
70
  }
73
- }
71
+ }