@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.
- package/dist/commands/index.js +30 -30
- package/dist/commands/index.mjs +21 -21
- package/dist/index.d.ts +1 -0
- package/dist/index.js +30 -30
- package/dist/index.mjs +21 -21
- package/package.json +7 -5
- package/src/config.ts +1 -0
- package/src/docs.ts +34 -0
- package/src/utils.ts +14 -0
package/dist/commands/index.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
var
|
|
2
|
-
`,!0,{longer:!0})}async function
|
|
3
|
-
`,!0)}async function
|
|
4
|
-
${
|
|
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
|
|
7
|
-
`} ${o}`}),t.maps.forEach(
|
|
8
|
-
${e}`}),
|
|
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
|
|
12
|
+
`)){let[a,l]=s.split(`
|
|
13
13
|
Near:
|
|
14
|
-
`),u="",
|
|
15
|
-
${
|
|
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
|
-
${
|
|
19
|
-
`)}throw new Error(`Error on ${
|
|
18
|
+
${l}
|
|
19
|
+
`)}throw new Error(`Error on ${r}:
|
|
20
20
|
${JSON.stringify(i.error,null,2)}
|
|
21
|
-
`)}return i.analysis},
|
|
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 ${
|
|
25
|
-
`},
|
|
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: '${
|
|
40
|
+
address: '${r}',
|
|
41
41
|
contractFile: '${t}',
|
|
42
|
-
name: '${
|
|
42
|
+
name: '${n}',
|
|
43
43
|
abi: ${c},
|
|
44
44
|
};
|
|
45
|
-
`},
|
|
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 ${
|
|
48
|
+
export interface ${n}Contract {
|
|
49
49
|
${e}
|
|
50
50
|
}
|
|
51
|
-
`},
|
|
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(
|
|
56
|
-
mnemonic: "${
|
|
57
|
-
balance: ${
|
|
58
|
-
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
|
|
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`${
|
|
63
|
+
`;return`${r.join(`
|
|
64
64
|
`)}
|
|
65
|
-
${
|
|
65
|
+
${n.join(`
|
|
66
66
|
`)}
|
|
67
67
|
${i}
|
|
68
68
|
export const contracts = {
|
|
69
69
|
${e.join(`
|
|
70
70
|
`)}
|
|
71
71
|
};${o}
|
|
72
|
-
`};var
|
|
73
|
-
${c.message}`)}i.on("change",async c=>{let s=(0,
|
|
74
|
-
${
|
|
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});
|
package/dist/commands/index.mjs
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
var
|
|
2
|
-
`,!0,{longer:!0})}async function
|
|
3
|
-
`,!0)}async function O(t,n){let r=await
|
|
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(
|
|
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
|
|
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
|
|
12
|
+
`)){let[a,l]=s.split(`
|
|
13
13
|
Near:
|
|
14
|
-
`),p="",
|
|
15
|
-
${
|
|
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
|
-
${
|
|
18
|
+
${l}
|
|
19
19
|
`)}throw new Error(`Error on ${n}:
|
|
20
20
|
${JSON.stringify(i.error,null,2)}
|
|
21
|
-
`)}return i.analysis},
|
|
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
|
-
`},
|
|
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
|
-
`},
|
|
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
|
-
`},
|
|
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(
|
|
56
|
-
mnemonic: "${
|
|
57
|
-
balance: ${
|
|
58
|
-
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
|
|
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
|
|
73
|
-
${c.message}`)}i.on("change",async c=>{let s=
|
|
74
|
-
${
|
|
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
package/dist/index.js
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
var
|
|
2
|
-
`,!0,{longer:!0})}async function
|
|
3
|
-
`,!0)}async function
|
|
4
|
-
${
|
|
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
|
|
7
|
-
`} ${o}`}),t.maps.forEach(
|
|
8
|
-
${e}`}),
|
|
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
|
|
12
|
+
`)){let[a,l]=s.split(`
|
|
13
13
|
Near:
|
|
14
|
-
`),u="",
|
|
15
|
-
${
|
|
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
|
-
${
|
|
19
|
-
`)}throw new Error(`Error on ${
|
|
18
|
+
${l}
|
|
19
|
+
`)}throw new Error(`Error on ${r}:
|
|
20
20
|
${JSON.stringify(i.error,null,2)}
|
|
21
|
-
`)}return i.analysis},
|
|
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 ${
|
|
25
|
-
`},
|
|
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: '${
|
|
40
|
+
address: '${r}',
|
|
41
41
|
contractFile: '${t}',
|
|
42
|
-
name: '${
|
|
42
|
+
name: '${n}',
|
|
43
43
|
abi: ${c},
|
|
44
44
|
};
|
|
45
|
-
`},
|
|
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 ${
|
|
48
|
+
export interface ${n}Contract {
|
|
49
49
|
${e}
|
|
50
50
|
}
|
|
51
|
-
`},
|
|
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(
|
|
56
|
-
mnemonic: "${
|
|
57
|
-
balance: ${
|
|
58
|
-
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
|
|
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`${
|
|
63
|
+
`;return`${r.join(`
|
|
64
64
|
`)}
|
|
65
|
-
${
|
|
65
|
+
${n.join(`
|
|
66
66
|
`)}
|
|
67
67
|
${i}
|
|
68
68
|
export const contracts = {
|
|
69
69
|
${e.join(`
|
|
70
70
|
`)}
|
|
71
71
|
};${o}
|
|
72
|
-
`};var
|
|
73
|
-
${c.message}`)}i.on("change",async c=>{let s=(0,
|
|
74
|
-
${
|
|
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
|
|
2
|
-
`,!0,{longer:!0})}async function
|
|
3
|
-
`,!0)}async function O(t,n){let r=await
|
|
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(
|
|
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
|
|
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
|
|
12
|
+
`)){let[a,l]=s.split(`
|
|
13
13
|
Near:
|
|
14
|
-
`),p="",
|
|
15
|
-
${
|
|
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
|
-
${
|
|
18
|
+
${l}
|
|
19
19
|
`)}throw new Error(`Error on ${n}:
|
|
20
20
|
${JSON.stringify(i.error,null,2)}
|
|
21
|
-
`)}return i.analysis},
|
|
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
|
-
`},
|
|
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
|
-
`},
|
|
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
|
-
`},
|
|
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(
|
|
56
|
-
mnemonic: "${
|
|
57
|
-
balance: ${
|
|
58
|
-
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
|
|
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
|
|
73
|
-
${c.message}`)}i.on("change",async c=>{let s=
|
|
74
|
-
${
|
|
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.
|
|
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/
|
|
52
|
-
"@clarigen/
|
|
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": "
|
|
69
|
+
"gitHead": "e1bfe7ddc0284195f2785b893efbd5d697dece76"
|
|
68
70
|
}
|
package/src/config.ts
CHANGED
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
|
|