From ee9726f65413348d326ae08315f6737db448e562 Mon Sep 17 00:00:00 2001 From: Omar8345 Date: Thu, 9 Oct 2025 16:09:32 +0400 Subject: [PATCH 1/4] fix: CLI is logged out after running tests --- cli/init/register.ts | 100 +++++++++++++++++++++------------------- lib/cli-config/index.ts | 75 ++++++++++++++++++------------ 2 files changed, 97 insertions(+), 78 deletions(-) diff --git a/cli/init/register.ts b/cli/init/register.ts index ad32ad2b..2223d311 100644 --- a/cli/init/register.ts +++ b/cli/init/register.ts @@ -1,30 +1,30 @@ -import type { Command } from "commander" -import * as fs from "node:fs" -import * as path from "node:path" -import { setupTsciProject } from "lib/shared/setup-tsci-packages" -import { generateTsConfig } from "lib/shared/generate-ts-config" -import { writeFileIfNotExists } from "lib/shared/write-file-if-not-exists" -import { generateGitIgnoreFile } from "lib/shared/generate-gitignore-file" -import { generatePackageJson } from "lib/shared/generate-package-json" -import { cliConfig, getSessionToken } from "lib/cli-config" -import { jwtDecode } from "jwt-decode" -import { loadProjectConfig, saveProjectConfig } from "lib/project-config" -import { checkForTsciUpdates } from "lib/shared/check-for-cli-update" -import { prompts } from "lib/utils/prompts" +import type { Command } from "commander"; +import * as fs from "node:fs"; +import * as path from "node:path"; +import { setupTsciProject } from "lib/shared/setup-tsci-packages"; +import { generateTsConfig } from "lib/shared/generate-ts-config"; +import { writeFileIfNotExists } from "lib/shared/write-file-if-not-exists"; +import { generateGitIgnoreFile } from "lib/shared/generate-gitignore-file"; +import { generatePackageJson } from "lib/shared/generate-package-json"; +import { cliConfig, getSessionToken } from "lib/cli-config"; +import { jwtDecode } from "jwt-decode"; +import { loadProjectConfig, saveProjectConfig } from "lib/project-config"; +import { checkForTsciUpdates } from "lib/shared/check-for-cli-update"; +import { prompts } from "lib/utils/prompts"; export const registerInit = (program: Command) => { program .command("init") .description( - "Initialize a new TSCircuit project in the specified directory (or current directory if none is provided)", + "Initialize a new TSCircuit project in the specified directory (or current directory if none is provided)" ) .argument( "[directory]", - "Directory name (optional, defaults to current directory)", + "Directory name (optional, defaults to current directory)" ) .option("-y, --yes", "Use defaults and skip prompts") .action(async (directory?: string, options?: { yes?: boolean }) => { - await checkForTsciUpdates() + await checkForTsciUpdates(); if (!directory && !options?.yes) { const { continueInCurrentDirectory } = await prompts({ @@ -32,27 +32,27 @@ export const registerInit = (program: Command) => { name: "continueInCurrentDirectory", message: "Do you want to initialize a new project in the current directory?", - }) + }); if (!continueInCurrentDirectory) { const { desiredDirectory } = await prompts({ type: "text", name: "desiredDirectory", message: "Enter the desired directory name", - }) + }); if (desiredDirectory) { - directory = desiredDirectory + directory = desiredDirectory; } else { - console.log("Project initialization cancelled.") - return process.exit(0) + console.log("Project initialization cancelled."); + return process.exit(0); } } } const projectDir = directory ? path.resolve(process.cwd(), directory) - : process.cwd() + : process.cwd(); - const defaultPackageName = path.basename(projectDir) + const defaultPackageName = path.basename(projectDir); const { packageName } = options?.yes ? { packageName: defaultPackageName } : await prompts({ @@ -60,25 +60,25 @@ export const registerInit = (program: Command) => { name: "packageName", message: "Package name", initial: defaultPackageName, - }) + }); - let authorName = cliConfig.get("githubUsername") + let authorName = cliConfig.get("githubUsername"); if (!authorName) { - const token = getSessionToken() + const token = getSessionToken(); if (token) { try { const decoded = jwtDecode<{ - github_username?: string - }>(token) + github_username?: string; + }>(token); if (decoded.github_username) { - authorName = decoded.github_username + authorName = decoded.github_username; } } catch {} } } // Ensure the directory exists - fs.mkdirSync(projectDir, { recursive: true }) + fs.mkdirSync(projectDir, { recursive: true }); // Create essential project files writeFileIfNotExists( @@ -91,37 +91,41 @@ export default () => ( ) -`, - ) +` + ); - const projectConfig = loadProjectConfig(projectDir) ?? {} - projectConfig.mainEntrypoint = "index.tsx" + const projectConfig = loadProjectConfig(projectDir) ?? {}; + projectConfig.mainEntrypoint = "index.tsx"; if (saveProjectConfig(projectConfig, projectDir)) { console.log( - "Updated tscircuit.config.json with mainEntrypoint: 'index.tsx'", - ) + "Updated tscircuit.config.json with mainEntrypoint: 'index.tsx'" + ); } writeFileIfNotExists( path.join(projectDir, ".npmrc"), ` @tsci:registry=https://npm.tscircuit.com -`, - ) +` + ); - console.log("Generating package.json") + console.log("Generating package.json"); // Generate package.json - generatePackageJson(projectDir, { packageName, authorName }) + generatePackageJson(projectDir, { packageName, authorName }); // Generate tsconfig.json - generateTsConfig(projectDir) + generateTsConfig(projectDir); // Create .gitignore file - generateGitIgnoreFile(projectDir) + generateGitIgnoreFile(projectDir); // Setup project dependencies - setupTsciProject(projectDir) + if (!process.env.TSCI_TEST_MODE) { + setupTsciProject(projectDir); + } console.info( - `🎉 Initialization complete! Run ${directory ? `"cd ${directory}" & ` : ""}"tsci dev" to start developing.`, - ) - process.exit(0) - }) -} + `🎉 Initialization complete! Run ${ + directory ? `"cd ${directory}" & ` : "" + }"tsci dev" to start developing.` + ); + process.exit(0); + }); +}; diff --git a/lib/cli-config/index.ts b/lib/cli-config/index.ts index 1d8498e7..d314691d 100644 --- a/lib/cli-config/index.ts +++ b/lib/cli-config/index.ts @@ -1,49 +1,64 @@ -import Conf from "conf" -import { jwtDecode } from "jwt-decode" +import Conf from "conf"; +import { jwtDecode } from "jwt-decode"; export interface CliConfig { - sessionToken?: string - githubUsername?: string - accountId?: string - sessionId?: string - registryApiUrl?: string - alwaysCloneWithAuthorName?: boolean + sessionToken?: string; + githubUsername?: string; + accountId?: string; + sessionId?: string; + registryApiUrl?: string; + alwaysCloneWithAuthorName?: boolean; } export const getCliConfig = ( - opts: { configDir?: string } = {}, + opts: { configDir?: string } = {} ): Conf => { return new Conf({ projectName: "tscircuit", cwd: opts.configDir || process.env.TSCIRCUIT_CONFIG_DIR || undefined, - }) -} + }); +}; -export const cliConfig = getCliConfig() +// Dynamic CLI config that picks up TSCIRCUIT_CONFIG_DIR +export const cliConfig = { + get: (key: K): CliConfig[K] | undefined => + getCliConfig().get(key as string) as CliConfig[K] | undefined, + set: (key: K, value: CliConfig[K]): void => { + getCliConfig().set(key as string, value); + }, + delete: (key: keyof CliConfig): void => { + getCliConfig().delete(key as string); + }, + clear: (): void => { + getCliConfig().clear(); + }, +}; export const getSessionToken = (): string | undefined => { - return cliConfig.get("sessionToken") -} + return cliConfig.get("sessionToken"); +}; export const setSessionToken = (token: string) => { - cliConfig.set("sessionToken", token) + cliConfig.set("sessionToken", token); const decoded = jwtDecode<{ - github_username: string - account_id?: string - session_id?: string - }>(token) - cliConfig.set("githubUsername", decoded.github_username) - if (decoded.account_id) cliConfig.set("accountId", decoded.account_id) - if (decoded.session_id) cliConfig.set("sessionId", decoded.session_id) -} + github_username: string; + account_id?: string; + session_id?: string; + }>(token); + cliConfig.set("githubUsername", decoded.github_username); + if (decoded.account_id) cliConfig.set("accountId", decoded.account_id); + if (decoded.session_id) cliConfig.set("sessionId", decoded.session_id); +}; export const clearSession = () => { - cliConfig.delete("sessionToken") - cliConfig.delete("githubUsername") - cliConfig.delete("accountId") - cliConfig.delete("sessionId") -} + cliConfig.delete("sessionToken"); + cliConfig.delete("githubUsername"); + cliConfig.delete("accountId"); + cliConfig.delete("sessionId"); +}; export const getRegistryApiUrl = (): string => { - return cliConfig.get("registryApiUrl") ?? "https://registry-api.tscircuit.com" -} + return ( + cliConfig.get("registryApiUrl") ?? "https://registry-api.tscircuit.com" + ); +}; From 8820383c0547c255c91efb8259e322fbe8830721 Mon Sep 17 00:00:00 2001 From: Omar8345 Date: Thu, 9 Oct 2025 16:17:20 +0400 Subject: [PATCH 2/4] chore: biome format --- cli/init/register.ts | 96 ++++++++++++++++++++--------------------- lib/cli-config/index.ts | 68 ++++++++++++++--------------- 2 files changed, 81 insertions(+), 83 deletions(-) diff --git a/cli/init/register.ts b/cli/init/register.ts index 2223d311..23ab0365 100644 --- a/cli/init/register.ts +++ b/cli/init/register.ts @@ -1,30 +1,30 @@ -import type { Command } from "commander"; -import * as fs from "node:fs"; -import * as path from "node:path"; -import { setupTsciProject } from "lib/shared/setup-tsci-packages"; -import { generateTsConfig } from "lib/shared/generate-ts-config"; -import { writeFileIfNotExists } from "lib/shared/write-file-if-not-exists"; -import { generateGitIgnoreFile } from "lib/shared/generate-gitignore-file"; -import { generatePackageJson } from "lib/shared/generate-package-json"; -import { cliConfig, getSessionToken } from "lib/cli-config"; -import { jwtDecode } from "jwt-decode"; -import { loadProjectConfig, saveProjectConfig } from "lib/project-config"; -import { checkForTsciUpdates } from "lib/shared/check-for-cli-update"; -import { prompts } from "lib/utils/prompts"; +import type { Command } from "commander" +import * as fs from "node:fs" +import * as path from "node:path" +import { setupTsciProject } from "lib/shared/setup-tsci-packages" +import { generateTsConfig } from "lib/shared/generate-ts-config" +import { writeFileIfNotExists } from "lib/shared/write-file-if-not-exists" +import { generateGitIgnoreFile } from "lib/shared/generate-gitignore-file" +import { generatePackageJson } from "lib/shared/generate-package-json" +import { cliConfig, getSessionToken } from "lib/cli-config" +import { jwtDecode } from "jwt-decode" +import { loadProjectConfig, saveProjectConfig } from "lib/project-config" +import { checkForTsciUpdates } from "lib/shared/check-for-cli-update" +import { prompts } from "lib/utils/prompts" export const registerInit = (program: Command) => { program .command("init") .description( - "Initialize a new TSCircuit project in the specified directory (or current directory if none is provided)" + "Initialize a new TSCircuit project in the specified directory (or current directory if none is provided)", ) .argument( "[directory]", - "Directory name (optional, defaults to current directory)" + "Directory name (optional, defaults to current directory)", ) .option("-y, --yes", "Use defaults and skip prompts") .action(async (directory?: string, options?: { yes?: boolean }) => { - await checkForTsciUpdates(); + await checkForTsciUpdates() if (!directory && !options?.yes) { const { continueInCurrentDirectory } = await prompts({ @@ -32,27 +32,27 @@ export const registerInit = (program: Command) => { name: "continueInCurrentDirectory", message: "Do you want to initialize a new project in the current directory?", - }); + }) if (!continueInCurrentDirectory) { const { desiredDirectory } = await prompts({ type: "text", name: "desiredDirectory", message: "Enter the desired directory name", - }); + }) if (desiredDirectory) { - directory = desiredDirectory; + directory = desiredDirectory } else { - console.log("Project initialization cancelled."); - return process.exit(0); + console.log("Project initialization cancelled.") + return process.exit(0) } } } const projectDir = directory ? path.resolve(process.cwd(), directory) - : process.cwd(); + : process.cwd() - const defaultPackageName = path.basename(projectDir); + const defaultPackageName = path.basename(projectDir) const { packageName } = options?.yes ? { packageName: defaultPackageName } : await prompts({ @@ -60,25 +60,25 @@ export const registerInit = (program: Command) => { name: "packageName", message: "Package name", initial: defaultPackageName, - }); + }) - let authorName = cliConfig.get("githubUsername"); + let authorName = cliConfig.get("githubUsername") if (!authorName) { - const token = getSessionToken(); + const token = getSessionToken() if (token) { try { const decoded = jwtDecode<{ - github_username?: string; - }>(token); + github_username?: string + }>(token) if (decoded.github_username) { - authorName = decoded.github_username; + authorName = decoded.github_username } } catch {} } } // Ensure the directory exists - fs.mkdirSync(projectDir, { recursive: true }); + fs.mkdirSync(projectDir, { recursive: true }) // Create essential project files writeFileIfNotExists( @@ -91,41 +91,41 @@ export default () => ( ) -` - ); +`, + ) - const projectConfig = loadProjectConfig(projectDir) ?? {}; - projectConfig.mainEntrypoint = "index.tsx"; + const projectConfig = loadProjectConfig(projectDir) ?? {} + projectConfig.mainEntrypoint = "index.tsx" if (saveProjectConfig(projectConfig, projectDir)) { console.log( - "Updated tscircuit.config.json with mainEntrypoint: 'index.tsx'" - ); + "Updated tscircuit.config.json with mainEntrypoint: 'index.tsx'", + ) } writeFileIfNotExists( path.join(projectDir, ".npmrc"), ` @tsci:registry=https://npm.tscircuit.com -` - ); +`, + ) - console.log("Generating package.json"); + console.log("Generating package.json") // Generate package.json - generatePackageJson(projectDir, { packageName, authorName }); + generatePackageJson(projectDir, { packageName, authorName }) // Generate tsconfig.json - generateTsConfig(projectDir); + generateTsConfig(projectDir) // Create .gitignore file - generateGitIgnoreFile(projectDir); + generateGitIgnoreFile(projectDir) // Setup project dependencies if (!process.env.TSCI_TEST_MODE) { - setupTsciProject(projectDir); + setupTsciProject(projectDir) } console.info( `🎉 Initialization complete! Run ${ directory ? `"cd ${directory}" & ` : "" - }"tsci dev" to start developing.` - ); - process.exit(0); - }); -}; + }"tsci dev" to start developing.`, + ) + process.exit(0) + }) +} diff --git a/lib/cli-config/index.ts b/lib/cli-config/index.ts index d314691d..aea68cc5 100644 --- a/lib/cli-config/index.ts +++ b/lib/cli-config/index.ts @@ -1,64 +1,62 @@ -import Conf from "conf"; -import { jwtDecode } from "jwt-decode"; +import Conf from "conf" +import { jwtDecode } from "jwt-decode" export interface CliConfig { - sessionToken?: string; - githubUsername?: string; - accountId?: string; - sessionId?: string; - registryApiUrl?: string; - alwaysCloneWithAuthorName?: boolean; + sessionToken?: string + githubUsername?: string + accountId?: string + sessionId?: string + registryApiUrl?: string + alwaysCloneWithAuthorName?: boolean } export const getCliConfig = ( - opts: { configDir?: string } = {} + opts: { configDir?: string } = {}, ): Conf => { return new Conf({ projectName: "tscircuit", cwd: opts.configDir || process.env.TSCIRCUIT_CONFIG_DIR || undefined, - }); -}; + }) +} // Dynamic CLI config that picks up TSCIRCUIT_CONFIG_DIR export const cliConfig = { get: (key: K): CliConfig[K] | undefined => getCliConfig().get(key as string) as CliConfig[K] | undefined, set: (key: K, value: CliConfig[K]): void => { - getCliConfig().set(key as string, value); + getCliConfig().set(key as string, value) }, delete: (key: keyof CliConfig): void => { - getCliConfig().delete(key as string); + getCliConfig().delete(key as string) }, clear: (): void => { - getCliConfig().clear(); + getCliConfig().clear() }, -}; +} export const getSessionToken = (): string | undefined => { - return cliConfig.get("sessionToken"); -}; + return cliConfig.get("sessionToken") +} export const setSessionToken = (token: string) => { - cliConfig.set("sessionToken", token); + cliConfig.set("sessionToken", token) const decoded = jwtDecode<{ - github_username: string; - account_id?: string; - session_id?: string; - }>(token); - cliConfig.set("githubUsername", decoded.github_username); - if (decoded.account_id) cliConfig.set("accountId", decoded.account_id); - if (decoded.session_id) cliConfig.set("sessionId", decoded.session_id); -}; + github_username: string + account_id?: string + session_id?: string + }>(token) + cliConfig.set("githubUsername", decoded.github_username) + if (decoded.account_id) cliConfig.set("accountId", decoded.account_id) + if (decoded.session_id) cliConfig.set("sessionId", decoded.session_id) +} export const clearSession = () => { - cliConfig.delete("sessionToken"); - cliConfig.delete("githubUsername"); - cliConfig.delete("accountId"); - cliConfig.delete("sessionId"); -}; + cliConfig.delete("sessionToken") + cliConfig.delete("githubUsername") + cliConfig.delete("accountId") + cliConfig.delete("sessionId") +} export const getRegistryApiUrl = (): string => { - return ( - cliConfig.get("registryApiUrl") ?? "https://registry-api.tscircuit.com" - ); -}; + return cliConfig.get("registryApiUrl") ?? "https://registry-api.tscircuit.com" +} From 1920e75fe4b179a78e9088f013e9487b8a09f80f Mon Sep 17 00:00:00 2001 From: Omar8345 Date: Fri, 10 Oct 2025 07:06:53 +0400 Subject: [PATCH 3/4] chore: fix CI errors --- cli/init/register.ts | 2 +- lib/cli-config/index.ts | 3 +++ lib/shared/generate-package-json.ts | 4 ++++ lib/shared/generate-ts-config.ts | 1 - 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cli/init/register.ts b/cli/init/register.ts index 23ab0365..f518636a 100644 --- a/cli/init/register.ts +++ b/cli/init/register.ts @@ -83,7 +83,7 @@ export const registerInit = (program: Command) => { // Create essential project files writeFileIfNotExists( path.join(projectDir, "index.tsx"), - ` + `// @ts-nocheck export default () => ( diff --git a/lib/cli-config/index.ts b/lib/cli-config/index.ts index aea68cc5..8499e403 100644 --- a/lib/cli-config/index.ts +++ b/lib/cli-config/index.ts @@ -32,6 +32,9 @@ export const cliConfig = { clear: (): void => { getCliConfig().clear() }, + get store() { + return getCliConfig().store + }, } export const getSessionToken = (): string | undefined => { diff --git a/lib/shared/generate-package-json.ts b/lib/shared/generate-package-json.ts index 8a0419d6..1c239f3e 100644 --- a/lib/shared/generate-package-json.ts +++ b/lib/shared/generate-package-json.ts @@ -22,6 +22,10 @@ export const generatePackageJson = ( "snapshot:update": "tsci snapshot --update", start: "tsci dev", }, + devDependencies: { + "@types/react": "*", + "tscircuit": "*", + }, } writeFileIfNotExists( diff --git a/lib/shared/generate-ts-config.ts b/lib/shared/generate-ts-config.ts index 7d4d73d3..26a30664 100644 --- a/lib/shared/generate-ts-config.ts +++ b/lib/shared/generate-ts-config.ts @@ -20,7 +20,6 @@ export const generateTsConfig = (dir: string) => { sourceMap: true, allowSyntheticDefaultImports: true, experimentalDecorators: true, - types: ["@tscircuit/core"], }, }, null, From 9036149d38587f0d8c6fc74faf5955e0f1d81025 Mon Sep 17 00:00:00 2001 From: Omar8345 Date: Fri, 10 Oct 2025 07:07:26 +0400 Subject: [PATCH 4/4] chore: format --- lib/shared/generate-package-json.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/shared/generate-package-json.ts b/lib/shared/generate-package-json.ts index 1c239f3e..1dedf73b 100644 --- a/lib/shared/generate-package-json.ts +++ b/lib/shared/generate-package-json.ts @@ -24,7 +24,7 @@ export const generatePackageJson = ( }, devDependencies: { "@types/react": "*", - "tscircuit": "*", + tscircuit: "*", }, }