@terrazzo/cli 2.0.0-alpha.6 → 2.0.0-beta.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/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -30
- package/dist/index.js.map +1 -1
- package/dist/lab/assets/index-ZAnn1gk_.js +10 -0
- package/dist/lab/assets/{index-BdyBZ2zm.js.map → index-ZAnn1gk_.js.map} +1 -1
- package/dist/lab/index.html +1 -1
- package/package.json +9 -8
- package/dist/lab/assets/index-BdyBZ2zm.js +0 -10
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/shared.ts","../src/build.ts","../src/check.ts","../src/help.ts","../src/init.ts","../src/lab.ts","../src/normalize.ts","../src/version.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;cASa,KAAiD,IAAA,CAA9C;cACH,qBAA0D,IAAA,CAAvC;cACnB,qBAAmD,IAAA,CAAhC;AAFnB,KAID,OAAA,GAJkD,OAA9C,GAA8C,OAAA,GAAA,MAAA,GAAA,MAAA,GAAA,SAAA;AACjD,cAKA,WAL0D,EAAA,MAAA;AAC1D,UAMI,KAAA,CANJ;EAED;EAEC,MAAA,CAAA,EAAA,MAA2B;EAEvB;EAaA,GAAA,CAAA,EAAA,MAAA;EACV;EACE,IAAA,CAAA,EAAA,OAAA;EACC;EAAM,KAAA,CAAA,EAAA,OAAA;EAIM;EAAa,OAAA,CAAA,EAAA,OAAA;;AAAY,UAP9B,iBAAA,CAO8B;EAAU,GAAA,EANlD,OAMkD;SALhD;EAKiE,MAAA,EAJhE,MAIgE;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/shared.ts","../src/build.ts","../src/check.ts","../src/help.ts","../src/init.ts","../src/lab.ts","../src/normalize.ts","../src/version.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;;cASa,KAAiD,IAAA,CAA9C;cACH,qBAA0D,IAAA,CAAvC;cACnB,qBAAmD,IAAA,CAAhC;AAFnB,KAID,OAAA,GAJkD,OAA9C,GAA8C,OAAA,GAAA,MAAA,GAAA,MAAA,GAAA,SAAA;AACjD,cAKA,WAL0D,EAAA,MAAA;AAC1D,UAMI,KAAA,CANJ;EAED;EAEC,MAAA,CAAA,EAAA,MAA2B;EAEvB;EAaA,GAAA,CAAA,EAAA,MAAA;EACV;EACE,IAAA,CAAA,EAAA,OAAA;EACC;EAAM,KAAA,CAAA,EAAA,OAAA;EAIM;EAAa,OAAA,CAAA,EAAA,OAAA;;AAAY,UAP9B,iBAAA,CAO8B;EAAU,GAAA,EANlD,OAMkD;SALhD;EAKiE,MAAA,EAJhE,MAIgE;;AAuF1E;AAA6C,iBAvFvB,UAAA,CAuFuB;EAAA,GAAA;EAAA,KAAA;EAAA;AAAA,CAAA,EAvFY,iBAuFZ,CAAA,EAvF6B,OAuF7B,CAAA;EAAS,MAAA,YAAA;EAAoB,UAAA,EAAA,MAAA;;;AAAQ,iBAA5D,UAAA,CAA4D,UAAA,EAArC,GAAqC,EAAA,EAAA;EAAA;AAsGlF,CAtGkF,EAAA;EAiGlE,MAAA,EAjG0D,MAiGhD;AAK1B,CAAA,CAAA,EAtGkF,OAsGlE,CAAA;EAKA,QAAA,KAAA;EAgBA,GAAA,EAAA,MAAA;CAAqC,EAAA,GAAA,SAAA,CAAA;;AAA4B,iBA1BjE,UAAA,CA0BiE,OAAA,EAAA,MAAA,CAAA,EAAA,IAAA;;AAWjE,iBAhCA,YAAA,CAgCI,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,MAAA,CAAA,EAAA,IAAA;;iBA3BJ,aAAA;;ACrNC,iBDqOD,gBAAA,CCrOa,QAAA,EAAA,MAAA,EAAA;EAAA;CAAA,EAAA;EACpB,MAAA,EDoOgE,MCpOhE;CACC,CAAA,EDmOqE,IAAA,CAAE,GCnOvE;;AAEM,iBD4OA,IAAA,CC5OA,KAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;UAJC,YAAA;SACR;EDVI,MAAiD,ECWpD,UDXoD;EACjD,UAAA,EAAA,MAAA;EACA,MAAA,ECWH,MDXG;AAEb;AAEA;AAEiB,iBCSK,QAAA,CDTA;EAAA,MAAA;EAAA,UAAA;EAAA,KAAA;EAAA;AAAA,CAAA,ECSgD,YDThD,CAAA,ECS4D,ODT5D,CAAA,IAAA,CAAA;AAatB;AACO,iBC+ES,UAAA,CD/ET,MAAA,EC+E4B,iBD/E5B,EAAA;EAAA,MAAA;EAAA;CAAA,EAAA;EACE,MAAA,EC8E2E,UD9E3E;EACC,MAAA,EC6E8F,MD7E9F;CAAM,CAAA,EAAA,IAAA;;;UE7BC,YAAA;;;EFKJ,MAAiD,EEFpD,UFEoD;EACjD,MAAA,EEFH,MFEG;AACb;AAEA;AAEa,iBEHS,QAAA,CFGkB;EAAA,MAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EEHwB,YFGxB,CAAA,EEHoC,OFGpC,CAAA,IAAA,CAAA;;;;iBGdxB,OAAA,CAAA;;;UCoEC,WAAA;UACP;;AJ7DG,iBIgES,OAAA,CJhEwC;EAAA;AAAA,CAAA,EIgEpB,WJhEoB,CAAA,EIgET,OJhES,CAAA,IAAA,CAAA;;;UKA7C,eAAA;SACR;ELDI,MAAiD,EKEpD,ULFoD;EACjD,UAAA,EAAA,MAAA;EACA,MAAA,EKEH,MLFG;AAEb;AAEa,iBKCS,MAAA,CLDkB;EAAA,MAAA;EAAA;AAAA,CAAA,EKCS,eLDT,CAAA,EKCwB,OLDxB,CAAA,IAAA,CAAA;;;UMPvB,gBAAA;UACP;UACA;ANDV;AACa,iBMSS,YAAA,CNTiD,QAAvC,EAAuC,MAAA,EAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EMSE,gBNTF,CAAA,EMSkB,ONTlB,CAAA,IAAA,CAAA;;;iBORvD,UAAA,CAAA;;;APeC,iBQAD,YAAA,CRAM,MAAA,EQAe,MRAf,CAAA,EQAwB,URAxB"}
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import { ViteNodeRunner } from "vite-node/client";
|
|
|
9
9
|
import { ViteNodeServer } from "vite-node/server";
|
|
10
10
|
import chokidar from "chokidar";
|
|
11
11
|
import yamlToMomoa from "yaml-to-momoa";
|
|
12
|
-
import {
|
|
12
|
+
import { spawn } from "node:child_process";
|
|
13
13
|
import { confirm, intro, multiselect, outro, select, spinner } from "@clack/prompts";
|
|
14
14
|
import { isAlias, pluralize } from "@terrazzo/token-tools";
|
|
15
15
|
import { detect } from "detect-package-manager";
|
|
@@ -43,6 +43,7 @@ async function loadConfig({ cmd, flags, logger }) {
|
|
|
43
43
|
build: { enabled: true },
|
|
44
44
|
rules: {}
|
|
45
45
|
},
|
|
46
|
+
alphabetize: false,
|
|
46
47
|
ignore: {
|
|
47
48
|
tokens: [],
|
|
48
49
|
deprecated: false
|
|
@@ -399,52 +400,41 @@ const INSTALL_COMMAND = {
|
|
|
399
400
|
pnpm: "add -D --silent",
|
|
400
401
|
bun: "install -D --silent"
|
|
401
402
|
};
|
|
402
|
-
const DTCG_ROOT_URL = "https://raw.githubusercontent.com/terrazzoapp/dtcg-examples/refs/heads/main/";
|
|
403
403
|
const DESIGN_SYSTEMS = {
|
|
404
404
|
"adobe-spectrum": {
|
|
405
405
|
name: "Spectrum",
|
|
406
406
|
author: "Adobe",
|
|
407
|
-
tokens: ["adobe-spectrum.json"]
|
|
407
|
+
tokens: ["dtcg-examples/adobe-spectrum.resolver.json"]
|
|
408
408
|
},
|
|
409
409
|
"apple-hig": {
|
|
410
410
|
name: "Human Interface Guidelines",
|
|
411
411
|
author: "Apple",
|
|
412
|
-
tokens: ["apple-hig.json"]
|
|
412
|
+
tokens: ["dtcg-examples/apple-hig.resolver.json"]
|
|
413
413
|
},
|
|
414
414
|
"figma-sds": {
|
|
415
415
|
name: "Simple Design System",
|
|
416
416
|
author: "Figma",
|
|
417
|
-
tokens: ["figma-sds.json"]
|
|
417
|
+
tokens: ["dtcg-examples/figma-sds.resolver.json"]
|
|
418
418
|
},
|
|
419
419
|
"github-primer": {
|
|
420
420
|
name: "Primer",
|
|
421
421
|
author: "GitHub",
|
|
422
|
-
tokens: ["github-primer.json"]
|
|
422
|
+
tokens: ["dtcg-examples/github-primer.resolver.json"]
|
|
423
423
|
},
|
|
424
424
|
"ibm-carbon": {
|
|
425
425
|
name: "Carbon",
|
|
426
426
|
author: "IBM",
|
|
427
|
-
tokens: ["ibm-carbon.json"]
|
|
427
|
+
tokens: ["dtcg-examples/ibm-carbon.resolver.json"]
|
|
428
428
|
},
|
|
429
429
|
"microsoft-fluent": {
|
|
430
430
|
name: "Fluent",
|
|
431
431
|
author: "Microsoft",
|
|
432
|
-
tokens: ["microsoft-fluent.json"]
|
|
433
|
-
},
|
|
434
|
-
radix: {
|
|
435
|
-
name: "Radix",
|
|
436
|
-
author: "Radix",
|
|
437
|
-
tokens: ["radix.json"]
|
|
438
|
-
},
|
|
439
|
-
"salesforce-lightning": {
|
|
440
|
-
name: "Lightning",
|
|
441
|
-
author: "Salesforce",
|
|
442
|
-
tokens: ["salesforce-lightning.json"]
|
|
432
|
+
tokens: ["dtcg-examples/microsoft-fluent.resolver.json"]
|
|
443
433
|
},
|
|
444
434
|
"shopify-polaris": {
|
|
445
435
|
name: "Polaris",
|
|
446
436
|
author: "Shopify",
|
|
447
|
-
tokens: ["shopify-polaris.json"]
|
|
437
|
+
tokens: ["dtcg-examples/shopify-polaris.resolver.json"]
|
|
448
438
|
}
|
|
449
439
|
};
|
|
450
440
|
async function initCmd({ logger }) {
|
|
@@ -463,7 +453,7 @@ async function initCmd({ logger }) {
|
|
|
463
453
|
if (await confirm({ message: `Found tokens at ${path.relative(fileURLToPath(cwd), fileURLToPath(tokensPath))}. Overwrite with a new design system?` })) startFromDS = true;
|
|
464
454
|
} else tokensPath = DEFAULT_TOKENS_PATH;
|
|
465
455
|
if (startFromDS) {
|
|
466
|
-
|
|
456
|
+
if (DESIGN_SYSTEMS[await select({
|
|
467
457
|
message: "Start from existing design system?",
|
|
468
458
|
options: [...Object.entries(DESIGN_SYSTEMS).map(([id, { author, name }]) => ({
|
|
469
459
|
value: id,
|
|
@@ -472,13 +462,15 @@ async function initCmd({ logger }) {
|
|
|
472
462
|
value: "none",
|
|
473
463
|
label: "None"
|
|
474
464
|
}]
|
|
475
|
-
})]
|
|
476
|
-
if (ds) {
|
|
465
|
+
})]) {
|
|
477
466
|
const s = spinner();
|
|
478
467
|
s.start("Downloading");
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
468
|
+
await new Promise((resolve, reject) => {
|
|
469
|
+
const subprocess = spawn(packageManager, [INSTALL_COMMAND[packageManager], "dtcg-examples"], { cwd });
|
|
470
|
+
subprocess.on("error", reject);
|
|
471
|
+
subprocess.on("exit", resolve);
|
|
472
|
+
});
|
|
473
|
+
await s.stop("Download complete");
|
|
482
474
|
}
|
|
483
475
|
}
|
|
484
476
|
const existingPlugins = config.plugins.map((p) => p.name);
|
|
@@ -514,11 +506,7 @@ async function initCmd({ logger }) {
|
|
|
514
506
|
const s = spinner();
|
|
515
507
|
s.start(`Installing ${pluginCount}`);
|
|
516
508
|
await new Promise((resolve, reject) => {
|
|
517
|
-
const subprocess =
|
|
518
|
-
packageManager,
|
|
519
|
-
INSTALL_COMMAND[packageManager],
|
|
520
|
-
newPlugins.join(" ")
|
|
521
|
-
].join(" "), { cwd });
|
|
509
|
+
const subprocess = spawn(packageManager, [INSTALL_COMMAND[packageManager], newPlugins.join(" ")], { cwd });
|
|
522
510
|
subprocess.on("error", reject);
|
|
523
511
|
subprocess.on("exit", resolve);
|
|
524
512
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["viteServer: ViteDevServer | undefined","config: ConfigInit","configPath: string | undefined","defineConfig","res","DESIGN_SYSTEMS: Record<DesignSystem, { name: string; author: string; tokens: string[] }>","defineConfig","hex","normalizedConfig: Config","defineConfigCore"],"sources":["../src/shared.ts","../src/build.ts","../src/check.ts","../src/help.ts","../src/init.ts","../src/lab.ts","../src/normalize.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { type ConfigInit, defineConfig, type Logger } from '@terrazzo/parser';\nimport pc from 'picocolors';\nimport { createServer, type ViteDevServer } from 'vite';\nimport { ViteNodeRunner } from 'vite-node/client';\nimport { ViteNodeServer } from 'vite-node/server';\n\nexport const cwd = new URL(`${pathToFileURL(process.cwd())}/`); // trailing slash needed to interpret as directory\nexport const DEFAULT_CONFIG_PATH = new URL('./terrazzo.config.ts', cwd);\nexport const DEFAULT_TOKENS_PATH = new URL('./tokens.json', cwd);\n\nexport type Command = 'build' | 'check' | 'help' | 'init' | 'version';\n\nexport const GREEN_CHECK = pc.green('✔');\n\nexport interface Flags {\n /** --config, -c */\n config?: string;\n /** --out, -o */\n out?: string;\n /** --help */\n help?: boolean;\n /** --watch, -w */\n watch?: boolean;\n /** --version */\n version?: boolean;\n}\n\nexport interface LoadConfigOptions {\n cmd: Command;\n flags: Flags;\n logger: Logger;\n}\n\n/** Load config */\nexport async function loadConfig({ cmd, flags, logger }: LoadConfigOptions) {\n /**\n * Vite server for loading .ts config files\n * TODO: remove me when Node 24 is the oldest-supported Node version\n */\n let viteServer: ViteDevServer | undefined;\n try {\n let config: ConfigInit = {\n tokens: [DEFAULT_TOKENS_PATH],\n outDir: new URL('./tokens/', cwd),\n plugins: [],\n lint: {\n build: { enabled: true },\n rules: {},\n },\n ignore: { tokens: [], deprecated: false },\n };\n let configPath: string | undefined;\n\n if (typeof flags.config === 'string') {\n if (flags.config === '') {\n logger.error({ group: 'config', message: 'Missing path after --config flag' });\n process.exit(1);\n }\n configPath = resolveConfig(flags.config);\n if (!configPath) {\n logger.error({ group: 'config', message: `Could not locate ${flags.config}` });\n }\n }\n\n const resolvedConfigPath = resolveConfig(configPath);\n if (resolvedConfigPath) {\n try {\n // Note: we create a vite-node instance only when resolving the config,\n // because in most scenarios we only ever need this once and never again.\n // even in watch mode we don’t reload the config, so keeping a vite-node\n // “hot” instance doesn’t provide obvious benefits (only potential memory leaks)\n viteServer = await createServer({ mode: 'development' });\n const viteNodeServer = new ViteNodeServer(viteServer);\n const viteNodeRunner = new ViteNodeRunner({\n root: viteServer.config.root,\n base: viteServer.config.base,\n fetchModule(...args) {\n return viteNodeServer.fetchModule(...args);\n },\n resolveId(...args) {\n return viteNodeServer.resolveId(...args);\n },\n });\n const mod = await viteNodeRunner.executeFile(resolvedConfigPath);\n if (!mod.default) {\n // we format it immediately below\n throw new Error(\n `No default export found in ${resolvedConfigPath.replace(fileURLToPath(cwd), '')}. See https://terrazzo.dev/docs for instructions.`,\n );\n }\n config = defineConfig(mod.default, { cwd, logger });\n } catch (err) {\n logger.error({ group: 'config', message: (err as Error).message || (err as string) });\n }\n } else if (cmd !== 'init' && cmd !== 'check') {\n logger.error({ group: 'config', message: 'No config file found. Create one with `npx terrazzo init`.' });\n }\n\n // clean up\n if (viteServer) {\n await viteServer?.close();\n }\n\n return {\n config,\n configPath: resolvedConfigPath!,\n };\n } catch (err) {\n printError((err as Error).message);\n\n // clean up\n if (viteServer) {\n await viteServer.close();\n }\n\n process.exit(1);\n }\n}\n\n/** load tokens */\nexport async function loadTokens(tokenPaths: URL[], { logger }: { logger: Logger }) {\n try {\n const allTokens = [];\n\n if (!Array.isArray(tokenPaths)) {\n logger.error({ group: 'config', message: `loadTokens: Expected array, received ${typeof tokenPaths}` });\n }\n\n // if this is the default value, also check for tokens.yaml\n if (tokenPaths.length === 1 && tokenPaths[0]!.href === DEFAULT_TOKENS_PATH.href) {\n if (!fs.existsSync(tokenPaths[0]!)) {\n const yamlPath = new URL('./tokens.yaml', cwd);\n if (fs.existsSync(yamlPath)) {\n tokenPaths[0] = yamlPath;\n } else {\n logger.error({\n group: 'config',\n message: `Could not locate ${path.relative(cwd.href, tokenPaths[0]!.href)}. To create one, run \\`npx tz init\\`.`,\n });\n return;\n }\n }\n }\n\n // download/read\n for (let i = 0; i < tokenPaths.length; i++) {\n const filename = tokenPaths[i];\n\n if (!(filename instanceof URL)) {\n logger.error({ group: 'config', message: `Expected URL, received ${filename}`, label: `loadTokens[${i}]` });\n return;\n } else if (filename.protocol === 'http:' || filename.protocol === 'https:') {\n try {\n // if Figma URL\n if (filename.host === 'figma.com' || filename.host === 'www.figma.com') {\n const [_, fileKeyword, fileKey] = filename.pathname.split('/');\n if (fileKeyword !== 'file' || !fileKey) {\n logger.error({\n group: 'config',\n message: `Unexpected Figma URL. Expected \"https://www.figma.com/file/:file_key/:file_name?…\", received \"${filename.href}\"`,\n });\n }\n const headers = new Headers({\n Accept: '*/*',\n 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:123.0) Gecko/20100101 Firefox/123.0',\n });\n if (process.env.FIGMA_ACCESS_TOKEN) {\n headers.set('X-FIGMA-TOKEN', process.env.FIGMA_ACCESS_TOKEN);\n } else {\n logger.warn({ group: 'config', message: 'FIGMA_ACCESS_TOKEN not set' });\n }\n const res = await fetch(`https://api.figma.com/v1/files/${fileKey}/variables/local`, {\n method: 'GET',\n headers,\n });\n if (res.ok) {\n allTokens.push({ filename, src: await res.text() });\n }\n const message = res.status !== 404 ? JSON.stringify(await res.json(), undefined, 2) : '';\n logger.error({\n group: 'config',\n message: `Figma responded with ${res.status}${message ? `:\\n${message}` : ''}`,\n });\n break;\n }\n\n // otherwise, expect YAML/JSON\n const res = await fetch(filename, {\n method: 'GET',\n headers: { Accept: '*/*', 'User-Agent': 'Mozilla/5.0 Gecko/20100101 Firefox/123.0' },\n });\n allTokens.push({ filename, src: await res.text() });\n } catch (err) {\n logger.error({ group: 'config', message: `${filename.href}: ${err}` });\n return;\n }\n } else {\n if (fs.existsSync(filename)) {\n allTokens.push({ filename, src: fs.readFileSync(filename, 'utf8') });\n } else {\n logger.error({\n group: 'config',\n message: `Could not locate ${path.relative(cwd.href, filename.href)}. To create one, run \\`npx tz init\\`.`,\n });\n return;\n }\n }\n }\n\n return allTokens;\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n}\n\n/** Print error */\nexport function printError(message: string) {\n console.error(pc.red(`✗ ${message}`));\n}\n\n/** Print success */\nexport function printSuccess(message: string, startTime?: number) {\n console.log(`${GREEN_CHECK} ${message}${startTime ? ` ${time(startTime)}` : ''}`);\n}\n\n/** Resolve config */\nexport function resolveConfig(filename?: string): string | undefined {\n // --config [configpath]\n if (filename && fs.existsSync(new URL(filename, cwd))) {\n return filename;\n }\n // note: the order isn’t significant; just try for most-common first.\n // if a user has multiple config files with different extensions that’s their fault\n for (const ext of ['.ts', '.js', '.mts', '.cts', '.mjs', '.cjs']) {\n const maybeFilename = `terrazzo.config${ext}`;\n if (fs.existsSync(new URL(maybeFilename, cwd))) {\n return fileURLToPath(new URL(maybeFilename, cwd));\n }\n }\n}\n\n/** Resolve tokens.json path (for lint command) */\nexport function resolveTokenPath(filename: string, { logger }: { logger: Logger }) {\n const tokensPath = new URL(filename, cwd);\n if (!fs.existsSync(tokensPath)) {\n logger.error({ group: 'config', message: `Could not locate ${filename}. Does the file exist?` });\n } else if (!fs.statSync(tokensPath).isFile()) {\n logger.error({ group: 'config', message: `Expected JSON or YAML file, received ${filename}.` });\n }\n return tokensPath;\n}\n\n/** Print time elapsed */\nexport function time(start: number) {\n const diff = performance.now() - start;\n return pc.dim(diff < 750 ? `${Math.round(diff)}ms` : `${(diff / 1000).toFixed(1)}s`);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { type BuildRunnerResult, build, type ConfigInit, type Logger, parse } from '@terrazzo/parser';\nimport chokidar from 'chokidar';\nimport pc from 'picocolors';\nimport yamlToMomoa from 'yaml-to-momoa';\nimport {\n cwd,\n DEFAULT_TOKENS_PATH,\n type Flags,\n GREEN_CHECK,\n loadTokens,\n printError,\n printSuccess,\n resolveConfig,\n} from './shared.js';\n\nexport interface BuildOptions {\n flags: Flags;\n config: ConfigInit;\n configPath: string;\n logger: Logger;\n}\n\n/** tz build */\nexport async function buildCmd({ config, configPath, flags, logger }: BuildOptions) {\n try {\n const startTime = performance.now();\n if (!Array.isArray(config.plugins) || !config.plugins.length) {\n logger.error({\n group: 'config',\n message: `No plugins defined! Add some in ${configPath || 'terrazzo.config.ts'}`,\n });\n }\n\n // first build\n let rawSchemas = await loadTokens(config.tokens, { logger });\n if (!rawSchemas) {\n logger.error({\n group: 'config',\n message: `Error loading ${path.relative(fileURLToPath(cwd), fileURLToPath(config.tokens[0] || DEFAULT_TOKENS_PATH))}`,\n });\n return;\n }\n let { tokens, resolver, sources } = await parse(rawSchemas, { config, logger, yamlToMomoa });\n let result = await build(tokens, { resolver, sources, config, logger });\n writeFiles(result, { config, logger });\n\n // --watch (handle rebuild)\n if (flags.watch) {\n const dt = new Intl.DateTimeFormat('en-us', {\n hour: '2-digit',\n minute: '2-digit',\n });\n\n async function rebuild({ messageBefore, messageAfter }: { messageBefore?: string; messageAfter?: string } = {}) {\n try {\n if (messageBefore) {\n logger.info({ group: 'plugin', label: 'watch', message: messageBefore });\n }\n rawSchemas = await loadTokens(config.tokens, { logger });\n if (!rawSchemas) {\n throw new Error(\n `Error loading ${path.relative(fileURLToPath(cwd), fileURLToPath(config.tokens[0] || DEFAULT_TOKENS_PATH))}`,\n );\n }\n const parseResult = await parse(rawSchemas, { config, logger, yamlToMomoa });\n tokens = parseResult.tokens;\n sources = parseResult.sources;\n resolver = parseResult.resolver;\n result = await build(tokens, { resolver, sources, config, logger });\n if (messageAfter) {\n logger.info({ group: 'plugin', label: 'watch', message: messageAfter });\n }\n writeFiles(result, { config, logger });\n } catch (err) {\n console.error(pc.red(`✗ ${(err as Error).message || (err as string)}`));\n // don’t exit! we’re watching, so continue as long as possible\n }\n }\n\n const tokenWatcher = chokidar.watch(config.tokens.map((filename) => fileURLToPath(filename)));\n tokenWatcher.on('change', async (filename) => {\n await rebuild({\n messageBefore: `${pc.dim(dt.format(new Date()))} ${pc.green('tz')}} ${pc.yellow(filename)} updated ${GREEN_CHECK}`,\n });\n });\n const configWatcher = chokidar.watch(resolveConfig(configPath)!);\n configWatcher.on('change', async () => {\n await rebuild({\n messageBefore: `${pc.dim(dt.format(new Date()))} ${pc.green('tz')} ${pc.yellow('Config updated. Reloading…')}`,\n });\n });\n\n // keep process occupied\n await new Promise(() => {});\n } else {\n printSuccess(\n `${Object.keys(tokens).length} token${Object.keys(tokens).length !== 1 ? 's' : ''} built`,\n startTime,\n );\n }\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n}\n\n/** Write files */\nexport function writeFiles(result: BuildRunnerResult, { config, logger }: { config: ConfigInit; logger: Logger }) {\n for (const { filename, contents } of result.outputFiles) {\n const output = new URL(filename, config.outDir);\n fs.mkdirSync(new URL('.', output), { recursive: true });\n fs.writeFileSync(output, contents);\n logger.debug({ group: 'parser', label: 'buildEnd', message: `Wrote file ${fileURLToPath(output)}` });\n }\n}\n","import { type ConfigInit, type Logger, parse } from '@terrazzo/parser';\nimport yamlToMomoa from 'yaml-to-momoa';\nimport { loadTokens, printError, printSuccess, resolveTokenPath } from './shared.js';\n\nexport interface CheckOptions {\n /** positional CLI args */\n positionals: string[];\n config: ConfigInit;\n logger: Logger;\n}\n\n/** tz check */\nexport async function checkCmd({ config, logger, positionals }: CheckOptions) {\n try {\n const startTime = performance.now();\n const tokenPaths = positionals.slice(1).length\n ? positionals.slice(1).map((tokenPath) => resolveTokenPath(tokenPath, { logger }))\n : config.tokens;\n const sources = await loadTokens(tokenPaths, { logger });\n if (!sources?.length) {\n logger.error({ group: 'config', message: 'Couldn’t find any tokens. Run `npx tz init` to create some.' });\n return;\n }\n await parse(sources, { config, continueOnError: true, logger, yamlToMomoa }); // will throw if errors\n printSuccess('No errors', startTime);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n}\n","/** Show help */\nexport function helpCmd() {\n console.log(`tz\n [commands]\n build Build token artifacts from tokens.json\n --watch, -w Watch tokens.json for changes and recompile\n --no-lint Disable linters running on build\n check [path] Check tokens.json for errors and run linters\n lint [path] (alias of check)\n init Create a starter tokens.json file\n lab Manage your tokens with a web interface\n\n [options]\n --help Show this message\n --config, -c Path to config (default: ./terrazzo.config.ts)\n --quiet Suppress warnings\n`);\n}\n","import { exec } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { confirm, intro, multiselect, outro, select, spinner } from '@clack/prompts';\nimport type { Logger } from '@terrazzo/parser';\nimport { pluralize } from '@terrazzo/token-tools';\nimport { detect } from 'detect-package-manager';\nimport { generate } from 'escodegen';\nimport { type ESTree, parseModule } from 'meriyah';\nimport { cwd, DEFAULT_CONFIG_PATH, DEFAULT_TOKENS_PATH, loadConfig, printError } from './shared.js';\n\nconst INSTALL_COMMAND = {\n npm: 'install -D --silent',\n yarn: 'add -D --silent',\n pnpm: 'add -D --silent',\n bun: 'install -D --silent',\n};\n\n// Local copy of dtcg-examples/index.json. Copied partially for security (no\n// arbitrary injection of URL fetches), but also efficiency (saves a\n// round-trip).\ntype DesignSystem =\n | 'adobe-spectrum'\n | 'apple-hig'\n | 'figma-sds'\n | 'github-primer'\n | 'ibm-carbon'\n | 'microsoft-fluent'\n | 'radix'\n | 'salesforce-lightning'\n | 'shopify-polaris';\n\nconst DTCG_ROOT_URL = 'https://raw.githubusercontent.com/terrazzoapp/dtcg-examples/refs/heads/main/';\nconst DESIGN_SYSTEMS: Record<DesignSystem, { name: string; author: string; tokens: string[] }> = {\n 'adobe-spectrum': {\n name: 'Spectrum',\n author: 'Adobe',\n tokens: ['adobe-spectrum.json'],\n },\n 'apple-hig': {\n name: 'Human Interface Guidelines',\n author: 'Apple',\n tokens: ['apple-hig.json'],\n },\n 'figma-sds': {\n name: 'Simple Design System',\n author: 'Figma',\n tokens: ['figma-sds.json'],\n },\n 'github-primer': {\n name: 'Primer',\n author: 'GitHub',\n tokens: ['github-primer.json'],\n },\n 'ibm-carbon': {\n name: 'Carbon',\n author: 'IBM',\n tokens: ['ibm-carbon.json'],\n },\n 'microsoft-fluent': {\n name: 'Fluent',\n author: 'Microsoft',\n tokens: ['microsoft-fluent.json'],\n },\n radix: {\n name: 'Radix',\n author: 'Radix',\n tokens: ['radix.json'],\n },\n 'salesforce-lightning': {\n name: 'Lightning',\n author: 'Salesforce',\n tokens: ['salesforce-lightning.json'],\n },\n 'shopify-polaris': {\n name: 'Polaris',\n author: 'Shopify',\n tokens: ['shopify-polaris.json'],\n },\n};\n\nexport interface InitOptions {\n logger: Logger;\n}\n\nexport async function initCmd({ logger }: InitOptions) {\n try {\n intro('⛋ Welcome to Terrazzo');\n const packageManager = await detect({ cwd: fileURLToPath(cwd) });\n\n // TODO: pass in CLI flags?\n const { config, configPath } = await loadConfig({ cmd: 'init', flags: {}, logger });\n const relConfigPath = configPath\n ? path.relative(fileURLToPath(cwd), fileURLToPath(new URL(configPath)))\n : undefined;\n\n let tokensPath = config.tokens[0]!;\n let startFromDS = !(tokensPath && fs.existsSync(tokensPath));\n\n // 1. tokens\n if (tokensPath && fs.existsSync(tokensPath)) {\n if (\n await confirm({\n message: `Found tokens at ${path.relative(fileURLToPath(cwd), fileURLToPath(tokensPath))}. Overwrite with a new design system?`,\n })\n ) {\n startFromDS = true;\n }\n } else {\n tokensPath = DEFAULT_TOKENS_PATH;\n }\n\n if (startFromDS) {\n const ds = DESIGN_SYSTEMS[\n (await select({\n message: 'Start from existing design system?',\n options: [\n ...Object.entries(DESIGN_SYSTEMS).map(([id, { author, name }]) => ({\n value: id,\n label: `${author} ${name}`,\n })),\n { value: 'none', label: 'None' },\n ],\n })) as keyof typeof DESIGN_SYSTEMS\n ] as (typeof DESIGN_SYSTEMS)[DesignSystem] | undefined;\n if (ds) {\n // TODO: support multiple tokens files?\n const s = spinner();\n s.start('Downloading');\n const tokenSource = await fetch(new URL(ds.tokens[0]!, DTCG_ROOT_URL)).then((res) => res.text());\n fs.writeFileSync(tokensPath, tokenSource);\n s.stop('Download complete');\n }\n }\n\n // 2. plugins\n const existingPlugins = config.plugins.map((p) => p.name);\n const pluginSelection = await multiselect({\n message: 'Install plugins?',\n options: [\n { value: ['@terrazzo/plugin-css'], label: 'CSS' },\n { value: ['@terrazzo/plugin-js'], label: 'JS + TS' },\n { value: ['@terrazzo/plugin-css', '@terrazzo/plugin-sass'], label: 'Sass' },\n { value: ['@terrazzo/plugin-tailwind'], label: 'Tailwind' },\n ],\n required: false,\n });\n const newPlugins = Array.isArray(pluginSelection)\n ? Array.from(new Set(pluginSelection.flat().filter((p) => !existingPlugins.includes(p))))\n : [];\n if (newPlugins?.length) {\n const plugins = newPlugins.map((p) => ({ specifier: p.replace('@terrazzo/plugin-', ''), package: p }));\n const pluginCount = `${newPlugins.length} ${pluralize(newPlugins.length, 'plugin', 'plugins')}`;\n\n const s = spinner();\n s.start(`Installing ${pluginCount}`);\n // note: thi sis async to show the spinner\n await new Promise((resolve, reject) => {\n const subprocess = exec([packageManager, INSTALL_COMMAND[packageManager], newPlugins.join(' ')].join(' '), {\n cwd,\n });\n subprocess.on('error', reject);\n subprocess.on('exit', resolve);\n });\n s.message('Updating config');\n if (configPath) {\n const ast = parseModule(fs.readFileSync(configPath, 'utf8'));\n const astExport = ast.body.find((node) => node.type === 'ExportDefaultDeclaration');\n\n // 2a. add plugin imports\n // note: this has the potential to duplicate plugins, but we tried our\n // best to filter already, and this may be the user’s fault if they\n // selected to install a plugin already installed. But also, this is\n // easily-fixable, so let’s not waste too much time here (and possibly\n // introduce bugs).\n ast.body.push(\n ...plugins.map(\n (p) =>\n ({\n type: 'ImportDeclaration',\n source: { type: 'Literal', value: p.package },\n specifiers: [{ type: 'ImportDefaultSpecifier', local: { type: 'Identifier', name: p.specifier } }],\n attributes: [],\n }) as ESTree.ImportDeclaration,\n ),\n );\n\n // 2b. add plugins to config.plugins\n if (!astExport) {\n logger.error({ group: 'config', message: `SyntaxError: ${relConfigPath} does not have default export.` });\n return;\n }\n const astConfig = (\n astExport.declaration.type === 'CallExpression'\n ? // export default defineConfig({ ... })\n astExport.declaration.arguments[0]\n : // export default { ... }\n astExport.declaration\n ) as ESTree.ObjectExpression;\n if (astConfig.type !== 'ObjectExpression') {\n logger.error({\n group: 'config',\n message: `Config: expected object default export, received ${astConfig.type}`,\n });\n return;\n }\n const pluginsArray = (\n astConfig.properties.find(\n (property) =>\n property.type === 'Property' && property.key.type === 'Identifier' && property.key.name === 'plugins', // ASTs are so fun 😑\n ) as ESTree.Property\n )?.value as ESTree.ArrayExpression | undefined;\n const pluginsAst = plugins.map(\n (p) =>\n ({\n type: 'CallExpression' as const,\n callee: {\n type: 'Identifier' as const,\n name: p.specifier,\n },\n arguments: [],\n optional: false,\n }) as ESTree.CallExpression,\n );\n if (pluginsArray) {\n pluginsArray.elements.push(...pluginsAst);\n } else {\n astConfig.properties.push({\n type: 'Property',\n key: { type: 'Identifier', name: 'plugins' },\n value: { type: 'ArrayExpression', elements: pluginsAst },\n kind: 'init',\n computed: false,\n method: false,\n shorthand: false,\n });\n }\n\n // 2c. update new file (and we’ll probably format it wrong but hey)\n fs.writeFileSync(\n configPath,\n generate(ast, {\n format: {\n indent: { style: ' ' },\n quotes: 'single',\n semicolons: true,\n },\n }),\n );\n } else {\n // 2a. write new config file (easy)\n fs.writeFileSync(\n DEFAULT_CONFIG_PATH,\n `import { defineConfig } from '@terrazzo/cli';\n${plugins.map((p) => `import ${p.specifier} from '${p.package}';`).join('\\n')}\n\nexport default defineConfig({\n tokens: ['./tokens.json'],\n plugins: [\n ${plugins.map((p) => `${p.specifier}(),`).join('\\n ')}\n ],\n outDir: './dist/',\n lint: {\n /** @see https://terrazzo.app/docs/linting */\n build: {\n enabled: true,\n },\n rules: {\n 'core/valid-color': 'error',\n 'core/valid-dimension': 'error',\n 'core/valid-font-family': 'error',\n 'core/valid-font-weight': 'error',\n 'core/valid-duration': 'error',\n 'core/valid-cubic-bezier': 'error',\n 'core/valid-number': 'error',\n 'core/valid-link': 'error',\n 'core/valid-boolean': 'error',\n 'core/valid-string': 'error',\n 'core/valid-stroke-style': 'error',\n 'core/valid-border': 'error',\n 'core/valid-transition': 'error',\n 'core/valid-shadow': 'error',\n 'core/valid-gradient': 'error',\n 'core/valid-typography': 'error',\n 'core/consistent-naming': 'warn',\n },\n },\n});`,\n );\n }\n s.stop(`Installed ${pluginCount}`);\n }\n\n outro('⛋ Done! 🎉');\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n}\n","import { createReadStream, createWriteStream, type PathLike } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { Readable, Writable } from 'node:stream';\nimport { fileURLToPath } from 'node:url';\nimport { serve } from '@hono/node-server';\nimport type { ConfigInit, Logger } from '@terrazzo/parser';\nimport mime from 'mime';\nimport type { Flags } from './shared.js';\n\nexport interface LabBuildOptions {\n flags: Flags;\n config: ConfigInit;\n configPath: string;\n logger: Logger;\n}\n\nexport async function labCmd({ config, logger }: LabBuildOptions) {\n /** TODO: handle multiple files */\n const [tokenFileUrl] = config.tokens;\n\n const staticFiles = new Set();\n const dirEntries = await readdir(fileURLToPath(import.meta.resolve('./lab')), {\n withFileTypes: true,\n recursive: true,\n });\n for (const entry of dirEntries) {\n if (entry.isFile() === false) {\n continue;\n }\n const absolutePath = `${entry.parentPath.replaceAll('\\\\', '/')}/${entry.name}`;\n staticFiles.add(absolutePath.replace(fileURLToPath(import.meta.resolve('./lab')).replaceAll('\\\\', '/'), ''));\n }\n\n const server = serve(\n {\n port: 9000,\n overrideGlobalObjects: false,\n async fetch(request) {\n const url = new URL(request.url);\n const pathname = url.pathname;\n if (pathname === '/') {\n return new Response(\n Readable.toWeb(createReadStream(fileURLToPath(import.meta.resolve('./lab/index.html')))) as ReadableStream,\n {\n headers: {\n 'Content-Type': 'text/html',\n },\n },\n );\n }\n if (pathname === '/api/tokens') {\n if (request.method === 'GET') {\n return new Response(Readable.toWeb(createReadStream(tokenFileUrl as PathLike)) as ReadableStream, {\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n },\n });\n } else if (request.method === 'POST' && request.body) {\n await request.body.pipeTo(Writable.toWeb(createWriteStream(tokenFileUrl as PathLike)));\n return new Response(JSON.stringify({ success: true }), {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n }\n }\n\n if (staticFiles.has(pathname)) {\n return new Response(\n Readable.toWeb(createReadStream(fileURLToPath(import.meta.resolve(`./lab${pathname}`)))) as ReadableStream,\n {\n headers: { 'Content-Type': mime.getType(pathname) ?? 'application/octet-stream' },\n },\n );\n }\n return new Response('Not found', { status: 404 });\n },\n },\n (info) => {\n logger.info({\n group: 'server',\n message: `Token Lab running at http://${info.address === '::' ? 'localhost' : info.address}:${info.port}`,\n });\n },\n );\n /**\n * The cli entrypoint is going to manually exit the process after labCmd returns.\n */\n await new Promise<void>((resolve, reject) => {\n server.on('close', resolve);\n server.on('error', reject);\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport * as momoa from '@humanwhocodes/momoa';\nimport { getObjMember, getObjMembers, traverse } from '@terrazzo/json-schema-tools';\nimport { defineConfig, type Logger, parse } from '@terrazzo/parser';\nimport { isAlias } from '@terrazzo/token-tools';\nimport { cwd, printError } from './shared.js';\n\nexport interface NormalizeOptions {\n logger: Logger;\n output: URL;\n}\n\nfunction findMember(name: string) {\n return function (member: momoa.MemberNode) {\n return member.name.type === 'String' && member.name.value === name;\n };\n}\n\nexport async function normalizeCmd(filename: string, { logger, output }: NormalizeOptions) {\n try {\n if (!filename) {\n logger.error({ group: 'config', message: 'Expected input: `tz normalize <tokens.json> -o output.json`' });\n return;\n }\n const sourceLoc = new URL(filename, cwd);\n if (!fs.existsSync(sourceLoc)) {\n logger.error({\n group: 'config',\n message: `Couldn’t find ${path.relative(cwd.href, sourceLoc.href)}. Does it exist?`,\n });\n }\n const sourceData = fs.readFileSync(sourceLoc, 'utf8');\n const document = momoa.parse(sourceData, { mode: 'jsonc' });\n const { tokens } = await parse([{ src: sourceData, filename: sourceLoc }], {\n config: defineConfig(\n {\n lint: {\n rules: {\n 'core/valid-color': 'off',\n 'core/valid-dimension': 'off',\n 'core/valid-duration': 'off',\n 'core/valid-typography': 'off',\n },\n },\n },\n { cwd },\n ),\n logger,\n });\n\n traverse(document, {\n enter(node, _parent, nodePath) {\n const token = tokens[nodePath.join('.')];\n if (!token || token.aliasOf || node.type !== 'Member' || node.value.type !== 'Object') {\n return;\n }\n const $valueI = node.value.members.findIndex(findMember('$value'));\n\n switch (token.$type) {\n case 'color': {\n if (node.value.members[$valueI]!.value.type === 'String') {\n if (isAlias(node.value.members[$valueI]!.value.value)) {\n return;\n }\n const hex = (node.value.members[$valueI]!.value as momoa.StringNode).value;\n node.value.members[$valueI]!.value = momoa.parse(\n JSON.stringify({\n ...token.$value,\n hex: hex.startsWith('#') ? hex.slice(0, 7) : undefined,\n }),\n ).body;\n const $extensions = getObjMember(node.value, '$extensions');\n if ($extensions?.type === 'Object') {\n const mode = getObjMember($extensions, 'mode');\n if (mode?.type === 'Object') {\n for (let i = 0; i < mode.members.length; i++) {\n const modeName = (mode.members[i]!.name as momoa.StringNode).value;\n const hex = (mode.members[i]!.value as momoa.StringNode).value;\n mode.members[i]!.value = momoa.parse(\n JSON.stringify({\n ...token.mode[modeName]!.$value,\n hex: hex.startsWith('#') ? hex.slice(0, 7) : undefined,\n }),\n ).body;\n }\n }\n }\n }\n break;\n }\n case 'dimension':\n case 'duration': {\n if (node.value.members[$valueI]!.value.type === 'String') {\n if (isAlias(node.value.members[$valueI]!.value.value)) {\n return;\n }\n node.value.members[$valueI]!.value = normalizeDurationDimension(node.value.members[$valueI]!.value);\n const $extensions = getObjMember(node.value, '$extensions');\n if ($extensions?.type === 'Object') {\n const mode = getObjMember($extensions, 'mode');\n if (mode?.type === 'Object') {\n for (let i = 0; i < mode.members.length; i++) {\n mode.members[i]!.value = normalizeDurationDimension(node.value.members[$valueI]!.value);\n }\n }\n }\n }\n break;\n }\n case 'typography': {\n if (node.value.members[$valueI]?.value.type !== 'Object') {\n return;\n }\n node.value.members[$valueI].value = normalizeTypography(node.value.members[$valueI].value);\n const $extensions = getObjMember(node.value, '$extensions');\n if ($extensions?.type === 'Object') {\n const mode = getObjMember($extensions, 'mode');\n if (mode?.type === 'Object') {\n for (let i = 0; i < mode.members.length; i++) {\n mode.members[i]!.value = normalizeTypography(mode.members[i]!.value as momoa.ObjectNode);\n }\n }\n }\n }\n }\n },\n });\n\n const outputLoc = new URL(output, cwd);\n fs.mkdirSync(new URL('.', outputLoc), { recursive: true });\n fs.writeFileSync(outputLoc, momoa.print(document, { indent: 2 }));\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n}\n\nfunction normalizeDurationDimension(node: momoa.StringNode) {\n const value = Number.parseFloat(node.value);\n if (!Number.isFinite(value)) {\n return node;\n }\n (node as any).type = 'Object';\n (node as any).members = (\n momoa.parse(JSON.stringify({ value, unit: node.value.replace(String(value), '') })).body as momoa.ObjectNode\n ).members;\n delete (node as any).value;\n return node;\n}\n\nfunction normalizeTypography(node: momoa.ObjectNode) {\n const { fontFamily, fontSize, fontWeight, letterSpacing, lineHeight } = getObjMembers(node);\n if (!fontFamily) {\n node.members.push((momoa.parse('{\"fontFamily\":[\"inherit\"]}').body as momoa.ObjectNode).members[0]!);\n }\n if (!fontSize) {\n node.members.push((momoa.parse('{\"fontSize\":{\"value\":1,\"unit\":\"rem\"}}').body as momoa.ObjectNode).members[0]!);\n }\n if (!fontWeight) {\n node.members.push((momoa.parse('{\"fontWeight\":400}').body as momoa.ObjectNode).members[0]!);\n }\n if (!letterSpacing) {\n node.members.push((momoa.parse('{\"letterSpacing\":{\"value\":0,\"unit\":\"rem\"}}').body as momoa.ObjectNode).members[0]!);\n }\n if (!lineHeight) {\n node.members.push((momoa.parse('{\"lineHeight\":1}').body as momoa.ObjectNode).members[0]!);\n }\n return node;\n}\n","import fs from 'node:fs';\n\nexport function versionCmd() {\n const { version } = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url), 'utf8'));\n console.log(version);\n}\n","import { createRequire } from 'node:module';\nimport { pathToFileURL } from 'node:url';\nimport { type Config, type ConfigInit, defineConfig as defineConfigCore } from '@terrazzo/parser';\nimport { cwd } from './shared.js';\n\nexport * from './build.js';\nexport * from './check.js';\nexport * from './help.js';\nexport * from './init.js';\nexport * from './lab.js';\nexport * from './normalize.js';\nexport * from './shared.js';\nexport * from './version.js';\n\nconst require = createRequire(cwd);\n\n// wrap defineConfig from @terrazzo/parser and add Node.js resolution\nexport function defineConfig(config: Config): ConfigInit {\n const normalizedConfig: Config = { ...config }; // note: we only need a shallow copy because we’re only mutating top-level `tokens`\n\n // Resolve tokens from npm modules, if any\n if (typeof normalizedConfig.tokens === 'string' || Array.isArray(normalizedConfig.tokens)) {\n normalizedConfig.tokens = (\n Array.isArray(normalizedConfig.tokens) ? normalizedConfig.tokens : [normalizedConfig.tokens]\n ).map((tokenPath) => {\n if (tokenPath.startsWith('.') || /^(https?|file):\\/\\//i.test(tokenPath)) {\n return tokenPath;\n }\n try {\n return pathToFileURL(require.resolve(tokenPath));\n } catch (err) {\n console.error(err);\n // this will throw an error if Node couldn’t automatically resolve it,\n // which will be true for many token paths. We don’t need to surface\n // that error; it’ll get its own error down the line if it’s a bad path.\n return tokenPath;\n }\n }) as string[];\n }\n\n return defineConfigCore(normalizedConfig, { cwd });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["defineConfig","res","defineConfig","hex","defineConfigCore"],"sources":["../src/shared.ts","../src/build.ts","../src/check.ts","../src/help.ts","../src/init.ts","../src/lab.ts","../src/normalize.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport { type ConfigInit, defineConfig, type Logger } from '@terrazzo/parser';\nimport pc from 'picocolors';\nimport { createServer, type ViteDevServer } from 'vite';\nimport { ViteNodeRunner } from 'vite-node/client';\nimport { ViteNodeServer } from 'vite-node/server';\n\nexport const cwd = new URL(`${pathToFileURL(process.cwd())}/`); // trailing slash needed to interpret as directory\nexport const DEFAULT_CONFIG_PATH = new URL('./terrazzo.config.ts', cwd);\nexport const DEFAULT_TOKENS_PATH = new URL('./tokens.json', cwd);\n\nexport type Command = 'build' | 'check' | 'help' | 'init' | 'version';\n\nexport const GREEN_CHECK = pc.green('✔');\n\nexport interface Flags {\n /** --config, -c */\n config?: string;\n /** --out, -o */\n out?: string;\n /** --help */\n help?: boolean;\n /** --watch, -w */\n watch?: boolean;\n /** --version */\n version?: boolean;\n}\n\nexport interface LoadConfigOptions {\n cmd: Command;\n flags: Flags;\n logger: Logger;\n}\n\n/** Load config */\nexport async function loadConfig({ cmd, flags, logger }: LoadConfigOptions) {\n /**\n * Vite server for loading .ts config files\n * TODO: remove me when Node 24 is the oldest-supported Node version\n */\n let viteServer: ViteDevServer | undefined;\n try {\n let config: ConfigInit = {\n tokens: [DEFAULT_TOKENS_PATH],\n outDir: new URL('./tokens/', cwd),\n plugins: [],\n lint: {\n build: { enabled: true },\n rules: {},\n },\n alphabetize: false,\n ignore: { tokens: [], deprecated: false },\n };\n let configPath: string | undefined;\n\n if (typeof flags.config === 'string') {\n if (flags.config === '') {\n logger.error({ group: 'config', message: 'Missing path after --config flag' });\n process.exit(1);\n }\n configPath = resolveConfig(flags.config);\n if (!configPath) {\n logger.error({ group: 'config', message: `Could not locate ${flags.config}` });\n }\n }\n\n const resolvedConfigPath = resolveConfig(configPath);\n if (resolvedConfigPath) {\n try {\n // Note: we create a vite-node instance only when resolving the config,\n // because in most scenarios we only ever need this once and never again.\n // even in watch mode we don’t reload the config, so keeping a vite-node\n // “hot” instance doesn’t provide obvious benefits (only potential memory leaks)\n viteServer = await createServer({ mode: 'development' });\n const viteNodeServer = new ViteNodeServer(viteServer);\n const viteNodeRunner = new ViteNodeRunner({\n root: viteServer.config.root,\n base: viteServer.config.base,\n fetchModule(...args) {\n return viteNodeServer.fetchModule(...args);\n },\n resolveId(...args) {\n return viteNodeServer.resolveId(...args);\n },\n });\n const mod = await viteNodeRunner.executeFile(resolvedConfigPath);\n if (!mod.default) {\n // we format it immediately below\n throw new Error(\n `No default export found in ${resolvedConfigPath.replace(fileURLToPath(cwd), '')}. See https://terrazzo.dev/docs for instructions.`,\n );\n }\n config = defineConfig(mod.default, { cwd, logger });\n } catch (err) {\n logger.error({ group: 'config', message: (err as Error).message || (err as string) });\n }\n } else if (cmd !== 'init' && cmd !== 'check') {\n logger.error({ group: 'config', message: 'No config file found. Create one with `npx terrazzo init`.' });\n }\n\n // clean up\n if (viteServer) {\n await viteServer?.close();\n }\n\n return {\n config,\n configPath: resolvedConfigPath!,\n };\n } catch (err) {\n printError((err as Error).message);\n\n // clean up\n if (viteServer) {\n await viteServer.close();\n }\n\n process.exit(1);\n }\n}\n\n/** load tokens */\nexport async function loadTokens(tokenPaths: URL[], { logger }: { logger: Logger }) {\n try {\n const allTokens = [];\n\n if (!Array.isArray(tokenPaths)) {\n logger.error({ group: 'config', message: `loadTokens: Expected array, received ${typeof tokenPaths}` });\n }\n\n // if this is the default value, also check for tokens.yaml\n if (tokenPaths.length === 1 && tokenPaths[0]!.href === DEFAULT_TOKENS_PATH.href) {\n if (!fs.existsSync(tokenPaths[0]!)) {\n const yamlPath = new URL('./tokens.yaml', cwd);\n if (fs.existsSync(yamlPath)) {\n tokenPaths[0] = yamlPath;\n } else {\n logger.error({\n group: 'config',\n message: `Could not locate ${path.relative(cwd.href, tokenPaths[0]!.href)}. To create one, run \\`npx tz init\\`.`,\n });\n return;\n }\n }\n }\n\n // download/read\n for (let i = 0; i < tokenPaths.length; i++) {\n const filename = tokenPaths[i];\n\n if (!(filename instanceof URL)) {\n logger.error({ group: 'config', message: `Expected URL, received ${filename}`, label: `loadTokens[${i}]` });\n return;\n } else if (filename.protocol === 'http:' || filename.protocol === 'https:') {\n try {\n // if Figma URL\n if (filename.host === 'figma.com' || filename.host === 'www.figma.com') {\n const [_, fileKeyword, fileKey] = filename.pathname.split('/');\n if (fileKeyword !== 'file' || !fileKey) {\n logger.error({\n group: 'config',\n message: `Unexpected Figma URL. Expected \"https://www.figma.com/file/:file_key/:file_name?…\", received \"${filename.href}\"`,\n });\n }\n const headers = new Headers({\n Accept: '*/*',\n 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:123.0) Gecko/20100101 Firefox/123.0',\n });\n if (process.env.FIGMA_ACCESS_TOKEN) {\n headers.set('X-FIGMA-TOKEN', process.env.FIGMA_ACCESS_TOKEN);\n } else {\n logger.warn({ group: 'config', message: 'FIGMA_ACCESS_TOKEN not set' });\n }\n const res = await fetch(`https://api.figma.com/v1/files/${fileKey}/variables/local`, {\n method: 'GET',\n headers,\n });\n if (res.ok) {\n allTokens.push({ filename, src: await res.text() });\n }\n const message = res.status !== 404 ? JSON.stringify(await res.json(), undefined, 2) : '';\n logger.error({\n group: 'config',\n message: `Figma responded with ${res.status}${message ? `:\\n${message}` : ''}`,\n });\n break;\n }\n\n // otherwise, expect YAML/JSON\n const res = await fetch(filename, {\n method: 'GET',\n headers: { Accept: '*/*', 'User-Agent': 'Mozilla/5.0 Gecko/20100101 Firefox/123.0' },\n });\n allTokens.push({ filename, src: await res.text() });\n } catch (err) {\n logger.error({ group: 'config', message: `${filename.href}: ${err}` });\n return;\n }\n } else {\n if (fs.existsSync(filename)) {\n allTokens.push({ filename, src: fs.readFileSync(filename, 'utf8') });\n } else {\n logger.error({\n group: 'config',\n message: `Could not locate ${path.relative(cwd.href, filename.href)}. To create one, run \\`npx tz init\\`.`,\n });\n return;\n }\n }\n }\n\n return allTokens;\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n}\n\n/** Print error */\nexport function printError(message: string) {\n console.error(pc.red(`✗ ${message}`));\n}\n\n/** Print success */\nexport function printSuccess(message: string, startTime?: number) {\n console.log(`${GREEN_CHECK} ${message}${startTime ? ` ${time(startTime)}` : ''}`);\n}\n\n/** Resolve config */\nexport function resolveConfig(filename?: string): string | undefined {\n // --config [configpath]\n if (filename && fs.existsSync(new URL(filename, cwd))) {\n return filename;\n }\n // note: the order isn’t significant; just try for most-common first.\n // if a user has multiple config files with different extensions that’s their fault\n for (const ext of ['.ts', '.js', '.mts', '.cts', '.mjs', '.cjs']) {\n const maybeFilename = `terrazzo.config${ext}`;\n if (fs.existsSync(new URL(maybeFilename, cwd))) {\n return fileURLToPath(new URL(maybeFilename, cwd));\n }\n }\n}\n\n/** Resolve tokens.json path (for lint command) */\nexport function resolveTokenPath(filename: string, { logger }: { logger: Logger }) {\n const tokensPath = new URL(filename, cwd);\n if (!fs.existsSync(tokensPath)) {\n logger.error({ group: 'config', message: `Could not locate ${filename}. Does the file exist?` });\n } else if (!fs.statSync(tokensPath).isFile()) {\n logger.error({ group: 'config', message: `Expected JSON or YAML file, received ${filename}.` });\n }\n return tokensPath;\n}\n\n/** Print time elapsed */\nexport function time(start: number) {\n const diff = performance.now() - start;\n return pc.dim(diff < 750 ? `${Math.round(diff)}ms` : `${(diff / 1000).toFixed(1)}s`);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { type BuildRunnerResult, build, type ConfigInit, type Logger, parse } from '@terrazzo/parser';\nimport chokidar from 'chokidar';\nimport pc from 'picocolors';\nimport yamlToMomoa from 'yaml-to-momoa';\nimport {\n cwd,\n DEFAULT_TOKENS_PATH,\n type Flags,\n GREEN_CHECK,\n loadTokens,\n printError,\n printSuccess,\n resolveConfig,\n} from './shared.js';\n\nexport interface BuildOptions {\n flags: Flags;\n config: ConfigInit;\n configPath: string;\n logger: Logger;\n}\n\n/** tz build */\nexport async function buildCmd({ config, configPath, flags, logger }: BuildOptions) {\n try {\n const startTime = performance.now();\n if (!Array.isArray(config.plugins) || !config.plugins.length) {\n logger.error({\n group: 'config',\n message: `No plugins defined! Add some in ${configPath || 'terrazzo.config.ts'}`,\n });\n }\n\n // first build\n let rawSchemas = await loadTokens(config.tokens, { logger });\n if (!rawSchemas) {\n logger.error({\n group: 'config',\n message: `Error loading ${path.relative(fileURLToPath(cwd), fileURLToPath(config.tokens[0] || DEFAULT_TOKENS_PATH))}`,\n });\n return;\n }\n let { tokens, resolver, sources } = await parse(rawSchemas, { config, logger, yamlToMomoa });\n let result = await build(tokens, { resolver, sources, config, logger });\n writeFiles(result, { config, logger });\n\n // --watch (handle rebuild)\n if (flags.watch) {\n const dt = new Intl.DateTimeFormat('en-us', {\n hour: '2-digit',\n minute: '2-digit',\n });\n\n async function rebuild({ messageBefore, messageAfter }: { messageBefore?: string; messageAfter?: string } = {}) {\n try {\n if (messageBefore) {\n logger.info({ group: 'plugin', label: 'watch', message: messageBefore });\n }\n rawSchemas = await loadTokens(config.tokens, { logger });\n if (!rawSchemas) {\n throw new Error(\n `Error loading ${path.relative(fileURLToPath(cwd), fileURLToPath(config.tokens[0] || DEFAULT_TOKENS_PATH))}`,\n );\n }\n const parseResult = await parse(rawSchemas, { config, logger, yamlToMomoa });\n tokens = parseResult.tokens;\n sources = parseResult.sources;\n resolver = parseResult.resolver;\n result = await build(tokens, { resolver, sources, config, logger });\n if (messageAfter) {\n logger.info({ group: 'plugin', label: 'watch', message: messageAfter });\n }\n writeFiles(result, { config, logger });\n } catch (err) {\n console.error(pc.red(`✗ ${(err as Error).message || (err as string)}`));\n // don’t exit! we’re watching, so continue as long as possible\n }\n }\n\n const tokenWatcher = chokidar.watch(config.tokens.map((filename) => fileURLToPath(filename)));\n tokenWatcher.on('change', async (filename) => {\n await rebuild({\n messageBefore: `${pc.dim(dt.format(new Date()))} ${pc.green('tz')}} ${pc.yellow(filename)} updated ${GREEN_CHECK}`,\n });\n });\n const configWatcher = chokidar.watch(resolveConfig(configPath)!);\n configWatcher.on('change', async () => {\n await rebuild({\n messageBefore: `${pc.dim(dt.format(new Date()))} ${pc.green('tz')} ${pc.yellow('Config updated. Reloading…')}`,\n });\n });\n\n // keep process occupied\n await new Promise(() => {});\n } else {\n printSuccess(\n `${Object.keys(tokens).length} token${Object.keys(tokens).length !== 1 ? 's' : ''} built`,\n startTime,\n );\n }\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n}\n\n/** Write files */\nexport function writeFiles(result: BuildRunnerResult, { config, logger }: { config: ConfigInit; logger: Logger }) {\n for (const { filename, contents } of result.outputFiles) {\n const output = new URL(filename, config.outDir);\n fs.mkdirSync(new URL('.', output), { recursive: true });\n fs.writeFileSync(output, contents);\n logger.debug({ group: 'parser', label: 'buildEnd', message: `Wrote file ${fileURLToPath(output)}` });\n }\n}\n","import { type ConfigInit, type Logger, parse } from '@terrazzo/parser';\nimport yamlToMomoa from 'yaml-to-momoa';\nimport { loadTokens, printError, printSuccess, resolveTokenPath } from './shared.js';\n\nexport interface CheckOptions {\n /** positional CLI args */\n positionals: string[];\n config: ConfigInit;\n logger: Logger;\n}\n\n/** tz check */\nexport async function checkCmd({ config, logger, positionals }: CheckOptions) {\n try {\n const startTime = performance.now();\n const tokenPaths = positionals.slice(1).length\n ? positionals.slice(1).map((tokenPath) => resolveTokenPath(tokenPath, { logger }))\n : config.tokens;\n const sources = await loadTokens(tokenPaths, { logger });\n if (!sources?.length) {\n logger.error({ group: 'config', message: 'Couldn’t find any tokens. Run `npx tz init` to create some.' });\n return;\n }\n await parse(sources, { config, continueOnError: true, logger, yamlToMomoa }); // will throw if errors\n printSuccess('No errors', startTime);\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n}\n","/** Show help */\nexport function helpCmd() {\n console.log(`tz\n [commands]\n build Build token artifacts from tokens.json\n --watch, -w Watch tokens.json for changes and recompile\n --no-lint Disable linters running on build\n check [path] Check tokens.json for errors and run linters\n lint [path] (alias of check)\n init Create a starter tokens.json file\n lab Manage your tokens with a web interface\n\n [options]\n --help Show this message\n --config, -c Path to config (default: ./terrazzo.config.ts)\n --quiet Suppress warnings\n`);\n}\n","import { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { confirm, intro, multiselect, outro, select, spinner } from '@clack/prompts';\nimport type { Logger } from '@terrazzo/parser';\nimport { pluralize } from '@terrazzo/token-tools';\nimport { detect } from 'detect-package-manager';\nimport { generate } from 'escodegen';\nimport { type ESTree, parseModule } from 'meriyah';\nimport { cwd, DEFAULT_CONFIG_PATH, DEFAULT_TOKENS_PATH, loadConfig, printError } from './shared.js';\n\nconst INSTALL_COMMAND = {\n npm: 'install -D --silent',\n yarn: 'add -D --silent',\n pnpm: 'add -D --silent',\n bun: 'install -D --silent',\n};\n\n// Local copy of dtcg-examples/index.json. Copied partially for security (no\n// arbitrary injection of URL fetches), but also efficiency (saves a\n// round-trip).\ntype DesignSystem =\n | 'adobe-spectrum'\n | 'apple-hig'\n | 'figma-sds'\n | 'github-primer'\n | 'ibm-carbon'\n | 'microsoft-fluent'\n | 'shopify-polaris';\n\nconst DESIGN_SYSTEMS: Record<DesignSystem, { name: string; author: string; tokens: string[] }> = {\n 'adobe-spectrum': {\n name: 'Spectrum',\n author: 'Adobe',\n tokens: ['dtcg-examples/adobe-spectrum.resolver.json'],\n },\n 'apple-hig': {\n name: 'Human Interface Guidelines',\n author: 'Apple',\n tokens: ['dtcg-examples/apple-hig.resolver.json'],\n },\n 'figma-sds': {\n name: 'Simple Design System',\n author: 'Figma',\n tokens: ['dtcg-examples/figma-sds.resolver.json'],\n },\n 'github-primer': {\n name: 'Primer',\n author: 'GitHub',\n tokens: ['dtcg-examples/github-primer.resolver.json'],\n },\n 'ibm-carbon': {\n name: 'Carbon',\n author: 'IBM',\n tokens: ['dtcg-examples/ibm-carbon.resolver.json'],\n },\n 'microsoft-fluent': {\n name: 'Fluent',\n author: 'Microsoft',\n tokens: ['dtcg-examples/microsoft-fluent.resolver.json'],\n },\n 'shopify-polaris': {\n name: 'Polaris',\n author: 'Shopify',\n tokens: ['dtcg-examples/shopify-polaris.resolver.json'],\n },\n};\n\nexport interface InitOptions {\n logger: Logger;\n}\n\nexport async function initCmd({ logger }: InitOptions) {\n try {\n intro('⛋ Welcome to Terrazzo');\n const packageManager = await detect({ cwd: fileURLToPath(cwd) });\n\n // TODO: pass in CLI flags?\n const { config, configPath } = await loadConfig({ cmd: 'init', flags: {}, logger });\n const relConfigPath = configPath\n ? path.relative(fileURLToPath(cwd), fileURLToPath(new URL(configPath)))\n : undefined;\n\n let tokensPath = config.tokens[0]!;\n let startFromDS = !(tokensPath && fs.existsSync(tokensPath));\n\n // 1. tokens\n if (tokensPath && fs.existsSync(tokensPath)) {\n if (\n await confirm({\n message: `Found tokens at ${path.relative(fileURLToPath(cwd), fileURLToPath(tokensPath))}. Overwrite with a new design system?`,\n })\n ) {\n startFromDS = true;\n }\n } else {\n tokensPath = DEFAULT_TOKENS_PATH;\n }\n\n if (startFromDS) {\n const ds = DESIGN_SYSTEMS[\n (await select({\n message: 'Start from existing design system?',\n options: [\n ...Object.entries(DESIGN_SYSTEMS).map(([id, { author, name }]) => ({\n value: id,\n label: `${author} ${name}`,\n })),\n { value: 'none', label: 'None' },\n ],\n })) as keyof typeof DESIGN_SYSTEMS\n ] as (typeof DESIGN_SYSTEMS)[DesignSystem] | undefined;\n if (ds) {\n const s = spinner();\n s.start('Downloading');\n await new Promise((resolve, reject) => {\n // security: spawn() is much safer than exec()\n const subprocess = spawn(packageManager, [INSTALL_COMMAND[packageManager], 'dtcg-examples'], { cwd });\n subprocess.on('error', reject);\n subprocess.on('exit', resolve);\n });\n await s.stop('Download complete');\n }\n }\n\n // 2. plugins\n const existingPlugins = config.plugins.map((p) => p.name);\n const pluginSelection = await multiselect({\n message: 'Install plugins?',\n options: [\n { value: ['@terrazzo/plugin-css'], label: 'CSS' },\n { value: ['@terrazzo/plugin-js'], label: 'JS + TS' },\n { value: ['@terrazzo/plugin-css', '@terrazzo/plugin-sass'], label: 'Sass' },\n { value: ['@terrazzo/plugin-tailwind'], label: 'Tailwind' },\n ],\n required: false,\n });\n const newPlugins = Array.isArray(pluginSelection)\n ? Array.from(new Set(pluginSelection.flat().filter((p) => !existingPlugins.includes(p))))\n : [];\n if (newPlugins?.length) {\n const plugins = newPlugins.map((p) => ({ specifier: p.replace('@terrazzo/plugin-', ''), package: p }));\n const pluginCount = `${newPlugins.length} ${pluralize(newPlugins.length, 'plugin', 'plugins')}`;\n const s = spinner();\n s.start(`Installing ${pluginCount}`);\n // note: thi sis async to show the spinner\n await new Promise((resolve, reject) => {\n // security: spawn() is much safer than exec()\n const subprocess = spawn(packageManager, [INSTALL_COMMAND[packageManager], newPlugins.join(' ')], { cwd });\n subprocess.on('error', reject);\n subprocess.on('exit', resolve);\n });\n s.message('Updating config');\n if (configPath) {\n const ast = parseModule(fs.readFileSync(configPath, 'utf8'));\n const astExport = ast.body.find((node) => node.type === 'ExportDefaultDeclaration');\n\n // 2a. add plugin imports\n // note: this has the potential to duplicate plugins, but we tried our\n // best to filter already, and this may be the user’s fault if they\n // selected to install a plugin already installed. But also, this is\n // easily-fixable, so let’s not waste too much time here (and possibly\n // introduce bugs).\n ast.body.push(\n ...plugins.map(\n (p) =>\n ({\n type: 'ImportDeclaration',\n source: { type: 'Literal', value: p.package },\n specifiers: [{ type: 'ImportDefaultSpecifier', local: { type: 'Identifier', name: p.specifier } }],\n attributes: [],\n }) as ESTree.ImportDeclaration,\n ),\n );\n\n // 2b. add plugins to config.plugins\n if (!astExport) {\n logger.error({ group: 'config', message: `SyntaxError: ${relConfigPath} does not have default export.` });\n return;\n }\n const astConfig = (\n astExport.declaration.type === 'CallExpression'\n ? // export default defineConfig({ ... })\n astExport.declaration.arguments[0]\n : // export default { ... }\n astExport.declaration\n ) as ESTree.ObjectExpression;\n if (astConfig.type !== 'ObjectExpression') {\n logger.error({\n group: 'config',\n message: `Config: expected object default export, received ${astConfig.type}`,\n });\n return;\n }\n const pluginsArray = (\n astConfig.properties.find(\n (property) =>\n property.type === 'Property' && property.key.type === 'Identifier' && property.key.name === 'plugins', // ASTs are so fun 😑\n ) as ESTree.Property\n )?.value as ESTree.ArrayExpression | undefined;\n const pluginsAst = plugins.map(\n (p) =>\n ({\n type: 'CallExpression' as const,\n callee: {\n type: 'Identifier' as const,\n name: p.specifier,\n },\n arguments: [],\n optional: false,\n }) as ESTree.CallExpression,\n );\n if (pluginsArray) {\n pluginsArray.elements.push(...pluginsAst);\n } else {\n astConfig.properties.push({\n type: 'Property',\n key: { type: 'Identifier', name: 'plugins' },\n value: { type: 'ArrayExpression', elements: pluginsAst },\n kind: 'init',\n computed: false,\n method: false,\n shorthand: false,\n });\n }\n\n // 2c. update new file (and we’ll probably format it wrong but hey)\n fs.writeFileSync(\n configPath,\n generate(ast, {\n format: {\n indent: { style: ' ' },\n quotes: 'single',\n semicolons: true,\n },\n }),\n );\n } else {\n // 2a. write new config file (easy)\n fs.writeFileSync(\n DEFAULT_CONFIG_PATH,\n `import { defineConfig } from '@terrazzo/cli';\n${plugins.map((p) => `import ${p.specifier} from '${p.package}';`).join('\\n')}\n\nexport default defineConfig({\n tokens: ['./tokens.json'],\n plugins: [\n ${plugins.map((p) => `${p.specifier}(),`).join('\\n ')}\n ],\n outDir: './dist/',\n lint: {\n /** @see https://terrazzo.app/docs/linting */\n build: {\n enabled: true,\n },\n rules: {\n 'core/valid-color': 'error',\n 'core/valid-dimension': 'error',\n 'core/valid-font-family': 'error',\n 'core/valid-font-weight': 'error',\n 'core/valid-duration': 'error',\n 'core/valid-cubic-bezier': 'error',\n 'core/valid-number': 'error',\n 'core/valid-link': 'error',\n 'core/valid-boolean': 'error',\n 'core/valid-string': 'error',\n 'core/valid-stroke-style': 'error',\n 'core/valid-border': 'error',\n 'core/valid-transition': 'error',\n 'core/valid-shadow': 'error',\n 'core/valid-gradient': 'error',\n 'core/valid-typography': 'error',\n 'core/consistent-naming': 'warn',\n },\n },\n});`,\n );\n }\n s.stop(`Installed ${pluginCount}`);\n }\n\n outro('⛋ Done! 🎉');\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n}\n","import { createReadStream, createWriteStream, type PathLike } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { Readable, Writable } from 'node:stream';\nimport { fileURLToPath } from 'node:url';\nimport { serve } from '@hono/node-server';\nimport type { ConfigInit, Logger } from '@terrazzo/parser';\nimport mime from 'mime';\nimport type { Flags } from './shared.js';\n\nexport interface LabBuildOptions {\n flags: Flags;\n config: ConfigInit;\n configPath: string;\n logger: Logger;\n}\n\nexport async function labCmd({ config, logger }: LabBuildOptions) {\n /** TODO: handle multiple files */\n const [tokenFileUrl] = config.tokens;\n\n const staticFiles = new Set();\n const dirEntries = await readdir(fileURLToPath(import.meta.resolve('./lab')), {\n withFileTypes: true,\n recursive: true,\n });\n for (const entry of dirEntries) {\n if (entry.isFile() === false) {\n continue;\n }\n const absolutePath = `${entry.parentPath.replaceAll('\\\\', '/')}/${entry.name}`;\n staticFiles.add(absolutePath.replace(fileURLToPath(import.meta.resolve('./lab')).replaceAll('\\\\', '/'), ''));\n }\n\n const server = serve(\n {\n port: 9000,\n overrideGlobalObjects: false,\n async fetch(request) {\n const url = new URL(request.url);\n const pathname = url.pathname;\n if (pathname === '/') {\n return new Response(\n Readable.toWeb(createReadStream(fileURLToPath(import.meta.resolve('./lab/index.html')))) as ReadableStream,\n {\n headers: {\n 'Content-Type': 'text/html',\n },\n },\n );\n }\n if (pathname === '/api/tokens') {\n if (request.method === 'GET') {\n return new Response(Readable.toWeb(createReadStream(tokenFileUrl as PathLike)) as ReadableStream, {\n headers: {\n 'Content-Type': 'application/json',\n 'Cache-Control': 'no-cache',\n },\n });\n } else if (request.method === 'POST' && request.body) {\n await request.body.pipeTo(Writable.toWeb(createWriteStream(tokenFileUrl as PathLike)));\n return new Response(JSON.stringify({ success: true }), {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n }\n }\n\n if (staticFiles.has(pathname)) {\n return new Response(\n Readable.toWeb(createReadStream(fileURLToPath(import.meta.resolve(`./lab${pathname}`)))) as ReadableStream,\n {\n headers: { 'Content-Type': mime.getType(pathname) ?? 'application/octet-stream' },\n },\n );\n }\n return new Response('Not found', { status: 404 });\n },\n },\n (info) => {\n logger.info({\n group: 'server',\n message: `Token Lab running at http://${info.address === '::' ? 'localhost' : info.address}:${info.port}`,\n });\n },\n );\n /**\n * The cli entrypoint is going to manually exit the process after labCmd returns.\n */\n await new Promise<void>((resolve, reject) => {\n server.on('close', resolve);\n server.on('error', reject);\n });\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport * as momoa from '@humanwhocodes/momoa';\nimport { getObjMember, getObjMembers, traverse } from '@terrazzo/json-schema-tools';\nimport { defineConfig, type Logger, parse } from '@terrazzo/parser';\nimport { isAlias } from '@terrazzo/token-tools';\nimport { cwd, printError } from './shared.js';\n\nexport interface NormalizeOptions {\n logger: Logger;\n output: URL;\n}\n\nfunction findMember(name: string) {\n return function (member: momoa.MemberNode) {\n return member.name.type === 'String' && member.name.value === name;\n };\n}\n\nexport async function normalizeCmd(filename: string, { logger, output }: NormalizeOptions) {\n try {\n if (!filename) {\n logger.error({ group: 'config', message: 'Expected input: `tz normalize <tokens.json> -o output.json`' });\n return;\n }\n const sourceLoc = new URL(filename, cwd);\n if (!fs.existsSync(sourceLoc)) {\n logger.error({\n group: 'config',\n message: `Couldn’t find ${path.relative(cwd.href, sourceLoc.href)}. Does it exist?`,\n });\n }\n const sourceData = fs.readFileSync(sourceLoc, 'utf8');\n const document = momoa.parse(sourceData, { mode: 'jsonc' });\n const { tokens } = await parse([{ src: sourceData, filename: sourceLoc }], {\n config: defineConfig(\n {\n lint: {\n rules: {\n 'core/valid-color': 'off',\n 'core/valid-dimension': 'off',\n 'core/valid-duration': 'off',\n 'core/valid-typography': 'off',\n },\n },\n },\n { cwd },\n ),\n logger,\n });\n\n traverse(document, {\n enter(node, _parent, nodePath) {\n const token = tokens[nodePath.join('.')];\n if (!token || token.aliasOf || node.type !== 'Member' || node.value.type !== 'Object') {\n return;\n }\n const $valueI = node.value.members.findIndex(findMember('$value'));\n\n switch (token.$type) {\n case 'color': {\n if (node.value.members[$valueI]!.value.type === 'String') {\n if (isAlias(node.value.members[$valueI]!.value.value)) {\n return;\n }\n const hex = (node.value.members[$valueI]!.value as momoa.StringNode).value;\n node.value.members[$valueI]!.value = momoa.parse(\n JSON.stringify({\n ...token.$value,\n hex: hex.startsWith('#') ? hex.slice(0, 7) : undefined,\n }),\n ).body;\n const $extensions = getObjMember(node.value, '$extensions');\n if ($extensions?.type === 'Object') {\n const mode = getObjMember($extensions, 'mode');\n if (mode?.type === 'Object') {\n for (let i = 0; i < mode.members.length; i++) {\n const modeName = (mode.members[i]!.name as momoa.StringNode).value;\n const hex = (mode.members[i]!.value as momoa.StringNode).value;\n mode.members[i]!.value = momoa.parse(\n JSON.stringify({\n ...token.mode[modeName]!.$value,\n hex: hex.startsWith('#') ? hex.slice(0, 7) : undefined,\n }),\n ).body;\n }\n }\n }\n }\n break;\n }\n case 'dimension':\n case 'duration': {\n if (node.value.members[$valueI]!.value.type === 'String') {\n if (isAlias(node.value.members[$valueI]!.value.value)) {\n return;\n }\n node.value.members[$valueI]!.value = normalizeDurationDimension(node.value.members[$valueI]!.value);\n const $extensions = getObjMember(node.value, '$extensions');\n if ($extensions?.type === 'Object') {\n const mode = getObjMember($extensions, 'mode');\n if (mode?.type === 'Object') {\n for (let i = 0; i < mode.members.length; i++) {\n mode.members[i]!.value = normalizeDurationDimension(node.value.members[$valueI]!.value);\n }\n }\n }\n }\n break;\n }\n case 'typography': {\n if (node.value.members[$valueI]?.value.type !== 'Object') {\n return;\n }\n node.value.members[$valueI].value = normalizeTypography(node.value.members[$valueI].value);\n const $extensions = getObjMember(node.value, '$extensions');\n if ($extensions?.type === 'Object') {\n const mode = getObjMember($extensions, 'mode');\n if (mode?.type === 'Object') {\n for (let i = 0; i < mode.members.length; i++) {\n mode.members[i]!.value = normalizeTypography(mode.members[i]!.value as momoa.ObjectNode);\n }\n }\n }\n }\n }\n },\n });\n\n const outputLoc = new URL(output, cwd);\n fs.mkdirSync(new URL('.', outputLoc), { recursive: true });\n fs.writeFileSync(outputLoc, momoa.print(document, { indent: 2 }));\n } catch (err) {\n printError((err as Error).message);\n process.exit(1);\n }\n}\n\nfunction normalizeDurationDimension(node: momoa.StringNode) {\n const value = Number.parseFloat(node.value);\n if (!Number.isFinite(value)) {\n return node;\n }\n (node as any).type = 'Object';\n (node as any).members = (\n momoa.parse(JSON.stringify({ value, unit: node.value.replace(String(value), '') })).body as momoa.ObjectNode\n ).members;\n delete (node as any).value;\n return node;\n}\n\nfunction normalizeTypography(node: momoa.ObjectNode) {\n const { fontFamily, fontSize, fontWeight, letterSpacing, lineHeight } = getObjMembers(node);\n if (!fontFamily) {\n node.members.push((momoa.parse('{\"fontFamily\":[\"inherit\"]}').body as momoa.ObjectNode).members[0]!);\n }\n if (!fontSize) {\n node.members.push((momoa.parse('{\"fontSize\":{\"value\":1,\"unit\":\"rem\"}}').body as momoa.ObjectNode).members[0]!);\n }\n if (!fontWeight) {\n node.members.push((momoa.parse('{\"fontWeight\":400}').body as momoa.ObjectNode).members[0]!);\n }\n if (!letterSpacing) {\n node.members.push((momoa.parse('{\"letterSpacing\":{\"value\":0,\"unit\":\"rem\"}}').body as momoa.ObjectNode).members[0]!);\n }\n if (!lineHeight) {\n node.members.push((momoa.parse('{\"lineHeight\":1}').body as momoa.ObjectNode).members[0]!);\n }\n return node;\n}\n","import fs from 'node:fs';\n\nexport function versionCmd() {\n const { version } = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url), 'utf8'));\n console.log(version);\n}\n","import { createRequire } from 'node:module';\nimport { pathToFileURL } from 'node:url';\nimport { type Config, type ConfigInit, defineConfig as defineConfigCore } from '@terrazzo/parser';\nimport { cwd } from './shared.js';\n\nexport * from './build.js';\nexport * from './check.js';\nexport * from './help.js';\nexport * from './init.js';\nexport * from './lab.js';\nexport * from './normalize.js';\nexport * from './shared.js';\nexport * from './version.js';\n\nconst require = createRequire(cwd);\n\n// wrap defineConfig from @terrazzo/parser and add Node.js resolution\nexport function defineConfig(config: Config): ConfigInit {\n const normalizedConfig: Config = { ...config }; // note: we only need a shallow copy because we’re only mutating top-level `tokens`\n\n // Resolve tokens from npm modules, if any\n if (typeof normalizedConfig.tokens === 'string' || Array.isArray(normalizedConfig.tokens)) {\n normalizedConfig.tokens = (\n Array.isArray(normalizedConfig.tokens) ? normalizedConfig.tokens : [normalizedConfig.tokens]\n ).map((tokenPath) => {\n if (tokenPath.startsWith('.') || /^(https?|file):\\/\\//i.test(tokenPath)) {\n return tokenPath;\n }\n try {\n return pathToFileURL(require.resolve(tokenPath));\n } catch (err) {\n console.error(err);\n // this will throw an error if Node couldn’t automatically resolve it,\n // which will be true for many token paths. We don’t need to surface\n // that error; it’ll get its own error down the line if it’s a bad path.\n return tokenPath;\n }\n }) as string[];\n }\n\n return defineConfigCore(normalizedConfig, { cwd });\n}\n"],"mappings":"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"}
|