@styleframe/cli 3.0.0 → 4.0.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.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { defineCommand, runMain } from "citty";
3
- const version = "3.0.0";
3
+ const version = "4.0.0";
4
4
  const description = "A command-line interface for styleframe.";
5
5
  const main = defineCommand({
6
6
  meta: {
@@ -9,15 +9,14 @@ const main = defineCommand({
9
9
  description
10
10
  },
11
11
  subCommands: {
12
- init: () => import("./init-DnrkQJYO.js").then((m) => m.default),
13
- build: () => import("./build-BFZSJ2Zh.js").then((m) => m.default),
14
- figma: () => import("./index-DH3Hm47n.js").then((m) => m.default)
12
+ init: () => import("./init-CKeTXHp5.js").then((m) => m.default),
13
+ build: () => import("./build-CANA04j1.js").then((m) => m.default),
14
+ dtcg: () => import("./index-BTHfb82h.js").then((m) => m.default)
15
15
  }
16
16
  });
17
17
  function run() {
18
18
  runMain(main);
19
19
  }
20
- run();
21
20
  export {
22
21
  run as default
23
22
  };
@@ -1,14 +1,14 @@
1
1
  import consola from "consola";
2
2
  import { defineCommand } from "citty";
3
3
  import { writeFile as writeFile$1, readFile } from "fs/promises";
4
- import sysPath from "path";
4
+ import path from "path";
5
5
  import { access } from "node:fs/promises";
6
6
  import { constants } from "node:fs";
7
7
  import { loadFile, writeFile } from "magicast";
8
8
  import { addVitePlugin, addNuxtModule } from "magicast/helpers";
9
- async function fileExists(path) {
9
+ async function fileExists(path2) {
10
10
  try {
11
- await access(path, constants.F_OK);
11
+ await access(path2, constants.F_OK);
12
12
  return true;
13
13
  } catch {
14
14
  return false;
@@ -63,7 +63,7 @@ const DOCS_MANUAL_INSTALLATION_NUXT_URL = `${DOCS_URL}/getting-started/installat
63
63
  const DOCS_INSTALLATION_CUSTOM_URL = `${DOCS_URL}/getting-started/installation/custom`;
64
64
  async function initializeViteFrameworkFile(cwd) {
65
65
  consola.success("Vite environment detected.");
66
- const configFilePath = sysPath.join(cwd, "vite.config.ts");
66
+ const configFilePath = path.join(cwd, "vite.config.ts");
67
67
  try {
68
68
  const mod = await loadFile(configFilePath);
69
69
  addVitePlugin(mod, {
@@ -85,7 +85,7 @@ async function initializeViteFrameworkFile(cwd) {
85
85
  }
86
86
  async function initializeNuxtFrameworkFile(cwd) {
87
87
  consola.success("Nuxt environment detected.");
88
- const configFilePath = sysPath.join(cwd, "nuxt.config.ts");
88
+ const configFilePath = path.join(cwd, "nuxt.config.ts");
89
89
  try {
90
90
  const mod = await loadFile(configFilePath);
91
91
  addNuxtModule(mod, "styleframe/plugin/nuxt", "styleframe");
@@ -127,7 +127,7 @@ const tsconfigTemplate = {
127
127
  include: styleframeIncludes
128
128
  };
129
129
  async function initializeConfigFile(cwd) {
130
- const styleframeConfigPath = sysPath.join(cwd, "styleframe.config.ts");
130
+ const styleframeConfigPath = path.join(cwd, "styleframe.config.ts");
131
131
  if (await fileExists(styleframeConfigPath)) {
132
132
  consola.warn(
133
133
  `Skipped creating "styleframe.config.ts" because it already exists.`
@@ -138,7 +138,7 @@ async function initializeConfigFile(cwd) {
138
138
  }
139
139
  }
140
140
  async function initializeTsConfig(cwd) {
141
- const tsconfigPath = sysPath.join(cwd, "tsconfig.json");
141
+ const tsconfigPath = path.join(cwd, "tsconfig.json");
142
142
  if (await fileExists(tsconfigPath)) {
143
143
  const existingConfig = parseJsonc(
144
144
  await readFile(tsconfigPath, "utf8")
@@ -166,7 +166,7 @@ async function initializeTsConfig(cwd) {
166
166
  }
167
167
  }
168
168
  async function addPackageJsonDependencies(cwd) {
169
- const packageJsonPath = sysPath.join(cwd, "package.json");
169
+ const packageJsonPath = path.join(cwd, "package.json");
170
170
  if (await fileExists(packageJsonPath)) {
171
171
  const packageJson = JSON.parse(await readFile(packageJsonPath, "utf8"));
172
172
  if (!packageJson.devDependencies) packageJson.devDependencies = {};
@@ -190,9 +190,9 @@ async function addPackageJsonDependencies(cwd) {
190
190
  }
191
191
  }
192
192
  async function initializeFrameworkFile(cwd) {
193
- if (await fileExists(sysPath.join(cwd, "vite.config.ts"))) {
193
+ if (await fileExists(path.join(cwd, "vite.config.ts"))) {
194
194
  await initializeViteFrameworkFile(cwd);
195
- } else if (await fileExists(sysPath.join(cwd, "nuxt.config.ts"))) {
195
+ } else if (await fileExists(path.join(cwd, "nuxt.config.ts"))) {
196
196
  await initializeNuxtFrameworkFile(cwd);
197
197
  } else {
198
198
  consola.warn(
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const consola = require("consola");
4
+ const citty = require("citty");
5
+ const promises$1 = require("fs/promises");
6
+ const path = require("path");
7
+ const promises = require("node:fs/promises");
8
+ const node_fs = require("node:fs");
9
+ const magicast = require("magicast");
10
+ const helpers = require("magicast/helpers");
11
+ async function fileExists(path2) {
12
+ try {
13
+ await promises.access(path2, node_fs.constants.F_OK);
14
+ return true;
15
+ } catch {
16
+ return false;
17
+ }
18
+ }
19
+ function parseJsonc(text) {
20
+ let result = "";
21
+ let i = 0;
22
+ let inString = false;
23
+ while (i < text.length) {
24
+ const char = text[i];
25
+ const next = text[i + 1];
26
+ if (inString) {
27
+ if (char === "\\" && i + 1 < text.length) {
28
+ result += char + next;
29
+ i += 2;
30
+ continue;
31
+ }
32
+ if (char === '"') {
33
+ inString = false;
34
+ }
35
+ result += char;
36
+ i++;
37
+ } else {
38
+ if (char === '"') {
39
+ inString = true;
40
+ result += char;
41
+ i++;
42
+ } else if (char === "/" && next === "/") {
43
+ while (i < text.length && text[i] !== "\n") {
44
+ i++;
45
+ }
46
+ } else if (char === "/" && next === "*") {
47
+ i += 2;
48
+ while (i < text.length && !(text[i] === "*" && text[i + 1] === "/")) {
49
+ i++;
50
+ }
51
+ i += 2;
52
+ } else {
53
+ result += char;
54
+ i++;
55
+ }
56
+ }
57
+ }
58
+ result = result.replace(/,(\s*[}\]])/g, "$1");
59
+ return JSON.parse(result);
60
+ }
61
+ const HOMEPAGE_URL = "https://styleframe.dev";
62
+ const DOCS_URL = `${HOMEPAGE_URL}/docs`;
63
+ const DOCS_MANUAL_INSTALLATION_VITE_URL = `${DOCS_URL}/getting-started/installation/manual/vite`;
64
+ const DOCS_MANUAL_INSTALLATION_NUXT_URL = `${DOCS_URL}/getting-started/installation/manual/nuxt`;
65
+ const DOCS_INSTALLATION_CUSTOM_URL = `${DOCS_URL}/getting-started/installation/custom`;
66
+ async function initializeViteFrameworkFile(cwd) {
67
+ consola.success("Vite environment detected.");
68
+ const configFilePath = path.join(cwd, "vite.config.ts");
69
+ try {
70
+ const mod = await magicast.loadFile(configFilePath);
71
+ helpers.addVitePlugin(mod, {
72
+ from: "styleframe/plugin/vite",
73
+ constructor: "styleframe",
74
+ imported: "default"
75
+ });
76
+ await magicast.writeFile(mod, configFilePath);
77
+ consola.success(`Updated Vite config file.`);
78
+ } catch (error) {
79
+ consola.error(`Failed to update Vite config file.`);
80
+ consola.log(error);
81
+ console.log("");
82
+ console.log(
83
+ "Please read the documentation for manually installing styleframe for Vite."
84
+ );
85
+ console.log(DOCS_MANUAL_INSTALLATION_VITE_URL);
86
+ }
87
+ }
88
+ async function initializeNuxtFrameworkFile(cwd) {
89
+ consola.success("Nuxt environment detected.");
90
+ const configFilePath = path.join(cwd, "nuxt.config.ts");
91
+ try {
92
+ const mod = await magicast.loadFile(configFilePath);
93
+ helpers.addNuxtModule(mod, "styleframe/plugin/nuxt", "styleframe");
94
+ await magicast.writeFile(mod, configFilePath);
95
+ consola.success(`Updated Nuxt config file.`);
96
+ } catch (error) {
97
+ consola.error(`Failed to update Nuxt config file.`);
98
+ consola.log(error);
99
+ console.log("");
100
+ console.log(
101
+ "Please read the documentation for manually installing styleframe for Nuxt."
102
+ );
103
+ console.log(DOCS_MANUAL_INSTALLATION_NUXT_URL);
104
+ }
105
+ }
106
+ const styleframeConfigTemplate = `import { styleframe } from "styleframe";
107
+
108
+ const s = styleframe();
109
+
110
+ s.variable("color--primary", "blue");
111
+
112
+ export default s;
113
+ `;
114
+ const styleframeIncludes = [
115
+ "styleframe.config.ts",
116
+ "*.styleframe.ts",
117
+ ".styleframe/**/*.d.ts"
118
+ ];
119
+ const tsconfigTemplate = {
120
+ compilerOptions: {
121
+ target: "ES2022",
122
+ module: "ESNext",
123
+ moduleResolution: "bundler",
124
+ strict: true,
125
+ noEmit: true,
126
+ skipLibCheck: true,
127
+ esModuleInterop: true
128
+ },
129
+ include: styleframeIncludes
130
+ };
131
+ async function initializeConfigFile(cwd) {
132
+ const styleframeConfigPath = path.join(cwd, "styleframe.config.ts");
133
+ if (await fileExists(styleframeConfigPath)) {
134
+ consola.warn(
135
+ `Skipped creating "styleframe.config.ts" because it already exists.`
136
+ );
137
+ } else {
138
+ await promises$1.writeFile(styleframeConfigPath, styleframeConfigTemplate);
139
+ consola.success(`Created "styleframe.config.ts".`);
140
+ }
141
+ }
142
+ async function initializeTsConfig(cwd) {
143
+ const tsconfigPath = path.join(cwd, "tsconfig.json");
144
+ if (await fileExists(tsconfigPath)) {
145
+ const existingConfig = parseJsonc(
146
+ await promises$1.readFile(tsconfigPath, "utf8")
147
+ );
148
+ if (!existingConfig.include) {
149
+ existingConfig.include = [];
150
+ }
151
+ const includes = existingConfig.include;
152
+ const added = [];
153
+ for (const pattern of styleframeIncludes) {
154
+ if (!includes.includes(pattern)) {
155
+ includes.push(pattern);
156
+ added.push(pattern);
157
+ }
158
+ }
159
+ if (added.length > 0) {
160
+ await promises$1.writeFile(tsconfigPath, JSON.stringify(existingConfig, null, " "));
161
+ consola.success(
162
+ `Added ${added.map((p) => `"${p}"`).join(", ")} to tsconfig.json includes.`
163
+ );
164
+ }
165
+ } else {
166
+ await promises$1.writeFile(tsconfigPath, JSON.stringify(tsconfigTemplate, null, " "));
167
+ consola.success(`Created "tsconfig.json".`);
168
+ }
169
+ }
170
+ async function addPackageJsonDependencies(cwd) {
171
+ const packageJsonPath = path.join(cwd, "package.json");
172
+ if (await fileExists(packageJsonPath)) {
173
+ const packageJson = JSON.parse(await promises$1.readFile(packageJsonPath, "utf8"));
174
+ if (!packageJson.devDependencies) packageJson.devDependencies = {};
175
+ packageJson.devDependencies["styleframe"] = "^2.0.0";
176
+ packageJson.devDependencies["@styleframe/cli"] = "^2.0.0";
177
+ packageJson.devDependencies["@styleframe/core"] = "^2.0.0";
178
+ packageJson.devDependencies["@styleframe/license"] = "^2.0.0";
179
+ packageJson.devDependencies["@styleframe/loader"] = "^2.0.0";
180
+ packageJson.devDependencies["@styleframe/plugin"] = "^2.0.0";
181
+ packageJson.devDependencies["@styleframe/pro"] = "^2.0.0";
182
+ packageJson.devDependencies["@styleframe/theme"] = "^2.0.0";
183
+ packageJson.devDependencies["@styleframe/transpiler"] = "^2.0.0";
184
+ if (!packageJson.dependencies) packageJson.dependencies = {};
185
+ packageJson.dependencies["@styleframe/runtime"] = "^2.0.0";
186
+ await promises$1.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
187
+ consola.success(`Added dependencies to "package.json".`);
188
+ } else {
189
+ consola.warn(
190
+ `Skipped adding styleframe to dependencies because package.json could not be found.`
191
+ );
192
+ }
193
+ }
194
+ async function initializeFrameworkFile(cwd) {
195
+ if (await fileExists(path.join(cwd, "vite.config.ts"))) {
196
+ await initializeViteFrameworkFile(cwd);
197
+ } else if (await fileExists(path.join(cwd, "nuxt.config.ts"))) {
198
+ await initializeNuxtFrameworkFile(cwd);
199
+ } else {
200
+ consola.warn(
201
+ "No framework file detected. Read more about setting up styleframe manually.",
202
+ DOCS_INSTALLATION_CUSTOM_URL
203
+ );
204
+ }
205
+ }
206
+ const init = citty.defineCommand({
207
+ meta: {
208
+ name: "init",
209
+ description: "Initialize a new styleframe project."
210
+ },
211
+ args: {
212
+ cwd: {
213
+ type: "string",
214
+ required: false,
215
+ default: process.cwd(),
216
+ description: "The directory where the project will be initialized",
217
+ alias: ["d", "dir"],
218
+ valueHint: "path"
219
+ }
220
+ },
221
+ async run({ args }) {
222
+ const { cwd } = args;
223
+ consola.info("Initializing...");
224
+ await initializeConfigFile(cwd);
225
+ await initializeTsConfig(cwd);
226
+ await addPackageJsonDependencies(cwd);
227
+ await initializeFrameworkFile(cwd);
228
+ }
229
+ });
230
+ exports.addPackageJsonDependencies = addPackageJsonDependencies;
231
+ exports.default = init;
232
+ exports.initializeConfigFile = initializeConfigFile;
233
+ exports.initializeFrameworkFile = initializeFrameworkFile;
234
+ exports.initializeTsConfig = initializeTsConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@styleframe/cli",
3
- "version": "3.0.0",
3
+ "version": "4.0.0",
4
4
  "description": "A command-line interface for styleframe.",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -20,7 +20,8 @@
20
20
  "README.md"
21
21
  ],
22
22
  "dependencies": {
23
- "@styleframe/figma": "^1.0.1",
23
+ "@styleframe/dtcg": "^1.1.0",
24
+ "@styleframe/figma": "^2.0.0",
24
25
  "citty": "^0.1.6",
25
26
  "consola": "^3.0.0-2",
26
27
  "magicast": "^0.5.0"
@@ -31,9 +32,9 @@
31
32
  "devDependencies": {
32
33
  "@styleframe/config-typescript": "^3.0.0",
33
34
  "@styleframe/config-vite": "^3.0.0",
34
- "@styleframe/core": "^3.0.0",
35
+ "@styleframe/core": "^3.4.0",
35
36
  "@styleframe/license": "^2.0.2",
36
- "@styleframe/theme": "^3.0.0",
37
+ "@styleframe/theme": "^3.6.0",
37
38
  "@styleframe/loader": "^3.0.0",
38
39
  "@vitest/coverage-v8": "^3.2.4",
39
40
  "tsx": "^4.20.6",
@@ -1,139 +0,0 @@
1
- import path from "node:path";
2
- import { writeFile } from "node:fs/promises";
3
- import { l as loadConfiguration } from "./index-DtEAy_us.js";
4
- import { defineCommand } from "citty";
5
- import consola from "consola";
6
- import { d as detectFigmaType, s as styleframeValueToFigma, a as styleframeToFigmaName, t as toDTCG } from "./index-C3Gqfamh.js";
7
- const _export = defineCommand({
8
- meta: {
9
- name: "export",
10
- description: "Export Styleframe variables to DTCG format JSON"
11
- },
12
- args: {
13
- config: {
14
- type: "string",
15
- description: "Path to the Styleframe config file",
16
- default: "styleframe.config.ts",
17
- alias: ["c"],
18
- valueHint: "path"
19
- },
20
- output: {
21
- type: "string",
22
- description: "Output JSON file path",
23
- default: "tokens.json",
24
- alias: ["o"],
25
- valueHint: "path"
26
- },
27
- collection: {
28
- type: "string",
29
- description: "Name for the Figma collection",
30
- default: "Design Tokens",
31
- alias: ["n", "name"]
32
- },
33
- baseFontSize: {
34
- type: "string",
35
- description: "Base font size for rem conversion (in pixels)",
36
- default: "16"
37
- }
38
- },
39
- async run({ args }) {
40
- const configPath = path.resolve(args.config);
41
- const outputPath = path.resolve(args.output);
42
- const baseFontSize = Number.parseInt(args.baseFontSize, 10) || 16;
43
- consola.info(
44
- `Loading configuration from "${path.relative(process.cwd(), configPath)}"...`
45
- );
46
- const instance = await loadConfiguration({ entry: configPath });
47
- const root = instance.root;
48
- consola.info("Extracting variables...");
49
- const modes = ["Default", ...root.themes.map((t) => capitalize(t.name))];
50
- const variableMap = /* @__PURE__ */ new Map();
51
- for (const variable of root.variables) {
52
- if (!variableMap.has(variable.name)) {
53
- variableMap.set(variable.name, /* @__PURE__ */ new Map());
54
- }
55
- const modeValues = variableMap.get(variable.name);
56
- modeValues.set("Default", resolveValue(variable.value));
57
- }
58
- for (const theme of root.themes) {
59
- const modeName = capitalize(theme.name);
60
- for (const variable of theme.variables) {
61
- if (!variableMap.has(variable.name)) {
62
- variableMap.set(variable.name, /* @__PURE__ */ new Map());
63
- }
64
- const modeValues = variableMap.get(variable.name);
65
- modeValues.set(modeName, resolveValue(variable.value));
66
- }
67
- }
68
- const variables = [];
69
- for (const [name, modeValues] of variableMap) {
70
- const defaultValue = modeValues.get("Default");
71
- if (defaultValue === void 0) continue;
72
- const type = detectFigmaType(defaultValue);
73
- const figmaValues = {};
74
- for (const [modeName, value] of modeValues) {
75
- const figmaValue = styleframeValueToFigma(value, type, baseFontSize);
76
- if (figmaValue !== null) {
77
- figmaValues[modeName] = figmaValue;
78
- }
79
- }
80
- const rawDefaultValue = getRawValue(
81
- root.variables.find((v) => v.name === name)?.value
82
- );
83
- const isReference = isReferenceValue(rawDefaultValue);
84
- const aliasTo = isReference ? getReferenceName(rawDefaultValue) : void 0;
85
- variables.push({
86
- name: styleframeToFigmaName(name),
87
- styleframeName: name,
88
- type,
89
- values: figmaValues,
90
- aliasTo
91
- });
92
- }
93
- const intermediateData = {
94
- collection: args.collection,
95
- modes,
96
- variables
97
- };
98
- const themeNames = root.themes.map((t) => capitalize(t.name));
99
- const dtcgData = toDTCG(intermediateData, { themeNames });
100
- consola.info(
101
- `Writing ${variables.length} variables to "${path.relative(process.cwd(), outputPath)}"...`
102
- );
103
- await writeFile(outputPath, JSON.stringify(dtcgData, null, 2));
104
- consola.success(
105
- `Exported ${variables.length} variables in DTCG format to "${path.relative(process.cwd(), outputPath)}"`
106
- );
107
- }
108
- });
109
- function capitalize(str) {
110
- return str.charAt(0).toUpperCase() + str.slice(1);
111
- }
112
- function resolveValue(value) {
113
- if (value === null || value === void 0) return value;
114
- if (typeof value !== "object") return value;
115
- if ("type" in value) {
116
- if (value.type === "reference") {
117
- return value.fallback ?? "";
118
- }
119
- if (value.type === "css") {
120
- return value.value.map((v) => resolveValue(v)).join("");
121
- }
122
- }
123
- if (Array.isArray(value)) {
124
- return value.map((v) => resolveValue(v)).join("");
125
- }
126
- return String(value);
127
- }
128
- function getRawValue(value) {
129
- return value ?? "";
130
- }
131
- function isReferenceValue(value) {
132
- return typeof value === "object" && value !== null && "type" in value && value.type === "reference";
133
- }
134
- function getReferenceName(value) {
135
- return value.name;
136
- }
137
- export {
138
- _export as default
139
- };