@0xobelisk/sui-common 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -28,26 +28,17 @@ type U64 = number;
28
28
  type U128 = number;
29
29
  type Vector<T> = T[];
30
30
  type BaseValueType = String | Address | Bool | U8 | U32 | U64 | U128 | Vector<Address> | Vector<Bool> | Vector<U8> | Vector<Vector<U8>> | Vector<U64> | Vector<U128>;
31
- interface EventData {
32
- [key: string]: {
33
- [field: string]: any;
34
- };
35
- }
36
- interface SchemaData {
37
- [key: string]: {
38
- [field: string]: any;
39
- };
40
- }
41
- type SchemaType = {
42
- data?: SchemaData[];
43
- structure: Record<string, string>;
44
- events?: EventData[];
45
- errors?: Record<string, string>[];
46
- };
31
+ type SchemaData = Record<string, string> | string[];
32
+ type SchemaType = Record<string, string>;
33
+ type EventData = Record<string, string>;
34
+ type ErrorData = Record<string, string>;
47
35
  type DubheConfig = {
48
36
  name: string;
49
37
  description: string;
38
+ data?: Record<string, SchemaData>;
50
39
  schemas: Record<string, SchemaType>;
40
+ events?: Record<string, EventData>;
41
+ errors?: ErrorData;
51
42
  };
52
43
  type MoveType = 'string' | 'vector<string>' | 'String' | 'vector<String>' | 'address' | 'bool' | 'u8' | 'u32' | 'u64' | 'u128' | 'vector<address>' | 'vector<bool>' | 'vector<u8>' | 'vector<vector<u8>>' | 'vector<u32>' | 'vector<u64>' | 'vector<u128>';
53
44
 
