@0xobelisk/sui-common 1.2.0-pre.49 → 1.2.0-pre.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -41,7 +41,7 @@ type DubheMetadata = {
41
41
 
42
42
  declare function schemaGen(rootDir: string, config: DubheConfig, network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet'): Promise<void>;
43
43
 
44
- declare const defineDapp: (config: DubheConfig) => DubheConfig;
44
+ declare const defineConfig: (config: DubheConfig) => DubheConfig;
45
45
 
46
46
  declare function loadConfig(configPath?: string): Promise<unknown>;
47
47
  declare function resolveConfigPath(configPath: string | undefined, toFileURL?: boolean): Promise<string>;
@@ -61,4 +61,4 @@ type SubscribableType = {
61
61
  name?: string;
62
62
  };
63
63
 
64
- export { Component, ComponentType, DubheConfig, DubheMetadata, EmptyComponent, MoveType, SubscribableType, SubscriptionKind, defineDapp, formatAndWriteMove, formatAndWriteTypescript, formatMove, formatTypescript, loadConfig, parseData, posixPath, resolveConfigPath, schemaGen };
64
+ export { Component, ComponentType, DubheConfig, DubheMetadata, EmptyComponent, MoveType, SubscribableType, SubscriptionKind, defineConfig, formatAndWriteMove, formatAndWriteTypescript, formatMove, formatTypescript, loadConfig, parseData, posixPath, resolveConfigPath, schemaGen };
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import G from"prettier";import fe from"prettier-plugin-move-js";async function X(e,t){let s;t&&(s=await G.resolveConfig(t));try{return G.format(e,{plugins:[fe],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...s})}catch(r){let p;return r instanceof Error?p=r.message:p=r,console.log(`Error during output formatting: ${p}`),e}}async function Y(e){return G.format(e,{parser:"typescript"})}import B from"node:fs/promises";import N from"node:path";import q from"debug";var W=q("dubhe:common"),ve=q("dubhe:common");W.log=console.debug.bind(console);ve.log=console.error.bind(console);var L=W.extend("codegen"),he=W.extend("codegen");L.log=console.debug.bind(console);he.log=console.error.bind(console);async function $(e,t,s){let r=await X(e),p=` // Copyright (c) Obelisk Labs, Inc.
1
+ import G from"prettier";import fe from"prettier-plugin-move-js";async function X(e,t){let s;t&&(s=await G.resolveConfig(t));try{return G.format(e,{plugins:[fe],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...s})}catch(r){let o;return r instanceof Error?o=r.message:o=r,console.log(`Error during output formatting: ${o}`),e}}async function Y(e){return G.format(e,{parser:"typescript"})}import R from"node:fs/promises";import N from"node:path";import q from"debug";var W=q("dubhe:common"),ve=q("dubhe:common");W.log=console.debug.bind(console);ve.log=console.error.bind(console);var L=W.extend("codegen"),he=W.extend("codegen");L.log=console.debug.bind(console);he.log=console.error.bind(console);async function $(e,t,s){let r=await X(e),o=` // Copyright (c) Obelisk Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  #[allow(unused_use)]
4
4
 
5
5
  /* Autogenerated file. Do not edit manually. */
6
6
 
7
- `,a="#[test_only]",b=p+r,g="#[allow(lint(share_owned))]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?b=r:t.includes("init")?b=a+r:t.includes("genesis")&&(b=g+r),await B.mkdir(N.dirname(t),{recursive:!0}),await B.writeFile(t,b),L(`${s}: ${t}`)}async function Qe(e,t,s){let r=await Y(e);await B.mkdir(N.dirname(t),{recursive:!0}),await B.writeFile(t,r),L(`${s}: ${t}`)}function Ye(e){return e.replace(/\\/g,"/")}import{existsSync as w}from"fs";import F from"fs";function z(e){F.existsSync(e)&&(F.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;F.lstatSync(s).isDirectory()?z(s):F.unlinkSync(s)}),F.rmdirSync(e))}var ee={name:"@0xobelisk/sui-common",version:"1.2.0-pre.49",description:"Common low level logic shared between packages",keywords:["sui","obelisk labs","move","blockchain"],type:"module",author:"team@obelisk.build",homepage:"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme",bugs:"https://github.com/0xobelisk/dubhe/issues",repository:{type:"git",url:"https://github.com/0xobelisk/dubhe.git"},license:"Apache-2.0",publishConfig:{access:"public"},engines:{node:">=18"},exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},typesVersions:{"*":{index:["./src/index.ts"]}},types:"./dist/index.d.ts",scripts:{build:"pnpm run build:js","build:js":"tsup && chmod +x ./dist/index.js",clean:"pnpm run clean:js","clean:js":"rimraf dist",dev:"tsup --watch",lint:"eslint . --ext .ts",test:"vitest",format:"prettier --write .","format:check":"prettier --check .","type-check":"tsc --noEmit",validate:"pnpm format:check && pnpm type-check"},dependencies:{chalk:"^5.0.1",debug:"^4.3.4",dotenv:"^16.0.3",ejs:"^3.1.8",esbuild:"^0.17.15",execa:"^7.0.0","find-up":"^6.3.0",glob:"^8.0.3",path:"^0.12.7",prettier:"^3.1.1","prettier-plugin-move-js":"^0.0.5","prettier-plugin-rust":"^0.1.9","prettier-plugin-solidity":"^1.1.2",typescript:"5.1.6",yargs:"^17.7.1",zod:"^3.22.3","zod-validation-error":"^1.3.0"},devDependencies:{"@types/debug":"^4.1.12","@types/ejs":"^3.1.1","@types/glob":"^7.2.0","@types/node":"^18.15.11","@types/yargs":"^17.0.10",tsup:"^6.7.0",tsx:"^3.12.6",vitest:"^2.1.3",eslint:"^8.56.0","eslint-config-prettier":"^9.1.0",prettier:"3.3.3"}};async function te(e,t){console.log(`
7
+ `,i="#[test_only]",b=o+r,y="#[allow(lint(share_owned))]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?b=r:t.includes("init")?b=i+r:t.includes("genesis")&&(b=y+r),await R.mkdir(N.dirname(t),{recursive:!0}),await R.writeFile(t,b),L(`${s}: ${t}`)}async function Qe(e,t,s){let r=await Y(e);await R.mkdir(N.dirname(t),{recursive:!0}),await R.writeFile(t,r),L(`${s}: ${t}`)}function Ye(e){return e.replace(/\\/g,"/")}import{existsSync as x}from"fs";import F from"fs";function z(e){F.existsSync(e)&&(F.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;F.lstatSync(s).isDirectory()?z(s):F.unlinkSync(s)}),F.rmdirSync(e))}var ee={name:"@0xobelisk/sui-common",version:"1.2.0-pre.50",description:"Common low level logic shared between packages",keywords:["sui","obelisk labs","move","blockchain"],type:"module",author:"team@obelisk.build",homepage:"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme",bugs:"https://github.com/0xobelisk/dubhe/issues",repository:{type:"git",url:"https://github.com/0xobelisk/dubhe.git"},license:"Apache-2.0",publishConfig:{access:"public"},engines:{node:">=18"},exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},typesVersions:{"*":{index:["./src/index.ts"]}},types:"./dist/index.d.ts",scripts:{build:"pnpm run build:js","build:js":"tsup && chmod +x ./dist/index.js",clean:"pnpm run clean:js","clean:js":"rimraf dist",dev:"tsup --watch",lint:"eslint . --ext .ts",test:"vitest",format:"prettier --write .","format:check":"prettier --check .","type-check":"tsc --noEmit",validate:"pnpm format:check && pnpm type-check"},dependencies:{chalk:"^5.0.1",debug:"^4.3.4",dotenv:"^16.0.3",ejs:"^3.1.8",esbuild:"^0.17.15",execa:"^7.0.0","find-up":"^6.3.0",glob:"^8.0.3",path:"^0.12.7",prettier:"^3.1.1","prettier-plugin-move-js":"^0.0.5","prettier-plugin-rust":"^0.1.9","prettier-plugin-solidity":"^1.1.2",typescript:"5.1.6",yargs:"^17.7.1",zod:"^3.22.3","zod-validation-error":"^1.3.0"},devDependencies:{"@types/debug":"^4.1.12","@types/ejs":"^3.1.1","@types/glob":"^7.2.0","@types/node":"^18.15.11","@types/yargs":"^17.0.10",tsup:"^6.7.0",tsx:"^3.12.6",vitest:"^2.1.3",eslint:"^8.56.0","eslint-config-prettier":"^9.1.0",prettier:"3.3.3"}};async function te(e,t){console.log(`
8
8
  \u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/src/${e.name}/Move.toml`);let s=`[package]
9
9
  name = "${e.name}"
10
10
  version = "1.0.0"
@@ -53,11 +53,11 @@ use std::type_name;
53
53
  address::from_ascii_bytes(package_id_str.as_bytes())
54
54
  }
55
55
  }
56
- `;await $(s,t,"formatAndWriteMove")}import{existsSync as oe}from"fs";import pe from"node:fs/promises";async function ie(e,t){oe(`${t}/src/${e.name}/sources/systems`)||await pe.mkdir(`${t}/src/${e.name}/sources/systems`,{recursive:!0}),oe(`${t}/src/${e.name}/sources/tests`)||await pe.mkdir(`${t}/src/${e.name}/sources/tests`,{recursive:!0})}async function ae(e,t,s){console.log(`
56
+ `;await $(s,t,"formatAndWriteMove")}import{existsSync as pe}from"fs";import oe from"node:fs/promises";async function ae(e,t){pe(`${t}/src/${e.name}/sources/systems`)||await oe.mkdir(`${t}/src/${e.name}/sources/systems`,{recursive:!0}),pe(`${t}/src/${e.name}/sources/tests`)||await oe.mkdir(`${t}/src/${e.name}/sources/tests`,{recursive:!0})}async function ie(e,t,s){console.log(`
57
57
  \u{1F4E6} Starting Schema Error Generation...`);let r=`module ${e}::errors {
58
- ${Object.entries(t).map(([p,a])=>(console.log(` \u2514\u2500 ${p}: ${a}`),`#[error]
59
- const ${p.toUpperCase()}: vector<u8> = b"${a}";
60
- public fun ${p}_error(condition: bool) { assert!(condition, ${p.toUpperCase()}) }
58
+ ${Object.entries(t).map(([o,i])=>(console.log(` \u2514\u2500 ${o}: ${i}`),`#[error]
59
+ const ${o.toUpperCase()}: vector<u8> = b"${i}";
60
+ public fun ${o}_error(condition: bool) { assert!(condition, ${o.toUpperCase()}) }
61
61
  `)).join(`
62
62
  `)}
63
63
  }`;await $(r,`${s}/src/${e}/sources/codegen/errors.move`,"formatAndWriteMove")}async function ce(e,t){let s=`module ${e.name}::init_test {
@@ -77,14 +77,14 @@ use std::type_name;
77
77
  }
78
78
  }
79
79
  `;await $(s,t,"formatAndWriteMove")}async function V(e,t){console.log(`
80
- \u{1F4E6} Starting Components Generation...`);for(let[s,r]of Object.entries(e.components)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(r)}`),typeof r=="string"){let a=De(e.name,s,r,"Onchain");await $(a,`${t}/${s}.move`,"formatAndWriteMove");continue}if(Object.keys(r).length===0){let a=le(e.name,s,{fields:{entity_id:"address"},keys:["entity_id"],offchain:!1});await $(a,`${t}/${s}.move`,"formatAndWriteMove");continue}if(r.keys||(r.keys=["entity_id"],r.fields.entity_id||(r.fields={entity_id:"address",...r.fields})),r.keys&&r.keys.length>1)throw new Error(`Component '${s}' can only have one key, but found ${r.keys.length} keys: ${r.keys.join(", ")}`);let p=le(e.name,s,r);await $(p,`${t}/${s}.move`,"formatAndWriteMove")}}function De(e,t,s,r="Onchain"){let p=!C(s),a=p?`${de(s)}`:"";return`module ${e}::${t} {
80
+ \u{1F4E6} Starting Components Generation...`);for(let[s,r]of Object.entries(e.components)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(r)}`),typeof r=="string"){let i=De(e.name,s,r,"Onchain");await $(i,`${t}/${s}.move`,"formatAndWriteMove");continue}if(Object.keys(r).length===0){let i=le(e.name,s,{fields:{entity_id:"address"},keys:["entity_id"],offchain:!1});await $(i,`${t}/${s}.move`,"formatAndWriteMove");continue}if(r.keys||(r.keys=["entity_id"],r.fields.entity_id||(r.fields={entity_id:"address",...r.fields})),r.keys&&r.keys.length>1)throw new Error(`Component '${s}' can only have one key, but found ${r.keys.length} keys: ${r.keys.join(", ")}`);let o=le(e.name,s,r);await $(o,`${t}/${s}.move`,"formatAndWriteMove")}}function De(e,t,s,r="Onchain"){let o=!C(s),i=o?`${de(s)}`:"";return`module ${e}::${t} {
81
81
  use sui::bcs::{to_bytes};
82
82
  use dubhe::table_id;
83
83
  use dubhe::dapp_service::{Self, DappHub};
84
84
  use ${e}::dapp_key;
85
85
  use ${e}::dapp_key::DappKey;
86
- ${p?` use ${e}::${a};
87
- use ${e}::${a}::{${s}};`:""}
86
+ ${o?` use ${e}::${i};
87
+ use ${e}::${i}::{${s}};`:""}
88
88
 
89
89
  const TABLE_NAME: vector<u8> = b"${t}";
90
90
 
@@ -140,7 +140,7 @@ ${p?` use ${e}::${a};
140
140
  key_tuple.push_back(to_bytes(&entity_id));
141
141
  let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
142
142
  let mut bsc_type = sui::bcs::new(value_tuple);
143
- ${p?`let value = ${e}::${a}::decode(&mut bsc_type);`:`let value = sui::bcs::peel_${M(s)}(&mut bsc_type);`}
143
+ ${o?`let value = ${e}::${i}::decode(&mut bsc_type);`:`let value = sui::bcs::peel_${M(s)}(&mut bsc_type);`}
144
144
  (value)
145
145
  }
146
146
 
@@ -153,10 +153,10 @@ ${p?` use ${e}::${a};
153
153
 
154
154
  public fun encode(value: ${s}): vector<vector<u8>> {
155
155
  let mut value_tuple = vector::empty();
156
- value_tuple.push_back(${p?`${e}::${a}::encode(value)`:"to_bytes(&value)"});
156
+ value_tuple.push_back(${o?`${e}::${i}::encode(value)`:"to_bytes(&value)"});
157
157
  value_tuple
158
158
  }
159
- }`}function de(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function le(e,t,s){let r=s.fields,p=s.keys||["entity_id"],b=s.offchain||!1?"Offchain":"Onchain",g=Object.keys(r).every(u=>p.includes(u)),m=Object.entries(r).filter(([u])=>!p.includes(u)).map(([u])=>u),c=m.length===1,h=Object.entries(r).filter(([u,f])=>!C(f)).map(([u,f])=>({type:f,module:`${de(f)}`})).filter((u,f,H)=>H.findIndex(T=>T.type===u.type)===f),k=xe(e,t,r,p,!g&&!c,h,b);if(g||c)return`module ${e}::${t} {
159
+ }`}function de(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function le(e,t,s){let r=s.fields,o=s.keys||["entity_id"],b=s.offchain||!1?"Offchain":"Onchain",y=Object.keys(r).every(u=>o.includes(u)),m=Object.entries(r).filter(([u])=>!o.includes(u)).map(([u])=>u),c=m.length===1,h=Object.entries(r).filter(([u,f])=>!C(f)).map(([u,f])=>({type:f,module:`${de(f)}`})).filter((u,f,H)=>H.findIndex(T=>T.type===u.type)===f),k=we(e,t,r,o,!y&&!c,h,b);if(y||c)return`module ${e}::${t} {
160
160
  use sui::bcs::{to_bytes};
161
161
  use dubhe::table_id;
162
162
  use dubhe::dapp_service::{Self, DappHub};
@@ -169,7 +169,7 @@ ${h.length>0?h.map(u=>` use ${e}::${u.module};
169
169
  const TABLE_NAME: vector<u8> = b"${t}";
170
170
 
171
171
  ${k}
172
- }`;let o=m.map(u=>` ${u}: ${r[u]},`).join(`
172
+ }`;let p=m.map(u=>` ${u}: ${r[u]},`).join(`
173
173
  `),l=m.map(u=>`${u}: ${r[u]}`).join(", "),S=m.map(u=>` ${u},`).join(`
174
174
  `),O=m.map(u=>` public fun ${u}(self: &${D(t)}): ${r[u]} {
175
175
  self.${u}
@@ -192,7 +192,7 @@ ${h.length>0?h.map(u=>` use ${e}::${u.module};
192
192
  const TABLE_NAME: vector<u8> = b"${t}";
193
193
 
194
194
  public struct ${D(t)} has copy, drop, store {
195
- ${o}
195
+ ${p}
196
196
  }
197
197
 
198
198
  public fun new(${l}): ${D(t)} {
@@ -206,7 +206,7 @@ ${O}
206
206
  ${E}
207
207
 
208
208
  ${k}
209
- }`}function C(e){return["address","bool","u8","u32","u64","u128","u256","vector<address>","vector<bool>","vector<u8>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>"].includes(e)}function xe(e,t,s,r,p=!0,a=[],b="Onchain"){let g=r.reduce((n,i)=>({...n,[i]:s[i]}),{}),_=Object.entries(s).filter(([n])=>!r.includes(n)).reduce((n,[i,d])=>({...n,[i]:d}),{}),m=Object.keys(g),c=Object.keys(_),h=Object.keys(s).every(n=>r.includes(n)),k=c.length===1,o=r.length>0?r.map(n=>`${n}: ${s[n]}`).join(", "):"",l=r.length>0?`let mut key_tuple = vector::empty();
209
+ }`}function C(e){return["address","bool","u8","u32","u64","u128","u256","vector<address>","vector<bool>","vector<u8>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>"].includes(e)}function we(e,t,s,r,o=!0,i=[],b="Onchain"){let y=r.reduce((n,a)=>({...n,[a]:s[a]}),{}),_=Object.entries(s).filter(([n])=>!r.includes(n)).reduce((n,[a,d])=>({...n,[a]:d}),{}),m=Object.keys(y),c=Object.keys(_),h=Object.keys(s).every(n=>r.includes(n)),k=c.length===1,p=r.length>0?r.map(n=>`${n}: ${s[n]}`).join(", "):"",l=r.length>0?`let mut key_tuple = vector::empty();
210
210
  ${r.map(n=>`key_tuple.push_back(to_bytes(&${n}));`).join(`
211
211
  `)}`:"let key_tuple = vector::empty();",S=` public fun get_table_id(): vector<u8> {
212
212
  table_id::encode(table_id::${b==="Offchain"?"offchain_table_type":"onchain_table_type"}(), TABLE_NAME)
@@ -239,99 +239,99 @@ ${k}
239
239
  get_value_names(),
240
240
  ctx
241
241
  );
242
- }`,E=` public fun has(dapp_hub: &DappHub${o?", "+o:""}): bool {
242
+ }`,E=` public fun has(dapp_hub: &DappHub${p?", "+p:""}): bool {
243
243
  ${l}
244
244
  dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
245
245
  }
246
246
 
247
- public fun ensure_has(dapp_hub: &DappHub${o?", "+o:""}) {
247
+ public fun ensure_has(dapp_hub: &DappHub${p?", "+p:""}) {
248
248
  ${l}
249
249
  dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
250
250
  }
251
251
 
252
- public fun ensure_not_has(dapp_hub: &DappHub${o?", "+o:""}) {
252
+ public fun ensure_not_has(dapp_hub: &DappHub${p?", "+p:""}) {
253
253
  ${l}
254
254
  dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
255
255
  }
256
256
 
257
- ${k?"":c.map((n,i)=>` public fun has_${n}(dapp_hub: &DappHub${o?", "+o:""}): bool {
257
+ ${k?"":c.map((n,a)=>` public fun has_${n}(dapp_hub: &DappHub${p?", "+p:""}): bool {
258
258
  ${l}
259
- dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${i})
259
+ dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
260
260
  }
261
261
 
262
- public fun ensure_has_${n}(dapp_hub: &DappHub${o?", "+o:""}) {
262
+ public fun ensure_has_${n}(dapp_hub: &DappHub${p?", "+p:""}) {
263
263
  ${l}
264
- dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${i})
264
+ dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
265
265
  }
266
266
 
267
- public fun ensure_not_has_${n}(dapp_hub: &DappHub${o?", "+o:""}) {
267
+ public fun ensure_not_has_${n}(dapp_hub: &DappHub${p?", "+p:""}) {
268
268
  ${l}
269
- dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${i})
269
+ dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
270
270
  }`).join(`
271
271
 
272
- `)}`,u=` public(package) fun delete(dapp_hub: &mut DappHub${o?", "+o:""}) {
272
+ `)}`,u=` public(package) fun delete(dapp_hub: &mut DappHub${p?", "+p:""}) {
273
273
  ${l}
274
274
  dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);
275
- }`,f=k?"":c.map(n=>{let i=c.indexOf(n),d=s[n],y=!C(d),v=y?a.find(P=>P.type===d):null;return` public fun get_${n}(dapp_hub: &DappHub${o?", "+o:""}): ${d} {
275
+ }`,f=k?"":c.map(n=>{let a=c.indexOf(n),d=s[n],g=!C(d),v=g?i.find(P=>P.type===d):null;return` public fun get_${n}(dapp_hub: &DappHub${p?", "+p:""}): ${d} {
276
276
  ${l}
277
- let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${i});
277
+ let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a});
278
278
  let mut bsc_type = sui::bcs::new(value);
279
- ${y?`let ${n} = ${e}::${v?.module}::decode(&mut bsc_type);`:`let ${n} = sui::bcs::peel_${M(d)}(&mut bsc_type);`}
279
+ ${g?`let ${n} = ${e}::${v?.module}::decode(&mut bsc_type);`:`let ${n} = sui::bcs::peel_${M(d)}(&mut bsc_type);`}
280
280
  ${n}
281
281
  }
282
282
 
283
- public(package) fun set_${n}(dapp_hub: &mut DappHub${o?", "+o:""}, ${n}: ${d}) {
283
+ public(package) fun set_${n}(dapp_hub: &mut DappHub${p?", "+p:""}, ${n}: ${d}) {
284
284
  ${l}
285
- let value = ${y?`${e}::${v?.module}::encode(${n})`:`to_bytes(&${n})`};
286
- dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${i}, value);
285
+ let value = ${g?`${e}::${v?.module}::encode(${n})`:`to_bytes(&${n})`};
286
+ dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${a}, value);
287
287
  }`}).join(`
288
288
 
289
- `),H=h?` public(package) fun set(dapp_hub: &mut DappHub${o?", "+o:""}) {
289
+ `),H=h?` public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}) {
290
290
  ${l}
291
291
  let value_tuple = vector::empty();
292
292
  dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
293
- }`:k?` public fun get(dapp_hub: &DappHub${o?", "+o:""}): ${Object.values(_)[0]} {
293
+ }`:k?` public fun get(dapp_hub: &DappHub${p?", "+p:""}): ${Object.values(_)[0]} {
294
294
  ${l}
295
295
  let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);
296
296
  let mut bsc_type = sui::bcs::new(value);
297
- ${C(Object.values(_)[0])?`let value = sui::bcs::peel_${M(Object.values(_)[0])}(&mut bsc_type);`:`let value = ${e}::${a.find(n=>n.type===Object.values(_)[0])?.module}::decode(&mut bsc_type);`}
297
+ ${C(Object.values(_)[0])?`let value = sui::bcs::peel_${M(Object.values(_)[0])}(&mut bsc_type);`:`let value = ${e}::${i.find(n=>n.type===Object.values(_)[0])?.module}::decode(&mut bsc_type);`}
298
298
  value
299
299
  }
300
300
 
301
- public(package) fun set(dapp_hub: &mut DappHub${o?", "+o:""}, value: ${Object.values(_)[0]}) {
301
+ public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}, value: ${Object.values(_)[0]}) {
302
302
  ${l}
303
303
  let value_tuple = encode(value);
304
304
  dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
305
- }`:` public fun get(dapp_hub: &DappHub${o?", "+o:""}): (${Object.values(_).join(", ")}) {
305
+ }`:` public fun get(dapp_hub: &DappHub${p?", "+p:""}): (${Object.values(_).join(", ")}) {
306
306
  ${l}
307
307
  let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
308
308
  let mut bsc_type = sui::bcs::new(value_tuple);
309
- ${c.map(n=>{let i=s[n],d=!C(i),y=d?a.find(v=>v.type===i):null;return`let ${n} = ${d?`${e}::${y?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${M(i)}(&mut bsc_type)`};`}).join(`
309
+ ${c.map(n=>{let a=s[n],d=!C(a),g=d?i.find(v=>v.type===a):null;return`let ${n} = ${d?`${e}::${g?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${M(a)}(&mut bsc_type)`};`}).join(`
310
310
  `)}
311
311
  (${c.join(", ")})
312
312
  }
313
313
 
314
- public(package) fun set(dapp_hub: &mut DappHub${o?", "+o:""}, ${c.map(n=>`${n}: ${s[n]}`).join(", ")}) {
314
+ public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}, ${c.map(n=>`${n}: ${s[n]}`).join(", ")}) {
315
315
  ${l}
316
316
  let value_tuple = encode(${c.join(", ")});
317
317
  dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
318
- }`,T=p?` public fun get_struct(dapp_hub: &DappHub${o?", "+o:""}): ${D(t)} {
318
+ }`,T=o?` public fun get_struct(dapp_hub: &DappHub${p?", "+p:""}): ${D(t)} {
319
319
  ${l}
320
320
  let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
321
321
  decode(value_tuple)
322
322
  }
323
323
 
324
- public(package) fun set_struct(dapp_hub: &mut DappHub${o?", "+o:""}, ${t}: ${D(t)}) {
324
+ public(package) fun set_struct(dapp_hub: &mut DappHub${p?", "+p:""}, ${t}: ${D(t)}) {
325
325
  ${l}
326
326
  let value_tuple = encode_struct(${t});
327
327
  dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
328
328
  }`:"",I=k?` public fun encode(value: ${Object.values(_)[0]}): vector<vector<u8>> {
329
329
  let mut value_tuple = vector::empty();
330
- value_tuple.push_back(${C(Object.values(_)[0])?"to_bytes(&value)":`${e}::${a.find(n=>n.type===Object.values(_)[0])?.module}::encode(value)`});
330
+ value_tuple.push_back(${C(Object.values(_)[0])?"to_bytes(&value)":`${e}::${i.find(n=>n.type===Object.values(_)[0])?.module}::encode(value)`});
331
331
  value_tuple
332
- }`:p?` public fun encode(${c.map(n=>`${n}: ${s[n]}`).join(", ")}): vector<vector<u8>> {
332
+ }`:o?` public fun encode(${c.map(n=>`${n}: ${s[n]}`).join(", ")}): vector<vector<u8>> {
333
333
  let mut value_tuple = vector::empty();
334
- ${c.map(n=>{let i=s[n],d=!C(i),y=d?a.find(v=>v.type===i):null;return`value_tuple.push_back(${d?`${e}::${y?.module}::encode(${n})`:`to_bytes(&${n})`});`}).join(`
334
+ ${c.map(n=>{let a=s[n],d=!C(a),g=d?i.find(v=>v.type===a):null;return`value_tuple.push_back(${d?`${e}::${g?.module}::encode(${n})`:`to_bytes(&${n})`});`}).join(`
335
335
  `)}
336
336
  value_tuple
337
337
  }
@@ -342,7 +342,7 @@ ${k?"":c.map((n,i)=>` public fun has_${n}(dapp_hub: &DappHub${o?", "+o:""}):
342
342
 
343
343
  public fun decode(data: vector<u8>): ${D(t)} {
344
344
  let mut bsc_type = sui::bcs::new(data);
345
- ${c.map(n=>{let i=s[n],d=!C(i),y=d?a.find(v=>v.type===i):null;return`let ${n} = ${d?`${e}::${y?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${M(i)}(&mut bsc_type)`};`}).join(`
345
+ ${c.map(n=>{let a=s[n],d=!C(a),g=d?i.find(v=>v.type===a):null;return`let ${n} = ${d?`${e}::${g?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${M(a)}(&mut bsc_type)`};`}).join(`
346
346
  `)}
347
347
  ${D(t)} {
348
348
  ${c.map(n=>`${n},`).join(`
@@ -364,8 +364,8 @@ ${T}
364
364
 
365
365
  ${I}`}function D(e){return e.split("_").map((t,s)=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function M(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":`vec_${M(t)}`}switch(e){case"bool":return"bool";case"u8":return"u8";case"u32":return"u32";case"u64":return"u64";case"u128":return"u128";case"u256":return"u256";case"address":return"address";default:return e}}async function _e(e,t){let s=Object.keys(e.components||{}).map(b=>` ${b}::register_table(dapp_hub, ctx);`).join(`
366
366
  `),r=Object.keys(e.resources||{}).map(b=>` ${b}::register_table(dapp_hub, ctx);`).join(`
367
- `),p=[s,r].filter(b=>b.trim()!=="").join(`
368
- `),a=`module ${e.name}::genesis {
367
+ `),o=[s,r].filter(b=>b.trim()!=="").join(`
368
+ `),i=`module ${e.name}::genesis {
369
369
  use sui::clock::Clock;
370
370
  use dubhe::dapp_service::{Self, DappHub};
371
371
  use ${e.name}::dapp_key;
@@ -380,22 +380,32 @@ ${I}`}function D(e){return e.split("_").map((t,s)=>/^\d+$/.test(t)?t:t.charAt(0)
380
380
  dapp_service::create_dapp(dapp_hub, dapp_key, b"${e.name}", b"${e.description}", clock, ctx);
381
381
 
382
382
  // Register tables
383
- ${p}
383
+ ${o}
384
384
 
385
385
  // Logic that needs to be automated once the contract is deployed
386
386
  ${e.name}::deploy_hook::run(dapp_hub, ctx);
387
387
  }
388
+
389
+ public(package) fun upgrade(dapp_hub: &mut DappHub, new_package_id: address, new_version: u32, _ctx: &mut TxContext) {
390
+ // Upgrade Dapp
391
+ let dapp_key = dapp_key::new();
392
+ dapp_service::upgrade_dapp(dapp_hub, dapp_key, new_package_id, new_version);
393
+ // Register new tables
394
+ // ==========================================
395
+
396
+ // ==========================================
397
+ }
388
398
  }
389
- `;await $(a,t,"formatAndWriteMove")}function be(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}async function $e(e,t){if(console.log(`
390
- \u{1F4E6} Starting Enums Generation...`),!!e.enums)for(let[s,r]of Object.entries(e.enums)){console.log(` \u2514\u2500 ${s}: ${JSON.stringify(r)}`);let p=[...r].sort((b,g)=>b.localeCompare(g)),a=we(e.name,s,p);await $(a,`${t}/${be(s)}.move`,"formatAndWriteMove")}}function we(e,t,s){let r=s.map(p=>p.charAt(0).toUpperCase()+p.slice(1)).join(",");return`module ${e}::${be(t)} {
399
+ `;await $(i,t,"formatAndWriteMove")}function be(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}async function $e(e,t){if(console.log(`
400
+ \u{1F4E6} Starting Enums Generation...`),!!e.enums)for(let[s,r]of Object.entries(e.enums)){console.log(` \u2514\u2500 ${s}: ${JSON.stringify(r)}`);let o=[...r].sort((b,y)=>b.localeCompare(y)),i=xe(e.name,s,o);await $(i,`${t}/${be(s)}.move`,"formatAndWriteMove")}}function xe(e,t,s){let r=s.map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join(",");return`module ${e}::${be(t)} {
391
401
  use sui::bcs::{BCS, to_bytes, peel_enum_tag};
392
402
 
393
403
  public enum ${t} has copy, drop, store {
394
404
  ${r}
395
405
  }
396
406
 
397
- ${s.map(p=>` public fun new_${p.toLowerCase()}(): ${t} {
398
- ${t}::${p.charAt(0).toUpperCase()+p.slice(1)}
407
+ ${s.map(o=>` public fun new_${o.toLowerCase()}(): ${t} {
408
+ ${t}::${o.charAt(0).toUpperCase()+o.slice(1)}
399
409
  }`).join(`
400
410
 
401
411
  `)}
@@ -406,20 +416,20 @@ ${s.map(p=>` public fun new_${p.toLowerCase()}(): ${t} {
406
416
 
407
417
  public fun decode(bytes: &mut BCS): ${t} {
408
418
  match(peel_enum_tag(bytes)) {
409
- ${s.map((p,a)=>` ${a} => ${t}::${p.charAt(0).toUpperCase()+p.slice(1)},`).join(`
419
+ ${s.map((o,i)=>` ${i} => ${t}::${o.charAt(0).toUpperCase()+o.slice(1)},`).join(`
410
420
  `)}
411
421
  _ => abort,
412
422
  }
413
423
  }
414
424
  }`}async function J(e,t){console.log(`
415
- \u{1F4E6} Starting Resources Generation...`);for(let[s,r]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(r)}`),typeof r=="string"){let g=Ce(e.name,s,r,"Onchain");await $(g,`${t}/${s}.move`,"formatAndWriteMove");continue}if(!r.fields||Object.keys(r.fields).length===0)throw new Error(`Resource '${s}' must have fields defined, but found empty object`);r.keys||(r.keys=[]);let a=r.offchain||!1?"Offchain":"Onchain",b=Ae(e.name,s,r);await $(b,`${t}/${s}.move`,"formatAndWriteMove")}}function Ce(e,t,s,r="Onchain"){let p=!A(s),a=p?`${me(s)}`:"";return`module ${e}::${t} {
425
+ \u{1F4E6} Starting Resources Generation...`);for(let[s,r]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(r)}`),typeof r=="string"){let y=Ce(e.name,s,r,"Onchain");await $(y,`${t}/${s}.move`,"formatAndWriteMove");continue}if(!r.fields||Object.keys(r.fields).length===0)throw new Error(`Resource '${s}' must have fields defined, but found empty object`);r.keys||(r.keys=[]);let i=r.offchain||!1?"Offchain":"Onchain",b=Ae(e.name,s,r);await $(b,`${t}/${s}.move`,"formatAndWriteMove")}}function Ce(e,t,s,r="Onchain"){let o=!A(s),i=o?`${me(s)}`:"";return`module ${e}::${t} {
416
426
  use sui::bcs::{to_bytes};
417
427
  use dubhe::table_id;
418
428
  use dubhe::dapp_service::{Self, DappHub};
419
429
  use ${e}::dapp_key;
420
430
  use ${e}::dapp_key::DappKey;
421
- ${p?` use ${e}::${a};
422
- use ${e}::${a}::{${s}};`:""}
431
+ ${o?` use ${e}::${i};
432
+ use ${e}::${i}::{${s}};`:""}
423
433
 
424
434
  const TABLE_NAME: vector<u8> = b"${t}";
425
435
 
@@ -472,7 +482,7 @@ ${p?` use ${e}::${a};
472
482
  let key_tuple = vector::empty();
473
483
  let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
474
484
  let mut bsc_type = sui::bcs::new(value_tuple);
475
- ${p?`let value = ${e}::${a}::decode(&mut bsc_type);`:`let value = sui::bcs::peel_${K(s)}(&mut bsc_type);`}
485
+ ${o?`let value = ${e}::${i}::decode(&mut bsc_type);`:`let value = sui::bcs::peel_${K(s)}(&mut bsc_type);`}
476
486
  (value)
477
487
  }
478
488
 
@@ -484,10 +494,10 @@ ${p?` use ${e}::${a};
484
494
 
485
495
  public fun encode(value: ${s}): vector<vector<u8>> {
486
496
  let mut value_tuple = vector::empty();
487
- value_tuple.push_back(${p?`${e}::${a}::encode(value)`:"to_bytes(&value)"});
497
+ value_tuple.push_back(${o?`${e}::${i}::encode(value)`:"to_bytes(&value)"});
488
498
  value_tuple
489
499
  }
490
- }`}function me(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function Ae(e,t,s){let r=s.fields,p=s.keys||[],b=s.offchain||!1?"Offchain":"Onchain",g=Object.keys(r).every(u=>p.includes(u)),_=Object.entries(r).filter(([u])=>!p.includes(u)),m=_.map(([u])=>u),c=m.length===1,h=_.filter(([u,f])=>!A(f)).map(([u,f])=>({type:f,module:`${me(f)}`})).filter((u,f,H)=>H.findIndex(T=>T.type===u.type)===f),k=je(e,t,r,p,!g&&!c,h,b);if(g||c)return`module ${e}::${t} {
500
+ }`}function me(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function Ae(e,t,s){let r=s.fields,o=s.keys||[],b=s.offchain||!1?"Offchain":"Onchain",y=Object.keys(r).every(u=>o.includes(u)),_=Object.entries(r).filter(([u])=>!o.includes(u)),m=_.map(([u])=>u),c=m.length===1,h=_.filter(([u,f])=>!A(f)).map(([u,f])=>({type:f,module:`${me(f)}`})).filter((u,f,H)=>H.findIndex(T=>T.type===u.type)===f),k=je(e,t,r,o,!y&&!c,h,b);if(y||c)return`module ${e}::${t} {
491
501
  use sui::bcs::{to_bytes};
492
502
  use dubhe::table_id;
493
503
  use dubhe::dapp_service::{Self, DappHub};
@@ -500,13 +510,13 @@ ${h.length>0?h.map(u=>` use ${e}::${u.module};
500
510
  const TABLE_NAME: vector<u8> = b"${t}";
501
511
 
502
512
  ${k}
503
- }`;let o=m.map(u=>` ${u}: ${r[u]},`).join(`
513
+ }`;let p=m.map(u=>` ${u}: ${r[u]},`).join(`
504
514
  `),l=m.map(u=>`${u}: ${r[u]}`).join(", "),S=m.map(u=>` ${u},`).join(`
505
- `),O=m.map(u=>` public fun ${u}(self: &${x(t)}): ${r[u]} {
515
+ `),O=m.map(u=>` public fun ${u}(self: &${w(t)}): ${r[u]} {
506
516
  self.${u}
507
517
  }`).join(`
508
518
 
509
- `),E=m.map(u=>` public fun update_${u}(self: &mut ${x(t)}, ${u}: ${r[u]}) {
519
+ `),E=m.map(u=>` public fun update_${u}(self: &mut ${w(t)}, ${u}: ${r[u]}) {
510
520
  self.${u} = ${u}
511
521
  }`).join(`
512
522
 
@@ -522,12 +532,12 @@ ${h.length>0?h.map(u=>` use ${e}::${u.module};
522
532
 
523
533
  const TABLE_NAME: vector<u8> = b"${t}";
524
534
 
525
- public struct ${x(t)} has copy, drop, store {
526
- ${o}
535
+ public struct ${w(t)} has copy, drop, store {
536
+ ${p}
527
537
  }
528
538
 
529
- public fun new(${l}): ${x(t)} {
530
- ${x(t)} {
539
+ public fun new(${l}): ${w(t)} {
540
+ ${w(t)} {
531
541
  ${S}
532
542
  }
533
543
  }
@@ -537,7 +547,7 @@ ${O}
537
547
  ${E}
538
548
 
539
549
  ${k}
540
- }`}function A(e){return["address","bool","u8","u32","u64","u128","u256","vector<address>","vector<bool>","vector<u8>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>"].includes(e)}function je(e,t,s,r,p=!0,a=[],b="Onchain"){let g=r.reduce((n,i)=>({...n,[i]:s[i]}),{}),_=Object.entries(s).filter(([n])=>!r.includes(n)).reduce((n,[i,d])=>({...n,[i]:d}),{}),m=Object.keys(g),c=Object.keys(_),h=Object.keys(s).every(n=>r.includes(n)),k=c.length===1,o=r.length>0?r.map(n=>`${n}: ${s[n]}`).join(", "):"",l=r.length>0?`let mut key_tuple = vector::empty();
550
+ }`}function A(e){return["address","bool","u8","u32","u64","u128","u256","vector<address>","vector<bool>","vector<u8>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>"].includes(e)}function je(e,t,s,r,o=!0,i=[],b="Onchain"){let y=r.reduce((n,a)=>({...n,[a]:s[a]}),{}),_=Object.entries(s).filter(([n])=>!r.includes(n)).reduce((n,[a,d])=>({...n,[a]:d}),{}),m=Object.keys(y),c=Object.keys(_),h=Object.keys(s).every(n=>r.includes(n)),k=c.length===1,p=r.length>0?r.map(n=>`${n}: ${s[n]}`).join(", "):"",l=r.length>0?`let mut key_tuple = vector::empty();
541
551
  ${r.map(n=>`key_tuple.push_back(to_bytes(&${n}));`).join(`
542
552
  `)}`:"let key_tuple = vector::empty();",S=` public fun get_table_id(): vector<u8> {
543
553
  table_id::encode(table_id::${b==="Offchain"?"offchain_table_type":"onchain_table_type"}(), TABLE_NAME)
@@ -570,112 +580,112 @@ ${k}
570
580
  get_value_names(),
571
581
  ctx
572
582
  );
573
- }`,E=` public fun has(dapp_hub: &DappHub${o?", "+o:""}): bool {
583
+ }`,E=` public fun has(dapp_hub: &DappHub${p?", "+p:""}): bool {
574
584
  ${l}
575
585
  dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
576
586
  }
577
587
 
578
- public fun ensure_has(dapp_hub: &DappHub${o?", "+o:""}) {
588
+ public fun ensure_has(dapp_hub: &DappHub${p?", "+p:""}) {
579
589
  ${l}
580
590
  dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
581
591
  }
582
592
 
583
- public fun ensure_not_has(dapp_hub: &DappHub${o?", "+o:""}) {
593
+ public fun ensure_not_has(dapp_hub: &DappHub${p?", "+p:""}) {
584
594
  ${l}
585
595
  dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
586
596
  }
587
597
 
588
- ${k?"":c.map((n,i)=>` public fun has_${n}(dapp_hub: &DappHub${o?", "+o:""}): bool {
598
+ ${k?"":c.map((n,a)=>` public fun has_${n}(dapp_hub: &DappHub${p?", "+p:""}): bool {
589
599
  ${l}
590
- dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${i})
600
+ dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
591
601
  }
592
602
 
593
- public fun ensure_has_${n}(dapp_hub: &DappHub${o?", "+o:""}) {
603
+ public fun ensure_has_${n}(dapp_hub: &DappHub${p?", "+p:""}) {
594
604
  ${l}
595
- dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${i})
605
+ dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
596
606
  }
597
607
 
598
- public fun ensure_not_has_${n}(dapp_hub: &DappHub${o?", "+o:""}) {
608
+ public fun ensure_not_has_${n}(dapp_hub: &DappHub${p?", "+p:""}) {
599
609
  ${l}
600
- dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${i})
610
+ dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
601
611
  }`).join(`
602
612
 
603
- `)}`,u=` public(package) fun delete(dapp_hub: &mut DappHub${o?", "+o:""}) {
613
+ `)}`,u=` public(package) fun delete(dapp_hub: &mut DappHub${p?", "+p:""}) {
604
614
  ${l}
605
615
  dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);
606
- }`,f=k?"":c.map(n=>{let i=c.indexOf(n),d=s[n],y=!A(d),v=y?a.find(P=>P.type===d):null;return` public fun get_${n}(dapp_hub: &DappHub${o?", "+o:""}): ${d} {
616
+ }`,f=k?"":c.map(n=>{let a=c.indexOf(n),d=s[n],g=!A(d),v=g?i.find(P=>P.type===d):null;return` public fun get_${n}(dapp_hub: &DappHub${p?", "+p:""}): ${d} {
607
617
  ${l}
608
- let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${i});
618
+ let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a});
609
619
  let mut bsc_type = sui::bcs::new(value);
610
- ${y?`let ${n} = ${e}::${v?.module}::decode(&mut bsc_type);`:`let ${n} = sui::bcs::peel_${K(d)}(&mut bsc_type);`}
620
+ ${g?`let ${n} = ${e}::${v?.module}::decode(&mut bsc_type);`:`let ${n} = sui::bcs::peel_${K(d)}(&mut bsc_type);`}
611
621
  ${n}
612
622
  }
613
623
 
614
- public(package) fun set_${n}(dapp_hub: &mut DappHub${o?", "+o:""}, ${n}: ${d}) {
624
+ public(package) fun set_${n}(dapp_hub: &mut DappHub${p?", "+p:""}, ${n}: ${d}) {
615
625
  ${l}
616
- let value = ${y?`${e}::${v?.module}::encode(${n})`:`to_bytes(&${n})`};
617
- dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${i}, value);
626
+ let value = ${g?`${e}::${v?.module}::encode(${n})`:`to_bytes(&${n})`};
627
+ dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${a}, value);
618
628
  }`}).join(`
619
629
 
620
- `),H=h?` public(package) fun set(dapp_hub: &mut DappHub${o?", "+o:""}) {
630
+ `),H=h?` public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}) {
621
631
  ${l}
622
632
  let value_tuple = vector::empty();
623
633
  dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
624
- }`:k?` public fun get(dapp_hub: &DappHub${o?", "+o:""}): ${Object.values(_)[0]} {
634
+ }`:k?` public fun get(dapp_hub: &DappHub${p?", "+p:""}): ${Object.values(_)[0]} {
625
635
  ${l}
626
636
  let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);
627
637
  let mut bsc_type = sui::bcs::new(value);
628
- ${A(Object.values(_)[0])?`let value = sui::bcs::peel_${K(Object.values(_)[0])}(&mut bsc_type);`:`let value = ${e}::${a.find(n=>n.type===Object.values(_)[0])?.module}::decode(&mut bsc_type);`}
638
+ ${A(Object.values(_)[0])?`let value = sui::bcs::peel_${K(Object.values(_)[0])}(&mut bsc_type);`:`let value = ${e}::${i.find(n=>n.type===Object.values(_)[0])?.module}::decode(&mut bsc_type);`}
629
639
  value
630
640
  }
631
641
 
632
- public(package) fun set(dapp_hub: &mut DappHub${o?", "+o:""}, value: ${Object.values(_)[0]}) {
642
+ public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}, value: ${Object.values(_)[0]}) {
633
643
  ${l}
634
644
  let value_tuple = encode(value);
635
645
  dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
636
- }`:` public fun get(dapp_hub: &DappHub${o?", "+o:""}): (${Object.values(_).join(", ")}) {
646
+ }`:` public fun get(dapp_hub: &DappHub${p?", "+p:""}): (${Object.values(_).join(", ")}) {
637
647
  ${l}
638
648
  let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
639
649
  let mut bsc_type = sui::bcs::new(value_tuple);
640
- ${c.map(n=>{let i=s[n],d=!A(i),y=d?a.find(v=>v.type===i):null;return`let ${n} = ${d?`${e}::${y?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${K(i)}(&mut bsc_type)`};`}).join(`
650
+ ${c.map(n=>{let a=s[n],d=!A(a),g=d?i.find(v=>v.type===a):null;return`let ${n} = ${d?`${e}::${g?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${K(a)}(&mut bsc_type)`};`}).join(`
641
651
  `)}
642
652
  (${c.join(", ")})
643
653
  }
644
654
 
645
- public(package) fun set(dapp_hub: &mut DappHub${o?", "+o:""}, ${c.map(n=>`${n}: ${s[n]}`).join(", ")}) {
655
+ public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}, ${c.map(n=>`${n}: ${s[n]}`).join(", ")}) {
646
656
  ${l}
647
657
  let value_tuple = encode(${c.join(", ")});
648
658
  dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
649
- }`,T=p?` public fun get_struct(dapp_hub: &DappHub${o?", "+o:""}): ${x(t)} {
659
+ }`,T=o?` public fun get_struct(dapp_hub: &DappHub${p?", "+p:""}): ${w(t)} {
650
660
  ${l}
651
661
  let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
652
662
  decode(value_tuple)
653
663
  }
654
664
 
655
- public(package) fun set_struct(dapp_hub: &mut DappHub${o?", "+o:""}, ${t}: ${x(t)}) {
665
+ public(package) fun set_struct(dapp_hub: &mut DappHub${p?", "+p:""}, ${t}: ${w(t)}) {
656
666
  ${l}
657
667
  let value_tuple = encode_struct(${t});
658
668
  dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
659
669
  }`:"",I=k?` public fun encode(value: ${Object.values(_)[0]}): vector<vector<u8>> {
660
670
  let mut value_tuple = vector::empty();
661
- value_tuple.push_back(${A(Object.values(_)[0])?"to_bytes(&value)":`${e}::${a.find(n=>n.type===Object.values(_)[0])?.module}::encode(value)`});
671
+ value_tuple.push_back(${A(Object.values(_)[0])?"to_bytes(&value)":`${e}::${i.find(n=>n.type===Object.values(_)[0])?.module}::encode(value)`});
662
672
  value_tuple
663
- }`:p?` public fun encode(${c.map(n=>`${n}: ${s[n]}`).join(", ")}): vector<vector<u8>> {
673
+ }`:o?` public fun encode(${c.map(n=>`${n}: ${s[n]}`).join(", ")}): vector<vector<u8>> {
664
674
  let mut value_tuple = vector::empty();
665
- ${c.map(n=>{let i=s[n],d=!A(i),y=d?a.find(v=>v.type===i):null;return`value_tuple.push_back(${d?`${e}::${y?.module}::encode(${n})`:`to_bytes(&${n})`});`}).join(`
675
+ ${c.map(n=>{let a=s[n],d=!A(a),g=d?i.find(v=>v.type===a):null;return`value_tuple.push_back(${d?`${e}::${g?.module}::encode(${n})`:`to_bytes(&${n})`});`}).join(`
666
676
  `)}
667
677
  value_tuple
668
678
  }
669
679
 
670
- public fun encode_struct(${t}: ${x(t)}): vector<vector<u8>> {
680
+ public fun encode_struct(${t}: ${w(t)}): vector<vector<u8>> {
671
681
  encode(${c.map(n=>`${t}.${n}`).join(", ")})
672
682
  }
673
683
 
674
- public fun decode(data: vector<u8>): ${x(t)} {
684
+ public fun decode(data: vector<u8>): ${w(t)} {
675
685
  let mut bsc_type = sui::bcs::new(data);
676
- ${c.map(n=>{let i=s[n],d=!A(i),y=d?a.find(v=>v.type===i):null;return`let ${n} = ${d?`${e}::${y?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${K(i)}(&mut bsc_type)`};`}).join(`
686
+ ${c.map(n=>{let a=s[n],d=!A(a),g=d?i.find(v=>v.type===a):null;return`let ${n} = ${d?`${e}::${g?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${K(a)}(&mut bsc_type)`};`}).join(`
677
687
  `)}
678
- ${x(t)} {
688
+ ${w(t)} {
679
689
  ${c.map(n=>`${n},`).join(`
680
690
  `)}
681
691
  }
@@ -693,8 +703,8 @@ ${H}
693
703
 
694
704
  ${T}
695
705
 
696
- ${I}`}function x(e){return e.split("_").map((t,s)=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function K(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":`vec_${K(t)}`}switch(e){case"bool":return"bool";case"u8":return"u8";case"u32":return"u32";case"u64":return"u64";case"u128":return"u128";case"u256":return"u256";case"address":return"address";default:return e}}import j from"node:path";async function Bt(e,t,s){console.log(`
697
- \u{1F680} Starting Schema Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${t.name}`),console.log(` \u2514\u2500 Description: ${t.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${s||"testnet"}`),console.log(e);let r=j.join(e,"src",t.name);w(`${r}`)&&z(`${r}/sources/codegen`),w(`${r}/Move.toml`)||await te(t,e);let p=j.join(r,"sources","codegen","genesis.move");w(p)||await _e(t,p);let a=j.join(r,"sources","codegen","init_test.move");w(a)||await ce(t,a);let b=j.join(r,"sources","codegen","dapp_key.move");w(b)||await ue(t,b);let g=j.join(r,"sources","scripts","deploy_hook.move");w(g)||await ne(t,g);let _=j.join(r,"sources","codegen","components");w(_)?await V(t,_):await V(t,_);let m=j.join(r,"sources","codegen","resources");w(m)?await J(t,m):await J(t,m);let c=j.join(r,"sources","codegen","enums");w(c)||await $e(t,c),t.errors&&await ae(t.name,t.errors,e),await ie(t,e),await re(t,e),console.log(`
706
+ ${I}`}function w(e){return e.split("_").map((t,s)=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function K(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":`vec_${K(t)}`}switch(e){case"bool":return"bool";case"u8":return"u8";case"u32":return"u32";case"u64":return"u64";case"u128":return"u128";case"u256":return"u256";case"address":return"address";default:return e}}import j from"node:path";async function Rt(e,t,s){console.log(`
707
+ \u{1F680} Starting Schema Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${t.name}`),console.log(` \u2514\u2500 Description: ${t.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${s||"testnet"}`),console.log(e);let r=j.join(e,"src",t.name);x(`${r}`)&&z(`${r}/sources/codegen`),x(`${r}/Move.toml`)||await te(t,e);let o=j.join(r,"sources","codegen","genesis.move");x(o)||await _e(t,o);let i=j.join(r,"sources","codegen","init_test.move");x(i)||await ce(t,i);let b=j.join(r,"sources","codegen","dapp_key.move");x(b)||await ue(t,b);let y=j.join(r,"sources","scripts","deploy_hook.move");x(y)||await ne(t,y);let _=j.join(r,"sources","codegen","components");x(_)?await V(t,_):await V(t,_);let m=j.join(r,"sources","codegen","resources");x(m)?await J(t,m):await J(t,m);let c=j.join(r,"sources","codegen","enums");x(c)||await $e(t,c),t.errors&&await ie(t.name,t.errors,e),await ae(t,e),await re(t,e),console.log(`
698
708
  \u2705 Schema Generation Process Complete!
699
- `)}var Se=e=>{let t=Object.keys(e.components||{}),s=Object.keys(e.resources||{}),r=t.filter(p=>s.includes(p));if(r.length>0)throw new Error(`Duplicate keys found between components and resources: ${r.join(", ")}`)},Ut=e=>(Se(e),e);import{findUp as Oe}from"find-up";import Z from"path";import Ee from"esbuild";var R=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as He}from"fs";import{pathToFileURL as Te}from"url";import Me from"os";var Ke=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],Q="dubhe.config.example.mjs";async function Yt(e){e=await ye(e);try{return await Ee.build({entryPoints:[e],format:"esm",outfile:Q,platform:"node",bundle:!0,packages:"external"}),e=await ye(Q,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{He(Q,{force:!0})}}async function ye(e,t){return e===void 0?e=await Fe():Z.isAbsolute(e)||(e=Z.join(process.cwd(),e),e=Z.normalize(e)),t&&Me.platform()==="win32"?Te(e).href:e}async function Fe(){let e=await Oe(Ke);if(e===void 0)throw new R;return e}var U=e=>{if(typeof e!="object"||e===null)return e;let t={};for(let s in e)if(e.hasOwnProperty(s)){let r=e[s];typeof r=="object"&&r!==null?Array.isArray(r)?t[s]=ge(r):r.hasOwnProperty("variant")?t[s]={[r.variant]:{}}:r.hasOwnProperty("fields")?t[s]=U(r.fields):t[s]=U(r):t[s]=r}return t},ge=e=>{let t=[];return e.forEach(s=>{typeof s=="object"&&s!==null?Array.isArray(s)?t.push(ge(s)):s.hasOwnProperty("variant")?t.push({[s.variant]:{}}):s.hasOwnProperty("fields")?t.push(U(s.fields)):t.push(U(s)):t.push(s)}),t};var We=(s=>(s.Event="event",s.Schema="schema",s))(We||{});export{We as SubscriptionKind,Ut as defineDapp,$ as formatAndWriteMove,Qe as formatAndWriteTypescript,X as formatMove,Y as formatTypescript,Yt as loadConfig,U as parseData,Ye as posixPath,ye as resolveConfigPath,Bt as schemaGen};
709
+ `)}var Se=e=>{let t=Object.keys(e.components||{}),s=Object.keys(e.resources||{}),r=t.filter(o=>s.includes(o));if(r.length>0)throw new Error(`Duplicate keys found between components and resources: ${r.join(", ")}`)},Ut=e=>(Se(e),e);import{findUp as Oe}from"find-up";import Z from"path";import Ee from"esbuild";var B=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as He}from"fs";import{pathToFileURL as Te}from"url";import Me from"os";var Ke=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],Q="dubhe.config.example.mjs";async function Yt(e){e=await ge(e);try{return await Ee.build({entryPoints:[e],format:"esm",outfile:Q,platform:"node",bundle:!0,packages:"external"}),e=await ge(Q,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{He(Q,{force:!0})}}async function ge(e,t){return e===void 0?e=await Fe():Z.isAbsolute(e)||(e=Z.join(process.cwd(),e),e=Z.normalize(e)),t&&Me.platform()==="win32"?Te(e).href:e}async function Fe(){let e=await Oe(Ke);if(e===void 0)throw new B;return e}var U=e=>{if(typeof e!="object"||e===null)return e;let t={};for(let s in e)if(e.hasOwnProperty(s)){let r=e[s];typeof r=="object"&&r!==null?Array.isArray(r)?t[s]=ye(r):r.hasOwnProperty("variant")?t[s]={[r.variant]:{}}:r.hasOwnProperty("fields")?t[s]=U(r.fields):t[s]=U(r):t[s]=r}return t},ye=e=>{let t=[];return e.forEach(s=>{typeof s=="object"&&s!==null?Array.isArray(s)?t.push(ye(s)):s.hasOwnProperty("variant")?t.push({[s.variant]:{}}):s.hasOwnProperty("fields")?t.push(U(s.fields)):t.push(U(s)):t.push(s)}),t};var We=(s=>(s.Event="event",s.Schema="schema",s))(We||{});export{We as SubscriptionKind,Ut as defineConfig,$ as formatAndWriteMove,Qe as formatAndWriteTypescript,X as formatMove,Y as formatTypescript,Yt as loadConfig,U as parseData,Ye as posixPath,ge as resolveConfigPath,Rt as schemaGen};
700
710
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/schemaGen.ts","../src/codegen/utils/renderMove/common.ts","../package.json","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateError.ts","../src/codegen/utils/renderMove/generateInitTest.ts","../src/codegen/utils/renderMove/generateComponents.ts","../src/codegen/utils/renderMove/generateGenesis.ts","../src/codegen/utils/renderMove/generateEnums.ts","../src/codegen/utils/renderMove/generateResources.ts","../src/codegen/utils/renderMove/dapp.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts","../src/parseData/parser/index.ts","../src/primitives/index.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(content: string, prettierConfigPath?: string): Promise<string> {\n let config;\n if (prettierConfigPath) {\n config = await prettier.resolveConfig(prettierConfigPath);\n }\n try {\n return prettier.format(content, {\n plugins: [prettierPluginMove],\n parser: 'move-parse',\n printWidth: 120,\n semi: true,\n tabWidth: 2,\n useTabs: false,\n bracketSpacing: true,\n ...config\n });\n } catch (error) {\n let message;\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = error;\n }\n console.log(`Error during output formatting: ${message}`);\n return content;\n }\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n return prettier.format(content, {\n parser: 'typescript'\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { formatMove, formatTypescript } from './format';\nimport { debug } from '../debug';\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = await formatMove(output);\n let schemaPrefix = ` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: Apache-2.0\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `;\n\n let initPrefix = `#[test_only]`;\n\n let code = schemaPrefix + formattedOutput;\n\n let deployHookPrefix = `#[allow(lint(share_owned))]`;\n\n if (\n fullOutputPath.includes('.toml') ||\n fullOutputPath.includes('system') ||\n fullOutputPath.includes('migrate')\n ) {\n code = formattedOutput;\n } else if (fullOutputPath.includes('init')) {\n code = initPrefix + formattedOutput;\n } else if (fullOutputPath.includes('genesis')) {\n code = deployHookPrefix + formattedOutput;\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from 'debug';\n\nexport const debug = createDebug('dubhe:common');\nexport const error = createDebug('dubhe:common');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from '../debug';\n\nexport const debug = parentDebug.extend('codegen');\nexport const error = parentDebug.extend('codegen');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","/**\n * Explicitly normalize a given path to a posix path (using `/` as separator).\n * This should be used for generating Solidity files that will be consumed by solc,\n * because solc expects `/` as path separator, but path.join produces `\\` if the user is on windows.\n */\nexport function posixPath(path: string): string {\n return path.replace(/\\\\/g, '/');\n}\n","import { DubheConfig } from '../../types';\nimport { rmdirSync, existsSync } from 'fs';\nimport { deleteFolderRecursive } from './common';\nimport { generateToml } from './generateToml';\nimport { generateSchemaData, generateSchemaStructure } from './generateSchema';\nimport { generateDeployHook, generateMigrate } from './generateScript';\nimport { generateDappKey } from './generateDappKey';\nimport { generateSchemaEvent } from './generateEvent';\nimport { generateSystemsAndTests } from './generateSystem';\nimport { generateSchemaHub } from './generateSchemaHub';\nimport { generateSchemaError } from './generateError';\nimport { generateDefaultSchema } from './generateDefaultSchema';\nimport { generateInitTest } from './generateInitTest';\nimport { generateComponents } from './generateComponents';\nimport { generateGenesis } from './generateGenesis';\nimport { generateEnums } from './generateEnums';\nimport { generateResources } from './generateResources';\nimport path from 'node:path';\n\nexport async function schemaGen(\n rootDir: string,\n config: DubheConfig,\n network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n console.log('\\n🚀 Starting Schema Generation Process...');\n console.log('📋 Project Configuration:');\n console.log(` └─ Name: ${config.name}`);\n console.log(` └─ Description: ${config.description || 'No description provided'}`);\n console.log(` └─ Network: ${network || 'testnet'}`);\n\n console.log(rootDir)\n const projectDir = path.join(rootDir, 'src', config.name);\n\n if (existsSync(`${projectDir}`)) {\n deleteFolderRecursive(`${projectDir}/sources/codegen`);\n }\n\n if (!existsSync(`${projectDir}/Move.toml`)) {\n await generateToml(config, rootDir);\n }\n\n const genesisPath = path.join(projectDir, 'sources', 'codegen', 'genesis.move');\n if (!existsSync(genesisPath)) {\n await generateGenesis(config, genesisPath);\n }\n\n const initTestPath = path.join(projectDir, 'sources', 'codegen', 'init_test.move');\n if (!existsSync(initTestPath)) {\n await generateInitTest(config, initTestPath);\n }\n\n const dappKeyPath = path.join(projectDir, 'sources', 'codegen', 'dapp_key.move');\n if (!existsSync(dappKeyPath)) {\n await generateDappKey(config, dappKeyPath);\n }\n\n const deployHookPath = path.join(projectDir, 'sources', 'scripts', 'deploy_hook.move');\n if (!existsSync(deployHookPath)) {\n await generateDeployHook(config, deployHookPath);\n }\n\n const componentsPath = path.join(projectDir, 'sources', 'codegen', 'components');\n if (!existsSync(componentsPath)) {\n await generateComponents(config, componentsPath);\n } else {\n await generateComponents(config, componentsPath);\n }\n\n const resourcesPath = path.join(projectDir, 'sources', 'codegen', 'resources');\n if (!existsSync(resourcesPath)) {\n await generateResources(config, resourcesPath);\n } else {\n await generateResources(config, resourcesPath);\n }\n\n const enumsPath = path.join(projectDir, 'sources', 'codegen', 'enums');\n if (!existsSync(enumsPath)) {\n await generateEnums(config, enumsPath);\n }\n\n if (config.errors) {\n await generateSchemaError(config.name, config.errors, rootDir);\n }\n\n // await generateDefaultSchema(config, rootDir);\n // await generateInit(config, rootDir);\n await generateSystemsAndTests(config, rootDir);\n await generateMigrate(config, rootDir);\n console.log('\\n✅ Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n if (fs.existsSync(path)) {\n fs.readdirSync(path).forEach((file) => {\n const curPath = `${path}/${file}`;\n if (fs.lstatSync(curPath).isDirectory()) {\n deleteFolderRecursive(curPath);\n } else {\n fs.unlinkSync(curPath);\n }\n });\n fs.rmdirSync(path);\n }\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(values: Record<string, string> | string): string {\n return Object.entries(values)\n .map(([key, _]) => `${key}`)\n .join(',');\n}\n\nfunction isAddress(str: string): boolean {\n const regex = /^0x[a-fA-F0-9]+$/;\n return regex.test(str);\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaType): string {\nexport function getStructTypes(values: Record<string, string>): string {\n return `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n\nexport function containsString(obj: Record<string, any>, searchString: string): boolean {\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const value = obj[key];\n if (\n (typeof value === 'string' && value === searchString) ||\n (typeof value === 'string' && value.includes(searchString) && value.includes('>'))\n ) {\n return true;\n }\n }\n }\n return false;\n}\n","{\n \"name\": \"@0xobelisk/sui-common\",\n \"version\": \"1.2.0-pre.49\",\n \"description\": \"Common low level logic shared between packages\",\n \"keywords\": [\n \"sui\",\n \"obelisk labs\",\n \"move\",\n \"blockchain\"\n ],\n \"type\": \"module\",\n \"author\": \"team@obelisk.build\",\n \"homepage\": \"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme\",\n \"bugs\": \"https://github.com/0xobelisk/dubhe/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/0xobelisk/dubhe.git\"\n },\n \"license\": \"Apache-2.0\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"typesVersions\": {\n \"*\": {\n \"index\": [\n \"./src/index.ts\"\n ]\n }\n },\n \"types\": \"./dist/index.d.ts\",\n \"scripts\": {\n \"build\": \"pnpm run build:js\",\n \"build:js\": \"tsup && chmod +x ./dist/index.js\",\n \"clean\": \"pnpm run clean:js\",\n \"clean:js\": \"rimraf dist\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint . --ext .ts\",\n \"test\": \"vitest\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"type-check\": \"tsc --noEmit\",\n \"validate\": \"pnpm format:check && pnpm type-check\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.0.1\",\n \"debug\": \"^4.3.4\",\n \"dotenv\": \"^16.0.3\",\n \"ejs\": \"^3.1.8\",\n \"esbuild\": \"^0.17.15\",\n \"execa\": \"^7.0.0\",\n \"find-up\": \"^6.3.0\",\n \"glob\": \"^8.0.3\",\n \"path\": \"^0.12.7\",\n \"prettier\": \"^3.1.1\",\n \"prettier-plugin-move-js\": \"^0.0.5\",\n \"prettier-plugin-rust\": \"^0.1.9\",\n \"prettier-plugin-solidity\": \"^1.1.2\",\n \"typescript\": \"5.1.6\",\n \"yargs\": \"^17.7.1\",\n \"zod\": \"^3.22.3\",\n \"zod-validation-error\": \"^1.3.0\"\n },\n \"devDependencies\": {\n \"@types/debug\": \"^4.1.12\",\n \"@types/ejs\": \"^3.1.1\",\n \"@types/glob\": \"^7.2.0\",\n \"@types/node\": \"^18.15.11\",\n \"@types/yargs\": \"^17.0.10\",\n \"tsup\": \"^6.7.0\",\n \"tsx\": \"^3.12.6\",\n \"vitest\": \"^2.1.3\",\n \"eslint\": \"^8.56.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"prettier\": \"3.3.3\"\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport packageJson from '../../../../package.json';\n\nexport async function generateToml(config: DubheConfig, srcPrefix: string) {\n console.log('\\n📄 Starting Move.toml Generation...');\n console.log(` └─ Output path: ${srcPrefix}/src/${config.name}/Move.toml`);\n\n let code = `[package]\nname = \"${config.name}\"\nversion = \"1.0.0\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.46.3\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe-wip.git\", subdir = \"packages/sui-framework/src/dubhe\", rev = \"v${packageJson.version}\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x1024\"\n`;\n await formatAndWriteMove(code, `${srcPrefix}/src/${config.name}/Move.toml`, 'formatAndWriteMove');\n console.log('✅ Move.toml Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nimport { readFileSync } from 'fs';\n\nfunction capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport async function generateDeployHook(config: DubheConfig, path: string) {\n if (!existsSync(path)) {\n const code = `module ${config.name}::deploy_hook {\n\t\t\t use dubhe::dapp_service::DappHub;\n\n public(package) fun run(_dapp_hub: &mut DappHub, _ctx: &mut TxContext) {\n\n }\n}`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`)) {\n let code = `module ${config.name}::migrate {\n const ON_CHAIN_VERSION: u32 = 1;\n\n public fun on_chain_version(): u32 {\n ON_CHAIN_VERSION\n }\n}\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`,\n 'formatAndWriteMove'\n );\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(config: DubheConfig, path: string) {\n let code = `module ${config.name}::dapp_key {\nuse std::type_name;\n use sui::address;\n use std::ascii::String;\n\n /// Authorization token for the app.\n\n public struct DappKey has copy, drop {}\n\n public(package) fun new(): DappKey {\n DappKey { }\n }\n\n public fun to_string(): String {\n type_name::get<DappKey>().into_string()\n }\n\n public fun package_id(): address {\n let package_id_str = type_name::get<DappKey>().get_address();\n address::from_ascii_bytes(package_id_str.as_bytes())\n }\n}\n`;\n await formatAndWriteMove(\n code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateSystemsAndTests(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/systems`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/systems`, { recursive: true });\n }\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/tests`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/tests`, { recursive: true });\n }\n}\n","import { BaseType, ErrorData, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n getStructAttrsWithType,\n getStructAttrs,\n getStructTypes,\n getStructAttrsQuery\n} from './common';\n\nfunction convertToSnakeCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n}\n\nexport async function generateSchemaError(projectName: string, errors: ErrorData, path: string) {\n console.log('\\n📦 Starting Schema Error Generation...');\n\n let code = `module ${projectName}::errors {\n\t\t${Object.entries(errors)\n .map(([name, message]) => {\n console.log(` └─ ${name}: ${message}`);\n return `#[error]\n\t\t\t\tconst ${name.toUpperCase()}: vector<u8> = b\"${message}\";\n\t\t\t\tpublic fun ${name}_error(condition: bool) { assert!(condition, ${name.toUpperCase()}) }\n\t\t`;\n })\n .join('\\n')}\t\t\n }`;\n\n await formatAndWriteMove(\n code,\n `${path}/src/${projectName}/sources/codegen/errors.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateInitTest(config: DubheConfig, path: string) {\n let init_test_code = `module ${config.name}::init_test {\n use sui::clock;\n use sui::test_scenario;\n use sui::test_scenario::Scenario;\n use dubhe::dapp_service::{Self, DappHub};\n\n public fun deploy_dapp_for_testing(scenario: &mut Scenario): DappHub {\n let ctx = test_scenario::ctx(scenario);\n let clock = clock::create_for_testing(ctx);\n let mut dapp_hub = dapp_service::create_dapp_hub_for_testing(ctx);\n ${config.name}::genesis::run(&mut dapp_hub, &clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(scenario, ctx.sender());\n dapp_hub\n }\n}\n`;\n await formatAndWriteMove(\n init_test_code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { ComponentType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateComponents(config: DubheConfig, path: string) {\n console.log('\\n📦 Starting Components Generation...');\n \n for (const [componentName, component] of Object.entries(config.components)) {\n console.log(` └─ ${componentName}: ${JSON.stringify(component)}`);\n \n // Handle simple type cases\n if (typeof component === 'string') {\n const code = generateSimpleComponentCode(config.name, componentName, component, 'Onchain');\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Handle empty object cases, representing components with only entity_id key\n if (Object.keys(component).length === 0) {\n const code = generateComponentCode(config.name, componentName, {\n fields: {\n 'entity_id': 'address'\n },\n keys: ['entity_id'],\n offchain: false\n });\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Handle cases where keys are not defined - default to entity_id for components\n if (!component.keys) {\n component.keys = ['entity_id'];\n if (!component.fields['entity_id']) {\n component.fields = {\n 'entity_id': 'address',\n ...component.fields\n };\n }\n }\n \n // Validate that components only have one key\n if (component.keys && component.keys.length > 1) {\n throw new Error(`Component '${componentName}' can only have one key, but found ${component.keys.length} keys: ${component.keys.join(', ')}`);\n }\n \n const code = generateComponentCode(config.name, componentName, component);\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateSimpleComponentCode(projectName: string, componentName: string, valueType: string, type: ComponentType = 'Onchain'): string {\n // Check if it's an enum type\n const isEnum = !isBasicType(valueType);\n const enumModule = isEnum ? `${toSnakeCase(valueType)}` : '';\n \n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${isEnum ? ` use ${projectName}::${enumModule};\n use ${projectName}::${enumModule}::{${valueType}};` : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[b\"address\"]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[b\"${valueType}\"]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[b\"entity_id\"]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[b\"value\"]\n }\n\n public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }\n\n public fun has(dapp_hub: &DappHub, entity_id: address): bool {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public(package) fun delete(dapp_hub: &mut DappHub, entity_id: address) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }\n\n public fun get(dapp_hub: &DappHub, entity_id: address): (${valueType}) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${isEnum ? `let value = ${projectName}::${enumModule}::decode(&mut bsc_type);` : `let value = sui::bcs::peel_${getBcsType(valueType)}(&mut bsc_type);`}\n (value)\n }\n\n public(package) fun set(dapp_hub: &mut DappHub, entity_id: address, value: ${valueType}) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }\n\n public fun encode(value: ${valueType}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${isEnum ? `${projectName}::${enumModule}::encode(value)` : `to_bytes(&value)`});\n value_tuple\n }\n}`;\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nfunction generateComponentCode(projectName: string, componentName: string, component: any): string {\n const fields = component.fields;\n const keys = component.keys || ['entity_id'];\n const offchain = component.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n \n // Generate field type and name lists, excluding fields in keys\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name));\n const valueFieldNames = valueFields.map(([name]) => name);\n \n // If there is only one value field, do not generate struct\n const isSingleValue = valueFieldNames.length === 1;\n\n // Get all enum type fields (both key fields and value fields) and their corresponding module names\n const allEnumTypes = Object.entries(fields)\n .filter(([_, type]) => !isBasicType(type as string))\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => \n self.findIndex(t => t.type === item.type) === index\n );\n \n // Generate table related functions\n const tableFunctions = generateTableFunctions(projectName, componentName, fields, keys, !isAllKeys && !isSingleValue, allEnumTypes, type);\n\n // If all fields are keys or there is only one value field, do not generate struct related code\n if (isAllKeys || isSingleValue) {\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${allEnumTypes.length > 0 ? allEnumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n${tableFunctions}\n}`;\n }\n\n // Generate struct fields, excluding fields in keys\n const structFields = valueFieldNames\n .map(name => ` ${name}: ${fields[name]},`)\n .join('\\n');\n\n // Generate constructor parameters, only containing non-key fields\n const constructorParams = valueFieldNames\n .map(name => `${name}: ${fields[name]}`)\n .join(', ');\n\n // Generate constructor field assignments, only containing non-key fields\n const constructorAssignments = valueFieldNames\n .map(name => ` ${name},`)\n .join('\\n');\n\n // Generate getter functions, excluding fields in keys\n const getters = valueFieldNames\n .map(name => ` public fun ${name}(self: &${toPascalCase(componentName)}): ${fields[name]} {\n self.${name}\n }`)\n .join('\\n\\n');\n\n // Generate setter functions, excluding fields in keys\n const setters = valueFieldNames\n .map(name => ` public fun update_${name}(self: &mut ${toPascalCase(componentName)}, ${name}: ${fields[name]}) {\n self.${name} = ${name}\n }`)\n .join('\\n\\n');\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${allEnumTypes.length > 0 ? allEnumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public struct ${toPascalCase(componentName)} has copy, drop, store {\n${structFields}\n }\n\n public fun new(${constructorParams}): ${toPascalCase(componentName)} {\n ${toPascalCase(componentName)} {\n${constructorAssignments}\n }\n }\n\n${getters}\n\n${setters}\n\n${tableFunctions}\n}`;\n}\n\n// Check if it is a basic type\nfunction isBasicType(type: string): boolean {\n return ['address', 'bool', 'u8', 'u32', 'u64', 'u128', 'u256', \n 'vector<address>', 'vector<bool>', 'vector<u8>', 'vector<vector<u8>>', \n 'vector<u32>', 'vector<u64>', 'vector<u128>', 'vector<u256>'].includes(type);\n}\n\nfunction generateTableFunctions(\n projectName: string,\n componentName: string,\n fields: Record<string, string>,\n keys: string[],\n includeStruct: boolean = true,\n enumTypes: Array<{type: string, module: string}> = [],\n type: ComponentType = 'Onchain'\n): string {\n // Separate key fields and non-key fields\n const keyFields = keys.reduce((acc, key) => ({ ...acc, [key]: fields[key] }), {});\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name))\n .reduce((acc, [name, type]) => ({ ...acc, [name]: type }), {});\n \n const keyNames = Object.keys(keyFields);\n const valueNames = Object.keys(valueFields);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n // Check if there is only one value field\n const isSingleValue = valueNames.length === 1;\n\n // Generate key parameter list, if keys are empty, return empty string\n const keyParams = keys.length > 0 \n ? keys.map(k => `${k}: ${fields[k]}`).join(', ')\n : '';\n \n // Generate key tuple related code, if keys are empty, return empty string\n const keyTupleCode = keys.length > 0\n ? `let mut key_tuple = vector::empty();\n ${keys.map(k => `key_tuple.push_back(to_bytes(&${k}));`).join('\\n ')}`\n : 'let key_tuple = vector::empty();';\n \n // Generate table ID related functions\n const tableIdFunctions = ` public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${fields[k]}\"`).join(', ')}]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[${Object.values(valueFields).map(t => `b\"${t}\"`).join(', ')}]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${k}\"`).join(', ')}]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[${valueNames.map(n => `b\"${n}\"`).join(', ')}]\n }`;\n\n // Generate register table function\n const registerFunction = ` public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }`;\n\n // Generate has series functions\n const hasFunctions = ` public fun has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_not_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n${!isSingleValue ? valueNames.map((name, index) => ` public fun has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_not_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }`).join('\\n\\n') : ''}`;\n\n // Generate delete function\n const deleteFunction = ` public(package) fun delete(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }`;\n\n // Generate getter and setter functions, only generated when there are multiple value fields\n const getterSetters = !isSingleValue ? valueNames.map(name => {\n const index = valueNames.indexOf(name);\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n \n return ` public fun get_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${fieldType} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index});\n let mut bsc_type = sui::bcs::new(value);\n ${isEnum ? `let ${name} = ${projectName}::${enumType?.module}::decode(&mut bsc_type);` : `let ${name} = sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type);`}\n ${name}\n }\n\n public(package) fun set_${name}(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${name}: ${fieldType}) {\n ${keyTupleCode}\n let value = ${isEnum ? `${projectName}::${enumType?.module}::encode(${name})` : `to_bytes(&${name})`};\n dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${index}, value);\n }`;\n }).join('\\n\\n') : '';\n\n // Generate get and set functions\n const getSetFunctions = isAllKeys \n ? ` public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n let value_tuple = vector::empty();\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : isSingleValue\n ? ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${Object.values(valueFields)[0]} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);\n let mut bsc_type = sui::bcs::new(value);\n ${!isBasicType(Object.values(valueFields)[0] as string) \n ? `let value = ${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::decode(&mut bsc_type);` \n : `let value = sui::bcs::peel_${getBcsType(Object.values(valueFields)[0] as string)}(&mut bsc_type);`}\n value\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, value: ${Object.values(valueFields)[0]}) {\n ${keyTupleCode}\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): (${Object.values(valueFields).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${valueNames.map(name => {\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${name} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n (${valueNames.join(', ')})\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = encode(${valueNames.join(', ')});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`;\n\n // Generate struct related functions\n const structFunctions = includeStruct ? ` public fun get_struct(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${toPascalCase(componentName)} {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n decode(value_tuple)\n }\n\n public(package) fun set_struct(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${componentName}: ${toPascalCase(componentName)}) {\n ${keyTupleCode}\n let value_tuple = encode_struct(${componentName});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }` : '';\n\n // Generate encode and decode functions\n const encodeDecodeFunctions = isSingleValue\n ? ` public fun encode(value: ${Object.values(valueFields)[0]}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${!isBasicType(Object.values(valueFields)[0] as string) \n ? `${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::encode(value)` \n : `to_bytes(&value)`});\n value_tuple\n }`\n : includeStruct\n ? ` public fun encode(${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `value_tuple.push_back(${isEnum ? `${projectName}::${enumType?.module}::encode(${n})` : `to_bytes(&${n})`});`;\n }).join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map(n => `${componentName}.${n}`).join(', ')})\n }\n\n public fun decode(data: vector<u8>): ${toPascalCase(componentName)} {\n let mut bsc_type = sui::bcs::new(data);\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${n} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n ${toPascalCase(componentName)} {\n ${valueNames.map(n => `${n},`).join('\\n ')}\n }\n }`\n : '';\n\n return `${tableIdFunctions}\n\n${registerFunction}\n\n${hasFunctions}\n\n${deleteFunction}\n\n${getterSetters}\n\n${getSetFunctions}\n\n${structFunctions}\n\n${encodeDecodeFunctions}`;\n}\n\nfunction toPascalCase(str: string): string {\n // Split the underscore-separated string into words\n return str\n .split('_')\n .map((word, index) => {\n // If the word is a pure number, return it as is\n if (/^\\d+$/.test(word)) {\n return word;\n }\n // Otherwise, capitalize the first letter and lowercase the rest\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getBcsType(type: string): string {\n if (type.startsWith('vector<')) {\n const innerType = type.slice(7, -1);\n if (innerType === 'vector<u8>') {\n return 'vec_vec_u8';\n }\n return `vec_${getBcsType(innerType)}`;\n }\n \n switch (type) {\n case 'bool': return 'bool';\n case 'u8': return 'u8';\n case 'u32': return 'u32';\n case 'u64': return 'u64';\n case 'u128': return 'u128';\n case 'u256': return 'u256';\n case 'address': return 'address';\n default: return type;\n }\n}","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\nimport path from 'node:path';\n\nfunction capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport async function generateGenesis(config: DubheConfig, path: string) {\n // Generate register table code\n const componentRegisterCode = Object.keys(config.components || {})\n .map(componentName => ` ${componentName}::register_table(dapp_hub, ctx);`)\n .join('\\n');\n \n const resourceRegisterCode = Object.keys(config.resources || {})\n .map(resourceName => ` ${resourceName}::register_table(dapp_hub, ctx);`)\n .join('\\n');\n\n const registerTablesCode = [componentRegisterCode, resourceRegisterCode]\n .filter(code => code.trim() !== '')\n .join('\\n');\n\n let genesis_code = `module ${config.name}::genesis {\n use sui::clock::Clock;\n use dubhe::dapp_service::{Self, DappHub};\n use ${config.name}::dapp_key;\n ${Object.keys(config.components || {}).map(componentName => `use ${config.name}::${componentName};`).join('\\n')}\n ${Object.keys(config.resources || {}).map(resourceName => `use ${config.name}::${resourceName};`).join('\\n')}\n\n public entry fun run(dapp_hub: &mut DappHub, clock: &Clock, ctx: &mut TxContext) {\n // Create Dapp\n let dapp_key = dapp_key::new();\n dapp_service::create_dapp(dapp_hub, dapp_key, b\"${config.name}\", b\"${config.description}\", clock, ctx);\n\n // Register tables\n${registerTablesCode}\n\n // Logic that needs to be automated once the contract is deployed\n ${config.name}::deploy_hook::run(dapp_hub, ctx);\n }\n}\n`;\n await formatAndWriteMove(\n genesis_code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nexport async function generateEnums(config: DubheConfig, path: string) {\n console.log('\\n📦 Starting Enums Generation...');\n \n if (!config.enums) {\n return;\n }\n\n for (const [enumName, values] of Object.entries(config.enums)) {\n console.log(` └─ ${enumName}: ${JSON.stringify(values)}`);\n \n // Sort enum values by first letter\n const sortedValues = [...values].sort((a, b) => a.localeCompare(b));\n \n const code = generateEnumCode(config.name, enumName, sortedValues);\n await formatAndWriteMove(\n code,\n `${path}/${toSnakeCase(enumName)}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateEnumCode(projectName: string, enumName: string, values: string[]): string {\n const enumValues = values.map(v => v.charAt(0).toUpperCase() + v.slice(1)).join(',');\n \n return `module ${projectName}::${toSnakeCase(enumName)} {\n use sui::bcs::{BCS, to_bytes, peel_enum_tag};\n\n public enum ${enumName} has copy, drop, store {\n ${enumValues}\n }\n\n${values.map(v => ` public fun new_${v.toLowerCase()}(): ${enumName} {\n ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)}\n }`).join('\\n\\n')}\n\n public fun encode(self: ${enumName}): vector<u8> {\n to_bytes(&self)\n }\n\n public fun decode(bytes: &mut BCS): ${enumName} {\n match(peel_enum_tag(bytes)) {\n${values.map((v, i) => ` ${i} => ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)},`).join('\\n')}\n _ => abort,\n }\n }\n}`;\n}\n","import { DubheConfig } from '../../types';\nimport { ComponentType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateResources(config: DubheConfig, path: string) {\n console.log('\\n📦 Starting Resources Generation...');\n \n for (const [componentName, resource] of Object.entries(config.resources)) {\n console.log(` └─ ${componentName}: ${JSON.stringify(resource)}`);\n \n // Handle simple type cases\n if (typeof resource === 'string') {\n const code = generateSimpleComponentCode(config.name, componentName, resource, 'Onchain');\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Validate that resource has fields defined\n if (!resource.fields || Object.keys(resource.fields).length === 0) {\n throw new Error(`Resource '${componentName}' must have fields defined, but found empty object`);\n }\n\n // For resources, don't default to any keys - use what's defined or empty array\n if (!resource.keys) {\n resource.keys = [];\n }\n \n const offchain = resource.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n const code = generateComponentCode(config.name, componentName, resource);\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateSimpleComponentCode(projectName: string, componentName: string, valueType: string, type: ComponentType = 'Onchain'): string {\n // Check if it's an enum type\n const isEnum = !isBasicType(valueType);\n const enumModule = isEnum ? `${toSnakeCase(valueType)}` : '';\n \n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${isEnum ? ` use ${projectName}::${enumModule};\n use ${projectName}::${enumModule}::{${valueType}};` : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[b\"${valueType}\"]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[b\"value\"]\n }\n\n public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }\n\n public fun has(dapp_hub: &DappHub): bool {\n let key_tuple = vector::empty();\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public(package) fun delete(dapp_hub: &mut DappHub) {\n let key_tuple = vector::empty();\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }\n\n public fun get(dapp_hub: &DappHub): (${valueType}) {\n let key_tuple = vector::empty();\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${isEnum ? `let value = ${projectName}::${enumModule}::decode(&mut bsc_type);` : `let value = sui::bcs::peel_${getBcsType(valueType)}(&mut bsc_type);`}\n (value)\n }\n\n public(package) fun set(dapp_hub: &mut DappHub, value: ${valueType}) {\n let key_tuple = vector::empty();\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }\n\n public fun encode(value: ${valueType}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${isEnum ? `${projectName}::${enumModule}::encode(value)` : `to_bytes(&value)`});\n value_tuple\n }\n}`;\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nfunction generateComponentCode(projectName: string, componentName: string, resource: any): string {\n const fields = resource.fields;\n const keys = resource.keys || [];\n const offchain = resource.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n \n // Generate field type and name lists, excluding fields in keys\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name));\n const valueFieldNames = valueFields.map(([name]) => name);\n \n // If there is only one value field, do not generate struct\n const isSingleValue = valueFieldNames.length === 1;\n\n // Get all enum type fields and their corresponding module names\n const enumTypes = valueFields\n .filter(([_, type]) => !isBasicType(type as string))\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => \n self.findIndex(t => t.type === item.type) === index\n );\n \n // Generate table related functions\n const tableFunctions = generateTableFunctions(projectName, componentName, fields, keys, !isAllKeys && !isSingleValue, enumTypes, type);\n\n // If all fields are keys or there is only one value field, do not generate struct related code\n if (isAllKeys || isSingleValue) {\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${enumTypes.length > 0 ? enumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n${tableFunctions}\n}`;\n }\n\n // Generate struct fields, excluding fields in keys\n const structFields = valueFieldNames\n .map(name => ` ${name}: ${fields[name]},`)\n .join('\\n');\n\n // Generate constructor parameters, only containing non-key fields\n const constructorParams = valueFieldNames\n .map(name => `${name}: ${fields[name]}`)\n .join(', ');\n\n // Generate constructor field assignments, only containing non-key fields\n const constructorAssignments = valueFieldNames\n .map(name => ` ${name},`)\n .join('\\n');\n\n // Generate getter functions, excluding fields in keys\n const getters = valueFieldNames\n .map(name => ` public fun ${name}(self: &${toPascalCase(componentName)}): ${fields[name]} {\n self.${name}\n }`)\n .join('\\n\\n');\n\n // Generate setter functions, excluding fields in keys\n const setters = valueFieldNames\n .map(name => ` public fun update_${name}(self: &mut ${toPascalCase(componentName)}, ${name}: ${fields[name]}) {\n self.${name} = ${name}\n }`)\n .join('\\n\\n');\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${enumTypes.length > 0 ? enumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public struct ${toPascalCase(componentName)} has copy, drop, store {\n${structFields}\n }\n\n public fun new(${constructorParams}): ${toPascalCase(componentName)} {\n ${toPascalCase(componentName)} {\n${constructorAssignments}\n }\n }\n\n${getters}\n\n${setters}\n\n${tableFunctions}\n}`;\n}\n\n// Check if it is a basic type\nfunction isBasicType(type: string): boolean {\n return ['address', 'bool', 'u8', 'u32', 'u64', 'u128', 'u256', \n 'vector<address>', 'vector<bool>', 'vector<u8>', 'vector<vector<u8>>', \n 'vector<u32>', 'vector<u64>', 'vector<u128>', 'vector<u256>'].includes(type);\n}\n\nfunction generateTableFunctions(\n projectName: string,\n componentName: string,\n fields: Record<string, string>,\n keys: string[],\n includeStruct: boolean = true,\n enumTypes: Array<{type: string, module: string}> = [],\n type: ComponentType = 'Onchain'\n): string {\n // Separate key fields and non-key fields\n const keyFields = keys.reduce((acc, key) => ({ ...acc, [key]: fields[key] }), {});\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name))\n .reduce((acc, [name, type]) => ({ ...acc, [name]: type }), {});\n \n const keyNames = Object.keys(keyFields);\n const valueNames = Object.keys(valueFields);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n // Check if there is only one value field\n const isSingleValue = valueNames.length === 1;\n\n // Generate key parameter list, if keys are empty, return empty string\n const keyParams = keys.length > 0 \n ? keys.map(k => `${k}: ${fields[k]}`).join(', ')\n : '';\n \n // Generate key tuple related code, if keys are empty, return empty string\n const keyTupleCode = keys.length > 0\n ? `let mut key_tuple = vector::empty();\n ${keys.map(k => `key_tuple.push_back(to_bytes(&${k}));`).join('\\n ')}`\n : 'let key_tuple = vector::empty();';\n \n // Generate table ID related functions\n const tableIdFunctions = ` public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${fields[k]}\"`).join(', ')}]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[${Object.values(valueFields).map(t => `b\"${t}\"`).join(', ')}]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${k}\"`).join(', ')}]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[${valueNames.map(n => `b\"${n}\"`).join(', ')}]\n }`;\n\n // Generate register table function\n const registerFunction = ` public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }`;\n\n // Generate has series functions\n const hasFunctions = ` public fun has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_not_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n${!isSingleValue ? valueNames.map((name, index) => ` public fun has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_not_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }`).join('\\n\\n') : ''}`;\n\n // Generate delete function\n const deleteFunction = ` public(package) fun delete(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }`;\n\n // Generate getter and setter functions, only generated when there are multiple value fields\n const getterSetters = !isSingleValue ? valueNames.map(name => {\n const index = valueNames.indexOf(name);\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n \n return ` public fun get_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${fieldType} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index});\n let mut bsc_type = sui::bcs::new(value);\n ${isEnum ? `let ${name} = ${projectName}::${enumType?.module}::decode(&mut bsc_type);` : `let ${name} = sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type);`}\n ${name}\n }\n\n public(package) fun set_${name}(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${name}: ${fieldType}) {\n ${keyTupleCode}\n let value = ${isEnum ? `${projectName}::${enumType?.module}::encode(${name})` : `to_bytes(&${name})`};\n dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${index}, value);\n }`;\n }).join('\\n\\n') : '';\n\n // Generate get and set functions\n const getSetFunctions = isAllKeys \n ? ` public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n let value_tuple = vector::empty();\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : isSingleValue\n ? ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${Object.values(valueFields)[0]} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);\n let mut bsc_type = sui::bcs::new(value);\n ${!isBasicType(Object.values(valueFields)[0] as string) \n ? `let value = ${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::decode(&mut bsc_type);` \n : `let value = sui::bcs::peel_${getBcsType(Object.values(valueFields)[0] as string)}(&mut bsc_type);`}\n value\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, value: ${Object.values(valueFields)[0]}) {\n ${keyTupleCode}\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): (${Object.values(valueFields).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${valueNames.map(name => {\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${name} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n (${valueNames.join(', ')})\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = encode(${valueNames.join(', ')});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`;\n\n // Generate struct related functions\n const structFunctions = includeStruct ? ` public fun get_struct(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${toPascalCase(componentName)} {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n decode(value_tuple)\n }\n\n public(package) fun set_struct(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${componentName}: ${toPascalCase(componentName)}) {\n ${keyTupleCode}\n let value_tuple = encode_struct(${componentName});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }` : '';\n\n // Generate encode and decode functions\n const encodeDecodeFunctions = isSingleValue\n ? ` public fun encode(value: ${Object.values(valueFields)[0]}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${!isBasicType(Object.values(valueFields)[0] as string) \n ? `${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::encode(value)` \n : `to_bytes(&value)`});\n value_tuple\n }`\n : includeStruct\n ? ` public fun encode(${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `value_tuple.push_back(${isEnum ? `${projectName}::${enumType?.module}::encode(${n})` : `to_bytes(&${n})`});`;\n }).join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map(n => `${componentName}.${n}`).join(', ')})\n }\n\n public fun decode(data: vector<u8>): ${toPascalCase(componentName)} {\n let mut bsc_type = sui::bcs::new(data);\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${n} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n ${toPascalCase(componentName)} {\n ${valueNames.map(n => `${n},`).join('\\n ')}\n }\n }`\n : '';\n\n return `${tableIdFunctions}\n\n${registerFunction}\n\n${hasFunctions}\n\n${deleteFunction}\n\n${getterSetters}\n\n${getSetFunctions}\n\n${structFunctions}\n\n${encodeDecodeFunctions}`;\n}\n\nfunction toPascalCase(str: string): string {\n // Split the underscore-separated string into words\n return str\n .split('_')\n .map((word, index) => {\n // If the word is a pure number, return it as is\n if (/^\\d+$/.test(word)) {\n return word;\n }\n // Otherwise, capitalize the first letter and lowercase the rest\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getBcsType(type: string): string {\n if (type.startsWith('vector<')) {\n const innerType = type.slice(7, -1);\n if (innerType === 'vector<u8>') {\n return 'vec_vec_u8';\n }\n return `vec_${getBcsType(innerType)}`;\n }\n \n switch (type) {\n case 'bool': return 'bool';\n case 'u8': return 'u8';\n case 'u32': return 'u32';\n case 'u64': return 'u64';\n case 'u128': return 'u128';\n case 'u256': return 'u256';\n case 'address': return 'address';\n default: return type;\n }\n}\n","import { DubheConfig } from '../../types';\n\nconst checkDuplicateKeys = (config: DubheConfig): void => {\n const componentKeys = Object.keys(config.components || {});\n const resourceKeys = Object.keys(config.resources || {});\n \n const duplicates = componentKeys.filter(key => resourceKeys.includes(key));\n \n if (duplicates.length > 0) {\n throw new Error(`Duplicate keys found between components and resources: ${duplicates.join(', ')}`);\n }\n};\n\nexport const defineDapp = (config: DubheConfig): DubheConfig => {\n checkDuplicateKeys(config);\n return config;\n};","import { findUp } from 'find-up';\nimport path from 'path';\nimport esbuild from 'esbuild';\nimport { NotInsideProjectError } from './errors';\nimport { rmSync } from 'fs';\nimport { pathToFileURL } from 'url';\nimport os from 'os';\n\n// In order of preference files are checked\nconst configFiles = ['dubhe.config.js', 'dubhe.config.mjs', 'dubhe.config.ts', 'dubhe.config.mts'];\nconst TEMP_CONFIG = 'dubhe.config.example.mjs';\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: 'esm',\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: 'node',\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: 'external'\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(configPath: string | undefined, toFileURL?: boolean) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === 'win32' ? pathToFileURL(configPath).href : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","export class NotInsideProjectError extends Error {\n name = 'NotInsideProjectError';\n message = 'You are not inside a Dubhe project';\n}\n","export const parseData = (data: any) => {\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n const parsedData: any = {};\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n // @ts-ignore\n const value = data[key];\n // console.log(\"===========\", value)\n if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value)) {\n parsedData[key] = handleArray(value);\n } else if (value.hasOwnProperty('variant')) {\n parsedData[key] = { [value.variant]: {} };\n } else if (value.hasOwnProperty('fields')) {\n parsedData[key] = parseData(value.fields);\n } else {\n parsedData[key] = parseData(value);\n }\n } else {\n parsedData[key] = value;\n }\n }\n }\n return parsedData;\n};\n\nconst handleArray = (data: any[]): any[] => {\n let returnData: any[] = [];\n data.forEach((item) => {\n if (typeof item === 'object' && item !== null) {\n if (Array.isArray(item)) {\n returnData.push(handleArray(item));\n } else if (item.hasOwnProperty('variant')) {\n returnData.push({ [item.variant]: {} });\n } else if (item.hasOwnProperty('fields')) {\n returnData.push(parseData(item.fields));\n } else {\n returnData.push(parseData(item));\n }\n } else {\n returnData.push(item);\n }\n });\n return returnData;\n};\n","export enum SubscriptionKind {\n Event = 'event',\n Schema = 'schema'\n}\n\nexport type SubscribableType =\n | { kind: SubscriptionKind.Event; name?: string; sender?: string }\n | { kind: SubscriptionKind.Schema; name?: string };\n"],"mappings":"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","names":["prettier","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","formatMove","schemaPrefix","initPrefix","code","deployHookPrefix","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","package_default","generateToml","config","srcPrefix","code","package_default","formatAndWriteMove","existsSync","generateDeployHook","config","path","existsSync","code","formatAndWriteMove","generateMigrate","srcPrefix","generateDappKey","config","path","code","formatAndWriteMove","existsSync","fs","generateSystemsAndTests","config","srcPrefix","generateSchemaError","projectName","errors","path","code","name","message","formatAndWriteMove","generateInitTest","config","path","init_test_code","formatAndWriteMove","generateComponents","config","path","componentName","component","code","generateSimpleComponentCode","formatAndWriteMove","generateComponentCode","projectName","valueType","type","isEnum","isBasicType","enumModule","toSnakeCase","getBcsType","str","letter","fields","keys","isAllKeys","name","valueFieldNames","isSingleValue","allEnumTypes","_","item","index","self","t","tableFunctions","generateTableFunctions","e","structFields","constructorParams","constructorAssignments","getters","toPascalCase","setters","includeStruct","enumTypes","keyFields","acc","key","valueFields","keyNames","valueNames","keyParams","k","keyTupleCode","tableIdFunctions","registerFunction","hasFunctions","deleteFunction","getterSetters","fieldType","enumType","getSetFunctions","structFunctions","encodeDecodeFunctions","word","innerType","generateGenesis","config","path","componentRegisterCode","componentName","resourceRegisterCode","resourceName","registerTablesCode","code","genesis_code","formatAndWriteMove","toSnakeCase","str","letter","generateEnums","config","path","enumName","values","sortedValues","a","b","code","generateEnumCode","formatAndWriteMove","projectName","enumValues","v","i","generateResources","config","path","componentName","resource","code","generateSimpleComponentCode","formatAndWriteMove","type","generateComponentCode","projectName","valueType","isEnum","isBasicType","enumModule","toSnakeCase","getBcsType","str","letter","fields","keys","isAllKeys","name","valueFields","valueFieldNames","isSingleValue","enumTypes","_","item","index","self","t","tableFunctions","generateTableFunctions","e","structFields","constructorParams","constructorAssignments","getters","toPascalCase","setters","includeStruct","keyFields","acc","key","keyNames","valueNames","keyParams","k","keyTupleCode","tableIdFunctions","registerFunction","hasFunctions","deleteFunction","getterSetters","fieldType","enumType","getSetFunctions","structFunctions","encodeDecodeFunctions","word","innerType","path","schemaGen","rootDir","config","network","projectDir","existsSync","deleteFolderRecursive","generateToml","genesisPath","generateGenesis","initTestPath","generateInitTest","dappKeyPath","generateDappKey","deployHookPath","generateDeployHook","componentsPath","generateComponents","resourcesPath","generateResources","enumsPath","generateEnums","generateSchemaError","generateSystemsAndTests","generateMigrate","checkDuplicateKeys","config","componentKeys","resourceKeys","duplicates","key","defineDapp","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError","parseData","data","parsedData","key","value","handleArray","returnData","item","SubscriptionKind"]}
1
+ {"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/schemaGen.ts","../src/codegen/utils/renderMove/common.ts","../package.json","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateError.ts","../src/codegen/utils/renderMove/generateInitTest.ts","../src/codegen/utils/renderMove/generateComponents.ts","../src/codegen/utils/renderMove/generateGenesis.ts","../src/codegen/utils/renderMove/generateEnums.ts","../src/codegen/utils/renderMove/generateResources.ts","../src/codegen/utils/renderMove/dapp.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts","../src/parseData/parser/index.ts","../src/primitives/index.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(content: string, prettierConfigPath?: string): Promise<string> {\n let config;\n if (prettierConfigPath) {\n config = await prettier.resolveConfig(prettierConfigPath);\n }\n try {\n return prettier.format(content, {\n plugins: [prettierPluginMove],\n parser: 'move-parse',\n printWidth: 120,\n semi: true,\n tabWidth: 2,\n useTabs: false,\n bracketSpacing: true,\n ...config\n });\n } catch (error) {\n let message;\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = error;\n }\n console.log(`Error during output formatting: ${message}`);\n return content;\n }\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n return prettier.format(content, {\n parser: 'typescript'\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { formatMove, formatTypescript } from './format';\nimport { debug } from '../debug';\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = await formatMove(output);\n let schemaPrefix = ` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: Apache-2.0\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `;\n\n let initPrefix = `#[test_only]`;\n\n let code = schemaPrefix + formattedOutput;\n\n let deployHookPrefix = `#[allow(lint(share_owned))]`;\n\n if (\n fullOutputPath.includes('.toml') ||\n fullOutputPath.includes('system') ||\n fullOutputPath.includes('migrate')\n ) {\n code = formattedOutput;\n } else if (fullOutputPath.includes('init')) {\n code = initPrefix + formattedOutput;\n } else if (fullOutputPath.includes('genesis')) {\n code = deployHookPrefix + formattedOutput;\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from 'debug';\n\nexport const debug = createDebug('dubhe:common');\nexport const error = createDebug('dubhe:common');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from '../debug';\n\nexport const debug = parentDebug.extend('codegen');\nexport const error = parentDebug.extend('codegen');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","/**\n * Explicitly normalize a given path to a posix path (using `/` as separator).\n * This should be used for generating Solidity files that will be consumed by solc,\n * because solc expects `/` as path separator, but path.join produces `\\` if the user is on windows.\n */\nexport function posixPath(path: string): string {\n return path.replace(/\\\\/g, '/');\n}\n","import { DubheConfig } from '../../types';\nimport { rmdirSync, existsSync } from 'fs';\nimport { deleteFolderRecursive } from './common';\nimport { generateToml } from './generateToml';\nimport { generateSchemaData, generateSchemaStructure } from './generateSchema';\nimport { generateDeployHook, generateMigrate } from './generateScript';\nimport { generateDappKey } from './generateDappKey';\nimport { generateSchemaEvent } from './generateEvent';\nimport { generateSystemsAndTests } from './generateSystem';\nimport { generateSchemaHub } from './generateSchemaHub';\nimport { generateSchemaError } from './generateError';\nimport { generateDefaultSchema } from './generateDefaultSchema';\nimport { generateInitTest } from './generateInitTest';\nimport { generateComponents } from './generateComponents';\nimport { generateGenesis } from './generateGenesis';\nimport { generateEnums } from './generateEnums';\nimport { generateResources } from './generateResources';\nimport path from 'node:path';\n\nexport async function schemaGen(\n rootDir: string,\n config: DubheConfig,\n network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n console.log('\\n🚀 Starting Schema Generation Process...');\n console.log('📋 Project Configuration:');\n console.log(` └─ Name: ${config.name}`);\n console.log(` └─ Description: ${config.description || 'No description provided'}`);\n console.log(` └─ Network: ${network || 'testnet'}`);\n\n console.log(rootDir)\n const projectDir = path.join(rootDir, 'src', config.name);\n\n if (existsSync(`${projectDir}`)) {\n deleteFolderRecursive(`${projectDir}/sources/codegen`);\n }\n\n if (!existsSync(`${projectDir}/Move.toml`)) {\n await generateToml(config, rootDir);\n }\n\n const genesisPath = path.join(projectDir, 'sources', 'codegen', 'genesis.move');\n if (!existsSync(genesisPath)) {\n await generateGenesis(config, genesisPath);\n }\n\n const initTestPath = path.join(projectDir, 'sources', 'codegen', 'init_test.move');\n if (!existsSync(initTestPath)) {\n await generateInitTest(config, initTestPath);\n }\n\n const dappKeyPath = path.join(projectDir, 'sources', 'codegen', 'dapp_key.move');\n if (!existsSync(dappKeyPath)) {\n await generateDappKey(config, dappKeyPath);\n }\n\n const deployHookPath = path.join(projectDir, 'sources', 'scripts', 'deploy_hook.move');\n if (!existsSync(deployHookPath)) {\n await generateDeployHook(config, deployHookPath);\n }\n\n const componentsPath = path.join(projectDir, 'sources', 'codegen', 'components');\n if (!existsSync(componentsPath)) {\n await generateComponents(config, componentsPath);\n } else {\n await generateComponents(config, componentsPath);\n }\n\n const resourcesPath = path.join(projectDir, 'sources', 'codegen', 'resources');\n if (!existsSync(resourcesPath)) {\n await generateResources(config, resourcesPath);\n } else {\n await generateResources(config, resourcesPath);\n }\n\n const enumsPath = path.join(projectDir, 'sources', 'codegen', 'enums');\n if (!existsSync(enumsPath)) {\n await generateEnums(config, enumsPath);\n }\n\n if (config.errors) {\n await generateSchemaError(config.name, config.errors, rootDir);\n }\n\n // await generateDefaultSchema(config, rootDir);\n // await generateInit(config, rootDir);\n await generateSystemsAndTests(config, rootDir);\n await generateMigrate(config, rootDir);\n console.log('\\n✅ Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n if (fs.existsSync(path)) {\n fs.readdirSync(path).forEach((file) => {\n const curPath = `${path}/${file}`;\n if (fs.lstatSync(curPath).isDirectory()) {\n deleteFolderRecursive(curPath);\n } else {\n fs.unlinkSync(curPath);\n }\n });\n fs.rmdirSync(path);\n }\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(values: Record<string, string> | string): string {\n return Object.entries(values)\n .map(([key, _]) => `${key}`)\n .join(',');\n}\n\nfunction isAddress(str: string): boolean {\n const regex = /^0x[a-fA-F0-9]+$/;\n return regex.test(str);\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaType): string {\nexport function getStructTypes(values: Record<string, string>): string {\n return `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n\nexport function containsString(obj: Record<string, any>, searchString: string): boolean {\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const value = obj[key];\n if (\n (typeof value === 'string' && value === searchString) ||\n (typeof value === 'string' && value.includes(searchString) && value.includes('>'))\n ) {\n return true;\n }\n }\n }\n return false;\n}\n","{\n \"name\": \"@0xobelisk/sui-common\",\n \"version\": \"1.2.0-pre.50\",\n \"description\": \"Common low level logic shared between packages\",\n \"keywords\": [\n \"sui\",\n \"obelisk labs\",\n \"move\",\n \"blockchain\"\n ],\n \"type\": \"module\",\n \"author\": \"team@obelisk.build\",\n \"homepage\": \"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme\",\n \"bugs\": \"https://github.com/0xobelisk/dubhe/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/0xobelisk/dubhe.git\"\n },\n \"license\": \"Apache-2.0\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"typesVersions\": {\n \"*\": {\n \"index\": [\n \"./src/index.ts\"\n ]\n }\n },\n \"types\": \"./dist/index.d.ts\",\n \"scripts\": {\n \"build\": \"pnpm run build:js\",\n \"build:js\": \"tsup && chmod +x ./dist/index.js\",\n \"clean\": \"pnpm run clean:js\",\n \"clean:js\": \"rimraf dist\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint . --ext .ts\",\n \"test\": \"vitest\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"type-check\": \"tsc --noEmit\",\n \"validate\": \"pnpm format:check && pnpm type-check\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.0.1\",\n \"debug\": \"^4.3.4\",\n \"dotenv\": \"^16.0.3\",\n \"ejs\": \"^3.1.8\",\n \"esbuild\": \"^0.17.15\",\n \"execa\": \"^7.0.0\",\n \"find-up\": \"^6.3.0\",\n \"glob\": \"^8.0.3\",\n \"path\": \"^0.12.7\",\n \"prettier\": \"^3.1.1\",\n \"prettier-plugin-move-js\": \"^0.0.5\",\n \"prettier-plugin-rust\": \"^0.1.9\",\n \"prettier-plugin-solidity\": \"^1.1.2\",\n \"typescript\": \"5.1.6\",\n \"yargs\": \"^17.7.1\",\n \"zod\": \"^3.22.3\",\n \"zod-validation-error\": \"^1.3.0\"\n },\n \"devDependencies\": {\n \"@types/debug\": \"^4.1.12\",\n \"@types/ejs\": \"^3.1.1\",\n \"@types/glob\": \"^7.2.0\",\n \"@types/node\": \"^18.15.11\",\n \"@types/yargs\": \"^17.0.10\",\n \"tsup\": \"^6.7.0\",\n \"tsx\": \"^3.12.6\",\n \"vitest\": \"^2.1.3\",\n \"eslint\": \"^8.56.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"prettier\": \"3.3.3\"\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport packageJson from '../../../../package.json';\n\nexport async function generateToml(config: DubheConfig, srcPrefix: string) {\n console.log('\\n📄 Starting Move.toml Generation...');\n console.log(` └─ Output path: ${srcPrefix}/src/${config.name}/Move.toml`);\n\n let code = `[package]\nname = \"${config.name}\"\nversion = \"1.0.0\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.46.3\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe-wip.git\", subdir = \"packages/sui-framework/src/dubhe\", rev = \"v${packageJson.version}\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x1024\"\n`;\n await formatAndWriteMove(code, `${srcPrefix}/src/${config.name}/Move.toml`, 'formatAndWriteMove');\n console.log('✅ Move.toml Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nimport { readFileSync } from 'fs';\n\nfunction capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport async function generateDeployHook(config: DubheConfig, path: string) {\n if (!existsSync(path)) {\n const code = `module ${config.name}::deploy_hook {\n\t\t\t use dubhe::dapp_service::DappHub;\n\n public(package) fun run(_dapp_hub: &mut DappHub, _ctx: &mut TxContext) {\n\n }\n}`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`)) {\n let code = `module ${config.name}::migrate {\n const ON_CHAIN_VERSION: u32 = 1;\n\n public fun on_chain_version(): u32 {\n ON_CHAIN_VERSION\n }\n}\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`,\n 'formatAndWriteMove'\n );\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(config: DubheConfig, path: string) {\n let code = `module ${config.name}::dapp_key {\nuse std::type_name;\n use sui::address;\n use std::ascii::String;\n\n /// Authorization token for the app.\n\n public struct DappKey has copy, drop {}\n\n public(package) fun new(): DappKey {\n DappKey { }\n }\n\n public fun to_string(): String {\n type_name::get<DappKey>().into_string()\n }\n\n public fun package_id(): address {\n let package_id_str = type_name::get<DappKey>().get_address();\n address::from_ascii_bytes(package_id_str.as_bytes())\n }\n}\n`;\n await formatAndWriteMove(\n code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateSystemsAndTests(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/systems`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/systems`, { recursive: true });\n }\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/tests`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/tests`, { recursive: true });\n }\n}\n","import { BaseType, ErrorData, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n getStructAttrsWithType,\n getStructAttrs,\n getStructTypes,\n getStructAttrsQuery\n} from './common';\n\nfunction convertToSnakeCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n}\n\nexport async function generateSchemaError(projectName: string, errors: ErrorData, path: string) {\n console.log('\\n📦 Starting Schema Error Generation...');\n\n let code = `module ${projectName}::errors {\n\t\t${Object.entries(errors)\n .map(([name, message]) => {\n console.log(` └─ ${name}: ${message}`);\n return `#[error]\n\t\t\t\tconst ${name.toUpperCase()}: vector<u8> = b\"${message}\";\n\t\t\t\tpublic fun ${name}_error(condition: bool) { assert!(condition, ${name.toUpperCase()}) }\n\t\t`;\n })\n .join('\\n')}\t\t\n }`;\n\n await formatAndWriteMove(\n code,\n `${path}/src/${projectName}/sources/codegen/errors.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateInitTest(config: DubheConfig, path: string) {\n let init_test_code = `module ${config.name}::init_test {\n use sui::clock;\n use sui::test_scenario;\n use sui::test_scenario::Scenario;\n use dubhe::dapp_service::{Self, DappHub};\n\n public fun deploy_dapp_for_testing(scenario: &mut Scenario): DappHub {\n let ctx = test_scenario::ctx(scenario);\n let clock = clock::create_for_testing(ctx);\n let mut dapp_hub = dapp_service::create_dapp_hub_for_testing(ctx);\n ${config.name}::genesis::run(&mut dapp_hub, &clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(scenario, ctx.sender());\n dapp_hub\n }\n}\n`;\n await formatAndWriteMove(\n init_test_code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { ComponentType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateComponents(config: DubheConfig, path: string) {\n console.log('\\n📦 Starting Components Generation...');\n \n for (const [componentName, component] of Object.entries(config.components)) {\n console.log(` └─ ${componentName}: ${JSON.stringify(component)}`);\n \n // Handle simple type cases\n if (typeof component === 'string') {\n const code = generateSimpleComponentCode(config.name, componentName, component, 'Onchain');\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Handle empty object cases, representing components with only entity_id key\n if (Object.keys(component).length === 0) {\n const code = generateComponentCode(config.name, componentName, {\n fields: {\n 'entity_id': 'address'\n },\n keys: ['entity_id'],\n offchain: false\n });\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Handle cases where keys are not defined - default to entity_id for components\n if (!component.keys) {\n component.keys = ['entity_id'];\n if (!component.fields['entity_id']) {\n component.fields = {\n 'entity_id': 'address',\n ...component.fields\n };\n }\n }\n \n // Validate that components only have one key\n if (component.keys && component.keys.length > 1) {\n throw new Error(`Component '${componentName}' can only have one key, but found ${component.keys.length} keys: ${component.keys.join(', ')}`);\n }\n \n const code = generateComponentCode(config.name, componentName, component);\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateSimpleComponentCode(projectName: string, componentName: string, valueType: string, type: ComponentType = 'Onchain'): string {\n // Check if it's an enum type\n const isEnum = !isBasicType(valueType);\n const enumModule = isEnum ? `${toSnakeCase(valueType)}` : '';\n \n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${isEnum ? ` use ${projectName}::${enumModule};\n use ${projectName}::${enumModule}::{${valueType}};` : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[b\"address\"]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[b\"${valueType}\"]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[b\"entity_id\"]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[b\"value\"]\n }\n\n public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }\n\n public fun has(dapp_hub: &DappHub, entity_id: address): bool {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public(package) fun delete(dapp_hub: &mut DappHub, entity_id: address) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }\n\n public fun get(dapp_hub: &DappHub, entity_id: address): (${valueType}) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${isEnum ? `let value = ${projectName}::${enumModule}::decode(&mut bsc_type);` : `let value = sui::bcs::peel_${getBcsType(valueType)}(&mut bsc_type);`}\n (value)\n }\n\n public(package) fun set(dapp_hub: &mut DappHub, entity_id: address, value: ${valueType}) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }\n\n public fun encode(value: ${valueType}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${isEnum ? `${projectName}::${enumModule}::encode(value)` : `to_bytes(&value)`});\n value_tuple\n }\n}`;\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nfunction generateComponentCode(projectName: string, componentName: string, component: any): string {\n const fields = component.fields;\n const keys = component.keys || ['entity_id'];\n const offchain = component.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n \n // Generate field type and name lists, excluding fields in keys\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name));\n const valueFieldNames = valueFields.map(([name]) => name);\n \n // If there is only one value field, do not generate struct\n const isSingleValue = valueFieldNames.length === 1;\n\n // Get all enum type fields (both key fields and value fields) and their corresponding module names\n const allEnumTypes = Object.entries(fields)\n .filter(([_, type]) => !isBasicType(type as string))\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => \n self.findIndex(t => t.type === item.type) === index\n );\n \n // Generate table related functions\n const tableFunctions = generateTableFunctions(projectName, componentName, fields, keys, !isAllKeys && !isSingleValue, allEnumTypes, type);\n\n // If all fields are keys or there is only one value field, do not generate struct related code\n if (isAllKeys || isSingleValue) {\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${allEnumTypes.length > 0 ? allEnumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n${tableFunctions}\n}`;\n }\n\n // Generate struct fields, excluding fields in keys\n const structFields = valueFieldNames\n .map(name => ` ${name}: ${fields[name]},`)\n .join('\\n');\n\n // Generate constructor parameters, only containing non-key fields\n const constructorParams = valueFieldNames\n .map(name => `${name}: ${fields[name]}`)\n .join(', ');\n\n // Generate constructor field assignments, only containing non-key fields\n const constructorAssignments = valueFieldNames\n .map(name => ` ${name},`)\n .join('\\n');\n\n // Generate getter functions, excluding fields in keys\n const getters = valueFieldNames\n .map(name => ` public fun ${name}(self: &${toPascalCase(componentName)}): ${fields[name]} {\n self.${name}\n }`)\n .join('\\n\\n');\n\n // Generate setter functions, excluding fields in keys\n const setters = valueFieldNames\n .map(name => ` public fun update_${name}(self: &mut ${toPascalCase(componentName)}, ${name}: ${fields[name]}) {\n self.${name} = ${name}\n }`)\n .join('\\n\\n');\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${allEnumTypes.length > 0 ? allEnumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public struct ${toPascalCase(componentName)} has copy, drop, store {\n${structFields}\n }\n\n public fun new(${constructorParams}): ${toPascalCase(componentName)} {\n ${toPascalCase(componentName)} {\n${constructorAssignments}\n }\n }\n\n${getters}\n\n${setters}\n\n${tableFunctions}\n}`;\n}\n\n// Check if it is a basic type\nfunction isBasicType(type: string): boolean {\n return ['address', 'bool', 'u8', 'u32', 'u64', 'u128', 'u256', \n 'vector<address>', 'vector<bool>', 'vector<u8>', 'vector<vector<u8>>', \n 'vector<u32>', 'vector<u64>', 'vector<u128>', 'vector<u256>'].includes(type);\n}\n\nfunction generateTableFunctions(\n projectName: string,\n componentName: string,\n fields: Record<string, string>,\n keys: string[],\n includeStruct: boolean = true,\n enumTypes: Array<{type: string, module: string}> = [],\n type: ComponentType = 'Onchain'\n): string {\n // Separate key fields and non-key fields\n const keyFields = keys.reduce((acc, key) => ({ ...acc, [key]: fields[key] }), {});\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name))\n .reduce((acc, [name, type]) => ({ ...acc, [name]: type }), {});\n \n const keyNames = Object.keys(keyFields);\n const valueNames = Object.keys(valueFields);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n // Check if there is only one value field\n const isSingleValue = valueNames.length === 1;\n\n // Generate key parameter list, if keys are empty, return empty string\n const keyParams = keys.length > 0 \n ? keys.map(k => `${k}: ${fields[k]}`).join(', ')\n : '';\n \n // Generate key tuple related code, if keys are empty, return empty string\n const keyTupleCode = keys.length > 0\n ? `let mut key_tuple = vector::empty();\n ${keys.map(k => `key_tuple.push_back(to_bytes(&${k}));`).join('\\n ')}`\n : 'let key_tuple = vector::empty();';\n \n // Generate table ID related functions\n const tableIdFunctions = ` public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${fields[k]}\"`).join(', ')}]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[${Object.values(valueFields).map(t => `b\"${t}\"`).join(', ')}]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${k}\"`).join(', ')}]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[${valueNames.map(n => `b\"${n}\"`).join(', ')}]\n }`;\n\n // Generate register table function\n const registerFunction = ` public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }`;\n\n // Generate has series functions\n const hasFunctions = ` public fun has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_not_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n${!isSingleValue ? valueNames.map((name, index) => ` public fun has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_not_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }`).join('\\n\\n') : ''}`;\n\n // Generate delete function\n const deleteFunction = ` public(package) fun delete(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }`;\n\n // Generate getter and setter functions, only generated when there are multiple value fields\n const getterSetters = !isSingleValue ? valueNames.map(name => {\n const index = valueNames.indexOf(name);\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n \n return ` public fun get_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${fieldType} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index});\n let mut bsc_type = sui::bcs::new(value);\n ${isEnum ? `let ${name} = ${projectName}::${enumType?.module}::decode(&mut bsc_type);` : `let ${name} = sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type);`}\n ${name}\n }\n\n public(package) fun set_${name}(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${name}: ${fieldType}) {\n ${keyTupleCode}\n let value = ${isEnum ? `${projectName}::${enumType?.module}::encode(${name})` : `to_bytes(&${name})`};\n dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${index}, value);\n }`;\n }).join('\\n\\n') : '';\n\n // Generate get and set functions\n const getSetFunctions = isAllKeys \n ? ` public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n let value_tuple = vector::empty();\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : isSingleValue\n ? ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${Object.values(valueFields)[0]} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);\n let mut bsc_type = sui::bcs::new(value);\n ${!isBasicType(Object.values(valueFields)[0] as string) \n ? `let value = ${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::decode(&mut bsc_type);` \n : `let value = sui::bcs::peel_${getBcsType(Object.values(valueFields)[0] as string)}(&mut bsc_type);`}\n value\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, value: ${Object.values(valueFields)[0]}) {\n ${keyTupleCode}\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): (${Object.values(valueFields).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${valueNames.map(name => {\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${name} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n (${valueNames.join(', ')})\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = encode(${valueNames.join(', ')});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`;\n\n // Generate struct related functions\n const structFunctions = includeStruct ? ` public fun get_struct(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${toPascalCase(componentName)} {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n decode(value_tuple)\n }\n\n public(package) fun set_struct(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${componentName}: ${toPascalCase(componentName)}) {\n ${keyTupleCode}\n let value_tuple = encode_struct(${componentName});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }` : '';\n\n // Generate encode and decode functions\n const encodeDecodeFunctions = isSingleValue\n ? ` public fun encode(value: ${Object.values(valueFields)[0]}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${!isBasicType(Object.values(valueFields)[0] as string) \n ? `${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::encode(value)` \n : `to_bytes(&value)`});\n value_tuple\n }`\n : includeStruct\n ? ` public fun encode(${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `value_tuple.push_back(${isEnum ? `${projectName}::${enumType?.module}::encode(${n})` : `to_bytes(&${n})`});`;\n }).join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map(n => `${componentName}.${n}`).join(', ')})\n }\n\n public fun decode(data: vector<u8>): ${toPascalCase(componentName)} {\n let mut bsc_type = sui::bcs::new(data);\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${n} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n ${toPascalCase(componentName)} {\n ${valueNames.map(n => `${n},`).join('\\n ')}\n }\n }`\n : '';\n\n return `${tableIdFunctions}\n\n${registerFunction}\n\n${hasFunctions}\n\n${deleteFunction}\n\n${getterSetters}\n\n${getSetFunctions}\n\n${structFunctions}\n\n${encodeDecodeFunctions}`;\n}\n\nfunction toPascalCase(str: string): string {\n // Split the underscore-separated string into words\n return str\n .split('_')\n .map((word, index) => {\n // If the word is a pure number, return it as is\n if (/^\\d+$/.test(word)) {\n return word;\n }\n // Otherwise, capitalize the first letter and lowercase the rest\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getBcsType(type: string): string {\n if (type.startsWith('vector<')) {\n const innerType = type.slice(7, -1);\n if (innerType === 'vector<u8>') {\n return 'vec_vec_u8';\n }\n return `vec_${getBcsType(innerType)}`;\n }\n \n switch (type) {\n case 'bool': return 'bool';\n case 'u8': return 'u8';\n case 'u32': return 'u32';\n case 'u64': return 'u64';\n case 'u128': return 'u128';\n case 'u256': return 'u256';\n case 'address': return 'address';\n default: return type;\n }\n}","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\nimport path from 'node:path';\n\nfunction capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport async function generateGenesis(config: DubheConfig, path: string) {\n // Generate register table code\n const componentRegisterCode = Object.keys(config.components || {})\n .map(componentName => ` ${componentName}::register_table(dapp_hub, ctx);`)\n .join('\\n');\n \n const resourceRegisterCode = Object.keys(config.resources || {})\n .map(resourceName => ` ${resourceName}::register_table(dapp_hub, ctx);`)\n .join('\\n');\n\n const registerTablesCode = [componentRegisterCode, resourceRegisterCode]\n .filter(code => code.trim() !== '')\n .join('\\n');\n\n let genesis_code = `module ${config.name}::genesis {\n use sui::clock::Clock;\n use dubhe::dapp_service::{Self, DappHub};\n use ${config.name}::dapp_key;\n ${Object.keys(config.components || {}).map(componentName => `use ${config.name}::${componentName};`).join('\\n')}\n ${Object.keys(config.resources || {}).map(resourceName => `use ${config.name}::${resourceName};`).join('\\n')}\n\n public entry fun run(dapp_hub: &mut DappHub, clock: &Clock, ctx: &mut TxContext) {\n // Create Dapp\n let dapp_key = dapp_key::new();\n dapp_service::create_dapp(dapp_hub, dapp_key, b\"${config.name}\", b\"${config.description}\", clock, ctx);\n\n // Register tables\n${registerTablesCode}\n\n // Logic that needs to be automated once the contract is deployed\n ${config.name}::deploy_hook::run(dapp_hub, ctx);\n }\n\n public(package) fun upgrade(dapp_hub: &mut DappHub, new_package_id: address, new_version: u32, _ctx: &mut TxContext) {\n // Upgrade Dapp\n let dapp_key = dapp_key::new();\n dapp_service::upgrade_dapp(dapp_hub, dapp_key, new_package_id, new_version);\n // Register new tables\n // ==========================================\n\n // ==========================================\n }\n}\n`;\n await formatAndWriteMove(\n genesis_code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nexport async function generateEnums(config: DubheConfig, path: string) {\n console.log('\\n📦 Starting Enums Generation...');\n \n if (!config.enums) {\n return;\n }\n\n for (const [enumName, values] of Object.entries(config.enums)) {\n console.log(` └─ ${enumName}: ${JSON.stringify(values)}`);\n \n // Sort enum values by first letter\n const sortedValues = [...values].sort((a, b) => a.localeCompare(b));\n \n const code = generateEnumCode(config.name, enumName, sortedValues);\n await formatAndWriteMove(\n code,\n `${path}/${toSnakeCase(enumName)}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateEnumCode(projectName: string, enumName: string, values: string[]): string {\n const enumValues = values.map(v => v.charAt(0).toUpperCase() + v.slice(1)).join(',');\n \n return `module ${projectName}::${toSnakeCase(enumName)} {\n use sui::bcs::{BCS, to_bytes, peel_enum_tag};\n\n public enum ${enumName} has copy, drop, store {\n ${enumValues}\n }\n\n${values.map(v => ` public fun new_${v.toLowerCase()}(): ${enumName} {\n ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)}\n }`).join('\\n\\n')}\n\n public fun encode(self: ${enumName}): vector<u8> {\n to_bytes(&self)\n }\n\n public fun decode(bytes: &mut BCS): ${enumName} {\n match(peel_enum_tag(bytes)) {\n${values.map((v, i) => ` ${i} => ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)},`).join('\\n')}\n _ => abort,\n }\n }\n}`;\n}\n","import { DubheConfig } from '../../types';\nimport { ComponentType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateResources(config: DubheConfig, path: string) {\n console.log('\\n📦 Starting Resources Generation...');\n \n for (const [componentName, resource] of Object.entries(config.resources)) {\n console.log(` └─ ${componentName}: ${JSON.stringify(resource)}`);\n \n // Handle simple type cases\n if (typeof resource === 'string') {\n const code = generateSimpleComponentCode(config.name, componentName, resource, 'Onchain');\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Validate that resource has fields defined\n if (!resource.fields || Object.keys(resource.fields).length === 0) {\n throw new Error(`Resource '${componentName}' must have fields defined, but found empty object`);\n }\n\n // For resources, don't default to any keys - use what's defined or empty array\n if (!resource.keys) {\n resource.keys = [];\n }\n \n const offchain = resource.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n const code = generateComponentCode(config.name, componentName, resource);\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateSimpleComponentCode(projectName: string, componentName: string, valueType: string, type: ComponentType = 'Onchain'): string {\n // Check if it's an enum type\n const isEnum = !isBasicType(valueType);\n const enumModule = isEnum ? `${toSnakeCase(valueType)}` : '';\n \n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${isEnum ? ` use ${projectName}::${enumModule};\n use ${projectName}::${enumModule}::{${valueType}};` : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[b\"${valueType}\"]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[b\"value\"]\n }\n\n public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }\n\n public fun has(dapp_hub: &DappHub): bool {\n let key_tuple = vector::empty();\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public(package) fun delete(dapp_hub: &mut DappHub) {\n let key_tuple = vector::empty();\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }\n\n public fun get(dapp_hub: &DappHub): (${valueType}) {\n let key_tuple = vector::empty();\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${isEnum ? `let value = ${projectName}::${enumModule}::decode(&mut bsc_type);` : `let value = sui::bcs::peel_${getBcsType(valueType)}(&mut bsc_type);`}\n (value)\n }\n\n public(package) fun set(dapp_hub: &mut DappHub, value: ${valueType}) {\n let key_tuple = vector::empty();\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }\n\n public fun encode(value: ${valueType}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${isEnum ? `${projectName}::${enumModule}::encode(value)` : `to_bytes(&value)`});\n value_tuple\n }\n}`;\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nfunction generateComponentCode(projectName: string, componentName: string, resource: any): string {\n const fields = resource.fields;\n const keys = resource.keys || [];\n const offchain = resource.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n \n // Generate field type and name lists, excluding fields in keys\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name));\n const valueFieldNames = valueFields.map(([name]) => name);\n \n // If there is only one value field, do not generate struct\n const isSingleValue = valueFieldNames.length === 1;\n\n // Get all enum type fields and their corresponding module names\n const enumTypes = valueFields\n .filter(([_, type]) => !isBasicType(type as string))\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => \n self.findIndex(t => t.type === item.type) === index\n );\n \n // Generate table related functions\n const tableFunctions = generateTableFunctions(projectName, componentName, fields, keys, !isAllKeys && !isSingleValue, enumTypes, type);\n\n // If all fields are keys or there is only one value field, do not generate struct related code\n if (isAllKeys || isSingleValue) {\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${enumTypes.length > 0 ? enumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n${tableFunctions}\n}`;\n }\n\n // Generate struct fields, excluding fields in keys\n const structFields = valueFieldNames\n .map(name => ` ${name}: ${fields[name]},`)\n .join('\\n');\n\n // Generate constructor parameters, only containing non-key fields\n const constructorParams = valueFieldNames\n .map(name => `${name}: ${fields[name]}`)\n .join(', ');\n\n // Generate constructor field assignments, only containing non-key fields\n const constructorAssignments = valueFieldNames\n .map(name => ` ${name},`)\n .join('\\n');\n\n // Generate getter functions, excluding fields in keys\n const getters = valueFieldNames\n .map(name => ` public fun ${name}(self: &${toPascalCase(componentName)}): ${fields[name]} {\n self.${name}\n }`)\n .join('\\n\\n');\n\n // Generate setter functions, excluding fields in keys\n const setters = valueFieldNames\n .map(name => ` public fun update_${name}(self: &mut ${toPascalCase(componentName)}, ${name}: ${fields[name]}) {\n self.${name} = ${name}\n }`)\n .join('\\n\\n');\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${enumTypes.length > 0 ? enumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public struct ${toPascalCase(componentName)} has copy, drop, store {\n${structFields}\n }\n\n public fun new(${constructorParams}): ${toPascalCase(componentName)} {\n ${toPascalCase(componentName)} {\n${constructorAssignments}\n }\n }\n\n${getters}\n\n${setters}\n\n${tableFunctions}\n}`;\n}\n\n// Check if it is a basic type\nfunction isBasicType(type: string): boolean {\n return ['address', 'bool', 'u8', 'u32', 'u64', 'u128', 'u256', \n 'vector<address>', 'vector<bool>', 'vector<u8>', 'vector<vector<u8>>', \n 'vector<u32>', 'vector<u64>', 'vector<u128>', 'vector<u256>'].includes(type);\n}\n\nfunction generateTableFunctions(\n projectName: string,\n componentName: string,\n fields: Record<string, string>,\n keys: string[],\n includeStruct: boolean = true,\n enumTypes: Array<{type: string, module: string}> = [],\n type: ComponentType = 'Onchain'\n): string {\n // Separate key fields and non-key fields\n const keyFields = keys.reduce((acc, key) => ({ ...acc, [key]: fields[key] }), {});\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name))\n .reduce((acc, [name, type]) => ({ ...acc, [name]: type }), {});\n \n const keyNames = Object.keys(keyFields);\n const valueNames = Object.keys(valueFields);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n // Check if there is only one value field\n const isSingleValue = valueNames.length === 1;\n\n // Generate key parameter list, if keys are empty, return empty string\n const keyParams = keys.length > 0 \n ? keys.map(k => `${k}: ${fields[k]}`).join(', ')\n : '';\n \n // Generate key tuple related code, if keys are empty, return empty string\n const keyTupleCode = keys.length > 0\n ? `let mut key_tuple = vector::empty();\n ${keys.map(k => `key_tuple.push_back(to_bytes(&${k}));`).join('\\n ')}`\n : 'let key_tuple = vector::empty();';\n \n // Generate table ID related functions\n const tableIdFunctions = ` public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${fields[k]}\"`).join(', ')}]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[${Object.values(valueFields).map(t => `b\"${t}\"`).join(', ')}]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${k}\"`).join(', ')}]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[${valueNames.map(n => `b\"${n}\"`).join(', ')}]\n }`;\n\n // Generate register table function\n const registerFunction = ` public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }`;\n\n // Generate has series functions\n const hasFunctions = ` public fun has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_not_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n${!isSingleValue ? valueNames.map((name, index) => ` public fun has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_not_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }`).join('\\n\\n') : ''}`;\n\n // Generate delete function\n const deleteFunction = ` public(package) fun delete(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }`;\n\n // Generate getter and setter functions, only generated when there are multiple value fields\n const getterSetters = !isSingleValue ? valueNames.map(name => {\n const index = valueNames.indexOf(name);\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n \n return ` public fun get_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${fieldType} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index});\n let mut bsc_type = sui::bcs::new(value);\n ${isEnum ? `let ${name} = ${projectName}::${enumType?.module}::decode(&mut bsc_type);` : `let ${name} = sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type);`}\n ${name}\n }\n\n public(package) fun set_${name}(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${name}: ${fieldType}) {\n ${keyTupleCode}\n let value = ${isEnum ? `${projectName}::${enumType?.module}::encode(${name})` : `to_bytes(&${name})`};\n dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${index}, value);\n }`;\n }).join('\\n\\n') : '';\n\n // Generate get and set functions\n const getSetFunctions = isAllKeys \n ? ` public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n let value_tuple = vector::empty();\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : isSingleValue\n ? ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${Object.values(valueFields)[0]} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);\n let mut bsc_type = sui::bcs::new(value);\n ${!isBasicType(Object.values(valueFields)[0] as string) \n ? `let value = ${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::decode(&mut bsc_type);` \n : `let value = sui::bcs::peel_${getBcsType(Object.values(valueFields)[0] as string)}(&mut bsc_type);`}\n value\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, value: ${Object.values(valueFields)[0]}) {\n ${keyTupleCode}\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): (${Object.values(valueFields).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${valueNames.map(name => {\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${name} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n (${valueNames.join(', ')})\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = encode(${valueNames.join(', ')});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`;\n\n // Generate struct related functions\n const structFunctions = includeStruct ? ` public fun get_struct(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${toPascalCase(componentName)} {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n decode(value_tuple)\n }\n\n public(package) fun set_struct(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${componentName}: ${toPascalCase(componentName)}) {\n ${keyTupleCode}\n let value_tuple = encode_struct(${componentName});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }` : '';\n\n // Generate encode and decode functions\n const encodeDecodeFunctions = isSingleValue\n ? ` public fun encode(value: ${Object.values(valueFields)[0]}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${!isBasicType(Object.values(valueFields)[0] as string) \n ? `${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::encode(value)` \n : `to_bytes(&value)`});\n value_tuple\n }`\n : includeStruct\n ? ` public fun encode(${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `value_tuple.push_back(${isEnum ? `${projectName}::${enumType?.module}::encode(${n})` : `to_bytes(&${n})`});`;\n }).join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map(n => `${componentName}.${n}`).join(', ')})\n }\n\n public fun decode(data: vector<u8>): ${toPascalCase(componentName)} {\n let mut bsc_type = sui::bcs::new(data);\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${n} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n ${toPascalCase(componentName)} {\n ${valueNames.map(n => `${n},`).join('\\n ')}\n }\n }`\n : '';\n\n return `${tableIdFunctions}\n\n${registerFunction}\n\n${hasFunctions}\n\n${deleteFunction}\n\n${getterSetters}\n\n${getSetFunctions}\n\n${structFunctions}\n\n${encodeDecodeFunctions}`;\n}\n\nfunction toPascalCase(str: string): string {\n // Split the underscore-separated string into words\n return str\n .split('_')\n .map((word, index) => {\n // If the word is a pure number, return it as is\n if (/^\\d+$/.test(word)) {\n return word;\n }\n // Otherwise, capitalize the first letter and lowercase the rest\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getBcsType(type: string): string {\n if (type.startsWith('vector<')) {\n const innerType = type.slice(7, -1);\n if (innerType === 'vector<u8>') {\n return 'vec_vec_u8';\n }\n return `vec_${getBcsType(innerType)}`;\n }\n \n switch (type) {\n case 'bool': return 'bool';\n case 'u8': return 'u8';\n case 'u32': return 'u32';\n case 'u64': return 'u64';\n case 'u128': return 'u128';\n case 'u256': return 'u256';\n case 'address': return 'address';\n default: return type;\n }\n}\n","import { DubheConfig } from '../../types';\n\nconst checkDuplicateKeys = (config: DubheConfig): void => {\n const componentKeys = Object.keys(config.components || {});\n const resourceKeys = Object.keys(config.resources || {});\n \n const duplicates = componentKeys.filter(key => resourceKeys.includes(key));\n \n if (duplicates.length > 0) {\n throw new Error(`Duplicate keys found between components and resources: ${duplicates.join(', ')}`);\n }\n};\n\nexport const defineConfig = (config: DubheConfig): DubheConfig => {\n checkDuplicateKeys(config);\n return config;\n};","import { findUp } from 'find-up';\nimport path from 'path';\nimport esbuild from 'esbuild';\nimport { NotInsideProjectError } from './errors';\nimport { rmSync } from 'fs';\nimport { pathToFileURL } from 'url';\nimport os from 'os';\n\n// In order of preference files are checked\nconst configFiles = ['dubhe.config.js', 'dubhe.config.mjs', 'dubhe.config.ts', 'dubhe.config.mts'];\nconst TEMP_CONFIG = 'dubhe.config.example.mjs';\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: 'esm',\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: 'node',\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: 'external'\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(configPath: string | undefined, toFileURL?: boolean) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === 'win32' ? pathToFileURL(configPath).href : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","export class NotInsideProjectError extends Error {\n name = 'NotInsideProjectError';\n message = 'You are not inside a Dubhe project';\n}\n","export const parseData = (data: any) => {\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n const parsedData: any = {};\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n // @ts-ignore\n const value = data[key];\n // console.log(\"===========\", value)\n if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value)) {\n parsedData[key] = handleArray(value);\n } else if (value.hasOwnProperty('variant')) {\n parsedData[key] = { [value.variant]: {} };\n } else if (value.hasOwnProperty('fields')) {\n parsedData[key] = parseData(value.fields);\n } else {\n parsedData[key] = parseData(value);\n }\n } else {\n parsedData[key] = value;\n }\n }\n }\n return parsedData;\n};\n\nconst handleArray = (data: any[]): any[] => {\n let returnData: any[] = [];\n data.forEach((item) => {\n if (typeof item === 'object' && item !== null) {\n if (Array.isArray(item)) {\n returnData.push(handleArray(item));\n } else if (item.hasOwnProperty('variant')) {\n returnData.push({ [item.variant]: {} });\n } else if (item.hasOwnProperty('fields')) {\n returnData.push(parseData(item.fields));\n } else {\n returnData.push(parseData(item));\n }\n } else {\n returnData.push(item);\n }\n });\n return returnData;\n};\n","export enum SubscriptionKind {\n Event = 'event',\n Schema = 'schema'\n}\n\nexport type SubscribableType =\n | { kind: SubscriptionKind.Event; name?: string; sender?: string }\n | { kind: SubscriptionKind.Schema; name?: string };\n"],"mappings":"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","names":["prettier","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","formatMove","schemaPrefix","initPrefix","code","deployHookPrefix","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","package_default","generateToml","config","srcPrefix","code","package_default","formatAndWriteMove","existsSync","generateDeployHook","config","path","existsSync","code","formatAndWriteMove","generateMigrate","srcPrefix","generateDappKey","config","path","code","formatAndWriteMove","existsSync","fs","generateSystemsAndTests","config","srcPrefix","generateSchemaError","projectName","errors","path","code","name","message","formatAndWriteMove","generateInitTest","config","path","init_test_code","formatAndWriteMove","generateComponents","config","path","componentName","component","code","generateSimpleComponentCode","formatAndWriteMove","generateComponentCode","projectName","valueType","type","isEnum","isBasicType","enumModule","toSnakeCase","getBcsType","str","letter","fields","keys","isAllKeys","name","valueFieldNames","isSingleValue","allEnumTypes","_","item","index","self","t","tableFunctions","generateTableFunctions","e","structFields","constructorParams","constructorAssignments","getters","toPascalCase","setters","includeStruct","enumTypes","keyFields","acc","key","valueFields","keyNames","valueNames","keyParams","k","keyTupleCode","tableIdFunctions","registerFunction","hasFunctions","deleteFunction","getterSetters","fieldType","enumType","getSetFunctions","structFunctions","encodeDecodeFunctions","word","innerType","generateGenesis","config","path","componentRegisterCode","componentName","resourceRegisterCode","resourceName","registerTablesCode","code","genesis_code","formatAndWriteMove","toSnakeCase","str","letter","generateEnums","config","path","enumName","values","sortedValues","a","b","code","generateEnumCode","formatAndWriteMove","projectName","enumValues","v","generateResources","config","path","componentName","resource","code","generateSimpleComponentCode","formatAndWriteMove","type","generateComponentCode","projectName","valueType","isEnum","isBasicType","enumModule","toSnakeCase","getBcsType","str","letter","fields","keys","isAllKeys","name","valueFields","valueFieldNames","isSingleValue","enumTypes","_","item","index","self","t","tableFunctions","generateTableFunctions","e","structFields","constructorParams","constructorAssignments","getters","toPascalCase","setters","includeStruct","keyFields","acc","key","keyNames","valueNames","keyParams","k","keyTupleCode","tableIdFunctions","registerFunction","hasFunctions","deleteFunction","getterSetters","fieldType","enumType","getSetFunctions","structFunctions","encodeDecodeFunctions","word","innerType","path","schemaGen","rootDir","config","network","projectDir","existsSync","deleteFolderRecursive","generateToml","genesisPath","generateGenesis","initTestPath","generateInitTest","dappKeyPath","generateDappKey","deployHookPath","generateDeployHook","componentsPath","generateComponents","resourcesPath","generateResources","enumsPath","generateEnums","generateSchemaError","generateSystemsAndTests","generateMigrate","checkDuplicateKeys","config","componentKeys","resourceKeys","duplicates","key","defineConfig","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError","parseData","data","parsedData","key","value","handleArray","returnData","item","SubscriptionKind"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xobelisk/sui-common",
3
- "version": "1.2.0-pre.49",
3
+ "version": "1.2.0-pre.50",
4
4
  "description": "Common low level logic shared between packages",
5
5
  "keywords": [
6
6
  "sui",
@@ -11,7 +11,7 @@ const checkDuplicateKeys = (config: DubheConfig): void => {
11
11
  }
12
12
  };
13
13
 
14
- export const defineDapp = (config: DubheConfig): DubheConfig => {
14
+ export const defineConfig = (config: DubheConfig): DubheConfig => {
15
15
  checkDuplicateKeys(config);
16
16
  return config;
17
17
  };
@@ -40,6 +40,16 @@ ${registerTablesCode}
40
40
  // Logic that needs to be automated once the contract is deployed
41
41
  ${config.name}::deploy_hook::run(dapp_hub, ctx);
42
42
  }
43
+
44
+ public(package) fun upgrade(dapp_hub: &mut DappHub, new_package_id: address, new_version: u32, _ctx: &mut TxContext) {
45
+ // Upgrade Dapp
46
+ let dapp_key = dapp_key::new();
47
+ dapp_service::upgrade_dapp(dapp_hub, dapp_key, new_package_id, new_version);
48
+ // Register new tables
49
+ // ==========================================
50
+
51
+ // ==========================================
52
+ }
43
53
  }
44
54
  `;
45
55
  await formatAndWriteMove(