@0xobelisk/sui-common 0.4.9
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/LICENSE +92 -0
- package/README.md +3 -0
- package/dist/index.js +370 -0
- package/dist/index.js.map +1 -0
- package/package.json +71 -0
- package/src/codegen/index.ts +3 -0
- package/src/codegen/modules.d.ts +1 -0
- package/src/codegen/types/index.ts +82 -0
- package/src/codegen/utils/config.ts +68 -0
- package/src/codegen/utils/errors.ts +5 -0
- package/src/codegen/utils/format.ts +42 -0
- package/src/codegen/utils/formatAndWrite.ts +31 -0
- package/src/codegen/utils/index.ts +6 -0
- package/src/codegen/utils/posixPath.ts +8 -0
- package/src/codegen/utils/renderMove/common.ts +473 -0
- package/src/codegen/utils/renderMove/generateEntityKey.ts +53 -0
- package/src/codegen/utils/renderMove/generateEps.ts +159 -0
- package/src/codegen/utils/renderMove/generateInit.ts +40 -0
- package/src/codegen/utils/renderMove/generateSchema.ts +219 -0
- package/src/codegen/utils/renderMove/generateScript.ts +37 -0
- package/src/codegen/utils/renderMove/generateSystem.ts +53 -0
- package/src/codegen/utils/renderMove/generateToml.ts +21 -0
- package/src/codegen/utils/renderMove/worldgen.ts +34 -0
- package/src/index.ts +1 -0
- package/src/modules.d.ts +11 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
Business Source License 1.1
|
|
2
|
+
|
|
3
|
+
License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved.
|
|
4
|
+
"Business Source License" is a trademark of MariaDB Corporation Ab.
|
|
5
|
+
|
|
6
|
+
-----------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
Parameters
|
|
9
|
+
|
|
10
|
+
Licensor: Obelisk Labs
|
|
11
|
+
|
|
12
|
+
Licensed Work: Obelisk Engine
|
|
13
|
+
The Licensed Work is (c) 2023 Obelisk Labs
|
|
14
|
+
|
|
15
|
+
-----------------------------------------------------------------------------
|
|
16
|
+
|
|
17
|
+
Terms
|
|
18
|
+
|
|
19
|
+
The Licensor hereby grants you the right to copy, modify, create derivative
|
|
20
|
+
works, redistribute, and make non-production use of the Licensed Work. The
|
|
21
|
+
Licensor may make an Additional Use Grant, above, permitting limited
|
|
22
|
+
production use.
|
|
23
|
+
|
|
24
|
+
Effective on the Change Date, or the fourth anniversary of the first publicly
|
|
25
|
+
available distribution of a specific version of the Licensed Work under this
|
|
26
|
+
License, whichever comes first, the Licensor hereby grants you rights under
|
|
27
|
+
the terms of the Change License, and the rights granted in the paragraph
|
|
28
|
+
above terminate.
|
|
29
|
+
|
|
30
|
+
If your use of the Licensed Work does not comply with the requirements
|
|
31
|
+
currently in effect as described in this License, you must purchase a
|
|
32
|
+
commercial license from the Licensor, its affiliated entities, or authorized
|
|
33
|
+
resellers, or you must refrain from using the Licensed Work.
|
|
34
|
+
|
|
35
|
+
All copies of the original and modified Licensed Work, and derivative works
|
|
36
|
+
of the Licensed Work, are subject to this License. This License applies
|
|
37
|
+
separately for each version of the Licensed Work and the Change Date may vary
|
|
38
|
+
for each version of the Licensed Work released by Licensor.
|
|
39
|
+
|
|
40
|
+
You must conspicuously display this License on each original or modified copy
|
|
41
|
+
of the Licensed Work. If you receive the Licensed Work in original or
|
|
42
|
+
modified form from a third party, the terms and conditions set forth in this
|
|
43
|
+
License apply to your use of that work.
|
|
44
|
+
|
|
45
|
+
Any use of the Licensed Work in violation of this License will automatically
|
|
46
|
+
terminate your rights under this License for the current and all other
|
|
47
|
+
versions of the Licensed Work.
|
|
48
|
+
|
|
49
|
+
This License does not grant you any right in any trademark or logo of
|
|
50
|
+
Licensor or its affiliates (provided that you may use a trademark or logo of
|
|
51
|
+
Licensor as expressly required by this License).
|
|
52
|
+
|
|
53
|
+
TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON
|
|
54
|
+
AN "AS IS" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,
|
|
55
|
+
EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF
|
|
56
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND
|
|
57
|
+
TITLE.
|
|
58
|
+
|
|
59
|
+
MariaDB hereby grants you permission to use this License’s text to license
|
|
60
|
+
your works, and to refer to it using the trademark "Business Source License",
|
|
61
|
+
as long as you comply with the Covenants of Licensor below.
|
|
62
|
+
|
|
63
|
+
-----------------------------------------------------------------------------
|
|
64
|
+
|
|
65
|
+
Covenants of Licensor
|
|
66
|
+
|
|
67
|
+
In consideration of the right to use this License’s text and the "Business
|
|
68
|
+
Source License" name and trademark, Licensor covenants to MariaDB, and to all
|
|
69
|
+
other recipients of the licensed work to be provided by Licensor:
|
|
70
|
+
|
|
71
|
+
1. To specify as the Change License the GPL Version 2.0 or any later version,
|
|
72
|
+
or a license that is compatible with GPL Version 2.0 or a later version,
|
|
73
|
+
where "compatible" means that software provided under the Change License can
|
|
74
|
+
be included in a program with software provided under GPL Version 2.0 or a
|
|
75
|
+
later version. Licensor may specify additional Change Licenses without
|
|
76
|
+
limitation.
|
|
77
|
+
|
|
78
|
+
2. To either: (a) specify an additional grant of rights to use that does not
|
|
79
|
+
impose any additional restriction on the right granted in this License, as
|
|
80
|
+
the Additional Use Grant; or (b) insert the text "None".
|
|
81
|
+
|
|
82
|
+
3. To specify a Change Date.
|
|
83
|
+
|
|
84
|
+
4. Not to modify this License in any other way.
|
|
85
|
+
|
|
86
|
+
-----------------------------------------------------------------------------
|
|
87
|
+
|
|
88
|
+
Notice
|
|
89
|
+
|
|
90
|
+
The Business Source License (this document, or the "License") is not an Open
|
|
91
|
+
Source license. However, the Licensed Work will eventually be made available
|
|
92
|
+
under an Open Source License, as stated in this License.
|
package/README.md
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import*as m from"prettier";import*as ee from"prettier-plugin-rust";async function ke(e,t){let r;t&&(r=await m.resolveConfig(t));try{return m.format(e,{plugins:[ee],printWidth:120,semi:!0,tabWidth:2,useTabs:!1,bracketSpacing:!0,...r})}catch(s){let o;return s instanceof Error?o=s.message:o=s,console.log(`Error during output formatting: ${o}`),e}}async function v(e){return m.format(e,{parser:"typescript"})}import{mkdirSync as E,writeFileSync as A}from"fs";import{dirname as C}from"path";async function n(e,t,r){E(C(t),{recursive:!0}),A(t,e),r!==void 0&&console.log(`${r}: ${t}`)}async function xe(e,t,r){let s=await v(e);E(C(t),{recursive:!0}),A(t,s),console.log(`${r}: ${t}`)}function Ee(e){return e.replace(/\\/g,"/")}import{existsSync as le}from"fs";import l from"fs";function k(e){l.existsSync(e)&&(l.readdirSync(e).forEach(t=>{let r=`${e}/${t}`;l.lstatSync(r).isDirectory()?k(r):l.unlinkSync(r)}),l.rmdirSync(e))}function $(e){return e.charAt(0).toUpperCase()+e.slice(1)}function M(e){return e=e.charAt(0).toUpperCase()+e.slice(1),e.replace(/(_\w)/g,r=>r[1].toUpperCase())+"Data"}function j(e,t){let r=[];return Object.entries(t).forEach(([s,o])=>{typeof o=="object"&&o.ephemeral||r.push(` use ${e}::${s}_schema;`)}),r}function W(e){let t=[];return Object.entries(e).forEach(([r,s])=>{typeof s=="object"&&s.ephemeral||t.push(` ${r}_schema::register(&mut _obelisk_world, &admin_cap, ctx);`)}),t}function h(e,t){return t.map(r=>` friend ${e}::${r};`).join(`
|
|
2
|
+
`)+`
|
|
3
|
+
friend ${e}::deploy_hook;`}function _(e,t){return typeof e=="string"?[`${t}value`]:Object.entries(e).map(([r,s])=>`${t}${r}`)}function b(e){return/^0x[a-fA-F0-9]+$/.test(e)}function te(e,t){if(typeof t=="string"||typeof t=="boolean"||typeof t=="number")return e==="string"?[`string(b"${t}")`]:typeof t=="string"&&b(t)?[`@${t}`]:[`${t}`];if(Array.isArray(t)){if(t.length>0){if(typeof t[0]=="string"||typeof t[0]=="boolean"||typeof t[0]=="number")return e==="vector<string>"?[`vector[${t.map(r=>`string(b"${r}")`)}]`]:typeof t[0]=="string"&&b(t[0])?[`vector[${t.map(r=>`@${r}`)}]`]:[`vector[${t.map(r=>`${r}`)}]`];if(typeof t=="object")return[`vector[${t.map(s=>`vector[${s.map(o=>`${o}`)}]`)}]`]}}else if(typeof t=="object")return Object.entries(t).map(([s,o])=>{if(typeof o=="string"||typeof o=="boolean"||typeof o=="number"){if(typeof e=="string"){if(e==="string")return`string(b"${o}")`}else if(e[s]==="string")return`string(b"${o}")`;return typeof o=="string"&&b(o)?`@${o}`:`${o}`}else if(Array.isArray(o)&&o.length>0){if(typeof o[0]=="string"||typeof o[0]=="boolean"||typeof o[0]=="number"){if(typeof e=="string"){if(e==="vector<string>")return`vector[${o.map(i=>`string(b"${i}")`)}]`}else if(e[s]==="vector<string>")return`vector[${o.map(i=>`string(b"${i}")`)}]`;return typeof o[0]=="string"&&b(o[0])?`vector[${o.map(i=>`@${i}`)}]`:`vector[${o.map(i=>`${i}`)}]`}else if(typeof o=="object")return`vector[${o.map(u=>`vector[${u.map(p=>`${p}`)}]`)}]`}});return[]}function N(e){return typeof e=="string"?e:`(${Object.entries(e).map(([t,r])=>`${r}`)})`}function c(e,t){return typeof e=="string"?[`${t}value: ${e}`]:Object.entries(e).map(([r,s])=>`${t}${r}: ${s}`)}function re(e,t){return typeof e=="string"?[`${t}_obelisk_data.value`]:Object.entries(e).map(([r,s])=>`${t}_obelisk_data.${r}`)}function f(e){return` ${_(e,"// ").join(`
|
|
4
|
+
`)}`}function g(e,t,r=!1){return` struct ${e} has copy, drop ${r?"":", store"} {
|
|
5
|
+
${c(t," ").join(`,
|
|
6
|
+
`)}
|
|
7
|
+
}
|
|
8
|
+
`}function S(e,t){return` public fun new(${c(t,"").join(", ")}): ${e} {
|
|
9
|
+
${e} {
|
|
10
|
+
${_(t," ").join(`,
|
|
11
|
+
`)}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
`}function R(e){return` public fun register(_obelisk_world: &mut World, admin_cap: &AdminCap, ctx: &mut TxContext) {
|
|
15
|
+
world::add_schema<Table<address,${e}>>(_obelisk_world, SCHEMA_ID, table::new<address, ${e}>(ctx), admin_cap);
|
|
16
|
+
}`}function O(e,t){return` public(friend) fun set(_obelisk_world: &mut World, _obelisk_entity_key: address, ${c(t," ")}) {
|
|
17
|
+
let _obelisk_schema = world::get_mut_schema<Table<address,${e}>>(_obelisk_world, SCHEMA_ID);
|
|
18
|
+
let _obelisk_data = new(${_(t," ")});
|
|
19
|
+
if(table::contains<address, ${e}>(_obelisk_schema, _obelisk_entity_key)) {
|
|
20
|
+
*table::borrow_mut<address, ${e}>(_obelisk_schema, _obelisk_entity_key) = _obelisk_data;
|
|
21
|
+
} else {
|
|
22
|
+
table::add(_obelisk_schema, _obelisk_entity_key, _obelisk_data);
|
|
23
|
+
};
|
|
24
|
+
events::emit_set(SCHEMA_ID, SCHEMA_TYPE, some(_obelisk_entity_key), _obelisk_data)
|
|
25
|
+
}
|
|
26
|
+
`}function I(e){return` public(friend) fun remove(_obelisk_world: &mut World, _obelisk_entity_key: address) {
|
|
27
|
+
let _obelisk_schema = world::get_mut_schema<Table<address,${e}>>(_obelisk_world, SCHEMA_ID);
|
|
28
|
+
assert!(table::contains<address, ${e}>(_obelisk_schema, _obelisk_entity_key), EEntityDoesNotExist);
|
|
29
|
+
table::remove(_obelisk_schema, _obelisk_entity_key);
|
|
30
|
+
events::emit_remove(SCHEMA_ID, _obelisk_entity_key)
|
|
31
|
+
}
|
|
32
|
+
`}function D(e,t){return typeof t=="string"?"":`
|
|
33
|
+
`+Object.entries(t).map(([r,s])=>` public(friend) fun set_${r}(_obelisk_world: &mut World, _obelisk_entity_key: address, ${r}: ${s}) {
|
|
34
|
+
let _obelisk_schema = world::get_mut_schema<Table<address,${e}>>(_obelisk_world, SCHEMA_ID);
|
|
35
|
+
assert!(table::contains<address, ${e}>(_obelisk_schema, _obelisk_entity_key), EEntityDoesNotExist);
|
|
36
|
+
let _obelisk_data = table::borrow_mut<address, ${e}>(_obelisk_schema, _obelisk_entity_key);
|
|
37
|
+
_obelisk_data.${r} = ${r};
|
|
38
|
+
events::emit_set(SCHEMA_ID, SCHEMA_TYPE, some(_obelisk_entity_key), *_obelisk_data)
|
|
39
|
+
}
|
|
40
|
+
`).join(`
|
|
41
|
+
`)}function F(e,t){return` public fun get(_obelisk_world: &World, _obelisk_entity_key: address): ${N(t)} {
|
|
42
|
+
let _obelisk_schema = world::get_schema<Table<address,${e}>>(_obelisk_world, SCHEMA_ID);
|
|
43
|
+
assert!(table::contains<address, ${e}>(_obelisk_schema, _obelisk_entity_key), EEntityDoesNotExist);
|
|
44
|
+
let _obelisk_data = table::borrow<address, ${e}>(_obelisk_schema, _obelisk_entity_key);
|
|
45
|
+
(
|
|
46
|
+
${re(t," ").join(`,
|
|
47
|
+
`)}
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
`}function H(e,t){return typeof t=="string"?"":`
|
|
51
|
+
`+Object.entries(t).map(([r,s])=>` public fun get_${r}(_obelisk_world: &World, _obelisk_entity_key: address): ${s} {
|
|
52
|
+
let _obelisk_schema = world::get_schema<Table<address,${e}>>(_obelisk_world, SCHEMA_ID);
|
|
53
|
+
assert!(table::contains<address, ${e}>(_obelisk_schema, _obelisk_entity_key), EEntityDoesNotExist);
|
|
54
|
+
let _obelisk_data = table::borrow<address, ${e}>(_obelisk_schema, _obelisk_entity_key);
|
|
55
|
+
_obelisk_data.${r}
|
|
56
|
+
}
|
|
57
|
+
`).join(`
|
|
58
|
+
`)}function V(e){return` public fun contains(_obelisk_world: &World, _obelisk_entity_key: address): bool {
|
|
59
|
+
let _obelisk_schema = world::get_schema<Table<address,${e}>>(_obelisk_world, SCHEMA_ID);
|
|
60
|
+
table::contains<address, ${e}>(_obelisk_schema, _obelisk_entity_key)
|
|
61
|
+
}`}function B(e,t,r){return` public fun register(_obelisk_world: &mut World, admin_cap: &AdminCap, _ctx: &mut TxContext) {
|
|
62
|
+
let _obelisk_schema = new(${te(t,r)});
|
|
63
|
+
world::add_schema<${e}>(_obelisk_world, SCHEMA_ID, _obelisk_schema, admin_cap);
|
|
64
|
+
events::emit_set(SCHEMA_ID, SCHEMA_TYPE, none(), _obelisk_schema);
|
|
65
|
+
}`}function U(e,t){return` public(friend) fun set(_obelisk_world: &mut World, ${c(t," ")}) {
|
|
66
|
+
let _obelisk_schema = world::get_mut_schema<${e}>(_obelisk_world, SCHEMA_ID);
|
|
67
|
+
${typeof t=="string"?" _obelisk_schema.value = value;":Object.entries(t).map(([r,s])=>` _obelisk_schema.${r} = ${r};`).join(`
|
|
68
|
+
`)}
|
|
69
|
+
}`}function G(e,t){return typeof t=="string"?"":`
|
|
70
|
+
`+Object.entries(t).map(([r,s])=>`
|
|
71
|
+
public(friend) fun set_${r}(_obelisk_world: &mut World, ${r}: ${s}) {
|
|
72
|
+
let _obelisk_schema = world::get_mut_schema<${e}>(_obelisk_world, SCHEMA_ID);
|
|
73
|
+
_obelisk_schema.${r} = ${r};
|
|
74
|
+
events::emit_set(SCHEMA_ID, SCHEMA_TYPE, none(), *_obelisk_schema)
|
|
75
|
+
}`).join(`
|
|
76
|
+
`)}function Y(e,t){return` public fun get(_obelisk_world: &World): ${N(t)} {
|
|
77
|
+
let _obelisk_schema = world::get_schema<${e}>(_obelisk_world, SCHEMA_ID);
|
|
78
|
+
(
|
|
79
|
+
${typeof t=="string"?" _obelisk_schema.value":Object.entries(t).map(([r,s])=>` _obelisk_schema.${r},`).join(`
|
|
80
|
+
`)}
|
|
81
|
+
)
|
|
82
|
+
}`}function L(e,t){return typeof t=="string"?"":`
|
|
83
|
+
`+Object.entries(t).map(([r,s])=>`
|
|
84
|
+
public fun get_${r}(_obelisk_world: &World): ${s} {
|
|
85
|
+
let _obelisk_schema = world::get_schema<${e}>(_obelisk_world, SCHEMA_ID);
|
|
86
|
+
_obelisk_schema.${r}
|
|
87
|
+
}`).join(`
|
|
88
|
+
`)}import{existsSync as se}from"fs";function K(e,t){e.systems.map(r=>{if(!se(`${t}/contracts/${e.name}/sources/system/${r}.move`)){let s=`module ${e.name}::${r} {
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
`;n(s,`${t}/contracts/${e.name}/sources/system/${r}.move`,"formatAndWriteMove")}})}function z(e,t){let r=`[package]
|
|
92
|
+
name = "${e.name}"
|
|
93
|
+
version = "0.0.1"
|
|
94
|
+
|
|
95
|
+
[dependencies]
|
|
96
|
+
Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "testnet-v1.8.0" }
|
|
97
|
+
|
|
98
|
+
[addresses]
|
|
99
|
+
sui = "0x2"
|
|
100
|
+
${e.name} = "0x0"
|
|
101
|
+
`;n(r,`${t}/contracts/${e.name}/Move.toml`,"formatAndWriteMove")}function P(e,t){let r=`module ${e.name}::entity_key {
|
|
102
|
+
use sui::hash::keccak256;
|
|
103
|
+
use sui::address;
|
|
104
|
+
use sui::object;
|
|
105
|
+
use std::vector;
|
|
106
|
+
|
|
107
|
+
public fun from_object<T: key + store>(object: &T): address {
|
|
108
|
+
object::id_address(object)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public fun from_bytes(bytes: vector<u8>): address {
|
|
112
|
+
address::from_bytes(keccak256(&bytes))
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public fun from_u256(x: u256): address {
|
|
116
|
+
address::from_u256(x)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public fun from_address_with_seed(addr: address, seed: vector<u8>): address {
|
|
120
|
+
let data = address::to_bytes(addr);
|
|
121
|
+
vector::append(&mut data, seed);
|
|
122
|
+
from_bytes(data)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
public fun from_address_with_u256(addr: address, x: u256): address {
|
|
126
|
+
let data = address::to_bytes(addr);
|
|
127
|
+
vector::append(&mut data, bcs::to_bytes<u256>(&x));
|
|
128
|
+
from_bytes(data)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
public fun from_object_with_seed<T: key + store>(object: &T, seed: vector<u8>): address {
|
|
132
|
+
let data = address::to_bytes(object::id_address(object));
|
|
133
|
+
vector::append(&mut data, seed);
|
|
134
|
+
from_bytes(data)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
public fun from_object_with_u256<T: key + store>(object: &T, x: u256): address {
|
|
138
|
+
let data = address::to_bytes(object::id_address(object));
|
|
139
|
+
vector::append(&mut data, bcs::to_bytes<u256>(&x));
|
|
140
|
+
from_bytes(data)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
`;n(r,`${t}/contracts/${e.name}/sources/entity_key.move`,"formatAndWriteMove")}function Q(e,t){let r=`module ${e.name}::init {
|
|
144
|
+
use std::ascii::string;
|
|
145
|
+
use sui::transfer;
|
|
146
|
+
use sui::tx_context::{Self, TxContext};
|
|
147
|
+
use ${e.name}::world;
|
|
148
|
+
${j(e.name,e.schemas).join(`
|
|
149
|
+
`)}
|
|
150
|
+
|
|
151
|
+
fun init(ctx: &mut TxContext) {
|
|
152
|
+
let (_obelisk_world, admin_cap) = world::create(string(b"${$(e.name)}"), string(b"${$(e.description)}"),ctx);
|
|
153
|
+
|
|
154
|
+
// Add Schema
|
|
155
|
+
${W(e.schemas).join(`
|
|
156
|
+
`)}
|
|
157
|
+
|
|
158
|
+
transfer::public_share_object(_obelisk_world);
|
|
159
|
+
transfer::public_transfer(admin_cap, tx_context::sender(ctx));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
#[test_only]
|
|
163
|
+
public fun init_world_for_testing(ctx: &mut TxContext){
|
|
164
|
+
init(ctx)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
`;n(r,`${t}/contracts/${e.name}/sources/codegen/init.move`,"formatAndWriteMove")}function q(e,t,r){oe(e,t,r),ne(e,t)}function oe(e,t,r){r===void 0&&(r=1);let s=`module ${e}::world {
|
|
168
|
+
use std::ascii::{String, string};
|
|
169
|
+
use std::vector;
|
|
170
|
+
use sui::tx_context::TxContext;
|
|
171
|
+
use sui::bag::{Self, Bag};
|
|
172
|
+
use sui::object::{Self, UID, ID};
|
|
173
|
+
|
|
174
|
+
const VERSION: u64 = ${r};
|
|
175
|
+
|
|
176
|
+
/// Schema does not exist
|
|
177
|
+
const ESchemaDoesNotExist: u64 = 0;
|
|
178
|
+
/// Schema already exists
|
|
179
|
+
const ESchemaAlreadyExists: u64 = 1;
|
|
180
|
+
/// Not the right admin for this world
|
|
181
|
+
const ENotAdmin: u64 = 2;
|
|
182
|
+
/// Migration is not an upgrade
|
|
183
|
+
const ENotUpgrade: u64 = 3;
|
|
184
|
+
/// Calling functions from the wrong package version
|
|
185
|
+
const EWrongVersion: u64 = 4;
|
|
186
|
+
|
|
187
|
+
struct AdminCap has key, store {
|
|
188
|
+
id: UID,
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
struct World has key, store {
|
|
192
|
+
id: UID,
|
|
193
|
+
/// Name of the world
|
|
194
|
+
name: String,
|
|
195
|
+
/// Description of the world
|
|
196
|
+
description: String,
|
|
197
|
+
/// Schemas of the world
|
|
198
|
+
schemas: Bag,
|
|
199
|
+
/// Schema names of the world
|
|
200
|
+
schema_names: vector<String>,
|
|
201
|
+
/// admin of the world
|
|
202
|
+
admin: ID,
|
|
203
|
+
/// Version of the world
|
|
204
|
+
version: u64
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
public fun create(name: String, description: String, ctx: &mut TxContext): (World, AdminCap) {
|
|
208
|
+
let admin_cap = AdminCap {
|
|
209
|
+
id: object::new(ctx),
|
|
210
|
+
};
|
|
211
|
+
let _obelisk_world = World {
|
|
212
|
+
id: object::new(ctx),
|
|
213
|
+
name,
|
|
214
|
+
description,
|
|
215
|
+
schemas: bag::new(ctx),
|
|
216
|
+
schema_names: vector::empty(),
|
|
217
|
+
admin: object::id(&admin_cap),
|
|
218
|
+
version: VERSION
|
|
219
|
+
};
|
|
220
|
+
(_obelisk_world, admin_cap)
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
public fun get_admin(_obelisk_world: &World): ID {
|
|
224
|
+
_obelisk_world.admin
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
public fun info(_obelisk_world: &World): (String, String, u64) {
|
|
228
|
+
(_obelisk_world.name, _obelisk_world.description, _obelisk_world.version)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
public fun schema_names(_obelisk_world: &World): vector<String> {
|
|
232
|
+
_obelisk_world.schema_names
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
public fun get_schema<T : store>(_obelisk_world: &World, _obelisk_schema_id: vector<u8>): &T {
|
|
236
|
+
assert!(_obelisk_world.version == VERSION, EWrongVersion);
|
|
237
|
+
assert!(bag::contains(&_obelisk_world.schemas, _obelisk_schema_id), ESchemaDoesNotExist);
|
|
238
|
+
bag::borrow<vector<u8>, T>(&_obelisk_world.schemas, _obelisk_schema_id)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
public fun get_mut_schema<T : store>(_obelisk_world: &mut World, _obelisk_schema_id: vector<u8>): &mut T {
|
|
242
|
+
assert!(_obelisk_world.version == VERSION, EWrongVersion);
|
|
243
|
+
assert!(bag::contains(&_obelisk_world.schemas, _obelisk_schema_id), ESchemaDoesNotExist);
|
|
244
|
+
bag::borrow_mut<vector<u8>, T>(&mut _obelisk_world.schemas, _obelisk_schema_id)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
public fun add_schema<T : store>(_obelisk_world: &mut World, _obelisk_schema_id: vector<u8>, schema: T, admin_cap: &AdminCap){
|
|
248
|
+
assert!(_obelisk_world.admin == object::id(admin_cap), ENotAdmin);
|
|
249
|
+
assert!(_obelisk_world.version == VERSION, EWrongVersion);
|
|
250
|
+
assert!(!bag::contains(&_obelisk_world.schemas, _obelisk_schema_id), ESchemaAlreadyExists);
|
|
251
|
+
vector::push_back(&mut _obelisk_world.schema_names, string(_obelisk_schema_id));
|
|
252
|
+
bag::add<vector<u8>,T>(&mut _obelisk_world.schemas, _obelisk_schema_id, schema);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
public fun contains(_obelisk_world: &mut World, _obelisk_schema_id: vector<u8>): bool {
|
|
256
|
+
assert!(_obelisk_world.version == VERSION, EWrongVersion);
|
|
257
|
+
bag::contains(&mut _obelisk_world.schemas, _obelisk_schema_id)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
entry fun migrate(_obelisk_world: &mut World, admin_cap: &AdminCap) {
|
|
261
|
+
assert!(_obelisk_world.admin == object::id(admin_cap), ENotAdmin);
|
|
262
|
+
assert!(_obelisk_world.version < VERSION, ENotUpgrade);
|
|
263
|
+
_obelisk_world.version = VERSION;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
`;n(s,`${t}/contracts/${e}/sources/codegen/eps/world.move`,"formatAndWriteMove")}function ne(e,t){let r=`module ${e}::events {
|
|
267
|
+
use sui::event;
|
|
268
|
+
use std::option::Option;
|
|
269
|
+
|
|
270
|
+
struct SchemaSetRecord<T: copy + drop> has copy, drop {
|
|
271
|
+
_obelisk_schema_id: vector<u8>,
|
|
272
|
+
_obelisk_schema_type: u8, // obelisk_schema_type_enum => { 0: common, 1: singleton, 2: ephemeral }
|
|
273
|
+
_obelisk_entity_key: Option<address>,
|
|
274
|
+
data: T
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
struct SchemaRemoveRecord has copy, drop {
|
|
278
|
+
_obelisk_schema_id: vector<u8>,
|
|
279
|
+
_obelisk_entity_key: address
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
public fun emit_set<T: copy + drop>(_obelisk_schema_id: vector<u8>, _obelisk_schema_type: u8, _obelisk_entity_key: Option<address>, data: T) {
|
|
283
|
+
event::emit(SchemaSetRecord { _obelisk_schema_id, _obelisk_schema_type, _obelisk_entity_key, data})
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
public fun emit_remove(_obelisk_schema_id: vector<u8>, _obelisk_entity_key: address) {
|
|
287
|
+
event::emit(SchemaRemoveRecord { _obelisk_schema_id, _obelisk_entity_key })
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
`;n(r,`${t}/contracts/${e}/sources/codegen/eps/events.move`,"formatAndWriteMove")}function ie(e){let t=[];for(let r of Object.keys(e.schemas)){let s=e.schemas[r],o,i,u,p=!1,x=!1,a=!1;if(typeof s=="string")i=s,s==="string"?(o="String",a=!0):s==="vector<string>"?(o="vector<String>",a=!0):o=s;else{if(i=s.valueType,typeof s.valueType=="string")s.valueType==="string"?(o="String",a=!0):s.valueType==="vector<string>"?(o="vector<String>",a=!0):o=s.valueType;else{o={...s.valueType};for(let d in o)o.hasOwnProperty(d)&&(o[d]==="string"?(o[d]="String",a=!0):o[d]==="vector<string>"&&(o[d]="vector<String>",a=!0))}u=s.defaultValue,p=s.ephemeral!==void 0?s.ephemeral:!1,x=s.defaultValue!==void 0}t.push({projectName:e.name,systems:e.systems,schemaName:r,structName:M(r),ephemeral:p,singleton:x,valueType:o,realType:i,defaultValue:u,needImportString:a})}return t}function J(e,t){let r=ie(e);for(let s of r){let o;s.ephemeral?o=ae(s):s.defaultValue!==void 0?o=ce(s):o=de(s),n(o,`${t}/contracts/${s.projectName}/sources/codegen/schemas/${s.schemaName}.move`,"formatAndWriteMove")}}function ae(e){return`module ${e.projectName}::${e.schemaName}_schema {
|
|
291
|
+
use std::option::none;
|
|
292
|
+
use ${e.projectName}::events;
|
|
293
|
+
|
|
294
|
+
const SCHEMA_ID: vector<u8> = b"${e.schemaName}";
|
|
295
|
+
const SCHEMA_TYPE: u8 = 2;
|
|
296
|
+
|
|
297
|
+
${f(e.valueType)}
|
|
298
|
+
${g(e.structName,e.valueType,e.ephemeral)}
|
|
299
|
+
public fun emit_${e.schemaName}(${c(e.valueType," ")}) {
|
|
300
|
+
events::emit_set(SCHEMA_ID, SCHEMA_TYPE, none(), ${e.structName} { ${_(e.valueType," ")} })
|
|
301
|
+
}
|
|
302
|
+
}`}function ce(e){return`module ${e.projectName}::${e.schemaName}_schema {
|
|
303
|
+
${e.needImportString?` use std::ascii::{String,string};
|
|
304
|
+
`:" "}use std::option::none;
|
|
305
|
+
use sui::tx_context::TxContext;
|
|
306
|
+
use ${e.projectName}::events;
|
|
307
|
+
use ${e.projectName}::world::{Self, World, AdminCap};
|
|
308
|
+
// Systems
|
|
309
|
+
${h(e.projectName,e.systems)}
|
|
310
|
+
|
|
311
|
+
const SCHEMA_ID: vector<u8> = b"${e.schemaName}";
|
|
312
|
+
const SCHEMA_TYPE: u8 = 1;
|
|
313
|
+
|
|
314
|
+
${f(e.valueType)}
|
|
315
|
+
${g(e.structName,e.valueType)}
|
|
316
|
+
${S(e.structName,e.valueType)}
|
|
317
|
+
${B(e.structName,e.realType,e.defaultValue)}
|
|
318
|
+
|
|
319
|
+
${U(e.structName,e.valueType)}${G(e.structName,e.valueType)}
|
|
320
|
+
|
|
321
|
+
${Y(e.structName,e.valueType)}${L(e.structName,e.valueType)}
|
|
322
|
+
}
|
|
323
|
+
`}function de(e){return`module ${e.projectName}::${e.schemaName}_schema {
|
|
324
|
+
${e.needImportString?` use std::ascii::String;
|
|
325
|
+
`:" "}use std::option::some;
|
|
326
|
+
use sui::tx_context::TxContext;
|
|
327
|
+
use sui::table::{Self, Table};
|
|
328
|
+
use ${e.projectName}::events;
|
|
329
|
+
use ${e.projectName}::world::{Self, World, AdminCap};
|
|
330
|
+
|
|
331
|
+
// Systems
|
|
332
|
+
${h(e.projectName,e.systems)}
|
|
333
|
+
|
|
334
|
+
/// Entity does not exist
|
|
335
|
+
const EEntityDoesNotExist: u64 = 0;
|
|
336
|
+
|
|
337
|
+
const SCHEMA_ID: vector<u8> = b"${e.schemaName}";
|
|
338
|
+
const SCHEMA_TYPE: u8 = 0;
|
|
339
|
+
|
|
340
|
+
${f(e.valueType)}
|
|
341
|
+
${g(e.structName,e.valueType)}
|
|
342
|
+
${S(e.structName,e.valueType)}
|
|
343
|
+
${R(e.structName)}
|
|
344
|
+
|
|
345
|
+
${O(e.structName,e.valueType)}${D(e.structName,e.valueType)}
|
|
346
|
+
${F(e.structName,e.valueType)}${H(e.structName,e.valueType)}
|
|
347
|
+
${I(e.structName)}
|
|
348
|
+
${V(e.structName)}
|
|
349
|
+
}
|
|
350
|
+
`}import{existsSync as me}from"fs";function X(e,t){if(!me(`${t}/contracts/${e.name}/sources/script/deploy_hook.move`)){let r=`module ${e.name}::deploy_hook {
|
|
351
|
+
use ${e.name}::world::{World, AdminCap, get_admin};
|
|
352
|
+
use sui::object;
|
|
353
|
+
|
|
354
|
+
/// Not the right admin for this world
|
|
355
|
+
const ENotAdmin: u64 = 0;
|
|
356
|
+
|
|
357
|
+
public entry fun run(world: &mut World, admin_cap: &AdminCap) {
|
|
358
|
+
assert!( get_admin(world) == object::id(admin_cap), ENotAdmin);
|
|
359
|
+
|
|
360
|
+
// Logic that needs to be automated once the contract is deployed
|
|
361
|
+
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
#[test_only]
|
|
365
|
+
public fun deploy_hook_for_testing(world: &mut World, admin_cap: &AdminCap){
|
|
366
|
+
run(world, admin_cap)
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
`;n(r,`${t}/contracts/${e.name}/sources/script/deploy_hook.move`,"formatAndWriteMove")}}function nt(e,t){let r="";t===void 0?r=process.cwd():r=t,le(`${r}/contracts/${e.name}`)?k(`${r}/contracts/${e.name}/sources/codegen`):(z(e,r),P(e,r)),K(e,r),X(e,r),J(e,r),q(e.name,r),Q(e,r)}import{findUp as _e}from"find-up";import w from"path";import ue from"esbuild";var y=class extends Error{name="NotInsideProjectError";message="You are not inside a Obelisk project"};import{rmSync as pe}from"fs";import{pathToFileURL as be}from"url";import fe from"os";var ge=["obelisk.config.js","obelisk.config.mjs","obelisk.config.ts","obelisk.config.mts"],T="obelisk.config.example.mjs";async function bt(e){e=await Z(e);try{return await ue.build({entryPoints:[e],format:"esm",outfile:T,platform:"node",bundle:!0,packages:"external"}),e=await Z(T,!0),(await import(e+`?update=${Date.now()}`)).obeliskConfig}finally{pe(T,{force:!0})}}async function Z(e,t){return e===void 0?e=await ye():w.isAbsolute(e)||(e=w.join(process.cwd(),e),e=w.normalize(e)),t&&fe.platform()==="win32"?be(e).href:e}async function ye(){let e=await _e(ge);if(e===void 0)throw new y;return e}export{n as formatAndWriteMove,xe as formatAndWriteTypescript,ke as formatMove,v as formatTypescript,q as generateEps,bt as loadConfig,Ee as posixPath,Z as resolveConfigPath,nt as worldgen};
|
|
370
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/worldgen.ts","../src/codegen/utils/renderMove/common.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateEntityKey.ts","../src/codegen/utils/renderMove/generateInit.ts","../src/codegen/utils/renderMove/generateEps.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts"],"sourcesContent":["// import chalk from \"chalk\";\nimport * as prettier from \"prettier\";\nimport * as rustPlugin from \"prettier-plugin-rust\";\n\nexport async function formatMove(\n content: string,\n prettierConfigPath?: string\n): Promise<string> {\n let config;\n if (prettierConfigPath) {\n config = await prettier.resolveConfig(prettierConfigPath);\n }\n try {\n return prettier.format(content, {\n plugins: [rustPlugin],\n // parser: \"rustParse\",\n\n printWidth: 120,\n semi: true,\n tabWidth: 2,\n useTabs: false,\n bracketSpacing: true,\n\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 { mkdirSync, writeFileSync } from \"fs\";\nimport { dirname } from \"path\";\nimport { formatMove, formatTypescript } from \"./format\";\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n // const formattedOutput = await formatMove(output);\n // console.log(formattedOutput)\n mkdirSync(dirname(fullOutputPath), { recursive: true });\n\n writeFileSync(fullOutputPath, output);\n if (logPrefix !== undefined) {\n console.log(`${logPrefix}: ${fullOutputPath}`);\n }\n}\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 mkdirSync(dirname(fullOutputPath), { recursive: true });\n\n writeFileSync(fullOutputPath, formattedOutput);\n console.log(`${logPrefix}: ${fullOutputPath}`);\n}\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 { SchemaMapType, ObeliskConfig } from \"../../types\";\nimport { rmdirSync, existsSync } from \"fs\";\nimport { deleteFolderRecursive } from \"./common\";\nimport { generateSystem } from \"./generateSystem\";\nimport { generateToml } from \"./generateToml\";\nimport { generateEntityKey } from \"./generateEntityKey\";\nimport { generateInit } from \"./generateInit\";\nimport { generateEps } from \"./generateEps\";\nimport { generateSchema } from \"./generateSchema\";\nimport {generateScript} from \"./generateScript\";\n\nexport function worldgen(config: ObeliskConfig, srcPrefix?: string) {\n let path = \"\";\n if (srcPrefix === undefined) {\n path = process.cwd();\n } else {\n path = srcPrefix;\n }\n\n if (existsSync(`${path}/contracts/${config.name}`)) {\n deleteFolderRecursive(`${path}/contracts/${config.name}/sources/codegen`);\n } else {\n generateToml(config, path);\n generateEntityKey(config, path);\n }\n\n generateSystem(config, path);\n generateScript(config, path);\n\n // generate codegen\n generateSchema(config, path);\n generateEps(config.name, path);\n generateInit(config, path);\n}\n","import { BaseType, SchemaMapType, BaseValueType, 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 * Convert snake_case to camelCase\n * @param str\n */\nexport function convertToCamelCase(str: string): string {\n str = str.charAt(0).toUpperCase() + str.slice(1);\n let result = str.replace(/(_\\w)/g, (match) => match[1].toUpperCase());\n return result + \"Data\";\n}\n\n/**\n *\n * @param name\n * @param values\n * @return [use name::name_schema, use name::info_schema]\n */\nexport function getUseSchema(\n name: string,\n values: Record<string, SchemaMapType>\n): string[] {\n let schema: string[] = [];\n Object.entries(values).forEach(([key, value]) => {\n if (typeof value === \"object\" && value.ephemeral) {\n } else {\n schema.push(`\\tuse ${name}::${key}_schema;`);\n }\n });\n return schema;\n}\n\n/**\n * @param values\n * @return [ name_schema::register(&mut _obelisk_world, ctx) ,info_schema::register(&mut _obelisk_world, ctx) ]\n */\nexport function getRegisterSchema(\n values: Record<string, SchemaMapType>\n): string[] {\n let registers: string[] = [];\n Object.entries(values).forEach(([key, value]) => {\n if (typeof value === \"object\" && value.ephemeral) {\n } else {\n registers.push(`\\t\\t${key}_schema::register(&mut _obelisk_world, &admin_cap, ctx);`);\n }\n });\n return registers;\n}\n\n/**\n *\n * @param name\n * @param values\n * @return [ friend name::name_system, friend name::info_system ]\n */\nexport function getFriendSystem(name: string, values: string[]): string {\n return values.map((key) => `\\tfriend ${name}::${key};`).join(\"\\n\") + `\\n\\tfriend ${name}::deploy_hook;`;\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(\n values: Record<string, string> | string,\n prefixArgs: string\n): string[] {\n return typeof values === \"string\"\n ? [`${prefixArgs}value`]\n : Object.entries(values).map(([key, _]) => `${prefixArgs}${key}`);\n}\n\nfunction isAddress(str: string): boolean {\n const regex = /^0x[a-fA-F0-9]+$/;\n return regex.test(str);\n}\n\nexport function getStructInitValue(\n keys: BaseType | Record<string, BaseType>,\n values: BaseValueType | Record<string, BaseValueType>\n) {\n if (\n typeof values === \"string\" ||\n typeof values === \"boolean\" ||\n typeof values === \"number\"\n ) {\n if (keys === \"string\") {\n return [`string(b\"${values}\")`];\n }\n if (typeof values === \"string\") {\n if (isAddress(values)) {\n return [`@${values}`];\n }\n }\n return [`${values}`];\n } else if (Array.isArray(values)) {\n // Check the array element type\n if (values.length > 0) {\n if (\n typeof values[0] === \"string\" ||\n typeof values[0] === \"boolean\" ||\n typeof values[0] === \"number\"\n ) {\n if (keys === \"vector<string>\") {\n return [`vector[${values.map((item) => `string(b\"${item}\")`)}]`];\n }\n\n if (typeof values[0] === \"string\") {\n if (isAddress(values[0])) {\n return [`vector[${values.map((item) => `@${item}`)}]`];\n }\n }\n return [`vector[${values.map((item) => `${item}`)}]`];\n } else if (typeof values === \"object\") {\n let res = `vector[${values.map((item: any) => {\n return `vector[${item.map((data: any) => {\n return `${data}`;\n })}]`;\n })}]`;\n\n return [res];\n }\n }\n } else if (typeof values === \"object\") {\n // It's an object, handle accordingly\n let res = Object.entries(values).map(([key, value]) => {\n if (\n typeof value === \"string\" ||\n typeof value === \"boolean\" ||\n typeof value === \"number\"\n ) {\n if (typeof keys === \"string\") {\n if (keys === \"string\") {\n return `string(b\"${value}\")`;\n }\n } else {\n if (keys[key] === \"string\") {\n return `string(b\"${value}\")`;\n }\n }\n\n if (typeof value === \"string\") {\n if (isAddress(value)) {\n return `@${value}`;\n }\n }\n return `${value}`;\n } else if (Array.isArray(value)) {\n // Check the array element type\n if (value.length > 0) {\n if (\n typeof value[0] === \"string\" ||\n typeof value[0] === \"boolean\" ||\n typeof value[0] === \"number\"\n ) {\n if (typeof keys === \"string\") {\n if (keys === \"vector<string>\") {\n return `vector[${value.map((item) => `string(b\"${item}\")`)}]`;\n }\n } else {\n if (keys[key] === \"vector<string>\") {\n return `vector[${value.map((item) => `string(b\"${item}\")`)}]`;\n }\n }\n\n if (typeof value[0] === \"string\") {\n if (isAddress(value[0])) {\n return `vector[${value.map((item) => `@${item}`)}]`;\n }\n }\n return `vector[${value.map((item) => `${item}`)}]`;\n } else if (typeof value === \"object\") {\n let res = `vector[${value.map((item: any) => {\n return `vector[${item.map((data: any) => {\n return `${data}`;\n })}]`;\n })}]`;\n\n return res;\n }\n }\n }\n });\n return res;\n }\n // Handle other cases or return an empty array if type not recognized\n return [];\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaMapType): string {\nexport function getStructTypes(\n values: MoveType | Record<string, MoveType>\n): string {\n return typeof values === \"string\"\n ? values\n : `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(\n values: Record<string, string> | string,\n prefix: string\n): string[] {\n return typeof values === \"string\"\n ? [`${prefix}value: ${values}`]\n : Object.entries(values).map(([key, type]) => `${prefix}${key}: ${type}`);\n}\n\n/**\n * @param values\n * @param prefixArgs\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(\n values: MoveType | Record<string, MoveType>,\n prefixArgs: string\n): string[] {\n return typeof values === \"string\"\n ? [`${prefixArgs}_obelisk_data.value`]\n : Object.entries(values).map(\n ([key, _]) => `${prefixArgs}_obelisk_data.${key}`\n );\n}\n\nexport function renderKeyName(values: Record<string, string> | string): string {\n return `\\t${getStructAttrs(values, \"// \").join(\"\\n\\t\")}`;\n}\n\nexport function renderStruct(\n structName: string,\n values: Record<string, string> | string,\n isEphemeral: boolean = false\n): string {\n return `\\tstruct ${structName} has copy, drop ${\n isEphemeral ? \"\" : \", store\"\n } {\n${getStructAttrsWithType(values, \"\\t\\t\").join(\",\\n\")}\n\\t}\\n`;\n}\n\nexport function renderNewStructFunc(\n structName: string,\n values: Record<string, string> | string\n): string {\n return `\\tpublic fun new(${getStructAttrsWithType(values, \"\").join(\n \", \"\n )}): ${structName} {\n\\t\\t${structName} {\n${getStructAttrs(values, \"\\t\\t\\t\").join(\", \\n\")}\n\\t\\t}\n\\t}\\n`;\n}\n\nexport function renderRegisterFunc(structName: string): string {\n return `\\tpublic fun register(_obelisk_world: &mut World, admin_cap: &AdminCap, ctx: &mut TxContext) {\n\\t\\tworld::add_schema<Table<address,${structName}>>(_obelisk_world, SCHEMA_ID, table::new<address, ${structName}>(ctx), admin_cap);\n\\t}`;\n}\n\nexport function renderSetFunc(\n structName: string,\n values: Record<string, string> | string\n): string {\n return `\\tpublic(friend) fun set(_obelisk_world: &mut World, _obelisk_entity_key: address, ${getStructAttrsWithType(\n values,\n \" \"\n )}) {\n\\t\\tlet _obelisk_schema = world::get_mut_schema<Table<address,${structName}>>(_obelisk_world, SCHEMA_ID);\n\\t\\tlet _obelisk_data = new(${getStructAttrs(values, \" \")});\n\\t\\tif(table::contains<address, ${structName}>(_obelisk_schema, _obelisk_entity_key)) {\n\\t\\t\\t*table::borrow_mut<address, ${structName}>(_obelisk_schema, _obelisk_entity_key) = _obelisk_data;\n\\t\\t} else {\n\\t\\t\\ttable::add(_obelisk_schema, _obelisk_entity_key, _obelisk_data);\n\\t\\t};\n\\t\\tevents::emit_set(SCHEMA_ID, SCHEMA_TYPE, some(_obelisk_entity_key), _obelisk_data)\n\\t}\n`;\n}\n\nexport function renderRemoveFunc(structName: string): string {\n return `\\tpublic(friend) fun remove(_obelisk_world: &mut World, _obelisk_entity_key: address) {\n\\t\\tlet _obelisk_schema = world::get_mut_schema<Table<address,${structName}>>(_obelisk_world, SCHEMA_ID);\n\\t\\tassert!(table::contains<address, ${structName}>(_obelisk_schema, _obelisk_entity_key), EEntityDoesNotExist);\n\\t\\ttable::remove(_obelisk_schema, _obelisk_entity_key);\n\\t\\tevents::emit_remove(SCHEMA_ID, _obelisk_entity_key)\n\\t}\n`;\n}\n\nexport function renderSetAttrsFunc(\n structName: string,\n struct: MoveType | Record<string, MoveType>\n): string {\n return typeof struct === \"string\"\n ? \"\"\n : \"\\n\" +\n Object.entries(struct)\n .map(\n ([key, type]) =>\n `\\tpublic(friend) fun set_${key}(_obelisk_world: &mut World, _obelisk_entity_key: address, ${key}: ${type}) {\n\\t\\tlet _obelisk_schema = world::get_mut_schema<Table<address,${structName}>>(_obelisk_world, SCHEMA_ID);\n\\t\\tassert!(table::contains<address, ${structName}>(_obelisk_schema, _obelisk_entity_key), EEntityDoesNotExist);\n\\t\\tlet _obelisk_data = table::borrow_mut<address, ${structName}>(_obelisk_schema, _obelisk_entity_key);\n\\t\\t_obelisk_data.${key} = ${key};\n\\t\\tevents::emit_set(SCHEMA_ID, SCHEMA_TYPE, some(_obelisk_entity_key), *_obelisk_data)\n\\t}\n`\n )\n .join(\"\\n\");\n}\n\nexport function renderGetAllFunc(\n structName: string,\n struct: MoveType | Record<string, MoveType>\n): string {\n return `\\tpublic fun get(_obelisk_world: &World, _obelisk_entity_key: address): ${getStructTypes(\n struct\n )} {\n\\t\\tlet _obelisk_schema = world::get_schema<Table<address,${structName}>>(_obelisk_world, SCHEMA_ID);\n\\t\\tassert!(table::contains<address, ${structName}>(_obelisk_schema, _obelisk_entity_key), EEntityDoesNotExist);\n\\t\\tlet _obelisk_data = table::borrow<address, ${structName}>(_obelisk_schema, _obelisk_entity_key);\n\\t\\t(\n${getStructAttrsQuery(struct, \"\\t\\t\\t\").join(\",\\n\")}\n\\t\\t)\n\\t}\n`;\n}\n\nexport function renderGetAttrsFunc(\n structName: string,\n struct: MoveType | Record<string, MoveType>\n): string {\n return typeof struct === \"string\"\n ? \"\"\n : \"\\n\" +\n Object.entries(struct)\n .map(\n ([\n key,\n type,\n ]) => `\\tpublic fun get_${key}(_obelisk_world: &World, _obelisk_entity_key: address): ${type} {\n\\t\\tlet _obelisk_schema = world::get_schema<Table<address,${structName}>>(_obelisk_world, SCHEMA_ID);\n\\t\\tassert!(table::contains<address, ${structName}>(_obelisk_schema, _obelisk_entity_key), EEntityDoesNotExist);\n\\t\\tlet _obelisk_data = table::borrow<address, ${structName}>(_obelisk_schema, _obelisk_entity_key);\n\\t\\t_obelisk_data.${key}\n\\t}\n`\n )\n .join(\"\\n\");\n}\n\nexport function renderContainFunc(structName: string): string {\n return `\\tpublic fun contains(_obelisk_world: &World, _obelisk_entity_key: address): bool {\n\\t\\tlet _obelisk_schema = world::get_schema<Table<address,${structName}>>(_obelisk_world, SCHEMA_ID);\n\\t\\ttable::contains<address, ${structName}>(_obelisk_schema, _obelisk_entity_key)\n\\t}`;\n}\n\nexport function renderRegisterFuncWithInit(\n structName: string,\n valueType: BaseType | Record<string, BaseType>,\n defaultValue: BaseValueType | Record<string, BaseValueType>\n): string {\n return `\\tpublic fun register(_obelisk_world: &mut World, admin_cap: &AdminCap, _ctx: &mut TxContext) {\n\\t\\tlet _obelisk_schema = new(${getStructInitValue(valueType, defaultValue)});\n\\t\\tworld::add_schema<${structName}>(_obelisk_world, SCHEMA_ID, _obelisk_schema, admin_cap);\n\\t\\tevents::emit_set(SCHEMA_ID, SCHEMA_TYPE, none(), _obelisk_schema);\n\\t}`;\n}\n\nexport function renderSingleSetFunc(\n structName: string,\n values: Record<string, string> | string\n): string {\n return `\\tpublic(friend) fun set(_obelisk_world: &mut World, ${getStructAttrsWithType(\n values,\n \" \"\n )}) {\n\\t\\tlet _obelisk_schema = world::get_mut_schema<${structName}>(_obelisk_world, SCHEMA_ID);\n${\n typeof values === \"string\"\n ? `\\t\\t_obelisk_schema.value = value;`\n : Object.entries(values)\n .map(([key, _]) => `\\t\\t_obelisk_schema.${key} = ${key};`)\n .join(\"\\n\")\n}\n\\t}`;\n}\n\nexport function renderSingleSetAttrsFunc(\n structName: string,\n struct: MoveType | Record<string, MoveType>\n): string {\n return typeof struct === \"string\"\n ? \"\"\n : \"\\n\" +\n Object.entries(struct)\n .map(\n ([key, type]) => `\n\\tpublic(friend) fun set_${key}(_obelisk_world: &mut World, ${key}: ${type}) {\n\\t\\tlet _obelisk_schema = world::get_mut_schema<${structName}>(_obelisk_world, SCHEMA_ID);\n\\t\\t_obelisk_schema.${key} = ${key};\n\\t\\tevents::emit_set(SCHEMA_ID, SCHEMA_TYPE, none(), *_obelisk_schema)\n\\t}`\n )\n .join(\"\\n\");\n}\n\nexport function renderSingleGetAllFunc(\n structName: string,\n values: MoveType | Record<string, MoveType>\n): string {\n return `\\tpublic fun get(_obelisk_world: &World): ${getStructTypes(values)} {\n\\t\\tlet _obelisk_schema = world::get_schema<${structName}>(_obelisk_world, SCHEMA_ID);\n\\t\\t(\n${\n typeof values === \"string\"\n ? `\\t\\t\\t_obelisk_schema.value`\n : Object.entries(values)\n .map(([key, _]) => `\\t\\t\\t_obelisk_schema.${key},`)\n .join(\"\\n\")\n}\n\\t\\t)\n\\t}`;\n}\n\nexport function renderSingleGetAttrsFunc(\n structName: string,\n struct: MoveType | Record<string, MoveType>\n): string {\n return typeof struct === \"string\"\n ? \"\"\n : \"\\n\" +\n Object.entries(struct)\n .map(\n ([key, type]) => `\n\\tpublic fun get_${key}(_obelisk_world: &World): ${type} {\n\\t\\tlet _obelisk_schema = world::get_schema<${structName}>(_obelisk_world, SCHEMA_ID);\n\\t\\t_obelisk_schema.${key}\n\\t}`\n )\n .join(\"\\n\");\n}\n","import { ObeliskConfig } from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\nimport { existsSync } from \"fs\";\n\nexport function generateSystem2(config: ObeliskConfig, srcPrefix: string) {\n config.systems.map((systemName) => {\n let code = `module ${config.name}::${systemName} {\n\n}\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`,\n \"formatAndWriteMove\"\n );\n });\n}\n\nexport function generateNewSystem1(\n name: string,\n systemName: string,\n srcPrefix: string\n) {\n let code = `module ${name}::${systemName} {\n\n}\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${name}/sources/system/${systemName}.move`,\n \"formatAndWriteMove\"\n );\n}\n\nexport function generateSystem(config: ObeliskConfig, srcPrefix: string) {\n config.systems.map((systemName) => {\n if (\n !existsSync(\n `${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`\n )\n ) {\n let code = `module ${config.name}::${systemName} {\n\n}\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`,\n \"formatAndWriteMove\"\n );\n }\n });\n}\n","import { ObeliskConfig } from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\n\nexport function generateToml(config: ObeliskConfig, srcPrefix: string) {\n let code = `[package]\nname = \"${config.name}\"\nversion = \"0.0.1\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"testnet-v1.8.0\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x0\"\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/Move.toml`,\n \"formatAndWriteMove\"\n );\n}\n","import { ObeliskConfig } from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\n\nexport function generateEntityKey(config: ObeliskConfig, srcPrefix: string) {\n let code = `module ${config.name}::entity_key {\n use sui::hash::keccak256;\n use sui::address;\n use sui::object;\n use std::vector;\n\n public fun from_object<T: key + store>(object: &T): address {\n object::id_address(object)\n }\n\n public fun from_bytes(bytes: vector<u8>): address {\n address::from_bytes(keccak256(&bytes))\n }\n\n public fun from_u256(x: u256): address {\n address::from_u256(x)\n }\n\n public fun from_address_with_seed(addr: address, seed: vector<u8>): address {\n let data = address::to_bytes(addr);\n vector::append(&mut data, seed);\n from_bytes(data)\n }\n\n public fun from_address_with_u256(addr: address, x: u256): address {\n let data = address::to_bytes(addr);\n vector::append(&mut data, bcs::to_bytes<u256>(&x));\n from_bytes(data)\n }\n\n public fun from_object_with_seed<T: key + store>(object: &T, seed: vector<u8>): address {\n let data = address::to_bytes(object::id_address(object));\n vector::append(&mut data, seed);\n from_bytes(data)\n }\n\n public fun from_object_with_u256<T: key + store>(object: &T, x: u256): address {\n let data = address::to_bytes(object::id_address(object));\n vector::append(&mut data, bcs::to_bytes<u256>(&x));\n from_bytes(data)\n }\n}\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/entity_key.move`,\n \"formatAndWriteMove\"\n );\n}\n","import { ObeliskConfig } from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\nimport {\n getRegisterSchema,\n getUseSchema,\n capitalizeFirstLetter,\n} from \"./common\";\n\nexport function generateInit(config: ObeliskConfig, srcPrefix: string) {\n let code = `module ${config.name}::init {\n use std::ascii::string;\n use sui::transfer;\n use sui::tx_context::{Self, TxContext};\n use ${config.name}::world;\n${getUseSchema(config.name, config.schemas).join(\"\\n\")}\n\n fun init(ctx: &mut TxContext) {\n let (_obelisk_world, admin_cap) = world::create(string(b\"${capitalizeFirstLetter(\n config.name\n )}\"), string(b\"${capitalizeFirstLetter(config.description)}\"),ctx);\n\n // Add Schema\n${getRegisterSchema(config.schemas).join(\"\\n\")}\n\n transfer::public_share_object(_obelisk_world);\n transfer::public_transfer(admin_cap, tx_context::sender(ctx));\n }\n\n #[test_only]\n public fun init_world_for_testing(ctx: &mut TxContext){\n init(ctx)\n }\n}\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/codegen/init.move`,\n \"formatAndWriteMove\"\n );\n}\n","import { formatAndWriteMove } from \"../formatAndWrite\";\n\nexport function generateEps(\n projectName: string,\n srcPrefix: string,\n version?: number\n) {\n generateWorld(projectName, srcPrefix, version);\n generateEvents(projectName, srcPrefix);\n}\n\nfunction generateWorld(\n projectName: string,\n srcPrefix: string,\n version?: number\n) {\n if (version === undefined) {\n version = 1;\n }\n\n let code = `module ${projectName}::world {\n use std::ascii::{String, string};\n use std::vector;\n use sui::tx_context::TxContext;\n use sui::bag::{Self, Bag};\n use sui::object::{Self, UID, ID};\n \n const VERSION: u64 = ${version};\n\n /// Schema does not exist\n const ESchemaDoesNotExist: u64 = 0;\n /// Schema already exists\n const ESchemaAlreadyExists: u64 = 1;\n /// Not the right admin for this world\n const ENotAdmin: u64 = 2;\n /// Migration is not an upgrade\n const ENotUpgrade: u64 = 3;\n /// Calling functions from the wrong package version\n const EWrongVersion: u64 = 4;\n\n struct AdminCap has key, store {\n id: UID,\n }\n\n struct World has key, store {\n id: UID,\n /// Name of the world\n name: String,\n /// Description of the world\n description: String,\n /// Schemas of the world\n schemas: Bag,\n /// Schema names of the world\n schema_names: vector<String>,\n /// admin of the world\n admin: ID,\n /// Version of the world\n version: u64\n }\n\n public fun create(name: String, description: String, ctx: &mut TxContext): (World, AdminCap) {\n let admin_cap = AdminCap {\n id: object::new(ctx),\n };\n let _obelisk_world = World {\n id: object::new(ctx),\n name,\n description,\n schemas: bag::new(ctx),\n schema_names: vector::empty(),\n admin: object::id(&admin_cap),\n version: VERSION\n };\n (_obelisk_world, admin_cap)\n }\n \n public fun get_admin(_obelisk_world: &World): ID {\n _obelisk_world.admin\n }\n\n public fun info(_obelisk_world: &World): (String, String, u64) {\n (_obelisk_world.name, _obelisk_world.description, _obelisk_world.version)\n }\n \n public fun schema_names(_obelisk_world: &World): vector<String> {\n _obelisk_world.schema_names\n }\n\n public fun get_schema<T : store>(_obelisk_world: &World, _obelisk_schema_id: vector<u8>): &T {\n assert!(_obelisk_world.version == VERSION, EWrongVersion);\n assert!(bag::contains(&_obelisk_world.schemas, _obelisk_schema_id), ESchemaDoesNotExist);\n bag::borrow<vector<u8>, T>(&_obelisk_world.schemas, _obelisk_schema_id)\n }\n\n public fun get_mut_schema<T : store>(_obelisk_world: &mut World, _obelisk_schema_id: vector<u8>): &mut T {\n assert!(_obelisk_world.version == VERSION, EWrongVersion);\n assert!(bag::contains(&_obelisk_world.schemas, _obelisk_schema_id), ESchemaDoesNotExist);\n bag::borrow_mut<vector<u8>, T>(&mut _obelisk_world.schemas, _obelisk_schema_id)\n }\n\n public fun add_schema<T : store>(_obelisk_world: &mut World, _obelisk_schema_id: vector<u8>, schema: T, admin_cap: &AdminCap){\n assert!(_obelisk_world.admin == object::id(admin_cap), ENotAdmin);\n assert!(_obelisk_world.version == VERSION, EWrongVersion);\n assert!(!bag::contains(&_obelisk_world.schemas, _obelisk_schema_id), ESchemaAlreadyExists);\n vector::push_back(&mut _obelisk_world.schema_names, string(_obelisk_schema_id));\n bag::add<vector<u8>,T>(&mut _obelisk_world.schemas, _obelisk_schema_id, schema);\n }\n\n public fun contains(_obelisk_world: &mut World, _obelisk_schema_id: vector<u8>): bool {\n assert!(_obelisk_world.version == VERSION, EWrongVersion);\n bag::contains(&mut _obelisk_world.schemas, _obelisk_schema_id)\n }\n \n entry fun migrate(_obelisk_world: &mut World, admin_cap: &AdminCap) {\n assert!(_obelisk_world.admin == object::id(admin_cap), ENotAdmin);\n assert!(_obelisk_world.version < VERSION, ENotUpgrade);\n _obelisk_world.version = VERSION;\n }\n}\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${projectName}/sources/codegen/eps/world.move`,\n \"formatAndWriteMove\"\n );\n}\n\nfunction generateEvents(projectName: string, srcPrefix: string) {\n let code = `module ${projectName}::events {\n use sui::event;\n use std::option::Option;\n\n struct SchemaSetRecord<T: copy + drop> has copy, drop {\n _obelisk_schema_id: vector<u8>,\n _obelisk_schema_type: u8, // obelisk_schema_type_enum => { 0: common, 1: singleton, 2: ephemeral }\n _obelisk_entity_key: Option<address>,\n data: T\n }\n\n struct SchemaRemoveRecord has copy, drop {\n _obelisk_schema_id: vector<u8>,\n _obelisk_entity_key: address\n }\n\n public fun emit_set<T: copy + drop>(_obelisk_schema_id: vector<u8>, _obelisk_schema_type: u8, _obelisk_entity_key: Option<address>, data: T) {\n event::emit(SchemaSetRecord { _obelisk_schema_id, _obelisk_schema_type, _obelisk_entity_key, data})\n }\n\n public fun emit_remove(_obelisk_schema_id: vector<u8>, _obelisk_entity_key: address) {\n event::emit(SchemaRemoveRecord { _obelisk_schema_id, _obelisk_entity_key })\n }\n}\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${projectName}/sources/codegen/eps/events.move`,\n \"formatAndWriteMove\"\n );\n}\n","import {\n ObeliskConfig,\n BaseValueType,\n BaseType,\n RenderSchemaOptions,\n MoveType,\n} from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\nimport {\n getFriendSystem,\n renderKeyName,\n renderSetFunc,\n renderContainFunc,\n renderRemoveFunc,\n renderStruct,\n renderNewStructFunc,\n convertToCamelCase,\n renderSetAttrsFunc,\n renderRegisterFunc,\n renderGetAllFunc,\n renderGetAttrsFunc,\n getStructAttrsWithType,\n getStructAttrs,\n renderRegisterFuncWithInit,\n renderSingleSetFunc,\n renderSingleSetAttrsFunc,\n renderSingleGetAllFunc,\n renderSingleGetAttrsFunc,\n} from \"./common\";\n\nexport function getRenderSchemaOptions(config: ObeliskConfig) {\n const options: RenderSchemaOptions[] = [];\n for (const schemaName of Object.keys(config.schemas)) {\n const schemaData = config.schemas[schemaName];\n let valueType: MoveType | Record<string, MoveType>;\n let realType: BaseType | Record<string, BaseType>;\n let defaultValue: BaseValueType | Record<string, BaseValueType> | undefined;\n let ephemeral = false;\n let singleton = false;\n let needImportString = false;\n if (typeof schemaData === \"string\") {\n realType = schemaData;\n\n if (schemaData === \"string\") {\n valueType = \"String\";\n needImportString = true;\n } else if (schemaData === \"vector<string>\") {\n valueType = \"vector<String>\";\n needImportString = true;\n } else {\n valueType = schemaData;\n }\n } else {\n realType = schemaData.valueType;\n\n if (typeof schemaData.valueType === \"string\") {\n if (schemaData.valueType === \"string\") {\n valueType = \"String\";\n needImportString = true;\n } else if (schemaData.valueType === \"vector<string>\") {\n valueType = \"vector<String>\";\n needImportString = true;\n } else {\n valueType = schemaData.valueType;\n }\n } else {\n valueType = { ...schemaData.valueType };\n for (const key in valueType) {\n if (valueType.hasOwnProperty(key)) {\n if (valueType[key] === \"string\") {\n valueType[key] = \"String\";\n needImportString = true;\n } else if (valueType[key] === \"vector<string>\") {\n valueType[key] = \"vector<String>\";\n needImportString = true;\n\n // needImport = \"\\tuse std::ascii::{String, string};\";\n }\n }\n }\n }\n defaultValue = schemaData.defaultValue;\n ephemeral =\n schemaData.ephemeral !== undefined ? schemaData.ephemeral : false;\n singleton = schemaData.defaultValue !== undefined ? true : false;\n }\n\n options.push({\n projectName: config.name,\n systems: config.systems,\n schemaName: schemaName,\n structName: convertToCamelCase(schemaName),\n ephemeral,\n singleton,\n valueType,\n realType,\n // structAttrs: [renderKeyName(valueType)],\n // structTypes: [renderStruct(convertToCamelCase(schemaName), valueType)],\n defaultValue,\n needImportString,\n });\n }\n return options;\n}\n\nexport function generateSchema(config: ObeliskConfig, srcPrefix: string) {\n const options = getRenderSchemaOptions(config);\n for (const option of options) {\n let code: string;\n if (option.ephemeral) {\n code = renderEphemeralSchema(option);\n } else if (option.defaultValue !== undefined) {\n code = renderSingleSchema(option);\n } else {\n code = renderSchema(option);\n }\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${option.projectName}/sources/codegen/schemas/${option.schemaName}.move`,\n \"formatAndWriteMove\"\n );\n }\n}\n\nfunction renderEphemeralSchema(option: RenderSchemaOptions): string {\n return `module ${option.projectName}::${option.schemaName}_schema {\n use std::option::none;\n use ${option.projectName}::events;\n \n const SCHEMA_ID: vector<u8> = b\"${option.schemaName}\";\n const SCHEMA_TYPE: u8 = 2;\n \n${renderKeyName(option.valueType)}\n${renderStruct(option.structName, option.valueType, option.ephemeral)} \n\\tpublic fun emit_${option.schemaName}(${getStructAttrsWithType(\n option.valueType,\n \" \"\n )}) {\n\\t\\tevents::emit_set(SCHEMA_ID, SCHEMA_TYPE, none(), ${option.structName} { ${getStructAttrs(\n option.valueType,\n \" \"\n )} })\n\\t}\n}`;\n}\n\nfunction renderSingleSchema(option: RenderSchemaOptions): string {\n return `module ${option.projectName}::${option.schemaName}_schema {\n${\n option.needImportString ? \"\\tuse std::ascii::{String,string};\\n\\t\" : \"\\t\"\n}use std::option::none;\n use sui::tx_context::TxContext;\n use ${option.projectName}::events;\n use ${option.projectName}::world::{Self, World, AdminCap};\n // Systems\n${getFriendSystem(option.projectName, option.systems)}\n\n\\tconst SCHEMA_ID: vector<u8> = b\"${option.schemaName}\";\n\\tconst SCHEMA_TYPE: u8 = 1;\n\n${renderKeyName(option.valueType)}\n${renderStruct(option.structName, option.valueType)}\n${renderNewStructFunc(option.structName, option.valueType)}\n${renderRegisterFuncWithInit(\n option.structName,\n option.realType,\n option.defaultValue!\n)}\n\n${renderSingleSetFunc(\n option.structName,\n option.valueType\n)}${renderSingleSetAttrsFunc(option.structName, option.valueType)}\n\n${renderSingleGetAllFunc(\n option.structName,\n option.valueType\n)}${renderSingleGetAttrsFunc(option.structName, option.valueType)}\n}\n`;\n}\n\nfunction renderSchema(option: RenderSchemaOptions) {\n return `module ${option.projectName}::${option.schemaName}_schema {\n${\n option.needImportString ? \"\\tuse std::ascii::String;\\n\\t\" : \"\\t\"\n}use std::option::some;\n use sui::tx_context::TxContext;\n use sui::table::{Self, Table};\n use ${option.projectName}::events;\n use ${option.projectName}::world::{Self, World, AdminCap};\n\n // Systems\n${getFriendSystem(option.projectName, option.systems)}\n\n\\t/// Entity does not exist\n\\tconst EEntityDoesNotExist: u64 = 0;\n\n\\tconst SCHEMA_ID: vector<u8> = b\"${option.schemaName}\";\n\\tconst SCHEMA_TYPE: u8 = 0;\n\n${renderKeyName(option.valueType)}\n${renderStruct(option.structName, option.valueType)}\n${renderNewStructFunc(option.structName, option.valueType)}\n${renderRegisterFunc(option.structName)}\n\n${renderSetFunc(option.structName, option.valueType)}${renderSetAttrsFunc(\n option.structName,\n option.valueType\n )}\n${renderGetAllFunc(option.structName, option.valueType)}${renderGetAttrsFunc(\n option.structName,\n option.valueType\n )}\n${renderRemoveFunc(option.structName)}\n${renderContainFunc(option.structName)}\n}\n`;\n}\n","import { ObeliskConfig } from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\nimport { existsSync } from \"fs\";\n\nexport function generateScript(config: ObeliskConfig, srcPrefix: string) {\n if (\n !existsSync(\n `${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`\n )\n ) {\n let code = `module ${config.name}::deploy_hook {\n use ${config.name}::world::{World, AdminCap, get_admin};\n use sui::object;\n\n /// Not the right admin for this world\n const ENotAdmin: u64 = 0;\n\n public entry fun run(world: &mut World, admin_cap: &AdminCap) {\n assert!( get_admin(world) == object::id(admin_cap), ENotAdmin);\n \n // Logic that needs to be automated once the contract is deployed\n \n }\n\n #[test_only]\n public fun deploy_hook_for_testing(world: &mut World, admin_cap: &AdminCap){\n run(world, admin_cap)\n }\n}\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`,\n \"formatAndWriteMove\"\n );\n }\n}\n","import { findUp } from \"find-up\";\nimport path from \"path\";\nimport esbuild from \"esbuild\";\nimport { NotInsideProjectError } from \"./errors\";\nimport { rmSync } from \"fs\";\nimport { pathToFileURL } from \"url\";\nimport os from \"os\";\n\n// In order of preference files are checked\nconst configFiles = [\n \"obelisk.config.js\",\n \"obelisk.config.mjs\",\n \"obelisk.config.ts\",\n \"obelisk.config.mts\",\n];\nconst TEMP_CONFIG = \"obelisk.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()}`)).obeliskConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(\n configPath: string | undefined,\n toFileURL?: boolean\n) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === \"win32\"\n ? pathToFileURL(configPath).href\n : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","\nexport class NotInsideProjectError extends Error {\nname = \"NotInsideProjectError\";\nmessage = \"You are not inside a Obelisk project\";\n}"],"mappings":"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","names":["prettier","rustPlugin","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","mkdirSync","writeFileSync","dirname","formatAndWriteMove","output","fullOutputPath","logPrefix","mkdirSync","dirname","writeFileSync","formatAndWriteTypescript","formattedOutput","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","capitalizeFirstLetter","input","convertToCamelCase","str","match","getUseSchema","name","values","schema","key","value","getRegisterSchema","registers","getFriendSystem","getStructAttrs","prefixArgs","_","isAddress","getStructInitValue","keys","item","data","getStructTypes","type","getStructAttrsWithType","prefix","getStructAttrsQuery","renderKeyName","renderStruct","structName","isEphemeral","renderNewStructFunc","renderRegisterFunc","renderSetFunc","renderRemoveFunc","renderSetAttrsFunc","struct","renderGetAllFunc","renderGetAttrsFunc","renderContainFunc","renderRegisterFuncWithInit","valueType","defaultValue","renderSingleSetFunc","renderSingleSetAttrsFunc","renderSingleGetAllFunc","renderSingleGetAttrsFunc","existsSync","generateSystem","config","srcPrefix","systemName","existsSync","code","formatAndWriteMove","generateToml","config","srcPrefix","code","formatAndWriteMove","generateEntityKey","config","srcPrefix","code","formatAndWriteMove","generateInit","config","srcPrefix","code","getUseSchema","capitalizeFirstLetter","getRegisterSchema","formatAndWriteMove","generateEps","projectName","srcPrefix","version","generateWorld","generateEvents","code","formatAndWriteMove","getRenderSchemaOptions","config","options","schemaName","schemaData","valueType","realType","defaultValue","ephemeral","singleton","needImportString","key","convertToCamelCase","generateSchema","srcPrefix","option","code","renderEphemeralSchema","renderSingleSchema","renderSchema","formatAndWriteMove","renderKeyName","renderStruct","getStructAttrsWithType","getStructAttrs","getFriendSystem","renderNewStructFunc","renderRegisterFuncWithInit","renderSingleSetFunc","renderSingleSetAttrsFunc","renderSingleGetAllFunc","renderSingleGetAttrsFunc","renderRegisterFunc","renderSetFunc","renderSetAttrsFunc","renderGetAllFunc","renderGetAttrsFunc","renderRemoveFunc","renderContainFunc","existsSync","generateScript","config","srcPrefix","code","formatAndWriteMove","worldgen","config","srcPrefix","path","existsSync","deleteFolderRecursive","generateToml","generateEntityKey","generateSystem","generateScript","generateSchema","generateEps","generateInit","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError"]}
|