@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
|
|
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,
|
|
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
|
|
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
|
-
`,
|
|
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
|
|
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(([
|
|
59
|
-
const ${
|
|
60
|
-
public fun ${
|
|
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
|
|
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
|
-
${
|
|
87
|
-
use ${e}::${
|
|
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
|
-
${
|
|
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(${
|
|
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,
|
|
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
|
|
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
|
-
${
|
|
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
|
|
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${
|
|
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${
|
|
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${
|
|
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,
|
|
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, ${
|
|
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${
|
|
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, ${
|
|
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${
|
|
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, ${
|
|
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${
|
|
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
|
|
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, ${
|
|
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
|
-
${
|
|
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${
|
|
283
|
+
public(package) fun set_${n}(dapp_hub: &mut DappHub${p?", "+p:""}, ${n}: ${d}) {
|
|
284
284
|
${l}
|
|
285
|
-
let value = ${
|
|
286
|
-
dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${
|
|
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${
|
|
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${
|
|
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}::${
|
|
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${
|
|
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${
|
|
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
|
|
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${
|
|
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=
|
|
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${
|
|
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}::${
|
|
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
|
-
}`:
|
|
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
|
|
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
|
|
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
|
-
`),
|
|
368
|
-
`),
|
|
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
|
-
${
|
|
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 $(
|
|
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
|
|
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(
|
|
398
|
-
${t}::${
|
|
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((
|
|
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
|
|
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
|
-
${
|
|
422
|
-
use ${e}::${
|
|
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
|
-
${
|
|
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(${
|
|
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,
|
|
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
|
|
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: &${
|
|
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 ${
|
|
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 ${
|
|
526
|
-
${
|
|
535
|
+
public struct ${w(t)} has copy, drop, store {
|
|
536
|
+
${p}
|
|
527
537
|
}
|
|
528
538
|
|
|
529
|
-
public fun new(${l}): ${
|
|
530
|
-
${
|
|
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,
|
|
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${
|
|
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${
|
|
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${
|
|
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,
|
|
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, ${
|
|
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${
|
|
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, ${
|
|
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${
|
|
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, ${
|
|
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${
|
|
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
|
|
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, ${
|
|
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
|
-
${
|
|
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${
|
|
624
|
+
public(package) fun set_${n}(dapp_hub: &mut DappHub${p?", "+p:""}, ${n}: ${d}) {
|
|
615
625
|
${l}
|
|
616
|
-
let value = ${
|
|
617
|
-
dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${
|
|
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${
|
|
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${
|
|
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}::${
|
|
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${
|
|
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${
|
|
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
|
|
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${
|
|
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=
|
|
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${
|
|
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}::${
|
|
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
|
-
}`:
|
|
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
|
|
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}: ${
|
|
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>): ${
|
|
684
|
+
public fun decode(data: vector<u8>): ${w(t)} {
|
|
675
685
|
let mut bsc_type = sui::bcs::new(data);
|
|
676
|
-
${c.map(n=>{let
|
|
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
|
-
${
|
|
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
|
|
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);
|
|
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(
|
|
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
|
@@ -11,7 +11,7 @@ const checkDuplicateKeys = (config: DubheConfig): void => {
|
|
|
11
11
|
}
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
-
export const
|
|
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(
|