@secondlayer/cli 16.2.0 → 16.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -85,7 +85,25 @@ function parseContractId(contractId) {
85
85
  // src/plugins/clarinet/index.ts
86
86
  import { toCamelCase } from "@secondlayer/stacks/clarity";
87
87
  import { normalizeAbi } from "@secondlayer/stacks/clarity";
88
- import { initSimnet } from "@stacks/clarinet-sdk";
88
+ function isModuleNotFoundError(error, moduleName) {
89
+ if (!(error instanceof Error))
90
+ return false;
91
+ const code = error.code;
92
+ if (code !== "MODULE_NOT_FOUND" && code !== "ERR_MODULE_NOT_FOUND") {
93
+ return false;
94
+ }
95
+ return error.message.includes(moduleName);
96
+ }
97
+ async function importClarinetSdk() {
98
+ try {
99
+ return await import("@stacks/clarinet-sdk");
100
+ } catch (error) {
101
+ if (isModuleNotFoundError(error, "@stacks/clarinet-sdk")) {
102
+ throw new Error(CLARINET_SDK_INSTALL_HINT);
103
+ }
104
+ throw error;
105
+ }
106
+ }
89
107
  function sanitizeContractName(name) {
90
108
  return toCamelCase(name);
91
109
  }
@@ -152,6 +170,7 @@ function classifyContract(contractId, manifest) {
152
170
  async function loadClarinetContracts(options = {}) {
153
171
  const manifestPath = options.path || "./Clarinet.toml";
154
172
  try {
173
+ const { initSimnet } = await importClarinetSdk();
155
174
  const simnet = await initSimnet(manifestPath);
156
175
  const contractInterfaces = simnet.getContractsInterfaces();
157
176
  const contracts = [];
@@ -199,6 +218,7 @@ async function hasClarinetProject(path = "./Clarinet.toml") {
199
218
  return false;
200
219
  }
201
220
  }
221
+ var CLARINET_SDK_INSTALL_HINT = "This command needs @stacks/clarinet-sdk. Install it in your project: bun add -d @stacks/clarinet-sdk";
202
222
  var init_clarinet = () => {};
203
223
 
204
224
  // src/utils/config.ts
@@ -316,5 +336,5 @@ export {
316
336
  defineConfig
317
337
  };
318
338
 
319
- //# debugId=2F5A9B672E310A4B64756E2164756E21
339
+ //# debugId=C8749420EB6E7D9F64756E2164756E21
320
340
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -4,11 +4,11 @@
4
4
  "sourcesContent": [
5
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 * 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",
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 { DEFAULT_SENDER_ADDRESS } from \"../../utils/constants\";\nimport { parseContractId } from \"../../utils/contract-id\";\n\nconst CLARINET_SDK_INSTALL_HINT =\n\t\"This command needs @stacks/clarinet-sdk. Install it in your project: bun add -d @stacks/clarinet-sdk\";\n\n/**\n * True when `error` is Node/Bun's module-resolution failure for exactly\n * `moduleName`, not some other missing module the resolver hit along the way.\n */\nfunction isModuleNotFoundError(error: unknown, moduleName: string): boolean {\n\tif (!(error instanceof Error)) return false;\n\tconst code = (error as NodeJS.ErrnoException).code;\n\tif (code !== \"MODULE_NOT_FOUND\" && code !== \"ERR_MODULE_NOT_FOUND\") {\n\t\treturn false;\n\t}\n\treturn error.message.includes(moduleName);\n}\n\n/**\n * `@stacks/clarinet-sdk` is an optional peer dependency — most consumers of\n * this CLI never touch Clarinet. Loading it lazily (rather than as a static\n * import) keeps it out of dist's top-level module graph, so `secondlayer\n * --version` and every other command work without it installed. Only a\n * missing-module failure for this exact package is translated into an\n * actionable message; anything else (a real error inside the SDK) is\n * rethrown as-is.\n */\nasync function importClarinetSdk(): Promise<\n\ttypeof import(\"@stacks/clarinet-sdk\")\n> {\n\ttry {\n\t\treturn await import(\"@stacks/clarinet-sdk\");\n\t} catch (error) {\n\t\tif (isModuleNotFoundError(error, \"@stacks/clarinet-sdk\")) {\n\t\t\tthrow new Error(CLARINET_SDK_INSTALL_HINT);\n\t\t}\n\t\tthrow error;\n\t}\n}\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 { initSimnet } = await importClarinetSdk();\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
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
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"
10
10
  ],
11
- "mappings": "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",
12
- "debugId": "2F5A9B672E310A4B64756E2164756E21",
11
+ "mappings": "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",
12
+ "debugId": "C8749420EB6E7D9F64756E2164756E21",
13
13
  "names": []
14
14
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secondlayer/cli",
3
- "version": "16.2.0",
3
+ "version": "16.3.1",
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",
@@ -35,7 +35,7 @@
35
35
  "dependencies": {
36
36
  "@biomejs/js-api": "^0.7.0",
37
37
  "@biomejs/wasm-nodejs": "^1.9.0",
38
- "@dsnp/parquetjs": "^1.8.8",
38
+ "@dsnp/parquetjs": "~1.8.8",
39
39
  "@inquirer/prompts": "^8.2.0",
40
40
  "@opentui/core": "^0.5.3",
41
41
  "@opentui/react": "^0.5.3",
@@ -44,7 +44,7 @@
44
44
  "@secondlayer/sdk": "^11.0.0",
45
45
  "@secondlayer/shared": "^11.8.1",
46
46
  "@secondlayer/stacks": "^6.1.0",
47
- "@secondlayer/subgraphs": "^6.0.0",
47
+ "@secondlayer/subgraphs": "^6.1.0",
48
48
  "esbuild": "^0.28.2",
49
49
  "react": "^19.1.0",
50
50
  "smol-toml": "^1.8.0",