@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,211 +1,18 @@
1
1
  import { cvToValue, getContractName, getTypeString, isClarityAbiBuffer, isClarityAbiList, isClarityAbiOptional, isClarityAbiPrimitive, isClarityAbiResponse, isClarityAbiStringAscii, isClarityAbiStringUtf8, isClarityAbiTraitReference, isClarityAbiTuple, toCamelCase } from "@clarigen/core";
2
+ import { createContractDocInfo } from "@clarigen/docs";
3
+ import { basename, dirname, extname, join, relative, resolve } from "node:path";
4
+ import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
2
5
  import { pino } from "pino";
3
6
  import pinoPretty from "pino-pretty";
4
- import { spawn } from "child_process";
5
- import { basename, dirname, extname, join, relative, resolve } from "path";
6
- import { mkdir, readFile, stat, writeFile } from "fs/promises";
7
+ import { spawn } from "node:child_process";
7
8
  import { type } from "arktype";
8
9
  import { parse, stringify } from "@iarna/toml";
9
- import { inspect } from "util";
10
+ import { inspect } from "node:util";
10
11
  import { parse as parse$1 } from "yaml";
11
12
  import { getContractTxs, getDeploymentContract, getDeploymentTxPath, getIdentifierForDeploymentTx } from "@clarigen/core/deployment";
12
13
 
