@clarigen/cli 1.0.0-next.15 → 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.
@@ -1,10 +1,10 @@
1
- var E=Object.defineProperty,gt=Object.defineProperties,ut=Object.getOwnPropertyDescriptor,mt=Object.getOwnPropertyDescriptors,Ct=Object.getOwnPropertyNames,T=Object.getOwnPropertySymbols;var _=Object.prototype.hasOwnProperty,W=Object.prototype.propertyIsEnumerable;var U=(t,r,n)=>r in t?E(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n,h=(t,r)=>{for(var n in r||(r={}))_.call(r,n)&&U(t,n,r[n]);if(T)for(var n of T(r))W.call(r,n)&&U(t,n,r[n]);return t},j=(t,r)=>gt(t,mt(r));var V=(t,r)=>{var n={};for(var e in t)_.call(t,e)&&r.indexOf(e)<0&&(n[e]=t[e]);if(t!=null&&T)for(var e of T(t))r.indexOf(e)<0&&W.call(t,e)&&(n[e]=t[e]);return n};var dt=(t,r)=>{for(var n in r)E(t,n,{get:r[n],enumerable:!0})},yt=(t,r,n,e)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of Ct(r))!_.call(t,o)&&o!==n&&E(t,o,{get:()=>r[o],enumerable:!(e=ut(r,o))||e.enumerable});return t};var $t=t=>yt(E({},"__esModule",{value:!0}),t);var It={};dt(It,{Generate:()=>C});module.exports=$t(It);var A=require("@oclif/command");var G=require("@clarigen/native-bin"),$=require("@clarigen/core"),D=require("path");var Et=require("@oclif/command");var y=require("path"),I=require("fs/promises"),Y=require("fs");var B=require("@ltd/j-toml"),J=require("path"),L=require("fs/promises"),k=require("micro-stacks/wallet-sdk"),K=require("toposort"),q=require("micro-stacks/crypto");async function xt(t){let r=(0,J.resolve)(t,"settings","Devnet.toml"),n=await(0,L.readFile)(r,{encoding:"utf-8"});return(0,B.parse)(n,1,`
2
- `,!0,{longer:!0})}async function wt(t){let r=(0,J.resolve)(t,"Clarinet.toml"),n=await(0,L.readFile)(r,{encoding:"utf-8"});return(0,B.parse)(n,1,`
3
- `,!0)}async function H(t,r){let n=await wt(t),e=r.deployer.address;return ht(n.contracts).map(c=>({file:n.contracts[c].path.replace(/^contracts\//,""),address:e,name:c}))}function ht(t){let r=[],n=[];return Object.entries(t).forEach(([o,i])=>{n.push(o),i.depends_on.forEach(c=>r.push([o,c]))}),(0,K.array)(n,r).reverse()}async function Q(t){let r=await xt(t),n=await Promise.all(Object.entries(r.accounts).map(async([o,i])=>{let c=await(0,k.generateWallet)(i.mnemonic,"password"),[s]=c.accounts,a=(0,k.getStxAddressFromAccount)(s,q.StacksNetworkVersion.testnetP2PKH);return[o,j(h({},i),{address:a})]}));return Object.fromEntries(n)}var X={outputDir:"src/clarigen",clarinet:"."};function bt(t){return(0,y.resolve)(t,"clarigen.config.json")}async function Ft(t){try{return await(0,I.access)(t,Y.constants.R_OK),!0}catch{return!1}}async function At(t){let r=bt(t);if(await Ft(r)){let e=await(0,I.readFile)(r,{encoding:"utf-8"}),o=JSON.parse(e);return h(h({},X),o)}return X}async function N(t){let r=await At(t),n=(0,y.resolve)(t,r.clarinet||"."),e=await Q(n),o=await H(n,e),i=(0,y.relative)(process.cwd(),(0,y.join)(r.clarinet,"contracts"));return j(h({},r),{contracts:o,contractsDir:i,accounts:e,clarinet:r.clarinet||"."})}var f=require("micro-stacks/transactions"),v=require("@clarigen/core"),Z=require("reserved-words"),g=(t,r=!1)=>{if((0,f.isClarityAbiPrimitive)(t)){if(t==="uint128")return r?"number | bigint":"bigint";if(t==="int128")return r?"number | bigint":"bigint";if(t==="bool")return"boolean";if(t==="principal")return"string";if(t==="none")return"null";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(t)}`)}else{if((0,f.isClarityAbiBuffer)(t))return"Uint8Array";if((0,f.isClarityAbiResponse)(t)){let n=g(t.response.ok),e=g(t.response.error);return`ClarityTypes.Response<${n}, ${e}>`}else{if((0,f.isClarityAbiOptional)(t))return`${g(t.optional)} | null`;if((0,f.isClarityAbiTuple)(t)){let n=[];return t.tuple.forEach(({name:e,type:o})=>{let i=g(o);n.push(`"${e}": ${i}`)}),`{
1
+ var E=Object.defineProperty,ut=Object.defineProperties,mt=Object.getOwnPropertyDescriptor,Ct=Object.getOwnPropertyDescriptors,dt=Object.getOwnPropertyNames,T=Object.getOwnPropertySymbols;var _=Object.prototype.hasOwnProperty,W=Object.prototype.propertyIsEnumerable;var U=(t,r,n)=>r in t?E(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n,b=(t,r)=>{for(var n in r||(r={}))_.call(r,n)&&U(t,n,r[n]);if(T)for(var n of T(r))W.call(r,n)&&U(t,n,r[n]);return t},I=(t,r)=>ut(t,Ct(r));var V=(t,r)=>{var n={};for(var e in t)_.call(t,e)&&r.indexOf(e)<0&&(n[e]=t[e]);if(t!=null&&T)for(var e of T(t))r.indexOf(e)<0&&W.call(t,e)&&(n[e]=t[e]);return n};var yt=(t,r)=>{for(var n in r)E(t,n,{get:r[n],enumerable:!0})},$t=(t,r,n,e)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of dt(r))!_.call(t,o)&&o!==n&&E(t,o,{get:()=>r[o],enumerable:!(e=mt(r,o))||e.enumerable});return t};var xt=t=>$t(E({},"__esModule",{value:!0}),t);var Nt={};yt(Nt,{Generate:()=>C});module.exports=xt(Nt);var A=require("@oclif/command");var G=require("@clarigen/native-bin"),$=require("@clarigen/core"),v=require("path");var It=require("@oclif/command");var y=require("path"),k=require("fs/promises"),Y=require("fs");var B=require("@ltd/j-toml"),L=require("path"),R=require("fs/promises"),j=require("micro-stacks/wallet-sdk"),K=require("toposort"),q=require("micro-stacks/crypto");async function wt(t){let r=(0,L.resolve)(t,"settings","Devnet.toml"),n=await(0,R.readFile)(r,{encoding:"utf-8"});return(0,B.parse)(n,1,`
2
+ `,!0,{longer:!0})}async function ht(t){let r=(0,L.resolve)(t,"Clarinet.toml"),n=await(0,R.readFile)(r,{encoding:"utf-8"});return(0,B.parse)(n,1,`
3
+ `,!0)}async function H(t,r){let n=await ht(t),e=r.deployer.address;return bt(n.contracts).map(c=>({file:n.contracts[c].path.replace(/^contracts\//,""),address:e,name:c}))}function bt(t){let r=[],n=[];return Object.entries(t).forEach(([o,i])=>{n.push(o),i.depends_on.forEach(c=>r.push([o,c]))}),(0,K.array)(n,r).reverse()}async function Q(t){let r=await wt(t),n=await Promise.all(Object.entries(r.accounts).map(async([o,i])=>{let c=await(0,j.generateWallet)(i.mnemonic,"password"),[s]=c.accounts,a=(0,j.getStxAddressFromAccount)(s,q.StacksNetworkVersion.testnetP2PKH);return[o,I(b({},i),{address:a})]}));return Object.fromEntries(n)}var X={outputDir:"src/clarigen",clarinet:"."};function Ft(t){return(0,y.resolve)(t,"clarigen.config.json")}async function At(t){try{return await(0,k.access)(t,Y.constants.R_OK),!0}catch{return!1}}async function Pt(t){let r=Ft(t);if(await At(r)){let e=await(0,k.readFile)(r,{encoding:"utf-8"}),o=JSON.parse(e);return b(b({},X),o)}return X}async function N(t){let r=await Pt(t),n=(0,y.resolve)(t,r.clarinet||"."),e=await Q(n),o=await H(n,e),i=(0,y.relative)(process.cwd(),(0,y.join)(r.clarinet,"contracts"));return I(b({},r),{contracts:o,contractsDir:i,accounts:e,clarinet:r.clarinet||"."})}var f=require("micro-stacks/transactions"),D=require("@clarigen/core"),Z=require("reserved-words"),g=(t,r=!1)=>{if((0,f.isClarityAbiPrimitive)(t)){if(t==="uint128")return r?"number | bigint":"bigint";if(t==="int128")return r?"number | bigint":"bigint";if(t==="bool")return"boolean";if(t==="principal")return"string";if(t==="none")return"null";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(t)}`)}else{if((0,f.isClarityAbiBuffer)(t))return"Uint8Array";if((0,f.isClarityAbiResponse)(t)){let n=g(t.response.ok),e=g(t.response.error);return`ClarityTypes.Response<${n}, ${e}>`}else{if((0,f.isClarityAbiOptional)(t))return`${g(t.optional)} | null`;if((0,f.isClarityAbiTuple)(t)){let n=[];return t.tuple.forEach(({name:e,type:o})=>{let i=g(o);n.push(`"${e}": ${i}`)}),`{
4
4
  ${n.join(`;
5
5
  `)}
6
- }`}else{if((0,f.isClarityAbiList)(t))return`${g(t.list.type)}[]`;if((0,f.isClarityAbiStringAscii)(t))return"string";if((0,f.isClarityAbiStringUtf8)(t))return"string";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(t)}`)}}}};function Pt(t){let r=(0,v.toCamelCase)(t);return`${(0,Z.check)(r,6)?"_":""}${r}`}var Tt={public:"Public",read_only:"ReadOnly",private:"Private"};function z(t){let r="";return t.functions.forEach((n,e)=>{let o=`${(0,v.toCamelCase)(n.name)}: `;if(o+=`(${n.args.map(s=>`${Pt(s.name)}: ${g(s.type,!0)}`).join(", ")}) => `,o+=`ContractCalls.${Tt[n.access]}<`,n.access==="public"){let{type:s}=n.outputs;if(!(0,f.isClarityAbiResponse)(s))throw new Error("Expected response type for public function");let a=g(s.response.ok),l=g(s.response.error);o+=`${a}, ${l}>;`}else o+=`${g(n.outputs.type)}>;`;r+=`${e===0?"":`
7
- `} ${o}`}),t.maps.forEach(n=>{let e=`${(0,v.toCamelCase)(n.name)}: `,o=g(n.key,!0),i=`key: ${o}`,c=g(n.value);e+=`(${i}) => ContractCalls.Map<${o}, ${c}>;`,r+=`
6
+ }`}else{if((0,f.isClarityAbiList)(t))return`${g(t.list.type)}[]`;if((0,f.isClarityAbiStringAscii)(t))return"string";if((0,f.isClarityAbiStringUtf8)(t))return"string";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(t)}`)}}}};function Tt(t){let r=(0,D.toCamelCase)(t);return`${(0,Z.check)(r,6)?"_":""}${r}`}var Et={public:"Public",read_only:"ReadOnly",private:"Private"};function z(t){let r="";return t.functions.forEach((n,e)=>{let o=`${(0,D.toCamelCase)(n.name)}: `;if(o+=`(${n.args.map(s=>`${Tt(s.name)}: ${g(s.type,!0)}`).join(", ")}) => `,o+=`ContractCalls.${Et[n.access]}<`,n.access==="public"){let{type:s}=n.outputs;if(!(0,f.isClarityAbiResponse)(s))throw new Error("Expected response type for public function");let a=g(s.response.ok),l=g(s.response.error);o+=`${a}, ${l}>;`}else o+=`${g(n.outputs.type)}>;`;r+=`${e===0?"":`
7
+ `} ${o}`}),t.maps.forEach(n=>{let e=`${(0,D.toCamelCase)(n.name)}: `,o=g(n.key,!0),i=`key: ${o}`,c=g(n.value);e+=`(${i}) => ContractCalls.Map<${o}, ${c}>;`,r+=`
8
8
  ${e}`}),r}var tt=async({provider:t,contractFile:r,contractAddress:n,contractName:e})=>{let o=await t.runCommand(["launch",`${n}.${e}`,r,t.dbFilePath,"--output_analysis","--costs","--assets"]);if((0,G.hasStdErr)(o.stderr))throw new Error(`Error on ${r}:
9
9
  ${o.stderr}
10
10
  `);let i=JSON.parse(o.stdout);if(i.error){let{initialization:s}=i.error;if(s!=null&&s.includes(`
@@ -58,7 +58,7 @@ export const accounts = {
58
58
  address: "${l.address}",
59
59
  },`}).join(`
60
60
  `)}
61
- };`),t.contracts.forEach(s=>{let a=s.name,l=(0,$.toCamelCase)(a),u=`${l}Info`,w=`${(0,$.toCamelCase)(a,!0)}Contract`,m=(0,D.dirname)(s.file),M=`'./${(0,D.join)(m||".",a)}'`,lt=`import { ${u} } from ${M};`;r.push(lt);let ft=`export type { ${w} } from ${M};`;n.push(ft);let pt=`${l}: ${u},`;e.push(pt)});let i=`
61
+ };`),t.contracts.forEach(s=>{let a=s.name,l=(0,$.toCamelCase)(a),u=`${l}Info`,h=`${(0,$.toCamelCase)(a,!0)}Contract`,m=(0,v.dirname)(s.file),M=`'./${(0,v.join)(m||".",a)}'`,ft=`import { ${u} } from ${M};`;r.push(ft);let pt=`export type { ${h} } from ${M};`;n.push(pt);let gt=`${l}: ${u},`;e.push(gt)});let i=`
62
62
  export type Contracts = ContractInstances<typeof contracts>;
63
63
  `;return`${r.join(`
64
64
  `)}
@@ -69,6 +69,10 @@ export const contracts = {
69
69
  ${e.join(`
70
70
  `)}
71
71
  };${o}
72
- `};var st=require("@clarigen/native-bin"),p=require("path"),x=require("fs/promises");var S=require("@clarigen/claridocs"),b=require("fs/promises"),F=require("path");async function it({contractFile:t,contractName:r,docsPath:n,abi:e,dirName:o}){let i=await(0,b.readFile)(t,{encoding:"utf-8"}),c=(0,S.createContractDocInfo)({contractSrc:i,abi:e}),s=(0,F.resolve)(process.cwd(),n,o||"."),a=(0,F.resolve)(s,`${r}.md`),l=(0,S.generateMarkdown)({contract:c,contractFile:(0,F.relative)(s,t),contractName:r,abi:e});await(0,b.mkdir)(s,{recursive:!0}),await(0,b.writeFile)(a,l)}var jt=async({contractFile:t,outputFolder:r,provider:n,contractAddress:e,dirName:o,contractName:i,docsPath:c})=>{let s=(0,p.resolve)(process.cwd(),t),a=await tt({contractFile:s,provider:n,contractAddress:e,contractName:i}),l=et(a,i),u=nt({contractFile:(0,p.relative)(process.cwd(),s),contractAddress:e,contractName:i}),w=rt({contractName:i,abi:a});typeof c<"u"&&await it({contractFile:s,contractName:i,abi:a,docsPath:c,dirName:o});let m=(0,p.resolve)(r,o||".",i);await(0,x.mkdir)(m,{recursive:!0}),await(0,x.writeFile)((0,p.resolve)(m,"abi.ts"),w),await(0,x.writeFile)((0,p.resolve)(m,"index.ts"),u),await(0,x.writeFile)((0,p.resolve)(m,"types.ts"),l)},O=async t=>{let r=await N(t),{contractsDir:n,outputDir:e,contracts:o}=r,i=(0,p.resolve)(t,e),c=await(0,st.createClarityBin)();for(let l of o){let u=(0,p.resolve)(t,n,l.file),w=(0,p.dirname)(l.file);await jt({contractFile:u,outputFolder:i,provider:c,contractAddress:l.address,dirName:w,contractName:l.name,docsPath:r.docs})}let s=ot(r),a=(0,p.resolve)(i,"index.ts");await(0,x.writeFile)(a,s)};var ct=require("chokidar"),at=require("path"),P=require("chalk"),kt=require("ora"),R=class extends A.Command{async run(){let{flags:r}=this.parse(R),n=process.cwd();if(r.watch){let e=kt("Generating files").start(),{contractsDir:o}=await N(n),i=(0,ct.watch)([o],{cwd:n});try{await O(n),e.succeed("Finished generating files. Watching for changes.")}catch(c){e.fail(`Error generating files.
73
- ${c.message}`)}i.on("change",async c=>{let s=(0,at.basename)(c);e.clear(),e.start(`Change detected for ${(0,P.green)(s)}, generating.`);try{await O(n),e.succeed(`Finished generating files for ${(0,P.green)(s)}. Watching for changes.`)}catch(a){let l=a.message;e.fail(`Error after saving ${(0,P.red)(s)}.
74
- ${l}`)}}),process.on("SIGINT",async()=>{await i.close(),process.exit()})}else await O(n)}},C=R;C.description="Generate project files",C.strict=!0,C.hidden=!1,C.flags={help:A.flags.help({char:"h"}),watch:A.flags.boolean({char:"w",description:"Watch for changes to your contracts"})},C.args=[];0&&(module.exports={Generate});
72
+ `};var ct=require("@clarigen/native-bin"),p=require("path"),w=require("fs/promises");var S=require("@clarigen/claridocs"),x=require("fs/promises"),F=require("path");async function it({contractFile:t,contractName:r,docsPath:n,abi:e,dirName:o}){let i=await(0,x.readFile)(t,{encoding:"utf-8"}),c=(0,S.createContractDocInfo)({contractSrc:i,abi:e}),s=(0,F.resolve)(process.cwd(),n,o||"."),a=(0,F.resolve)(s,`${r}.md`),l=(0,S.generateMarkdown)({contract:c,contractFile:(0,F.relative)(s,t),contractName:r,abi:e});await(0,x.mkdir)(s,{recursive:!0}),await(0,x.writeFile)(a,l)}async function st(t){if(!t.docs)return;let n=`# Contracts
73
+
74
+ ${t.contracts.map(o=>{let i=o.file.replace(".clar",".md");return`- [\`${o.name}\`](${i})`}).join(`
75
+ `)}
76
+ `,e=(0,F.resolve)(process.cwd(),t.docs,"README.md");await(0,x.writeFile)(e,n)}var jt=async({contractFile:t,outputFolder:r,provider:n,contractAddress:e,dirName:o,contractName:i,docsPath:c})=>{let s=(0,p.resolve)(process.cwd(),t),a=await tt({contractFile:s,provider:n,contractAddress:e,contractName:i}),l=et(a,i),u=nt({contractFile:(0,p.relative)(process.cwd(),s),contractAddress:e,contractName:i}),h=rt({contractName:i,abi:a});typeof c<"u"&&await it({contractFile:s,contractName:i,abi:a,docsPath:c,dirName:o});let m=(0,p.resolve)(r,o||".",i);await(0,w.mkdir)(m,{recursive:!0}),await(0,w.writeFile)((0,p.resolve)(m,"abi.ts"),h),await(0,w.writeFile)((0,p.resolve)(m,"index.ts"),u),await(0,w.writeFile)((0,p.resolve)(m,"types.ts"),l)},O=async t=>{let r=await N(t),{contractsDir:n,outputDir:e,contracts:o}=r,i=(0,p.resolve)(t,e),c=await(0,ct.createClarityBin)();for(let l of o){let u=(0,p.resolve)(t,n,l.file),h=(0,p.dirname)(l.file);await jt({contractFile:u,outputFolder:i,provider:c,contractAddress:l.address,dirName:h,contractName:l.name,docsPath:r.docs})}let s=ot(r);await st(r);let a=(0,p.resolve)(i,"index.ts");await(0,w.writeFile)(a,s)};var at=require("chokidar"),lt=require("path"),P=require("chalk"),kt=require("ora"),J=class extends A.Command{async run(){let{flags:r}=this.parse(J),n=process.cwd();if(r.watch){let e=kt("Generating files").start(),{contractsDir:o}=await N(n),i=(0,at.watch)([o],{cwd:n});try{await O(n),e.succeed("Finished generating files. Watching for changes.")}catch(c){e.fail(`Error generating files.
77
+ ${c.message}`)}i.on("change",async c=>{let s=(0,lt.basename)(c);e.clear(),e.start(`Change detected for ${(0,P.green)(s)}, generating.`);try{await O(n),e.succeed(`Finished generating files for ${(0,P.green)(s)}. Watching for changes.`)}catch(a){let l=a.message;e.fail(`Error after saving ${(0,P.red)(s)}.
78
+ ${l}`)}}),process.on("SIGINT",async()=>{await i.close(),process.exit()})}else await O(n)}},C=J;C.description="Generate project files",C.strict=!0,C.hidden=!1,C.flags={help:A.flags.help({char:"h"}),watch:A.flags.boolean({char:"w",description:"Watch for changes to your contracts"})},C.args=[];0&&(module.exports={Generate});
@@ -1,11 +1,11 @@
1
- var G=Object.defineProperty,tt=Object.defineProperties;var rt=Object.getOwnPropertyDescriptors;var w=Object.getOwnPropertySymbols;var k=Object.prototype.hasOwnProperty,I=Object.prototype.propertyIsEnumerable;var j=(t,n,r)=>n in t?G(t,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[n]=r,$=(t,n)=>{for(var r in n||(n={}))k.call(n,r)&&j(t,r,n[r]);if(w)for(var r of w(n))I.call(n,r)&&j(t,r,n[r]);return t},h=(t,n)=>tt(t,rt(n));var nt=(t=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(t,{get:(n,r)=>(typeof require!="undefined"?require:n)[r]}):t)(function(t){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+t+'" is not supported')});var N=(t,n)=>{var r={};for(var e in t)k.call(t,e)&&n.indexOf(e)<0&&(r[e]=t[e]);if(t!=null&&w)for(var e of w(t))n.indexOf(e)<0&&I.call(t,e)&&(r[e]=t[e]);return r};import{Command as Ut,flags as Q}from"@oclif/command";import{hasStdErr as jt}from"@clarigen/native-bin";import{toCamelCase as x}from"@clarigen/core";import{dirname as kt,join as It}from"path";import{run as mr}from"@oclif/command";import{resolve as J,join as ft,relative as pt}from"path";import{readFile as gt,access as ut}from"fs/promises";import{constants as mt}from"fs";import{parse as v}from"@ltd/j-toml";import{resolve as D}from"path";import{readFile as S}from"fs/promises";import{generateWallet as et,getStxAddressFromAccount as ot}from"micro-stacks/wallet-sdk";import{array as it}from"toposort";import{StacksNetworkVersion as st}from"micro-stacks/crypto";async function ct(t){let n=D(t,"settings","Devnet.toml"),r=await S(n,{encoding:"utf-8"});return v(r,1,`
2
- `,!0,{longer:!0})}async function at(t){let n=D(t,"Clarinet.toml"),r=await S(n,{encoding:"utf-8"});return v(r,1,`
3
- `,!0)}async function O(t,n){let r=await at(t),e=n.deployer.address;return lt(r.contracts).map(c=>({file:r.contracts[c].path.replace(/^contracts\//,""),address:e,name:c}))}function lt(t){let n=[],r=[];return Object.entries(t).forEach(([o,i])=>{r.push(o),i.depends_on.forEach(c=>n.push([o,c]))}),it(r,n).reverse()}async function _(t){let n=await ct(t),r=await Promise.all(Object.entries(n.accounts).map(async([o,i])=>{let c=await et(i.mnemonic,"password"),[s]=c.accounts,a=ot(s,st.testnetP2PKH);return[o,h($({},i),{address:a})]}));return Object.fromEntries(r)}var B={outputDir:"src/clarigen",clarinet:"."};function Ct(t){return J(t,"clarigen.config.json")}async function dt(t){try{return await ut(t,mt.R_OK),!0}catch{return!1}}async function yt(t){let n=Ct(t);if(await dt(n)){let e=await gt(n,{encoding:"utf-8"}),o=JSON.parse(e);return $($({},B),o)}return B}async function b(t){let n=await yt(t),r=J(t,n.clarinet||"."),e=await _(r),o=await O(r,e),i=pt(process.cwd(),ft(n.clarinet,"contracts"));return h($({},n),{contracts:o,contractsDir:i,accounts:e,clarinet:n.clarinet||"."})}import{isClarityAbiBuffer as $t,isClarityAbiList as xt,isClarityAbiOptional as wt,isClarityAbiPrimitive as ht,isClarityAbiResponse as L,isClarityAbiStringAscii as bt,isClarityAbiStringUtf8 as Ft,isClarityAbiTuple as At}from"micro-stacks/transactions";import{toCamelCase as P}from"@clarigen/core";import{check as Pt}from"reserved-words";var f=(t,n=!1)=>{if(ht(t)){if(t==="uint128")return n?"number | bigint":"bigint";if(t==="int128")return n?"number | bigint":"bigint";if(t==="bool")return"boolean";if(t==="principal")return"string";if(t==="none")return"null";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(t)}`)}else{if($t(t))return"Uint8Array";if(L(t)){let r=f(t.response.ok),e=f(t.response.error);return`ClarityTypes.Response<${r}, ${e}>`}else{if(wt(t))return`${f(t.optional)} | null`;if(At(t)){let r=[];return t.tuple.forEach(({name:e,type:o})=>{let i=f(o);r.push(`"${e}": ${i}`)}),`{
1
+ var rt=Object.defineProperty,nt=Object.defineProperties;var et=Object.getOwnPropertyDescriptors;var w=Object.getOwnPropertySymbols;var k=Object.prototype.hasOwnProperty,N=Object.prototype.propertyIsEnumerable;var j=(t,n,r)=>n in t?rt(t,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[n]=r,$=(t,n)=>{for(var r in n||(n={}))k.call(n,r)&&j(t,r,n[r]);if(w)for(var r of w(n))N.call(n,r)&&j(t,r,n[r]);return t},h=(t,n)=>nt(t,et(n));var ot=(t=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(t,{get:(n,r)=>(typeof require!="undefined"?require:n)[r]}):t)(function(t){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+t+'" is not supported')});var D=(t,n)=>{var r={};for(var e in t)k.call(t,e)&&n.indexOf(e)<0&&(r[e]=t[e]);if(t!=null&&w)for(var e of w(t))n.indexOf(e)<0&&N.call(t,e)&&(r[e]=t[e]);return r};import{Command as Wt,flags as Y}from"@oclif/command";import{hasStdErr as kt}from"@clarigen/native-bin";import{toCamelCase as x}from"@clarigen/core";import{dirname as Nt,join as Dt}from"path";import{run as Cr}from"@oclif/command";import{resolve as R,join as gt,relative as ut}from"path";import{readFile as mt,access as Ct}from"fs/promises";import{constants as dt}from"fs";import{parse as v}from"@ltd/j-toml";import{resolve as S}from"path";import{readFile as O}from"fs/promises";import{generateWallet as it,getStxAddressFromAccount as st}from"micro-stacks/wallet-sdk";import{array as ct}from"toposort";import{StacksNetworkVersion as at}from"micro-stacks/crypto";async function lt(t){let n=S(t,"settings","Devnet.toml"),r=await O(n,{encoding:"utf-8"});return v(r,1,`
2
+ `,!0,{longer:!0})}async function ft(t){let n=S(t,"Clarinet.toml"),r=await O(n,{encoding:"utf-8"});return v(r,1,`
3
+ `,!0)}async function _(t,n){let r=await ft(t),e=n.deployer.address;return pt(r.contracts).map(c=>({file:r.contracts[c].path.replace(/^contracts\//,""),address:e,name:c}))}function pt(t){let n=[],r=[];return Object.entries(t).forEach(([o,i])=>{r.push(o),i.depends_on.forEach(c=>n.push([o,c]))}),ct(r,n).reverse()}async function B(t){let n=await lt(t),r=await Promise.all(Object.entries(n.accounts).map(async([o,i])=>{let c=await it(i.mnemonic,"password"),[s]=c.accounts,a=st(s,at.testnetP2PKH);return[o,h($({},i),{address:a})]}));return Object.fromEntries(r)}var L={outputDir:"src/clarigen",clarinet:"."};function yt(t){return R(t,"clarigen.config.json")}async function $t(t){try{return await Ct(t,dt.R_OK),!0}catch{return!1}}async function xt(t){let n=yt(t);if(await $t(n)){let e=await mt(n,{encoding:"utf-8"}),o=JSON.parse(e);return $($({},L),o)}return L}async function b(t){let n=await xt(t),r=R(t,n.clarinet||"."),e=await B(r),o=await _(r,e),i=ut(process.cwd(),gt(n.clarinet,"contracts"));return h($({},n),{contracts:o,contractsDir:i,accounts:e,clarinet:n.clarinet||"."})}import{isClarityAbiBuffer as wt,isClarityAbiList as ht,isClarityAbiOptional as bt,isClarityAbiPrimitive as Ft,isClarityAbiResponse as J,isClarityAbiStringAscii as At,isClarityAbiStringUtf8 as Pt,isClarityAbiTuple as Tt}from"micro-stacks/transactions";import{toCamelCase as P}from"@clarigen/core";import{check as Et}from"reserved-words";var f=(t,n=!1)=>{if(Ft(t)){if(t==="uint128")return n?"number | bigint":"bigint";if(t==="int128")return n?"number | bigint":"bigint";if(t==="bool")return"boolean";if(t==="principal")return"string";if(t==="none")return"null";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(t)}`)}else{if(wt(t))return"Uint8Array";if(J(t)){let r=f(t.response.ok),e=f(t.response.error);return`ClarityTypes.Response<${r}, ${e}>`}else{if(bt(t))return`${f(t.optional)} | null`;if(Tt(t)){let r=[];return t.tuple.forEach(({name:e,type:o})=>{let i=f(o);r.push(`"${e}": ${i}`)}),`{
4
4
  ${r.join(`;
5
5
  `)}
6
- }`}else{if(xt(t))return`${f(t.list.type)}[]`;if(bt(t))return"string";if(Ft(t))return"string";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(t)}`)}}}};function Tt(t){let n=P(t);return`${Pt(n,6)?"_":""}${n}`}var Et={public:"Public",read_only:"ReadOnly",private:"Private"};function R(t){let n="";return t.functions.forEach((r,e)=>{let o=`${P(r.name)}: `;if(o+=`(${r.args.map(s=>`${Tt(s.name)}: ${f(s.type,!0)}`).join(", ")}) => `,o+=`ContractCalls.${Et[r.access]}<`,r.access==="public"){let{type:s}=r.outputs;if(!L(s))throw new Error("Expected response type for public function");let a=f(s.response.ok),l=f(s.response.error);o+=`${a}, ${l}>;`}else o+=`${f(r.outputs.type)}>;`;n+=`${e===0?"":`
6
+ }`}else{if(ht(t))return`${f(t.list.type)}[]`;if(At(t))return"string";if(Pt(t))return"string";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(t)}`)}}}};function It(t){let n=P(t);return`${Et(n,6)?"_":""}${n}`}var jt={public:"Public",read_only:"ReadOnly",private:"Private"};function M(t){let n="";return t.functions.forEach((r,e)=>{let o=`${P(r.name)}: `;if(o+=`(${r.args.map(s=>`${It(s.name)}: ${f(s.type,!0)}`).join(", ")}) => `,o+=`ContractCalls.${jt[r.access]}<`,r.access==="public"){let{type:s}=r.outputs;if(!J(s))throw new Error("Expected response type for public function");let a=f(s.response.ok),l=f(s.response.error);o+=`${a}, ${l}>;`}else o+=`${f(r.outputs.type)}>;`;n+=`${e===0?"":`
7
7
  `} ${o}`}),t.maps.forEach(r=>{let e=`${P(r.name)}: `,o=f(r.key,!0),i=`key: ${o}`,c=f(r.value);e+=`(${i}) => ContractCalls.Map<${o}, ${c}>;`,n+=`
8
- ${e}`}),n}var M=async({provider:t,contractFile:n,contractAddress:r,contractName:e})=>{let o=await t.runCommand(["launch",`${r}.${e}`,n,t.dbFilePath,"--output_analysis","--costs","--assets"]);if(jt(o.stderr))throw new Error(`Error on ${n}:
8
+ ${e}`}),n}var U=async({provider:t,contractFile:n,contractAddress:r,contractName:e})=>{let o=await t.runCommand(["launch",`${r}.${e}`,n,t.dbFilePath,"--output_analysis","--costs","--assets"]);if(kt(o.stderr))throw new Error(`Error on ${n}:
9
9
  ${o.stderr}
10
10
  `);let i=JSON.parse(o.stdout);if(i.error){let{initialization:s}=i.error;if(s!=null&&s.includes(`
11
11
  Near:
@@ -18,11 +18,11 @@ Near:
18
18
  ${l}
19
19
  `)}throw new Error(`Error on ${n}:
20
20
  ${JSON.stringify(i.error,null,2)}
21
- `)}return i.analysis},U=({contractName:t,abi:n})=>{let r=x(t,!0),s=n,{clarity_version:e}=s,o=N(s,["clarity_version"]),i=JSON.stringify(o,null,2);return`import { ClarityAbi } from '@clarigen/core';
21
+ `)}return i.analysis},W=({contractName:t,abi:n})=>{let r=x(t,!0),s=n,{clarity_version:e}=s,o=D(s,["clarity_version"]),i=JSON.stringify(o,null,2);return`import { ClarityAbi } from '@clarigen/core';
22
22
 
23
23
  // prettier-ignore
24
24
  export const ${r}Interface: ClarityAbi = ${i};
25
- `},W=({contractFile:t,contractAddress:n,contractName:r})=>{let e=x(r,!0),o=x(r),i=`${e}Contract`,c=`${e}Interface`;return`import { pureProxy, Contract } from '@clarigen/core';
25
+ `},V=({contractFile:t,contractAddress:n,contractName:r})=>{let e=x(r,!0),o=x(r),i=`${e}Contract`,c=`${e}Interface`;return`import { pureProxy, Contract } from '@clarigen/core';
26
26
  import type { ${i} } from './types';
27
27
  import { ${c} } from './abi';
28
28
  export type { ${i} } from './types';
@@ -42,13 +42,13 @@ export const ${o}Info: Contract<${i}> = {
42
42
  name: '${r}',
43
43
  abi: ${c},
44
44
  };
45
- `},V=(t,n)=>{let r=x(n,!0),e=R(t);return`import { ClarityTypes, ContractCalls } from '@clarigen/core';
45
+ `},K=(t,n)=>{let r=x(n,!0),e=M(t);return`import { ClarityTypes, ContractCalls } from '@clarigen/core';
46
46
 
47
47
  // prettier-ignore
48
48
  export interface ${r}Contract {
49
49
  ${e}
50
50
  }
51
- `},K=t=>{let n=["import type { ContractInstances } from '@clarigen/core';"],r=[],e=[],o="";"accounts"in t&&(o=`
51
+ `},q=t=>{let n=["import type { ContractInstances } from '@clarigen/core';"],r=[],e=[],o="";"accounts"in t&&(o=`
52
52
 
53
53
  // prettier-ignore
54
54
  export const accounts = {
@@ -58,7 +58,7 @@ export const accounts = {
58
58
  address: "${l.address}",
59
59
  },`}).join(`
60
60
  `)}
61
- };`),t.contracts.forEach(s=>{let a=s.name,l=x(a),p=`${l}Info`,y=`${x(a,!0)}Contract`,g=kt(s.file),E=`'./${It(g||".",a)}'`,Y=`import { ${p} } from ${E};`;n.push(Y);let Z=`export type { ${y} } from ${E};`;r.push(Z);let z=`${l}: ${p},`;e.push(z)});let i=`
61
+ };`),t.contracts.forEach(s=>{let a=s.name,l=x(a),p=`${l}Info`,y=`${x(a,!0)}Contract`,g=Nt(s.file),I=`'./${Dt(g||".",a)}'`,z=`import { ${p} } from ${I};`;n.push(z);let G=`export type { ${y} } from ${I};`;r.push(G);let tt=`${l}: ${p},`;e.push(tt)});let i=`
62
62
  export type Contracts = ContractInstances<typeof contracts>;
63
63
  `;return`${n.join(`
64
64
  `)}
@@ -69,6 +69,10 @@ export const contracts = {
69
69
  ${e.join(`
70
70
  `)}
71
71
  };${o}
72
- `};import{createClarityBin as Bt}from"@clarigen/native-bin";import{resolve as u,relative as Jt,dirname as Lt}from"path";import{mkdir as Rt,writeFile as F}from"fs/promises";import{createContractDocInfo as Nt,generateMarkdown as vt}from"@clarigen/claridocs";import{mkdir as Dt,readFile as St,writeFile as Ot}from"fs/promises";import{relative as _t,resolve as q}from"path";async function H({contractFile:t,contractName:n,docsPath:r,abi:e,dirName:o}){let i=await St(t,{encoding:"utf-8"}),c=Nt({contractSrc:i,abi:e}),s=q(process.cwd(),r,o||"."),a=q(s,`${n}.md`),l=vt({contract:c,contractFile:_t(s,t),contractName:n,abi:e});await Dt(s,{recursive:!0}),await Ot(a,l)}var Mt=async({contractFile:t,outputFolder:n,provider:r,contractAddress:e,dirName:o,contractName:i,docsPath:c})=>{let s=u(process.cwd(),t),a=await M({contractFile:s,provider:r,contractAddress:e,contractName:i}),l=V(a,i),p=W({contractFile:Jt(process.cwd(),s),contractAddress:e,contractName:i}),y=U({contractName:i,abi:a});typeof c<"u"&&await H({contractFile:s,contractName:i,abi:a,docsPath:c,dirName:o});let g=u(n,o||".",i);await Rt(g,{recursive:!0}),await F(u(g,"abi.ts"),y),await F(u(g,"index.ts"),p),await F(u(g,"types.ts"),l)},A=async t=>{let n=await b(t),{contractsDir:r,outputDir:e,contracts:o}=n,i=u(t,e),c=await Bt();for(let l of o){let p=u(t,r,l.file),y=Lt(l.file);await Mt({contractFile:p,outputFolder:i,provider:c,contractAddress:l.address,dirName:y,contractName:l.name,docsPath:n.docs})}let s=K(n),a=u(i,"index.ts");await F(a,s)};import{watch as Wt}from"chokidar";import{basename as Vt}from"path";import{red as Kt,green as X}from"chalk";var qt=nt("ora"),T=class extends Ut{async run(){let{flags:n}=this.parse(T),r=process.cwd();if(n.watch){let e=qt("Generating files").start(),{contractsDir:o}=await b(r),i=Wt([o],{cwd:r});try{await A(r),e.succeed("Finished generating files. Watching for changes.")}catch(c){e.fail(`Error generating files.
73
- ${c.message}`)}i.on("change",async c=>{let s=Vt(c);e.clear(),e.start(`Change detected for ${X(s)}, generating.`);try{await A(r),e.succeed(`Finished generating files for ${X(s)}. Watching for changes.`)}catch(a){let l=a.message;e.fail(`Error after saving ${Kt(s)}.
74
- ${l}`)}}),process.on("SIGINT",async()=>{await i.close(),process.exit()})}else await A(r)}},d=T;d.description="Generate project files",d.strict=!0,d.hidden=!1,d.flags={help:Q.help({char:"h"}),watch:Q.boolean({char:"w",description:"Watch for changes to your contracts"})},d.args=[];export{d as Generate};
72
+ `};import{createClarityBin as Lt}from"@clarigen/native-bin";import{resolve as u,relative as Rt,dirname as Jt}from"path";import{mkdir as Mt,writeFile as F}from"fs/promises";import{createContractDocInfo as vt,generateMarkdown as St}from"@clarigen/claridocs";import{mkdir as Ot,readFile as _t,writeFile as H}from"fs/promises";import{relative as Bt,resolve as T}from"path";async function Q({contractFile:t,contractName:n,docsPath:r,abi:e,dirName:o}){let i=await _t(t,{encoding:"utf-8"}),c=vt({contractSrc:i,abi:e}),s=T(process.cwd(),r,o||"."),a=T(s,`${n}.md`),l=St({contract:c,contractFile:Bt(s,t),contractName:n,abi:e});await Ot(s,{recursive:!0}),await H(a,l)}async function X(t){if(!t.docs)return;let r=`# Contracts
73
+
74
+ ${t.contracts.map(o=>{let i=o.file.replace(".clar",".md");return`- [\`${o.name}\`](${i})`}).join(`
75
+ `)}
76
+ `,e=T(process.cwd(),t.docs,"README.md");await H(e,r)}var Ut=async({contractFile:t,outputFolder:n,provider:r,contractAddress:e,dirName:o,contractName:i,docsPath:c})=>{let s=u(process.cwd(),t),a=await U({contractFile:s,provider:r,contractAddress:e,contractName:i}),l=K(a,i),p=V({contractFile:Rt(process.cwd(),s),contractAddress:e,contractName:i}),y=W({contractName:i,abi:a});typeof c<"u"&&await Q({contractFile:s,contractName:i,abi:a,docsPath:c,dirName:o});let g=u(n,o||".",i);await Mt(g,{recursive:!0}),await F(u(g,"abi.ts"),y),await F(u(g,"index.ts"),p),await F(u(g,"types.ts"),l)},A=async t=>{let n=await b(t),{contractsDir:r,outputDir:e,contracts:o}=n,i=u(t,e),c=await Lt();for(let l of o){let p=u(t,r,l.file),y=Jt(l.file);await Ut({contractFile:p,outputFolder:i,provider:c,contractAddress:l.address,dirName:y,contractName:l.name,docsPath:n.docs})}let s=q(n);await X(n);let a=u(i,"index.ts");await F(a,s)};import{watch as Vt}from"chokidar";import{basename as Kt}from"path";import{red as qt,green as Z}from"chalk";var Ht=ot("ora"),E=class extends Wt{async run(){let{flags:n}=this.parse(E),r=process.cwd();if(n.watch){let e=Ht("Generating files").start(),{contractsDir:o}=await b(r),i=Vt([o],{cwd:r});try{await A(r),e.succeed("Finished generating files. Watching for changes.")}catch(c){e.fail(`Error generating files.
77
+ ${c.message}`)}i.on("change",async c=>{let s=Kt(c);e.clear(),e.start(`Change detected for ${Z(s)}, generating.`);try{await A(r),e.succeed(`Finished generating files for ${Z(s)}. Watching for changes.`)}catch(a){let l=a.message;e.fail(`Error after saving ${qt(s)}.
78
+ ${l}`)}}),process.on("SIGINT",async()=>{await i.close(),process.exit()})}else await A(r)}},d=E;d.description="Generate project files",d.strict=!0,d.hidden=!1,d.flags={help:Y.help({char:"h"}),watch:Y.boolean({char:"w",description:"Watch for changes to your contracts"})},d.args=[];export{d as Generate};
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
- var j=Object.defineProperty,dt=Object.defineProperties,yt=Object.getOwnPropertyDescriptor,$t=Object.getOwnPropertyDescriptors,xt=Object.getOwnPropertyNames,E=Object.getOwnPropertySymbols;var _=Object.prototype.hasOwnProperty,Y=Object.prototype.propertyIsEnumerable;var X=(t,r,n)=>r in t?j(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n,h=(t,r)=>{for(var n in r||(r={}))_.call(r,n)&&X(t,n,r[n]);if(E)for(var n of E(r))Y.call(r,n)&&X(t,n,r[n]);return t},k=(t,r)=>dt(t,$t(r));var Z=(t,r)=>{var n={};for(var e in t)_.call(t,e)&&r.indexOf(e)<0&&(n[e]=t[e]);if(t!=null&&E)for(var e of E(t))r.indexOf(e)<0&&Y.call(t,e)&&(n[e]=t[e]);return n};var wt=(t,r)=>{for(var n in r)j(t,n,{get:r[n],enumerable:!0})},ht=(t,r,n,e)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of xt(r))!_.call(t,o)&&o!==n&&j(t,o,{get:()=>r[o],enumerable:!(e=yt(r,o))||e.enumerable});return t};var bt=t=>ht(j({},"__esModule",{value:!0}),t);var It={};wt(It,{Generate:()=>C,configFileExists:()=>ot,configFilePath:()=>et,defaultConfigFile:()=>R,generateIndexFile:()=>V,generateInterface:()=>U,generateInterfaceFile:()=>W,generateProjectIndexFile:()=>q,generateTypesFile:()=>K,getConfigFile:()=>it,getProjectConfig:()=>F,jsTypeFromAbiType:()=>g,makePureTypes:()=>M,run:()=>gt.run});module.exports=bt(It);var gt=require("@oclif/command");var y=require("path"),N=require("fs/promises"),nt=require("fs");var B=require("@ltd/j-toml"),J=require("path"),L=require("fs/promises"),I=require("micro-stacks/wallet-sdk"),z=require("toposort"),G=require("micro-stacks/crypto");async function Ft(t){let r=(0,J.resolve)(t,"settings","Devnet.toml"),n=await(0,L.readFile)(r,{encoding:"utf-8"});return(0,B.parse)(n,1,`
2
- `,!0,{longer:!0})}async function At(t){let r=(0,J.resolve)(t,"Clarinet.toml"),n=await(0,L.readFile)(r,{encoding:"utf-8"});return(0,B.parse)(n,1,`
3
- `,!0)}async function tt(t,r){let n=await At(t),e=r.deployer.address;return Pt(n.contracts).map(c=>({file:n.contracts[c].path.replace(/^contracts\//,""),address:e,name:c}))}function Pt(t){let r=[],n=[];return Object.entries(t).forEach(([o,i])=>{n.push(o),i.depends_on.forEach(c=>r.push([o,c]))}),(0,z.array)(n,r).reverse()}async function rt(t){let r=await Ft(t),n=await Promise.all(Object.entries(r.accounts).map(async([o,i])=>{let c=await(0,I.generateWallet)(i.mnemonic,"password"),[s]=c.accounts,a=(0,I.getStxAddressFromAccount)(s,G.StacksNetworkVersion.testnetP2PKH);return[o,k(h({},i),{address:a})]}));return Object.fromEntries(n)}var R={outputDir:"src/clarigen",clarinet:"."};function et(t){return(0,y.resolve)(t,"clarigen.config.json")}async function ot(t){try{return await(0,N.access)(t,nt.constants.R_OK),!0}catch{return!1}}async function it(t){let r=et(t);if(await ot(r)){let e=await(0,N.readFile)(r,{encoding:"utf-8"}),o=JSON.parse(e);return h(h({},R),o)}return R}async function F(t){let r=await it(t),n=(0,y.resolve)(t,r.clarinet||"."),e=await rt(n),o=await tt(n,e),i=(0,y.relative)(process.cwd(),(0,y.join)(r.clarinet,"contracts"));return k(h({},r),{contracts:o,contractsDir:i,accounts:e,clarinet:r.clarinet||"."})}var f=require("micro-stacks/transactions"),v=require("@clarigen/core"),st=require("reserved-words"),g=(t,r=!1)=>{if((0,f.isClarityAbiPrimitive)(t)){if(t==="uint128")return r?"number | bigint":"bigint";if(t==="int128")return r?"number | bigint":"bigint";if(t==="bool")return"boolean";if(t==="principal")return"string";if(t==="none")return"null";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(t)}`)}else{if((0,f.isClarityAbiBuffer)(t))return"Uint8Array";if((0,f.isClarityAbiResponse)(t)){let n=g(t.response.ok),e=g(t.response.error);return`ClarityTypes.Response<${n}, ${e}>`}else{if((0,f.isClarityAbiOptional)(t))return`${g(t.optional)} | null`;if((0,f.isClarityAbiTuple)(t)){let n=[];return t.tuple.forEach(({name:e,type:o})=>{let i=g(o);n.push(`"${e}": ${i}`)}),`{
1
+ var I=Object.defineProperty,yt=Object.defineProperties,$t=Object.getOwnPropertyDescriptor,xt=Object.getOwnPropertyDescriptors,wt=Object.getOwnPropertyNames,E=Object.getOwnPropertySymbols;var _=Object.prototype.hasOwnProperty,Y=Object.prototype.propertyIsEnumerable;var X=(t,r,n)=>r in t?I(t,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[r]=n,b=(t,r)=>{for(var n in r||(r={}))_.call(r,n)&&X(t,n,r[n]);if(E)for(var n of E(r))Y.call(r,n)&&X(t,n,r[n]);return t},j=(t,r)=>yt(t,xt(r));var Z=(t,r)=>{var n={};for(var e in t)_.call(t,e)&&r.indexOf(e)<0&&(n[e]=t[e]);if(t!=null&&E)for(var e of E(t))r.indexOf(e)<0&&Y.call(t,e)&&(n[e]=t[e]);return n};var ht=(t,r)=>{for(var n in r)I(t,n,{get:r[n],enumerable:!0})},bt=(t,r,n,e)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of wt(r))!_.call(t,o)&&o!==n&&I(t,o,{get:()=>r[o],enumerable:!(e=$t(r,o))||e.enumerable});return t};var Ft=t=>bt(I({},"__esModule",{value:!0}),t);var Nt={};ht(Nt,{Generate:()=>C,configFileExists:()=>ot,configFilePath:()=>et,defaultConfigFile:()=>J,generateIndexFile:()=>V,generateInterface:()=>U,generateInterfaceFile:()=>W,generateProjectIndexFile:()=>q,generateTypesFile:()=>K,getConfigFile:()=>it,getProjectConfig:()=>A,jsTypeFromAbiType:()=>g,makePureTypes:()=>M,run:()=>ut.run});module.exports=Ft(Nt);var ut=require("@oclif/command");var y=require("path"),N=require("fs/promises"),nt=require("fs");var B=require("@ltd/j-toml"),L=require("path"),R=require("fs/promises"),k=require("micro-stacks/wallet-sdk"),z=require("toposort"),G=require("micro-stacks/crypto");async function At(t){let r=(0,L.resolve)(t,"settings","Devnet.toml"),n=await(0,R.readFile)(r,{encoding:"utf-8"});return(0,B.parse)(n,1,`
2
+ `,!0,{longer:!0})}async function Pt(t){let r=(0,L.resolve)(t,"Clarinet.toml"),n=await(0,R.readFile)(r,{encoding:"utf-8"});return(0,B.parse)(n,1,`
3
+ `,!0)}async function tt(t,r){let n=await Pt(t),e=r.deployer.address;return Tt(n.contracts).map(c=>({file:n.contracts[c].path.replace(/^contracts\//,""),address:e,name:c}))}function Tt(t){let r=[],n=[];return Object.entries(t).forEach(([o,i])=>{n.push(o),i.depends_on.forEach(c=>r.push([o,c]))}),(0,z.array)(n,r).reverse()}async function rt(t){let r=await At(t),n=await Promise.all(Object.entries(r.accounts).map(async([o,i])=>{let c=await(0,k.generateWallet)(i.mnemonic,"password"),[s]=c.accounts,a=(0,k.getStxAddressFromAccount)(s,G.StacksNetworkVersion.testnetP2PKH);return[o,j(b({},i),{address:a})]}));return Object.fromEntries(n)}var J={outputDir:"src/clarigen",clarinet:"."};function et(t){return(0,y.resolve)(t,"clarigen.config.json")}async function ot(t){try{return await(0,N.access)(t,nt.constants.R_OK),!0}catch{return!1}}async function it(t){let r=et(t);if(await ot(r)){let e=await(0,N.readFile)(r,{encoding:"utf-8"}),o=JSON.parse(e);return b(b({},J),o)}return J}async function A(t){let r=await it(t),n=(0,y.resolve)(t,r.clarinet||"."),e=await rt(n),o=await tt(n,e),i=(0,y.relative)(process.cwd(),(0,y.join)(r.clarinet,"contracts"));return j(b({},r),{contracts:o,contractsDir:i,accounts:e,clarinet:r.clarinet||"."})}var f=require("micro-stacks/transactions"),D=require("@clarigen/core"),st=require("reserved-words"),g=(t,r=!1)=>{if((0,f.isClarityAbiPrimitive)(t)){if(t==="uint128")return r?"number | bigint":"bigint";if(t==="int128")return r?"number | bigint":"bigint";if(t==="bool")return"boolean";if(t==="principal")return"string";if(t==="none")return"null";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(t)}`)}else{if((0,f.isClarityAbiBuffer)(t))return"Uint8Array";if((0,f.isClarityAbiResponse)(t)){let n=g(t.response.ok),e=g(t.response.error);return`ClarityTypes.Response<${n}, ${e}>`}else{if((0,f.isClarityAbiOptional)(t))return`${g(t.optional)} | null`;if((0,f.isClarityAbiTuple)(t)){let n=[];return t.tuple.forEach(({name:e,type:o})=>{let i=g(o);n.push(`"${e}": ${i}`)}),`{
4
4
  ${n.join(`;
5
5
  `)}
6
- }`}else{if((0,f.isClarityAbiList)(t))return`${g(t.list.type)}[]`;if((0,f.isClarityAbiStringAscii)(t))return"string";if((0,f.isClarityAbiStringUtf8)(t))return"string";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(t)}`)}}}};function Tt(t){let r=(0,v.toCamelCase)(t);return`${(0,st.check)(r,6)?"_":""}${r}`}var Et={public:"Public",read_only:"ReadOnly",private:"Private"};function M(t){let r="";return t.functions.forEach((n,e)=>{let o=`${(0,v.toCamelCase)(n.name)}: `;if(o+=`(${n.args.map(s=>`${Tt(s.name)}: ${g(s.type,!0)}`).join(", ")}) => `,o+=`ContractCalls.${Et[n.access]}<`,n.access==="public"){let{type:s}=n.outputs;if(!(0,f.isClarityAbiResponse)(s))throw new Error("Expected response type for public function");let a=g(s.response.ok),l=g(s.response.error);o+=`${a}, ${l}>;`}else o+=`${g(n.outputs.type)}>;`;r+=`${e===0?"":`
7
- `} ${o}`}),t.maps.forEach(n=>{let e=`${(0,v.toCamelCase)(n.name)}: `,o=g(n.key,!0),i=`key: ${o}`,c=g(n.value);e+=`(${i}) => ContractCalls.Map<${o}, ${c}>;`,r+=`
8
- ${e}`}),r}var ct=require("@clarigen/native-bin"),$=require("@clarigen/core"),D=require("path");var U=async({provider:t,contractFile:r,contractAddress:n,contractName:e})=>{let o=await t.runCommand(["launch",`${n}.${e}`,r,t.dbFilePath,"--output_analysis","--costs","--assets"]);if((0,ct.hasStdErr)(o.stderr))throw new Error(`Error on ${r}:
6
+ }`}else{if((0,f.isClarityAbiList)(t))return`${g(t.list.type)}[]`;if((0,f.isClarityAbiStringAscii)(t))return"string";if((0,f.isClarityAbiStringUtf8)(t))return"string";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(t)}`)}}}};function Et(t){let r=(0,D.toCamelCase)(t);return`${(0,st.check)(r,6)?"_":""}${r}`}var It={public:"Public",read_only:"ReadOnly",private:"Private"};function M(t){let r="";return t.functions.forEach((n,e)=>{let o=`${(0,D.toCamelCase)(n.name)}: `;if(o+=`(${n.args.map(s=>`${Et(s.name)}: ${g(s.type,!0)}`).join(", ")}) => `,o+=`ContractCalls.${It[n.access]}<`,n.access==="public"){let{type:s}=n.outputs;if(!(0,f.isClarityAbiResponse)(s))throw new Error("Expected response type for public function");let a=g(s.response.ok),l=g(s.response.error);o+=`${a}, ${l}>;`}else o+=`${g(n.outputs.type)}>;`;r+=`${e===0?"":`
7
+ `} ${o}`}),t.maps.forEach(n=>{let e=`${(0,D.toCamelCase)(n.name)}: `,o=g(n.key,!0),i=`key: ${o}`,c=g(n.value);e+=`(${i}) => ContractCalls.Map<${o}, ${c}>;`,r+=`
8
+ ${e}`}),r}var ct=require("@clarigen/native-bin"),$=require("@clarigen/core"),v=require("path");var U=async({provider:t,contractFile:r,contractAddress:n,contractName:e})=>{let o=await t.runCommand(["launch",`${n}.${e}`,r,t.dbFilePath,"--output_analysis","--costs","--assets"]);if((0,ct.hasStdErr)(o.stderr))throw new Error(`Error on ${r}:
9
9
  ${o.stderr}
10
10
  `);let i=JSON.parse(o.stdout);if(i.error){let{initialization:s}=i.error;if(s!=null&&s.includes(`
11
11
  Near:
@@ -58,7 +58,7 @@ export const accounts = {
58
58
  address: "${l.address}",
59
59
  },`}).join(`
60
60
  `)}
61
- };`),t.contracts.forEach(s=>{let a=s.name,l=(0,$.toCamelCase)(a),u=`${l}Info`,w=`${(0,$.toCamelCase)(a,!0)}Contract`,m=(0,D.dirname)(s.file),Q=`'./${(0,D.join)(m||".",a)}'`,ut=`import { ${u} } from ${Q};`;r.push(ut);let mt=`export type { ${w} } from ${Q};`;n.push(mt);let Ct=`${l}: ${u},`;e.push(Ct)});let i=`
61
+ };`),t.contracts.forEach(s=>{let a=s.name,l=(0,$.toCamelCase)(a),u=`${l}Info`,h=`${(0,$.toCamelCase)(a,!0)}Contract`,m=(0,v.dirname)(s.file),Q=`'./${(0,v.join)(m||".",a)}'`,mt=`import { ${u} } from ${Q};`;r.push(mt);let Ct=`export type { ${h} } from ${Q};`;n.push(Ct);let dt=`${l}: ${u},`;e.push(dt)});let i=`
62
62
  export type Contracts = ContractInstances<typeof contracts>;
