@clarigen/test 1.0.0-next.13 → 1.0.0-next.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ResultAssets, CoreNodeEvent, Contracts, ContractCall, ClarityTypes, ContractCalls, ContractInstances } from '@clarigen/core';
1
+ import { ResultAssets, CoreNodeEvent, Contracts, ContractCall, Response, ContractCalls, ContractInstances } from '@clarigen/core';
2
2
  import { ClarityValue, ResponseCV } from 'micro-stacks/clarity';
3
3
  import { NativeClarityBinProvider } from '@clarigen/native-bin';
4
4
  import { StacksNetworkVersion } from 'micro-stacks/crypto';
@@ -33,12 +33,13 @@ interface ExecuteErr {
33
33
  stderr: string;
34
34
  }
35
35
  declare type ExecuteResult = ExecuteOk | ExecuteErr;
36
- declare const executeJson: ({ contractAddress, senderAddress, functionName, provider, args, }: {
36
+ declare const executeJson: ({ contractAddress, senderAddress, functionName, provider, args, coverageFolder, }: {
37
37
  contractAddress: string;
38
38
  senderAddress: string;
39
39
  provider: NativeClarityBinProvider;
40
40
  functionName: string;
41
41
  args?: string[] | undefined;
42
+ coverageFolder?: string | undefined;
42
43
  }) => Promise<ExecuteResult>;
43
44
  interface EvalOk {
44
45
  success: true;
@@ -48,11 +49,12 @@ interface EvalOk {
48
49
  interface Eval extends EvalOk {
49
50
  stderr: string;
50
51
  }
51
- declare const evalJson: ({ contractAddress, functionName, provider, args, }: {
52
+ declare const evalJson: ({ contractAddress, functionName, provider, args, coverageFolder, }: {
52
53
  contractAddress: string;
53
54
  functionName: string;
54
55
  provider: NativeClarityBinProvider;
55
56
  args?: string[] | undefined;
57
+ coverageFolder?: string | undefined;
56
58
  }) => Promise<Eval>;
57
59
  interface ClarinetAccount {
58
60
  balance: bigint;
@@ -101,11 +103,15 @@ declare function getBlockHeight(provider: Provider): Promise<bigint>;
101
103
  declare function mineBlocks(_blocks: IntegerType, provider: Provider): Promise<void>;
102
104
  declare function getStxBalance(provider: Provider, account: string): Promise<bigint>;
103
105
 
106
+ declare function setupCoverage(dir: string): Promise<string>;
107
+ declare function finishCoverage(provider: NativeClarityBinProvider, dir: string): Promise<void>;
108
+
104
109
  declare function makeRandomAddress(version?: StacksNetworkVersion): string;
105
110
 
106
111
  interface FromContractsOptions {
107
112
  accounts?: ClarinetAccounts;
108
113
  clarityBin?: NativeClarityBinProvider;
114
+ coverageFolder?: string;
109
115
  }
110
116
  interface FromContracts<T extends Contracts<any>> {
111
117
  deployed: ContractInstances<T>;
@@ -113,14 +119,15 @@ interface FromContracts<T extends Contracts<any>> {
113
119
  }
114
120
  declare class TestProvider {
115
121
  clarityBin: NativeClarityBinProvider;
122
+ coverageFolder?: string;
116
123
  constructor(clarityBin: NativeClarityBinProvider);
117
124
  static fromContracts<T extends Contracts<any>>(contracts: T, options?: FromContractsOptions): Promise<FromContracts<T>>;
118
125
  ro<T>(tx: ContractCall<T>): Promise<ReadOnlyResult<T>>;
119
126
  rov<T>(tx: ContractCall<T>): Promise<T>;
120
- roOk<Ok, Err>(tx: ContractCall<ClarityTypes.Response<Ok, Err>>): Promise<ReadOnlyResult<Ok>>;
121
- roErr<Ok, Err>(tx: ContractCall<ClarityTypes.Response<Ok, Err>>): Promise<ReadOnlyResult<Err>>;
122
- rovOk<Ok, Err>(tx: ContractCall<ClarityTypes.Response<Ok, Err>>): Promise<Ok>;
123
- rovErr<Ok, Err>(tx: ContractCall<ClarityTypes.Response<Ok, Err>>): Promise<Err>;
127
+ roOk<Ok, Err>(tx: ContractCall<Response<Ok, Err>>): Promise<ReadOnlyResult<Ok>>;
128
+ roErr<Ok, Err>(tx: ContractCall<Response<Ok, Err>>): Promise<ReadOnlyResult<Err>>;
129
+ rovOk<Ok, Err>(tx: ContractCall<Response<Ok, Err>>): Promise<Ok>;
130
+ rovErr<Ok, Err>(tx: ContractCall<Response<Ok, Err>>): Promise<Err>;
124
131
  tx<Ok, Err>(tx: ContractCalls.Public<Ok, Err>, senderAddress: string): Promise<PublicResult<Ok, Err>>;
125
132
  txOk<Ok, Err>(tx: ContractCalls.Public<Ok, Err>, senderAddress: string): Promise<PublicResultOk<Ok>>;
126
133
  txErr<Ok, Err>(tx: ContractCalls.Public<Ok, Err>, senderAddress: string): Promise<PublicResultErr<Err>>;
@@ -129,4 +136,4 @@ declare class TestProvider {
129
136
  mapGet<T extends ContractCalls.Map<any, Val>, Val>(map: T): Promise<Val | null>;
130
137
  }
131
138
 
132
- export { Allocation, PublicResultErr, PublicResultOk, ReadOnlyResult, TestProvider, createClarityBin, evalJson, executeJson, getBlockHeight, getStxBalance, makeRandomAddress, mineBlocks };
139
+ export { Allocation, PublicResultErr, PublicResultOk, ReadOnlyResult, TestProvider, createClarityBin, evalJson, executeJson, finishCoverage, getBlockHeight, getStxBalance, makeRandomAddress, mineBlocks, setupCoverage };
package/dist/index.js CHANGED
@@ -1,15 +1,17 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var H=Object.defineProperty,j=Object.defineProperties;var D=Object.getOwnPropertyDescriptors;var R=Object.getOwnPropertySymbols;var L=Object.prototype.hasOwnProperty,G=Object.prototype.propertyIsEnumerable;var T=(r,t,e)=>t in r?H(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e,c=(r,t)=>{for(var e in t||(t={}))L.call(t,e)&&T(r,e,t[e]);if(R)for(var e of R(t))G.call(t,e)&&T(r,e,t[e]);return r},l=(r,t)=>j(r,D(t));var _core = require('@clarigen/core');var _crypto = require('micro-stacks/crypto');var _transactions = require('micro-stacks/transactions');var _nativebin = require('@clarigen/native-bin');var _clarity = require('micro-stacks/clarity');var v=async({contractAddress:r,senderAddress:t,functionName:e,provider:n,args:s=[]})=>{let i=await n.runCommand(["execute","--costs","--assets",n.dbFilePath,r,e,t,...s]);process.env.PRINT_CLARIGEN_STDERR&&i.stderr&&console.log(i.stderr);let o=JSON.parse(i.stdout);if(o&&"error"in o)throw new Error(`Transaction error: ${JSON.stringify(o.error,null,2)}`);if(i.exitCode!==0)throw new Error(`Execution error: ${i.stderr}`);return l(c({},o),{stderr:i.stderr})},y=async({contractAddress:r,code:t,provider:e})=>{let n=await e.runCommand(["eval_at_chaintip","--costs",r,e.dbFilePath],{stdin:t});process.env.PRINT_CLARIGEN_STDERR&&n.stderr&&console.log(n.stderr);let s=JSON.parse(n.stdout);if(!s.success)throw new Error(JSON.stringify(s.error,null,2));return l(c({},s),{stderr:n.stderr})},d= exports.evalJson =({contractAddress:r,functionName:t,provider:e,args:n=[]})=>{let s=`(${t} ${n.join(" ")})`;return y({contractAddress:r,provider:e,code:s})};function tt(r){return r?"deployer"in r?Object.values(r).map(t=>({amount:t.balance,principal:t.address})):Array.isArray(r)?r:[]:[]}function rt(r,t){return typeof t=="bigint"?`${t}n`:t}function et(r){return JSON.stringify(r,rt).replace(/"(-?\d+)n"/g,(e,n)=>n)}var f=async({allocations:r,testnet:t=!0}={})=>{let e=_nativebin.getDefaultBinaryFilePath.call(void 0, ),n=_nativebin.getTempFilePath.call(void 0, ),s=tt(r),i=new (0, _nativebin.NativeClarityBinProvider)(n,e),o=["initialize","-",n];return t&&o.push("--testnet"),await i.runCommand(o,{stdin:et(s)}),i};async function m({contractIdentifier:r,contractFilePath:t,provider:e}){let n=await e.runCommand(["launch",r,t,e.dbFilePath,"--costs","--assets"]);if(_nativebin.hasStdErr.call(void 0, n.stderr))throw new Error(`Error on ${t}:
2
- ${n.stderr}
3
- `);let s=JSON.parse(n.stdout);if(s.error){let{initialization:i}=s.error;if(i!=null&&i.includes(`
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var L=Object.defineProperty,D=Object.defineProperties;var M=Object.getOwnPropertyDescriptors;var O=Object.getOwnPropertySymbols;var U=Object.prototype.hasOwnProperty,W=Object.prototype.propertyIsEnumerable;var T=(t,r,e)=>r in t?L(t,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[r]=e,l=(t,r)=>{for(var e in r||(r={}))U.call(r,e)&&T(t,e,r[e]);if(O)for(var e of O(r))W.call(r,e)&&T(t,e,r[e]);return t},u=(t,r)=>D(t,M(r));var _core = require('@clarigen/core');var _crypto = require('micro-stacks/crypto');var _transactions = require('micro-stacks/transactions');var _nativebin = require('@clarigen/native-bin');var _clarity = require('micro-stacks/clarity');function f(t){return t?["--c",t]:[]}var g=async({contractAddress:t,senderAddress:r,functionName:e,provider:n,args:o=[],coverageFolder:s})=>{let i=await n.runCommand(["execute","--costs","--assets",...f(s),n.dbFilePath,t,e,r,...o]);process.env.PRINT_CLARIGEN_STDERR&&i.stderr&&console.log(i.stderr);try{let a=JSON.parse(i.stdout);if(a&&"error"in a)throw new Error(`Transaction error: ${JSON.stringify(a.error,null,2)}`);if(i.exitCode!==0)throw new Error(`Execution error: ${i.stderr}`);return u(l({},a),{stderr:i.stderr})}catch (e2){throw new Error(`Error parsing clarity execution.
2
+ stdout: ${i.stdout}
3
+ stderr:${i.stderr}`)}},y=async({contractAddress:t,code:r,provider:e,coverageFolder:n})=>{let o=await e.runCommand(["eval_at_chaintip","--costs",...f(n),t,e.dbFilePath],{stdin:r});process.env.PRINT_CLARIGEN_STDERR&&o.stderr&&console.log(o.stderr);try{let s=JSON.parse(o.stdout);if(!s.success)throw new Error(JSON.stringify(s.error,null,2));return u(l({},s),{stderr:o.stderr})}catch(s){throw console.error("[@clarigen/test] Invalid JSON result from `clarity-cli`:",o.stdout),console.error("[@clarigen/test] stderr:",o.stderr),s}},p= exports.evalJson =({contractAddress:t,functionName:r,provider:e,args:n=[],coverageFolder:o})=>{let s=`(${r} ${n.join(" ")})`;return y({contractAddress:t,provider:e,code:s,coverageFolder:o})};function nr(t){return t?"deployer"in t?Object.values(t).map(r=>({amount:r.balance,principal:r.address})):Array.isArray(t)?t:[]:[]}function or(t,r){return typeof r=="bigint"?`${r}n`:r}function sr(t){return JSON.stringify(t,or).replace(/"(-?\d+)n"/g,(e,n)=>n)}var E=async({allocations:t,testnet:r=!0}={})=>{let e=_nativebin.getDefaultBinaryFilePath.call(void 0, ),n=_nativebin.getTempFilePath.call(void 0, ),o=nr(t),s=new (0, _nativebin.NativeClarityBinProvider)(n,e),i=["initialize","-",n];r&&i.push("--testnet");let a=await s.runCommand(i,{stdin:sr(o)});return s};async function C({contractIdentifier:t,contractFilePath:r,provider:e,coverageFolder:n}){let o=await e.runCommand(["launch",t,r,e.dbFilePath,"--costs","--assets",...f(n)]);if(_nativebin.hasStdErr.call(void 0, o.stderr))throw new Error(`Error on ${r}:
4
+ ${o.stderr}
5
+ `);let s=JSON.parse(o.stdout);if(s.error){let{initialization:i}=s.error;if(i!=null&&i.includes(`
4
6
  Near:
5
- `)){let[o,a]=i.split(`
7
+ `)){let[a,c]=i.split(`
6
8
  Near:
7
- `),p="",x=/start_line: (\d+),/.exec(a);throw x&&(p=x[1]),new Error(`Error on ${t}:
8
- ${o}
9
- ${p?`Near line ${p}`:""}
10
- Raw trace:
9
+ `),v="",k=/start_line: (\d+),/.exec(c);throw k&&(v=k[1]),new Error(`Error on ${r}:
11
10
  ${a}
12
- `)}throw new Error(`Error on ${t}:
11
+ ${v?`Near line ${v}`:""}
12
+ Raw trace:
13
+ ${c}
14
+ `)}throw new Error(`Error on ${r}:
13
15
  ${JSON.stringify(s.error,null,2)}
14
- `)}}function k(r){return _core.filterEvents.call(void 0, r,_core.CoreNodeEventType.ContractEvent).map(t=>{let e=t.contract_event.raw_value,n=_clarity.hexToCV.call(void 0, e);return _core.cvToValue.call(void 0, n)})}var _path = require('path');var _common = require('micro-stacks/common');var u="ST000000000000000000002AMW42H.clarigen-test-utils";async function N(r){let t=_path.join.call(void 0, __dirname,"..","..","contracts","test-utils.clar");__dirname.includes("dist")&&(t=_path.join.call(void 0, __dirname,"..","contracts","test-utils.clar")),await m({contractIdentifier:u,provider:r,contractFilePath:t})}function g(r){return"clarityBin"in r?r.clarityBin:r}async function st(r){let t=g(r),{output_serialized:e}=await d({contractAddress:u,functionName:"get-block-height",args:[],provider:t}),n=_clarity.hexToCV.call(void 0, e);return _core.cvToValue.call(void 0, n)}async function it(r){let t=g(r);await v({contractAddress:u,functionName:"mine-block",args:[],provider:t,senderAddress:"ST000000000000000000002AMW42H"})}async function ot(r,t){let e=_common.intToBigInt.call(void 0, r);for(let n=0;n<e;n++)await it(t)}async function at(r,t){let e=g(r),{output_serialized:n}=await d({contractAddress:u,functionName:"get-stx-balance",args:[`'${t}`],provider:e}),s=_clarity.hexToCV.call(void 0, n);return _core.cvToValue.call(void 0, s)}function pt(r=_crypto.StacksNetworkVersion.testnetP2PKH){let t=_transactions.makeRandomPrivKey.call(void 0, ),e=_transactions.getPublicKeyFromStacksPrivateKey.call(void 0, t);return _crypto.publicKeyToStxAddress.call(void 0, e.data,r)}function V(r){return r.map(t=>_core.cvToString.call(void 0, t))}function E(r){return`${r.contractAddress}.${r.contractName}`}function $(r){return r===""?[]:r.split(`
15
- `).map(t=>t.slice(62))}function S(r){let t=_clarity.hexToCV.call(void 0, r.output_serialized);return{value:_core.cvToValue.call(void 0, t,!0),clarityValue:t,logs:$(r.stderr),costs:r.costs}}async function I(r,t){let e=await d({functionName:r.function.name,args:V(r.functionArgs),contractAddress:E(r),provider:t});return S(e)}async function P({contractAddress:r,code:t,bin:e}){let n=await y({contractAddress:r,code:t,provider:e});return S(n)}async function J({tx:r,senderAddress:t,bin:e}){let n=await v({contractAddress:E(r),senderAddress:t,provider:e,functionName:r.function.name,args:V(r.functionArgs)}),s=_clarity.hexToCV.call(void 0, n.output_serialized),o={value:_core.cvToValue.call(void 0, s),logs:$(n.stderr),costs:n.costs};return n.success?l(c({},o),{isOk:!0,response:_clarity.responseOkCV.call(void 0, s),assets:n.assets,events:n.events,prints:k(n.events)}):l(c({},o),{isOk:!1,response:_clarity.responseErrorCV.call(void 0, s)})}async function F({map:r,bin:t}){let e=`(map-get? ${r.map.name} ${_core.cvToString.call(void 0, r.key)})`;return(await P({contractAddress:E(r),code:e,bin:t})).value}var z=class{constructor(t){this.clarityBin=t}static async fromContracts(t,e={}){let n=e.clarityBin||await f({allocations:e.accounts}),s={};await N(n);for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o)){let a=t[o],p=_core.getContractIdentifier.call(void 0, a);await m({contractIdentifier:p,contractFilePath:a.contractFile,provider:n});let b=a.contract(a.address,a.name);s[o]={identifier:_core.getContractIdentifier.call(void 0, a),contract:b}}let i=new this(n);return{deployed:s,provider:i}}ro(t){return I(t,this.clarityBin)}async rov(t){return(await this.ro(t)).value}async roOk(t){let e=await this.ro(t);return e.value.match(n=>l(c({},e),{value:n}),n=>{throw new Error(`Expected OK, received error: ${n}`)})}async roErr(t){let e=await this.ro(t);return e.value.match(n=>{throw new Error(`Expected err, received ok: ${n}`)},n=>l(c({},e),{value:n}))}async rovOk(t){return(await this.roOk(t)).value}async rovErr(t){return(await this.roErr(t)).value}tx(t,e){return J({tx:t,senderAddress:e,bin:this.clarityBin})}async txOk(t,e){let n=await this.tx(t,e);if(!n.isOk)throw new Error(`Expected OK, received error: ${n.value}`);return n}async txErr(t,e){let n=await this.tx(t,e);if(n.isOk)throw new Error(`Expected Err, received ok: ${n.value}`);return n}evalCode(t,e=u){return P({contractAddress:e,code:t,bin:this.clarityBin})}async eval(t,e=u){return(await this.evalCode(t,e)).value}mapGet(t){return F({map:t,bin:this.clarityBin})}};exports.TestProvider = z; exports.createClarityBin = f; exports.evalJson = d; exports.executeJson = v; exports.getBlockHeight = st; exports.getStxBalance = at; exports.makeRandomAddress = pt; exports.mineBlocks = ot;
16
+ `)}}function w(t){return _core.filterEvents.call(void 0, t,_core.CoreNodeEventType.ContractEvent).map(r=>{let e=r.contract_event.raw_value,n=_clarity.hexToCV.call(void 0, e);return _core.cvToValue.call(void 0, n)})}var _path = require('path');var _common = require('micro-stacks/common');var d="ST000000000000000000002AMW42H.clarigen-test-utils";async function B(t){let r=_path.join.call(void 0, __dirname,"..","..","contracts","test-utils.clar");__dirname.includes("dist")&&(r=_path.join.call(void 0, __dirname,"..","contracts","test-utils.clar")),await C({contractIdentifier:d,provider:t,contractFilePath:r})}function P(t){return"clarityBin"in t?t.clarityBin:t}async function ar(t){let r=P(t),{output_serialized:e}=await p({contractAddress:d,functionName:"get-block-height",args:[],provider:r}),n=_clarity.hexToCV.call(void 0, e);return _core.cvToValue.call(void 0, n)}async function cr(t){let r=P(t);await g({contractAddress:d,functionName:"mine-block",args:[],provider:r,senderAddress:"ST000000000000000000002AMW42H"})}async function lr(t,r){let e=_common.intToBigInt.call(void 0, t);for(let n=0;n<e;n++)await cr(r)}async function ur(t,r){let e=P(t),{output_serialized:n}=await p({contractAddress:d,functionName:"get-stx-balance",args:[`'${r}`],provider:e}),o=_clarity.hexToCV.call(void 0, n);return _core.cvToValue.call(void 0, o)}var _promises = require('fs/promises');async function gr(t){let r=_path.resolve.call(void 0, process.cwd(),"coverage");try{await _promises.mkdir.call(void 0, r)}catch (e3){}let n=(await _promises.readdir.call(void 0, r)).map(o=>_promises.unlink.call(void 0, _path.join.call(void 0, r,o)));return await Promise.all(n),r}async function Cr(t,r){let e=_path.join.call(void 0, r,"clarigen.lcov");await t.runCommand(["make_lcov",r,e])}function br(t=_crypto.StacksNetworkVersion.testnetP2PKH){let r=_transactions.makeRandomPrivKey.call(void 0, ),e=_transactions.getPublicKeyFromStacksPrivateKey.call(void 0, r);return _crypto.publicKeyToStxAddress.call(void 0, e.data,t)}function I(t){return t.map(r=>_core.cvToString.call(void 0, r))}function b(t){return`${t.contractAddress}.${t.contractName}`}function S(t){return t===""?[]:t.split(`
17
+ `).map(r=>r.slice(62))}function J(t){let r=_clarity.hexToCV.call(void 0, t.output_serialized);return{value:_core.cvToValue.call(void 0, r,!0),clarityValue:r,logs:S(t.stderr),costs:t.costs}}async function z({tx:t,bin:r,coverageFolder:e}){let n=await p({functionName:t.function.name,args:I(t.functionArgs),contractAddress:b(t),provider:r,coverageFolder:e});return J(n)}async function x({contractAddress:t,code:r,bin:e,coverageFolder:n}){let o=await y({contractAddress:t,code:r,provider:e,coverageFolder:n});return J(o)}async function K({tx:t,senderAddress:r,bin:e,coverageFolder:n}){let o=await g({contractAddress:b(t),senderAddress:r,provider:e,functionName:t.function.name,args:I(t.functionArgs),coverageFolder:n}),s=_clarity.hexToCV.call(void 0, o.output_serialized),a={value:_core.cvToValue.call(void 0, s),logs:S(o.stderr),costs:o.costs};return o.success?u(l({},a),{isOk:!0,response:_clarity.responseOkCV.call(void 0, s),assets:o.assets,events:o.events,prints:w(o.events)}):u(l({},a),{isOk:!1,response:_clarity.responseErrorCV.call(void 0, s)})}async function j({map:t,bin:r}){let e=`(map-get? ${t.map.name} ${_core.cvToString.call(void 0, t.key)})`;return(await x({contractAddress:b(t),code:e,bin:r})).value}var H=class{constructor(r){this.clarityBin=r}static async fromContracts(r,e={}){let n=e.clarityBin||await E({allocations:e.accounts}),o={},s=e.coverageFolder;process.env.CLARIGEN_COVERAGE&&(s=_path.resolve.call(void 0, process.cwd(),"coverage")),await B(n);for(let a in r)if(Object.prototype.hasOwnProperty.call(r,a)){let c=r[a],v=_core.getContractIdentifier.call(void 0, c);await C({contractIdentifier:v,contractFilePath:c.contractFile,provider:n,coverageFolder:s});let R=c.contract(c.address,c.name);o[a]={identifier:_core.getContractIdentifier.call(void 0, c),contract:R}}let i=new this(n);return i.coverageFolder=s,{deployed:o,provider:i}}ro(r){return z({tx:r,bin:this.clarityBin,coverageFolder:this.coverageFolder})}async rov(r){return(await this.ro(r)).value}async roOk(r){let e=await this.ro(r),n=_core.expectOk.call(void 0, e.value);return u(l({},e),{value:n})}async roErr(r){let e=await this.ro(r),n=_core.expectErr.call(void 0, e.value);return u(l({},e),{value:n})}async rovOk(r){return(await this.roOk(r)).value}async rovErr(r){return(await this.roErr(r)).value}tx(r,e){return K({tx:r,senderAddress:e,bin:this.clarityBin,coverageFolder:this.coverageFolder})}async txOk(r,e){let n=await this.tx(r,e);if(!n.isOk)throw new Error(`Expected OK, received error: ${n.value}`);return n}async txErr(r,e){let n=await this.tx(r,e);if(n.isOk)throw new Error(`Expected Err, received ok: ${n.value}`);return n}evalCode(r,e=d){return x({contractAddress:e,code:r,bin:this.clarityBin,coverageFolder:this.coverageFolder})}async eval(r,e=d){return(await this.evalCode(r,e)).value}mapGet(r){return j({map:r,bin:this.clarityBin})}};exports.TestProvider = H; exports.createClarityBin = E; exports.evalJson = p; exports.executeJson = g; exports.finishCoverage = Cr; exports.getBlockHeight = ar; exports.getStxBalance = ur; exports.makeRandomAddress = br; exports.mineBlocks = lr; exports.setupCoverage = gr;
package/dist/index.mjs CHANGED
@@ -1,15 +1,17 @@
1
- var H=Object.defineProperty,L=Object.defineProperties;var j=Object.getOwnPropertyDescriptors;var T=Object.getOwnPropertySymbols;var G=Object.prototype.hasOwnProperty,U=Object.prototype.propertyIsEnumerable;var k=(r,t,e)=>t in r?H(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e,c=(r,t)=>{for(var e in t||(t={}))G.call(t,e)&&k(r,e,t[e]);if(T)for(var e of T(t))U.call(t,e)&&k(r,e,t[e]);return r},l=(r,t)=>L(r,j(t));import{fileURLToPath as M}from"url";import W from"path";var q=()=>M(import.meta.url),Q=()=>W.dirname(q()),u=Q();import{getContractIdentifier as z}from"@clarigen/core";import{publicKeyToStxAddress as mt,StacksNetworkVersion as vt}from"micro-stacks/crypto";import{getPublicKeyFromStacksPrivateKey as Ct,makeRandomPrivKey as yt}from"micro-stacks/transactions";import{getTempFilePath as X,NativeClarityBinProvider as Y,getDefaultBinaryFilePath as Z,hasStdErr as tt}from"@clarigen/native-bin";import{CoreNodeEventType as rt,cvToValue as et,filterEvents as nt}from"@clarigen/core";import{hexToCV as st}from"micro-stacks/clarity";var v=async({contractAddress:r,senderAddress:t,functionName:e,provider:n,args:s=[]})=>{let o=await n.runCommand(["execute","--costs","--assets",n.dbFilePath,r,e,t,...s]);process.env.PRINT_CLARIGEN_STDERR&&o.stderr&&console.log(o.stderr);let i=JSON.parse(o.stdout);if(i&&"error"in i)throw new Error(`Transaction error: ${JSON.stringify(i.error,null,2)}`);if(o.exitCode!==0)throw new Error(`Execution error: ${o.stderr}`);return l(c({},i),{stderr:o.stderr})},f=async({contractAddress:r,code:t,provider:e})=>{let n=await e.runCommand(["eval_at_chaintip","--costs",r,e.dbFilePath],{stdin:t});process.env.PRINT_CLARIGEN_STDERR&&n.stderr&&console.log(n.stderr);let s=JSON.parse(n.stdout);if(!s.success)throw new Error(JSON.stringify(s.error,null,2));return l(c({},s),{stderr:n.stderr})},p=({contractAddress:r,functionName:t,provider:e,args:n=[]})=>{let s=`(${t} ${n.join(" ")})`;return f({contractAddress:r,provider:e,code:s})};function ot(r){return r?"deployer"in r?Object.values(r).map(t=>({amount:t.balance,principal:t.address})):Array.isArray(r)?r:[]:[]}function it(r,t){return typeof t=="bigint"?`${t}n`:t}function at(r){return JSON.stringify(r,it).replace(/"(-?\d+)n"/g,(e,n)=>n)}var g=async({allocations:r,testnet:t=!0}={})=>{let e=Z(),n=X(),s=ot(r),o=new Y(n,e),i=["initialize","-",n];return t&&i.push("--testnet"),await o.runCommand(i,{stdin:at(s)}),o};async function y({contractIdentifier:r,contractFilePath:t,provider:e}){let n=await e.runCommand(["launch",r,t,e.dbFilePath,"--costs","--assets"]);if(tt(n.stderr))throw new Error(`Error on ${t}:
2
- ${n.stderr}
3
- `);let s=JSON.parse(n.stdout);if(s.error){let{initialization:o}=s.error;if(o!=null&&o.includes(`
1
+ var H=Object.defineProperty,U=Object.defineProperties;var M=Object.getOwnPropertyDescriptors;var T=Object.getOwnPropertySymbols;var W=Object.prototype.hasOwnProperty,q=Object.prototype.propertyIsEnumerable;var w=(t,r,e)=>r in t?H(t,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[r]=e,l=(t,r)=>{for(var e in r||(r={}))W.call(r,e)&&w(t,e,r[e]);if(T)for(var e of T(r))q.call(r,e)&&w(t,e,r[e]);return t},u=(t,r)=>U(t,M(r));import{fileURLToPath as Q}from"url";import X from"path";var Y=()=>Q(import.meta.url),Z=()=>X.dirname(Y()),d=Z();import{getContractIdentifier as D,expectOk as Nr,expectErr as Ar}from"@clarigen/core";import{publicKeyToStxAddress as br,StacksNetworkVersion as Rr}from"micro-stacks/crypto";import{getPublicKeyFromStacksPrivateKey as kr,makeRandomPrivKey as Or}from"micro-stacks/transactions";import{getTempFilePath as rr,NativeClarityBinProvider as tr,getDefaultBinaryFilePath as er,hasStdErr as nr}from"@clarigen/native-bin";import{CoreNodeEventType as or,cvToValue as sr,filterEvents as ir}from"@clarigen/core";import{hexToCV as ar}from"micro-stacks/clarity";function y(t){return t?["--c",t]:[]}var f=async({contractAddress:t,senderAddress:r,functionName:e,provider:n,args:o=[],coverageFolder:s})=>{let i=await n.runCommand(["execute","--costs","--assets",...y(s),n.dbFilePath,t,e,r,...o]);process.env.PRINT_CLARIGEN_STDERR&&i.stderr&&console.log(i.stderr);try{let a=JSON.parse(i.stdout);if(a&&"error"in a)throw new Error(`Transaction error: ${JSON.stringify(a.error,null,2)}`);if(i.exitCode!==0)throw new Error(`Execution error: ${i.stderr}`);return u(l({},a),{stderr:i.stderr})}catch{throw new Error(`Error parsing clarity execution.
2
+ stdout: ${i.stdout}
3
+ stderr:${i.stderr}`)}},E=async({contractAddress:t,code:r,provider:e,coverageFolder:n})=>{let o=await e.runCommand(["eval_at_chaintip","--costs",...y(n),t,e.dbFilePath],{stdin:r});process.env.PRINT_CLARIGEN_STDERR&&o.stderr&&console.log(o.stderr);try{let s=JSON.parse(o.stdout);if(!s.success)throw new Error(JSON.stringify(s.error,null,2));return u(l({},s),{stderr:o.stderr})}catch(s){throw console.error("[@clarigen/test] Invalid JSON result from `clarity-cli`:",o.stdout),console.error("[@clarigen/test] stderr:",o.stderr),s}},v=({contractAddress:t,functionName:r,provider:e,args:n=[],coverageFolder:o})=>{let s=`(${r} ${n.join(" ")})`;return E({contractAddress:t,provider:e,code:s,coverageFolder:o})};function cr(t){return t?"deployer"in t?Object.values(t).map(r=>({amount:r.balance,principal:r.address})):Array.isArray(t)?t:[]:[]}function lr(t,r){return typeof r=="bigint"?`${r}n`:r}function ur(t){return JSON.stringify(t,lr).replace(/"(-?\d+)n"/g,(e,n)=>n)}var P=async({allocations:t,testnet:r=!0}={})=>{let e=er(),n=rr(),o=cr(t),s=new tr(n,e),i=["initialize","-",n];r&&i.push("--testnet");let a=await s.runCommand(i,{stdin:ur(o)});return s};async function C({contractIdentifier:t,contractFilePath:r,provider:e,coverageFolder:n}){let o=await e.runCommand(["launch",t,r,e.dbFilePath,"--costs","--assets",...y(n)]);if(nr(o.stderr))throw new Error(`Error on ${r}:
4
+ ${o.stderr}
5
+ `);let s=JSON.parse(o.stdout);if(s.error){let{initialization:i}=s.error;if(i!=null&&i.includes(`
4
6
  Near:
5
- `)){let[i,a]=o.split(`
7
+ `)){let[a,c]=i.split(`
6
8
  Near:
7
- `),m="",R=/start_line: (\d+),/.exec(a);throw R&&(m=R[1]),new Error(`Error on ${t}:
8
- ${i}
9
+ `),m="",O=/start_line: (\d+),/.exec(c);throw O&&(m=O[1]),new Error(`Error on ${r}:
10
+ ${a}
9
11
  ${m?`Near line ${m}`:""}
10
12
  Raw trace:
11
- ${a}
12
- `)}throw new Error(`Error on ${t}:
13
+ ${c}
14
+ `)}throw new Error(`Error on ${r}:
13
15
  ${JSON.stringify(s.error,null,2)}
14
- `)}}function O(r){return nt(r,rt.ContractEvent).map(t=>{let e=t.contract_event.raw_value,n=st(e);return et(n)})}import{hexToCV as h}from"micro-stacks/clarity";import{join as w}from"path";import{cvToValue as N}from"@clarigen/core";import{intToBigInt as ct}from"micro-stacks/common";var d="ST000000000000000000002AMW42H.clarigen-test-utils";async function A(r){let t=w(u,"..","..","contracts","test-utils.clar");u.includes("dist")&&(t=w(u,"..","contracts","test-utils.clar")),await y({contractIdentifier:d,provider:r,contractFilePath:t})}function E(r){return"clarityBin"in r?r.clarityBin:r}async function lt(r){let t=E(r),{output_serialized:e}=await p({contractAddress:d,functionName:"get-block-height",args:[],provider:t}),n=h(e);return N(n)}async function ut(r){let t=E(r);await v({contractAddress:d,functionName:"mine-block",args:[],provider:t,senderAddress:"ST000000000000000000002AMW42H"})}async function dt(r,t){let e=ct(r);for(let n=0;n<e;n++)await ut(t)}async function pt(r,t){let e=E(r),{output_serialized:n}=await p({contractAddress:d,functionName:"get-stx-balance",args:[`'${t}`],provider:e}),s=h(n);return N(s)}function ft(r=vt.testnetP2PKH){let t=yt(),e=Ct(t);return mt(e.data,r)}import{cvToString as B,cvToValue as _}from"@clarigen/core";import{hexToCV as V,responseErrorCV as gt,responseOkCV as Et}from"micro-stacks/clarity";function $(r){return r.map(t=>B(t))}function P(r){return`${r.contractAddress}.${r.contractName}`}function S(r){return r===""?[]:r.split(`
15
- `).map(t=>t.slice(62))}function I(r){let t=V(r.output_serialized);return{value:_(t,!0),clarityValue:t,logs:S(r.stderr),costs:r.costs}}async function J(r,t){let e=await p({functionName:r.function.name,args:$(r.functionArgs),contractAddress:P(r),provider:t});return I(e)}async function b({contractAddress:r,code:t,bin:e}){let n=await f({contractAddress:r,code:t,provider:e});return I(n)}async function F({tx:r,senderAddress:t,bin:e}){let n=await v({contractAddress:P(r),senderAddress:t,provider:e,functionName:r.function.name,args:$(r.functionArgs)}),s=V(n.output_serialized),i={value:_(s),logs:S(n.stderr),costs:n.costs};return n.success?l(c({},i),{isOk:!0,response:Et(s),assets:n.assets,events:n.events,prints:O(n.events)}):l(c({},i),{isOk:!1,response:gt(s)})}async function K({map:r,bin:t}){let e=`(map-get? ${r.map.name} ${B(r.key)})`;return(await b({contractAddress:P(r),code:e,bin:t})).value}var D=class{constructor(t){this.clarityBin=t}static async fromContracts(t,e={}){let n=e.clarityBin||await g({allocations:e.accounts}),s={};await A(n);for(let i in t)if(Object.prototype.hasOwnProperty.call(t,i)){let a=t[i],m=z(a);await y({contractIdentifier:m,contractFilePath:a.contractFile,provider:n});let x=a.contract(a.address,a.name);s[i]={identifier:z(a),contract:x}}let o=new this(n);return{deployed:s,provider:o}}ro(t){return J(t,this.clarityBin)}async rov(t){return(await this.ro(t)).value}async roOk(t){let e=await this.ro(t);return e.value.match(n=>l(c({},e),{value:n}),n=>{throw new Error(`Expected OK, received error: ${n}`)})}async roErr(t){let e=await this.ro(t);return e.value.match(n=>{throw new Error(`Expected err, received ok: ${n}`)},n=>l(c({},e),{value:n}))}async rovOk(t){return(await this.roOk(t)).value}async rovErr(t){return(await this.roErr(t)).value}tx(t,e){return F({tx:t,senderAddress:e,bin:this.clarityBin})}async txOk(t,e){let n=await this.tx(t,e);if(!n.isOk)throw new Error(`Expected OK, received error: ${n.value}`);return n}async txErr(t,e){let n=await this.tx(t,e);if(n.isOk)throw new Error(`Expected Err, received ok: ${n.value}`);return n}evalCode(t,e=d){return b({contractAddress:e,code:t,bin:this.clarityBin})}async eval(t,e=d){return(await this.evalCode(t,e)).value}mapGet(t){return K({map:t,bin:this.clarityBin})}};export{D as TestProvider,g as createClarityBin,p as evalJson,v as executeJson,lt as getBlockHeight,pt as getStxBalance,ft as makeRandomAddress,dt as mineBlocks};
16
+ `)}}function h(t){return ir(t,or.ContractEvent).map(r=>{let e=r.contract_event.raw_value,n=ar(e);return sr(n)})}import{hexToCV as A}from"micro-stacks/clarity";import{join as N}from"path";import{cvToValue as B}from"@clarigen/core";import{intToBigInt as dr}from"micro-stacks/common";var p="ST000000000000000000002AMW42H.clarigen-test-utils";async function F(t){let r=N(d,"..","..","contracts","test-utils.clar");d.includes("dist")&&(r=N(d,"..","contracts","test-utils.clar")),await C({contractIdentifier:p,provider:t,contractFilePath:r})}function x(t){return"clarityBin"in t?t.clarityBin:t}async function pr(t){let r=x(t),{output_serialized:e}=await v({contractAddress:p,functionName:"get-block-height",args:[],provider:r}),n=A(e);return B(n)}async function vr(t){let r=x(t);await f({contractAddress:p,functionName:"mine-block",args:[],provider:r,senderAddress:"ST000000000000000000002AMW42H"})}async function mr(t,r){let e=dr(t);for(let n=0;n<e;n++)await vr(r)}async function gr(t,r){let e=x(t),{output_serialized:n}=await v({contractAddress:p,functionName:"get-stx-balance",args:[`'${r}`],provider:e}),o=A(n);return B(o)}import{mkdir as fr,readdir as Cr,unlink as yr}from"fs/promises";import{join as _,resolve as Er}from"path";async function Pr(t){let r=Er(process.cwd(),"coverage");try{await fr(r)}catch{}let n=(await Cr(r)).map(o=>yr(_(r,o)));return await Promise.all(n),r}async function xr(t,r){let e=_(r,"clarigen.lcov");await t.runCommand(["make_lcov",r,e])}function Tr(t=Rr.testnetP2PKH){let r=Or(),e=kr(r);return br(e.data,t)}import{cvToString as V,cvToValue as $}from"@clarigen/core";import{hexToCV as I,responseErrorCV as wr,responseOkCV as hr}from"micro-stacks/clarity";function S(t){return t.map(r=>V(r))}function b(t){return`${t.contractAddress}.${t.contractName}`}function J(t){return t===""?[]:t.split(`
17
+ `).map(r=>r.slice(62))}function z(t){let r=I(t.output_serialized);return{value:$(r,!0),clarityValue:r,logs:J(t.stderr),costs:t.costs}}async function K({tx:t,bin:r,coverageFolder:e}){let n=await v({functionName:t.function.name,args:S(t.functionArgs),contractAddress:b(t),provider:r,coverageFolder:e});return z(n)}async function R({contractAddress:t,code:r,bin:e,coverageFolder:n}){let o=await E({contractAddress:t,code:r,provider:e,coverageFolder:n});return z(o)}async function L({tx:t,senderAddress:r,bin:e,coverageFolder:n}){let o=await f({contractAddress:b(t),senderAddress:r,provider:e,functionName:t.function.name,args:S(t.functionArgs),coverageFolder:n}),s=I(o.output_serialized),a={value:$(s),logs:J(o.stderr),costs:o.costs};return o.success?u(l({},a),{isOk:!0,response:hr(s),assets:o.assets,events:o.events,prints:h(o.events)}):u(l({},a),{isOk:!1,response:wr(s)})}async function j({map:t,bin:r}){let e=`(map-get? ${t.map.name} ${V(t.key)})`;return(await R({contractAddress:b(t),code:e,bin:r})).value}import{resolve as Br}from"path";var G=class{constructor(r){this.clarityBin=r}static async fromContracts(r,e={}){let n=e.clarityBin||await P({allocations:e.accounts}),o={},s=e.coverageFolder;process.env.CLARIGEN_COVERAGE&&(s=Br(process.cwd(),"coverage")),await F(n);for(let a in r)if(Object.prototype.hasOwnProperty.call(r,a)){let c=r[a],m=D(c);await C({contractIdentifier:m,contractFilePath:c.contractFile,provider:n,coverageFolder:s});let k=c.contract(c.address,c.name);o[a]={identifier:D(c),contract:k}}let i=new this(n);return i.coverageFolder=s,{deployed:o,provider:i}}ro(r){return K({tx:r,bin:this.clarityBin,coverageFolder:this.coverageFolder})}async rov(r){return(await this.ro(r)).value}async roOk(r){let e=await this.ro(r),n=Nr(e.value);return u(l({},e),{value:n})}async roErr(r){let e=await this.ro(r),n=Ar(e.value);return u(l({},e),{value:n})}async rovOk(r){return(await this.roOk(r)).value}async rovErr(r){return(await this.roErr(r)).value}tx(r,e){return L({tx:r,senderAddress:e,bin:this.clarityBin,coverageFolder:this.coverageFolder})}async txOk(r,e){let n=await this.tx(r,e);if(!n.isOk)throw new Error(`Expected OK, received error: ${n.value}`);return n}async txErr(r,e){let n=await this.tx(r,e);if(n.isOk)throw new Error(`Expected Err, received ok: ${n.value}`);return n}evalCode(r,e=p){return R({contractAddress:e,code:r,bin:this.clarityBin,coverageFolder:this.coverageFolder})}async eval(r,e=p){return(await this.evalCode(r,e)).value}mapGet(r){return j({map:r,bin:this.clarityBin})}};export{G as TestProvider,P as createClarityBin,v as evalJson,f as executeJson,xr as finishCoverage,pr as getBlockHeight,gr as getStxBalance,Tr as makeRandomAddress,mr as mineBlocks,Pr as setupCoverage};
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.0-next.13",
2
+ "version": "1.0.0-next.16",
3
3
  "license": "MIT",
4
4
  "types": "./dist/index.d.ts",
5
5
  "main": "./dist/index.js",
@@ -20,18 +20,19 @@
20
20
  "lint": "eslint \"src/**/*.{ts,tsx}\" && prettier --check src/**/*.ts",
21
21
  "prepublishOnly": "yarn build",
22
22
  "typecheck": "tsc --noEmit",
23
- "build-test-types": "cd test && yarn clarigen && cd .."
23
+ "build-test-types": "cd test && yarn clarigen && cd ..",
24
+ "publish:dev": "yalc publish --push"
24
25
  },
25
26
  "prettier": "@stacks/prettier-config",
26
27
  "name": "@clarigen/test",
27
28
  "author": "Hank Stoever",
28
29
  "dependencies": {
29
- "@clarigen/core": "1.0.0-next.11",
30
- "@clarigen/native-bin": "1.0.0-next.12",
30
+ "@clarigen/core": "1.0.0-next.16",
31
+ "@clarigen/native-bin": "1.0.0-next.16",
31
32
  "micro-stacks": "^0.2.0"
32
33
  },
33
34
  "publishConfig": {
34
35
  "access": "public"
35
36
  },
36
- "gitHead": "9b21b2e4e5f684bd0a862a3fb35a3661951a33fb"
37
+ "gitHead": "cc40e90b2dc188debd134f25fe05b1ef5eb14ff2"
37
38
  }