13
- //#region src/logger.ts
14
- const colorizedClarigen = `\x1b[33m[Clarigen]\x1b[0m`;
15
- const logger = pino(pinoPretty({
16
- colorize: true,
17
- ignore: "pid,hostname,time",
18
- messageFormat: `${colorizedClarigen} {msg}`,
19
- minimumLevel: "debug"
20
- }));
21
- logger.level = "info";
22
- const log = logger;
23
-
24
- //#endregion
25
- //#region src/docs/index.ts
26
- const FN_TYPES = [
27
- "read-only",
28
- "public",
29
- "private"
30
- ];
31
- const VAR_TYPES = [
32
- "map",
33
- "data-var",
34
- "constant"
35
- ];
36
- function createContractDocInfo({ contractSrc, abi }) {
37
- const lines = contractSrc.split("\n");
38
- let comments = [];
39
- let parensCount = 0;
40
- let currentFn;
41
- const contract = {
42
- comments: [],
43
- functions: [],
44
- variables: [],
45
- maps: []
46
- };
47
- lines.forEach((line, lineNumber) => {
48
- if (currentFn) {
49
- currentFn.source.push(line);
50
- parensCount = traceParens(line, parensCount);
51
- if (parensCount === 0) {
52
- pushItem(contract, currentFn);
53
- currentFn = void 0;
54
- }
55
- return;
56
- }
57
- if (isComment(line)) {
58
- const comment = line.replace(/^\s*;;\s*/g, "");
59
- if (contract.comments.length === lineNumber) contract.comments.push(comment);
60
- else comments.push(comment);
61
- return;
62
- }
63
- const name = findItemNameFromLine(line);
64
- if (typeof name === "undefined") comments = [];
65
- else {
66
- const abiFn = findAbiItemByName(abi, name);
67
- if (!abiFn) {
68
- console.debug(`[claridoc]: Unable to find ABI for function \`${name}\`. Probably a bug.`);
69
- return;
70
- }
71
- parensCount = traceParens(line, 0);
72
- currentFn = {
73
- abi: abiFn,
74
- comments: parseComments(comments, abiFn),
75
- startLine: lineNumber,
76
- source: [line]
77
- };
78
- if (parensCount === 0) {
79
- pushItem(contract, currentFn);
80
- currentFn = void 0;
81
- }
82
- comments = [];
83
- }
84
- });
85
- return contract;
86
- }
87
- function pushItem(contract, item) {
88
- if ("args" in item.abi) contract.functions.push(item);
89
- else if ("key" in item.abi) contract.maps.push(item);
90
- else if ("access" in item.abi) contract.variables.push(item);
91
- }
92
- function clarityNameMatcher(line) {
93
- return /[\w|\-|\?|\!]+/.exec(line);
94
- }
95
- function findItemNameFromLine(line) {
96
- const fnType = FN_TYPES.find((type$1) => {
97
- return line.startsWith(`(define-${type$1}`);
98
- });
99
- if (fnType) {
100
- const prefix = `(define-${fnType} (`;
101
- const match = clarityNameMatcher(line.slice(prefix.length));
102
- if (!match) {
103
- console.debug(`[claridocs]: Unable to determine function name from line:\n \`${line}\``);
104
- return;
105
- }
106
- return match[0];
107
- }
108
- for (const type$1 of VAR_TYPES) {
109
- const prefix = `(define-${type$1} `;
110
- if (!line.startsWith(prefix)) continue;
111
- const match = clarityNameMatcher(line.slice(prefix.length));
112
- if (!match) {
113
- console.debug(`[claridocs]: Unable to determine ${type$1} name from line:\n \`${line}\``);
114
- return;
115
- }
116
- return match[0];
117
- }
118
- }
119
- function findAbiItemByName(abi, name) {
120
- const fn = abi.functions.find((fn$1) => {
121
- return fn$1.name === name;
122
- });
123
- if (fn) return fn;
124
- const map = abi.maps.find((m) => m.name === name);
125
- if (map) return map;
126
- return abi.variables.find((v) => v.name === name);
127
- }
128
- function isComment(line) {
129
- return line.startsWith(";;");
130
- }
131
- function getFnName(line) {
132
- const fnType = FN_TYPES.find((type$1) => {
133
- return line.startsWith(`(define-${type$1}`);
134
- });
135
- if (typeof fnType === "undefined") return;
136
- const prefix = `(define-${fnType} (`;
137
- const match = clarityNameMatcher(line.slice(prefix.length));
138
- if (!match) {
139
- console.debug(`[claridocs]: Unable to determine function name from line:\n \`${line}\``);
140
- return;
141
- }
142
- return match[0];
143
- }
144
- function traceParens(line, count) {
145
- let newCount = count;
146
- line.split("").forEach((char) => {
147
- if (char === "(") newCount++;
148
- if (char === ")") newCount--;
149
- });
150
- return newCount;
151
- }
152
- function parseComments(comments, abi) {
153
- let curParam;
154
- const parsed = {
155
- text: [],
156
- params: {}
157
- };
158
- comments.forEach((line) => {
159
- const paramMatches = /\s*@param\s([\w|\-]+)([;|-|\s]*)(.*)/.exec(line);
160
- if (paramMatches === null) {
161
- if (!curParam || line.trim() === "") {
162
- curParam = void 0;
163
- parsed.text.push(line);
164
- } else parsed.params[curParam].comments.push(line);
165
- return;
166
- }
167
- if (!("args" in abi)) return;
168
- const [_full, name, _separator, rest] = paramMatches;
169
- const arg = abi.args.find((arg$1) => arg$1.name === name);
170
- if (!arg) {
171
- console.debug(`[claridocs]: Unable to find ABI for @param ${name}`);
172
- return;
173
- }
174
- curParam = name;
175
- parsed.params[curParam] = {
176
- abi: arg,
177
- comments: [rest]
178
- };
179
- });
180
- if ("args" in abi) abi.args.forEach((arg) => {
181
- if (!parsed.params[arg.name]) parsed.params[arg.name] = {
182
- abi: arg,
183
- comments: []
184
- };
185
- });
186
- return parsed;
187
- }
188
- async function afterDocs(config) {
189
- var _config$docs;
190
- const command = (_config$docs = config.docs) === null || _config$docs === void 0 ? void 0 : _config$docs.after;
191
- if (!command) return;
192
- logger.debug(`Running after docs command: ${command}`);
193
- const [cmd, ...args] = command.split(" ");
194
- return new Promise((resolve$1, reject) => {
195
- const child = spawn(cmd, args, {
196
- cwd: config.cwd,
197
- stdio: "inherit"
198
- });
199
- child.on("error", reject);
200
- child.on("exit", (code) => {
201
- if (code === 0) resolve$1();
202
- else reject(/* @__PURE__ */ new Error(`Command failed with code ${code ?? "unknown"}`));
203
- });
204
- });
205
- }
206
-
207
- //#endregion
208
14
  //#region src/utils.ts
