@0xobelisk/sui-common 0.5.18 ā 0.5.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +78 -56
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/codegen/utils/renderMove/generateSchema.ts +48 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import S from"prettier";import B from"prettier-plugin-move-js";async function A(e,t){let o;t&&(o=await S.resolveConfig(t));try{return S.format(e,{plugins:[B],parser:"move-parse",printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...o})}catch(r){let s;return r instanceof Error?s=r.message:s=r,console.log(`Error during output formatting: ${s}`),e}}async function C(e){return S.format(e,{parser:"typescript"})}import _ from"node:fs/promises";import j from"node:path";import M from"debug";var b=M("dubhe:common"),H=M("dubhe:common");b.log=console.debug.bind(console);H.log=console.error.bind(console);var y=b.extend("codegen"),z=b.extend("codegen");y.log=console.debug.bind(console);z.log=console.error.bind(console);async function m(e,t,o){let r=await A(e),s=` // Copyright (c) Obelisk Labs, Inc.
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
#[allow(unused_use)]
|
|
4
4
|
|
|
@@ -6,13 +6,13 @@ import y from"prettier";import K from"prettier-plugin-move-js";async function w(
|
|
|
6
6
|
|
|
7
7
|
`,n=`#[allow(lint(share_owned))]
|
|
8
8
|
|
|
9
|
-
`,
|
|
10
|
-
\u2699\uFE0F Starting System Generation...`),e.systems.map(async
|
|
9
|
+
`,i=s+r;t.includes(".toml")||t.includes("system")?i=r:t.includes("deploy_hook")&&(i=n+r),await _.mkdir(j.dirname(t),{recursive:!0}),await _.writeFile(t,i),y(`${o}: ${t}`)}async function be(e,t,o){let r=await C(e);await _.mkdir(j.dirname(t),{recursive:!0}),await _.writeFile(t,r),y(`${o}: ${t}`)}function _e(e){return e.replace(/\\/g,"/")}import{existsSync as w}from"fs";import l from"fs";function v(e){l.existsSync(e)&&(l.readdirSync(e).forEach(t=>{let o=`${e}/${t}`;l.lstatSync(o).isDirectory()?v(o):l.unlinkSync(o)}),l.rmdirSync(e))}function T(e){return Object.entries(e).map(([t,o])=>`${t}`).join(",")}function W(e){return`(${Object.entries(e).map(([t,o])=>`${o}`)})`}function d(e){return Object.entries(e).map(([t,o])=>`${t}: ${o}`)}function G(e){return Object.entries(e).map(([t,o])=>`self.${t}`)}import{existsSync as N}from"fs";async function O(e,t){console.log(`
|
|
10
|
+
\u2699\uFE0F Starting System Generation...`),e.systems.map(async o=>{if(console.log(` \u251C\u2500 Generating system: ${o}`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/system/${o}.move`),!N(`${t}/contracts/${e.name}/sources/system/${o}.move`)){let r=`module ${e.name}::${o}_system {
|
|
11
11
|
|
|
12
12
|
}
|
|
13
|
-
`;await
|
|
14
|
-
`)}async function
|
|
15
|
-
\u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/Move.toml`);let
|
|
13
|
+
`;await m(r,`${t}/contracts/${e.name}/sources/system/${o}.move`,"formatAndWriteMove")}}),console.log(`\u2705 System Generation Complete
|
|
14
|
+
`)}async function R(e,t,o){console.log(`
|
|
15
|
+
\u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/Move.toml`);let r=`[package]
|
|
16
16
|
name = "${e.name}"
|
|
17
17
|
version = "0.0.1"
|
|
18
18
|
edition = "2024.beta"
|
|
@@ -23,31 +23,31 @@ Dubhe = { git = "https://github.com/0xobelisk/dubhe.git", subdir = "packages/dub
|
|
|
23
23
|
|
|
24
24
|
[addresses]
|
|
25
25
|
sui = "0x2"
|
|
26
|
-
dubhe = "${
|
|
26
|
+
dubhe = "${o}"
|
|
27
27
|
${e.name} = "0x0"
|
|
28
|
-
`;await
|
|
29
|
-
`)}function p(e){return e.split("_").map((t,
|
|
30
|
-
self.${
|
|
28
|
+
`;await m(r,`${t}/contracts/${e.name}/Move.toml`,"formatAndWriteMove"),console.log(`\u2705 Move.toml Generation Complete
|
|
29
|
+
`)}function p(e){return e.split("_").map((t,o)=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function Q(e,t){return Object.entries(t).map(([o,r])=>`public(package) fun set_${o}(self: &mut ${e}, ${o}: ${r}) {
|
|
30
|
+
self.${o} = ${o};
|
|
31
31
|
}`).join(`
|
|
32
|
-
`)}function
|
|
33
|
-
${Object.entries(t).map(([
|
|
32
|
+
`)}function X(e,t){return`public(package) fun set(self: &mut ${e}, ${d(t)}) {
|
|
33
|
+
${Object.entries(t).map(([o])=>`self.${o} = ${o};`).join(`
|
|
34
34
|
`)}
|
|
35
|
-
}`}function
|
|
36
|
-
(${
|
|
37
|
-
}`}function
|
|
38
|
-
self.${
|
|
35
|
+
}`}function Y(e,t){return`public fun get(self: &${e}): ${W(t)} {
|
|
36
|
+
(${G(t)})
|
|
37
|
+
}`}function Z(e,t){return Object.entries(t).map(([o,r])=>`public fun get_${o}(self: &${e}): ${r} {
|
|
38
|
+
self.${o}
|
|
39
39
|
}`).join(`
|
|
40
|
-
`)}function u(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function
|
|
41
|
-
\u{1F4E6} Starting Schema Data Generation...`);for(let
|
|
40
|
+
`)}function u(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function E(e,t,o){console.log(`
|
|
41
|
+
\u{1F4E6} Starting Schema Data Generation...`);for(let r in t){let s=t[r];if(s.data){console.log(` \u251C\u2500 Processing schema: ${r}`);for(let n of s.data){console.log(` \u2514\u2500 Generating ${n.name} ${Array.isArray(n.fields)?"(enum)":"(struct)"}`);let i="",c=s.data.filter(a=>Array.isArray(a.fields)).map(a=>a.name);Array.isArray(n.fields)?i=`module ${e}::${r}_${u(n.name)} {
|
|
42
42
|
public enum ${n.name} has copy, drop , store {
|
|
43
43
|
${n.fields}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
${n.fields.map(
|
|
47
|
-
${n.name}::${
|
|
48
|
-
}`).join("")}`:
|
|
46
|
+
${n.fields.map(a=>`public fun new_${u(a)}(): ${n.name} {
|
|
47
|
+
${n.name}::${a}
|
|
48
|
+
}`).join("")}`:i=`module ${e}::${r}_${u(n.name)} {
|
|
49
49
|
use std::ascii::String;
|
|
50
|
-
${
|
|
50
|
+
${c.map(a=>`use ${e}::${r}_${u(a)}::${a};`).join(`
|
|
51
51
|
`)}
|
|
52
52
|
|
|
53
53
|
public struct ${n.name} has copy, drop , store {
|
|
@@ -56,18 +56,18 @@ ${e.name} = "0x0"
|
|
|
56
56
|
|
|
57
57
|
public fun new(${d(n.fields)}): ${n.name} {
|
|
58
58
|
${n.name} {
|
|
59
|
-
${
|
|
59
|
+
${T(n.fields)}
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
${
|
|
64
|
-
${
|
|
65
|
-
${
|
|
66
|
-
${
|
|
67
|
-
}`,await
|
|
68
|
-
`)}function
|
|
69
|
-
`):""}async function
|
|
70
|
-
\u{1F528} Starting Schema Structure Generation...`);for(let
|
|
63
|
+
${Y(n.name,n.fields)}
|
|
64
|
+
${Z(n.name,n.fields)}
|
|
65
|
+
${Q(n.name,n.fields)}
|
|
66
|
+
${X(n.name,n.fields)}
|
|
67
|
+
}`,await m(i,`${o}/contracts/${e}/sources/codegen/schemas/${r}_${u(n.name)}.move`,"formatAndWriteMove")}}}console.log(`\u2705 Schema Data Generation Complete
|
|
68
|
+
`)}function q(e,t,o){return o.data?o.data.map(r=>`use ${e}::${t}_${u(r.name)}::${r.name};`).join(`
|
|
69
|
+
`):""}async function F(e,t,o){console.log(`
|
|
70
|
+
\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 s=t[r],n=`module ${e}::${r}_schema {
|
|
71
71
|
use std::ascii::String;
|
|
72
72
|
use std::type_name;
|
|
73
73
|
use dubhe::dapps_system;
|
|
@@ -76,38 +76,60 @@ ${e.name} = "0x0"
|
|
|
76
76
|
use dubhe::storage_map::{Self, StorageMap};
|
|
77
77
|
use dubhe::storage_double_map::{Self, StorageDoubleMap};
|
|
78
78
|
use ${e}::dapp_key::DappKey;
|
|
79
|
-
${
|
|
79
|
+
${q(e,r,s)}
|
|
80
80
|
|
|
81
|
-
public struct ${p(
|
|
81
|
+
public struct ${p(r)} has key, store {
|
|
82
82
|
id: UID,
|
|
83
83
|
${d(s.structure)}
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
${Object.entries(s.structure).map(([
|
|
87
|
-
&self.${
|
|
86
|
+
${Object.entries(s.structure).map(([i,c])=>`public fun borrow_${i}(self: &${p(r)}) : &${c} {
|
|
87
|
+
&self.${i}
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
public(package) fun borrow_mut_${
|
|
91
|
-
&mut self.${
|
|
90
|
+
public(package) fun borrow_mut_${i}(self: &mut ${p(r)}): &mut ${c} {
|
|
91
|
+
&mut self.${i}
|
|
92
92
|
}
|
|
93
93
|
`).join("")}
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
public fun register(dapps: &mut Dapps, ctx: &mut TxContext): ${p(r)} {
|
|
96
97
|
let package_id = dapps_system::current_package_id<DappKey>();
|
|
97
98
|
assert!(dapps.borrow_metadata().contains_key(package_id), 0);
|
|
98
99
|
assert!(dapps.borrow_admin().get(package_id) == ctx.sender(), 0);
|
|
99
|
-
let schema = type_name::get<${p(
|
|
100
|
+
let schema = type_name::get<${p(r)}>().into_string();
|
|
100
101
|
assert!(!dapps.borrow_schemas().get(package_id).contains(&schema), 0);
|
|
101
|
-
dapps_system::add_schema<${p(
|
|
102
|
-
${p(
|
|
102
|
+
dapps_system::add_schema<${p(r)}>(dapps, package_id, ctx);
|
|
103
|
+
${p(r)} {
|
|
103
104
|
id: object::new(ctx),
|
|
104
|
-
${Object.entries(s.structure).map(([
|
|
105
|
+
${Object.entries(s.structure).map(([i,c])=>{let a="";return c.includes("StorageValue")?a="storage_value::new()":c.includes("StorageMap")?a="storage_map::new()":c.includes("StorageDoubleMap")&&(a="storage_double_map::new()"),`${i}: ${a},`}).join(" ")}
|
|
105
106
|
}
|
|
106
107
|
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
// ======================================== View Functions ========================================
|
|
111
|
+
${Object.entries(s.structure).map(([i,c])=>{let a=c.match(/<(.+)>/)[1].split(",").map(L=>L.trim()),g=[],$="",f="",x="";return c.includes("StorageValue")?(g=[],$=`${a[0]}`,f="try_get()"):c.includes("StorageMap")?(g=[`key: ${a[0]}`],$=`${a[1]}`,f="try_get(key)",x=`public fun get_${i}_keys(self: &${p(r)}) : vector<${a[0]}> {
|
|
112
|
+
self.${i}.keys()
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public fun get_${i}_values(self: &${p(r)}) : vector<${a[1]}> {
|
|
116
|
+
self.${i}.values()
|
|
117
|
+
}`):c.includes("StorageDoubleMap")&&(g=[`key1: ${a[0]}`,`key2: ${a[1]}`],$=`${a[2]}`,f="try_get(key1, key2)",x=`public fun get_${i}_keys(self: &${p(r)}) : (vector<${a[0]}>, vector<${a[1]}>) {
|
|
118
|
+
self.${i}.keys()
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
public fun get_${i}_values(self: &${p(r)}) : vector<${a[2]}> {
|
|
122
|
+
self.${i}.values()
|
|
123
|
+
}`),`public fun get_${i}(self: &${p(r)}, ${g}) : Option<${$}> {
|
|
124
|
+
self.${i}.${f}
|
|
125
|
+
}
|
|
126
|
+
`+x}).join("")}
|
|
127
|
+
// =========================================================================================================
|
|
128
|
+
|
|
107
129
|
|
|
108
|
-
}`;await
|
|
109
|
-
`)}import{existsSync as
|
|
110
|
-
\u{1F4DD} Starting Deploy Hook Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/script/deploy_hook.move`),!
|
|
130
|
+
}`;await m(n,`${o}/contracts/${e}/sources/codegen/schemas/${r}.move`,"formatAndWriteMove")}console.log(`\u2705 Schema Structure Generation Complete
|
|
131
|
+
`)}import{existsSync as J}from"fs";async function K(e,t){if(console.log(`
|
|
132
|
+
\u{1F4DD} Starting Deploy Hook Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/script/deploy_hook.move`),!J(`${t}/contracts/${e.name}/sources/script/deploy_hook.move`)){let o=`module ${e.name}::deploy_hook {
|
|
111
133
|
use dubhe::dapps_schema::Dapps;
|
|
112
134
|
use dubhe::dapps_system;
|
|
113
135
|
use ${e.name}::dapp_key::DappKey;
|
|
@@ -132,13 +154,13 @@ ${e.name} = "0x0"
|
|
|
132
154
|
clock,
|
|
133
155
|
ctx
|
|
134
156
|
);
|
|
135
|
-
${Object.keys(e.schemas).map(
|
|
157
|
+
${Object.keys(e.schemas).map(r=>`let ${r} = ${e.name}::${r}_schema::register(dapps, ctx);`).join(`
|
|
136
158
|
`)}
|
|
137
159
|
// Logic that needs to be automated once the contract is deployed
|
|
138
160
|
|
|
139
161
|
|
|
140
162
|
// Share the dapp object with the public
|
|
141
|
-
${Object.keys(e.schemas).map(
|
|
163
|
+
${Object.keys(e.schemas).map(r=>`public_share_object(${r});`).join(`
|
|
142
164
|
`)}
|
|
143
165
|
}
|
|
144
166
|
|
|
@@ -159,9 +181,9 @@ ${e.name} = "0x0"
|
|
|
159
181
|
(scenario, dapps)
|
|
160
182
|
}
|
|
161
183
|
}
|
|
162
|
-
`;await
|
|
163
|
-
`)}async function
|
|
164
|
-
\u{1F511} Starting DappKey Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/codegen/dapp_key.move`);let
|
|
184
|
+
`;await m(o,`${t}/contracts/${e.name}/sources/script/deploy_hook.move`,"formatAndWriteMove")}console.log(`\u2705 Deploy Hook Generation Complete
|
|
185
|
+
`)}async function I(e,t){console.log(`
|
|
186
|
+
\u{1F511} Starting DappKey Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/sources/codegen/dapp_key.move`);let o=`module ${e.name}::dapp_key {
|
|
165
187
|
/// Authorization token for the app.
|
|
166
188
|
public struct DappKey has drop {}
|
|
167
189
|
|
|
@@ -169,9 +191,9 @@ ${e.name} = "0x0"
|
|
|
169
191
|
DappKey { }
|
|
170
192
|
}
|
|
171
193
|
}
|
|
172
|
-
`;await
|
|
173
|
-
`)}function
|
|
174
|
-
\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: ${
|
|
175
|
-
`);let s=t??process.cwd();
|
|
176
|
-
`)}import{findUp as
|
|
194
|
+
`;await m(o,`${t}/contracts/${e.name}/sources/codegen/dapp_key.move`,"formatAndWriteMove"),console.log(`\u2705 DappKey Generation Complete
|
|
195
|
+
`)}function U(e){switch(e){case"testnet":return"0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28";case"localnet":return"0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28";default:return"0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28"}}async function ze(e,t,o,r){console.log(`
|
|
196
|
+
\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"}`),console.log(` \u2514\u2500 Framework ID: ${r||U(o??"testnet")}
|
|
197
|
+
`);let s=t??process.cwd();r=r||U(o??"testnet"),w(`${s}/contracts/${e.name}`)&&v(`${s}/contracts/${e.name}/sources/codegen`),w(`${s}/contracts/${e.name}/Move.toml`)||await R(e,s,r),w(`${s}/contracts/${e.name}/sources/script/deploy_hook.move`)||await K(e,s),await O(e,s),await E(e.name,e.schemas,s),await F(e.name,e.schemas,s),await I(e,s),console.log(`\u2705 Schema Generation Process Complete!
|
|
198
|
+
`)}import{findUp as P}from"find-up";import k from"path";import ee from"esbuild";var h=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as te}from"fs";import{pathToFileURL as re}from"url";import oe from"os";var ne=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],D="dubhe.config.example.mjs";async function tt(e){e=await V(e);try{return await ee.build({entryPoints:[e],format:"esm",outfile:D,platform:"node",bundle:!0,packages:"external"}),e=await V(D,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{te(D,{force:!0})}}async function V(e,t){return e===void 0?e=await se():k.isAbsolute(e)||(e=k.join(process.cwd(),e),e=k.normalize(e)),t&&oe.platform()==="win32"?re(e).href:e}async function se(){let e=await P(ne);if(e===void 0)throw new h;return e}export{m as formatAndWriteMove,be as formatAndWriteTypescript,A as formatMove,C as formatTypescript,tt as loadConfig,_e as posixPath,V as resolveConfigPath,ze as schemaGen};
|
|
177
199
|
//# 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/generateSystem.ts","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.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: MIT\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `\n\n let deployHookPrefix = `#[allow(lint(share_owned))]\n \n `\n\n let code = schemaPrefix + formattedOutput\n\n if (fullOutputPath.includes(\".toml\") || fullOutputPath.includes(\"system\")) {\n code = 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 { generateSystem } from './generateSystem';\nimport { generateToml } from './generateToml';\nimport { generateSchemaData, generateSchemaStructure } from './generateSchema';\nimport { generateDeployHook, generateMigrate } from './generateScript';\nimport { generateDappKey } from './generateDappKey';\n\nfunction matchFrameworkId(\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n): string {\n\tswitch (network) {\n\t\tcase 'testnet':\n\t\t\treturn '0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28';\n\t\tcase 'localnet':\n\t\t\treturn '0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28';\n\t\tdefault:\n\t\t\treturn '0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28';\n\t}\n}\n\nexport async function schemaGen(\n\tconfig: DubheConfig,\n\tsrcPrefix?: string,\n\tnetwork?: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tframeworkId?: string\n) {\n\tconsole.log('\\nš Starting Schema Generation Process...');\n\tconsole.log('š Project Configuration:');\n\tconsole.log(` āā Name: ${config.name}`);\n\tconsole.log(\n\t\t` āā Description: ${config.description || 'No description provided'}`\n\t);\n\tconsole.log(` āā Network: ${network || 'testnet'}`);\n\tconsole.log(\n\t\t` āā Framework ID: ${\n\t\t\tframeworkId || matchFrameworkId(network ?? 'testnet')\n\t\t}\\n`\n\t);\n\n\tconst path = srcPrefix ?? process.cwd();\n\n\tframeworkId = frameworkId || matchFrameworkId(network ?? 'testnet');\n\n\tif (existsSync(`${path}/contracts/${config.name}`)) {\n\t\tdeleteFolderRecursive(\n\t\t\t`${path}/contracts/${config.name}/sources/codegen`\n\t\t);\n\t}\n\n\tif (!existsSync(`${path}/contracts/${config.name}/Move.toml`)) {\n\t\tawait generateToml(config, path, frameworkId);\n\t}\n\n\tif (\n\t\t!existsSync(\n\t\t\t`${path}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t\t)\n\t) {\n\t\tawait generateDeployHook(config, path);\n\t}\n\n\tawait generateSystem(config, path);\n\tawait generateSchemaData(config.name, config.schemas, path);\n\tawait generateSchemaStructure(config.name, config.schemas, path);\n\tawait generateDappKey(config, path);\n\tconsole.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';\nimport { existsSync } from 'fs';\n\nexport async function generateSystem(config: DubheConfig, srcPrefix: string) {\n\tconsole.log('\\nāļø Starting System Generation...');\n\tconfig.systems.map(async systemName => {\n\t\tconsole.log(` āā Generating system: ${systemName}`);\n\t\tconsole.log(\n\t\t\t` āā Output path: ${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`\n\t\t);\n\n\t\tif (\n\t\t\t!existsSync(\n\t\t\t\t`${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`\n\t\t\t)\n\t\t) {\n\t\t\tlet code = `module ${config.name}::${systemName}_system {\n\n}\n`;\n\t\t\tawait formatAndWriteMove(\n\t\t\t\tcode,\n\t\t\t\t`${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`,\n\t\t\t\t'formatAndWriteMove'\n\t\t\t);\n\t\t}\n\t});\n\tconsole.log('ā
System Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateToml(\n\tconfig: DubheConfig,\n\tsrcPrefix: string,\n\tframeworkId: 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 = \"0.0.1\"\nedition = \"2024.beta\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.36.2\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe.git\", subdir = \"packages/dubhe-framework\", rev = \"main\" }\n\n[addresses]\nsui = \"0x2\"\ndubhe = \"${frameworkId}\"\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\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\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\t\t.map(([fieldName]) => `self.${fieldName} = ${fieldName};`)\n\t\t\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\tkey,\n\t\t\t\ttype,\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\tconsole.log(\n\t\t\t\t\t` āā Generating ${item.name} ${\n\t\t\t\t\t\tArray.isArray(item.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(item.fields))\n\t\t\t\t\t.map(item => item.name);\n\n\t\t\t\tif (Array.isArray(item.fields)) {\n\t\t\t\t\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name\n\t\t\t\t\t)} {\n public enum ${item.name} has copy, drop , store {\n ${item.fields}\n }\n \n ${item.fields\n\t\t\t\t\t\t\t.map((field: string) => {\n\t\t\t\t\t\t\t\treturn `public fun new_${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\tfield\n\t\t\t\t\t\t\t\t)}(): ${item.name} {\n ${item.name}::${field}\n }`;\n\t\t\t\t\t\t\t})\n\t\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\titem.name\n\t\t\t\t\t)} {\n use std::ascii::String;\n ${enumNames\n\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\tname =>\n\t\t\t\t\t\t\t\t\t\t`use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\t\t\tname\n\t\t\t\t\t\t\t\t\t\t)}::${name};`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.join('\\n')}\n\n public struct ${item.name} has copy, drop , store {\n ${getStructAttrsWithType(item.fields)}\n }\n \n public fun new(${getStructAttrsWithType(\n\t\t\t\t\t\t\t\titem.fields\n\t\t\t\t\t\t\t)}): ${item.name} {\n ${item.name} {\n ${getStructAttrs(item.fields)}\n }\n }\n \n ${renderGetAllFunc(item.name, item.fields)}\n ${renderGetAttrsFunc(item.name, item.fields)}\n ${renderSetAttrsFunc(item.name, item.fields)}\n ${renderSetFunc(item.name, item.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\titem.name\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\treturn `use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\titem.name\n\t\t\t\t)}::${item.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::type_name;\n use dubhe::dapps_system;\n use dubhe::dapps_schema::Dapps;\n use dubhe::storage_value::{Self, StorageValue};\n use dubhe::storage_map::{Self, StorageMap};\n use dubhe::storage_double_map::{Self, StorageDoubleMap};\n use ${projectName}::dapp_key::DappKey;\n ${generateImport(projectName, schemaName, schema)}\n\n public struct ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)} has key, store {\n id: UID,\n ${getStructAttrsWithType(schema.structure)}\n } \n \n ${Object.entries(schema.structure)\n\t\t\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t\t\treturn `public fun borrow_${key}(self: &${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\t\t\t\tschemaName\n\t\t\t\t\t\t\t\t)}) : &${value} {\n &self.${key}\n }\n \n public(package) fun borrow_mut_${key}(self: &mut ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)}): &mut ${value} {\n &mut self.${key}\n }\n `;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.join('')} \n \n public fun register(dapps: &mut Dapps, ctx: &mut TxContext): ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)} {\n let package_id = dapps_system::current_package_id<DappKey>();\n assert!(dapps.borrow_metadata().contains_key(package_id), 0);\n assert!(dapps.borrow_admin().get(package_id) == ctx.sender(), 0);\n let schema = type_name::get<${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\t\tschemaName\n\t\t\t\t\t\t)}>().into_string();\n assert!(!dapps.borrow_schemas().get(package_id).contains(&schema), 0);\n dapps_system::add_schema<${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\t\tschemaName\n\t\t\t\t\t\t)}>(dapps, package_id, ctx);\n ${capitalizeAndRemoveUnderscores(schemaName)} {\n id: object::new(ctx),\n ${Object.entries(schema.structure)\n\t\t\t\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t\t\t\tlet storage_type = '';\n\t\t\t\t\t\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_value::new()`;\n\t\t\t\t\t\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_map::new()`;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tvalue.includes('StorageDoubleMap')\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_double_map::new()`;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn `${key}: ${storage_type},`;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\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';\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/script/deploy_hook.move`\n\t);\n\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::deploy_hook {\n use dubhe::dapps_schema::Dapps;\n use dubhe::dapps_system;\n use ${config.name}::dapp_key::DappKey;\n use std::ascii;\n use sui::clock::Clock;\n use sui::transfer::public_share_object;\n #[test_only]\n use dubhe::dapps_schema;\n #[test_only]\n use sui::clock;\n #[test_only]\n use sui::test_scenario;\n #[test_only]\n use sui::test_scenario::Scenario;\n\n public entry fun run(dapps: &mut Dapps, clock: &Clock, ctx: &mut TxContext) {\n // Register the dapp to dubhe.\n dapps_system::register<DappKey>(\n dapps,\n ascii::string(b\"${config.name}\"),\n ascii::string(b\"${config.description}\"),\n clock,\n ctx\n );\n ${Object.keys(config.schemas)\n\t\t\t.map(schemaName => {\n\t\t\t\treturn `let ${schemaName} = ${config.name}::${schemaName}_schema::register(dapps, ctx);`;\n\t\t\t})\n\t\t\t.join('\\n')}\n // Logic that needs to be automated once the contract is deployed\n\n\n // Share the dapp object with the public\n ${Object.keys(config.schemas)\n\t\t\t.map(schemaName => {\n\t\t\t\treturn `public_share_object(${schemaName});`;\n\t\t\t})\n\t\t\t.join('\\n')}\n }\n\n #[test_only]\n public fun deploy_hook_for_testing(): (Scenario, Dapps) {\n let mut scenario = test_scenario::begin(@0xA);\n {\n let ctx = test_scenario::ctx(&mut scenario);\n dapps_schema::init_dapps_for_testing(ctx);\n test_scenario::next_tx(&mut scenario,@0xA);\n };\n let mut dapps = test_scenario::take_shared<Dapps>(&scenario);\n let ctx = test_scenario::ctx(&mut scenario);\n let clock = clock::create_for_testing(ctx);\n run(&mut dapps, &clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(&mut scenario,@0xA);\n (scenario, dapps)\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n\tconsole.log('ā
Deploy Hook Generation Complete\\n');\n}\n\nexport function generateMigrate(config: DubheConfig, srcPrefix: string) {\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::migrate {\n use dubhe::world::{World, AdminCap};\n\n /// Not the right admin for this world\n const ENotAdmin: u64 = 0;\n const EWrongVersion: u64 = 1;\n const ENotUpgrade: u64 = 2;\n const VERSION: u64 = 1;\n\n public entry fun run(world: &mut World, admin_cap: &AdminCap) {\n assert!(world.admin() == object::id(admin_cap), ENotAdmin);\n assert!(world.version() < VERSION, ENotUpgrade);\n *dubhe::world::mut_version(world, admin_cap) = VERSION;\n }\n\n public fun assert_version(world: &World){\n assert!(world.version() == VERSION, EWrongVersion);\n }\n}\n`;\n\t\tformatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nš Starting DappKey Generation...');\n\tconsole.log(\n\t\t` āā Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`\n\t);\n\n\tlet code = `module ${config.name}::dapp_key {\n\\t/// Authorization token for the app.\n\\tpublic struct DappKey has drop {}\n\n\\tpublic(package) fun new(): DappKey {\n\\t\\tDappKey { }\n\\t}\n}\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('ā
DappKey Generation Complete\\n');\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","deployHookPrefix","code","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","getStructAttrs","values","key","_","getStructTypes","values","_","type","getStructAttrsWithType","key","getStructAttrsQuery","existsSync","generateSystem","config","srcPrefix","systemName","code","formatAndWriteMove","generateToml","config","srcPrefix","frameworkId","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","code","enumNames","field","name","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemaMoudle","value","storage_type","existsSync","generateDeployHook","config","srcPrefix","code","schemaName","formatAndWriteMove","generateDappKey","config","srcPrefix","code","formatAndWriteMove","matchFrameworkId","network","schemaGen","config","srcPrefix","frameworkId","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSystem","generateSchemaData","generateSchemaStructure","generateDappKey","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/generateSystem.ts","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.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: MIT\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `\n\n let deployHookPrefix = `#[allow(lint(share_owned))]\n \n `\n\n let code = schemaPrefix + formattedOutput\n\n if (fullOutputPath.includes(\".toml\") || fullOutputPath.includes(\"system\")) {\n code = 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 { generateSystem } from './generateSystem';\nimport { generateToml } from './generateToml';\nimport { generateSchemaData, generateSchemaStructure } from './generateSchema';\nimport { generateDeployHook, generateMigrate } from './generateScript';\nimport { generateDappKey } from './generateDappKey';\n\nfunction matchFrameworkId(\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n): string {\n\tswitch (network) {\n\t\tcase 'testnet':\n\t\t\treturn '0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28';\n\t\tcase 'localnet':\n\t\t\treturn '0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28';\n\t\tdefault:\n\t\t\treturn '0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28';\n\t}\n}\n\nexport async function schemaGen(\n\tconfig: DubheConfig,\n\tsrcPrefix?: string,\n\tnetwork?: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tframeworkId?: string\n) {\n\tconsole.log('\\nš Starting Schema Generation Process...');\n\tconsole.log('š Project Configuration:');\n\tconsole.log(` āā Name: ${config.name}`);\n\tconsole.log(\n\t\t` āā Description: ${config.description || 'No description provided'}`\n\t);\n\tconsole.log(` āā Network: ${network || 'testnet'}`);\n\tconsole.log(\n\t\t` āā Framework ID: ${\n\t\t\tframeworkId || matchFrameworkId(network ?? 'testnet')\n\t\t}\\n`\n\t);\n\n\tconst path = srcPrefix ?? process.cwd();\n\n\tframeworkId = frameworkId || matchFrameworkId(network ?? 'testnet');\n\n\tif (existsSync(`${path}/contracts/${config.name}`)) {\n\t\tdeleteFolderRecursive(\n\t\t\t`${path}/contracts/${config.name}/sources/codegen`\n\t\t);\n\t}\n\n\tif (!existsSync(`${path}/contracts/${config.name}/Move.toml`)) {\n\t\tawait generateToml(config, path, frameworkId);\n\t}\n\n\tif (\n\t\t!existsSync(\n\t\t\t`${path}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t\t)\n\t) {\n\t\tawait generateDeployHook(config, path);\n\t}\n\n\tawait generateSystem(config, path);\n\tawait generateSchemaData(config.name, config.schemas, path);\n\tawait generateSchemaStructure(config.name, config.schemas, path);\n\tawait generateDappKey(config, path);\n\tconsole.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';\nimport { existsSync } from 'fs';\n\nexport async function generateSystem(config: DubheConfig, srcPrefix: string) {\n\tconsole.log('\\nāļø Starting System Generation...');\n\tconfig.systems.map(async systemName => {\n\t\tconsole.log(` āā Generating system: ${systemName}`);\n\t\tconsole.log(\n\t\t\t` āā Output path: ${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`\n\t\t);\n\n\t\tif (\n\t\t\t!existsSync(\n\t\t\t\t`${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`\n\t\t\t)\n\t\t) {\n\t\t\tlet code = `module ${config.name}::${systemName}_system {\n\n}\n`;\n\t\t\tawait formatAndWriteMove(\n\t\t\t\tcode,\n\t\t\t\t`${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`,\n\t\t\t\t'formatAndWriteMove'\n\t\t\t);\n\t\t}\n\t});\n\tconsole.log('ā
System Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateToml(\n\tconfig: DubheConfig,\n\tsrcPrefix: string,\n\tframeworkId: 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 = \"0.0.1\"\nedition = \"2024.beta\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.36.2\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe.git\", subdir = \"packages/dubhe-framework\", rev = \"main\" }\n\n[addresses]\nsui = \"0x2\"\ndubhe = \"${frameworkId}\"\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\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\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\t\t.map(([fieldName]) => `self.${fieldName} = ${fieldName};`)\n\t\t\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\tkey,\n\t\t\t\ttype,\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\tconsole.log(\n\t\t\t\t\t` āā Generating ${item.name} ${\n\t\t\t\t\t\tArray.isArray(item.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(item.fields))\n\t\t\t\t\t.map(item => item.name);\n\n\t\t\t\tif (Array.isArray(item.fields)) {\n\t\t\t\t\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name\n\t\t\t\t\t)} {\n public enum ${item.name} has copy, drop , store {\n ${item.fields}\n }\n \n ${item.fields\n\t\t\t\t\t\t\t.map((field: string) => {\n\t\t\t\t\t\t\t\treturn `public fun new_${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\tfield\n\t\t\t\t\t\t\t\t)}(): ${item.name} {\n ${item.name}::${field}\n }`;\n\t\t\t\t\t\t\t})\n\t\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\titem.name\n\t\t\t\t\t)} {\n use std::ascii::String;\n ${enumNames\n\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\tname =>\n\t\t\t\t\t\t\t\t\t\t`use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\t\t\tname\n\t\t\t\t\t\t\t\t\t\t)}::${name};`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.join('\\n')}\n\n public struct ${item.name} has copy, drop , store {\n ${getStructAttrsWithType(item.fields)}\n }\n \n public fun new(${getStructAttrsWithType(\n\t\t\t\t\t\t\t\titem.fields\n\t\t\t\t\t\t\t)}): ${item.name} {\n ${item.name} {\n ${getStructAttrs(item.fields)}\n }\n }\n \n ${renderGetAllFunc(item.name, item.fields)}\n ${renderGetAttrsFunc(item.name, item.fields)}\n ${renderSetAttrsFunc(item.name, item.fields)}\n ${renderSetFunc(item.name, item.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\titem.name\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\treturn `use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\titem.name\n\t\t\t\t)}::${item.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::type_name;\n use dubhe::dapps_system;\n use dubhe::dapps_schema::Dapps;\n use dubhe::storage_value::{Self, StorageValue};\n use dubhe::storage_map::{Self, StorageMap};\n use dubhe::storage_double_map::{Self, StorageDoubleMap};\n use ${projectName}::dapp_key::DappKey;\n ${generateImport(projectName, schemaName, schema)}\n\n public struct ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)} has key, store {\n id: UID,\n ${getStructAttrsWithType(schema.structure)}\n } \n \n ${Object.entries(schema.structure)\n\t\t\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t\t\treturn `public fun borrow_${key}(self: &${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\t\t\t\tschemaName\n\t\t\t\t\t\t\t\t)}) : &${value} {\n &self.${key}\n }\n \n public(package) fun borrow_mut_${key}(self: &mut ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)}): &mut ${value} {\n &mut self.${key}\n }\n `;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.join('')} \n \n \n public fun register(dapps: &mut Dapps, ctx: &mut TxContext): ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)} {\n let package_id = dapps_system::current_package_id<DappKey>();\n assert!(dapps.borrow_metadata().contains_key(package_id), 0);\n assert!(dapps.borrow_admin().get(package_id) == ctx.sender(), 0);\n let schema = type_name::get<${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\t\tschemaName\n\t\t\t\t\t\t)}>().into_string();\n assert!(!dapps.borrow_schemas().get(package_id).contains(&schema), 0);\n dapps_system::add_schema<${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\t\tschemaName\n\t\t\t\t\t\t)}>(dapps, package_id, ctx);\n ${capitalizeAndRemoveUnderscores(schemaName)} {\n id: object::new(ctx),\n ${Object.entries(schema.structure)\n\t\t\t\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t\t\t\tlet storage_type = '';\n\t\t\t\t\t\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_value::new()`;\n\t\t\t\t\t\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_map::new()`;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tvalue.includes('StorageDoubleMap')\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_double_map::new()`;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn `${key}: ${storage_type},`;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.join(' ')}\n }\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 = 'try_get()'\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tpara_key = [`key: ${all_types[0]}`]\n\t\t\t\t\tpara_value = `${all_types[1]}`\n\t\t\t\t\tborrow_key = 'try_get(key)'\n\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.${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.${key}.values()\n\t\t\t\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 = 'try_get(key1, key2)'\n\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.${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.${key}.values()\n\t\t\t\t\t\t\t\t}`\n\t\t\t\t}\n\t\t\t\treturn `public fun get_${key}(self: &${capitalizeAndRemoveUnderscores(schemaName)}, ${para_key}) : Option<${para_value}> {\n\t\t\t\t\t\t\t\t\tself.${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';\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/script/deploy_hook.move`\n\t);\n\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::deploy_hook {\n use dubhe::dapps_schema::Dapps;\n use dubhe::dapps_system;\n use ${config.name}::dapp_key::DappKey;\n use std::ascii;\n use sui::clock::Clock;\n use sui::transfer::public_share_object;\n #[test_only]\n use dubhe::dapps_schema;\n #[test_only]\n use sui::clock;\n #[test_only]\n use sui::test_scenario;\n #[test_only]\n use sui::test_scenario::Scenario;\n\n public entry fun run(dapps: &mut Dapps, clock: &Clock, ctx: &mut TxContext) {\n // Register the dapp to dubhe.\n dapps_system::register<DappKey>(\n dapps,\n ascii::string(b\"${config.name}\"),\n ascii::string(b\"${config.description}\"),\n clock,\n ctx\n );\n ${Object.keys(config.schemas)\n\t\t\t.map(schemaName => {\n\t\t\t\treturn `let ${schemaName} = ${config.name}::${schemaName}_schema::register(dapps, ctx);`;\n\t\t\t})\n\t\t\t.join('\\n')}\n // Logic that needs to be automated once the contract is deployed\n\n\n // Share the dapp object with the public\n ${Object.keys(config.schemas)\n\t\t\t.map(schemaName => {\n\t\t\t\treturn `public_share_object(${schemaName});`;\n\t\t\t})\n\t\t\t.join('\\n')}\n }\n\n #[test_only]\n public fun deploy_hook_for_testing(): (Scenario, Dapps) {\n let mut scenario = test_scenario::begin(@0xA);\n {\n let ctx = test_scenario::ctx(&mut scenario);\n dapps_schema::init_dapps_for_testing(ctx);\n test_scenario::next_tx(&mut scenario,@0xA);\n };\n let mut dapps = test_scenario::take_shared<Dapps>(&scenario);\n let ctx = test_scenario::ctx(&mut scenario);\n let clock = clock::create_for_testing(ctx);\n run(&mut dapps, &clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(&mut scenario,@0xA);\n (scenario, dapps)\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n\tconsole.log('ā
Deploy Hook Generation Complete\\n');\n}\n\nexport function generateMigrate(config: DubheConfig, srcPrefix: string) {\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::migrate {\n use dubhe::world::{World, AdminCap};\n\n /// Not the right admin for this world\n const ENotAdmin: u64 = 0;\n const EWrongVersion: u64 = 1;\n const ENotUpgrade: u64 = 2;\n const VERSION: u64 = 1;\n\n public entry fun run(world: &mut World, admin_cap: &AdminCap) {\n assert!(world.admin() == object::id(admin_cap), ENotAdmin);\n assert!(world.version() < VERSION, ENotUpgrade);\n *dubhe::world::mut_version(world, admin_cap) = VERSION;\n }\n\n public fun assert_version(world: &World){\n assert!(world.version() == VERSION, EWrongVersion);\n }\n}\n`;\n\t\tformatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nš Starting DappKey Generation...');\n\tconsole.log(\n\t\t` āā Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`\n\t);\n\n\tlet code = `module ${config.name}::dapp_key {\n\\t/// Authorization token for the app.\n\\tpublic struct DappKey has drop {}\n\n\\tpublic(package) fun new(): DappKey {\n\\t\\tDappKey { }\n\\t}\n}\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('ā
DappKey Generation Complete\\n');\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","deployHookPrefix","code","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","getStructAttrs","values","key","_","getStructTypes","values","_","type","getStructAttrsWithType","key","getStructAttrsQuery","existsSync","generateSystem","config","srcPrefix","systemName","code","formatAndWriteMove","generateToml","config","srcPrefix","frameworkId","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","code","enumNames","field","name","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemaMoudle","value","storage_type","all_types","para_key","para_value","borrow_key","extra_code","existsSync","generateDeployHook","config","srcPrefix","code","schemaName","formatAndWriteMove","generateDappKey","config","srcPrefix","code","formatAndWriteMove","matchFrameworkId","network","schemaGen","config","srcPrefix","frameworkId","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSystem","generateSchemaData","generateSchemaStructure","generateDappKey","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError"]}
|
package/package.json
CHANGED
|
@@ -231,7 +231,8 @@ export async function generateSchemaStructure(
|
|
|
231
231
|
`;
|
|
232
232
|
})
|
|
233
233
|
.join('')}
|
|
234
|
-
|
|
234
|
+
|
|
235
|
+
|
|
235
236
|
public fun register(dapps: &mut Dapps, ctx: &mut TxContext): ${capitalizeAndRemoveUnderscores(
|
|
236
237
|
schemaName
|
|
237
238
|
)} {
|
|
@@ -264,6 +265,52 @@ export async function generateSchemaStructure(
|
|
|
264
265
|
.join(' ')}
|
|
265
266
|
}
|
|
266
267
|
}
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
// ======================================== View Functions ========================================
|
|
271
|
+
${Object.entries(schema.structure)
|
|
272
|
+
.map(([key, value]) => {
|
|
273
|
+
// @ts-ignore
|
|
274
|
+
let all_types = value.match(/<(.+)>/)[1].split(',').map(type => type.trim())
|
|
275
|
+
let para_key: string[] = []
|
|
276
|
+
let para_value = ""
|
|
277
|
+
let borrow_key = ""
|
|
278
|
+
let extra_code = ""
|
|
279
|
+
if (value.includes('StorageValue')) {
|
|
280
|
+
para_key = []
|
|
281
|
+
para_value = `${all_types[0]}`
|
|
282
|
+
borrow_key = 'try_get()'
|
|
283
|
+
} else if (value.includes('StorageMap')) {
|
|
284
|
+
para_key = [`key: ${all_types[0]}`]
|
|
285
|
+
para_value = `${all_types[1]}`
|
|
286
|
+
borrow_key = 'try_get(key)'
|
|
287
|
+
extra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[0]}> {
|
|
288
|
+
self.${key}.keys()
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
public fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[1]}> {
|
|
292
|
+
self.${key}.values()
|
|
293
|
+
}`
|
|
294
|
+
} else if (value.includes('StorageDoubleMap')) {
|
|
295
|
+
para_key = [`key1: ${all_types[0]}`, `key2: ${all_types[1]}`]
|
|
296
|
+
para_value = `${all_types[2]}`
|
|
297
|
+
borrow_key = 'try_get(key1, key2)'
|
|
298
|
+
extra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : (vector<${all_types[0]}>, vector<${all_types[1]}>) {
|
|
299
|
+
self.${key}.keys()
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
public fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[2]}> {
|
|
303
|
+
self.${key}.values()
|
|
304
|
+
}`
|
|
305
|
+
}
|
|
306
|
+
return `public fun get_${key}(self: &${capitalizeAndRemoveUnderscores(schemaName)}, ${para_key}) : Option<${para_value}> {
|
|
307
|
+
self.${key}.${borrow_key}
|
|
308
|
+
}
|
|
309
|
+
` + extra_code;
|
|
310
|
+
})
|
|
311
|
+
.join('')}
|
|
312
|
+
// =========================================================================================================
|
|
313
|
+
|
|
267
314
|
|
|
268
315
|
}`;
|
|
269
316
|
await formatAndWriteMove(
|