63
63
  `;return`${r.join(`
64
64
  `)}
@@ -69,6 +69,10 @@ export const contracts = {
69
69
  ${e.join(`
70
70
  `)}
71
71
  };${o}
72
- `};var P=require("@oclif/command");var lt=require("@clarigen/native-bin"),p=require("path"),x=require("fs/promises");var S=require("@clarigen/claridocs"),b=require("fs/promises"),A=require("path");async function at({contractFile:t,contractName:r,docsPath:n,abi:e,dirName:o}){let i=await(0,b.readFile)(t,{encoding:"utf-8"}),c=(0,S.createContractDocInfo)({contractSrc:i,abi:e}),s=(0,A.resolve)(process.cwd(),n,o||"."),a=(0,A.resolve)(s,`${r}.md`),l=(0,S.generateMarkdown)({contract:c,contractFile:(0,A.relative)(s,t),contractName:r,abi:e});await(0,b.mkdir)(s,{recursive:!0}),await(0,b.writeFile)(a,l)}var jt=async({contractFile:t,outputFolder:r,provider:n,contractAddress:e,dirName:o,contractName:i,docsPath:c})=>{let s=(0,p.resolve)(process.cwd(),t),a=await U({contractFile:s,provider:n,contractAddress:e,contractName:i}),l=K(a,i),u=V({contractFile:(0,p.relative)(process.cwd(),s),contractAddress:e,contractName:i}),w=W({contractName:i,abi:a});typeof c<"u"&&await at({contractFile:s,contractName:i,abi:a,docsPath:c,dirName:o});let m=(0,p.resolve)(r,o||".",i);await(0,x.mkdir)(m,{recursive:!0}),await(0,x.writeFile)((0,p.resolve)(m,"abi.ts"),w),await(0,x.writeFile)((0,p.resolve)(m,"index.ts"),u),await(0,x.writeFile)((0,p.resolve)(m,"types.ts"),l)},O=async t=>{let r=await F(t),{contractsDir:n,outputDir:e,contracts:o}=r,i=(0,p.resolve)(t,e),c=await(0,lt.createClarityBin)();for(let l of o){let u=(0,p.resolve)(t,n,l.file),w=(0,p.dirname)(l.file);await jt({contractFile:u,outputFolder:i,provider:c,contractAddress:l.address,dirName:w,contractName:l.name,docsPath:r.docs})}let s=q(r),a=(0,p.resolve)(i,"index.ts");await(0,x.writeFile)(a,s)};var ft=require("chokidar"),pt=require("path"),T=require("chalk"),kt=require("ora"),H=class extends P.Command{async run(){let{flags:r}=this.parse(H),n=process.cwd();if(r.watch){let e=kt("Generating files").start(),{contractsDir:o}=await F(n),i=(0,ft.watch)([o],{cwd:n});try{await O(n),e.succeed("Finished generating files. Watching for changes.")}catch(c){e.fail(`Error generating files.
73
- ${c.message}`)}i.on("change",async c=>{let s=(0,pt.basename)(c);e.clear(),e.start(`Change detected for ${(0,T.green)(s)}, generating.`);try{await O(n),e.succeed(`Finished generating files for ${(0,T.green)(s)}. Watching for changes.`)}catch(a){let l=a.message;e.fail(`Error after saving ${(0,T.red)(s)}.
72
+ `};var P=require("@oclif/command");var ft=require("@clarigen/native-bin"),p=require("path"),w=require("fs/promises");var S=require("@clarigen/claridocs"),x=require("fs/promises"),F=require("path");async function at({contractFile:t,contractName:r,docsPath:n,abi:e,dirName:o}){let i=await(0,x.readFile)(t,{encoding:"utf-8"}),c=(0,S.createContractDocInfo)({contractSrc:i,abi:e}),s=(0,F.resolve)(process.cwd(),n,o||"."),a=(0,F.resolve)(s,`${r}.md`),l=(0,S.generateMarkdown)({contract:c,contractFile:(0,F.relative)(s,t),contractName:r,abi:e});await(0,x.mkdir)(s,{recursive:!0}),await(0,x.writeFile)(a,l)}async function lt(t){if(!t.docs)return;let n=`# Contracts
73
+
74
+ ${t.contracts.map(o=>{let i=o.file.replace(".clar",".md");return`- [\`${o.name}\`](${i})`}).join(`
75
+ `)}
76
+ `,e=(0,F.resolve)(process.cwd(),t.docs,"README.md");await(0,x.writeFile)(e,n)}var jt=async({contractFile:t,outputFolder:r,provider:n,contractAddress:e,dirName:o,contractName:i,docsPath:c})=>{let s=(0,p.resolve)(process.cwd(),t),a=await U({contractFile:s,provider:n,contractAddress:e,contractName:i}),l=K(a,i),u=V({contractFile:(0,p.relative)(process.cwd(),s),contractAddress:e,contractName:i}),h=W({contractName:i,abi:a});typeof c<"u"&&await at({contractFile:s,contractName:i,abi:a,docsPath:c,dirName:o});let m=(0,p.resolve)(r,o||".",i);await(0,w.mkdir)(m,{recursive:!0}),await(0,w.writeFile)((0,p.resolve)(m,"abi.ts"),h),await(0,w.writeFile)((0,p.resolve)(m,"index.ts"),u),await(0,w.writeFile)((0,p.resolve)(m,"types.ts"),l)},O=async t=>{let r=await A(t),{contractsDir:n,outputDir:e,contracts:o}=r,i=(0,p.resolve)(t,e),c=await(0,ft.createClarityBin)();for(let l of o){let u=(0,p.resolve)(t,n,l.file),h=(0,p.dirname)(l.file);await jt({contractFile:u,outputFolder:i,provider:c,contractAddress:l.address,dirName:h,contractName:l.name,docsPath:r.docs})}let s=q(r);await lt(r);let a=(0,p.resolve)(i,"index.ts");await(0,w.writeFile)(a,s)};var pt=require("chokidar"),gt=require("path"),T=require("chalk"),kt=require("ora"),H=class extends P.Command{async run(){let{flags:r}=this.parse(H),n=process.cwd();if(r.watch){let e=kt("Generating files").start(),{contractsDir:o}=await A(n),i=(0,pt.watch)([o],{cwd:n});try{await O(n),e.succeed("Finished generating files. Watching for changes.")}catch(c){e.fail(`Error generating files.
77
+ ${c.message}`)}i.on("change",async c=>{let s=(0,gt.basename)(c);e.clear(),e.start(`Change detected for ${(0,T.green)(s)}, generating.`);try{await O(n),e.succeed(`Finished generating files for ${(0,T.green)(s)}. Watching for changes.`)}catch(a){let l=a.message;e.fail(`Error after saving ${(0,T.red)(s)}.
74
78
  ${l}`)}}),process.on("SIGINT",async()=>{await i.close(),process.exit()})}else await O(n)}},C=H;C.description="Generate project files",C.strict=!0,C.hidden=!1,C.flags={help:P.flags.help({char:"h"}),watch:P.flags.boolean({char:"w",description:"Watch for changes to your contracts"})},C.args=[];0&&(module.exports={Generate,configFileExists,configFilePath,defaultConfigFile,generateIndexFile,generateInterface,generateInterfaceFile,generateProjectIndexFile,generateTypesFile,getConfigFile,getProjectConfig,jsTypeFromAbiType,makePureTypes,run});
package/dist/index.mjs CHANGED
@@ -1,11 +1,11 @@
1
- var G=Object.defineProperty,tt=Object.defineProperties;var rt=Object.getOwnPropertyDescriptors;var w=Object.getOwnPropertySymbols;var k=Object.prototype.hasOwnProperty,I=Object.prototype.propertyIsEnumerable;var j=(t,n,r)=>n in t?G(t,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[n]=r,$=(t,n)=>{for(var r in n||(n={}))k.call(n,r)&&j(t,r,n[r]);if(w)for(var r of w(n))I.call(n,r)&&j(t,r,n[r]);return t},h=(t,n)=>tt(t,rt(n));var nt=(t=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(t,{get:(n,r)=>(typeof require!="undefined"?require:n)[r]}):t)(function(t){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+t+'" is not supported')});var N=(t,n)=>{var r={};for(var e in t)k.call(t,e)&&n.indexOf(e)<0&&(r[e]=t[e]);if(t!=null&&w)for(var e of w(t))n.indexOf(e)<0&&I.call(t,e)&&(r[e]=t[e]);return r};import{run as Ur}from"@oclif/command";import{resolve as J,join as ft,relative as pt}from"path";import{readFile as gt,access as ut}from"fs/promises";import{constants as mt}from"fs";import{parse as v}from"@ltd/j-toml";import{resolve as D}from"path";import{readFile as S}from"fs/promises";import{generateWallet as et,getStxAddressFromAccount as ot}from"micro-stacks/wallet-sdk";import{array as it}from"toposort";import{StacksNetworkVersion as st}from"micro-stacks/crypto";async function ct(t){let n=D(t,"settings","Devnet.toml"),r=await S(n,{encoding:"utf-8"});return v(r,1,`
2
- `,!0,{longer:!0})}async function at(t){let n=D(t,"Clarinet.toml"),r=await S(n,{encoding:"utf-8"});return v(r,1,`
3
- `,!0)}async function O(t,n){let r=await at(t),e=n.deployer.address;return lt(r.contracts).map(c=>({file:r.contracts[c].path.replace(/^contracts\//,""),address:e,name:c}))}function lt(t){let n=[],r=[];return Object.entries(t).forEach(([o,i])=>{r.push(o),i.depends_on.forEach(c=>n.push([o,c]))}),it(r,n).reverse()}async function _(t){let n=await ct(t),r=await Promise.all(Object.entries(n.accounts).map(async([o,i])=>{let c=await et(i.mnemonic,"password"),[s]=c.accounts,a=ot(s,st.testnetP2PKH);return[o,h($({},i),{address:a})]}));return Object.fromEntries(r)}var B={outputDir:"src/clarigen",clarinet:"."};function Ct(t){return J(t,"clarigen.config.json")}async function dt(t){try{return await ut(t,mt.R_OK),!0}catch{return!1}}async function yt(t){let n=Ct(t);if(await dt(n)){let e=await gt(n,{encoding:"utf-8"}),o=JSON.parse(e);return $($({},B),o)}return B}async function b(t){let n=await yt(t),r=J(t,n.clarinet||"."),e=await _(r),o=await O(r,e),i=pt(process.cwd(),ft(n.clarinet,"contracts"));return h($({},n),{contracts:o,contractsDir:i,accounts:e,clarinet:n.clarinet||"."})}import{isClarityAbiBuffer as $t,isClarityAbiList as xt,isClarityAbiOptional as wt,isClarityAbiPrimitive as ht,isClarityAbiResponse as L,isClarityAbiStringAscii as bt,isClarityAbiStringUtf8 as Ft,isClarityAbiTuple as At}from"micro-stacks/transactions";import{toCamelCase as P}from"@clarigen/core";import{check as Pt}from"reserved-words";var f=(t,n=!1)=>{if(ht(t)){if(t==="uint128")return n?"number | bigint":"bigint";if(t==="int128")return n?"number | bigint":"bigint";if(t==="bool")return"boolean";if(t==="principal")return"string";if(t==="none")return"null";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(t)}`)}else{if($t(t))return"Uint8Array";if(L(t)){let r=f(t.response.ok),e=f(t.response.error);return`ClarityTypes.Response<${r}, ${e}>`}else{if(wt(t))return`${f(t.optional)} | null`;if(At(t)){let r=[];return t.tuple.forEach(({name:e,type:o})=>{let i=f(o);r.push(`"${e}": ${i}`)}),`{
1
+ var rt=Object.defineProperty,nt=Object.defineProperties;var et=Object.getOwnPropertyDescriptors;var w=Object.getOwnPropertySymbols;var k=Object.prototype.hasOwnProperty,N=Object.prototype.propertyIsEnumerable;var j=(t,n,r)=>n in t?rt(t,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[n]=r,$=(t,n)=>{for(var r in n||(n={}))k.call(n,r)&&j(t,r,n[r]);if(w)for(var r of w(n))N.call(n,r)&&j(t,r,n[r]);return t},h=(t,n)=>nt(t,et(n));var ot=(t=>typeof require!="undefined"?require:typeof Proxy!="undefined"?new Proxy(t,{get:(n,r)=>(typeof require!="undefined"?require:n)[r]}):t)(function(t){if(typeof require!="undefined")return require.apply(this,arguments);throw new Error('Dynamic require of "'+t+'" is not supported')});var D=(t,n)=>{var r={};for(var e in t)k.call(t,e)&&n.indexOf(e)<0&&(r[e]=t[e]);if(t!=null&&w)for(var e of w(t))n.indexOf(e)<0&&N.call(t,e)&&(r[e]=t[e]);return r};import{run as Vr}from"@oclif/command";import{resolve as R,join as gt,relative as ut}from"path";import{readFile as mt,access as Ct}from"fs/promises";import{constants as dt}from"fs";import{parse as v}from"@ltd/j-toml";import{resolve as S}from"path";import{readFile as O}from"fs/promises";import{generateWallet as it,getStxAddressFromAccount as st}from"micro-stacks/wallet-sdk";import{array as ct}from"toposort";import{StacksNetworkVersion as at}from"micro-stacks/crypto";async function lt(t){let n=S(t,"settings","Devnet.toml"),r=await O(n,{encoding:"utf-8"});return v(r,1,`
2
+ `,!0,{longer:!0})}async function ft(t){let n=S(t,"Clarinet.toml"),r=await O(n,{encoding:"utf-8"});return v(r,1,`
3
+ `,!0)}async function _(t,n){let r=await ft(t),e=n.deployer.address;return pt(r.contracts).map(c=>({file:r.contracts[c].path.replace(/^contracts\//,""),address:e,name:c}))}function pt(t){let n=[],r=[];return Object.entries(t).forEach(([o,i])=>{r.push(o),i.depends_on.forEach(c=>n.push([o,c]))}),ct(r,n).reverse()}async function B(t){let n=await lt(t),r=await Promise.all(Object.entries(n.accounts).map(async([o,i])=>{let c=await it(i.mnemonic,"password"),[s]=c.accounts,a=st(s,at.testnetP2PKH);return[o,h($({},i),{address:a})]}));return Object.fromEntries(r)}var L={outputDir:"src/clarigen",clarinet:"."};function yt(t){return R(t,"clarigen.config.json")}async function $t(t){try{return await Ct(t,dt.R_OK),!0}catch{return!1}}async function xt(t){let n=yt(t);if(await $t(n)){let e=await mt(n,{encoding:"utf-8"}),o=JSON.parse(e);return $($({},L),o)}return L}async function b(t){let n=await xt(t),r=R(t,n.clarinet||"."),e=await B(r),o=await _(r,e),i=ut(process.cwd(),gt(n.clarinet,"contracts"));return h($({},n),{contracts:o,contractsDir:i,accounts:e,clarinet:n.clarinet||"."})}import{isClarityAbiBuffer as wt,isClarityAbiList as ht,isClarityAbiOptional as bt,isClarityAbiPrimitive as Ft,isClarityAbiResponse as J,isClarityAbiStringAscii as At,isClarityAbiStringUtf8 as Pt,isClarityAbiTuple as Tt}from"micro-stacks/transactions";import{toCamelCase as P}from"@clarigen/core";import{check as Et}from"reserved-words";var f=(t,n=!1)=>{if(Ft(t)){if(t==="uint128")return n?"number | bigint":"bigint";if(t==="int128")return n?"number | bigint":"bigint";if(t==="bool")return"boolean";if(t==="principal")return"string";if(t==="none")return"null";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(t)}`)}else{if(wt(t))return"Uint8Array";if(J(t)){let r=f(t.response.ok),e=f(t.response.error);return`ClarityTypes.Response<${r}, ${e}>`}else{if(bt(t))return`${f(t.optional)} | null`;if(Tt(t)){let r=[];return t.tuple.forEach(({name:e,type:o})=>{let i=f(o);r.push(`"${e}": ${i}`)}),`{
4
4
  ${r.join(`;
5
5
  `)}
6
- }`}else{if(xt(t))return`${f(t.list.type)}[]`;if(bt(t))return"string";if(Ft(t))return"string";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(t)}`)}}}};function Tt(t){let n=P(t);return`${Pt(n,6)?"_":""}${n}`}var Et={public:"Public",read_only:"ReadOnly",private:"Private"};function R(t){let n="";return t.functions.forEach((r,e)=>{let o=`${P(r.name)}: `;if(o+=`(${r.args.map(s=>`${Tt(s.name)}: ${f(s.type,!0)}`).join(", ")}) => `,o+=`ContractCalls.${Et[r.access]}<`,r.access==="public"){let{type:s}=r.outputs;if(!L(s))throw new Error("Expected response type for public function");let a=f(s.response.ok),l=f(s.response.error);o+=`${a}, ${l}>;`}else o+=`${f(r.outputs.type)}>;`;n+=`${e===0?"":`
6
+ }`}else{if(ht(t))return`${f(t.list.type)}[]`;if(At(t))return"string";if(Pt(t))return"string";if(t==="trait_reference")return"string";throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(t)}`)}}}};function It(t){let n=P(t);return`${Et(n,6)?"_":""}${n}`}var jt={public:"Public",read_only:"ReadOnly",private:"Private"};function M(t){let n="";return t.functions.forEach((r,e)=>{let o=`${P(r.name)}: `;if(o+=`(${r.args.map(s=>`${It(s.name)}: ${f(s.type,!0)}`).join(", ")}) => `,o+=`ContractCalls.${jt[r.access]}<`,r.access==="public"){let{type:s}=r.outputs;if(!J(s))throw new Error("Expected response type for public function");let a=f(s.response.ok),l=f(s.response.error);o+=`${a}, ${l}>;`}else o+=`${f(r.outputs.type)}>;`;n+=`${e===0?"":`
7
7
  `} ${o}`}),t.maps.forEach(r=>{let e=`${P(r.name)}: `,o=f(r.key,!0),i=`key: ${o}`,c=f(r.value);e+=`(${i}) => ContractCalls.Map<${o}, ${c}>;`,n+=`
8
- ${e}`}),n}import{hasStdErr as jt}from"@clarigen/native-bin";import{toCamelCase as x}from"@clarigen/core";import{dirname as kt,join as It}from"path";var M=async({provider:t,contractFile:n,contractAddress:r,contractName:e})=>{let o=await t.runCommand(["launch",`${r}.${e}`,n,t.dbFilePath,"--output_analysis","--costs","--assets"]);if(jt(o.stderr))throw new Error(`Error on ${n}:
8
+ ${e}`}),n}import{hasStdErr as kt}from"@clarigen/native-bin";import{toCamelCase as x}from"@clarigen/core";import{dirname as Nt,join as Dt}from"path";var U=async({provider:t,contractFile:n,contractAddress:r,contractName:e})=>{let o=await t.runCommand(["launch",`${r}.${e}`,n,t.dbFilePath,"--output_analysis","--costs","--assets"]);if(kt(o.stderr))throw new Error(`Error on ${n}:
9
9
  ${o.stderr}
10
10
  `);let i=JSON.parse(o.stdout);if(i.error){let{initialization:s}=i.error;if(s!=null&&s.includes(`
11
11
  Near:
@@ -18,11 +18,11 @@ Near:
18
18
  ${l}
19
19
  `)}throw new Error(`Error on ${n}:
20
20
  ${JSON.stringify(i.error,null,2)}
21
- `)}return i.analysis},U=({contractName:t,abi:n})=>{let r=x(t,!0),s=n,{clarity_version:e}=s,o=N(s,["clarity_version"]),i=JSON.stringify(o,null,2);return`import { ClarityAbi } from '@clarigen/core';
21
+ `)}return i.analysis},W=({contractName:t,abi:n})=>{let r=x(t,!0),s=n,{clarity_version:e}=s,o=D(s,["clarity_version"]),i=JSON.stringify(o,null,2);return`import { ClarityAbi } from '@clarigen/core';
22
22
 
23
23
  // prettier-ignore
24
24
  export const ${r}Interface: ClarityAbi = ${i};
25
- `},W=({contractFile:t,contractAddress:n,contractName:r})=>{let e=x(r,!0),o=x(r),i=`${e}Contract`,c=`${e}Interface`;return`import { pureProxy, Contract } from '@clarigen/core';
25
+ `},V=({contractFile:t,contractAddress:n,contractName:r})=>{let e=x(r,!0),o=x(r),i=`${e}Contract`,c=`${e}Interface`;return`import { pureProxy, Contract } from '@clarigen/core';
26
26
  import type { ${i} } from './types';
27
27
  import { ${c} } from './abi';
28
28
  export type { ${i} } from './types';
@@ -42,13 +42,13 @@ export const ${o}Info: Contract<${i}> = {
42
42
  name: '${r}',
43
43
  abi: ${c},
44
44
  };
45
- `},V=(t,n)=>{let r=x(n,!0),e=R(t);return`import { ClarityTypes, ContractCalls } from '@clarigen/core';
45
+ `},K=(t,n)=>{let r=x(n,!0),e=M(t);return`import { ClarityTypes, ContractCalls } from '@clarigen/core';
46
46
 
47
47
  // prettier-ignore
48
48
  export interface ${r}Contract {
49
49
  ${e}
50
50
  }
51
- `},K=t=>{let n=["import type { ContractInstances } from '@clarigen/core';"],r=[],e=[],o="";"accounts"in t&&(o=`
51
+ `},q=t=>{let n=["import type { ContractInstances } from '@clarigen/core';"],r=[],e=[],o="";"accounts"in t&&(o=`
52
52
 
53
53
  // prettier-ignore
54
54
  export const accounts = {
@@ -58,7 +58,7 @@ export const accounts = {
58
58
  address: "${l.address}",
59
59
  },`}).join(`
60
60
  `)}
61
- };`),t.contracts.forEach(s=>{let a=s.name,l=x(a),p=`${l}Info`,y=`${x(a,!0)}Contract`,g=kt(s.file),E=`'./${It(g||".",a)}'`,Y=`import { ${p} } from ${E};`;n.push(Y);let Z=`export type { ${y} } from ${E};`;r.push(Z);let z=`${l}: ${p},`;e.push(z)});let i=`
61
+ };`),t.contracts.forEach(s=>{let a=s.name,l=x(a),p=`${l}Info`,y=`${x(a,!0)}Contract`,g=Nt(s.file),I=`'./${Dt(g||".",a)}'`,z=`import { ${p} } from ${I};`;n.push(z);let G=`export type { ${y} } from ${I};`;r.push(G);let tt=`${l}: ${p},`;e.push(tt)});let i=`
62
62
  export type Contracts = ContractInstances<typeof contracts>;
63
63
  `;return`${n.join(`
64
64
  `)}
@@ -69,6 +69,10 @@ export const contracts = {
69
69
  ${e.join(`
70
70
  `)}
71
71
  };${o}
72
- `};import{Command as Ut,flags as Q}from"@oclif/command";import{createClarityBin as Bt}from"@clarigen/native-bin";import{resolve as u,relative as Jt,dirname as Lt}from"path";import{mkdir as Rt,writeFile as F}from"fs/promises";import{createContractDocInfo as Nt,generateMarkdown as vt}from"@clarigen/claridocs";import{mkdir as Dt,readFile as St,writeFile as Ot}from"fs/promises";import{relative as _t,resolve as q}from"path";async function H({contractFile:t,contractName:n,docsPath:r,abi:e,dirName:o}){let i=await St(t,{encoding:"utf-8"}),c=Nt({contractSrc:i,abi:e}),s=q(process.cwd(),r,o||"."),a=q(s,`${n}.md`),l=vt({contract:c,contractFile:_t(s,t),contractName:n,abi:e});await Dt(s,{recursive:!0}),await Ot(a,l)}var Mt=async({contractFile:t,outputFolder:n,provider:r,contractAddress:e,dirName:o,contractName:i,docsPath:c})=>{let s=u(process.cwd(),t),a=await M({contractFile:s,provider:r,contractAddress:e,contractName:i}),l=V(a,i),p=W({contractFile:Jt(process.cwd(),s),contractAddress:e,contractName:i}),y=U({contractName:i,abi:a});typeof c<"u"&&await H({contractFile:s,contractName:i,abi:a,docsPath:c,dirName:o});let g=u(n,o||".",i);await Rt(g,{recursive:!0}),await F(u(g,"abi.ts"),y),await F(u(g,"index.ts"),p),await F(u(g,"types.ts"),l)},A=async t=>{let n=await b(t),{contractsDir:r,outputDir:e,contracts:o}=n,i=u(t,e),c=await Bt();for(let l of o){let p=u(t,r,l.file),y=Lt(l.file);await Mt({contractFile:p,outputFolder:i,provider:c,contractAddress:l.address,dirName:y,contractName:l.name,docsPath:n.docs})}let s=K(n),a=u(i,"index.ts");await F(a,s)};import{watch as Wt}from"chokidar";import{basename as Vt}from"path";import{red as Kt,green as X}from"chalk";var qt=nt("ora"),T=class extends Ut{async run(){let{flags:n}=this.parse(T),r=process.cwd();if(n.watch){let e=qt("Generating files").start(),{contractsDir:o}=await b(r),i=Wt([o],{cwd:r});try{await A(r),e.succeed("Finished generating files. Watching for changes.")}catch(c){e.fail(`Error generating files.
73
- ${c.message}`)}i.on("change",async c=>{let s=Vt(c);e.clear(),e.start(`Change detected for ${X(s)}, generating.`);try{await A(r),e.succeed(`Finished generating files for ${X(s)}. Watching for changes.`)}catch(a){let l=a.message;e.fail(`Error after saving ${Kt(s)}.
74
- ${l}`)}}),process.on("SIGINT",async()=>{await i.close(),process.exit()})}else await A(r)}},d=T;d.description="Generate project files",d.strict=!0,d.hidden=!1,d.flags={help:Q.help({char:"h"}),watch:Q.boolean({char:"w",description:"Watch for changes to your contracts"})},d.args=[];export{d as Generate,dt as configFileExists,Ct as configFilePath,B as defaultConfigFile,W as generateIndexFile,M as generateInterface,U as generateInterfaceFile,K as generateProjectIndexFile,V as generateTypesFile,yt as getConfigFile,b as getProjectConfig,f as jsTypeFromAbiType,R as makePureTypes,Ur as run};
72
+ `};import{Command as Wt,flags as Y}from"@oclif/command";import{createClarityBin as Lt}from"@clarigen/native-bin";import{resolve as u,relative as Rt,dirname as Jt}from"path";import{mkdir as Mt,writeFile as F}from"fs/promises";import{createContractDocInfo as vt,generateMarkdown as St}from"@clarigen/claridocs";import{mkdir as Ot,readFile as _t,writeFile as H}from"fs/promises";import{relative as Bt,resolve as T}from"path";async function Q({contractFile:t,contractName:n,docsPath:r,abi:e,dirName:o}){let i=await _t(t,{encoding:"utf-8"}),c=vt({contractSrc:i,abi:e}),s=T(process.cwd(),r,o||"."),a=T(s,`${n}.md`),l=St({contract:c,contractFile:Bt(s,t),contractName:n,abi:e});await Ot(s,{recursive:!0}),await H(a,l)}async function X(t){if(!t.docs)return;let r=`# Contracts
73
+
74
+ ${t.contracts.map(o=>{let i=o.file.replace(".clar",".md");return`- [\`${o.name}\`](${i})`}).join(`
75
+ `)}
76
+ `,e=T(process.cwd(),t.docs,"README.md");await H(e,r)}var Ut=async({contractFile:t,outputFolder:n,provider:r,contractAddress:e,dirName:o,contractName:i,docsPath:c})=>{let s=u(process.cwd(),t),a=await U({contractFile:s,provider:r,contractAddress:e,contractName:i}),l=K(a,i),p=V({contractFile:Rt(process.cwd(),s),contractAddress:e,contractName:i}),y=W({contractName:i,abi:a});typeof c<"u"&&await Q({contractFile:s,contractName:i,abi:a,docsPath:c,dirName:o});let g=u(n,o||".",i);await Mt(g,{recursive:!0}),await F(u(g,"abi.ts"),y),await F(u(g,"index.ts"),p),await F(u(g,"types.ts"),l)},A=async t=>{let n=await b(t),{contractsDir:r,outputDir:e,contracts:o}=n,i=u(t,e),c=await Lt();for(let l of o){let p=u(t,r,l.file),y=Jt(l.file);await Ut({contractFile:p,outputFolder:i,provider:c,contractAddress:l.address,dirName:y,contractName:l.name,docsPath:n.docs})}let s=q(n);await X(n);let a=u(i,"index.ts");await F(a,s)};import{watch as Vt}from"chokidar";import{basename as Kt}from"path";import{red as qt,green as Z}from"chalk";var Ht=ot("ora"),E=class extends Wt{async run(){let{flags:n}=this.parse(E),r=process.cwd();if(n.watch){let e=Ht("Generating files").start(),{contractsDir:o}=await b(r),i=Vt([o],{cwd:r});try{await A(r),e.succeed("Finished generating files. Watching for changes.")}catch(c){e.fail(`Error generating files.
77
+ ${c.message}`)}i.on("change",async c=>{let s=Kt(c);e.clear(),e.start(`Change detected for ${Z(s)}, generating.`);try{await A(r),e.succeed(`Finished generating files for ${Z(s)}. Watching for changes.`)}catch(a){let l=a.message;e.fail(`Error after saving ${qt(s)}.
78
+ ${l}`)}}),process.on("SIGINT",async()=>{await i.close(),process.exit()})}else await A(r)}},d=E;d.description="Generate project files",d.strict=!0,d.hidden=!1,d.flags={help:Y.help({char:"h"}),watch:Y.boolean({char:"w",description:"Watch for changes to your contracts"})},d.args=[];export{d as Generate,$t as configFileExists,yt as configFilePath,L as defaultConfigFile,V as generateIndexFile,U as generateInterface,W as generateInterfaceFile,q as generateProjectIndexFile,K as generateTypesFile,xt as getConfigFile,b as getProjectConfig,f as jsTypeFromAbiType,M as makePureTypes,Vr as run};
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@clarigen/cli",
3
3
  "description": "A CLI for generating a Typescript interface for a Clarity contract.",
4
4
  "author": "Hank Stoever",
5
- "version": "1.0.0-next.15",
5
+ "version": "1.0.0-next.16",
6
6
  "license": "MIT",
7
7
  "types": "./dist/index.d.ts",
8
8
  "main": "./dist/index.js",
@@ -49,9 +49,9 @@
49
49
  "ts-node": "^9.1.1"
50
50
  },
51
51
  "dependencies": {
52
- "@clarigen/claridocs": "1.0.0-next.15",
53
- "@clarigen/core": "1.0.0-next.15",
54
- "@clarigen/native-bin": "1.0.0-next.15",
52
+ "@clarigen/claridocs": "1.0.0-next.16",
53
+ "@clarigen/core": "1.0.0-next.16",
54
+ "@clarigen/native-bin": "1.0.0-next.16",
55
55
  "@ltd/j-toml": "1.12.2",
56
56
  "@oclif/command": "^1.8.0",
57
57
  "@oclif/config": "^1.17.0",
@@ -66,5 +66,5 @@
66
66
  "publishConfig": {
67
67
  "access": "public"
68
68
  },
69
- "gitHead": "e1bfe7ddc0284195f2785b893efbd5d697dece76"
69
+ "gitHead": "cc40e90b2dc188debd134f25fe05b1ef5eb14ff2"
70
70
  }
package/src/docs.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { createContractDocInfo, generateMarkdown } from '@clarigen/claridocs';
2
2
  import { ClarityAbi } from '@clarigen/core';
3
3
  import { mkdir, readFile, writeFile } from 'fs/promises';
4
- import { join, relative, resolve } from 'path';
4
+ import { dirname, join, relative, resolve } from 'path';
5
+ import { ConfigFile } from './config';
5
6
 
6
7
  export async function generateMarkdownDoc({
7
8
  contractFile,
@@ -32,3 +33,18 @@ export async function generateMarkdownDoc({
32
33
 
33
34
  await writeFile(filePath, md);
34
35
  }
36
+
37
+ export async function generateDocsIndex(configFile: ConfigFile) {
38
+ if (!configFile.docs) return;
39
+ const contractLines = configFile.contracts.map((contract) => {
40
+ const fileName = contract.file.replace('.clar', '.md');
41
+ return `- [\`${contract.name}\`](${fileName})`;
42
+ });
43
+ const fileContents = `# Contracts
44
+
45
+ ${contractLines.join('\n')}
46
+ `;
47
+
48
+ const filepath = resolve(process.cwd(), configFile.docs, 'README.md');
49
+ await writeFile(filepath, fileContents);
50
+ }
package/src/utils.ts CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  import { resolve, relative, dirname } from 'path';
13
13
  import { mkdir, writeFile } from 'fs/promises';
14
14
  import { getProjectConfig } from './config';
15
- import { generateMarkdownDoc } from './docs';
15
+ import { generateDocsIndex, generateMarkdownDoc } from './docs';
16
16
 
17
17
  export const generateFilesForContract = async ({
18
18
  contractFile: _contractFile,
@@ -86,6 +86,7 @@ export const generateProject = async (projectPath: string) => {
86
86
  }
87
87
 
88
88
  const indexFile = generateProjectIndexFile(configFile);
89
+ await generateDocsIndex(configFile);
89
90
 
90
91
  const indexPath = resolve(outputFolder, 'index.ts');
91
92
  await writeFile(indexPath, indexFile);