@0xobelisk/sui-common 1.1.4 → 1.1.6

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,10 +1,10 @@
1
- import w from"prettier";import q from"prettier-plugin-move-js";async function T(e,t){let r;t&&(r=await w.resolveConfig(t));try{return w.format(e,{plugins:[q],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...r})}catch(a){let s;return a instanceof Error?s=a.message:s=a,console.log(`Error during output formatting: ${s}`),e}}async function j(e){return w.format(e,{parser:"typescript"})}import h from"node:fs/promises";import E from"node:path";import R from"debug";var b=R("dubhe:common"),J=R("dubhe:common");b.log=console.debug.bind(console);J.log=console.error.bind(console);var $=b.extend("codegen"),N=b.extend("codegen");$.log=console.debug.bind(console);N.log=console.error.bind(console);async function c(e,t,r){let a=await T(e),s=` // Copyright (c) Obelisk Labs, Inc.
1
+ import w from"prettier";import q from"prettier-plugin-move-js";async function T(e,t){let r;t&&(r=await w.resolveConfig(t));try{return w.format(e,{plugins:[q],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...r})}catch(a){let n;return a instanceof Error?n=a.message:n=a,console.log(`Error during output formatting: ${n}`),e}}async function R(e){return w.format(e,{parser:"typescript"})}import h from"node:fs/promises";import O from"node:path";import E from"debug";var b=E("dubhe:common"),J=E("dubhe:common");b.log=console.debug.bind(console);J.log=console.error.bind(console);var $=b.extend("codegen"),P=b.extend("codegen");$.log=console.debug.bind(console);P.log=console.error.bind(console);async function c(e,t,r){let a=await T(e),n=` // 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]",n=s+a,i="#[allow(lint(share_owned))]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?n=a:t.includes("init")?n=o+a:t.includes("genesis")&&(n=i+a),await h.mkdir(E.dirname(t),{recursive:!0}),await h.writeFile(t,n),$(`${r}: ${t}`)}async function Me(e,t,r){let a=await j(e);await h.mkdir(E.dirname(t),{recursive:!0}),await h.writeFile(t,a),$(`${r}: ${t}`)}function je(e){return e.replace(/\\/g,"/")}import{existsSync as A}from"fs";import g from"fs";function v(e){g.existsSync(e)&&(g.readdirSync(e).forEach(t=>{let r=`${e}/${t}`;g.lstatSync(r).isDirectory()?v(r):g.unlinkSync(r)}),g.rmdirSync(e))}function f(e){return Object.entries(e).map(([t,r])=>`${t}`).join(",")}function O(e){return`(${Object.entries(e).map(([t,r])=>`${r}`)})`}function u(e){return Object.entries(e).map(([t,r])=>`${t}: ${r}`)}function W(e){return Object.entries(e).map(([t,r])=>`self.${t}`)}function G(e,t){for(let r in e)if(e.hasOwnProperty(r)){let a=e[r];if(typeof a=="string"&&a===t)return!0}return!1}async function V(e,t){console.log(`
7
+ `,s="#[test_only]",o=n+a,i="#[allow(lint(share_owned))]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?o=a:t.includes("init")?o=s+a:t.includes("genesis")&&(o=i+a),await h.mkdir(O.dirname(t),{recursive:!0}),await h.writeFile(t,o),$(`${r}: ${t}`)}async function Me(e,t,r){let a=await R(e);await h.mkdir(O.dirname(t),{recursive:!0}),await h.writeFile(t,a),$(`${r}: ${t}`)}function Re(e){return e.replace(/\\/g,"/")}import{existsSync as A}from"fs";import g from"fs";function v(e){g.existsSync(e)&&(g.readdirSync(e).forEach(t=>{let r=`${e}/${t}`;g.lstatSync(r).isDirectory()?v(r):g.unlinkSync(r)}),g.rmdirSync(e))}function f(e){return Object.entries(e).map(([t,r])=>`${t}`).join(",")}function W(e){return`(${Object.entries(e).map(([t,r])=>`${r}`)})`}function u(e){return Object.entries(e).map(([t,r])=>`${t}: ${r}`)}function G(e){return Object.entries(e).map(([t,r])=>`self.${t}`)}function V(e,t){for(let r in e)if(e.hasOwnProperty(r)){let a=e[r];if(typeof a=="string"&&a===t)return!0}return!1}async function j(e,t){console.log(`
8
8
  \u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/Move.toml`);let r=`[package]
9
9
  name = "${e.name}"
10
10
  version = "1.0.0"
@@ -18,49 +18,49 @@ Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", rev = "dubhe
18
18
  sui = "0x2"
19
19
  ${e.name} = "0x0"
20
20
  `;await c(r,`${t}/contracts/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
21
- `)}function P(e){return e.sort((t,r)=>{let a=t.charAt(0).toLowerCase(),s=r.charAt(0).toLowerCase();return a<s?-1:a>s?1:0})}function ee(e,t){return Object.entries(t).map(([r,a])=>`public(package) fun set_${r}(self: &mut ${e}, ${r}: ${a}) {
21
+ `)}function N(e){return e.sort((t,r)=>{let a=t.charAt(0).toLowerCase(),n=r.charAt(0).toLowerCase();return a<n?-1:a>n?1:0})}function ee(e,t){return Object.entries(t).map(([r,a])=>`public(package) fun set_${r}(self: &mut ${e}, ${r}: ${a}) {
22
22
  self.${r} = ${r};
23
23
  }`).join(`
24
24
  `)}function te(e,t){return`public(package) fun set(self: &mut ${e}, ${u(t)}) {
25
25
  ${Object.entries(t).map(([r])=>`self.${r} = ${r};`).join(`
26
26
  `)}
27
- }`}function re(e,t){return`public fun get(self: &${e}): ${O(t)} {
28
- (${W(t)})
27
+ }`}function re(e,t){return`public fun get(self: &${e}): ${W(t)} {
28
+ (${G(t)})
29
29
  }`}function ae(e,t){return Object.entries(t).map(([r,a])=>`public fun get_${r}(self: &${e}): ${a} {
30
30
  self.${r}
31
31
  }`).join(`
32
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 a of Object.keys(t)){let s=a,o=t[a];console.log(` \u2514\u2500 Generating ${s} ${Array.isArray(o)?"(enum)":"(struct)"}`);let n="",i=Object.keys(t).filter(p=>Array.isArray(t[p])).map(p=>p);if(console.log(i),Array.isArray(o)){let p=P(o);n=`module ${e}::${d(s)} {
34
- public enum ${s} has copy, drop , store {
33
+ \u{1F4E6} Starting Schema Data Generation...`);for(let a of Object.keys(t)){let n=a,s=t[a];console.log(` \u2514\u2500 Generating ${n} ${Array.isArray(s)?"(enum)":"(struct)"}`);let o="",i=Object.keys(t).filter(p=>Array.isArray(t[p])).map(p=>p);if(console.log(i),Array.isArray(s)){let p=N(s);o=`module ${e}::${e}_${d(n)} {
34
+ public enum ${n} has copy, drop , store {
35
35
  ${p}
36
36
  }
37
37
 
38
- ${p.map(l=>`public fun new_${d(l)}(): ${s} {
39
- ${s}::${l}
40
- }`).join("")}`}else n=`module ${e}::${d(s)} {
38
+ ${p.map(l=>`public fun new_${d(l)}(): ${n} {
39
+ ${n}::${l}
40
+ }`).join("")}`}else o=`module ${e}::${e}_${d(n)} {
41
41
  use std::ascii::String;
42
42
 
43
- ${Object.keys(t).map(p=>{if(G(o,p))return`use ${e}::${d(p)}::${p};`}).filter(Boolean).join(`
43
+ ${Object.keys(t).map(p=>{if(V(s,p))return`use ${e}::${e}_${d(p)}::${p};`}).filter(Boolean).join(`
44
44
  `)}
45
45
 
46
- public struct ${s} has copy, drop , store {
47
- ${u(o)}
46
+ public struct ${n} has copy, drop , store {
47
+ ${u(s)}
48
48
  }
49
49
 
50
- public fun new(${u(o)}): ${s} {
51
- ${s} {
52
- ${f(o)}
50
+ public fun new(${u(s)}): ${n} {
51
+ ${n} {
52
+ ${f(s)}
53
53
  }
54
54
  }
55
55
 
56
- ${re(s,o)}
57
- ${ae(s,o)}
58
- ${ee(s,o)}
59
- ${te(s,o)}
60
- }`;await c(n,`${r}/contracts/${e}/sources/codegen/data/${d(s)}.move`,"formatAndWriteMove")}console.log(`\u2705 Schema Data Generation Complete
61
- `)}function oe(e,t){return t!=null?Object.keys(t).map(a=>`use ${e}::${d(a)}::${a};`).join(`
56
+ ${re(n,s)}
57
+ ${ae(n,s)}
58
+ ${ee(n,s)}
59
+ ${te(n,s)}
60
+ }`;await c(o,`${r}/contracts/${e}/sources/codegen/data/${d(n)}.move`,"formatAndWriteMove")}console.log(`\u2705 Schema Data Generation Complete
61
+ `)}function se(e,t){return t!=null?Object.keys(t).map(a=>`use ${e}::${e}_${d(a)}::${a};`).join(`
62
62
  `):""}async function x(e,t,r,a){console.log(`
63
- \u{1F528} Starting Schema Structure Generation...`),console.log(` \u251C\u2500 Output path: ${a}/contracts/${e}/sources/codegen/schema.move`),console.log(` \u2514\u2500 Structure fields: ${Object.values(r).length}`);let s=`module ${e}::schema {
63
+ \u{1F528} Starting Schema Structure Generation...`),console.log(` \u251C\u2500 Output path: ${a}/contracts/${e}/sources/codegen/schema.move`),console.log(` \u2514\u2500 Structure fields: ${Object.values(r).length}`);let n=`module ${e}::${e}_schema {
64
64
  use std::ascii::String;
65
65
  use std::ascii::string;
66
66
  use sui::package::UpgradeCap;
@@ -71,23 +71,23 @@ ${e.name} = "0x0"
71
71
  use dubhe::storage_double_map::{Self, StorageDoubleMap};
72
72
  use sui::dynamic_field as df;
73
73
 
74
- ${oe(e,t)}
74
+ ${se(e,t)}
75
75
 
76
76
  public struct Schema has key, store { id: UID }
77
77
 
78
- ${Object.entries(r).map(([o,n])=>`public fun borrow_${o}(self: &Schema) : &${n} {
79
- storage::borrow_field(&self.id, b"${o}")
78
+ ${Object.entries(r).map(([s,o])=>`public fun borrow_${s}(self: &Schema) : &${o} {
79
+ storage::borrow_field(&self.id, b"${s}")
80
80
  }
81
81
 
82
- public(package) fun ${o}(self: &mut Schema): &mut ${n} {
83
- storage::borrow_mut_field(&mut self.id, b"${o}")
82
+ public(package) fun ${s}(self: &mut Schema): &mut ${o} {
83
+ storage::borrow_mut_field(&mut self.id, b"${s}")
84
84
  }
85
85
  `).join("")}
86
86
 
87
87
 
88
88
  public(package) fun create(ctx: &mut TxContext): Schema {
89
89
  let mut id = object::new(ctx);
90
- ${Object.entries(r).map(([o,n])=>{let i="";return n.includes("StorageValue")?i=`storage_value::new(b"${o}", ctx)`:n.includes("StorageMap")?i=`storage_map::new(b"${o}", ctx)`:n.includes("StorageDoubleMap")&&(i=`storage_double_map::new(b"${o}", ctx)`),`storage::add_field<${n}>(&mut id, b"${o}", ${i});`}).join(`
90
+ ${Object.entries(r).map(([s,o])=>{let i="";return o.includes("StorageValue")?i=`storage_value::new(b"${s}", ctx)`:o.includes("StorageMap")?i=`storage_map::new(b"${s}", ctx)`:o.includes("StorageDoubleMap")&&(i=`storage_double_map::new(b"${s}", ctx)`),`storage::add_field<${o}>(&mut id, b"${s}", ${i});`}).join(`
91
91
  `)}
92
92
 
93
93
  Schema { id }
@@ -105,71 +105,71 @@ ${e.name} = "0x0"
105
105
 
106
106
 
107
107
  // ======================================== View Functions ========================================
108
- ${Object.entries(r).map(([o,n])=>{let i=n.match(/<(.+)>/)[1].split(",").map(Y=>Y.trim()),p=[],l="",_="";return n.includes("StorageValue")?(p=[],l=`${i[0]}`,_="get()"):n.includes("StorageMap")?(p=[`key: ${i[0]}`],l=`${i[1]}`,_="get(key)"):n.includes("StorageDoubleMap")&&(p=[`key1: ${i[0]}`,`key2: ${i[1]}`],l=`${i[2]}`,_="get(key1, key2)"),`public fun get_${o}(self: &Schema, ${p}) : &${l} {
109
- self.borrow_${o}().${_}
108
+ ${Object.entries(r).map(([s,o])=>{let i=o.match(/<(.+)>/)[1].split(",").map(Y=>Y.trim()),p=[],l="",_="";return o.includes("StorageValue")?(p=[],l=`${i[0]}`,_="get()"):o.includes("StorageMap")?(p=[`key: ${i[0]}`],l=`${i[1]}`,_="get(key)"):o.includes("StorageDoubleMap")&&(p=[`key1: ${i[0]}`,`key2: ${i[1]}`],l=`${i[2]}`,_="get(key1, key2)"),`public fun get_${s}(self: &Schema, ${p}) : &${l} {
109
+ self.borrow_${s}().${_}
110
110
  }`}).join(`
111
111
  `)}
112
112
  // =========================================================================================================
113
- }`;await c(s,`${a}/contracts/${e}/sources/codegen/schema.move`,"formatAndWriteMove"),console.log(`\u2705 Schema Structure Generation Complete
113
+ }`;await c(n,`${a}/contracts/${e}/sources/codegen/schema.move`,"formatAndWriteMove"),console.log(`\u2705 Schema Structure Generation Complete
114
114
  `)}import{existsSync as U}from"fs";async function F(e,t){console.log(`
115
- \u{1F4DD} Starting Deploy Hook Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`);let r=`${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`;if(!U(r)){let a=`module ${e.name}::deploy_hook {
116
- use ${e.name}::schema::Schema;
115
+ \u{1F4DD} Starting Deploy Hook Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`);let r=`${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`;if(!U(r)){let a=`module ${e.name}::${e.name}_deploy_hook {
116
+ use ${e.name}::${e.name}_schema::Schema;
117
117
 
118
118
  public(package) fun run(_schema: &mut Schema, _ctx: &mut TxContext) {
119
119
 
120
120
  }
121
121
  }`;await c(a,r,"formatAndWriteMove")}console.log(`\u2705 Deploy Hook Generation Complete
122
- `)}async function I(e,t){if(!U(`${t}/contracts/${e.name}/sources/scripts/migrate.move`)){let r=`module ${e.name}::migrate {
122
+ `)}async function I(e,t){if(!U(`${t}/contracts/${e.name}/sources/scripts/migrate.move`)){let r=`module ${e.name}::${e.name}_migrate {
123
123
  const ON_CHAIN_VERSION: u32 = 1;
124
124
 
125
125
  public fun on_chain_version(): u32 {
126
126
  ON_CHAIN_VERSION
127
127
  }
128
128
  }
129
- `;await c(r,`${t}/contracts/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}function m(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}function B(e,t){return t!=null?Object.keys(t).map(a=>`use ${e}::${m(a)}::${a};`).join(`
129
+ `;await c(r,`${t}/contracts/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}function m(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}function B(e,t){return t!=null?Object.keys(t).map(a=>`use ${e}::${e}_${m(a)}::${a};`).join(`
130
130
  `):""}async function D(e,t,r,a){console.log(`
131
- \u{1F4E6} Starting Schema Event Generation...`);for(let o of Object.keys(r)){let n=o,i=r[o];console.log(` \u2514\u2500 Generating ${n} event: ${i}`);let p=`module ${e}::${m(n)}_event {
131
+ \u{1F4E6} Starting Schema Event Generation...`);for(let s of Object.keys(r)){let o=s,i=r[s];console.log(` \u2514\u2500 Generating ${o} event: ${i}`);let p=`module ${e}::${e}_${m(o)}_event {
132
132
  use sui::event;
133
133
  use std::ascii::String;
134
134
  ${B(e,t)}
135
135
 
136
- public struct ${n}Event has copy, drop {
136
+ public struct ${o}Event has copy, drop {
137
137
  ${u(i)}
138
138
  }
139
139
 
140
- public fun new(${u(i)}): ${n}Event {
141
- ${n}Event {
140
+ public fun new(${u(i)}): ${o}Event {
141
+ ${o}Event {
142
142
  ${f(i)}
143
143
  }
144
144
  }
145
- }`;await c(p,`${a}/contracts/${e}/sources/codegen/data/${m(n)}_event.move`,"formatAndWriteMove")}let s=`module ${e}::events {
145
+ }`;await c(p,`${a}/contracts/${e}/sources/codegen/data/${m(o)}_event.move`,"formatAndWriteMove")}let n=`module ${e}::${e}_events {
146
146
  use std::ascii::{String, string};
147
147
  ${B(e,t)}
148
- ${Object.entries(r).map(([o,n])=>`
149
- use ${e}::${m(o)}_event::${o}Event;
150
- use ${e}::${m(o)}_event;
151
- public fun ${m(o)}_event(${u(n)}) {
152
- dubhe::storage_event::emit_set_record<${o}Event, ${o}Event, ${o}Event>(
153
- string(b"${m(o)}_event"),
148
+ ${Object.entries(r).map(([s,o])=>`
149
+ use ${e}::${e}_${m(s)}_event::${s}Event;
150
+ use ${e}::${e}_${m(s)}_event;
151
+ public fun ${m(s)}_event(${u(o)}) {
152
+ dubhe::storage_event::emit_set_record<${s}Event, ${s}Event, ${s}Event>(
153
+ string(b"${m(s)}_event"),
154
154
  option::none(),
155
155
  option::none(),
156
- option::some(${m(o)}_event::new(${f(n)}))
156
+ option::some(${e}_${m(s)}_event::new(${f(o)}))
157
157
  )
158
158
  }
159
159
  `).join(`
160
160
  `)}
161
- }`;await c(s,`${a}/contracts/${e}/sources/codegen/events.move`,"formatAndWriteMove"),console.log(`\u2705 Schema Event Generation Complete
162
- `)}import{existsSync as se}from"fs";import ne from"node:fs/promises";async function z(e,t){console.log(`
163
- \u2699\uFE0F Starting System Generation...`),console.log(" \u251C\u2500 Generating systems"),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/systems`),se(`${t}/contracts/${e.name}/sources/systems`)||await ne.mkdir(`${t}/contracts/${e.name}/sources/systems`,{recursive:!0}),console.log(`\u2705 System Generation Complete
161
+ }`;await c(n,`${a}/contracts/${e}/sources/codegen/events.move`,"formatAndWriteMove"),console.log(`\u2705 Schema Event Generation Complete
162
+ `)}import{existsSync as ne}from"fs";import oe from"node:fs/promises";async function z(e,t){console.log(`
163
+ \u2699\uFE0F Starting System Generation...`),console.log(" \u251C\u2500 Generating systems"),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/systems`),ne(`${t}/contracts/${e.name}/sources/systems`)||await oe.mkdir(`${t}/contracts/${e.name}/sources/systems`,{recursive:!0}),console.log(`\u2705 System Generation Complete
164
164
  `)}function ie(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function H(e,t,r){console.log(`
165
- \u{1F4E6} Starting Schema Error Generation...`);let a=`module ${e}::errors {
166
- ${Object.entries(t).map(([s,o])=>(console.log(` \u251C\u2500 Generating Error: ${s}`),console.log(` \u2502 \u2514\u2500 Message: ${o}`),`#[error]
167
- const ${s}: vector<u8> = b"${o}";
168
- public fun ${ie(s)}_error(condition: bool) { assert!(condition, ${s}) }
165
+ \u{1F4E6} Starting Schema Error Generation...`);let a=`module ${e}::${e}_errors {
166
+ ${Object.entries(t).map(([n,s])=>(console.log(` \u251C\u2500 Generating Error: ${n}`),console.log(` \u2502 \u2514\u2500 Message: ${s}`),`#[error]
167
+ const ${n}: vector<u8> = b"${s}";
168
+ public fun ${ie(n)}_error(condition: bool) { assert!(condition, ${n}) }
169
169
  `)).join(`
170
170
  `)}
171
171
  }`;await c(a,`${r}/contracts/${e}/sources/codegen/errors.move`,"formatAndWriteMove"),console.log(`\u2705 Schema Error Generation Complete
172
- `)}import{existsSync as k}from"fs";async function K(e,t){await ce(e,t),await pe(e,t),await ue(e,t)}async function ce(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/dapp/metadata.move`;if(!k(r)){let a=`module ${e.name}::dapp_metadata {
172
+ `)}import{existsSync as k}from"fs";async function K(e,t){await ce(e,t),await pe(e,t),await ue(e,t)}async function ce(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/dapp/metadata.move`;if(!k(r)){let a=`module ${e.name}::${e.name}_dapp_metadata {
173
173
  use std::ascii::String;
174
174
 
175
175
  public struct DappMetadata has drop, copy, store {
@@ -265,8 +265,8 @@ use ${e}::${m(o)}_event;
265
265
  }
266
266
 
267
267
  }
268
- `;await c(a,r,"formatAndWriteMove")}}async function pe(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/dapp/schema.move`;if(!k(r)){let a=`module ${e.name}::dapp_schema {
269
- use ${e.name}::dapp_metadata::DappMetadata;
268
+ `;await c(a,r,"formatAndWriteMove")}}async function pe(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/dapp/schema.move`;if(!k(r)){let a=`module ${e.name}::${e.name}_dapp_schema {
269
+ use ${e.name}::${e.name}_dapp_metadata::DappMetadata;
270
270
  use dubhe::storage_value;
271
271
  use dubhe::storage_value::StorageValue;
272
272
  use dubhe::storage;
@@ -366,14 +366,14 @@ use ${e}::${m(o)}_event;
366
366
  id.delete();
367
367
  }
368
368
  }
369
- `;await c(a,r,"formatAndWriteMove")}}async function ue(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/dapp/system.move`;if(!k(r)){let a=`module ${e.name}::dapp_system {
369
+ `;await c(a,r,"formatAndWriteMove")}}async function ue(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/dapp/system.move`;if(!k(r)){let a=`module ${e.name}::${e.name}_dapp_system {
370
370
  use std::ascii::String;
371
371
  use std::ascii;
372
372
  use dubhe::type_info;
373
373
  use sui::clock::Clock;
374
- use ${e.name}::dapp_schema;
375
- use ${e.name}::dapp_metadata;
376
- use ${e.name}::dapp_schema::Dapp;
374
+ use ${e.name}::${e.name}_dapp_schema;
375
+ use ${e.name}::${e.name}_dapp_metadata;
376
+ use ${e.name}::${e.name}_dapp_schema::Dapp;
377
377
 
378
378
  public struct DappKey has drop {}
379
379
  public(package) fun new(): DappKey {
@@ -381,10 +381,10 @@ use ${e}::${m(o)}_event;
381
381
  }
382
382
 
383
383
  public(package) fun create(name: String, description: String, clock: &Clock, ctx: &mut TxContext): Dapp {
384
- let mut dapp = dapp_schema::create(ctx);
384
+ let mut dapp = ${e.name}_dapp_schema::create(ctx);
385
385
  assert!(!dapp.borrow_metadata().contains(), 0);
386
386
  dapp.metadata().set(
387
- dapp_metadata::new(
387
+ ${e.name}_dapp_metadata::new(
388
388
  name,
389
389
  description,
390
390
  ascii::string(b""),
@@ -415,7 +415,7 @@ use ${e}::${m(o)}_event;
415
415
  assert!(admin == option::some(ctx.sender()), 0);
416
416
  let created_at = dapp.metadata().get().get_created_at();
417
417
  dapp.metadata().set(
418
- dapp_metadata::new(
418
+ ${e.name}_dapp_metadata::new(
419
419
  name,
420
420
  description,
421
421
  icon_url,
@@ -454,8 +454,8 @@ use ${e}::${m(o)}_event;
454
454
 
455
455
 
456
456
  `;await c(a,r,"formatAndWriteMove")}}async function Q(e,t){console.log(`
457
- \u{1F4DD} Starting Init Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/tests/init.move`);let r=`module ${e.name}::init_test {
458
- use ${e.name}::dapp_schema::Dapp;
457
+ \u{1F4DD} Starting Init Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/tests/init.move`);let r=`module ${e.name}::${e.name}_init_test {
458
+ use ${e.name}::${e.name}_dapp_schema::Dapp;
459
459
  use sui::clock;
460
460
  use sui::test_scenario;
461
461
  use sui::test_scenario::Scenario;
@@ -464,27 +464,27 @@ use ${e}::${m(o)}_event;
464
464
  let mut scenario = test_scenario::begin(sender);
465
465
  let ctx = test_scenario::ctx(&mut scenario);
466
466
  let clock = clock::create_for_testing(ctx);
467
- ${e.name}::genesis::run(&clock, ctx);
467
+ ${e.name}::${e.name}_genesis::run(&clock, ctx);
468
468
  clock::destroy_for_testing(clock);
469
469
  test_scenario::next_tx(&mut scenario,sender);
470
470
  let dapp = test_scenario::take_shared<Dapp>(&scenario);
471
471
  (scenario, dapp)
472
472
  }
473
473
  }
474
- `;await c(r,`${t}/contracts/${e.name}/sources/tests/init.move`,"formatAndWriteMove");let a=`module ${e.name}::genesis {
474
+ `;await c(r,`${t}/contracts/${e.name}/sources/tests/init.move`,"formatAndWriteMove");let a=`module ${e.name}::${e.name}_genesis {
475
475
  use std::ascii::string;
476
476
 
477
477
  use sui::clock::Clock;
478
478
 
479
- use ${e.name}::dapp_system;
479
+ use ${e.name}::${e.name}_dapp_system;
480
480
 
481
481
  public entry fun run(clock: &Clock, ctx: &mut TxContext) {
482
482
  // Create a dapp.
483
- let mut dapp = dapp_system::create(string(b"${e.name}"),string(b"${e.description}"), clock , ctx);
483
+ let mut dapp = ${e.name}_dapp_system::create(string(b"${e.name}"),string(b"${e.description}"), clock , ctx);
484
484
  // Create schemas
485
- let mut schema = ${e.name}::schema::create(ctx);
485
+ let mut schema = ${e.name}::${e.name}_schema::create(ctx);
486
486
  // Logic that needs to be automated once the contract is deployed
487
- ${e.name}::deploy_hook::run(&mut schema, ctx);
487
+ ${e.name}::${e.name}_deploy_hook::run(&mut schema, ctx);
488
488
  // Authorize schemas and public share objects
489
489
  dapp.add_schema(schema);
490
490
  sui::transfer::public_share_object(dapp);
@@ -492,6 +492,6 @@ use ${e}::${m(o)}_event;
492
492
  }
493
493
  `;await c(a,`${t}/contracts/${e.name}/sources/codegen/genesis.move`,"formatAndWriteMove"),console.log(`\u2705 Init Generation Complete
494
494
  `)}async function ft(e,t,r){console.log(`
495
- \u{1F680} Starting Schema Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u251C\u2500 Name: ${e.name}`),console.log(` \u251C\u2500 Description: ${e.description||"No description provided"}`),console.log(` \u251C\u2500 Network: ${r||"testnet"}`);let a=t??process.cwd();A(`${a}/contracts/${e.name}`)&&v(`${a}/contracts/${e.name}/sources/codegen`),A(`${a}/contracts/${e.name}/Move.toml`)||await V(e,a),A(`${a}/contracts/${e.name}/sources/script/deploy_hook.move`)||await F(e,a),e.events&&(e.data?await D(e.name,e.data,e.events,a):await D(e.name,null,e.events,a)),e.data?(await L(e.name,e.data,a),await x(e.name,e.data,e.schemas,a)):await x(e.name,null,e.schemas,a),e.errors&&await H(e.name,e.errors,a),await K(e,a),await Q(e,a),await z(e,a),await I(e,a),console.log(`\u2705 Schema Generation Process Complete!
496
- `)}import{findUp as me}from"find-up";import C from"path";import le from"esbuild";var S=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as de}from"fs";import{pathToFileURL as ge}from"url";import fe from"os";var _e=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],M="dubhe.config.example.mjs";async function Dt(e){e=await Z(e);try{return await le.build({entryPoints:[e],format:"esm",outfile:M,platform:"node",bundle:!0,packages:"external"}),e=await Z(M,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{de(M,{force:!0})}}async function Z(e,t){return e===void 0?e=await be():C.isAbsolute(e)||(e=C.join(process.cwd(),e),e=C.normalize(e)),t&&fe.platform()==="win32"?ge(e).href:e}async function be(){let e=await me(_e);if(e===void 0)throw new S;return e}var y=e=>{if(typeof e!="object"||e===null)return e;let t={};for(let r in e)if(e.hasOwnProperty(r)){let a=e[r];typeof a=="object"&&a!==null?Array.isArray(a)?t[r]=X(a):a.hasOwnProperty("variant")?t[r]={[a.variant]:{}}:a.hasOwnProperty("fields")?t[r]=y(a.fields):t[r]=y(a):t[r]=a}return t},X=e=>{let t=[];return e.forEach(r=>{typeof r=="object"&&r!==null?Array.isArray(r)?t.push(X(r)):r.hasOwnProperty("variant")?t.push({[r.variant]:{}}):r.hasOwnProperty("fields")?t.push(y(r.fields)):t.push(y(r)):t.push(r)}),t};export{c as formatAndWriteMove,Me as formatAndWriteTypescript,T as formatMove,j as formatTypescript,Dt as loadConfig,y as parseData,je as posixPath,Z as resolveConfigPath,ft as schemaGen};
495
+ \u{1F680} Starting Schema Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u251C\u2500 Name: ${e.name}`),console.log(` \u251C\u2500 Description: ${e.description||"No description provided"}`),console.log(` \u251C\u2500 Network: ${r||"testnet"}`);let a=t??process.cwd();A(`${a}/contracts/${e.name}`)&&v(`${a}/contracts/${e.name}/sources/codegen`),A(`${a}/contracts/${e.name}/Move.toml`)||await j(e,a),A(`${a}/contracts/${e.name}/sources/script/deploy_hook.move`)||await F(e,a),e.events&&(e.data?await D(e.name,e.data,e.events,a):await D(e.name,null,e.events,a)),e.data?(await L(e.name,e.data,a),await x(e.name,e.data,e.schemas,a)):await x(e.name,null,e.schemas,a),e.errors&&await H(e.name,e.errors,a),await K(e,a),await Q(e,a),await z(e,a),await I(e,a),console.log(`\u2705 Schema Generation Process Complete!
496
+ `)}import{findUp as me}from"find-up";import C from"path";import le from"esbuild";var S=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as de}from"fs";import{pathToFileURL as ge}from"url";import fe from"os";var _e=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],M="dubhe.config.example.mjs";async function Dt(e){e=await Z(e);try{return await le.build({entryPoints:[e],format:"esm",outfile:M,platform:"node",bundle:!0,packages:"external"}),e=await Z(M,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{de(M,{force:!0})}}async function Z(e,t){return e===void 0?e=await be():C.isAbsolute(e)||(e=C.join(process.cwd(),e),e=C.normalize(e)),t&&fe.platform()==="win32"?ge(e).href:e}async function be(){let e=await me(_e);if(e===void 0)throw new S;return e}var y=e=>{if(typeof e!="object"||e===null)return e;let t={};for(let r in e)if(e.hasOwnProperty(r)){let a=e[r];typeof a=="object"&&a!==null?Array.isArray(a)?t[r]=X(a):a.hasOwnProperty("variant")?t[r]={[a.variant]:{}}:a.hasOwnProperty("fields")?t[r]=y(a.fields):t[r]=y(a):t[r]=a}return t},X=e=>{let t=[];return e.forEach(r=>{typeof r=="object"&&r!==null?Array.isArray(r)?t.push(X(r)):r.hasOwnProperty("variant")?t.push({[r.variant]:{}}):r.hasOwnProperty("fields")?t.push(y(r.fields)):t.push(y(r)):t.push(r)}),t};export{c as formatAndWriteMove,Me as formatAndWriteTypescript,T as formatMove,R as formatTypescript,Dt as loadConfig,y as parseData,Re as posixPath,Z as resolveConfigPath,ft as schemaGen};
497
497
  //# 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","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateEvent.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateError.ts","../src/codegen/utils/renderMove/generateDefaultSchema.ts","../src/codegen/utils/renderMove/generateInit.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts","../src/parseData/parser/index.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(\n\tcontent: string,\n\tprettierConfigPath?: string\n): Promise<string> {\n\tlet config;\n\tif (prettierConfigPath) {\n\t\tconfig = await prettier.resolveConfig(prettierConfigPath);\n\t}\n\ttry {\n\t\treturn prettier.format(content, {\n\t\t\tplugins: [prettierPluginMove],\n\t\t\tparser: 'move-parse',\n\t\t\tprintWidth: 120,\n\t\t\tsemi: true,\n\t\t\ttabWidth: 2,\n\t\t\tuseTabs: false,\n\t\t\tbracketSpacing: true,\n\t\t\t...config,\n\t\t});\n\t} catch (error) {\n\t\tlet message;\n\t\tif (error instanceof Error) {\n\t\t\tmessage = error.message;\n\t\t} else {\n\t\t\tmessage = error;\n\t\t}\n\t\tconsole.log(`Error during output formatting: ${message}`);\n\t\treturn content;\n\t}\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n\treturn prettier.format(content, {\n\t\tparser: 'typescript',\n\t});\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 =\n` // 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 (fullOutputPath.includes(\".toml\") || fullOutputPath.includes(\"system\") || fullOutputPath.includes(\"migrate\")) {\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 { SchemaType, 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 { generateSystem } from './generateSystem';\nimport { generateSchemaHub } from './generateSchemaHub';\nimport { generateSchemaError } from './generateError';\nimport {generateDefaultSchema} from \"./generateDefaultSchema\";\nimport {generateInit} from \"./generateInit\";\n\nexport async function schemaGen(\n config: DubheConfig,\n srcPrefix?: string,\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(\n ` ├─ Description: ${config.description || 'No description provided'}`,\n );\n console.log(` ├─ Network: ${network || 'testnet'}`);\n\n const path = srcPrefix ?? process.cwd();\n\n if (existsSync(`${path}/contracts/${config.name}`)) {\n deleteFolderRecursive(\n `${path}/contracts/${config.name}/sources/codegen`,\n );\n }\n\n if (!existsSync(`${path}/contracts/${config.name}/Move.toml`)) {\n await generateToml(config, path);\n }\n\n if (\n !existsSync(\n `${path}/contracts/${config.name}/sources/script/deploy_hook.move`,\n )\n ) {\n await generateDeployHook(config, path);\n }\n\n if (config.events) {\n if (config.data) {\n await generateSchemaEvent(config.name, config.data, config.events, path);\n } else {\n await generateSchemaEvent(config.name, null, config.events, path);\n }\n }\n\n if (config.data) {\n await generateSchemaData(config.name, config.data, path);\n await generateSchemaStructure(config.name, config.data, config.schemas, path);\n } else {\n await generateSchemaStructure(config.name, null, config.schemas, path);\n }\n\n if (config.errors) {\n await generateSchemaError(config.name, config.errors, path);\n }\n\n await generateDefaultSchema(config, path);\n await generateInit(config, path);\n await generateSystem(config, path);\n await generateMigrate(config, path);\n\n console.log('✅ Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n\tif (fs.existsSync(path)) {\n\t\tfs.readdirSync(path).forEach(file => {\n\t\t\tconst curPath = `${path}/${file}`;\n\t\t\tif (fs.lstatSync(curPath).isDirectory()) {\n\t\t\t\tdeleteFolderRecursive(curPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(curPath);\n\t\t\t}\n\t\t});\n\t\tfs.rmdirSync(path);\n\t}\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n\treturn 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(\n\tvalues: Record<string, string> | string\n): string {\n\treturn Object.entries(values)\n\t\t.map(([key, _]) => `${key}`)\n\t\t.join(',');\n}\n\nfunction isAddress(str: string): boolean {\n\tconst regex = /^0x[a-fA-F0-9]+$/;\n\treturn 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(\n\tvalues: Record<string, string>\n): string {\n\treturn `(${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(\n\tvalues: Record<string, string>\n): string[] {\n\treturn Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(\n\tvalues: Record<string, string>,\n): string[] {\n\treturn Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n\nexport function containsString(obj: Record<string, any>, searchString: string): boolean {\n\tfor (const key in obj) {\n\t\tif (obj.hasOwnProperty(key)) {\n\t\t\tconst value = obj[key];\n\t\t\tif (typeof value === 'string' && value === searchString) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateToml(\n\tconfig: DubheConfig,\n\tsrcPrefix: string,\n) {\n\tconsole.log('\\n📄 Starting Move.toml Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/Move.toml`\n\t);\n\n\tlet 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.38.3\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe-framework.git\", rev = \"dubhe-mainnet-v1.1.0\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x0\"\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/Move.toml`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('✅ Move.toml Generation Complete\\n');\n}\n","import {BaseType, SchemaData, SchemaType} from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery, containsString,\n} from './common';\n\nfunction sortByFirstLetter(arr: string[]): string[] {\n\treturn arr.sort((a, b) => {\n\t\tconst firstLetterA = a.charAt(0).toLowerCase();\n\t\tconst firstLetterB = b.charAt(0).toLowerCase();\n\n\t\tif (firstLetterA < firstLetterB) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (firstLetterA > firstLetterB) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n}\n\nexport function capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nexport function renderSetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>,\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([key, type]) =>\n\t\t\t\t`public(package) fun set_${key}(self: &mut ${schemaName}, ${key}: ${type}) {\n self.${key} = ${key};\n }`,\n\t\t)\n\t\t.join('\\n');\n}\n\nexport function renderSetFunc(\n\tschemaName: string,\n\tfields: Record<string, string>,\n): string {\n\treturn `public(package) fun set(self: &mut ${schemaName}, ${getStructAttrsWithType(\n\t\tfields,\n\t)}) {\n ${Object.entries(fields)\n\t\t.map(([fieldName]) => `self.${fieldName} = ${fieldName};`)\n\t\t.join('\\n')}\n }`;\n}\n\nexport function renderGetAllFunc(\n\tschemaName: string,\n\tfields: Record<string, string>,\n): string {\n\treturn `public fun get(self: &${schemaName}): ${getStructTypes(fields)} {\n (${getStructAttrsQuery(fields)})\n }`;\n}\n\nexport function renderGetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>,\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([\n\t\t\t\t key,\n\t\t\t\t type,\n\t\t\t ]) => `public fun get_${key}(self: &${schemaName}): ${type} {\n self.${key}\n }`,\n\t\t)\n\t\t.join('\\n');\n}\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nexport async function generateSchemaData(\n\tprojectName: string,\n\tdata: Record<string, SchemaData>,\n\tpath: string,\n) {\n\tconsole.log('\\n📦 Starting Schema Data Generation...');\n\tfor (const key of Object.keys(data)) {\n\t\t\t\tconst name = key;\n\t\t\t\tconst fields = data[key];\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${name} ${\n\t\t\t\t\t\tArray.isArray(fields) ? '(enum)' : '(struct)'\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tlet code = '';\n\n\t\t\t\tconst enumNames = Object.keys(data)\n\t\t\t\t\t.filter(item => Array.isArray(data[item]))\n\t\t\t\t\t.map(item => item);\n\n\t\t\tconsole.log(enumNames)\n\n\t\t\t\tif (Array.isArray(fields)) {\n\t\t\t\t\tconst sortByFirstLetterFields = sortByFirstLetter(fields);\n\t\t\t\t\tcode = `module ${projectName}::${convertToSnakeCase(\n\t\t\t\t\t\tname,\n\t\t\t\t\t)} {\n public enum ${name} has copy, drop , store {\n ${sortByFirstLetterFields}\n }\n \n ${sortByFirstLetterFields\n\t\t\t\t\t\t.map((field: string) => {\n\t\t\t\t\t\t\treturn `public fun new_${convertToSnakeCase(\n\t\t\t\t\t\t\t\tfield,\n\t\t\t\t\t\t\t)}(): ${name} {\n ${name}::${field}\n }`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('')}`;\n\t\t\t\t} else {\n\t\t\t\t\tcode = `module ${projectName}::${convertToSnakeCase(\n\t\t\t\t\t\tname,\n\t\t\t\t\t)} {\n use std::ascii::String;\n \n\t\t\t\t\t\t${\n\t\t\t\t\t\tObject.keys(data)\n\t\t\t\t\t\t\t.map(name => {\n\t\t\t\t\t\t\t\tif (containsString(fields, name)) {\n\t\t\t\t\t\t\t\t\treturn `use ${projectName}::${convertToSnakeCase(name)}::${name};`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t.join('\\n')\n\t\t\t\t\t}\n\n public struct ${name} has copy, drop , store {\n ${getStructAttrsWithType(fields)}\n }\n \n public fun new(${getStructAttrsWithType(\n\t\t\t\t\t\tfields,\n\t\t\t\t\t)}): ${name} {\n ${name} {\n ${getStructAttrs(fields)}\n }\n }\n \n ${renderGetAllFunc(name, fields)}\n ${renderGetAttrsFunc(name, fields)}\n ${renderSetAttrsFunc(name, fields)}\n ${renderSetFunc(name, fields)}\n }`;\n\t\t\t\t}\n\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/data/${convertToSnakeCase(\n\t\t\t\t\t\tname,\n\t\t\t\t\t)}.move`,\n\t\t\t\t\t'formatAndWriteMove',\n\t\t\t\t);\n\t\t\t}\n\tconsole.log('✅ Schema Data Generation Complete\\n');\n}\n\nfunction generateImport(\n\tprojectName: string,\n\tdata: Record<string, SchemaData> | null,\n) {\n\tif (data != null) {\n\t\tconst names = Object.keys(data);\n\t\treturn names\n\t\t\t.map(name => {\n\t\t\t\treturn `use ${projectName}::${convertToSnakeCase(\n\t\t\t\t\tname,\n\t\t\t\t)}::${name};`;\n\t\t\t})\n\t\t\t.join('\\n');\n\t} else {\n\t\treturn '';\n\t}\n}\n\nexport async function generateSchemaStructure(\n\tprojectName: string,\n\tdata: Record<string, SchemaData> | null,\n\tschemas: Record<string, SchemaType>,\n\tpath: string,\n) {\n\tconsole.log('\\n🔨 Starting Schema Structure Generation...');\n\t\tconsole.log(\n\t\t\t` ├─ Output path: ${path}/contracts/${projectName}/sources/codegen/schema.move`,\n\t\t);\n\t\tconsole.log(\n\t\t\t` └─ Structure fields: ${\n\t\t\t\tObject.values(schemas).length\n\t\t\t}`,\n\t\t);\n\t\tconst schemaMoudle = `module ${projectName}::schema {\n use std::ascii::String;\n use std::ascii::string;\n use sui::package::UpgradeCap;\n use std::type_name; \n use dubhe::storage;\n use dubhe::storage_value::{Self, StorageValue};\n use dubhe::storage_map::{Self, StorageMap};\n use dubhe::storage_double_map::{Self, StorageDoubleMap};\n use sui::dynamic_field as df;\n \n ${generateImport(projectName, data)}\n\n public struct Schema has key, store { id: UID } \n \n ${Object.entries(schemas)\n\t\t\t.map(([key, value]) => {\n\t\t\t\treturn `public fun borrow_${key}(self: &Schema) : &${value} {\n storage::borrow_field(&self.id, b\"${key}\")\n }\n \n public(package) fun ${key}(self: &mut Schema): &mut ${value} {\n storage::borrow_mut_field(&mut self.id, b\"${key}\")\n }\n `;\n\t\t\t})\n\t\t\t.join('')} \n \n \n public(package) fun create(ctx: &mut TxContext): Schema {\n let mut id = object::new(ctx);\n ${Object.entries(schemas)\n\t\t\t.map(([key, value]) => {\n\t\t\t\tlet storage_type = '';\n\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\tstorage_type = `storage_value::new(b\"${key}\", ctx)`;\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tstorage_type = `storage_map::new(b\"${key}\", ctx)`;\n\t\t\t\t} else if (\n\t\t\t\t\tvalue.includes('StorageDoubleMap')\n\t\t\t\t) {\n\t\t\t\t\tstorage_type = `storage_double_map::new(b\"${key}\", ctx)`;\n\t\t\t\t}\n\t\t\t\treturn `storage::add_field<${value}>(&mut id, b\"${key}\", ${storage_type});`;\n\t\t\t})\n\t\t\t.join('\\n')}\n \n Schema { id }\n }\n \n public(package) fun id(self: &mut Schema): &mut UID {\n\t\t\t\t\t &mut self.id\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tpublic(package) fun borrow_id(self: &Schema): &UID {\n\t\t\t\t\t &self.id\n\t\t\t\t\t}\n \n public fun migrate(_schema: &mut Schema, _cap: &UpgradeCap, _ctx: &mut TxContext) { }\n\n \n // ======================================== View Functions ========================================\n ${Object.entries(schemas)\n\t\t\t.map(([key, value]) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tlet all_types = value.match(/<(.+)>/)[1].split(',').map(type => type.trim());\n\t\t\t\tlet para_key: string[] = [];\n\t\t\t\tlet para_value = '';\n\t\t\t\tlet borrow_key = '';\n\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\tpara_key = [];\n\t\t\t\t\tpara_value = `${all_types[0]}`;\n\t\t\t\t\tborrow_key = 'get()';\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tpara_key = [`key: ${all_types[0]}`];\n\t\t\t\t\tpara_value = `${all_types[1]}`;\n\t\t\t\t\tborrow_key = 'get(key)';\n\t\t\t\t} else if (value.includes('StorageDoubleMap')) {\n\t\t\t\t\tpara_key = [`key1: ${all_types[0]}`, `key2: ${all_types[1]}`];\n\t\t\t\t\tpara_value = `${all_types[2]}`;\n\t\t\t\t\tborrow_key = 'get(key1, key2)';\n\t\t\t\t}\n\t\t\t\treturn `public fun get_${key}(self: &Schema, ${para_key}) : &${para_value} {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().${borrow_key}\n\t\t\t\t\t\t\t\t}`\n\t\t\t}).join('\\n')}\n // =========================================================================================================\n\t\t\t}`\n\t\tawait formatAndWriteMove(\n\t\t\tschemaMoudle,\n\t\t\t`${path}/contracts/${projectName}/sources/codegen/schema.move`,\n\t\t\t'formatAndWriteMove',\n\t\t);\n\t\tconsole.log('✅ Schema Structure Generation Complete\\n');\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\nexport async function generateDeployHook(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\n📝 Starting Deploy Hook Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`\n\t);\n\n\tconst path = `${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`;\n\tif (!existsSync(path)) {\n\t\tconst code = `module ${config.name}::deploy_hook {\n\t\t\t use ${config.name}::schema::Schema;\n\n public(package) fun run(_schema: &mut Schema, _ctx: &mut TxContext) {\n\n }\n}`\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\tpath,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n\tconsole.log('✅ Deploy Hook Generation Complete\\n');\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`\n\t\t)\n\t) {\n\t\tlet 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\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n","import {BaseType, EventData, SchemaData, SchemaType} from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\n\nfunction capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nfunction generateImport(\n\tprojectName: string,\n\tdata: Record<string, SchemaData> | null,\n) {\n\tif (data != null) {\n\t\tconst names = Object.keys(data);\n\t\treturn names\n\t\t\t.map(name => {\n\t\t\t\treturn `use ${projectName}::${convertToSnakeCase(\n\t\t\t\t\tname,\n\t\t\t\t)}::${name};`;\n\t\t\t})\n\t\t\t.join('\\n');\n\t} else {\n\t\treturn '';\n\t}\n}\n\nexport async function generateSchemaEvent(\n\tprojectName: string,\n\tdata: Record<string, SchemaData> | null,\n\tevents: Record<string, EventData>,\n\tpath: string\n) {\n\tconsole.log('\\n📦 Starting Schema Event Generation...');\n\tfor (const key of Object.keys(events)) {\n\t\t\t\tconst name = key;\n\t\t\t\tconst fields = events[key];\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${name} event: ${fields}`\n\t\t\t\t);\n\n\t\t\t\tlet\tcode = `module ${projectName}::${convertToSnakeCase(name)}_event {\n\t\t\t\t\t\tuse sui::event;\n\t\t\t\t\t\tuse std::ascii::String;\n\t\t\t\t\t\t${generateImport(projectName, data)}\n\n public struct ${name}Event has copy, drop {\n ${getStructAttrsWithType(fields as Record<string, string>)}\n }\n\n public fun new(${getStructAttrsWithType(fields as Record<string, string>)}): ${name}Event {\n ${name}Event {\n ${getStructAttrs(fields as Record<string, string>)}\n }\n }\n }`;\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/data/${convertToSnakeCase(\n\t\t\t\t\t\tname\n\t\t\t\t\t)}_event.move`,\n\t\t\t\t\t'formatAndWriteMove'\n\t\t\t\t);\n\t\t\t}\n\n\tlet\tcode = `module ${projectName}::events {\n\t \tuse std::ascii::{String, string};\n\t \t${generateImport(projectName, data)}\n\t\t${Object.entries(events).map(([name, fields]) => {\n\t\treturn `\nuse ${projectName}::${convertToSnakeCase(name)}_event::${name}Event;\nuse ${projectName}::${convertToSnakeCase(name)}_event;\n\t\t\tpublic fun ${convertToSnakeCase(name)}_event(${getStructAttrsWithType(fields as Record<string, string>)}) {\n\t\t\t dubhe::storage_event::emit_set_record<${name}Event, ${name}Event, ${name}Event>(\n\t\t\t\tstring(b\"${convertToSnakeCase(name)}_event\"),\n\t\t\t\toption::none(),\n\t\t\t \toption::none(),\n\t\t\t option::some(${convertToSnakeCase(name)}_event::new(${getStructAttrs(fields as Record<string, string>)}))\n\t\t\t )\n\t\t\t}\n\t\t`\n\t}).join('\\n')}\t\t\n }`\n\n\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${path}/contracts/${projectName}/sources/codegen/events.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('✅ Schema Event Generation Complete\\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 generateSystem(config: DubheConfig, srcPrefix: string) {\n\tconsole.log('\\n⚙️ Starting System Generation...');\n\t\tconsole.log(` ├─ Generating systems`);\n\t\tconsole.log(\n\t\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/systems`\n\t\t);\n\n\t\tif (\n\t\t\t!existsSync(\n\t\t\t\t`${srcPrefix}/contracts/${config.name}/sources/systems`\n\t\t\t)\n\t\t) {\n\t\t\tawait fs.mkdir(`${srcPrefix}/contracts/${config.name}/sources/systems`, { recursive: true })\n\t\t}\n\tconsole.log('✅ System Generation Complete\\n');\n}\n","import {BaseType, ErrorData, SchemaType} from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nexport async function generateSchemaError(\n\tprojectName: string,\n\terrors: ErrorData,\n\tpath: string\n) {\n\tconsole.log('\\n📦 Starting Schema Error Generation...');\n\n\tlet\tcode = `module ${projectName}::errors {\n\t\t${Object.entries(errors).map(([name, message]) => {\n\t\t\tconsole.log(` ├─ Generating Error: ${name}`);\n\t\tconsole.log(` │ └─ Message: ${message}`);\n\t\treturn `#[error]\n\t\t\t\tconst ${name}: vector<u8> = b\"${message}\";\n\t\t\t\tpublic fun ${convertToSnakeCase(name)}_error(condition: bool) { assert!(condition, ${name}) }\n\t\t`\n\t}).join('\\n')}\t\t\n }`\n\n\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${path}/contracts/${projectName}/sources/codegen/errors.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('✅ Schema Error Generation Complete\\n');\n}","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nexport async function generateDefaultSchema(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tawait generateDappSchemaMetadata(config, srcPrefix);\n\tawait generateDappSchema(config, srcPrefix);\n\tawait generateDappSystem(config, srcPrefix);\n}\n\nasync function generateDappSchemaMetadata(config: DubheConfig, srcPrefix: string) {\n\tconst path = `${srcPrefix}/contracts/${config.name}/sources/codegen/dapp/metadata.move`\n\tif (!existsSync(path)) {\n\t\tlet code = `module ${config.name}::dapp_metadata {\n use std::ascii::String;\n\n public struct DappMetadata has drop, copy, store {\n name: String,\n description: String,\n icon_url: String,\n website_url: String,\n created_at: u64,\n partners: vector<String>,\n }\n\n public fun new(\n name: String,\n description: String,\n icon_url: String,\n website_url: String,\n created_at: u64,\n partners: vector<String>,\n ): DappMetadata {\n DappMetadata {\n name,\n description,\n icon_url,\n website_url,\n created_at,\n partners,\n }\n }\n\n public fun set(\n self: &mut DappMetadata,\n name: String,\n description: String,\n icon_url: String,\n website_url: String,\n created_at: u64,\n partners: vector<String>,\n ) {\n self.name = name;\n self.description = description;\n self.icon_url = icon_url;\n self.website_url = website_url;\n self.created_at = created_at;\n self.partners = partners;\n }\n\n public fun set_name(self: &mut DappMetadata, name: String) {\n self.name = name;\n }\n\n public fun set_description(self: &mut DappMetadata, description: String) {\n self.description = description;\n }\n\n public fun set_icon_url(self: &mut DappMetadata, icon_url: String) {\n self.icon_url = icon_url;\n }\n\n public fun set_website_url(self: &mut DappMetadata, website_url: String) {\n self.website_url = website_url;\n }\n\n public fun set_created_at(self: &mut DappMetadata, created_at: u64) {\n self.created_at = created_at;\n }\n\n public fun set_partners(self: &mut DappMetadata, partners: vector<String>) {\n self.partners = partners;\n }\n\n public fun get_name(self: &DappMetadata): String {\n self.name\n }\n\n public fun get_description(self: &DappMetadata): String {\n self.description\n }\n\n public fun get_icon_url(self: &DappMetadata): String {\n self.icon_url\n }\n\n public fun get_website_url(self: &DappMetadata): String {\n self.website_url\n }\n\n public fun get_created_at(self: &DappMetadata): u64 {\n self.created_at\n }\n\n public fun get_partners(self: &DappMetadata): vector<String> {\n self.partners\n }\n\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\tpath,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n\n\nasync function generateDappSchema(config: DubheConfig, srcPrefix: string) {\n\tconst path = `${srcPrefix}/contracts/${config.name}/sources/codegen/dapp/schema.move`\n\tif (!existsSync(path)) {\n\t\tlet code = `module ${config.name}::dapp_schema {\n use ${config.name}::dapp_metadata::DappMetadata;\n use dubhe::storage_value;\n use dubhe::storage_value::StorageValue;\n use dubhe::storage;\n use sui::transfer::public_share_object;\n use dubhe::type_info;\n \n public struct Dapp has key, store {\n id: UID,\n }\n\n public fun borrow_admin(self: &Dapp): &StorageValue<address> {\n storage::borrow_field(&self.id, b\"admin\")\n }\n\n public(package) fun admin(self: &mut Dapp): &mut StorageValue<address> {\n storage::borrow_mut_field(&mut self.id, b\"admin\")\n }\n\n public fun borrow_package_id(self: &Dapp): &StorageValue<address> {\n storage::borrow_field(&self.id, b\"package_id\")\n }\n\n public(package) fun package_id(self: &mut Dapp): &mut StorageValue<address> {\n storage::borrow_mut_field(&mut self.id, b\"package_id\")\n }\n\n public fun borrow_version(self: &Dapp): &StorageValue<u32> {\n storage::borrow_field(&self.id, b\"version\")\n }\n\n public(package) fun version(self: &mut Dapp): &mut StorageValue<u32> {\n storage::borrow_mut_field(&mut self.id, b\"version\")\n }\n\n public fun borrow_metadata(self: &Dapp): &StorageValue<DappMetadata> {\n storage::borrow_field(&self.id, b\"metadata\")\n }\n\n public(package) fun metadata(self: &mut Dapp): &mut StorageValue<DappMetadata> {\n storage::borrow_mut_field(&mut self.id, b\"metadata\")\n }\n\n public fun borrow_safe_mode(self: &Dapp): &StorageValue<bool> {\n storage::borrow_field(&self.id, b\"safe_mode\")\n }\n\n public(package) fun safe_mode(self: &mut Dapp): &mut StorageValue<bool> {\n storage::borrow_mut_field(&mut self.id, b\"safe_mode\")\n }\n \n public(package) fun borrow_schemas(self: &Dapp): &StorageValue<vector<address>> {\n storage::borrow_field(&self.id, b\"schemas\")\n }\n\n public(package) fun schemas(self: &mut Dapp): &mut StorageValue<vector<address>> {\n storage::borrow_mut_field(&mut self.id, b\"schemas\")\n }\n\n\n public(package) fun create(ctx: &mut TxContext): Dapp {\n let mut id = object::new(ctx);\n storage::add_field<StorageValue<address>>(&mut id, b\"admin\", storage_value::new(b\"admin\", ctx));\n storage::add_field<StorageValue<address>>(&mut id, b\"package_id\", storage_value::new(b\"package_id\", ctx));\n storage::add_field<StorageValue<u32>>(&mut id, b\"version\", storage_value::new(b\"version\", ctx));\n storage::add_field<StorageValue<DappMetadata>>(&mut id, b\"metadata\", storage_value::new(b\"metadata\", ctx));\n storage::add_field<StorageValue<bool>>(&mut id, b\"safe_mode\", storage_value::new(b\"safe_mode\", ctx));\n storage::add_field<StorageValue<vector<address>>>(&mut id, b\"schemas\", storage_value::new(b\"schemas\", ctx));\n Dapp { id }\n }\n\n public(package) fun upgrade<DappKey: drop>(dapp: &mut Dapp, ctx: &TxContext) {\n assert!(dapp.borrow_metadata().contains(), 0);\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n let new_package_id = type_info::current_package_id<DappKey>();\n dapp.package_id().set(new_package_id);\n let current_version = dapp.version()[];\n dapp.version().set(current_version + 1);\n }\n \n public(package) fun add_schema<Schema: key + store>(dapp: &mut Dapp, schema: Schema) {\n let mut schemas = dapp.schemas()[];\n schemas.push_back(object::id_address<Schema>(&schema));\n dapp.schemas().set(schemas);\n public_share_object(schema);\n }\n\n #[test_only]\n\n public fun create_dapp_for_testing(ctx: &mut TxContext): Dapp {\n create(ctx)\n }\n\n #[test_only]\n\n public fun distroy_dapp_for_testing(dapp: Dapp) {\n let Dapp { id } = dapp;\n id.delete();\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\tpath,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n\nasync function generateDappSystem(config: DubheConfig, srcPrefix: string) {\n\tconst path = `${srcPrefix}/contracts/${config.name}/sources/codegen/dapp/system.move`\n\tif (!existsSync(path)) {\n\t\tlet code = `module ${config.name}::dapp_system {\n use std::ascii::String;\n use std::ascii;\n use dubhe::type_info;\n use sui::clock::Clock;\n use ${config.name}::dapp_schema;\n use ${config.name}::dapp_metadata;\n use ${config.name}::dapp_schema::Dapp;\n \n public struct DappKey has drop {}\n public(package) fun new(): DappKey {\n DappKey { }\n }\n\n public(package) fun create(name: String, description: String, clock: &Clock, ctx: &mut TxContext): Dapp {\n let mut dapp = dapp_schema::create(ctx);\n assert!(!dapp.borrow_metadata().contains(), 0);\n dapp.metadata().set(\n dapp_metadata::new(\n name,\n description,\n ascii::string(b\"\"),\n ascii::string(b\"\"),\n clock.timestamp_ms(),\n vector[]\n )\n );\n let package_id = type_info::current_package_id<DappKey>();\n dapp.package_id().set(package_id);\n dapp.admin().set(ctx.sender());\n dapp.version().set(1);\n dapp.safe_mode().set(false);\n dapp.schemas().set(vector[]);\n dapp\n }\n\n public entry fun set_metadata(\n dapp: &mut Dapp,\n name: String,\n description: String,\n icon_url: String,\n website_url: String,\n partners: vector<String>,\n ctx: &TxContext,\n ) {\n let admin = dapp.admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n let created_at = dapp.metadata().get().get_created_at();\n dapp.metadata().set(\n dapp_metadata::new(\n name,\n description,\n icon_url,\n website_url,\n created_at,\n partners\n )\n );\n }\n\n public entry fun transfer_ownership(dapp: &mut Dapp, new_admin: address, ctx: &mut TxContext) {\n let admin = dapp.admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n dapp.admin().set(new_admin);\n }\n\n public entry fun set_safe_mode(dapp: &mut Dapp, safe_mode: bool, ctx: &TxContext) {\n let admin = dapp.admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n dapp.safe_mode().set(safe_mode);\n }\n\n public fun ensure_no_safe_mode(dapp: &Dapp) {\n assert!(!dapp.borrow_safe_mode()[], 0);\n }\n\n public fun ensure_has_authority(dapp: &Dapp, ctx: &TxContext) {\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n }\n\n public fun ensure_has_schema<Schema: key + store>(dapp: &Dapp, schema: &Schema) {\n let schema_id = object::id_address(schema);\n assert!(dapp.borrow_schemas().get().contains(&schema_id), 0);\n }\n}\n\n\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\tpath,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nexport async function generateInit(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\n📝 Starting Init Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/tests/init.move`\n\t);\n\n\t\tlet init_test_code = `module ${config.name}::init_test {\n use ${config.name}::dapp_schema::Dapp;\n use sui::clock;\n use sui::test_scenario;\n use sui::test_scenario::Scenario;\n \n public fun deploy_dapp_for_testing(sender: address): (Scenario, Dapp) {\n let mut scenario = test_scenario::begin(sender);\n let ctx = test_scenario::ctx(&mut scenario);\n let clock = clock::create_for_testing(ctx);\n ${config.name}::genesis::run(&clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(&mut scenario,sender);\n let dapp = test_scenario::take_shared<Dapp>(&scenario);\n (scenario, dapp)\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tinit_test_code,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/tests/init.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\n\tlet init_code = `module ${config.name}::genesis {\n use std::ascii::string;\n\n use sui::clock::Clock;\n\n use ${config.name}::dapp_system;\n\n public entry fun run(clock: &Clock, ctx: &mut TxContext) {\n // Create a dapp.\n let mut dapp = dapp_system::create(string(b\"${config.name}\"),string(b\"${config.description}\"), clock , ctx);\n // Create schemas\n let mut schema = ${config.name}::schema::create(ctx);\n // Logic that needs to be automated once the contract is deployed\n ${config.name}::deploy_hook::run(&mut schema, ctx);\n // Authorize schemas and public share objects\n dapp.add_schema(schema);\n sui::transfer::public_share_object(dapp);\n }\n}\n`;\n\tawait formatAndWriteMove(\n\t\tinit_code,\n\t\t`${srcPrefix}/contracts/${config.name}/sources/codegen/genesis.move`,\n\t\t'formatAndWriteMove'\n\t);\n\n\tconsole.log('✅ Init Generation Complete\\n');\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 = [\n \"dubhe.config.js\",\n \"dubhe.config.mjs\",\n \"dubhe.config.ts\",\n \"dubhe.config.mts\",\n];\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(\n configPath: string | undefined,\n toFileURL?: boolean\n) {\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\"\n ? pathToFileURL(configPath).href\n : 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","\nexport class NotInsideProjectError extends Error {\nname = \"NotInsideProjectError\";\nmessage = \"You are not inside a Dubhe project\";\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}"],"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","getStructAttrs","values","key","_","getStructTypes","values","_","type","getStructAttrsWithType","key","getStructAttrsQuery","containsString","obj","searchString","value","generateToml","config","srcPrefix","code","formatAndWriteMove","sortByFirstLetter","arr","a","b","firstLetterA","firstLetterB","renderSetAttrsFunc","schemaName","fields","key","type","renderSetFunc","getStructAttrsWithType","fieldName","renderGetAllFunc","getStructTypes","getStructAttrsQuery","renderGetAttrsFunc","convertToSnakeCase","input","generateSchemaData","projectName","data","path","name","code","enumNames","item","sortByFirstLetterFields","sortByFirstLetter","field","containsString","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemas","schemaMoudle","value","storage_type","all_types","para_key","para_value","borrow_key","existsSync","generateDeployHook","config","srcPrefix","path","code","formatAndWriteMove","generateMigrate","convertToSnakeCase","input","generateImport","projectName","data","name","generateSchemaEvent","events","path","key","fields","code","getStructAttrsWithType","getStructAttrs","formatAndWriteMove","existsSync","fs","generateSystem","config","srcPrefix","convertToSnakeCase","input","generateSchemaError","projectName","errors","path","code","name","message","formatAndWriteMove","existsSync","generateDefaultSchema","config","srcPrefix","generateDappSchemaMetadata","generateDappSchema","generateDappSystem","path","code","formatAndWriteMove","generateInit","config","srcPrefix","init_test_code","formatAndWriteMove","init_code","schemaGen","config","srcPrefix","network","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSchemaEvent","generateSchemaData","generateSchemaStructure","generateSchemaError","generateDefaultSchema","generateInit","generateSystem","generateMigrate","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"]}
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","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateEvent.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateError.ts","../src/codegen/utils/renderMove/generateDefaultSchema.ts","../src/codegen/utils/renderMove/generateInit.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts","../src/parseData/parser/index.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(\n\tcontent: string,\n\tprettierConfigPath?: string\n): Promise<string> {\n\tlet config;\n\tif (prettierConfigPath) {\n\t\tconfig = await prettier.resolveConfig(prettierConfigPath);\n\t}\n\ttry {\n\t\treturn prettier.format(content, {\n\t\t\tplugins: [prettierPluginMove],\n\t\t\tparser: 'move-parse',\n\t\t\tprintWidth: 120,\n\t\t\tsemi: true,\n\t\t\ttabWidth: 2,\n\t\t\tuseTabs: false,\n\t\t\tbracketSpacing: true,\n\t\t\t...config,\n\t\t});\n\t} catch (error) {\n\t\tlet message;\n\t\tif (error instanceof Error) {\n\t\t\tmessage = error.message;\n\t\t} else {\n\t\t\tmessage = error;\n\t\t}\n\t\tconsole.log(`Error during output formatting: ${message}`);\n\t\treturn content;\n\t}\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n\treturn prettier.format(content, {\n\t\tparser: 'typescript',\n\t});\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 =\n` // 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 (fullOutputPath.includes(\".toml\") || fullOutputPath.includes(\"system\") || fullOutputPath.includes(\"migrate\")) {\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 { SchemaType, 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 { generateSystem } from './generateSystem';\nimport { generateSchemaHub } from './generateSchemaHub';\nimport { generateSchemaError } from './generateError';\nimport {generateDefaultSchema} from \"./generateDefaultSchema\";\nimport {generateInit} from \"./generateInit\";\n\nexport async function schemaGen(\n config: DubheConfig,\n srcPrefix?: string,\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(\n ` ├─ Description: ${config.description || 'No description provided'}`,\n );\n console.log(` ├─ Network: ${network || 'testnet'}`);\n\n const path = srcPrefix ?? process.cwd();\n\n if (existsSync(`${path}/contracts/${config.name}`)) {\n deleteFolderRecursive(\n `${path}/contracts/${config.name}/sources/codegen`,\n );\n }\n\n if (!existsSync(`${path}/contracts/${config.name}/Move.toml`)) {\n await generateToml(config, path);\n }\n\n if (\n !existsSync(\n `${path}/contracts/${config.name}/sources/script/deploy_hook.move`,\n )\n ) {\n await generateDeployHook(config, path);\n }\n\n if (config.events) {\n if (config.data) {\n await generateSchemaEvent(config.name, config.data, config.events, path);\n } else {\n await generateSchemaEvent(config.name, null, config.events, path);\n }\n }\n\n if (config.data) {\n await generateSchemaData(config.name, config.data, path);\n await generateSchemaStructure(config.name, config.data, config.schemas, path);\n } else {\n await generateSchemaStructure(config.name, null, config.schemas, path);\n }\n\n if (config.errors) {\n await generateSchemaError(config.name, config.errors, path);\n }\n\n await generateDefaultSchema(config, path);\n await generateInit(config, path);\n await generateSystem(config, path);\n await generateMigrate(config, path);\n\n console.log('✅ Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n\tif (fs.existsSync(path)) {\n\t\tfs.readdirSync(path).forEach(file => {\n\t\t\tconst curPath = `${path}/${file}`;\n\t\t\tif (fs.lstatSync(curPath).isDirectory()) {\n\t\t\t\tdeleteFolderRecursive(curPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(curPath);\n\t\t\t}\n\t\t});\n\t\tfs.rmdirSync(path);\n\t}\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n\treturn 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(\n\tvalues: Record<string, string> | string\n): string {\n\treturn Object.entries(values)\n\t\t.map(([key, _]) => `${key}`)\n\t\t.join(',');\n}\n\nfunction isAddress(str: string): boolean {\n\tconst regex = /^0x[a-fA-F0-9]+$/;\n\treturn 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(\n\tvalues: Record<string, string>\n): string {\n\treturn `(${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(\n\tvalues: Record<string, string>\n): string[] {\n\treturn Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(\n\tvalues: Record<string, string>,\n): string[] {\n\treturn Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n\nexport function containsString(obj: Record<string, any>, searchString: string): boolean {\n\tfor (const key in obj) {\n\t\tif (obj.hasOwnProperty(key)) {\n\t\t\tconst value = obj[key];\n\t\t\tif (typeof value === 'string' && value === searchString) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateToml(\n\tconfig: DubheConfig,\n\tsrcPrefix: string,\n) {\n\tconsole.log('\\n📄 Starting Move.toml Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/Move.toml`\n\t);\n\n\tlet 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.38.3\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe-framework.git\", rev = \"dubhe-mainnet-v1.1.0\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x0\"\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/Move.toml`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('✅ Move.toml Generation Complete\\n');\n}\n","import {BaseType, SchemaData, SchemaType} from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery, containsString,\n} from './common';\n\nfunction sortByFirstLetter(arr: string[]): string[] {\n\treturn arr.sort((a, b) => {\n\t\tconst firstLetterA = a.charAt(0).toLowerCase();\n\t\tconst firstLetterB = b.charAt(0).toLowerCase();\n\n\t\tif (firstLetterA < firstLetterB) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (firstLetterA > firstLetterB) {\n\t\t\treturn 1;\n\t\t}\n\t\treturn 0;\n\t});\n}\n\nexport function capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nexport function renderSetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>,\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([key, type]) =>\n\t\t\t\t`public(package) fun set_${key}(self: &mut ${schemaName}, ${key}: ${type}) {\n self.${key} = ${key};\n }`,\n\t\t)\n\t\t.join('\\n');\n}\n\nexport function renderSetFunc(\n\tschemaName: string,\n\tfields: Record<string, string>,\n): string {\n\treturn `public(package) fun set(self: &mut ${schemaName}, ${getStructAttrsWithType(\n\t\tfields,\n\t)}) {\n ${Object.entries(fields)\n\t\t.map(([fieldName]) => `self.${fieldName} = ${fieldName};`)\n\t\t.join('\\n')}\n }`;\n}\n\nexport function renderGetAllFunc(\n\tschemaName: string,\n\tfields: Record<string, string>,\n): string {\n\treturn `public fun get(self: &${schemaName}): ${getStructTypes(fields)} {\n (${getStructAttrsQuery(fields)})\n }`;\n}\n\nexport function renderGetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>,\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([\n\t\t\t\t key,\n\t\t\t\t type,\n\t\t\t ]) => `public fun get_${key}(self: &${schemaName}): ${type} {\n self.${key}\n }`,\n\t\t)\n\t\t.join('\\n');\n}\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nexport async function generateSchemaData(\n\tprojectName: string,\n\tdata: Record<string, SchemaData>,\n\tpath: string,\n) {\n\tconsole.log('\\n📦 Starting Schema Data Generation...');\n\tfor (const key of Object.keys(data)) {\n\t\t\t\tconst name = key;\n\t\t\t\tconst fields = data[key];\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${name} ${\n\t\t\t\t\t\tArray.isArray(fields) ? '(enum)' : '(struct)'\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t\tlet code = '';\n\n\t\t\t\tconst enumNames = Object.keys(data)\n\t\t\t\t\t.filter(item => Array.isArray(data[item]))\n\t\t\t\t\t.map(item => item);\n\n\t\t\tconsole.log(enumNames)\n\n\t\t\t\tif (Array.isArray(fields)) {\n\t\t\t\t\tconst sortByFirstLetterFields = sortByFirstLetter(fields);\n\t\t\t\t\tcode = `module ${projectName}::${projectName}_${convertToSnakeCase(\n\t\t\t\t\t\tname,\n\t\t\t\t\t)} {\n public enum ${name} has copy, drop , store {\n ${sortByFirstLetterFields}\n }\n \n ${sortByFirstLetterFields\n\t\t\t\t\t\t.map((field: string) => {\n\t\t\t\t\t\t\treturn `public fun new_${convertToSnakeCase(\n\t\t\t\t\t\t\t\tfield,\n\t\t\t\t\t\t\t)}(): ${name} {\n ${name}::${field}\n }`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('')}`;\n\t\t\t\t} else {\n\t\t\t\t\tcode = `module ${projectName}::${projectName}_${convertToSnakeCase(\n\t\t\t\t\t\tname,\n\t\t\t\t\t)} {\n use std::ascii::String;\n \n\t\t\t\t\t\t${\n\t\t\t\t\t\tObject.keys(data)\n\t\t\t\t\t\t\t.map(name => {\n\t\t\t\t\t\t\t\tif (containsString(fields, name)) {\n\t\t\t\t\t\t\t\t\treturn `use ${projectName}::${projectName}_${convertToSnakeCase(name)}::${name};`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t\t\t.join('\\n')\n\t\t\t\t\t}\n\n public struct ${name} has copy, drop , store {\n ${getStructAttrsWithType(fields)}\n }\n \n public fun new(${getStructAttrsWithType(\n\t\t\t\t\t\tfields,\n\t\t\t\t\t)}): ${name} {\n ${name} {\n ${getStructAttrs(fields)}\n }\n }\n \n ${renderGetAllFunc(name, fields)}\n ${renderGetAttrsFunc(name, fields)}\n ${renderSetAttrsFunc(name, fields)}\n ${renderSetFunc(name, fields)}\n }`;\n\t\t\t\t}\n\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/data/${convertToSnakeCase(\n\t\t\t\t\t\tname,\n\t\t\t\t\t)}.move`,\n\t\t\t\t\t'formatAndWriteMove',\n\t\t\t\t);\n\t\t\t}\n\tconsole.log('✅ Schema Data Generation Complete\\n');\n}\n\nfunction generateImport(\n\tprojectName: string,\n\tdata: Record<string, SchemaData> | null,\n) {\n\tif (data != null) {\n\t\tconst names = Object.keys(data);\n\t\treturn names\n\t\t\t.map(name => {\n\t\t\t\treturn `use ${projectName}::${projectName}_${convertToSnakeCase(\n\t\t\t\t\tname,\n\t\t\t\t)}::${name};`;\n\t\t\t})\n\t\t\t.join('\\n');\n\t} else {\n\t\treturn '';\n\t}\n}\n\nexport async function generateSchemaStructure(\n\tprojectName: string,\n\tdata: Record<string, SchemaData> | null,\n\tschemas: Record<string, SchemaType>,\n\tpath: string,\n) {\n\tconsole.log('\\n🔨 Starting Schema Structure Generation...');\n\t\tconsole.log(\n\t\t\t` ├─ Output path: ${path}/contracts/${projectName}/sources/codegen/schema.move`,\n\t\t);\n\t\tconsole.log(\n\t\t\t` └─ Structure fields: ${\n\t\t\t\tObject.values(schemas).length\n\t\t\t}`,\n\t\t);\n\t\tconst schemaMoudle = `module ${projectName}::${projectName}_schema {\n use std::ascii::String;\n use std::ascii::string;\n use sui::package::UpgradeCap;\n use std::type_name; \n use dubhe::storage;\n use dubhe::storage_value::{Self, StorageValue};\n use dubhe::storage_map::{Self, StorageMap};\n use dubhe::storage_double_map::{Self, StorageDoubleMap};\n use sui::dynamic_field as df;\n \n ${generateImport(projectName, data)}\n\n public struct Schema has key, store { id: UID } \n \n ${Object.entries(schemas)\n\t\t\t.map(([key, value]) => {\n\t\t\t\treturn `public fun borrow_${key}(self: &Schema) : &${value} {\n storage::borrow_field(&self.id, b\"${key}\")\n }\n \n public(package) fun ${key}(self: &mut Schema): &mut ${value} {\n storage::borrow_mut_field(&mut self.id, b\"${key}\")\n }\n `;\n\t\t\t})\n\t\t\t.join('')} \n \n \n public(package) fun create(ctx: &mut TxContext): Schema {\n let mut id = object::new(ctx);\n ${Object.entries(schemas)\n\t\t\t.map(([key, value]) => {\n\t\t\t\tlet storage_type = '';\n\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\tstorage_type = `storage_value::new(b\"${key}\", ctx)`;\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tstorage_type = `storage_map::new(b\"${key}\", ctx)`;\n\t\t\t\t} else if (\n\t\t\t\t\tvalue.includes('StorageDoubleMap')\n\t\t\t\t) {\n\t\t\t\t\tstorage_type = `storage_double_map::new(b\"${key}\", ctx)`;\n\t\t\t\t}\n\t\t\t\treturn `storage::add_field<${value}>(&mut id, b\"${key}\", ${storage_type});`;\n\t\t\t})\n\t\t\t.join('\\n')}\n \n Schema { id }\n }\n \n public(package) fun id(self: &mut Schema): &mut UID {\n\t\t\t\t\t &mut self.id\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tpublic(package) fun borrow_id(self: &Schema): &UID {\n\t\t\t\t\t &self.id\n\t\t\t\t\t}\n \n public fun migrate(_schema: &mut Schema, _cap: &UpgradeCap, _ctx: &mut TxContext) { }\n\n \n // ======================================== View Functions ========================================\n ${Object.entries(schemas)\n\t\t\t.map(([key, value]) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tlet all_types = value.match(/<(.+)>/)[1].split(',').map(type => type.trim());\n\t\t\t\tlet para_key: string[] = [];\n\t\t\t\tlet para_value = '';\n\t\t\t\tlet borrow_key = '';\n\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\tpara_key = [];\n\t\t\t\t\tpara_value = `${all_types[0]}`;\n\t\t\t\t\tborrow_key = 'get()';\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tpara_key = [`key: ${all_types[0]}`];\n\t\t\t\t\tpara_value = `${all_types[1]}`;\n\t\t\t\t\tborrow_key = 'get(key)';\n\t\t\t\t} else if (value.includes('StorageDoubleMap')) {\n\t\t\t\t\tpara_key = [`key1: ${all_types[0]}`, `key2: ${all_types[1]}`];\n\t\t\t\t\tpara_value = `${all_types[2]}`;\n\t\t\t\t\tborrow_key = 'get(key1, key2)';\n\t\t\t\t}\n\t\t\t\treturn `public fun get_${key}(self: &Schema, ${para_key}) : &${para_value} {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().${borrow_key}\n\t\t\t\t\t\t\t\t}`\n\t\t\t}).join('\\n')}\n // =========================================================================================================\n\t\t\t}`\n\t\tawait formatAndWriteMove(\n\t\t\tschemaMoudle,\n\t\t\t`${path}/contracts/${projectName}/sources/codegen/schema.move`,\n\t\t\t'formatAndWriteMove',\n\t\t);\n\t\tconsole.log('✅ Schema Structure Generation Complete\\n');\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\nexport async function generateDeployHook(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\n📝 Starting Deploy Hook Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`\n\t);\n\n\tconst path = `${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`;\n\tif (!existsSync(path)) {\n\t\tconst code = `module ${config.name}::${config.name}_deploy_hook {\n\t\t\t use ${config.name}::${config.name}_schema::Schema;\n\n public(package) fun run(_schema: &mut Schema, _ctx: &mut TxContext) {\n\n }\n}`\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\tpath,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n\tconsole.log('✅ Deploy Hook Generation Complete\\n');\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::${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\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n","import {BaseType, EventData, SchemaData, SchemaType} from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\n\nfunction capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nfunction generateImport(\n\tprojectName: string,\n\tdata: Record<string, SchemaData> | null,\n) {\n\tif (data != null) {\n\t\tconst names = Object.keys(data);\n\t\treturn names\n\t\t\t.map(name => {\n\t\t\t\treturn `use ${projectName}::${projectName}_${convertToSnakeCase(\n\t\t\t\t\tname,\n\t\t\t\t)}::${name};`;\n\t\t\t})\n\t\t\t.join('\\n');\n\t} else {\n\t\treturn '';\n\t}\n}\n\nexport async function generateSchemaEvent(\n\tprojectName: string,\n\tdata: Record<string, SchemaData> | null,\n\tevents: Record<string, EventData>,\n\tpath: string\n) {\n\tconsole.log('\\n📦 Starting Schema Event Generation...');\n\tfor (const key of Object.keys(events)) {\n\t\t\t\tconst name = key;\n\t\t\t\tconst fields = events[key];\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${name} event: ${fields}`\n\t\t\t\t);\n\n\t\t\t\tlet\tcode = `module ${projectName}::${projectName}_${convertToSnakeCase(name)}_event {\n\t\t\t\t\t\tuse sui::event;\n\t\t\t\t\t\tuse std::ascii::String;\n\t\t\t\t\t\t${generateImport(projectName, data)}\n\n public struct ${name}Event has copy, drop {\n ${getStructAttrsWithType(fields as Record<string, string>)}\n }\n\n public fun new(${getStructAttrsWithType(fields as Record<string, string>)}): ${name}Event {\n ${name}Event {\n ${getStructAttrs(fields as Record<string, string>)}\n }\n }\n }`;\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/data/${convertToSnakeCase(\n\t\t\t\t\t\tname\n\t\t\t\t\t)}_event.move`,\n\t\t\t\t\t'formatAndWriteMove'\n\t\t\t\t);\n\t\t\t}\n\n\tlet\tcode = `module ${projectName}::${projectName}_events {\n\t \tuse std::ascii::{String, string};\n\t \t${generateImport(projectName, data)}\n\t\t${Object.entries(events).map(([name, fields]) => {\n\t\treturn `\nuse ${projectName}::${projectName}_${convertToSnakeCase(name)}_event::${name}Event;\nuse ${projectName}::${projectName}_${convertToSnakeCase(name)}_event;\n\t\t\tpublic fun ${convertToSnakeCase(name)}_event(${getStructAttrsWithType(fields as Record<string, string>)}) {\n\t\t\t dubhe::storage_event::emit_set_record<${name}Event, ${name}Event, ${name}Event>(\n\t\t\t\tstring(b\"${convertToSnakeCase(name)}_event\"),\n\t\t\t\toption::none(),\n\t\t\t \toption::none(),\n\t\t\t option::some(${projectName}_${convertToSnakeCase(name)}_event::new(${getStructAttrs(fields as Record<string, string>)}))\n\t\t\t )\n\t\t\t}\n\t\t`\n\t}).join('\\n')}\t\t\n }`\n\n\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${path}/contracts/${projectName}/sources/codegen/events.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('✅ Schema Event Generation Complete\\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 generateSystem(config: DubheConfig, srcPrefix: string) {\n\tconsole.log('\\n⚙️ Starting System Generation...');\n\t\tconsole.log(` ├─ Generating systems`);\n\t\tconsole.log(\n\t\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/systems`\n\t\t);\n\n\t\tif (\n\t\t\t!existsSync(\n\t\t\t\t`${srcPrefix}/contracts/${config.name}/sources/systems`\n\t\t\t)\n\t\t) {\n\t\t\tawait fs.mkdir(`${srcPrefix}/contracts/${config.name}/sources/systems`, { recursive: true })\n\t\t}\n\tconsole.log('✅ System Generation Complete\\n');\n}\n","import {BaseType, ErrorData, SchemaType} from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nexport async function generateSchemaError(\n\tprojectName: string,\n\terrors: ErrorData,\n\tpath: string\n) {\n\tconsole.log('\\n📦 Starting Schema Error Generation...');\n\n\tlet\tcode = `module ${projectName}::${projectName}_errors {\n\t\t${Object.entries(errors).map(([name, message]) => {\n\t\t\tconsole.log(` ├─ Generating Error: ${name}`);\n\t\tconsole.log(` │ └─ Message: ${message}`);\n\t\treturn `#[error]\n\t\t\t\tconst ${name}: vector<u8> = b\"${message}\";\n\t\t\t\tpublic fun ${convertToSnakeCase(name)}_error(condition: bool) { assert!(condition, ${name}) }\n\t\t`\n\t}).join('\\n')}\t\t\n }`\n\n\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${path}/contracts/${projectName}/sources/codegen/errors.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('✅ Schema Error Generation Complete\\n');\n}","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nexport async function generateDefaultSchema(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tawait generateDappSchemaMetadata(config, srcPrefix);\n\tawait generateDappSchema(config, srcPrefix);\n\tawait generateDappSystem(config, srcPrefix);\n}\n\nasync function generateDappSchemaMetadata(config: DubheConfig, srcPrefix: string) {\n\tconst path = `${srcPrefix}/contracts/${config.name}/sources/codegen/dapp/metadata.move`\n\tif (!existsSync(path)) {\n\t\tlet code = `module ${config.name}::${config.name}_dapp_metadata {\n use std::ascii::String;\n\n public struct DappMetadata has drop, copy, store {\n name: String,\n description: String,\n icon_url: String,\n website_url: String,\n created_at: u64,\n partners: vector<String>,\n }\n\n public fun new(\n name: String,\n description: String,\n icon_url: String,\n website_url: String,\n created_at: u64,\n partners: vector<String>,\n ): DappMetadata {\n DappMetadata {\n name,\n description,\n icon_url,\n website_url,\n created_at,\n partners,\n }\n }\n\n public fun set(\n self: &mut DappMetadata,\n name: String,\n description: String,\n icon_url: String,\n website_url: String,\n created_at: u64,\n partners: vector<String>,\n ) {\n self.name = name;\n self.description = description;\n self.icon_url = icon_url;\n self.website_url = website_url;\n self.created_at = created_at;\n self.partners = partners;\n }\n\n public fun set_name(self: &mut DappMetadata, name: String) {\n self.name = name;\n }\n\n public fun set_description(self: &mut DappMetadata, description: String) {\n self.description = description;\n }\n\n public fun set_icon_url(self: &mut DappMetadata, icon_url: String) {\n self.icon_url = icon_url;\n }\n\n public fun set_website_url(self: &mut DappMetadata, website_url: String) {\n self.website_url = website_url;\n }\n\n public fun set_created_at(self: &mut DappMetadata, created_at: u64) {\n self.created_at = created_at;\n }\n\n public fun set_partners(self: &mut DappMetadata, partners: vector<String>) {\n self.partners = partners;\n }\n\n public fun get_name(self: &DappMetadata): String {\n self.name\n }\n\n public fun get_description(self: &DappMetadata): String {\n self.description\n }\n\n public fun get_icon_url(self: &DappMetadata): String {\n self.icon_url\n }\n\n public fun get_website_url(self: &DappMetadata): String {\n self.website_url\n }\n\n public fun get_created_at(self: &DappMetadata): u64 {\n self.created_at\n }\n\n public fun get_partners(self: &DappMetadata): vector<String> {\n self.partners\n }\n\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\tpath,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n\n\nasync function generateDappSchema(config: DubheConfig, srcPrefix: string) {\n\tconst path = `${srcPrefix}/contracts/${config.name}/sources/codegen/dapp/schema.move`\n\tif (!existsSync(path)) {\n\t\tlet code = `module ${config.name}::${config.name}_dapp_schema {\n use ${config.name}::${config.name}_dapp_metadata::DappMetadata;\n use dubhe::storage_value;\n use dubhe::storage_value::StorageValue;\n use dubhe::storage;\n use sui::transfer::public_share_object;\n use dubhe::type_info;\n \n public struct Dapp has key, store {\n id: UID,\n }\n\n public fun borrow_admin(self: &Dapp): &StorageValue<address> {\n storage::borrow_field(&self.id, b\"admin\")\n }\n\n public(package) fun admin(self: &mut Dapp): &mut StorageValue<address> {\n storage::borrow_mut_field(&mut self.id, b\"admin\")\n }\n\n public fun borrow_package_id(self: &Dapp): &StorageValue<address> {\n storage::borrow_field(&self.id, b\"package_id\")\n }\n\n public(package) fun package_id(self: &mut Dapp): &mut StorageValue<address> {\n storage::borrow_mut_field(&mut self.id, b\"package_id\")\n }\n\n public fun borrow_version(self: &Dapp): &StorageValue<u32> {\n storage::borrow_field(&self.id, b\"version\")\n }\n\n public(package) fun version(self: &mut Dapp): &mut StorageValue<u32> {\n storage::borrow_mut_field(&mut self.id, b\"version\")\n }\n\n public fun borrow_metadata(self: &Dapp): &StorageValue<DappMetadata> {\n storage::borrow_field(&self.id, b\"metadata\")\n }\n\n public(package) fun metadata(self: &mut Dapp): &mut StorageValue<DappMetadata> {\n storage::borrow_mut_field(&mut self.id, b\"metadata\")\n }\n\n public fun borrow_safe_mode(self: &Dapp): &StorageValue<bool> {\n storage::borrow_field(&self.id, b\"safe_mode\")\n }\n\n public(package) fun safe_mode(self: &mut Dapp): &mut StorageValue<bool> {\n storage::borrow_mut_field(&mut self.id, b\"safe_mode\")\n }\n \n public(package) fun borrow_schemas(self: &Dapp): &StorageValue<vector<address>> {\n storage::borrow_field(&self.id, b\"schemas\")\n }\n\n public(package) fun schemas(self: &mut Dapp): &mut StorageValue<vector<address>> {\n storage::borrow_mut_field(&mut self.id, b\"schemas\")\n }\n\n\n public(package) fun create(ctx: &mut TxContext): Dapp {\n let mut id = object::new(ctx);\n storage::add_field<StorageValue<address>>(&mut id, b\"admin\", storage_value::new(b\"admin\", ctx));\n storage::add_field<StorageValue<address>>(&mut id, b\"package_id\", storage_value::new(b\"package_id\", ctx));\n storage::add_field<StorageValue<u32>>(&mut id, b\"version\", storage_value::new(b\"version\", ctx));\n storage::add_field<StorageValue<DappMetadata>>(&mut id, b\"metadata\", storage_value::new(b\"metadata\", ctx));\n storage::add_field<StorageValue<bool>>(&mut id, b\"safe_mode\", storage_value::new(b\"safe_mode\", ctx));\n storage::add_field<StorageValue<vector<address>>>(&mut id, b\"schemas\", storage_value::new(b\"schemas\", ctx));\n Dapp { id }\n }\n\n public(package) fun upgrade<DappKey: drop>(dapp: &mut Dapp, ctx: &TxContext) {\n assert!(dapp.borrow_metadata().contains(), 0);\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n let new_package_id = type_info::current_package_id<DappKey>();\n dapp.package_id().set(new_package_id);\n let current_version = dapp.version()[];\n dapp.version().set(current_version + 1);\n }\n \n public(package) fun add_schema<Schema: key + store>(dapp: &mut Dapp, schema: Schema) {\n let mut schemas = dapp.schemas()[];\n schemas.push_back(object::id_address<Schema>(&schema));\n dapp.schemas().set(schemas);\n public_share_object(schema);\n }\n\n #[test_only]\n\n public fun create_dapp_for_testing(ctx: &mut TxContext): Dapp {\n create(ctx)\n }\n\n #[test_only]\n\n public fun distroy_dapp_for_testing(dapp: Dapp) {\n let Dapp { id } = dapp;\n id.delete();\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\tpath,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n\nasync function generateDappSystem(config: DubheConfig, srcPrefix: string) {\n\tconst path = `${srcPrefix}/contracts/${config.name}/sources/codegen/dapp/system.move`\n\tif (!existsSync(path)) {\n\t\tlet code = `module ${config.name}::${config.name}_dapp_system {\n use std::ascii::String;\n use std::ascii;\n use dubhe::type_info;\n use sui::clock::Clock;\n use ${config.name}::${config.name}_dapp_schema;\n use ${config.name}::${config.name}_dapp_metadata;\n use ${config.name}::${config.name}_dapp_schema::Dapp;\n \n public struct DappKey has drop {}\n public(package) fun new(): DappKey {\n DappKey { }\n }\n\n public(package) fun create(name: String, description: String, clock: &Clock, ctx: &mut TxContext): Dapp {\n let mut dapp = ${config.name}_dapp_schema::create(ctx);\n assert!(!dapp.borrow_metadata().contains(), 0);\n dapp.metadata().set(\n ${config.name}_dapp_metadata::new(\n name,\n description,\n ascii::string(b\"\"),\n ascii::string(b\"\"),\n clock.timestamp_ms(),\n vector[]\n )\n );\n let package_id = type_info::current_package_id<DappKey>();\n dapp.package_id().set(package_id);\n dapp.admin().set(ctx.sender());\n dapp.version().set(1);\n dapp.safe_mode().set(false);\n dapp.schemas().set(vector[]);\n dapp\n }\n\n public entry fun set_metadata(\n dapp: &mut Dapp,\n name: String,\n description: String,\n icon_url: String,\n website_url: String,\n partners: vector<String>,\n ctx: &TxContext,\n ) {\n let admin = dapp.admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n let created_at = dapp.metadata().get().get_created_at();\n dapp.metadata().set(\n ${config.name}_dapp_metadata::new(\n name,\n description,\n icon_url,\n website_url,\n created_at,\n partners\n )\n );\n }\n\n public entry fun transfer_ownership(dapp: &mut Dapp, new_admin: address, ctx: &mut TxContext) {\n let admin = dapp.admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n dapp.admin().set(new_admin);\n }\n\n public entry fun set_safe_mode(dapp: &mut Dapp, safe_mode: bool, ctx: &TxContext) {\n let admin = dapp.admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n dapp.safe_mode().set(safe_mode);\n }\n\n public fun ensure_no_safe_mode(dapp: &Dapp) {\n assert!(!dapp.borrow_safe_mode()[], 0);\n }\n\n public fun ensure_has_authority(dapp: &Dapp, ctx: &TxContext) {\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n }\n\n public fun ensure_has_schema<Schema: key + store>(dapp: &Dapp, schema: &Schema) {\n let schema_id = object::id_address(schema);\n assert!(dapp.borrow_schemas().get().contains(&schema_id), 0);\n }\n}\n\n\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\tpath,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nexport async function generateInit(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\n📝 Starting Init Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/tests/init.move`\n\t);\n\n\t\tlet init_test_code = `module ${config.name}::${config.name}_init_test {\n use ${config.name}::${config.name}_dapp_schema::Dapp;\n use sui::clock;\n use sui::test_scenario;\n use sui::test_scenario::Scenario;\n \n public fun deploy_dapp_for_testing(sender: address): (Scenario, Dapp) {\n let mut scenario = test_scenario::begin(sender);\n let ctx = test_scenario::ctx(&mut scenario);\n let clock = clock::create_for_testing(ctx);\n ${config.name}::${config.name}_genesis::run(&clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(&mut scenario,sender);\n let dapp = test_scenario::take_shared<Dapp>(&scenario);\n (scenario, dapp)\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tinit_test_code,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/tests/init.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\n\tlet init_code = `module ${config.name}::${config.name}_genesis {\n use std::ascii::string;\n\n use sui::clock::Clock;\n\n use ${config.name}::${config.name}_dapp_system;\n\n public entry fun run(clock: &Clock, ctx: &mut TxContext) {\n // Create a dapp.\n let mut dapp = ${config.name}_dapp_system::create(string(b\"${config.name}\"),string(b\"${config.description}\"), clock , ctx);\n // Create schemas\n let mut schema = ${config.name}::${config.name}_schema::create(ctx);\n // Logic that needs to be automated once the contract is deployed\n ${config.name}::${config.name}_deploy_hook::run(&mut schema, ctx);\n // Authorize schemas and public share objects\n dapp.add_schema(schema);\n sui::transfer::public_share_object(dapp);\n }\n}\n`;\n\tawait formatAndWriteMove(\n\t\tinit_code,\n\t\t`${srcPrefix}/contracts/${config.name}/sources/codegen/genesis.move`,\n\t\t'formatAndWriteMove'\n\t);\n\n\tconsole.log('✅ Init Generation Complete\\n');\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 = [\n \"dubhe.config.js\",\n \"dubhe.config.mjs\",\n \"dubhe.config.ts\",\n \"dubhe.config.mts\",\n];\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(\n configPath: string | undefined,\n toFileURL?: boolean\n) {\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\"\n ? pathToFileURL(configPath).href\n : 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","\nexport class NotInsideProjectError extends Error {\nname = \"NotInsideProjectError\";\nmessage = \"You are not inside a Dubhe project\";\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}"],"mappings":"AAAA,OAAOA,MAAc,WACrB,OAAOC,MAAwB,0BAE/B,eAAsBC,EACrBC,EACAC,EACkB,CAClB,IAAIC,EACAD,IACHC,EAAS,MAAML,EAAS,cAAcI,CAAkB,GAEzD,GAAI,CACH,OAAOJ,EAAS,OAAOG,EAAS,CAC/B,QAAS,CAACF,CAAkB,EAC5B,OAAQ,aACR,WAAY,IACZ,KAAM,GACN,SAAU,EACV,QAAS,GACT,eAAgB,GAChB,GAAGI,CACJ,CAAC,CACF,OAASC,EAAP,CACD,IAAIC,EACJ,OAAID,aAAiB,MACpBC,EAAUD,EAAM,QAEhBC,EAAUD,EAEX,QAAQ,IAAI,mCAAmCC,GAAS,EACjDJ,CACR,CACD,CAEA,eAAsBK,EAAiBL,EAAkC,CACxE,OAAOH,EAAS,OAAOG,EAAS,CAC/B,OAAQ,YACT,CAAC,CACF,CCtCA,OAAOM,MAAQ,mBACf,OAAOC,MAAU,YCDjB,OAAOC,MAAiB,QAEjB,IAAMC,EAAQD,EAAY,cAAc,EAClCE,EAAQF,EAAY,cAAc,EAG/CC,EAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,EAGtCC,EAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,ECP/B,IAAMC,EAAQA,EAAY,OAAO,SAAS,EACpCC,EAAQD,EAAY,OAAO,SAAS,EAGjDA,EAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,EAGtCC,EAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,EFJtC,eAAsBC,EACpBC,EACAC,EACAC,EACe,CACf,IAAMC,EAAkB,MAAMC,EAAWJ,CAAM,EAC3CK,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQMC,EAAa,eAEbC,EAAOF,EAAeF,EAEtBK,EAAmB,8BAEnBP,EAAe,SAAS,OAAO,GAAKA,EAAe,SAAS,QAAQ,GAAKA,EAAe,SAAS,SAAS,EAC5GM,EAAOJ,EACEF,EAAe,SAAS,MAAM,EACvCM,EAAOD,EAAaH,EACXF,EAAe,SAAS,SAAS,IAC1CM,EAAOC,EAAmBL,GAG5B,MAAMM,EAAG,MAAMC,EAAK,QAAQT,CAAc,EAAG,CAAE,UAAW,EAAK,CAAC,EAChE,MAAMQ,EAAG,UAAUR,EAAgBM,CAAI,EACvCI,EAAM,GAAGT,MAAcD,GAAgB,CACzC,CAQA,eAAsBW,GAClBZ,EACAC,EACAC,EACa,CACf,IAAMC,EAAkB,MAAMU,EAAiBb,CAAM,EAErD,MAAMS,EAAG,MAAMC,EAAK,QAAQT,CAAc,EAAG,CAAE,UAAW,EAAK,CAAC,EAEhE,MAAMQ,EAAG,UAAUR,EAAgBE,CAAe,EAClDQ,EAAM,GAAGT,MAAcD,GAAgB,CACzC,CGnDO,SAASa,GAAUC,EAAsB,CAC9C,OAAOA,EAAK,QAAQ,MAAO,GAAG,CAChC,CCNA,OAAoB,cAAAC,MAAkB,KCAtC,OAAOC,MAAQ,KAER,SAASC,EAAsBC,EAAc,CAC/CF,EAAG,WAAWE,CAAI,IACrBF,EAAG,YAAYE,CAAI,EAAE,QAAQC,GAAQ,CACpC,IAAMC,EAAU,GAAGF,KAAQC,IACvBH,EAAG,UAAUI,CAAO,EAAE,YAAY,EACrCH,EAAsBG,CAAO,EAE7BJ,EAAG,WAAWI,CAAO,CAEvB,CAAC,EACDJ,EAAG,UAAUE,CAAI,EAEnB,CAYO,SAASG,EACfC,EACS,CACT,OAAO,OAAO,QAAQA,CAAM,EAC1B,IAAI,CAAC,CAACC,EAAKC,CAAC,IAAM,GAAGD,GAAK,EAC1B,KAAK,GAAG,CACX,CAaO,SAASE,EACfC,EACS,CACT,MAAO,IAAI,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACC,EAAGC,CAAI,IAAM,GAAGA,GAAM,IAC/D,CAOO,SAASC,EACfH,EACW,CACX,OAAO,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACI,EAAKF,CAAI,IAAM,GAAGE,MAAQF,GAAM,CACrE,CAMO,SAASG,EACfL,EACW,CACX,OAAO,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACI,EAAKH,CAAC,IAAM,QAAQG,GAAK,CAC9D,CAEO,SAASE,EAAeC,EAA0BC,EAA+B,CACvF,QAAWJ,KAAOG,EACjB,GAAIA,EAAI,eAAeH,CAAG,EAAG,CAC5B,IAAMK,EAAQF,EAAIH,CAAG,EACrB,GAAI,OAAOK,GAAU,UAAYA,IAAUD,EAC1C,MAAO,GAIV,MAAO,EACR,CChFA,eAAsBE,EACrBC,EACAC,EACC,CACD,QAAQ,IAAI;AAAA,2CAAuC,EACnD,QAAQ,IACP,+BAAqBA,eAAuBD,EAAO,gBACpD,EAEA,IAAIE,EAAO;AAAA,UACFF,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUfA,EAAO;AAAA,EAER,MAAMG,EACLD,EACA,GAAGD,eAAuBD,EAAO,iBACjC,oBACD,EACA,QAAQ,IAAI;AAAA,CAAmC,CAChD,CCtBA,SAASI,EAAkBC,EAAyB,CACnD,OAAOA,EAAI,KAAK,CAACC,EAAGC,IAAM,CACzB,IAAMC,EAAeF,EAAE,OAAO,CAAC,EAAE,YAAY,EACvCG,EAAeF,EAAE,OAAO,CAAC,EAAE,YAAY,EAE7C,OAAIC,EAAeC,EACX,GAEJD,EAAeC,EACX,EAED,CACR,CAAC,CACF,CAaO,SAASC,GACfC,EACAC,EACS,CACT,OAAO,OAAO,QAAQA,CAAM,EAC1B,IACA,CAAC,CAACC,EAAKC,CAAI,IACV,2BAA2BD,gBAAkBF,MAAeE,MAAQC;AAAA,+BACzCD,OAASA;AAAA,sBAEtC,EACC,KAAK;AAAA,CAAI,CACZ,CAEO,SAASE,GACfJ,EACAC,EACS,CACT,MAAO,sCAAsCD,MAAeK,EAC3DJ,CACD;AAAA,cACa,OAAO,QAAQA,CAAM,EAChC,IAAI,CAAC,CAACK,CAAS,IAAM,QAAQA,OAAeA,IAAY,EACxD,KAAK;AAAA,CAAI;AAAA,cAEZ,CAEO,SAASC,GACfP,EACAC,EACS,CACT,MAAO,yBAAyBD,OAAgBQ,EAAeP,CAAM;AAAA,WAC3DQ,EAAoBR,CAAM;AAAA,MAErC,CAEO,SAASS,GACfV,EACAC,EACS,CACT,OAAO,OAAO,QAAQA,CAAM,EAC1B,IACA,CAAC,CACCC,EACAC,CACD,IAAM,kBAAkBD,YAAcF,OAAgBG;AAAA,2CACfD;AAAA,kCAEzC,EACC,KAAK;AAAA,CAAI,CACZ,CAEA,SAASS,EAAmBC,EAAuB,CAClD,OAAOA,EACL,QAAQ,WAAY,KAAK,EACzB,YAAY,EACZ,QAAQ,KAAM,EAAE,CACnB,CAEA,eAAsBC,EACrBC,EACAC,EACAC,EACC,CACD,QAAQ,IAAI;AAAA,6CAAyC,EACrD,QAAWd,KAAO,OAAO,KAAKa,CAAI,EAAG,CAClC,IAAME,EAAOf,EACPD,EAASc,EAAKb,CAAG,EACvB,QAAQ,IACP,gCAAsBe,KACrB,MAAM,QAAQhB,CAAM,EAAI,SAAW,YAErC,EACA,IAAIiB,EAAO,GAELC,EAAY,OAAO,KAAKJ,CAAI,EAChC,OAAOK,GAAQ,MAAM,QAAQL,EAAKK,CAAI,CAAC,CAAC,EACxC,IAAIA,GAAQA,CAAI,EAIlB,GAFD,QAAQ,IAAID,CAAS,EAEhB,MAAM,QAAQlB,CAAM,EAAG,CAC1B,IAAMoB,EAA0BC,EAAkBrB,CAAM,EACxDiB,EAAO,UAAUJ,MAAgBA,KAAeH,EAC/CM,CACD;AAAA,sCACiCA;AAAA,kCACJI;AAAA;AAAA;AAAA,0BAGRA,EACnB,IAAKE,GACE,kBAAkBZ,EACxBY,CACD,QAAQN;AAAA,kCACmBA,MAASM;AAAA,8BAEpC,EACA,KAAK,EAAE,SAETL,EAAO,UAAUJ,MAAgBA,KAAeH,EAC/CM,CACD;AAAA;AAAA;AAAA,QAIC,OAAO,KAAKF,CAAI,EACd,IAAIE,GAAQ,CACZ,GAAIO,EAAevB,EAAQgB,CAAI,EAC9B,MAAO,OAAOH,MAAgBA,KAAeH,EAAmBM,CAAI,MAAMA,IAG5E,CAAC,EACA,OAAO,OAAO,EACd,KAAK;AAAA,CAAI;AAAA;AAAA,2CAG0BA;AAAA,kCACTZ,EAAuBJ,CAAM;AAAA;AAAA;AAAA,4CAGnBI,EACtCJ,CACD,OAAOgB;AAAA,iCACqBA;AAAA,qCACIQ,EAAexB,CAAM;AAAA;AAAA;AAAA;AAAA,6BAI7BM,GAAiBU,EAAMhB,CAAM;AAAA,6BAC7BS,GAAmBO,EAAMhB,CAAM;AAAA,6BAC/BF,GAAmBkB,EAAMhB,CAAM;AAAA,6BAC/BG,GAAca,EAAMhB,CAAM;AAAA,2BAInD,MAAMyB,EACLR,EACA,GAAGF,eAAkBF,0BAAoCH,EACxDM,CACD,SACA,oBACD,EAEH,QAAQ,IAAI;AAAA,CAAqC,CAClD,CAEA,SAASU,GACRb,EACAC,EACC,CACD,OAAIA,GAAQ,KACG,OAAO,KAAKA,CAAI,EAE5B,IAAIE,GACG,OAAOH,MAAgBA,KAAeH,EAC5CM,CACD,MAAMA,IACN,EACA,KAAK;AAAA,CAAI,EAEJ,EAET,CAEA,eAAsBW,EACrBd,EACAC,EACAc,EACAb,EACC,CACD,QAAQ,IAAI;AAAA,kDAA8C,EACzD,QAAQ,IACP,kCAAwBA,eAAkBF,+BAC3C,EACA,QAAQ,IACP,uCACC,OAAO,OAAOe,CAAO,EAAE,QAEzB,EACA,IAAMC,EAAe,UAAUhB,MAAgBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAW3Ba,GAAeb,EAAaC,CAAI;AAAA;AAAA;AAAA;AAAA,uBAI/B,OAAO,QAAQc,CAAO,EACzC,IAAI,CAAC,CAAC3B,EAAK6B,CAAK,IACT,qBAAqB7B,uBAAyB6B;AAAA,4DACG7B;AAAA;AAAA;AAAA,0CAGlBA,8BAAgC6B;AAAA,oEACN7B;AAAA;AAAA,qBAGhE,EACA,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,wBAKa,OAAO,QAAQ2B,CAAO,EAC1C,IAAI,CAAC,CAAC3B,EAAK6B,CAAK,IAAM,CACtB,IAAIC,EAAe,GACnB,OAAID,EAAM,SAAS,cAAc,EAChCC,EAAe,wBAAwB9B,WAC7B6B,EAAM,SAAS,YAAY,EACrCC,EAAe,sBAAsB9B,WAErC6B,EAAM,SAAS,kBAAkB,IAEjCC,EAAe,6BAA6B9B,YAEtC,sBAAsB6B,iBAAqB7B,OAAS8B,KAC5D,CAAC,EACA,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAiBS,OAAO,QAAQH,CAAO,EACxC,IAAI,CAAC,CAAC3B,EAAK6B,CAAK,IAAM,CAEtB,IAAIE,EAAYF,EAAM,MAAM,QAAQ,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI5B,GAAQA,EAAK,KAAK,CAAC,EACvE+B,EAAqB,CAAC,EACtBC,EAAa,GACbC,EAAa,GACjB,OAAIL,EAAM,SAAS,cAAc,GAChCG,EAAW,CAAC,EACZC,EAAa,GAAGF,EAAU,CAAC,IAC3BG,EAAa,SACHL,EAAM,SAAS,YAAY,GACrCG,EAAW,CAAC,QAAQD,EAAU,CAAC,GAAG,EAClCE,EAAa,GAAGF,EAAU,CAAC,IAC3BG,EAAa,YACHL,EAAM,SAAS,kBAAkB,IAC3CG,EAAW,CAAC,SAASD,EAAU,CAAC,IAAK,SAASA,EAAU,CAAC,GAAG,EAC5DE,EAAa,GAAGF,EAAU,CAAC,IAC3BG,EAAa,mBAEP,kBAAkBlC,oBAAsBgC,SAAgBC;AAAA,uBAC5CjC,OAASkC;AAAA,UAE7B,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA;AAAA,MAGb,MAAMV,EACLI,EACA,GAAGd,eAAkBF,gCACrB,oBACD,EACA,QAAQ,IAAI;AAAA,CAA0C,CACxD,CCnTA,OAAS,cAAAuB,MAAkB,KAK3B,eAAsBC,EACrBC,EACAC,EACC,CACD,QAAQ,IAAI;AAAA,6CAAyC,EACrD,QAAQ,IACP,+BAAqBA,eAAuBD,EAAO,uCACpD,EAEA,IAAME,EAAO,GAAGD,eAAuBD,EAAO,wCAC9C,GAAI,CAACF,EAAWI,CAAI,EAAG,CACtB,IAAMC,EAAO,UAAUH,EAAO,SAASA,EAAO;AAAA,WACrCA,EAAO,SAASA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,GAMhC,MAAMI,EACLD,EACAD,EACA,oBACD,EAED,QAAQ,IAAI;AAAA,CAAqC,CAClD,CAEA,eAAsBG,EAAgBL,EAAqBC,EAAmB,CAC7E,GACC,CAACH,EACA,GAAGG,eAAuBD,EAAO,mCAClC,EACC,CACD,IAAIG,EAAO,UAAUH,EAAO,SAASA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5C,MAAMI,EACLD,EACA,GAAGF,eAAuBD,EAAO,oCACjC,oBACD,EAEF,CClCA,SAASM,EAAmBC,EAAuB,CAClD,OAAOA,EACL,QAAQ,WAAY,KAAK,EACzB,YAAY,EACZ,QAAQ,KAAM,EAAE,CACnB,CAEA,SAASC,EACRC,EACAC,EACC,CACD,OAAIA,GAAQ,KACG,OAAO,KAAKA,CAAI,EAE5B,IAAIC,GACG,OAAOF,MAAgBA,KAAeH,EAC5CK,CACD,MAAMA,IACN,EACA,KAAK;AAAA,CAAI,EAEJ,EAET,CAEA,eAAsBC,EACrBH,EACAC,EACAG,EACAC,EACC,CACD,QAAQ,IAAI;AAAA,8CAA0C,EACtD,QAAWC,KAAO,OAAO,KAAKF,CAAM,EAAG,CACpC,IAAMF,EAAOI,EACPC,EAASH,EAAOE,CAAG,EACzB,QAAQ,IACP,gCAAsBJ,YAAeK,GACtC,EAEA,IAAIC,EAAO,UAAUR,MAAgBA,KAAeH,EAAmBK,CAAI;AAAA;AAAA;AAAA,QAGvEH,EAAeC,EAAaC,CAAI;AAAA;AAAA,wCAEAC;AAAA,kCACNO,EAAuBF,CAAgC;AAAA;AAAA;AAAA,yCAGhDE,EAAuBF,CAAgC,OAAOL;AAAA,iCACtEA;AAAA,qCACIQ,EAAeH,CAAgC;AAAA;AAAA;AAAA,2BAIhF,MAAMI,EACLH,EACA,GAAGH,eAAkBL,0BAAoCH,EACxDK,CACD,eACA,oBACD,EAGH,IAAIM,EAAO,UAAUR,MAAgBA;AAAA;AAAA,KAEjCD,EAAeC,EAAaC,CAAI;AAAA,IACjC,OAAO,QAAQG,CAAM,EAAE,IAAI,CAAC,CAACF,EAAMK,CAAM,IACpC;AAAA,MACHP,MAAgBA,KAAeH,EAAmBK,CAAI,YAAYA;AAAA,MAClEF,MAAgBA,KAAeH,EAAmBK,CAAI;AAAA,gBAC5CL,EAAmBK,CAAI,WAAWO,EAAuBF,CAAgC;AAAA,4CAC7DL,WAAcA,WAAcA;AAAA,eACzDL,EAAmBK,CAAI;AAAA;AAAA;AAAA,oBAGlBF,KAAeH,EAAmBK,CAAI,gBAAgBQ,EAAeH,CAAgC;AAAA;AAAA;AAAA,GAIvH,EAAE,KAAK;AAAA,CAAI;AAAA,eAIZ,MAAMI,EACLH,EACA,GAAGH,eAAkBL,gCACrB,oBACD,EACA,QAAQ,IAAI;AAAA,CAAsC,CACnD,CC3GA,OAAS,cAAAY,OAAkB,KAC3B,OAAOC,OAAQ,mBAGf,eAAsBC,EAAeC,EAAqBC,EAAmB,CAC5E,QAAQ,IAAI;AAAA,2CAAoC,EAC/C,QAAQ,IAAI,mCAAyB,EACrC,QAAQ,IACP,kCAAwBA,eAAuBD,EAAO,sBACvD,EAGEH,GACA,GAAGI,eAAuBD,EAAO,sBAClC,GAEA,MAAMF,GAAG,MAAM,GAAGG,eAAuBD,EAAO,uBAAwB,CAAE,UAAW,EAAK,CAAC,EAE7F,QAAQ,IAAI;AAAA,CAAgC,CAC7C,CCZA,SAASE,GAAmBC,EAAuB,CAClD,OAAOA,EACL,QAAQ,WAAY,KAAK,EACzB,YAAY,EACZ,QAAQ,KAAM,EAAE,CACnB,CAEA,eAAsBC,EACrBC,EACAC,EACAC,EACC,CACD,QAAQ,IAAI;AAAA,8CAA0C,EAEtD,IAAIC,EAAO,UAAUH,MAAgBA;AAAA,IAClC,OAAO,QAAQC,CAAM,EAAE,IAAI,CAAC,CAACG,EAAMC,CAAO,KAC3C,QAAQ,IAAI,oCAA0BD,GAAM,EAC7C,QAAQ,IAAI,mCAAoBC,GAAS,EAClC;AAAA,YACGD,qBAAwBC;AAAA,iBACnBR,GAAmBO,CAAI,iDAAiDA;AAAA,IAEvF,EAAE,KAAK;AAAA,CAAI;AAAA,eAIZ,MAAME,EACLH,EACA,GAAGD,eAAkBF,gCACrB,oBACD,EACA,QAAQ,IAAI;AAAA,CAAsC,CACnD,CCvCA,OAAS,cAAAO,MAAkB,KAG3B,eAAsBC,EACrBC,EACAC,EACC,CACD,MAAMC,GAA2BF,EAAQC,CAAS,EAClD,MAAME,GAAmBH,EAAQC,CAAS,EAC1C,MAAMG,GAAmBJ,EAAQC,CAAS,CAC3C,CAEA,eAAeC,GAA2BF,EAAqBC,EAAmB,CACjF,IAAMI,EAAO,GAAGJ,eAAuBD,EAAO,0CAC9C,GAAI,CAACF,EAAWO,CAAI,EAAG,CACtB,IAAIC,EAAO,UAAUN,EAAO,SAASA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiG5C,MAAMO,EACLD,EACAD,EACA,oBACD,EAEF,CAGA,eAAeF,GAAmBH,EAAqBC,EAAmB,CACzE,IAAMI,EAAO,GAAGJ,eAAuBD,EAAO,wCAC9C,GAAI,CAACF,EAAWO,CAAI,EAAG,CACtB,IAAIC,EAAO,UAAUN,EAAO,SAASA,EAAO;AAAA,QACtCA,EAAO,SAASA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqG7B,MAAMO,EACLD,EACAD,EACA,oBACD,EAEF,CAEA,eAAeD,GAAmBJ,EAAqBC,EAAmB,CACzE,IAAMI,EAAO,GAAGJ,eAAuBD,EAAO,wCAC9C,GAAI,CAACF,EAAWO,CAAI,EAAG,CACtB,IAAIC,EAAO,UAAUN,EAAO,SAASA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,QAKtCA,EAAO,SAASA,EAAO;AAAA,QACvBA,EAAO,SAASA,EAAO;AAAA,QACvBA,EAAO,SAASA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAQVA,EAAO;AAAA;AAAA;AAAA,cAGdA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cA+BPA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuCnB,MAAMO,EACLD,EACAD,EACA,oBACD,EAEF,CCxUA,eAAsBG,EACrBC,EACAC,EACC,CACD,QAAQ,IAAI;AAAA,sCAAkC,EAC9C,QAAQ,IACP,+BAAqBA,eAAuBD,EAAO,8BACpD,EAEC,IAAIE,EAAiB,UAAUF,EAAO,SAASA,EAAO;AAAA,UAC9CA,EAAO,SAASA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UASvBA,EAAO,SAASA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/B,MAAMG,EACLD,EACA,GAAGD,eAAuBD,EAAO,+BACjC,oBACD,EAED,IAAII,EAAY,UAAUJ,EAAO,SAASA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,QAK1CA,EAAO,SAASA,EAAO;AAAA;AAAA;AAAA;AAAA,qBAIVA,EAAO,qCAAqCA,EAAO,mBAAmBA,EAAO;AAAA;AAAA,uBAE3EA,EAAO,SAASA,EAAO;AAAA;AAAA,MAExCA,EAAO,SAASA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5B,MAAMG,EACLC,EACA,GAAGH,eAAuBD,EAAO,oCACjC,oBACD,EAEA,QAAQ,IAAI;AAAA,CAA8B,CAC3C,CTnDA,eAAsBK,GAClBC,EACAC,EACAC,EACF,CACE,QAAQ,IAAI;AAAA,gDAA4C,EACxD,QAAQ,IAAI,kCAA2B,EACvC,QAAQ,IAAI,wBAAcF,EAAO,MAAM,EACvC,QAAQ,IACJ,+BAAqBA,EAAO,aAAe,2BAC/C,EACA,QAAQ,IAAI,2BAAiBE,GAAW,WAAW,EAEnD,IAAMC,EAAOF,GAAa,QAAQ,IAAI,EAElCG,EAAW,GAAGD,eAAkBH,EAAO,MAAM,GAC7CK,EACI,GAAGF,eAAkBH,EAAO,sBAChC,EAGCI,EAAW,GAAGD,eAAkBH,EAAO,gBAAgB,GACxD,MAAMM,EAAaN,EAAQG,CAAI,EAI9BC,EACG,GAAGD,eAAkBH,EAAO,sCAChC,GAEA,MAAMO,EAAmBP,EAAQG,CAAI,EAGrCH,EAAO,SACHA,EAAO,KACP,MAAMQ,EAAoBR,EAAO,KAAOA,EAAO,KAAMA,EAAO,OAAQG,CAAI,EAExE,MAAMK,EAAoBR,EAAO,KAAO,KAAMA,EAAO,OAAQG,CAAI,GAIrEH,EAAO,MACP,MAAMS,EAAmBT,EAAO,KAAMA,EAAO,KAAMG,CAAI,EACvD,MAAMO,EAAwBV,EAAO,KAAMA,EAAO,KAAMA,EAAO,QAASG,CAAI,GAE5E,MAAMO,EAAwBV,EAAO,KAAM,KAAMA,EAAO,QAASG,CAAI,EAGrEH,EAAO,QACP,MAAMW,EAAoBX,EAAO,KAAMA,EAAO,OAAQG,CAAI,EAG9D,MAAMS,EAAsBZ,EAAQG,CAAI,EACxC,MAAMU,EAAab,EAAQG,CAAI,EAC/B,MAAMW,EAAed,EAAQG,CAAI,EACjC,MAAMY,EAAgBf,EAAQG,CAAI,EAElC,QAAQ,IAAI;AAAA,CAAyC,CACzD,CUxEA,OAAS,UAAAa,OAAc,UACvB,OAAOC,MAAU,OACjB,OAAOC,OAAa,UCDb,IAAMC,EAAN,cAAoC,KAAM,CACjD,KAAO,wBACP,QAAU,oCACV,EDAA,OAAS,UAAAC,OAAc,KACvB,OAAS,iBAAAC,OAAqB,MAC9B,OAAOC,OAAQ,KAGf,IAAMC,GAAc,CAClB,kBACA,mBACA,kBACA,kBACF,EACMC,EAAc,2BAEpB,eAAsBC,GAAWC,EAAuC,CACtEA,EAAa,MAAMC,EAAkBD,CAAU,EAC/C,GAAI,CACF,aAAME,GAAQ,MAAM,CAClB,YAAa,CAACF,CAAU,EACxB,OAAQ,MACR,QAASF,EAET,SAAU,OAEV,OAAQ,GAER,SAAU,UACZ,CAAC,EACDE,EAAa,MAAMC,EAAkBH,EAAa,EAAI,GAI9C,MAAM,OAAOE,EAAa,WAAW,KAAK,IAAI,MAAM,WAC9D,QAAE,CACAN,GAAOI,EAAa,CAAE,MAAO,EAAK,CAAC,CACrC,CACF,CAEA,eAAsBG,EACpBD,EACAG,EACA,CACA,OAAIH,IAAe,OACjBA,EAAa,MAAMI,GAAkB,EAEhCC,EAAK,WAAWL,CAAU,IAC7BA,EAAaK,EAAK,KAAK,QAAQ,IAAI,EAAGL,CAAU,EAChDA,EAAaK,EAAK,UAAUL,CAAU,GAMnCG,GAAaP,GAAG,SAAS,IAAM,QAClCD,GAAcK,CAAU,EAAE,KAC1BA,CACN,CAEA,eAAeI,IAAoB,CACjC,IAAME,EAAe,MAAMC,GAAOV,EAAW,EAC7C,GAAIS,IAAiB,OACnB,MAAM,IAAIE,EAEZ,OAAOF,CACT,CEnEO,IAAMG,EAAaC,GAAc,CACpC,GAAI,OAAOA,GAAS,UAAYA,IAAS,KACrC,OAAOA,EAEX,IAAMC,EAAkB,CAAC,EACzB,QAAWC,KAAOF,EACd,GAAIA,EAAK,eAAeE,CAAG,EAAG,CAE1B,IAAMC,EAAQH,EAAKE,CAAG,EAElB,OAAOC,GAAU,UAAYA,IAAU,KACnC,MAAM,QAAQA,CAAK,EACnBF,EAAWC,CAAG,EAAIE,EAAYD,CAAK,EAC5BA,EAAM,eAAe,SAAS,EACrCF,EAAWC,CAAG,EAAI,CAAE,CAACC,EAAM,OAAO,EAAG,CAAE,CAAE,EAClCA,EAAM,eAAe,QAAQ,EACpCF,EAAWC,CAAG,EAAIH,EAAUI,EAAM,MAAM,EAExCF,EAAWC,CAAG,EAAIH,EAAUI,CAAK,EAGrCF,EAAWC,CAAG,EAAIC,EAI9B,OAAOF,CACX,EAEMG,EAAeJ,GAAuB,CACxC,IAAIK,EAAoB,CAAC,EACzB,OAAAL,EAAK,QAASM,GAAS,CACf,OAAOA,GAAS,UAAYA,IAAS,KACjC,MAAM,QAAQA,CAAI,EAClBD,EAAW,KAAKD,EAAYE,CAAI,CAAC,EAC1BA,EAAK,eAAe,SAAS,EACpCD,EAAW,KAAK,CAAE,CAACC,EAAK,OAAO,EAAG,CAAE,CAAE,CAAC,EAChCA,EAAK,eAAe,QAAQ,EACnCD,EAAW,KAAKN,EAAUO,EAAK,MAAM,CAAC,EAEtCD,EAAW,KAAKN,EAAUO,CAAI,CAAC,EAGnCD,EAAW,KAAKC,CAAI,CAE5B,CAAC,EACMD,CACX","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","getStructAttrs","values","key","_","getStructTypes","values","_","type","getStructAttrsWithType","key","getStructAttrsQuery","containsString","obj","searchString","value","generateToml","config","srcPrefix","code","formatAndWriteMove","sortByFirstLetter","arr","a","b","firstLetterA","firstLetterB","renderSetAttrsFunc","schemaName","fields","key","type","renderSetFunc","getStructAttrsWithType","fieldName","renderGetAllFunc","getStructTypes","getStructAttrsQuery","renderGetAttrsFunc","convertToSnakeCase","input","generateSchemaData","projectName","data","path","name","code","enumNames","item","sortByFirstLetterFields","sortByFirstLetter","field","containsString","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemas","schemaMoudle","value","storage_type","all_types","para_key","para_value","borrow_key","existsSync","generateDeployHook","config","srcPrefix","path","code","formatAndWriteMove","generateMigrate","convertToSnakeCase","input","generateImport","projectName","data","name","generateSchemaEvent","events","path","key","fields","code","getStructAttrsWithType","getStructAttrs","formatAndWriteMove","existsSync","fs","generateSystem","config","srcPrefix","convertToSnakeCase","input","generateSchemaError","projectName","errors","path","code","name","message","formatAndWriteMove","existsSync","generateDefaultSchema","config","srcPrefix","generateDappSchemaMetadata","generateDappSchema","generateDappSystem","path","code","formatAndWriteMove","generateInit","config","srcPrefix","init_test_code","formatAndWriteMove","init_code","schemaGen","config","srcPrefix","network","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSchemaEvent","generateSchemaData","generateSchemaStructure","generateSchemaError","generateDefaultSchema","generateInit","generateSystem","generateMigrate","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xobelisk/sui-common",
3
- "version": "1.1.4",
3
+ "version": "1.1.6",
4
4
  "description": "Common low level logic shared between packages",
5
5
  "keywords": [
6
6
  "sui",
@@ -10,7 +10,7 @@ export async function generateDappKey(
10
10
  ` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`
11
11
  );
12
12
 
13
- let code = `module ${config.name}::dapp_key {
13
+ let code = `module ${config.name}::${config.name}_dapp_key {
14
14
  \t/// Authorization token for the app.
15
15
  \tpublic struct DappKey has drop {}
16
16
 
@@ -15,7 +15,7 @@ export async function generateDefaultSchema(
15
15
  async function generateDappSchemaMetadata(config: DubheConfig, srcPrefix: string) {
16
16
  const path = `${srcPrefix}/contracts/${config.name}/sources/codegen/dapp/metadata.move`
17
17
  if (!existsSync(path)) {
18
- let code = `module ${config.name}::dapp_metadata {
18
+ let code = `module ${config.name}::${config.name}_dapp_metadata {
19
19
  use std::ascii::String;
20
20
 
21
21
  public struct DappMetadata has drop, copy, store {
@@ -124,8 +124,8 @@ async function generateDappSchemaMetadata(config: DubheConfig, srcPrefix: string
124
124
  async function generateDappSchema(config: DubheConfig, srcPrefix: string) {
125
125
  const path = `${srcPrefix}/contracts/${config.name}/sources/codegen/dapp/schema.move`
126
126
  if (!existsSync(path)) {
127
- let code = `module ${config.name}::dapp_schema {
128
- use ${config.name}::dapp_metadata::DappMetadata;
127
+ let code = `module ${config.name}::${config.name}_dapp_schema {
128
+ use ${config.name}::${config.name}_dapp_metadata::DappMetadata;
129
129
  use dubhe::storage_value;
130
130
  use dubhe::storage_value::StorageValue;
131
131
  use dubhe::storage;
@@ -237,14 +237,14 @@ async function generateDappSchema(config: DubheConfig, srcPrefix: string) {
237
237
  async function generateDappSystem(config: DubheConfig, srcPrefix: string) {
238
238
  const path = `${srcPrefix}/contracts/${config.name}/sources/codegen/dapp/system.move`
239
239
  if (!existsSync(path)) {
240
- let code = `module ${config.name}::dapp_system {
240
+ let code = `module ${config.name}::${config.name}_dapp_system {
241
241
  use std::ascii::String;
242
242
  use std::ascii;
243
243
  use dubhe::type_info;
244
244
  use sui::clock::Clock;
245
- use ${config.name}::dapp_schema;
246
- use ${config.name}::dapp_metadata;
247
- use ${config.name}::dapp_schema::Dapp;
245
+ use ${config.name}::${config.name}_dapp_schema;
246
+ use ${config.name}::${config.name}_dapp_metadata;
247
+ use ${config.name}::${config.name}_dapp_schema::Dapp;
248
248
 
249
249
  public struct DappKey has drop {}
250
250
  public(package) fun new(): DappKey {
@@ -252,10 +252,10 @@ async function generateDappSystem(config: DubheConfig, srcPrefix: string) {
252
252
  }
253
253
 
254
254
  public(package) fun create(name: String, description: String, clock: &Clock, ctx: &mut TxContext): Dapp {
255
- let mut dapp = dapp_schema::create(ctx);
255
+ let mut dapp = ${config.name}_dapp_schema::create(ctx);
256
256
  assert!(!dapp.borrow_metadata().contains(), 0);
257
257
  dapp.metadata().set(
258
- dapp_metadata::new(
258
+ ${config.name}_dapp_metadata::new(
259
259
  name,
260
260
  description,
261
261
  ascii::string(b""),
@@ -286,7 +286,7 @@ async function generateDappSystem(config: DubheConfig, srcPrefix: string) {
286
286
  assert!(admin == option::some(ctx.sender()), 0);
287
287
  let created_at = dapp.metadata().get().get_created_at();
288
288
  dapp.metadata().set(
289
- dapp_metadata::new(
289
+ ${config.name}_dapp_metadata::new(
290
290
  name,
291
291
  description,
292
292
  icon_url,
@@ -21,7 +21,7 @@ export async function generateSchemaError(
21
21
  ) {
22
22
  console.log('\n📦 Starting Schema Error Generation...');
23
23
 
24
- let code = `module ${projectName}::errors {
24
+ let code = `module ${projectName}::${projectName}_errors {
25
25
  ${Object.entries(errors).map(([name, message]) => {
26
26
  console.log(` ├─ Generating Error: ${name}`);
27
27
  console.log(` │ └─ Message: ${message}`);
@@ -33,7 +33,7 @@ function generateImport(
33
33
  const names = Object.keys(data);
34
34
  return names
35
35
  .map(name => {
36
- return `use ${projectName}::${convertToSnakeCase(
36
+ return `use ${projectName}::${projectName}_${convertToSnakeCase(
37
37
  name,
38
38
  )}::${name};`;
39
39
  })
@@ -57,7 +57,7 @@ export async function generateSchemaEvent(
57
57
  ` └─ Generating ${name} event: ${fields}`
58
58
  );
59
59
 
60
- let code = `module ${projectName}::${convertToSnakeCase(name)}_event {
60
+ let code = `module ${projectName}::${projectName}_${convertToSnakeCase(name)}_event {
61
61
  use sui::event;
62
62
  use std::ascii::String;
63
63
  ${generateImport(projectName, data)}
@@ -81,19 +81,19 @@ export async function generateSchemaEvent(
81
81
  );
82
82
  }
83
83
 
84
- let code = `module ${projectName}::events {
84
+ let code = `module ${projectName}::${projectName}_events {
85
85
  use std::ascii::{String, string};
86
86
  ${generateImport(projectName, data)}
87
87
  ${Object.entries(events).map(([name, fields]) => {
88
88
  return `
89
- use ${projectName}::${convertToSnakeCase(name)}_event::${name}Event;
90
- use ${projectName}::${convertToSnakeCase(name)}_event;
89
+ use ${projectName}::${projectName}_${convertToSnakeCase(name)}_event::${name}Event;
90
+ use ${projectName}::${projectName}_${convertToSnakeCase(name)}_event;
91
91
  public fun ${convertToSnakeCase(name)}_event(${getStructAttrsWithType(fields as Record<string, string>)}) {
92
92
  dubhe::storage_event::emit_set_record<${name}Event, ${name}Event, ${name}Event>(
93
93
  string(b"${convertToSnakeCase(name)}_event"),
94
94
  option::none(),
95
95
  option::none(),
96
- option::some(${convertToSnakeCase(name)}_event::new(${getStructAttrs(fields as Record<string, string>)}))
96
+ option::some(${projectName}_${convertToSnakeCase(name)}_event::new(${getStructAttrs(fields as Record<string, string>)}))
97
97
  )
98
98
  }
99
99
  `
@@ -12,8 +12,8 @@ export async function generateInit(
12
12
  ` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/tests/init.move`
13
13
  );
14
14
 
15
- let init_test_code = `module ${config.name}::init_test {
16
- use ${config.name}::dapp_schema::Dapp;
15
+ let init_test_code = `module ${config.name}::${config.name}_init_test {
16
+ use ${config.name}::${config.name}_dapp_schema::Dapp;
17
17
  use sui::clock;
18
18
  use sui::test_scenario;
19
19
  use sui::test_scenario::Scenario;
@@ -22,7 +22,7 @@ export async function generateInit(
22
22
  let mut scenario = test_scenario::begin(sender);
23
23
  let ctx = test_scenario::ctx(&mut scenario);
24
24
  let clock = clock::create_for_testing(ctx);
25
- ${config.name}::genesis::run(&clock, ctx);
25
+ ${config.name}::${config.name}_genesis::run(&clock, ctx);
26
26
  clock::destroy_for_testing(clock);
27
27
  test_scenario::next_tx(&mut scenario,sender);
28
28
  let dapp = test_scenario::take_shared<Dapp>(&scenario);
@@ -36,20 +36,20 @@ export async function generateInit(
36
36
  'formatAndWriteMove'
37
37
  );
38
38
 
39
- let init_code = `module ${config.name}::genesis {
39
+ let init_code = `module ${config.name}::${config.name}_genesis {
40
40
  use std::ascii::string;
41
41
 
42
42
  use sui::clock::Clock;
43
43
 
44
- use ${config.name}::dapp_system;
44
+ use ${config.name}::${config.name}_dapp_system;
45
45
 
46
46
  public entry fun run(clock: &Clock, ctx: &mut TxContext) {
47
47
  // Create a dapp.
48
- let mut dapp = dapp_system::create(string(b"${config.name}"),string(b"${config.description}"), clock , ctx);
48
+ let mut dapp = ${config.name}_dapp_system::create(string(b"${config.name}"),string(b"${config.description}"), clock , ctx);
49
49
  // Create schemas
50
- let mut schema = ${config.name}::schema::create(ctx);
50
+ let mut schema = ${config.name}::${config.name}_schema::create(ctx);
51
51
  // Logic that needs to be automated once the contract is deployed
52
- ${config.name}::deploy_hook::run(&mut schema, ctx);
52
+ ${config.name}::${config.name}_deploy_hook::run(&mut schema, ctx);
53
53
  // Authorize schemas and public share objects
54
54
  dapp.add_schema(schema);
55
55
  sui::transfer::public_share_object(dapp);
@@ -116,7 +116,7 @@ export async function generateSchemaData(
116
116
 
117
117
  if (Array.isArray(fields)) {
118
118
  const sortByFirstLetterFields = sortByFirstLetter(fields);
119
- code = `module ${projectName}::${convertToSnakeCase(
119
+ code = `module ${projectName}::${projectName}_${convertToSnakeCase(
120
120
  name,
121
121
  )} {
122
122
  public enum ${name} has copy, drop , store {
@@ -133,7 +133,7 @@ export async function generateSchemaData(
133
133
  })
134
134
  .join('')}`;
135
135
  } else {
136
- code = `module ${projectName}::${convertToSnakeCase(
136
+ code = `module ${projectName}::${projectName}_${convertToSnakeCase(
137
137
  name,
138
138
  )} {
139
139
  use std::ascii::String;
@@ -142,7 +142,7 @@ export async function generateSchemaData(
142
142
  Object.keys(data)
143
143
  .map(name => {
144
144
  if (containsString(fields, name)) {
145
- return `use ${projectName}::${convertToSnakeCase(name)}::${name};`;
145
+ return `use ${projectName}::${projectName}_${convertToSnakeCase(name)}::${name};`;
146
146
  }
147
147
  return undefined;
148
148
  })
@@ -188,7 +188,7 @@ function generateImport(
188
188
  const names = Object.keys(data);
189
189
  return names
190
190
  .map(name => {
191
- return `use ${projectName}::${convertToSnakeCase(
191
+ return `use ${projectName}::${projectName}_${convertToSnakeCase(
192
192
  name,
193
193
  )}::${name};`;
194
194
  })
@@ -213,7 +213,7 @@ export async function generateSchemaStructure(
213
213
  Object.values(schemas).length
214
214
  }`,
215
215
  );
216
- const schemaMoudle = `module ${projectName}::schema {
216
+ const schemaMoudle = `module ${projectName}::${projectName}_schema {
217
217
  use std::ascii::String;
218
218
  use std::ascii::string;
219
219
  use sui::package::UpgradeCap;
@@ -10,7 +10,7 @@ export async function generateSchemaHub(
10
10
  ` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/schema_hub.move`
11
11
  );
12
12
 
13
- let code = `module ${config.name}::schema_hub {
13
+ let code = `module ${config.name}::${config.name}_schema_hub {
14
14
  use sui::transfer::public_share_object;
15
15
  use sui::dynamic_field as df;
16
16
 
@@ -16,8 +16,8 @@ export async function generateDeployHook(
16
16
 
17
17
  const path = `${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`;
18
18
  if (!existsSync(path)) {
19
- const code = `module ${config.name}::deploy_hook {
20
- use ${config.name}::schema::Schema;
19
+ const code = `module ${config.name}::${config.name}_deploy_hook {
20
+ use ${config.name}::${config.name}_schema::Schema;
21
21
 
22
22
  public(package) fun run(_schema: &mut Schema, _ctx: &mut TxContext) {
23
23
 
@@ -38,7 +38,7 @@ export async function generateMigrate(config: DubheConfig, srcPrefix: string) {
38
38
  `${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`
39
39
  )
40
40
  ) {
41
- let code = `module ${config.name}::migrate {
41
+ let code = `module ${config.name}::${config.name}_migrate {
42
42
  const ON_CHAIN_VERSION: u32 = 1;
43
43
 
44
44
  public fun on_chain_version(): u32 {