@0xobelisk/sui-common 0.5.19 → 0.5.20

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/schemaGen.ts","../src/codegen/utils/renderMove/common.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(\n\tcontent: string,\n\tprettierConfigPath?: string\n): Promise<string> {\n\tlet config;\n\tif (prettierConfigPath) {\n\t\tconfig = await prettier.resolveConfig(prettierConfigPath);\n\t}\n\ttry {\n\t\treturn prettier.format(content, {\n\t\t\tplugins: [prettierPluginMove],\n\t\t\tparser: 'move-parse',\n\t\t\tprintWidth: 120,\n\t\t\tsemi: true,\n\t\t\ttabWidth: 2,\n\t\t\tuseTabs: false,\n\t\t\tbracketSpacing: true,\n\t\t\t...config,\n\t\t});\n\t} catch (error) {\n\t\tlet message;\n\t\tif (error instanceof Error) {\n\t\t\tmessage = error.message;\n\t\t} else {\n\t\t\tmessage = error;\n\t\t}\n\t\tconsole.log(`Error during output formatting: ${message}`);\n\t\treturn content;\n\t}\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n\treturn prettier.format(content, {\n\t\tparser: 'typescript',\n\t});\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { formatMove, formatTypescript } from \"./format\";\nimport { debug } from \"../debug\";\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = await formatMove(output);\n let schemaPrefix =\n` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: MIT\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `\n\n let deployHookPrefix = `#[allow(lint(share_owned))]\n \n `\n\n let code = schemaPrefix + formattedOutput\n\n if (fullOutputPath.includes(\".toml\") || fullOutputPath.includes(\"system\")) {\n code = formattedOutput\n } else if (fullOutputPath.includes(\"deploy_hook\")) {\n code = deployHookPrefix + formattedOutput\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string,\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from \"debug\";\n\nexport const debug = createDebug(\"dubhe:common\");\nexport const error = createDebug(\"dubhe:common\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"codegen\");\nexport const error = parentDebug.extend(\"codegen\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","/**\n * Explicitly normalize a given path to a posix path (using `/` as separator).\n * This should be used for generating Solidity files that will be consumed by solc,\n * because solc expects `/` as path separator, but path.join produces `\\` if the user is on windows.\n */\nexport function posixPath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n","import { SchemaType, DubheConfig } from '../../types';\nimport { rmdirSync, existsSync } from 'fs';\nimport { deleteFolderRecursive } from './common';\nimport { generateSystem } from './generateSystem';\nimport { generateToml } from './generateToml';\nimport { generateSchemaData, generateSchemaStructure } from './generateSchema';\nimport { generateDeployHook, generateMigrate } from './generateScript';\nimport { generateDappKey } from './generateDappKey';\n\nfunction matchFrameworkId(\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n): string {\n\tswitch (network) {\n\t\tcase 'testnet':\n\t\t\treturn '0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28';\n\t\tcase 'localnet':\n\t\t\treturn '0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28';\n\t\tdefault:\n\t\t\treturn '0x1736475f476c5dec96f33c03c778843f572239d3a887d795eef66d2836484c28';\n\t}\n}\n\nexport async function schemaGen(\n\tconfig: DubheConfig,\n\tsrcPrefix?: string,\n\tnetwork?: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tframeworkId?: string\n) {\n\tconsole.log('\\nšŸš€ Starting Schema Generation Process...');\n\tconsole.log('šŸ“‹ Project Configuration:');\n\tconsole.log(` ā”œā”€ Name: ${config.name}`);\n\tconsole.log(\n\t\t` ā”œā”€ Description: ${config.description || 'No description provided'}`\n\t);\n\tconsole.log(` ā”œā”€ Network: ${network || 'testnet'}`);\n\tconsole.log(\n\t\t` └─ Framework ID: ${\n\t\t\tframeworkId || matchFrameworkId(network ?? 'testnet')\n\t\t}\\n`\n\t);\n\n\tconst path = srcPrefix ?? process.cwd();\n\n\tframeworkId = frameworkId || matchFrameworkId(network ?? 'testnet');\n\n\tif (existsSync(`${path}/contracts/${config.name}`)) {\n\t\tdeleteFolderRecursive(\n\t\t\t`${path}/contracts/${config.name}/sources/codegen`\n\t\t);\n\t}\n\n\tif (!existsSync(`${path}/contracts/${config.name}/Move.toml`)) {\n\t\tawait generateToml(config, path, frameworkId);\n\t}\n\n\tif (\n\t\t!existsSync(\n\t\t\t`${path}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t\t)\n\t) {\n\t\tawait generateDeployHook(config, path);\n\t}\n\n\tawait generateSystem(config, path);\n\tawait generateSchemaData(config.name, config.schemas, path);\n\tawait generateSchemaStructure(config.name, config.schemas, path);\n\tawait generateDappKey(config, path);\n\tconsole.log('āœ… Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n\tif (fs.existsSync(path)) {\n\t\tfs.readdirSync(path).forEach(file => {\n\t\t\tconst curPath = `${path}/${file}`;\n\t\t\tif (fs.lstatSync(curPath).isDirectory()) {\n\t\t\t\tdeleteFolderRecursive(curPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(curPath);\n\t\t\t}\n\t\t});\n\t\tfs.rmdirSync(path);\n\t}\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n\treturn input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(\n\tvalues: Record<string, string> | string\n): string {\n\treturn Object.entries(values)\n\t\t.map(([key, _]) => `${key}`)\n\t\t.join(',');\n}\n\nfunction isAddress(str: string): boolean {\n\tconst regex = /^0x[a-fA-F0-9]+$/;\n\treturn regex.test(str);\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaType): string {\nexport function getStructTypes(\n\tvalues: Record<string, string>\n): string {\n\treturn `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(\n\tvalues: Record<string, string>\n): string[] {\n\treturn Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(\n\tvalues: Record<string, string>,\n): string[] {\n\treturn Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\n\nexport async function generateSystem(config: DubheConfig, srcPrefix: string) {\n\tconsole.log('\\nāš™ļø Starting System Generation...');\n\tconfig.systems.map(async systemName => {\n\t\tconsole.log(` ā”œā”€ Generating system: ${systemName}`);\n\t\tconsole.log(\n\t\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`\n\t\t);\n\n\t\tif (\n\t\t\t!existsSync(\n\t\t\t\t`${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`\n\t\t\t)\n\t\t) {\n\t\t\tlet code = `module ${config.name}::${systemName}_system {\n\n}\n`;\n\t\t\tawait formatAndWriteMove(\n\t\t\t\tcode,\n\t\t\t\t`${srcPrefix}/contracts/${config.name}/sources/system/${systemName}.move`,\n\t\t\t\t'formatAndWriteMove'\n\t\t\t);\n\t\t}\n\t});\n\tconsole.log('āœ… System Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateToml(\n\tconfig: DubheConfig,\n\tsrcPrefix: string,\n\tframeworkId: string\n) {\n\tconsole.log('\\nšŸ“„ Starting Move.toml Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/Move.toml`\n\t);\n\n\tlet code = `[package]\nname = \"${config.name}\"\nversion = \"0.0.1\"\nedition = \"2024.beta\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.36.2\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe.git\", subdir = \"packages/dubhe-framework\", rev = \"main\" }\n\n[addresses]\nsui = \"0x2\"\ndubhe = \"${frameworkId}\"\n${config.name} = \"0x0\"\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/Move.toml`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('āœ… Move.toml Generation Complete\\n');\n}\n","import { BaseType, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\n\nfunction capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nexport function renderSetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([key, type]) =>\n\t\t\t\t`public(package) fun set_${key}(self: &mut ${schemaName}, ${key}: ${type}) {\n self.${key} = ${key};\n }`\n\t\t)\n\t\t.join('\\n');\n}\n\nexport function renderSetFunc(\n\tschemaName: string,\n\tfields: Record<string, string>\n): string {\n\treturn `public(package) fun set(self: &mut ${schemaName}, ${getStructAttrsWithType(\n\t\tfields\n\t)}) {\n ${Object.entries(fields)\n\t\t\t\t.map(([fieldName]) => `self.${fieldName} = ${fieldName};`)\n\t\t\t\t.join('\\n')}\n }`;\n}\n\nexport function renderGetAllFunc(\n\tschemaName: string,\n\tfields: Record<string, string>\n): string {\n\treturn `public fun get(self: &${schemaName}): ${getStructTypes(fields)} {\n (${getStructAttrsQuery(fields)})\n }`;\n}\n\nexport function renderGetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([\n\t\t\t\tkey,\n\t\t\t\ttype,\n\t\t\t]) => `public fun get_${key}(self: &${schemaName}): ${type} {\n self.${key}\n }`\n\t\t)\n\t\t.join('\\n');\n}\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nexport async function generateSchemaData(\n\tprojectName: string,\n\tschemas: Record<string, SchemaType>,\n\tpath: string\n) {\n\tconsole.log('\\nšŸ“¦ Starting Schema Data Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconst schema = schemas[schemaName];\n\t\tif (schema.data) {\n\t\t\tconsole.log(` ā”œā”€ Processing schema: ${schemaName}`);\n\t\t\tfor (const item of schema.data) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${item.name} ${\n\t\t\t\t\t\tArray.isArray(item.fields) ? '(enum)' : '(struct)'\n\t\t\t\t\t}`\n\t\t\t\t);\n\t\t\t\tlet code = '';\n\n\t\t\t\tconst enumNames = schema.data\n\t\t\t\t\t.filter(item => Array.isArray(item.fields))\n\t\t\t\t\t.map(item => item.name);\n\n\t\t\t\tif (Array.isArray(item.fields)) {\n\t\t\t\t\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name\n\t\t\t\t\t)} {\n public enum ${item.name} has copy, drop , store {\n ${item.fields}\n }\n \n ${item.fields\n\t\t\t\t\t\t\t.map((field: string) => {\n\t\t\t\t\t\t\t\treturn `public fun new_${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\tfield\n\t\t\t\t\t\t\t\t)}(): ${item.name} {\n ${item.name}::${field}\n }`;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.join('')}`;\n\t\t\t\t} else {\n\t\t\t\t\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name\n\t\t\t\t\t)} {\n use std::ascii::String;\n ${enumNames\n\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\tname =>\n\t\t\t\t\t\t\t\t\t\t`use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\t\t\tname\n\t\t\t\t\t\t\t\t\t\t)}::${name};`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.join('\\n')}\n\n public struct ${item.name} has copy, drop , store {\n ${getStructAttrsWithType(item.fields)}\n }\n \n public fun new(${getStructAttrsWithType(\n\t\t\t\t\t\t\t\titem.fields\n\t\t\t\t\t\t\t)}): ${item.name} {\n ${item.name} {\n ${getStructAttrs(item.fields)}\n }\n }\n \n ${renderGetAllFunc(item.name, item.fields)}\n ${renderGetAttrsFunc(item.name, item.fields)}\n ${renderSetAttrsFunc(item.name, item.fields)}\n ${renderSetFunc(item.name, item.fields)}\n }`;\n\t\t\t\t}\n\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name\n\t\t\t\t\t)}.move`,\n\t\t\t\t\t'formatAndWriteMove'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tconsole.log('āœ… Schema Data Generation Complete\\n');\n}\n\nfunction generateImport(\n\tprojectName: string,\n\tschemaName: string,\n\tschema: SchemaType\n) {\n\tif (schema.data) {\n\t\treturn schema.data\n\t\t\t.map(item => {\n\t\t\t\treturn `use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\titem.name\n\t\t\t\t)}::${item.name};`;\n\t\t\t})\n\t\t\t.join('\\n');\n\t} else {\n\t\treturn '';\n\t}\n}\n\nexport async function generateSchemaStructure(\n\tprojectName: string,\n\tschemas: Record<string, SchemaType>,\n\tpath: string\n) {\n\tconsole.log('\\nšŸ”Ø Starting Schema Structure Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconsole.log(` ā”œā”€ Generating schema: ${schemaName}`);\n\t\tconsole.log(\n\t\t\t` ā”œā”€ Output path: ${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`\n\t\t);\n\t\tconsole.log(\n\t\t\t` └─ Structure fields: ${\n\t\t\t\tObject.keys(schemas[schemaName].structure).length\n\t\t\t}`\n\t\t);\n\t\tconst schema = schemas[schemaName];\n\t\tconst schemaMoudle = `module ${projectName}::${schemaName}_schema {\n use std::ascii::String;\n use std::type_name;\n use dubhe::dapps_system;\n use dubhe::dapps_schema::Dapps;\n use dubhe::storage_value::{Self, StorageValue};\n use dubhe::storage_map::{Self, StorageMap};\n use dubhe::storage_double_map::{Self, StorageDoubleMap};\n use ${projectName}::dapp_key::DappKey;\n ${generateImport(projectName, schemaName, schema)}\n\n public struct ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)} has key, store {\n id: UID,\n ${getStructAttrsWithType(schema.structure)}\n } \n \n ${Object.entries(schema.structure)\n\t\t\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t\t\treturn `public fun borrow_${key}(self: &${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\t\t\t\tschemaName\n\t\t\t\t\t\t\t\t)}) : &${value} {\n &self.${key}\n }\n \n public(package) fun borrow_mut_${key}(self: &mut ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)}): &mut ${value} {\n &mut self.${key}\n }\n `;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.join('')} \n \n \n public fun register(dapps: &mut Dapps, ctx: &mut TxContext): ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)} {\n let package_id = dapps_system::current_package_id<DappKey>();\n assert!(dapps.borrow_metadata().contains_key(package_id), 0);\n assert!(dapps.borrow_admin().get(package_id) == ctx.sender(), 0);\n let schema = type_name::get<${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\t\tschemaName\n\t\t\t\t\t\t)}>().into_string();\n assert!(!dapps.borrow_schemas().get(package_id).contains(&schema), 0);\n dapps_system::add_schema<${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\t\tschemaName\n\t\t\t\t\t\t)}>(dapps, package_id, ctx);\n ${capitalizeAndRemoveUnderscores(schemaName)} {\n id: object::new(ctx),\n ${Object.entries(schema.structure)\n\t\t\t\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t\t\t\tlet storage_type = '';\n\t\t\t\t\t\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_value::new()`;\n\t\t\t\t\t\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_map::new()`;\n\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\tvalue.includes('StorageDoubleMap')\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_double_map::new()`;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn `${key}: ${storage_type},`;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.join(' ')}\n }\n }\n \n \n // ======================================== View Functions ========================================\n ${Object.entries(schema.structure)\n\t\t\t.map(([key, value]) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tlet all_types = value.match(/<(.+)>/)[1].split(',').map(type => type.trim())\n\t\t\t\tlet para_key: string[] = []\n\t\t\t\tlet para_value = \"\"\n\t\t\t\tlet borrow_key = \"\"\n\t\t\t\tlet extra_code = \"\"\n\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\tpara_key = []\n\t\t\t\t\tpara_value = `${all_types[0]}`\n\t\t\t\t\tborrow_key = 'try_get()'\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tpara_key = [`key: ${all_types[0]}`]\n\t\t\t\t\tpara_value = `${all_types[1]}`\n\t\t\t\t\tborrow_key = 'try_get(key)'\n\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[0]}> {\n\t\t\t\t\t\t\t\t\tself.${key}.keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[1]}> {\n\t\t\t\t\t\t\t\t\tself.${key}.values()\n\t\t\t\t\t\t\t\t}`\n\t\t\t\t} else if (value.includes('StorageDoubleMap')) {\n\t\t\t\t\tpara_key = [`key1: ${all_types[0]}`, `key2: ${all_types[1]}`]\n\t\t\t\t\tpara_value = `${all_types[2]}`\n\t\t\t\t\tborrow_key = 'try_get(key1, key2)'\n\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : (vector<${all_types[0]}>, vector<${all_types[1]}>) {\n\t\t\t\t\t\t\t\t\tself.${key}.keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[2]}> {\n\t\t\t\t\t\t\t\t\tself.${key}.values()\n\t\t\t\t\t\t\t\t}`\n\t\t\t\t}\n\t\t\t\treturn `public fun get_${key}(self: &${capitalizeAndRemoveUnderscores(schemaName)}, ${para_key}) : Option<${para_value}> {\n\t\t\t\t\t\t\t\t\tself.${key}.${borrow_key}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t` + extra_code;\n\t\t\t})\n\t\t\t.join('')} \n // =========================================================================================================\n \n \n }`;\n\t\tawait formatAndWriteMove(\n\t\t\tschemaMoudle,\n\t\t\t`${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n\tconsole.log('āœ… Schema Structure Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\n\nexport async function generateDeployHook(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nšŸ“ Starting Deploy Hook Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t);\n\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::deploy_hook {\n use dubhe::dapps_schema::Dapps;\n use dubhe::dapps_system;\n use ${config.name}::dapp_key::DappKey;\n use std::ascii;\n use sui::clock::Clock;\n use sui::transfer::public_share_object;\n #[test_only]\n use dubhe::dapps_schema;\n #[test_only]\n use sui::clock;\n #[test_only]\n use sui::test_scenario;\n #[test_only]\n use sui::test_scenario::Scenario;\n\n public entry fun run(dapps: &mut Dapps, clock: &Clock, ctx: &mut TxContext) {\n // Register the dapp to dubhe.\n dapps_system::register<DappKey>(\n dapps,\n ascii::string(b\"${config.name}\"),\n ascii::string(b\"${config.description}\"),\n clock,\n ctx\n );\n ${Object.keys(config.schemas)\n\t\t\t.map(schemaName => {\n\t\t\t\treturn `let ${schemaName} = ${config.name}::${schemaName}_schema::register(dapps, ctx);`;\n\t\t\t})\n\t\t\t.join('\\n')}\n // Logic that needs to be automated once the contract is deployed\n\n\n // Share the dapp object with the public\n ${Object.keys(config.schemas)\n\t\t\t.map(schemaName => {\n\t\t\t\treturn `public_share_object(${schemaName});`;\n\t\t\t})\n\t\t\t.join('\\n')}\n }\n\n #[test_only]\n public fun deploy_hook_for_testing(): (Scenario, Dapps) {\n let mut scenario = test_scenario::begin(@0xA);\n {\n let ctx = test_scenario::ctx(&mut scenario);\n dapps_schema::init_dapps_for_testing(ctx);\n test_scenario::next_tx(&mut scenario,@0xA);\n };\n let mut dapps = test_scenario::take_shared<Dapps>(&scenario);\n let ctx = test_scenario::ctx(&mut scenario);\n let clock = clock::create_for_testing(ctx);\n run(&mut dapps, &clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(&mut scenario,@0xA);\n (scenario, dapps)\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n\tconsole.log('āœ… Deploy Hook Generation Complete\\n');\n}\n\nexport function generateMigrate(config: DubheConfig, srcPrefix: string) {\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::migrate {\n use dubhe::world::{World, AdminCap};\n\n /// Not the right admin for this world\n const ENotAdmin: u64 = 0;\n const EWrongVersion: u64 = 1;\n const ENotUpgrade: u64 = 2;\n const VERSION: u64 = 1;\n\n public entry fun run(world: &mut World, admin_cap: &AdminCap) {\n assert!(world.admin() == object::id(admin_cap), ENotAdmin);\n assert!(world.version() < VERSION, ENotUpgrade);\n *dubhe::world::mut_version(world, admin_cap) = VERSION;\n }\n\n public fun assert_version(world: &World){\n assert!(world.version() == VERSION, EWrongVersion);\n }\n}\n`;\n\t\tformatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nšŸ”‘ Starting DappKey Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`\n\t);\n\n\tlet code = `module ${config.name}::dapp_key {\n\\t/// Authorization token for the app.\n\\tpublic struct DappKey has drop {}\n\n\\tpublic(package) fun new(): DappKey {\n\\t\\tDappKey { }\n\\t}\n}\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('āœ… DappKey Generation Complete\\n');\n}\n","import { findUp } from \"find-up\";\nimport path from \"path\";\nimport esbuild from \"esbuild\";\nimport { NotInsideProjectError } from \"./errors\";\nimport { rmSync } from \"fs\";\nimport { pathToFileURL } from \"url\";\nimport os from \"os\";\n\n// In order of preference files are checked\nconst configFiles = [\n \"dubhe.config.js\",\n \"dubhe.config.mjs\",\n \"dubhe.config.ts\",\n \"dubhe.config.mts\",\n];\nconst TEMP_CONFIG = \"dubhe.config.example.mjs\";\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: \"esm\",\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: \"node\",\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: \"external\",\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(\n configPath: string | undefined,\n toFileURL?: boolean\n) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === \"win32\"\n ? pathToFileURL(configPath).href\n : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","\nexport class NotInsideProjectError extends Error {\nname = \"NotInsideProjectError\";\nmessage = \"You are not inside a Dubhe project\";\n}"],"mappings":"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","names":["prettier","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","formatMove","schemaPrefix","deployHookPrefix","code","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","getStructAttrs","values","key","_","getStructTypes","values","_","type","getStructAttrsWithType","key","getStructAttrsQuery","existsSync","generateSystem","config","srcPrefix","systemName","code","formatAndWriteMove","generateToml","config","srcPrefix","frameworkId","code","formatAndWriteMove","capitalizeAndRemoveUnderscores","input","word","index","renderSetAttrsFunc","schemaName","fields","key","type","renderSetFunc","getStructAttrsWithType","fieldName","renderGetAllFunc","getStructTypes","getStructAttrsQuery","renderGetAttrsFunc","convertToSnakeCase","generateSchemaData","projectName","schemas","path","schema","item","code","enumNames","field","name","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","schemaMoudle","value","storage_type","all_types","para_key","para_value","borrow_key","extra_code","existsSync","generateDeployHook","config","srcPrefix","code","schemaName","formatAndWriteMove","generateDappKey","config","srcPrefix","code","formatAndWriteMove","matchFrameworkId","network","schemaGen","config","srcPrefix","frameworkId","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSystem","generateSchemaData","generateSchemaStructure","generateDappKey","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError"]}
1
+ {"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/schemaGen.ts","../src/codegen/utils/renderMove/common.ts","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateSchema.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.ts","../src/codegen/utils/renderMove/generateEvent.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateSchemaHub.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(\n\tcontent: string,\n\tprettierConfigPath?: string\n): Promise<string> {\n\tlet config;\n\tif (prettierConfigPath) {\n\t\tconfig = await prettier.resolveConfig(prettierConfigPath);\n\t}\n\ttry {\n\t\treturn prettier.format(content, {\n\t\t\tplugins: [prettierPluginMove],\n\t\t\tparser: 'move-parse',\n\t\t\tprintWidth: 120,\n\t\t\tsemi: true,\n\t\t\ttabWidth: 2,\n\t\t\tuseTabs: false,\n\t\t\tbracketSpacing: true,\n\t\t\t...config,\n\t\t});\n\t} catch (error) {\n\t\tlet message;\n\t\tif (error instanceof Error) {\n\t\t\tmessage = error.message;\n\t\t} else {\n\t\t\tmessage = error;\n\t\t}\n\t\tconsole.log(`Error during output formatting: ${message}`);\n\t\treturn content;\n\t}\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n\treturn prettier.format(content, {\n\t\tparser: 'typescript',\n\t});\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { formatMove, formatTypescript } from \"./format\";\nimport { debug } from \"../debug\";\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = await formatMove(output);\n let schemaPrefix =\n` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: MIT\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `\n\n let deployHookPrefix = `#[allow(lint(share_owned))]\n \n `\n\n let code = schemaPrefix + formattedOutput\n\n if (fullOutputPath.includes(\".toml\") || fullOutputPath.includes(\"system\") || fullOutputPath.includes(\"migrate\")) {\n code = formattedOutput\n } else if (fullOutputPath.includes(\"deploy_hook\")) {\n code = deployHookPrefix + formattedOutput\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string,\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from \"debug\";\n\nexport const debug = createDebug(\"dubhe:common\");\nexport const error = createDebug(\"dubhe:common\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"codegen\");\nexport const error = parentDebug.extend(\"codegen\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","/**\n * Explicitly normalize a given path to a posix path (using `/` as separator).\n * This should be used for generating Solidity files that will be consumed by solc,\n * because solc expects `/` as path separator, but path.join produces `\\` if the user is on windows.\n */\nexport function posixPath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n","import { SchemaType, DubheConfig } from '../../types';\nimport { rmdirSync, existsSync } from 'fs';\nimport { deleteFolderRecursive } from './common';\nimport { generateToml } from './generateToml';\nimport { generateSchemaData, generateSchemaStructure } from './generateSchema';\nimport { generateDeployHook, generateMigrate } from './generateScript';\nimport { generateDappKey } from './generateDappKey';\nimport {generateSchemaEvent} from \"./generateEvent\";\nimport { generateSystem } from './generateSystem';\nimport { generateSchemaHub } from './generateSchemaHub';\n\nfunction matchFrameworkId(\n\tnetwork: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n): string {\n\tswitch (network) {\n\t\tcase 'testnet':\n\t\t\treturn '0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6';\n\t\tcase 'localnet':\n\t\t\treturn '0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6';\n\t\tdefault:\n\t\t\treturn '0x417ad1864a56a29ad0b5aaddd2e11bac1eeab6a68883ef53184a4cc5c293fec6';\n\t}\n}\n\nexport async function schemaGen(\n\tconfig: DubheConfig,\n\tsrcPrefix?: string,\n\tnetwork?: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n\tframeworkId?: string\n) {\n\tconsole.log('\\nšŸš€ Starting Schema Generation Process...');\n\tconsole.log('šŸ“‹ Project Configuration:');\n\tconsole.log(` ā”œā”€ Name: ${config.name}`);\n\tconsole.log(\n\t\t` ā”œā”€ Description: ${config.description || 'No description provided'}`\n\t);\n\tconsole.log(` ā”œā”€ Network: ${network || 'testnet'}`);\n\tconsole.log(\n\t\t` └─ Framework ID: ${\n\t\t\tframeworkId || matchFrameworkId(network ?? 'testnet')\n\t\t}\\n`\n\t);\n\n\tconst path = srcPrefix ?? process.cwd();\n\n\tframeworkId = frameworkId || matchFrameworkId(network ?? 'testnet');\n\n\tif (existsSync(`${path}/contracts/${config.name}`)) {\n\t\tdeleteFolderRecursive(\n\t\t\t`${path}/contracts/${config.name}/sources/codegen`\n\t\t);\n\t}\n\n\tif (!existsSync(`${path}/contracts/${config.name}/Move.toml`)) {\n\t\tawait generateToml(config, path, frameworkId);\n\t}\n\n\tif (\n\t\t!existsSync(\n\t\t\t`${path}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t\t)\n\t) {\n\t\tawait generateDeployHook(config, path);\n\t}\n\n\tawait generateSchemaData(config.name, config.schemas, path);\n\tawait generateSchemaStructure(config.name, config.schemas, path, config.migration_enabled);\n\tawait generateSchemaEvent(config.name, config.schemas, path);\n\tawait generateDappKey(config, path);\n\tawait generateSchemaHub(config, path);\n\tawait generateSystem(config, path);\n\tif (config.migration_enabled) {\n\t\tawait generateMigrate(config, path);\n\t}\n\tconsole.log('āœ… Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n\tif (fs.existsSync(path)) {\n\t\tfs.readdirSync(path).forEach(file => {\n\t\t\tconst curPath = `${path}/${file}`;\n\t\t\tif (fs.lstatSync(curPath).isDirectory()) {\n\t\t\t\tdeleteFolderRecursive(curPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(curPath);\n\t\t\t}\n\t\t});\n\t\tfs.rmdirSync(path);\n\t}\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n\treturn input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(\n\tvalues: Record<string, string> | string\n): string {\n\treturn Object.entries(values)\n\t\t.map(([key, _]) => `${key}`)\n\t\t.join(',');\n}\n\nfunction isAddress(str: string): boolean {\n\tconst regex = /^0x[a-fA-F0-9]+$/;\n\treturn regex.test(str);\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaType): string {\nexport function getStructTypes(\n\tvalues: Record<string, string>\n): string {\n\treturn `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(\n\tvalues: Record<string, string>\n): string[] {\n\treturn Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(\n\tvalues: Record<string, string>,\n): string[] {\n\treturn Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateToml(\n\tconfig: DubheConfig,\n\tsrcPrefix: string,\n\tframeworkId: string\n) {\n\tconsole.log('\\nšŸ“„ Starting Move.toml Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/Move.toml`\n\t);\n\n\tlet code = `[package]\nname = \"${config.name}\"\nversion = \"0.0.1\"\nedition = \"2024.beta\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.36.2\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe-framework.git\", rev = \"release-dubhe-v1.0.0-rc1\" }\n\n[addresses]\nsui = \"0x2\"\ndubhe = \"${frameworkId}\"\n${config.name} = \"0x0\"\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/Move.toml`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('āœ… Move.toml Generation Complete\\n');\n}\n","import { BaseType, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\n\nexport function capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nexport function renderSetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([key, type]) =>\n\t\t\t\t`public(package) fun set_${key}(self: &mut ${schemaName}, ${key}: ${type}) {\n self.${key} = ${key};\n }`\n\t\t)\n\t\t.join('\\n');\n}\n\nexport function renderSetFunc(\n\tschemaName: string,\n\tfields: Record<string, string>\n): string {\n\treturn `public(package) fun set(self: &mut ${schemaName}, ${getStructAttrsWithType(\n\t\tfields\n\t)}) {\n ${Object.entries(fields)\n\t\t\t\t.map(([fieldName]) => `self.${fieldName} = ${fieldName};`)\n\t\t\t\t.join('\\n')}\n }`;\n}\n\nexport function renderGetAllFunc(\n\tschemaName: string,\n\tfields: Record<string, string>\n): string {\n\treturn `public fun get(self: &${schemaName}): ${getStructTypes(fields)} {\n (${getStructAttrsQuery(fields)})\n }`;\n}\n\nexport function renderGetAttrsFunc(\n\tschemaName: string,\n\tfields: BaseType | Record<string, BaseType>\n): string {\n\treturn Object.entries(fields)\n\t\t.map(\n\t\t\t([\n\t\t\t\tkey,\n\t\t\t\ttype,\n\t\t\t]) => `public fun get_${key}(self: &${schemaName}): ${type} {\n self.${key}\n }`\n\t\t)\n\t\t.join('\\n');\n}\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nexport async function generateSchemaData(\n\tprojectName: string,\n\tschemas: Record<string, SchemaType>,\n\tpath: string\n) {\n\tconsole.log('\\nšŸ“¦ Starting Schema Data Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconst schema = schemas[schemaName];\n\t\tif (schema.data) {\n\t\t\tconsole.log(` ā”œā”€ Processing schema: ${schemaName}`);\n\t\t\tfor (const item of schema.data) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${item.name} ${\n\t\t\t\t\t\tArray.isArray(item.fields) ? '(enum)' : '(struct)'\n\t\t\t\t\t}`\n\t\t\t\t);\n\t\t\t\tlet code = '';\n\n\t\t\t\tconst enumNames = schema.data\n\t\t\t\t\t.filter(item => Array.isArray(item.fields))\n\t\t\t\t\t.map(item => item.name);\n\n\t\t\t\tif (Array.isArray(item.fields)) {\n\t\t\t\t\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name\n\t\t\t\t\t)} {\n public enum ${item.name} has copy, drop , store {\n ${item.fields}\n }\n \n ${item.fields\n\t\t\t\t\t\t\t.map((field: string) => {\n\t\t\t\t\t\t\t\treturn `public fun new_${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\tfield\n\t\t\t\t\t\t\t\t)}(): ${item.name} {\n ${item.name}::${field}\n }`;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.join('')}`;\n\t\t\t\t} else {\n\t\t\t\t\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name\n\t\t\t\t\t)} {\n use std::ascii::String;\n ${enumNames\n\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\tname =>\n\t\t\t\t\t\t\t\t\t\t`use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\t\t\t\t\t\tname\n\t\t\t\t\t\t\t\t\t\t)}::${name};`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.join('\\n')}\n\n public struct ${item.name} has copy, drop , store {\n ${getStructAttrsWithType(item.fields)}\n }\n \n public fun new(${getStructAttrsWithType(\n\t\t\t\t\t\t\t\titem.fields\n\t\t\t\t\t\t\t)}): ${item.name} {\n ${item.name} {\n ${getStructAttrs(item.fields)}\n }\n }\n \n ${renderGetAllFunc(item.name, item.fields)}\n ${renderGetAttrsFunc(item.name, item.fields)}\n ${renderSetAttrsFunc(item.name, item.fields)}\n ${renderSetFunc(item.name, item.fields)}\n }`;\n\t\t\t\t}\n\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name\n\t\t\t\t\t)}.move`,\n\t\t\t\t\t'formatAndWriteMove'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tconsole.log('āœ… Schema Data Generation Complete\\n');\n}\n\nfunction generateImport(\n\tprojectName: string,\n\tschemaName: string,\n\tschema: SchemaType\n) {\n\tif (schema.data) {\n\t\treturn schema.data\n\t\t\t.map(item => {\n\t\t\t\treturn `use ${projectName}::${schemaName}_${convertToSnakeCase(\n\t\t\t\t\titem.name\n\t\t\t\t)}::${item.name};`;\n\t\t\t})\n\t\t\t.join('\\n');\n\t} else {\n\t\treturn '';\n\t}\n}\n\nexport async function generateSchemaStructure(\n\tprojectName: string,\n\tschemas: Record<string, SchemaType>,\n\tpath: string,\n\tmigration_enabled: boolean\n) {\n\tconsole.log('\\nšŸ”Ø Starting Schema Structure Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconsole.log(` ā”œā”€ Generating schema: ${schemaName}`);\n\t\tconsole.log(\n\t\t\t` ā”œā”€ Output path: ${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`\n\t\t);\n\t\tconsole.log(\n\t\t\t` └─ Structure fields: ${\n\t\t\t\tObject.keys(schemas[schemaName].structure).length\n\t\t\t}`\n\t\t);\n\t\tconst schema = schemas[schemaName];\n\t\tconst schemaMoudle = `module ${projectName}::${schemaName}_schema {\n use std::ascii::String;\n use std::ascii::string;\n use sui::package::UpgradeCap;\n use std::type_name;\n use dubhe::dapps_system;\n use dubhe::storage_migrate;\n use dubhe::dapps_schema::Dapps;\n use dubhe::storage_value::{Self, StorageValue};\n use dubhe::storage_map::{Self, StorageMap};\n use dubhe::storage_double_map::{Self, StorageDoubleMap};\n use ${projectName}::dapp_key::DappKey;\n use sui::dynamic_field as df;\n ${generateImport(projectName, schemaName, schema)}\n\n public struct ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)} has key, store {\n id: UID\n\t\t\t\t\t\t\t\t\t\t\t} \n \n ${Object.entries(schema.structure)\n\t\t\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t\t\treturn `public fun borrow_${key}(self: &${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\t\t\t\tschemaName\n\t\t\t\t\t\t\t\t)}) : &${value} {\n storage_migrate::borrow_field(&self.id, b\"${key}\")\n }\n \n public(package) fun borrow_mut_${key}(self: &mut ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)}): &mut ${value} {\n storage_migrate::borrow_mut_field(&mut self.id, b\"${key}\")\n }\n `;\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.join('')} \n \n \n public(package) fun create(ctx: &mut TxContext): ${capitalizeAndRemoveUnderscores(\n\t\t\t\t\t\tschemaName\n\t\t\t\t\t)} {\n let mut id = object::new(ctx);\n ${Object.entries(schema.structure)\n\t\t\t\t\t\t\t\t\t\t\t.map(([key, value]) => {\n\t\t\t\t\t\t\t\t\t\t\t\tlet storage_type = '';\n\t\t\t\t\t\t\t\t\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_value::new()`;\n\t\t\t\t\t\t\t\t\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_map::new()`;\n\t\t\t\t\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue.includes('StorageDoubleMap')\n\t\t\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tstorage_type = `storage_double_map::new()`;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn `storage_migrate::add_field<${value}>(&mut id, b\"${key}\", ${storage_type});`\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t.join('')}\n \n ${capitalizeAndRemoveUnderscores(schemaName)} { id }\n }\n \n ${ migration_enabled ? `public fun migrate(_${schemaName}: &mut ${capitalizeAndRemoveUnderscores(schemaName)}, _cap: &UpgradeCap) { }`\n\t\t\t\t\t : \"\"\n\t\t\t\t\t\t\t\t\t\t}\n \n \n // ======================================== View Functions ========================================\n ${Object.entries(schema.structure)\n\t\t\t.map(([key, value]) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tlet all_types = value.match(/<(.+)>/)[1].split(',').map(type => type.trim())\n\t\t\t\tlet para_key: string[] = []\n\t\t\t\tlet para_value = \"\"\n\t\t\t\tlet borrow_key = \"\"\n\t\t\t\tlet extra_code = \"\"\n\t\t\t\tif (value.includes('StorageValue')) {\n\t\t\t\t\tpara_key = []\n\t\t\t\t\tpara_value = `${all_types[0]}`\n\t\t\t\t\tborrow_key = 'try_get()'\n\t\t\t\t} else if (value.includes('StorageMap')) {\n\t\t\t\t\tpara_key = [`key: ${all_types[0]}`]\n\t\t\t\t\tpara_value = `${all_types[1]}`\n\t\t\t\t\tborrow_key = 'try_get(key)'\n\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[0]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[1]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().values()\n\t\t\t\t\t\t\t\t}`\n\t\t\t\t} else if (value.includes('StorageDoubleMap')) {\n\t\t\t\t\tpara_key = [`key1: ${all_types[0]}`, `key2: ${all_types[1]}`]\n\t\t\t\t\tpara_value = `${all_types[2]}`\n\t\t\t\t\tborrow_key = 'try_get(key1, key2)'\n\t\t\t\t\textra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : (vector<${all_types[0]}>, vector<${all_types[1]}>) {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().keys()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tpublic fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[2]}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().values()\n\t\t\t\t\t\t\t\t}`\n\t\t\t\t}\n\t\t\t\treturn `public fun get_${key}(self: &${capitalizeAndRemoveUnderscores(schemaName)}, ${para_key}) : Option<${para_value}> {\n\t\t\t\t\t\t\t\t\tself.borrow_${key}().${borrow_key}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t` + extra_code;\n\t\t\t})\n\t\t\t.join('')} \n // =========================================================================================================\n \n \n }`;\n\t\tawait formatAndWriteMove(\n\t\t\tschemaMoudle,\n\t\t\t`${path}/contracts/${projectName}/sources/codegen/schemas/${schemaName}.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n\tconsole.log('āœ… Schema Structure Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nexport async function generateDeployHook(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nšŸ“ Starting Deploy Hook Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t);\n\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::deploy_hook {\n use dubhe::dapps_schema::Dapps;\n use dubhe::dapps_system;\n use ${config.name}::schema_hub::SchemaHub;\n use std::ascii::string;\n use sui::clock::Clock;\n use sui::package::UpgradeCap;\n use sui::transfer::public_share_object;\n ${Object.keys(config.schemas).map(schemaName => {\n\t\t\treturn `use ${config.name}::${schemaName}_schema::${capitalizeAndRemoveUnderscores(schemaName)};`}).join('\\n')\n\t\t}\n #[test_only]\n use sui::clock;\n #[test_only]\n use sui::test_scenario;\n #[test_only]\n use sui::package;\n #[test_only]\n use ${config.name}::schema_hub; \n #[test_only]\n use dubhe::dapps_schema;\n #[test_only]\n use sui::test_scenario::Scenario;\n\n public entry fun run(schema_hub: &mut SchemaHub, dapps: &mut Dapps, cap: &UpgradeCap, clock: &Clock, ctx: &mut TxContext) {\n // Register the dapp to dubhe.\n dapps_system::register(dapps,cap,string(b\"${config.name}\"),string(b\"${config.description}\"),clock,ctx);\n // Create schemas\n ${Object.keys(config.schemas).map(schemaName => {\n\t\t\t\treturn `let ${schemaName} = ${config.name}::${schemaName}_schema::create(ctx);`;\n\t\t\t}).join('\\n')}\n // Logic that needs to be automated once the contract is deployed\n\t\t\t\t${`\\n`}\n\t\t\t\t${`\\n`}\n\t\t\t\t\n // Authorize schemas and public share objects\n ${Object.keys(config.schemas).map(schemaName => {\n\t\t\t\t return `\n\t\t\t\t schema_hub.authorize_schema<${capitalizeAndRemoveUnderscores(schemaName)}>();\n\t\t\t\t public_share_object(${schemaName});\n\t\t\t\t `;\n\t\t\t}).join('\\n')}\n }\n\n #[test_only]\n public fun deploy_hook_for_testing(): (Scenario, SchemaHub, 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 schema_hub::init_schema_hub_for_testing(ctx);\n test_scenario::next_tx(&mut scenario,@0xA);\n };\n let mut dapps = test_scenario::take_shared<Dapps>(&scenario);\n let mut schema_hub = test_scenario::take_shared<SchemaHub>(&scenario);\n let ctx = test_scenario::ctx(&mut scenario);\n let clock = clock::create_for_testing(ctx);\n let upgrade_cap = package::test_publish(@0x42.to_id(), ctx);\n run(&mut schema_hub, &mut dapps, &upgrade_cap, &clock, ctx);\n\n clock::destroy_for_testing(clock);\n upgrade_cap.make_immutable();\n test_scenario::next_tx(&mut scenario,@0xA);\n (scenario, schema_hub, dapps)\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/deploy_hook.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n\tconsole.log('āœ… Deploy Hook Generation Complete\\n');\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n\tif (\n\t\t!existsSync(\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`\n\t\t)\n\t) {\n\t\tlet code = `module ${config.name}::migrate {\n const ON_CHAIN_VERSION: u32 = 0;\n\n public fun on_chain_version(): u32 {\n ON_CHAIN_VERSION\n }\n}\n`;\n\t\tawait formatAndWriteMove(\n\t\t\tcode,\n\t\t\t`${srcPrefix}/contracts/${config.name}/sources/script/migrate.move`,\n\t\t\t'formatAndWriteMove'\n\t\t);\n\t}\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nšŸ”‘ Starting DappKey Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`\n\t);\n\n\tlet code = `module ${config.name}::dapp_key {\n\\t/// Authorization token for the app.\n\\tpublic struct DappKey has drop {}\n\n\\tpublic(package) fun new(): DappKey {\n\\t\\tDappKey { }\n\\t}\n}\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/sources/codegen/dapp_key.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('āœ… DappKey Generation Complete\\n');\n}\n","import { BaseType, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n\tgetStructAttrsWithType,\n\tgetStructAttrs,\n\tgetStructTypes,\n\tgetStructAttrsQuery,\n} from './common';\n\nfunction capitalizeAndRemoveUnderscores(input: string): string {\n\treturn input\n\t\t.split('_')\n\t\t.map((word, index) => {\n\t\t\treturn index === 0\n\t\t\t\t? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n\t\t\t\t: word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n\t\t})\n\t\t.join('');\n}\n\nfunction convertToSnakeCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, '_$1')\n\t\t.toLowerCase()\n\t\t.replace(/^_/, '');\n}\n\nexport async function generateSchemaEvent(\n\tprojectName: string,\n\tschemas: Record<string, SchemaType>,\n\tpath: string\n) {\n\tconsole.log('\\nšŸ“¦ Starting Schema Event Generation...');\n\tfor (const schemaName in schemas) {\n\t\tconst schema = schemas[schemaName];\n\t\tif (schema.events) {\n\t\t\tconsole.log(` ā”œā”€ Processing schema: ${schemaName}`);\n\t\t\tfor (const item of schema.events) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t` └─ Generating ${item.name} ${\n\t\t\t\t\t\tArray.isArray(item.fields) ? '(enum)' : '(struct)'\n\t\t\t\t\t}`\n\t\t\t\t);\n\n\t\t\t\tlet\tcode = `module ${projectName}::${schemaName}_${convertToSnakeCase(item.name)}_event {\n\t\t\t\t\t\tuse sui::event;\n\t\t\t\t\t\tuse std::ascii::String;\n public struct ${item.name}Event has copy, drop {\n ${getStructAttrsWithType(item.fields as Record<string, string>)}\n }\n \n public fun new(${getStructAttrsWithType(item.fields as Record<string, string>)}): ${item.name}Event {\n ${item.name}Event {\n ${getStructAttrs(item.fields as Record<string, string>)}\n }\n }\n \n public fun emit(${getStructAttrsWithType(item.fields as Record<string, string>)}) {\n event::emit(${item.name}Event {\n ${getStructAttrs(item.fields as Record<string, string>)}\n });\n }`;\n\t\t\t\tawait formatAndWriteMove(\n\t\t\t\t\tcode,\n\t\t\t\t\t`${path}/contracts/${projectName}/sources/codegen/events/${schemaName}_${convertToSnakeCase(\n\t\t\t\t\t\titem.name\n\t\t\t\t\t)}_event.move`,\n\t\t\t\t\t'formatAndWriteMove'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\tconsole.log('āœ… Schema Event Generation Complete\\n');\n}","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateSystem(config: DubheConfig, srcPrefix: string) {\n\tconsole.log('\\nāš™ļø Starting System Generation...');\n\t\tconsole.log(` ā”œā”€ Generating systems`);\n\t\tconsole.log(\n\t\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/systems`\n\t\t);\n\n\t\tif (\n\t\t\t!existsSync(\n\t\t\t\t`${srcPrefix}/contracts/${config.name}/sources/systems`\n\t\t\t)\n\t\t) {\n\t\t\tawait fs.mkdir(`${srcPrefix}/contracts/${config.name}/sources/systems`, { recursive: true })\n\t\t}\n\tconsole.log('āœ… System Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateSchemaHub(\n\tconfig: DubheConfig,\n\tsrcPrefix: string\n) {\n\tconsole.log('\\nšŸ”‘ Starting DappKey Generation...');\n\tconsole.log(\n\t\t` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/schema_hub.move`\n\t);\n\n\tlet code = `module ${config.name}::schema_hub {\n use sui::transfer::public_share_object;\n use sui::dynamic_field as df;\n\n public struct SchemaHub has key, store {\n id: UID,\n admin: address,\n }\n \n public struct SchemaTypeWapper<phantom Schema: key + store> has copy, store, drop {}\n\n /// Authorize an schema to access protected features of the SchemaHub.\n public(package) fun authorize_schema<Schema: key + store>(self: &mut SchemaHub) {\n df::add(&mut self.id, SchemaTypeWapper<Schema> {}, true);\n }\n\n /// Deauthorize an schema by removing its authorization key.\n public(package) fun deauthorize_schema<Schema: key + store>(self: &mut SchemaHub) {\n df::remove<SchemaTypeWapper<Schema>, bool>(&mut self.id, SchemaTypeWapper<Schema> {});\n }\n\n /// Check if an schema is authorized to access protected features of\n /// the SchemaHub.\n public fun is_schema_authorized<Schema: key + store>(self: &SchemaHub): bool {\n df::exists_(&self.id, SchemaTypeWapper<Schema> {})\n }\n\n /// Assert that an schema is authorized to access protected features of\n /// the SchemaHub. Aborts with \\`EAppNotAuthorized\\` if not.\n public fun ensure_schema_authorized<Schema: key + store>(self: &SchemaHub) {\n assert!(self.is_schema_authorized<Schema>(), 0);\n }\n\n fun init(ctx: &mut TxContext) {\n public_share_object(SchemaHub {\n id: object::new(ctx),\n admin: ctx.sender(),\n });\n }\n\n #[test_only]\n public fun init_schema_hub_for_testing(ctx: &mut TxContext) {\n init(ctx);\n }\n}\n`;\n\tawait formatAndWriteMove(\n\t\tcode,\n\t\t`${srcPrefix}/contracts/${config.name}/sources/codegen/schema_hub.move`,\n\t\t'formatAndWriteMove'\n\t);\n\tconsole.log('āœ… DappKey Generation Complete\\n');\n}\n","import { findUp } from \"find-up\";\nimport path from \"path\";\nimport esbuild from \"esbuild\";\nimport { NotInsideProjectError } from \"./errors\";\nimport { rmSync } from \"fs\";\nimport { pathToFileURL } from \"url\";\nimport os from \"os\";\n\n// In order of preference files are checked\nconst configFiles = [\n \"dubhe.config.js\",\n \"dubhe.config.mjs\",\n \"dubhe.config.ts\",\n \"dubhe.config.mts\",\n];\nconst TEMP_CONFIG = \"dubhe.config.example.mjs\";\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: \"esm\",\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: \"node\",\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: \"external\",\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(\n configPath: string | undefined,\n toFileURL?: boolean\n) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === \"win32\"\n ? pathToFileURL(configPath).href\n : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","\nexport class NotInsideProjectError extends Error {\nname = \"NotInsideProjectError\";\nmessage = \"You are not inside a Dubhe project\";\n}"],"mappings":"AAAA,OAAOA,MAAc,WACrB,OAAOC,MAAwB,0BAE/B,eAAsBC,EACrBC,EACAC,EACkB,CAClB,IAAIC,EACAD,IACHC,EAAS,MAAML,EAAS,cAAcI,CAAkB,GAEzD,GAAI,CACH,OAAOJ,EAAS,OAAOG,EAAS,CAC/B,QAAS,CAACF,CAAkB,EAC5B,OAAQ,aACR,WAAY,IACZ,KAAM,GACN,SAAU,EACV,QAAS,GACT,eAAgB,GAChB,GAAGI,CACJ,CAAC,CACF,OAASC,EAAP,CACD,IAAIC,EACJ,OAAID,aAAiB,MACpBC,EAAUD,EAAM,QAEhBC,EAAUD,EAEX,QAAQ,IAAI,mCAAmCC,GAAS,EACjDJ,CACR,CACD,CAEA,eAAsBK,EAAiBL,EAAkC,CACxE,OAAOH,EAAS,OAAOG,EAAS,CAC/B,OAAQ,YACT,CAAC,CACF,CCtCA,OAAOM,MAAQ,mBACf,OAAOC,MAAU,YCDjB,OAAOC,MAAiB,QAEjB,IAAMC,EAAQD,EAAY,cAAc,EAClCE,EAAQF,EAAY,cAAc,EAG/CC,EAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,EAGtCC,EAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,ECP/B,IAAMC,EAAQA,EAAY,OAAO,SAAS,EACpCC,EAAQD,EAAY,OAAO,SAAS,EAGjDA,EAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,EAGtCC,EAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,EFJtC,eAAsBC,EACpBC,EACAC,EACAC,EACe,CACf,IAAMC,EAAkB,MAAMC,EAAWJ,CAAM,EAC3CK,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQMC,EAAmB;AAAA;AAAA,IAInBC,EAAOF,EAAeF,EAEtBF,EAAe,SAAS,OAAO,GAAKA,EAAe,SAAS,QAAQ,GAAKA,EAAe,SAAS,SAAS,EAC5GM,EAAOJ,EACEF,EAAe,SAAS,aAAa,IAC9CM,EAAOD,EAAmBH,GAG5B,MAAMK,EAAG,MAAMC,EAAK,QAAQR,CAAc,EAAG,CAAE,UAAW,EAAK,CAAC,EAChE,MAAMO,EAAG,UAAUP,EAAgBM,CAAI,EACvCG,EAAM,GAAGR,MAAcD,GAAgB,CACzC,CAQA,eAAsBU,GAClBX,EACAC,EACAC,EACa,CACf,IAAMC,EAAkB,MAAMS,EAAiBZ,CAAM,EAErD,MAAMQ,EAAG,MAAMC,EAAK,QAAQR,CAAc,EAAG,CAAE,UAAW,EAAK,CAAC,EAEhE,MAAMO,EAAG,UAAUP,EAAgBE,CAAe,EAClDO,EAAM,GAAGR,MAAcD,GAAgB,CACzC,CGjDO,SAASY,GAAUC,EAAsB,CAC9C,OAAOA,EAAK,QAAQ,MAAO,GAAG,CAChC,CCNA,OAAoB,cAAAC,MAAkB,KCAtC,OAAOC,MAAQ,KAER,SAASC,EAAsBC,EAAc,CAC/CF,EAAG,WAAWE,CAAI,IACrBF,EAAG,YAAYE,CAAI,EAAE,QAAQC,GAAQ,CACpC,IAAMC,EAAU,GAAGF,KAAQC,IACvBH,EAAG,UAAUI,CAAO,EAAE,YAAY,EACrCH,EAAsBG,CAAO,EAE7BJ,EAAG,WAAWI,CAAO,CAEvB,CAAC,EACDJ,EAAG,UAAUE,CAAI,EAEnB,CAYO,SAASG,EACfC,EACS,CACT,OAAO,OAAO,QAAQA,CAAM,EAC1B,IAAI,CAAC,CAACC,EAAKC,CAAC,IAAM,GAAGD,GAAK,EAC1B,KAAK,GAAG,CACX,CAaO,SAASE,EACfC,EACS,CACT,MAAO,IAAI,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACC,EAAGC,CAAI,IAAM,GAAGA,GAAM,IAC/D,CAOO,SAASC,EACfH,EACW,CACX,OAAO,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACI,EAAKF,CAAI,IAAM,GAAGE,MAAQF,GAAM,CACrE,CAMO,SAASG,EACfL,EACW,CACX,OAAO,OAAO,QAAQA,CAAM,EAAE,IAAI,CAAC,CAACI,EAAKH,CAAC,IAAM,QAAQG,GAAK,CAC9D,CCpEA,eAAsBE,EACrBC,EACAC,EACAC,EACC,CACD,QAAQ,IAAI;AAAA,2CAAuC,EACnD,QAAQ,IACP,+BAAqBD,eAAuBD,EAAO,gBACpD,EAEA,IAAIG,EAAO;AAAA,UACFH,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAUNE;AAAA,EACTF,EAAO;AAAA,EAER,MAAMI,EACLD,EACA,GAAGF,eAAuBD,EAAO,iBACjC,oBACD,EACA,QAAQ,IAAI;AAAA,CAAmC,CAChD,CCxBO,SAASK,EAA+BC,EAAuB,CACrE,OAAOA,EACL,MAAM,GAAG,EACT,IAAI,CAACC,EAAMC,IAERD,EAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,CAAC,EAAE,YAAY,CAE5D,EACA,KAAK,EAAE,CACV,CAEO,SAASE,EACfC,EACAC,EACS,CACT,OAAO,OAAO,QAAQA,CAAM,EAC1B,IACA,CAAC,CAACC,EAAKC,CAAI,IACV,2BAA2BD,gBAAkBF,MAAeE,MAAQC;AAAA,+BACzCD,OAASA;AAAA,sBAEtC,EACC,KAAK;AAAA,CAAI,CACZ,CAEO,SAASE,EACfJ,EACAC,EACS,CACT,MAAO,sCAAsCD,MAAeK,EAC3DJ,CACD;AAAA,cACa,OAAO,QAAQA,CAAM,EAC9B,IAAI,CAAC,CAACK,CAAS,IAAM,QAAQA,OAAeA,IAAY,EACxD,KAAK;AAAA,CAAI;AAAA,cAEd,CAEO,SAASC,GACfP,EACAC,EACS,CACT,MAAO,yBAAyBD,OAAgBQ,EAAeP,CAAM;AAAA,WAC3DQ,EAAoBR,CAAM;AAAA,MAErC,CAEO,SAASS,GACfV,EACAC,EACS,CACT,OAAO,OAAO,QAAQA,CAAM,EAC1B,IACA,CAAC,CACAC,EACAC,CACD,IAAM,kBAAkBD,YAAcF,OAAgBG;AAAA,2CACdD;AAAA,kCAEzC,EACC,KAAK;AAAA,CAAI,CACZ,CAEA,SAASS,EAAmBf,EAAuB,CAClD,OAAOA,EACL,QAAQ,WAAY,KAAK,EACzB,YAAY,EACZ,QAAQ,KAAM,EAAE,CACnB,CAEA,eAAsBgB,EACrBC,EACAC,EACAC,EACC,CACD,QAAQ,IAAI;AAAA,6CAAyC,EACrD,QAAWf,KAAcc,EAAS,CACjC,IAAME,EAASF,EAAQd,CAAU,EACjC,GAAIgB,EAAO,KAAM,CAChB,QAAQ,IAAI,qCAA2BhB,GAAY,EACnD,QAAWiB,KAAQD,EAAO,KAAM,CAC/B,QAAQ,IACP,gCAAsBC,EAAK,QAC1B,MAAM,QAAQA,EAAK,MAAM,EAAI,SAAW,YAE1C,EACA,IAAIC,EAAO,GAELC,EAAYH,EAAO,KACvB,OAAOC,GAAQ,MAAM,QAAQA,EAAK,MAAM,CAAC,EACzC,IAAIA,GAAQA,EAAK,IAAI,EAEnB,MAAM,QAAQA,EAAK,MAAM,EAC5BC,EAAO,UAAUL,MAAgBb,KAAcW,EAC9CM,EAAK,IACN;AAAA,sCACiCA,EAAK;AAAA,kCACTA,EAAK;AAAA;AAAA;AAAA,0BAGbA,EAAK,OACvB,IAAKG,GACE,kBAAkBT,EACxBS,CACD,QAAQH,EAAK;AAAA,kCACaA,EAAK,SAASG;AAAA,8BAExC,EACA,KAAK,EAAE,IAEVF,EAAO,UAAUL,MAAgBb,KAAcW,EAC9CM,EAAK,IACN;AAAA;AAAA,8BAEyBE,EACrB,IACAE,GACC,OAAOR,MAAgBb,KAAcW,EACpCU,CACD,MAAMA,IACR,EACC,KAAK;AAAA,CAAI;AAAA;AAAA,2CAEyBJ,EAAK;AAAA,kCACdZ,EAAuBY,EAAK,MAAM;AAAA;AAAA;AAAA,4CAGxBZ,EACpCY,EAAK,MACN,OAAOA,EAAK;AAAA,iCACcA,EAAK;AAAA,qCACDK,EAAeL,EAAK,MAAM;AAAA;AAAA;AAAA;AAAA,6BAIlCV,GAAiBU,EAAK,KAAMA,EAAK,MAAM;AAAA,6BACvCP,GAAmBO,EAAK,KAAMA,EAAK,MAAM;AAAA,6BACzClB,EAAmBkB,EAAK,KAAMA,EAAK,MAAM;AAAA,6BACzCb,EAAca,EAAK,KAAMA,EAAK,MAAM;AAAA,2BAI7D,MAAMM,EACLL,EACA,GAAGH,eAAkBF,6BAAuCb,KAAcW,EACzEM,EAAK,IACN,SACA,oBACD,IAIH,QAAQ,IAAI;AAAA,CAAqC,CAClD,CAEA,SAASO,GACRX,EACAb,EACAgB,EACC,CACD,OAAIA,EAAO,KACHA,EAAO,KACZ,IAAIC,GACG,OAAOJ,MAAgBb,KAAcW,EAC3CM,EAAK,IACN,MAAMA,EAAK,OACX,EACA,KAAK;AAAA,CAAI,EAEJ,EAET,CAEA,eAAsBQ,EACrBZ,EACAC,EACAC,EACAW,EACC,CACD,QAAQ,IAAI;AAAA,kDAA8C,EAC1D,QAAW1B,KAAcc,EAAS,CACjC,QAAQ,IAAI,qCAA2Bd,GAAY,EACnD,QAAQ,IACP,kCAAwBe,eAAkBF,6BAAuCb,QAClF,EACA,QAAQ,IACP,uCACC,OAAO,KAAKc,EAAQd,CAAU,EAAE,SAAS,EAAE,QAE7C,EACA,IAAMgB,EAASF,EAAQd,CAAU,EAC3B2B,EAAe,UAAUd,MAAgBb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAWvBa;AAAA;AAAA,sBAEJW,GAAeX,EAAab,EAAYgB,CAAM;AAAA;AAAA,oCAEhCrB,EAC9BK,CACD;AAAA;AAAA;AAAA;AAAA,uBAIkB,OAAO,QAAQgB,EAAO,SAAS,EAC9C,IAAI,CAAC,CAACd,EAAK0B,CAAK,IACT,qBAAqB1B,YAAcP,EACzCK,CACD,SAAS4B;AAAA,oEACmD1B;AAAA;AAAA;AAAA,qDAGfA,gBAAkBP,EACjEK,CACD,YAAY4B;AAAA,4EAC2D1B;AAAA;AAAA,qBAGpE,EACA,KAAK,EAAE;AAAA;AAAA;AAAA,uEAGwDP,EACjEK,CACD;AAAA;AAAA,wBAEmB,OAAO,QAAQgB,EAAO,SAAS,EAC3C,IAAI,CAAC,CAACd,EAAK0B,CAAK,IAAM,CACtB,IAAIC,EAAe,GACnB,OAAID,EAAM,SAAS,cAAc,EAChCC,EAAe,uBACLD,EAAM,SAAS,YAAY,EACrCC,EAAe,qBAEfD,EAAM,SAAS,kBAAkB,IAEjCC,EAAe,6BAET,8BAA8BD,iBAAqB1B,OAAS2B,KACpE,CAAC,EACA,KAAK,EAAE;AAAA;AAAA,wBAEKlC,EAA+BK,CAAU;AAAA;AAAA;AAAA,sBAG1C0B,EAAoB,uBAAuB1B,WAAoBL,EAA+BK,CAAU,6BACxG;AAAA;AAAA;AAAA;AAAA,sBAKD,OAAO,QAAQgB,EAAO,SAAS,EACjD,IAAI,CAAC,CAACd,EAAK0B,CAAK,IAAM,CAEtB,IAAIE,EAAYF,EAAM,MAAM,QAAQ,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,IAAIzB,GAAQA,EAAK,KAAK,CAAC,EACvE4B,EAAqB,CAAC,EACtBC,EAAa,GACbC,EAAa,GACbC,EAAa,GACjB,OAAIN,EAAM,SAAS,cAAc,GAChCG,EAAW,CAAC,EACZC,EAAa,GAAGF,EAAU,CAAC,IAC3BG,EAAa,aACHL,EAAM,SAAS,YAAY,GACrCG,EAAW,CAAC,QAAQD,EAAU,CAAC,GAAG,EAClCE,EAAa,GAAGF,EAAU,CAAC,IAC3BG,EAAa,eACbC,EAAa,kBAAkBhC,iBAAmBP,EAA+BK,CAAU,eAAe8B,EAAU,CAAC;AAAA,uBACnG5B;AAAA;AAAA;AAAA,wBAGCA,mBAAqBP,EAA+BK,CAAU,eAAe8B,EAAU,CAAC;AAAA,uBACzF5B;AAAA,YAER0B,EAAM,SAAS,kBAAkB,IAC3CG,EAAW,CAAC,SAASD,EAAU,CAAC,IAAK,SAASA,EAAU,CAAC,GAAG,EAC5DE,EAAa,GAAGF,EAAU,CAAC,IAC3BG,EAAa,sBACbC,EAAa,kBAAkBhC,iBAAmBP,EAA+BK,CAAU,gBAAgB8B,EAAU,CAAC,cAAcA,EAAU,CAAC;AAAA,uBAC7H5B;AAAA;AAAA;AAAA,wBAGCA,mBAAqBP,EAA+BK,CAAU,eAAe8B,EAAU,CAAC;AAAA,uBACzF5B;AAAA,YAGZ,kBAAkBA,YAAcP,EAA+BK,CAAU,MAAM+B,eAAsBC;AAAA,uBACzF9B,OAAS+B;AAAA;AAAA,UAEpBC,CACT,CAAC,EACA,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA,cAKT,MAAMX,EACLI,EACA,GAAGZ,eAAkBF,6BAAuCb,SAC5D,oBACD,EAED,QAAQ,IAAI;AAAA,CAA0C,CACvD,CC9TA,OAAS,cAAAmC,MAAkB,KAG3B,eAAsBC,EACrBC,EACAC,EACC,CAMD,GALA,QAAQ,IAAI;AAAA,6CAAyC,EACrD,QAAQ,IACP,+BAAqBA,eAAuBD,EAAO,sCACpD,EAGC,CAACE,EACA,GAAGD,eAAuBD,EAAO,sCAClC,EACC,CACD,IAAIG,EAAO,UAAUH,EAAO;AAAA;AAAA;AAAA,UAGpBA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA,MAKX,OAAO,KAAKA,EAAO,OAAO,EAAE,IAAII,GAC5B,OAAOJ,EAAO,SAASI,aAAsBC,EAA+BD,CAAU,IAAK,EAAE,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YASpGJ,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oDAQiCA,EAAO,mBAAmBA,EAAO;AAAA;AAAA,UAE3E,OAAO,KAAKA,EAAO,OAAO,EAAE,IAAII,GAC/B,OAAOA,OAAgBJ,EAAO,SAASI,wBAC9C,EAAE,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAML,OAAO,KAAKJ,EAAO,OAAO,EAAE,IAAII,GAC9B;AAAA,mCACuBC,EAA+BD,CAAU;AAAA,2BACjDA;AAAA,MAEvB,EAAE,KAAK;AAAA,CAAI;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,EA0Bb,MAAME,EACLH,EACA,GAAGF,eAAuBD,EAAO,uCACjC,oBACD,EAED,QAAQ,IAAI;AAAA,CAAqC,CAClD,CAEA,eAAsBO,EAAgBP,EAAqBC,EAAmB,CAC7E,GACC,CAACC,EACA,GAAGD,eAAuBD,EAAO,kCAClC,EACC,CACD,IAAIG,EAAO,UAAUH,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5B,MAAMM,EACLH,EACA,GAAGF,eAAuBD,EAAO,mCACjC,oBACD,EAEF,CChHA,eAAsBQ,EACrBC,EACAC,EACC,CACD,QAAQ,IAAI;AAAA,yCAAqC,EACjD,QAAQ,IACP,+BAAqBA,eAAuBD,EAAO,oCACpD,EAEA,IAAIE,EAAO,UAAUF,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5B,MAAMG,EACLD,EACA,GAAGD,eAAuBD,EAAO,qCACjC,oBACD,EACA,QAAQ,IAAI;AAAA,CAAiC,CAC9C,CCPA,SAASI,EAAmBC,EAAuB,CAClD,OAAOA,EACL,QAAQ,WAAY,KAAK,EACzB,YAAY,EACZ,QAAQ,KAAM,EAAE,CACnB,CAEA,eAAsBC,EACrBC,EACAC,EACAC,EACC,CACD,QAAQ,IAAI;AAAA,8CAA0C,EACtD,QAAWC,KAAcF,EAAS,CACjC,IAAMG,EAASH,EAAQE,CAAU,EACjC,GAAIC,EAAO,OAAQ,CAClB,QAAQ,IAAI,qCAA2BD,GAAY,EACnD,QAAWE,KAAQD,EAAO,OAAQ,CACjC,QAAQ,IACP,gCAAsBC,EAAK,QAC1B,MAAM,QAAQA,EAAK,MAAM,EAAI,SAAW,YAE1C,EAEA,IAAIC,EAAO,UAAUN,MAAgBG,KAAcN,EAAmBQ,EAAK,IAAI;AAAA;AAAA;AAAA,wCAG3CA,EAAK;AAAA,kCACXE,EAAuBF,EAAK,MAAgC;AAAA;AAAA;AAAA,yCAGrDE,EAAuBF,EAAK,MAAgC,OAAOA,EAAK;AAAA,iCAChFA,EAAK;AAAA,qCACDG,EAAeH,EAAK,MAAgC;AAAA;AAAA;AAAA;AAAA,0CAI/CE,EAAuBF,EAAK,MAAgC;AAAA,6CACzDA,EAAK;AAAA,qCACbG,EAAeH,EAAK,MAAgC;AAAA;AAAA,2BAGrF,MAAMI,EACLH,EACA,GAAGJ,eAAkBF,4BAAsCG,KAAcN,EACxEQ,EAAK,IACN,eACA,oBACD,IAIH,QAAQ,IAAI;AAAA,CAAsC,CACnD,CCvEA,OAAS,cAAAK,OAAkB,KAC3B,OAAOC,OAAQ,mBAGf,eAAsBC,EAAeC,EAAqBC,EAAmB,CAC5E,QAAQ,IAAI;AAAA,2CAAoC,EAC/C,QAAQ,IAAI,mCAAyB,EACrC,QAAQ,IACP,kCAAwBA,eAAuBD,EAAO,sBACvD,EAGEH,GACA,GAAGI,eAAuBD,EAAO,sBAClC,GAEA,MAAMF,GAAG,MAAM,GAAGG,eAAuBD,EAAO,uBAAwB,CAAE,UAAW,EAAK,CAAC,EAE7F,QAAQ,IAAI;AAAA,CAAgC,CAC7C,CClBA,eAAsBE,EACrBC,EACAC,EACC,CACD,QAAQ,IAAI;AAAA,yCAAqC,EACjD,QAAQ,IACP,+BAAqBA,eAAuBD,EAAO,sCACpD,EAEA,IAAIE,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;AAAA;AAAA;AAAA;AAAA,EA8C5B,MAAMG,EACLD,EACA,GAAGD,eAAuBD,EAAO,uCACjC,oBACD,EACA,QAAQ,IAAI;AAAA,CAAiC,CAC9C,CRrDA,SAASI,EACRC,EACS,CACT,OAAQA,EAAS,CAChB,IAAK,UACJ,MAAO,qEACR,IAAK,WACJ,MAAO,qEACR,QACC,MAAO,oEACT,CACD,CAEA,eAAsBC,GACrBC,EACAC,EACAH,EACAI,EACC,CACD,QAAQ,IAAI;AAAA,gDAA4C,EACxD,QAAQ,IAAI,kCAA2B,EACvC,QAAQ,IAAI,wBAAcF,EAAO,MAAM,EACvC,QAAQ,IACP,+BAAqBA,EAAO,aAAe,2BAC5C,EACA,QAAQ,IAAI,2BAAiBF,GAAW,WAAW,EACnD,QAAQ,IACP,gCACCI,GAAeL,EAAiBC,GAAW,SAAS;AAAA,CAEtD,EAEA,IAAMK,EAAOF,GAAa,QAAQ,IAAI,EAEtCC,EAAcA,GAAeL,EAAiBC,GAAW,SAAS,EAE9DM,EAAW,GAAGD,eAAkBH,EAAO,MAAM,GAChDK,EACC,GAAGF,eAAkBH,EAAO,sBAC7B,EAGII,EAAW,GAAGD,eAAkBH,EAAO,gBAAgB,GAC3D,MAAMM,EAAaN,EAAQG,EAAMD,CAAW,EAI3CE,EACA,GAAGD,eAAkBH,EAAO,sCAC7B,GAEA,MAAMO,EAAmBP,EAAQG,CAAI,EAGtC,MAAMK,EAAmBR,EAAO,KAAMA,EAAO,QAASG,CAAI,EAC1D,MAAMM,EAAwBT,EAAO,KAAMA,EAAO,QAASG,EAAMH,EAAO,iBAAiB,EACzF,MAAMU,EAAoBV,EAAO,KAAMA,EAAO,QAASG,CAAI,EAC3D,MAAMQ,EAAgBX,EAAQG,CAAI,EAClC,MAAMS,EAAkBZ,EAAQG,CAAI,EACpC,MAAMU,EAAeb,EAAQG,CAAI,EAC7BH,EAAO,mBACV,MAAMc,EAAgBd,EAAQG,CAAI,EAEnC,QAAQ,IAAI;AAAA,CAAyC,CACtD,CS3EA,OAAS,UAAAY,OAAc,UACvB,OAAOC,MAAU,OACjB,OAAOC,OAAa,UCDb,IAAMC,EAAN,cAAoC,KAAM,CACjD,KAAO,wBACP,QAAU,oCACV,EDAA,OAAS,UAAAC,OAAc,KACvB,OAAS,iBAAAC,OAAqB,MAC9B,OAAOC,OAAQ,KAGf,IAAMC,GAAc,CAClB,kBACA,mBACA,kBACA,kBACF,EACMC,EAAc,2BAEpB,eAAsBC,GAAWC,EAAuC,CACtEA,EAAa,MAAMC,EAAkBD,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,EAAkBH,EAAa,EAAI,GAI9C,MAAM,OAAOE,EAAa,WAAW,KAAK,IAAI,MAAM,WAC9D,QAAE,CACAN,GAAOI,EAAa,CAAE,MAAO,EAAK,CAAC,CACrC,CACF,CAEA,eAAsBG,EACpBD,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","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","formatMove","schemaPrefix","deployHookPrefix","code","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","getStructAttrs","values","key","_","getStructTypes","values","_","type","getStructAttrsWithType","key","getStructAttrsQuery","generateToml","config","srcPrefix","frameworkId","code","formatAndWriteMove","capitalizeAndRemoveUnderscores","input","word","index","renderSetAttrsFunc","schemaName","fields","key","type","renderSetFunc","getStructAttrsWithType","fieldName","renderGetAllFunc","getStructTypes","getStructAttrsQuery","renderGetAttrsFunc","convertToSnakeCase","generateSchemaData","projectName","schemas","path","schema","item","code","enumNames","field","name","getStructAttrs","formatAndWriteMove","generateImport","generateSchemaStructure","migration_enabled","schemaMoudle","value","storage_type","all_types","para_key","para_value","borrow_key","extra_code","existsSync","generateDeployHook","config","srcPrefix","existsSync","code","schemaName","capitalizeAndRemoveUnderscores","formatAndWriteMove","generateMigrate","generateDappKey","config","srcPrefix","code","formatAndWriteMove","convertToSnakeCase","input","generateSchemaEvent","projectName","schemas","path","schemaName","schema","item","code","getStructAttrsWithType","getStructAttrs","formatAndWriteMove","existsSync","fs","generateSystem","config","srcPrefix","generateSchemaHub","config","srcPrefix","code","formatAndWriteMove","matchFrameworkId","network","schemaGen","config","srcPrefix","frameworkId","path","existsSync","deleteFolderRecursive","generateToml","generateDeployHook","generateSchemaData","generateSchemaStructure","generateSchemaEvent","generateDappKey","generateSchemaHub","generateSystem","generateMigrate","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@0xobelisk/sui-common",
3
- "version": "0.5.19",
3
+ "version": "0.5.20",
4
4
  "description": "Common low level logic shared between packages",