15
+ /** biome-ignore-all lint/style/useTrimStartEnd: suppressed */
209
16
  function encodeVariableName(name) {
210
17
  if (/^[A-Z\-_]*$/.test(name)) return name.replaceAll("-", "_");
211
18
  return toCamelCase(name);
@@ -214,7 +21,7 @@ async function fileExists(filename) {
214
21
  try {
215
22
  await stat(filename);
216
23
  return true;
217
- } catch (error) {
24
+ } catch (_error) {
218
25
  return false;
219
26
  }
220
27
  }
@@ -275,9 +82,7 @@ ${constants.join("\n\n")}
275
82
  function markdownFunction(fn, contractFile) {
276
83
  const params = mdParams(fn);
277
84
  const returnType = getTypeString(fn.abi.outputs.type);
278
- const paramSigs = fn.abi.args.map((arg) => {
279
- return `(${arg.name} ${getTypeString(arg.type)})`;
280
- });
85
+ const paramSigs = fn.abi.args.map((arg) => `(${arg.name} ${getTypeString(arg.type)})`);
281
86
  const startLine = fn.startLine + 1;
282
87
  let link = "";
283
88
  if (contractFile) link = `[View in file](${contractFile}#L${startLine})`;
@@ -399,8 +204,42 @@ ${contractLines.join("\n")}
399
204
  `;
400
205
  }
401
206
 
207
+ //#endregion
208
+ //#region src/logger.ts
209
+ const colorizedClarigen = "\x1B[33m[Clarigen]\x1B[0m";
210
+ const logger = pino(pinoPretty({
211
+ colorize: true,
212
+ ignore: "pid,hostname,time",
213
+ messageFormat: `${colorizedClarigen} {msg}`,
214
+ minimumLevel: "debug"
215
+ }));
216
+ logger.level = "info";
217
+ const log = logger;
218
+
219
+ //#endregion
220
+ //#region src/docs/index.ts
221
+ async function afterDocs(config) {
222
+ var _config$docs;
223
+ const command = (_config$docs = config.docs) === null || _config$docs === void 0 ? void 0 : _config$docs.after;
224
+ if (!command) return;
225
+ logger.debug(`Running after docs command: ${command}`);
226
+ const [cmd, ...args] = command.split(" ");
227
+ return new Promise((resolve$1, reject) => {
228
+ const child = spawn(cmd, args, {
229
+ cwd: config.cwd,
230
+ stdio: "inherit"
231
+ });
232
+ child.on("error", reject);
233
+ child.on("exit", (code) => {
234
+ if (code === 0) resolve$1();
235
+ else reject(/* @__PURE__ */ new Error(`Command failed with code ${code ?? "unknown"}`));
236
+ });
237
+ });
238
+ }
239
+
402
240
  //#endregion
403
241
  //#region src/clarinet-config.ts
242
+ /** biome-ignore-all lint/style/useTrimStartEnd: suppressed */
404
243
  const ClarinetConfig = type({
405
244
  project: type({
406
245
  requirements: type({ contract_id: type("string").describe("Contract ID") }).array().describe("Project requirements").optional(),
@@ -415,6 +254,7 @@ async function getClarinetConfig(path) {
415
254
 
416
255
  //#endregion
417
256
  //#region src/config.ts
257
+ /** biome-ignore-all lint/style/useTrimStartEnd: suppressed */
418
258
  const CONFIG_FILE = "Clarigen.toml";
419
259
  let OutputType = /* @__PURE__ */ function(OutputType$1) {
420
260
  OutputType$1["ESM"] = "types";
@@ -442,7 +282,7 @@ const ConfigFile = type({
442
282
  }).optional()
443
283
  });
444
284
  const defaultConfigFile = { clarinet: "./Clarinet.toml" };
445
- var Config = class {
285
+ var Config = class Config {
446
286
  configFile;
447
287
  clarinet;
448
288
  cwd;
@@ -457,8 +297,7 @@ var Config = class {
457
297
  config[OutputType.ESM] = config[OutputType.ESM_OLD];
458
298
  delete config[OutputType.ESM_OLD];
459
299
  }
460
- const clarinet = await getClarinetConfig(resolve(cwd ?? "", config.clarinet));
461
- return new this(config, clarinet, cwd);
300
+ return new Config(config, await getClarinetConfig(resolve(cwd ?? "", config.clarinet)), cwd);
462
301
  }
463
302
  getOutputs(type$1) {
464
303
  var _this$configFile$type, _this$configFile$type2;
@@ -470,9 +309,7 @@ var Config = class {
470
309
  outputResolve(type$1, filePath) {
471
310
  const outputs = this.getOutputs(type$1);
472
311
  if (!this.supports(type$1)) return null;
473
- return outputs.map((path) => {
474
- return resolve(this.cwd, path, filePath || "");
475
- });
312
+ return outputs.map((path) => resolve(this.cwd, path, filePath || ""));
476
313
  }
477
314
  async writeOutput(type$1, contents, filePath) {
478
315
  const paths = this.outputResolve(type$1, filePath);
@@ -527,6 +364,7 @@ async function getConfig(cwd) {
527
364
  //#endregion
528
365
  //#region src/files/docs.ts
529
366
  async function generateDocs({ session, config }) {
367
+ var _config$outputResolve, _await$config$writeOu;
530
368
  const docs = config.configFile[OutputType.Docs];
531
369
  const docsBase = docs === null || docs === void 0 ? void 0 : docs.output;
532
370
  if (!docsBase) {
@@ -534,11 +372,9 @@ async function generateDocs({ session, config }) {
534
372
  return;
535
373
  }
536
374
  if (extname(docsBase)) log.warn(`Docs output path ('${docsBase}') looks like a file - it needs to be a directory.`);
537
- const excluded = Object.fromEntries((docs.exclude || []).map((e) => {
538
- return [e, true];
539
- }));
375
+ const excluded = Object.fromEntries((docs.exclude || []).map((e) => [e, true]));
540
376
  log.debug(`Generating docs at path \`${docsBase}\``);
541
- const docsBaseFolder = config.outputResolve(OutputType.Docs, "./")[0];
377
+ const docsBaseFolder = (_config$outputResolve = config.outputResolve(OutputType.Docs, "./")) === null || _config$outputResolve === void 0 ? void 0 : _config$outputResolve[0];
542
378
  const paths = await Promise.all(session.contracts.map(async (contract) => {
543
379
  var _config$clarinet$cont;
544
380
  const name = getContractName(contract.contract_id, false);
@@ -555,7 +391,7 @@ async function generateDocs({ session, config }) {
555
391
  return (await config.writeOutput(OutputType.Docs, md, docFile))[0];
556
392
  }));
557
393
  const readme = generateReadme(session, excluded);
558
- paths.push((await config.writeOutput(OutputType.Docs, readme, "README.md"))[0]);
394
+ paths.push((_await$config$writeOu = await config.writeOutput(OutputType.Docs, readme, "README.md")) === null || _await$config$writeOu === void 0 ? void 0 : _await$config$writeOu[0]);
559
395
  await afterDocs(config);
560
396
  }
561
397
  function warnNoDocs() {
@@ -571,21 +407,25 @@ output = "docs/"
571
407
  //#endregion
572
408
  //#region src/declaration.ts
573
409
  const jsTypeFromAbiType = (val, isArgument = false) => {
574
- if (isClarityAbiPrimitive(val)) if (val === "uint128") {
575
- if (isArgument) return "number | bigint";
576
- return "bigint";
577
- } else if (val === "int128") {
578
- if (isArgument) return "number | bigint";
579
- return "bigint";
580
- } else if (val === "bool") return "boolean";
581
- else if (val === "principal") return "string";
582
- else if (val === "none") return "null";
583
- else if (val === "trait_reference") return "string";
584
- else throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(val)}`);
585
- else if (isClarityAbiBuffer(val)) return "Uint8Array";
586
- else if (isClarityAbiResponse(val)) return `Response<${jsTypeFromAbiType(val.response.ok, isArgument)}, ${jsTypeFromAbiType(val.response.error, isArgument)}>`;
587
- else if (isClarityAbiOptional(val)) return `${jsTypeFromAbiType(val.optional, isArgument)} | null`;
588
- else if (isClarityAbiTuple(val)) {
410
+ if (isClarityAbiPrimitive(val)) {
411
+ if (val === "uint128") {
412
+ if (isArgument) return "number | bigint";
413
+ return "bigint";
414
+ }
415
+ if (val === "int128") {
416
+ if (isArgument) return "number | bigint";
417
+ return "bigint";
418
+ }
419
+ if (val === "bool") return "boolean";
420
+ if (val === "principal") return "string";
421
+ if (val === "none") return "null";
422
+ if (val === "trait_reference") return "string";
423
+ throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(val)}`);
424
+ }
425
+ if (isClarityAbiBuffer(val)) return "Uint8Array";
426
+ if (isClarityAbiResponse(val)) return `Response<${jsTypeFromAbiType(val.response.ok, isArgument)}, ${jsTypeFromAbiType(val.response.error, isArgument)}>`;
427
+ if (isClarityAbiOptional(val)) return `${jsTypeFromAbiType(val.optional, isArgument)} | null`;
428
+ if (isClarityAbiTuple(val)) {
589
429
  const tupleDefs = [];
590
430
  val.tuple.forEach(({ name, type: type$1 }) => {
591
431
  const camelName = toCamelCase(name);
@@ -595,11 +435,12 @@ const jsTypeFromAbiType = (val, isArgument = false) => {
595
435
  return `{
596
436
  ${tupleDefs.join("\n ")}
597
437
  }`;
598
- } else if (isClarityAbiList(val)) return `${jsTypeFromAbiType(val.list.type, isArgument)}[]`;
599
- else if (isClarityAbiStringAscii(val)) return "string";
600
- else if (isClarityAbiStringUtf8(val)) return "string";
601
- else if (isClarityAbiTraitReference(val)) return "string";
602
- else throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(val)}`);
438
+ }
439
+ if (isClarityAbiList(val)) return `${jsTypeFromAbiType(val.list.type, isArgument)}[]`;
440
+ if (isClarityAbiStringAscii(val)) return "string";
441
+ if (isClarityAbiStringUtf8(val)) return "string";
442
+ if (isClarityAbiTraitReference(val)) return "string";
443
+ throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(val)}`);
603
444
  };
