Cunningham Demo.
+ Primary color is {tokens.colors.primary}
);
diff --git a/packages/react/cunningham.cjs b/packages/react/cunningham.cjs
new file mode 100644
index 0000000..80d7028
--- /dev/null
+++ b/packages/react/cunningham.cjs
@@ -0,0 +1,7 @@
+module.exports = {
+ theme: {
+ colors: {
+ primary: 'grey'
+ },
+ },
+};
diff --git a/packages/tokens/src/bin/Config.ts b/packages/tokens/src/bin/Config.ts
index f89455a..8137e0e 100644
--- a/packages/tokens/src/bin/Config.ts
+++ b/packages/tokens/src/bin/Config.ts
@@ -1,9 +1,6 @@
export default {
- configurationFilenames: ["cunningham.js", "cunningham.cjs"],
- tokenFilenames: {
- css: "cunningham-tokens.css",
- js: "cunningham-tokens.js",
- },
+ configurationFilenames: ["cunningham.js", "cunningham.cjs", "cunningham.ts"],
+ tokenFilename: "cunningham-tokens",
sass: {
varSeparator: "--",
varPrefix: "c--",
diff --git a/packages/tokens/src/bin/ConfigLoader.ts b/packages/tokens/src/bin/ConfigLoader.ts
index 03358b5..496f8d6 100644
--- a/packages/tokens/src/bin/ConfigLoader.ts
+++ b/packages/tokens/src/bin/ConfigLoader.ts
@@ -3,6 +3,7 @@ import * as fs from "fs";
import deepmerge from "deepmerge";
import { ConfigShape } from "TokensGenerator";
import { workPath } from "Paths";
+import { register } from "ts-node";
import Config from "./Config";
const getLocalConfig = async () => {
@@ -14,11 +15,28 @@ const getLocalConfig = async () => {
console.log("No local config found, using default config.");
return {};
}
+ console.log("Found local config file: " + filename);
+
+ const ext = path.extname(filename);
+ if (ext === ".ts") {
+ registerTypescriptLoader();
+ }
const config = await import(filename);
return config.default;
};
+const registerTypescriptLoader = () => {
+ register({
+ moduleTypes: {
+ "**/*.ts": "cjs",
+ },
+ compilerOptions: {
+ module: "commonjs",
+ },
+ });
+};
+
const getDistConfig = async () => {
const config = await import("./cunningham.dist.js");
return config.default;
diff --git a/packages/tokens/src/bin/Generators/CssGenerator.spec.ts b/packages/tokens/src/bin/Generators/CssGenerator.spec.ts
index 0f0b46d..d9a7a00 100644
--- a/packages/tokens/src/bin/Generators/CssGenerator.spec.ts
+++ b/packages/tokens/src/bin/Generators/CssGenerator.spec.ts
@@ -19,7 +19,7 @@ describe("CssGenerator", () => {
});
const testSelector = async (opt: string) => {
- const cssTokensFile = path.join(__dirname, Config.tokenFilenames.css);
+ const cssTokensFile = path.join(__dirname, Config.tokenFilename + ".css");
expect(fs.existsSync(cssTokensFile)).toEqual(false);
await run(["", "", "-g", "css", opt, "html"]);
expect(fs.existsSync(cssTokensFile)).toEqual(true);
diff --git a/packages/tokens/src/bin/Generators/CssGenerator.ts b/packages/tokens/src/bin/Generators/CssGenerator.ts
index 35d821d..5ae1601 100644
--- a/packages/tokens/src/bin/Generators/CssGenerator.ts
+++ b/packages/tokens/src/bin/Generators/CssGenerator.ts
@@ -12,7 +12,7 @@ export const cssGenerator: Generator = async (tokens, opts) => {
);
}, "");
const cssContent = `${opts.selector} {\n${cssVars}}`;
- const dest = path.join(opts.path, Config.tokenFilenames.css);
+ const dest = path.join(opts.path, Config.tokenFilename + ".css");
put(dest, cssContent);
};
diff --git a/packages/tokens/src/bin/Generators/JsGenerator.spec.ts b/packages/tokens/src/bin/Generators/JsGenerator.spec.ts
index 0d6eeec..f6712ac 100644
--- a/packages/tokens/src/bin/Generators/JsGenerator.spec.ts
+++ b/packages/tokens/src/bin/Generators/JsGenerator.spec.ts
@@ -19,7 +19,7 @@ describe("JsGenerator", () => {
});
it("generates valid JS file.", async () => {
- const tokensFile = path.join(__dirname, Config.tokenFilenames.js);
+ const tokensFile = path.join(__dirname, Config.tokenFilename + ".js");
expect(fs.existsSync(tokensFile)).toEqual(false);
await run(["", "", "-g", "js"]);
expect(fs.existsSync(tokensFile)).toEqual(true);
diff --git a/packages/tokens/src/bin/Generators/TsGenerator.spec.ts b/packages/tokens/src/bin/Generators/TsGenerator.spec.ts
new file mode 100644
index 0000000..7463772
--- /dev/null
+++ b/packages/tokens/src/bin/Generators/TsGenerator.spec.ts
@@ -0,0 +1,30 @@
+import path from "path";
+import fs from "fs";
+import Config from "Config";
+import { run } from "ThemeGenerator";
+import { cleanup } from "tests/Utils";
+
+jest.mock("../Paths", () => ({
+ workPath: () => __dirname,
+}));
+
+describe("TsGenerator", () => {
+ beforeAll(() => {
+ jest.spyOn(console, "log").mockImplementation(() => {});
+ cleanup(__dirname);
+ });
+
+ afterEach(() => {
+ cleanup(__dirname);
+ });
+
+ it("generates valid TS file.", async () => {
+ const tokensFile = path.join(__dirname, Config.tokenFilename + ".ts");
+ expect(fs.existsSync(tokensFile)).toEqual(false);
+ await run(["", "", "-g", "ts"]);
+ expect(fs.existsSync(tokensFile)).toEqual(true);
+ expect(fs.readFileSync(tokensFile).toString()).toEqual(
+ `export const tokens = {"colors":{"primary":"#055FD2","secondary":"#DA0000"}};`
+ );
+ });
+});
diff --git a/packages/tokens/src/bin/Generators/TsGenerator.ts b/packages/tokens/src/bin/Generators/TsGenerator.ts
new file mode 100644
index 0000000..40ac46b
--- /dev/null
+++ b/packages/tokens/src/bin/Generators/TsGenerator.ts
@@ -0,0 +1,10 @@
+import path from "path";
+import { Generator } from "Generators/index";
+import Config from "Config";
+import { put } from "Utils/Files";
+import { jsGeneratorContent } from "Generators/JsGenerator";
+
+export const tsGenerator: Generator = async (tokens, opts) => {
+ const dest = path.join(opts.path, Config.tokenFilename + ".ts");
+ put(dest, await jsGeneratorContent(tokens));
+};
diff --git a/packages/tokens/src/bin/Generators/index.ts b/packages/tokens/src/bin/Generators/index.ts
index 5caefc8..c5172a2 100644
--- a/packages/tokens/src/bin/Generators/index.ts
+++ b/packages/tokens/src/bin/Generators/index.ts
@@ -1,6 +1,7 @@
import { cssGenerator } from "Generators/CssGenerator";
import { jsGenerator } from "Generators/JsGenerator";
import { Tokens } from "TokensGenerator";
+import { tsGenerator } from "Generators/TsGenerator";
export type Generator = (
tokens: Tokens,
@@ -10,4 +11,5 @@ export type Generator = (
export const Generators: Record