@stacks/clarinet-sdk 3.8.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.
Files changed (36) hide show
  1. package/README.md +91 -0
  2. package/dist/cjs/common/src/sdkProxyHelpers.d.ts +86 -0
  3. package/dist/cjs/common/src/sdkProxyHelpers.js +66 -0
  4. package/dist/cjs/common/src/sdkProxyHelpers.js.map +1 -0
  5. package/dist/cjs/node/src/index.d.ts +15 -0
  6. package/dist/cjs/node/src/index.js +68 -0
  7. package/dist/cjs/node/src/index.js.map +1 -0
  8. package/dist/cjs/node/src/sdkProxy.d.ts +11 -0
  9. package/dist/cjs/node/src/sdkProxy.js +98 -0
  10. package/dist/cjs/node/src/sdkProxy.js.map +1 -0
  11. package/dist/cjs/node/src/vfs.d.ts +3 -0
  12. package/dist/cjs/node/src/vfs.js +109 -0
  13. package/dist/cjs/node/src/vfs.js.map +1 -0
  14. package/dist/cjs/node/tsconfig.cjs.tsbuildinfo +1 -0
  15. package/dist/esm/common/src/sdkProxyHelpers.d.ts +86 -0
  16. package/dist/esm/common/src/sdkProxyHelpers.js +61 -0
  17. package/dist/esm/common/src/sdkProxyHelpers.js.map +1 -0
  18. package/dist/esm/node/src/index.d.ts +15 -0
  19. package/dist/esm/node/src/index.js +30 -0
  20. package/dist/esm/node/src/index.js.map +1 -0
  21. package/dist/esm/node/src/sdkProxy.d.ts +11 -0
  22. package/dist/esm/node/src/sdkProxy.js +95 -0
  23. package/dist/esm/node/src/sdkProxy.js.map +1 -0
  24. package/dist/esm/node/src/vfs.d.ts +3 -0
  25. package/dist/esm/node/src/vfs.js +70 -0
  26. package/dist/esm/node/src/vfs.js.map +1 -0
  27. package/dist/esm/node/src/vitest/index.d.ts +31 -0
  28. package/dist/esm/node/src/vitest/index.js +49 -0
  29. package/dist/esm/node/src/vitest/index.js.map +1 -0
  30. package/dist/esm/node/tsconfig.tsbuildinfo +1 -0
  31. package/dist/esm/package.json +1 -0
  32. package/package.json +73 -0
  33. package/vitest-helpers/src/clarityValuesMatchers.ts +389 -0
  34. package/vitest-helpers/src/global.d.ts +20 -0
  35. package/vitest-helpers/src/vitest.d.ts +28 -0
  36. package/vitest-helpers/src/vitest.setup.ts +69 -0
