@0xobelisk/sui-common 0.5.9 → 0.5.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 +131 -376
- package/dist/index.js.map +1 -1
- package/package.json +11 -7
- package/src/codegen/debug.ts +10 -0
- package/src/codegen/types/index.ts +23 -24
- package/src/codegen/utils/format.ts +4 -7
- package/src/codegen/utils/formatAndWrite.ts +31 -14
- package/src/codegen/utils/index.ts +0 -1
- package/src/codegen/utils/renderMove/common.ts +9 -422
- package/src/codegen/utils/renderMove/generateDappKey.ts +19 -0
- package/src/codegen/utils/renderMove/generateSchema.ts +184 -197
- package/src/codegen/utils/renderMove/generateScript.ts +43 -12
- package/src/codegen/utils/renderMove/generateSystem.ts +8 -38
- package/src/codegen/utils/renderMove/generateToml.ts +4 -5
- package/src/codegen/utils/renderMove/worldgen.ts +15 -17
- package/src/debug.ts +10 -0
- package/src/codegen/utils/renderMove/generateAppKey.ts +0 -24
- package/src/codegen/utils/renderMove/generateEntityKey.ts +0 -52
- package/src/codegen/utils/renderMove/generateEps.ts +0 -159
- package/src/codegen/utils/renderMove/generateInit.ts +0 -45
package/dist/index.js.map
CHANGED
|
@@ -1 +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/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateAppKey.ts","../src/codegen/utils/renderMove/generateEps.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 {generateDeployHook, generateMigrate} from \"./generateScript\";\nimport {generateAppKey} from \"./generateAppKey\";\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 generateDeployHook(config, path);\n generateMigrate(config, path);\n\n // generate codegen\n generateSchema(config, path);\n generateInit(config, path);\n generateAppKey(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(\n `\\t\\t${key}_schema::register(&mut _obelisk_world, &admin_cap, ctx);`\n );\n }\n });\n return registers;\n}\n\n/**\n *\n * @param name\n * @param values\n * @return [ package name::name_system, package name::info_system ]\n */\nexport function getpackageSystem(name: string, values: string[]): string {\n return (\n values.map((key) => `\\tpackage ${name}::${key};`).join(\"\\n\") +\n `\\n\\tpackage ${name}::deploy_hook;`\n );\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 } else {\n if (keys === \"vector<string>\") {\n return 'vector[string(b\"\")]';\n }\n return \"vector[]\";\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 } else {\n if (typeof keys !== \"string\") {\n if (keys[key] === \"vector<string>\") {\n return 'vector[string(b\"\")]';\n }\n return \"vector[]\";\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 `\\tpublic struct ${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\\tschema::add<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(package) fun set(_obelisk_world: &mut World, _obelisk_entity_key: address, ${getStructAttrsWithType(\n values,\n \" \"\n )}) {\n\\t\\tlet _obelisk_schema = schema::get_mut<Table<address,${structName}>, AppKey>(app_key::new(), _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(package) fun remove(_obelisk_world: &mut World, _obelisk_entity_key: address) {\n\\t\\tlet _obelisk_schema = schema::get_mut<Table<address,${structName}>, AppKey>(app_key::new(),_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(package) fun set_${key}(_obelisk_world: &mut World, _obelisk_entity_key: address, ${key}: ${type}) {\n\\t\\tlet _obelisk_schema = schema::get_mut<Table<address,${structName}>, AppKey>(app_key::new(),_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 = schema::get<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 = schema::get<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 = schema::get<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\\tschema::add<${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(package) fun set(_obelisk_world: &mut World, ${getStructAttrsWithType(\n values,\n \" \"\n )}) {\n\\t\\tlet _obelisk_schema = schema::get_mut<${structName}, AppKey>(app_key::new(),_obelisk_world, SCHEMA_ID);\n${\n typeof values === \"string\"\n ? `\\t\\t_obelisk_schema.value = value;\n events::emit_set(SCHEMA_ID, SCHEMA_TYPE, none(), _obelisk_schema.value);`\n : `\\t\\tlet _obelisk_data = new(${getStructAttrs(values, \" \")});\n *_obelisk_schema = _obelisk_data;\n events::emit_set(SCHEMA_ID, SCHEMA_TYPE, none(), _obelisk_data);`\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(package) fun set_${key}(_obelisk_world: &mut World, ${key}: ${type}) {\n\\t\\tlet _obelisk_schema = schema::get_mut<${structName}, AppKey>(app_key::new(),_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 = schema::get<${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 = schema::get<${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\tlet code = `[package]\nname = \"${config.name}\"\nversion = \"0.0.1\"\nedition = \"2024.beta\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.31.1\" }\n# Obelisk = { git = \"https://github.com/0xobelisk/obelisk-engine.git\", subdir = \"packages/obelisk-framework\", rev = \"mainnet-v1.31.1\" }\nObelisk = { local = \"/Volumes/project/obelisk-engine/packages/obelisk-framework\" }\n\n[addresses]\nsui = \"0x2\"\nobelisk = \"0x6c93abd6e076235f51c6dd95b4adf9b0d4f5b6f6766c6a7b6653101a78a04d8c\"\n${config.name} = \"0x0\"\n`;\n\tformatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/Move.toml`,\n\t\t'formatAndWriteMove'\n\t);\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::bcs;\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 mut 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 mut 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 mut 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 mut 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 = `#[allow(lint(share_owned))] \n\nmodule ${config.name}::init {\n use std::ascii::string;\n use ${config.name}::app_key::AppKey;\n use obelisk::access_control;\n use obelisk::world;\n${getUseSchema(config.name, config.schemas).join(\"\\n\")}\n\n fun init(ctx: &mut TxContext) {\n let (mut _obelisk_world, admin_cap) = world::create(string(b\"${capitalizeFirstLetter(\n config.name\n )}\"), string(b\"${capitalizeFirstLetter(config.description)}\"),ctx);\n \n // Authorize this application to access protected features of the World.\n access_control::authorize_app<AppKey>(&admin_cap, &mut _obelisk_world);\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 {\n ObeliskConfig,\n BaseValueType,\n BaseType,\n RenderSchemaOptions,\n MoveType,\n} from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\nimport {\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\tuse std::option::none;\n\tuse obelisk::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 ${option.projectName}::app_key;\n use ${option.projectName}::app_key::AppKey;\n use obelisk::schema;\n use obelisk::events;\n use obelisk::world::{World, AdminCap};\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 ${option.projectName}::app_key;\n use ${option.projectName}::app_key::AppKey;\n use sui::table::{Self, Table};\n use obelisk::schema;\n use obelisk::events;\n use obelisk::world::{World, AdminCap};\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 generateDeployHook(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 obelisk::world::{World, AdminCap};\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!(world.admin() == 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\nexport function generateMigrate(config: ObeliskConfig, srcPrefix: string) {\n if (\n !existsSync(\n `${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`\n )\n ) {\n let code = `module ${config.name}::migrate {\n use obelisk::world::{World, AdminCap};\n\n /// Not the right admin for this world\n const ENotAdmin: u64 = 0;\n const EWrongVersion: u64 = 1;\n const ENotUpgrade: u64 = 2;\n const VERSION: u64 = 1;\n\n public entry fun run(world: &mut World, admin_cap: &AdminCap) {\n assert!(world.admin() == object::id(admin_cap), ENotAdmin);\n assert!(world.version() < VERSION, ENotUpgrade);\n *obelisk::world::mut_version(world, admin_cap) = VERSION;\n }\n\n public fun assert_version(world: &World){\n assert!(world.version() == VERSION, EWrongVersion);\n }\n}\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`,\n \"formatAndWriteMove\"\n );\n }\n}\n\n","import { ObeliskConfig } from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\nimport {\n getRegisterSchema,\n getUseSchema,\n capitalizeFirstLetter,\n} from \"./common\";\n\nexport function generateAppKey(config: ObeliskConfig, srcPrefix: string) {\n let code = `module ${config.name}::app_key {\n /// Authorization token for the app.\n public struct AppKey has drop {}\n\n public(package) fun new(): AppKey {\n AppKey { }\n }\n}\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/codegen/app_key.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 { 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":"AACA,UAAYA,MAAc,WAC1B,UAAYC,OAAgB,uBAE5B,eAAsBC,GACpBC,EACAC,EACiB,CACjB,IAAIC,EACAD,IACFC,EAAS,MAAe,gBAAcD,CAAkB,GAE1D,GAAI,CACF,OAAgB,SAAOD,EAAS,CAC9B,QAAS,CAACF,EAAU,EAGpB,WAAY,IACZ,KAAM,GACN,SAAU,EACV,QAAS,GACT,eAAgB,GAEhB,GAAGI,CACL,CAAC,CACH,OAASC,EAAP,CACA,IAAIC,EACJ,OAAID,aAAiB,MACnBC,EAAUD,EAAM,QAEhBC,EAAUD,EAEZ,QAAQ,IAAI,mCAAmCC,GAAS,EACjDJ,CACT,CACF,CAEA,eAAsBK,EAAiBL,EAAkC,CACvE,OAAgB,SAAOA,EAAS,CAC9B,OAAQ,YACV,CAAC,CACH,CCzCA,OAAS,aAAAM,EAAW,iBAAAC,MAAqB,KACzC,OAAS,WAAAC,MAAe,OAGxB,eAAsBC,EACpBC,EACAC,EACAC,EACe,CAGfC,EAAUC,EAAQH,CAAc,EAAG,CAAE,UAAW,EAAK,CAAC,EAEtDI,EAAcJ,EAAgBD,CAAM,EAChCE,IAAc,QAChB,QAAQ,IAAI,GAAGA,MAAcD,GAAgB,CAEjD,CAEA,eAAsBK,GACpBN,EACAC,EACAC,EACe,CACf,IAAMK,EAAkB,MAAMC,EAAiBR,CAAM,EAErDG,EAAUC,EAAQH,CAAc,EAAG,CAAE,UAAW,EAAK,CAAC,EAEtDI,EAAcJ,EAAgBM,CAAe,EAC7C,QAAQ,IAAI,GAAGL,MAAcD,GAAgB,CAC/C,CCzBO,SAASQ,GAAUC,EAAsB,CAC9C,OAAOA,EAAK,QAAQ,MAAO,GAAG,CAChC,CCNA,OAAoB,cAAAC,OAAkB,KCAtC,OAAOC,MAAQ,KAER,SAASC,EAAsBC,EAAc,CAC9CF,EAAG,WAAWE,CAAI,IACpBF,EAAG,YAAYE,CAAI,EAAE,QAASC,GAAS,CACrC,IAAMC,EAAU,GAAGF,KAAQC,IACvBH,EAAG,UAAUI,CAAO,EAAE,YAAY,EACpCH,EAAsBG,CAAO,EAE7BJ,EAAG,WAAWI,CAAO,CAEzB,CAAC,EACDJ,EAAG,UAAUE,CAAI,EAErB,CAEO,SAASG,EAAsBC,EAAuB,CAC3D,OAAOA,EAAM,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAM,MAAM,CAAC,CACtD,CAMO,SAASC,EAAmBC,EAAqB,CACtD,OAAAA,EAAMA,EAAI,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,EAClCA,EAAI,QAAQ,SAAWC,GAAUA,EAAM,CAAC,EAAE,YAAY,CAAC,EACpD,MAClB,CAQO,SAASC,EACdC,EACAC,EACU,CACV,IAAIC,EAAmB,CAAC,EACxB,cAAO,QAAQD,CAAM,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CAC3C,OAAOA,GAAU,UAAYA,EAAM,WAErCF,EAAO,KAAK,QAASF,MAASG,WAAa,CAE/C,CAAC,EACMD,CACT,CAMO,SAASG,EACdJ,EACU,CACV,IAAIK,EAAsB,CAAC,EAC3B,cAAO,QAAQL,CAAM,EAAE,QAAQ,CAAC,CAACE,EAAKC,CAAK,IAAM,CAC3C,OAAOA,GAAU,UAAYA,EAAM,WAErCE,EAAU,KACR,KAAOH,2DACT,CAEJ,CAAC,EACMG,CACT,CAqBO,SAASC,EACdC,EACAC,EACU,CACV,OAAO,OAAOD,GAAW,SACrB,CAAC,GAAGC,QAAiB,EACrB,OAAO,QAAQD,CAAM,EAAE,IAAI,CAAC,CAACE,EAAKC,CAAC,IAAM,GAAGF,IAAaC,GAAK,CACpE,CAEA,SAASE,EAAUC,EAAsB,CAEvC,MADc,mBACD,KAAKA,CAAG,CACvB,CAEO,SAASC,GACdC,EACAP,EACA,CACA,GACE,OAAOA,GAAW,UAClB,OAAOA,GAAW,WAClB,OAAOA,GAAW,SAElB,OAAIO,IAAS,SACJ,CAAC,YAAYP,KAAU,EAE5B,OAAOA,GAAW,UAChBI,EAAUJ,CAAM,EACX,CAAC,IAAIA,GAAQ,EAGjB,CAAC,GAAGA,GAAQ,EACd,GAAI,MAAM,QAAQA,CAAM,EAE7B,GAAIA,EAAO,OAAS,EAAG,CACrB,GACE,OAAOA,EAAO,CAAC,GAAM,UACrB,OAAOA,EAAO,CAAC,GAAM,WACrB,OAAOA,EAAO,CAAC,GAAM,SAErB,OAAIO,IAAS,iBACJ,CAAC,UAAUP,EAAO,IAAKQ,GAAS,YAAYA,KAAQ,IAAI,EAG7D,OAAOR,EAAO,CAAC,GAAM,UACnBI,EAAUJ,EAAO,CAAC,CAAC,EACd,CAAC,UAAUA,EAAO,IAAKQ,GAAS,IAAIA,GAAM,IAAI,EAGlD,CAAC,UAAUR,EAAO,IAAKQ,GAAS,GAAGA,GAAM,IAAI,EAC/C,GAAI,OAAOR,GAAW,SAO3B,MAAO,CANG,UAAUA,EAAO,IAAKQ,GACvB,UAAUA,EAAK,IAAKC,GAClB,GAAGA,GACX,IACF,IAEU,MAGb,QAAIF,IAAS,iBACJ,sBAEF,mBAEA,OAAOP,GAAW,SAmE3B,OAjEU,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACE,EAAKQ,CAAK,IAAM,CACrD,GACE,OAAOA,GAAU,UACjB,OAAOA,GAAU,WACjB,OAAOA,GAAU,SACjB,CACA,GAAI,OAAOH,GAAS,UAClB,GAAIA,IAAS,SACX,MAAO,YAAYG,cAGjBH,EAAKL,CAAG,IAAM,SAChB,MAAO,YAAYQ,MAIvB,OAAI,OAAOA,GAAU,UACfN,EAAUM,CAAK,EACV,IAAIA,IAGR,GAAGA,YACD,MAAM,QAAQA,CAAK,GAE5B,GAAIA,EAAM,OAAS,GACjB,GACE,OAAOA,EAAM,CAAC,GAAM,UACpB,OAAOA,EAAM,CAAC,GAAM,WACpB,OAAOA,EAAM,CAAC,GAAM,SACpB,CACA,GAAI,OAAOH,GAAS,UAClB,GAAIA,IAAS,iBACX,MAAO,UAAUG,EAAM,IAAKF,GAAS,YAAYA,KAAQ,aAGvDD,EAAKL,CAAG,IAAM,iBAChB,MAAO,UAAUQ,EAAM,IAAKF,GAAS,YAAYA,KAAQ,KAI7D,OAAI,OAAOE,EAAM,CAAC,GAAM,UAClBN,EAAUM,EAAM,CAAC,CAAC,EACb,UAAUA,EAAM,IAAKF,GAAS,IAAIA,GAAM,KAG5C,UAAUE,EAAM,IAAKF,GAAS,GAAGA,GAAM,aACrC,OAAOE,GAAU,SAO1B,MANU,UAAUA,EAAM,IAAKF,GACtB,UAAUA,EAAK,IAAKC,GAClB,GAAGA,GACX,IACF,aAKC,OAAOF,GAAS,SAClB,OAAIA,EAAKL,CAAG,IAAM,iBACT,sBAEF,WAIf,CAAC,EAIH,MAAO,CAAC,CACV,CAQO,SAASS,EACdX,EACQ,CACR,OAAO,OAAOA,GAAW,SACrBA,EACA,IAAI,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACG,EAAGS,CAAI,IAAM,GAAGA,GAAM,IAC7D,CAOO,SAASC,EACdb,EACAc,EACU,CACV,OAAO,OAAOd,GAAW,SACrB,CAAC,GAAGc,WAAgBd,GAAQ,EAC5B,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACE,EAAKU,CAAI,IAAM,GAAGE,IAASZ,MAAQU,GAAM,CAC5E,CAOO,SAASG,GACdf,EACAC,EACU,CACV,OAAO,OAAOD,GAAW,SACrB,CAAC,GAAGC,sBAA+B,EACnC,OAAO,QAAQD,CAAM,EAAE,IACrB,CAAC,CAACE,EAAKC,CAAC,IAAM,GAAGF,kBAA2BC,GAC9C,CACN,CAEO,SAASc,EAAchB,EAAiD,CAC7E,MAAO,IAAKD,EAAeC,EAAQ,KAAK,EAAE,KAAK;AAAA,EAAM,GACvD,CAEO,SAASiB,EACdC,EACAlB,EACAmB,EAAuB,GACf,CACR,MAAO,kBAAmBD,oBACxBC,EAAc,GAAK;AAAA,EAErBN,EAAuBb,EAAQ,IAAM,EAAE,KAAK;AAAA,CAAK;AAAA;AAAA,CAEnD,CAEO,SAASoB,EACdF,EACAlB,EACQ,CACR,MAAO,mBAAoBa,EAAuBb,EAAQ,EAAE,EAAE,KAC5D,IACF,OAAOkB;AAAA,IACHA;AAAA,EACJnB,EAAeC,EAAQ,KAAQ,EAAE,KAAK;AAAA,CAAM;AAAA;AAAA;AAAA,CAG9C,CAEO,SAASqB,EAAmBH,EAA4B,CAC7D,MAAO;AAAA,8BACuBA,sDAA+DA;AAAA,GAE/F,CAEO,SAASI,EACdJ,EACAlB,EACQ,CACR,MAAO,sFAAuFa,EAC5Fb,EACA,GACF;AAAA,wDACwDkB;AAAA,4BAC5BnB,EAAeC,EAAQ,GAAG;AAAA,gCACtBkB;AAAA,iCACEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOpC,CAEO,SAASK,EAAiBL,EAA4B,CAC3D,MAAO;AAAA,wDACiDA;AAAA,qCACnBA;AAAA;AAAA;AAAA;AAAA,CAKvC,CAEO,SAASM,EACdN,EACAO,EACQ,CACR,OAAO,OAAOA,GAAW,SACrB,GACA;AAAA,EACE,OAAO,QAAQA,CAAM,EAClB,IACC,CAAC,CAACvB,EAAKU,CAAI,IACT,4BAA6BV,+DAAiEA,MAAQU;AAAA,wDAC1DM;AAAA,qCACnBA;AAAA,mDACcA;AAAA,kBACjChB,OAASA;AAAA;AAAA;AAAA,CAInB,EACC,KAAK;AAAA,CAAI,CACpB,CAEO,SAASwB,EACdR,EACAO,EACQ,CACR,MAAO,0EAA2Ed,EAChFc,CACF;AAAA,oDACoDP;AAAA,qCACfA;AAAA,+CACUA;AAAA;AAAA,EAE/CH,GAAoBU,EAAQ,KAAQ,EAAE,KAAK;AAAA,CAAK;AAAA;AAAA;AAAA,CAIlD,CAEO,SAASE,EACdT,EACAO,EACQ,CACR,OAAO,OAAOA,GAAW,SACrB,GACA;AAAA,EACE,OAAO,QAAQA,CAAM,EAClB,IACC,CAAC,CACCvB,EACAU,CACF,IAAM,mBAAoBV,4DAA8DU;AAAA,oDAC9CM;AAAA,qCACfA;AAAA,+CACUA;AAAA,kBAC7BhB;AAAA;AAAA,CAGV,EACC,KAAK;AAAA,CAAI,CACpB,CAEO,SAAS0B,EAAkBV,EAA4B,CAC5D,MAAO;AAAA,oDAC6CA;AAAA,6BACvBA;AAAA,GAE/B,CAEO,SAASW,EACdX,EACAY,EACAC,EACQ,CACR,MAAO;AAAA,8BACuBzB,GAAmBwB,EAAWC,CAAY;AAAA,gBACxDb;AAAA;AAAA,GAGlB,CAEO,SAASc,EACdd,EACAlB,EACQ,CACR,MAAO,wDAAyDa,EAC9Db,EACA,GACF;AAAA,0CAC0CkB;AAAA,EAE1C,OAAOlB,GAAW,SACd;AAAA,kFAEA,6BAA+BD,EAAeC,EAAQ,GAAG;AAAA;AAAA;AAAA,GAK/D,CAEO,SAASiC,EACdf,EACAO,EACQ,CACR,OAAO,OAAOA,GAAW,SACrB,GACA;AAAA,EACE,OAAO,QAAQA,CAAM,EAClB,IACC,CAAC,CAACvB,EAAKU,CAAI,IAAM;AAAA,2BACDV,iCAAmCA,MAAQU;AAAA,0CAC3BM;AAAA,oBACtBhB,OAASA;AAAA;AAAA,GAGrB,EACC,KAAK;AAAA,CAAI,CACpB,CAEO,SAASgC,EACdhB,EACAlB,EACQ,CACR,MAAO,4CAA6CW,EAAeX,CAAM;AAAA,sCACnCkB;AAAA;AAAA,EAGtC,OAAOlB,GAAW,SACd,2BACA,OAAO,QAAQA,CAAM,EAClB,IAAI,CAAC,CAACE,EAAKC,CAAC,IAAM,sBAAyBD,IAAM,EACjD,KAAK;AAAA,CAAI;AAAA;AAAA,GAIlB,CAEO,SAASiC,EACdjB,EACAO,EACQ,CACR,OAAO,OAAOA,GAAW,SACrB,GACA;AAAA,EACE,OAAO,QAAQA,CAAM,EAClB,IACC,CAAC,CAACvB,EAAKU,CAAI,IAAM;AAAA,kBACVV,8BAAgCU;AAAA,sCACXM;AAAA,oBAClBhB;AAAA,GAEZ,EACC,KAAK;AAAA,CAAI,CACpB,CCxeA,OAAS,cAAAkC,OAAkB,KAgCpB,SAASC,EAAeC,EAAuBC,EAAmB,CACvED,EAAO,QAAQ,IAAKE,GAAe,CACjC,GACE,CAACC,GACC,GAAGF,eAAuBD,EAAO,uBAAuBE,QAC1D,EACA,CACA,IAAIE,EAAO,UAAUJ,EAAO,SAASE;AAAA;AAAA;AAAA,EAIrCG,EACED,EACA,GAAGH,eAAuBD,EAAO,uBAAuBE,SACxD,oBACF,EAEJ,CAAC,CACH,CCjDO,SAASI,EAAaC,EAAuBC,EAAmB,CACtE,IAAIC,EAAO;AAAA,UACFF,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYfA,EAAO;AAAA,EAERG,EACCD,EACA,GAAGD,eAAuBD,EAAO,iBACjC,oBACD,CACD,CCrBO,SAASI,EAAkBC,EAAuBC,EAAmB,CAC1E,IAAIC,EAAO,UAAUF,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0C5BG,EACED,EACA,GAAGD,eAAuBD,EAAO,+BACjC,oBACF,CACF,CC3CO,SAASI,EAAaC,EAAuBC,EAAmB,CACrE,IAAIC,EAAO;AAAA;AAAA,SAEJF,EAAO;AAAA;AAAA,UAENA,EAAO;AAAA;AAAA;AAAA,EAGfG,EAAaH,EAAO,KAAMA,EAAO,OAAO,EAAE,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,uEAGkBI,EAC7DJ,EAAO,IACT,iBAAiBI,EAAsBJ,EAAO,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/DK,EAAkBL,EAAO,OAAO,EAAE,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY3CM,EACEJ,EACA,GAAGD,eAAuBD,EAAO,iCACjC,oBACF,CACF,CCfO,SAASO,GAAuBC,EAAuB,CAC5D,IAAMC,EAAiC,CAAC,EACxC,QAAWC,KAAc,OAAO,KAAKF,EAAO,OAAO,EAAG,CACpD,IAAMG,EAAaH,EAAO,QAAQE,CAAU,EACxCE,EACAC,EACAC,EACAC,EAAY,GACZC,EAAY,GACZC,EAAmB,GACvB,GAAI,OAAON,GAAe,SACxBE,EAAWF,EAEPA,IAAe,UACjBC,EAAY,SACZK,EAAmB,IACVN,IAAe,kBACxBC,EAAY,iBACZK,EAAmB,IAEnBL,EAAYD,MAET,CAGL,GAFAE,EAAWF,EAAW,UAElB,OAAOA,EAAW,WAAc,SAC9BA,EAAW,YAAc,UAC3BC,EAAY,SACZK,EAAmB,IACVN,EAAW,YAAc,kBAClCC,EAAY,iBACZK,EAAmB,IAEnBL,EAAYD,EAAW,cAEpB,CACLC,EAAY,CAAE,GAAGD,EAAW,SAAU,EACtC,QAAWO,KAAON,EACZA,EAAU,eAAeM,CAAG,IAC1BN,EAAUM,CAAG,IAAM,UACrBN,EAAUM,CAAG,EAAI,SACjBD,EAAmB,IACVL,EAAUM,CAAG,IAAM,mBAC5BN,EAAUM,CAAG,EAAI,iBACjBD,EAAmB,KAO3BH,EAAeH,EAAW,aAC1BI,EACEJ,EAAW,YAAc,OAAYA,EAAW,UAAY,GAC9DK,EAAYL,EAAW,eAAiB,OAG1CF,EAAQ,KAAK,CACX,YAAaD,EAAO,KACpB,QAASA,EAAO,QAChB,WAAYE,EACZ,WAAYS,EAAmBT,CAAU,EACzC,UAAAK,EACA,UAAAC,EACA,UAAAJ,EACA,SAAAC,EAGA,aAAAC,EACA,iBAAAG,CACF,CAAC,EAEH,OAAOR,CACT,CAEO,SAASW,EAAeZ,EAAuBa,EAAmB,CACvE,IAAMZ,EAAUF,GAAuBC,CAAM,EAC7C,QAAWc,KAAUb,EAAS,CAC5B,IAAIc,EACAD,EAAO,UACTC,EAAOC,GAAsBF,CAAM,EAC1BA,EAAO,eAAiB,OACjCC,EAAOE,GAAmBH,CAAM,EAEhCC,EAAOG,GAAaJ,CAAM,EAE5BK,EACEJ,EACA,GAAGF,eAAuBC,EAAO,uCAAuCA,EAAO,kBAC/E,oBACF,EAEJ,CAEA,SAASE,GAAsBF,EAAqC,CAClE,MAAO,UAAUA,EAAO,gBAAgBA,EAAO;AAAA;AAAA;AAAA;AAAA,sCAIXA,EAAO;AAAA;AAAA;AAAA,EAG3CM,EAAcN,EAAO,SAAS;AAAA,EAC9BO,EAAaP,EAAO,WAAYA,EAAO,UAAWA,EAAO,SAAS;AAAA,mBAChDA,EAAO,cAAcQ,EACrCR,EAAO,UACP,GACF;AAAA,qDACqDA,EAAO,gBAAgBS,EAC1ET,EAAO,UACP,GACF;AAAA;AAAA,EAGF,CAEA,SAASG,GAAmBH,EAAqC,CAC/D,MAAO,UAAUA,EAAO,gBAAgBA,EAAO;AAAA,EAE/CA,EAAO,iBAAmB;AAAA,GAA2C;AAAA,UAE7DA,EAAO;AAAA,UACPA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,mCAKmBA,EAAO;AAAA;AAAA;AAAA,EAGzCM,EAAcN,EAAO,SAAS;AAAA,EAC9BO,EAAaP,EAAO,WAAYA,EAAO,SAAS;AAAA,EAChDU,EAAoBV,EAAO,WAAYA,EAAO,SAAS;AAAA,EACvDW,EACAX,EAAO,WACPA,EAAO,SACPA,EAAO,YACT;AAAA;AAAA,EAEEY,EACAZ,EAAO,WACPA,EAAO,SACT,IAAIa,EAAyBb,EAAO,WAAYA,EAAO,SAAS;AAAA;AAAA,EAE9Dc,EACAd,EAAO,WACPA,EAAO,SACT,IAAIe,EAAyBf,EAAO,WAAYA,EAAO,SAAS;AAAA;AAAA,CAGhE,CAEA,SAASI,GAAaJ,EAA6B,CACjD,MAAO,UAAUA,EAAO,gBAAgBA,EAAO;AAAA,EAE/CA,EAAO,iBAAmB;AAAA,GAAkC;AAAA,UAEpDA,EAAO;AAAA,UACPA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCASmBA,EAAO;AAAA;AAAA;AAAA,EAGzCM,EAAcN,EAAO,SAAS;AAAA,EAC9BO,EAAaP,EAAO,WAAYA,EAAO,SAAS;AAAA,EAChDU,EAAoBV,EAAO,WAAYA,EAAO,SAAS;AAAA,EACvDgB,EAAmBhB,EAAO,UAAU;AAAA;AAAA,EAEpCiB,EAAcjB,EAAO,WAAYA,EAAO,SAAS,IAAIkB,EACnDlB,EAAO,WACPA,EAAO,SACT;AAAA,EACAmB,EAAiBnB,EAAO,WAAYA,EAAO,SAAS,IAAIoB,EACtDpB,EAAO,WACPA,EAAO,SACT;AAAA,EACAqB,EAAiBrB,EAAO,UAAU;AAAA,EAClCsB,EAAkBtB,EAAO,UAAU;AAAA;AAAA,CAGrC,CCtNA,OAAS,cAAAuB,MAAkB,KAEpB,SAASC,EAAmBC,EAAuBC,EAAmB,CACzE,GACI,CAACH,EACG,GAAGG,eAAuBD,EAAO,sCACrC,EACF,CACE,IAAIE,EAAO,UAAUF,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmB5BG,EACID,EACA,GAAGD,eAAuBD,EAAO,uCACjC,oBACJ,EAER,CAEO,SAASI,EAAgBJ,EAAuBC,EAAmB,CACtE,GACI,CAACH,EACG,GAAGG,eAAuBD,EAAO,kCACrC,EACF,CACE,IAAIE,EAAO,UAAUF,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoB5BG,EACID,EACA,GAAGD,eAAuBD,EAAO,mCACjC,oBACJ,EAER,CC7DO,SAASK,EAAeC,EAAuBC,EAAmB,CACvE,IAAIC,EAAO,UAAUF,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5BG,EACED,EACA,GAAGD,eAAuBD,EAAO,oCACjC,oBACF,CACF,CRXO,SAASI,GAASC,EAAuBC,EAAoB,CAClE,IAAIC,EAAO,GACPD,IAAc,OAChBC,EAAO,QAAQ,IAAI,EAEnBA,EAAOD,EAGLE,GAAW,GAAGD,eAAkBF,EAAO,MAAM,EAC/CI,EAAsB,GAAGF,eAAkBF,EAAO,sBAAsB,GAExEK,EAAaL,EAAQE,CAAI,EACzBI,EAAkBN,EAAQE,CAAI,GAGhCK,EAAeP,EAAQE,CAAI,EAC3BM,EAAmBR,EAAQE,CAAI,EAC/BO,EAAgBT,EAAQE,CAAI,EAG5BQ,EAAeV,EAAQE,CAAI,EAC3BS,EAAaX,EAAQE,CAAI,EACzBU,EAAeZ,EAAQE,CAAI,CAC7B,CSjCO,SAASW,GACdC,EACAC,EACAC,EACA,CACAC,GAAcH,EAAaC,EAAWC,CAAO,EAC7CE,GAAeJ,EAAaC,CAAS,CACvC,CAEA,SAASE,GACPH,EACAC,EACAC,EACA,CACIA,IAAY,SACdA,EAAU,GAGZ,IAAIG,EAAO,UAAUL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAOIE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6FzBI,EACED,EACA,GAAGJ,eAAuBD,mCAC1B,oBACF,CACF,CAEA,SAASI,GAAeJ,EAAqBC,EAAmB,CAC9D,IAAII,EAAO,UAAUL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBrBM,EACED,EACA,GAAGJ,eAAuBD,oCAC1B,oBACF,CACF,CC9JA,OAAS,UAAAO,OAAc,UACvB,OAAOC,MAAU,OACjB,OAAOC,OAAa,UCDb,IAAMC,EAAN,cAAoC,KAAM,CACjD,KAAO,wBACP,QAAU,sCACV,EDAA,OAAS,UAAAC,OAAc,KACvB,OAAS,iBAAAC,OAAqB,MAC9B,OAAOC,OAAQ,KAGf,IAAMC,GAAc,CAClB,oBACA,qBACA,oBACA,oBACF,EACMC,EAAc,6BAEpB,eAAsBC,GAAWC,EAAuC,CACtEA,EAAa,MAAMC,GAAkBD,CAAU,EAC/C,GAAI,CACF,aAAME,GAAQ,MAAM,CAClB,YAAa,CAACF,CAAU,EACxB,OAAQ,MACR,QAASF,EAET,SAAU,OAEV,OAAQ,GAER,SAAU,UACZ,CAAC,EACDE,EAAa,MAAMC,GAAkBH,EAAa,EAAI,GAI9C,MAAM,OAAOE,EAAa,WAAW,KAAK,IAAI,MAAM,aAC9D,QAAE,CACAN,GAAOI,EAAa,CAAE,MAAO,EAAK,CAAC,CACrC,CACF,CAEA,eAAsBG,GACpBD,EACAG,EACA,CACA,OAAIH,IAAe,OACjBA,EAAa,MAAMI,GAAkB,EAEhCC,EAAK,WAAWL,CAAU,IAC7BA,EAAaK,EAAK,KAAK,QAAQ,IAAI,EAAGL,CAAU,EAChDA,EAAaK,EAAK,UAAUL,CAAU,GAMnCG,GAAaP,GAAG,SAAS,IAAM,QAClCD,GAAcK,CAAU,EAAE,KAC1BA,CACN,CAEA,eAAeI,IAAoB,CACjC,IAAME,EAAe,MAAMC,GAAOV,EAAW,EAC7C,GAAIS,IAAiB,OACnB,MAAM,IAAIE,EAEZ,OAAOF,CACT","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","getStructAttrs","values","prefixArgs","key","_","isAddress","str","getStructInitValue","keys","item","data","value","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","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","renderNewStructFunc","renderRegisterFuncWithInit","renderSingleSetFunc","renderSingleSetAttrsFunc","renderSingleGetAllFunc","renderSingleGetAttrsFunc","renderRegisterFunc","renderSetFunc","renderSetAttrsFunc","renderGetAllFunc","renderGetAttrsFunc","renderRemoveFunc","renderContainFunc","existsSync","generateDeployHook","config","srcPrefix","code","formatAndWriteMove","generateMigrate","generateAppKey","config","srcPrefix","code","formatAndWriteMove","worldgen","config","srcPrefix","path","existsSync","deleteFolderRecursive","generateToml","generateEntityKey","generateSystem","generateDeployHook","generateMigrate","generateSchema","generateInit","generateAppKey","generateEps","projectName","srcPrefix","version","generateWorld","generateEvents","code","formatAndWriteMove","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError"]}
|
|
1
|
+
{"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/worldgen.ts","../src/codegen/utils/renderMove/common.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts"],"sourcesContent":["import prettier from \"prettier\";\nimport prettierPluginMove from \"prettier-plugin-move\";\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: [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 prefix =\n` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: MIT\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n `\n\n let code = prefix + formattedOutput\n\n if (fullOutputPath.includes(\"deploy_hook\") || fullOutputPath.includes(\".toml\") || fullOutputPath.includes(\"system\")) {\n code = 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(\"obelisk:common\");\nexport const error = createDebug(\"obelisk: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, ObeliskConfig } from \"../../types\";\nimport { rmdirSync, existsSync } from \"fs\";\nimport { deleteFolderRecursive } from \"./common\";\nimport { generateSystem } from \"./generateSystem\";\nimport { generateToml } from \"./generateToml\";\nimport {generateSchemaData, generateSchemaStructure} from \"./generateSchema\";\nimport {generateDeployHook, generateMigrate} from \"./generateScript\";\nimport {generateDappKey} from \"./generateDappKey\";\n\nexport async 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 }\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 await generateSystem(config, path);\n await generateSchemaData(config.name, config.schemas, path);\n await generateSchemaStructure(config.name, config.schemas, path);\n await generateDappKey(config, path);\n}\n","import { BaseType, SchemaType, 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 *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(\n values: Record<string, string> | string,\n): string {\n return Object.entries(values).map(([key, _]) => `${key}`).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(\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>\n): string[] {\n return Object.entries(values).map(([key, type]) => `${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}self.value`]\n : Object.entries(values).map(\n ([key, _]) => `${prefixArgs}self.${key}`\n );\n}","import { ObeliskConfig } from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\nimport { existsSync } from \"fs\";\n\nexport async function generateSystem(config: ObeliskConfig, srcPrefix: string) {\n config.systems.map(async (systemName) => {\n if (\n !existsSync(\n `${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`\n )\n ) {\n let code = `module ${config.name}::${systemName}_system {\n\n}\n`;\n await 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 async function generateToml(config: ObeliskConfig, srcPrefix: string) {\n\tlet code = `[package]\nname = \"${config.name}\"\nversion = \"0.0.1\"\nedition = \"2024.beta\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.31.1\" }\nObelisk = { git = \"https://github.com/0xobelisk/obelisk-engine.git\", subdir = \"packages/obelisk-framework\", rev = \"main\" }\n\n[addresses]\nsui = \"0x2\"\nobelisk = \"0x3dc2d6239eed38c9798444afbf4bada0998ec98edc365713864405fe64203256\"\n${config.name} = \"0x0\"\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/Move.toml`,\n\t\t'formatAndWriteMove'\n\t);\n}\n","import {\n BaseType, SchemaType,\n} from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\nimport {\n getStructAttrsWithType,\n getStructAttrs,\n getStructTypes, getStructAttrsQuery,\n} from \"./common\";\n\nfunction 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 ).join(\"\\n\");\n}\n\nexport function renderSetFunc(\n schemaName: string,\n fields: Record<string, string>\n): 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(\n schemaName: string,\n fields: BaseType | Record<string, BaseType>\n): 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 ).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(projectName: string, schemas: Record<string, SchemaType>, path: string) {\n for (const schemaName in schemas) {\n const schema = schemas[schemaName];\n if (schema.data) {\n for (const item of schema.data) {\n let code = \"\";\n\n const enumNames = schema.data\n .filter(item => Array.isArray(item.fields))\n .map(item => item.name);\n\n if (Array.isArray(item.fields)) {\n code = `module ${projectName}::${schemaName}_${convertToSnakeCase(item.name)} {\n public enum ${item.name} has copy, drop , store {\n ${item.fields}\n }\n \n ${item.fields.map((field: string) => {\n return `public fun new_${convertToSnakeCase(field)}(): ${item.name} {\n ${item.name}::${field}\n }`\n }).join(\"\")\n }`\n } else {\n code = `module ${projectName}::${schemaName}_${convertToSnakeCase(item.name)} {\n use std::ascii::String;\n ${enumNames.map(name => `use ${projectName}::${schemaName}_${convertToSnakeCase(name)}::${name};`).join('\\n')}\n\n public struct ${item.name} has copy, drop , store {\n ${getStructAttrsWithType(item.fields)}\n }\n \n public fun new(${getStructAttrsWithType(item.fields)}): ${item.name} {\n ${item.name} {\n ${getStructAttrs(item.fields)}\n }\n }\n \n ${renderGetAllFunc(item.name, item.fields)}\n ${renderGetAttrsFunc(item.name, item.fields)}\n ${renderSetAttrsFunc(item.name, item.fields)}\n ${renderSetFunc(item.name, item.fields)}\n }`;\n }\n\n await formatAndWriteMove(\n code,\n `${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}_${convertToSnakeCase(item.name)}.move`,\n \"formatAndWriteMove\"\n );\n }\n }\n }\n}\n\nfunction generateImport(projectName: string, schemaName: string, schema: SchemaType) {\n if (schema.data) {\n return schema.data.map(item => {\n return `use ${projectName}::${schemaName}_${convertToSnakeCase(item.name)}::${item.name};`\n }).join('\\n');\n } else {\n return \"\"\n }\n}\n\nexport async function generateSchemaStructure(projectName: string, schemas: Record<string, SchemaType>, path: string) {\n for (const schemaName in schemas) {\n console.log(`Schema: ${schemaName}`);\n const schema = schemas[schemaName];\n const schemaMoudle = `module ${projectName}::${schemaName}_schema {\n use std::ascii::String;\n use std::type_name;\n use sui::transfer::{public_share_object};\n use obelisk::dapps_system;\n use obelisk::dapps_schema::Dapps;\n use obelisk::storage_value::{Self, StorageValue};\n use obelisk::storage_map::{Self, StorageMap};\n use obelisk::storage_double_map::{Self, StorageDoubleMap};\n use ${projectName}::dapp_key::DappKey;\n ${generateImport(projectName, schemaName, schema)}\n\n public struct ${capitalizeAndRemoveUnderscores(schemaName)} has key, store {\n id: UID,\n ${getStructAttrsWithType(schema.structure)}\n } \n \n ${Object.entries(schema.structure).map(([key, value]) => {\n return `public fun borrow_${key}(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : &${value} {\n &self.${key}\n }\n \n public(package) fun borrow_mut_${key}(self: &mut ${capitalizeAndRemoveUnderscores(schemaName)}): &mut ${value} {\n &mut self.${key}\n }\n `\n }).join('')} \n \n public entry fun register(dapps: &mut Dapps, ctx: &mut TxContext) {\n let package_id = dapps_system::current_package_id<DappKey>();\n assert!(dapps.borrow_metadata().contains_key(package_id), 0);\n assert!(dapps.borrow_admin().get(package_id) == ctx.sender(), 0);\n let schema = type_name::get<${capitalizeAndRemoveUnderscores(schemaName)}>().into_string();\n assert!(!dapps.borrow_schemas().get(package_id).contains(&schema), 0);\n \n public_share_object(${capitalizeAndRemoveUnderscores(schemaName)} {\n id: object::new(ctx),\n ${Object.entries(schema.structure).map(([key, value]) => {\n let storage_type = \"\"\n if (value.includes(\"StorageValue\")) {\n storage_type = `storage_value::new()`\n } else if (value.includes(\"StorageMap\")) {\n storage_type = `storage_map::new()`\n } else if (value.includes(\"StorageDoubleMap\")) {\n storage_type = `storage_double_map::new()`\n }\n return `${key}: ${storage_type},`\n }).join(' ')\n }\n });\n \n dapps_system::add_schema<${capitalizeAndRemoveUnderscores(schemaName)}>(dapps, package_id, ctx);\n }\n \n }`;\n await formatAndWriteMove(\n schemaMoudle,\n `${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`,\n \"formatAndWriteMove\"\n );\n }\n}","import { ObeliskConfig } from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\nimport { existsSync } from \"fs\";\n\nexport async function generateDeployHook(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 obelisk::dapps_schema::Dapps;\n use obelisk::dapps_system;\n use ${config.name}::dapp_key::DappKey;\n use std::ascii;\n use sui::clock::Clock;\n #[test_only]\n use obelisk::dapps_schema;\n #[test_only]\n use sui::clock;\n #[test_only]\n use sui::test_scenario;\n #[test_only]\n use sui::test_scenario::Scenario;\n\n public entry fun run(dapps: &mut Dapps, clock: &Clock, ctx: &mut TxContext) {\n // Register the dapp to obelisk.\n dapps_system::register<DappKey>(\n dapps,\n ascii::string(b\"${config.name}\"),\n ascii::string(b\"${config.description}\"),\n clock,\n ctx\n );\n ${Object.keys(config.schemas).map(schemaName => {\n return `${config.name}::${schemaName}_schema::register(dapps, ctx);`\n }).join(\"\\n\")}\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(): (Scenario, Dapps) {\n let mut scenario = test_scenario::begin(@0xA);\n {\n let ctx = test_scenario::ctx(&mut scenario);\n dapps_schema::init_dapps_for_testing(ctx);\n test_scenario::next_tx(&mut scenario,@0xA);\n };\n let mut dapps = test_scenario::take_shared<Dapps>(&scenario);\n let ctx = test_scenario::ctx(&mut scenario);\n let clock = clock::create_for_testing(ctx);\n run(&mut dapps, &clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(&mut scenario,@0xA);\n (scenario, dapps)\n }\n}\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`,\n \"formatAndWriteMove\"\n );\n }\n}\n\nexport function generateMigrate(config: ObeliskConfig, srcPrefix: string) {\n if (\n !existsSync(\n `${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`\n )\n ) {\n let code = `module ${config.name}::migrate {\n use obelisk::world::{World, AdminCap};\n\n /// Not the right admin for this world\n const ENotAdmin: u64 = 0;\n const EWrongVersion: u64 = 1;\n const ENotUpgrade: u64 = 2;\n const VERSION: u64 = 1;\n\n public entry fun run(world: &mut World, admin_cap: &AdminCap) {\n assert!(world.admin() == object::id(admin_cap), ENotAdmin);\n assert!(world.version() < VERSION, ENotUpgrade);\n *obelisk::world::mut_version(world, admin_cap) = VERSION;\n }\n\n public fun assert_version(world: &World){\n assert!(world.version() == VERSION, EWrongVersion);\n }\n}\n`;\n formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`,\n \"formatAndWriteMove\"\n );\n }\n}\n\n","import { ObeliskConfig } from \"../../types\";\nimport { formatAndWriteMove } from \"../formatAndWrite\";\n\nexport async function generateDappKey(config: ObeliskConfig, srcPrefix: string) {\n let code = `module ${config.name}::dapp_key {\n /// Authorization token for the app.\n public struct DappKey has drop {}\n\n public(package) fun new(): DappKey {\n DappKey { }\n }\n}\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.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 = [\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","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","formatMove","code","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","getStructAttrs","values","key","_","getStructTypes","values","_","type","getStructAttrsWithType","key","getStructAttrsQuery","prefixArgs","existsSync","generateSystem","config","srcPrefix","systemName","code","formatAndWriteMove","generateToml","config","srcPrefix","code","formatAndWriteMove","capitalizeAndRemoveUnderscores","input","word","index","renderSetAttrsFunc","schemaName","fields","key","type","renderSetFunc","getStructAttrsWithType","fieldName","renderGetAllFunc","getStructTypes","getStructAttrsQuery","renderGetAttrsFunc","convertToSnakeCase","generateSchemaData","projectName","schemas","path","schema","item","code","enumNames","field","name","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemaMoudle","value","storage_type","existsSync","generateDeployHook","config","srcPrefix","code","schemaName","formatAndWriteMove","generateDappKey","config","srcPrefix","code","formatAndWriteMove","worldgen","config","srcPrefix","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSystem","generateSchemaData","generateSchemaStructure","generateDappKey","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@0xobelisk/sui-common",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.10",
|
|
4
4
|
"description": "Common low level logic shared between packages",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sui",
|
|
@@ -35,22 +35,24 @@
|
|
|
35
35
|
},
|
|
36
36
|
"types": "src/index.ts",
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@mysten/sui": "^1.
|
|
38
|
+
"@mysten/sui": "^1.7.0",
|
|
39
39
|
"chalk": "^5.0.1",
|
|
40
|
+
"debug": "^4.3.4",
|
|
40
41
|
"dotenv": "^16.0.3",
|
|
41
42
|
"ejs": "^3.1.8",
|
|
43
|
+
"esbuild": "^0.17.15",
|
|
42
44
|
"execa": "^7.0.0",
|
|
43
45
|
"find-up": "^6.3.0",
|
|
44
46
|
"glob": "^8.0.3",
|
|
45
47
|
"path": "^0.12.7",
|
|
46
|
-
"prettier": "^
|
|
48
|
+
"prettier": "^3.1.1",
|
|
49
|
+
"prettier-plugin-move": "link:/Volumes/project/sui/external-crates/move/crates/move-analyzer/prettier-plugin",
|
|
47
50
|
"prettier-plugin-rust": "^0.1.9",
|
|
48
51
|
"prettier-plugin-solidity": "^1.1.2",
|
|
49
52
|
"typescript": "5.1.6",
|
|
50
53
|
"yargs": "^17.7.1",
|
|
51
54
|
"zod": "^3.22.3",
|
|
52
|
-
"zod-validation-error": "^1.3.0"
|
|
53
|
-
"esbuild": "^0.17.15"
|
|
55
|
+
"zod-validation-error": "^1.3.0"
|
|
54
56
|
},
|
|
55
57
|
"devDependencies": {
|
|
56
58
|
"@types/ejs": "^3.1.1",
|
|
@@ -58,7 +60,8 @@
|
|
|
58
60
|
"@types/node": "^18.15.11",
|
|
59
61
|
"@types/yargs": "^17.0.10",
|
|
60
62
|
"tsup": "^6.7.0",
|
|
61
|
-
"tsx": "^3.12.6"
|
|
63
|
+
"tsx": "^3.12.6",
|
|
64
|
+
"vitest": "^2.1.3"
|
|
62
65
|
},
|
|
63
66
|
"scripts": {
|
|
64
67
|
"build": "pnpm run build:js",
|
|
@@ -66,6 +69,7 @@
|
|
|
66
69
|
"clean": "pnpm run clean:js",
|
|
67
70
|
"clean:js": "rimraf dist",
|
|
68
71
|
"dev": "tsup --watch",
|
|
69
|
-
"lint": "eslint . --ext .ts"
|
|
72
|
+
"lint": "eslint . --ext .ts",
|
|
73
|
+
"test": "vitest"
|
|
70
74
|
}
|
|
71
75
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { debug as parentDebug } from "../debug";
|
|
2
|
+
|
|
3
|
+
export const debug = parentDebug.extend("codegen");
|
|
4
|
+
export const error = parentDebug.extend("codegen");
|
|
5
|
+
|
|
6
|
+
// Pipe debug output to stdout instead of stderr
|
|
7
|
+
debug.log = console.debug.bind(console);
|
|
8
|
+
|
|
9
|
+
// Pipe error output to stderr
|
|
10
|
+
error.log = console.error.bind(console);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type BaseType =
|
|
2
|
-
| "
|
|
3
|
-
| "vector<
|
|
2
|
+
| "String"
|
|
3
|
+
| "vector<String>"
|
|
4
4
|
| "address"
|
|
5
5
|
| "bool"
|
|
6
6
|
| "u8"
|
|
@@ -11,7 +11,17 @@ export type BaseType =
|
|
|
11
11
|
| "vector<u8>"
|
|
12
12
|
| "vector<vector<u8>>"
|
|
13
13
|
| "vector<u64>"
|
|
14
|
-
| "vector<u128>"
|
|
14
|
+
| "vector<u128>"
|
|
15
|
+
| string;
|
|
16
|
+
|
|
17
|
+
export type StorageDataType =
|
|
18
|
+
| "Struct"
|
|
19
|
+
| "Enum";
|
|
20
|
+
|
|
21
|
+
export type StorageMapType =
|
|
22
|
+
| "Map"
|
|
23
|
+
| "Bag"
|
|
24
|
+
| "Table";
|
|
15
25
|
|
|
16
26
|
type Address = string;
|
|
17
27
|
type Bool = boolean;
|
|
@@ -34,19 +44,23 @@ export type BaseValueType =
|
|
|
34
44
|
| Vector<U64>
|
|
35
45
|
| Vector<U128>;
|
|
36
46
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
47
|
+
|
|
48
|
+
export type SchemaData = {
|
|
49
|
+
name: string;
|
|
50
|
+
type?: StorageDataType;
|
|
51
|
+
fields: Record<string, BaseType> | string[];
|
|
41
52
|
}
|
|
42
53
|
|
|
43
|
-
export type
|
|
54
|
+
export type SchemaType = {
|
|
55
|
+
data?: SchemaData[];
|
|
56
|
+
structure: Record<string, string>;
|
|
57
|
+
}
|
|
44
58
|
|
|
45
59
|
export type ObeliskConfig = {
|
|
46
60
|
name: string;
|
|
47
61
|
description: string;
|
|
48
62
|
systems: string[];
|
|
49
|
-
schemas: Record<string,
|
|
63
|
+
schemas: Record<string, SchemaType>;
|
|
50
64
|
};
|
|
51
65
|
|
|
52
66
|
export type MoveType =
|
|
@@ -65,18 +79,3 @@ export type MoveType =
|
|
|
65
79
|
| "vector<vector<u8>>"
|
|
66
80
|
| "vector<u64>"
|
|
67
81
|
| "vector<u128>";
|
|
68
|
-
|
|
69
|
-
export interface RenderSchemaOptions {
|
|
70
|
-
projectName: string;
|
|
71
|
-
systems: string[];
|
|
72
|
-
schemaName: string;
|
|
73
|
-
structName: string;
|
|
74
|
-
ephemeral: boolean;
|
|
75
|
-
singleton: boolean;
|
|
76
|
-
valueType: MoveType | Record<string, MoveType>; // move type
|
|
77
|
-
realType: BaseType | Record<string, BaseType>; // ts type
|
|
78
|
-
// structAttrs: string[];
|
|
79
|
-
// structTypes: string[];
|
|
80
|
-
defaultValue: BaseValueType | Record<string, BaseValueType> | undefined;
|
|
81
|
-
needImportString: boolean;
|
|
82
|
-
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
import * as rustPlugin from "prettier-plugin-rust";
|
|
1
|
+
import prettier from "prettier";
|
|
2
|
+
import prettierPluginMove from "prettier-plugin-move";
|
|
4
3
|
|
|
5
4
|
export async function formatMove(
|
|
6
5
|
content: string,
|
|
@@ -12,15 +11,13 @@ export async function formatMove(
|
|
|
12
11
|
}
|
|
13
12
|
try {
|
|
14
13
|
return prettier.format(content, {
|
|
15
|
-
plugins: [
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
plugins: [prettierPluginMove],
|
|
15
|
+
parser: "move-parse",
|
|
18
16
|
printWidth: 120,
|
|
19
17
|
semi: true,
|
|
20
18
|
tabWidth: 2,
|
|
21
19
|
useTabs: false,
|
|
22
20
|
bracketSpacing: true,
|
|
23
|
-
|
|
24
21
|
...config,
|
|
25
22
|
});
|
|
26
23
|
} catch (error) {
|
|
@@ -1,31 +1,48 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
3
|
import { formatMove, formatTypescript } from "./format";
|
|
4
|
+
import { debug } from "../debug";
|
|
4
5
|
|
|
5
6
|
export async function formatAndWriteMove(
|
|
6
7
|
output: string,
|
|
7
8
|
fullOutputPath: string,
|
|
8
9
|
logPrefix?: string
|
|
9
10
|
): Promise<void> {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
const formattedOutput = await formatMove(output);
|
|
12
|
+
let prefix =
|
|
13
|
+
` // Copyright (c) Obelisk Labs, Inc.
|
|
14
|
+
// SPDX-License-Identifier: MIT
|
|
15
|
+
#[allow(unused_use)]
|
|
16
|
+
|
|
17
|
+
/* Autogenerated file. Do not edit manually. */
|
|
18
|
+
`
|
|
13
19
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
20
|
+
let code = prefix + formattedOutput
|
|
21
|
+
|
|
22
|
+
if (fullOutputPath.includes("deploy_hook") || fullOutputPath.includes(".toml") || fullOutputPath.includes("system")) {
|
|
23
|
+
code = formattedOutput
|
|
17
24
|
}
|
|
25
|
+
|
|
26
|
+
await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });
|
|
27
|
+
await fs.writeFile(fullOutputPath, code);
|
|
28
|
+
debug(`${logPrefix}: ${fullOutputPath}`);
|
|
18
29
|
}
|
|
19
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Formats typescript code using prettier and write it to a file
|
|
33
|
+
* @param output typescript code
|
|
34
|
+
* @param fullOutputPath full path to the output file
|
|
35
|
+
* @param logPrefix prefix for debug logs
|
|
36
|
+
*/
|
|
20
37
|
export async function formatAndWriteTypescript(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
38
|
+
output: string,
|
|
39
|
+
fullOutputPath: string,
|
|
40
|
+
logPrefix: string,
|
|
24
41
|
): Promise<void> {
|
|
25
42
|
const formattedOutput = await formatTypescript(output);
|
|
26
43
|
|
|
27
|
-
|
|
44
|
+
await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });
|
|
28
45
|
|
|
29
|
-
|
|
30
|
-
|
|
46
|
+
await fs.writeFile(fullOutputPath, formattedOutput);
|
|
47
|
+
debug(`${logPrefix}: ${fullOutputPath}`);
|
|
31
48
|
}
|