@clarigen/cli 4.0.2-alpha.1 → 4.1.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.
@@ -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.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
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import { C as OutputType, F as fileExists, K as logger, a as generateESMFile, f as generateBaseFile, l as mapVariables, n as afterESM, w as configFilePath, x as Config, y as generateDocs } from "./esm-CO92uOgU.mjs";
2
+ import { C as OutputType, L as fileExists, a as generateESMFile, f as generateBaseFile, j as logger, l as mapVariables, n as afterESM, w as configFilePath, x as Config, y as generateDocs } from "./esm-BjGH_MkS.mjs";
3
3
  import { MAINNET_BURN_ADDRESS, TESTNET_BURN_ADDRESS, getContractName, hexToCvValue } from "@clarigen/core";
4
- import { readFile, writeFile } from "fs/promises";
4
+ import { dirname, join, relative } from "node:path";
5
+ import { readFile, writeFile } from "node:fs/promises";
5
6
  import { type } from "arktype";
6
7
  import { Builtins, Cli, Command, Option } from "clipanion";
7
8
  import { initSimnet } from "@stacks/clarinet-sdk";
8
9
  import chokidar from "chokidar";
9
- import { dirname, join, relative } from "node:path";
10
10
 
11
11
  //#region src/commands/base-command.ts
12
12
  var BaseCommand = class extends Command {
@@ -27,6 +27,7 @@ var BaseCommand = class extends Command {
27
27
 
28
28
  //#endregion
29
29
  //#region src/commands/session-info.ts
30
+ /** biome-ignore-all lint/style/useTrimStartEnd: suppressed */
30
31
  var SessionInfoCommand = class extends BaseCommand {
31
32
  static paths = [["session-info"]];
32
33
  static usage = Command.Usage({ description: "Log info about this project's Clarinet session" });
@@ -40,6 +41,7 @@ var SessionInfoCommand = class extends BaseCommand {
40
41
 
41
42
  //#endregion
42
43
  //#region src/clarinet-sdk.ts
44
+ /** biome-ignore-all lint/style/useTrimStartEnd: suppressed */
43
45
  async function getSession(config) {
44
46
  const simnet = await initSimnet(config.clarinetFile(), true);
45
47
  const interfaces = simnet.getContractsInterfaces();
@@ -83,6 +85,7 @@ async function getSession(config) {
83
85
 
84
86
  //#endregion
85
87
  //#region src/commands/default-command.ts
88
+ /** biome-ignore-all lint/style/useTrimStartEnd: suppressed */
86
89
  async function generate(config) {
87
90
  const session = await getSession(config);
88
91
  const baseFile = generateBaseFile(session);
@@ -99,7 +102,7 @@ async function generate(config) {
99
102
  logger.info("Types generated!");
100
103
  }
101
104
  async function watch$1(config, cwd) {
102
- return new Promise(async (resolve, reject) => {
105
+ return new Promise(async (_resolve, _reject) => {
103
106
  var _config$esm;
104
107
  try {
105
108
  await generate(config);
@@ -164,52 +167,51 @@ var DefaultCommand = class extends BaseCommand {
164
167
 
165
168
  //#endregion
166
169
  //#region src/commands/docs-command.ts
170
+ /** biome-ignore-all lint/style/useTrimStartEnd: suppressed */
167
171
  async function watch(config, cwd) {
168
- return new Promise(async (resolve, reject) => {
169
- var _config$esm;
170
- const session = await getSession(config);
171
- try {
172
- await generateDocs({
173
- session,
172
+ var _config$esm;
173
+ const session = await getSession(config);
174
+ try {
175
+ await generateDocs({
176
+ session,
177
+ config
178
+ });
179
+ } catch (error) {
180
+ logger.error({ error }, "Error generating types");
181
+ }
182
+ const clarinetFolder = dirname(config.clarinetFile());
183
+ const contractsFolder = join(clarinetFolder, "/contracts/**/*.clar");
184
+ const relativeFolder = relative(cwd || process.cwd(), contractsFolder);
185
+ const watchFolders = ((_config$esm = config.esm) === null || _config$esm === void 0 ? void 0 : _config$esm.watch_folders) ?? [];
186
+ watchFolders.push(relativeFolder);
187
+ logger.info(`Watching for changes in ${watchFolders}`);
188
+ const watcher = chokidar.watch(watchFolders, {
189
+ persistent: true,
190
+ cwd: clarinetFolder
191
+ });
192
+ let running = false;
193
+ let start = 0;
194
+ logger.level;
195
+ watcher.on("change", async (path) => {
196
+ if (!running) {
197
+ start = Date.now();
198
+ logger.info(`File ${path} has been changed. Generating types.`);
199
+ running = true;
200
+ generateDocs({
201
+ session: await getSession(config),
174
202
  config
203
+ }).catch((e) => {
204
+ logger.error({ error: e }, "Error generating types");
205
+ }).then(() => {
206
+ setTimeout(() => {
207
+ process.stdout.moveCursor(0, -1);
208
+ process.stdout.clearLine(1);
209
+ const elapsed = Date.now() - start;
210
+ logger.info(`Docs generated (${(elapsed / 1e3).toFixed(2)}s). Watching for changes...`);
211
+ running = false;
212
+ });
175
213
  });
176
- } catch (error) {
177
- logger.error({ error }, "Error generating types");
178
214
  }
179
- const clarinetFolder = dirname(config.clarinetFile());
180
- const contractsFolder = join(clarinetFolder, "/contracts/**/*.clar");
181
- const relativeFolder = relative(cwd || process.cwd(), contractsFolder);
182
- const watchFolders = ((_config$esm = config.esm) === null || _config$esm === void 0 ? void 0 : _config$esm.watch_folders) ?? [];
183
- watchFolders.push(relativeFolder);
184
- logger.info(`Watching for changes in ${watchFolders}`);
185
- const watcher = chokidar.watch(watchFolders, {
186
- persistent: true,
187
- cwd: clarinetFolder
188
- });
189
- let running = false;
190
- let start = 0;
191
- logger.level;
192
- watcher.on("change", async (path) => {
193
- if (!running) {
194
- start = Date.now();
195
- logger.info(`File ${path} has been changed. Generating types.`);
196
- running = true;
197
- generateDocs({
198
- session: await getSession(config),
199
- config
200
- }).catch((e) => {
201
- logger.error({ error: e }, "Error generating types");
202
- }).then(() => {
203
- setTimeout(() => {
204
- process.stdout.moveCursor(0, -1);
205
- process.stdout.clearLine(1);
206
- const elapsed = Date.now() - start;
207
- logger.info(`Docs generated (${(elapsed / 1e3).toFixed(2)}s). Watching for changes...`);
208
- running = false;
209
- });
210
- });
211
- }
212
- });
213
215
  });
214
216
  }
215
217
  var DocsCommand = class extends BaseCommand {
@@ -270,6 +272,7 @@ output = "docs"
270
272
 
271
273
  //#endregion
272
274
  //#region src/commands/init-config-command.ts
275
+ /** biome-ignore-all lint/style/useTrimStartEnd: suppressed */
273
276
  var InitConfigCommand = class extends BaseCommand {
274
277
  static paths = [["init-config"], ["init"]];
275
278
  static usage = { description: "Initialize a Clarigen configuration file" };
@@ -289,11 +292,11 @@ var InitConfigCommand = class extends BaseCommand {
289
292
 
290
293
  //#endregion
291
294
  //#region src/generated/version.ts
292
- const version = "4.0.2-alpha.1";
295
+ const version = "4.1.0";
293
296
 
294
297
  //#endregion
295
298
  //#region src/run-cli.ts
296
- const [node, script, ...args] = process.argv;
299
+ const [_node, _script, ...args] = process.argv;
297
300
  const cli = new Cli({
298
301
  binaryLabel: "Clarigen",
299
302
  binaryName: "clarigen",
@@ -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.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.0.2-alpha.1",
2
+ "version": "4.1.1",
3
3
  "license": "MIT",
4
4
  "types": "./dist/index.d.cts",
5
5
  "module": "./dist/index.mjs",
@@ -24,6 +24,17 @@
24
24
  "bin": {
25
25
  "clarigen": "./dist/run-cli.js"
26
26
  },
27
+ "scripts": {
28
+ "start": "tsx src/run-cli.ts",
29
+ "dev": "tsdown --watch",
30
+ "build": "tsdown",
31
+ "test": "vitest run --passWithNoTests",
32
+ "lint": "eslint \"src/**/*.{ts,tsx}\" && prettier --check \"./**/*.{ts,js}\"",
33
+ "format:fix": "prettier -w \"./**/*.{ts,js}\"",
34
+ "typecheck": "tsc --noEmit -p tsconfig-test.json",
35
+ "type-stubs": "tsx scripts/generate-type-stubs.ts && prettier --loglevel error -w ./src/**/*.ts",
36
+ "publish": "bun publish"
37
+ },
27
38
  "prettier": "@stacks/prettier-config",
28
39
  "name": "@clarigen/cli",
29
40
  "author": "Hank Stoever",
@@ -39,6 +50,8 @@
39
50
  },
40
51
  "dependencies": {
41
52
  "@antfu/ni": "^0.21.12",
53
+ "@clarigen/core": "4.0.2-alpha.1",
54
+ "@clarigen/docs": "4.0.2-alpha.1",
42
55
  "@iarna/toml": "^2.2.5",
43
56
  "@stacks/transactions": "7.1.0",
44
57
  "arktype": "^2.1.25",
@@ -49,21 +62,10 @@
49
62
  "pino": "^8.20.0",
50
63
  "pino-pretty": "^11.0.0",
51
64
  "smol-toml": "^1.1.4",
52
- "yaml": "^2.4.1",
53
- "@clarigen/core": "4.0.2-alpha.1"
65
+ "yaml": "^2.4.1"
54
66
  },
55
67
  "publishConfig": {
56
68
  "access": "public"
57
69
  },
58
- "main": "./dist/index.cjs",
59
- "scripts": {
60
- "start": "tsx src/run-cli.ts",
61
- "dev": "tsdown --watch",
62
- "build": "tsdown",
63
- "test": "vitest run --passWithNoTests",
64
- "lint": "eslint \"src/**/*.{ts,tsx}\" && prettier --check \"./**/*.{ts,js}\"",
65
- "format:fix": "prettier -w \"./**/*.{ts,js}\"",
66
- "typecheck": "tsc --noEmit -p tsconfig-test.json",
67
- "type-stubs": "tsx scripts/generate-type-stubs.ts && prettier --loglevel error -w ./src/**/*.ts"
68
- }
69
- }
70
+ "main": "./dist/index.cjs"
71
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"esm-CO92uOgU.mjs","names":["comments: string[]","currentFn: ClaridocItem | undefined","contract: ClaridocContract","type","fn","curParam: string | undefined","parsed: Comments","arg","writeFile","fsWriteFile","contractLines: string[]","defaultConfigFile: ConfigFile","type","writeFile","sessionConfig: ConfigFile | undefined","excluded: Record<string, boolean>","contractFile: string | undefined","tupleDefs: string[]","type","h: Record<string, boolean>","functionLines: string[]","type","varsAbi: Writeable<ClarityAbiTypeTuple>","parse","plan: Plan"],"sources":["../src/logger.ts","../src/docs/index.ts","../src/utils.ts","../src/docs/markdown.ts","../src/clarinet-config.ts","../src/config.ts","../src/files/docs.ts","../src/declaration.ts","../src/files/accounts.ts","../src/files/identifiers.ts","../src/files/base.ts","../src/files/variables.ts","../src/files/esm.ts"],"sourcesContent":["import { pino } from 'pino';\nimport pinoPretty from 'pino-pretty';\n\nexport const colorizedClarigen = `\\x1b[33m[Clarigen]\\x1b[0m`;\n\nexport const logger = pino(\n pinoPretty({\n colorize: true,\n ignore: 'pid,hostname,time',\n messageFormat: `${colorizedClarigen} {msg}`,\n minimumLevel: 'debug',\n })\n);\nlogger.level = 'info';\n\nexport const log = logger;\n","import {\n ClarityAbi,\n ClarityAbiArg,\n ClarityAbiFunction,\n ClarityAbiMap,\n ClarityAbiVariable,\n} from '@clarigen/core';\nimport { Config } from '../config';\nimport { logger } from '../logger';\nimport { spawn } from 'child_process';\n\nexport const FN_TYPES = ['read-only', 'public', 'private'] as const;\n\nexport const VAR_TYPES = ['map', 'data-var', 'constant'] as const;\n\ntype ClarityAbiItem = ClarityAbiFunction | ClarityAbiMap | ClarityAbiVariable;\n\ntype ClaridocItemType<T extends ClarityAbiItem> = {\n abi: T;\n comments: Comments;\n startLine: number;\n source: string[];\n};\n\nexport type ClaridocFunction = ClaridocItemType<ClarityAbiFunction>;\nexport type ClaridocMap = ClaridocItemType<ClarityAbiMap>;\nexport type ClaridocVariable = ClaridocItemType<ClarityAbiVariable>;\n\nexport interface ClaridocItem {\n abi: ClarityAbiItem;\n comments: Comments;\n startLine: number;\n source: string[];\n}\n// export type ClaridocItem = ClaridocFunction | ClaridocMap | ClaridocVariable;\n\nexport interface Comments {\n params: Record<string, ClaridocParam>;\n text: string[];\n}\n\nexport interface ClaridocContract {\n functions: ClaridocFunction[];\n maps: ClaridocMap[];\n variables: ClaridocVariable[];\n comments: string[];\n}\n\nexport interface ClaridocParam {\n abi: ClarityAbiArg;\n comments: string[];\n}\n\nexport function createContractDocInfo({\n contractSrc,\n abi,\n}: {\n contractSrc: string;\n abi: ClarityAbi;\n}): ClaridocContract {\n const lines = contractSrc.split('\\n');\n let comments: string[] = [];\n let parensCount = 0;\n let currentFn: ClaridocItem | undefined;\n // const functions: ClaridocFunction[] = [];\n const contract: ClaridocContract = {\n comments: [],\n functions: [],\n variables: [],\n maps: [],\n };\n lines.forEach((line, lineNumber) => {\n // Are we processing a function?\n if (currentFn) {\n currentFn.source.push(line);\n parensCount = traceParens(line, parensCount);\n if (parensCount === 0) {\n // end of fn\n pushItem(contract, currentFn);\n // contract.functions.push(currentFn);\n currentFn = undefined;\n }\n return;\n }\n // Are we gathering comments?\n if (isComment(line)) {\n const comment = line.replace(/^\\s*;;\\s*/g, '');\n if (contract.comments.length === lineNumber) {\n // Top-level contract comments\n contract.comments.push(comment);\n } else {\n // Aggregate for a function\n comments.push(comment);\n }\n return;\n }\n\n // Is this the start of a fn?\n // const name = getFnName(line);\n const name = findItemNameFromLine(line);\n if (typeof name === 'undefined') {\n // Not a comment or fn start, clear comments.\n comments = [];\n } else {\n // New function found.\n // const abiFn = abi.functions.find((fn) => {\n // return fn.name === name;\n // })\n const abiFn = findAbiItemByName(abi, name);\n if (!abiFn) {\n console.debug(`[claridoc]: Unable to find ABI for function \\`${name}\\`. Probably a bug.`);\n return;\n }\n parensCount = traceParens(line, 0);\n const metaComments = parseComments(comments, abiFn);\n currentFn = {\n abi: abiFn,\n comments: metaComments,\n startLine: lineNumber,\n source: [line],\n };\n if (parensCount === 0) {\n // end of fn - single line fn\n // contract.functions.push(currentFn);\n pushItem(contract, currentFn);\n currentFn = undefined;\n }\n comments = [];\n }\n });\n return contract;\n}\n\nfunction pushItem(contract: ClaridocContract, item: ClaridocItem) {\n if ('args' in item.abi) {\n contract.functions.push(item as ClaridocFunction);\n } else if ('key' in item.abi) {\n contract.maps.push(item as ClaridocMap);\n } else if ('access' in item.abi) {\n contract.variables.push(item as ClaridocVariable);\n }\n}\n\nfunction clarityNameMatcher(line: string) {\n return /[\\w|\\-|\\?|\\!]+/.exec(line);\n}\n\nfunction findItemNameFromLine(line: string): string | undefined {\n const fnType = FN_TYPES.find(type => {\n return line.startsWith(`(define-${type}`);\n });\n if (fnType) {\n const prefix = `(define-${fnType} (`;\n const startString = line.slice(prefix.length);\n const match = clarityNameMatcher(startString);\n if (!match) {\n console.debug(`[claridocs]: Unable to determine function name from line:\\n \\`${line}\\``);\n return;\n }\n return match[0];\n }\n for (const type of VAR_TYPES) {\n const prefix = `(define-${type} `;\n if (!line.startsWith(prefix)) continue;\n\n const startString = line.slice(prefix.length);\n const match = clarityNameMatcher(startString);\n if (!match) {\n console.debug(`[claridocs]: Unable to determine ${type} name from line:\\n \\`${line}\\``);\n return;\n }\n return match[0];\n }\n return undefined;\n}\n\nfunction findAbiItemByName(abi: ClarityAbi, name: string): ClarityAbiItem | undefined {\n const fn = abi.functions.find(fn => {\n return fn.name === name;\n });\n if (fn) return fn;\n const map = abi.maps.find(m => m.name === name);\n if (map) return map;\n const v = abi.variables.find(v => v.name === name);\n return v;\n}\n\nexport function isComment(line: string) {\n return line.startsWith(';;');\n}\n\nexport function getFnName(line: string) {\n const fnType = FN_TYPES.find(type => {\n return line.startsWith(`(define-${type}`);\n });\n if (typeof fnType === 'undefined') return;\n const prefix = `(define-${fnType} (`;\n const startString = line.slice(prefix.length);\n const match = clarityNameMatcher(startString);\n if (!match) {\n console.debug(`[claridocs]: Unable to determine function name from line:\\n \\`${line}\\``);\n return;\n }\n return match[0];\n}\n\nexport function traceParens(line: string, count: number) {\n let newCount = count;\n line.split('').forEach(char => {\n if (char === '(') newCount++;\n if (char === ')') newCount--;\n });\n return newCount;\n}\n\nexport function parseComments(comments: string[], abi: ClarityAbiItem): Comments {\n // const params: Record<string, ClaridocParam> = {};\n let curParam: string | undefined;\n // const newComments: string[] = [];\n const parsed: Comments = {\n text: [],\n params: {},\n };\n comments.forEach(line => {\n const paramMatches = /\\s*@param\\s([\\w|\\-]+)([;|-|\\s]*)(.*)/.exec(line);\n\n if (paramMatches === null) {\n if (!curParam || line.trim() === '') {\n curParam = undefined;\n parsed.text.push(line);\n } else {\n parsed.params[curParam].comments.push(line);\n }\n return;\n }\n\n if (!('args' in abi)) return;\n const [_full, name, _separator, rest] = paramMatches;\n const arg = abi.args.find(arg => arg.name === name);\n if (!arg) {\n console.debug(`[claridocs]: Unable to find ABI for @param ${name}`);\n return;\n }\n curParam = name;\n parsed.params[curParam] = {\n abi: arg,\n comments: [rest],\n };\n });\n\n if ('args' in abi) {\n abi.args.forEach(arg => {\n if (!parsed.params[arg.name]) {\n parsed.params[arg.name] = {\n abi: arg,\n comments: [],\n };\n }\n });\n }\n\n return parsed;\n}\n\nexport async function afterDocs(config: Config): Promise<void> {\n const command = config.docs?.after;\n if (!command) return;\n logger.debug(`Running after docs command: ${command}`);\n const parts = command.split(' ');\n const [cmd, ...args] = parts;\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, {\n cwd: config.cwd,\n stdio: 'inherit',\n });\n child.on('error', reject);\n child.on('exit', code => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with code ${code ?? 'unknown'}`));\n }\n });\n });\n}\n","// import { dirname, relative, resolve } from '../deps.ts';\nimport { getContractName, toCamelCase } from '@clarigen/core';\n// export { getContractName, toCamelCase, toKebabCase } from '@clarigen/core';\nimport { stat, mkdir, writeFile as fsWriteFile } from 'fs/promises';\nimport { dirname, resolve, relative } from 'path';\n\nexport function encodeVariableName(name: string) {\n if (/^[A-Z\\-_]*$/.test(name)) return name.replaceAll('-', '_');\n return toCamelCase(name);\n}\n\nexport async function fileExists(filename: string): Promise<boolean> {\n try {\n await stat(filename);\n // successful, file or directory must exist\n return true;\n } catch (error) {\n return false;\n // if (error.code === 'ENOENT') {\n // // file or directory does not exist\n // return false;\n // } else {\n // // unexpected error, maybe permissions, pass it along\n // throw error;\n // }\n }\n}\n\nexport async function writeFile(path: string, contents: string) {\n const dir = dirname(path);\n await mkdir(dir, { recursive: true });\n await fsWriteFile(path, contents, 'utf-8');\n return path;\n}\n\nexport function cwdRelative(path: string) {\n return relative(process.cwd(), path);\n}\n\n// Sort contracts alphabetically by their contract name.\n// Used to preserve ordering when generating files\nexport function sortContracts<T extends { contract_id: string }>(contracts: T[]): T[] {\n const nameSorted = [...contracts].sort((a, b) => {\n if (getContractName(a.contract_id, false) < getContractName(b.contract_id, false)) {\n return -1;\n }\n return 1;\n });\n return nameSorted;\n}\n","import type { Session, SessionContract } from '../session';\nimport { getContractName, getTypeString } from '@clarigen/core';\nimport {\n ClaridocContract,\n ClaridocFunction,\n ClaridocItem,\n ClaridocMap,\n ClaridocParam,\n ClaridocVariable,\n // Comments,\n createContractDocInfo,\n} from './index';\nimport { basename } from 'path';\nimport { sortContracts } from '../utils';\n\nexport function generateMarkdown({\n contract,\n contractFile,\n withToc = true,\n}: {\n contract: SessionContract;\n contractFile?: string;\n withToc?: boolean;\n}) {\n const contractName = getContractName(contract.contract_id, false);\n const doc = createContractDocInfo({\n contractSrc: contract.source,\n abi: contract.contract_interface,\n });\n\n const functions = doc.functions.map(fn => markdownFunction(fn, contractFile));\n const maps = doc.maps.map(map => markdownMap(map, contractFile));\n const vars = doc.variables\n .filter(v => v.abi.access === 'variable')\n .map(v => markdownVar(v, contractFile));\n const constants = doc.variables\n .filter(v => v.abi.access === 'constant')\n .map(v => markdownVar(v, contractFile));\n let fileLine = '';\n if (contractFile) {\n const fileName = basename(contractFile);\n fileLine = `\\n[\\`${fileName}\\`](${contractFile})`;\n }\n\n return `\n# ${contractName}\n${fileLine}\n\n${doc.comments.join('\\n\\n')}\n\n${withToc ? markdownTOC(doc) : ''}\n\n## Functions\n\n${functions.join('\\n\\n')}\n\n## Maps\n\n${maps.join('\\n\\n')}\n\n## Variables\n\n${vars.join('\\n\\n')}\n\n## Constants\n\n${constants.join('\\n\\n')}\n `;\n}\n\nexport function markdownFunction(fn: ClaridocFunction, contractFile?: string) {\n const params = mdParams(fn);\n const returnType = getTypeString(fn.abi.outputs.type);\n const paramSigs = fn.abi.args.map(arg => {\n return `(${arg.name} ${getTypeString(arg.type)})`;\n });\n\n const startLine = fn.startLine + 1;\n\n let link = '';\n if (contractFile) {\n link = `[View in file](${contractFile}#L${startLine})`;\n }\n\n const source = `<details>\n <summary>Source code:</summary>\n\n\\`\\`\\`clarity\n${fn.source.join('\\n')}\n\\`\\`\\`\n</details>\n`;\n\n const sig = `(define-${fn.abi.access.replace('_', '-')} (${fn.abi.name} (${paramSigs.join(\n ' '\n )}) ${returnType})`;\n\n return `### ${fn.abi.name}\n\n${link}\n\n\\`${sig}\\`\n\n${fn.comments.text.join('\\n')}\n\n${source}\n\n${params}`;\n}\n\nfunction mdParams(fn: ClaridocFunction) {\n if (fn.abi.args.length === 0) return '';\n const hasDescription = Object.values(fn.comments.params).some(p => p.comments.length > 0);\n const params = Object.values(fn.comments.params).map(p => markdownParam(p, hasDescription));\n // const hasDescription = params.some(p => p.includes('Description'));\n\n return `**Parameters:**\n\n| Name | Type | ${hasDescription ? 'Description |' : ''}\n| --- | --- | ${hasDescription ? '--- |' : ''}\n${params.join('\\n')}`;\n}\n\nfunction markdownParam(param: ClaridocParam, withDescription: boolean) {\n const typeString = getTypeString(param.abi.type);\n const base = `| ${param.abi.name} | ${typeString} |`;\n if (!withDescription) return base;\n return `${base} ${param.comments.join(' ')} |`;\n // return `| ${param.abi.name} | ${typeString} | ${param.comments.join(' ')} |`;\n}\n\nfunction markdownMap(map: ClaridocMap, contractFile?: string) {\n const startLine = map.startLine + 1;\n\n let link = '';\n if (contractFile) {\n link = `[View in file](${contractFile}#L${startLine})`;\n }\n\n return `### ${map.abi.name}\n\n${map.comments.text.join('\\n')}\n\n\\`\\`\\`clarity\n${map.source.join('\\n')}\n\\`\\`\\`\n\n${link}`;\n}\n\nfunction markdownVar(variable: ClaridocVariable, contractFile?: string) {\n const startLine = variable.startLine + 1;\n\n let link = '';\n if (contractFile) {\n link = `[View in file](${contractFile}#L${startLine})`;\n }\n\n const sig = variable.abi.access === 'variable' ? getTypeString(variable.abi.type) : '';\n\n return `### ${variable.abi.name}\n\n${sig}\n\n${variable.comments.text.join('\\n')}\n\n\\`\\`\\`clarity\n${variable.source.join('\\n')}\n\\`\\`\\`\n\n${link}`;\n}\n\nfunction markdownTOC(contract: ClaridocContract) {\n const publics = contract.functions.filter(fn => fn.abi.access === 'public');\n const readOnly = contract.functions.filter(fn => fn.abi.access === 'read_only');\n const privates = contract.functions.filter(fn => fn.abi.access === 'private');\n const maps = contract.maps;\n const constants = contract.variables.filter(v => v.abi.access === 'constant');\n const vars = contract.variables.filter(v => v.abi.access === 'variable');\n\n function tocLine(fn: ClaridocItem) {\n const name = fn.abi.name;\n return `- [\\`${name}\\`](#${name.toLowerCase().replaceAll('?', '')})`;\n }\n\n return `**Public functions:**\n\n${publics.map(tocLine).join('\\n')}\n\n**Read-only functions:**\n\n${readOnly.map(tocLine).join('\\n')}\n\n**Private functions:**\n\n${privates.map(tocLine).join('\\n')}\n\n**Maps**\n\n${maps.map(tocLine).join('\\n')}\n\n**Variables**\n\n${vars.map(tocLine).join('\\n')}\n\n**Constants**\n\n${constants.map(tocLine).join('\\n')}\n`;\n}\n\nexport function generateReadme(session: Session, excluded: Record<string, boolean>) {\n const contractLines: string[] = [];\n sortContracts(session.contracts).forEach(contract => {\n const name = getContractName(contract.contract_id, false);\n if (excluded[name]) return;\n const fileName = `${name}.md`;\n const line = `- [\\`${name}\\`](${fileName})`;\n contractLines.push(line);\n });\n const fileContents = `# Contracts\n\n${contractLines.join('\\n')}\n `;\n\n return fileContents;\n}\n\n// function md(strings: TemplateStringsArray, ..._values: any) {\n// const raw = String.raw({ raw: strings }, ..._values);\n// const fixed = raw.split('\\n').map((s) => s.trim()).join('\\n');\n// return fixed;\n// }\n","import { type } from 'arktype';\nimport { readFile } from 'fs/promises';\nimport { parse } from '@iarna/toml';\n\nexport const ClarinetConfig = type({\n project: type({\n requirements: type({\n contract_id: type('string').describe('Contract ID'),\n })\n .array()\n .describe('Project requirements')\n .optional(),\n cache_location: type({\n path: type('string').describe('Cache location path'),\n }).optional(),\n }),\n contracts: type({\n '[string]': type({\n path: type('string').describe('Contract path'),\n }),\n }).optional(),\n});\n\nexport type ClarinetConfig = typeof ClarinetConfig.infer;\n\nexport async function getClarinetConfig(path: string): Promise<ClarinetConfig> {\n const file = await readFile(path, 'utf-8');\n const config = ClarinetConfig.assert(parse(file));\n return config;\n}\n","import { type } from 'arktype';\nimport { log, logger } from './logger';\nimport { fileExists, writeFile } from './utils';\nimport { ClarinetConfig, getClarinetConfig } from './clarinet-config';\nimport { dirname, join, relative, resolve } from 'path';\nimport { stringify, parse } from '@iarna/toml';\nimport { readFile } from 'fs/promises';\n\nexport const CONFIG_FILE = 'Clarigen.toml' as const;\n\nexport enum OutputType {\n ESM = 'types',\n ESM_OLD = 'esm',\n Docs = 'docs',\n}\n\nconst typesSchema = type({\n 'output?': type('string').describe('Path to the output file'),\n 'outputs?': type('string[]').describe('Paths to the output files'),\n 'include_accounts?': type('boolean').describe('Include accounts in the output'),\n 'after?': type('string').describe('Script to run after the output is generated'),\n 'include_boot_contracts?': type('boolean').describe('Include boot contracts in the output'),\n 'watch_folders?': type('string[]').describe('Folders to watch for changes'),\n}).optional();\n\nexport const ConfigFile = type({\n clarinet: type('string').describe('Path to the Clarinet config file'),\n [OutputType.ESM]: typesSchema,\n [OutputType.ESM_OLD]: typesSchema,\n [OutputType.Docs]: type({\n 'output?': type('string').describe('Path to docs output folder. Defaults to ./docs'),\n 'outputs?': type('string[]').describe('Paths to docs output folders'),\n 'exclude?': type('string[]').describe('Contracts to exclude from docs generation'),\n 'after?': type('string').describe('Script to run after docs are generated'),\n }).optional(),\n});\n\nexport type ConfigFile = typeof ConfigFile.infer;\n\nexport const defaultConfigFile: ConfigFile = {\n clarinet: './Clarinet.toml',\n};\n\nexport class Config {\n public configFile: ConfigFile;\n public clarinet: ClarinetConfig;\n public cwd: string;\n\n constructor(config: ConfigFile, clarinet: ClarinetConfig, cwd?: string) {\n this.configFile = config;\n this.clarinet = clarinet;\n this.cwd = cwd ?? process.cwd();\n }\n\n public static async load(cwd?: string) {\n const config = await getConfig(cwd);\n if (config[OutputType.ESM_OLD]) {\n config[OutputType.ESM] = config[OutputType.ESM_OLD];\n delete config[OutputType.ESM_OLD];\n }\n const clarinet = await getClarinetConfig(resolve(cwd ?? '', config.clarinet));\n return new this(config, clarinet, cwd);\n }\n\n getOutputs(type: OutputType): string[] {\n const singlePath = this.configFile[type]?.output;\n const multiPath = this.configFile[type]?.outputs || [];\n if (singlePath !== undefined) return [singlePath];\n return multiPath;\n }\n\n outputResolve(type: OutputType, filePath?: string): string[] | null {\n const outputs = this.getOutputs(type);\n if (!this.supports(type)) return null;\n return outputs.map(path => {\n return resolve(this.cwd, path, filePath || '');\n });\n }\n\n async writeOutput(type: OutputType, contents: string, filePath?: string) {\n const paths = this.outputResolve(type, filePath);\n if (paths === null) return null;\n await Promise.all(\n paths.map(async path => {\n await writeFile(path, contents);\n log.debug(`Generated ${type} file at ${relative(this.cwd, path)}`);\n })\n );\n return paths;\n }\n\n supports(type: OutputType) {\n return this.getOutputs(type).length > 0;\n }\n\n type(type: OutputType) {\n return this.configFile[type];\n }\n\n get esm() {\n return this.configFile[OutputType.ESM];\n }\n get docs() {\n return this.configFile[OutputType.Docs];\n }\n\n clarinetFile() {\n return resolve(this.cwd, this.configFile.clarinet);\n }\n\n joinFromClarinet(filePath: string) {\n const baseDir = dirname(this.clarinetFile());\n return join(baseDir, filePath);\n }\n}\n\nexport function configFilePath(cwd?: string) {\n return resolve(cwd ?? process.cwd(), CONFIG_FILE);\n}\n\nexport async function saveConfig(config: ConfigFile) {\n const configToml = stringify({ ...config });\n await writeFile(configFilePath(), configToml);\n}\n\n// memoize / singleton\nlet sessionConfig: ConfigFile | undefined;\n\nexport async function getConfig(cwd?: string): Promise<ConfigFile> {\n if (typeof sessionConfig !== 'undefined') return sessionConfig;\n const path = configFilePath(cwd);\n if (await fileExists(path)) {\n const toml = await readFile(path, 'utf-8');\n const parsedToml = parse(toml);\n const parsed = ConfigFile(parsedToml);\n if (parsed instanceof type.errors) {\n logger.error(`Error parsing Clarigen config: ${parsed.summary}`);\n throw new Error(`Error parsing Clarigen config: ${parsed.summary}`);\n }\n sessionConfig = parsed;\n } else {\n sessionConfig = defaultConfigFile;\n }\n return sessionConfig;\n}\n","import { SessionWithVariables } from '../session';\nimport { Config, OutputType } from '../config';\nimport { log } from '../logger';\nimport { getContractName } from '@clarigen/core';\nimport { relative, extname } from 'path';\nimport { generateMarkdown, generateReadme } from '../docs/markdown';\nimport { afterDocs } from '../docs';\n\nexport async function generateDocs({\n session,\n config,\n}: {\n session: SessionWithVariables;\n config: Config;\n}) {\n const docs = config.configFile[OutputType.Docs];\n const docsBase = docs?.output;\n if (!docsBase) {\n warnNoDocs();\n return;\n }\n const docsPathExt = extname(docsBase);\n if (docsPathExt) {\n log.warn(`Docs output path ('${docsBase}') looks like a file - it needs to be a directory.`);\n }\n const excluded: Record<string, boolean> = Object.fromEntries(\n (docs.exclude || []).map(e => {\n return [e, true];\n })\n );\n log.debug(`Generating docs at path \\`${docsBase}\\``);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const docsBaseFolder = config.outputResolve(OutputType.Docs, './')![0];\n const paths = await Promise.all(\n session.contracts.map(async contract => {\n const name = getContractName(contract.contract_id, false);\n if (excluded[name]) return null;\n const docFile = `${name}.md`;\n // location of\n const contractPathDef = config.clarinet.contracts?.[name]?.path;\n let contractFile: string | undefined;\n // if we have the contract file, make a relative link\n if (contractPathDef) {\n const contractPathFull = config.joinFromClarinet(contractPathDef);\n contractFile = relative(docsBaseFolder, contractPathFull);\n } else {\n // TODO: probably a requirement\n log.debug(`Couldn't find contract file from Clarinet.toml for contract ${name}`);\n }\n\n const md = generateMarkdown({ contract, contractFile });\n\n // log.debug(`Writing docs markdown file at ${cwdRelative(docPathFull)}`);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const path = (await config.writeOutput(OutputType.Docs, md, docFile))!;\n return path[0];\n })\n );\n\n const readme = generateReadme(session, excluded);\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n paths.push((await config.writeOutput(OutputType.Docs, readme, 'README.md'))![0]);\n await afterDocs(config);\n}\n\nfunction warnNoDocs() {\n log.warn(\n `\\nClarigen config file doesn't include an output directory for docs.\n\nTo generate docs, specify 'docs.output' in your config file:\n\n[docs]\noutput = \"docs/\"\n `.trimEnd()\n );\n}\n","import {\n isClarityAbiBuffer,\n isClarityAbiList,\n isClarityAbiOptional,\n isClarityAbiPrimitive,\n isClarityAbiResponse,\n isClarityAbiStringAscii,\n isClarityAbiStringUtf8,\n isClarityAbiTuple,\n ClarityAbiType,\n ClarityAbiTypeTraitReference,\n isClarityAbiTraitReference,\n} from '@clarigen/core';\n// import { ClarityAbiArg, ClarityAbiFunction, ClarityAbiType } from '../types.ts';\nimport { toCamelCase, ClarityAbiArg, ClarityAbiFunction } from '@clarigen/core';\n\nexport const jsTypeFromAbiType = (val: ClarityAbiType, isArgument = false): string => {\n if (isClarityAbiPrimitive(val)) {\n if (val === 'uint128') {\n if (isArgument) return 'number | bigint';\n return 'bigint';\n } else if (val === 'int128') {\n if (isArgument) return 'number | bigint';\n return 'bigint';\n } else if (val === 'bool') {\n return 'boolean';\n } else if (val === 'principal') {\n return 'string';\n } else if (val === 'none') {\n return 'null';\n } else if (val === 'trait_reference') {\n return 'string';\n } else {\n throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(val)}`);\n }\n } else if (isClarityAbiBuffer(val)) {\n return 'Uint8Array';\n } else if (isClarityAbiResponse(val)) {\n const ok = jsTypeFromAbiType(val.response.ok, isArgument);\n const err = jsTypeFromAbiType(val.response.error, isArgument);\n return `Response<${ok}, ${err}>`;\n } else if (isClarityAbiOptional(val)) {\n const innerType = jsTypeFromAbiType(val.optional, isArgument);\n return `${innerType} | null`;\n } else if (isClarityAbiTuple(val)) {\n const tupleDefs: string[] = [];\n val.tuple.forEach(({ name, type }) => {\n const camelName = toCamelCase(name);\n const innerType = jsTypeFromAbiType(type, isArgument);\n tupleDefs.push(`\"${camelName}\": ${innerType};`);\n });\n return `{\n ${tupleDefs.join('\\n ')}\n}`;\n } else if (isClarityAbiList(val)) {\n const innerType = jsTypeFromAbiType(val.list.type, isArgument);\n return `${innerType}[]`;\n } else if (isClarityAbiStringAscii(val)) {\n return 'string';\n } else if (isClarityAbiStringUtf8(val)) {\n return 'string';\n } else if (isClarityAbiTraitReference(val)) {\n return 'string';\n } else {\n throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(val)}`);\n }\n};\n\nexport function abiArgType(arg: ClarityAbiArg) {\n const nativeType = jsTypeFromAbiType(arg.type, true);\n const argName = getArgName(arg.name);\n return `${argName}: TypedAbiArg<${nativeType}, \"${argName}\">`;\n}\n\nexport function abiFunctionType(abiFunction: ClarityAbiFunction) {\n const args = abiFunction.args.map(abiArgType);\n const retType = jsTypeFromAbiType(abiFunction.outputs.type);\n const argsTuple = `[${args.join(', ')}]`;\n return `TypedAbiFunction<${argsTuple}, ${retType}>`;\n}\n\n// Check if it's a reserved word, and then camelCase\nexport function getArgName(name: string) {\n const camel = toCamelCase(name);\n const prefix = RESERVED[camel] ? '_' : '';\n return `${prefix}${camel}`;\n}\n\nfunction _hash(...words: string[]) {\n const h: Record<string, boolean> = {};\n for (const word of words) {\n h[word] = true;\n }\n return h;\n}\n\nconst RESERVED = _hash(\n // Keywords, ES6 11.6.2.1, http://www.ecma-international.org/ecma-262/6.0/index.html#sec-keywords\n 'break',\n 'do',\n 'in',\n 'typeof',\n 'case',\n 'else',\n 'instanceof',\n 'var',\n 'catch',\n 'export',\n 'new',\n 'void',\n 'class',\n 'extends',\n 'return',\n 'while',\n 'const',\n 'finally',\n 'super',\n 'with',\n 'continue',\n 'for',\n 'switch',\n 'yield',\n 'debugger',\n 'function',\n 'this',\n 'default',\n 'if',\n 'throw',\n 'delete',\n 'import',\n 'try',\n // Future Reserved Words, ES6 11.6.2.2\n // http://www.ecma-international.org/ecma-262/6.0/index.html#sec-future-reserved-words\n 'enum',\n 'await',\n // NullLiteral & BooleanLiteral\n 'null',\n 'true',\n 'false'\n);\n","import { Session, SessionAccount } from '../session';\n\nexport function generateAccountsCode(accounts: SessionAccount[]) {\n const sortedAccounts = sortAccounts(accounts);\n const namedAccounts = Object.fromEntries(\n sortedAccounts.map(a => {\n const { name, ...rest } = a;\n return [name, rest];\n })\n );\n // return `export const accounts = ${JSON.stringify(namedAccounts)} as const;`;\n return JSON.stringify(namedAccounts);\n}\n\n// Sort accounts alphabetically by their name.\n// Used to preserve ordering when generating files\nexport function sortAccounts(accounts: SessionAccount[]): SessionAccount[] {\n const nameSorted = [...accounts].sort((a, b) => {\n if (a.name < b.name) {\n return -1;\n }\n return 1;\n });\n return nameSorted;\n}\n","import { getContractName } from '@clarigen/core';\nimport { Session } from '../session';\nimport { sortContracts } from '../utils';\n\nexport function generateIdentifiers(session: Session) {\n const identifiers = Object.fromEntries(\n sortContracts(session.contracts).map(c => {\n const contractName = getContractName(c.contract_id);\n return [contractName, c.contract_id];\n })\n );\n return identifiers;\n}\n\nexport function generateIdentifiersCode(session: Session) {\n const identifiers = generateIdentifiers(session);\n\n return `export const identifiers = ${JSON.stringify(identifiers)} as const`;\n}\n","import { abiFunctionType, jsTypeFromAbiType } from '../declaration';\nimport type { SessionContract, SessionWithVariables } from '../session';\nimport { encodeVariableName, sortContracts } from '../utils';\nimport { toCamelCase, ClarityAbiVariable } from '@clarigen/core';\nimport { generateAccountsCode } from './accounts';\nimport { generateIdentifiersCode } from './identifiers';\nimport { inspect, InspectOptions } from 'util';\n\nexport function generateContractMeta(contract: SessionContract, constants: string) {\n const abi = contract.contract_interface;\n const functionLines: string[] = [];\n const { functions, maps, variables, non_fungible_tokens, ...rest } = abi;\n\n functions.forEach(func => {\n let functionLine = `${toCamelCase(func.name)}: `;\n const funcDef = JSON.stringify(func);\n functionLine += funcDef;\n const functionType = abiFunctionType(func);\n functionLine += ` as ${functionType}`;\n functionLines.push(functionLine);\n });\n\n const mapLines = maps.map(map => {\n let mapLine = `${toCamelCase(map.name)}: `;\n const keyType = jsTypeFromAbiType(map.key, true);\n const valType = jsTypeFromAbiType(map.value);\n mapLine += JSON.stringify(map);\n mapLine += ` as TypedAbiMap<${keyType}, ${valType}>`;\n return mapLine;\n });\n\n const otherAbi = JSON.stringify(rest);\n const contractName = contract.contract_id.split('.')[1];\n\n const variableLines = encodeVariables(variables);\n\n const nftLines = non_fungible_tokens.map(nft => {\n return JSON.stringify(nft);\n });\n\n return `{\n ${serializeLines('functions', functionLines)}\n ${serializeLines('maps', mapLines)}\n ${serializeLines('variables', variableLines)}\n constants: ${constants},\n ${serializeArray('non_fungible_tokens', nftLines)}\n ${otherAbi.slice(1, -1)},\n contractName: '${contractName}',\n }`;\n}\n\nexport const TYPE_IMPORTS = `import type { TypedAbiArg, TypedAbiFunction, TypedAbiMap, TypedAbiVariable, Response } from '@clarigen/core';`;\n\nexport function generateBaseFile(session: SessionWithVariables) {\n const combined = session.contracts.map((c, i) => ({\n ...c,\n constants: session.variables[i],\n }));\n const contractDefs = sortContracts(combined).map(contract => {\n const meta = generateContractMeta(contract, contract.constants);\n const id = contract.contract_id.split('.')[1];\n const keyName = toCamelCase(id);\n return `${keyName}: ${meta}`;\n });\n\n const file = `\n${TYPE_IMPORTS}\n\nexport const contracts = {\n ${contractDefs.join(',\\n')}\n} as const;\n\nexport const accounts = ${generateAccountsCode(session.accounts)} as const;\n\n${generateIdentifiersCode(session)}\n\nexport const simnet = {\n accounts,\n contracts,\n identifiers,\n} as const;\n\n`;\n return file;\n}\n\nexport function encodeVariables(variables: ClarityAbiVariable[]) {\n return variables.map(v => {\n let varLine = `${encodeVariableName(v.name)}: `;\n const type = jsTypeFromAbiType(v.type);\n const varJSON = serialize(v);\n varLine += `${varJSON} as TypedAbiVariable<${type}>`;\n return varLine;\n });\n}\n\n// Extend the Uint8Array prototype in TypeScript to include util.inspect.custom\ndeclare global {\n interface Uint8Array {\n [inspect.custom](depth: number, options: InspectOptions): string;\n }\n}\n\nUint8Array.prototype[inspect.custom] = function (depth: number, options: InspectOptions) {\n return `Uint8Array.from([${this.join(',')}])`;\n};\n\nexport function serialize(obj: any) {\n return inspect(obj, {\n // showHidden: false,\n // depth: 100,\n // colors: false,\n showHidden: false,\n // iterableLimit: 100000,\n compact: false,\n // trailingComma: true,\n depth: 100,\n colors: false,\n maxArrayLength: Infinity,\n maxStringLength: Infinity,\n breakLength: Infinity,\n numericSeparator: true,\n // strAbbreviateSize: 100000,\n });\n}\n\nfunction serializeLines(key: string, lines: string[]) {\n return `\"${key}\": {\n ${lines.join(',\\n ')}\n },`;\n}\n\nfunction serializeArray(key: string, lines: string[]) {\n return `\"${key}\": [\n ${lines.join(',\\n ')}\n ],`;\n}\n","import type { Simnet } from '@stacks/clarinet-sdk';\nimport { logger } from '../logger';\nimport { Session, SessionContract } from '../session';\nimport {\n ClarityAbiTypeTuple,\n ClarityAbiVariable,\n cvToValue,\n getContractName,\n} from '@clarigen/core';\nimport { serialize } from './base';\n\nfunction clarityVersionForContract(contract: SessionContract) {\n switch (contract.contract_interface.clarity_version) {\n case 'Clarity1':\n return 1;\n case 'Clarity2':\n return 2;\n case 'Clarity3':\n return 3;\n case 'Clarity4':\n return 4;\n default:\n return 3;\n }\n}\n\nexport function getVariablesV2(contract: SessionContract, simnet: Simnet, verbose?: boolean) {\n const [deployer] = contract.contract_id.split('.');\n const fakeId = `${getContractName(contract.contract_id)}-vars`;\n logger.debug(`Deploying ${contract.contract_id} for variables.`);\n\n if (!contract.source) {\n logger.debug(\n `Contract ${getContractName(contract.contract_id)} has no source. Skipping variables.`\n );\n return {};\n }\n\n if (contract.contract_interface.variables.length === 0) {\n logger.info(`Contract ${getContractName(contract.contract_id, false)} has no variables`);\n return {};\n }\n\n let varFn = `{\\n`;\n\n const varLines = contract.contract_interface.variables.map(variable => {\n let varLine = `${variable.name}: `;\n if (variable.access === 'constant') {\n varLine += `${variable.name}`;\n } else {\n varLine += `(var-get ${variable.name})`;\n }\n return varLine;\n });\n varFn += varLines.map(l => ` ${l},`).join('\\n');\n\n varFn += '\\n}';\n\n const fullSrc = contract.source + `\\n\\n${varFn}`;\n try {\n const receipt = simnet.deployContract(\n fakeId,\n fullSrc,\n {\n clarityVersion: clarityVersionForContract(contract),\n },\n deployer\n );\n const result = receipt.result;\n\n const varsAbi: Writeable<ClarityAbiTypeTuple> = {\n tuple: [],\n };\n contract.contract_interface.variables.forEach(v => {\n const _v = v as unknown as Writeable<ClarityAbiVariable>;\n varsAbi.tuple.push({\n type: _v.type,\n name: _v.name,\n });\n });\n\n if (verbose) {\n // const cv = cvConvertHiro(result);\n // console.log('cv', cv);\n // console.log(esCvToValue(cvConvertHiro(result), true));\n logger.info(cvToValue(result, true));\n }\n\n // return esCvToValue(cvConvertHiro(result), true);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return cvToValue(result, true);\n } catch (error) {\n logger.warn(\n { err: error },\n `Error getting variables for ${getContractName(contract.contract_id, false)}`\n );\n // logger.error(`Source code: ${contract.source} with type ${String(typeof contract.source)}`);\n // logger.error(fullSrc);\n return {};\n }\n}\n\ntype Writeable<T> = { -readonly [P in keyof T]: Writeable<T[P]> };\n\nexport function mapVariables(session: Session, simnet: Simnet) {\n return session.contracts.map(contract => {\n const vars = getVariablesV2(contract, simnet);\n return serialize(vars);\n });\n}\n","import { readFile } from 'fs/promises';\nimport { join, dirname, relative } from 'path';\nimport { Config } from '../config';\nimport { parse } from 'yaml';\nimport {\n Batch,\n getContractTxs,\n getDeploymentContract,\n getDeploymentTxPath,\n getIdentifierForDeploymentTx,\n type DeploymentTransaction,\n} from '@clarigen/core/deployment';\nimport { DeploymentPlan, SimnetDeploymentPlan } from '@clarigen/core';\nimport { getContractName } from '@clarigen/core';\nimport { cwdRelative, sortContracts } from '../utils';\nimport { Session } from '../session';\nimport { spawn } from 'child_process';\nimport { logger } from '../logger';\n\nexport async function parseDeployment(path: string) {\n const contents = await readFile(path, 'utf-8');\n const parsed = parse(contents);\n return parsed as Plan;\n}\n\nexport const DEPLOYMENT_NETWORKS = ['devnet', 'simnet', 'testnet', 'mainnet'] as const;\nexport type DeploymentNetwork = (typeof DEPLOYMENT_NETWORKS)[number];\n\ntype Plan = DeploymentPlan | undefined;\ntype DeploymentsMap = {\n [key in DeploymentNetwork]: Plan;\n};\n\nexport async function getDeployments(config: Config): Promise<DeploymentsMap> {\n const entries = await Promise.all(\n DEPLOYMENT_NETWORKS.map(async network => {\n const file = `default.${network}-plan.yaml`;\n const path = join(dirname(config.clarinetFile()), 'deployments', file);\n let plan: Plan;\n try {\n plan = await parseDeployment(path);\n } catch (_) {}\n return [network, plan] as [DeploymentNetwork, Plan];\n })\n );\n return Object.fromEntries(entries) as DeploymentsMap;\n}\n\nexport async function generateESMFile({\n baseFile,\n session,\n config,\n}: {\n baseFile: string;\n session: Session;\n config: Config;\n}) {\n const deployments = await getDeployments(config);\n const contractDeployments = collectContractDeployments(session, deployments, config);\n\n const simnet = generateSimnetCode(config, deployments, session);\n\n return `${baseFile}\nexport const deployments = ${JSON.stringify(contractDeployments)} as const;\n${simnet}\nexport const project = {\n contracts,\n deployments,\n} as const;\n `;\n}\n\nexport type ContractDeployments = {\n [key in DeploymentNetwork]: string | null;\n};\n\nexport type FullContractDeployments = {\n [contractName: string]: ContractDeployments;\n};\n\nfunction insertNetworkId(\n deployments: FullContractDeployments,\n identifier: string,\n network: DeploymentNetwork\n) {\n const name = getContractName(identifier);\n if (!deployments[name]) {\n // log.debug(`Not setting deployment ID for ${name} on ${network}`);\n return;\n }\n if (deployments[name][network] === null) {\n deployments[name][network] = identifier;\n }\n}\n\nexport function collectContractDeployments(\n session: Session,\n deployments: DeploymentsMap,\n config: Config\n): FullContractDeployments {\n const full = Object.fromEntries(\n sortContracts(session.contracts).map(contract => {\n const contractName = getContractName(contract.contract_id);\n const contractDeployments = Object.fromEntries(\n DEPLOYMENT_NETWORKS.map(network => {\n const deployment = deployments[network];\n if (typeof deployment === 'undefined') {\n return [network, null];\n }\n try {\n const contractName = contract.contract_id.split('.')[1];\n const tx = getDeploymentContract(contractName, deployment);\n const id = getIdentifierForDeploymentTx(tx);\n return [network, id];\n } catch (_) {\n return [network, null];\n }\n })\n ) as ContractDeployments;\n return [contractName, contractDeployments];\n })\n ) as FullContractDeployments;\n\n const deployer = session.accounts.find(a => a.name === 'deployer');\n\n // handle defaults when there is no deployment file\n config.clarinet.project.requirements?.forEach(({ contract_id }) => {\n insertNetworkId(full, contract_id, 'mainnet');\n const contractName = contract_id.split('.')[1];\n if (deployer) {\n const devnetId = `${deployer.address}.${contractName}`;\n insertNetworkId(full, devnetId, 'devnet');\n }\n });\n\n session.contracts.forEach(contract => {\n insertNetworkId(full, contract.contract_id, 'devnet');\n insertNetworkId(full, contract.contract_id, 'simnet');\n });\n\n return full;\n}\n\nexport function collectDeploymentFiles(\n deployments: DeploymentsMap,\n clarinetFolder: string,\n cwd: string\n) {\n if (!deployments.simnet) return [];\n const simnet = deployments.simnet as SimnetDeploymentPlan;\n const txs = getContractTxs(simnet.plan.batches as Batch<DeploymentTransaction>[]);\n const entries = txs.map(tx => {\n const id = getIdentifierForDeploymentTx(tx);\n const contractFile = getDeploymentTxPath(tx);\n return {\n identifier: id,\n file: relative(cwd, join(clarinetFolder, contractFile)),\n };\n });\n return entries;\n}\n\nfunction generateSimnetCode(config: Config, deployments: DeploymentsMap, _session: Session) {\n if (!config.esm?.include_accounts) return '';\n\n const clarinetFolder = dirname(config.clarinetFile());\n\n const files = collectDeploymentFiles(deployments, clarinetFolder, config.cwd);\n // const accounts = generateAccountsCode(session);\n\n return `\nexport const simnetDeployment = ${JSON.stringify(files)};\n`;\n // ${accounts}\n\n // export const simnet = {\n // deployment: simnetDeployment,\n // accounts,\n // };\n}\n\nexport async function afterESM(config: Config): Promise<void> {\n const command = config.esm?.after;\n if (!command) return;\n logger.debug(`Running after ESM command: ${command}`);\n const parts = command.split(' ');\n const [cmd, ...args] = parts;\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, {\n cwd: config.cwd,\n stdio: 'inherit',\n });\n child.on('error', reject);\n child.on('exit', code => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with code ${code ?? 'unknown'}`));\n }\n });\n });\n}\n"],"mappings":"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"}