@@ -0,0 +1,61 @@
1
+ import { Cl } from "@stacks/transactions";
2
+ export const tx = {
3
+ callPublicFn: (contract, method, args, sender) => ({
4
+ callPublicFn: { contract, method, args, sender },
5
+ }),
6
+ callPrivateFn: (contract, method, args, sender) => ({
7
+ callPrivateFn: { contract, method, args, sender },
8
+ }),
9
+ deployContract: (name, content, options, sender) => ({
10
+ deployContract: { name, content, options, sender },
11
+ }),
12
+ transferSTX: (amount, recipient, sender) => ({
13
+ transferSTX: { amount, recipient, sender },
14
+ }),
15
+ };
16
+ export function parseEvents(events) {
17
+ try {
18
+ // @todo: improve type safety
19
+ return JSON.parse(events).map((e) => {
20
+ const { event, data } = JSON.parse(e);
21
+ if ("raw_value" in data) {
22
+ data.value = Cl.deserialize(data.raw_value);
23
+ }
24
+ return {
25
+ event: event,
26
+ data: data,
27
+ };
28
+ });
29
+ }
30
+ catch (e) {
31
+ console.error(`Fail to parse events: ${e}`);
32
+ return [];
33
+ }
34
+ }
35
+ export function parseCosts(costs) {
36
+ try {
37
+ let { memory, memory_limit, total, limit } = JSON.parse(costs);
38
+ return {
39
+ memory: memory,
40
+ memory_limit: memory_limit,
41
+ total: {
42
+ writeLength: total.write_length,
43
+ writeCount: total.write_count,
44
+ readLength: total.read_length,
45
+ readCount: total.read_count,
46
+ runtime: total.runtime,
47
+ },
48
+ limit: {
49
+ writeLength: limit.write_length,
50
+ writeCount: limit.write_count,
51
+ readLength: limit.read_length,
52
+ readCount: limit.read_count,
53
+ runtime: limit.runtime,
54
+ },
55
+ };
56
+ }
57
+ catch (_e) {
58
+ return null;
59
+ }
60
+ }
61
+ //# sourceMappingURL=sdkProxyHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkProxyHelpers.js","sourceRoot":"","sources":["../../../../../common/src/sdkProxyHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAgB,MAAM,sBAAsB,CAAC;AA6FxD,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,YAAY,EAAE,CAAC,QAAgB,EAAE,MAAc,EAAE,IAAoB,EAAE,MAAc,EAAM,EAAE,CAAC,CAAC;QAC7F,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;KACjD,CAAC;IACF,aAAa,EAAE,CAAC,QAAgB,EAAE,MAAc,EAAE,IAAoB,EAAE,MAAc,EAAM,EAAE,CAAC,CAAC;QAC9F,aAAa,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;KAClD,CAAC;IACF,cAAc,EAAE,CACd,IAAY,EACZ,OAAe,EACf,OAAqC,EACrC,MAAc,EACV,EAAE,CAAC,CAAC;QACR,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE;KACnD,CAAC;IACF,WAAW,EAAE,CAAC,MAAc,EAAE,SAAiB,EAAE,MAAc,EAAM,EAAE,CAAC,CAAC;QACvE,WAAW,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;KAC3C,CAAC;CACH,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,CAAC;QACH,6BAA6B;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE;YAC1C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;gBACxB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,IAAI;aACX,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,CAAC;QACH,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/D,OAAO;YACL,MAAM,EAAE,MAAM;YACd,YAAY,EAAE,YAAY;YAC1B,KAAK,EAAE;gBACL,WAAW,EAAE,KAAK,CAAC,YAAY;gBAC/B,UAAU,EAAE,KAAK,CAAC,WAAW;gBAC7B,UAAU,EAAE,KAAK,CAAC,WAAW;gBAC7B,SAAS,EAAE,KAAK,CAAC,UAAU;gBAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB;YACD,KAAK,EAAE;gBACL,WAAW,EAAE,KAAK,CAAC,YAAY;gBAC/B,UAAU,EAAE,KAAK,CAAC,WAAW;gBAC7B,UAAU,EAAE,KAAK,CAAC,WAAW;gBAC7B,SAAS,EAAE,KAAK,CAAC,UAAU;gBAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ export { tx, type ClarityEvent, type ParsedTransactionResult, type DeployContractOptions, type Tx, type TransferSTX, } from "../../common/src/sdkProxyHelpers.js";
2
+ import { Simnet } from "./sdkProxy.js";
3
+ export { type Simnet } from "./sdkProxy.js";
4
+ type Options = {
5
+ trackCosts: boolean;
6
+ trackCoverage: boolean;
7
+ trackPerformance?: boolean;
8
+ };
9
+ export declare function getSDK(options?: Options): Promise<Simnet>;
10
+ export declare const initSimnet: (manifestPath?: string, noCache?: boolean, options?: {
11
+ trackCosts: boolean;
12
+ trackCoverage: boolean;
13
+ trackPerformance?: boolean;
14
+ performanceCostField?: string;
15
+ }) => Promise<Simnet>;
@@ -0,0 +1,30 @@
1
+ import { SDKOptions } from "@stacks/clarinet-sdk-wasm";
2
+ export { tx, } from "../../common/src/sdkProxyHelpers.js";
3
+ import { vfs } from "./vfs.js";
4
+ import { getSessionProxy } from "./sdkProxy.js";
5
+ const wasmModule = import("@stacks/clarinet-sdk-wasm");
6
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#use_within_json
7
+ // @ts-ignore
8
+ BigInt.prototype.toJSON = function () {
9
+ return this.toString();
10
+ };
11
+ export async function getSDK(options) {
12
+ const module = await wasmModule;
13
+ let sdkOptions = new SDKOptions(!!options?.trackCosts, !!options?.trackCoverage, !!options?.trackPerformance);
14
+ const simnet = new Proxy(new module.SDK(vfs, sdkOptions), getSessionProxy());
15
+ return simnet;
16
+ }
17
+ // load wasm only once and memoize it
18
+ function memoizedInit() {
19
+ let simnet = null;
20
+ return async (manifestPath = "./Clarinet.toml", noCache = false, options) => {
21
+ if (noCache || !simnet) {
22
+ simnet = await getSDK(options);
23
+ }
24
+ // start a new simnet session
25
+ await simnet.initSession(process.cwd(), manifestPath);
26
+ return simnet;
27
+ };
28
+ }
29
+ export const initSimnet = memoizedInit();
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EACL,EAAE,GAMH,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAU,eAAe,EAAE,MAAM,eAAe,CAAC;AAIxD,MAAM,UAAU,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAEvD,0GAA0G;AAC1G,aAAa;AACb,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG;IACxB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;AACzB,CAAC,CAAC;AAQF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAiB;IAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC;IAChC,IAAI,UAAU,GAAG,IAAI,UAAU,CAC7B,CAAC,CAAC,OAAO,EAAE,UAAU,EACrB,CAAC,CAAC,OAAO,EAAE,aAAa,EACxB,CAAC,CAAC,OAAO,EAAE,gBAAgB,CAC5B,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,eAAe,EAAE,CAAsB,CAAC;IAClG,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,qCAAqC;AACrC,SAAS,YAAY;IACnB,IAAI,MAAM,GAAkB,IAAI,CAAC;IAEjC,OAAO,KAAK,EACV,YAAY,GAAG,iBAAiB,EAChC,OAAO,GAAG,KAAK,EACf,OAKC,EACD,EAAE;QACF,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAED,6BAA6B;QAC7B,MAAM,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type SDK } from "@stacks/clarinet-sdk-wasm";
2
+ import { type CallFn, type DeployContract, type GetDataVar, type GetMapEntry, type MineBlock, type Execute, type TransferSTX } from "../../common/src/sdkProxyHelpers.js";
3
+ /** @deprecated use `simnet.execute(command)` instead */
4
+ type RunSnippet = SDK["runSnippet"];
5
+ export type Simnet = {
6
+ [K in keyof SDK]: K extends "callReadOnlyFn" | "callPublicFn" | "callPrivateFn" ? CallFn : K extends "execute" ? Execute : K extends "runSnippet" ? RunSnippet : K extends "deployContract" ? DeployContract : K extends "transferSTX" ? TransferSTX : K extends "mineBlock" ? MineBlock : K extends "getDataVar" ? GetDataVar : K extends "getMapEntry" ? GetMapEntry : SDK[K];
7
+ };
8
+ export declare function getSessionProxy(): {
9
+ get(session: SDK, prop: keyof SDK, receiver: any): string | number | CallFn | DeployContract | TransferSTX | MineBlock | GetMapEntry | ((cwd: string, manifest_path: string) => Promise<void>) | ((epoch: import("@stacks/clarinet-sdk-wasm").EpochString) => void) | ((count?: number | null) => number) | ((addresses: string[]) => void) | ((recipient: string, amount: bigint) => string) | ((include_boot_contracts: boolean, boot_contracts_path: string) => import("@stacks/clarinet-sdk-wasm").SessionReport);
10
+ };
11
+ export {};
@@ -0,0 +1,95 @@
1
+ import { Cl, serializeCVBytes } from "@stacks/transactions";
2
+ import { CallFnArgs, DeployContractArgs, TransferSTXArgs, ContractOptions, } from "@stacks/clarinet-sdk-wasm";
3
+ import { parseEvents, parseCosts, } from "../../common/src/sdkProxyHelpers.js";
4
+ function parseTxResponse(response) {
5
+ return {
6
+ result: Cl.deserialize(response.result),
7
+ events: parseEvents(response.events),
8
+ costs: parseCosts(response.costs),
9
+ performance: response.performance,
10
+ };
11
+ }
12
+ export function getSessionProxy() {
13
+ return {
14
+ get(session, prop, receiver) {
15
+ // some of the WASM methods are proxied here to:
16
+ // - serialize clarity values input argument
17
+ // - deserialize output into clarity values
18
+ if (prop === "callReadOnlyFn" || prop === "callPublicFn" || prop === "callPrivateFn") {
19
+ const callFn = (contract, method, args, sender) => {
20
+ const response = session[prop](new CallFnArgs(contract, method, args.map(serializeCVBytes), sender));
21
+ return parseTxResponse(response);
22
+ };
23
+ return callFn;
24
+ }
25
+ if (prop === "execute") {
26
+ const execute = (snippet) => {
27
+ const response = session.execute(snippet);
28
+ return parseTxResponse(response);
29
+ };
30
+ return execute;
31
+ }
32
+ if (prop === "deployContract") {
33
+ const callDeployContract = (name, content, options, sender) => {
34
+ const rustOptions = options
35
+ ? new ContractOptions(options.clarityVersion)
36
+ : new ContractOptions();
37
+ const response = session.deployContract(new DeployContractArgs(name, content, rustOptions, sender));
38
+ return parseTxResponse(response);
39
+ };
40
+ return callDeployContract;
41
+ }
42
+ if (prop === "transferSTX") {
43
+ const callTransferSTX = (amount, ...args) => {
44
+ const response = session.transferSTX(new TransferSTXArgs(BigInt(amount), ...args));
45
+ return parseTxResponse(response);
46
+ };
47
+ return callTransferSTX;
48
+ }
49
+ if (prop === "mineBlock") {
50
+ const callMineBlock = (txs) => {
51
+ const serializedTxs = txs.map((tx) => {
52
+ if (tx.callPublicFn) {
53
+ return {
54
+ callPublicFn: {
55
+ ...tx.callPublicFn,
56
+ args_maps: tx.callPublicFn.args.map(serializeCVBytes),
57
+ },
58
+ };
59
+ }
60
+ if (tx.callPrivateFn) {
61
+ return {
62
+ callPrivateFn: {
63
+ ...tx.callPrivateFn,
64
+ args_maps: tx.callPrivateFn.args.map(serializeCVBytes),
65
+ },
66
+ };
67
+ }
68
+ return tx;
69
+ });
70
+ const responses = session.mineBlock(serializedTxs);
71
+ return responses.map(parseTxResponse);
72
+ };
73
+ return callMineBlock;
74
+ }
75
+ if (prop === "getDataVar") {
76
+ const getDataVar = (...args) => {
77
+ const response = session.getDataVar(...args);
78
+ const result = Cl.deserialize(response);
79
+ return result;
80
+ };
81
+ return getDataVar;
82
+ }
83
+ if (prop === "getMapEntry") {
84
+ const getMapEntry = (contract, mapName, mapKey) => {
85
+ const response = session.getMapEntry(contract, mapName, serializeCVBytes(mapKey));
86
+ const result = Cl.deserialize(response);
87
+ return result;
88
+ };
89
+ return getMapEntry;
90
+ }
91
+ return Reflect.get(session, prop, receiver);
92
+ },
93
+ };
94
+ }
95
+ //# sourceMappingURL=sdkProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkProxy.js","sourceRoot":"","sources":["../../../../src/sdkProxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function vfs(action: string, data: unknown): Promise<boolean> | Promise<string> | Promise<{
2
+ [k: string]: string;
3
+ }> | Promise<void>;
@@ -0,0 +1,70 @@
1
+ import * as fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ function fileArrayToString(bufferArray) {
4
+ return Array.from(bufferArray)
5
+ .map((item) => String.fromCharCode(item))
6
+ .join("");
7
+ }
8
+ function isValidReadEvent(e) {
9
+ return typeof e?.path === "string";
10
+ }
11
+ function isValidReadManyEvent(e) {
12
+ return Array.isArray(e?.paths) && e.paths.every((s) => typeof s === "string");
13
+ }
14
+ function isValidWriteEvent(e) {
15
+ return typeof e?.path === "string" && Array.isArray(e?.content);
16
+ }
17
+ async function exists(event) {
18
+ if (!isValidReadEvent(event))
19
+ throw new Error("invalid read event");
20
+ try {
21
+ await fs.stat(event.path);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ async function readFile(event) {
29
+ if (!isValidReadEvent(event))
30
+ throw new Error("invalid read event");
31
+ return fileArrayToString(await fs.readFile(event.path));
32
+ }
33
+ async function readFiles(event) {
34
+ if (!isValidReadManyEvent(event))
35
+ throw new Error("invalid read event");
36
+ const files = await Promise.all(event.paths.map(async (p) => {
37
+ try {
38
+ return fs.readFile(p);
39
+ }
40
+ catch (err) {
41
+ console.warn(err);
42
+ return null;
43
+ }
44
+ }));
45
+ return Object.fromEntries(files.reduce((acc, f, i) => {
46
+ if (f === null)
47
+ return acc;
48
+ return acc.concat([[event.paths[i], fileArrayToString(f)]]);
49
+ }, []));
50
+ }
51
+ async function writeFile(event) {
52
+ if (!isValidWriteEvent(event))
53
+ throw new Error("invalid write event");
54
+ const dir = path.dirname(event.path);
55
+ if (dir !== ".")
56
+ await fs.mkdir(dir, { recursive: true });
57
+ return fs.writeFile(event.path, Uint8Array.from(event.content));
58
+ }
59
+ export function vfs(action, data) {
60
+ if (action === "vfs/exists")
61
+ return exists(data);
62
+ if (action === "vfs/readFile")
63
+ return readFile(data);
64
+ if (action === "vfs/readFiles")
65
+ return readFiles(data);
66
+ if (action === "vfs/writeFile")
67
+ return writeFile(data);
68
+ throw new Error("invalid vfs action");
69
+ }
70
+ //# sourceMappingURL=vfs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vfs.js","sourceRoot":"","sources":["../../../../src/vfs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export declare function getClarinetVitestsArgv(): {
2
+ [x: string]: unknown;
3
+ "manifest-path": string;
4
+ manifestPath: string;
5
+ "init-before-each": boolean;
6
+ initBeforeEach: boolean;
7
+ coverage: boolean;
8
+ costs: boolean;
9
+ "coverage-filename": string;
10
+ coverageFilename: string;
11
+ "costs-filename": string;
12
+ costsFilename: string;
13
+ _: (string | number)[];
14
+ $0: string;
15
+ } | Promise<{
16
+ [x: string]: unknown;
17
+ "manifest-path": string;
18
+ manifestPath: string;
19
+ "init-before-each": boolean;
20
+ initBeforeEach: boolean;
21
+ coverage: boolean;
22
+ costs: boolean;
23
+ "coverage-filename": string;
24
+ coverageFilename: string;
25
+ "costs-filename": string;
26
+ costsFilename: string;
27
+ _: (string | number)[];
28
+ $0: string;
29
+ }>;
30
+ export declare const vitestHelpersPath: string;
31
+ export declare const vitestSetupFilePath: string;
@@ -0,0 +1,49 @@
1
+ import path from "node:path";
2
+ import url from "node:url";
3
+ import yargs from "yargs";
4
+ import { hideBin } from "yargs/helpers";
5
+ export function getClarinetVitestsArgv() {
6
+ const argv = hideBin(process.argv);
7
+ const topLevel = yargs(argv).argv;
8
+ // @ts-ignore
9
+ return yargs(topLevel._)
10
+ .option("manifest-path", {
11
+ alias: "manifest",
12
+ type: "string",
13
+ default: "./Clarinet.toml",
14
+ })
15
+ .option("init-before-each", {
16
+ description: "Reinitialize the Clarinet state before each test",
17
+ type: "boolean",
18
+ default: true,
19
+ })
20
+ .option("coverage", {
21
+ alias: "cov",
22
+ type: "boolean",
23
+ default: false,
24
+ })
25
+ .option("costs", {
26
+ alias: "cost",
27
+ type: "boolean",
28
+ default: false,
29
+ })
30
+ .option("coverage-filename", {
31
+ alias: "cov-file",
32
+ type: "string",
33
+ default: "lcov.info",
34
+ })
35
+ .option("costs-filename", {
36
+ alias: "costs-file",
37
+ type: "string",
38
+ default: "costs-reports.json",
39
+ }).argv;
40
+ }
41
+ // ensure vitest helpers can be imported even in workspace setup
42
+ // import.meta.resolve return an url like "file:///absolute/path/to/clarinet-sdk/dist/esm/index.js"
43
+ const sdkURL = import.meta.resolve("@stacks/clarinet-sdk");
44
+ const sdkPath = url.fileURLToPath(sdkURL);
45
+ const sdkDir = path.dirname(sdkPath);
46
+ // sdkDir is in /dist/esm/node/src, hence the ../../../../
47
+ export const vitestHelpersPath = path.join(sdkDir, "../../../../vitest-helpers/src/");
48
+ export const vitestSetupFilePath = path.join(vitestHelpersPath, "vitest.setup.ts");
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/vitest/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IAElC,aAAa;IACb,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;SACrB,MAAM,CAAC,eAAe,EAAE;QACvB,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,iBAAiB;KAC3B,CAAC;SACD,MAAM,CAAC,kBAAkB,EAAE;QAC1B,WAAW,EAAE,kDAAkD;QAC/D,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,IAAI;KACd,CAAC;SACD,MAAM,CAAC,UAAU,EAAE;QAClB,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;KACf,CAAC;SACD,MAAM,CAAC,OAAO,EAAE;QACf,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;KACf,CAAC;SACD,MAAM,CAAC,mBAAmB,EAAE;QAC3B,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,WAAW;KACrB,CAAC;SACD,MAAM,CAAC,gBAAgB,EAAE;QACxB,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,oBAAoB;KAC9B,CAAC,CAAC,IAAI,CAAC;AACZ,CAAC;AAED,gEAAgE;AAChE,mGAAmG;AACnG,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;AAC3D,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAErC,0DAA0D;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"root":["../../../src/index.ts","../../../src/sdkproxy.ts","../../../src/vfs.ts","../../../src/vitest/index.ts","../../../../common/src/sdkproxyhelpers.ts"],"version":"5.9.2"}
@@ -0,0 +1 @@
1
+ {"type": "module"}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "@stacks/clarinet-sdk",
3
+ "version": "3.8.1",
4
+ "description": "A SDK to interact with Clarity Smart Contracts in node.js",
5
+ "homepage": "https://stackslabs.com/clarinet",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/stx-labs/clarinet.git"
9
+ },
10
+ "engines": {
11
+ "node": ">=18.0.0"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "vitest-helpers/src"
16
+ ],
17
+ "main": "./dist/cjs/node/src/index.js",
18
+ "module": "./dist/esm/node/src/index.js",
19
+ "types": "./dist/esm/node/src/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "import": {
23
+ "types": "./dist/esm/node/src/index.d.ts",
24
+ "default": "./dist/esm/node/src/index.js"
25
+ },
26
+ "require": {
27
+ "types": "./dist/cjs/node/src/index.d.ts",
28
+ "default": "./dist/cjs/node/src/index.js"
29
+ }
30
+ },
31
+ "./vitest": {
32
+ "import": {
33
+ "types": "./dist/esm/node/src/vitest/index.d.ts",
34
+ "default": "./dist/esm/node/src/vitest/index.js"
35
+ },
36
+ "require": {
37
+ "types": "./dist/cjs/node/src/vitest/index.d.ts",
38
+ "default": "./dist/cjs/node/src/vitest/index.js"
39
+ }
40
+ }
41
+ },
42
+ "scripts": {
43
+ "clean": "rimraf dist",
44
+ "compile": "tsc -b ./tsconfig.json ./tsconfig.cjs.json",
45
+ "build": "npm run clean && npm run compile && node ./scripts/prepare-esm-package.js",
46
+ "prepare": "npm run build",
47
+ "pretest": "tsc -b ./tsconfig.json",
48
+ "test": "vitest run",
49
+ "test:no-mxs": "vitest run --exclude=tests/remote-data.test.ts"
50
+ },
51
+ "keywords": [
52
+ "stacks",
53
+ "clarity",
54
+ "clarinet",
55
+ "tests"
56
+ ],
57
+ "author": "stacks-labs",
58
+ "license": "GPL-3.0",
59
+ "readme": "./README.md",
60
+ "dependencies": {
61
+ "@stacks/clarinet-sdk-wasm": "3.8.1",
62
+ "@stacks/transactions": "^7.0.6",
63
+ "kolorist": "^1.8.0",
64
+ "prompts": "^2.4.2",
65
+ "yargs": "^18.0.0"
66
+ },
67
+ "devDependencies": {
68
+ "@stacks/encryption": "^7.0.0",
69
+ "@stacks/network": "^7.0.0",
70
+ "@stacks/stacking": "^7.0.0",
71
+ "vitest": "^3.0.5"
72
+ }
73
+ }