@iconoma/cli 0.0.1-beta.2 → 0.0.2

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/README.md CHANGED
@@ -1,374 +1,91 @@
1
- @iconoma/cli
2
- =================
3
-
4
- A developer-friendly tool to manage and organize icons through CLI and web studio
5
-
6
-
7
- [![oclif](https://img.shields.io/badge/cli-oclif-brightgreen.svg)](https://oclif.io)
8
- [![Version](https://img.shields.io/npm/v/@iconoma/cli.svg)](https://npmjs.org/package/@iconoma/cli)
9
- [![Downloads/week](https://img.shields.io/npm/dw/@iconoma/cli.svg)](https://npmjs.org/package/@iconoma/cli)
10
-
11
-
12
- <!-- toc -->
13
- * [Usage](#usage)
14
- * [Commands](#commands)
15
- <!-- tocstop -->
16
- # Usage
17
- <!-- usage -->
18
- ```sh-session
19
- $ npm install -g @iconoma/cli
20
- $ iconoma COMMAND
21
- running command...
22
- $ iconoma (--version)
23
- @iconoma/cli/0.0.1-beta.2 linux-x64 node-v20.19.6
24
- $ iconoma --help [COMMAND]
25
- USAGE
26
- $ iconoma COMMAND
27
- ...
28
- ```
29
- <!-- usagestop -->
30
- # Commands
31
- <!-- commands -->
32
- * [`iconoma help [COMMAND]`](#iconoma-help-command)
33
- * [`iconoma plugins`](#iconoma-plugins)
34
- * [`iconoma plugins add PLUGIN`](#iconoma-plugins-add-plugin)
35
- * [`iconoma plugins:inspect PLUGIN...`](#iconoma-pluginsinspect-plugin)
36
- * [`iconoma plugins install PLUGIN`](#iconoma-plugins-install-plugin)
37
- * [`iconoma plugins link PATH`](#iconoma-plugins-link-path)
38
- * [`iconoma plugins remove [PLUGIN]`](#iconoma-plugins-remove-plugin)
39
- * [`iconoma plugins reset`](#iconoma-plugins-reset)
40
- * [`iconoma plugins uninstall [PLUGIN]`](#iconoma-plugins-uninstall-plugin)
41
- * [`iconoma plugins unlink [PLUGIN]`](#iconoma-plugins-unlink-plugin)
42
- * [`iconoma plugins update`](#iconoma-plugins-update)
43
- * [`iconoma studio`](#iconoma-studio)
44
-
45
- ## `iconoma help [COMMAND]`
46
-
47
- Display help for iconoma.
48
-
49
- ```
50
- USAGE
51
- $ iconoma help [COMMAND...] [-n]
52
-
53
- ARGUMENTS
54
- [COMMAND...] Command to show help for.
55
-
56
- FLAGS
57
- -n, --nested-commands Include all nested commands in the output.
58
-
59
- DESCRIPTION
60
- Display help for iconoma.
61
- ```
62
-
63
- _See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v6.2.36/src/commands/help.ts)_
64
-
65
- ## `iconoma plugins`
66
-
67
- List installed plugins.
68
-
69
- ```
70
- USAGE
71
- $ iconoma plugins [--json] [--core]
72
-
73
- FLAGS
74
- --core Show core plugins.
75
-
76
- GLOBAL FLAGS
77
- --json Format output as json.
78
-
79
- DESCRIPTION
80
- List installed plugins.
81
-
82
- EXAMPLES
83
- $ iconoma plugins
84
- ```
85
-
86
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.54/src/commands/plugins/index.ts)_
87
-
88
- ## `iconoma plugins add PLUGIN`
89
-
90
- Installs a plugin into iconoma.
91
-
92
- ```
93
- USAGE
94
- $ iconoma plugins add PLUGIN... [--json] [-f] [-h] [-s | -v]
95
-
96
- ARGUMENTS
97
- PLUGIN... Plugin to install.
98
-
99
- FLAGS
100
- -f, --force Force npm to fetch remote resources even if a local copy exists on disk.
101
- -h, --help Show CLI help.
102
- -s, --silent Silences npm output.
103
- -v, --verbose Show verbose npm output.
104
-
105
- GLOBAL FLAGS
106
- --json Format output as json.
107
-
108
- DESCRIPTION
109
- Installs a plugin into iconoma.
110
-
111
- Uses npm to install plugins.
112
-
113
- Installation of a user-installed plugin will override a core plugin.
114
-
115
- Use the ICONOMA_NPM_LOG_LEVEL environment variable to set the npm loglevel.
116
- Use the ICONOMA_NPM_REGISTRY environment variable to set the npm registry.
117
-
118
- ALIASES
119
- $ iconoma plugins add
120
-
121
- EXAMPLES
122
- Install a plugin from npm registry.
123
-
124
- $ iconoma plugins add myplugin
125
-
126
- Install a plugin from a github url.
127
-
128
- $ iconoma plugins add https://github.com/someuser/someplugin
129
-
130
- Install a plugin from a github slug.
131
-
132
- $ iconoma plugins add someuser/someplugin
133
- ```
134
-
135
- ## `iconoma plugins:inspect PLUGIN...`
136
-
137
- Displays installation properties of a plugin.
138
-
139
- ```
140
- USAGE
141
- $ iconoma plugins inspect PLUGIN...
142
-
143
- ARGUMENTS
144
- PLUGIN... [default: .] Plugin to inspect.
145
-
146
- FLAGS
147
- -h, --help Show CLI help.
148
- -v, --verbose
149
-
150
- GLOBAL FLAGS
151
- --json Format output as json.
152
-
153
- DESCRIPTION
154
- Displays installation properties of a plugin.
155
-
156
- EXAMPLES
157
- $ iconoma plugins inspect myplugin
158
- ```
159
-
160
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.54/src/commands/plugins/inspect.ts)_
161
-
162
- ## `iconoma plugins install PLUGIN`
163
-
164
- Installs a plugin into iconoma.
165
-
166
- ```
167
- USAGE
168
- $ iconoma plugins install PLUGIN... [--json] [-f] [-h] [-s | -v]
169
-
170
- ARGUMENTS
171
- PLUGIN... Plugin to install.
172
-
173
- FLAGS
174
- -f, --force Force npm to fetch remote resources even if a local copy exists on disk.
175
- -h, --help Show CLI help.
176
- -s, --silent Silences npm output.
177
- -v, --verbose Show verbose npm output.
178
-
179
- GLOBAL FLAGS
180
- --json Format output as json.
181
-
182
- DESCRIPTION
183
- Installs a plugin into iconoma.
184
-
185
- Uses npm to install plugins.
186
-
187
- Installation of a user-installed plugin will override a core plugin.
188
-
189
- Use the ICONOMA_NPM_LOG_LEVEL environment variable to set the npm loglevel.
190
- Use the ICONOMA_NPM_REGISTRY environment variable to set the npm registry.
191
-
192
- ALIASES
193
- $ iconoma plugins add
194
-
195
- EXAMPLES
196
- Install a plugin from npm registry.
197
-
198
- $ iconoma plugins install myplugin
199
-
200
- Install a plugin from a github url.
201
-
202
- $ iconoma plugins install https://github.com/someuser/someplugin
203
-
204
- Install a plugin from a github slug.
205
-
206
- $ iconoma plugins install someuser/someplugin
207
- ```
208
-
209
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.54/src/commands/plugins/install.ts)_
210
-
211
- ## `iconoma plugins link PATH`
212
-
213
- Links a plugin into the CLI for development.
214
-
215
- ```
216
- USAGE
217
- $ iconoma plugins link PATH [-h] [--install] [-v]
218
-
219
- ARGUMENTS
220
- PATH [default: .] path to plugin
221
-
222
- FLAGS
223
- -h, --help Show CLI help.
224
- -v, --verbose
225
- --[no-]install Install dependencies after linking the plugin.
226
-
227
- DESCRIPTION
228
- Links a plugin into the CLI for development.
229
-
230
- Installation of a linked plugin will override a user-installed or core plugin.
231
-
232
- e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'
233
- command will override the user-installed or core plugin implementation. This is useful for development work.
234
-
235
-
236
- EXAMPLES
237
- $ iconoma plugins link myplugin
238
- ```
239
-
240
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.54/src/commands/plugins/link.ts)_
241
-
242
- ## `iconoma plugins remove [PLUGIN]`
243
-
244
- Removes a plugin from the CLI.
245
-
246
- ```
247
- USAGE
248
- $ iconoma plugins remove [PLUGIN...] [-h] [-v]
249
-
250
- ARGUMENTS
251
- [PLUGIN...] plugin to uninstall
252
-
253
- FLAGS
254
- -h, --help Show CLI help.
255
- -v, --verbose
256
-
257
- DESCRIPTION
258
- Removes a plugin from the CLI.
259
-
260
- ALIASES
261
- $ iconoma plugins unlink
262
- $ iconoma plugins remove
263
-
264
- EXAMPLES
265
- $ iconoma plugins remove myplugin
266
- ```
267
-
268
- ## `iconoma plugins reset`
269
-
270
- Remove all user-installed and linked plugins.
271
-
272
- ```
273
- USAGE
274
- $ iconoma plugins reset [--hard] [--reinstall]
275
-
276
- FLAGS
277
- --hard Delete node_modules and package manager related files in addition to uninstalling plugins.
278
- --reinstall Reinstall all plugins after uninstalling.
279
- ```
280
-
281
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.54/src/commands/plugins/reset.ts)_
282
-
283
- ## `iconoma plugins uninstall [PLUGIN]`
284
-
285
- Removes a plugin from the CLI.
286
-
287
- ```
288
- USAGE
289
- $ iconoma plugins uninstall [PLUGIN...] [-h] [-v]
290
-
291
- ARGUMENTS
292
- [PLUGIN...] plugin to uninstall
293
-
294
- FLAGS
295
- -h, --help Show CLI help.
296
- -v, --verbose
297
-
298
- DESCRIPTION
299
- Removes a plugin from the CLI.
300
-
301
- ALIASES
302
- $ iconoma plugins unlink
303
- $ iconoma plugins remove
304
-
305
- EXAMPLES
306
- $ iconoma plugins uninstall myplugin
307
- ```
308
-
309
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.54/src/commands/plugins/uninstall.ts)_
310
-
311
- ## `iconoma plugins unlink [PLUGIN]`
312
-
313
- Removes a plugin from the CLI.
314
-
315
- ```
316
- USAGE
317
- $ iconoma plugins unlink [PLUGIN...] [-h] [-v]
318
-
319
- ARGUMENTS
320
- [PLUGIN...] plugin to uninstall
321
-
322
- FLAGS
323
- -h, --help Show CLI help.
324
- -v, --verbose
325
-
326
- DESCRIPTION
327
- Removes a plugin from the CLI.
328
-
329
- ALIASES
330
- $ iconoma plugins unlink
331
- $ iconoma plugins remove
332
-
333
- EXAMPLES
334
- $ iconoma plugins unlink myplugin
335
- ```
336
-
337
- ## `iconoma plugins update`
338
-
339
- Update installed plugins.
340
-
341
- ```
342
- USAGE
343
- $ iconoma plugins update [-h] [-v]
344
-
345
- FLAGS
346
- -h, --help Show CLI help.
347
- -v, --verbose
348
-
349
- DESCRIPTION
350
- Update installed plugins.
351
- ```
352
-
353
- _See code: [@oclif/plugin-plugins](https://github.com/oclif/plugin-plugins/blob/v5.4.54/src/commands/plugins/update.ts)_
354
-
355
- ## `iconoma studio`
356
-
357
- Start the Iconoma Studio
358
-
359
- ```
360
- USAGE
361
- $ iconoma studio [-p <value>]
362
-
363
- FLAGS
364
- -p, --port=<value> port to listen on
365
-
366
- DESCRIPTION
367
- Start the Iconoma Studio
368
-
369
- EXAMPLES
370
- $ iconoma studio
371
- ```
372
-
373
- _See code: [src/commands/studio.ts](https://github.com/theryston/iconoma/blob/v0.0.1-beta.2/src/commands/studio.ts)_
374
- <!-- commandsstop -->
1
+ # Iconoma
2
+
3
+ [![github](https://img.shields.io/badge/github-repo-blue?logo=github)](https://github.com/theryston/iconoma)
4
+ [![Version](https://img.shields.io/npm/v/@iconoma/cli.svg)](https://npmjs.org/package/@iconoma/cli)
5
+ [![Downloads/week](https://img.shields.io/npm/dw/@iconoma/cli.svg)](https://npmjs.org/package/@iconoma/cli)
6
+
7
+ **Iconoma** is a complete **icon management system** (CLI + Studio) that helps teams and products **organize, standardize, version, and distribute icons** with a reliable workflow.
8
+
9
+ Instead of keeping random SVG files scattered across the repo, Iconoma turns your icon library into a **structured, reproducible pipeline**: clean SVGs with SVGO, enforce consistency (colors, metadata, conventions), and generate the targets your apps need (SVG files, React components, React Native components).
10
+
11
+ Start using it now by running this in your project:
12
+
13
+ ```bash
14
+ npx @iconoma/cli studio
15
+ ```
16
+
17
+ ---
18
+
19
+ ## Why Iconoma
20
+
21
+ Icon libraries tend to become messy as projects grow:
22
+
23
+ - inconsistent sizes and alignment (icons "look bigger" even with the same size)
24
+ - hardcoded colors that break themes/dark mode
25
+ - duplicated icons with different names
26
+ - manual export steps (time-consuming and error-prone)
27
+ - multiple platforms needing different formats (Web + React + React Native)
28
+
29
+ Iconoma solves that by providing a **single source of truth (the studio)** for your icon catalog and an automated build system.
30
+
31
+ ---
32
+
33
+ ## What you get
34
+
35
+ ### Icon catalog with metadata
36
+
37
+ Each icon can have:
38
+
39
+ - a canonical **name**
40
+ - **tags** for search and organization
41
+ - optimized SVG content
42
+ - generated outputs (targets)
43
+
44
+ This makes it easy to keep icons discoverable and consistent across the team.
45
+
46
+ ### ✅ SVGO optimization + custom configuration
47
+
48
+ Iconoma uses **SVGO** to optimize and normalize your SVGs (removing unnecessary data, minimizing output, and improving consistency).
49
+
50
+ You can **fully customize the SVGO config** to match your rules and design system (plugins, params, presets, etc.).
51
+
52
+ ### ✅ Color mapping and theming-friendly icons
53
+
54
+ SVGs frequently arrive with hardcoded colors like `#000`, `#111`, `white`, etc.
55
+
56
+ Iconoma supports a **color map** approach so you can convert colors into:
57
+
58
+ - `currentColor`
59
+ - CSS variables/tokens (e.g. `var(--icons-secondary)`)
60
+
61
+ This makes icons theme-friendly and prevents "random SVG colors" from leaking into your UI.
62
+
63
+ ### Automatic target generation (React, React Native, SVG)
64
+
65
+ Iconoma can automatically generate the targets you need, including:
66
+
67
+ - **`.svg` files** (optimized/normalized)
68
+ - **React components**
69
+ - **React Native components**
70
+
71
+ Targets are treated as build outputs, so you can keep a clean pipeline for multiple platforms.
72
+
73
+ ### ✅ Lockfile-based reproducible builds
74
+
75
+ Iconoma keeps a lockfile called `iconoma.lock.json` that stores:
76
+
77
+ - SVG hashes
78
+ - config hashes
79
+ - target outputs and what they were built from
80
+
81
+ This makes builds **deterministic**, helps you to understand the changes using Git.
82
+
83
+ ### Studio (UI) integrated with the workflow
84
+
85
+ Iconoma includes a "Studio" interface to make icon curation easier:
86
+
87
+ - browse and search icons
88
+ - preview icons in different sizes/themes
89
+ - manage names/tags
90
+ - validate consistency visually
91
+ - run builds/transforms from a friendly UI
package/bin/run.js CHANGED
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../src/commands/studio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAO7C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,IAAI,KAAM;IAC1B,OAAgB,WAAW,SAA8B;IACzD,OAAgB,QAAQ,WAA2C;IACnE,OAAgB,KAAK;;MAEnB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA8BlC"}
1
+ {"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../src/commands/studio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAO7C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,IAAI,KAAM;IAC1B,OAAgB,WAAW,SAA8B;IACzD,OAAgB,QAAQ,WAA2C;IACnE,OAAgB,KAAK;;MAEnB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA6BlC"}
@@ -1,5 +1,5 @@
1
1
  import { Command, Flags } from "@oclif/core";
2
- import { getStudio } from "../get-studio.js";
2
+ import { createServer } from "@iconoma/studio";
3
3
  import figlet from "figlet";
4
4
  import gradient from "gradient-string";
5
5
  import { createSpinner } from "nanospinner";
@@ -21,13 +21,13 @@ export default class Studio extends Command {
21
21
  console.log(coolGradient.multiline(text));
22
22
  const spinner = createSpinner("Starting Studio...").start();
23
23
  try {
24
- const { createServer } = await getStudio();
25
24
  const { url } = await createServer({ port });
26
25
  await open(url, { wait: true });
27
26
  spinner.success({ text: `Studio started at ${url}` });
28
27
  }
29
- catch {
28
+ catch (error) {
30
29
  spinner.error({ text: `Failed to start Studio` });
30
+ console.error(error);
31
31
  process.exit(1);
32
32
  }
33
33
  }
@@ -1 +1 @@
1
- {"root":["../src/get-studio.ts","../src/index.ts","../src/commands/studio.ts"],"version":"5.9.3"}
1
+ {"root":["../src/index.ts","../src/commands/studio.ts"],"version":"5.9.3"}
@@ -33,5 +33,5 @@
33
33
  ]
34
34
  }
35
35
  },
36
- "version": "0.0.1-beta.2"
36
+ "version": "0.0.2"
37
37
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@iconoma/cli",
3
3
  "description": "A developer-friendly tool to manage and organize icons through CLI and web studio",
4
- "version": "0.0.1-beta.2",
4
+ "version": "0.0.2",
5
5
  "author": "Theryston Santos @Theryston",
6
6
  "bin": {
7
7
  "iconoma": "bin/run.js"
@@ -14,15 +14,13 @@
14
14
  "dependencies": {
15
15
  "@oclif/core": "^4",
16
16
  "@oclif/plugin-help": "^6",
17
- "@oclif/plugin-plugins": "^5",
18
17
  "figlet": "^1.9.4",
19
18
  "gradient-string": "^3.0.0",
20
19
  "nanospinner": "^1.2.2",
21
- "open": "^11.0.0"
20
+ "open": "^11.0.0",
21
+ "@iconoma/studio": "0.0.4"
22
22
  },
23
23
  "devDependencies": {
24
- "@iconoma/eslint-config": "workspace:*",
25
- "@iconoma/typescript-config": "workspace:*",
26
24
  "@types/chai": "^4",
27
25
  "@types/mocha": "^10",
28
26
  "@types/node": "^18",
@@ -32,7 +30,9 @@
32
30
  "oclif": "^4",
33
31
  "shx": "^0.3.3",
34
32
  "ts-node": "^10",
35
- "typescript": "^5"
33
+ "typescript": "^5",
34
+ "@iconoma/typescript-config": "0.0.0",
35
+ "@iconoma/eslint-config": "0.0.0"
36
36
  },
37
37
  "engines": {
38
38
  "node": ">=18.0.0"
@@ -44,7 +44,22 @@
44
44
  ],
45
45
  "homepage": "https://github.com/theryston/iconoma",
46
46
  "keywords": [
47
- "oclif"
47
+ "oclif",
48
+ "iconoma",
49
+ "icon management",
50
+ "icons",
51
+ "studio",
52
+ "CLI",
53
+ "SVG",
54
+ "react",
55
+ "icon pipeline",
56
+ "icon optimizer",
57
+ "icon library",
58
+ "SVGO",
59
+ "design system",
60
+ "icon build",
61
+ "icon generator",
62
+ "react icons"
48
63
  ],
49
64
  "license": "MIT",
50
65
  "main": "dist/index.js",
@@ -54,13 +69,12 @@
54
69
  "dirname": "iconoma",
55
70
  "commands": "./dist/commands",
56
71
  "plugins": [
57
- "@oclif/plugin-help",
58
- "@oclif/plugin-plugins"
72
+ "@oclif/plugin-help"
59
73
  ],
60
74
  "topicSeparator": " ",
61
75
  "topics": {
62
- "hello": {
63
- "description": "Say hello to the world and others"
76
+ "studio": {
77
+ "description": "Start the Iconoma Studio"
64
78
  }
65
79
  }
66
80
  },
@@ -68,13 +82,9 @@
68
82
  "type": "git",
69
83
  "url": "git+https://github.com/theryston/iconoma.git"
70
84
  },
85
+ "types": "dist/index.d.ts",
71
86
  "scripts": {
72
- "postbuild": "node scripts/bundle-studio.js",
73
87
  "build": "shx rm -rf dist && tsc -b",
74
- "lint": "eslint",
75
- "postpack": "shx rm -f oclif.manifest.json",
76
- "prepack": "oclif manifest && oclif readme",
77
- "version": "oclif readme && git add README.md"
78
- },
79
- "types": "dist/index.d.ts"
80
- }
88
+ "lint": "eslint"
89
+ }
90
+ }
@@ -1,9 +0,0 @@
1
- export declare function getStudio(): Promise<{
2
- createServer: (options: {
3
- port?: number;
4
- }) => Promise<{
5
- url: string;
6
- close: () => Promise<void>;
7
- }>;
8
- }>;
9
- //# sourceMappingURL=get-studio.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-studio.d.ts","sourceRoot":"","sources":["../src/get-studio.ts"],"names":[],"mappings":"AAAA,wBAAsB,SAAS,IAAI,OAAO,CAAC;IACzC,YAAY,EAAE,CAAC,OAAO,EAAE;QACtB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,KAAK,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAC;CAC5D,CAAC,CAGD"}
@@ -1,4 +0,0 @@
1
- export async function getStudio() {
2
- const studioPath = "./studio/index.js";
3
- return import(studioPath);
4
- }