@0xobelisk/sui-common 1.2.0-pre.4 → 1.2.0-pre.41

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.js CHANGED
@@ -1,229 +1,719 @@
1
- import v from"prettier";import Y from"prettier-plugin-move-js";async function C(e,t){let r;t&&(r=await v.resolveConfig(t));try{return v.format(e,{plugins:[Y],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...r})}catch(n){let a;return n instanceof Error?a=n.message:a=n,console.log(`Error during output formatting: ${a}`),e}}async function M(e){return v.format(e,{parser:"typescript"})}import y from"node:fs/promises";import R from"node:path";import E from"debug";var f=E("dubhe:common"),q=E("dubhe:common");f.log=console.debug.bind(console);q.log=console.error.bind(console);var b=f.extend("codegen"),N=f.extend("codegen");b.log=console.debug.bind(console);N.log=console.error.bind(console);async function c(e,t,r){let n=await C(e),a=` // Copyright (c) Obelisk Labs, Inc.
1
+ import G from"prettier";import fe from"prettier-plugin-move-js";async function X(e,t){let s;t&&(s=await G.resolveConfig(t));try{return G.format(e,{plugins:[fe],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...s})}catch(n){let o;return n instanceof Error?o=n.message:o=n,console.log(`Error during output formatting: ${o}`),e}}async function Y(e){return G.format(e,{parser:"typescript"})}import B from"node:fs/promises";import N from"node:path";import q from"debug";var W=q("dubhe:common"),ve=q("dubhe:common");W.log=console.debug.bind(console);ve.log=console.error.bind(console);var L=W.extend("codegen"),he=W.extend("codegen");L.log=console.debug.bind(console);he.log=console.error.bind(console);async function $(e,t,s){let n=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
- `,o="#[test_only]",s=a+n,i="#[allow(lint(share_owned))]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?s=n:t.includes("init")?s=o+n:t.includes("genesis")&&(s=i+n),await y.mkdir(R.dirname(t),{recursive:!0}),await y.writeFile(t,s),b(`${r}: ${t}`)}async function Ae(e,t,r){let n=await M(e);await y.mkdir(R.dirname(t),{recursive:!0}),await y.writeFile(t,n),b(`${r}: ${t}`)}function Te(e){return e.replace(/\\/g,"/")}import{existsSync as A}from"fs";import g from"fs";function x(e){g.existsSync(e)&&(g.readdirSync(e).forEach(t=>{let r=`${e}/${t}`;g.lstatSync(r).isDirectory()?x(r):g.unlinkSync(r)}),g.rmdirSync(e))}function $(e){return Object.entries(e).map(([t,r])=>`${t}`).join(",")}function U(e){return`(${Object.entries(e).map(([t,r])=>`${r}`)})`}function m(e){return Object.entries(e).map(([t,r])=>`${t}: ${r}`)}function O(e){return Object.entries(e).map(([t,r])=>`self.${t}`)}function W(e,t){for(let r in e)if(e.hasOwnProperty(r)){let n=e[r];if(typeof n=="string"&&n===t||typeof n=="string"&&n.includes(t)&&n.includes(">"))return!0}return!1}async function F(e,t){console.log(`
8
- \u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/Move.toml`);let r=`[package]
7
+ `,i="#[test_only]",b=o+n,g="#[allow(lint(share_owned))]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?b=n:t.includes("init")?b=i+n:t.includes("genesis")&&(b=g+n),await B.mkdir(N.dirname(t),{recursive:!0}),await B.writeFile(t,b),L(`${s}: ${t}`)}async function Qe(e,t,s){let n=await Y(e);await B.mkdir(N.dirname(t),{recursive:!0}),await B.writeFile(t,n),L(`${s}: ${t}`)}function Ye(e){return e.replace(/\\/g,"/")}import{existsSync as w}from"fs";import F from"fs";function z(e){F.existsSync(e)&&(F.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;F.lstatSync(s).isDirectory()?z(s):F.unlinkSync(s)}),F.rmdirSync(e))}var ee={name:"@0xobelisk/sui-common",version:"1.2.0-pre.41",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
+ \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"
11
11
  edition = "2024"
12
12
 
13
13
  [dependencies]
14
14
  Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "mainnet-v1.46.3" }
15
- Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", subdir = "contracts/dubhe", rev = "develop" }
15
+ Dubhe = { git = "https://github.com/0xobelisk/dubhe-wip.git", subdir = "packages/sui-framework/src/dubhe", rev = "v${ee.version}" }
16
16
 
17
17
  [addresses]
18
18
  sui = "0x2"
19
- ${e.name} = "0x0"
20
- `;await c(r,`${t}/contracts/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
21
- `)}function ee(e){return e.sort((t,r)=>{let n=t.charAt(0).toLowerCase(),a=r.charAt(0).toLowerCase();return n<a?-1:n>a?1:0})}function te(e,t){return Object.entries(t).map(([r,n])=>`public(package) fun set_${r}(self: &mut ${e}, ${r}: ${n}) {
22
- self.${r} = ${r};
23
- }`).join(`
24
- `)}function re(e,t){return`public(package) fun set(self: &mut ${e}, ${m(t)}) {
25
- ${Object.entries(t).map(([r])=>`self.${r} = ${r};`).join(`
26
- `)}
27
- }`}function ne(e,t){return`public fun get(self: &${e}): ${U(t)} {
28
- (${O(t)})
29
- }`}function oe(e,t){return Object.entries(t).map(([r,n])=>`public fun get_${r}(self: &${e}): ${n} {
30
- self.${r}
31
- }`).join(`
32
- `)}function d(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function L(e,t,r){console.log(`
33
- \u{1F4E6} Starting Schema Data Generation...`);for(let n of Object.keys(t)){let a=n,o=t[n];console.log(` \u2514\u2500 ${a} ${Array.isArray(o)?"(enum)":"(struct)"}: ${JSON.stringify(o)}`);let s="",i=Object.keys(t).filter(u=>Array.isArray(t[u])).map(u=>u);if(Array.isArray(o)){let u=ee(o);s=`module ${e}::${e}_${d(a)} {
34
- public enum ${a} has copy, drop , store {
35
- ${u}
36
- }
37
-
38
- ${u.map(p=>`public fun new_${d(p)}(): ${a} {
39
- ${a}::${p}
40
- }`).join("")}`}else s=`module ${e}::${e}_${d(a)} {
41
- use std::ascii::String;
42
-
43
- ${Object.keys(t).map(u=>{if(W(o,u))return`use ${e}::${e}_${d(u)}::${u};`}).filter(Boolean).join(`
44
- `)}
45
-
46
- public struct ${a} has copy, drop , store {
47
- ${m(o)}
48
- }
49
-
50
- public fun new(${m(o)}): ${a} {
51
- ${a} {
52
- ${$(o)}
53
- }
54
- }
55
-
56
- ${ne(a,o)}
57
- ${oe(a,o)}
58
- ${te(a,o)}
59
- ${re(a,o)}
60
- }`;await c(s,`${r}/contracts/${e}/sources/codegen/data/${d(a)}.move`,"formatAndWriteMove")}}function se(e,t){return t!=null?Object.keys(t).map(n=>`use ${e}::${e}_${d(n)}::${n};`).join(`
61
- `):""}async function w(e,t,r,n){console.log(`
62
- \u{1F4E6} Starting Schema Structure Generation...`),Object.entries(r).forEach(([o,s])=>{console.log(` \u2514\u2500 ${o}: ${s}`)});let a=`module ${e}::${e}_schema {
63
- use std::ascii::String;
64
- use std::ascii::string;
65
- use sui::package::UpgradeCap;
66
- use std::type_name;
67
- use dubhe::storage;
68
- use dubhe::${e=="dubhe"?"storage_value_internal":"storage_value"}::{Self, StorageValue};
69
- use dubhe::${e=="dubhe"?"storage_map_internal":"storage_map"}::{Self, StorageMap};
70
- use dubhe::${e=="dubhe"?"storage_double_map_internal":"storage_double_map"}::{Self, StorageDoubleMap};
71
- use sui::dynamic_field as df;
72
-
73
- ${se(e,t)}
74
-
75
- public struct Schema has key, store { id: UID }
76
-
77
- ${Object.entries(r).map(([o,s])=>`public fun borrow_${o}(self: &Schema) : &${s} {
78
- storage::borrow_field(&self.id, b"${o}")
79
- }
80
-
81
- public(package) fun ${o}(self: &mut Schema): &mut ${s} {
82
- storage::borrow_mut_field(&mut self.id, b"${o}")
83
- }
84
- `).join("")}
85
-
86
-
87
- public(package) fun create(ctx: &mut TxContext): Schema {
88
- let mut id = object::new(ctx);
89
- ${Object.entries(r).map(([o,s])=>{let i="";return s.includes("StorageValue")?i=`${e=="dubhe"?"storage_value_internal":"storage_value"}::new(b"${o}", ctx)`:s.includes("StorageMap")?i=`${e=="dubhe"?"storage_map_internal":"storage_map"}::new(b"${o}", ctx)`:s.includes("StorageDoubleMap")&&(i=`${e=="dubhe"?"storage_double_map_internal":"storage_double_map"}::new(b"${o}", ctx)`),`storage::add_field<${s}>(&mut id, b"${o}", ${i});`}).join(`
90
- `)}
91
-
92
- Schema { id }
93
- }
94
-
95
- public(package) fun id(self: &mut Schema): &mut UID {
96
- &mut self.id
97
- }
98
-
99
- public(package) fun borrow_id(self: &Schema): &UID {
100
- &self.id
101
- }
102
-
103
- public fun migrate(_schema: &mut Schema, _ctx: &mut TxContext) { }
104
-
105
- // ======================================== View Functions ========================================
106
- ${Object.entries(r).map(([o,s])=>{let i=s.match(/<(.+)>/)[1].split(",").map(X=>X.trim()),u=[],p="",h="";return s.includes("StorageValue")?(u=[],p=`${i[0]}`,h="get()"):s.includes("StorageMap")?(u=[`key: ${i[0]}`],p=`${i[1]}`,h="get(key)"):s.includes("StorageDoubleMap")&&(u=[`key1: ${i[0]}`,`key2: ${i[1]}`],p=`${i[2]}`,h="get(key1, key2)"),`public fun get_${o}(self: &Schema, ${u}) : &${p} {
107
- self.borrow_${o}().${h}
108
- }`}).join(`
109
- `)}
110
- // =========================================================================================================
111
- }`;await c(a,`${n}/contracts/${e}/sources/codegen/core/schema.move`,"formatAndWriteMove")}import{existsSync as V}from"fs";async function B(e,t){let r=`${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`;if(!V(r)){let n=`module ${e.name}::${e.name}_deploy_hook {
112
- use ${e.name}::${e.name}_schema::Schema;
113
- ${e.name!=="dubhe"?"use dubhe::dubhe_schema::Schema as DubheSchema;":""}
19
+ ${e.name} = "0x1024"
20
+ `;await $(s,`${t}/src/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
21
+ `)}import{existsSync as se}from"fs";async function ue(e,t){if(!se(t)){let s=`module ${e.name}::deploy_hook {
22
+ use dubhe::dapp_hub::DappHub;
114
23
 
115
- public(package) fun run(${e.name!=="dubhe"?"_dubhe_schema: &mut DubheSchema,":""}_schema: &mut Schema, _ctx: &mut TxContext) {
24
+ public(package) fun run(_dapp_hub: &mut DappHub, _ctx: &mut TxContext) {
116
25
 
117
26
  }
118
- }`;await c(n,r,"formatAndWriteMove")}}async function I(e,t){if(!V(`${t}/contracts/${e.name}/sources/scripts/migrate.move`)){let r=`module ${e.name}::${e.name}_migrate {
27
+ }`;await $(s,t,"formatAndWriteMove")}}async function ne(e,t){if(!se(`${t}/src/${e.name}/sources/scripts/migrate.move`)){let s=`module ${e.name}::migrate {
119
28
  const ON_CHAIN_VERSION: u32 = 1;
120
29
 
121
30
  public fun on_chain_version(): u32 {
122
31
  ON_CHAIN_VERSION
123
32
  }
124
33
  }
125
- `;await c(r,`${t}/contracts/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}async function j(e,t){let r=`module ${e.name}::${e.name}_dapp_key {
126
- /// Authorization token for the app.
127
- public struct DappKey has copy, drop {}
34
+ `;await $(s,`${t}/src/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}async function re(e,t){let s=`module ${e.name}::dapp_key {
35
+ use std::type_name;
36
+ use sui::address;
37
+ use std::ascii::String;
38
+
39
+ /// Authorization token for the app.
128
40
 
129
- public(package) fun new(): DappKey {
130
- DappKey { }
131
- }
41
+ public struct DappKey has copy, drop {}
42
+
43
+ public(package) fun new(): DappKey {
44
+ DappKey { }
45
+ }
46
+
47
+ public fun to_string(): String {
48
+ type_name::get<DappKey>().into_string()
49
+ }
50
+
51
+ public fun package_id(): address {
52
+ let package_id_str = type_name::get<DappKey>().get_address();
53
+ address::from_ascii_bytes(package_id_str.as_bytes())
54
+ }
132
55
  }
133
- `;await c(r,`${t}/contracts/${e.name}/sources/codegen/core/dapp_key.move`,"formatAndWriteMove")}function l(e){return e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ae(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}function G(e,t){return t!=null?Object.keys(t).map(n=>`use ${e}::${e}_${ae(n)}::${n};`).join(`
134
- `):""}async function D(e,t,r,n){console.log(`
135
- \u{1F4E6} Starting Schema Event Generation...`);for(let o of Object.keys(r)){let s=o,i=r[o];console.log(` \u2514\u2500 ${s} event: ${JSON.stringify(i)}`);let u=`module ${e}::${e}_${s}_event {
136
- use sui::event;
137
- use std::ascii::String;
138
- ${G(e,t)}
139
-
140
- public struct ${l(s)}Event has copy, drop {
141
- ${m(i)}
142
- }
143
-
144
- public fun new(${m(i)}): ${l(s)}Event {
145
- ${l(s)}Event {
146
- ${$(i)}
147
- }
148
- }
149
- }`;await c(u,`${n}/contracts/${e}/sources/codegen/data/${s}_event.move`,"formatAndWriteMove")}let a=`module ${e}::${e}_events {
150
- use std::ascii::{String, string};
151
- ${G(e,t)}
152
- ${Object.entries(r).map(([o,s])=>`
153
- use ${e}::${e}_${o}_event::${l(o)}Event;
154
- use ${e}::${e}_${o}_event;
155
- public fun ${o}_event(${m(s)}) {
156
- dubhe::storage_event::emit_set_record<${l(o)}Event, ${l(o)}Event, ${l(o)}Event>(
157
- string(b"${o}_event"),
158
- option::none(),
159
- option::none(),
160
- option::some(${e}_${o}_event::new(${$(s)}))
161
- )
162
- }
163
- `).join(`
164
- `)}
165
- }`;await c(a,`${n}/contracts/${e}/sources/codegen/events.move`,"formatAndWriteMove")}import{existsSync as K}from"fs";import z from"node:fs/promises";async function H(e,t){K(`${t}/contracts/${e.name}/sources/systems`)||await z.mkdir(`${t}/contracts/${e.name}/sources/systems`,{recursive:!0}),K(`${t}/contracts/${e.name}/sources/tests`)||await z.mkdir(`${t}/contracts/${e.name}/sources/tests`,{recursive:!0})}async function Q(e,t,r){console.log(`
166
- \u{1F4E6} Starting Schema Error Generation...`);let n=`module ${e}::${e}_errors {
167
- ${Object.entries(t).map(([a,o])=>(console.log(` \u2514\u2500 ${a}: ${o}`),`#[error]
168
- const ${a.toUpperCase()}: vector<u8> = b"${o}";
169
- public fun ${a}_error(condition: bool) { assert!(condition, ${a.toUpperCase()}) }
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
+ \u{1F4E6} Starting Schema Error Generation...`);let n=`module ${e}::errors {
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()}) }
170
61
  `)).join(`
171
62
  `)}
172
- }`;await c(n,`${r}/contracts/${e}/sources/codegen/errors.move`,"formatAndWriteMove")}async function Z(e,t){let r=`module ${e.name}::${e.name}_init_test {
173
- use sui::clock;
174
- use sui::test_scenario;
175
- use sui::test_scenario::Scenario;
176
- use dubhe::dubhe_schema::Schema as DubheSchema;
177
- ${e.name!=="dubhe"?`use ${e.name}::${e.name}_schema::Schema;`:""}
178
-
179
- public fun deploy_dapp_for_testing(scenario: &mut Scenario): ${e.name!=="dubhe"?"(DubheSchema, Schema)":"DubheSchema"} {
180
- ${e.name!=="dubhe"?"let mut dubhe_schema = dubhe::dubhe_init_test::create_dubhe_schema_for_other_contract(scenario);":""}
181
- let ctx = test_scenario::ctx(scenario);
182
- let clock = clock::create_for_testing(ctx);
183
- ${e.name}::${e.name}_genesis::run(${e.name!=="dubhe"?"&mut dubhe_schema,":""}&clock, ctx);
184
- clock::destroy_for_testing(clock);
185
- test_scenario::next_tx(scenario, ctx.sender());
186
- ${e.name!=="dubhe"?`
187
- let schema = test_scenario::take_shared<Schema>(scenario);
188
- (dubhe_schema, schema)
189
- `:"test_scenario::take_shared<DubheSchema>(scenario)"}
190
- }
191
-
192
- ${e.name=="dubhe"?`
193
- public fun create_dubhe_schema_for_other_contract(scenario: &mut Scenario): DubheSchema {
194
- let ctx = test_scenario::ctx(scenario);
195
- let mut schema = dubhe::dubhe_schema::create(ctx);
196
- dubhe::dubhe_deploy_hook::run(&mut schema, ctx);
197
- sui::transfer::public_share_object(schema);
198
- test_scenario::next_tx(scenario, ctx.sender());
199
- test_scenario::take_shared<DubheSchema>(scenario)
63
+ }`;await $(n,`${s}/src/${e}/sources/codegen/errors.move`,"formatAndWriteMove")}async function ce(e,t){let s=`module ${e.name}::init_test {
64
+ use sui::clock;
65
+ use sui::test_scenario;
66
+ use sui::test_scenario::Scenario;
67
+ use dubhe::dapp_hub::{DappHub, Self};
68
+
69
+ public fun deploy_dapp_for_testing(scenario: &mut Scenario): DappHub {
70
+ let ctx = test_scenario::ctx(scenario);
71
+ let clock = clock::create_for_testing(ctx);
72
+ let mut dapp_hub = dapp_hub::create_dapp_hub_for_testing(ctx);
73
+ ${e.name}::genesis::run(&mut dapp_hub, &clock, ctx);
74
+ clock::destroy_for_testing(clock);
75
+ test_scenario::next_tx(scenario, ctx.sender());
76
+ dapp_hub
200
77
  }
201
- `:""}
202
78
  }
203
- `;await c(r,`${t}/contracts/${e.name}/sources/codegen/core/init_test.move`,"formatAndWriteMove");let n=`module ${e.name}::${e.name}_genesis {
204
- use std::ascii::string;
205
-
206
- use sui::clock::Clock;
207
-
208
- ${e.name!=="dubhe"?"use dubhe::dubhe_schema::Schema as DubheSchema;":""}
209
- public entry fun run(${e.name!=="dubhe"?"_dubhe_schema: &mut DubheSchema,":""}clock: &Clock, ctx: &mut TxContext) {
210
- // Create schemas
211
- let mut schema = ${e.name}::${e.name}_schema::create(ctx);
212
- // Setup default storage
213
- dubhe::dubhe_dapp_system::create_dapp(
214
- ${e.name!=="dubhe"?"_dubhe_schema":"&mut schema"},
215
- ${e.name}::${e.name}_dapp_key::new(),
216
- dubhe::dubhe_dapp_metadata::new(string(b"${e.name}"), string(b"${e.description}"), vector[], string(b""), clock.timestamp_ms(), vector[]),
217
- ctx
218
- );
79
+ `;await $(s,t,"formatAndWriteMove")}async function V(e,t){console.log(`
80
+ \u{1F4E6} Starting Components Generation...`);for(let[s,n]of Object.entries(e.components)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`),typeof n=="string"){let i=De(e.name,s,n,"Onchain");await $(i,`${t}/${s}.move`,"formatAndWriteMove");continue}if(Object.keys(n).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(n.keys||(n.keys=["entity_id"],n.fields.entity_id||(n.fields={entity_id:"address",...n.fields})),n.keys&&n.keys.length>1)throw new Error(`Component '${s}' can only have one key, but found ${n.keys.length} keys: ${n.keys.join(", ")}`);let o=le(e.name,s,n);await $(o,`${t}/${s}.move`,"formatAndWriteMove")}}function De(e,t,s,n="Onchain"){let o=!C(s),i=o?`${de(s)}`:"";return`module ${e}::${t} {
81
+ use sui::bcs::{to_bytes};
82
+ use dubhe::table_id;
83
+ use dubhe::dapp_state;
84
+ use dubhe::dapp_service;
85
+ use dubhe::dapp_hub;
86
+ use dubhe::dapp_hub::DappHub;
87
+ use ${e}::dapp_key;
88
+ use ${e}::dapp_key::DappKey;
89
+ ${o?` use ${e}::${i};
90
+ use ${e}::${i}::{${s}};`:""}
91
+
92
+ const TABLE_NAME: vector<u8> = b"${t}";
93
+
94
+ public fun get_table_id(): vector<u8> {
95
+ table_id::encode(table_id::${n==="Offchain"?"offchain_table_type":"onchain_table_type"}(), TABLE_NAME)
96
+ }
97
+
98
+ public fun get_key_schemas(): vector<vector<u8>> {
99
+ vector[b"address"]
100
+ }
101
+
102
+ public fun get_value_schemas(): vector<vector<u8>> {
103
+ vector[b"${s}"]
104
+ }
105
+
106
+ public fun get_key_names(): vector<vector<u8>> {
107
+ vector[b"entity_id"]
108
+ }
109
+
110
+ public fun get_value_names(): vector<vector<u8>> {
111
+ vector[b"value"]
112
+ }
113
+
114
+ public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {
115
+ let dapp_key = dapp_key::new();
116
+ dapp_service::register_table(
117
+ dapp_hub,
118
+ dapp_key,
119
+ get_table_id(),
120
+ TABLE_NAME,
121
+ get_key_schemas(),
122
+ get_key_names(),
123
+ get_value_schemas(),
124
+ get_value_names(),
125
+ ctx
126
+ );
127
+ }
128
+
129
+ public fun has(dapp_hub: &DappHub, entity_id: address): bool {
130
+ let mut key_tuple = vector::empty();
131
+ key_tuple.push_back(to_bytes(&entity_id));
132
+ dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
133
+ }
134
+
135
+ public(package) fun delete(dapp_hub: &mut DappHub, entity_id: address) {
136
+ let mut key_tuple = vector::empty();
137
+ key_tuple.push_back(to_bytes(&entity_id));
138
+ dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);
139
+ }
140
+
141
+ public fun get(dapp_hub: &DappHub, entity_id: address): (${s}) {
142
+ let mut key_tuple = vector::empty();
143
+ key_tuple.push_back(to_bytes(&entity_id));
144
+ let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
145
+ let mut bsc_type = sui::bcs::new(value_tuple);
146
+ ${o?`let value = ${e}::${i}::decode(&mut bsc_type);`:`let value = sui::bcs::peel_${M(s)}(&mut bsc_type);`}
147
+ (value)
148
+ }
149
+
150
+ public(package) fun set(dapp_hub: &mut DappHub, entity_id: address, value: ${s}) {
151
+ let mut key_tuple = vector::empty();
152
+ key_tuple.push_back(to_bytes(&entity_id));
153
+ let value_tuple = encode(value);
154
+ dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
155
+ }
156
+
157
+ public fun encode(value: ${s}): vector<vector<u8>> {
158
+ let mut value_tuple = vector::empty();
159
+ value_tuple.push_back(${o?`${e}::${i}::encode(value)`:"to_bytes(&value)"});
160
+ value_tuple
161
+ }
162
+ }`}function de(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function le(e,t,s){let n=s.fields,o=s.keys||["entity_id"],b=s.offchain||!1?"Offchain":"Onchain",g=Object.keys(n).every(r=>o.includes(r)),m=Object.entries(n).filter(([r])=>!o.includes(r)).map(([r])=>r),c=m.length===1,h=Object.entries(n).filter(([r,f])=>!C(f)).map(([r,f])=>({type:f,module:`${de(f)}`})).filter((r,f,H)=>H.findIndex(T=>T.type===r.type)===f),k=xe(e,t,n,o,!g&&!c,h,b);if(g||c)return`module ${e}::${t} {
163
+ use sui::bcs::{to_bytes};
164
+ use dubhe::table_id;
165
+ use dubhe::dapp_state;
166
+ use dubhe::dapp_service;
167
+ use dubhe::dapp_hub;
168
+ use dubhe::dapp_hub::DappHub;
169
+ use ${e}::dapp_key;
170
+ use ${e}::dapp_key::DappKey;
171
+ ${h.length>0?h.map(r=>` use ${e}::${r.module};
172
+ use ${e}::${r.module}::{${r.type}};`).join(`
173
+ `):""}
174
+
175
+ const TABLE_NAME: vector<u8> = b"${t}";
176
+
177
+ ${k}
178
+ }`;let p=m.map(r=>` ${r}: ${n[r]},`).join(`
179
+ `),l=m.map(r=>`${r}: ${n[r]}`).join(", "),O=m.map(r=>` ${r},`).join(`
180
+ `),S=m.map(r=>` public fun ${r}(self: &${D(t)}): ${n[r]} {
181
+ self.${r}
182
+ }`).join(`
183
+
184
+ `),E=m.map(r=>` public fun update_${r}(self: &mut ${D(t)}, ${r}: ${n[r]}) {
185
+ self.${r} = ${r}
186
+ }`).join(`
187
+
188
+ `);return`module ${e}::${t} {
189
+ use sui::bcs::{to_bytes};
190
+ use dubhe::table_id;
191
+ use dubhe::dapp_state;
192
+ use dubhe::dapp_service;
193
+ use dubhe::dapp_hub;
194
+ use dubhe::dapp_hub::DappHub;
195
+ use ${e}::dapp_key;
196
+ use ${e}::dapp_key::DappKey;
197
+ ${h.length>0?h.map(r=>` use ${e}::${r.module};
198
+ use ${e}::${r.module}::{${r.type}};`).join(`
199
+ `):""}
200
+
201
+ const TABLE_NAME: vector<u8> = b"${t}";
202
+
203
+ public struct ${D(t)} has copy, drop, store {
204
+ ${p}
205
+ }
206
+
207
+ public fun new(${l}): ${D(t)} {
208
+ ${D(t)} {
209
+ ${O}
210
+ }
211
+ }
212
+
213
+ ${S}
214
+
215
+ ${E}
216
+
217
+ ${k}
218
+ }`}function C(e){return["address","bool","u8","u32","u64","u128","u256","vector<address>","vector<bool>","vector<u8>","vector<vector<u8>>","vector<u32>","vector<u64>","vector<u128>","vector<u256>"].includes(e)}function xe(e,t,s,n,o=!0,i=[],b="Onchain"){let g=n.reduce((u,a)=>({...u,[a]:s[a]}),{}),_=Object.entries(s).filter(([u])=>!n.includes(u)).reduce((u,[a,d])=>({...u,[a]:d}),{}),m=Object.keys(g),c=Object.keys(_),h=Object.keys(s).every(u=>n.includes(u)),k=c.length===1,p=n.length>0?n.map(u=>`${u}: ${s[u]}`).join(", "):"",l=n.length>0?`let mut key_tuple = vector::empty();
219
+ ${n.map(u=>`key_tuple.push_back(to_bytes(&${u}));`).join(`
220
+ `)}`:"let key_tuple = vector::empty();",O=` public fun get_table_id(): vector<u8> {
221
+ table_id::encode(table_id::${b==="Offchain"?"offchain_table_type":"onchain_table_type"}(), TABLE_NAME)
222
+ }
223
+
224
+ public fun get_key_schemas(): vector<vector<u8>> {
225
+ vector[${n.map(u=>`b"${s[u]}"`).join(", ")}]
226
+ }
227
+
228
+ public fun get_value_schemas(): vector<vector<u8>> {
229
+ vector[${Object.values(_).map(u=>`b"${u}"`).join(", ")}]
230
+ }
231
+
232
+ public fun get_key_names(): vector<vector<u8>> {
233
+ vector[${n.map(u=>`b"${u}"`).join(", ")}]
234
+ }
235
+
236
+ public fun get_value_names(): vector<vector<u8>> {
237
+ vector[${c.map(u=>`b"${u}"`).join(", ")}]
238
+ }`,S=` public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {
239
+ let dapp_key = dapp_key::new();
240
+ dapp_service::register_table(
241
+ dapp_hub,
242
+ dapp_key,
243
+ get_table_id(),
244
+ TABLE_NAME,
245
+ get_key_schemas(),
246
+ get_key_names(),
247
+ get_value_schemas(),
248
+ get_value_names(),
249
+ ctx
250
+ );
251
+ }`,E=` public fun has(dapp_hub: &DappHub${p?", "+p:""}): bool {
252
+ ${l}
253
+ dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
254
+ }
255
+
256
+ public fun ensure_has(dapp_hub: &DappHub${p?", "+p:""}) {
257
+ ${l}
258
+ dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
259
+ }
260
+
261
+ public fun ensure_not_has(dapp_hub: &DappHub${p?", "+p:""}) {
262
+ ${l}
263
+ dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
264
+ }
265
+
266
+ ${k?"":c.map((u,a)=>` public fun has_${u}(dapp_hub: &DappHub${p?", "+p:""}): bool {
267
+ ${l}
268
+ dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
269
+ }
270
+
271
+ public fun ensure_has_${u}(dapp_hub: &DappHub${p?", "+p:""}) {
272
+ ${l}
273
+ dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
274
+ }
275
+
276
+ public fun ensure_not_has_${u}(dapp_hub: &DappHub${p?", "+p:""}) {
277
+ ${l}
278
+ dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
279
+ }`).join(`
280
+
281
+ `)}`,r=` public(package) fun delete(dapp_hub: &mut DappHub${p?", "+p:""}) {
282
+ ${l}
283
+ dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);
284
+ }`,f=k?"":c.map(u=>{let a=c.indexOf(u),d=s[u],y=!C(d),v=y?i.find(P=>P.type===d):null;return` public fun get_${u}(dapp_hub: &DappHub${p?", "+p:""}): ${d} {
285
+ ${l}
286
+ let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a});
287
+ let mut bsc_type = sui::bcs::new(value);
288
+ ${y?`let ${u} = ${e}::${v?.module}::decode(&mut bsc_type);`:`let ${u} = sui::bcs::peel_${M(d)}(&mut bsc_type);`}
289
+ ${u}
290
+ }
291
+
292
+ public(package) fun set_${u}(dapp_hub: &mut DappHub${p?", "+p:""}, ${u}: ${d}) {
293
+ ${l}
294
+ let value = ${y?`${e}::${v?.module}::encode(${u})`:`to_bytes(&${u})`};
295
+ dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${a}, value);
296
+ }`}).join(`
297
+
298
+ `),H=h?` public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}) {
299
+ ${l}
300
+ let value_tuple = vector::empty();
301
+ dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
302
+ }`:k?` public fun get(dapp_hub: &DappHub${p?", "+p:""}): ${Object.values(_)[0]} {
303
+ ${l}
304
+ let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);
305
+ let mut bsc_type = sui::bcs::new(value);
306
+ ${C(Object.values(_)[0])?`let value = sui::bcs::peel_${M(Object.values(_)[0])}(&mut bsc_type);`:`let value = ${e}::${i.find(u=>u.type===Object.values(_)[0])?.module}::decode(&mut bsc_type);`}
307
+ value
308
+ }
309
+
310
+ public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}, value: ${Object.values(_)[0]}) {
311
+ ${l}
312
+ let value_tuple = encode(value);
313
+ dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
314
+ }`:` public fun get(dapp_hub: &DappHub${p?", "+p:""}): (${Object.values(_).join(", ")}) {
315
+ ${l}
316
+ let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
317
+ let mut bsc_type = sui::bcs::new(value_tuple);
318
+ ${c.map(u=>{let a=s[u],d=!C(a),y=d?i.find(v=>v.type===a):null;return`let ${u} = ${d?`${e}::${y?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${M(a)}(&mut bsc_type)`};`}).join(`
319
+ `)}
320
+ (${c.join(", ")})
321
+ }
322
+
323
+ public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}, ${c.map(u=>`${u}: ${s[u]}`).join(", ")}) {
324
+ ${l}
325
+ let value_tuple = encode(${c.join(", ")});
326
+ dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
327
+ }`,T=o?` public fun get_struct(dapp_hub: &DappHub${p?", "+p:""}): ${D(t)} {
328
+ ${l}
329
+ let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
330
+ decode(value_tuple)
331
+ }
332
+
333
+ public(package) fun set_struct(dapp_hub: &mut DappHub${p?", "+p:""}, ${t}: ${D(t)}) {
334
+ ${l}
335
+ let value_tuple = encode_struct(${t});
336
+ dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
337
+ }`:"",I=k?` public fun encode(value: ${Object.values(_)[0]}): vector<vector<u8>> {
338
+ let mut value_tuple = vector::empty();
339
+ value_tuple.push_back(${C(Object.values(_)[0])?"to_bytes(&value)":`${e}::${i.find(u=>u.type===Object.values(_)[0])?.module}::encode(value)`});
340
+ value_tuple
341
+ }`:o?` public fun encode(${c.map(u=>`${u}: ${s[u]}`).join(", ")}): vector<vector<u8>> {
342
+ let mut value_tuple = vector::empty();
343
+ ${c.map(u=>{let a=s[u],d=!C(a),y=d?i.find(v=>v.type===a):null;return`value_tuple.push_back(${d?`${e}::${y?.module}::encode(${u})`:`to_bytes(&${u})`});`}).join(`
344
+ `)}
345
+ value_tuple
346
+ }
347
+
348
+ public fun encode_struct(${t}: ${D(t)}): vector<vector<u8>> {
349
+ encode(${c.map(u=>`${t}.${u}`).join(", ")})
350
+ }
351
+
352
+ public fun decode(data: vector<u8>): ${D(t)} {
353
+ let mut bsc_type = sui::bcs::new(data);
354
+ ${c.map(u=>{let a=s[u],d=!C(a),y=d?i.find(v=>v.type===a):null;return`let ${u} = ${d?`${e}::${y?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${M(a)}(&mut bsc_type)`};`}).join(`
355
+ `)}
356
+ ${D(t)} {
357
+ ${c.map(u=>`${u},`).join(`
358
+ `)}
359
+ }
360
+ }`:"";return`${O}
361
+
362
+ ${S}
363
+
364
+ ${E}
365
+
366
+ ${r}
367
+
368
+ ${f}
369
+
370
+ ${H}
371
+
372
+ ${T}
373
+
374
+ ${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(`
375
+ `),n=Object.keys(e.resources||{}).map(b=>` ${b}::register_table(dapp_hub, ctx);`).join(`
376
+ `),o=[s,n].filter(b=>b.trim()!=="").join(`
377
+ `),i=`module ${e.name}::genesis {
378
+ use sui::clock::Clock;
379
+ use dubhe::dapp_service;
380
+ use dubhe::dapp_hub::DappHub;
381
+ use ${e.name}::dapp_key;
382
+ ${Object.keys(e.components||{}).map(b=>`use ${e.name}::${b};`).join(`
383
+ `)}
384
+ ${Object.keys(e.resources||{}).map(b=>`use ${e.name}::${b};`).join(`
385
+ `)}
386
+
387
+ public entry fun run(dapp_hub: &mut DappHub, clock: &Clock, ctx: &mut TxContext) {
388
+ // Create Dapp
389
+ let dapp_key = dapp_key::new();
390
+ dapp_service::create_dapp(dapp_hub, dapp_key, b"${e.name}", b"${e.description}", clock, ctx);
391
+
392
+ // Register tables
393
+ ${o}
394
+
219
395
  // Logic that needs to be automated once the contract is deployed
220
- ${e.name}::${e.name}_deploy_hook::run(${e.name!=="dubhe"?"_dubhe_schema,":""}&mut schema, ctx);
221
- // Authorize schemas and public share objects
222
- sui::transfer::public_share_object(schema);
396
+ ${e.name}::deploy_hook::run(dapp_hub, ctx);
223
397
  }
224
398
  }
225
- `;await c(n,`${t}/contracts/${e.name}/sources/codegen/core/genesis.move`,"formatAndWriteMove")}async function pt(e,t,r){console.log(`
226
- \u{1F680} Starting Schema Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${e.name}`),console.log(` \u2514\u2500 Description: ${e.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${r||"testnet"}`);let n=t??process.cwd();A(`${n}/contracts/${e.name}`)&&x(`${n}/contracts/${e.name}/sources/codegen`),A(`${n}/contracts/${e.name}/Move.toml`)||await F(e,n),A(`${n}/contracts/${e.name}/sources/script/deploy_hook.move`)||await B(e,n),e.events&&(e.data?await D(e.name,e.data,e.events,n):await D(e.name,null,e.events,n)),e.data?(await L(e.name,e.data,n),await w(e.name,e.data,e.schemas,n)):await w(e.name,null,e.schemas,n),e.errors&&await Q(e.name,e.errors,n),await Z(e,n),await H(e,n),await I(e,n),await j(e,n),console.log(`
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,n]of Object.entries(e.enums)){console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`);let o=[...n].sort((b,g)=>b.localeCompare(g)),i=we(e.name,s,o);await $(i,`${t}/${be(s)}.move`,"formatAndWriteMove")}}function we(e,t,s){let n=s.map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join(",");return`module ${e}::${be(t)} {
401
+ use sui::bcs::{BCS, to_bytes, peel_enum_tag};
402
+
403
+ public enum ${t} has copy, drop, store {
404
+ ${n}
405
+ }
406
+
407
+ ${s.map(o=>` public fun new_${o.toLowerCase()}(): ${t} {
408
+ ${t}::${o.charAt(0).toUpperCase()+o.slice(1)}
409
+ }`).join(`
410
+
411
+ `)}
412
+
413
+ public fun encode(self: ${t}): vector<u8> {
414
+ to_bytes(&self)
415
+ }
416
+
417
+ public fun decode(bytes: &mut BCS): ${t} {
418
+ match(peel_enum_tag(bytes)) {
419
+ ${s.map((o,i)=>` ${i} => ${t}::${o.charAt(0).toUpperCase()+o.slice(1)},`).join(`
420
+ `)}
421
+ _ => abort,
422
+ }
423
+ }
424
+ }`}async function J(e,t){console.log(`
425
+ \u{1F4E6} Starting Resources Generation...`);for(let[s,n]of Object.entries(e.resources)){if(console.log(` \u2514\u2500 ${s}: ${JSON.stringify(n)}`),typeof n=="string"){let g=Ce(e.name,s,n,"Onchain");await $(g,`${t}/${s}.move`,"formatAndWriteMove");continue}if(!n.fields||Object.keys(n.fields).length===0)throw new Error(`Resource '${s}' must have fields defined, but found empty object`);n.keys||(n.keys=[]);let i=n.offchain||!1?"Offchain":"Onchain",b=Ae(e.name,s,n);await $(b,`${t}/${s}.move`,"formatAndWriteMove")}}function Ce(e,t,s,n="Onchain"){let o=!A(s),i=o?`${me(s)}`:"";return`module ${e}::${t} {
426
+ use sui::bcs::{to_bytes};
427
+ use dubhe::table_id;
428
+ use dubhe::dapp_state;
429
+ use dubhe::dapp_service;
430
+ use dubhe::dapp_hub;
431
+ use dubhe::dapp_hub::DappHub;
432
+ use ${e}::dapp_key;
433
+ use ${e}::dapp_key::DappKey;
434
+ ${o?` use ${e}::${i};
435
+ use ${e}::${i}::{${s}};`:""}
436
+
437
+ const TABLE_NAME: vector<u8> = b"${t}";
438
+
439
+ public fun get_table_id(): vector<u8> {
440
+ table_id::encode(table_id::${n==="Offchain"?"offchain_table_type":"onchain_table_type"}(), TABLE_NAME)
441
+ }
442
+
443
+ public fun get_key_schemas(): vector<vector<u8>> {
444
+ vector[]
445
+ }
446
+
447
+ public fun get_value_schemas(): vector<vector<u8>> {
448
+ vector[b"${s}"]
449
+ }
450
+
451
+ public fun get_key_names(): vector<vector<u8>> {
452
+ vector[]
453
+ }
454
+
455
+ public fun get_value_names(): vector<vector<u8>> {
456
+ vector[b"value"]
457
+ }
458
+
459
+ public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {
460
+ let dapp_key = dapp_key::new();
461
+ dapp_service::register_table(
462
+ dapp_hub,
463
+ dapp_key,
464
+ get_table_id(),
465
+ TABLE_NAME,
466
+ get_key_schemas(),
467
+ get_key_names(),
468
+ get_value_schemas(),
469
+ get_value_names(),
470
+ ctx
471
+ );
472
+ }
473
+
474
+ public fun has(dapp_hub: &DappHub): bool {
475
+ let key_tuple = vector::empty();
476
+ dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
477
+ }
478
+
479
+ public(package) fun delete(dapp_hub: &mut DappHub) {
480
+ let key_tuple = vector::empty();
481
+ dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);
482
+ }
483
+
484
+ public fun get(dapp_hub: &DappHub): (${s}) {
485
+ let key_tuple = vector::empty();
486
+ let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
487
+ let mut bsc_type = sui::bcs::new(value_tuple);
488
+ ${o?`let value = ${e}::${i}::decode(&mut bsc_type);`:`let value = sui::bcs::peel_${K(s)}(&mut bsc_type);`}
489
+ (value)
490
+ }
491
+
492
+ public(package) fun set(dapp_hub: &mut DappHub, value: ${s}) {
493
+ let key_tuple = vector::empty();
494
+ let value_tuple = encode(value);
495
+ dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
496
+ }
497
+
498
+ public fun encode(value: ${s}): vector<vector<u8>> {
499
+ let mut value_tuple = vector::empty();
500
+ value_tuple.push_back(${o?`${e}::${i}::encode(value)`:"to_bytes(&value)"});
501
+ value_tuple
502
+ }
503
+ }`}function me(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`).replace(/^_/,"")}function Ae(e,t,s){let n=s.fields,o=s.keys||[],b=s.offchain||!1?"Offchain":"Onchain",g=Object.keys(n).every(r=>o.includes(r)),_=Object.entries(n).filter(([r])=>!o.includes(r)),m=_.map(([r])=>r),c=m.length===1,h=_.filter(([r,f])=>!A(f)).map(([r,f])=>({type:f,module:`${me(f)}`})).filter((r,f,H)=>H.findIndex(T=>T.type===r.type)===f),k=je(e,t,n,o,!g&&!c,h,b);if(g||c)return`module ${e}::${t} {
504
+ use sui::bcs::{to_bytes};
505
+ use dubhe::table_id;
506
+ use dubhe::dapp_state;
507
+ use dubhe::dapp_service;
508
+ use dubhe::dapp_hub;
509
+ use dubhe::dapp_hub::DappHub;
510
+ use ${e}::dapp_key;
511
+ use ${e}::dapp_key::DappKey;
512
+ ${h.length>0?h.map(r=>` use ${e}::${r.module};
513
+ use ${e}::${r.module}::{${r.type}};`).join(`
514
+ `):""}
515
+
516
+ const TABLE_NAME: vector<u8> = b"${t}";
517
+
518
+ ${k}
519
+ }`;let p=m.map(r=>` ${r}: ${n[r]},`).join(`
520
+ `),l=m.map(r=>`${r}: ${n[r]}`).join(", "),O=m.map(r=>` ${r},`).join(`
521
+ `),S=m.map(r=>` public fun ${r}(self: &${x(t)}): ${n[r]} {
522
+ self.${r}
523
+ }`).join(`
524
+
525
+ `),E=m.map(r=>` public fun update_${r}(self: &mut ${x(t)}, ${r}: ${n[r]}) {
526
+ self.${r} = ${r}
527
+ }`).join(`
528
+
529
+ `);return`module ${e}::${t} {
530
+ use sui::bcs::{to_bytes};
531
+ use dubhe::table_id;
532
+ use dubhe::dapp_state;
533
+ use dubhe::dapp_service;
534
+ use dubhe::dapp_hub;
535
+ use dubhe::dapp_hub::DappHub;
536
+ use ${e}::dapp_key;
537
+ use ${e}::dapp_key::DappKey;
538
+ ${h.length>0?h.map(r=>` use ${e}::${r.module};
539
+ use ${e}::${r.module}::{${r.type}};`).join(`
540
+ `):""}
541
+
542
+ const TABLE_NAME: vector<u8> = b"${t}";
543
+
544
+ public struct ${x(t)} has copy, drop, store {
545
+ ${p}
546
+ }
547
+
548
+ public fun new(${l}): ${x(t)} {
549
+ ${x(t)} {
550
+ ${O}
551
+ }
552
+ }
553
+
554
+ ${S}
555
+
556
+ ${E}
557
+
558
+ ${k}
559
+ }`}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,n,o=!0,i=[],b="Onchain"){let g=n.reduce((u,a)=>({...u,[a]:s[a]}),{}),_=Object.entries(s).filter(([u])=>!n.includes(u)).reduce((u,[a,d])=>({...u,[a]:d}),{}),m=Object.keys(g),c=Object.keys(_),h=Object.keys(s).every(u=>n.includes(u)),k=c.length===1,p=n.length>0?n.map(u=>`${u}: ${s[u]}`).join(", "):"",l=n.length>0?`let mut key_tuple = vector::empty();
560
+ ${n.map(u=>`key_tuple.push_back(to_bytes(&${u}));`).join(`
561
+ `)}`:"let key_tuple = vector::empty();",O=` public fun get_table_id(): vector<u8> {
562
+ table_id::encode(table_id::${b==="Offchain"?"offchain_table_type":"onchain_table_type"}(), TABLE_NAME)
563
+ }
564
+
565
+ public fun get_key_schemas(): vector<vector<u8>> {
566
+ vector[${n.map(u=>`b"${s[u]}"`).join(", ")}]
567
+ }
568
+
569
+ public fun get_value_schemas(): vector<vector<u8>> {
570
+ vector[${Object.values(_).map(u=>`b"${u}"`).join(", ")}]
571
+ }
572
+
573
+ public fun get_key_names(): vector<vector<u8>> {
574
+ vector[${n.map(u=>`b"${u}"`).join(", ")}]
575
+ }
576
+
577
+ public fun get_value_names(): vector<vector<u8>> {
578
+ vector[${c.map(u=>`b"${u}"`).join(", ")}]
579
+ }`,S=` public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {
580
+ let dapp_key = dapp_key::new();
581
+ dapp_service::register_table(
582
+ dapp_hub,
583
+ dapp_key,
584
+ get_table_id(),
585
+ TABLE_NAME,
586
+ get_key_schemas(),
587
+ get_key_names(),
588
+ get_value_schemas(),
589
+ get_value_names(),
590
+ ctx
591
+ );
592
+ }`,E=` public fun has(dapp_hub: &DappHub${p?", "+p:""}): bool {
593
+ ${l}
594
+ dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
595
+ }
596
+
597
+ public fun ensure_has(dapp_hub: &DappHub${p?", "+p:""}) {
598
+ ${l}
599
+ dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
600
+ }
601
+
602
+ public fun ensure_not_has(dapp_hub: &DappHub${p?", "+p:""}) {
603
+ ${l}
604
+ dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)
605
+ }
606
+
607
+ ${k?"":c.map((u,a)=>` public fun has_${u}(dapp_hub: &DappHub${p?", "+p:""}): bool {
608
+ ${l}
609
+ dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
610
+ }
611
+
612
+ public fun ensure_has_${u}(dapp_hub: &DappHub${p?", "+p:""}) {
613
+ ${l}
614
+ dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
615
+ }
616
+
617
+ public fun ensure_not_has_${u}(dapp_hub: &DappHub${p?", "+p:""}) {
618
+ ${l}
619
+ dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a})
620
+ }`).join(`
621
+
622
+ `)}`,r=` public(package) fun delete(dapp_hub: &mut DappHub${p?", "+p:""}) {
623
+ ${l}
624
+ dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);
625
+ }`,f=k?"":c.map(u=>{let a=c.indexOf(u),d=s[u],y=!A(d),v=y?i.find(P=>P.type===d):null;return` public fun get_${u}(dapp_hub: &DappHub${p?", "+p:""}): ${d} {
626
+ ${l}
627
+ let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${a});
628
+ let mut bsc_type = sui::bcs::new(value);
629
+ ${y?`let ${u} = ${e}::${v?.module}::decode(&mut bsc_type);`:`let ${u} = sui::bcs::peel_${K(d)}(&mut bsc_type);`}
630
+ ${u}
631
+ }
632
+
633
+ public(package) fun set_${u}(dapp_hub: &mut DappHub${p?", "+p:""}, ${u}: ${d}) {
634
+ ${l}
635
+ let value = ${y?`${e}::${v?.module}::encode(${u})`:`to_bytes(&${u})`};
636
+ dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${a}, value);
637
+ }`}).join(`
638
+
639
+ `),H=h?` public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}) {
640
+ ${l}
641
+ let value_tuple = vector::empty();
642
+ dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
643
+ }`:k?` public fun get(dapp_hub: &DappHub${p?", "+p:""}): ${Object.values(_)[0]} {
644
+ ${l}
645
+ let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);
646
+ let mut bsc_type = sui::bcs::new(value);
647
+ ${A(Object.values(_)[0])?`let value = sui::bcs::peel_${K(Object.values(_)[0])}(&mut bsc_type);`:`let value = ${e}::${i.find(u=>u.type===Object.values(_)[0])?.module}::decode(&mut bsc_type);`}
648
+ value
649
+ }
650
+
651
+ public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}, value: ${Object.values(_)[0]}) {
652
+ ${l}
653
+ let value_tuple = encode(value);
654
+ dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
655
+ }`:` public fun get(dapp_hub: &DappHub${p?", "+p:""}): (${Object.values(_).join(", ")}) {
656
+ ${l}
657
+ let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
658
+ let mut bsc_type = sui::bcs::new(value_tuple);
659
+ ${c.map(u=>{let a=s[u],d=!A(a),y=d?i.find(v=>v.type===a):null;return`let ${u} = ${d?`${e}::${y?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${K(a)}(&mut bsc_type)`};`}).join(`
660
+ `)}
661
+ (${c.join(", ")})
662
+ }
663
+
664
+ public(package) fun set(dapp_hub: &mut DappHub${p?", "+p:""}, ${c.map(u=>`${u}: ${s[u]}`).join(", ")}) {
665
+ ${l}
666
+ let value_tuple = encode(${c.join(", ")});
667
+ dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
668
+ }`,T=o?` public fun get_struct(dapp_hub: &DappHub${p?", "+p:""}): ${x(t)} {
669
+ ${l}
670
+ let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);
671
+ decode(value_tuple)
672
+ }
673
+
674
+ public(package) fun set_struct(dapp_hub: &mut DappHub${p?", "+p:""}, ${t}: ${x(t)}) {
675
+ ${l}
676
+ let value_tuple = encode_struct(${t});
677
+ dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);
678
+ }`:"",I=k?` public fun encode(value: ${Object.values(_)[0]}): vector<vector<u8>> {
679
+ let mut value_tuple = vector::empty();
680
+ value_tuple.push_back(${A(Object.values(_)[0])?"to_bytes(&value)":`${e}::${i.find(u=>u.type===Object.values(_)[0])?.module}::encode(value)`});
681
+ value_tuple
682
+ }`:o?` public fun encode(${c.map(u=>`${u}: ${s[u]}`).join(", ")}): vector<vector<u8>> {
683
+ let mut value_tuple = vector::empty();
684
+ ${c.map(u=>{let a=s[u],d=!A(a),y=d?i.find(v=>v.type===a):null;return`value_tuple.push_back(${d?`${e}::${y?.module}::encode(${u})`:`to_bytes(&${u})`});`}).join(`
685
+ `)}
686
+ value_tuple
687
+ }
688
+
689
+ public fun encode_struct(${t}: ${x(t)}): vector<vector<u8>> {
690
+ encode(${c.map(u=>`${t}.${u}`).join(", ")})
691
+ }
692
+
693
+ public fun decode(data: vector<u8>): ${x(t)} {
694
+ let mut bsc_type = sui::bcs::new(data);
695
+ ${c.map(u=>{let a=s[u],d=!A(a),y=d?i.find(v=>v.type===a):null;return`let ${u} = ${d?`${e}::${y?.module}::decode(&mut bsc_type)`:`sui::bcs::peel_${K(a)}(&mut bsc_type)`};`}).join(`
696
+ `)}
697
+ ${x(t)} {
698
+ ${c.map(u=>`${u},`).join(`
699
+ `)}
700
+ }
701
+ }`:"";return`${O}
702
+
703
+ ${S}
704
+
705
+ ${E}
706
+
707
+ ${r}
708
+
709
+ ${f}
710
+
711
+ ${H}
712
+
713
+ ${T}
714
+
715
+ ${I}`}function x(e){return e.split("_").map((t,s)=>/^\d+$/.test(t)?t:t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function K(e){if(e.startsWith("vector<")){let t=e.slice(7,-1);return t==="vector<u8>"?"vec_vec_u8":`vec_${K(t)}`}switch(e){case"bool":return"bool";case"u8":return"u8";case"u32":return"u32";case"u64":return"u64";case"u128":return"u128";case"u256":return"u256";case"address":return"address";default:return e}}import j from"node:path";async function Bt(e,t,s){console.log(`
716
+ \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 n=j.join(e,"src",t.name);w(`${n}`)&&z(`${n}/sources/codegen`),w(`${n}/Move.toml`)||await te(t,e);let o=j.join(n,"sources","codegen","genesis.move");w(o)||await _e(t,o);let i=j.join(n,"sources","codegen","init_test.move");w(i)||await ce(t,i);let b=j.join(n,"sources","codegen","dapp_key.move");w(b)||await re(t,b);let g=j.join(n,"sources","scripts","deploy_hook.move");w(g)||await ue(t,g);let _=j.join(n,"sources","codegen","components");w(_)?await V(t,_):await V(t,_);let m=j.join(n,"sources","codegen","resources");w(m)?await J(t,m):await J(t,m);let c=j.join(n,"sources","codegen","enums");w(c)||await $e(t,c),t.errors&&await ie(t.name,t.errors,e),await ae(t,e),await ne(t,e),console.log(`
227
717
  \u2705 Schema Generation Process Complete!
228
- `)}import{findUp as ie}from"find-up";import k from"path";import ce from"esbuild";var _=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as ue}from"fs";import{pathToFileURL as me}from"url";import pe from"os";var le=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],T="dubhe.config.example.mjs";async function St(e){e=await J(e);try{return await ce.build({entryPoints:[e],format:"esm",outfile:T,platform:"node",bundle:!0,packages:"external"}),e=await J(T,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{ue(T,{force:!0})}}async function J(e,t){return e===void 0?e=await de():k.isAbsolute(e)||(e=k.join(process.cwd(),e),e=k.normalize(e)),t&&pe.platform()==="win32"?me(e).href:e}async function de(){let e=await ie(le);if(e===void 0)throw new _;return e}function Ct(...e){if(e.length===1)return`StorageValue<${e[0]}>`;if(e.length===2)return`StorageMap<${e[0]}, ${e[1]}>`;if(e.length===3)return`StorageDoubleMap<${e[0]}, ${e[1]}, ${e[2]}>`;throw new Error("Invalid number of arguments for storage()")}var S=e=>{if(typeof e!="object"||e===null)return e;let t={};for(let r in e)if(e.hasOwnProperty(r)){let n=e[r];typeof n=="object"&&n!==null?Array.isArray(n)?t[r]=P(n):n.hasOwnProperty("variant")?t[r]={[n.variant]:{}}:n.hasOwnProperty("fields")?t[r]=S(n.fields):t[r]=S(n):t[r]=n}return t},P=e=>{let t=[];return e.forEach(r=>{typeof r=="object"&&r!==null?Array.isArray(r)?t.push(P(r)):r.hasOwnProperty("variant")?t.push({[r.variant]:{}}):r.hasOwnProperty("fields")?t.push(S(r.fields)):t.push(S(r)):t.push(r)}),t};var ge=(r=>(r.Event="event",r.Schema="schema",r))(ge||{});export{ge as SubscriptionKind,c as formatAndWriteMove,Ae as formatAndWriteTypescript,C as formatMove,M as formatTypescript,St as loadConfig,S as parseData,Te as posixPath,J as resolveConfigPath,pt as schemaGen,Ct as storage};
718
+ `)}var Oe=e=>{let t=Object.keys(e.components||{}),s=Object.keys(e.resources||{}),n=t.filter(o=>s.includes(o));if(n.length>0)throw new Error(`Duplicate keys found between components and resources: ${n.join(", ")}`)},Ut=e=>(Oe(e),e);import{findUp as Se}from"find-up";import Z from"path";import Ee from"esbuild";var R=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as He}from"fs";import{pathToFileURL as Te}from"url";import Me from"os";var Ke=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],Q="dubhe.config.example.mjs";async function Yt(e){e=await ye(e);try{return await Ee.build({entryPoints:[e],format:"esm",outfile:Q,platform:"node",bundle:!0,packages:"external"}),e=await ye(Q,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{He(Q,{force:!0})}}async function ye(e,t){return e===void 0?e=await Fe():Z.isAbsolute(e)||(e=Z.join(process.cwd(),e),e=Z.normalize(e)),t&&Me.platform()==="win32"?Te(e).href:e}async function Fe(){let e=await Se(Ke);if(e===void 0)throw new R;return e}var U=e=>{if(typeof e!="object"||e===null)return e;let t={};for(let s in e)if(e.hasOwnProperty(s)){let n=e[s];typeof n=="object"&&n!==null?Array.isArray(n)?t[s]=ge(n):n.hasOwnProperty("variant")?t[s]={[n.variant]:{}}:n.hasOwnProperty("fields")?t[s]=U(n.fields):t[s]=U(n):t[s]=n}return t},ge=e=>{let t=[];return e.forEach(s=>{typeof s=="object"&&s!==null?Array.isArray(s)?t.push(ge(s)):s.hasOwnProperty("variant")?t.push({[s.variant]:{}}):s.hasOwnProperty("fields")?t.push(U(s.fields)):t.push(U(s)):t.push(s)}),t};var We=(s=>(s.Event="event",s.Schema="schema",s))(We||{});export{We as SubscriptionKind,Ut as defineDapp,$ as formatAndWriteMove,Qe as formatAndWriteTypescript,X as formatMove,Y as formatTypescript,Yt as loadConfig,U as parseData,Ye as posixPath,ye as resolveConfigPath,Bt as schemaGen};
229
719
  //# sourceMappingURL=index.js.map