@@ -56,4 +47,4 @@ declare function schemaGen(config: DubheConfig, srcPrefix?: string, network?: 'm
56
47
  declare function loadConfig(configPath?: string): Promise<unknown>;
57
48
  declare function resolveConfigPath(configPath: string | undefined, toFileURL?: boolean): Promise<string>;
58
49
 
59
- export { BaseType, BaseValueType, DubheConfig, MoveType, SchemaType, StorageDataType, StorageMapType, formatAndWriteMove, formatAndWriteTypescript, formatMove, formatTypescript, loadConfig, posixPath, resolveConfigPath, schemaGen };
50
+ export { BaseType, BaseValueType, DubheConfig, ErrorData, EventData, MoveType, SchemaData, SchemaType, StorageDataType, StorageMapType, formatAndWriteMove, formatAndWriteTypescript, formatMove, formatTypescript, loadConfig, posixPath, resolveConfigPath, schemaGen };
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
- import v from"prettier";import Y from"prettier-plugin-move-js";async function j(e,t){let o;t&&(o=await v.resolveConfig(t));try{return v.format(e,{plugins:[Y],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...o})}catch(r){let n;return r instanceof Error?n=r.message:n=r,console.log(`Error during output formatting: ${n}`),e}}async function T(e){return v.format(e,{parser:"typescript"})}import S from"node:fs/promises";import R from"node:path";import O from"debug";var $=O("dubhe:common"),J=O("dubhe:common");$.log=console.debug.bind(console);J.log=console.error.bind(console);var h=$.extend("codegen"),N=$.extend("codegen");h.log=console.debug.bind(console);N.log=console.error.bind(console);async function c(e,t,o){let r=await j(e),n=` // Copyright (c) Obelisk Labs, Inc.
1
+ import x from"prettier";import J from"prettier-plugin-move-js";async function G(e,t){let r;t&&(r=await x.resolveConfig(t));try{return x.format(e,{plugins:[J],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...r})}catch(a){let o;return a instanceof Error?o=a.message:o=a,console.log(`Error during output formatting: ${o}`),e}}async function O(e){return x.format(e,{parser:"typescript"})}import w from"node:fs/promises";import E from"node:path";import W from"debug";var h=W("dubhe:common"),N=W("dubhe:common");h.log=console.debug.bind(console);N.log=console.error.bind(console);var S=h.extend("codegen"),P=h.extend("codegen");S.log=console.debug.bind(console);P.log=console.error.bind(console);async function p(e,t,r){let a=await G(e),o=` // Copyright (c) Obelisk Labs, Inc.
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  #[allow(unused_use)]
4
4
 
5
5
  /* Autogenerated file. Do not edit manually. */
6
6
 
7
- `,p="#[test_only]",a=n+r,s="#[allow(lint(share_owned), unused_let_mut)]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?a=r:t.includes("init")?a=p+r:t.includes("deploy_hook")&&(a=s+r),await S.mkdir(R.dirname(t),{recursive:!0}),await S.writeFile(t,a),h(`${o}: ${t}`)}async function je(e,t,o){let r=await T(e);await S.mkdir(R.dirname(t),{recursive:!0}),await S.writeFile(t,r),h(`${o}: ${t}`)}function Oe(e){return e.replace(/\\/g,"/")}import{existsSync as C}from"fs";import _ from"fs";function x(e){_.existsSync(e)&&(_.readdirSync(e).forEach(t=>{let o=`${e}/${t}`;_.lstatSync(o).isDirectory()?x(o):_.unlinkSync(o)}),_.rmdirSync(e))}function f(e){return Object.entries(e).map(([t,o])=>`${t}`).join(",")}function G(e){return`(${Object.entries(e).map(([t,o])=>`${o}`)})`}function d(e){return Object.entries(e).map(([t,o])=>`${t}: ${o}`)}function W(e){return Object.entries(e).map(([t,o])=>`self.${t}`)}async function V(e,t){console.log(`
8
- \u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/Move.toml`);let o=`[package]
7
+ `,n="#[test_only]",s=o+a,i="#[allow(lint(share_owned), unused_let_mut)]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?s=a:t.includes("init")?s=n+a:t.includes("deploy_hook")&&(s=i+a),await w.mkdir(E.dirname(t),{recursive:!0}),await w.writeFile(t,s),S(`${r}: ${t}`)}async function Te(e,t,r){let a=await O(e);await w.mkdir(E.dirname(t),{recursive:!0}),await w.writeFile(t,a),S(`${r}: ${t}`)}function Ge(e){return e.replace(/\\/g,"/")}import{existsSync as j}from"fs";import g from"fs";function D(e){g.existsSync(e)&&(g.readdirSync(e).forEach(t=>{let r=`${e}/${t}`;g.lstatSync(r).isDirectory()?D(r):g.unlinkSync(r)}),g.rmdirSync(e))}function _(e){return Object.entries(e).map(([t,r])=>`${t}`).join(",")}function V(e){return`(${Object.entries(e).map(([t,r])=>`${r}`)})`}function l(e){return Object.entries(e).map(([t,r])=>`${t}: ${r}`)}function U(e){return Object.entries(e).map(([t,r])=>`self.${t}`)}async function L(e,t){console.log(`
8
+ \u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/Move.toml`);let r=`[package]
9
9
  name = "${e.name}"
10
10
  version = "1.0.0"
11
11
  edition = "2024"
@@ -17,49 +17,49 @@ Dubhe = { git = "https://github.com/0xobelisk/dubhe-framework.git", rev = "dubhe
17
17
  [addresses]
18
18
  sui = "0x2"
19
19
  ${e.name} = "0x0"
20
- `;await c(o,`${t}/contracts/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
21
- `)}function u(e){return e.split("_").map((t,o)=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function P(e,t){return Object.entries(t).map(([o,r])=>`public(package) fun set_${o}(self: &mut ${e}, ${o}: ${r}) {
22
- self.${o} = ${o};
20
+ `;await p(r,`${t}/contracts/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
21
+ `)}function m(e){return e.split("_").map((t,r)=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function ee(e,t){return Object.entries(t).map(([r,a])=>`public(package) fun set_${r}(self: &mut ${e}, ${r}: ${a}) {
22
+ self.${r} = ${r};
23
23
  }`).join(`
24
- `)}function ee(e,t){return`public(package) fun set(self: &mut ${e}, ${d(t)}) {
25
- ${Object.entries(t).map(([o])=>`self.${o} = ${o};`).join(`
24
+ `)}function te(e,t){return`public(package) fun set(self: &mut ${e}, ${l(t)}) {
25
+ ${Object.entries(t).map(([r])=>`self.${r} = ${r};`).join(`
26
26
  `)}
27
- }`}function te(e,t){return`public fun get(self: &${e}): ${G(t)} {
28
- (${W(t)})
29
- }`}function re(e,t){return Object.entries(t).map(([o,r])=>`public fun get_${o}(self: &${e}): ${r} {
30
- self.${o}
27
+ }`}function re(e,t){return`public fun get(self: &${e}): ${V(t)} {
28
+ (${U(t)})
29
+ }`}function ae(e,t){return Object.entries(t).map(([r,a])=>`public fun get_${r}(self: &${e}): ${a} {
30
+ self.${r}
31
31
  }`).join(`
32
- `)}function g(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function E(e,t,o){console.log(`
33
- \u{1F4E6} Starting Schema Data Generation...`);for(let r in t){let n=t[r];if(n.data){console.log(` \u251C\u2500 Processing schema: ${r}`);for(let p of n.data){let a=Object.keys(p)[0],s=Object.values(p)[0];console.log(` \u2514\u2500 Generating ${a} ${Array.isArray(s)?"(enum)":"(struct)"}`);let i="",l=n.data.filter(m=>Array.isArray(Object.values(m)[0])).map(m=>Object.keys(m)[0]);Array.isArray(s)?i=`module ${e}::${r}_${g(a)} {
34
- public enum ${a} has copy, drop , store {
35
- ${s}
32
+ `)}function d(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function I(e,t,r){console.log(`
33
+ \u{1F4E6} Starting Schema Data Generation...`);for(let a of Object.keys(t)){let o=a,n=t[a];console.log(` \u2514\u2500 Generating ${o} ${Array.isArray(n)?"(enum)":"(struct)"}`);let s="",i=Object.keys(t).filter(c=>Array.isArray(t[c])).map(c=>c);console.log(i),Array.isArray(n)?s=`module ${e}::${d(o)} {
34
+ public enum ${o} has copy, drop , store {
35
+ ${n}
36
36
  }
37
37
 
38
- ${s.map(m=>`public fun new_${g(m)}(): ${a} {
39
- ${a}::${m}
40
- }`).join("")}`:i=`module ${e}::${r}_${g(a)} {
38
+ ${n.map(c=>`public fun new_${d(c)}(): ${o} {
39
+ ${o}::${c}
40
+ }`).join("")}`:s=`module ${e}::${d(o)} {
41
41
  use std::ascii::String;
42
- ${l.map(m=>`use ${e}::${r}_${g(m)}::${m};`).join(`
42
+ ${i.map(c=>`use ${e}::${d(c)}::${c};`).join(`
43
43
  `)}
44
44
 
45
- public struct ${a} has copy, drop , store {
46
- ${d(s)}
45
+ public struct ${o} has copy, drop , store {
46
+ ${l(n)}
47
47
  }
48
48
 
49
- public fun new(${d(s)}): ${a} {
50
- ${a} {
51
- ${f(s)}
49
+ public fun new(${l(n)}): ${o} {
50
+ ${o} {
51
+ ${_(n)}
52
52
  }
53
53
  }
54
54
 
55
- ${te(a,s)}
56
- ${re(a,s)}
57
- ${P(a,s)}
58
- ${ee(a,s)}
59
- }`,await c(i,`${o}/contracts/${e}/sources/codegen/schemas/${r}_${g(a)}.move`,"formatAndWriteMove")}}}console.log(`\u2705 Schema Data Generation Complete
60
- `)}function ae(e,t,o){return o.data?o.data.map(r=>{let n=Object.keys(r)[0];return`use ${e}::${t}_${g(n)}::${n};`}).join(`
61
- `):""}async function U(e,t,o){console.log(`
62
- \u{1F528} Starting Schema Structure Generation...`);for(let r in t){console.log(` \u251C\u2500 Generating schema: ${r}`),console.log(` \u251C\u2500 Output path: ${o}/contracts/${e}/sources/codegen/schemas/${r}.move`),console.log(` \u2514\u2500 Structure fields: ${Object.keys(t[r].structure).length}`);let n=t[r],p=`module ${e}::${r}_schema {
55
+ ${re(o,n)}
56
+ ${ae(o,n)}
57
+ ${ee(o,n)}
58
+ ${te(o,n)}
59
+ }`,await p(s,`${r}/contracts/${e}/sources/codegen/data/${d(o)}.move`,"formatAndWriteMove")}console.log(`\u2705 Schema Data Generation Complete
60
+ `)}function oe(e,t){return t!=null?Object.keys(t).map(a=>`use ${e}::${d(a)}::${a};`).join(`
61
+ `):""}async function k(e,t,r,a){console.log(`
62
+ \u{1F528} Starting Schema Structure Generation...`);for(let o in r){console.log(` \u251C\u2500 Generating schema: ${o}`),console.log(` \u251C\u2500 Output path: ${a}/contracts/${e}/sources/codegen/schemas/${o}.move`),console.log(` \u2514\u2500 Structure fields: ${Object.values(r[o]).length}`);let n=r[o],s=`module ${e}::${o}_schema {
63
63
  use std::ascii::String;
64
64
  use std::ascii::string;
65
65
  use sui::package::UpgradeCap;
@@ -72,146 +72,146 @@ ${e.name} = "0x0"
72
72
  use sui::sui::SUI;
73
73
  use sui::coin::Coin;
74
74
  use sui::balance::Balance;
75
- ${ae(e,r,n)}
75
+ ${oe(e,t)}
76
76
 
77
- public struct ${u(r)} has key, store {
77
+ public struct ${m(o)} has key, store {
78
78
  id: UID
79
79
  }
80
80
 
81
- ${Object.entries(n.structure).map(([a,s])=>`public fun borrow_${a}(self: &${u(r)}) : &${s} {
82
- storage_migration::borrow_field(&self.id, b"${a}")
81
+ ${Object.entries(n).map(([i,c])=>`public fun borrow_${i}(self: &${m(o)}) : &${c} {
82
+ storage_migration::borrow_field(&self.id, b"${i}")
83
83
  }
84
84
 
85
- public(package) fun ${a}(self: &mut ${u(r)}): &mut ${s} {
86
- storage_migration::borrow_mut_field(&mut self.id, b"${a}")
85
+ public(package) fun ${i}(self: &mut ${m(o)}): &mut ${c} {
86
+ storage_migration::borrow_mut_field(&mut self.id, b"${i}")
87
87
  }
88
88
  `).join("")}
89
89
 
90
90
 
91
- public(package) fun create(ctx: &mut TxContext): ${u(r)} {
91
+ public(package) fun create(ctx: &mut TxContext): ${m(o)} {
92
92
  let mut id = object::new(ctx);
93
- ${Object.entries(n.structure).map(([a,s])=>{let i="";return s.includes("StorageValue")?i="storage_value::new()":s.includes("StorageMap")?i="storage_map::new()":s.includes("StorageDoubleMap")&&(i="storage_double_map::new()"),`storage_migration::add_field<${s}>(&mut id, b"${a}", ${i});`}).join("")}
93
+ ${Object.entries(n).map(([i,c])=>{let u="";return c.includes("StorageValue")?u="storage_value::new()":c.includes("StorageMap")?u="storage_map::new()":c.includes("StorageDoubleMap")&&(u="storage_double_map::new()"),`storage_migration::add_field<${c}>(&mut id, b"${i}", ${u});`}).join("")}
94
94
 
95
- ${u(r)} { id }
95
+ ${m(o)} { id }
96
96
  }
97
97
 
98
- public fun migrate(_${r}: &mut ${u(r)}, _cap: &UpgradeCap) { }
98
+ public fun migrate(_${o}: &mut ${m(o)}, _cap: &UpgradeCap) { }
99
99
 
100
100
 
101
101
 
102
102
  // ======================================== View Functions ========================================
103
- ${Object.entries(n.structure).map(([a,s])=>{let i=s.match(/<(.+)>/)[1].split(",").map(X=>X.trim()),l=[],m="",b="",y="";return s.includes("StorageValue")?(l=[],m=`${i[0]}`,b="borrow()"):s.includes("StorageMap")?(l=[`key: ${i[0]}`],m=`${i[1]}`,b="borrow(key)",!s.includes("Balance")&&!s.includes("Coin")&&(y=`public fun get_${a}_keys(self: &${u(r)}) : vector<${i[0]}> {
104
- self.borrow_${a}().keys()
103
+ ${Object.entries(n).map(([i,c])=>{let u=c.match(/<(.+)>/)[1].split(",").map(Y=>Y.trim()),f=[],b="",$="",v="";return c.includes("StorageValue")?(f=[],b=`${u[0]}`,$="borrow()"):c.includes("StorageMap")?(f=[`key: ${u[0]}`],b=`${u[1]}`,$="borrow(key)",!c.includes("Balance")&&!c.includes("Coin")&&(v=`public fun get_${i}_keys(self: &${m(o)}) : vector<${u[0]}> {
104
+ self.borrow_${i}().keys()
105
105
  }
106
106
 
107
- public fun get_${a}_values(self: &${u(r)}) : vector<${i[1]}> {
108
- self.borrow_${a}().values()
109
- }`)):s.includes("StorageDoubleMap")&&(l=[`key1: ${i[0]}`,`key2: ${i[1]}`],m=`${i[2]}`,b="borrow(key1, key2)",!s.includes("Balance")&&!s.includes("Coin")&&(y=`public fun get_${a}_keys(self: &${u(r)}) : (vector<${i[0]}>, vector<${i[1]}>) {
110
- self.borrow_${a}().keys()
107
+ public fun get_${i}_values(self: &${m(o)}) : vector<${u[1]}> {
108
+ self.borrow_${i}().values()
109
+ }`)):c.includes("StorageDoubleMap")&&(f=[`key1: ${u[0]}`,`key2: ${u[1]}`],b=`${u[2]}`,$="borrow(key1, key2)",!c.includes("Balance")&&!c.includes("Coin")&&(v=`public fun get_${i}_keys(self: &${m(o)}) : (vector<${u[0]}>, vector<${u[1]}>) {
110
+ self.borrow_${i}().keys()
111
111
  }
112
112
 
113
- public fun get_${a}_values(self: &${u(r)}) : vector<${i[2]}> {
114
- self.borrow_${a}().values()
115
- }`)),`public fun get_${a}(self: &${u(r)}, ${l}) : &${m} {
116
- self.borrow_${a}().${b}
113
+ public fun get_${i}_values(self: &${m(o)}) : vector<${u[2]}> {
114
+ self.borrow_${i}().values()
115
+ }`)),`public fun get_${i}(self: &${m(o)}, ${f}) : &${b} {
116
+ self.borrow_${i}().${$}
117
117
  }
118
- `+y}).join("")}
118
+ `+v}).join("")}
119
119
  // =========================================================================================================
120
120
 
121
121
 
122
- }`;await c(p,`${o}/contracts/${e}/sources/codegen/schemas/${r}.move`,"formatAndWriteMove")}console.log(`\u2705 Schema Structure Generation Complete
123
- `)}import{existsSync as L}from"fs";import{readFileSync as oe}from"fs";function se(e){let t=oe(e,"utf-8"),o=/\/\/ Logic that needs to be automated once the contract is deployed\s*\{([\s\S]*?)\}\s*;\s*\/\/ Authorize schemas and public share objects/,r=t.match(o);if(r)return r[1].trim();throw new Error("Logic and authorization block not found in the file.")}async function I(e,t){console.log(`
124
- \u{1F4DD} Starting Deploy Hook Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`);let o=Object.keys(e.schemas).map(a=>`_${a}: &mut ${u(a)}`).join(","),r=Object.keys(e.schemas).map(a=>`use ${e.name}::${a}_schema::${u(a)};`).join(`
125
- `),n=`${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`,p="";if(!L(n))p=`module ${e.name}::deploy_hook {
122
+ }`;await p(s,`${a}/contracts/${e}/sources/codegen/schemas/${o}.move`,"formatAndWriteMove")}console.log(`\u2705 Schema Structure Generation Complete
123
+ `)}import{existsSync as F}from"fs";import{readFileSync as se}from"fs";function ne(e){let t=se(e,"utf-8"),r=/\/\/ Logic that needs to be automated once the contract is deployed\s*\{([\s\S]*?)\}\s*;\s*\/\/ Authorize schemas and public share objects/,a=t.match(r);if(a)return a[1].trim();throw new Error("Logic and authorization block not found in the file.")}async function z(e,t){console.log(`
124
+ \u{1F4DD} Starting Deploy Hook Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`);let r=Object.keys(e.schemas).map(s=>`_${s}: &mut ${m(s)}`).join(","),a=Object.keys(e.schemas).map(s=>`use ${e.name}::${s}_schema::${m(s)};`).join(`
125
+ `),o=`${t}/contracts/${e.name}/sources/scripts/deploy_hook.move`,n="";if(!F(o))n=`module ${e.name}::deploy_hook {
126
126
  use std::ascii::string;
127
127
  use sui::clock::Clock;
128
128
  use ${e.name}::dapp_system;
129
- ${r}
129
+ ${a}
130
130
  public entry fun run(clock: &Clock, ctx: &mut TxContext) {
131
131
  // Create a dapp.
132
132
  let mut dapp = dapp_system::create(string(b"${e.name}"),string(b"${e.description}"), clock , ctx);
133
133
 
134
134
  // Create schemas
135
- ${Object.keys(e.schemas).map(a=>`let mut ${a} = ${e.name}::${a}_schema::create(ctx);`).join(`
135
+ ${Object.keys(e.schemas).map(s=>`let mut ${s} = ${e.name}::${s}_schema::create(ctx);`).join(`
136
136
  `)}
137
137
  // Logic that needs to be automated once the contract is deployed
138
138
  {
139
139
  };
140
140
  // Authorize schemas and public share objects
141
- ${Object.keys(e.schemas).map(a=>`
142
- dapp.add_schema<${u(a)}>(${a}, ctx);
141
+ ${Object.keys(e.schemas).map(s=>`
142
+ dapp.add_schema<${m(s)}>(${s}, ctx);
143
143
  `).join(`
144
144
  `)}
145
145
  sui::transfer::public_share_object(dapp);
146
146
  }
147
- }`;else{let a=se(n);p=`module ${e.name}::deploy_hook {
147
+ }`;else{let s=ne(o);n=`module ${e.name}::deploy_hook {
148
148
  use std::ascii::string;
149
149
  use sui::clock::Clock;
150
150
  use ${e.name}::dapp_system;
151
- ${r}
151
+ ${a}
152
152
  public entry fun run(clock: &Clock, ctx: &mut TxContext) {
153
153
  // Create a dapp.
154
154
  let mut dapp = dapp_system::create(string(b"${e.name}"),string(b"${e.description}"), clock , ctx);
155
155
 
156
156
  // Create schemas
157
- ${Object.keys(e.schemas).map(s=>`let mut ${s} = ${e.name}::${s}_schema::create(ctx);`).join(`
157
+ ${Object.keys(e.schemas).map(i=>`let mut ${i} = ${e.name}::${i}_schema::create(ctx);`).join(`
158
158
  `)}
159
159
  // Logic that needs to be automated once the contract is deployed
160
160
 
161
161
  {
162
- ${a}
162
+ ${s}
163
163
  };
164
164
 
165
165
  // Authorize schemas and public share objects
166
- ${Object.keys(e.schemas).map(s=>`
167
- dapp.add_schema<${u(s)}>(${s}, ctx);
166
+ ${Object.keys(e.schemas).map(i=>`
167
+ dapp.add_schema<${m(i)}>(${i}, ctx);
168
168
  `).join(`
169
169
  `)}
170
170
  sui::transfer::public_share_object(dapp);
171
171
  }
172
- }`}await c(p,n,"formatAndWriteMove"),console.log(`\u2705 Deploy Hook Generation Complete
173
- `)}async function F(e,t){if(!L(`${t}/contracts/${e.name}/sources/scripts/migrate.move`)){let o=`module ${e.name}::migrate {
172
+ }`}await p(n,o,"formatAndWriteMove"),console.log(`\u2705 Deploy Hook Generation Complete
173
+ `)}async function B(e,t){if(!F(`${t}/contracts/${e.name}/sources/scripts/migrate.move`)){let r=`module ${e.name}::migrate {
174
174
  const ON_CHAIN_VERSION: u32 = 1;
175
175
 
176
176
  public fun on_chain_version(): u32 {
177
177
  ON_CHAIN_VERSION
178
178
  }
179
179
  }
180
- `;await c(o,`${t}/contracts/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}function D(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}function ne(e,t,o){return o.data?o.data.map(r=>{let n=Object.keys(r)[0];return`use ${e}::${t}_${D(n)}::${n};`}).join(`
181
- `):""}async function z(e,t,o){console.log(`
182
- \u{1F4E6} Starting Schema Event Generation...`);for(let r in t){let n=t[r];if(n.events){console.log(` \u251C\u2500 Processing schema: ${r}`);for(let p of n.events){let a=Object.keys(p)[0],s=Object.values(p)[0];console.log(` \u2514\u2500 Generating ${a} event: ${s}`);let i=`module ${e}::${D(a)}_event {
180
+ `;await p(r,`${t}/contracts/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}function C(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}function ie(e,t){return t!=null?Object.keys(t).map(a=>`use ${e}::${C(a)}::${a};`).join(`
181
+ `):""}async function A(e,t,r,a){console.log(`
182
+ \u{1F4E6} Starting Schema Event Generation...`);for(let o of Object.keys(r)){let n=o,s=r[o];console.log(` \u2514\u2500 Generating ${n} event: ${s}`);let i=`module ${e}::${C(n)}_event {
183
183
  use sui::event;
184
184
  use std::ascii::String;
185
- ${ne(e,r,n)}
185
+ ${ie(e,t)}
186
186
 
187
- public struct ${a}Event has copy, drop {
188
- ${d(s)}
187
+ public struct ${n}Event has copy, drop {
188
+ ${l(s)}
189
189
  }
190
190
 
191
- public fun new(${d(s)}): ${a}Event {
192
- ${a}Event {
193
- ${f(s)}
191
+ public fun new(${l(s)}): ${n}Event {
192
+ ${n}Event {
193
+ ${_(s)}
194
194
  }
195
195
  }
196
196
 
197
- public fun emit(${d(s)}) {
198
- event::emit(${a}Event {
199
- ${f(s)}
197
+ public fun emit(${l(s)}) {
198
+ event::emit(${n}Event {
199
+ ${_(s)}
200
200
  });
201
- }`;await c(i,`${o}/contracts/${e}/sources/codegen/events/${D(a)}_event.move`,"formatAndWriteMove")}}}console.log(`\u2705 Schema Event Generation Complete
202
- `)}import{existsSync as ie}from"fs";import ce from"node:fs/promises";async function B(e,t){console.log(`
203
- \u2699\uFE0F Starting System Generation...`),console.log(" \u251C\u2500 Generating systems"),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/systems`),ie(`${t}/contracts/${e.name}/sources/systems`)||await ce.mkdir(`${t}/contracts/${e.name}/sources/systems`,{recursive:!0}),console.log(`\u2705 System Generation Complete
204
- `)}function H(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function K(e,t,o){console.log(`
205
- \u{1F4E6} Starting Schema Error Generation...`);for(let r in t){let n=t[r];if(n.errors){console.log(` \u251C\u2500 Processing schema: ${r}`);for(let p of n.errors){let a=Object.keys(p)[0],s=Object.values(p)[0];console.log(` \u2514\u2500 Generating ${a} message: ${s}`);let i=`module ${e}::${H(a)}_error {
201
+ }`;await p(i,`${a}/contracts/${e}/sources/codegen/events/${C(n)}_event.move`,"formatAndWriteMove")}console.log(`\u2705 Schema Event Generation Complete
202
+ `)}import{existsSync as ce}from"fs";import pe from"node:fs/promises";async function H(e,t){console.log(`
203
+ \u2699\uFE0F Starting System Generation...`),console.log(" \u251C\u2500 Generating systems"),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/systems`),ce(`${t}/contracts/${e.name}/sources/systems`)||await pe.mkdir(`${t}/contracts/${e.name}/sources/systems`,{recursive:!0}),console.log(`\u2705 System Generation Complete
204
+ `)}function K(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function Q(e,t,r){console.log(`
205
+ \u{1F4E6} Starting Schema Error Generation...`);for(let a of Object.keys(t)){let o=a,n=t[a];console.log(` \u2514\u2500 Generating ${o} message: ${n}`);let s=`module ${e}::${K(o)}_error {
206
206
  #[error]
207
- const ${a}: vector<u8> = b"${s}";
207
+ const ${o}: vector<u8> = b"${n}";
208
208
  /// Get the error message.
209
- public fun message(): vector<u8> { ${a} }
209
+ public fun message(): vector<u8> { ${o} }
210
210
  /// Abort execution with the given error code.
211
- public fun emit() { abort ${a} }
211
+ public fun emit() { abort ${o} }
212
212
  /// Require that the given condition is true, otherwise abort with the given error code.
213
- public fun require(condition: bool) { if (!condition) { emit() } }`;await c(i,`${o}/contracts/${e}/sources/codegen/errors/${H(a)}_error.move`,"formatAndWriteMove")}}}console.log(`\u2705 Schema Error Generation Complete
214
- `)}import{existsSync as k}from"fs";async function Q(e,t){await pe(e,t),await ue(e,t),await me(e,t)}async function pe(e,t){let o=`${t}/contracts/${e.name}/sources/codegen/schemas/default/dapp/metadata.move`;if(!k(o)){let r=`module ${e.name}::dapp_metadata {
213
+ public fun require(condition: bool) { if (!condition) { emit() } }`;await p(s,`${r}/contracts/${e}/sources/codegen/errors/${K(o)}_error.move`,"formatAndWriteMove")}console.log(`\u2705 Schema Error Generation Complete
214
+ `)}import{existsSync as M}from"fs";async function Z(e,t){await ue(e,t),await me(e,t),await le(e,t)}async function ue(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/schemas/default/dapp/metadata.move`;if(!M(r)){let a=`module ${e.name}::dapp_metadata {
215
215
  use std::ascii::String;
216
216
 
217
217
  public struct DappMetadata has drop, copy, store {
@@ -307,7 +307,7 @@ ${e.name} = "0x0"
307
307
  }
308
308
 
309
309
  }
310
- `;await c(r,o,"formatAndWriteMove")}}async function ue(e,t){let o=`${t}/contracts/${e.name}/sources/codegen/schemas/default/dapp/schema.move`;if(!k(o)){let r=`module ${e.name}::dapp_schema {
310
+ `;await p(a,r,"formatAndWriteMove")}}async function me(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/schemas/default/dapp/schema.move`;if(!M(r)){let a=`module ${e.name}::dapp_schema {
311
311
  use ${e.name}::dapp_metadata::DappMetadata;
312
312
  use dubhe::storage_value;
313
313
  use dubhe::storage_value::StorageValue;
@@ -407,7 +407,7 @@ ${e.name} = "0x0"
407
407
  id.delete();
408
408
  }
409
409
  }
410
- `;await c(r,o,"formatAndWriteMove")}}async function me(e,t){let o=`${t}/contracts/${e.name}/sources/codegen/schemas/default/dapp/system.move`;if(!k(o)){let r=`module ${e.name}::dapp_system {
410
+ `;await p(a,r,"formatAndWriteMove")}}async function le(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/schemas/default/dapp/system.move`;if(!M(r)){let a=`module ${e.name}::dapp_system {
411
411
  use std::ascii::String;
412
412
  use std::ascii;
413
413
  use dubhe::type_info;
@@ -488,8 +488,8 @@ ${e.name} = "0x0"
488
488
  }
489
489
  }
490
490
 
491
- `;await c(r,o,"formatAndWriteMove")}}async function Z(e,t){console.log(`
492
- \u{1F4DD} Starting Init Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/tests/init.move`);let o=`module ${e.name}::init_test {
491
+ `;await p(a,r,"formatAndWriteMove")}}async function q(e,t){console.log(`
492
+ \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 {
493
493
  use ${e.name}::dapp_schema::Dapp;
494
494
  use sui::clock;
495
495
  use sui::test_scenario;
@@ -506,8 +506,8 @@ ${e.name} = "0x0"
506
506
  (scenario, dapp)
507
507
  }
508
508
  }
509
- `;await c(o,`${t}/contracts/${e.name}/sources/tests/init.move`,"formatAndWriteMove"),console.log(`\u2705 Deploy Hook Generation Complete
510
- `)}async function $t(e,t,o){console.log(`
511
- \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: ${o||"testnet"}`);let r=t??process.cwd();C(`${r}/contracts/${e.name}`)&&x(`${r}/contracts/${e.name}/sources/codegen`),C(`${r}/contracts/${e.name}/Move.toml`)||await V(e,r),C(`${r}/contracts/${e.name}/sources/script/deploy_hook.move`)||await I(e,r),await E(e.name,e.schemas,r),await U(e.name,e.schemas,r),await z(e.name,e.schemas,r),await K(e.name,e.schemas,r),await Q(e,r),await Z(e,r),await B(e,r),await F(e,r),console.log(`\u2705 Schema Generation Process Complete!
512
- `)}import{findUp as de}from"find-up";import A from"path";import le from"esbuild";var w=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as ge}from"fs";import{pathToFileURL as _e}from"url";import fe from"os";var be=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],M="dubhe.config.example.mjs";async function At(e){e=await q(e);try{return await le.build({entryPoints:[e],format:"esm",outfile:M,platform:"node",bundle:!0,packages:"external"}),e=await q(M,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{ge(M,{force:!0})}}async function q(e,t){return e===void 0?e=await $e():A.isAbsolute(e)||(e=A.join(process.cwd(),e),e=A.normalize(e)),t&&fe.platform()==="win32"?_e(e).href:e}async function $e(){let e=await de(be);if(e===void 0)throw new w;return e}export{c as formatAndWriteMove,je as formatAndWriteTypescript,j as formatMove,T as formatTypescript,At as loadConfig,Oe as posixPath,q as resolveConfigPath,$t as schemaGen};
509
+ `;await p(r,`${t}/contracts/${e.name}/sources/tests/init.move`,"formatAndWriteMove"),console.log(`\u2705 Deploy Hook Generation Complete
510
+ `)}async function ht(e,t,r){console.log(`
511
+ \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();j(`${a}/contracts/${e.name}`)&&D(`${a}/contracts/${e.name}/sources/codegen`),j(`${a}/contracts/${e.name}/Move.toml`)||await L(e,a),j(`${a}/contracts/${e.name}/sources/script/deploy_hook.move`)||await z(e,a),e.events&&(e.data?await A(e.name,e.data,e.events,a):await A(e.name,null,e.events,a)),e.data?(await I(e.name,e.data,a),await k(e.name,e.data,e.schemas,a)):await k(e.name,null,e.schemas,a),e.errors&&await Q(e.name,e.errors,a),await Z(e,a),await q(e,a),await H(e,a),await B(e,a),console.log(`\u2705 Schema Generation Process Complete!
512
+ `)}import{findUp as de}from"find-up";import T from"path";import ge from"esbuild";var y=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as _e}from"fs";import{pathToFileURL as fe}from"url";import be from"os";var $e=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],R="dubhe.config.example.mjs";async function Mt(e){e=await X(e);try{return await ge.build({entryPoints:[e],format:"esm",outfile:R,platform:"node",bundle:!0,packages:"external"}),e=await X(R,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{_e(R,{force:!0})}}async function X(e,t){return e===void 0?e=await he():T.isAbsolute(e)||(e=T.join(process.cwd(),e),e=T.normalize(e)),t&&be.platform()==="win32"?fe(e).href:e}async function he(){let e=await de($e);if(e===void 0)throw new y;return e}export{p as formatAndWriteMove,Te as formatAndWriteTypescript,G as formatMove,O as formatTypescript,Mt as loadConfig,Ge as posixPath,X as resolveConfigPath,ht as schemaGen};
513
513
  //# 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"],"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), unused_let_mut)]`\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(\"deploy_hook\")) {\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 await generateSchemaData(config.name, config.schemas, path);\n await generateSchemaStructure(config.name, config.schemas, path);\n await generateSchemaEvent(config.name, config.schemas, path);\n await generateSchemaError(config.name, config.schemas, path);\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","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.0.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, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\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\tschemas: Record<string, SchemaType>,\n\tpath: string,\n) {\n\tconsole.log('\\n📦 Starting Schema Data Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconst schema = schemas[schemaName];\n\t\tif (schema.data) {\n\t\t\tconsole.log(` ├─ Processing schema: ${schemaName}`);\n\t\t\tfor (const item of schema.data) {\n\t\t\t\tconst name = Object.keys(item)[0];\n\t\t\t\tconst fields = Object.values(item)[0];\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 = schema.data\n\t\t\t\t\t.filter(item => Array.isArray(Object.values(item)[0]))\n\t\t\t\t\t.map(item => Object.keys(item)[0]);\n\n\t\t\t\tif (Array.isArray(fields)) {\n\t\t\t\t\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\tname,\n\t\t\t\t\t)} {\n public enum ${name} has copy, drop , store {\n ${fields}\n }\n \n ${fields\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}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\tname,\n\t\t\t\t\t)} {\n use std::ascii::String;\n ${enumNames\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\tname =>\n\t\t\t\t\t\t\t\t`use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t)}::${name};`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join('\\n')}\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/schemas/${schemaName}_${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\t\t}\n\t}\n\tconsole.log('✅ Schema Data Generation Complete\\n');\n}\n\nfunction generateImport(\n\tprojectName: string,\n\tschemaName: string,\n\tschema: SchemaType,\n) {\n\tif (schema.data) {\n\t\treturn schema.data\n\t\t\t.map(item => {\n\t\t\t\tconst name = Object.keys(item)[0]\n\t\t\t\treturn `use ${projectName}::${schemaName}_${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\tschemas: Record<string, SchemaType>,\n\tpath: string,\n) {\n\tconsole.log('\\n🔨 Starting Schema Structure Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconsole.log(` ├─ Generating schema: ${schemaName}`);\n\t\tconsole.log(\n\t\t\t` ├─ Output path: ${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`,\n\t\t);\n\t\tconsole.log(\n\t\t\t` └─ Structure fields: ${\n\t\t\t\tObject.keys(schemas[schemaName].structure).length\n\t\t\t}`,\n\t\t);\n\t\tconst schema = schemas[schemaName];\n\t\tconst schemaMoudle = `module ${projectName}::${schemaName}_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_migration;\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 use sui::sui::SUI;\n use sui::coin::Coin;\n \t\t\t\tuse sui::balance::Balance;\n ${generateImport(projectName, schemaName, schema)}\n\n public struct ${capitalizeAndRemoveUnderscores(\n\t\t\tschemaName,\n\t\t)} has key, store {\n id: UID\n\t\t\t\t\t\t\t\t\t\t\t} \n \n ${Object.entries(schema.structure)\n\t\t\t.map(([key, value]) => {\n\t\t\t\treturn `public fun borrow_${key}(self: &${capitalizeAndRemoveUnderscores(\n\t\t\t\t\tschemaName,\n\t\t\t\t)}) : &${value} {\n storage_migration::borrow_field(&self.id, b\"${key}\")\n }\n \n public(package) fun ${key}(self: &mut ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\tschemaName,\n\t\t\t\t)}): &mut ${value} {\n storage_migration::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): ${capitalizeAndRemoveUnderscores(\n\t\t\tschemaName,\n\t\t)} {\n let mut id = object::new(ctx);\n ${Object.entries(schema.structure)\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()`;\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tstorage_type = `storage_map::new()`;\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()`;\n\t\t\t\t}\n\t\t\t\treturn `storage_migration::add_field<${value}>(&mut id, b\"${key}\", ${storage_type});`;\n\t\t\t})\n\t\t\t.join('')}\n \n ${capitalizeAndRemoveUnderscores(schemaName)} { id }\n }\n \n public fun migrate(_${schemaName}: &mut ${capitalizeAndRemoveUnderscores(schemaName)}, _cap: &UpgradeCap) { }\n\n \n \n // ======================================== View Functions ========================================\n ${Object.entries(schema.structure)\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\tlet extra_code = '';\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 = 'borrow()';\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 = 'borrow(key)';\n\t\t\t\t\tif (!value.includes('Balance') && !value.includes('Coin')) {\n\t\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[0]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[1]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().values()\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t\t}\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 = 'borrow(key1, key2)';\n\t\t\t\t\tif (!value.includes('Balance') && !value.includes('Coin')) {\n\t\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : (vector<${all_types[0]}>, vector<${all_types[1]}>) {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[2]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().values()\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn `public fun get_${key}(self: &${capitalizeAndRemoveUnderscores(schemaName)}, ${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\t\t\t\t\t` + extra_code;\n\t\t\t})\n\t\t\t.join('')} \n // =========================================================================================================\n \n \n }`;\n\t\tawait formatAndWriteMove(\n\t\t\tschemaMoudle,\n\t\t\t`${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`,\n\t\t\t'formatAndWriteMove',\n\t\t);\n\t}\n\tconsole.log('✅ Schema Structure Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nimport { readFileSync } from 'fs';\n\nexport function extractLogicAndAuthorizationContent(filePath: string): string {\n\tconst fileContent = readFileSync(filePath, 'utf-8');\n\tconst logicAndAuthRegex = /\\/\\/ Logic that needs to be automated once the contract is deployed\\s*\\{([\\s\\S]*?)\\}\\s*;\\s*\\/\\/ Authorize schemas and public share objects/;\n\tconst match = fileContent.match(logicAndAuthRegex);\n\n\tif (match) {\n\t\treturn match[1].trim();\n\t} else {\n\t\tthrow new Error('Logic and authorization block not found in the file.');\n\t}\n}\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 schemas = Object.keys(config.schemas).map(schemaName => { return `_${schemaName}: &mut ${capitalizeAndRemoveUnderscores(schemaName)}`}).join(',')\n\tconst importSchemas = Object.keys(config.schemas).map(schemaName => { return `use ${config.name}::${schemaName}_schema::${capitalizeAndRemoveUnderscores(schemaName)};`}).join('\\n')\n\tconst path = `${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`;\n\tlet code = '';\n\tif (!existsSync(path)) {\n\t\tcode = `module ${config.name}::deploy_hook {\n\t\t\tuse std::ascii::string;\n\t\t\tuse sui::clock::Clock;\n\t\t\tuse ${config.name}::dapp_system;\n\t\t ${importSchemas}\n\t\t public entry fun run(clock: &Clock, ctx: &mut TxContext) {\n\t\t // Create a dapp.\n \t let mut dapp = dapp_system::create(string(b\"${config.name}\"),string(b\"${config.description}\"), clock , ctx);\n \n\t\t // Create schemas\n\t\t\t${Object.keys(config.schemas).map(schemaName => {\n\t\t\t\treturn `let mut ${schemaName} = ${config.name}::${schemaName}_schema::create(ctx);`;\n\t\t\t}).join('\\n')}\n\t\t\t// Logic that needs to be automated once the contract is deployed\n\t\t\t{\n\t\t\t};\n\t\t\t// Authorize schemas and public share objects\n\t\t\t${Object.keys(config.schemas).map(schemaName => {\n\t\t\t\t\treturn `\n\t\t\t\t\t dapp.add_schema<${capitalizeAndRemoveUnderscores(schemaName)}>(${schemaName}, ctx);\n\t\t\t\t\t `;\n\t\t\t\t}).join('\\n')}\n\t\t\t sui::transfer::public_share_object(dapp);\n\t\t }\n}` } else {\n\t\tconst content = extractLogicAndAuthorizationContent(path);\n\t\tcode = `module ${config.name}::deploy_hook {\n\t\t\tuse std::ascii::string;\n\t\t\tuse sui::clock::Clock;\n\t\t\tuse ${config.name}::dapp_system;\n\t\t ${importSchemas}\n\t\t public entry fun run(clock: &Clock, ctx: &mut TxContext) {\n\t\t // Create a dapp.\n \t let mut dapp = dapp_system::create(string(b\"${config.name}\"),string(b\"${config.description}\"), clock , ctx);\n \n\t\t // Create schemas\n\t\t\t${Object.keys(config.schemas).map(schemaName => {\n\t\t\treturn `let mut ${schemaName} = ${config.name}::${schemaName}_schema::create(ctx);`;\n\t\t}).join('\\n')}\n\t\t\t// Logic that needs to be automated once the contract is deployed\n\t\t\t\n\t\t\t{\n\t\t\t${content}\n\t\t\t};\n\t\t\t\n\t\t\t// Authorize schemas and public share objects\n\t\t\t${Object.keys(config.schemas).map(schemaName => {\n\t\t\treturn `\n\t\t\t\t\t dapp.add_schema<${capitalizeAndRemoveUnderscores(schemaName)}>(${schemaName}, ctx);\n\t\t\t\t\t `;\n\t\t}).join('\\n')}\n\t\t\t sui::transfer::public_share_object(dapp);\n\t\t }\n}`\n\t}\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\tpath,\n\t\t'formatAndWriteMove'\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, 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\tschemaName: string,\n\tschema: SchemaType,\n) {\n\tif (schema.data) {\n\t\treturn schema.data\n\t\t\t.map(item => {\n\t\t\t\tconst name = Object.keys(item)[0]\n\t\t\t\treturn `use ${projectName}::${schemaName}_${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\tschemas: Record<string, SchemaType>,\n\tpath: string\n) {\n\tconsole.log('\\n📦 Starting Schema Event Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconst schema = schemas[schemaName];\n\t\tif (schema.events) {\n\t\t\tconsole.log(` ├─ Processing schema: ${schemaName}`);\n\t\t\tfor (const item of schema.events) {\n\t\t\t\tconst name = Object.keys(item)[0];\n\t\t\t\tconst fields = Object.values(item)[0];\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, schemaName, schema)}\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 public fun emit(${getStructAttrsWithType(fields as Record<string, string>)}) {\n event::emit(${name}Event {\n ${getStructAttrs(fields as Record<string, string>)}\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/events/${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\t\t}\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, 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\tschemas: Record<string, SchemaType>,\n\tpath: string\n) {\n\tconsole.log('\\n📦 Starting Schema Error Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconst schema = schemas[schemaName];\n\t\tif (schema.errors) {\n\t\t\tconsole.log(` ├─ Processing schema: ${schemaName}`);\n\t\t\tfor (const item of schema.errors) {\n\t\t\t\tconst name = Object.keys(item)[0]\n\t\t\t\tconst message = Object.values(item)[0]\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${name} message: ${message}`);\n\t\t\t\tlet\tcode = `module ${projectName}::${convertToSnakeCase(name)}_error {\n\t\t\t\t\t\t#[error]\n\t\t\t\t\t\tconst ${name}: vector<u8> = b\"${message}\";\n\t\t\t\t\t\t/// Get the error message.\n public fun message(): vector<u8> { ${name} }\n /// Abort execution with the given error code.\n public fun emit() { abort ${name} }\n /// Require that the given condition is true, otherwise abort with the given error code.\n\t\t\t\t\t\tpublic fun require(condition: bool) { if (!condition) { emit() } }`\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/errors/${convertToSnakeCase(\n\t\t\t\t\t\tname\n\t\t\t\t\t)}_error.move`,\n\t\t\t\t\t'formatAndWriteMove'\n\t\t\t\t);\n\t\t\t}\n\t\t}\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/schemas/default/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/schemas/default/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_migration;\n use sui::transfer::public_share_object;\n use dubhe::type_info;\n\n public struct Dapp has key, store { id: UID }\n\n public fun borrow_admin(self: &Dapp): &StorageValue<address> {\n storage_migration::borrow_field(&self.id, b\"admin\")\n }\n\n public(package) fun borrow_mut_admin(self: &mut Dapp): &mut StorageValue<address> {\n storage_migration::borrow_mut_field(&mut self.id, b\"admin\")\n }\n\n public fun borrow_package_id(self: &Dapp): &StorageValue<address> {\n storage_migration::borrow_field(&self.id, b\"package_id\")\n }\n\n public(package) fun borrow_mut_package_id(self: &mut Dapp): &mut StorageValue<address> {\n storage_migration::borrow_mut_field(&mut self.id, b\"package_id\")\n }\n\n public fun borrow_version(self: &Dapp): &StorageValue<u32> {\n storage_migration::borrow_field(&self.id, b\"version\")\n }\n\n public(package) fun borrow_mut_version(self: &mut Dapp): &mut StorageValue<u32> {\n storage_migration::borrow_mut_field(&mut self.id, b\"version\")\n }\n\n public fun borrow_metadata(self: &Dapp): &StorageValue<DappMetadata> {\n storage_migration::borrow_field(&self.id, b\"metadata\")\n }\n\n public(package) fun borrow_mut_metadata(self: &mut Dapp): &mut StorageValue<DappMetadata> {\n storage_migration::borrow_mut_field(&mut self.id, b\"metadata\")\n }\n\n public fun borrow_schemas(self: &Dapp): &StorageValue<vector<address>> {\n storage_migration::borrow_field(&self.id, b\"schemas\")\n }\n\n public(package) fun borrow_mut_schemas(self: &mut Dapp): &mut StorageValue<vector<address>> {\n storage_migration::borrow_mut_field(&mut self.id, b\"schemas\")\n }\n\n public fun borrow_safe_mode(self: &Dapp): &StorageValue<bool> {\n storage_migration::borrow_field(&self.id, b\"safe_mode\")\n }\n\n public(package) fun borrow_mut_safe_mode(self: &mut Dapp): &mut StorageValue<bool> {\n storage_migration::borrow_mut_field(&mut self.id, b\"safe_mode\")\n }\n\n public(package) fun create(ctx: &mut TxContext): Dapp {\n let mut id = object::new(ctx);\n storage_migration::add_field<StorageValue<address>>(&mut id, b\"admin\", storage_value::new());\n storage_migration::add_field<StorageValue<address>>(&mut id, b\"package_id\", storage_value::new());\n storage_migration::add_field<StorageValue<u32>>(&mut id, b\"version\", storage_value::new());\n storage_migration::add_field<StorageValue<DappMetadata>>(&mut id, b\"metadata\", storage_value::new());\n storage_migration::add_field<StorageValue<vector<address>>>(&mut id, b\"schemas\", storage_value::new());\n storage_migration::add_field<StorageValue<bool>>(&mut id, b\"safe_mode\", storage_value::new());\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\n let new_package_id = type_info::current_package_id<DappKey>();\n dapp.borrow_mut_package_id().set(new_package_id);\n dapp.borrow_mut_version().mutate!(|version| {\n *version = *version + 1;\n });\n }\n\n public(package) fun add_schema<Schema: key + store>(dapp: &mut Dapp, schema: Schema, ctx: &TxContext) {\n assert!(dapp.borrow_metadata().contains(), 0);\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n\n let schema_id = object::id_address(&schema);\n dapp.borrow_mut_schemas().borrow_mut().push_back(schema_id);\n public_share_object(schema);\n }\n\n #[test_only]\n public fun create_dapp_for_testing(ctx: &mut TxContext): Dapp {\n create(ctx)\n }\n\n #[test_only]\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/schemas/default/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\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.borrow_mut_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.borrow_mut_package_id().set(package_id);\n dapp.borrow_mut_admin().set(ctx.sender());\n dapp.borrow_mut_version().set(1);\n dapp.borrow_mut_safe_mode().set(false);\n dapp.borrow_mut_schemas().set(vector[]);\n dapp\n }\n\n public entry fun set_metadata(dapp: &mut Dapp, name: String, description: String, icon_url: String, website_url: String, partners: vector<String>, ctx: &TxContext) {\n assert!(dapp.borrow_admin().contains(), 0);\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n let created_at = dapp.borrow_mut_metadata().take().get_created_at();\n dapp.borrow_mut_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 assert!(dapp.borrow_admin().contains(), 0);\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n\n dapp.borrow_mut_admin().set(new_admin);\n }\n\n public entry fun set_safe_mode(dapp: &mut Dapp, safe_mode: bool, ctx: &TxContext) {\n assert!(dapp.borrow_admin().contains(), 0);\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n\n dapp.borrow_mut_safe_mode().set(safe_mode);\n }\n\n public fun ensure_no_safe_mode(dapp: &Dapp) {\n assert!(!dapp.borrow_safe_mode().get(), 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\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 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}::deploy_hook::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\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/tests/init.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\n\tconsole.log('✅ Deploy Hook 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}"],"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","generateToml","config","srcPrefix","code","formatAndWriteMove","capitalizeAndRemoveUnderscores","input","word","index","renderSetAttrsFunc","schemaName","fields","key","type","renderSetFunc","getStructAttrsWithType","fieldName","renderGetAllFunc","getStructTypes","getStructAttrsQuery","renderGetAttrsFunc","convertToSnakeCase","generateSchemaData","projectName","schemas","path","schema","item","name","code","enumNames","field","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemaMoudle","value","storage_type","all_types","para_key","para_value","borrow_key","extra_code","existsSync","readFileSync","extractLogicAndAuthorizationContent","filePath","fileContent","logicAndAuthRegex","match","generateDeployHook","config","srcPrefix","schemas","schemaName","capitalizeAndRemoveUnderscores","importSchemas","path","code","existsSync","content","formatAndWriteMove","generateMigrate","convertToSnakeCase","input","generateImport","projectName","schemaName","schema","item","name","generateSchemaEvent","schemas","path","fields","code","getStructAttrsWithType","getStructAttrs","formatAndWriteMove","existsSync","fs","generateSystem","config","srcPrefix","convertToSnakeCase","input","generateSchemaError","projectName","schemas","path","schemaName","schema","item","name","message","code","formatAndWriteMove","existsSync","generateDefaultSchema","config","srcPrefix","generateDappSchemaMetadata","generateDappSchema","generateDappSystem","path","code","formatAndWriteMove","generateInit","config","srcPrefix","code","formatAndWriteMove","schemaGen","config","srcPrefix","network","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSchemaData","generateSchemaStructure","generateSchemaEvent","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"]}
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"],"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), unused_let_mut)]`\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(\"deploy_hook\")) {\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","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.0.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,\n} from './common';\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\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 ${fields}\n }\n \n ${fields\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 ${enumNames\n\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\tname =>\n\t\t\t\t\t\t\t\t`use ${projectName}::${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t)}::${name};`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join('\\n')}\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\tfor (const schemaName in schemas) {\n\t\tconsole.log(` ├─ Generating schema: ${schemaName}`);\n\t\tconsole.log(\n\t\t\t` ├─ Output path: ${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`,\n\t\t);\n\t\tconsole.log(\n\t\t\t` └─ Structure fields: ${\n\t\t\t\tObject.values(schemas[schemaName]).length\n\t\t\t}`,\n\t\t);\n\t\tconst schema = schemas[schemaName];\n\t\tconst schemaMoudle = `module ${projectName}::${schemaName}_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_migration;\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 use sui::sui::SUI;\n use sui::coin::Coin;\n \t\t\t\tuse sui::balance::Balance;\n ${generateImport(projectName, data)}\n\n public struct ${capitalizeAndRemoveUnderscores(\n\t\t\tschemaName,\n\t\t)} has key, store {\n id: UID\n\t\t\t\t\t\t\t\t\t\t\t} \n \n ${Object.entries(schema)\n\t\t\t.map(([key, value]) => {\n\t\t\t\treturn `public fun borrow_${key}(self: &${capitalizeAndRemoveUnderscores(\n\t\t\t\t\tschemaName,\n\t\t\t\t)}) : &${value} {\n storage_migration::borrow_field(&self.id, b\"${key}\")\n }\n \n public(package) fun ${key}(self: &mut ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\tschemaName,\n\t\t\t\t)}): &mut ${value} {\n storage_migration::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): ${capitalizeAndRemoveUnderscores(\n\t\t\tschemaName,\n\t\t)} {\n let mut id = object::new(ctx);\n ${Object.entries(schema)\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()`;\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tstorage_type = `storage_map::new()`;\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()`;\n\t\t\t\t}\n\t\t\t\treturn `storage_migration::add_field<${value}>(&mut id, b\"${key}\", ${storage_type});`;\n\t\t\t})\n\t\t\t.join('')}\n \n ${capitalizeAndRemoveUnderscores(schemaName)} { id }\n }\n \n public fun migrate(_${schemaName}: &mut ${capitalizeAndRemoveUnderscores(schemaName)}, _cap: &UpgradeCap) { }\n\n \n \n // ======================================== View Functions ========================================\n ${Object.entries(schema)\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\tlet extra_code = '';\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 = 'borrow()';\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 = 'borrow(key)';\n\t\t\t\t\tif (!value.includes('Balance') && !value.includes('Coin')) {\n\t\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[0]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[1]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().values()\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t\t}\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 = 'borrow(key1, key2)';\n\t\t\t\t\tif (!value.includes('Balance') && !value.includes('Coin')) {\n\t\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : (vector<${all_types[0]}>, vector<${all_types[1]}>) {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[2]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().values()\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn `public fun get_${key}(self: &${capitalizeAndRemoveUnderscores(schemaName)}, ${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\t\t\t\t\t` + extra_code;\n\t\t\t})\n\t\t\t.join('')} \n // =========================================================================================================\n \n \n }`;\n\t\tawait formatAndWriteMove(\n\t\t\tschemaMoudle,\n\t\t\t`${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`,\n\t\t\t'formatAndWriteMove',\n\t\t);\n\t}\n\tconsole.log('✅ Schema Structure Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nimport { readFileSync } from 'fs';\n\nexport function extractLogicAndAuthorizationContent(filePath: string): string {\n\tconst fileContent = readFileSync(filePath, 'utf-8');\n\tconst logicAndAuthRegex = /\\/\\/ Logic that needs to be automated once the contract is deployed\\s*\\{([\\s\\S]*?)\\}\\s*;\\s*\\/\\/ Authorize schemas and public share objects/;\n\tconst match = fileContent.match(logicAndAuthRegex);\n\n\tif (match) {\n\t\treturn match[1].trim();\n\t} else {\n\t\tthrow new Error('Logic and authorization block not found in the file.');\n\t}\n}\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 schemas = Object.keys(config.schemas).map(schemaName => { return `_${schemaName}: &mut ${capitalizeAndRemoveUnderscores(schemaName)}`}).join(',')\n\tconst importSchemas = Object.keys(config.schemas).map(schemaName => { return `use ${config.name}::${schemaName}_schema::${capitalizeAndRemoveUnderscores(schemaName)};`}).join('\\n')\n\tconst path = `${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`;\n\tlet code = '';\n\tif (!existsSync(path)) {\n\t\tcode = `module ${config.name}::deploy_hook {\n\t\t\tuse std::ascii::string;\n\t\t\tuse sui::clock::Clock;\n\t\t\tuse ${config.name}::dapp_system;\n\t\t ${importSchemas}\n\t\t public entry fun run(clock: &Clock, ctx: &mut TxContext) {\n\t\t // Create a dapp.\n \t let mut dapp = dapp_system::create(string(b\"${config.name}\"),string(b\"${config.description}\"), clock , ctx);\n \n\t\t // Create schemas\n\t\t\t${Object.keys(config.schemas).map(schemaName => {\n\t\t\t\treturn `let mut ${schemaName} = ${config.name}::${schemaName}_schema::create(ctx);`;\n\t\t\t}).join('\\n')}\n\t\t\t// Logic that needs to be automated once the contract is deployed\n\t\t\t{\n\t\t\t};\n\t\t\t// Authorize schemas and public share objects\n\t\t\t${Object.keys(config.schemas).map(schemaName => {\n\t\t\t\t\treturn `\n\t\t\t\t\t dapp.add_schema<${capitalizeAndRemoveUnderscores(schemaName)}>(${schemaName}, ctx);\n\t\t\t\t\t `;\n\t\t\t\t}).join('\\n')}\n\t\t\t sui::transfer::public_share_object(dapp);\n\t\t }\n}` } else {\n\t\tconst content = extractLogicAndAuthorizationContent(path);\n\t\tcode = `module ${config.name}::deploy_hook {\n\t\t\tuse std::ascii::string;\n\t\t\tuse sui::clock::Clock;\n\t\t\tuse ${config.name}::dapp_system;\n\t\t ${importSchemas}\n\t\t public entry fun run(clock: &Clock, ctx: &mut TxContext) {\n\t\t // Create a dapp.\n \t let mut dapp = dapp_system::create(string(b\"${config.name}\"),string(b\"${config.description}\"), clock , ctx);\n \n\t\t // Create schemas\n\t\t\t${Object.keys(config.schemas).map(schemaName => {\n\t\t\treturn `let mut ${schemaName} = ${config.name}::${schemaName}_schema::create(ctx);`;\n\t\t}).join('\\n')}\n\t\t\t// Logic that needs to be automated once the contract is deployed\n\t\t\t\n\t\t\t{\n\t\t\t${content}\n\t\t\t};\n\t\t\t\n\t\t\t// Authorize schemas and public share objects\n\t\t\t${Object.keys(config.schemas).map(schemaName => {\n\t\t\treturn `\n\t\t\t\t\t dapp.add_schema<${capitalizeAndRemoveUnderscores(schemaName)}>(${schemaName}, ctx);\n\t\t\t\t\t `;\n\t\t}).join('\\n')}\n\t\t\t sui::transfer::public_share_object(dapp);\n\t\t }\n}`\n\t}\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\tpath,\n\t\t'formatAndWriteMove'\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 public fun emit(${getStructAttrsWithType(fields as Record<string, string>)}) {\n event::emit(${name}Event {\n ${getStructAttrs(fields as Record<string, string>)}\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/events/${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\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\tfor (const key of Object.keys(errors)) {\n\t\t\t\tconst name = key\n\t\t\t\tconst message = errors[key]\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${name} message: ${message}`);\n\t\t\t\tlet\tcode = `module ${projectName}::${convertToSnakeCase(name)}_error {\n\t\t\t\t\t\t#[error]\n\t\t\t\t\t\tconst ${name}: vector<u8> = b\"${message}\";\n\t\t\t\t\t\t/// Get the error message.\n public fun message(): vector<u8> { ${name} }\n /// Abort execution with the given error code.\n public fun emit() { abort ${name} }\n /// Require that the given condition is true, otherwise abort with the given error code.\n\t\t\t\t\t\tpublic fun require(condition: bool) { if (!condition) { emit() } }`\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/errors/${convertToSnakeCase(\n\t\t\t\t\t\tname\n\t\t\t\t\t)}_error.move`,\n\t\t\t\t\t'formatAndWriteMove'\n\t\t\t\t);\n\t\t\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/schemas/default/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/schemas/default/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_migration;\n use sui::transfer::public_share_object;\n use dubhe::type_info;\n\n public struct Dapp has key, store { id: UID }\n\n public fun borrow_admin(self: &Dapp): &StorageValue<address> {\n storage_migration::borrow_field(&self.id, b\"admin\")\n }\n\n public(package) fun borrow_mut_admin(self: &mut Dapp): &mut StorageValue<address> {\n storage_migration::borrow_mut_field(&mut self.id, b\"admin\")\n }\n\n public fun borrow_package_id(self: &Dapp): &StorageValue<address> {\n storage_migration::borrow_field(&self.id, b\"package_id\")\n }\n\n public(package) fun borrow_mut_package_id(self: &mut Dapp): &mut StorageValue<address> {\n storage_migration::borrow_mut_field(&mut self.id, b\"package_id\")\n }\n\n public fun borrow_version(self: &Dapp): &StorageValue<u32> {\n storage_migration::borrow_field(&self.id, b\"version\")\n }\n\n public(package) fun borrow_mut_version(self: &mut Dapp): &mut StorageValue<u32> {\n storage_migration::borrow_mut_field(&mut self.id, b\"version\")\n }\n\n public fun borrow_metadata(self: &Dapp): &StorageValue<DappMetadata> {\n storage_migration::borrow_field(&self.id, b\"metadata\")\n }\n\n public(package) fun borrow_mut_metadata(self: &mut Dapp): &mut StorageValue<DappMetadata> {\n storage_migration::borrow_mut_field(&mut self.id, b\"metadata\")\n }\n\n public fun borrow_schemas(self: &Dapp): &StorageValue<vector<address>> {\n storage_migration::borrow_field(&self.id, b\"schemas\")\n }\n\n public(package) fun borrow_mut_schemas(self: &mut Dapp): &mut StorageValue<vector<address>> {\n storage_migration::borrow_mut_field(&mut self.id, b\"schemas\")\n }\n\n public fun borrow_safe_mode(self: &Dapp): &StorageValue<bool> {\n storage_migration::borrow_field(&self.id, b\"safe_mode\")\n }\n\n public(package) fun borrow_mut_safe_mode(self: &mut Dapp): &mut StorageValue<bool> {\n storage_migration::borrow_mut_field(&mut self.id, b\"safe_mode\")\n }\n\n public(package) fun create(ctx: &mut TxContext): Dapp {\n let mut id = object::new(ctx);\n storage_migration::add_field<StorageValue<address>>(&mut id, b\"admin\", storage_value::new());\n storage_migration::add_field<StorageValue<address>>(&mut id, b\"package_id\", storage_value::new());\n storage_migration::add_field<StorageValue<u32>>(&mut id, b\"version\", storage_value::new());\n storage_migration::add_field<StorageValue<DappMetadata>>(&mut id, b\"metadata\", storage_value::new());\n storage_migration::add_field<StorageValue<vector<address>>>(&mut id, b\"schemas\", storage_value::new());\n storage_migration::add_field<StorageValue<bool>>(&mut id, b\"safe_mode\", storage_value::new());\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\n let new_package_id = type_info::current_package_id<DappKey>();\n dapp.borrow_mut_package_id().set(new_package_id);\n dapp.borrow_mut_version().mutate!(|version| {\n *version = *version + 1;\n });\n }\n\n public(package) fun add_schema<Schema: key + store>(dapp: &mut Dapp, schema: Schema, ctx: &TxContext) {\n assert!(dapp.borrow_metadata().contains(), 0);\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n\n let schema_id = object::id_address(&schema);\n dapp.borrow_mut_schemas().borrow_mut().push_back(schema_id);\n public_share_object(schema);\n }\n\n #[test_only]\n public fun create_dapp_for_testing(ctx: &mut TxContext): Dapp {\n create(ctx)\n }\n\n #[test_only]\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/schemas/default/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\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.borrow_mut_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.borrow_mut_package_id().set(package_id);\n dapp.borrow_mut_admin().set(ctx.sender());\n dapp.borrow_mut_version().set(1);\n dapp.borrow_mut_safe_mode().set(false);\n dapp.borrow_mut_schemas().set(vector[]);\n dapp\n }\n\n public entry fun set_metadata(dapp: &mut Dapp, name: String, description: String, icon_url: String, website_url: String, partners: vector<String>, ctx: &TxContext) {\n assert!(dapp.borrow_admin().contains(), 0);\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n let created_at = dapp.borrow_mut_metadata().take().get_created_at();\n dapp.borrow_mut_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 assert!(dapp.borrow_admin().contains(), 0);\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n\n dapp.borrow_mut_admin().set(new_admin);\n }\n\n public entry fun set_safe_mode(dapp: &mut Dapp, safe_mode: bool, ctx: &TxContext) {\n assert!(dapp.borrow_admin().contains(), 0);\n assert!(dapp.borrow_admin().get() == ctx.sender(), 0);\n\n dapp.borrow_mut_safe_mode().set(safe_mode);\n }\n\n public fun ensure_no_safe_mode(dapp: &Dapp) {\n assert!(!dapp.borrow_safe_mode().get(), 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\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 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}::deploy_hook::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\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/tests/init.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\n\tconsole.log('✅ Deploy Hook 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}"],"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","generateToml","config","srcPrefix","code","formatAndWriteMove","capitalizeAndRemoveUnderscores","input","word","index","renderSetAttrsFunc","schemaName","fields","key","type","renderSetFunc","getStructAttrsWithType","fieldName","renderGetAllFunc","getStructTypes","getStructAttrsQuery","renderGetAttrsFunc","convertToSnakeCase","generateSchemaData","projectName","data","path","name","code","enumNames","item","field","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemas","schema","schemaMoudle","value","storage_type","all_types","para_key","para_value","borrow_key","extra_code","existsSync","readFileSync","extractLogicAndAuthorizationContent","filePath","fileContent","logicAndAuthRegex","match","generateDeployHook","config","srcPrefix","schemas","schemaName","capitalizeAndRemoveUnderscores","importSchemas","path","code","existsSync","content","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","key","name","message","code","formatAndWriteMove","existsSync","generateDefaultSchema","config","srcPrefix","generateDappSchemaMetadata","generateDappSchema","generateDappSystem","path","code","formatAndWriteMove","generateInit","config","srcPrefix","code","formatAndWriteMove","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xobelisk/sui-common",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Common low level logic shared between packages",
5
5
  "keywords": [
6
6
  "sui",
@@ -48,29 +48,18 @@ export type BaseValueType =
48
48
  | Vector<U64>
49
49
  | Vector<U128>;
50
50
 
51
- interface EventData {
52
- [key: string]: {
53
- [field: string]: any;
54
- };
55
- }
56
-
57
- interface SchemaData {
58
- [key: string]: {
59
- [field: string]: any;
60
- };
61
- }
62
-
63
- export type SchemaType = {
64
- data?: SchemaData[];
65
- structure: Record<string, string>;
66
- events?: EventData[];
67
- errors?: Record<string, string>[];
68
- }
51
+ export type SchemaData = Record<string, string> | string[]
52
+ export type SchemaType = Record<string, string>
53
+ export type EventData = Record<string, string>
54
+ export type ErrorData = Record<string, string>
69
55
 
70
56
  export type DubheConfig = {
71
57
  name: string;
72
58
  description: string;
59
+ data?: Record<string, SchemaData>;
73
60
  schemas: Record<string, SchemaType>;
61
+ events?: Record<string, EventData>;
62
+ errors?: ErrorData;
74
63
  };
75
64
 
76
65
  export type MoveType =
@@ -1,4 +1,4 @@
1
- import { BaseType, SchemaType } from '../../types';
1
+ import {BaseType, ErrorData, SchemaType} from '../../types';
2
2
  import { formatAndWriteMove } from '../formatAndWrite';
3
3
  import {
4
4
  getStructAttrsWithType,
@@ -16,17 +16,13 @@ function convertToSnakeCase(input: string): string {
16
16
 
17
17
  export async function generateSchemaError(
18
18
  projectName: string,
19
- schemas: Record<string, SchemaType>,
19
+ errors: ErrorData,
20
20
  path: string
21
21
  ) {
22
22
  console.log('\n📦 Starting Schema Error Generation...');
23
- for (const schemaName in schemas) {
24
- const schema = schemas[schemaName];
25
- if (schema.errors) {
26
- console.log(` ├─ Processing schema: ${schemaName}`);
27
- for (const item of schema.errors) {
28
- const name = Object.keys(item)[0]
29
- const message = Object.values(item)[0]
23
+ for (const key of Object.keys(errors)) {
24
+ const name = key
25
+ const message = errors[key]
30
26
  console.log(
31
27
  ` └─ Generating ${name} message: ${message}`);
32
28
  let code = `module ${projectName}::${convertToSnakeCase(name)}_error {
@@ -46,7 +42,5 @@ export async function generateSchemaError(
46
42
  'formatAndWriteMove'
47
43
  );
48
44
  }
49
- }
50
- }
51
45
  console.log('✅ Schema Error Generation Complete\n');
52
46
  }
@@ -1,4 +1,4 @@
1
- import { BaseType, SchemaType } from '../../types';
1
+ import {BaseType, EventData, SchemaData, SchemaType} from '../../types';
2
2
  import { formatAndWriteMove } from '../formatAndWrite';
3
3
  import {
4
4
  getStructAttrsWithType,
@@ -27,14 +27,13 @@ function convertToSnakeCase(input: string): string {
27
27
 
28
28
  function generateImport(
29
29
  projectName: string,
30
- schemaName: string,
31
- schema: SchemaType,
30
+ data: Record<string, SchemaData> | null,
32
31
  ) {
33
- if (schema.data) {
34
- return schema.data
35
- .map(item => {
36
- const name = Object.keys(item)[0]
37
- return `use ${projectName}::${schemaName}_${convertToSnakeCase(
32
+ if (data != null) {
33
+ const names = Object.keys(data);
34
+ return names
35
+ .map(name => {
36
+ return `use ${projectName}::${convertToSnakeCase(
38
37
  name,
39
38
  )}::${name};`;
40
39
  })
@@ -46,17 +45,14 @@ function generateImport(
46
45
 
47
46
  export async function generateSchemaEvent(
48
47
  projectName: string,
49
- schemas: Record<string, SchemaType>,
48
+ data: Record<string, SchemaData> | null,
49
+ events: Record<string, EventData>,
50
50
  path: string
51
51
  ) {
52
52
  console.log('\n📦 Starting Schema Event Generation...');
53
- for (const schemaName in schemas) {
54
- const schema = schemas[schemaName];
55
- if (schema.events) {
56
- console.log(` ├─ Processing schema: ${schemaName}`);
57
- for (const item of schema.events) {
58
- const name = Object.keys(item)[0];
59
- const fields = Object.values(item)[0];
53
+ for (const key of Object.keys(events)) {
54
+ const name = key;
55
+ const fields = events[key];
60
56
  console.log(
61
57
  ` └─ Generating ${name} event: ${fields}`
62
58
  );
@@ -64,7 +60,7 @@ export async function generateSchemaEvent(
64
60
  let code = `module ${projectName}::${convertToSnakeCase(name)}_event {
65
61
  use sui::event;
66
62
  use std::ascii::String;
67
- ${generateImport(projectName, schemaName, schema)}
63
+ ${generateImport(projectName, data)}
68
64
 
69
65
  public struct ${name}Event has copy, drop {
70
66
  ${getStructAttrsWithType(fields as Record<string, string>)}
@@ -89,7 +85,5 @@ export async function generateSchemaEvent(
89
85
  'formatAndWriteMove'
90
86
  );
91
87
  }
92
- }
93
- }
94
88
  console.log('✅ Schema Event Generation Complete\n');
95
89
  }
@@ -1,4 +1,4 @@
1
- import { BaseType, SchemaType } from '../../types';
1
+ import {BaseType, SchemaData, SchemaType} from '../../types';
2
2
  import { formatAndWriteMove } from '../formatAndWrite';
3
3
  import {
4
4
  getStructAttrsWithType,
@@ -79,17 +79,13 @@ function convertToSnakeCase(input: string): string {
79
79
 
80
80
  export async function generateSchemaData(
81
81
  projectName: string,
82
- schemas: Record<string, SchemaType>,
82
+ data: Record<string, SchemaData>,
83
83
  path: string,
84
84
  ) {
85
85
  console.log('\n📦 Starting Schema Data Generation...');
86
- for (const schemaName in schemas) {
87
- const schema = schemas[schemaName];
88
- if (schema.data) {
89
- console.log(` ├─ Processing schema: ${schemaName}`);
90
- for (const item of schema.data) {
91
- const name = Object.keys(item)[0];
92
- const fields = Object.values(item)[0];
86
+ for (const key of Object.keys(data)) {
87
+ const name = key;
88
+ const fields = data[key];
93
89
  console.log(
94
90
  ` └─ Generating ${name} ${
95
91
  Array.isArray(fields) ? '(enum)' : '(struct)'
@@ -97,12 +93,14 @@ export async function generateSchemaData(
97
93
  );
98
94
  let code = '';
99
95
 
100
- const enumNames = schema.data
101
- .filter(item => Array.isArray(Object.values(item)[0]))
102
- .map(item => Object.keys(item)[0]);
96
+ const enumNames = Object.keys(data)
97
+ .filter(item => Array.isArray(data[item]))
98
+ .map(item => item);
99
+
100
+ console.log(enumNames)
103
101
 
104
102
  if (Array.isArray(fields)) {
105
- code = `module ${projectName}::${schemaName}_${convertToSnakeCase(
103
+ code = `module ${projectName}::${convertToSnakeCase(
106
104
  name,
107
105
  )} {
108
106
  public enum ${name} has copy, drop , store {
@@ -119,14 +117,14 @@ export async function generateSchemaData(
119
117
  })
120
118
  .join('')}`;
121
119
  } else {
122
- code = `module ${projectName}::${schemaName}_${convertToSnakeCase(
120
+ code = `module ${projectName}::${convertToSnakeCase(
123
121
  name,
124
122
  )} {
125
123
  use std::ascii::String;
126
124
  ${enumNames
127
125
  .map(
128
126
  name =>
129
- `use ${projectName}::${schemaName}_${convertToSnakeCase(
127
+ `use ${projectName}::${convertToSnakeCase(
130
128
  name,
131
129
  )}::${name};`,
132
130
  )
@@ -153,27 +151,24 @@ export async function generateSchemaData(
153
151
 
154
152
  await formatAndWriteMove(
155
153
  code,
156
- `${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}_${convertToSnakeCase(
154
+ `${path}/contracts/${projectName}/sources/codegen/data/${convertToSnakeCase(
157
155
  name,
158
156
  )}.move`,
159
157
  'formatAndWriteMove',
160
158
  );
161
159
  }
162
- }
163
- }
164
160
  console.log('✅ Schema Data Generation Complete\n');
165
161
  }
166
162
 
167
163
  function generateImport(
168
164
  projectName: string,
169
- schemaName: string,
170
- schema: SchemaType,
165
+ data: Record<string, SchemaData> | null,
171
166
  ) {
172
- if (schema.data) {
173
- return schema.data
174
- .map(item => {
175
- const name = Object.keys(item)[0]
176
- return `use ${projectName}::${schemaName}_${convertToSnakeCase(
167
+ if (data != null) {
168
+ const names = Object.keys(data);
169
+ return names
170
+ .map(name => {
171
+ return `use ${projectName}::${convertToSnakeCase(
177
172
  name,
178
173
  )}::${name};`;
179
174
  })
@@ -185,6 +180,7 @@ function generateImport(
185
180
 
186
181
  export async function generateSchemaStructure(
187
182
  projectName: string,
183
+ data: Record<string, SchemaData> | null,
188
184
  schemas: Record<string, SchemaType>,
189
185
  path: string,
190
186
  ) {
@@ -196,7 +192,7 @@ export async function generateSchemaStructure(
196
192
  );
197
193
  console.log(
198
194
  ` └─ Structure fields: ${
199
- Object.keys(schemas[schemaName].structure).length
195
+ Object.values(schemas[schemaName]).length
200
196
  }`,
201
197
  );
202
198
  const schema = schemas[schemaName];
@@ -213,7 +209,7 @@ export async function generateSchemaStructure(
213
209
  use sui::sui::SUI;
214
210
  use sui::coin::Coin;
215
211
  use sui::balance::Balance;
216
- ${generateImport(projectName, schemaName, schema)}
212
+ ${generateImport(projectName, data)}
217
213
 
218
214
  public struct ${capitalizeAndRemoveUnderscores(
219
215
  schemaName,
@@ -221,7 +217,7 @@ export async function generateSchemaStructure(
221
217
  id: UID
222
218
  }
223
219
 
224
- ${Object.entries(schema.structure)
220
+ ${Object.entries(schema)
225
221
  .map(([key, value]) => {
226
222
  return `public fun borrow_${key}(self: &${capitalizeAndRemoveUnderscores(
227
223
  schemaName,
@@ -243,7 +239,7 @@ export async function generateSchemaStructure(
243
239
  schemaName,
244
240
  )} {
245
241
  let mut id = object::new(ctx);
246
- ${Object.entries(schema.structure)
242
+ ${Object.entries(schema)
247
243
  .map(([key, value]) => {
248
244
  let storage_type = '';
249
245
  if (value.includes('StorageValue')) {
@@ -267,7 +263,7 @@ export async function generateSchemaStructure(
267
263
 
268
264
 
269
265
  // ======================================== View Functions ========================================
270
- ${Object.entries(schema.structure)
266
+ ${Object.entries(schema)
271
267
  .map(([key, value]) => {
272
268
  // @ts-ignore
273
269
  let all_types = value.match(/<(.+)>/)[1].split(',').map(type => type.trim());
@@ -45,10 +45,24 @@ export async function schemaGen(
45
45
  await generateDeployHook(config, path);
46
46
  }
47
47
 
48
- await generateSchemaData(config.name, config.schemas, path);
49
- await generateSchemaStructure(config.name, config.schemas, path);
50
- await generateSchemaEvent(config.name, config.schemas, path);
51
- await generateSchemaError(config.name, config.schemas, path);
48
+ if (config.events) {
49
+ if (config.data) {
50
+ await generateSchemaEvent(config.name, config.data, config.events, path);
51
+ } else {
52
+ await generateSchemaEvent(config.name, null, config.events, path);
53
+ }
54
+ }
55
+
56
+ if (config.data) {
57
+ await generateSchemaData(config.name, config.data, path);
58
+ await generateSchemaStructure(config.name, config.data, config.schemas, path);
59
+ } else {
60
+ await generateSchemaStructure(config.name, null, config.schemas, path);
61
+ }
62
+
63
+ if (config.errors) {
64
+ await generateSchemaError(config.name, config.errors, path);
65
+ }
52
66
 
53
67
  await generateDefaultSchema(config, path);
54
68
  await generateInit(config, path);