604
445
  function abiArgType(arg) {
605
446
  const nativeType = jsTypeFromAbiType(arg.type, true);
@@ -676,9 +517,7 @@ function generateContractMeta(contract, constants) {
676
517
  const otherAbi = JSON.stringify(rest);
677
518
  const contractName = contract.contract_id.split(".")[1];
678
519
  const variableLines = encodeVariables(variables);
679
- const nftLines = non_fungible_tokens.map((nft) => {
680
- return JSON.stringify(nft);
681
- });
520
+ const nftLines = non_fungible_tokens.map((nft) => JSON.stringify(nft));
682
521
  return `{
683
522
  ${serializeLines("functions", functionLines)}
684
523
  ${serializeLines("maps", mapLines)}
@@ -726,7 +565,7 @@ function encodeVariables(variables) {
726
565
  return varLine;
727
566
  });
728
567
  }
729
- Uint8Array.prototype[inspect.custom] = function(depth, options) {
568
+ Uint8Array.prototype[inspect.custom] = function(_depth, _options) {
730
569
  return `Uint8Array.from([${this.join(",")}])`;
731
570
  };
732
571
  function serialize(obj) {
@@ -735,9 +574,9 @@ function serialize(obj) {
735
574
  compact: false,
736
575
  depth: 100,
737
576
  colors: false,
738
- maxArrayLength: Infinity,
739
- maxStringLength: Infinity,
740
- breakLength: Infinity,
577
+ maxArrayLength: Number.POSITIVE_INFINITY,
578
+ maxStringLength: Number.POSITIVE_INFINITY,
579
+ breakLength: Number.POSITIVE_INFINITY,
741
580
  numericSeparator: true
742
581
  });
743
582
  }
@@ -775,7 +614,7 @@ function getVariablesV2(contract, simnet, verbose) {
775
614
  logger.info(`Contract ${getContractName(contract.contract_id, false)} has no variables`);
776
615
  return {};
777
616
  }
778
- let varFn = `{\n`;
617
+ let varFn = "{\n";
779
618
  const varLines = contract.contract_interface.variables.map((variable) => {
780
619
  let varLine = `${variable.name}: `;
781
620
  if (variable.access === "constant") varLine += `${variable.name}`;
@@ -784,7 +623,7 @@ function getVariablesV2(contract, simnet, verbose) {
784
623
  });
785
624
  varFn += varLines.map((l) => ` ${l},`).join("\n");
786
625
  varFn += "\n}";
787
- const fullSrc = contract.source + `\n\n${varFn}`;
626
+ const fullSrc = `${contract.source}\n\n${varFn}`;
788
627
  try {
789
628
  const result = simnet.deployContract(fakeId, fullSrc, { clarityVersion: clarityVersionForContract(contract) }, deployer).result;
790
629
  const varsAbi = { tuple: [] };
@@ -810,6 +649,7 @@ function mapVariables(session, simnet) {
810
649
 
811
650
  //#endregion
812
651
  //#region src/files/esm.ts
652
+ /** biome-ignore-all lint/style/useTrimStartEnd: suppressed */
813
653
  async function parseDeployment(path) {
814
654
  return parse$1(await readFile(path, "utf-8"));
815
655
  }
@@ -913,5 +753,5 @@ async function afterESM(config) {
913
753
  }
914
754
 
915
755
  //#endregion
916
- export { generateMarkdown as A, afterDocs as B, OutputType as C, saveConfig as D, getConfig as E, fileExists as F, traceParens as G, getFnName as H, sortContracts as I, logger as K, writeFile$1 as L, markdownFunction as M, cwdRelative as N, ClarinetConfig as O, encodeVariableName as P, FN_TYPES as R, ConfigFile as S, defaultConfigFile as T, isComment as U, createContractDocInfo as V, parseComments as W, getArgName as _, generateESMFile as a, CONFIG_FILE as b, getVariablesV2 as c, encodeVariables as d, generateBaseFile as f, abiFunctionType as g, abiArgType as h, collectDeploymentFiles as i, generateReadme as j, getClarinetConfig as k, mapVariables as l, serialize as m, afterESM as n, getDeployments as o, generateContractMeta as p, collectContractDeployments as r, parseDeployment as s, DEPLOYMENT_NETWORKS as t, TYPE_IMPORTS as u, jsTypeFromAbiType as v, configFilePath as w, Config as x, generateDocs as y, VAR_TYPES as z };
917
- //# sourceMappingURL=esm-CO92uOgU.mjs.map
756
+ export { afterDocs as A, OutputType as C, saveConfig as D, getConfig as E, cwdRelative as F, encodeVariableName as I, fileExists as L, generateMarkdown as M, generateReadme as N, ClarinetConfig as O, markdownFunction as P, sortContracts as R, ConfigFile as S, defaultConfigFile as T, getArgName as _, generateESMFile as a, CONFIG_FILE as b, getVariablesV2 as c, encodeVariables as d, generateBaseFile as f, abiFunctionType as g, abiArgType as h, collectDeploymentFiles as i, logger as j, getClarinetConfig as k, mapVariables as l, serialize as m, afterESM as n, getDeployments as o, generateContractMeta as p, collectContractDeployments as r, parseDeployment as s, DEPLOYMENT_NETWORKS as t, TYPE_IMPORTS as u, jsTypeFromAbiType as v, configFilePath as w, Config as x, generateDocs as y, writeFile$1 as z };
757
+ //# sourceMappingURL=esm-BjGH_MkS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esm-BjGH_MkS.mjs","names":["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/utils.ts","../src/docs/markdown.ts","../src/logger.ts","../src/docs/index.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 { dirname, relative, resolve } from '../deps.ts';\n/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { getContractName, toCamelCase } from '@clarigen/core';\n// export { getContractName, toCamelCase, toKebabCase } from '@clarigen/core';\nimport { stat, mkdir, writeFile as fsWriteFile } from 'node:fs/promises';\nimport { dirname, relative } from 'node:path';\n\nexport function encodeVariableName(name: string) {\n // biome-ignore lint/performance/useTopLevelRegex: ignored using `--suppress`\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 }>(\n contracts: T[]\n): T[] {\n const nameSorted = [...contracts].sort((a, b) => {\n if (\n getContractName(a.contract_id, false) <\n getContractName(b.contract_id, false)\n ) {\n return -1;\n }\n return 1;\n });\n return nameSorted;\n}\n","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport type { Session, SessionContract } from '../session';\nimport { getContractName, getTypeString } from '@clarigen/core';\nimport {\n type ClaridocContract,\n type ClaridocFunction,\n type ClaridocItem,\n type ClaridocMap,\n type ClaridocParam,\n type ClaridocVariable,\n createContractDocInfo,\n} from '@clarigen/docs';\nimport { basename } from 'node: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 => `(${arg.name} ${getTypeString(arg.type)})`);\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 // biome-ignore lint/complexity/noForEach: ignored using `--suppress`\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 { 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 type { Config } from '../config';\nimport { logger } from '../logger';\nimport { spawn } from 'node:child_process';\n\n// biome-ignore lint/suspicious/useAwait: ignored using `--suppress`\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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { type } from 'arktype';\nimport { readFile } from 'node: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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { type } from 'arktype';\nimport { log, logger } from './logger';\nimport { fileExists, writeFile } from './utils';\nimport { type ClarinetConfig, getClarinetConfig } from './clarinet-config';\nimport { dirname, join, relative, resolve } from 'node:path';\nimport { stringify, parse } from '@iarna/toml';\nimport { readFile } from 'node:fs/promises';\n\nexport const CONFIG_FILE = 'Clarigen.toml' as const;\n\n// biome-ignore lint/style/noEnum: ignored using `--suppress`\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(\n 'Include accounts in the output'\n ),\n 'after?': type('string').describe(\n 'Script to run after the output is generated'\n ),\n 'include_boot_contracts?': type('boolean').describe(\n 'Include boot contracts in the output'\n ),\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(\n 'Path to docs output folder. Defaults to ./docs'\n ),\n 'outputs?': type('string[]').describe('Paths to docs output folders'),\n 'exclude?': type('string[]').describe(\n 'Contracts to exclude from docs generation'\n ),\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 // biome-ignore lint/style/useConsistentMemberAccessibility: ignored using `--suppress`\n public configFile: ConfigFile;\n // biome-ignore lint/style/useConsistentMemberAccessibility: ignored using `--suppress`\n public clarinet: ClarinetConfig;\n // biome-ignore lint/style/useConsistentMemberAccessibility: ignored using `--suppress`\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 // biome-ignore lint/style/useConsistentMemberAccessibility: ignored using `--suppress`\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(\n resolve(cwd ?? '', config.clarinet)\n );\n return new Config(config, clarinet, cwd);\n }\n\n // biome-ignore lint/nursery/noShadow: ignored using `--suppress`\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 // biome-ignore lint/nursery/noShadow: ignored using `--suppress`\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) => resolve(this.cwd, path, filePath || ''));\n }\n\n // biome-ignore lint/nursery/noShadow: ignored using `--suppress`\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 // biome-ignore lint/nursery/noShadow: ignored using `--suppress`\n supports(type: OutputType) {\n return this.getOutputs(type).length > 0;\n }\n\n // biome-ignore lint/nursery/noShadow: ignored using `--suppress`\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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport type { SessionWithVariables } from '../session';\nimport { type Config, OutputType } from '../config';\nimport { log } from '../logger';\nimport { getContractName } from '@clarigen/core';\nimport { relative, extname } from 'node: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 => [e, true])\n );\n log.debug(`Generating docs at path \\`${docsBase}\\``);\n // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\n // biome-ignore lint/suspicious/noNonNullAssertedOptionalChain: ignored using `--suppress`\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 // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\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 paths.push(\n // biome-ignore lint/suspicious/noNonNullAssertedOptionalChain: ignored using `--suppress`\n // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\n (await config.writeOutput(OutputType.Docs, readme, 'README.md'))?.[0]!\n );\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 type ClarityAbiType,\n isClarityAbiTraitReference,\n} from '@clarigen/core';\n// import { ClarityAbiArg, ClarityAbiFunction, ClarityAbiType } from '../types.ts';\nimport {\n toCamelCase,\n type ClarityAbiArg,\n type ClarityAbiFunction,\n} from '@clarigen/core';\n\nexport const jsTypeFromAbiType = (\n val: ClarityAbiType,\n isArgument = false\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: ignored using `--suppress`\n): string => {\n if (isClarityAbiPrimitive(val)) {\n if (val === 'uint128') {\n if (isArgument) return 'number | bigint';\n return 'bigint';\n }\n if (val === 'int128') {\n if (isArgument) return 'number | bigint';\n return 'bigint';\n }\n if (val === 'bool') {\n return 'boolean';\n }\n if (val === 'principal') {\n return 'string';\n }\n if (val === 'none') {\n return 'null';\n }\n if (val === 'trait_reference') {\n return 'string';\n }\n throw new Error(\n `Unexpected Clarity ABI type primitive: ${JSON.stringify(val)}`\n );\n }\n if (isClarityAbiBuffer(val)) {\n return 'Uint8Array';\n }\n 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 }\n if (isClarityAbiOptional(val)) {\n const innerType = jsTypeFromAbiType(val.optional, isArgument);\n return `${innerType} | null`;\n }\n if (isClarityAbiTuple(val)) {\n const tupleDefs: string[] = [];\n // biome-ignore lint/complexity/noForEach: ignored using `--suppress`\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 }\n if (isClarityAbiList(val)) {\n const innerType = jsTypeFromAbiType(val.list.type, isArgument);\n return `${innerType}[]`;\n }\n if (isClarityAbiStringAscii(val)) {\n return 'string';\n }\n if (isClarityAbiStringUtf8(val)) {\n return 'string';\n }\n if (isClarityAbiTraitReference(val)) {\n return 'string';\n }\n throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(val)}`);\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 type { 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 type { 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, type ClarityAbiVariable } from '@clarigen/core';\nimport { generateAccountsCode } from './accounts';\nimport { generateIdentifiersCode } from './identifiers';\nimport { inspect, type InspectOptions } from 'node: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 // biome-ignore lint/complexity/noForEach: ignored using `--suppress`\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 => JSON.stringify(nft));\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 // biome-ignore lint/style/useConsistentTypeDefinitions: ignored using `--suppress`\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\n// biome-ignore lint/suspicious/noExplicitAny: ignored using `--suppress`\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: Number.POSITIVE_INFINITY,\n maxStringLength: Number.POSITIVE_INFINITY,\n breakLength: Number.POSITIVE_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 type { Session, SessionContract } from '../session';\nimport {\n type ClarityAbiTypeTuple,\n type 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 // biome-ignore lint/complexity/noForEach: ignored using `--suppress`\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","/** biome-ignore-all lint/style/useTrimStartEnd: suppressed */\nimport { readFile } from 'node:fs/promises';\nimport { join, dirname, relative } from 'node:path';\nimport type { Config } from '../config';\nimport { parse } from 'yaml';\nimport {\n type Batch,\n getContractTxs,\n getDeploymentContract,\n getDeploymentTxPath,\n getIdentifierForDeploymentTx,\n type DeploymentTransaction,\n} from '@clarigen/core/deployment';\nimport type { DeploymentPlan, SimnetDeploymentPlan } from '@clarigen/core';\nimport { getContractName } from '@clarigen/core';\nimport { sortContracts } from '../utils';\nimport type { Session } from '../session';\nimport { spawn } from 'node: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 // biome-ignore lint/suspicious/noEmptyBlockStatements: ignored using `--suppress`\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 // biome-ignore lint/nursery/noShadow: ignored using `--suppress`\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 // biome-ignore lint/complexity/noForEach: ignored using `--suppress`\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 // biome-ignore lint/complexity/noForEach: ignored using `--suppress`\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\n// biome-ignore lint/suspicious/useAwait: ignored using `--suppress`\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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"}