@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.
- package/dist/{esm-CO92uOgU.mjs → esm-BjGH_MkS.mjs} +85 -245
- package/dist/esm-BjGH_MkS.mjs.map +1 -0
- package/dist/{esm-CRbGFHSR.cjs → esm-DPOm6Bdw.cjs} +114 -316
- package/dist/esm-DPOm6Bdw.cjs.map +1 -0
- package/dist/index.cjs +1 -8
- package/dist/index.d.cts +21 -64
- package/dist/index.d.mts +21 -64
- package/dist/index.mjs +2 -2
- package/dist/run-cli.cjs +53 -50
- package/dist/run-cli.cjs.map +1 -1
- package/dist/run-cli.mjs +51 -48
- package/dist/run-cli.mjs.map +1 -1
- package/package.json +17 -15
- package/dist/esm-CO92uOgU.mjs.map +0 -1
- package/dist/esm-CRbGFHSR.cjs.map +0 -1
|
@@ -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 (
|
|
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
|
-
|
|
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))
|
|
575
|
-
if (
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
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
|
-
}
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
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(
|
|
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:
|
|
739
|
-
maxStringLength:
|
|
740
|
-
breakLength:
|
|
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 =
|
|
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
|
|
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 {
|
|
917
|
-
//# sourceMappingURL=esm-
|
|
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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"}
|