@quasar/icongenie 2.5.4 → 3.1.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.
- package/.eslintignore +1 -0
- package/.eslintrc.cjs +50 -0
- package/bin/{icongenie → icongenie.js} +11 -11
- package/lib/cmd/generate.js +26 -21
- package/lib/cmd/help.js +3 -1
- package/lib/cmd/profile.js +19 -15
- package/lib/cmd/verify.js +16 -13
- package/lib/generators/icns.js +5 -4
- package/lib/generators/ico.js +5 -4
- package/lib/generators/index.js +13 -6
- package/lib/generators/png.js +3 -2
- package/lib/generators/splashscreen.js +3 -2
- package/lib/generators/svg.js +6 -5
- package/lib/modes/index.js +8 -5
- package/lib/modes/quasar-app-v1/bex.js +2 -1
- package/lib/modes/quasar-app-v1/capacitor.js +11 -10
- package/lib/modes/quasar-app-v1/cordova.js +14 -13
- package/lib/modes/quasar-app-v1/electron.js +2 -1
- package/lib/modes/quasar-app-v1/index.js +16 -8
- package/lib/modes/quasar-app-v1/pwa.js +11 -7
- package/lib/modes/quasar-app-v1/spa.js +2 -1
- package/lib/modes/quasar-app-v1/ssr.js +3 -2
- package/lib/modes/quasar-app-v2/bex.js +2 -1
- package/lib/modes/quasar-app-v2/capacitor.js +11 -10
- package/lib/modes/quasar-app-v2/cordova.js +14 -13
- package/lib/modes/quasar-app-v2/electron.js +2 -1
- package/lib/modes/quasar-app-v2/index.js +16 -8
- package/lib/modes/quasar-app-v2/pwa.js +11 -7
- package/lib/modes/quasar-app-v2/spa.js +2 -1
- package/lib/modes/quasar-app-v2/ssr.js +3 -2
- package/lib/mount/index.js +5 -4
- package/lib/mount/mount-cordova.js +31 -30
- package/lib/mount/mount-tag.js +3 -2
- package/lib/runner/generate.js +37 -36
- package/lib/runner/profile.js +12 -11
- package/lib/runner/verify.js +23 -22
- package/lib/utils/app-paths.js +18 -18
- package/lib/utils/default-params.js +2 -1
- package/lib/utils/filter-argv-params.js +4 -3
- package/lib/utils/get-assets-files.js +6 -5
- package/lib/utils/get-compression.js +6 -6
- package/lib/utils/get-file-size.js +5 -4
- package/lib/utils/get-files-options.js +7 -6
- package/lib/utils/get-png-size.js +8 -7
- package/lib/utils/get-profile-content.js +9 -5
- package/lib/utils/get-profile-files.js +10 -9
- package/lib/utils/get-square-icon.js +5 -4
- package/lib/utils/logger.js +8 -7
- package/lib/utils/merge-objects.js +5 -4
- package/lib/utils/node-version-check.js +6 -6
- package/lib/utils/package-json.js +6 -0
- package/lib/utils/parse-argv.js +43 -45
- package/lib/utils/spawn-sync.js +6 -5
- package/lib/utils/validate-profile-object.js +12 -8
- package/package.json +24 -14
package/lib/runner/generate.js
CHANGED
|
@@ -1,37 +1,38 @@
|
|
|
1
|
-
const { existsSync } = require('fs')
|
|
2
|
-
const { ensureFileSync } = require('fs-extra')
|
|
3
|
-
const { green, gray } = require('kolorist')
|
|
4
1
|
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { existsSync } from 'node:fs'
|
|
3
|
+
import { ensureFileSync } from 'fs-extra'
|
|
4
|
+
import { green, gray } from 'kolorist'
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const { mount } = require('../mount')
|
|
6
|
+
import { appDir, resolveDir } from '../utils/app-paths.js'
|
|
7
|
+
import { log, warn } from '../utils/logger.js'
|
|
11
8
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
import { modes } from '../modes/index.js'
|
|
10
|
+
import { generators } from '../generators/index.js'
|
|
11
|
+
import { mount } from '../mount/index.js'
|
|
12
|
+
|
|
13
|
+
import { getAssetsFiles } from '../utils/get-assets-files.js'
|
|
14
|
+
import { getFilesOptions } from '../utils/get-files-options.js'
|
|
15
|
+
import { parseArgv } from '../utils/parse-argv.js'
|
|
16
|
+
import { mergeObjects } from '../utils/merge-objects.js'
|
|
17
|
+
import { getProfileContent } from '../utils/get-profile-content.js'
|
|
18
|
+
import { getFileSize } from '../utils/get-file-size.js'
|
|
19
|
+
import { validateProfileObject } from '../utils/validate-profile-object.js'
|
|
19
20
|
|
|
20
21
|
function printBanner (assetsOf, params) {
|
|
21
22
|
console.log(` Generating files with the following options:
|
|
22
23
|
==========================
|
|
23
|
-
Quasar project folder..... ${green(appDir)}
|
|
24
|
-
${green(`Quality level............. ${params.quality}/12`)}
|
|
25
|
-
Icon source file.......... ${green(params.icon)}
|
|
26
|
-
Icon trimming............. ${params.skipTrim ? 'no' : green('yes')}
|
|
27
|
-
Icon padding.............. ${green(`horizontal: ${params.padding[0]}; vertical: ${params.padding[1]}`)}
|
|
28
|
-
Background source file.... ${params.background ? green(params.background) : 'none'}
|
|
29
|
-
Assets of................. ${green(assetsOf)}
|
|
30
|
-
Generator filter.......... ${params.filter ? green(params.filter) : 'none'}
|
|
31
|
-
Svg color................. ${green(params.svgColor)}
|
|
32
|
-
Png color................. ${green(params.pngColor)}
|
|
33
|
-
Splashscreen color........ ${green(params.splashscreenColor)}
|
|
34
|
-
Splashscreen icon ratio... ${green(params.splashscreenIconRatio)}%
|
|
24
|
+
Quasar project folder..... ${ green(appDir) }
|
|
25
|
+
${ green(`Quality level............. ${ params.quality }/12`) }
|
|
26
|
+
Icon source file.......... ${ green(params.icon) }
|
|
27
|
+
Icon trimming............. ${ params.skipTrim ? 'no' : green('yes') }
|
|
28
|
+
Icon padding.............. ${ green(`horizontal: ${ params.padding[ 0 ] }; vertical: ${ params.padding[ 1 ] }`) }
|
|
29
|
+
Background source file.... ${ params.background ? green(params.background) : 'none' }
|
|
30
|
+
Assets of................. ${ green(assetsOf) }
|
|
31
|
+
Generator filter.......... ${ params.filter ? green(params.filter) : 'none' }
|
|
32
|
+
Svg color................. ${ green(params.svgColor) }
|
|
33
|
+
Png color................. ${ green(params.pngColor) }
|
|
34
|
+
Splashscreen color........ ${ green(params.splashscreenColor) }
|
|
35
|
+
Splashscreen icon ratio... ${ green(params.splashscreenIconRatio) }%
|
|
35
36
|
==========================
|
|
36
37
|
`)
|
|
37
38
|
}
|
|
@@ -42,12 +43,12 @@ function parseAssets (assets, include) {
|
|
|
42
43
|
|
|
43
44
|
if (include) {
|
|
44
45
|
const embeddedModes = include.filter(
|
|
45
|
-
mode => existsSync(resolveDir(modes[mode].folder))
|
|
46
|
+
mode => existsSync(resolveDir(modes[ mode ].folder))
|
|
46
47
|
)
|
|
47
48
|
|
|
48
49
|
embeddedModes.forEach(mode => {
|
|
49
50
|
files = files.concat(
|
|
50
|
-
getAssetsFiles(modes[mode].assets)
|
|
51
|
+
getAssetsFiles(modes[ mode ].assets)
|
|
51
52
|
)
|
|
52
53
|
})
|
|
53
54
|
|
|
@@ -70,8 +71,8 @@ function getUniqueFiles (files) {
|
|
|
70
71
|
const uniqueFiles = []
|
|
71
72
|
|
|
72
73
|
files.forEach(file => {
|
|
73
|
-
if (filePaths[file.absoluteName] === void 0) {
|
|
74
|
-
filePaths[file.absoluteName] = true
|
|
74
|
+
if (filePaths[ file.absoluteName ] === void 0) {
|
|
75
|
+
filePaths[ file.absoluteName ] = true
|
|
75
76
|
uniqueFiles.push(file)
|
|
76
77
|
}
|
|
77
78
|
})
|
|
@@ -85,11 +86,11 @@ function generateFile (file, opts) {
|
|
|
85
86
|
|
|
86
87
|
return new Promise(resolve => {
|
|
87
88
|
// use the appropriate generator to handle the file creation
|
|
88
|
-
generators[file.generator](file, opts, () => {
|
|
89
|
-
const size = `(${getFileSize(file.absoluteName)})`
|
|
89
|
+
generators[ file.generator ](file, opts, () => {
|
|
90
|
+
const size = `(${ getFileSize(file.absoluteName) })`
|
|
90
91
|
const type = (file.generator + ':').padEnd(13, ' ')
|
|
91
92
|
|
|
92
|
-
log(`Generated ${type} ${green(file.relativeName)} ${gray(size)}`)
|
|
93
|
+
log(`Generated ${ type } ${ green(file.relativeName) } ${ gray(size) }`)
|
|
93
94
|
resolve()
|
|
94
95
|
})
|
|
95
96
|
})
|
|
@@ -121,7 +122,7 @@ async function generateFromProfile (profile) {
|
|
|
121
122
|
.then(() => uniqueFiles.length)
|
|
122
123
|
}
|
|
123
124
|
|
|
124
|
-
|
|
125
|
+
export function generate (argv) {
|
|
125
126
|
const profile = {
|
|
126
127
|
params: {},
|
|
127
128
|
assets: []
|
|
@@ -166,6 +167,6 @@ module.exports = function generate (argv) {
|
|
|
166
167
|
|
|
167
168
|
return generateFromProfile(profile)
|
|
168
169
|
.then(numberOfFiles => {
|
|
169
|
-
console.log(`\n Task done - generated ${numberOfFiles} file(s)!\n`)
|
|
170
|
+
console.log(`\n Task done - generated ${ numberOfFiles } file(s)!\n`)
|
|
170
171
|
})
|
|
171
172
|
}
|
package/lib/runner/profile.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
const { resolve, dirname, basename, isAbsolute, relative } = require('path')
|
|
2
|
-
const { writeFileSync } = require('fs')
|
|
3
|
-
const { ensureDir } = require('fs-extra')
|
|
4
1
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
import { resolve, dirname, basename, isAbsolute, relative } from 'node:path'
|
|
3
|
+
import { writeFileSync } from 'node:fs'
|
|
4
|
+
import { ensureDir } from 'fs-extra'
|
|
5
|
+
|
|
6
|
+
import { log } from '../utils/logger.js'
|
|
7
|
+
import { modes } from '../modes/index.js'
|
|
8
|
+
import { validateProfileObject } from '../utils/validate-profile-object.js'
|
|
9
|
+
import { appDir } from '../utils/app-paths.js'
|
|
8
10
|
|
|
9
11
|
function getParams ({ include, ...props }) {
|
|
10
12
|
if (include) {
|
|
@@ -18,7 +20,7 @@ function getAssets (assets) {
|
|
|
18
20
|
let list = []
|
|
19
21
|
|
|
20
22
|
assets.forEach(name => {
|
|
21
|
-
list = list.concat(modes[name].assets)
|
|
23
|
+
list = list.concat(modes[ name ].assets)
|
|
22
24
|
})
|
|
23
25
|
|
|
24
26
|
return list
|
|
@@ -36,11 +38,11 @@ function getTargetFilepath (output) {
|
|
|
36
38
|
? ''
|
|
37
39
|
: '.json'
|
|
38
40
|
|
|
39
|
-
const filename = `${prefix}${name}${suffix}`
|
|
41
|
+
const filename = `${ prefix }${ name }${ suffix }`
|
|
40
42
|
return resolve(process.cwd(), folder || '', filename)
|
|
41
43
|
}
|
|
42
44
|
|
|
43
|
-
|
|
45
|
+
export function profile ({ output, assets, ...params }) {
|
|
44
46
|
const profile = {
|
|
45
47
|
params: getParams(params),
|
|
46
48
|
assets: getAssets(assets)
|
|
@@ -51,7 +53,6 @@ module.exports = function profile ({ output, assets, ...params }) {
|
|
|
51
53
|
if (profile.params.icon && isAbsolute(profile.params.icon) === false) {
|
|
52
54
|
// generate icon path relative to app root
|
|
53
55
|
// so it won't matter from where the profile file is run
|
|
54
|
-
const { appDir } = require('../utils/app-paths')
|
|
55
56
|
profile.params.icon = relative(appDir, profile.params.icon)
|
|
56
57
|
}
|
|
57
58
|
|
|
@@ -65,5 +66,5 @@ module.exports = function profile ({ output, assets, ...params }) {
|
|
|
65
66
|
writeFileSync(targetFile, JSON.stringify(profile, null, 2), 'utf-8')
|
|
66
67
|
|
|
67
68
|
console.log(` Generated Icon Genie profile file:`)
|
|
68
|
-
log(`${targetFile}\n`)
|
|
69
|
+
log(`${ targetFile }\n`)
|
|
69
70
|
}
|
package/lib/runner/verify.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
const { existsSync } = require('fs')
|
|
2
|
-
const { green, red, underline } = require('kolorist')
|
|
3
1
|
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { existsSync } from 'node:fs'
|
|
3
|
+
import { green, red, underline } from 'kolorist'
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
5
|
+
import { appDir, resolveDir } from '../utils/app-paths.js'
|
|
6
|
+
import { warn } from '../utils/logger.js'
|
|
7
|
+
|
|
8
|
+
import { modes } from '../modes/index.js'
|
|
9
|
+
import { verifyMount } from '../mount/index.js'
|
|
10
|
+
import { getAssetsFiles } from '../utils/get-assets-files.js'
|
|
11
|
+
import { getPngSize } from '../utils/get-png-size.js'
|
|
12
|
+
import { parseArgv } from '../utils/parse-argv.js'
|
|
13
|
+
import { mergeObjects } from '../utils/merge-objects.js'
|
|
14
|
+
import { getProfileContent } from '../utils/get-profile-content.js'
|
|
15
|
+
import { validateProfileObject } from '../utils/validate-profile-object.js'
|
|
15
16
|
|
|
16
17
|
function getFileStatus (file) {
|
|
17
18
|
if (!existsSync(file.absoluteName)) {
|
|
@@ -26,7 +27,7 @@ function getFileStatus (file) {
|
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
if (width !== file.width || height !== file.height) {
|
|
29
|
-
return red(`ERROR: incorrect resolution! ${width}x${height}`)
|
|
30
|
+
return red(`ERROR: incorrect resolution! ${ width }x${ height }`)
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
33
|
|
|
@@ -34,10 +35,10 @@ function getFileStatus (file) {
|
|
|
34
35
|
}
|
|
35
36
|
|
|
36
37
|
function printMode (modeName, files) {
|
|
37
|
-
console.log(` ${green(underline(`Mode ${modeName.toUpperCase()}`))} \n`)
|
|
38
|
+
console.log(` ${ green(underline(`Mode ${ modeName.toUpperCase() }`)) } \n`)
|
|
38
39
|
|
|
39
40
|
files.forEach(file => {
|
|
40
|
-
console.log(` ${getFileStatus(file)} - ${(file.generator + ':').padEnd(13, ' ')} ${file.relativeName} ${verifyMount(file)}`)
|
|
41
|
+
console.log(` ${ getFileStatus(file) } - ${ (file.generator + ':').padEnd(13, ' ') } ${ file.relativeName } ${ verifyMount(file) }`)
|
|
41
42
|
})
|
|
42
43
|
|
|
43
44
|
console.log()
|
|
@@ -46,26 +47,26 @@ function printMode (modeName, files) {
|
|
|
46
47
|
function printBanner (assetsOf, params) {
|
|
47
48
|
console.log(` VERIFYING with the following options:
|
|
48
49
|
================
|
|
49
|
-
Root folder..... ${green(appDir)}
|
|
50
|
-
Assets of....... ${green(assetsOf)}
|
|
51
|
-
Assets filter... ${!params.filter ? 'none' : green(params.filter)}
|
|
50
|
+
Root folder..... ${ green(appDir) }
|
|
51
|
+
Assets of....... ${ green(assetsOf) }
|
|
52
|
+
Assets filter... ${ !params.filter ? 'none' : green(params.filter) }
|
|
52
53
|
================
|
|
53
54
|
`)
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
function parseAssets (assets, include) {
|
|
57
|
-
|
|
58
|
+
const filesMap = []
|
|
58
59
|
let assetsOf = []
|
|
59
60
|
|
|
60
61
|
if (include) {
|
|
61
62
|
const embeddedModes = include.filter(
|
|
62
|
-
mode => existsSync(resolveDir(modes[mode].folder))
|
|
63
|
+
mode => existsSync(resolveDir(modes[ mode ].folder))
|
|
63
64
|
)
|
|
64
65
|
|
|
65
66
|
embeddedModes.forEach(mode => {
|
|
66
67
|
filesMap.push({
|
|
67
68
|
name: mode,
|
|
68
|
-
files: getAssetsFiles(modes[mode].assets)
|
|
69
|
+
files: getAssetsFiles(modes[ mode ].assets)
|
|
69
70
|
})
|
|
70
71
|
})
|
|
71
72
|
|
|
@@ -109,7 +110,7 @@ function verifyProfile (profile) {
|
|
|
109
110
|
})
|
|
110
111
|
}
|
|
111
112
|
|
|
112
|
-
|
|
113
|
+
export function verify (argv) {
|
|
113
114
|
const profile = {
|
|
114
115
|
params: {},
|
|
115
116
|
assets: []
|
package/lib/utils/app-paths.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
const { existsSync } = require('fs')
|
|
2
|
-
const { normalize, join, sep } = require('path')
|
|
3
1
|
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
import { existsSync } from 'node:fs'
|
|
3
|
+
import { normalize, join, sep } from 'node:path'
|
|
6
4
|
|
|
7
|
-
|
|
5
|
+
import { fatal } from './logger.js'
|
|
6
|
+
|
|
7
|
+
function getAppInfo () {
|
|
8
|
+
let appDir = process.cwd()
|
|
9
|
+
|
|
10
|
+
while (appDir.length && appDir[ appDir.length - 1 ] !== sep) {
|
|
8
11
|
if (
|
|
9
|
-
existsSync(join(
|
|
10
|
-
existsSync(join(
|
|
12
|
+
existsSync(join(appDir, 'quasar.config.js'))
|
|
13
|
+
|| existsSync(join(appDir, 'quasar.config.mjs'))
|
|
14
|
+
|| existsSync(join(appDir, 'quasar.config.ts'))
|
|
15
|
+
|| existsSync(join(appDir, 'quasar.config.cjs'))
|
|
16
|
+
|| existsSync(join(appDir, 'quasar.conf.js')) // legacy
|
|
11
17
|
) {
|
|
12
|
-
return
|
|
18
|
+
return appDir
|
|
13
19
|
}
|
|
14
20
|
|
|
15
|
-
|
|
21
|
+
appDir = normalize(join(appDir, '..'))
|
|
16
22
|
}
|
|
17
23
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
warn(`Error. This command must be executed inside a Quasar v1+ project folder.`)
|
|
21
|
-
warn()
|
|
22
|
-
process.exit(1)
|
|
24
|
+
fatal(`Error. This command must be executed inside a Quasar project folder.`)
|
|
23
25
|
}
|
|
24
26
|
|
|
25
|
-
const appDir =
|
|
26
|
-
|
|
27
|
-
module.exports.appDir = appDir
|
|
28
|
-
module.exports.resolveDir = dir => join(appDir, dir)
|
|
27
|
+
export const appDir = getAppInfo()
|
|
28
|
+
export const resolveDir = dir => join(appDir, dir)
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
|
+
export function filterArgvParams (argv) {
|
|
2
3
|
const params = {}
|
|
3
4
|
|
|
4
5
|
Object.keys(argv).forEach(key => {
|
|
5
6
|
if (key.length > 1 && key !== 'help') {
|
|
6
7
|
// kebab to camel case
|
|
7
|
-
const prop = key.replace(/(-\w)/g, m => m[1].toUpperCase())
|
|
8
|
+
const prop = key.replace(/(-\w)/g, m => m[ 1 ].toUpperCase())
|
|
8
9
|
|
|
9
|
-
params[prop] = argv[key]
|
|
10
|
+
params[ prop ] = argv[ key ]
|
|
10
11
|
}
|
|
11
12
|
})
|
|
12
13
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
const { join } = require('path')
|
|
2
1
|
|
|
3
|
-
|
|
2
|
+
import { join } from 'node:path'
|
|
3
|
+
|
|
4
|
+
import { appDir } from './app-paths.js'
|
|
4
5
|
|
|
5
6
|
const tagRegex = /\{(.*?)\}/g
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
export function getAssetsFiles (assets) {
|
|
8
9
|
const list = []
|
|
9
10
|
|
|
10
11
|
assets.forEach(({ sizes, ...props }) => {
|
|
@@ -17,7 +18,7 @@ module.exports = function getAssetsFiles (assets) {
|
|
|
17
18
|
: [ size, size ]
|
|
18
19
|
|
|
19
20
|
const replacer = isArray
|
|
20
|
-
? `${width}x${height}`
|
|
21
|
+
? `${ width }x${ height }`
|
|
21
22
|
: width
|
|
22
23
|
|
|
23
24
|
list.push({
|
|
@@ -41,7 +42,7 @@ module.exports = function getAssetsFiles (assets) {
|
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
if (tag) {
|
|
44
|
-
file.tag = tag.replace(tagRegex, (_, p) => file[p === 'size' ? 'width' : p])
|
|
45
|
+
file.tag = tag.replace(tagRegex, (_, p) => file[ p === 'size' ? 'width' : p ])
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
return file
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
const { dirname } = require('path')
|
|
2
1
|
|
|
3
|
-
|
|
4
|
-
const pngquant = require('imagemin-pngquant')
|
|
2
|
+
import { dirname } from 'node:path'
|
|
5
3
|
|
|
6
|
-
|
|
4
|
+
import imagemin from 'imagemin'
|
|
5
|
+
import pngquant from 'imagemin-pngquant'
|
|
6
|
+
import { BICUBIC2, HERMITE, BEZIER, BICUBIC, BILINEAR, NEAREST_NEIGHBOR } from 'png2icons'
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
export function getIcoCompression (quality) {
|
|
9
9
|
switch (quality) {
|
|
10
10
|
case 1:
|
|
11
11
|
case 2:
|
|
@@ -28,7 +28,7 @@ module.exports.getIcoCompression = function getIcoCompression (quality) {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
export function getPngCompression (quality) {
|
|
32
32
|
if (quality === 12) {
|
|
33
33
|
return () => {}
|
|
34
34
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
const { statSync } = require('fs')
|
|
2
1
|
|
|
3
|
-
|
|
2
|
+
import { statSync } from 'node:fs'
|
|
3
|
+
|
|
4
|
+
const units = [ 'B', 'KB', 'MB', 'GB', 'TB', 'PB' ]
|
|
4
5
|
|
|
5
6
|
function humanStorageSize (bytes) {
|
|
6
7
|
let u = 0
|
|
@@ -10,9 +11,9 @@ function humanStorageSize (bytes) {
|
|
|
10
11
|
++u
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
return `${bytes.toFixed(1)}${units[u]}`
|
|
14
|
+
return `${ bytes.toFixed(1) }${ units[ u ] }`
|
|
14
15
|
}
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
export function getFileSize (filename) {
|
|
17
18
|
return humanStorageSize(statSync(filename).size)
|
|
18
19
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
const sharp = require('sharp')
|
|
2
1
|
|
|
3
|
-
|
|
2
|
+
import sharp from 'sharp'
|
|
3
|
+
|
|
4
|
+
import { getPngCompression, getIcoCompression } from './get-compression.js'
|
|
4
5
|
|
|
5
6
|
function getRgbColor (color) {
|
|
6
7
|
let hex = color.replace(/^#/, '')
|
|
7
8
|
|
|
8
9
|
if (hex.length === 3) {
|
|
9
|
-
hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]
|
|
10
|
+
hex = hex[ 0 ] + hex[ 0 ] + hex[ 1 ] + hex[ 1 ] + hex[ 2 ] + hex[ 2 ]
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
const num = parseInt(hex, 16)
|
|
@@ -19,7 +20,7 @@ function getRgbColor (color) {
|
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
|
|
23
|
+
export async function getFilesOptions ({
|
|
23
24
|
quality,
|
|
24
25
|
padding,
|
|
25
26
|
|
|
@@ -51,8 +52,8 @@ module.exports = async function getFilesOptions ({
|
|
|
51
52
|
const computedPadding = padding
|
|
52
53
|
? (
|
|
53
54
|
padding.length === 1
|
|
54
|
-
? { horiz: padding[0], vert: padding[0] }
|
|
55
|
-
: { horiz: padding[0], vert: padding[1] }
|
|
55
|
+
? { horiz: padding[ 0 ], vert: padding[ 0 ] }
|
|
56
|
+
: { horiz: padding[ 0 ], vert: padding[ 1 ] }
|
|
56
57
|
)
|
|
57
58
|
: { horiz: 0, vert: 0 }
|
|
58
59
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
|
|
2
|
+
import { readChunkSync } from 'read-chunk'
|
|
3
|
+
import isPng from 'is-png'
|
|
3
4
|
|
|
4
5
|
// "fried" png's - http://www.jongware.com/pngdefry.html
|
|
5
6
|
const friedChunk = 'CgBI'
|
|
@@ -10,15 +11,15 @@ function getSize (buffer) {
|
|
|
10
11
|
: [ 20, 16 ]
|
|
11
12
|
|
|
12
13
|
return {
|
|
13
|
-
height: buffer.readUInt32BE(offset[0]),
|
|
14
|
-
width: buffer.readUInt32BE(offset[1])
|
|
14
|
+
height: buffer.readUInt32BE(offset[ 0 ]),
|
|
15
|
+
width: buffer.readUInt32BE(offset[ 1 ])
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
const buffer =
|
|
19
|
+
export function getPngSize (file) {
|
|
20
|
+
const buffer = readChunkSync(file, { startPosition: 0, length: 40 })
|
|
20
21
|
|
|
21
22
|
return isPng(buffer) !== true
|
|
22
|
-
? { width: 0, height: 0}
|
|
23
|
+
? { width: 0, height: 0 }
|
|
23
24
|
: getSize(buffer)
|
|
24
25
|
}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
const { resolve } = require('path')
|
|
2
1
|
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { resolve } from 'node:path'
|
|
3
|
+
import { readFileSync } from 'node:fs'
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
import { warn } from './logger.js'
|
|
6
|
+
import { appDir } from './app-paths.js'
|
|
7
|
+
|
|
8
|
+
export function getProfileContent (profileFile) {
|
|
7
9
|
const file = resolve(appDir, profileFile)
|
|
8
10
|
|
|
9
11
|
try {
|
|
10
|
-
return
|
|
12
|
+
return JSON.parse(
|
|
13
|
+
readFileSync(file, 'utf-8')
|
|
14
|
+
)
|
|
11
15
|
}
|
|
12
16
|
catch (err) {
|
|
13
17
|
warn(`Specified profile file has a syntax error`)
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
const { basename } = require('path')
|
|
2
|
-
const glob = require('fast-glob')
|
|
3
|
-
const { lstatSync } = require('fs')
|
|
4
1
|
|
|
5
|
-
|
|
2
|
+
import { basename } from 'node:path'
|
|
3
|
+
import glob from 'fast-glob'
|
|
4
|
+
import { lstatSync } from 'node:fs'
|
|
5
|
+
|
|
6
|
+
import { warn } from '../utils/logger.js'
|
|
6
7
|
|
|
7
8
|
function parseFolder (folder) {
|
|
8
9
|
const profileFiles = glob.sync(`icongenie-*.json`, {
|
|
@@ -14,19 +15,19 @@ function parseFolder (folder) {
|
|
|
14
15
|
const numberOfFiles = profileFiles.length
|
|
15
16
|
|
|
16
17
|
if (numberOfFiles === 0) {
|
|
17
|
-
warn(`No icongenie-*.json files detected in "${folder}" folder!`)
|
|
18
|
+
warn(`No icongenie-*.json files detected in "${ folder }" folder!`)
|
|
18
19
|
process.exit(1)
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
console.log(` Detected ${numberOfFiles} JSON profile file(s):\n`)
|
|
22
|
-
console.log(` * ${folder}`)
|
|
22
|
+
console.log(` Detected ${ numberOfFiles } JSON profile file(s):\n`)
|
|
23
|
+
console.log(` * ${ folder }`)
|
|
23
24
|
|
|
24
25
|
profileFiles.forEach((file, index) => {
|
|
25
26
|
const prefix = index + 1 < profileFiles.length
|
|
26
27
|
? `├──`
|
|
27
28
|
: `└──`
|
|
28
29
|
|
|
29
|
-
console.log(` ${prefix} ${basename(file)}`)
|
|
30
|
+
console.log(` ${ prefix } ${ basename(file) }`)
|
|
30
31
|
})
|
|
31
32
|
|
|
32
33
|
console.log()
|
|
@@ -34,7 +35,7 @@ function parseFolder (folder) {
|
|
|
34
35
|
return profileFiles
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
|
|
38
|
+
export function getProfileFiles (profileParam) {
|
|
38
39
|
return lstatSync(profileParam).isDirectory()
|
|
39
40
|
? parseFolder(profileParam)
|
|
40
41
|
: [ profileParam ]
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
const { warn } = require('../utils/logger')
|
|
2
1
|
|
|
3
|
-
|
|
2
|
+
import { warn } from '../utils/logger.js'
|
|
3
|
+
|
|
4
|
+
export function getSquareIcon ({
|
|
4
5
|
file,
|
|
5
6
|
icon,
|
|
6
7
|
size,
|
|
@@ -10,7 +11,7 @@ module.exports = function getSquareIcon ({
|
|
|
10
11
|
const img = icon.clone()
|
|
11
12
|
let width = size - 2 * horiz
|
|
12
13
|
let height = size - 2 * vert
|
|
13
|
-
|
|
14
|
+
const corrections = []
|
|
14
15
|
|
|
15
16
|
if (width <= 0) {
|
|
16
17
|
width = size
|
|
@@ -25,7 +26,7 @@ module.exports = function getSquareIcon ({
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
if (corrections.length > 0) {
|
|
28
|
-
warn(`Correction on padding for ${file.relativeName} due to padding exceeding file's dimension of ${size}x${size}px`)
|
|
29
|
+
warn(`Correction on padding for ${ file.relativeName } due to padding exceeding file's dimension of ${ size }x${ size }px`)
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
img.resize({
|
package/lib/utils/logger.js
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
|
+
import { green, red } from 'kolorist'
|
|
2
3
|
|
|
3
4
|
const banner = '*'
|
|
4
5
|
|
|
5
6
|
const logBanner = green(banner)
|
|
6
7
|
const warnBanner = red(banner)
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
console.log(msg ? ` ${logBanner} ${msg}` : '')
|
|
9
|
+
export function log (msg) {
|
|
10
|
+
console.log(msg ? ` ${ logBanner } ${ msg }` : '')
|
|
10
11
|
}
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
console.warn(msg ? ` ${warnBanner} ⚠️ ${msg}\n` : '')
|
|
13
|
+
export function warn (msg) {
|
|
14
|
+
console.warn(msg ? ` ${ warnBanner } ⚠️ ${ msg }\n` : '')
|
|
14
15
|
}
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
console.error(msg ? ` ${warnBanner} ⚠️ ${msg}` : '')
|
|
17
|
+
export function fatal (msg) {
|
|
18
|
+
console.error(msg ? ` ${ warnBanner } ⚠️ ${ msg }` : '')
|
|
18
19
|
process.exit(1)
|
|
19
20
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
|
+
export function mergeObjects () {
|
|
2
3
|
const base = {}
|
|
3
4
|
|
|
4
5
|
for (let i = 0; i < arguments.length; i++) {
|
|
5
|
-
const obj = arguments[i]
|
|
6
|
+
const obj = arguments[ i ]
|
|
6
7
|
|
|
7
8
|
Object.keys(obj).forEach(key => {
|
|
8
|
-
if (obj[key] !== void 0) {
|
|
9
|
-
base[key] = obj[key]
|
|
9
|
+
if (obj[ key ] !== void 0) {
|
|
10
|
+
base[ key ] = obj[ key ]
|
|
10
11
|
}
|
|
11
12
|
})
|
|
12
13
|
}
|