@clarigen/cli 4.0.2-alpha.0 → 4.0.2-alpha.1

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/run-cli.cjs CHANGED
@@ -290,7 +290,7 @@ var InitConfigCommand = class extends BaseCommand {
290
290
 
291
291
  //#endregion
292
292
  //#region src/generated/version.ts
293
- const version = "4.0.2-alpha.0";
293
+ const version = "4.0.2-alpha.1";
294
294
 
295
295
  //#endregion
296
296
  //#region src/run-cli.ts
@@ -1 +1 @@
1
- {"version":3,"file":"run-cli.cjs","names":["Command","Option","type","Command","Option","Config","MAINNET_BURN_ADDRESS","TESTNET_BURN_ADDRESS","source: string | undefined","mapVariables","generateBaseFile","OutputType","generateESMFile","afterESM","watch","Command","Option","Config","generateDocs","Option","Config","Option","configFilePath","fileExists","Cli","Builtins"],"sources":["../src/commands/base-command.ts","../src/commands/session-info.ts","../src/clarinet-sdk.ts","../src/commands/default-command.ts","../src/commands/docs-command.ts","../src/generated/init-config.ts","../src/commands/init-config-command.ts","../src/generated/version.ts","../src/run-cli.ts"],"sourcesContent":["import { Command, Option } from 'clipanion';\nimport { logger } from '@/logger';\nimport { type } from 'arktype';\n\nexport abstract class BaseCommand extends Command {\n verbose = Option.Boolean('-v,--verbose', false, {\n description: 'Enable verbose logging',\n });\n\n preexecute() {\n if (this.verbose) {\n logger.level = 'debug';\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async catch(error: unknown) {\n if (error instanceof type.errors) {\n logger.error('Your configuration file is invalid.', error.summary);\n return;\n }\n logger.error(error);\n\n if (error instanceof Error) {\n logger.error(error.stack);\n }\n throw error;\n }\n}\n","import { Command, Option } from 'clipanion';\nimport { Config } from '../config';\nimport { logger } from '../logger';\nimport { BaseCommand } from './base-command';\n\nexport class SessionInfoCommand extends BaseCommand {\n static paths = [['session-info']];\n static usage = Command.Usage({\n description: \"Log info about this project's Clarinet session\",\n });\n\n cwd = Option.String({ required: false });\n\n async execute() {\n this.preexecute();\n const config = await Config.load(this.cwd);\n logger.info(config);\n }\n}\n","import { initSimnet } from '@stacks/clarinet-sdk';\nimport {\n ClarityAbi,\n ClarityVersion,\n MAINNET_BURN_ADDRESS,\n StacksEpochId,\n TESTNET_BURN_ADDRESS,\n getContractName,\n hexToCvValue,\n} from '@clarigen/core';\nimport { ClarityType, ClarityValue } from '@stacks/transactions';\n\nimport { Config } from './config';\nimport { readFile } from 'fs/promises';\nimport { mapVariables } from './files/variables';\nimport { SessionContract, SessionWithVariables } from './session';\n\nexport async function getSession(config: Config): Promise<SessionWithVariables> {\n const simnet = await initSimnet(config.clarinetFile(), true);\n const interfaces = simnet.getContractsInterfaces();\n const accounts = simnet.getAccounts();\n\n const allAccounts = [...accounts.entries()].map(([name, address]) => {\n const result = simnet.runSnippet(`(stx-get-balance '${address})`) as string;\n const resultCV = hexToCvValue<bigint>(result);\n if (typeof resultCV !== 'bigint') {\n throw new Error(`Unexpected result type for \\`(stx-get-balance \\`, got ${resultCV}`);\n }\n return {\n name,\n address,\n balance: resultCV.toString(),\n };\n });\n\n // const docsBaseFolder = (config.outputResolve(OutputType.Docs, './')!)[0];\n\n const contracts = (\n await Promise.all(\n [...interfaces.entries()].map(async ([contract_id, contract_interface]) => {\n if (\n (contract_id.startsWith(MAINNET_BURN_ADDRESS) &&\n config.esm?.include_boot_contracts !== true) ||\n contract_id.startsWith(TESTNET_BURN_ADDRESS)\n ) {\n return undefined;\n }\n const name = getContractName(contract_id, false);\n const contractPathDef = config.clarinet.contracts?.[name]?.path;\n let source: string | undefined;\n if (contractPathDef) {\n const contractPathFull = config.joinFromClarinet(contractPathDef);\n source = await readFile(contractPathFull, 'utf-8');\n }\n\n return {\n contract_id,\n contract_interface: {\n ...contract_interface,\n epoch: contract_interface.epoch as StacksEpochId,\n clarity_version: contract_interface.clarity_version as ClarityVersion,\n },\n source: source ?? '',\n };\n })\n )\n ).filter((x): x is SessionContract => x !== undefined);\n\n const session = {\n session_id: 0,\n accounts: allAccounts,\n contracts: contracts,\n };\n\n const variables = mapVariables(session, simnet);\n\n return {\n session_id: 0,\n accounts: allAccounts,\n contracts: contracts,\n variables,\n // variables: [],\n };\n}\n","import { Command, Option } from 'clipanion';\nimport { logger } from '../logger';\nimport { Config, OutputType } from '../config';\nimport { getSession } from '../clarinet-sdk';\nimport { generateBaseFile } from '../files/base';\nimport { afterESM, generateESMFile } from '../files/esm';\nimport { BaseCommand } from './base-command';\nimport chokidar from 'chokidar';\nimport { dirname, join, relative } from 'node:path';\n\nexport async function generate(config: Config) {\n const session = await getSession(config);\n const baseFile = generateBaseFile(session);\n if (config.supports(OutputType.ESM)) {\n const esmFile = await generateESMFile({\n baseFile,\n session,\n config,\n });\n await config.writeOutput(OutputType.ESM, esmFile);\n await afterESM(config);\n }\n if (!config.supports(OutputType.ESM)) {\n logger.warn('no config for ESM outputs. Not outputting any generated types.');\n }\n logger.info('Types generated!');\n}\n\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n return new Promise(async (resolve, reject) => {\n // First, generate the types\n try {\n await generate(config);\n } catch (error) {\n logger.error({ error }, 'Error generating types');\n }\n // default to watching the contracts folder\n const clarinetFolder = dirname(config.clarinetFile());\n const contractsFolder = join(clarinetFolder, '/contracts/**/*.clar');\n const relativeFolder = relative(cwd || process.cwd(), contractsFolder);\n const watchFolders = config.esm?.watch_folders ?? [];\n watchFolders.push(relativeFolder);\n logger.info(`Watching for changes in ${watchFolders}`);\n const watcher = chokidar.watch(watchFolders, { persistent: true, cwd: clarinetFolder });\n let running = false;\n let start = 0;\n const isVerbose = logger.level !== 'info';\n watcher.on('change', path => {\n if (!running) {\n start = Date.now();\n logger.info(`File ${path} has been changed. Generating types.`);\n running = true;\n void generate(config)\n .catch(e => {\n logger.error({ error: e }, 'Error generating types');\n })\n .then(() => {\n setTimeout(() => {\n // Temporary hack because clarinet-sdk-wasm prints to stdout\n process.stdout.moveCursor(0, -1);\n process.stdout.clearLine(1);\n const elapsed = Date.now() - start;\n // process.stdout.moveCursor(0, -1);\n // process.stdout.clearLine(1);\n logger.info(\n `Types generated (${(elapsed / 1000).toFixed(2)}s). Watching for changes...`\n );\n running = false;\n });\n\n // spinner.succeed('Types generated');\n });\n }\n // await generate(config);\n });\n });\n}\n\nexport class DefaultCommand extends BaseCommand {\n static paths = [Command.Default, ['generate']];\n // static description = 'Generate types for your Clarity contracts';\n static usage = Command.Usage({\n description: 'Generate types for your Clarity contracts',\n examples: [\n ['Basic usage:', 'clarigen'],\n ['When your `Clarigen.toml` is in a different directory:', 'clarigen /path/to/your/project'],\n ['Watch for changes and regenerate types:', 'clarigen --watch'],\n ],\n });\n\n cwd = Option.String({\n required: false,\n });\n\n watch = Option.Boolean('-w,--watch', {\n description: 'Watch for changes and regenerate types',\n required: false,\n });\n\n async execute() {\n this.preexecute();\n\n const config = await Config.load(this.cwd);\n if (this.watch) {\n await watch(config, this.cwd);\n } else {\n await generate(config);\n }\n }\n}\n","import { Option } from 'clipanion';\nimport { BaseCommand } from './base-command';\nimport { Config } from '../config';\nimport { getSession } from '../clarinet-sdk';\nimport { generateDocs } from '../files/docs';\nimport { dirname, join, relative } from 'node:path';\nimport { logger } from '../logger';\nimport chokidar from 'chokidar';\n\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n return new Promise(async (resolve, reject) => {\n const session = await getSession(config);\n // First, generate the docs\n try {\n await generateDocs({\n session,\n config,\n });\n } catch (error) {\n logger.error({ error }, 'Error generating types');\n }\n // default to watching the contracts folder\n const clarinetFolder = dirname(config.clarinetFile());\n const contractsFolder = join(clarinetFolder, '/contracts/**/*.clar');\n const relativeFolder = relative(cwd || process.cwd(), contractsFolder);\n const watchFolders = config.esm?.watch_folders ?? [];\n watchFolders.push(relativeFolder);\n logger.info(`Watching for changes in ${watchFolders}`);\n const watcher = chokidar.watch(watchFolders, { persistent: true, cwd: clarinetFolder });\n let running = false;\n let start = 0;\n const isVerbose = logger.level !== 'info';\n watcher.on('change', async path => {\n if (!running) {\n start = Date.now();\n logger.info(`File ${path} has been changed. Generating types.`);\n running = true;\n const session = await getSession(config);\n void generateDocs({\n session,\n config,\n })\n .catch(e => {\n logger.error({ error: e }, 'Error generating types');\n })\n .then(() => {\n setTimeout(() => {\n // Temporary hack because clarinet-sdk-wasm prints to stdout\n process.stdout.moveCursor(0, -1);\n process.stdout.clearLine(1);\n const elapsed = Date.now() - start;\n // process.stdout.moveCursor(0, -1);\n // process.stdout.clearLine(1);\n logger.info(\n `Docs generated (${(elapsed / 1000).toFixed(2)}s). Watching for changes...`\n );\n running = false;\n });\n\n // spinner.succeed('Types generated');\n });\n }\n });\n });\n}\n\nexport class DocsCommand extends BaseCommand {\n static paths = [['docs']];\n static usage = BaseCommand.Usage({\n description: 'Generate markdown documentation for your Clarity contracts',\n });\n\n cwd = Option.String({ required: false });\n\n watch = Option.Boolean('-w,--watch', {\n description: 'Watch for changes and regenerate docs',\n required: false,\n });\n\n async execute() {\n this.preexecute();\n const config = await Config.load(this.cwd);\n if (this.watch) {\n await watch(config, this.cwd);\n } else {\n const session = await getSession(config);\n await generateDocs({\n session: {\n ...session,\n variables: [],\n },\n config,\n });\n }\n }\n}\n","// This file is automatically generated from the\n// contents of `./init-config.toml`\n\nexport const tomlInit = `\n# Set to your project's Clarinet config file\nclarinet = \"./Clarinet.toml\"\n\n# Set where you'd like TypeScript types output.\n# Comment or remove section to skip TypeScript types\n[types]\n# \\`output\\` should be a path to a single file\noutput = \"src/clarigen-types.ts\"\n\n# You can also specify multiple output paths:\n# outputs = [\n# \"src/clarigen-types.ts\",\n# \"test/clarigen-types.ts\"\n# ]\n\n# \\`types.after\\` - script to run after TypeScript types are generated.\n# examples:\n# after = \"npm run prettier -w ./src/clarigen-types.ts\"\n# after = \"echo 'yay'\"\n\n# Set where you'd like generated contract docs\n# Generate docs by running \\`clarigen docs\\`\n[docs]\n# \\`output\\` should be a folder\noutput = \"docs\"\n\n# \\`docs.after\\` - script to run after docs are generated.\n# examples:\n# after = \"npm run prettier -w ./docs\"\n`;\n","import { configFilePath } from '../config';\nimport { logger } from '../logger';\nimport { fileExists } from '../utils';\nimport { BaseCommand } from './base-command';\nimport { Option } from 'clipanion';\nimport { writeFile } from 'fs/promises';\nimport { tomlInit } from '../generated/init-config';\n\nexport class InitConfigCommand extends BaseCommand {\n static paths = [['init-config'], ['init']];\n static usage = {\n description: 'Initialize a Clarigen configuration file',\n };\n\n cwd = Option.String({ required: false });\n\n overwrite = Option.Boolean('--overwrite', false, {\n description: 'Overwrite the configuration file if it already exists',\n });\n\n async execute(): Promise<number | void> {\n this.preexecute();\n const path = configFilePath(this.cwd);\n const configExists = await fileExists(path);\n if (configExists && !this.overwrite) {\n logger.warn('Configuration file already exists. Use --overwrite to overwrite it.');\n return 1;\n }\n logger.debug(`Writing configuration file to ${path}`);\n await writeFile(path, tomlInit, 'utf-8');\n }\n}\n","// This file is automatically generated from the\n// version in `package.json`\n\nexport const version = '4.0.2-alpha.0';\n","#!/usr/bin/env node\n\nimport { Cli, Builtins } from 'clipanion';\nimport { SessionInfoCommand } from './commands/session-info';\nimport { DefaultCommand } from './commands/default-command';\nimport { DocsCommand } from './commands/docs-command';\nimport { InitConfigCommand } from './commands/init-config-command';\nimport { logger } from './logger';\nimport { version } from './generated/version';\n\nconst [node, script, ...args] = process.argv;\n\nconst cli = new Cli({\n binaryLabel: 'Clarigen',\n binaryName: 'clarigen',\n binaryVersion: version,\n});\n\ncli.register(Builtins.HelpCommand);\ncli.register(Builtins.VersionCommand);\ncli.register(DefaultCommand);\ncli.register(DocsCommand);\ncli.register(InitConfigCommand);\ncli.register(SessionInfoCommand);\n\nasync function run() {\n await cli.runExit(args, Cli.defaultContext);\n}\n\nprocess.on('SIGINT', () => {\n logger.info('Bye! 👋');\n process.exit();\n});\n\nrun()\n .catch(console.error)\n .finally(() => {\n process.exit();\n });\n"],"mappings":"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"}
1
+ {"version":3,"file":"run-cli.cjs","names":["Command","Option","type","Command","Option","Config","MAINNET_BURN_ADDRESS","TESTNET_BURN_ADDRESS","source: string | undefined","mapVariables","generateBaseFile","OutputType","generateESMFile","afterESM","watch","Command","Option","Config","generateDocs","Option","Config","Option","configFilePath","fileExists","Cli","Builtins"],"sources":["../src/commands/base-command.ts","../src/commands/session-info.ts","../src/clarinet-sdk.ts","../src/commands/default-command.ts","../src/commands/docs-command.ts","../src/generated/init-config.ts","../src/commands/init-config-command.ts","../src/generated/version.ts","../src/run-cli.ts"],"sourcesContent":["import { Command, Option } from 'clipanion';\nimport { logger } from '@/logger';\nimport { type } from 'arktype';\n\nexport abstract class BaseCommand extends Command {\n verbose = Option.Boolean('-v,--verbose', false, {\n description: 'Enable verbose logging',\n });\n\n preexecute() {\n if (this.verbose) {\n logger.level = 'debug';\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async catch(error: unknown) {\n if (error instanceof type.errors) {\n logger.error('Your configuration file is invalid.', error.summary);\n return;\n }\n logger.error(error);\n\n if (error instanceof Error) {\n logger.error(error.stack);\n }\n throw error;\n }\n}\n","import { Command, Option } from 'clipanion';\nimport { Config } from '../config';\nimport { logger } from '../logger';\nimport { BaseCommand } from './base-command';\n\nexport class SessionInfoCommand extends BaseCommand {\n static paths = [['session-info']];\n static usage = Command.Usage({\n description: \"Log info about this project's Clarinet session\",\n });\n\n cwd = Option.String({ required: false });\n\n async execute() {\n this.preexecute();\n const config = await Config.load(this.cwd);\n logger.info(config);\n }\n}\n","import { initSimnet } from '@stacks/clarinet-sdk';\nimport {\n ClarityAbi,\n ClarityVersion,\n MAINNET_BURN_ADDRESS,\n StacksEpochId,\n TESTNET_BURN_ADDRESS,\n getContractName,\n hexToCvValue,\n} from '@clarigen/core';\nimport { ClarityType, ClarityValue } from '@stacks/transactions';\n\nimport { Config } from './config';\nimport { readFile } from 'fs/promises';\nimport { mapVariables } from './files/variables';\nimport { SessionContract, SessionWithVariables } from './session';\n\nexport async function getSession(config: Config): Promise<SessionWithVariables> {\n const simnet = await initSimnet(config.clarinetFile(), true);\n const interfaces = simnet.getContractsInterfaces();\n const accounts = simnet.getAccounts();\n\n const allAccounts = [...accounts.entries()].map(([name, address]) => {\n const result = simnet.runSnippet(`(stx-get-balance '${address})`) as string;\n const resultCV = hexToCvValue<bigint>(result);\n if (typeof resultCV !== 'bigint') {\n throw new Error(`Unexpected result type for \\`(stx-get-balance \\`, got ${resultCV}`);\n }\n return {\n name,\n address,\n balance: resultCV.toString(),\n };\n });\n\n // const docsBaseFolder = (config.outputResolve(OutputType.Docs, './')!)[0];\n\n const contracts = (\n await Promise.all(\n [...interfaces.entries()].map(async ([contract_id, contract_interface]) => {\n if (\n (contract_id.startsWith(MAINNET_BURN_ADDRESS) &&\n config.esm?.include_boot_contracts !== true) ||\n contract_id.startsWith(TESTNET_BURN_ADDRESS)\n ) {\n return undefined;\n }\n const name = getContractName(contract_id, false);\n const contractPathDef = config.clarinet.contracts?.[name]?.path;\n let source: string | undefined;\n if (contractPathDef) {\n const contractPathFull = config.joinFromClarinet(contractPathDef);\n source = await readFile(contractPathFull, 'utf-8');\n }\n\n return {\n contract_id,\n contract_interface: {\n ...contract_interface,\n epoch: contract_interface.epoch as StacksEpochId,\n clarity_version: contract_interface.clarity_version as ClarityVersion,\n },\n source: source ?? '',\n };\n })\n )\n ).filter((x): x is SessionContract => x !== undefined);\n\n const session = {\n session_id: 0,\n accounts: allAccounts,\n contracts: contracts,\n };\n\n const variables = mapVariables(session, simnet);\n\n return {\n session_id: 0,\n accounts: allAccounts,\n contracts: contracts,\n variables,\n // variables: [],\n };\n}\n","import { Command, Option } from 'clipanion';\nimport { logger } from '../logger';\nimport { Config, OutputType } from '../config';\nimport { getSession } from '../clarinet-sdk';\nimport { generateBaseFile } from '../files/base';\nimport { afterESM, generateESMFile } from '../files/esm';\nimport { BaseCommand } from './base-command';\nimport chokidar from 'chokidar';\nimport { dirname, join, relative } from 'node:path';\n\nexport async function generate(config: Config) {\n const session = await getSession(config);\n const baseFile = generateBaseFile(session);\n if (config.supports(OutputType.ESM)) {\n const esmFile = await generateESMFile({\n baseFile,\n session,\n config,\n });\n await config.writeOutput(OutputType.ESM, esmFile);\n await afterESM(config);\n }\n if (!config.supports(OutputType.ESM)) {\n logger.warn('no config for ESM outputs. Not outputting any generated types.');\n }\n logger.info('Types generated!');\n}\n\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n return new Promise(async (resolve, reject) => {\n // First, generate the types\n try {\n await generate(config);\n } catch (error) {\n logger.error({ error }, 'Error generating types');\n }\n // default to watching the contracts folder\n const clarinetFolder = dirname(config.clarinetFile());\n const contractsFolder = join(clarinetFolder, '/contracts/**/*.clar');\n const relativeFolder = relative(cwd || process.cwd(), contractsFolder);\n const watchFolders = config.esm?.watch_folders ?? [];\n watchFolders.push(relativeFolder);\n logger.info(`Watching for changes in ${watchFolders}`);\n const watcher = chokidar.watch(watchFolders, { persistent: true, cwd: clarinetFolder });\n let running = false;\n let start = 0;\n const isVerbose = logger.level !== 'info';\n watcher.on('change', path => {\n if (!running) {\n start = Date.now();\n logger.info(`File ${path} has been changed. Generating types.`);\n running = true;\n void generate(config)\n .catch(e => {\n logger.error({ error: e }, 'Error generating types');\n })\n .then(() => {\n setTimeout(() => {\n // Temporary hack because clarinet-sdk-wasm prints to stdout\n process.stdout.moveCursor(0, -1);\n process.stdout.clearLine(1);\n const elapsed = Date.now() - start;\n // process.stdout.moveCursor(0, -1);\n // process.stdout.clearLine(1);\n logger.info(\n `Types generated (${(elapsed / 1000).toFixed(2)}s). Watching for changes...`\n );\n running = false;\n });\n\n // spinner.succeed('Types generated');\n });\n }\n // await generate(config);\n });\n });\n}\n\nexport class DefaultCommand extends BaseCommand {\n static paths = [Command.Default, ['generate']];\n // static description = 'Generate types for your Clarity contracts';\n static usage = Command.Usage({\n description: 'Generate types for your Clarity contracts',\n examples: [\n ['Basic usage:', 'clarigen'],\n ['When your `Clarigen.toml` is in a different directory:', 'clarigen /path/to/your/project'],\n ['Watch for changes and regenerate types:', 'clarigen --watch'],\n ],\n });\n\n cwd = Option.String({\n required: false,\n });\n\n watch = Option.Boolean('-w,--watch', {\n description: 'Watch for changes and regenerate types',\n required: false,\n });\n\n async execute() {\n this.preexecute();\n\n const config = await Config.load(this.cwd);\n if (this.watch) {\n await watch(config, this.cwd);\n } else {\n await generate(config);\n }\n }\n}\n","import { Option } from 'clipanion';\nimport { BaseCommand } from './base-command';\nimport { Config } from '../config';\nimport { getSession } from '../clarinet-sdk';\nimport { generateDocs } from '../files/docs';\nimport { dirname, join, relative } from 'node:path';\nimport { logger } from '../logger';\nimport chokidar from 'chokidar';\n\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n return new Promise(async (resolve, reject) => {\n const session = await getSession(config);\n // First, generate the docs\n try {\n await generateDocs({\n session,\n config,\n });\n } catch (error) {\n logger.error({ error }, 'Error generating types');\n }\n // default to watching the contracts folder\n const clarinetFolder = dirname(config.clarinetFile());\n const contractsFolder = join(clarinetFolder, '/contracts/**/*.clar');\n const relativeFolder = relative(cwd || process.cwd(), contractsFolder);\n const watchFolders = config.esm?.watch_folders ?? [];\n watchFolders.push(relativeFolder);\n logger.info(`Watching for changes in ${watchFolders}`);\n const watcher = chokidar.watch(watchFolders, { persistent: true, cwd: clarinetFolder });\n let running = false;\n let start = 0;\n const isVerbose = logger.level !== 'info';\n watcher.on('change', async path => {\n if (!running) {\n start = Date.now();\n logger.info(`File ${path} has been changed. Generating types.`);\n running = true;\n const session = await getSession(config);\n void generateDocs({\n session,\n config,\n })\n .catch(e => {\n logger.error({ error: e }, 'Error generating types');\n })\n .then(() => {\n setTimeout(() => {\n // Temporary hack because clarinet-sdk-wasm prints to stdout\n process.stdout.moveCursor(0, -1);\n process.stdout.clearLine(1);\n const elapsed = Date.now() - start;\n // process.stdout.moveCursor(0, -1);\n // process.stdout.clearLine(1);\n logger.info(\n `Docs generated (${(elapsed / 1000).toFixed(2)}s). Watching for changes...`\n );\n running = false;\n });\n\n // spinner.succeed('Types generated');\n });\n }\n });\n });\n}\n\nexport class DocsCommand extends BaseCommand {\n static paths = [['docs']];\n static usage = BaseCommand.Usage({\n description: 'Generate markdown documentation for your Clarity contracts',\n });\n\n cwd = Option.String({ required: false });\n\n watch = Option.Boolean('-w,--watch', {\n description: 'Watch for changes and regenerate docs',\n required: false,\n });\n\n async execute() {\n this.preexecute();\n const config = await Config.load(this.cwd);\n if (this.watch) {\n await watch(config, this.cwd);\n } else {\n const session = await getSession(config);\n await generateDocs({\n session: {\n ...session,\n variables: [],\n },\n config,\n });\n }\n }\n}\n","// This file is automatically generated from the\n// contents of `./init-config.toml`\n\nexport const tomlInit = `\n# Set to your project's Clarinet config file\nclarinet = \"./Clarinet.toml\"\n\n# Set where you'd like TypeScript types output.\n# Comment or remove section to skip TypeScript types\n[types]\n# \\`output\\` should be a path to a single file\noutput = \"src/clarigen-types.ts\"\n\n# You can also specify multiple output paths:\n# outputs = [\n# \"src/clarigen-types.ts\",\n# \"test/clarigen-types.ts\"\n# ]\n\n# \\`types.after\\` - script to run after TypeScript types are generated.\n# examples:\n# after = \"npm run prettier -w ./src/clarigen-types.ts\"\n# after = \"echo 'yay'\"\n\n# Set where you'd like generated contract docs\n# Generate docs by running \\`clarigen docs\\`\n[docs]\n# \\`output\\` should be a folder\noutput = \"docs\"\n\n# \\`docs.after\\` - script to run after docs are generated.\n# examples:\n# after = \"npm run prettier -w ./docs\"\n`;\n","import { configFilePath } from '../config';\nimport { logger } from '../logger';\nimport { fileExists } from '../utils';\nimport { BaseCommand } from './base-command';\nimport { Option } from 'clipanion';\nimport { writeFile } from 'fs/promises';\nimport { tomlInit } from '../generated/init-config';\n\nexport class InitConfigCommand extends BaseCommand {\n static paths = [['init-config'], ['init']];\n static usage = {\n description: 'Initialize a Clarigen configuration file',\n };\n\n cwd = Option.String({ required: false });\n\n overwrite = Option.Boolean('--overwrite', false, {\n description: 'Overwrite the configuration file if it already exists',\n });\n\n async execute(): Promise<number | void> {\n this.preexecute();\n const path = configFilePath(this.cwd);\n const configExists = await fileExists(path);\n if (configExists && !this.overwrite) {\n logger.warn('Configuration file already exists. Use --overwrite to overwrite it.');\n return 1;\n }\n logger.debug(`Writing configuration file to ${path}`);\n await writeFile(path, tomlInit, 'utf-8');\n }\n}\n","// This file is automatically generated from the\n// version in `package.json`\n\nexport const version = '4.0.2-alpha.1';\n","#!/usr/bin/env node\n\nimport { Cli, Builtins } from 'clipanion';\nimport { SessionInfoCommand } from './commands/session-info';\nimport { DefaultCommand } from './commands/default-command';\nimport { DocsCommand } from './commands/docs-command';\nimport { InitConfigCommand } from './commands/init-config-command';\nimport { logger } from './logger';\nimport { version } from './generated/version';\n\nconst [node, script, ...args] = process.argv;\n\nconst cli = new Cli({\n binaryLabel: 'Clarigen',\n binaryName: 'clarigen',\n binaryVersion: version,\n});\n\ncli.register(Builtins.HelpCommand);\ncli.register(Builtins.VersionCommand);\ncli.register(DefaultCommand);\ncli.register(DocsCommand);\ncli.register(InitConfigCommand);\ncli.register(SessionInfoCommand);\n\nasync function run() {\n await cli.runExit(args, Cli.defaultContext);\n}\n\nprocess.on('SIGINT', () => {\n logger.info('Bye! 👋');\n process.exit();\n});\n\nrun()\n .catch(console.error)\n .finally(() => {\n process.exit();\n });\n"],"mappings":"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"}
package/dist/run-cli.mjs CHANGED
@@ -289,7 +289,7 @@ var InitConfigCommand = class extends BaseCommand {
289
289
 
290
290
  //#endregion
291
291
  //#region src/generated/version.ts
292
- const version = "4.0.2-alpha.0";
292
+ const version = "4.0.2-alpha.1";
293
293
 
294
294
  //#endregion
295
295
  //#region src/run-cli.ts
@@ -1 +1 @@
1
- {"version":3,"file":"run-cli.mjs","names":["source: string | undefined","watch"],"sources":["../src/commands/base-command.ts","../src/commands/session-info.ts","../src/clarinet-sdk.ts","../src/commands/default-command.ts","../src/commands/docs-command.ts","../src/generated/init-config.ts","../src/commands/init-config-command.ts","../src/generated/version.ts","../src/run-cli.ts"],"sourcesContent":["import { Command, Option } from 'clipanion';\nimport { logger } from '@/logger';\nimport { type } from 'arktype';\n\nexport abstract class BaseCommand extends Command {\n verbose = Option.Boolean('-v,--verbose', false, {\n description: 'Enable verbose logging',\n });\n\n preexecute() {\n if (this.verbose) {\n logger.level = 'debug';\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async catch(error: unknown) {\n if (error instanceof type.errors) {\n logger.error('Your configuration file is invalid.', error.summary);\n return;\n }\n logger.error(error);\n\n if (error instanceof Error) {\n logger.error(error.stack);\n }\n throw error;\n }\n}\n","import { Command, Option } from 'clipanion';\nimport { Config } from '../config';\nimport { logger } from '../logger';\nimport { BaseCommand } from './base-command';\n\nexport class SessionInfoCommand extends BaseCommand {\n static paths = [['session-info']];\n static usage = Command.Usage({\n description: \"Log info about this project's Clarinet session\",\n });\n\n cwd = Option.String({ required: false });\n\n async execute() {\n this.preexecute();\n const config = await Config.load(this.cwd);\n logger.info(config);\n }\n}\n","import { initSimnet } from '@stacks/clarinet-sdk';\nimport {\n ClarityAbi,\n ClarityVersion,\n MAINNET_BURN_ADDRESS,\n StacksEpochId,\n TESTNET_BURN_ADDRESS,\n getContractName,\n hexToCvValue,\n} from '@clarigen/core';\nimport { ClarityType, ClarityValue } from '@stacks/transactions';\n\nimport { Config } from './config';\nimport { readFile } from 'fs/promises';\nimport { mapVariables } from './files/variables';\nimport { SessionContract, SessionWithVariables } from './session';\n\nexport async function getSession(config: Config): Promise<SessionWithVariables> {\n const simnet = await initSimnet(config.clarinetFile(), true);\n const interfaces = simnet.getContractsInterfaces();\n const accounts = simnet.getAccounts();\n\n const allAccounts = [...accounts.entries()].map(([name, address]) => {\n const result = simnet.runSnippet(`(stx-get-balance '${address})`) as string;\n const resultCV = hexToCvValue<bigint>(result);\n if (typeof resultCV !== 'bigint') {\n throw new Error(`Unexpected result type for \\`(stx-get-balance \\`, got ${resultCV}`);\n }\n return {\n name,\n address,\n balance: resultCV.toString(),\n };\n });\n\n // const docsBaseFolder = (config.outputResolve(OutputType.Docs, './')!)[0];\n\n const contracts = (\n await Promise.all(\n [...interfaces.entries()].map(async ([contract_id, contract_interface]) => {\n if (\n (contract_id.startsWith(MAINNET_BURN_ADDRESS) &&\n config.esm?.include_boot_contracts !== true) ||\n contract_id.startsWith(TESTNET_BURN_ADDRESS)\n ) {\n return undefined;\n }\n const name = getContractName(contract_id, false);\n const contractPathDef = config.clarinet.contracts?.[name]?.path;\n let source: string | undefined;\n if (contractPathDef) {\n const contractPathFull = config.joinFromClarinet(contractPathDef);\n source = await readFile(contractPathFull, 'utf-8');\n }\n\n return {\n contract_id,\n contract_interface: {\n ...contract_interface,\n epoch: contract_interface.epoch as StacksEpochId,\n clarity_version: contract_interface.clarity_version as ClarityVersion,\n },\n source: source ?? '',\n };\n })\n )\n ).filter((x): x is SessionContract => x !== undefined);\n\n const session = {\n session_id: 0,\n accounts: allAccounts,\n contracts: contracts,\n };\n\n const variables = mapVariables(session, simnet);\n\n return {\n session_id: 0,\n accounts: allAccounts,\n contracts: contracts,\n variables,\n // variables: [],\n };\n}\n","import { Command, Option } from 'clipanion';\nimport { logger } from '../logger';\nimport { Config, OutputType } from '../config';\nimport { getSession } from '../clarinet-sdk';\nimport { generateBaseFile } from '../files/base';\nimport { afterESM, generateESMFile } from '../files/esm';\nimport { BaseCommand } from './base-command';\nimport chokidar from 'chokidar';\nimport { dirname, join, relative } from 'node:path';\n\nexport async function generate(config: Config) {\n const session = await getSession(config);\n const baseFile = generateBaseFile(session);\n if (config.supports(OutputType.ESM)) {\n const esmFile = await generateESMFile({\n baseFile,\n session,\n config,\n });\n await config.writeOutput(OutputType.ESM, esmFile);\n await afterESM(config);\n }\n if (!config.supports(OutputType.ESM)) {\n logger.warn('no config for ESM outputs. Not outputting any generated types.');\n }\n logger.info('Types generated!');\n}\n\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n return new Promise(async (resolve, reject) => {\n // First, generate the types\n try {\n await generate(config);\n } catch (error) {\n logger.error({ error }, 'Error generating types');\n }\n // default to watching the contracts folder\n const clarinetFolder = dirname(config.clarinetFile());\n const contractsFolder = join(clarinetFolder, '/contracts/**/*.clar');\n const relativeFolder = relative(cwd || process.cwd(), contractsFolder);\n const watchFolders = config.esm?.watch_folders ?? [];\n watchFolders.push(relativeFolder);\n logger.info(`Watching for changes in ${watchFolders}`);\n const watcher = chokidar.watch(watchFolders, { persistent: true, cwd: clarinetFolder });\n let running = false;\n let start = 0;\n const isVerbose = logger.level !== 'info';\n watcher.on('change', path => {\n if (!running) {\n start = Date.now();\n logger.info(`File ${path} has been changed. Generating types.`);\n running = true;\n void generate(config)\n .catch(e => {\n logger.error({ error: e }, 'Error generating types');\n })\n .then(() => {\n setTimeout(() => {\n // Temporary hack because clarinet-sdk-wasm prints to stdout\n process.stdout.moveCursor(0, -1);\n process.stdout.clearLine(1);\n const elapsed = Date.now() - start;\n // process.stdout.moveCursor(0, -1);\n // process.stdout.clearLine(1);\n logger.info(\n `Types generated (${(elapsed / 1000).toFixed(2)}s). Watching for changes...`\n );\n running = false;\n });\n\n // spinner.succeed('Types generated');\n });\n }\n // await generate(config);\n });\n });\n}\n\nexport class DefaultCommand extends BaseCommand {\n static paths = [Command.Default, ['generate']];\n // static description = 'Generate types for your Clarity contracts';\n static usage = Command.Usage({\n description: 'Generate types for your Clarity contracts',\n examples: [\n ['Basic usage:', 'clarigen'],\n ['When your `Clarigen.toml` is in a different directory:', 'clarigen /path/to/your/project'],\n ['Watch for changes and regenerate types:', 'clarigen --watch'],\n ],\n });\n\n cwd = Option.String({\n required: false,\n });\n\n watch = Option.Boolean('-w,--watch', {\n description: 'Watch for changes and regenerate types',\n required: false,\n });\n\n async execute() {\n this.preexecute();\n\n const config = await Config.load(this.cwd);\n if (this.watch) {\n await watch(config, this.cwd);\n } else {\n await generate(config);\n }\n }\n}\n","import { Option } from 'clipanion';\nimport { BaseCommand } from './base-command';\nimport { Config } from '../config';\nimport { getSession } from '../clarinet-sdk';\nimport { generateDocs } from '../files/docs';\nimport { dirname, join, relative } from 'node:path';\nimport { logger } from '../logger';\nimport chokidar from 'chokidar';\n\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n return new Promise(async (resolve, reject) => {\n const session = await getSession(config);\n // First, generate the docs\n try {\n await generateDocs({\n session,\n config,\n });\n } catch (error) {\n logger.error({ error }, 'Error generating types');\n }\n // default to watching the contracts folder\n const clarinetFolder = dirname(config.clarinetFile());\n const contractsFolder = join(clarinetFolder, '/contracts/**/*.clar');\n const relativeFolder = relative(cwd || process.cwd(), contractsFolder);\n const watchFolders = config.esm?.watch_folders ?? [];\n watchFolders.push(relativeFolder);\n logger.info(`Watching for changes in ${watchFolders}`);\n const watcher = chokidar.watch(watchFolders, { persistent: true, cwd: clarinetFolder });\n let running = false;\n let start = 0;\n const isVerbose = logger.level !== 'info';\n watcher.on('change', async path => {\n if (!running) {\n start = Date.now();\n logger.info(`File ${path} has been changed. Generating types.`);\n running = true;\n const session = await getSession(config);\n void generateDocs({\n session,\n config,\n })\n .catch(e => {\n logger.error({ error: e }, 'Error generating types');\n })\n .then(() => {\n setTimeout(() => {\n // Temporary hack because clarinet-sdk-wasm prints to stdout\n process.stdout.moveCursor(0, -1);\n process.stdout.clearLine(1);\n const elapsed = Date.now() - start;\n // process.stdout.moveCursor(0, -1);\n // process.stdout.clearLine(1);\n logger.info(\n `Docs generated (${(elapsed / 1000).toFixed(2)}s). Watching for changes...`\n );\n running = false;\n });\n\n // spinner.succeed('Types generated');\n });\n }\n });\n });\n}\n\nexport class DocsCommand extends BaseCommand {\n static paths = [['docs']];\n static usage = BaseCommand.Usage({\n description: 'Generate markdown documentation for your Clarity contracts',\n });\n\n cwd = Option.String({ required: false });\n\n watch = Option.Boolean('-w,--watch', {\n description: 'Watch for changes and regenerate docs',\n required: false,\n });\n\n async execute() {\n this.preexecute();\n const config = await Config.load(this.cwd);\n if (this.watch) {\n await watch(config, this.cwd);\n } else {\n const session = await getSession(config);\n await generateDocs({\n session: {\n ...session,\n variables: [],\n },\n config,\n });\n }\n }\n}\n","// This file is automatically generated from the\n// contents of `./init-config.toml`\n\nexport const tomlInit = `\n# Set to your project's Clarinet config file\nclarinet = \"./Clarinet.toml\"\n\n# Set where you'd like TypeScript types output.\n# Comment or remove section to skip TypeScript types\n[types]\n# \\`output\\` should be a path to a single file\noutput = \"src/clarigen-types.ts\"\n\n# You can also specify multiple output paths:\n# outputs = [\n# \"src/clarigen-types.ts\",\n# \"test/clarigen-types.ts\"\n# ]\n\n# \\`types.after\\` - script to run after TypeScript types are generated.\n# examples:\n# after = \"npm run prettier -w ./src/clarigen-types.ts\"\n# after = \"echo 'yay'\"\n\n# Set where you'd like generated contract docs\n# Generate docs by running \\`clarigen docs\\`\n[docs]\n# \\`output\\` should be a folder\noutput = \"docs\"\n\n# \\`docs.after\\` - script to run after docs are generated.\n# examples:\n# after = \"npm run prettier -w ./docs\"\n`;\n","import { configFilePath } from '../config';\nimport { logger } from '../logger';\nimport { fileExists } from '../utils';\nimport { BaseCommand } from './base-command';\nimport { Option } from 'clipanion';\nimport { writeFile } from 'fs/promises';\nimport { tomlInit } from '../generated/init-config';\n\nexport class InitConfigCommand extends BaseCommand {\n static paths = [['init-config'], ['init']];\n static usage = {\n description: 'Initialize a Clarigen configuration file',\n };\n\n cwd = Option.String({ required: false });\n\n overwrite = Option.Boolean('--overwrite', false, {\n description: 'Overwrite the configuration file if it already exists',\n });\n\n async execute(): Promise<number | void> {\n this.preexecute();\n const path = configFilePath(this.cwd);\n const configExists = await fileExists(path);\n if (configExists && !this.overwrite) {\n logger.warn('Configuration file already exists. Use --overwrite to overwrite it.');\n return 1;\n }\n logger.debug(`Writing configuration file to ${path}`);\n await writeFile(path, tomlInit, 'utf-8');\n }\n}\n","// This file is automatically generated from the\n// version in `package.json`\n\nexport const version = '4.0.2-alpha.0';\n","#!/usr/bin/env node\n\nimport { Cli, Builtins } from 'clipanion';\nimport { SessionInfoCommand } from './commands/session-info';\nimport { DefaultCommand } from './commands/default-command';\nimport { DocsCommand } from './commands/docs-command';\nimport { InitConfigCommand } from './commands/init-config-command';\nimport { logger } from './logger';\nimport { version } from './generated/version';\n\nconst [node, script, ...args] = process.argv;\n\nconst cli = new Cli({\n binaryLabel: 'Clarigen',\n binaryName: 'clarigen',\n binaryVersion: version,\n});\n\ncli.register(Builtins.HelpCommand);\ncli.register(Builtins.VersionCommand);\ncli.register(DefaultCommand);\ncli.register(DocsCommand);\ncli.register(InitConfigCommand);\ncli.register(SessionInfoCommand);\n\nasync function run() {\n await cli.runExit(args, Cli.defaultContext);\n}\n\nprocess.on('SIGINT', () => {\n logger.info('Bye! 👋');\n process.exit();\n});\n\nrun()\n .catch(console.error)\n .finally(() => {\n process.exit();\n });\n"],"mappings":"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"}
1
+ {"version":3,"file":"run-cli.mjs","names":["source: string | undefined","watch"],"sources":["../src/commands/base-command.ts","../src/commands/session-info.ts","../src/clarinet-sdk.ts","../src/commands/default-command.ts","../src/commands/docs-command.ts","../src/generated/init-config.ts","../src/commands/init-config-command.ts","../src/generated/version.ts","../src/run-cli.ts"],"sourcesContent":["import { Command, Option } from 'clipanion';\nimport { logger } from '@/logger';\nimport { type } from 'arktype';\n\nexport abstract class BaseCommand extends Command {\n verbose = Option.Boolean('-v,--verbose', false, {\n description: 'Enable verbose logging',\n });\n\n preexecute() {\n if (this.verbose) {\n logger.level = 'debug';\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async catch(error: unknown) {\n if (error instanceof type.errors) {\n logger.error('Your configuration file is invalid.', error.summary);\n return;\n }\n logger.error(error);\n\n if (error instanceof Error) {\n logger.error(error.stack);\n }\n throw error;\n }\n}\n","import { Command, Option } from 'clipanion';\nimport { Config } from '../config';\nimport { logger } from '../logger';\nimport { BaseCommand } from './base-command';\n\nexport class SessionInfoCommand extends BaseCommand {\n static paths = [['session-info']];\n static usage = Command.Usage({\n description: \"Log info about this project's Clarinet session\",\n });\n\n cwd = Option.String({ required: false });\n\n async execute() {\n this.preexecute();\n const config = await Config.load(this.cwd);\n logger.info(config);\n }\n}\n","import { initSimnet } from '@stacks/clarinet-sdk';\nimport {\n ClarityAbi,\n ClarityVersion,\n MAINNET_BURN_ADDRESS,\n StacksEpochId,\n TESTNET_BURN_ADDRESS,\n getContractName,\n hexToCvValue,\n} from '@clarigen/core';\nimport { ClarityType, ClarityValue } from '@stacks/transactions';\n\nimport { Config } from './config';\nimport { readFile } from 'fs/promises';\nimport { mapVariables } from './files/variables';\nimport { SessionContract, SessionWithVariables } from './session';\n\nexport async function getSession(config: Config): Promise<SessionWithVariables> {\n const simnet = await initSimnet(config.clarinetFile(), true);\n const interfaces = simnet.getContractsInterfaces();\n const accounts = simnet.getAccounts();\n\n const allAccounts = [...accounts.entries()].map(([name, address]) => {\n const result = simnet.runSnippet(`(stx-get-balance '${address})`) as string;\n const resultCV = hexToCvValue<bigint>(result);\n if (typeof resultCV !== 'bigint') {\n throw new Error(`Unexpected result type for \\`(stx-get-balance \\`, got ${resultCV}`);\n }\n return {\n name,\n address,\n balance: resultCV.toString(),\n };\n });\n\n // const docsBaseFolder = (config.outputResolve(OutputType.Docs, './')!)[0];\n\n const contracts = (\n await Promise.all(\n [...interfaces.entries()].map(async ([contract_id, contract_interface]) => {\n if (\n (contract_id.startsWith(MAINNET_BURN_ADDRESS) &&\n config.esm?.include_boot_contracts !== true) ||\n contract_id.startsWith(TESTNET_BURN_ADDRESS)\n ) {\n return undefined;\n }\n const name = getContractName(contract_id, false);\n const contractPathDef = config.clarinet.contracts?.[name]?.path;\n let source: string | undefined;\n if (contractPathDef) {\n const contractPathFull = config.joinFromClarinet(contractPathDef);\n source = await readFile(contractPathFull, 'utf-8');\n }\n\n return {\n contract_id,\n contract_interface: {\n ...contract_interface,\n epoch: contract_interface.epoch as StacksEpochId,\n clarity_version: contract_interface.clarity_version as ClarityVersion,\n },\n source: source ?? '',\n };\n })\n )\n ).filter((x): x is SessionContract => x !== undefined);\n\n const session = {\n session_id: 0,\n accounts: allAccounts,\n contracts: contracts,\n };\n\n const variables = mapVariables(session, simnet);\n\n return {\n session_id: 0,\n accounts: allAccounts,\n contracts: contracts,\n variables,\n // variables: [],\n };\n}\n","import { Command, Option } from 'clipanion';\nimport { logger } from '../logger';\nimport { Config, OutputType } from '../config';\nimport { getSession } from '../clarinet-sdk';\nimport { generateBaseFile } from '../files/base';\nimport { afterESM, generateESMFile } from '../files/esm';\nimport { BaseCommand } from './base-command';\nimport chokidar from 'chokidar';\nimport { dirname, join, relative } from 'node:path';\n\nexport async function generate(config: Config) {\n const session = await getSession(config);\n const baseFile = generateBaseFile(session);\n if (config.supports(OutputType.ESM)) {\n const esmFile = await generateESMFile({\n baseFile,\n session,\n config,\n });\n await config.writeOutput(OutputType.ESM, esmFile);\n await afterESM(config);\n }\n if (!config.supports(OutputType.ESM)) {\n logger.warn('no config for ESM outputs. Not outputting any generated types.');\n }\n logger.info('Types generated!');\n}\n\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n return new Promise(async (resolve, reject) => {\n // First, generate the types\n try {\n await generate(config);\n } catch (error) {\n logger.error({ error }, 'Error generating types');\n }\n // default to watching the contracts folder\n const clarinetFolder = dirname(config.clarinetFile());\n const contractsFolder = join(clarinetFolder, '/contracts/**/*.clar');\n const relativeFolder = relative(cwd || process.cwd(), contractsFolder);\n const watchFolders = config.esm?.watch_folders ?? [];\n watchFolders.push(relativeFolder);\n logger.info(`Watching for changes in ${watchFolders}`);\n const watcher = chokidar.watch(watchFolders, { persistent: true, cwd: clarinetFolder });\n let running = false;\n let start = 0;\n const isVerbose = logger.level !== 'info';\n watcher.on('change', path => {\n if (!running) {\n start = Date.now();\n logger.info(`File ${path} has been changed. Generating types.`);\n running = true;\n void generate(config)\n .catch(e => {\n logger.error({ error: e }, 'Error generating types');\n })\n .then(() => {\n setTimeout(() => {\n // Temporary hack because clarinet-sdk-wasm prints to stdout\n process.stdout.moveCursor(0, -1);\n process.stdout.clearLine(1);\n const elapsed = Date.now() - start;\n // process.stdout.moveCursor(0, -1);\n // process.stdout.clearLine(1);\n logger.info(\n `Types generated (${(elapsed / 1000).toFixed(2)}s). Watching for changes...`\n );\n running = false;\n });\n\n // spinner.succeed('Types generated');\n });\n }\n // await generate(config);\n });\n });\n}\n\nexport class DefaultCommand extends BaseCommand {\n static paths = [Command.Default, ['generate']];\n // static description = 'Generate types for your Clarity contracts';\n static usage = Command.Usage({\n description: 'Generate types for your Clarity contracts',\n examples: [\n ['Basic usage:', 'clarigen'],\n ['When your `Clarigen.toml` is in a different directory:', 'clarigen /path/to/your/project'],\n ['Watch for changes and regenerate types:', 'clarigen --watch'],\n ],\n });\n\n cwd = Option.String({\n required: false,\n });\n\n watch = Option.Boolean('-w,--watch', {\n description: 'Watch for changes and regenerate types',\n required: false,\n });\n\n async execute() {\n this.preexecute();\n\n const config = await Config.load(this.cwd);\n if (this.watch) {\n await watch(config, this.cwd);\n } else {\n await generate(config);\n }\n }\n}\n","import { Option } from 'clipanion';\nimport { BaseCommand } from './base-command';\nimport { Config } from '../config';\nimport { getSession } from '../clarinet-sdk';\nimport { generateDocs } from '../files/docs';\nimport { dirname, join, relative } from 'node:path';\nimport { logger } from '../logger';\nimport chokidar from 'chokidar';\n\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n return new Promise(async (resolve, reject) => {\n const session = await getSession(config);\n // First, generate the docs\n try {\n await generateDocs({\n session,\n config,\n });\n } catch (error) {\n logger.error({ error }, 'Error generating types');\n }\n // default to watching the contracts folder\n const clarinetFolder = dirname(config.clarinetFile());\n const contractsFolder = join(clarinetFolder, '/contracts/**/*.clar');\n const relativeFolder = relative(cwd || process.cwd(), contractsFolder);\n const watchFolders = config.esm?.watch_folders ?? [];\n watchFolders.push(relativeFolder);\n logger.info(`Watching for changes in ${watchFolders}`);\n const watcher = chokidar.watch(watchFolders, { persistent: true, cwd: clarinetFolder });\n let running = false;\n let start = 0;\n const isVerbose = logger.level !== 'info';\n watcher.on('change', async path => {\n if (!running) {\n start = Date.now();\n logger.info(`File ${path} has been changed. Generating types.`);\n running = true;\n const session = await getSession(config);\n void generateDocs({\n session,\n config,\n })\n .catch(e => {\n logger.error({ error: e }, 'Error generating types');\n })\n .then(() => {\n setTimeout(() => {\n // Temporary hack because clarinet-sdk-wasm prints to stdout\n process.stdout.moveCursor(0, -1);\n process.stdout.clearLine(1);\n const elapsed = Date.now() - start;\n // process.stdout.moveCursor(0, -1);\n // process.stdout.clearLine(1);\n logger.info(\n `Docs generated (${(elapsed / 1000).toFixed(2)}s). Watching for changes...`\n );\n running = false;\n });\n\n // spinner.succeed('Types generated');\n });\n }\n });\n });\n}\n\nexport class DocsCommand extends BaseCommand {\n static paths = [['docs']];\n static usage = BaseCommand.Usage({\n description: 'Generate markdown documentation for your Clarity contracts',\n });\n\n cwd = Option.String({ required: false });\n\n watch = Option.Boolean('-w,--watch', {\n description: 'Watch for changes and regenerate docs',\n required: false,\n });\n\n async execute() {\n this.preexecute();\n const config = await Config.load(this.cwd);\n if (this.watch) {\n await watch(config, this.cwd);\n } else {\n const session = await getSession(config);\n await generateDocs({\n session: {\n ...session,\n variables: [],\n },\n config,\n });\n }\n }\n}\n","// This file is automatically generated from the\n// contents of `./init-config.toml`\n\nexport const tomlInit = `\n# Set to your project's Clarinet config file\nclarinet = \"./Clarinet.toml\"\n\n# Set where you'd like TypeScript types output.\n# Comment or remove section to skip TypeScript types\n[types]\n# \\`output\\` should be a path to a single file\noutput = \"src/clarigen-types.ts\"\n\n# You can also specify multiple output paths:\n# outputs = [\n# \"src/clarigen-types.ts\",\n# \"test/clarigen-types.ts\"\n# ]\n\n# \\`types.after\\` - script to run after TypeScript types are generated.\n# examples:\n# after = \"npm run prettier -w ./src/clarigen-types.ts\"\n# after = \"echo 'yay'\"\n\n# Set where you'd like generated contract docs\n# Generate docs by running \\`clarigen docs\\`\n[docs]\n# \\`output\\` should be a folder\noutput = \"docs\"\n\n# \\`docs.after\\` - script to run after docs are generated.\n# examples:\n# after = \"npm run prettier -w ./docs\"\n`;\n","import { configFilePath } from '../config';\nimport { logger } from '../logger';\nimport { fileExists } from '../utils';\nimport { BaseCommand } from './base-command';\nimport { Option } from 'clipanion';\nimport { writeFile } from 'fs/promises';\nimport { tomlInit } from '../generated/init-config';\n\nexport class InitConfigCommand extends BaseCommand {\n static paths = [['init-config'], ['init']];\n static usage = {\n description: 'Initialize a Clarigen configuration file',\n };\n\n cwd = Option.String({ required: false });\n\n overwrite = Option.Boolean('--overwrite', false, {\n description: 'Overwrite the configuration file if it already exists',\n });\n\n async execute(): Promise<number | void> {\n this.preexecute();\n const path = configFilePath(this.cwd);\n const configExists = await fileExists(path);\n if (configExists && !this.overwrite) {\n logger.warn('Configuration file already exists. Use --overwrite to overwrite it.');\n return 1;\n }\n logger.debug(`Writing configuration file to ${path}`);\n await writeFile(path, tomlInit, 'utf-8');\n }\n}\n","// This file is automatically generated from the\n// version in `package.json`\n\nexport const version = '4.0.2-alpha.1';\n","#!/usr/bin/env node\n\nimport { Cli, Builtins } from 'clipanion';\nimport { SessionInfoCommand } from './commands/session-info';\nimport { DefaultCommand } from './commands/default-command';\nimport { DocsCommand } from './commands/docs-command';\nimport { InitConfigCommand } from './commands/init-config-command';\nimport { logger } from './logger';\nimport { version } from './generated/version';\n\nconst [node, script, ...args] = process.argv;\n\nconst cli = new Cli({\n binaryLabel: 'Clarigen',\n binaryName: 'clarigen',\n binaryVersion: version,\n});\n\ncli.register(Builtins.HelpCommand);\ncli.register(Builtins.VersionCommand);\ncli.register(DefaultCommand);\ncli.register(DocsCommand);\ncli.register(InitConfigCommand);\ncli.register(SessionInfoCommand);\n\nasync function run() {\n await cli.runExit(args, Cli.defaultContext);\n}\n\nprocess.on('SIGINT', () => {\n logger.info('Bye! 👋');\n process.exit();\n});\n\nrun()\n .catch(console.error)\n .finally(() => {\n process.exit();\n });\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.0.2-alpha.0",
2
+ "version": "4.0.2-alpha.1",
3
3
  "license": "MIT",
4
4
  "types": "./dist/index.d.cts",
5
5
  "module": "./dist/index.mjs",
@@ -50,7 +50,7 @@
50
50
  "pino-pretty": "^11.0.0",
51
51
  "smol-toml": "^1.1.4",
52
52
  "yaml": "^2.4.1",
53
- "@clarigen/core": "4.0.2-alpha.0"
53
+ "@clarigen/core": "4.0.2-alpha.1"
54
54
  },
55
55
  "publishConfig": {
56
56
  "access": "public"