@0xobelisk/sui-common 1.1.9 → 1.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import v from"prettier";import X from"prettier-plugin-move-js";async function T(
4
4
 
5
5
  /* Autogenerated file. Do not edit manually. */
6
6
 
7
- `,s="#[test_only]",o=n+a,i="#[allow(lint(share_owned))]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?o=a:t.includes("init")?o=s+a:t.includes("genesis")&&(o=i+a),await $.mkdir(R.dirname(t),{recursive:!0}),await $.writeFile(t,o),h(`${r}: ${t}`)}async function Te(e,t,r){let a=await C(e);await $.mkdir(R.dirname(t),{recursive:!0}),await $.writeFile(t,a),h(`${r}: ${t}`)}function Ve(e){return e.replace(/\\/g,"/")}import{existsSync as k}from"fs";import _ from"fs";function x(e){_.existsSync(e)&&(_.readdirSync(e).forEach(t=>{let r=`${e}/${t}`;_.lstatSync(r).isDirectory()?x(r):_.unlinkSync(r)}),_.rmdirSync(e))}function g(e){return Object.entries(e).map(([t,r])=>`${t}`).join(",")}function E(e){return`(${Object.entries(e).map(([t,r])=>`${r}`)})`}function u(e){return Object.entries(e).map(([t,r])=>`${t}: ${r}`)}function U(e){return Object.entries(e).map(([t,r])=>`self.${t}`)}function W(e,t){for(let r in e)if(e.hasOwnProperty(r)){let a=e[r];if(typeof a=="string"&&a===t||typeof a=="string"&&a.includes(t)&&a.includes(">"))return!0}return!1}async function O(e,t){console.log(`
7
+ `,s="#[test_only]",o=n+a,i="#[allow(lint(share_owned))]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?o=a:t.includes("init")?o=s+a:t.includes("genesis")&&(o=i+a),await $.mkdir(R.dirname(t),{recursive:!0}),await $.writeFile(t,o),h(`${r}: ${t}`)}async function Te(e,t,r){let a=await C(e);await $.mkdir(R.dirname(t),{recursive:!0}),await $.writeFile(t,a),h(`${r}: ${t}`)}function Ve(e){return e.replace(/\\/g,"/")}import{existsSync as k}from"fs";import _ from"fs";function x(e){_.existsSync(e)&&(_.readdirSync(e).forEach(t=>{let r=`${e}/${t}`;_.lstatSync(r).isDirectory()?x(r):_.unlinkSync(r)}),_.rmdirSync(e))}function g(e){return Object.entries(e).map(([t,r])=>`${t}`).join(",")}function E(e){return`(${Object.entries(e).map(([t,r])=>`${r}`)})`}function p(e){return Object.entries(e).map(([t,r])=>`${t}: ${r}`)}function U(e){return Object.entries(e).map(([t,r])=>`self.${t}`)}function W(e,t){for(let r in e)if(e.hasOwnProperty(r)){let a=e[r];if(typeof a=="string"&&a===t||typeof a=="string"&&a.includes(t)&&a.includes(">"))return!0}return!1}async function O(e,t){console.log(`
8
8
  \u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/contracts/${e.name}/Move.toml`);let r=`[package]
9
9
  name = "${e.name}"
10
10
  version = "1.0.0"
@@ -21,7 +21,7 @@ ${e.name} = "0x0"
21
21
  `)}function N(e){return e.sort((t,r)=>{let a=t.charAt(0).toLowerCase(),n=r.charAt(0).toLowerCase();return a<n?-1:a>n?1:0})}function ee(e,t){return Object.entries(t).map(([r,a])=>`public(package) fun set_${r}(self: &mut ${e}, ${r}: ${a}) {
22
22
  self.${r} = ${r};
23
23
  }`).join(`
24
- `)}function te(e,t){return`public(package) fun set(self: &mut ${e}, ${u(t)}) {
24
+ `)}function te(e,t){return`public(package) fun set(self: &mut ${e}, ${p(t)}) {
25
25
  ${Object.entries(t).map(([r])=>`self.${r} = ${r};`).join(`
26
26
  `)}
27
27
  }`}function re(e,t){return`public fun get(self: &${e}): ${E(t)} {
@@ -30,24 +30,24 @@ ${e.name} = "0x0"
30
30
  self.${r}
31
31
  }`).join(`
32
32
  `)}function l(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}async function j(e,t,r){console.log(`
33
- \u{1F4E6} Starting Schema Data Generation...`);for(let a of Object.keys(t)){let n=a,s=t[a];console.log(` \u2514\u2500 ${n} ${Array.isArray(s)?"(enum)":"(struct)"}: ${JSON.stringify(s)}`);let o="",i=Object.keys(t).filter(p=>Array.isArray(t[p])).map(p=>p);if(Array.isArray(s)){let p=N(s);o=`module ${e}::${e}_${l(n)} {
33
+ \u{1F4E6} Starting Schema Data Generation...`);for(let a of Object.keys(t)){let n=a,s=t[a];console.log(` \u2514\u2500 ${n} ${Array.isArray(s)?"(enum)":"(struct)"}: ${JSON.stringify(s)}`);let o="",i=Object.keys(t).filter(u=>Array.isArray(t[u])).map(u=>u);if(Array.isArray(s)){let u=N(s);o=`module ${e}::${e}_${l(n)} {
34
34
  public enum ${n} has copy, drop , store {
35
- ${p}
35
+ ${u}
36
36
  }
37
37
 
38
- ${p.map(m=>`public fun new_${l(m)}(): ${n} {
38
+ ${u.map(m=>`public fun new_${l(m)}(): ${n} {
39
39
  ${n}::${m}
40
40
  }`).join("")}`}else o=`module ${e}::${e}_${l(n)} {
41
41
  use std::ascii::String;
42
42
 
43
- ${Object.keys(t).map(p=>{if(W(s,p))return`use ${e}::${e}_${l(p)}::${p};`}).filter(Boolean).join(`
43
+ ${Object.keys(t).map(u=>{if(W(s,u))return`use ${e}::${e}_${l(u)}::${u};`}).filter(Boolean).join(`
44
44
  `)}
45
45
 
46
46
  public struct ${n} has copy, drop , store {
47
- ${u(s)}
47
+ ${p(s)}
48
48
  }
49
49
 
50
- public fun new(${u(s)}): ${n} {
50
+ public fun new(${p(s)}): ${n} {
51
51
  ${n} {
52
52
  ${g(s)}
53
53
  }
@@ -154,11 +154,22 @@ ${e.name} = "0x0"
154
154
  &self.id
155
155
  }
156
156
 
157
- public fun migrate(_schema: &mut Schema, _cap: &UpgradeCap, _ctx: &mut TxContext) { }
157
+ public fun migrate(_schema: &mut Schema, _ctx: &mut TxContext) { }
158
+
159
+
160
+ public(package) fun upgrade(schema: &mut Schema, new_package_id: address, new_version: u32, ctx: &mut TxContext) {
161
+ assert!(schema.dapp__metadata().contains(), 0);
162
+ assert!(schema.dapp__admin().get() == ctx.sender(), 0);
163
+ schema.dapp__package_id().set(new_package_id);
164
+ let current_version = schema.dapp__version()[];
165
+ assert!(current_version < new_version, 0);
166
+ schema.dapp__version().set(new_version);
167
+ schema.migrate(ctx);
168
+ }
158
169
 
159
170
 
160
171
  // ======================================== View Functions ========================================
161
- ${Object.entries(r).map(([s,o])=>{let i=o.match(/<(.+)>/)[1].split(",").map(P=>P.trim()),p=[],m="",f="";return o.includes("StorageValue")?(p=[],m=`${i[0]}`,f="get()"):o.includes("StorageMap")?(p=[`key: ${i[0]}`],m=`${i[1]}`,f="get(key)"):o.includes("StorageDoubleMap")&&(p=[`key1: ${i[0]}`,`key2: ${i[1]}`],m=`${i[2]}`,f="get(key1, key2)"),`public fun get_${s}(self: &Schema, ${p}) : &${m} {
172
+ ${Object.entries(r).map(([s,o])=>{let i=o.match(/<(.+)>/)[1].split(",").map(P=>P.trim()),u=[],m="",f="";return o.includes("StorageValue")?(u=[],m=`${i[0]}`,f="get()"):o.includes("StorageMap")?(u=[`key: ${i[0]}`],m=`${i[1]}`,f="get(key)"):o.includes("StorageDoubleMap")&&(u=[`key1: ${i[0]}`,`key2: ${i[1]}`],m=`${i[2]}`,f="get(key1, key2)"),`public fun get_${s}(self: &Schema, ${u}) : &${m} {
162
173
  self.borrow_${s}().${f}
163
174
  }`}).join(`
164
175
  `)}
@@ -178,27 +189,27 @@ ${e.name} = "0x0"
178
189
  }
179
190
  `;await c(r,`${t}/contracts/${e.name}/sources/scripts/migrate.move`,"formatAndWriteMove")}}function d(e){return e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()).join("")}function oe(e){return e.replace(/([A-Z])/g,"_$1").toLowerCase().replace(/^_/,"")}function I(e,t){return t!=null?Object.keys(t).map(a=>`use ${e}::${e}_${oe(a)}::${a};`).join(`
180
191
  `):""}async function D(e,t,r,a){console.log(`
181
- \u{1F4E6} Starting Schema Event Generation...`);for(let s of Object.keys(r)){let o=s,i=r[s];console.log(` \u2514\u2500 ${o} event: ${JSON.stringify(i)}`);let p=`module ${e}::${e}_${o}_event {
192
+ \u{1F4E6} Starting Schema Event Generation...`);for(let s of Object.keys(r)){let o=s,i=r[s];console.log(` \u2514\u2500 ${o} event: ${JSON.stringify(i)}`);let u=`module ${e}::${e}_${o}_event {
182
193
  use sui::event;
183
194
  use std::ascii::String;
184
195
  ${I(e,t)}
185
196
 
186
197
  public struct ${d(o)}Event has copy, drop {
187
- ${u(i)}
198
+ ${p(i)}
188
199
  }
189
200
 
190
- public fun new(${u(i)}): ${d(o)}Event {
201
+ public fun new(${p(i)}): ${d(o)}Event {
191
202
  ${d(o)}Event {
192
203
  ${g(i)}
193
204
  }
194
205
  }
195
- }`;await c(p,`${a}/contracts/${e}/sources/codegen/data/${o}_event.move`,"formatAndWriteMove")}let n=`module ${e}::${e}_events {
206
+ }`;await c(u,`${a}/contracts/${e}/sources/codegen/data/${o}_event.move`,"formatAndWriteMove")}let n=`module ${e}::${e}_events {
196
207
  use std::ascii::{String, string};
197
208
  ${I(e,t)}
198
209
  ${Object.entries(r).map(([s,o])=>`
199
210
  use ${e}::${e}_${s}_event::${d(s)}Event;
200
211
  use ${e}::${e}_${s}_event;
201
- public fun ${s}_event(${u(o)}) {
212
+ public fun ${s}_event(${p(o)}) {
202
213
  dubhe::storage_event::emit_set_record<${d(s)}Event, ${d(s)}Event, ${d(s)}Event>(
203
214
  string(b"${s}_event"),
204
215
  option::none(),
@@ -208,14 +219,14 @@ use ${e}::${e}_${s}_event;
208
219
  }
209
220
  `).join(`
210
221
  `)}
211
- }`;await c(n,`${a}/contracts/${e}/sources/codegen/events.move`,"formatAndWriteMove")}import{existsSync as ne}from"fs";import ie from"node:fs/promises";async function K(e,t){ne(`${t}/contracts/${e.name}/sources/systems`)||await ie.mkdir(`${t}/contracts/${e.name}/sources/systems`,{recursive:!0})}async function G(e,t,r){console.log(`
222
+ }`;await c(n,`${a}/contracts/${e}/sources/codegen/events.move`,"formatAndWriteMove")}import{existsSync as ne}from"fs";import ie from"node:fs/promises";async function G(e,t){ne(`${t}/contracts/${e.name}/sources/systems`)||await ie.mkdir(`${t}/contracts/${e.name}/sources/systems`,{recursive:!0})}async function z(e,t,r){console.log(`
212
223
  \u{1F4E6} Starting Schema Error Generation...`);let a=`module ${e}::${e}_errors {
213
224
  ${Object.entries(t).map(([n,s])=>(console.log(` \u2514\u2500 ${n}: ${s}`),`#[error]
214
225
  const ${n.toUpperCase()}: vector<u8> = b"${s}";
215
226
  public fun ${n}_error(condition: bool) { assert!(condition, ${n.toUpperCase()}) }
216
227
  `)).join(`
217
228
  `)}
218
- }`;await c(a,`${r}/contracts/${e}/sources/codegen/errors.move`,"formatAndWriteMove")}import{existsSync as z}from"fs";async function H(e,t){await ce(e,t),await pe(e,t)}async function ce(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/core/metadata.move`;if(!z(r)){let a=`module ${e.name}::${e.name}_dapp_metadata {
229
+ }`;await c(a,`${r}/contracts/${e}/sources/codegen/errors.move`,"formatAndWriteMove")}import{existsSync as K}from"fs";async function H(e,t){await ce(e,t),await ue(e,t)}async function ce(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/core/metadata.move`;if(!K(r)){let a=`module ${e.name}::${e.name}_dapp_metadata {
219
230
  use std::ascii::String;
220
231
 
221
232
  public struct DappMetadata has drop, copy, store {
@@ -310,7 +321,7 @@ use ${e}::${e}_${s}_event;
310
321
  self.partners
311
322
  }
312
323
  }
313
- `;await c(a,r,"formatAndWriteMove")}}async function pe(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/core/system.move`;if(!z(r)){let a=`module ${e.name}::${e.name}_dapp_system {
324
+ `;await c(a,r,"formatAndWriteMove")}}async function ue(e,t){let r=`${t}/contracts/${e.name}/sources/codegen/core/system.move`;if(!K(r)){let a=`module ${e.name}::${e.name}_dapp_system {
314
325
  use std::ascii::String;
315
326
  use std::ascii;
316
327
  use dubhe::type_info;
@@ -322,11 +333,6 @@ use ${e}::${e}_${s}_event;
322
333
  use dubhe::storage::add_field;
323
334
  use dubhe::storage_value;
324
335
  use dubhe::storage_value::StorageValue;
325
-
326
- public struct DappKey has drop {}
327
- public(package) fun new(): DappKey {
328
- DappKey { }
329
- }
330
336
 
331
337
  public entry fun set_metadata(
332
338
  schema: &mut Schema,
@@ -395,7 +401,7 @@ use ${e}::${e}_${s}_event;
395
401
  vector[]
396
402
  )
397
403
  );
398
- let package_id = type_info::current_package_id<DappKey>();
404
+ let package_id = type_info::current_package_id<Schema>();
399
405
  schema.dapp__package_id().set(package_id);
400
406
  schema.dapp__admin().set(ctx.sender());
401
407
  schema.dapp__version().set(1);
@@ -403,15 +409,6 @@ use ${e}::${e}_${s}_event;
403
409
  schema.dapp__authorised_schemas().set(vector[]);
404
410
  }
405
411
 
406
- public(package) fun upgrade<DappKey: drop>(schema: &mut Schema, ctx: &TxContext) {
407
- assert!(schema.dapp__metadata().contains(), 0);
408
- assert!(schema.dapp__admin().get() == ctx.sender(), 0);
409
- let new_package_id = type_info::current_package_id<DappKey>();
410
- schema.dapp__package_id().set(new_package_id);
411
- let current_version = schema.dapp__version()[];
412
- schema.dapp__version().set(current_version + 1);
413
- }
414
-
415
412
  public(package) fun add_schema<S: key + store>(schema: &mut Schema, new_schema: S) {
416
413
  let mut schemas = schema.dapp__authorised_schemas()[];
417
414
  schemas.push_back(object::id_address<S>(&new_schema));
@@ -454,7 +451,7 @@ use ${e}::${e}_${s}_event;
454
451
  }
455
452
  }
456
453
  `;await c(a,`${t}/contracts/${e.name}/sources/codegen/core/genesis.move`,"formatAndWriteMove")}async function gt(e,t,r){console.log(`
457
- \u{1F680} Starting Schema Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${e.name}`),console.log(` \u2514\u2500 Description: ${e.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${r||"testnet"}`);let a=t??process.cwd();k(`${a}/contracts/${e.name}`)&&x(`${a}/contracts/${e.name}/sources/codegen`),k(`${a}/contracts/${e.name}/Move.toml`)||await O(e,a),k(`${a}/contracts/${e.name}/sources/script/deploy_hook.move`)||await L(e,a),e.events&&(e.data?await D(e.name,e.data,e.events,a):await D(e.name,null,e.events,a)),e.data?(await j(e.name,e.data,a),await w(e.name,e.data,e.schemas,a)):await w(e.name,null,e.schemas,a),e.errors&&await G(e.name,e.errors,a),await H(e,a),await Q(e,a),await K(e,a),await B(e,a),console.log(`
454
+ \u{1F680} Starting Schema Generation Process...`),console.log("\u{1F4CB} Project Configuration:"),console.log(` \u2514\u2500 Name: ${e.name}`),console.log(` \u2514\u2500 Description: ${e.description||"No description provided"}`),console.log(` \u2514\u2500 Network: ${r||"testnet"}`);let a=t??process.cwd();k(`${a}/contracts/${e.name}`)&&x(`${a}/contracts/${e.name}/sources/codegen`),k(`${a}/contracts/${e.name}/Move.toml`)||await O(e,a),k(`${a}/contracts/${e.name}/sources/script/deploy_hook.move`)||await L(e,a),e.events&&(e.data?await D(e.name,e.data,e.events,a):await D(e.name,null,e.events,a)),e.data?(await j(e.name,e.data,a),await w(e.name,e.data,e.schemas,a)):await w(e.name,null,e.schemas,a),e.errors&&await z(e.name,e.errors,a),await H(e,a),await Q(e,a),await G(e,a),await B(e,a),console.log(`
458
455
  \u2705 Schema Generation Process Complete!
459
- `)}import{findUp as ue}from"find-up";import A from"path";import me from"esbuild";var S=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as de}from"fs";import{pathToFileURL as le}from"url";import _e from"os";var ge=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],M="dubhe.config.example.mjs";async function Dt(e){e=await Z(e);try{return await me.build({entryPoints:[e],format:"esm",outfile:M,platform:"node",bundle:!0,packages:"external"}),e=await Z(M,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{de(M,{force:!0})}}async function Z(e,t){return e===void 0?e=await fe():A.isAbsolute(e)||(e=A.join(process.cwd(),e),e=A.normalize(e)),t&&_e.platform()==="win32"?le(e).href:e}async function fe(){let e=await ue(ge);if(e===void 0)throw new S;return e}function Et(...e){if(e.length===1)return`StorageValue<${e[0]}>`;if(e.length===2)return`StorageMap<${e[0]}, ${e[1]}>`;if(e.length===3)return`StorageDoubleMap<${e[0]}, ${e[1]}, ${e[2]}>`;throw new Error("Invalid number of arguments for storage()")}var y=e=>{if(typeof e!="object"||e===null)return e;let t={};for(let r in e)if(e.hasOwnProperty(r)){let a=e[r];typeof a=="object"&&a!==null?Array.isArray(a)?t[r]=J(a):a.hasOwnProperty("variant")?t[r]={[a.variant]:{}}:a.hasOwnProperty("fields")?t[r]=y(a.fields):t[r]=y(a):t[r]=a}return t},J=e=>{let t=[];return e.forEach(r=>{typeof r=="object"&&r!==null?Array.isArray(r)?t.push(J(r)):r.hasOwnProperty("variant")?t.push({[r.variant]:{}}):r.hasOwnProperty("fields")?t.push(y(r.fields)):t.push(y(r)):t.push(r)}),t};var be=(r=>(r.Event="event",r.Schema="schema",r))(be||{});export{be as SubscriptionKind,c as formatAndWriteMove,Te as formatAndWriteTypescript,T as formatMove,C as formatTypescript,Dt as loadConfig,y as parseData,Ve as posixPath,Z as resolveConfigPath,gt as schemaGen,Et as storage};
456
+ `)}import{findUp as pe}from"find-up";import A from"path";import me from"esbuild";var S=class extends Error{name="NotInsideProjectError";message="You are not inside a Dubhe project"};import{rmSync as de}from"fs";import{pathToFileURL as le}from"url";import _e from"os";var ge=["dubhe.config.js","dubhe.config.mjs","dubhe.config.ts","dubhe.config.mts"],M="dubhe.config.example.mjs";async function Dt(e){e=await Z(e);try{return await me.build({entryPoints:[e],format:"esm",outfile:M,platform:"node",bundle:!0,packages:"external"}),e=await Z(M,!0),(await import(e+`?update=${Date.now()}`)).dubheConfig}finally{de(M,{force:!0})}}async function Z(e,t){return e===void 0?e=await fe():A.isAbsolute(e)||(e=A.join(process.cwd(),e),e=A.normalize(e)),t&&_e.platform()==="win32"?le(e).href:e}async function fe(){let e=await pe(ge);if(e===void 0)throw new S;return e}function Et(...e){if(e.length===1)return`StorageValue<${e[0]}>`;if(e.length===2)return`StorageMap<${e[0]}, ${e[1]}>`;if(e.length===3)return`StorageDoubleMap<${e[0]}, ${e[1]}, ${e[2]}>`;throw new Error("Invalid number of arguments for storage()")}var y=e=>{if(typeof e!="object"||e===null)return e;let t={};for(let r in e)if(e.hasOwnProperty(r)){let a=e[r];typeof a=="object"&&a!==null?Array.isArray(a)?t[r]=J(a):a.hasOwnProperty("variant")?t[r]={[a.variant]:{}}:a.hasOwnProperty("fields")?t[r]=y(a.fields):t[r]=y(a):t[r]=a}return t},J=e=>{let t=[];return e.forEach(r=>{typeof r=="object"&&r!==null?Array.isArray(r)?t.push(J(r)):r.hasOwnProperty("variant")?t.push({[r.variant]:{}}):r.hasOwnProperty("fields")?t.push(y(r.fields)):t.push(y(r)):t.push(r)}),t};var be=(r=>(r.Event="event",r.Schema="schema",r))(be||{});export{be as SubscriptionKind,c as formatAndWriteMove,Te as formatAndWriteTypescript,T as formatMove,C as formatTypescript,Dt as loadConfig,y as parseData,Ve as posixPath,Z as resolveConfigPath,gt as schemaGen,Et as storage};
460
457
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/schemaGen.ts","../src/codegen/utils/renderMove/common.ts","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateEvent.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateError.ts","../src/codegen/utils/renderMove/generateDefaultSchema.ts","../src/codegen/utils/renderMove/generateInit.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts","../src/codegen/types/index.ts","../src/parseData/parser/index.ts","../src/primitives/index.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(content: string, prettierConfigPath?: string): Promise<string> {\n let config;\n if (prettierConfigPath) {\n config = await prettier.resolveConfig(prettierConfigPath);\n }\n try {\n return prettier.format(content, {\n plugins: [prettierPluginMove],\n parser: 'move-parse',\n printWidth: 120,\n semi: true,\n tabWidth: 2,\n useTabs: false,\n bracketSpacing: true,\n ...config\n });\n } catch (error) {\n let message;\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = error;\n }\n console.log(`Error during output formatting: ${message}`);\n return content;\n }\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n return prettier.format(content, {\n parser: 'typescript'\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { formatMove, formatTypescript } from './format';\nimport { debug } from '../debug';\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = await formatMove(output);\n let schemaPrefix = ` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: Apache-2.0\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `;\n\n let initPrefix = `#[test_only]`;\n\n let code = schemaPrefix + formattedOutput;\n\n let deployHookPrefix = `#[allow(lint(share_owned))]`;\n\n if (\n fullOutputPath.includes('.toml') ||\n fullOutputPath.includes('system') ||\n fullOutputPath.includes('migrate')\n ) {\n code = formattedOutput;\n } else if (fullOutputPath.includes('init')) {\n code = initPrefix + formattedOutput;\n } else if (fullOutputPath.includes('genesis')) {\n code = deployHookPrefix + formattedOutput;\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from 'debug';\n\nexport const debug = createDebug('dubhe:common');\nexport const error = createDebug('dubhe:common');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from '../debug';\n\nexport const debug = parentDebug.extend('codegen');\nexport const error = parentDebug.extend('codegen');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","/**\n * Explicitly normalize a given path to a posix path (using `/` as separator).\n * This should be used for generating Solidity files that will be consumed by solc,\n * because solc expects `/` as path separator, but path.join produces `\\` if the user is on windows.\n */\nexport function posixPath(path: string): string {\n return path.replace(/\\\\/g, '/');\n}\n","import { 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(` └─ Description: ${config.description || 'No description provided'}`);\n console.log(` └─ Network: ${network || 'testnet'}`);\n\n const path = srcPrefix ?? process.cwd();\n\n if (existsSync(`${path}/contracts/${config.name}`)) {\n deleteFolderRecursive(`${path}/contracts/${config.name}/sources/codegen`);\n }\n\n if (!existsSync(`${path}/contracts/${config.name}/Move.toml`)) {\n await generateToml(config, path);\n }\n\n if (!existsSync(`${path}/contracts/${config.name}/sources/script/deploy_hook.move`)) {\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('\\n✅ Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n if (fs.existsSync(path)) {\n fs.readdirSync(path).forEach((file) => {\n const curPath = `${path}/${file}`;\n if (fs.lstatSync(curPath).isDirectory()) {\n deleteFolderRecursive(curPath);\n } else {\n fs.unlinkSync(curPath);\n }\n });\n fs.rmdirSync(path);\n }\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(values: Record<string, string> | string): string {\n return Object.entries(values)\n .map(([key, _]) => `${key}`)\n .join(',');\n}\n\nfunction isAddress(str: string): boolean {\n const regex = /^0x[a-fA-F0-9]+$/;\n return regex.test(str);\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaType): string {\nexport function getStructTypes(values: Record<string, string>): string {\n return `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n\nexport function containsString(obj: Record<string, any>, searchString: string): boolean {\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const value = obj[key];\n if (\n (typeof value === 'string' && value === searchString) ||\n (typeof value === 'string' && value.includes(searchString) && value.includes('>'))\n ) {\n return true;\n }\n }\n }\n return false;\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateToml(config: DubheConfig, srcPrefix: string) {\n console.log('\\n📄 Starting Move.toml Generation...');\n console.log(` └─ Output path: ${srcPrefix}/contracts/${config.name}/Move.toml`);\n\n let code = `[package]\nname = \"${config.name}\"\nversion = \"1.0.0\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.38.3\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe-framework.git\", rev = \"dubhe-mainnet-v1.1.0\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x0\"\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/Move.toml`,\n 'formatAndWriteMove'\n );\n console.log('✅ Move.toml Generation Complete\\n');\n}\n","import { BaseType, SchemaData, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n getStructAttrsWithType,\n getStructAttrs,\n getStructTypes,\n getStructAttrsQuery,\n containsString\n} from './common';\n\nfunction sortByFirstLetter(arr: string[]): string[] {\n return arr.sort((a, b) => {\n const firstLetterA = a.charAt(0).toLowerCase();\n const firstLetterB = b.charAt(0).toLowerCase();\n\n if (firstLetterA < firstLetterB) {\n return -1;\n }\n if (firstLetterA > firstLetterB) {\n return 1;\n }\n return 0;\n });\n}\n\nexport function capitalizeAndRemoveUnderscores(input: string): string {\n return input\n .split('_')\n .map((word, index) => {\n return index === 0\n ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nexport function renderSetAttrsFunc(\n schemaName: string,\n fields: BaseType | Record<string, BaseType>\n): string {\n return Object.entries(fields)\n .map(\n ([key, type]) =>\n `public(package) fun set_${key}(self: &mut ${schemaName}, ${key}: ${type}) {\n self.${key} = ${key};\n }`\n )\n .join('\\n');\n}\n\nexport function renderSetFunc(schemaName: string, fields: Record<string, string>): string {\n return `public(package) fun set(self: &mut ${schemaName}, ${getStructAttrsWithType(fields)}) {\n ${Object.entries(fields)\n .map(([fieldName]) => `self.${fieldName} = ${fieldName};`)\n .join('\\n')}\n }`;\n}\n\nexport function renderGetAllFunc(schemaName: string, fields: Record<string, string>): string {\n return `public fun get(self: &${schemaName}): ${getStructTypes(fields)} {\n (${getStructAttrsQuery(fields)})\n }`;\n}\n\nexport function renderGetAttrsFunc(\n schemaName: string,\n fields: BaseType | Record<string, BaseType>\n): string {\n return Object.entries(fields)\n .map(\n ([key, type]) => `public fun get_${key}(self: &${schemaName}): ${type} {\n self.${key}\n }`\n )\n .join('\\n');\n}\n\nfunction convertToSnakeCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n}\n\nexport async function generateSchemaData(\n projectName: string,\n data: Record<string, SchemaData>,\n path: string\n) {\n console.log('\\n📦 Starting Schema Data Generation...');\n for (const key of Object.keys(data)) {\n const name = key;\n const fields = data[key];\n console.log(\n ` └─ ${name} ${Array.isArray(fields) ? '(enum)' : '(struct)'}: ${JSON.stringify(fields)}`\n );\n let code = '';\n\n const enumNames = Object.keys(data)\n .filter((item) => Array.isArray(data[item]))\n .map((item) => item);\n\n if (Array.isArray(fields)) {\n const sortByFirstLetterFields = sortByFirstLetter(fields);\n code = `module ${projectName}::${projectName}_${convertToSnakeCase(name)} {\n public enum ${name} has copy, drop , store {\n ${sortByFirstLetterFields}\n }\n \n ${sortByFirstLetterFields\n .map((field: string) => {\n return `public fun new_${convertToSnakeCase(field)}(): ${name} {\n ${name}::${field}\n }`;\n })\n .join('')}`;\n } else {\n code = `module ${projectName}::${projectName}_${convertToSnakeCase(name)} {\n use std::ascii::String;\n \n\t\t\t\t\t\t${Object.keys(data)\n .map((name) => {\n if (containsString(fields, name)) {\n return `use ${projectName}::${projectName}_${convertToSnakeCase(name)}::${name};`;\n }\n return undefined;\n })\n .filter(Boolean)\n .join('\\n')}\n\n public struct ${name} has copy, drop , store {\n ${getStructAttrsWithType(fields)}\n }\n \n public fun new(${getStructAttrsWithType(fields)}): ${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 }\n\n await formatAndWriteMove(\n code,\n `${path}/contracts/${projectName}/sources/codegen/data/${convertToSnakeCase(name)}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateImport(projectName: string, data: Record<string, SchemaData> | null) {\n if (data != null) {\n const names = Object.keys(data);\n return names\n .map((name) => {\n return `use ${projectName}::${projectName}_${convertToSnakeCase(name)}::${name};`;\n })\n .join('\\n');\n } else {\n return '';\n }\n}\n\nexport async function generateSchemaStructure(\n projectName: string,\n data: Record<string, SchemaData> | null,\n schemas: Record<string, SchemaType>,\n path: string\n) {\n console.log('\\n🔨 Starting Schema Structure Generation...');\n Object.entries(schemas).forEach(([key, value]) => {\n console.log(` └─ ${key}: ${value}`);\n });\n const schemaMoudle = `module ${projectName}::${projectName}_schema {\n use std::ascii::String;\n use std::ascii::string;\n use sui::package::UpgradeCap;\n use std::type_name; \n use dubhe::storage;\n use dubhe::storage_value::{Self, StorageValue};\n use dubhe::storage_map::{Self, StorageMap};\n use dubhe::storage_double_map::{Self, StorageDoubleMap};\n use sui::dynamic_field as df;\n use ${projectName}::${projectName}_dapp_metadata::DappMetadata;\n \n ${generateImport(projectName, data)}\n\n public struct Schema has key, store { id: UID } \n\n // Default storage\n public fun borrow_dapp__admin(self: &Schema): &StorageValue<address> {\n storage::borrow_field(&self.id, b\"dapp__admin\")\n }\n\n public fun borrow_dapp__package_id(self: &Schema): &StorageValue<address> {\n storage::borrow_field(&self.id, b\"dapp__package_id\")\n }\n\n public fun borrow_dapp__version(self: &Schema): &StorageValue<u32> {\n storage::borrow_field(&self.id, b\"dapp__version\")\n }\n\n public fun borrow_dapp__metadata(self: &Schema): &StorageValue<DappMetadata> {\n storage::borrow_field(&self.id, b\"dapp__metadata\")\n }\n\n public fun borrow_dapp__safe_mode(self: &Schema): &StorageValue<bool> {\n storage::borrow_field(&self.id, b\"dapp__safe_mode\")\n }\n\n public fun borrow_dapp__authorised_schemas(self: &Schema): &StorageValue<vector<address>> {\n storage::borrow_field(&self.id, b\"dapp__authorised_schemas\")\n }\n\n public fun borrow_dapp__schemas(self: &Schema): &StorageValue<vector<address>> {\n storage::borrow_field(&self.id, b\"dapp__schemas\")\n }\n\n public(package) fun dapp__admin(self: &mut Schema): &mut StorageValue<address> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__admin\")\n }\n\n public(package) fun dapp__package_id(self: &mut Schema): &mut StorageValue<address> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__package_id\")\n }\n\n public(package) fun dapp__version(self: &mut Schema): &mut StorageValue<u32> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__version\")\n }\n\n public(package) fun dapp__metadata(self: &mut Schema): &mut StorageValue<DappMetadata> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__metadata\")\n }\n\n public(package) fun dapp__safe_mode(self: &mut Schema): &mut StorageValue<bool> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__safe_mode\")\n }\n\n public(package) fun dapp__authorised_schemas(self: &mut Schema): &mut StorageValue<vector<address>> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__authorised_schemas\")\n }\n \n ${Object.entries(schemas)\n .map(([key, value]) => {\n return `public fun borrow_${key}(self: &Schema) : &${value} {\n storage::borrow_field(&self.id, b\"${key}\")\n }\n \n public(package) fun ${key}(self: &mut Schema): &mut ${value} {\n storage::borrow_mut_field(&mut self.id, b\"${key}\")\n }\n `;\n })\n .join('')} \n \n \n public(package) fun create(ctx: &mut TxContext): Schema {\n let mut id = object::new(ctx);\n ${Object.entries(schemas)\n .map(([key, value]) => {\n let storage_type = '';\n if (value.includes('StorageValue')) {\n storage_type = `storage_value::new(b\"${key}\", ctx)`;\n } else if (value.includes('StorageMap')) {\n storage_type = `storage_map::new(b\"${key}\", ctx)`;\n } else if (value.includes('StorageDoubleMap')) {\n storage_type = `storage_double_map::new(b\"${key}\", ctx)`;\n }\n return `storage::add_field<${value}>(&mut id, b\"${key}\", ${storage_type});`;\n })\n .join('\\n')}\n \n Schema { id }\n }\n \n public(package) fun id(self: &mut Schema): &mut UID {\n\t\t\t\t\t &mut self.id\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tpublic(package) fun borrow_id(self: &Schema): &UID {\n\t\t\t\t\t &self.id\n\t\t\t\t\t}\n \n public fun migrate(_schema: &mut Schema, _cap: &UpgradeCap, _ctx: &mut TxContext) { }\n\n \n // ======================================== View Functions ========================================\n ${Object.entries(schemas)\n .map(([key, value]) => {\n // @ts-ignore\n let all_types = value\n .match(/<(.+)>/)[1]\n .split(',')\n .map((type) => type.trim());\n let para_key: string[] = [];\n let para_value = '';\n let borrow_key = '';\n if (value.includes('StorageValue')) {\n para_key = [];\n para_value = `${all_types[0]}`;\n borrow_key = 'get()';\n } else if (value.includes('StorageMap')) {\n para_key = [`key: ${all_types[0]}`];\n para_value = `${all_types[1]}`;\n borrow_key = 'get(key)';\n } else if (value.includes('StorageDoubleMap')) {\n para_key = [`key1: ${all_types[0]}`, `key2: ${all_types[1]}`];\n para_value = `${all_types[2]}`;\n borrow_key = 'get(key1, key2)';\n }\n return `public fun get_${key}(self: &Schema, ${para_key}) : &${para_value} {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().${borrow_key}\n\t\t\t\t\t\t\t\t}`;\n })\n .join('\\n')}\n // =========================================================================================================\n\t\t\t}`;\n await formatAndWriteMove(\n schemaMoudle,\n\n `${path}/contracts/${projectName}/sources/codegen/core/schema.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nimport { readFileSync } from 'fs';\n\nexport async function generateDeployHook(config: DubheConfig, srcPrefix: string) {\n const path = `${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`;\n if (!existsSync(path)) {\n const code = `module ${config.name}::${config.name}_deploy_hook {\n\t\t\t use ${config.name}::${config.name}_schema::Schema;\n\n public(package) fun run(_schema: &mut Schema, _ctx: &mut TxContext) {\n\n }\n}`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`)) {\n let code = `module ${config.name}::${config.name}_migrate {\n const ON_CHAIN_VERSION: u32 = 1;\n\n public fun on_chain_version(): u32 {\n ON_CHAIN_VERSION\n }\n}\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`,\n 'formatAndWriteMove'\n );\n }\n}\n","import { BaseType, EventData, SchemaData, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n getStructAttrsWithType,\n getStructAttrs,\n getStructTypes,\n getStructAttrsQuery\n} from './common';\n\n// account_not_found => AccountNotFound,\nfunction toPascalCase(str: string): string {\n return str\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\nfunction convertToSnakeCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n}\n\nfunction generateImport(projectName: string, data: Record<string, SchemaData> | null) {\n if (data != null) {\n const names = Object.keys(data);\n return names\n .map((name) => {\n return `use ${projectName}::${projectName}_${convertToSnakeCase(name)}::${name};`;\n })\n .join('\\n');\n } else {\n return '';\n }\n}\n\nexport async function generateSchemaEvent(\n projectName: string,\n data: Record<string, SchemaData> | null,\n events: Record<string, EventData>,\n path: string\n) {\n console.log('\\n📦 Starting Schema Event Generation...');\n for (const key of Object.keys(events)) {\n const name = key;\n const fields = events[key];\n console.log(` └─ ${name} event: ${JSON.stringify(fields)}`);\n\n let code = `module ${projectName}::${projectName}_${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 ${toPascalCase(name)}Event has copy, drop {\n ${getStructAttrsWithType(fields as Record<string, string>)}\n }\n\n public fun new(${getStructAttrsWithType(fields as Record<string, string>)}): ${toPascalCase(name)}Event {\n ${toPascalCase(name)}Event {\n ${getStructAttrs(fields as Record<string, string>)}\n }\n }\n }`;\n await formatAndWriteMove(\n code,\n `${path}/contracts/${projectName}/sources/codegen/data/${name}_event.move`,\n 'formatAndWriteMove'\n );\n }\n\n let code = `module ${projectName}::${projectName}_events {\n\t \tuse std::ascii::{String, string};\n\t \t${generateImport(projectName, data)}\n\t\t${Object.entries(events)\n .map(([name, fields]) => {\n return `\nuse ${projectName}::${projectName}_${name}_event::${toPascalCase(name)}Event;\nuse ${projectName}::${projectName}_${name}_event;\n\t\t\tpublic fun ${name}_event(${getStructAttrsWithType(fields as Record<string, string>)}) {\n\t\t\t dubhe::storage_event::emit_set_record<${toPascalCase(name)}Event, ${toPascalCase(name)}Event, ${toPascalCase(name)}Event>(\n\t\t\t\tstring(b\"${name}_event\"),\n\t\t\t\toption::none(),\n\t\t\t \toption::none(),\n\t\t\t option::some(${projectName}_${name}_event::new(${getStructAttrs(fields as Record<string, string>)}))\n\t\t\t )\n\t\t\t}\n\t\t`;\n })\n .join('\\n')}\t\t\n }`;\n\n await formatAndWriteMove(\n code,\n `${path}/contracts/${projectName}/sources/codegen/events.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateSystem(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/contracts/${config.name}/sources/systems`)) {\n await fs.mkdir(`${srcPrefix}/contracts/${config.name}/sources/systems`, { recursive: true });\n }\n}\n","import { BaseType, ErrorData, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n getStructAttrsWithType,\n getStructAttrs,\n getStructTypes,\n getStructAttrsQuery\n} from './common';\n\nfunction convertToSnakeCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n}\n\nexport async function generateSchemaError(projectName: string, errors: ErrorData, path: string) {\n console.log('\\n📦 Starting Schema Error Generation...');\n\n let code = `module ${projectName}::${projectName}_errors {\n\t\t${Object.entries(errors)\n .map(([name, message]) => {\n console.log(` └─ ${name}: ${message}`);\n return `#[error]\n\t\t\t\tconst ${name.toUpperCase()}: vector<u8> = b\"${message}\";\n\t\t\t\tpublic fun ${name}_error(condition: bool) { assert!(condition, ${name.toUpperCase()}) }\n\t\t`;\n })\n .join('\\n')}\t\t\n }`;\n\n await formatAndWriteMove(\n code,\n `${path}/contracts/${projectName}/sources/codegen/errors.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nexport async function generateDefaultSchema(config: DubheConfig, srcPrefix: string) {\n await generateDappSchemaMetadata(config, srcPrefix);\n await generateDappSystem(config, srcPrefix);\n}\n\nasync function generateDappSchemaMetadata(config: DubheConfig, srcPrefix: string) {\n const path = `${srcPrefix}/contracts/${config.name}/sources/codegen/core/metadata.move`;\n if (!existsSync(path)) {\n let code = `module ${config.name}::${config.name}_dapp_metadata {\n use std::ascii::String;\n\n public struct DappMetadata has drop, copy, store {\n name: String,\n description: String,\n cover_url: vector<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 cover_url: vector<String>,\n website_url: String,\n created_at: u64,\n partners: vector<String>,\n ): DappMetadata {\n DappMetadata {\n name,\n description,\n cover_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 cover_url: vector<String>,\n website_url: String,\n created_at: u64,\n partners: vector<String>,\n ) {\n self.name = name;\n self.description = description;\n self.cover_url = cover_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_cover_url(self: &mut DappMetadata, cover_url: vector<String>) {\n self.cover_url = cover_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_cover_url(self: &DappMetadata): vector<String> {\n self.cover_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 await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n\nasync function generateDappSystem(config: DubheConfig, srcPrefix: string) {\n const path = `${srcPrefix}/contracts/${config.name}/sources/codegen/core/system.move`;\n if (!existsSync(path)) {\n let code = `module ${config.name}::${config.name}_dapp_system {\n use std::ascii::String;\n use std::ascii;\n use dubhe::type_info;\n use sui::clock::Clock;\n use sui::transfer::public_share_object;\n use ${config.name}::${config.name}_schema::Schema;\n use ${config.name}::${config.name}_dapp_metadata;\n use ${config.name}::${config.name}_dapp_metadata::DappMetadata;\n use dubhe::storage::add_field;\n use dubhe::storage_value;\n use dubhe::storage_value::StorageValue;\n \n public struct DappKey has drop {}\n public(package) fun new(): DappKey {\n DappKey { }\n }\n\n public entry fun set_metadata(\n schema: &mut Schema,\n name: String,\n description: String,\n cover_url: vector<String>,\n website_url: String,\n partners: vector<String>,\n ctx: &TxContext,\n ) {\n let admin = schema.dapp__admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n let created_at = schema.dapp__metadata().get().get_created_at();\n schema.dapp__metadata().set(\n ${config.name}_dapp_metadata::new(\n name,\n description,\n cover_url,\n website_url,\n created_at,\n partners\n )\n );\n }\n\n\n public entry fun transfer_ownership(schema: &mut Schema, new_admin: address, ctx: &mut TxContext) {\n let admin = schema.dapp__admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n schema.dapp__admin().set(new_admin);\n }\n\n public entry fun set_safe_mode(schema: &mut Schema, safe_mode: bool, ctx: &TxContext) {\n let admin = schema.dapp__admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n schema.dapp__safe_mode().set(safe_mode);\n }\n\n public fun ensure_no_safe_mode(schema: &mut Schema) {\n assert!(!schema.dapp__safe_mode()[], 0);\n }\n\n public fun ensure_has_authority(schema: &mut Schema, ctx: &TxContext) {\n assert!(schema.dapp__admin().get() == ctx.sender(), 0);\n }\n\n public fun ensure_has_schema<S: key + store>(schema: &mut Schema, new_schema: &S) {\n let schema_id = object::id_address(new_schema);\n assert!(schema.dapp__authorised_schemas().get().contains(&schema_id), 0);\n }\n\n public(package) fun create(schema: &mut Schema, name: String, description: String, clock: &Clock, ctx: &mut TxContext){\n add_field<StorageValue<address>>(schema.id(), b\"dapp__admin\", storage_value::new(b\"dapp__admin\", ctx));\n add_field<StorageValue<address>>(schema.id(), b\"dapp__package_id\", storage_value::new(b\"dapp__package_id\", ctx));\n add_field<StorageValue<u32>>(schema.id(), b\"dapp__version\", storage_value::new(b\"dapp__version\", ctx));\n add_field<StorageValue<DappMetadata>>(schema.id(), b\"dapp__metadata\", storage_value::new(b\"dapp__metadata\", ctx));\n add_field<StorageValue<bool>>(schema.id(), b\"dapp__safe_mode\", storage_value::new(b\"dapp__safe_mode\", ctx));\n add_field<StorageValue<vector<address>>>(schema.id(), b\"dapp__authorised_schemas\", storage_value::new(b\"dapp__authorised_schemas\", ctx));\n schema.dapp__metadata().set(\n ${config.name}_dapp_metadata::new(\n name,\n description,\n vector[],\n ascii::string(b\"\"),\n clock.timestamp_ms(),\n vector[]\n )\n );\n let package_id = type_info::current_package_id<DappKey>();\n schema.dapp__package_id().set(package_id);\n schema.dapp__admin().set(ctx.sender());\n schema.dapp__version().set(1);\n schema.dapp__safe_mode().set(false);\n schema.dapp__authorised_schemas().set(vector[]);\n }\n\n public(package) fun upgrade<DappKey: drop>(schema: &mut Schema, ctx: &TxContext) {\n assert!(schema.dapp__metadata().contains(), 0);\n assert!(schema.dapp__admin().get() == ctx.sender(), 0);\n let new_package_id = type_info::current_package_id<DappKey>();\n schema.dapp__package_id().set(new_package_id);\n let current_version = schema.dapp__version()[];\n schema.dapp__version().set(current_version + 1);\n }\n\n public(package) fun add_schema<S: key + store>(schema: &mut Schema, new_schema: S) {\n let mut schemas = schema.dapp__authorised_schemas()[];\n schemas.push_back(object::id_address<S>(&new_schema));\n schema.dapp__authorised_schemas().set(schemas);\n public_share_object(new_schema);\n }\n}\n\n`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nexport async function generateInit(config: DubheConfig, srcPrefix: string) {\n let init_test_code = `module ${config.name}::${config.name}_init_test {\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 {\n let mut scenario = test_scenario::begin(sender);\n let ctx = test_scenario::ctx(&mut scenario);\n let clock = clock::create_for_testing(ctx);\n ${config.name}::${config.name}_genesis::run(&clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(&mut scenario,sender);\n scenario\n }\n}\n`;\n await formatAndWriteMove(\n init_test_code,\n `${srcPrefix}/contracts/${config.name}/sources/codegen/core/init_test.move`,\n 'formatAndWriteMove'\n );\n\n let init_code = `module ${config.name}::${config.name}_genesis {\n use std::ascii::string;\n\n use sui::clock::Clock;\n\n use ${config.name}::${config.name}_dapp_system;\n\n public entry fun run(clock: &Clock, ctx: &mut TxContext) {\n // Create schemas\n let mut schema = ${config.name}::${config.name}_schema::create(ctx);\n // Setup default storage\n ${config.name}_dapp_system::create(&mut schema, string(b\"${config.name}\"),string(b\"${config.description}\"), clock , ctx);\n // Logic that needs to be automated once the contract is deployed\n ${config.name}::${config.name}_deploy_hook::run(&mut schema, ctx);\n // Authorize schemas and public share objects\n sui::transfer::public_share_object(schema);\n }\n}\n`;\n await formatAndWriteMove(\n init_code,\n\n `${srcPrefix}/contracts/${config.name}/sources/codegen/core/genesis.move`,\n 'formatAndWriteMove'\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 = ['dubhe.config.js', 'dubhe.config.mjs', 'dubhe.config.ts', 'dubhe.config.mts'];\nconst TEMP_CONFIG = 'dubhe.config.example.mjs';\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: 'esm',\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: 'node',\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: 'external'\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(configPath: string | undefined, toFileURL?: boolean) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === 'win32' ? pathToFileURL(configPath).href : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","export class NotInsideProjectError extends Error {\n name = 'NotInsideProjectError';\n message = 'You are not inside a Dubhe project';\n}\n","export type BaseType =\n | 'String'\n | 'vector<String>'\n | 'address'\n | 'bool'\n | 'u8'\n | 'u32'\n | 'u64'\n | 'u128'\n | 'vector<address>'\n | 'vector<bool>'\n | 'vector<u8>'\n | 'vector<vector<u8>>'\n | 'vector<u32>'\n | 'vector<u64>'\n | 'vector<u128>'\n | string;\n\nexport type StorageDataType = 'Struct' | 'Enum';\n\nexport type StorageMapType = 'Map' | 'Bag' | 'Table';\n\ntype Address = string;\ntype Bool = boolean;\ntype U8 = number;\ntype U32 = number;\ntype U64 = number;\ntype U128 = number;\ntype Vector<T> = T[];\n\nexport type BaseValueType =\n | String\n | Address\n | Bool\n | U8\n | U32\n | U64\n | U128\n | Vector<Address>\n | Vector<Bool>\n | Vector<U8>\n | Vector<Vector<U8>>\n | Vector<U64>\n | Vector<U128>;\n\nexport type SchemaData = Record<string, string> | string[];\nexport type SchemaType = string;\nexport type EventData = Record<string, string>;\nexport type ErrorData = Record<string, string>;\n\ntype DataType = any;\n\nexport function storage<T extends DataType>(value: T): SchemaType;\nexport function storage<K extends DataType, V extends DataType>(key: K, value: V): SchemaType;\nexport function storage<K1 extends DataType, K2 extends DataType, V extends DataType>(\n key1: K1,\n key2: K2,\n value: V\n): SchemaType;\nexport function storage(...args: DataType[]): SchemaType {\n if (args.length === 1) {\n return `StorageValue<${args[0]}>`;\n } else if (args.length === 2) {\n return `StorageMap<${args[0]}, ${args[1]}>`;\n } else if (args.length === 3) {\n return `StorageDoubleMap<${args[0]}, ${args[1]}, ${args[2]}>`;\n }\n throw new Error('Invalid number of arguments for storage()');\n}\n\nexport type DubheConfig = {\n name: string;\n description: string;\n data?: Record<string, SchemaData>;\n schemas: Record<string, SchemaType>;\n events?: Record<string, EventData>;\n errors?: ErrorData;\n};\n\nexport type MoveType =\n | 'string'\n | 'vector<string>'\n | 'String'\n | 'vector<String>'\n | 'address'\n | 'bool'\n | 'u8'\n | 'u32'\n | 'u64'\n | 'u128'\n | 'vector<address>'\n | 'vector<bool>'\n | 'vector<u8>'\n | 'vector<vector<u8>>'\n | 'vector<u32>'\n | 'vector<u64>'\n | 'vector<u128>';\n","export const parseData = (data: any) => {\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n const parsedData: any = {};\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n // @ts-ignore\n const value = data[key];\n // console.log(\"===========\", value)\n if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value)) {\n parsedData[key] = handleArray(value);\n } else if (value.hasOwnProperty('variant')) {\n parsedData[key] = { [value.variant]: {} };\n } else if (value.hasOwnProperty('fields')) {\n parsedData[key] = parseData(value.fields);\n } else {\n parsedData[key] = parseData(value);\n }\n } else {\n parsedData[key] = value;\n }\n }\n }\n return parsedData;\n};\n\nconst handleArray = (data: any[]): any[] => {\n let returnData: any[] = [];\n data.forEach((item) => {\n if (typeof item === 'object' && item !== null) {\n if (Array.isArray(item)) {\n returnData.push(handleArray(item));\n } else if (item.hasOwnProperty('variant')) {\n returnData.push({ [item.variant]: {} });\n } else if (item.hasOwnProperty('fields')) {\n returnData.push(parseData(item.fields));\n } else {\n returnData.push(parseData(item));\n }\n } else {\n returnData.push(item);\n }\n });\n return returnData;\n};\n","export enum SubscriptionKind {\n Event = 'event',\n Schema = 'schema'\n}\n\nexport type SubscribableType =\n | { kind: SubscriptionKind.Event; name?: string; sender?: string }\n | { kind: SubscriptionKind.Schema; name?: string };\n"],"mappings":"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","names":["prettier","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","formatMove","schemaPrefix","initPrefix","code","deployHookPrefix","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","getStructAttrs","values","key","_","getStructTypes","values","_","type","getStructAttrsWithType","key","getStructAttrsQuery","containsString","obj","searchString","value","generateToml","config","srcPrefix","code","formatAndWriteMove","sortByFirstLetter","arr","a","b","firstLetterA","firstLetterB","renderSetAttrsFunc","schemaName","fields","key","type","renderSetFunc","getStructAttrsWithType","fieldName","renderGetAllFunc","getStructTypes","getStructAttrsQuery","renderGetAttrsFunc","convertToSnakeCase","input","generateSchemaData","projectName","data","path","name","code","enumNames","item","sortByFirstLetterFields","sortByFirstLetter","field","containsString","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemas","value","schemaMoudle","storage_type","all_types","para_key","para_value","borrow_key","existsSync","generateDeployHook","config","srcPrefix","path","code","formatAndWriteMove","generateMigrate","toPascalCase","str","word","convertToSnakeCase","input","generateImport","projectName","data","name","generateSchemaEvent","events","path","key","fields","code","getStructAttrsWithType","getStructAttrs","formatAndWriteMove","existsSync","fs","generateSystem","config","srcPrefix","generateSchemaError","projectName","errors","path","code","name","message","formatAndWriteMove","existsSync","generateDefaultSchema","config","srcPrefix","generateDappSchemaMetadata","generateDappSystem","path","code","formatAndWriteMove","generateInit","config","srcPrefix","init_test_code","formatAndWriteMove","init_code","schemaGen","config","srcPrefix","network","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSchemaEvent","generateSchemaData","generateSchemaStructure","generateSchemaError","generateDefaultSchema","generateInit","generateSystem","generateMigrate","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError","storage","args","parseData","data","parsedData","key","value","handleArray","returnData","item","SubscriptionKind"]}
1
+ {"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/schemaGen.ts","../src/codegen/utils/renderMove/common.ts","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateEvent.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateError.ts","../src/codegen/utils/renderMove/generateDefaultSchema.ts","../src/codegen/utils/renderMove/generateInit.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts","../src/codegen/types/index.ts","../src/parseData/parser/index.ts","../src/primitives/index.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(content: string, prettierConfigPath?: string): Promise<string> {\n let config;\n if (prettierConfigPath) {\n config = await prettier.resolveConfig(prettierConfigPath);\n }\n try {\n return prettier.format(content, {\n plugins: [prettierPluginMove],\n parser: 'move-parse',\n printWidth: 120,\n semi: true,\n tabWidth: 2,\n useTabs: false,\n bracketSpacing: true,\n ...config\n });\n } catch (error) {\n let message;\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = error;\n }\n console.log(`Error during output formatting: ${message}`);\n return content;\n }\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n return prettier.format(content, {\n parser: 'typescript'\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { formatMove, formatTypescript } from './format';\nimport { debug } from '../debug';\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = await formatMove(output);\n let schemaPrefix = ` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: Apache-2.0\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `;\n\n let initPrefix = `#[test_only]`;\n\n let code = schemaPrefix + formattedOutput;\n\n let deployHookPrefix = `#[allow(lint(share_owned))]`;\n\n if (\n fullOutputPath.includes('.toml') ||\n fullOutputPath.includes('system') ||\n fullOutputPath.includes('migrate')\n ) {\n code = formattedOutput;\n } else if (fullOutputPath.includes('init')) {\n code = initPrefix + formattedOutput;\n } else if (fullOutputPath.includes('genesis')) {\n code = deployHookPrefix + formattedOutput;\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from 'debug';\n\nexport const debug = createDebug('dubhe:common');\nexport const error = createDebug('dubhe:common');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from '../debug';\n\nexport const debug = parentDebug.extend('codegen');\nexport const error = parentDebug.extend('codegen');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","/**\n * Explicitly normalize a given path to a posix path (using `/` as separator).\n * This should be used for generating Solidity files that will be consumed by solc,\n * because solc expects `/` as path separator, but path.join produces `\\` if the user is on windows.\n */\nexport function posixPath(path: string): string {\n return path.replace(/\\\\/g, '/');\n}\n","import { 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(` └─ Description: ${config.description || 'No description provided'}`);\n console.log(` └─ Network: ${network || 'testnet'}`);\n\n const path = srcPrefix ?? process.cwd();\n\n if (existsSync(`${path}/contracts/${config.name}`)) {\n deleteFolderRecursive(`${path}/contracts/${config.name}/sources/codegen`);\n }\n\n if (!existsSync(`${path}/contracts/${config.name}/Move.toml`)) {\n await generateToml(config, path);\n }\n\n if (!existsSync(`${path}/contracts/${config.name}/sources/script/deploy_hook.move`)) {\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('\\n✅ Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n if (fs.existsSync(path)) {\n fs.readdirSync(path).forEach((file) => {\n const curPath = `${path}/${file}`;\n if (fs.lstatSync(curPath).isDirectory()) {\n deleteFolderRecursive(curPath);\n } else {\n fs.unlinkSync(curPath);\n }\n });\n fs.rmdirSync(path);\n }\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(values: Record<string, string> | string): string {\n return Object.entries(values)\n .map(([key, _]) => `${key}`)\n .join(',');\n}\n\nfunction isAddress(str: string): boolean {\n const regex = /^0x[a-fA-F0-9]+$/;\n return regex.test(str);\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaType): string {\nexport function getStructTypes(values: Record<string, string>): string {\n return `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n\nexport function containsString(obj: Record<string, any>, searchString: string): boolean {\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const value = obj[key];\n if (\n (typeof value === 'string' && value === searchString) ||\n (typeof value === 'string' && value.includes(searchString) && value.includes('>'))\n ) {\n return true;\n }\n }\n }\n return false;\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateToml(config: DubheConfig, srcPrefix: string) {\n console.log('\\n📄 Starting Move.toml Generation...');\n console.log(` └─ Output path: ${srcPrefix}/contracts/${config.name}/Move.toml`);\n\n let code = `[package]\nname = \"${config.name}\"\nversion = \"1.0.0\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.38.3\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe-framework.git\", rev = \"dubhe-mainnet-v1.1.0\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x0\"\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/Move.toml`,\n 'formatAndWriteMove'\n );\n console.log('✅ Move.toml Generation Complete\\n');\n}\n","import { BaseType, SchemaData, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n getStructAttrsWithType,\n getStructAttrs,\n getStructTypes,\n getStructAttrsQuery,\n containsString\n} from './common';\n\nfunction sortByFirstLetter(arr: string[]): string[] {\n return arr.sort((a, b) => {\n const firstLetterA = a.charAt(0).toLowerCase();\n const firstLetterB = b.charAt(0).toLowerCase();\n\n if (firstLetterA < firstLetterB) {\n return -1;\n }\n if (firstLetterA > firstLetterB) {\n return 1;\n }\n return 0;\n });\n}\n\nexport function capitalizeAndRemoveUnderscores(input: string): string {\n return input\n .split('_')\n .map((word, index) => {\n return index === 0\n ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nexport function renderSetAttrsFunc(\n schemaName: string,\n fields: BaseType | Record<string, BaseType>\n): string {\n return Object.entries(fields)\n .map(\n ([key, type]) =>\n `public(package) fun set_${key}(self: &mut ${schemaName}, ${key}: ${type}) {\n self.${key} = ${key};\n }`\n )\n .join('\\n');\n}\n\nexport function renderSetFunc(schemaName: string, fields: Record<string, string>): string {\n return `public(package) fun set(self: &mut ${schemaName}, ${getStructAttrsWithType(fields)}) {\n ${Object.entries(fields)\n .map(([fieldName]) => `self.${fieldName} = ${fieldName};`)\n .join('\\n')}\n }`;\n}\n\nexport function renderGetAllFunc(schemaName: string, fields: Record<string, string>): string {\n return `public fun get(self: &${schemaName}): ${getStructTypes(fields)} {\n (${getStructAttrsQuery(fields)})\n }`;\n}\n\nexport function renderGetAttrsFunc(\n schemaName: string,\n fields: BaseType | Record<string, BaseType>\n): string {\n return Object.entries(fields)\n .map(\n ([key, type]) => `public fun get_${key}(self: &${schemaName}): ${type} {\n self.${key}\n }`\n )\n .join('\\n');\n}\n\nfunction convertToSnakeCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n}\n\nexport async function generateSchemaData(\n projectName: string,\n data: Record<string, SchemaData>,\n path: string\n) {\n console.log('\\n📦 Starting Schema Data Generation...');\n for (const key of Object.keys(data)) {\n const name = key;\n const fields = data[key];\n console.log(\n ` └─ ${name} ${Array.isArray(fields) ? '(enum)' : '(struct)'}: ${JSON.stringify(fields)}`\n );\n let code = '';\n\n const enumNames = Object.keys(data)\n .filter((item) => Array.isArray(data[item]))\n .map((item) => item);\n\n if (Array.isArray(fields)) {\n const sortByFirstLetterFields = sortByFirstLetter(fields);\n code = `module ${projectName}::${projectName}_${convertToSnakeCase(name)} {\n public enum ${name} has copy, drop , store {\n ${sortByFirstLetterFields}\n }\n \n ${sortByFirstLetterFields\n .map((field: string) => {\n return `public fun new_${convertToSnakeCase(field)}(): ${name} {\n ${name}::${field}\n }`;\n })\n .join('')}`;\n } else {\n code = `module ${projectName}::${projectName}_${convertToSnakeCase(name)} {\n use std::ascii::String;\n \n\t\t\t\t\t\t${Object.keys(data)\n .map((name) => {\n if (containsString(fields, name)) {\n return `use ${projectName}::${projectName}_${convertToSnakeCase(name)}::${name};`;\n }\n return undefined;\n })\n .filter(Boolean)\n .join('\\n')}\n\n public struct ${name} has copy, drop , store {\n ${getStructAttrsWithType(fields)}\n }\n \n public fun new(${getStructAttrsWithType(fields)}): ${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 }\n\n await formatAndWriteMove(\n code,\n `${path}/contracts/${projectName}/sources/codegen/data/${convertToSnakeCase(name)}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateImport(projectName: string, data: Record<string, SchemaData> | null) {\n if (data != null) {\n const names = Object.keys(data);\n return names\n .map((name) => {\n return `use ${projectName}::${projectName}_${convertToSnakeCase(name)}::${name};`;\n })\n .join('\\n');\n } else {\n return '';\n }\n}\n\nexport async function generateSchemaStructure(\n projectName: string,\n data: Record<string, SchemaData> | null,\n schemas: Record<string, SchemaType>,\n path: string\n) {\n console.log('\\n🔨 Starting Schema Structure Generation...');\n Object.entries(schemas).forEach(([key, value]) => {\n console.log(` └─ ${key}: ${value}`);\n });\n const schemaMoudle = `module ${projectName}::${projectName}_schema {\n use std::ascii::String;\n use std::ascii::string;\n use sui::package::UpgradeCap;\n use std::type_name; \n use dubhe::storage;\n use dubhe::storage_value::{Self, StorageValue};\n use dubhe::storage_map::{Self, StorageMap};\n use dubhe::storage_double_map::{Self, StorageDoubleMap};\n use sui::dynamic_field as df;\n use ${projectName}::${projectName}_dapp_metadata::DappMetadata;\n \n ${generateImport(projectName, data)}\n\n public struct Schema has key, store { id: UID } \n\n // Default storage\n public fun borrow_dapp__admin(self: &Schema): &StorageValue<address> {\n storage::borrow_field(&self.id, b\"dapp__admin\")\n }\n\n public fun borrow_dapp__package_id(self: &Schema): &StorageValue<address> {\n storage::borrow_field(&self.id, b\"dapp__package_id\")\n }\n\n public fun borrow_dapp__version(self: &Schema): &StorageValue<u32> {\n storage::borrow_field(&self.id, b\"dapp__version\")\n }\n\n public fun borrow_dapp__metadata(self: &Schema): &StorageValue<DappMetadata> {\n storage::borrow_field(&self.id, b\"dapp__metadata\")\n }\n\n public fun borrow_dapp__safe_mode(self: &Schema): &StorageValue<bool> {\n storage::borrow_field(&self.id, b\"dapp__safe_mode\")\n }\n\n public fun borrow_dapp__authorised_schemas(self: &Schema): &StorageValue<vector<address>> {\n storage::borrow_field(&self.id, b\"dapp__authorised_schemas\")\n }\n\n public fun borrow_dapp__schemas(self: &Schema): &StorageValue<vector<address>> {\n storage::borrow_field(&self.id, b\"dapp__schemas\")\n }\n\n public(package) fun dapp__admin(self: &mut Schema): &mut StorageValue<address> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__admin\")\n }\n\n public(package) fun dapp__package_id(self: &mut Schema): &mut StorageValue<address> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__package_id\")\n }\n\n public(package) fun dapp__version(self: &mut Schema): &mut StorageValue<u32> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__version\")\n }\n\n public(package) fun dapp__metadata(self: &mut Schema): &mut StorageValue<DappMetadata> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__metadata\")\n }\n\n public(package) fun dapp__safe_mode(self: &mut Schema): &mut StorageValue<bool> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__safe_mode\")\n }\n\n public(package) fun dapp__authorised_schemas(self: &mut Schema): &mut StorageValue<vector<address>> {\n storage::borrow_mut_field(&mut self.id, b\"dapp__authorised_schemas\")\n }\n \n ${Object.entries(schemas)\n .map(([key, value]) => {\n return `public fun borrow_${key}(self: &Schema) : &${value} {\n storage::borrow_field(&self.id, b\"${key}\")\n }\n \n public(package) fun ${key}(self: &mut Schema): &mut ${value} {\n storage::borrow_mut_field(&mut self.id, b\"${key}\")\n }\n `;\n })\n .join('')} \n \n \n public(package) fun create(ctx: &mut TxContext): Schema {\n let mut id = object::new(ctx);\n ${Object.entries(schemas)\n .map(([key, value]) => {\n let storage_type = '';\n if (value.includes('StorageValue')) {\n storage_type = `storage_value::new(b\"${key}\", ctx)`;\n } else if (value.includes('StorageMap')) {\n storage_type = `storage_map::new(b\"${key}\", ctx)`;\n } else if (value.includes('StorageDoubleMap')) {\n storage_type = `storage_double_map::new(b\"${key}\", ctx)`;\n }\n return `storage::add_field<${value}>(&mut id, b\"${key}\", ${storage_type});`;\n })\n .join('\\n')}\n \n Schema { id }\n }\n \n public(package) fun id(self: &mut Schema): &mut UID {\n\t\t\t\t\t &mut self.id\n\t\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\tpublic(package) fun borrow_id(self: &Schema): &UID {\n\t\t\t\t\t &self.id\n\t\t\t\t\t}\n \n public fun migrate(_schema: &mut Schema, _ctx: &mut TxContext) { }\n\n\n public(package) fun upgrade(schema: &mut Schema, new_package_id: address, new_version: u32, ctx: &mut TxContext) {\n assert!(schema.dapp__metadata().contains(), 0);\n assert!(schema.dapp__admin().get() == ctx.sender(), 0);\n schema.dapp__package_id().set(new_package_id);\n let current_version = schema.dapp__version()[];\n assert!(current_version < new_version, 0);\n schema.dapp__version().set(new_version);\n schema.migrate(ctx);\n }\n\n \n // ======================================== View Functions ========================================\n ${Object.entries(schemas)\n .map(([key, value]) => {\n // @ts-ignore\n let all_types = value\n .match(/<(.+)>/)[1]\n .split(',')\n .map((type) => type.trim());\n let para_key: string[] = [];\n let para_value = '';\n let borrow_key = '';\n if (value.includes('StorageValue')) {\n para_key = [];\n para_value = `${all_types[0]}`;\n borrow_key = 'get()';\n } else if (value.includes('StorageMap')) {\n para_key = [`key: ${all_types[0]}`];\n para_value = `${all_types[1]}`;\n borrow_key = 'get(key)';\n } else if (value.includes('StorageDoubleMap')) {\n para_key = [`key1: ${all_types[0]}`, `key2: ${all_types[1]}`];\n para_value = `${all_types[2]}`;\n borrow_key = 'get(key1, key2)';\n }\n return `public fun get_${key}(self: &Schema, ${para_key}) : &${para_value} {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().${borrow_key}\n\t\t\t\t\t\t\t\t}`;\n })\n .join('\\n')}\n // =========================================================================================================\n\t\t\t}`;\n await formatAndWriteMove(\n schemaMoudle,\n\n `${path}/contracts/${projectName}/sources/codegen/core/schema.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nimport { readFileSync } from 'fs';\n\nexport async function generateDeployHook(config: DubheConfig, srcPrefix: string) {\n const path = `${srcPrefix}/contracts/${config.name}/sources/scripts/deploy_hook.move`;\n if (!existsSync(path)) {\n const code = `module ${config.name}::${config.name}_deploy_hook {\n\t\t\t use ${config.name}::${config.name}_schema::Schema;\n\n public(package) fun run(_schema: &mut Schema, _ctx: &mut TxContext) {\n\n }\n}`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`)) {\n let code = `module ${config.name}::${config.name}_migrate {\n const ON_CHAIN_VERSION: u32 = 1;\n\n public fun on_chain_version(): u32 {\n ON_CHAIN_VERSION\n }\n}\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/scripts/migrate.move`,\n 'formatAndWriteMove'\n );\n }\n}\n","import { BaseType, EventData, SchemaData, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n getStructAttrsWithType,\n getStructAttrs,\n getStructTypes,\n getStructAttrsQuery\n} from './common';\n\n// account_not_found => AccountNotFound,\nfunction toPascalCase(str: string): string {\n return str\n .split('_')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\nfunction convertToSnakeCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n}\n\nfunction generateImport(projectName: string, data: Record<string, SchemaData> | null) {\n if (data != null) {\n const names = Object.keys(data);\n return names\n .map((name) => {\n return `use ${projectName}::${projectName}_${convertToSnakeCase(name)}::${name};`;\n })\n .join('\\n');\n } else {\n return '';\n }\n}\n\nexport async function generateSchemaEvent(\n projectName: string,\n data: Record<string, SchemaData> | null,\n events: Record<string, EventData>,\n path: string\n) {\n console.log('\\n📦 Starting Schema Event Generation...');\n for (const key of Object.keys(events)) {\n const name = key;\n const fields = events[key];\n console.log(` └─ ${name} event: ${JSON.stringify(fields)}`);\n\n let code = `module ${projectName}::${projectName}_${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 ${toPascalCase(name)}Event has copy, drop {\n ${getStructAttrsWithType(fields as Record<string, string>)}\n }\n\n public fun new(${getStructAttrsWithType(fields as Record<string, string>)}): ${toPascalCase(name)}Event {\n ${toPascalCase(name)}Event {\n ${getStructAttrs(fields as Record<string, string>)}\n }\n }\n }`;\n await formatAndWriteMove(\n code,\n `${path}/contracts/${projectName}/sources/codegen/data/${name}_event.move`,\n 'formatAndWriteMove'\n );\n }\n\n let code = `module ${projectName}::${projectName}_events {\n\t \tuse std::ascii::{String, string};\n\t \t${generateImport(projectName, data)}\n\t\t${Object.entries(events)\n .map(([name, fields]) => {\n return `\nuse ${projectName}::${projectName}_${name}_event::${toPascalCase(name)}Event;\nuse ${projectName}::${projectName}_${name}_event;\n\t\t\tpublic fun ${name}_event(${getStructAttrsWithType(fields as Record<string, string>)}) {\n\t\t\t dubhe::storage_event::emit_set_record<${toPascalCase(name)}Event, ${toPascalCase(name)}Event, ${toPascalCase(name)}Event>(\n\t\t\t\tstring(b\"${name}_event\"),\n\t\t\t\toption::none(),\n\t\t\t \toption::none(),\n\t\t\t option::some(${projectName}_${name}_event::new(${getStructAttrs(fields as Record<string, string>)}))\n\t\t\t )\n\t\t\t}\n\t\t`;\n })\n .join('\\n')}\t\t\n }`;\n\n await formatAndWriteMove(\n code,\n `${path}/contracts/${projectName}/sources/codegen/events.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateSystem(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/contracts/${config.name}/sources/systems`)) {\n await fs.mkdir(`${srcPrefix}/contracts/${config.name}/sources/systems`, { recursive: true });\n }\n}\n","import { BaseType, ErrorData, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n getStructAttrsWithType,\n getStructAttrs,\n getStructTypes,\n getStructAttrsQuery\n} from './common';\n\nfunction convertToSnakeCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n}\n\nexport async function generateSchemaError(projectName: string, errors: ErrorData, path: string) {\n console.log('\\n📦 Starting Schema Error Generation...');\n\n let code = `module ${projectName}::${projectName}_errors {\n\t\t${Object.entries(errors)\n .map(([name, message]) => {\n console.log(` └─ ${name}: ${message}`);\n return `#[error]\n\t\t\t\tconst ${name.toUpperCase()}: vector<u8> = b\"${message}\";\n\t\t\t\tpublic fun ${name}_error(condition: bool) { assert!(condition, ${name.toUpperCase()}) }\n\t\t`;\n })\n .join('\\n')}\t\t\n }`;\n\n await formatAndWriteMove(\n code,\n `${path}/contracts/${projectName}/sources/codegen/errors.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nexport async function generateDefaultSchema(config: DubheConfig, srcPrefix: string) {\n await generateDappSchemaMetadata(config, srcPrefix);\n await generateDappSystem(config, srcPrefix);\n}\n\nasync function generateDappSchemaMetadata(config: DubheConfig, srcPrefix: string) {\n const path = `${srcPrefix}/contracts/${config.name}/sources/codegen/core/metadata.move`;\n if (!existsSync(path)) {\n let code = `module ${config.name}::${config.name}_dapp_metadata {\n use std::ascii::String;\n\n public struct DappMetadata has drop, copy, store {\n name: String,\n description: String,\n cover_url: vector<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 cover_url: vector<String>,\n website_url: String,\n created_at: u64,\n partners: vector<String>,\n ): DappMetadata {\n DappMetadata {\n name,\n description,\n cover_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 cover_url: vector<String>,\n website_url: String,\n created_at: u64,\n partners: vector<String>,\n ) {\n self.name = name;\n self.description = description;\n self.cover_url = cover_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_cover_url(self: &mut DappMetadata, cover_url: vector<String>) {\n self.cover_url = cover_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_cover_url(self: &DappMetadata): vector<String> {\n self.cover_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 await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n\nasync function generateDappSystem(config: DubheConfig, srcPrefix: string) {\n const path = `${srcPrefix}/contracts/${config.name}/sources/codegen/core/system.move`;\n if (!existsSync(path)) {\n let code = `module ${config.name}::${config.name}_dapp_system {\n use std::ascii::String;\n use std::ascii;\n use dubhe::type_info;\n use sui::clock::Clock;\n use sui::transfer::public_share_object;\n use ${config.name}::${config.name}_schema::Schema;\n use ${config.name}::${config.name}_dapp_metadata;\n use ${config.name}::${config.name}_dapp_metadata::DappMetadata;\n use dubhe::storage::add_field;\n use dubhe::storage_value;\n use dubhe::storage_value::StorageValue;\n\n public entry fun set_metadata(\n schema: &mut Schema,\n name: String,\n description: String,\n cover_url: vector<String>,\n website_url: String,\n partners: vector<String>,\n ctx: &TxContext,\n ) {\n let admin = schema.dapp__admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n let created_at = schema.dapp__metadata().get().get_created_at();\n schema.dapp__metadata().set(\n ${config.name}_dapp_metadata::new(\n name,\n description,\n cover_url,\n website_url,\n created_at,\n partners\n )\n );\n }\n\n\n public entry fun transfer_ownership(schema: &mut Schema, new_admin: address, ctx: &mut TxContext) {\n let admin = schema.dapp__admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n schema.dapp__admin().set(new_admin);\n }\n\n public entry fun set_safe_mode(schema: &mut Schema, safe_mode: bool, ctx: &TxContext) {\n let admin = schema.dapp__admin().try_get();\n assert!(admin == option::some(ctx.sender()), 0);\n schema.dapp__safe_mode().set(safe_mode);\n }\n\n public fun ensure_no_safe_mode(schema: &mut Schema) {\n assert!(!schema.dapp__safe_mode()[], 0);\n }\n\n public fun ensure_has_authority(schema: &mut Schema, ctx: &TxContext) {\n assert!(schema.dapp__admin().get() == ctx.sender(), 0);\n }\n\n public fun ensure_has_schema<S: key + store>(schema: &mut Schema, new_schema: &S) {\n let schema_id = object::id_address(new_schema);\n assert!(schema.dapp__authorised_schemas().get().contains(&schema_id), 0);\n }\n\n public(package) fun create(schema: &mut Schema, name: String, description: String, clock: &Clock, ctx: &mut TxContext){\n add_field<StorageValue<address>>(schema.id(), b\"dapp__admin\", storage_value::new(b\"dapp__admin\", ctx));\n add_field<StorageValue<address>>(schema.id(), b\"dapp__package_id\", storage_value::new(b\"dapp__package_id\", ctx));\n add_field<StorageValue<u32>>(schema.id(), b\"dapp__version\", storage_value::new(b\"dapp__version\", ctx));\n add_field<StorageValue<DappMetadata>>(schema.id(), b\"dapp__metadata\", storage_value::new(b\"dapp__metadata\", ctx));\n add_field<StorageValue<bool>>(schema.id(), b\"dapp__safe_mode\", storage_value::new(b\"dapp__safe_mode\", ctx));\n add_field<StorageValue<vector<address>>>(schema.id(), b\"dapp__authorised_schemas\", storage_value::new(b\"dapp__authorised_schemas\", ctx));\n schema.dapp__metadata().set(\n ${config.name}_dapp_metadata::new(\n name,\n description,\n vector[],\n ascii::string(b\"\"),\n clock.timestamp_ms(),\n vector[]\n )\n );\n let package_id = type_info::current_package_id<Schema>();\n schema.dapp__package_id().set(package_id);\n schema.dapp__admin().set(ctx.sender());\n schema.dapp__version().set(1);\n schema.dapp__safe_mode().set(false);\n schema.dapp__authorised_schemas().set(vector[]);\n }\n\n public(package) fun add_schema<S: key + store>(schema: &mut Schema, new_schema: S) {\n let mut schemas = schema.dapp__authorised_schemas()[];\n schemas.push_back(object::id_address<S>(&new_schema));\n schema.dapp__authorised_schemas().set(schemas);\n public_share_object(new_schema);\n }\n}\n\n`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nexport async function generateInit(config: DubheConfig, srcPrefix: string) {\n let init_test_code = `module ${config.name}::${config.name}_init_test {\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 {\n let mut scenario = test_scenario::begin(sender);\n let ctx = test_scenario::ctx(&mut scenario);\n let clock = clock::create_for_testing(ctx);\n ${config.name}::${config.name}_genesis::run(&clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(&mut scenario,sender);\n scenario\n }\n}\n`;\n await formatAndWriteMove(\n init_test_code,\n `${srcPrefix}/contracts/${config.name}/sources/codegen/core/init_test.move`,\n 'formatAndWriteMove'\n );\n\n let init_code = `module ${config.name}::${config.name}_genesis {\n use std::ascii::string;\n\n use sui::clock::Clock;\n\n use ${config.name}::${config.name}_dapp_system;\n\n public entry fun run(clock: &Clock, ctx: &mut TxContext) {\n // Create schemas\n let mut schema = ${config.name}::${config.name}_schema::create(ctx);\n // Setup default storage\n ${config.name}_dapp_system::create(&mut schema, string(b\"${config.name}\"),string(b\"${config.description}\"), clock , ctx);\n // Logic that needs to be automated once the contract is deployed\n ${config.name}::${config.name}_deploy_hook::run(&mut schema, ctx);\n // Authorize schemas and public share objects\n sui::transfer::public_share_object(schema);\n }\n}\n`;\n await formatAndWriteMove(\n init_code,\n\n `${srcPrefix}/contracts/${config.name}/sources/codegen/core/genesis.move`,\n 'formatAndWriteMove'\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 = ['dubhe.config.js', 'dubhe.config.mjs', 'dubhe.config.ts', 'dubhe.config.mts'];\nconst TEMP_CONFIG = 'dubhe.config.example.mjs';\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: 'esm',\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: 'node',\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: 'external'\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(configPath: string | undefined, toFileURL?: boolean) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === 'win32' ? pathToFileURL(configPath).href : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","export class NotInsideProjectError extends Error {\n name = 'NotInsideProjectError';\n message = 'You are not inside a Dubhe project';\n}\n","export type BaseType =\n | 'String'\n | 'vector<String>'\n | 'address'\n | 'bool'\n | 'u8'\n | 'u32'\n | 'u64'\n | 'u128'\n | 'vector<address>'\n | 'vector<bool>'\n | 'vector<u8>'\n | 'vector<vector<u8>>'\n | 'vector<u32>'\n | 'vector<u64>'\n | 'vector<u128>'\n | string;\n\nexport type StorageDataType = 'Struct' | 'Enum';\n\nexport type StorageMapType = 'Map' | 'Bag' | 'Table';\n\ntype Address = string;\ntype Bool = boolean;\ntype U8 = number;\ntype U32 = number;\ntype U64 = number;\ntype U128 = number;\ntype Vector<T> = T[];\n\nexport type BaseValueType =\n | String\n | Address\n | Bool\n | U8\n | U32\n | U64\n | U128\n | Vector<Address>\n | Vector<Bool>\n | Vector<U8>\n | Vector<Vector<U8>>\n | Vector<U64>\n | Vector<U128>;\n\nexport type SchemaData = Record<string, string> | string[];\nexport type SchemaType = string;\nexport type EventData = Record<string, string>;\nexport type ErrorData = Record<string, string>;\n\ntype DataType = any;\n\nexport function storage<T extends DataType>(value: T): SchemaType;\nexport function storage<K extends DataType, V extends DataType>(key: K, value: V): SchemaType;\nexport function storage<K1 extends DataType, K2 extends DataType, V extends DataType>(\n key1: K1,\n key2: K2,\n value: V\n): SchemaType;\nexport function storage(...args: DataType[]): SchemaType {\n if (args.length === 1) {\n return `StorageValue<${args[0]}>`;\n } else if (args.length === 2) {\n return `StorageMap<${args[0]}, ${args[1]}>`;\n } else if (args.length === 3) {\n return `StorageDoubleMap<${args[0]}, ${args[1]}, ${args[2]}>`;\n }\n throw new Error('Invalid number of arguments for storage()');\n}\n\nexport type DubheConfig = {\n name: string;\n description: string;\n data?: Record<string, SchemaData>;\n schemas: Record<string, SchemaType>;\n events?: Record<string, EventData>;\n errors?: ErrorData;\n};\n\nexport type MoveType =\n | 'string'\n | 'vector<string>'\n | 'String'\n | 'vector<String>'\n | 'address'\n | 'bool'\n | 'u8'\n | 'u32'\n | 'u64'\n | 'u128'\n | 'vector<address>'\n | 'vector<bool>'\n | 'vector<u8>'\n | 'vector<vector<u8>>'\n | 'vector<u32>'\n | 'vector<u64>'\n | 'vector<u128>';\n","export const parseData = (data: any) => {\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n const parsedData: any = {};\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n // @ts-ignore\n const value = data[key];\n // console.log(\"===========\", value)\n if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value)) {\n parsedData[key] = handleArray(value);\n } else if (value.hasOwnProperty('variant')) {\n parsedData[key] = { [value.variant]: {} };\n } else if (value.hasOwnProperty('fields')) {\n parsedData[key] = parseData(value.fields);\n } else {\n parsedData[key] = parseData(value);\n }\n } else {\n parsedData[key] = value;\n }\n }\n }\n return parsedData;\n};\n\nconst handleArray = (data: any[]): any[] => {\n let returnData: any[] = [];\n data.forEach((item) => {\n if (typeof item === 'object' && item !== null) {\n if (Array.isArray(item)) {\n returnData.push(handleArray(item));\n } else if (item.hasOwnProperty('variant')) {\n returnData.push({ [item.variant]: {} });\n } else if (item.hasOwnProperty('fields')) {\n returnData.push(parseData(item.fields));\n } else {\n returnData.push(parseData(item));\n }\n } else {\n returnData.push(item);\n }\n });\n return returnData;\n};\n","export enum SubscriptionKind {\n Event = 'event',\n Schema = 'schema'\n}\n\nexport type SubscribableType =\n | { kind: SubscriptionKind.Event; name?: string; sender?: string }\n | { kind: SubscriptionKind.Schema; name?: string };\n"],"mappings":"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","names":["prettier","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","formatMove","schemaPrefix","initPrefix","code","deployHookPrefix","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","getStructAttrs","values","key","_","getStructTypes","values","_","type","getStructAttrsWithType","key","getStructAttrsQuery","containsString","obj","searchString","value","generateToml","config","srcPrefix","code","formatAndWriteMove","sortByFirstLetter","arr","a","b","firstLetterA","firstLetterB","renderSetAttrsFunc","schemaName","fields","key","type","renderSetFunc","getStructAttrsWithType","fieldName","renderGetAllFunc","getStructTypes","getStructAttrsQuery","renderGetAttrsFunc","convertToSnakeCase","input","generateSchemaData","projectName","data","path","name","code","enumNames","item","sortByFirstLetterFields","sortByFirstLetter","field","containsString","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemas","value","schemaMoudle","storage_type","all_types","para_key","para_value","borrow_key","existsSync","generateDeployHook","config","srcPrefix","path","code","formatAndWriteMove","generateMigrate","toPascalCase","str","word","convertToSnakeCase","input","generateImport","projectName","data","name","generateSchemaEvent","events","path","key","fields","code","getStructAttrsWithType","getStructAttrs","formatAndWriteMove","existsSync","fs","generateSystem","config","srcPrefix","generateSchemaError","projectName","errors","path","code","name","message","formatAndWriteMove","existsSync","generateDefaultSchema","config","srcPrefix","generateDappSchemaMetadata","generateDappSystem","path","code","formatAndWriteMove","generateInit","config","srcPrefix","init_test_code","formatAndWriteMove","init_code","schemaGen","config","srcPrefix","network","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSchemaEvent","generateSchemaData","generateSchemaStructure","generateSchemaError","generateDefaultSchema","generateInit","generateSystem","generateMigrate","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError","storage","args","parseData","data","parsedData","key","value","handleArray","returnData","item","SubscriptionKind"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xobelisk/sui-common",
3
- "version": "1.1.9",
3
+ "version": "1.1.10",
4
4
  "description": "Common low level logic shared between packages",
5
5
  "keywords": [
6
6
  "sui",
@@ -126,11 +126,6 @@ async function generateDappSystem(config: DubheConfig, srcPrefix: string) {
126
126
  use dubhe::storage::add_field;
127
127
  use dubhe::storage_value;
128
128
  use dubhe::storage_value::StorageValue;
129
-
130
- public struct DappKey has drop {}
131
- public(package) fun new(): DappKey {
132
- DappKey { }
133
- }
134
129
 
135
130
  public entry fun set_metadata(
136
131
  schema: &mut Schema,
@@ -199,7 +194,7 @@ async function generateDappSystem(config: DubheConfig, srcPrefix: string) {
199
194
  vector[]
200
195
  )
201
196
  );
202
- let package_id = type_info::current_package_id<DappKey>();
197
+ let package_id = type_info::current_package_id<Schema>();
203
198
  schema.dapp__package_id().set(package_id);
204
199
  schema.dapp__admin().set(ctx.sender());
205
200
  schema.dapp__version().set(1);
@@ -207,15 +202,6 @@ async function generateDappSystem(config: DubheConfig, srcPrefix: string) {
207
202
  schema.dapp__authorised_schemas().set(vector[]);
208
203
  }
209
204
 
210
- public(package) fun upgrade<DappKey: drop>(schema: &mut Schema, ctx: &TxContext) {
211
- assert!(schema.dapp__metadata().contains(), 0);
212
- assert!(schema.dapp__admin().get() == ctx.sender(), 0);
213
- let new_package_id = type_info::current_package_id<DappKey>();
214
- schema.dapp__package_id().set(new_package_id);
215
- let current_version = schema.dapp__version()[];
216
- schema.dapp__version().set(current_version + 1);
217
- }
218
-
219
205
  public(package) fun add_schema<S: key + store>(schema: &mut Schema, new_schema: S) {
220
206
  let mut schemas = schema.dapp__authorised_schemas()[];
221
207
  schemas.push_back(object::id_address<S>(&new_schema));
@@ -286,7 +286,18 @@ export async function generateSchemaStructure(
286
286
  &self.id
287
287
  }
288
288
 
289
- public fun migrate(_schema: &mut Schema, _cap: &UpgradeCap, _ctx: &mut TxContext) { }
289
+ public fun migrate(_schema: &mut Schema, _ctx: &mut TxContext) { }
290
+
291
+
292
+ public(package) fun upgrade(schema: &mut Schema, new_package_id: address, new_version: u32, ctx: &mut TxContext) {
293
+ assert!(schema.dapp__metadata().contains(), 0);
294
+ assert!(schema.dapp__admin().get() == ctx.sender(), 0);
295
+ schema.dapp__package_id().set(new_package_id);
296
+ let current_version = schema.dapp__version()[];
297
+ assert!(current_version < new_version, 0);
298
+ schema.dapp__version().set(new_version);
299
+ schema.migrate(ctx);
300
+ }
290
301
 
291
302
 
292
303
  // ======================================== View Functions ========================================