@knapsack/design-tokens-cli 4.103.0--canary.8158.6e59694.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/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # @knapsack/design-tokens-cli
2
+
3
+ Standalone, publishable CLI for the design-token **build** step: read a tokens JSON source, convert it, and write per-target files. It does not require the full `knapsack` CLI.
4
+
5
+ Output files are produced with the same converter (`convertTokenDataToFiles`) and writer (`writeFormattedFile`) as `knapsack` design-tokens `build`, so results match for the same input.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pnpm add -D @knapsack/design-tokens-cli
11
+ ```
12
+
13
+ ## Config
14
+
15
+ Default filenames (in the working directory): `design-tokens-cli.config.mjs` or `design-tokens-cli.config.ts`. Override with `--config ./path`.
16
+
17
+ ```ts
18
+ import { configure } from '@knapsack/design-tokens-cli';
19
+
20
+ export default configure({
21
+ srcFilePath: './src/knapsack.design-tokens.json',
22
+ distDir: './dist/tokens',
23
+ // Omit `targets` to generate every target. Set `enabled: false` per target to skip.
24
+ targets: {
25
+ css: { enabled: true },
26
+ js: { enabled: true },
27
+ android: { enabled: false },
28
+ ios: { enabled: false },
29
+ },
30
+ });
31
+ ```
32
+
33
+ The config shape matches `KnapsackConfig['designTokens']` (`srcFilePath`, `distDir`, `targets`).
34
+
35
+ ## Commands
36
+
37
+ ```bash
38
+ design-tokens-cli build
39
+ design-tokens-cli build --config ./design-tokens-cli.config.mjs
40
+ design-tokens-cli build --src-file-path ./tokens.json --dist-dir ./dist
41
+ design-tokens-cli build --targets css,js
42
+ ```
43
+
44
+ CLI flags override the same option in the config file.
45
+
46
+ ## Telemetry
47
+
48
+ Errors always print to stderr. A public Datadog client token sends best-effort telemetry in addition to that local log. Set `KS_DISABLE_TELEMETRY=true` to skip Datadog.
@@ -0,0 +1,5 @@
1
+ import type { ResolvedDesignTokensCliConfig } from './resolve-config.js';
2
+ export declare function buildDesignTokens(config: ResolvedDesignTokensCliConfig): Promise<{
3
+ readonly writtenPaths: readonly string[];
4
+ }>;
5
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAEzE,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,6BAA6B,GACpC,OAAO,CAAC;IAAE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,CAqCvD"}
package/dist/build.js ADDED
@@ -0,0 +1,38 @@
1
+ import { join, parse } from 'node:path';
2
+ import { convertTokenDataToFiles, } from '@knapsack/design-token-utils';
3
+ import { existsSync, readJSON, writeFormattedFile } from '@knapsack/file-utils';
4
+ import { DesignTokensCliError } from './errors.js';
5
+ export async function buildDesignTokens(config) {
6
+ if (!existsSync(config.srcFilePath)) {
7
+ throw new DesignTokensCliError(`The configured srcFilePath does not exist: ${config.srcFilePath}`);
8
+ }
9
+ const tokensSrc = await readJSON(config.srcFilePath);
10
+ let tokenFiles;
11
+ try {
12
+ const args = {
13
+ tokensSrc,
14
+ targets: config.targets,
15
+ };
16
+ tokenFiles = convertTokenDataToFiles(args);
17
+ }
18
+ catch (error) {
19
+ const message = error instanceof Error ? error.message : String(error);
20
+ throw new DesignTokensCliError(`Failed to convert tokens: ${message}`);
21
+ }
22
+ const files = tokenFiles.map(({ path, contents }) => {
23
+ const { base } = parse(path);
24
+ return {
25
+ path: join(config.distDir, base),
26
+ contents,
27
+ };
28
+ });
29
+ try {
30
+ await Promise.all(files.map(writeFormattedFile));
31
+ }
32
+ catch (error) {
33
+ const message = error instanceof Error ? error.message : String(error);
34
+ throw new DesignTokensCliError(`Failed to save files locally: ${message}`);
35
+ }
36
+ return { writtenPaths: files.map((file) => file.path) };
37
+ }
38
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACL,uBAAuB,GAExB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAqC;IAErC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,oBAAoB,CAC5B,8CAA8C,MAAM,CAAC,WAAW,EAAE,CACnE,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAgB,MAAM,CAAC,WAAW,CAAC,CAAC;IAEpE,IAAI,UAAsD,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,IAAI,GAAgC;YACxC,SAAS;YACT,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;QACF,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,oBAAoB,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;QAClD,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;YAChC,QAAQ;SACT,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,oBAAoB,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1D,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from './run-cli.js';
3
+ const exitCode = await runCli({
4
+ argv: process.argv.slice(2),
5
+ cwd: process.cwd(),
6
+ });
7
+ process.exit(exitCode);
8
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;CACnB,CAAC,CAAC;AACH,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare class DesignTokensCliError extends Error {
2
+ readonly exitCode: number;
3
+ constructor(message: string, exitCode?: number);
4
+ }
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAI;CAK1C"}
package/dist/errors.js ADDED
@@ -0,0 +1,9 @@
1
+ export class DesignTokensCliError extends Error {
2
+ exitCode;
3
+ constructor(message, exitCode = 1) {
4
+ super(message);
5
+ this.name = 'DesignTokensCliError';
6
+ this.exitCode = exitCode;
7
+ }
8
+ }
9
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,QAAQ,CAAS;IAE1B,YAAY,OAAe,EAAE,QAAQ,GAAG,CAAC;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { DesignTokensCliConfig } from './types.js';
2
+ export type { DesignTokensCliConfig, TokenTargetId } from './types.js';
3
+ export { TOKEN_TARGET_IDS } from './types.js';
4
+ export { DesignTokensCliConfigSchema } from './schema.js';
5
+ /**
6
+ * Identity helper so config files can `export default configure({})` and get
7
+ * type completion for {@link DesignTokensCliConfig}.
8
+ */
9
+ export declare function configure(config: DesignTokensCliConfig): DesignTokensCliConfig;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,qBAAqB,GAC5B,qBAAqB,CAEvB"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { TOKEN_TARGET_IDS } from './types.js';
2
+ export { DesignTokensCliConfigSchema } from './schema.js';
3
+ /**
4
+ * Identity helper so config files can `export default configure({})` and get
5
+ * type completion for {@link DesignTokensCliConfig}.
6
+ */
7
+ export function configure(config) {
8
+ return config;
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE1D;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,MAA6B;IAE7B,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type DesignTokensCliConfig } from './types.js';
2
+ export declare const DEFAULT_CONFIG_FILENAMES: readonly ["design-tokens-cli.config.mjs", "design-tokens-cli.config.ts"];
3
+ export interface CliFlagOverrides {
4
+ readonly configPath?: string;
5
+ readonly srcFilePath?: string;
6
+ readonly distDir?: string;
7
+ readonly targets?: string;
8
+ }
9
+ export interface ResolvedDesignTokensCliConfig {
10
+ readonly srcFilePath: string;
11
+ readonly distDir: string;
12
+ readonly targets: DesignTokensCliConfig['targets'];
13
+ readonly configFilePath?: string;
14
+ }
15
+ export declare function resolveConfig({ cwd, flags, }: {
16
+ readonly cwd: string;
17
+ readonly flags: CliFlagOverrides;
18
+ }): Promise<ResolvedDesignTokensCliConfig>;
19
+ //# sourceMappingURL=resolve-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-config.d.ts","sourceRoot":"","sources":["../src/resolve-config.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,wBAAwB,0EAG3B,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACnD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAqFD,wBAAsB,aAAa,CAAC,EAClC,GAAG,EACH,KAAK,GACN,EAAE;IACD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;CAClC,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAsEzC"}
@@ -0,0 +1,131 @@
1
+ import { dirname, isAbsolute, join } from 'node:path';
2
+ import { pathToFileURL } from 'node:url';
3
+ import { existsSync } from '@knapsack/file-utils';
4
+ import { z } from 'zod';
5
+ import { DesignTokensCliError } from './errors.js';
6
+ import { DesignTokensCliConfigSchema, TOKEN_TARGET_ID_SET } from './schema.js';
7
+ import { TOKEN_TARGET_IDS, } from './types.js';
8
+ export const DEFAULT_CONFIG_FILENAMES = [
9
+ 'design-tokens-cli.config.mjs',
10
+ 'design-tokens-cli.config.ts',
11
+ ];
12
+ function resolvePathFrom(baseDir, path) {
13
+ return isAbsolute(path) ? path : join(baseDir, path);
14
+ }
15
+ function formatZodError(error) {
16
+ const details = error.issues
17
+ .map((issue) => {
18
+ const fieldPath = issue.path.length > 0 ? issue.path.join('.') : '(root)';
19
+ return `${fieldPath}: ${issue.message}`;
20
+ })
21
+ .join('\n');
22
+ return `Config failed schema validation:\n${details}\n\n${z.prettifyError(error)}`;
23
+ }
24
+ function findDefaultConfig(cwd) {
25
+ for (const filename of DEFAULT_CONFIG_FILENAMES) {
26
+ const candidate = join(cwd, filename);
27
+ if (existsSync(candidate)) {
28
+ return candidate;
29
+ }
30
+ }
31
+ return undefined;
32
+ }
33
+ async function loadConfigModule(configFilePath) {
34
+ const imported = await import(pathToFileURL(configFilePath).href);
35
+ if (typeof imported === 'object' &&
36
+ imported !== null &&
37
+ 'default' in imported) {
38
+ return imported.default;
39
+ }
40
+ return imported;
41
+ }
42
+ function parseTargetsFlag(value) {
43
+ const enabledIds = value
44
+ .split(',')
45
+ .map((part) => part.trim())
46
+ .filter((part) => part.length > 0);
47
+ if (enabledIds.length === 0) {
48
+ throw new DesignTokensCliError('No targets are enabled. Pass a comma-separated list such as --targets css,js,android,ios.');
49
+ }
50
+ const unknown = enabledIds.filter((id) => !TOKEN_TARGET_ID_SET.has(id));
51
+ if (unknown.length > 0) {
52
+ throw new DesignTokensCliError(`Unknown target(s): ${unknown.join(', ')}. Expected one of: ${TOKEN_TARGET_IDS.join(', ')}.`);
53
+ }
54
+ const enabled = new Set(enabledIds);
55
+ return {
56
+ css: { enabled: enabled.has('css') },
57
+ js: { enabled: enabled.has('js') },
58
+ android: { enabled: enabled.has('android') },
59
+ ios: { enabled: enabled.has('ios') },
60
+ };
61
+ }
62
+ function hasAnyEnabledTarget(targets) {
63
+ if (!targets) {
64
+ return true;
65
+ }
66
+ return TOKEN_TARGET_IDS.some((id) => targets[id]?.enabled === true);
67
+ }
68
+ function missingRequiredMessage(option) {
69
+ const flag = option === 'srcFilePath' ? '--src-file-path <path>' : '--dist-dir <path>';
70
+ return `Missing required option '${option}'. Supply it in design-tokens-cli.config.mjs (or .ts) as ${option}, or pass ${flag}. Override the config path with --config ./path.`;
71
+ }
72
+ export async function resolveConfig({ cwd, flags, }) {
73
+ let configFilePath;
74
+ if (flags.configPath) {
75
+ configFilePath = resolvePathFrom(cwd, flags.configPath);
76
+ if (!existsSync(configFilePath)) {
77
+ throw new DesignTokensCliError(`Config file not found: ${configFilePath}. Pass --config ./path to a design-tokens-cli.config.mjs or .ts file.`);
78
+ }
79
+ }
80
+ else {
81
+ configFilePath = findDefaultConfig(cwd);
82
+ }
83
+ let fileConfig = {};
84
+ if (configFilePath) {
85
+ let raw;
86
+ try {
87
+ raw = await loadConfigModule(configFilePath);
88
+ }
89
+ catch (error) {
90
+ const message = error instanceof Error ? error.message : String(error);
91
+ throw new DesignTokensCliError(`Failed to load config file ${configFilePath}: ${message}`);
92
+ }
93
+ const parsed = DesignTokensCliConfigSchema.safeParse(raw);
94
+ if (!parsed.success) {
95
+ throw new DesignTokensCliError(formatZodError(parsed.error));
96
+ }
97
+ fileConfig = parsed.data;
98
+ }
99
+ const pathBase = configFilePath ? dirname(configFilePath) : cwd;
100
+ const srcFilePathFlag = flags.srcFilePath;
101
+ const distDirFlag = flags.distDir;
102
+ const srcFilePath = srcFilePathFlag
103
+ ? resolvePathFrom(cwd, srcFilePathFlag)
104
+ : fileConfig.srcFilePath
105
+ ? resolvePathFrom(pathBase, fileConfig.srcFilePath)
106
+ : undefined;
107
+ const distDir = distDirFlag
108
+ ? resolvePathFrom(cwd, distDirFlag)
109
+ : fileConfig.distDir
110
+ ? resolvePathFrom(pathBase, fileConfig.distDir)
111
+ : undefined;
112
+ if (!srcFilePath) {
113
+ throw new DesignTokensCliError(missingRequiredMessage('srcFilePath'));
114
+ }
115
+ if (!distDir) {
116
+ throw new DesignTokensCliError(missingRequiredMessage('distDir'));
117
+ }
118
+ const targets = flags.targets
119
+ ? parseTargetsFlag(flags.targets)
120
+ : fileConfig.targets;
121
+ if (!hasAnyEnabledTarget(targets)) {
122
+ throw new DesignTokensCliError('No targets are enabled. Set at least one entry in `targets` to `{ enabled: true }`, omit `targets` to generate all available targets, or pass --targets css,js,android,ios.');
123
+ }
124
+ return {
125
+ srcFilePath,
126
+ distDir,
127
+ targets,
128
+ configFilePath,
129
+ };
130
+ }
131
+ //# sourceMappingURL=resolve-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../src/resolve-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface RunCliArgs {
2
+ readonly argv: readonly string[];
3
+ readonly cwd: string;
4
+ readonly stdout?: NodeJS.WritableStream;
5
+ readonly stderr?: NodeJS.WritableStream;
6
+ }
7
+ export declare function runCli({ argv, cwd, stdout, stderr, }: RunCliArgs): Promise<number>;
8
+ //# sourceMappingURL=run-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cli.d.ts","sourceRoot":"","sources":["../src/run-cli.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CACzC;AAED,wBAAsB,MAAM,CAAC,EAC3B,IAAI,EACJ,GAAG,EACH,MAAuB,EACvB,MAAuB,GACxB,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA0F9B"}
@@ -0,0 +1,66 @@
1
+ import { Command } from 'commander';
2
+ import { findUpPkgJson } from '@knapsack/file-utils';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname } from 'node:path';
5
+ import { buildDesignTokens } from './build.js';
6
+ import { DesignTokensCliError } from './errors.js';
7
+ import { resolveConfig } from './resolve-config.js';
8
+ import { createCliTelemetry, logError } from './telemetry.js';
9
+ const { pkg } = findUpPkgJson(dirname(fileURLToPath(import.meta.url)));
10
+ export async function runCli({ argv, cwd, stdout = process.stdout, stderr = process.stderr, }) {
11
+ const telemetry = createCliTelemetry();
12
+ const program = new Command()
13
+ .name('design-tokens-cli')
14
+ .description('Build design tokens from a tokens JSON source into per-target files')
15
+ .version(pkg?.version ?? '0.0.0')
16
+ .enablePositionalOptions()
17
+ .showHelpAfterError();
18
+ program.exitOverride();
19
+ program.configureOutput({
20
+ writeOut: (str) => stdout.write(str),
21
+ writeErr: (str) => stderr.write(str),
22
+ });
23
+ program
24
+ .command('build', { isDefault: true })
25
+ .description('Read tokens JSON, convert, and write per-target output files')
26
+ .option('--config <path>', 'Path to design-tokens-cli.config.mjs or .ts (default: ./design-tokens-cli.config.{mjs,ts})')
27
+ .option('--src-file-path <path>', 'Path to the design tokens JSON source (overrides config srcFilePath)')
28
+ .option('--src <path>', 'Alias for --src-file-path')
29
+ .option('--dist-dir <path>', 'Directory to write generated files (overrides config distDir)')
30
+ .option('--dist <path>', 'Alias for --dist-dir')
31
+ .option('--targets <list>', 'Comma-separated enabled targets: css,js,android,ios (overrides config targets)')
32
+ .action(async (opts) => {
33
+ const flags = {
34
+ configPath: opts.config,
35
+ srcFilePath: opts.srcFilePath ?? opts.src,
36
+ distDir: opts.distDir ?? opts.dist,
37
+ targets: opts.targets,
38
+ };
39
+ const config = await resolveConfig({ cwd, flags });
40
+ const { writtenPaths } = await buildDesignTokens(config);
41
+ stdout.write(`Design tokens built successfully (${writtenPaths.length} files) to ${config.distDir}\n`);
42
+ });
43
+ try {
44
+ await program.parseAsync([...argv], { from: 'user' });
45
+ return 0;
46
+ }
47
+ catch (error) {
48
+ if (error instanceof Error &&
49
+ 'code' in error &&
50
+ error.code === 'commander.helpDisplayed') {
51
+ return 0;
52
+ }
53
+ if (error instanceof Error &&
54
+ 'code' in error &&
55
+ error.code === 'commander.version') {
56
+ return 0;
57
+ }
58
+ const cliError = error instanceof DesignTokensCliError
59
+ ? error
60
+ : new DesignTokensCliError(error instanceof Error ? error.message : String(error));
61
+ logError(cliError.message, stderr);
62
+ await telemetry.reportError(cliError);
63
+ return cliError.exitCode;
64
+ }
65
+ }
66
+ //# sourceMappingURL=run-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cli.js","sourceRoot":"","sources":["../src/run-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ export declare const DesignTokensCliConfigSchema: z.ZodObject<{
3
+ srcFilePath: z.ZodOptional<z.ZodCustom<string, string>>;
4
+ distDir: z.ZodOptional<z.ZodCustom<string, string>>;
5
+ targets: z.ZodOptional<z.ZodObject<{
6
+ css: z.ZodOptional<z.ZodObject<{
7
+ enabled: z.ZodBoolean;
8
+ filterTokens: z.ZodOptional<z.ZodCustom<((token: import("@knapsack/types").TokenData) => boolean) | undefined, ((token: import("@knapsack/types").TokenData) => boolean) | undefined>>;
9
+ }, z.core.$strict>>;
10
+ js: z.ZodOptional<z.ZodObject<{
11
+ enabled: z.ZodBoolean;
12
+ filterTokens: z.ZodOptional<z.ZodCustom<((token: import("@knapsack/types").TokenData) => boolean) | undefined, ((token: import("@knapsack/types").TokenData) => boolean) | undefined>>;
13
+ }, z.core.$strict>>;
14
+ android: z.ZodOptional<z.ZodObject<{
15
+ enabled: z.ZodBoolean;
16
+ filterTokens: z.ZodOptional<z.ZodCustom<((token: import("@knapsack/types").TokenData) => boolean) | undefined, ((token: import("@knapsack/types").TokenData) => boolean) | undefined>>;
17
+ }, z.core.$strict>>;
18
+ ios: z.ZodOptional<z.ZodObject<{
19
+ enabled: z.ZodBoolean;
20
+ filterTokens: z.ZodOptional<z.ZodCustom<((token: import("@knapsack/types").TokenData) => boolean) | undefined, ((token: import("@knapsack/types").TokenData) => boolean) | undefined>>;
21
+ }, z.core.$strict>>;
22
+ }, z.core.$strict>>;
23
+ }, z.core.$strict>;
24
+ export declare const TOKEN_TARGET_ID_SET: Set<string>;
25
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0BxB,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;kBAWtC,CAAC;AAEH,eAAO,MAAM,mBAAmB,aAAoC,CAAC"}
package/dist/schema.js ADDED
@@ -0,0 +1,28 @@
1
+ import { z } from 'zod';
2
+ import { isAbsolute, isRelativePath } from '@knapsack/file-utils';
3
+ import { TOKEN_TARGET_IDS } from './types.js';
4
+ const PathSchema = z.custom((val) => {
5
+ return typeof val === 'string' && (isAbsolute(val) || isRelativePath(val));
6
+ }, {
7
+ error: ({ input }) => `Must be either an absolute or relative path. Received: "${input}"`,
8
+ });
9
+ const TokenTargetSchema = z.strictObject({
10
+ enabled: z.boolean(),
11
+ filterTokens: z
12
+ .custom((val) => typeof val === 'function')
13
+ .optional(),
14
+ });
15
+ export const DesignTokensCliConfigSchema = z.strictObject({
16
+ srcFilePath: PathSchema.optional(),
17
+ distDir: PathSchema.optional(),
18
+ targets: z
19
+ .strictObject({
20
+ css: TokenTargetSchema.optional(),
21
+ js: TokenTargetSchema.optional(),
22
+ android: TokenTargetSchema.optional(),
23
+ ios: TokenTargetSchema.optional(),
24
+ })
25
+ .optional(),
26
+ });
27
+ export const TOKEN_TARGET_ID_SET = new Set(TOKEN_TARGET_IDS);
28
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CACzB,CAAC,GAAG,EAAE,EAAE;IACN,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7E,CAAC,EACD;IACE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACnB,2DAA2D,KAAK,GAAG;CACtE,CACF,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,CAAC,YAAY,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,YAAY,EAAE,CAAC;SACZ,MAAM,CAIL,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC;SACpC,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,YAAY,CAAC;IACxD,WAAW,EAAE,UAAU,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAE,UAAU,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,CAAC;SACP,YAAY,CAAC;QACZ,GAAG,EAAE,iBAAiB,CAAC,QAAQ,EAAE;QACjC,EAAE,EAAE,iBAAiB,CAAC,QAAQ,EAAE;QAChC,OAAO,EAAE,iBAAiB,CAAC,QAAQ,EAAE;QACrC,GAAG,EAAE,iBAAiB,CAAC,QAAQ,EAAE;KAClC,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAS,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function isTelemetryDisabled(): boolean;
2
+ export declare function createCliTelemetry(): {
3
+ readonly reportError: (error: Error) => Promise<void>;
4
+ };
5
+ export declare function logError(message: string, stderr: NodeJS.WritableStream): void;
6
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAiBA,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED,wBAAgB,kBAAkB,IAAI;IACpC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD,CAuBA;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI,CAE7E"}
@@ -0,0 +1,43 @@
1
+ import { findUpPkgJson } from '@knapsack/file-utils';
2
+ import { createSendToDatadog } from '@knapsack/logger/cjs';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { dirname } from 'node:path';
5
+ const disableTelemetryEnvVar = 'KS_DISABLE_TELEMETRY';
6
+ const pkgDir = dirname(fileURLToPath(import.meta.url));
7
+ const { pkg } = findUpPkgJson(pkgDir);
8
+ /**
9
+ * Public Datadog client token (safe to ship in a public package). The same
10
+ * key the `knapsack` CLI uses for best-effort telemetry. Failures here never
11
+ * replace the local stderr error.
12
+ */
13
+ const DATADOG_PUBLIC_CLIENT_TOKEN = 'pub9a17ae4826c927450539436644ad7eef';
14
+ export function isTelemetryDisabled() {
15
+ return Boolean(process.env[disableTelemetryEnvVar]);
16
+ }
17
+ export function createCliTelemetry() {
18
+ const sendToDatadog = createSendToDatadog({
19
+ env: 'production',
20
+ ddsource: 'nodejs',
21
+ service: 'design-tokens-cli',
22
+ version: pkg?.version,
23
+ keyType: 'publicClientKey',
24
+ key: DATADOG_PUBLIC_CLIENT_TOKEN,
25
+ enabled: !isTelemetryDisabled(),
26
+ });
27
+ return {
28
+ async reportError(error) {
29
+ await sendToDatadog({
30
+ status: 'error',
31
+ message: error.message,
32
+ error,
33
+ metadata: {
34
+ cliCommand: 'build',
35
+ },
36
+ });
37
+ },
38
+ };
39
+ }
40
+ export function logError(message, stderr) {
41
+ stderr.write(`${message}\n`);
42
+ }
43
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,sBAAsB,GAAG,sBAAsB,CAAC;AAEtD,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACvD,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAEtC;;;;GAIG;AACH,MAAM,2BAA2B,GAAG,qCAAqC,CAAC;AAE1E,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAGhC,MAAM,aAAa,GAAG,mBAAmB,CAAC;QACxC,GAAG,EAAE,YAAY;QACjB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE,GAAG,EAAE,OAAO;QACrB,OAAO,EAAE,iBAAiB;QAC1B,GAAG,EAAE,2BAA2B;QAChC,OAAO,EAAE,CAAC,mBAAmB,EAAE;KAChC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,KAAY;YAC5B,MAAM,aAAa,CAAC;gBAClB,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK;gBACL,QAAQ,EAAE;oBACR,UAAU,EAAE,OAAO;iBACpB;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,MAA6B;IACrE,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ConvertTokenDataToFilesArgs } from '@knapsack/design-token-utils';
2
+ /**
3
+ * Config shape matches `KnapsackConfig['designTokens']` so existing
4
+ * `knapsack.config.cjs` `designTokens` blocks can be copied as-is.
5
+ */
6
+ export interface DesignTokensCliConfig {
7
+ readonly srcFilePath?: string;
8
+ readonly distDir?: string;
9
+ readonly targets?: ConvertTokenDataToFilesArgs['targets'];
10
+ }
11
+ export declare const TOKEN_TARGET_IDS: readonly ["css", "js", "android", "ios"];
12
+ export type TokenTargetId = (typeof TOKEN_TARGET_IDS)[number];
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAEhF;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,2BAA2B,CAAC,SAAS,CAAC,CAAC;CAC3D;AAED,eAAO,MAAM,gBAAgB,0CAA2C,CAAC;AAEzE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export const TOKEN_TARGET_IDS = ['css', 'js', 'android', 'ios'];
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAU,CAAC"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@knapsack/design-tokens-cli",
3
+ "description": "Standalone CLI to build design tokens from a tokens JSON source into per-target files",
4
+ "version": "4.103.0--canary.8158.6e59694.0",
5
+ "bin": {
6
+ "design-tokens-cli": "./dist/cli.js"
7
+ },
8
+ "type": "module",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./package": "./package.json",
15
+ "./package.json": "./package.json"
16
+ },
17
+ "sideEffects": false,
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "clean": "rm -rf ./dist",
21
+ "lint": "eslint ./src --quiet",
22
+ "test": "tsc -p tsconfig.test.json && vitest run"
23
+ },
24
+ "author": "Knapsack (https://www.knapsack.cloud)",
25
+ "dependencies": {
26
+ "@knapsack/design-token-utils": "4.103.0--canary.8158.6e59694.0",
27
+ "@knapsack/file-utils": "4.103.0--canary.8158.6e59694.0",
28
+ "@knapsack/logger": "4.103.0--canary.8158.6e59694.0",
29
+ "@knapsack/types": "4.103.0--canary.8158.6e59694.0",
30
+ "commander": "^14.0.3",
31
+ "zod": "^4.5.4"
32
+ },
33
+ "devDependencies": {
34
+ "@knapsack/eslint-config-starter": "4.103.0--canary.8158.6e59694.0",
35
+ "@knapsack/typescript-config-starter": "4.103.0--canary.8158.6e59694.0",
36
+ "@types/node": "^24.13.2",
37
+ "eslint": "^9.20.0",
38
+ "typescript": "^6.0.3",
39
+ "vitest": "^4.1.11"
40
+ },
41
+ "engines": {
42
+ "node": ">=24.0.0 <24.17.0 || >=24.18.0 <25.0.0"
43
+ },
44
+ "files": [
45
+ "dist"
46
+ ],
47
+ "homepage": "https://www.knapsack.cloud",
48
+ "keywords": [
49
+ "design-system",
50
+ "design-tokens",
51
+ "knapsack"
52
+ ],
53
+ "license": "GPL-2.0-or-later",
54
+ "publishConfig": {
55
+ "access": "public"
56
+ },
57
+ "repository": {
58
+ "url": "https://github.com/knapsack-labs/app-monorepo",
59
+ "directory": "packages/design-tokens-cli",
60
+ "type": "git"
61
+ },
62
+ "gitHead": "6e59694e3897a0f0c86e7b4492e8be856bc39e78"
63
+ }