@terrazzo/cli 0.2.1 → 0.2.3
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +20 -0
- package/bin/cli.js +44 -353
- package/dist/build.d.ts +12 -0
- package/dist/build.js +88 -0
- package/dist/build.js.map +1 -0
- package/dist/check.d.ts +9 -0
- package/dist/check.js +24 -0
- package/dist/check.js.map +1 -0
- package/dist/help.d.ts +2 -0
- package/dist/help.js +18 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +5 -0
- package/dist/init.js +217 -0
- package/dist/init.js.map +1 -0
- package/dist/shared.d.ts +47 -0
- package/dist/shared.js +184 -0
- package/dist/shared.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +8 -6
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @terrazzo/cli
|
|
2
2
|
|
|
3
|
+
## 0.2.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#367](https://github.com/terrazzoapp/terrazzo/pull/367) [`00af144`](https://github.com/terrazzoapp/terrazzo/commit/00af144538390c0fd22ebc14bf70db2c1f942203) Thanks [@drwpow](https://github.com/drwpow)! - Add Microsoft Fluent as starter template
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`00af144`](https://github.com/terrazzoapp/terrazzo/commit/00af144538390c0fd22ebc14bf70db2c1f942203)]:
|
|
10
|
+
- @terrazzo/parser@0.2.3
|
|
11
|
+
- @terrazzo/token-tools@0.2.3
|
|
12
|
+
|
|
13
|
+
## 0.2.2
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- [#364](https://github.com/terrazzoapp/terrazzo/pull/364) [`27cc92e`](https://github.com/terrazzoapp/terrazzo/commit/27cc92ef5e9e187b5ec7a8abe3f23bc51f59fc9c) Thanks [@drwpow](https://github.com/drwpow)! - Add init CLI options
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [[`27cc92e`](https://github.com/terrazzoapp/terrazzo/commit/27cc92ef5e9e187b5ec7a8abe3f23bc51f59fc9c)]:
|
|
20
|
+
- @terrazzo/parser@0.2.2
|
|
21
|
+
- @terrazzo/token-tools@0.2.2
|
|
22
|
+
|
|
3
23
|
## 0.2.1
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/bin/cli.js
CHANGED
|
@@ -25,210 +25,90 @@
|
|
|
25
25
|
* SOFTWARE.
|
|
26
26
|
*/
|
|
27
27
|
|
|
28
|
-
import fs from 'node:fs';
|
|
29
|
-
import path from 'node:path';
|
|
30
|
-
import { fileURLToPath } from 'node:url';
|
|
31
28
|
import { parseArgs } from 'node:util';
|
|
32
|
-
import { Logger
|
|
33
|
-
import chokidar from 'chokidar';
|
|
29
|
+
import { Logger } from '@terrazzo/parser';
|
|
34
30
|
import dotenv from 'dotenv';
|
|
35
|
-
import
|
|
36
|
-
import
|
|
37
|
-
|
|
31
|
+
import { buildCmd } from '../dist/build.js';
|
|
32
|
+
import { checkCmd } from '../dist/check.js';
|
|
33
|
+
import { helpCmd } from '../dist/help.js';
|
|
34
|
+
import { initCmd } from '../dist/init.js';
|
|
35
|
+
import { loadConfig } from '../dist/shared.js';
|
|
36
|
+
import { versionCmd } from '../dist/version.js';
|
|
37
|
+
|
|
38
|
+
// Load env vars before anything else
|
|
39
|
+
// (a user may not use these at all, but in the offchance they do)
|
|
38
40
|
dotenv.config();
|
|
39
41
|
|
|
40
42
|
const [, , ...argsRaw] = process.argv;
|
|
41
|
-
const cwd = new URL(`file://${process.cwd()}/`);
|
|
42
|
-
const PKG_ROOT = new URL('../', import.meta.url);
|
|
43
|
-
const logger = new Logger(
|
|
44
|
-
// TODO: listen for env vars for debugging, log level, etc
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
const GREEN_CHECK = pc.green('✔');
|
|
48
43
|
|
|
49
44
|
const { values: flags, positionals } = parseArgs({
|
|
50
45
|
args: argsRaw,
|
|
51
46
|
allowPositionals: true,
|
|
52
47
|
options: {
|
|
53
|
-
config: {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
},
|
|
61
|
-
help: {
|
|
62
|
-
type: 'boolean',
|
|
63
|
-
},
|
|
64
|
-
watch: {
|
|
65
|
-
type: 'boolean',
|
|
66
|
-
short: 'w',
|
|
67
|
-
},
|
|
68
|
-
version: {
|
|
69
|
-
type: 'boolean',
|
|
70
|
-
},
|
|
48
|
+
config: { type: 'string', short: 'c' },
|
|
49
|
+
out: { type: 'string', short: 'o' },
|
|
50
|
+
help: { type: 'boolean' },
|
|
51
|
+
silent: { type: 'boolean' },
|
|
52
|
+
quiet: { type: 'boolean' }, // secret alias for --silent because I can’t remember it
|
|
53
|
+
watch: { type: 'boolean', short: 'w' },
|
|
54
|
+
version: { type: 'boolean' },
|
|
71
55
|
},
|
|
72
56
|
});
|
|
73
57
|
|
|
58
|
+
// Note: there are 2 types of logging in the CLI. The logger passed to the
|
|
59
|
+
// parser will provide shared configuration for all methods, but it will throw
|
|
60
|
+
// Errors because it’s expected to run in a generic JS context (process.exit
|
|
61
|
+
// won’t always be available).
|
|
62
|
+
//
|
|
63
|
+
// However, in a CLI, errors are more numerous and expected, and users are
|
|
64
|
+
// likely to see multiple at once. We want to remove stacktraces just for the
|
|
65
|
+
// CLI context. So we wrap this logger with our own formatter that simply prints
|
|
66
|
+
// the raw message.
|
|
67
|
+
const logger = new Logger({
|
|
68
|
+
// set correct level of debugging
|
|
69
|
+
level: flags.silent || flags.quiet ? 'error' : undefined,
|
|
70
|
+
// add debug messages, if requested
|
|
71
|
+
debugScope: process.env.DEBUG,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
74
|
export default async function main() {
|
|
75
|
-
const start = performance.now();
|
|
76
75
|
const cmd = positionals[0];
|
|
77
76
|
|
|
78
77
|
// ---
|
|
79
|
-
//
|
|
78
|
+
// Half-run commands: --help, --version, init
|
|
80
79
|
|
|
81
80
|
// --version
|
|
82
81
|
if (flags.version) {
|
|
83
|
-
|
|
84
|
-
console.log(version);
|
|
82
|
+
versionCmd();
|
|
85
83
|
process.exit(0);
|
|
86
84
|
}
|
|
87
85
|
|
|
88
86
|
// --help
|
|
89
87
|
if (flags.help || !cmd) {
|
|
90
|
-
|
|
88
|
+
helpCmd();
|
|
91
89
|
process.exit(0);
|
|
92
90
|
}
|
|
93
91
|
|
|
94
|
-
|
|
95
|
-
// full-run commands: build, check
|
|
96
|
-
|
|
97
|
-
// setup: load terrazzo.config.js and terrazzo.config.json
|
|
98
|
-
let configPath;
|
|
99
|
-
if (typeof flags.config === 'string') {
|
|
100
|
-
if (flags.config === '') {
|
|
101
|
-
printErrors('Missing path after --config flag');
|
|
102
|
-
process.exit(1);
|
|
103
|
-
}
|
|
104
|
-
configPath = resolveConfig(flags.config);
|
|
105
|
-
}
|
|
106
|
-
let config = {
|
|
107
|
-
tokens: [new URL('./tokens.json', cwd)],
|
|
108
|
-
outDir: new URL('./tokens/', cwd),
|
|
109
|
-
plugins: [],
|
|
110
|
-
ignore: { tokens: [], deprecated: false },
|
|
111
|
-
};
|
|
112
|
-
const resolvedConfigPath = resolveConfig(configPath);
|
|
113
|
-
if (resolvedConfigPath) {
|
|
114
|
-
try {
|
|
115
|
-
const mod = await import(resolvedConfigPath);
|
|
116
|
-
if (!mod.default) {
|
|
117
|
-
printErrors(
|
|
118
|
-
`No default export found in ${path.relative(cwd.href, resolvedConfigPath)}. See https://terrazzo.dev/docs/cli for instructions.`,
|
|
119
|
-
);
|
|
120
|
-
process.exit(1);
|
|
121
|
-
}
|
|
122
|
-
config = defineConfig(mod.default, { cwd, logger });
|
|
123
|
-
} catch (err) {
|
|
124
|
-
printErrors(err.message || err);
|
|
125
|
-
process.exit(1);
|
|
126
|
-
}
|
|
127
|
-
} else if (cmd !== 'init' && cmd !== 'check') {
|
|
128
|
-
printErrors('No config file found. Create one with `npx terrazzo init`.');
|
|
129
|
-
process.exit(1);
|
|
130
|
-
}
|
|
92
|
+
const { config, configPath } = await loadConfig({ cmd, flags, logger });
|
|
131
93
|
|
|
94
|
+
// ---
|
|
95
|
+
// Full-run commands: build, check, lint
|
|
132
96
|
switch (cmd) {
|
|
133
97
|
case 'build': {
|
|
134
|
-
|
|
135
|
-
printErrors(`No plugins defined! Add some in ${configPath || 'terrazzo.config.js'}`);
|
|
136
|
-
process.exit(1);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
let rawSchemas = await loadTokens(config.tokens);
|
|
140
|
-
|
|
141
|
-
const watch = flags.watch;
|
|
142
|
-
|
|
143
|
-
let { tokens, ast } = await parse(rawSchemas, { config, logger, yamlToMomoa });
|
|
144
|
-
let result = await build(tokens, { ast, config, logger });
|
|
145
|
-
writeFiles(result, config);
|
|
146
|
-
|
|
147
|
-
printErrors(result.errors);
|
|
148
|
-
printWarnings(result.warnings);
|
|
149
|
-
|
|
150
|
-
if (watch) {
|
|
151
|
-
const dt = new Intl.DateTimeFormat('en-us', {
|
|
152
|
-
hour: '2-digit',
|
|
153
|
-
minute: '2-digit',
|
|
154
|
-
});
|
|
155
|
-
const tokenWatcher = chokidar.watch(config.tokens.map((filename) => fileURLToPath(filename)));
|
|
156
|
-
tokenWatcher.on('change', async (filename) => {
|
|
157
|
-
try {
|
|
158
|
-
rawSchemas = await loadTokens(config.tokens);
|
|
159
|
-
const parseResult = await parse(rawSchemas, { config, logger, yamlToMomoa });
|
|
160
|
-
tokens = parseResult.tokens;
|
|
161
|
-
ast = parseResult.ast;
|
|
162
|
-
result = await build(tokens, { ast, config, logger });
|
|
163
|
-
console.log(
|
|
164
|
-
`${pc.dim(dt.format(new Date()))} ${pc.green('Tz')}} ${pc.yellow(filename)} updated ${GREEN_CHECK}`,
|
|
165
|
-
);
|
|
166
|
-
} catch (err) {
|
|
167
|
-
printErrors([err.message || err]);
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
const configWatcher = chokidar.watch(resolveConfig(configPath));
|
|
171
|
-
configWatcher.on('change', async (filename) => {
|
|
172
|
-
try {
|
|
173
|
-
console.log(
|
|
174
|
-
`${pc.dim(dt.format(new Date()))} ${pc.green('Tz')} ${pc.yellow('Config updated. Reloading…')}`,
|
|
175
|
-
);
|
|
176
|
-
config = (await import(filename)).default;
|
|
177
|
-
rawSchema = await loadTokens(config.tokens);
|
|
178
|
-
const parseResult = await parse(tokens, { config, logger, yamlToMomoa });
|
|
179
|
-
tokens = parseResult.tokens;
|
|
180
|
-
ast = parseResult.ast;
|
|
181
|
-
result = await build(tokens, { ast, config, logger });
|
|
182
|
-
writeFiles(result, config);
|
|
183
|
-
} catch (err) {
|
|
184
|
-
printErrors([err.message || err]);
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
// keep process occupied
|
|
189
|
-
await new Promise(() => {});
|
|
190
|
-
} else {
|
|
191
|
-
printSuccess(
|
|
192
|
-
`${Object.keys(tokens).length} token${Object.keys(tokens).length !== 1 ? 's' : ''} built ${time(start)}`,
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
case 'check': {
|
|
198
|
-
const rawSchemas = await loadTokens(positionals[1] ? [resolveTokenPath(positionals[1])] : config.tokens);
|
|
199
|
-
const filename = positionals[1] || config.tokens[0];
|
|
200
|
-
console.log(pc.underline(filename.protocol === 'file:' ? filename.href : filename));
|
|
201
|
-
await parse(rawSchemas, { config, continueOnError: true, logger, yamlToMomoa }); // will throw if errors
|
|
202
|
-
printSuccess(`No errors ${time(start)}`);
|
|
98
|
+
await buildCmd({ config, configPath, flags, logger });
|
|
203
99
|
break;
|
|
204
100
|
}
|
|
101
|
+
case 'check':
|
|
205
102
|
case 'lint': {
|
|
206
|
-
|
|
207
|
-
printErrors(`No plugins defined! Add some in ${configPath || 'terrazzo.config.js'}`);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
const rawSchema = await loadTokens(positionals[1] ? [resolveTokenPath(positionals[1])] : config.tokens);
|
|
211
|
-
await parse(rawSchema, { config, continueOnError: true, logger, yamlToMomoa }); // will throw if errors
|
|
212
|
-
|
|
103
|
+
await checkCmd({ config, logger, positionals });
|
|
213
104
|
break;
|
|
214
105
|
}
|
|
215
106
|
case 'init': {
|
|
216
|
-
|
|
217
|
-
!fs.existsSync(new URL('./terrazzo.config.js', cwd)) &&
|
|
218
|
-
!fs.existsSync(new URL('./terrazzo.config.mjs', cwd)) &&
|
|
219
|
-
!fs.existsSync(new URL('./terrazzo.config.cjs', cwd))
|
|
220
|
-
) {
|
|
221
|
-
fs.cpSync(new URL('./terrazzo.config.mjs', PKG_ROOT), new URL('./terrazzo.config.mjs', cwd));
|
|
222
|
-
printSuccess('terrazzo.config.mjs created');
|
|
223
|
-
}
|
|
224
|
-
if (!fs.existsSync(config.tokens[0])) {
|
|
225
|
-
fs.cpSync(new URL('./tokens-example.json', PKG_ROOT), new URL(config?.tokens, cwd));
|
|
226
|
-
printSuccess(`${config.tokens} created ${time(start)}`);
|
|
227
|
-
}
|
|
107
|
+
await initCmd({ config, flags, logger });
|
|
228
108
|
break;
|
|
229
109
|
}
|
|
230
110
|
default: {
|
|
231
|
-
|
|
111
|
+
helpCmd();
|
|
232
112
|
break;
|
|
233
113
|
}
|
|
234
114
|
}
|
|
@@ -238,192 +118,3 @@ export default async function main() {
|
|
|
238
118
|
}
|
|
239
119
|
|
|
240
120
|
main();
|
|
241
|
-
|
|
242
|
-
/** Show help */
|
|
243
|
-
function showHelp() {
|
|
244
|
-
console.log(`tz
|
|
245
|
-
[commands]
|
|
246
|
-
build Build token artifacts from tokens.json
|
|
247
|
-
--watch, -w Watch tokens.json for changes and recompile
|
|
248
|
-
--no-lint Disable linters running on build
|
|
249
|
-
check [path] Check tokens.json for syntax errors
|
|
250
|
-
lint [path] Run linters
|
|
251
|
-
init Create a starter tokens.json file
|
|
252
|
-
bundle Combine multiple tokens schemas into one
|
|
253
|
-
--out [path] Specify bundled tokens.json output
|
|
254
|
-
convert [file] Convert Style Dictionary format to DTCG
|
|
255
|
-
--out [path] Specify converted tokens.json output
|
|
256
|
-
|
|
257
|
-
[options]
|
|
258
|
-
--help Show this message
|
|
259
|
-
--config, -c Path to config (default: ./terrazzo.config.js)
|
|
260
|
-
`);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/** load tokens */
|
|
264
|
-
async function loadTokens(tokenPaths) {
|
|
265
|
-
const allTokens = [];
|
|
266
|
-
|
|
267
|
-
if (!Array.isArray(tokenPaths)) {
|
|
268
|
-
printErrors(`loadTokens: Expected array, received ${typeof tokenPaths}`);
|
|
269
|
-
process.exit(1);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// if this is the default value, also check for tokens.yaml
|
|
273
|
-
if (tokenPaths.length === 1 && tokenPaths[0].href === new URL('./tokens.json', cwd).href) {
|
|
274
|
-
if (!fs.existsSync(tokenPaths[0])) {
|
|
275
|
-
const yamlPath = new URL('./tokens.yaml', cwd);
|
|
276
|
-
if (fs.existsSync(yamlPath)) {
|
|
277
|
-
tokenPaths[0] = yamlPath;
|
|
278
|
-
} else {
|
|
279
|
-
printErrors(
|
|
280
|
-
`Could not locate ${path.relative(cwd.href, tokenPaths[0].href)}. To create one, run \`npx tz init\`.`,
|
|
281
|
-
);
|
|
282
|
-
process.exit(1);
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// download/read
|
|
288
|
-
for (let i = 0; i < tokenPaths.length; i++) {
|
|
289
|
-
const filename = tokenPaths[i];
|
|
290
|
-
|
|
291
|
-
if (!(filename instanceof URL)) {
|
|
292
|
-
printErrors(`loadTokens[${i}]: Expected URL, received ${filename}`);
|
|
293
|
-
process.exit(1);
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
if (filename.protocol === 'http:' || filename.protocol === 'https:') {
|
|
297
|
-
try {
|
|
298
|
-
// if Figma URL
|
|
299
|
-
if (filename.host === 'figma.com' || filename.host === 'www.figma.com') {
|
|
300
|
-
const [_, fileKeyword, fileKey] = filename.pathname.split('/');
|
|
301
|
-
if (fileKeyword !== 'file' || !fileKey) {
|
|
302
|
-
printErrors(
|
|
303
|
-
`Unexpected Figma URL. Expected "https://www.figma.com/file/:file_key/:file_name?…", received "${filename.href}"`,
|
|
304
|
-
);
|
|
305
|
-
process.exit(1);
|
|
306
|
-
}
|
|
307
|
-
const headers = new Headers({
|
|
308
|
-
Accept: '*/*',
|
|
309
|
-
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:123.0) Gecko/20100101 Firefox/123.0',
|
|
310
|
-
});
|
|
311
|
-
if (process.env.FIGMA_ACCESS_TOKEN) {
|
|
312
|
-
headers.set('X-FIGMA-TOKEN', process.env.FIGMA_ACCESS_TOKEN);
|
|
313
|
-
} else {
|
|
314
|
-
printWarnings('FIGMA_ACCESS_TOKEN not set');
|
|
315
|
-
}
|
|
316
|
-
const res = await fetch(`https://api.figma.com/v1/files/${fileKey}/variables/local`, {
|
|
317
|
-
method: 'GET',
|
|
318
|
-
headers,
|
|
319
|
-
});
|
|
320
|
-
if (res.ok) {
|
|
321
|
-
allTokens.push({ filename, src: await res.text() });
|
|
322
|
-
}
|
|
323
|
-
const message = res.status !== 404 ? JSON.stringify(await res.json(), undefined, 2) : '';
|
|
324
|
-
printErrors(`Figma responded with ${res.status}${message ? `:\n${message}` : ''}`);
|
|
325
|
-
process.exit(1);
|
|
326
|
-
break;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// otherwise, expect YAML/JSON
|
|
330
|
-
const res = await fetch(filename, {
|
|
331
|
-
method: 'GET',
|
|
332
|
-
headers: { Accept: '*/*', 'User-Agent': 'Mozilla/5.0 Gecko/20100101 Firefox/123.0' },
|
|
333
|
-
});
|
|
334
|
-
allTokens.push({ filename, src: await res.text() });
|
|
335
|
-
} catch (err) {
|
|
336
|
-
printErrors(`${filename.href}: ${err}`);
|
|
337
|
-
}
|
|
338
|
-
} else {
|
|
339
|
-
if (fs.existsSync(filename)) {
|
|
340
|
-
allTokens.push({ filename, src: fs.readFileSync(filename, 'utf8') });
|
|
341
|
-
} else {
|
|
342
|
-
printErrors(`Could not locate ${path.relative(cwd.href, filename.href)}. To create one, run \`npx tz init\`.`);
|
|
343
|
-
process.exit(1);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
return allTokens;
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
/**
|
|
352
|
-
* resolve config
|
|
353
|
-
* @return {string | undefined} resolvedPath
|
|
354
|
-
*/
|
|
355
|
-
function resolveConfig(filename) {
|
|
356
|
-
// --config [configpath]
|
|
357
|
-
if (filename) {
|
|
358
|
-
const configPath = new URL(filename, cwd);
|
|
359
|
-
if (fs.existsSync(configPath)) {
|
|
360
|
-
return configPath.href; // ⚠️ ESM wants "file://..." URLs on Windows & Unix.
|
|
361
|
-
}
|
|
362
|
-
return undefined;
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// default: terrazzo.config.js
|
|
366
|
-
for (const defaultFilename of [
|
|
367
|
-
'./terrazzo.config.mjs', // .mjs takes precedence (it suggestes .js is CJS)
|
|
368
|
-
'./terrazzo.config.js',
|
|
369
|
-
]) {
|
|
370
|
-
const configPath = new URL(defaultFilename, cwd);
|
|
371
|
-
if (fs.existsSync(configPath)) {
|
|
372
|
-
return configPath.href; // ⚠️ ESM wants "file://..." URLs on Windows & Unix.
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/** Resolve tokens.json path (for lint command) */
|
|
378
|
-
function resolveTokenPath(filename) {
|
|
379
|
-
const tokensPath = new URL(filename, cwd);
|
|
380
|
-
if (!fs.existsSync(tokensPath)) {
|
|
381
|
-
printErrors(`Could not locate ${filename}. Does the file exist?`);
|
|
382
|
-
process.exit(1);
|
|
383
|
-
}
|
|
384
|
-
if (!fs.statSync(tokensPath).isFile()) {
|
|
385
|
-
printErrors(`Expected JSON or YAML file, received ${filename}.`);
|
|
386
|
-
process.exit(1);
|
|
387
|
-
}
|
|
388
|
-
return tokensPath;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
/** Print time elapsed */
|
|
392
|
-
function time(start) {
|
|
393
|
-
const diff = performance.now() - start;
|
|
394
|
-
return pc.dim(diff < 750 ? `${Math.round(diff)}ms` : `${(diff / 1000).toFixed(1)}s`);
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/** Print success */
|
|
398
|
-
export function printSuccess(message) {
|
|
399
|
-
console.log(` ${GREEN_CHECK} ${message}`);
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
/** Print errors */
|
|
403
|
-
export function printErrors(errors) {
|
|
404
|
-
if (!errors || (typeof errors !== 'string' && !Array.isArray(errors))) {
|
|
405
|
-
return;
|
|
406
|
-
}
|
|
407
|
-
for (const err of Array.isArray(errors) ? errors : [errors]) {
|
|
408
|
-
console.error(` ${pc.red(`✘ ${err}`)}`);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
/** Print warnings */
|
|
413
|
-
export function printWarnings(warnings) {
|
|
414
|
-
if (!warnings || (typeof warnings !== 'string' && !Array.isArray(warnings))) {
|
|
415
|
-
return;
|
|
416
|
-
}
|
|
417
|
-
for (const warn of Array.isArray(warnings) ? warnings : [warnings]) {
|
|
418
|
-
console.warn(` ${pc.yellow(`! ${warn}`)}`);
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
/** Write files */
|
|
423
|
-
export function writeFiles(result, config) {
|
|
424
|
-
for (const { filename, contents } of result.outputFiles) {
|
|
425
|
-
const output = new URL(filename, config.outDir);
|
|
426
|
-
fs.mkdirSync(new URL('.', output), { recursive: true });
|
|
427
|
-
fs.writeFileSync(output, contents);
|
|
428
|
-
}
|
|
429
|
-
}
|
package/dist/build.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type BuildRunnerResult, type ConfigInit, type Logger } from '@terrazzo/parser';
|
|
2
|
+
import { type Flags } from './shared.js';
|
|
3
|
+
export interface BuildOptions {
|
|
4
|
+
flags: Flags;
|
|
5
|
+
config: ConfigInit;
|
|
6
|
+
configPath: string;
|
|
7
|
+
logger: Logger;
|
|
8
|
+
}
|
|
9
|
+
/** tz build */
|
|
10
|
+
export declare function buildCmd({ config, configPath, flags, logger }: BuildOptions): Promise<void>;
|
|
11
|
+
/** Write files */
|
|
12
|
+
export declare function writeFiles(result: BuildRunnerResult, config: ConfigInit): void;
|
package/dist/build.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { build, parse } from '@terrazzo/parser';
|
|
5
|
+
import chokidar from 'chokidar';
|
|
6
|
+
import pc from 'picocolors';
|
|
7
|
+
import yamlToMomoa from 'yaml-to-momoa';
|
|
8
|
+
import { DEFAULT_TOKENS_PATH, GREEN_CHECK, cwd, loadTokens, printError, printSuccess, resolveConfig, } from './shared.js';
|
|
9
|
+
/** tz build */
|
|
10
|
+
export async function buildCmd({ config, configPath, flags, logger }) {
|
|
11
|
+
try {
|
|
12
|
+
const startTime = performance.now();
|
|
13
|
+
if (!Array.isArray(config.plugins) || !config.plugins.length) {
|
|
14
|
+
logger.error({ message: `No plugins defined! Add some in ${configPath || 'terrazzo.config.js'}` });
|
|
15
|
+
}
|
|
16
|
+
// first build
|
|
17
|
+
let rawSchemas = await loadTokens(config.tokens, { logger });
|
|
18
|
+
if (!rawSchemas) {
|
|
19
|
+
logger.error({
|
|
20
|
+
message: `Error loading ${path.relative(fileURLToPath(cwd), fileURLToPath(config.tokens[0] || DEFAULT_TOKENS_PATH))}`,
|
|
21
|
+
});
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
let { tokens, sources } = await parse(rawSchemas, { config, logger, yamlToMomoa });
|
|
25
|
+
let result = await build(tokens, { sources, config, logger });
|
|
26
|
+
writeFiles(result, config);
|
|
27
|
+
// --watch (handle rebuild)
|
|
28
|
+
if (flags.watch) {
|
|
29
|
+
const dt = new Intl.DateTimeFormat('en-us', {
|
|
30
|
+
hour: '2-digit',
|
|
31
|
+
minute: '2-digit',
|
|
32
|
+
});
|
|
33
|
+
async function rebuild({ messageBefore, messageAfter } = {}) {
|
|
34
|
+
try {
|
|
35
|
+
if (messageBefore) {
|
|
36
|
+
logger.info({ message: messageBefore });
|
|
37
|
+
}
|
|
38
|
+
rawSchemas = await loadTokens(config.tokens, { logger });
|
|
39
|
+
if (!rawSchemas) {
|
|
40
|
+
throw new Error(`Error loading ${path.relative(fileURLToPath(cwd), fileURLToPath(config.tokens[0] || DEFAULT_TOKENS_PATH))}`);
|
|
41
|
+
}
|
|
42
|
+
const parseResult = await parse(rawSchemas, { config, logger, yamlToMomoa });
|
|
43
|
+
tokens = parseResult.tokens;
|
|
44
|
+
sources = parseResult.sources;
|
|
45
|
+
result = await build(tokens, { sources, config, logger });
|
|
46
|
+
if (messageAfter) {
|
|
47
|
+
logger.info({ message: messageAfter });
|
|
48
|
+
}
|
|
49
|
+
writeFiles(result, config);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
console.error(pc.red(`✗ ${err.message || err}`));
|
|
53
|
+
// don’t exit! we’re watching, so continue as long as possible
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const tokenWatcher = chokidar.watch(config.tokens.map((filename) => fileURLToPath(filename)));
|
|
57
|
+
tokenWatcher.on('change', async (filename) => {
|
|
58
|
+
await rebuild({
|
|
59
|
+
messageBefore: `${pc.dim(dt.format(new Date()))} ${pc.green('tz')}} ${pc.yellow(filename)} updated ${GREEN_CHECK}`,
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
const configWatcher = chokidar.watch(resolveConfig(configPath));
|
|
63
|
+
configWatcher.on('change', async () => {
|
|
64
|
+
await rebuild({
|
|
65
|
+
messageBefore: `${pc.dim(dt.format(new Date()))} ${pc.green('tz')} ${pc.yellow('Config updated. Reloading…')}`,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
// keep process occupied
|
|
69
|
+
await new Promise(() => { });
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
printSuccess(`${Object.keys(tokens).length} token${Object.keys(tokens).length !== 1 ? 's' : ''} built`, startTime);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
printError(err.message);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** Write files */
|
|
81
|
+
export function writeFiles(result, config) {
|
|
82
|
+
for (const { filename, contents } of result.outputFiles) {
|
|
83
|
+
const output = new URL(filename, config.outDir);
|
|
84
|
+
fs.mkdirSync(new URL('.', output), { recursive: true });
|
|
85
|
+
fs.writeFileSync(output, contents);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
|
package/dist/check.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ConfigInit, type Logger } from '@terrazzo/parser';
|
|
2
|
+
export interface CheckOptions {
|
|
3
|
+
/** positional CLI args */
|
|
4
|
+
positionals: string[];
|
|
5
|
+
config: ConfigInit;
|
|
6
|
+
logger: Logger;
|
|
7
|
+
}
|
|
8
|
+
/** tz check */
|
|
9
|
+
export declare function checkCmd({ config, logger, positionals }: CheckOptions): Promise<void>;
|
package/dist/check.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { parse } from '@terrazzo/parser';
|
|
2
|
+
import yamlToMomoa from 'yaml-to-momoa';
|
|
3
|
+
import { loadTokens, printError, printSuccess, resolveTokenPath } from './shared.js';
|
|
4
|
+
/** tz check */
|
|
5
|
+
export async function checkCmd({ config, logger, positionals }) {
|
|
6
|
+
try {
|
|
7
|
+
const startTime = performance.now();
|
|
8
|
+
const tokenPaths = positionals.slice(1).length
|
|
9
|
+
? positionals.slice(1).map((tokenPath) => resolveTokenPath(tokenPath, { logger }))
|
|
10
|
+
: config.tokens;
|
|
11
|
+
const sources = await loadTokens(tokenPaths, { logger });
|
|
12
|
+
if (!sources?.length) {
|
|
13
|
+
logger.error({ message: 'Couldn’t find any tokens. Run `npx tz init` to create some.' });
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
await parse(sources, { config, continueOnError: true, logger, yamlToMomoa }); // will throw if errors
|
|
17
|
+
printSuccess('No errors', startTime);
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
printError(err.message);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AASrF,eAAe;AACf,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAgB;IAC1E,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;YAC5C,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAClF,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAClB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,6DAA6D,EAAE,CAAC,CAAC;YACzF,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,uBAAuB;QACrG,YAAY,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/help.d.ts
ADDED
package/dist/help.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Show help */
|
|
2
|
+
export function helpCmd() {
|
|
3
|
+
console.log(`tz
|
|
4
|
+
[commands]
|
|
5
|
+
build Build token artifacts from tokens.json
|
|
6
|
+
--watch, -w Watch tokens.json for changes and recompile
|
|
7
|
+
--no-lint Disable linters running on build
|
|
8
|
+
check [path] Check tokens.json for errors and run linters
|
|
9
|
+
lint [path] (alias of check)
|
|
10
|
+
init Create a starter tokens.json file
|
|
11
|
+
|
|
12
|
+
[options]
|
|
13
|
+
--help Show this message
|
|
14
|
+
--config, -c Path to config (default: ./terrazzo.config.js)
|
|
15
|
+
--quiet Suppress warnings
|
|
16
|
+
`);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=help.js.map
|
package/dist/help.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,MAAM,UAAU,OAAO;IACrB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;CAab,CAAC,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { defineConfig as defineConfigCore } from '@terrazzo/parser';
|
|
2
|
+
import { cwd } from './shared.js';
|
|
2
3
|
export function defineConfig(config) {
|
|
3
|
-
return defineConfigCore(config, { cwd
|
|
4
|
+
return defineConfigCore(config, { cwd });
|
|
4
5
|
}
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,YAAY,IAAI,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,YAAY,IAAI,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAClG,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAIlC,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,gBAAgB,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3C,CAAC"}
|
package/dist/init.d.ts
ADDED
package/dist/init.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { confirm, intro, multiselect, outro, select, spinner } from '@clack/prompts';
|
|
6
|
+
import { pluralize } from '@terrazzo/token-tools';
|
|
7
|
+
import { detect } from 'detect-package-manager';
|
|
8
|
+
import { generate } from 'escodegen';
|
|
9
|
+
import { parseModule } from 'meriyah';
|
|
10
|
+
import { DEFAULT_CONFIG_PATH, DEFAULT_TOKENS_PATH, cwd, loadConfig, printError } from './shared.js';
|
|
11
|
+
const INSTALL_COMMAND = {
|
|
12
|
+
npm: 'install -D --silent',
|
|
13
|
+
yarn: 'add -D --silent',
|
|
14
|
+
pnpm: 'add -D --silent',
|
|
15
|
+
bun: 'install -D --silent',
|
|
16
|
+
};
|
|
17
|
+
const DTCG_ROOT_URL = 'https://raw.githubusercontent.com/terrazzoapp/dtcg-examples/refs/heads/main/';
|
|
18
|
+
const DESIGN_SYSTEMS = {
|
|
19
|
+
'adobe-spectrum': {
|
|
20
|
+
name: 'Spectrum',
|
|
21
|
+
author: 'Adobe',
|
|
22
|
+
tokens: ['adobe-spectrum.json'],
|
|
23
|
+
},
|
|
24
|
+
'apple-hig': {
|
|
25
|
+
name: 'Human Interface Guidelines',
|
|
26
|
+
author: 'Apple',
|
|
27
|
+
tokens: ['apple-hig.json'],
|
|
28
|
+
},
|
|
29
|
+
'figma-sds': {
|
|
30
|
+
name: 'Simple Design System',
|
|
31
|
+
author: 'Figma',
|
|
32
|
+
tokens: ['figma-sds.json'],
|
|
33
|
+
},
|
|
34
|
+
'github-primer': {
|
|
35
|
+
name: 'Primer',
|
|
36
|
+
author: 'GitHub',
|
|
37
|
+
tokens: ['github-primer.json'],
|
|
38
|
+
},
|
|
39
|
+
'ibm-carbon': {
|
|
40
|
+
name: 'Carbon',
|
|
41
|
+
author: 'IBM',
|
|
42
|
+
tokens: ['ibm-carbon.json'],
|
|
43
|
+
},
|
|
44
|
+
'microsoft-fluent': {
|
|
45
|
+
name: 'Fluent',
|
|
46
|
+
author: 'Microsoft',
|
|
47
|
+
tokens: ['microsoft-fluent.json'],
|
|
48
|
+
},
|
|
49
|
+
radix: {
|
|
50
|
+
name: 'Radix',
|
|
51
|
+
author: 'Radix',
|
|
52
|
+
tokens: ['radix.json'],
|
|
53
|
+
},
|
|
54
|
+
'salesforce-lightning': {
|
|
55
|
+
name: 'Lightning',
|
|
56
|
+
author: 'Salesforce',
|
|
57
|
+
tokens: ['salesforce-lightning.json'],
|
|
58
|
+
},
|
|
59
|
+
'shopify-polaris': {
|
|
60
|
+
name: 'Polaris',
|
|
61
|
+
author: 'Shopify',
|
|
62
|
+
tokens: ['shopify-polaris.json'],
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
export async function initCmd({ logger }) {
|
|
66
|
+
try {
|
|
67
|
+
intro('⛋ Welcome to Terrazzo');
|
|
68
|
+
const packageManager = await detect({ cwd: fileURLToPath(cwd) });
|
|
69
|
+
// TODO: pass in CLI flags?
|
|
70
|
+
const { config, configPath } = await loadConfig({ cmd: 'init', flags: {}, logger });
|
|
71
|
+
const relConfigPath = configPath
|
|
72
|
+
? path.relative(fileURLToPath(cwd), fileURLToPath(new URL(configPath)))
|
|
73
|
+
: undefined;
|
|
74
|
+
let tokensPath = config.tokens[0];
|
|
75
|
+
let startFromDS = !(tokensPath && fs.existsSync(tokensPath));
|
|
76
|
+
// 1. tokens
|
|
77
|
+
if (tokensPath && fs.existsSync(tokensPath)) {
|
|
78
|
+
if (await confirm({
|
|
79
|
+
message: `Found tokens at ${path.relative(fileURLToPath(cwd), fileURLToPath(tokensPath))}. Overwrite with a new design system?`,
|
|
80
|
+
})) {
|
|
81
|
+
startFromDS = true;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
tokensPath = DEFAULT_TOKENS_PATH;
|
|
86
|
+
}
|
|
87
|
+
if (startFromDS) {
|
|
88
|
+
const ds = DESIGN_SYSTEMS[(await select({
|
|
89
|
+
message: 'Start from existing design system?',
|
|
90
|
+
options: [
|
|
91
|
+
...Object.entries(DESIGN_SYSTEMS).map(([id, { author, name }]) => ({
|
|
92
|
+
value: id,
|
|
93
|
+
label: `${author} ${name}`,
|
|
94
|
+
})),
|
|
95
|
+
{ value: 'none', label: 'None' },
|
|
96
|
+
],
|
|
97
|
+
}))];
|
|
98
|
+
if (ds) {
|
|
99
|
+
// TODO: support multiple tokens files?
|
|
100
|
+
const s = spinner();
|
|
101
|
+
s.start('Downloading…');
|
|
102
|
+
const tokenSource = await fetch(new URL(ds.tokens[0], DTCG_ROOT_URL)).then((res) => res.text());
|
|
103
|
+
fs.writeFileSync(tokensPath, tokenSource);
|
|
104
|
+
s.stop('Download complete');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// 2. plugins
|
|
108
|
+
const existingPlugins = config.plugins.map((p) => p.name);
|
|
109
|
+
const pluginSelection = await multiselect({
|
|
110
|
+
message: 'Install plugins?',
|
|
111
|
+
options: [
|
|
112
|
+
{ value: '@terrazzo/plugin-css', label: 'CSS' },
|
|
113
|
+
{ value: '@terrazzo/plugin-js', label: 'JS + TS' },
|
|
114
|
+
{ value: '@terrazzo/plugin-sass', label: 'Sass' },
|
|
115
|
+
{ value: '@terrazzo/plugin-tailwind', label: 'Tailwind' },
|
|
116
|
+
],
|
|
117
|
+
required: false,
|
|
118
|
+
});
|
|
119
|
+
const newPlugins = Array.isArray(pluginSelection)
|
|
120
|
+
? pluginSelection.filter((p) => !existingPlugins.includes(p))
|
|
121
|
+
: [];
|
|
122
|
+
if (newPlugins?.length) {
|
|
123
|
+
const plugins = newPlugins.map((p) => ({ specifier: p.replace('@terrazzo/plugin-', ''), package: p }));
|
|
124
|
+
const pluginCount = `${newPlugins.length} ${pluralize(newPlugins.length, 'plugin', 'plugins')}`;
|
|
125
|
+
const s = spinner();
|
|
126
|
+
s.start(`Installing ${pluginCount}…`);
|
|
127
|
+
execSync([packageManager, INSTALL_COMMAND[packageManager], newPlugins.join(' ')].join(' '), {
|
|
128
|
+
cwd,
|
|
129
|
+
stdio: 'inherit',
|
|
130
|
+
});
|
|
131
|
+
s.message('Updating config');
|
|
132
|
+
if (configPath) {
|
|
133
|
+
const ast = parseModule(fs.readFileSync(configPath, 'utf8'));
|
|
134
|
+
const astExport = ast.body.find((node) => node.type === 'ExportDefaultDeclaration');
|
|
135
|
+
// 2a. add plugin imports
|
|
136
|
+
// note: this has the potential to duplicate plugins, but we tried our
|
|
137
|
+
// best to filter already, and this may be the user’s fault if they
|
|
138
|
+
// selected to install a plugin already installed. But also, this is
|
|
139
|
+
// easily-fixable, so let’s not waste too much time here (and possibly
|
|
140
|
+
// introduce bugs).
|
|
141
|
+
ast.body.push(...plugins.map((p) => ({
|
|
142
|
+
type: 'ImportDeclaration',
|
|
143
|
+
source: { type: 'Literal', value: p.package },
|
|
144
|
+
specifiers: [{ type: 'ImportDefaultSpecifier', local: { type: 'Identifier', name: p.specifier } }],
|
|
145
|
+
attributes: [],
|
|
146
|
+
})));
|
|
147
|
+
// 2b. add plugins to config.plugins
|
|
148
|
+
if (!astExport) {
|
|
149
|
+
logger.error({ message: `SyntaxError: ${relConfigPath} does not have default export.` });
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const astConfig = (astExport.declaration.type === 'CallExpression'
|
|
153
|
+
? // export default defineConfig({ ... })
|
|
154
|
+
astExport.declaration.arguments[0]
|
|
155
|
+
: // export default { ... }
|
|
156
|
+
astExport.declaration);
|
|
157
|
+
if (astConfig.type !== 'ObjectExpression') {
|
|
158
|
+
logger.error({ message: `Config: expected object default export, received ${astConfig.type}` });
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const pluginsArray = astConfig.properties.find((property) => property.type === 'Property' && property.key.type === 'Identifier' && property.key.name === 'plugins')?.value;
|
|
162
|
+
const pluginsAst = plugins.map((p) => ({
|
|
163
|
+
type: 'CallExpression',
|
|
164
|
+
callee: {
|
|
165
|
+
type: 'Identifier',
|
|
166
|
+
name: p.specifier,
|
|
167
|
+
},
|
|
168
|
+
arguments: [],
|
|
169
|
+
}));
|
|
170
|
+
if (pluginsArray) {
|
|
171
|
+
pluginsArray.elements.push(...pluginsAst);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
astConfig.properties.push({
|
|
175
|
+
type: 'Property',
|
|
176
|
+
key: { type: 'Identifier', name: 'plugins' },
|
|
177
|
+
value: { type: 'ArrayExpression', elements: pluginsAst },
|
|
178
|
+
kind: 'init',
|
|
179
|
+
computed: false,
|
|
180
|
+
method: false,
|
|
181
|
+
shorthand: false,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
// 2c. update new file (and we’ll probably format it wrong but hey)
|
|
185
|
+
fs.writeFileSync(configPath, generate(ast, {
|
|
186
|
+
format: {
|
|
187
|
+
indent: { style: ' ' },
|
|
188
|
+
quotes: 'single',
|
|
189
|
+
semicolons: true,
|
|
190
|
+
},
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// 2a. write new config file (easy)
|
|
195
|
+
fs.writeFileSync(DEFAULT_CONFIG_PATH, `import { defineConfig } from '@terrazzo/cli';
|
|
196
|
+
${plugins.map((p) => `import ${p.specifier} from '${p.package}';`).join('\n')}
|
|
197
|
+
export default defineConfig({
|
|
198
|
+
tokens: ['./tokens.json'],
|
|
199
|
+
plugins: [
|
|
200
|
+
${plugins.map((p) => `${p.specifier}(),`).join('\n ')}
|
|
201
|
+
],
|
|
202
|
+
outdir: './dist/',
|
|
203
|
+
lint: {
|
|
204
|
+
/** @see https://terrazzo.app/docs/cli/lint */
|
|
205
|
+
},
|
|
206
|
+
});`);
|
|
207
|
+
}
|
|
208
|
+
s.stop(`Installed ${pluginCount}`);
|
|
209
|
+
}
|
|
210
|
+
outro('⛋ Done! 🎉');
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
printError(err.message);
|
|
214
|
+
process.exit(1);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAErF,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAe,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpG,MAAM,eAAe,GAAG;IACtB,GAAG,EAAE,qBAAqB;IAC1B,IAAI,EAAE,iBAAiB;IACvB,IAAI,EAAE,iBAAiB;IACvB,GAAG,EAAE,qBAAqB;CAC3B,CAAC;AAgBF,MAAM,aAAa,GAAG,8EAA8E,CAAC;AACrG,MAAM,cAAc,GAA6E;IAC/F,gBAAgB,EAAE;QAChB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,CAAC,qBAAqB,CAAC;KAChC;IACD,WAAW,EAAE;QACX,IAAI,EAAE,4BAA4B;QAClC,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,CAAC,gBAAgB,CAAC;KAC3B;IACD,WAAW,EAAE;QACX,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,CAAC,gBAAgB,CAAC;KAC3B;IACD,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,CAAC,oBAAoB,CAAC;KAC/B;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,CAAC,iBAAiB,CAAC;KAC5B;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,CAAC,uBAAuB,CAAC;KAClC;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,CAAC,YAAY,CAAC;KACvB;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,CAAC,2BAA2B,CAAC;KACtC;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,CAAC,sBAAsB,CAAC;KACjC;CACF,CAAC;AAMF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,MAAM,EAAe;IACnD,IAAI,CAAC;QACH,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC/B,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEjE,2BAA2B;QAC3B,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,MAAM,aAAa,GAAG,UAAU;YAC9B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACvE,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;QACnC,IAAI,WAAW,GAAG,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QAE7D,YAAY;QACZ,IAAI,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5C,IACE,MAAM,OAAO,CAAC;gBACZ,OAAO,EAAE,mBAAmB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,uCAAuC;aAChI,CAAC,EACF,CAAC;gBACD,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,mBAAmB,CAAC;QACnC,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,EAAE,GAAG,cAAc,CACvB,CAAC,MAAM,MAAM,CAAC;gBACZ,OAAO,EAAE,oCAAoC;gBAC7C,OAAO,EAAE;oBACP,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;wBACjE,KAAK,EAAE,EAAE;wBACT,KAAK,EAAE,GAAG,MAAM,IAAI,IAAI,EAAE;qBAC3B,CAAC,CAAC;oBACH,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;iBACjC;aACF,CAAC,CAAgC,CACkB,CAAC;YACvD,IAAI,EAAE,EAAE,CAAC;gBACP,uCAAuC;gBACvC,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;gBACpB,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBACxB,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjG,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;gBAC1C,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,aAAa;QACb,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,eAAe,GAAG,MAAM,WAAW,CAAC;YACxC,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE,KAAK,EAAE;gBAC/C,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE;gBAClD,EAAE,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,MAAM,EAAE;gBACjD,EAAE,KAAK,EAAE,2BAA2B,EAAE,KAAK,EAAE,UAAU,EAAE;aAC1D;YACD,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC;YAC/C,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,UAAU,EAAE,MAAM,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACvG,MAAM,WAAW,GAAG,GAAG,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YAEhG,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;YACpB,CAAC,CAAC,KAAK,CAAC,cAAc,WAAW,GAAG,CAAC,CAAC;YACtC,QAAQ,CAAC,CAAC,cAAc,EAAE,eAAe,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC1F,GAAG;gBACH,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YACH,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAC7B,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC7D,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,0BAA0B,CAAC,CAAC;gBAEpF,yBAAyB;gBACzB,sEAAsE;gBACtE,mEAAmE;gBACnE,oEAAoE;gBACpE,sEAAsE;gBACtE,mBAAmB;gBACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CACX,GAAG,OAAO,CAAC,GAAG,CACZ,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC;oBACC,IAAI,EAAE,mBAAmB;oBACzB,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;oBAC7C,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;oBAClG,UAAU,EAAE,EAAE;iBACf,CAA6B,CACjC,CACF,CAAC;gBAEF,oCAAoC;gBACpC,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,gBAAgB,aAAa,gCAAgC,EAAE,CAAC,CAAC;oBACzF,OAAO;gBACT,CAAC;gBACD,MAAM,SAAS,GAAG,CAChB,SAAS,CAAC,WAAW,CAAC,IAAI,KAAK,gBAAgB;oBAC7C,CAAC,CAAC,uCAAuC;wBACvC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;oBACpC,CAAC,CAAC,yBAAyB;wBACzB,SAAS,CAAC,WAAW,CACC,CAAC;gBAC7B,IAAI,SAAS,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;oBAC1C,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,oDAAoD,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAChG,OAAO;gBACT,CAAC;gBACD,MAAM,YAAY,GAChB,SAAS,CAAC,UAAU,CAAC,IAAI,CACvB,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,IAAI,KAAK,UAAU,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAE1G,EAAE,KAA2C,CAAC;gBAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAC5B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC;oBACC,IAAI,EAAE,gBAAgB;oBACtB,MAAM,EAAE;wBACN,IAAI,EAAE,YAAY;wBAClB,IAAI,EAAE,CAAC,CAAC,SAAS;qBAClB;oBACD,SAAS,EAAE,EAAE;iBACd,CAA0B,CAC9B,CAAC;gBACF,IAAI,YAAY,EAAE,CAAC;oBACjB,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;wBACxB,IAAI,EAAE,UAAU;wBAChB,GAAG,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;wBAC5C,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE;wBACxD,IAAI,EAAE,MAAM;wBACZ,QAAQ,EAAE,KAAK;wBACf,MAAM,EAAE,KAAK;wBACb,SAAS,EAAE,KAAK;qBACjB,CAAC,CAAC;gBACL,CAAC;gBAED,mEAAmE;gBACnE,EAAE,CAAC,aAAa,CACd,UAAU,EACV,QAAQ,CAAC,GAAG,EAAE;oBACZ,MAAM,EAAE;wBACN,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;wBACvB,MAAM,EAAE,QAAQ;wBAChB,UAAU,EAAE,IAAI;qBACjB;iBACF,CAAC,CACH,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,mCAAmC;gBACnC,EAAE,CAAC,aAAa,CACd,mBAAmB,EACnB;EACR,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;MAIvE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;;;;;;IAMxD,CACK,CAAC;YACJ,CAAC;YACD,CAAC,CAAC,IAAI,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/shared.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type ConfigInit, type Logger } from '@terrazzo/parser';
|
|
2
|
+
export declare const cwd: URL;
|
|
3
|
+
export declare const DEFAULT_CONFIG_PATH: URL;
|
|
4
|
+
export declare const DEFAULT_TOKENS_PATH: URL;
|
|
5
|
+
export type Command = 'build' | 'check' | 'help' | 'init' | 'version';
|
|
6
|
+
export declare const GREEN_CHECK: string;
|
|
7
|
+
export interface Flags {
|
|
8
|
+
/** --config, -c */
|
|
9
|
+
config?: string;
|
|
10
|
+
/** --out, -o */
|
|
11
|
+
out?: string;
|
|
12
|
+
/** --help */
|
|
13
|
+
help?: boolean;
|
|
14
|
+
/** --watch, -w */
|
|
15
|
+
watch?: boolean;
|
|
16
|
+
/** --version */
|
|
17
|
+
version?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface LoadConfigOptions {
|
|
20
|
+
cmd: Command;
|
|
21
|
+
flags: Flags;
|
|
22
|
+
logger: Logger;
|
|
23
|
+
}
|
|
24
|
+
/** Load config */
|
|
25
|
+
export declare function loadConfig({ cmd, flags, logger }: LoadConfigOptions): Promise<{
|
|
26
|
+
config: ConfigInit;
|
|
27
|
+
configPath: string;
|
|
28
|
+
}>;
|
|
29
|
+
/** load tokens */
|
|
30
|
+
export declare function loadTokens(tokenPaths: URL[], { logger }: {
|
|
31
|
+
logger: Logger;
|
|
32
|
+
}): Promise<{
|
|
33
|
+
filename: URL;
|
|
34
|
+
src: string;
|
|
35
|
+
}[] | undefined>;
|
|
36
|
+
/** Print error */
|
|
37
|
+
export declare function printError(message: string): void;
|
|
38
|
+
/** Print success */
|
|
39
|
+
export declare function printSuccess(message: string, startTime?: number): void;
|
|
40
|
+
/** Resolve config */
|
|
41
|
+
export declare function resolveConfig(filename?: string): string | undefined;
|
|
42
|
+
/** Resolve tokens.json path (for lint command) */
|
|
43
|
+
export declare function resolveTokenPath(filename: string, { logger }: {
|
|
44
|
+
logger: Logger;
|
|
45
|
+
}): URL;
|
|
46
|
+
/** Print time elapsed */
|
|
47
|
+
export declare function time(start: number): string;
|
package/dist/shared.js
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { defineConfig } from '@terrazzo/parser';
|
|
4
|
+
import pc from 'picocolors';
|
|
5
|
+
export const cwd = new URL(`file://${process.cwd()}/`);
|
|
6
|
+
export const DEFAULT_CONFIG_PATH = new URL('./terrazzo.config.mjs', cwd);
|
|
7
|
+
export const DEFAULT_TOKENS_PATH = new URL('./tokens.json', cwd);
|
|
8
|
+
export const GREEN_CHECK = pc.green('✔');
|
|
9
|
+
/** Load config */
|
|
10
|
+
export async function loadConfig({ cmd, flags, logger }) {
|
|
11
|
+
try {
|
|
12
|
+
let config = {
|
|
13
|
+
tokens: [DEFAULT_TOKENS_PATH],
|
|
14
|
+
outDir: new URL('./tokens/', cwd),
|
|
15
|
+
plugins: [],
|
|
16
|
+
lint: { build: { enabled: true }, rules: {} },
|
|
17
|
+
ignore: { tokens: [], deprecated: false },
|
|
18
|
+
};
|
|
19
|
+
let configPath;
|
|
20
|
+
if (typeof flags.config === 'string') {
|
|
21
|
+
if (flags.config === '') {
|
|
22
|
+
logger.error({ message: 'Missing path after --config flag' });
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
configPath = resolveConfig(flags.config);
|
|
26
|
+
}
|
|
27
|
+
const resolvedConfigPath = resolveConfig(configPath);
|
|
28
|
+
if (resolvedConfigPath) {
|
|
29
|
+
try {
|
|
30
|
+
const mod = await import(resolvedConfigPath);
|
|
31
|
+
if (!mod.default) {
|
|
32
|
+
logger.error({
|
|
33
|
+
message: `No default export found in ${path.relative(cwd.href, resolvedConfigPath)}. See https://terrazzo.dev/docs/cli for instructions.`,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
config = defineConfig(mod.default, { cwd, logger });
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
logger.error({ message: err.message || err });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (cmd !== 'init' && cmd !== 'check') {
|
|
43
|
+
logger.error({ message: 'No config file found. Create one with `npx terrazzo init`.' });
|
|
44
|
+
}
|
|
45
|
+
return { config, configPath: resolvedConfigPath };
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
printError(err.message);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** load tokens */
|
|
53
|
+
export async function loadTokens(tokenPaths, { logger }) {
|
|
54
|
+
try {
|
|
55
|
+
const allTokens = [];
|
|
56
|
+
if (!Array.isArray(tokenPaths)) {
|
|
57
|
+
logger.error({ message: `loadTokens: Expected array, received ${typeof tokenPaths}` });
|
|
58
|
+
}
|
|
59
|
+
// if this is the default value, also check for tokens.yaml
|
|
60
|
+
if (tokenPaths.length === 1 && tokenPaths[0].href === DEFAULT_TOKENS_PATH.href) {
|
|
61
|
+
if (!fs.existsSync(tokenPaths[0])) {
|
|
62
|
+
const yamlPath = new URL('./tokens.yaml', cwd);
|
|
63
|
+
if (fs.existsSync(yamlPath)) {
|
|
64
|
+
tokenPaths[0] = yamlPath;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
logger.error({
|
|
68
|
+
message: `Could not locate ${path.relative(cwd.href, tokenPaths[0].href)}. To create one, run \`npx tz init\`.`,
|
|
69
|
+
});
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// download/read
|
|
75
|
+
for (let i = 0; i < tokenPaths.length; i++) {
|
|
76
|
+
const filename = tokenPaths[i];
|
|
77
|
+
if (!(filename instanceof URL)) {
|
|
78
|
+
logger.error({ message: `Expected URL, received ${filename}`, label: `loadTokens[${i}]` });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
else if (filename.protocol === 'http:' || filename.protocol === 'https:') {
|
|
82
|
+
try {
|
|
83
|
+
// if Figma URL
|
|
84
|
+
if (filename.host === 'figma.com' || filename.host === 'www.figma.com') {
|
|
85
|
+
const [_, fileKeyword, fileKey] = filename.pathname.split('/');
|
|
86
|
+
if (fileKeyword !== 'file' || !fileKey) {
|
|
87
|
+
logger.error({
|
|
88
|
+
message: `Unexpected Figma URL. Expected "https://www.figma.com/file/:file_key/:file_name?…", received "${filename.href}"`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const headers = new Headers({
|
|
92
|
+
Accept: '*/*',
|
|
93
|
+
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:123.0) Gecko/20100101 Firefox/123.0',
|
|
94
|
+
});
|
|
95
|
+
if (process.env.FIGMA_ACCESS_TOKEN) {
|
|
96
|
+
headers.set('X-FIGMA-TOKEN', process.env.FIGMA_ACCESS_TOKEN);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
logger.warn({ message: 'FIGMA_ACCESS_TOKEN not set' });
|
|
100
|
+
}
|
|
101
|
+
const res = await fetch(`https://api.figma.com/v1/files/${fileKey}/variables/local`, {
|
|
102
|
+
method: 'GET',
|
|
103
|
+
headers,
|
|
104
|
+
});
|
|
105
|
+
if (res.ok) {
|
|
106
|
+
allTokens.push({ filename, src: await res.text() });
|
|
107
|
+
}
|
|
108
|
+
const message = res.status !== 404 ? JSON.stringify(await res.json(), undefined, 2) : '';
|
|
109
|
+
logger.error({ message: `Figma responded with ${res.status}${message ? `:\n${message}` : ''}` });
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
// otherwise, expect YAML/JSON
|
|
113
|
+
const res = await fetch(filename, {
|
|
114
|
+
method: 'GET',
|
|
115
|
+
headers: { Accept: '*/*', 'User-Agent': 'Mozilla/5.0 Gecko/20100101 Firefox/123.0' },
|
|
116
|
+
});
|
|
117
|
+
allTokens.push({ filename, src: await res.text() });
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
logger.error({ message: `${filename.href}: ${err}` });
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
if (fs.existsSync(filename)) {
|
|
126
|
+
allTokens.push({ filename, src: fs.readFileSync(filename, 'utf8') });
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
logger.error({
|
|
130
|
+
message: `Could not locate ${path.relative(cwd.href, filename.href)}. To create one, run \`npx tz init\`.`,
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return allTokens;
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
printError(err.message);
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/** Print error */
|
|
144
|
+
export function printError(message) {
|
|
145
|
+
console.error(pc.red(`✗ ${message}`));
|
|
146
|
+
}
|
|
147
|
+
/** Print success */
|
|
148
|
+
export function printSuccess(message, startTime) {
|
|
149
|
+
console.log(`${GREEN_CHECK} ${message}${startTime ? ` ${time(startTime)}` : ''}`);
|
|
150
|
+
}
|
|
151
|
+
/** Resolve config */
|
|
152
|
+
export function resolveConfig(filename) {
|
|
153
|
+
// --config [configpath]
|
|
154
|
+
if (filename) {
|
|
155
|
+
const configPath = new URL(filename, cwd);
|
|
156
|
+
if (fs.existsSync(configPath)) {
|
|
157
|
+
return configPath.href; // ⚠️ ESM wants "file://..." URLs on Windows & Unix.
|
|
158
|
+
}
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
// note: the order isn’t significant; just try for most-common first.
|
|
162
|
+
// if a user has multiple files differing only by file extension, behavior is
|
|
163
|
+
// unpredictable and that’s on them.
|
|
164
|
+
return ['.js', '.mjs', '.cjs']
|
|
165
|
+
.map((ext) => new URL(`./terrazzo.config${ext}`, cwd))
|
|
166
|
+
.find((configPath) => fs.existsSync(configPath))?.href; // ⚠️ ESM wants "file://..." URLs on Windows & Unix.;
|
|
167
|
+
}
|
|
168
|
+
/** Resolve tokens.json path (for lint command) */
|
|
169
|
+
export function resolveTokenPath(filename, { logger }) {
|
|
170
|
+
const tokensPath = new URL(filename, cwd);
|
|
171
|
+
if (!fs.existsSync(tokensPath)) {
|
|
172
|
+
logger.error({ message: `Could not locate ${filename}. Does the file exist?` });
|
|
173
|
+
}
|
|
174
|
+
else if (!fs.statSync(tokensPath).isFile()) {
|
|
175
|
+
logger.error({ message: `Expected JSON or YAML file, received ${filename}.` });
|
|
176
|
+
}
|
|
177
|
+
return tokensPath;
|
|
178
|
+
}
|
|
179
|
+
/** Print time elapsed */
|
|
180
|
+
export function time(start) {
|
|
181
|
+
const diff = performance.now() - start;
|
|
182
|
+
return pc.dim(diff < 750 ? `${Math.round(diff)}ms` : `${(diff / 1000).toFixed(1)}s`);
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function versionCmd(): void;
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACvB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@terrazzo/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "CLI for managing design tokens using the Design Tokens Community Group (DTCG) standard and generating code for any platform via plugins.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": {
|
|
@@ -40,16 +40,18 @@
|
|
|
40
40
|
"terrazzo": "bin/cli.js"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
+
"@clack/prompts": "^0.8.2",
|
|
44
|
+
"@types/escodegen": "^0.0.10",
|
|
43
45
|
"chokidar": "^3.6.0",
|
|
46
|
+
"detect-package-manager": "^3.0.2",
|
|
44
47
|
"dotenv": "^16.4.5",
|
|
48
|
+
"escodegen": "^2.1.0",
|
|
45
49
|
"merge-anything": "^5.1.7",
|
|
50
|
+
"meriyah": "^6.0.3",
|
|
46
51
|
"picocolors": "^1.1.1",
|
|
47
52
|
"yaml-to-momoa": "^0.0.3",
|
|
48
|
-
"@terrazzo/parser": "^0.2.
|
|
49
|
-
"@terrazzo/token-tools": "^0.2.
|
|
50
|
-
},
|
|
51
|
-
"devDependencies": {
|
|
52
|
-
"typescript": "^5.7.2"
|
|
53
|
+
"@terrazzo/parser": "^0.2.3",
|
|
54
|
+
"@terrazzo/token-tools": "^0.2.3"
|
|
53
55
|
},
|
|
54
56
|
"scripts": {
|
|
55
57
|
"build": "tsc -p tsconfig.build.json",
|