@clarigen/cli 1.0.0-next.11 → 1.0.0-next.15

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