@secondlayer/cli 14.3.1 → 15.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -17
- package/dist/cli.js +1532 -4005
- package/dist/cli.js.map +17 -29
- package/dist/index.d.ts +26 -237
- package/dist/index.js +127 -335
- package/dist/index.js.map +7 -8
- package/package.json +9 -14
- package/dist/core/plugin-manager.d.ts +0 -268
- package/dist/core/plugin-manager.js +0 -396
- package/dist/core/plugin-manager.js.map +0 -13
- package/dist/plugins/index.d.ts +0 -338
- package/dist/plugins/index.js +0 -1755
- package/dist/plugins/index.js.map +0 -26
package/dist/index.js.map
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/
|
|
3
|
+
"sources": ["../src/utils/constants.ts", "../src/utils/contract-id.ts", "../src/plugins/clarinet/index.ts", "../src/utils/config.ts", "../src/index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n *
|
|
5
|
+
"/**\n * Shared constants for @secondlayer/cli\n */\n\n/**\n * Stacks boot-contract address, used as the default sender for read-only\n * calls when the user hasn't configured one.\n */\nexport const DEFAULT_SENDER_ADDRESS = \"SP000000000000000000002Q6VF78\";\n",
|
|
6
6
|
"/**\n * Parse a fully-qualified contract ID (\"address.contractName\") into its parts.\n * Throws if the input doesn't contain a dot separator.\n */\nexport function parseContractId(contractId: string): {\n\taddress: string;\n\tcontractName: string;\n} {\n\tconst dotIndex = contractId.indexOf(\".\");\n\tif (dotIndex === -1) {\n\t\tthrow new Error(\n\t\t\t`Invalid contract ID: \"${contractId}\" (expected \"address.contractName\")`,\n\t\t);\n\t}\n\treturn {\n\t\taddress: contractId.slice(0, dotIndex),\n\t\tcontractName: contractId.slice(dotIndex + 1),\n\t};\n}\n",
|
|
7
|
-
"/**\n *
|
|
8
|
-
"/**\n * Plugin Manager for @secondlayer/cli\n * Handles plugin registration, lifecycle execution, and output management\n */\n\nimport { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { isValidAddress as _validateStacksAddress } from \"@secondlayer/stacks\";\nconst validateStacksAddress = _validateStacksAddress as (\n\taddress: string,\n) => boolean;\nimport { getErrorMessage } from \"@secondlayer/shared\";\nimport { toCamelCase } from \"@secondlayer/stacks/clarity\";\nimport type {\n\tContractConfig,\n\tGenerateContext,\n\tGeneratedOutput,\n\tHookResult,\n\tLogger,\n\tPluginExecutionContext,\n\tPluginUtils,\n\tProcessedContract,\n\tResolvedConfig,\n\tSecondLayerPlugin,\n\tUserConfig,\n} from \"../types/plugin\";\nimport { isClarinetContract, isDirectFileContract } from \"../types/plugin\";\nimport { parseContractId } from \"../utils/contract-id\";\n\n/**\n * Core plugin manager that orchestrates plugin execution\n */\nexport class PluginManager {\n\tprivate plugins: SecondLayerPlugin[] = [];\n\tprivate logger: Logger;\n\tprivate utils: PluginUtils;\n\tprivate executionContext: PluginExecutionContext;\n\n\tconstructor() {\n\t\tthis.logger = this.createLogger();\n\t\tthis.utils = this.createUtils();\n\t\tthis.executionContext = {\n\t\t\tphase: \"config\",\n\t\t\tstartTime: Date.now(),\n\t\t\tresults: new Map(),\n\t\t};\n\t}\n\n\t/**\n\t * Register a plugin\n\t */\n\tregister(plugin: SecondLayerPlugin): void {\n\t\t// Validate plugin\n\t\tif (!plugin.name || !plugin.version) {\n\t\t\tthrow new Error(\"Plugin must have a name and version\");\n\t\t}\n\n\t\t// Check for duplicate plugin names\n\t\tconst existing = this.plugins.find((p) => p.name === plugin.name);\n\t\tif (existing) {\n\t\t\tthrow new Error(\n\t\t\t\t`Plugin \"${plugin.name}\" is already registered (version ${existing.version})`,\n\t\t\t);\n\t\t}\n\n\t\tthis.plugins.push(plugin);\n\t\tthis.logger.debug(`Registered plugin: ${plugin.name}@${plugin.version}`);\n\t}\n\n\t/**\n\t * Get all registered plugins\n\t */\n\tgetPlugins(): SecondLayerPlugin[] {\n\t\treturn [...this.plugins];\n\t}\n\n\t/**\n\t * Transform user config through all plugins\n\t */\n\tasync transformConfig(config: UserConfig): Promise<ResolvedConfig> {\n\t\tthis.executionContext.phase = \"config\";\n\t\tlet transformedConfig = { ...config };\n\n\t\tfor (const plugin of this.plugins) {\n\t\t\tif (plugin.transformConfig) {\n\t\t\t\tthis.executionContext.currentPlugin = plugin;\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await plugin.transformConfig(transformedConfig);\n\t\t\t\t\ttransformedConfig = result;\n\t\t\t\t\tthis.recordHookResult(plugin.name, \"transformConfig\", {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.recordHookResult(plugin.name, \"transformConfig\", {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error\n\t\t\t\t\t\t\t\t: new Error(getErrorMessage(error)),\n\t\t\t\t\t});\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Plugin \"${plugin.name}\" failed during config transformation: ${getErrorMessage(error)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add plugins array to resolved config\n\t\tconst resolvedConfig: ResolvedConfig = {\n\t\t\t...transformedConfig,\n\t\t\tplugins: this.plugins,\n\t\t};\n\n\t\treturn resolvedConfig;\n\t}\n\n\t/**\n\t * Transform contracts through all plugins\n\t */\n\tasync transformContracts(\n\t\tcontracts: ContractConfig[],\n\t\t_config: ResolvedConfig,\n\t): Promise<ProcessedContract[]> {\n\t\tconst processedContracts: ProcessedContract[] = [];\n\n\t\tfor (let contract of contracts) {\n\t\t\tif (isClarinetContract(contract) && contract.abi) {\n\t\t\t\tprocessedContracts.push(this.contractToProcessed(contract, \"clarinet\"));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isDirectFileContract(contract) && contract.abi) {\n\t\t\t\tprocessedContracts.push(this.contractToProcessed(contract, \"direct\"));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Transform through each plugin\n\t\t\tfor (const plugin of this.plugins) {\n\t\t\t\tif (plugin.transformContract) {\n\t\t\t\t\tthis.executionContext.currentPlugin = plugin;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcontract = await plugin.transformContract(contract);\n\t\t\t\t\t\tthis.recordHookResult(plugin.name, \"transformContract\", {\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.recordHookResult(plugin.name, \"transformContract\", {\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t\t? error\n\t\t\t\t\t\t\t\t\t: new Error(getErrorMessage(error)),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.logger.warn(\n\t\t\t\t\t\t\t`Plugin \"${plugin.name}\" failed to transform contract: ${getErrorMessage(error)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (contract.abi) {\n\t\t\t\tprocessedContracts.push(this.contractToProcessed(contract, \"api\"));\n\t\t\t}\n\t\t}\n\n\t\treturn processedContracts;\n\t}\n\n\t/**\n\t * Execute lifecycle hooks\n\t */\n\tasync executeHook(\n\t\thookName: keyof SecondLayerPlugin,\n\t\t// biome-ignore lint/suspicious/noExplicitAny: interop boundary or dynamic-shape value where typing adds friction without runtime safety\n\t\tcontext: any,\n\t): Promise<void> {\n\t\tfor (const plugin of this.plugins) {\n\t\t\tconst hook = plugin[hookName];\n\t\t\tif (typeof hook === \"function\") {\n\t\t\t\tthis.executionContext.currentPlugin = plugin;\n\t\t\t\ttry {\n\t\t\t\t\t// biome-ignore lint/suspicious/noExplicitAny: interop boundary or dynamic-shape value where typing adds friction without runtime safety\n\t\t\t\t\tawait (hook as any).call(plugin, context);\n\t\t\t\t\tthis.recordHookResult(plugin.name, hookName as string, {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.recordHookResult(plugin.name, hookName as string, {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\terror:\n\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t? error\n\t\t\t\t\t\t\t\t: new Error(getErrorMessage(error)),\n\t\t\t\t\t});\n\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t`Plugin \"${plugin.name}\" failed during ${hookName as string}: ${getErrorMessage(error)}`,\n\t\t\t\t\t);\n\t\t\t\t\t// Don't throw - allow other plugins to continue\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Execute generation phase with full context\n\t */\n\tasync executeGeneration(\n\t\tcontracts: ProcessedContract[],\n\t\tconfig: ResolvedConfig,\n\t): Promise<Map<string, GeneratedOutput>> {\n\t\tthis.executionContext.phase = \"generate\";\n\t\tconst outputs = new Map<string, GeneratedOutput>();\n\n\t\t// Create generation context\n\t\tconst context: GenerateContext = {\n\t\t\tconfig,\n\t\t\tlogger: this.logger,\n\t\t\tutils: this.utils,\n\t\t\tcontracts,\n\t\t\toutputs,\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: interop boundary or dynamic-shape value where typing adds friction without runtime safety\n\t\t\taugment: (outputKey: string, contractName: string, content: any) => {\n\t\t\t\tthis.augmentOutput(outputs, outputKey, contractName, content);\n\t\t\t},\n\t\t\taddOutput: (key: string, output: GeneratedOutput) => {\n\t\t\t\toutputs.set(key, output);\n\t\t\t},\n\t\t};\n\n\t\t// Execute beforeGenerate hooks\n\t\tawait this.executeHook(\"beforeGenerate\", context);\n\n\t\t// Execute generate hooks\n\t\tawait this.executeHook(\"generate\", context);\n\n\t\t// Execute afterGenerate hooks\n\t\tawait this.executeHook(\"afterGenerate\", context);\n\n\t\treturn outputs;\n\t}\n\n\t/**\n\t * Transform outputs through plugins\n\t */\n\tasync transformOutputs(\n\t\toutputs: Map<string, GeneratedOutput>,\n\t): Promise<Map<string, GeneratedOutput>> {\n\t\tthis.executionContext.phase = \"output\";\n\t\tconst transformedOutputs = new Map<string, GeneratedOutput>();\n\n\t\tfor (const [key, output] of outputs) {\n\t\t\tlet transformedContent = output.content;\n\n\t\t\tfor (const plugin of this.plugins) {\n\t\t\t\tif (plugin.transformOutput) {\n\t\t\t\t\tthis.executionContext.currentPlugin = plugin;\n\t\t\t\t\ttry {\n\t\t\t\t\t\ttransformedContent = await plugin.transformOutput(\n\t\t\t\t\t\t\ttransformedContent,\n\t\t\t\t\t\t\toutput.type || \"other\",\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.recordHookResult(plugin.name, \"transformOutput\", {\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthis.recordHookResult(plugin.name, \"transformOutput\", {\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t\t\t? error\n\t\t\t\t\t\t\t\t\t: new Error(getErrorMessage(error)),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.logger.warn(\n\t\t\t\t\t\t\t`Plugin \"${plugin.name}\" failed to transform output: ${getErrorMessage(error)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttransformedOutputs.set(key, {\n\t\t\t\t...output,\n\t\t\t\tcontent: transformedContent,\n\t\t\t});\n\t\t}\n\n\t\treturn transformedOutputs;\n\t}\n\n\t/**\n\t * Write outputs to disk\n\t */\n\tasync writeOutputs(outputs: Map<string, GeneratedOutput>): Promise<void> {\n\t\tfor (const [, output] of outputs) {\n\t\t\ttry {\n\t\t\t\tconst resolvedPath = path.resolve(process.cwd(), output.path);\n\t\t\t\tawait this.utils.ensureDir(path.dirname(resolvedPath));\n\t\t\t\tawait this.utils.writeFile(resolvedPath, output.content);\n\t\t\t\t// Don't log here - let the main command handle success messaging\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error(\n\t\t\t\t\t`Failed to write ${output.path}: ${getErrorMessage(error)}`,\n\t\t\t\t);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get execution results for debugging\n\t */\n\tgetExecutionResults(): Map<string, HookResult[]> {\n\t\treturn new Map(this.executionContext.results);\n\t}\n\n\t/**\n\t * Convert a contract config with an ABI into a ProcessedContract\n\t */\n\tprivate contractToProcessed(\n\t\tcontract: ContractConfig,\n\t\tsource: string,\n\t): ProcessedContract {\n\t\tconst address =\n\t\t\ttypeof contract.address === \"string\" ? contract.address : \"\";\n\t\tconst parsed = parseContractId(address);\n\t\treturn {\n\t\t\tname: contract.name || parsed.contractName || \"unknown\",\n\t\t\taddress: parsed.address || \"unknown\",\n\t\t\tcontractName: parsed.contractName || contract.name || \"unknown\",\n\t\t\t// biome-ignore lint/style/noNonNullAssertion: value is non-null after preceding check or by construction; TS narrowing limitation\n\t\t\tabi: contract.abi!,\n\t\t\tsource: source === \"api\" ? (\"api\" as const) : (\"local\" as const),\n\t\t\tmetadata: contract.metadata ?? { source },\n\t\t};\n\t}\n\n\t/**\n\t * Augment existing output with additional content\n\t */\n\tprivate augmentOutput(\n\t\toutputs: Map<string, GeneratedOutput>,\n\t\toutputKey: string,\n\t\tcontractName: string,\n\t\t// biome-ignore lint/suspicious/noExplicitAny: interop boundary or dynamic-shape value where typing adds friction without runtime safety\n\t\tcontent: any,\n\t): void {\n\t\tconst existing = outputs.get(outputKey);\n\t\tif (!existing) {\n\t\t\tthis.logger.warn(`Cannot augment non-existent output: ${outputKey}`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Simple augmentation - append content\n\t\t// In a real implementation, this would be more sophisticated\n\t\tconst augmentedContent = `${existing.content}\\n\\n// Augmented by plugin for ${contractName}\\n${JSON.stringify(content, null, 2)}`;\n\n\t\toutputs.set(outputKey, {\n\t\t\t...existing,\n\t\t\tcontent: augmentedContent,\n\t\t});\n\t}\n\n\t/**\n\t * Record hook execution result\n\t */\n\tprivate recordHookResult(\n\t\tpluginName: string,\n\t\thookName: string,\n\t\tresult: Omit<HookResult, \"plugin\">,\n\t): void {\n\t\tconst key = `${pluginName}:${hookName}`;\n\t\tconst existing = this.executionContext.results.get(key) || [];\n\t\texisting.push({ ...result, plugin: pluginName });\n\t\tthis.executionContext.results.set(key, existing);\n\t}\n\n\t/**\n\t * Create logger instance\n\t */\n\tprivate createLogger(): Logger {\n\t\treturn {\n\t\t\tinfo: (message: string) => console.log(`ℹ️ ${message}`),\n\t\t\twarn: (message: string) => console.warn(`⚠️ ${message}`),\n\t\t\terror: (message: string) => console.error(`❌ ${message}`),\n\t\t\tdebug: (message: string) => {\n\t\t\t\tif (process.env.DEBUG) {\n\t\t\t\t\tconsole.log(`🐛 ${message}`);\n\t\t\t\t}\n\t\t\t},\n\t\t\tsuccess: (message: string) => console.log(`✅ ${message}`),\n\t\t};\n\t}\n\n\t/**\n\t * Create utils instance\n\t */\n\tprivate createUtils(): PluginUtils {\n\t\treturn {\n\t\t\ttoCamelCase,\n\n\t\t\ttoKebabCase: (str: string) => {\n\t\t\t\treturn str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n\t\t\t},\n\n\t\t\tvalidateAddress: (address: string) => {\n\t\t\t\treturn validateStacksAddress(parseContractId(address).address);\n\t\t\t},\n\n\t\t\tparseContractId: (contractId: string) => {\n\t\t\t\treturn parseContractId(contractId);\n\t\t\t},\n\n\t\t\tformatCode: async (code: string) => {\n\t\t\t\tconst { formatCode } = await import(\"../utils/format\");\n\t\t\t\treturn formatCode(code);\n\t\t\t},\n\n\t\t\tresolvePath: (relativePath: string) => {\n\t\t\t\treturn path.resolve(process.cwd(), relativePath);\n\t\t\t},\n\n\t\t\tfileExists: async (filePath: string) => {\n\t\t\t\ttry {\n\t\t\t\t\tawait fs.access(filePath);\n\t\t\t\t\treturn true;\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\treadFile: async (filePath: string) => {\n\t\t\t\treturn fs.readFile(filePath, \"utf-8\");\n\t\t\t},\n\n\t\t\twriteFile: async (filePath: string, content: string) => {\n\t\t\t\tawait fs.writeFile(filePath, content, \"utf-8\");\n\t\t\t},\n\n\t\t\tensureDir: async (dirPath: string) => {\n\t\t\t\tawait fs.mkdir(dirPath, { recursive: true });\n\t\t\t},\n\t\t};\n\t}\n}\n",
|
|
9
|
-
"
|
|
10
|
-
"/**\n * @secondlayer/cli\n * CLI tool for generating type-safe Stacks contract interfaces\n */\n\nexport { defineConfig } from \"./utils/config\";\nexport type {\n\tSecondLayerConfig,\n\tContractSource,\n\tNetworkName,\n} from \"./types/config\";\n\nexport type {\n\tAbiContract,\n\tAbiFunction,\n\tAbiType,\n} from \"@secondlayer/stacks/clarity\";\n\n// Plugin system exports\nexport type {\n\tSecondLayerPlugin,\n\tPluginFactory,\n\tPluginOptions,\n\tUserConfig,\n\tResolvedConfig,\n\tGenerateContext,\n\tPluginContext,\n\tLogger,\n\tPluginUtils,\n\tGeneratedOutput,\n\tProcessedContract,\n\tContractConfig,\n\tOutputType,\n} from \"./types/plugin\";\n\nexport { PluginManager } from \"./core/plugin-manager\";\n"
|
|
7
|
+
"/**\n * Clarinet contract source for @secondlayer/cli\n * Loads simnet ABIs from a local Clarinet project.\n */\n\nimport { toCamelCase } from \"@secondlayer/stacks/clarity\";\nimport { normalizeAbi } from \"@secondlayer/stacks/clarity\";\nimport type { AbiContract } from \"@secondlayer/stacks/clarity\";\nimport { initSimnet } from \"@stacks/clarinet-sdk\";\nimport { DEFAULT_SENDER_ADDRESS } from \"../../utils/constants\";\nimport { parseContractId } from \"../../utils/contract-id\";\n\nexport interface ClarinetOptions {\n\t/** Path to Clarinet.toml file */\n\tpath?: string;\n\n\t/** Include only specific contracts */\n\tinclude?: string[];\n\n\t/** Exclude specific contracts */\n\texclude?: string[];\n\n\t/**\n\t * Also generate interfaces for dependency contracts declared under\n\t * `[project.requirements]` in Clarinet.toml (default: true).\n\t */\n\tincludeRequirements?: boolean;\n\n\t/** Enable debug output */\n\tdebug?: boolean;\n}\n\n/** Contract loaded from Clarinet simnet, ready to merge into config.contracts */\nexport interface ClarinetLoadedContract {\n\tname: string;\n\taddress: string;\n\tabi: AbiContract;\n\t_clarinetSource: true;\n}\n\n/**\n * Sanitize contract name to be a valid JavaScript identifier using camelCase\n */\nfunction sanitizeContractName(name: string): string {\n\treturn toCamelCase(name);\n}\n\nfunction matchesContractFilters(\n\tname: string,\n\toptions: Pick<ClarinetOptions, \"include\" | \"exclude\">,\n): boolean {\n\tif (options.include && !options.include.includes(name)) {\n\t\treturn false;\n\t}\n\tif (options.exclude?.includes(name)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\n/** @internal exported for tests */\nexport interface ManifestInfo {\n\t/** Names from `[contracts.NAME]` sections */\n\tprojectContracts: Set<string>;\n\t/** Fully-qualified ids from `[project.requirements]` entries */\n\trequirementIds: Set<string>;\n}\n\n/**\n * Read project contracts and requirements from Clarinet.toml. Returns null if\n * the manifest can't be read (callers fall back to pattern heuristics).\n */\nexport async function readManifestInfo(\n\tmanifestPath: string,\n): Promise<ManifestInfo | null> {\n\ttry {\n\t\tconst { promises: fs } = await import(\"node:fs\");\n\t\tconst tomlContent = await fs.readFile(manifestPath, \"utf-8\");\n\n\t\t// Simple TOML parsing: [contracts.NAME] sections\n\t\tconst projectContracts = new Set<string>();\n\t\tconst contractSectionRegex = /^\\[contracts\\.([^\\]]+)\\]/gm;\n\t\tlet match: RegExpExecArray | null = contractSectionRegex.exec(tomlContent);\n\t\twhile (match !== null) {\n\t\t\tprojectContracts.add(match[1]);\n\t\t\tmatch = contractSectionRegex.exec(tomlContent);\n\t\t}\n\n\t\t// Requirements: `contract_id = \"SP....name\"` entries — covers both the\n\t\t// inline `requirements = [{ contract_id = \"...\" }]` and the\n\t\t// `[[project.requirements]]` table-array forms.\n\t\tconst requirementIds = new Set<string>();\n\t\tconst requirementRegex = /contract_id\\s*=\\s*[\"']([^\"']+)[\"']/g;\n\t\tmatch = requirementRegex.exec(tomlContent);\n\t\twhile (match !== null) {\n\t\t\trequirementIds.add(match[1]);\n\t\t\tmatch = requirementRegex.exec(tomlContent);\n\t\t}\n\n\t\treturn { projectContracts, requirementIds };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** @internal exported for tests */\nexport type ContractKind = \"project\" | \"requirement\" | \"system\";\n\n/**\n * Classify a simnet contract. With a readable manifest the classification is\n * deterministic: `[contracts.*]` → project, `[project.requirements]` →\n * requirement, everything else (boot contracts) → system. Without a manifest,\n * fall back to boot-contract heuristics.\n */\nexport function classifyContract(\n\tcontractId: string,\n\tmanifest: ManifestInfo | null,\n): ContractKind {\n\tconst { address, contractName } = parseContractId(contractId);\n\n\tif (manifest) {\n\t\tif (manifest.projectContracts.has(contractName)) return \"project\";\n\t\tif (manifest.requirementIds.has(contractId)) return \"requirement\";\n\t\treturn \"system\";\n\t}\n\n\t// Fallback heuristics: boot contracts have well-known names/addresses\n\tconst systemContractPatterns = [\n\t\t/^pox-\\d+$/, // pox-2, pox-3, etc.\n\t\t/^bns$/, // Blockchain Name System\n\t\t/^costs-\\d+$/, // costs-2, costs-3, etc.\n\t\t/^lockup$/, // lockup contract\n\t\t/^signer-manager$/, // SIP-045 (epoch 4.0) boot contract\n\t];\n\tif (systemContractPatterns.some((pattern) => pattern.test(contractName))) {\n\t\treturn \"system\";\n\t}\n\n\tconst systemAddresses = [\n\t\tDEFAULT_SENDER_ADDRESS, // Boot contracts address\n\t\t\"ST000000000000000000002AMW42H\", // Boot contracts address (testnet)\n\t];\n\tif (systemAddresses.includes(address)) {\n\t\treturn \"system\";\n\t}\n\n\treturn \"project\";\n}\n\n/**\n * Load contract ABIs from a Clarinet project via simnet.\n * Skips silently when no manifest exists (deployed-id-only configs).\n */\nexport async function loadClarinetContracts(\n\toptions: ClarinetOptions = {},\n): Promise<ClarinetLoadedContract[]> {\n\tconst manifestPath = options.path || \"./Clarinet.toml\";\n\n\ttry {\n\t\tconst simnet = await initSimnet(manifestPath);\n\t\tconst contractInterfaces = simnet.getContractsInterfaces();\n\t\tconst contracts: ClarinetLoadedContract[] = [];\n\t\tconst manifest = await readManifestInfo(manifestPath);\n\t\tconst includeRequirements = options.includeRequirements ?? true;\n\n\t\tfor (const [contractId, abi] of contractInterfaces) {\n\t\t\tconst { contractName } = parseContractId(contractId);\n\t\t\tconst kind = classifyContract(contractId, manifest);\n\n\t\t\tif (\n\t\t\t\tkind === \"system\" ||\n\t\t\t\t(kind === \"requirement\" && !includeRequirements)\n\t\t\t) {\n\t\t\t\tif (options.debug) {\n\t\t\t\t\tconsole.log(`🚫 Skipping ${kind} contract: ${contractId}`);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!matchesContractFilters(contractName, options)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontracts.push({\n\t\t\t\tname: sanitizeContractName(contractName),\n\t\t\t\taddress: contractId,\n\t\t\t\tabi: normalizeAbi(abi),\n\t\t\t\t_clarinetSource: true,\n\t\t\t});\n\t\t}\n\n\t\tif (options.debug) {\n\t\t\tconsole.log(\n\t\t\t\t`🔍 Clarinet found ${contracts.length} user-defined contracts`,\n\t\t\t);\n\t\t}\n\n\t\treturn contracts;\n\t} catch (error) {\n\t\tconst err = error as Error;\n\t\tif (await hasClarinetProject(manifestPath)) {\n\t\t\tconsole.warn(\n\t\t\t\t`⚠️ Clarinet: found ${manifestPath} but failed to load contracts: ${err.message}`,\n\t\t\t);\n\t\t} else if (options.debug) {\n\t\t\tconsole.warn(`⚠️ Clarinet: no manifest at ${manifestPath}, skipping`);\n\t\t}\n\t\treturn [];\n\t}\n}\n\n/**\n * Utility function to check if a Clarinet project exists\n */\nexport async function hasClarinetProject(\n\tpath = \"./Clarinet.toml\",\n): Promise<boolean> {\n\ttry {\n\t\tconst { promises: fs } = await import(\"node:fs\");\n\t\tawait fs.access(path);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n",
|
|
8
|
+
"import { randomBytes } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { loadClarinetContracts } from \"../plugins/clarinet/index\";\nimport type { ConfigDefiner, SecondLayerConfig } from \"../types/config\";\n\n/**\n * Config file utilities\n */\n\nconst CONFIG_FILE_NAMES = [\n\t\"secondlayer.config.ts\",\n\t\"secondlayer.config\",\n\t\"secondlayer.config.mjs\",\n];\n\nexport async function findConfigFile(cwd: string): Promise<string | null> {\n\tfor (const fileName of CONFIG_FILE_NAMES) {\n\t\tconst filePath = path.join(cwd, fileName);\n\t\ttry {\n\t\t\tawait fs.access(filePath);\n\t\t\treturn filePath;\n\t\t} catch {\n\t\t\t// File doesn't exist, continue\n\t\t}\n\t}\n\treturn null;\n}\n\nexport async function loadConfig(\n\tconfigPath?: string,\n): Promise<SecondLayerConfig> {\n\tconst cwd = process.cwd();\n\n\tconst resolvedPath = configPath\n\t\t? path.resolve(cwd, configPath)\n\t\t: await findConfigFile(cwd);\n\n\tif (!resolvedPath) {\n\t\tthrow new Error(\n\t\t\t\"No config file found. Create a secondlayer.config.ts file or specify a path with --config\",\n\t\t);\n\t}\n\n\t// biome-ignore lint/suspicious/noExplicitAny: interop boundary or dynamic-shape value where typing adds friction without runtime safety\n\tlet config: any;\n\n\tif (resolvedPath.endsWith(\".ts\")) {\n\t\tconst code = await fs.readFile(resolvedPath, \"utf-8\");\n\n\t\t// Transform TypeScript to JavaScript, replacing the @secondlayer/cli import\n\t\t// For development/linked packages, we need to resolve to the actual package location\n\t\t// This will work both for published packages and local development\n\t\tlet replacementPath: string;\n\n\t\ttry {\n\t\t\t// Try to resolve @secondlayer/cli as if it were a normal package\n\t\t\tconst require = createRequire(import.meta.url);\n\t\t\tconst packagePath = require.resolve(\"@secondlayer/cli\");\n\t\t\treplacementPath = pathToFileURL(packagePath).href;\n\t\t} catch {\n\t\t\t// Fallback: resolve relative to current module (for development)\n\t\t\tconst currentModuleDir = path.dirname(new URL(import.meta.url).pathname);\n\t\t\tconst indexPath = path.resolve(currentModuleDir, \"../index\");\n\t\t\treplacementPath = pathToFileURL(indexPath).href;\n\t\t}\n\n\t\tconst transformedCode = code.replace(\n\t\t\t/from\\s+[\"']@secondlayer\\/cli[\"']/g,\n\t\t\t`from '${replacementPath}'`,\n\t\t);\n\n\t\tconst { transformSync } = await import(\"esbuild\");\n\t\tconst result = transformSync(transformedCode, {\n\t\t\tformat: \"esm\",\n\t\t\ttarget: \"node18\",\n\t\t\tloader: \"ts\",\n\t\t});\n\n\t\tconst tempPath = path.join(\n\t\t\ttmpdir(),\n\t\t\t`secondlayer-config-${randomBytes(4).toString(\"hex\")}.mjs`,\n\t\t);\n\t\tawait fs.writeFile(tempPath, result.code);\n\n\t\ttry {\n\t\t\tconst fileUrl = pathToFileURL(tempPath).href;\n\t\t\tconst module = await import(fileUrl);\n\t\t\tconfig = module.default;\n\t\t} finally {\n\t\t\tawait fs.unlink(tempPath).catch(() => {});\n\t\t}\n\t} else {\n\t\tconst fileUrl = pathToFileURL(resolvedPath).href;\n\t\tconst module = await import(fileUrl);\n\t\tconfig = module.default;\n\t}\n\n\tif (!config) {\n\t\tthrow new Error(\"Config file must export a default configuration\");\n\t}\n\n\tif (typeof config === \"function\") {\n\t\tconfig = config({} as SecondLayerConfig);\n\t}\n\n\tvalidateConfig(config);\n\n\tif (\n\t\tconfig.clarinet === true ||\n\t\t(config.clarinet && typeof config.clarinet === \"object\")\n\t) {\n\t\tconst options = config.clarinet === true ? {} : config.clarinet;\n\t\tconst loaded = await loadClarinetContracts(options);\n\t\tconfig = {\n\t\t\t...config,\n\t\t\tcontracts: [...(config.contracts || []), ...loaded],\n\t\t};\n\t}\n\n\treturn config;\n}\n\nexport function validateConfig(\n\tconfig: unknown,\n): asserts config is SecondLayerConfig {\n\tif (!config || typeof config !== \"object\") {\n\t\tthrow new Error(\"Config must be an object\");\n\t}\n\n\t// biome-ignore lint/suspicious/noExplicitAny: interop boundary or dynamic-shape value where typing adds friction without runtime safety\n\tconst c = config as any;\n\n\tif (c.contracts && !Array.isArray(c.contracts)) {\n\t\tthrow new Error(\"Config contracts must be an array\");\n\t}\n\n\tif (!c.out || typeof c.out !== \"string\") {\n\t\tthrow new Error(\"Config out must be a string path\");\n\t}\n\n\tif (c.contracts) {\n\t\tfor (const contract of c.contracts) {\n\t\t\tif (!contract.address && !contract.source && !contract.abi) {\n\t\t\t\tthrow new Error(\"Each contract must have either an address or source\");\n\t\t\t}\n\t\t}\n\t}\n\n\tif (\n\t\tc.clarinet !== undefined &&\n\t\ttypeof c.clarinet !== \"boolean\" &&\n\t\t(typeof c.clarinet !== \"object\" || c.clarinet === null)\n\t) {\n\t\tthrow new Error(\"Config clarinet must be true or an options object\");\n\t}\n}\n\n/**\n * Type-safe helper for creating a `secondlayer.config.ts` configuration.\n * Accepts either a config object or a factory function that receives a base config and returns a modified one.\n *\n * @example\n * ```ts\n * import { defineConfig } from \"@secondlayer/cli\";\n *\n * export default defineConfig({\n * contracts: [{ address: \"SP000000000000000000002Q6VF78.bns\" }],\n * out: \"./src/generated.ts\",\n * });\n * ```\n */\nexport function defineConfig(config: SecondLayerConfig): SecondLayerConfig;\nexport function defineConfig(definer: ConfigDefiner): ConfigDefiner;\nexport function defineConfig(\n\tconfigOrDefiner: SecondLayerConfig | ConfigDefiner,\n) {\n\treturn configOrDefiner;\n}\n",
|
|
9
|
+
"/**\n * @secondlayer/cli\n * CLI tool for generating type-safe Stacks contract interfaces\n */\n\nexport { defineConfig } from \"./utils/config\";\nexport type {\n\tSecondLayerConfig,\n\tContractSource,\n\tNetworkName,\n\tClarinetOptions,\n} from \"./types/config\";\n\nexport type {\n\tAbiContract,\n\tAbiFunction,\n\tAbiType,\n} from \"@secondlayer/stacks/clarity\";\n"
|
|
11
10
|
],
|
|
12
|
-
"mappings": "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",
|
|
13
|
-
"debugId": "
|
|
11
|
+
"mappings": "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",
|
|
12
|
+
"debugId": "0B67AD9AFC5A2DC564756E2164756E21",
|
|
14
13
|
"names": []
|
|
15
14
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@secondlayer/cli",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "15.0.0",
|
|
4
4
|
"description": "Run a Stacks index on your own hardware — set it up, restore verified history, and keep it current.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -19,10 +19,6 @@
|
|
|
19
19
|
".": {
|
|
20
20
|
"types": "./dist/index.d.ts",
|
|
21
21
|
"import": "./dist/index.js"
|
|
22
|
-
},
|
|
23
|
-
"./plugins": {
|
|
24
|
-
"types": "./dist/plugins/index.d.ts",
|
|
25
|
-
"import": "./dist/plugins/index.js"
|
|
26
22
|
}
|
|
27
23
|
},
|
|
28
24
|
"files": ["dist", "templates", "README.md"],
|
|
@@ -43,15 +39,15 @@
|
|
|
43
39
|
"@inquirer/prompts": "^8.2.0",
|
|
44
40
|
"@opentui/core": "^0.5.3",
|
|
45
41
|
"@opentui/react": "^0.5.3",
|
|
46
|
-
"@secondlayer/bundler": "^0.5.
|
|
47
|
-
"@secondlayer/scaffold": "^1.5.
|
|
48
|
-
"@secondlayer/sdk": "^10.4.
|
|
49
|
-
"@secondlayer/shared": "^11.
|
|
50
|
-
"@secondlayer/stacks": "^
|
|
51
|
-
"@secondlayer/subgraphs": "^4.3.
|
|
52
|
-
"esbuild": "^0.
|
|
42
|
+
"@secondlayer/bundler": "^0.5.3",
|
|
43
|
+
"@secondlayer/scaffold": "^1.5.7",
|
|
44
|
+
"@secondlayer/sdk": "^10.4.2",
|
|
45
|
+
"@secondlayer/shared": "^11.6.0",
|
|
46
|
+
"@secondlayer/stacks": "^6.0.0",
|
|
47
|
+
"@secondlayer/subgraphs": "^4.3.4",
|
|
48
|
+
"esbuild": "^0.28.2",
|
|
53
49
|
"react": "^19.1.0",
|
|
54
|
-
"smol-toml": "^1.
|
|
50
|
+
"smol-toml": "^1.8.0",
|
|
55
51
|
"zod": "^4.3.6"
|
|
56
52
|
},
|
|
57
53
|
"peerDependencies": {
|
|
@@ -65,7 +61,6 @@
|
|
|
65
61
|
"devDependencies": {
|
|
66
62
|
"@antfu/ni": "^24.4.0",
|
|
67
63
|
"@stacks/clarinet-sdk": "3.21.1",
|
|
68
|
-
"@tanstack/react-query": "^5.77.0",
|
|
69
64
|
"@types/bun": "^1.1.14",
|
|
70
65
|
"@types/react": "^19.1.5",
|
|
71
66
|
"chalk": "^5.3.0",
|
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import { AbiContract as AbiContract2 } from "@secondlayer/stacks/clarity";
|
|
2
|
-
import { AbiContract } from "@secondlayer/stacks/clarity";
|
|
3
|
-
/** Supported Stacks network identifiers for contract resolution. */
|
|
4
|
-
type NetworkName = "mainnet" | "testnet" | "devnet";
|
|
5
|
-
/** Specifies a contract to generate typed interfaces for, either from a deployed address or local Clarity source file. */
|
|
6
|
-
interface ContractSource {
|
|
7
|
-
/**
|
|
8
|
-
* Contract identifier (address.name) for deployed contracts
|
|
9
|
-
*/
|
|
10
|
-
address?: string | Partial<Record<NetworkName, string>>;
|
|
11
|
-
/**
|
|
12
|
-
* Path to local Clarity file
|
|
13
|
-
*/
|
|
14
|
-
source?: string;
|
|
15
|
-
/**
|
|
16
|
-
* Optional name to use in generated code
|
|
17
|
-
*/
|
|
18
|
-
name?: string;
|
|
19
|
-
}
|
|
20
|
-
/** Configuration for the `@secondlayer/cli` code generator. Defines which contracts to process, output paths, network settings, and plugins. */
|
|
21
|
-
interface SecondLayerConfig {
|
|
22
|
-
/**
|
|
23
|
-
* Contracts to generate interfaces for (optional - plugins can provide these)
|
|
24
|
-
*/
|
|
25
|
-
contracts?: ContractSource[];
|
|
26
|
-
/**
|
|
27
|
-
* Output file path
|
|
28
|
-
*/
|
|
29
|
-
out: string;
|
|
30
|
-
/**
|
|
31
|
-
* Plugins to use for generation
|
|
32
|
-
*/
|
|
33
|
-
plugins?: any[];
|
|
34
|
-
/**
|
|
35
|
-
* Network to use for fetching contracts
|
|
36
|
-
*/
|
|
37
|
-
network?: NetworkName;
|
|
38
|
-
/**
|
|
39
|
-
* API key for Stacks API (if required)
|
|
40
|
-
*/
|
|
41
|
-
apiKey?: string;
|
|
42
|
-
/**
|
|
43
|
-
* Base URL for Stacks API (optional override)
|
|
44
|
-
*/
|
|
45
|
-
apiUrl?: string;
|
|
46
|
-
/**
|
|
47
|
-
* Default deployer address for local contracts without explicit addresses
|
|
48
|
-
* Defaults to ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM (devnet default)
|
|
49
|
-
*/
|
|
50
|
-
defaultAddress?: string;
|
|
51
|
-
}
|
|
52
|
-
interface ResolvedContract {
|
|
53
|
-
name: string;
|
|
54
|
-
address: string;
|
|
55
|
-
contractName: string;
|
|
56
|
-
abi: AbiContract;
|
|
57
|
-
source: "api" | "local";
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Core plugin interface that all plugins must implement
|
|
61
|
-
*/
|
|
62
|
-
interface SecondLayerPlugin {
|
|
63
|
-
/** Plugin name (should be unique) */
|
|
64
|
-
name: string;
|
|
65
|
-
/** Plugin version */
|
|
66
|
-
version: string;
|
|
67
|
-
/** Called after config is resolved but before generation starts */
|
|
68
|
-
configResolved?: (config: ResolvedConfig) => void | Promise<void>;
|
|
69
|
-
/** Called before generation starts */
|
|
70
|
-
beforeGenerate?: (context: GenerateContext) => void | Promise<void>;
|
|
71
|
-
/** Called during generation phase - plugins can add their own outputs */
|
|
72
|
-
generate?: (context: GenerateContext) => void | Promise<void>;
|
|
73
|
-
/** Called after all generation is complete */
|
|
74
|
-
afterGenerate?: (context: GenerateContext) => void | Promise<void>;
|
|
75
|
-
/** Transform user config before resolution */
|
|
76
|
-
transformConfig?: (config: UserConfig) => UserConfig | Promise<UserConfig>;
|
|
77
|
-
/** Transform individual contracts during processing */
|
|
78
|
-
transformContract?: (contract: ContractConfig) => ContractConfig | Promise<ContractConfig>;
|
|
79
|
-
/** Transform generated output before writing to disk */
|
|
80
|
-
transformOutput?: (output: string, type: OutputType) => string | Promise<string>;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* User configuration (before plugin transformations)
|
|
84
|
-
*/
|
|
85
|
-
type UserConfig = SecondLayerConfig;
|
|
86
|
-
/**
|
|
87
|
-
* Resolved configuration (after plugin transformations)
|
|
88
|
-
*/
|
|
89
|
-
interface ResolvedConfig extends SecondLayerConfig {
|
|
90
|
-
/** Resolved plugins array */
|
|
91
|
-
plugins: SecondLayerPlugin[];
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Contract configuration that can be transformed by plugins
|
|
95
|
-
*/
|
|
96
|
-
interface ContractConfig {
|
|
97
|
-
name?: string;
|
|
98
|
-
address?: string | Partial<Record<NetworkName, string>>;
|
|
99
|
-
source?: string;
|
|
100
|
-
abi?: AbiContract2;
|
|
101
|
-
metadata?: Record<string, any>;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Processed contract with resolved ABI and metadata
|
|
105
|
-
*/
|
|
106
|
-
interface ProcessedContract extends ResolvedContract {
|
|
107
|
-
/** Additional metadata added by plugins */
|
|
108
|
-
metadata?: Record<string, any>;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Generated output from plugins
|
|
112
|
-
*/
|
|
113
|
-
interface GeneratedOutput {
|
|
114
|
-
/** File path where output should be written */
|
|
115
|
-
path: string;
|
|
116
|
-
/** Generated content */
|
|
117
|
-
content: string;
|
|
118
|
-
/** Output type for transformation hooks */
|
|
119
|
-
type?: OutputType;
|
|
120
|
-
/** Whether this output should overwrite existing files */
|
|
121
|
-
overwrite?: boolean;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Types of outputs that can be generated
|
|
125
|
-
*/
|
|
126
|
-
type OutputType = "contracts" | "hooks" | "actions" | "types" | "utils" | "config" | "other";
|
|
127
|
-
/**
|
|
128
|
-
* Base context available to all plugin hooks
|
|
129
|
-
*/
|
|
130
|
-
interface PluginContext {
|
|
131
|
-
/** Resolved configuration */
|
|
132
|
-
config: ResolvedConfig;
|
|
133
|
-
/** Logger for plugin output */
|
|
134
|
-
logger: Logger;
|
|
135
|
-
/** Utility functions for plugins */
|
|
136
|
-
utils: PluginUtils;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Context available during generation phase
|
|
140
|
-
*/
|
|
141
|
-
interface GenerateContext extends PluginContext {
|
|
142
|
-
/** Processed contracts ready for generation */
|
|
143
|
-
contracts: ProcessedContract[];
|
|
144
|
-
/** Map of output keys to generated content */
|
|
145
|
-
outputs: Map<string, GeneratedOutput>;
|
|
146
|
-
/** Function to augment existing outputs */
|
|
147
|
-
augment: (outputKey: string, contractName: string, content: any) => void;
|
|
148
|
-
/** Function to add new outputs */
|
|
149
|
-
addOutput: (key: string, output: GeneratedOutput) => void;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Logger interface for plugin output
|
|
153
|
-
*/
|
|
154
|
-
interface Logger {
|
|
155
|
-
info: (message: string) => void;
|
|
156
|
-
warn: (message: string) => void;
|
|
157
|
-
error: (message: string) => void;
|
|
158
|
-
debug: (message: string) => void;
|
|
159
|
-
success: (message: string) => void;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Utility functions available to plugins
|
|
163
|
-
*/
|
|
164
|
-
interface PluginUtils {
|
|
165
|
-
/** Convert kebab-case to camelCase */
|
|
166
|
-
toCamelCase: (str: string) => string;
|
|
167
|
-
/** Convert camelCase to kebab-case */
|
|
168
|
-
toKebabCase: (str: string) => string;
|
|
169
|
-
/** Validate Stacks address format */
|
|
170
|
-
validateAddress: (address: string) => boolean;
|
|
171
|
-
/** Parse contract identifier (address.contract-name) */
|
|
172
|
-
parseContractId: (contractId: string) => {
|
|
173
|
-
address: string
|
|
174
|
-
contractName: string
|
|
175
|
-
};
|
|
176
|
-
/** Format TypeScript code using prettier */
|
|
177
|
-
formatCode: (code: string) => Promise<string>;
|
|
178
|
-
/** Resolve file path relative to project root */
|
|
179
|
-
resolvePath: (relativePath: string) => string;
|
|
180
|
-
/** Check if file exists */
|
|
181
|
-
fileExists: (path: string) => Promise<boolean>;
|
|
182
|
-
/** Read file content */
|
|
183
|
-
readFile: (path: string) => Promise<string>;
|
|
184
|
-
/** Write file content */
|
|
185
|
-
writeFile: (path: string, content: string) => Promise<void>;
|
|
186
|
-
/** Create directory recursively */
|
|
187
|
-
ensureDir: (path: string) => Promise<void>;
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Hook execution result
|
|
191
|
-
*/
|
|
192
|
-
interface HookResult<T = any> {
|
|
193
|
-
/** Whether the hook was successful */
|
|
194
|
-
success: boolean;
|
|
195
|
-
/** Result data from the hook */
|
|
196
|
-
data?: T;
|
|
197
|
-
/** Error if hook failed */
|
|
198
|
-
error?: Error;
|
|
199
|
-
/** Plugin that executed the hook */
|
|
200
|
-
plugin: string;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Core plugin manager that orchestrates plugin execution
|
|
204
|
-
*/
|
|
205
|
-
declare class PluginManager {
|
|
206
|
-
private plugins;
|
|
207
|
-
private logger;
|
|
208
|
-
private utils;
|
|
209
|
-
private executionContext;
|
|
210
|
-
constructor();
|
|
211
|
-
/**
|
|
212
|
-
* Register a plugin
|
|
213
|
-
*/
|
|
214
|
-
register(plugin: SecondLayerPlugin): void;
|
|
215
|
-
/**
|
|
216
|
-
* Get all registered plugins
|
|
217
|
-
*/
|
|
218
|
-
getPlugins(): SecondLayerPlugin[];
|
|
219
|
-
/**
|
|
220
|
-
* Transform user config through all plugins
|
|
221
|
-
*/
|
|
222
|
-
transformConfig(config: UserConfig): Promise<ResolvedConfig>;
|
|
223
|
-
/**
|
|
224
|
-
* Transform contracts through all plugins
|
|
225
|
-
*/
|
|
226
|
-
transformContracts(contracts: ContractConfig[], _config: ResolvedConfig): Promise<ProcessedContract[]>;
|
|
227
|
-
/**
|
|
228
|
-
* Execute lifecycle hooks
|
|
229
|
-
*/
|
|
230
|
-
executeHook(hookName: keyof SecondLayerPlugin, context: any): Promise<void>;
|
|
231
|
-
/**
|
|
232
|
-
* Execute generation phase with full context
|
|
233
|
-
*/
|
|
234
|
-
executeGeneration(contracts: ProcessedContract[], config: ResolvedConfig): Promise<Map<string, GeneratedOutput>>;
|
|
235
|
-
/**
|
|
236
|
-
* Transform outputs through plugins
|
|
237
|
-
*/
|
|
238
|
-
transformOutputs(outputs: Map<string, GeneratedOutput>): Promise<Map<string, GeneratedOutput>>;
|
|
239
|
-
/**
|
|
240
|
-
* Write outputs to disk
|
|
241
|
-
*/
|
|
242
|
-
writeOutputs(outputs: Map<string, GeneratedOutput>): Promise<void>;
|
|
243
|
-
/**
|
|
244
|
-
* Get execution results for debugging
|
|
245
|
-
*/
|
|
246
|
-
getExecutionResults(): Map<string, HookResult[]>;
|
|
247
|
-
/**
|
|
248
|
-
* Convert a contract config with an ABI into a ProcessedContract
|
|
249
|
-
*/
|
|
250
|
-
private contractToProcessed;
|
|
251
|
-
/**
|
|
252
|
-
* Augment existing output with additional content
|
|
253
|
-
*/
|
|
254
|
-
private augmentOutput;
|
|
255
|
-
/**
|
|
256
|
-
* Record hook execution result
|
|
257
|
-
*/
|
|
258
|
-
private recordHookResult;
|
|
259
|
-
/**
|
|
260
|
-
* Create logger instance
|
|
261
|
-
*/
|
|
262
|
-
private createLogger;
|
|
263
|
-
/**
|
|
264
|
-
* Create utils instance
|
|
265
|
-
*/
|
|
266
|
-
private createUtils;
|
|
267
|
-
}
|
|
268
|
-
export { PluginManager };
|