@clarigen/cli 4.1.0 → 4.1.2

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
@@ -293,7 +293,7 @@ var InitConfigCommand = class extends BaseCommand {
293
293
 
294
294
  //#endregion
295
295
  //#region src/generated/version.ts
296
- const version = "4.0.2-alpha.1";
296
+ const version = "4.1.0";
297
297
 
298
298
  //#endregion
299
299
  //#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 // biome-ignore lint/suspicious/useAwait: ignored using `--suppress`\n override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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 override paths = [['session-info']];\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { initSimnet } from '@stacks/clarinet-sdk';\nimport {\n type ClarityVersion,\n MAINNET_BURN_ADDRESS,\n type StacksEpochId,\n TESTNET_BURN_ADDRESS,\n getContractName,\n hexToCvValue,\n} from '@clarigen/core';\n\nimport type { Config } from './config';\nimport { readFile } from 'node:fs/promises';\nimport { mapVariables } from './files/variables';\nimport type { SessionContract, SessionWithVariables } from './session';\n\nexport async function getSession(\n config: Config\n): 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(\n `Unexpected result type for \\`(stx-get-balance \\`, got ${resultCV}`\n );\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(\n 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;\n }\n // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\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:\n contract_interface.clarity_version as ClarityVersion,\n },\n source: source ?? '',\n };\n }\n )\n )\n ).filter((x): x is SessionContract => x !== undefined);\n\n const session = {\n session_id: 0,\n accounts: allAccounts,\n contracts,\n };\n\n const variables = mapVariables(session, simnet);\n\n return {\n session_id: 0,\n accounts: allAccounts,\n contracts,\n variables,\n // variables: [],\n };\n}\n","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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\n// biome-ignore lint/suspicious/useAwait: ignored using `--suppress`\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n // biome-ignore lint/suspicious/noAsyncPromiseExecutor: ignored using `--suppress`\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, {\n persistent: true,\n cwd: clarinetFolder,\n });\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 // biome-ignore lint/complexity/noVoid: ignored using `--suppress`\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 override paths = [Command.Default, ['generate']];\n // static description = 'Generate types for your Clarity contracts';\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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 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, {\n persistent: true,\n cwd: clarinetFolder,\n });\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 // biome-ignore lint/nursery/noShadow: ignored using `--suppress`\n const session = await getSession(config);\n // biome-ignore lint/complexity/noVoid: ignored using `--suppress`\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\nexport class DocsCommand extends BaseCommand {\n static override paths = [['docs']];\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { configFilePath } from '../config';\nimport { logger } from '../logger';\nimport { fileExists } from '../utils';\nimport { BaseCommand } from './base-command';\nimport { Option } from 'clipanion';\nimport { writeFile } from 'node:fs/promises';\nimport { tomlInit } from '../generated/init-config';\n\nexport class InitConfigCommand extends BaseCommand {\n static override paths = [['init-config'], ['init']];\n static override 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 // biome-ignore lint/suspicious/noConfusingVoidType: ignored using `--suppress`\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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"}
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 // biome-ignore lint/suspicious/useAwait: ignored using `--suppress`\n override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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 override paths = [['session-info']];\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { initSimnet } from '@stacks/clarinet-sdk';\nimport {\n type ClarityVersion,\n MAINNET_BURN_ADDRESS,\n type StacksEpochId,\n TESTNET_BURN_ADDRESS,\n getContractName,\n hexToCvValue,\n} from '@clarigen/core';\n\nimport type { Config } from './config';\nimport { readFile } from 'node:fs/promises';\nimport { mapVariables } from './files/variables';\nimport type { SessionContract, SessionWithVariables } from './session';\n\nexport async function getSession(\n config: Config\n): 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(\n `Unexpected result type for \\`(stx-get-balance \\`, got ${resultCV}`\n );\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(\n 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;\n }\n // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\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:\n contract_interface.clarity_version as ClarityVersion,\n },\n source: source ?? '',\n };\n }\n )\n )\n ).filter((x): x is SessionContract => x !== undefined);\n\n const session = {\n session_id: 0,\n accounts: allAccounts,\n contracts,\n };\n\n const variables = mapVariables(session, simnet);\n\n return {\n session_id: 0,\n accounts: allAccounts,\n contracts,\n variables,\n // variables: [],\n };\n}\n","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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\n// biome-ignore lint/suspicious/useAwait: ignored using `--suppress`\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n // biome-ignore lint/suspicious/noAsyncPromiseExecutor: ignored using `--suppress`\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, {\n persistent: true,\n cwd: clarinetFolder,\n });\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 // biome-ignore lint/complexity/noVoid: ignored using `--suppress`\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 override paths = [Command.Default, ['generate']];\n // static description = 'Generate types for your Clarity contracts';\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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 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, {\n persistent: true,\n cwd: clarinetFolder,\n });\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 // biome-ignore lint/nursery/noShadow: ignored using `--suppress`\n const session = await getSession(config);\n // biome-ignore lint/complexity/noVoid: ignored using `--suppress`\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\nexport class DocsCommand extends BaseCommand {\n static override paths = [['docs']];\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { configFilePath } from '../config';\nimport { logger } from '../logger';\nimport { fileExists } from '../utils';\nimport { BaseCommand } from './base-command';\nimport { Option } from 'clipanion';\nimport { writeFile } from 'node:fs/promises';\nimport { tomlInit } from '../generated/init-config';\n\nexport class InitConfigCommand extends BaseCommand {\n static override paths = [['init-config'], ['init']];\n static override 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 // biome-ignore lint/suspicious/noConfusingVoidType: ignored using `--suppress`\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.1.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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"}
package/dist/run-cli.mjs CHANGED
@@ -292,7 +292,7 @@ var InitConfigCommand = class extends BaseCommand {
292
292
 
293
293
  //#endregion
294
294
  //#region src/generated/version.ts
295
- const version = "4.0.2-alpha.1";
295
+ const version = "4.1.0";
296
296
 
297
297
  //#endregion
298
298
  //#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 // biome-ignore lint/suspicious/useAwait: ignored using `--suppress`\n override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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 override paths = [['session-info']];\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { initSimnet } from '@stacks/clarinet-sdk';\nimport {\n type ClarityVersion,\n MAINNET_BURN_ADDRESS,\n type StacksEpochId,\n TESTNET_BURN_ADDRESS,\n getContractName,\n hexToCvValue,\n} from '@clarigen/core';\n\nimport type { Config } from './config';\nimport { readFile } from 'node:fs/promises';\nimport { mapVariables } from './files/variables';\nimport type { SessionContract, SessionWithVariables } from './session';\n\nexport async function getSession(\n config: Config\n): 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(\n `Unexpected result type for \\`(stx-get-balance \\`, got ${resultCV}`\n );\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(\n 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;\n }\n // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\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:\n contract_interface.clarity_version as ClarityVersion,\n },\n source: source ?? '',\n };\n }\n )\n )\n ).filter((x): x is SessionContract => x !== undefined);\n\n const session = {\n session_id: 0,\n accounts: allAccounts,\n contracts,\n };\n\n const variables = mapVariables(session, simnet);\n\n return {\n session_id: 0,\n accounts: allAccounts,\n contracts,\n variables,\n // variables: [],\n };\n}\n","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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\n// biome-ignore lint/suspicious/useAwait: ignored using `--suppress`\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n // biome-ignore lint/suspicious/noAsyncPromiseExecutor: ignored using `--suppress`\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, {\n persistent: true,\n cwd: clarinetFolder,\n });\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 // biome-ignore lint/complexity/noVoid: ignored using `--suppress`\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 override paths = [Command.Default, ['generate']];\n // static description = 'Generate types for your Clarity contracts';\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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 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, {\n persistent: true,\n cwd: clarinetFolder,\n });\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 // biome-ignore lint/nursery/noShadow: ignored using `--suppress`\n const session = await getSession(config);\n // biome-ignore lint/complexity/noVoid: ignored using `--suppress`\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\nexport class DocsCommand extends BaseCommand {\n static override paths = [['docs']];\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { configFilePath } from '../config';\nimport { logger } from '../logger';\nimport { fileExists } from '../utils';\nimport { BaseCommand } from './base-command';\nimport { Option } from 'clipanion';\nimport { writeFile } from 'node:fs/promises';\nimport { tomlInit } from '../generated/init-config';\n\nexport class InitConfigCommand extends BaseCommand {\n static override paths = [['init-config'], ['init']];\n static override 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 // biome-ignore lint/suspicious/noConfusingVoidType: ignored using `--suppress`\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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"}
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 // biome-ignore lint/suspicious/useAwait: ignored using `--suppress`\n override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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 override paths = [['session-info']];\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { initSimnet } from '@stacks/clarinet-sdk';\nimport {\n type ClarityVersion,\n MAINNET_BURN_ADDRESS,\n type StacksEpochId,\n TESTNET_BURN_ADDRESS,\n getContractName,\n hexToCvValue,\n} from '@clarigen/core';\n\nimport type { Config } from './config';\nimport { readFile } from 'node:fs/promises';\nimport { mapVariables } from './files/variables';\nimport type { SessionContract, SessionWithVariables } from './session';\n\nexport async function getSession(\n config: Config\n): 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(\n `Unexpected result type for \\`(stx-get-balance \\`, got ${resultCV}`\n );\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(\n 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;\n }\n // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\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:\n contract_interface.clarity_version as ClarityVersion,\n },\n source: source ?? '',\n };\n }\n )\n )\n ).filter((x): x is SessionContract => x !== undefined);\n\n const session = {\n session_id: 0,\n accounts: allAccounts,\n contracts,\n };\n\n const variables = mapVariables(session, simnet);\n\n return {\n session_id: 0,\n accounts: allAccounts,\n contracts,\n variables,\n // variables: [],\n };\n}\n","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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\n// biome-ignore lint/suspicious/useAwait: ignored using `--suppress`\nexport async function watch(config: Config, cwd?: string) {\n // const ora = await import('ora');\n // biome-ignore lint/suspicious/noAsyncPromiseExecutor: ignored using `--suppress`\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, {\n persistent: true,\n cwd: clarinetFolder,\n });\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 // biome-ignore lint/complexity/noVoid: ignored using `--suppress`\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 override paths = [Command.Default, ['generate']];\n // static description = 'Generate types for your Clarity contracts';\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { 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 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, {\n persistent: true,\n cwd: clarinetFolder,\n });\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 // biome-ignore lint/nursery/noShadow: ignored using `--suppress`\n const session = await getSession(config);\n // biome-ignore lint/complexity/noVoid: ignored using `--suppress`\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\nexport class DocsCommand extends BaseCommand {\n static override paths = [['docs']];\n static override 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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { configFilePath } from '../config';\nimport { logger } from '../logger';\nimport { fileExists } from '../utils';\nimport { BaseCommand } from './base-command';\nimport { Option } from 'clipanion';\nimport { writeFile } from 'node:fs/promises';\nimport { tomlInit } from '../generated/init-config';\n\nexport class InitConfigCommand extends BaseCommand {\n static override paths = [['init-config'], ['init']];\n static override 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 // biome-ignore lint/suspicious/noConfusingVoidType: ignored using `--suppress`\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.1.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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"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "4.1.0",
2
+ "version": "4.1.2",
3
3
  "license": "MIT",
4
4
  "types": "./dist/index.d.cts",
5
5
  "module": "./dist/index.mjs",
@@ -50,8 +50,8 @@
50
50
  },
51
51
  "dependencies": {
52
52
  "@antfu/ni": "^0.21.12",
53
- "@clarigen/core": "4.0.2-alpha.1",
54
- "@clarigen/docs": "4.0.2-alpha.1",
53
+ "@clarigen/core": "4.1.2",
54
+ "@clarigen/docs": "4.1.2",
55
55
  "@iarna/toml": "^2.2.5",
56
56
  "@stacks/transactions": "7.1.0",
57
57
  "arktype": "^2.1.25",