5
5
  "keywords": [
6
6
  "sui",
@@ -4,12 +4,14 @@ export type BaseType =
4
4
  | "address"
5
5
  | "bool"
6
6
  | "u8"
7
+ | "u32"
7
8
  | "u64"
8
9
  | "u128"
9
10
  | "vector<address>"
10
11
  | "vector<bool>"
11
12
  | "vector<u8>"
12
13
  | "vector<vector<u8>>"
14
+ | "vector<u32>"
13
15
  | "vector<u64>"
14
16
  | "vector<u128>"
15
17
  | string;
@@ -26,6 +28,7 @@ export type StorageMapType =
26
28
  type Address = string;
27
29
  type Bool = boolean;
28
30
  type U8 = number;
31
+ type U32 = number;
29
32
  type U64 = number;
30
33
  type U128 = number;
31
34
  type Vector<T> = T[];
@@ -35,6 +38,7 @@ export type BaseValueType =
35
38
  | Address
36
39
  | Bool
37
40
  | U8
41
+ | U32
38
42
  | U64
39
43
  | U128
40
44
  | Vector<Address>
@@ -54,13 +58,14 @@ export type SchemaData = {
54
58
  export type SchemaType = {
55
59
  data?: SchemaData[];
56
60
  structure: Record<string, string>;
61
+ events?: SchemaData[];
57
62
  }
58
63
 
59
64
  export type DubheConfig = {
60
65
  name: string;
61
66
  description: string;
62
- systems: string[];
63
67
  schemas: Record<string, SchemaType>;
68
+ migration_enabled: boolean
64
69
  };
65
70
 
66
71
  export type MoveType =
@@ -71,11 +76,13 @@ export type MoveType =
71
76
  | "address"
72
77
  | "bool"
73
78
  | "u8"
79
+ | "u32"
74
80
  | "u64"
75
81
  | "u128"
76
82
  | "vector<address>"
77
83
  | "vector<bool>"
78
84
  | "vector<u8>"
79
85
  | "vector<vector<u8>>"
86
+ | "vector<u32>"
80
87
  | "vector<u64>"
81
88
  | "vector<u128>";
@@ -24,7 +24,7 @@ export async function formatAndWriteMove(
24
24
 
25
25
  let code = schemaPrefix + formattedOutput
26
26
 
27
- if (fullOutputPath.includes(".toml") || fullOutputPath.includes("system")) {
27
+ if (fullOutputPath.includes(".toml") || fullOutputPath.includes("system") || fullOutputPath.includes("migrate")) {
28
28
  code = formattedOutput
29
29
  } else if (fullOutputPath.includes("deploy_hook")) {
30
30
  code = deployHookPrefix + formattedOutput
@@ -0,0 +1,74 @@
1
+ import { BaseType, SchemaType } from '../../types';
2
+ import { formatAndWriteMove } from '../formatAndWrite';
3
+ import {
4
+ getStructAttrsWithType,
5
+ getStructAttrs,
6
+ getStructTypes,
7
+ getStructAttrsQuery,
8
+ } from './common';
9
+
10
+ function capitalizeAndRemoveUnderscores(input: string): string {
11
+ return input
12
+ .split('_')
13
+ .map((word, index) => {
14
+ return index === 0
15
+ ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()
16
+ : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
17
+ })
18
+ .join('');
19
+ }
20
+
21
+ function convertToSnakeCase(input: string): string {
22
+ return input
23
+ .replace(/([A-Z])/g, '_$1')
24
+ .toLowerCase()
25
+ .replace(/^_/, '');
26
+ }
27
+
28
+ export async function generateSchemaEvent(
29
+ projectName: string,
30
+ schemas: Record<string, SchemaType>,
31
+ path: string
32
+ ) {
33
+ console.log('\nšŸ“¦ Starting Schema Event Generation...');
34
+ for (const schemaName in schemas) {
35
+ const schema = schemas[schemaName];
36
+ if (schema.events) {
37
+ console.log(` ā”œā”€ Processing schema: ${schemaName}`);
38
+ for (const item of schema.events) {
39
+ console.log(
40
+ ` └─ Generating ${item.name} ${
41
+ Array.isArray(item.fields) ? '(enum)' : '(struct)'
42
+ }`
43
+ );
44
+
45
+ let code = `module ${projectName}::${schemaName}_${convertToSnakeCase(item.name)}_event {
46
+ use sui::event;
47
+ use std::ascii::String;
48
+ public struct ${item.name}Event has copy, drop {
49
+ ${getStructAttrsWithType(item.fields as Record<string, string>)}
50
+ }
51
+
52
+ public fun new(${getStructAttrsWithType(item.fields as Record<string, string>)}): ${item.name}Event {
53
+ ${item.name}Event {
54
+ ${getStructAttrs(item.fields as Record<string, string>)}
55
+ }
56
+ }
57
+
58
+ public fun emit(${getStructAttrsWithType(item.fields as Record<string, string>)}) {
59
+ event::emit(${item.name}Event {
60
+ ${getStructAttrs(item.fields as Record<string, string>)}
61
+ });
62
+ }`;
63
+ await formatAndWriteMove(
64
+ code,
65
+ `${path}/contracts/${projectName}/sources/codegen/events/${schemaName}_${convertToSnakeCase(
66
+ item.name
67
+ )}_event.move`,
68
+ 'formatAndWriteMove'
69
+ );
70
+ }
71
+ }
72
+ }
73
+ console.log('āœ… Schema Event Generation Complete\n');
74
+ }
@@ -7,7 +7,7 @@ import {
7
7
  getStructAttrsQuery,
8
8
  } from './common';
9
9
 
10
- function capitalizeAndRemoveUnderscores(input: string): string {
10
+ export function capitalizeAndRemoveUnderscores(input: string): string {
11
11
  return input
12
12
  .split('_')
13
13
  .map((word, index) => {
@@ -183,7 +183,8 @@ function generateImport(
183
183
  export async function generateSchemaStructure(
184
184
  projectName: string,
185
185
  schemas: Record<string, SchemaType>,
186
- path: string
186
+ path: string,
187
+ migration_enabled: boolean
187
188
  ) {
188
189
  console.log('\nšŸ”Ø Starting Schema Structure Generation...');
189
190
  for (const schemaName in schemas) {
@@ -199,74 +200,71 @@ export async function generateSchemaStructure(
199
200
  const schema = schemas[schemaName];
200
201
  const schemaMoudle = `module ${projectName}::${schemaName}_schema {
201
202
  use std::ascii::String;
203
+ use std::ascii::string;
204
+ use sui::package::UpgradeCap;
202
205
  use std::type_name;
203
206
  use dubhe::dapps_system;
207
+ use dubhe::storage_migrate;
204
208
  use dubhe::dapps_schema::Dapps;
205
209
  use dubhe::storage_value::{Self, StorageValue};
206
210
  use dubhe::storage_map::{Self, StorageMap};
207
211
  use dubhe::storage_double_map::{Self, StorageDoubleMap};
208
212
  use ${projectName}::dapp_key::DappKey;
213
+ use sui::dynamic_field as df;
209
214
  ${generateImport(projectName, schemaName, schema)}
210
215
 
211
216
  public struct ${capitalizeAndRemoveUnderscores(
212
217
  schemaName
213
218
  )} has key, store {
214
- id: UID,
215
- ${getStructAttrsWithType(schema.structure)}
216
- }
219
+ id: UID
220
+ }
217
221
 
218
222
  ${Object.entries(schema.structure)
219
223
  .map(([key, value]) => {
220
224
  return `public fun borrow_${key}(self: &${capitalizeAndRemoveUnderscores(
221
225
  schemaName
222
226
  )}) : &${value} {
223
- &self.${key}
227
+ storage_migrate::borrow_field(&self.id, b"${key}")
224
228
  }
225
229
 
226
230
  public(package) fun borrow_mut_${key}(self: &mut ${capitalizeAndRemoveUnderscores(
227
231
  schemaName
228
232
  )}): &mut ${value} {
229
- &mut self.${key}
233
+ storage_migrate::borrow_mut_field(&mut self.id, b"${key}")
230
234
  }
231
235
  `;
232
236
  })
233
237
  .join('')}
234
238
 
235
239
 
236
- public fun register(dapps: &mut Dapps, ctx: &mut TxContext): ${capitalizeAndRemoveUnderscores(
240
+ public(package) fun create(ctx: &mut TxContext): ${capitalizeAndRemoveUnderscores(
237
241
  schemaName
238
242
  )} {
239
- let package_id = dapps_system::current_package_id<DappKey>();
240
- assert!(dapps.borrow_metadata().contains_key(package_id), 0);
241
- assert!(dapps.borrow_admin().get(package_id) == ctx.sender(), 0);
242
- let schema = type_name::get<${capitalizeAndRemoveUnderscores(
243
- schemaName
244
- )}>().into_string();
245
- assert!(!dapps.borrow_schemas().get(package_id).contains(&schema), 0);
246
- dapps_system::add_schema<${capitalizeAndRemoveUnderscores(
247
- schemaName
248
- )}>(dapps, package_id, ctx);
249
- ${capitalizeAndRemoveUnderscores(schemaName)} {
250
- id: object::new(ctx),
251
- ${Object.entries(schema.structure)
252
- .map(([key, value]) => {
253
- let storage_type = '';
254
- if (value.includes('StorageValue')) {
255
- storage_type = `storage_value::new()`;
256
- } else if (value.includes('StorageMap')) {
257
- storage_type = `storage_map::new()`;
258
- } else if (
259
- value.includes('StorageDoubleMap')
260
- ) {
261
- storage_type = `storage_double_map::new()`;
262
- }
263
- return `${key}: ${storage_type},`;
264
- })
265
- .join(' ')}
266
- }
243
+ let mut id = object::new(ctx);
244
+ ${Object.entries(schema.structure)
245
+ .map(([key, value]) => {
246
+ let storage_type = '';
247
+ if (value.includes('StorageValue')) {
248
+ storage_type = `storage_value::new()`;
249
+ } else if (value.includes('StorageMap')) {
250
+ storage_type = `storage_map::new()`;
251
+ } else if (
252
+ value.includes('StorageDoubleMap')
253
+ ) {
254
+ storage_type = `storage_double_map::new()`;
255
+ }
256
+ return `storage_migrate::add_field<${value}>(&mut id, b"${key}", ${storage_type});`
257
+ })
258
+ .join('')}
259
+
260
+ ${capitalizeAndRemoveUnderscores(schemaName)} { id }
267
261
  }
268
262
 
263
+ ${ migration_enabled ? `public fun migrate(_${schemaName}: &mut ${capitalizeAndRemoveUnderscores(schemaName)}, _cap: &UpgradeCap) { }`
264
+ : ""
265
+ }
269
266
 
267
+
270
268
  // ======================================== View Functions ========================================
271
269
  ${Object.entries(schema.structure)
272
270
  .map(([key, value]) => {
@@ -285,26 +283,26 @@ export async function generateSchemaStructure(
285
283
  para_value = `${all_types[1]}`
286
284
  borrow_key = 'try_get(key)'
287
285
  extra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[0]}> {
288
- self.${key}.keys()
286
+ self.borrow_${key}().keys()
289
287
  }
290
288
 
291
289
  public fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[1]}> {
292
- self.${key}.values()
290
+ self.borrow_${key}().values()
293
291
  }`
294
292
  } else if (value.includes('StorageDoubleMap')) {
295
293
  para_key = [`key1: ${all_types[0]}`, `key2: ${all_types[1]}`]
296
294
  para_value = `${all_types[2]}`
297
295
  borrow_key = 'try_get(key1, key2)'
298
296
  extra_code = `public fun get_${key}_keys(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : (vector<${all_types[0]}>, vector<${all_types[1]}>) {
299
- self.${key}.keys()
297
+ self.borrow_${key}().keys()
300
298
  }
301
299
 
302
300
  public fun get_${key}_values(self: &${capitalizeAndRemoveUnderscores(schemaName)}) : vector<${all_types[2]}> {
303
- self.${key}.values()
301
+ self.borrow_${key}().values()
304
302
  }`
305
303
  }
306
304
  return `public fun get_${key}(self: &${capitalizeAndRemoveUnderscores(schemaName)}, ${para_key}) : Option<${para_value}> {
307
- self.${key}.${borrow_key}
305
+ self.borrow_${key}().${borrow_key}
308
306
  }
309
307
  ` + extra_code;
310
308
  })
@@ -0,0 +1,65 @@
1
+ import { DubheConfig } from '../../types';
2
+ import { formatAndWriteMove } from '../formatAndWrite';
3
+
4
+ export async function generateSchemaHub(
5
+ config: DubheConfig,
6
+ srcPrefix: string
7
+ ) {
8
+ console.log('\nšŸ”‘ Starting DappKey Generation...');
9
+ console.log(
10
+ ` └─ Output path: ${srcPrefix}/contracts/${config.name}/sources/codegen/schema_hub.move`
11
+ );
12
+
13
+ let code = `module ${config.name}::schema_hub {
14
+ use sui::transfer::public_share_object;
15
+ use sui::dynamic_field as df;
16
+
17
+ public struct SchemaHub has key, store {
18
+ id: UID,
19
+ admin: address,
20
+ }
21
+
22
+ public struct SchemaTypeWapper<phantom Schema: key + store> has copy, store, drop {}
23
+
24
+ /// Authorize an schema to access protected features of the SchemaHub.
25
+ public(package) fun authorize_schema<Schema: key + store>(self: &mut SchemaHub) {
26
+ df::add(&mut self.id, SchemaTypeWapper<Schema> {}, true);
27
+ }
28
+
29
+ /// Deauthorize an schema by removing its authorization key.
30
+ public(package) fun deauthorize_schema<Schema: key + store>(self: &mut SchemaHub) {
31
+ df::remove<SchemaTypeWapper<Schema>, bool>(&mut self.id, SchemaTypeWapper<Schema> {});
32
+ }
33
+
34
+ /// Check if an schema is authorized to access protected features of
35
+ /// the SchemaHub.
36
+ public fun is_schema_authorized<Schema: key + store>(self: &SchemaHub): bool {
37
+ df::exists_(&self.id, SchemaTypeWapper<Schema> {})
38
+ }
39
+
40
+ /// Assert that an schema is authorized to access protected features of
41
+ /// the SchemaHub. Aborts with \`EAppNotAuthorized\` if not.
42
+ public fun ensure_schema_authorized<Schema: key + store>(self: &SchemaHub) {
43
+ assert!(self.is_schema_authorized<Schema>(), 0);
44
+ }
45
+
46
+ fun init(ctx: &mut TxContext) {
47
+ public_share_object(SchemaHub {
48
+ id: object::new(ctx),
49
+ admin: ctx.sender(),
50
+ });
51
+ }
52
+
53
+ #[test_only]
54
+ public fun init_schema_hub_for_testing(ctx: &mut TxContext) {
55
+ init(ctx);
56
+ }
57
+ }
58
+ `;
59
+ await formatAndWriteMove(
60
+ code,
61
+ `${srcPrefix}/contracts/${config.name}/sources/codegen/schema_hub.move`,
62
+ 'formatAndWriteMove'
63
+ );
64
+ console.log('āœ… DappKey Generation Complete\n');
65
+ }