@0xobelisk/sui-common 1.2.0-pre.39 ā 1.2.0-pre.40
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 +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import G from"prettier";import fe from"prettier-plugin-move-js";async function X
|
|
|
4
4
|
|
|
5
5
|
/* Autogenerated file. Do not edit manually. */
|
|
6
6
|
|
|
7
|
-
`,i="#[test_only]",b=o+n,g="#[allow(lint(share_owned))]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?b=n:t.includes("init")?b=i+n:t.includes("genesis")&&(b=g+n),await B.mkdir(N.dirname(t),{recursive:!0}),await B.writeFile(t,b),L(`${s}: ${t}`)}async function Qe(e,t,s){let n=await Y(e);await B.mkdir(N.dirname(t),{recursive:!0}),await B.writeFile(t,n),L(`${s}: ${t}`)}function Ye(e){return e.replace(/\\/g,"/")}import{existsSync as w}from"fs";import F from"fs";function z(e){F.existsSync(e)&&(F.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;F.lstatSync(s).isDirectory()?z(s):F.unlinkSync(s)}),F.rmdirSync(e))}var ee={name:"@0xobelisk/sui-common",version:"1.2.0-pre.
|
|
7
|
+
`,i="#[test_only]",b=o+n,g="#[allow(lint(share_owned))]";t.includes(".toml")||t.includes("system")||t.includes("migrate")?b=n:t.includes("init")?b=i+n:t.includes("genesis")&&(b=g+n),await B.mkdir(N.dirname(t),{recursive:!0}),await B.writeFile(t,b),L(`${s}: ${t}`)}async function Qe(e,t,s){let n=await Y(e);await B.mkdir(N.dirname(t),{recursive:!0}),await B.writeFile(t,n),L(`${s}: ${t}`)}function Ye(e){return e.replace(/\\/g,"/")}import{existsSync as w}from"fs";import F from"fs";function z(e){F.existsSync(e)&&(F.readdirSync(e).forEach(t=>{let s=`${e}/${t}`;F.lstatSync(s).isDirectory()?z(s):F.unlinkSync(s)}),F.rmdirSync(e))}var ee={name:"@0xobelisk/sui-common",version:"1.2.0-pre.40",description:"Common low level logic shared between packages",keywords:["sui","obelisk labs","move","blockchain"],type:"module",author:"team@obelisk.build",homepage:"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme",bugs:"https://github.com/0xobelisk/dubhe/issues",repository:{type:"git",url:"https://github.com/0xobelisk/dubhe.git"},license:"Apache-2.0",publishConfig:{access:"public"},engines:{node:">=18"},exports:{".":{types:"./dist/index.d.ts",default:"./dist/index.js"}},typesVersions:{"*":{index:["./src/index.ts"]}},types:"./dist/index.d.ts",scripts:{build:"pnpm run build:js","build:js":"tsup && chmod +x ./dist/index.js",clean:"pnpm run clean:js","clean:js":"rimraf dist",dev:"tsup --watch",lint:"eslint . --ext .ts",test:"vitest",format:"prettier --write .","format:check":"prettier --check .","type-check":"tsc --noEmit",validate:"pnpm format:check && pnpm type-check"},dependencies:{chalk:"^5.0.1",debug:"^4.3.4",dotenv:"^16.0.3",ejs:"^3.1.8",esbuild:"^0.17.15",execa:"^7.0.0","find-up":"^6.3.0",glob:"^8.0.3",path:"^0.12.7",prettier:"^3.1.1","prettier-plugin-move-js":"^0.0.5","prettier-plugin-rust":"^0.1.9","prettier-plugin-solidity":"^1.1.2",typescript:"5.1.6",yargs:"^17.7.1",zod:"^3.22.3","zod-validation-error":"^1.3.0"},devDependencies:{"@types/debug":"^4.1.12","@types/ejs":"^3.1.1","@types/glob":"^7.2.0","@types/node":"^18.15.11","@types/yargs":"^17.0.10",tsup:"^6.7.0",tsx:"^3.12.6",vitest:"^2.1.3",eslint:"^8.56.0","eslint-config-prettier":"^9.1.0",prettier:"3.3.3"}};async function te(e,t){console.log(`
|
|
8
8
|
\u{1F4C4} Starting Move.toml Generation...`),console.log(` \u2514\u2500 Output path: ${t}/src/${e.name}/Move.toml`);let s=`[package]
|
|
9
9
|
name = "${e.name}"
|
|
10
10
|
version = "1.0.0"
|
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","../package.json","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateError.ts","../src/codegen/utils/renderMove/generateInitTest.ts","../src/codegen/utils/renderMove/generateComponents.ts","../src/codegen/utils/renderMove/generateGenesis.ts","../src/codegen/utils/renderMove/generateEnums.ts","../src/codegen/utils/renderMove/generateResources.ts","../src/codegen/utils/renderMove/dapp.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts","../src/parseData/parser/index.ts","../src/primitives/index.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(content: string, prettierConfigPath?: string): Promise<string> {\n let config;\n if (prettierConfigPath) {\n config = await prettier.resolveConfig(prettierConfigPath);\n }\n try {\n return prettier.format(content, {\n plugins: [prettierPluginMove],\n parser: 'move-parse',\n printWidth: 120,\n semi: true,\n tabWidth: 2,\n useTabs: false,\n bracketSpacing: true,\n ...config\n });\n } catch (error) {\n let message;\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = error;\n }\n console.log(`Error during output formatting: ${message}`);\n return content;\n }\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n return prettier.format(content, {\n parser: 'typescript'\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { formatMove, formatTypescript } from './format';\nimport { debug } from '../debug';\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = await formatMove(output);\n let schemaPrefix = ` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: Apache-2.0\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `;\n\n let initPrefix = `#[test_only]`;\n\n let code = schemaPrefix + formattedOutput;\n\n let deployHookPrefix = `#[allow(lint(share_owned))]`;\n\n if (\n fullOutputPath.includes('.toml') ||\n fullOutputPath.includes('system') ||\n fullOutputPath.includes('migrate')\n ) {\n code = formattedOutput;\n } else if (fullOutputPath.includes('init')) {\n code = initPrefix + formattedOutput;\n } else if (fullOutputPath.includes('genesis')) {\n code = deployHookPrefix + formattedOutput;\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from 'debug';\n\nexport const debug = createDebug('dubhe:common');\nexport const error = createDebug('dubhe:common');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from '../debug';\n\nexport const debug = parentDebug.extend('codegen');\nexport const error = parentDebug.extend('codegen');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","/**\n * Explicitly normalize a given path to a posix path (using `/` as separator).\n * This should be used for generating Solidity files that will be consumed by solc,\n * because solc expects `/` as path separator, but path.join produces `\\` if the user is on windows.\n */\nexport function posixPath(path: string): string {\n return path.replace(/\\\\/g, '/');\n}\n","import { 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 { generateSystemsAndTests } from './generateSystem';\nimport { generateSchemaHub } from './generateSchemaHub';\nimport { generateSchemaError } from './generateError';\nimport { generateDefaultSchema } from './generateDefaultSchema';\nimport { generateInitTest } from './generateInitTest';\nimport { generateComponents } from './generateComponents';\nimport { generateGenesis } from './generateGenesis';\nimport { generateEnums } from './generateEnums';\nimport { generateResources } from './generateResources';\nimport path from 'node:path';\n\nexport async function schemaGen(\n rootDir: string,\n config: DubheConfig,\n network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n console.log('\\nš Starting Schema Generation Process...');\n console.log('š Project Configuration:');\n console.log(` āā Name: ${config.name}`);\n console.log(` āā Description: ${config.description || 'No description provided'}`);\n console.log(` āā Network: ${network || 'testnet'}`);\n\n console.log(rootDir)\n const projectDir = path.join(rootDir, 'src', config.name);\n\n if (existsSync(`${projectDir}`)) {\n deleteFolderRecursive(`${projectDir}/sources/codegen`);\n }\n\n if (!existsSync(`${projectDir}/Move.toml`)) {\n await generateToml(config, rootDir);\n }\n\n const genesisPath = path.join(projectDir, 'sources', 'codegen', 'genesis.move');\n if (!existsSync(genesisPath)) {\n await generateGenesis(config, genesisPath);\n }\n\n const initTestPath = path.join(projectDir, 'sources', 'codegen', 'init_test.move');\n if (!existsSync(initTestPath)) {\n await generateInitTest(config, initTestPath);\n }\n\n const dappKeyPath = path.join(projectDir, 'sources', 'codegen', 'dapp_key.move');\n if (!existsSync(dappKeyPath)) {\n await generateDappKey(config, dappKeyPath);\n }\n\n const deployHookPath = path.join(projectDir, 'sources', 'scripts', 'deploy_hook.move');\n if (!existsSync(deployHookPath)) {\n await generateDeployHook(config, deployHookPath);\n }\n\n const componentsPath = path.join(projectDir, 'sources', 'codegen', 'components');\n if (!existsSync(componentsPath)) {\n await generateComponents(config, componentsPath);\n } else {\n await generateComponents(config, componentsPath);\n }\n\n const resourcesPath = path.join(projectDir, 'sources', 'codegen', 'resources');\n if (!existsSync(resourcesPath)) {\n await generateResources(config, resourcesPath);\n } else {\n await generateResources(config, resourcesPath);\n }\n\n const enumsPath = path.join(projectDir, 'sources', 'codegen', 'enums');\n if (!existsSync(enumsPath)) {\n await generateEnums(config, enumsPath);\n }\n\n if (config.errors) {\n await generateSchemaError(config.name, config.errors, rootDir);\n }\n\n // await generateDefaultSchema(config, rootDir);\n // await generateInit(config, rootDir);\n await generateSystemsAndTests(config, rootDir);\n await generateMigrate(config, rootDir);\n console.log('\\nā
Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n if (fs.existsSync(path)) {\n fs.readdirSync(path).forEach((file) => {\n const curPath = `${path}/${file}`;\n if (fs.lstatSync(curPath).isDirectory()) {\n deleteFolderRecursive(curPath);\n } else {\n fs.unlinkSync(curPath);\n }\n });\n fs.rmdirSync(path);\n }\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(values: Record<string, string> | string): string {\n return Object.entries(values)\n .map(([key, _]) => `${key}`)\n .join(',');\n}\n\nfunction isAddress(str: string): boolean {\n const regex = /^0x[a-fA-F0-9]+$/;\n return regex.test(str);\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaType): string {\nexport function getStructTypes(values: Record<string, string>): string {\n return `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n\nexport function containsString(obj: Record<string, any>, searchString: string): boolean {\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const value = obj[key];\n if (\n (typeof value === 'string' && value === searchString) ||\n (typeof value === 'string' && value.includes(searchString) && value.includes('>'))\n ) {\n return true;\n }\n }\n }\n return false;\n}\n","{\n \"name\": \"@0xobelisk/sui-common\",\n \"version\": \"1.2.0-pre.39\",\n \"description\": \"Common low level logic shared between packages\",\n \"keywords\": [\n \"sui\",\n \"obelisk labs\",\n \"move\",\n \"blockchain\"\n ],\n \"type\": \"module\",\n \"author\": \"team@obelisk.build\",\n \"homepage\": \"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme\",\n \"bugs\": \"https://github.com/0xobelisk/dubhe/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/0xobelisk/dubhe.git\"\n },\n \"license\": \"Apache-2.0\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"typesVersions\": {\n \"*\": {\n \"index\": [\n \"./src/index.ts\"\n ]\n }\n },\n \"types\": \"./dist/index.d.ts\",\n \"scripts\": {\n \"build\": \"pnpm run build:js\",\n \"build:js\": \"tsup && chmod +x ./dist/index.js\",\n \"clean\": \"pnpm run clean:js\",\n \"clean:js\": \"rimraf dist\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint . --ext .ts\",\n \"test\": \"vitest\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"type-check\": \"tsc --noEmit\",\n \"validate\": \"pnpm format:check && pnpm type-check\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.0.1\",\n \"debug\": \"^4.3.4\",\n \"dotenv\": \"^16.0.3\",\n \"ejs\": \"^3.1.8\",\n \"esbuild\": \"^0.17.15\",\n \"execa\": \"^7.0.0\",\n \"find-up\": \"^6.3.0\",\n \"glob\": \"^8.0.3\",\n \"path\": \"^0.12.7\",\n \"prettier\": \"^3.1.1\",\n \"prettier-plugin-move-js\": \"^0.0.5\",\n \"prettier-plugin-rust\": \"^0.1.9\",\n \"prettier-plugin-solidity\": \"^1.1.2\",\n \"typescript\": \"5.1.6\",\n \"yargs\": \"^17.7.1\",\n \"zod\": \"^3.22.3\",\n \"zod-validation-error\": \"^1.3.0\"\n },\n \"devDependencies\": {\n \"@types/debug\": \"^4.1.12\",\n \"@types/ejs\": \"^3.1.1\",\n \"@types/glob\": \"^7.2.0\",\n \"@types/node\": \"^18.15.11\",\n \"@types/yargs\": \"^17.0.10\",\n \"tsup\": \"^6.7.0\",\n \"tsx\": \"^3.12.6\",\n \"vitest\": \"^2.1.3\",\n \"eslint\": \"^8.56.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"prettier\": \"3.3.3\"\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport packageJson from '../../../../package.json';\n\nexport async function generateToml(config: DubheConfig, srcPrefix: string) {\n console.log('\\nš Starting Move.toml Generation...');\n console.log(` āā Output path: ${srcPrefix}/src/${config.name}/Move.toml`);\n\n let code = `[package]\nname = \"${config.name}\"\nversion = \"1.0.0\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.46.3\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe-wip.git\", subdir = \"packages/sui-framework/src/dubhe\", rev = \"v${packageJson.version}\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x1024\"\n`;\n await formatAndWriteMove(code, `${srcPrefix}/src/${config.name}/Move.toml`, 'formatAndWriteMove');\n console.log('ā
Move.toml Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nimport { readFileSync } from 'fs';\n\nfunction capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport async function generateDeployHook(config: DubheConfig, path: string) {\n if (!existsSync(path)) {\n const code = `module ${config.name}::deploy_hook {\n\t\t\t use dubhe::dapp_hub::DappHub;\n\n public(package) fun run(_dapp_hub: &mut DappHub, _ctx: &mut TxContext) {\n\n }\n}`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`)) {\n let code = `module ${config.name}::migrate {\n const ON_CHAIN_VERSION: u32 = 1;\n\n public fun on_chain_version(): u32 {\n ON_CHAIN_VERSION\n }\n}\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`,\n 'formatAndWriteMove'\n );\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(config: DubheConfig, path: string) {\n let code = `module ${config.name}::dapp_key {\nuse std::type_name;\n use sui::address;\n use std::ascii::String;\n\n /// Authorization token for the app.\n\n public struct DappKey has copy, drop {}\n\n public(package) fun new(): DappKey {\n DappKey { }\n }\n\n public fun to_string(): String {\n type_name::get<DappKey>().into_string()\n }\n\n public fun package_id(): address {\n let package_id_str = type_name::get<DappKey>().get_address();\n address::from_ascii_bytes(package_id_str.as_bytes())\n }\n}\n`;\n await formatAndWriteMove(\n code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateSystemsAndTests(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/systems`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/systems`, { recursive: true });\n }\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/tests`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/tests`, { recursive: true });\n }\n}\n","import { BaseType, ErrorData, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n getStructAttrsWithType,\n getStructAttrs,\n getStructTypes,\n getStructAttrsQuery\n} from './common';\n\nfunction convertToSnakeCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n}\n\nexport async function generateSchemaError(projectName: string, errors: ErrorData, path: string) {\n console.log('\\nš¦ Starting Schema Error Generation...');\n\n let code = `module ${projectName}::errors {\n\t\t${Object.entries(errors)\n .map(([name, message]) => {\n console.log(` āā ${name}: ${message}`);\n return `#[error]\n\t\t\t\tconst ${name.toUpperCase()}: vector<u8> = b\"${message}\";\n\t\t\t\tpublic fun ${name}_error(condition: bool) { assert!(condition, ${name.toUpperCase()}) }\n\t\t`;\n })\n .join('\\n')}\t\t\n }`;\n\n await formatAndWriteMove(\n code,\n `${path}/src/${projectName}/sources/codegen/errors.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateInitTest(config: DubheConfig, path: string) {\n let init_test_code = `module ${config.name}::init_test {\n use sui::clock;\n use sui::test_scenario;\n use sui::test_scenario::Scenario;\n use dubhe::dapp_hub::{DappHub, Self};\n\n public fun deploy_dapp_for_testing(scenario: &mut Scenario): DappHub {\n let ctx = test_scenario::ctx(scenario);\n let clock = clock::create_for_testing(ctx);\n let mut dapp_hub = dapp_hub::create_dapp_hub_for_testing(ctx);\n ${config.name}::genesis::run(&mut dapp_hub, &clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(scenario, ctx.sender());\n dapp_hub\n }\n}\n`;\n await formatAndWriteMove(\n init_test_code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { ComponentType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateComponents(config: DubheConfig, path: string) {\n console.log('\\nš¦ Starting Components Generation...');\n \n for (const [componentName, component] of Object.entries(config.components)) {\n console.log(` āā ${componentName}: ${JSON.stringify(component)}`);\n \n // Handle simple type cases\n if (typeof component === 'string') {\n const code = generateSimpleComponentCode(config.name, componentName, component, 'Onchain');\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Handle empty object cases, representing components with only entity_id key\n if (Object.keys(component).length === 0) {\n const code = generateComponentCode(config.name, componentName, {\n fields: {\n 'entity_id': 'address'\n },\n keys: ['entity_id'],\n offchain: false\n });\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Handle cases where keys are not defined - default to entity_id for components\n if (!component.keys) {\n component.keys = ['entity_id'];\n if (!component.fields['entity_id']) {\n component.fields = {\n 'entity_id': 'address',\n ...component.fields\n };\n }\n }\n \n // Validate that components only have one key\n if (component.keys && component.keys.length > 1) {\n throw new Error(`Component '${componentName}' can only have one key, but found ${component.keys.length} keys: ${component.keys.join(', ')}`);\n }\n \n const code = generateComponentCode(config.name, componentName, component);\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateSimpleComponentCode(projectName: string, componentName: string, valueType: string, type: ComponentType = 'Onchain'): string {\n // Check if it's an enum type\n const isEnum = !isBasicType(valueType);\n const enumModule = isEnum ? `${toSnakeCase(valueType)}` : '';\n \n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${isEnum ? ` use ${projectName}::${enumModule};\n use ${projectName}::${enumModule}::{${valueType}};` : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[b\"address\"]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[b\"${valueType}\"]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[b\"entity_id\"]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[b\"value\"]\n }\n\n public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }\n\n public fun has(dapp_hub: &DappHub, entity_id: address): bool {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public(package) fun delete(dapp_hub: &mut DappHub, entity_id: address) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }\n\n public fun get(dapp_hub: &DappHub, entity_id: address): (${valueType}) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${isEnum ? `let value = ${projectName}::${enumModule}::decode(&mut bsc_type);` : `let value = sui::bcs::peel_${getBcsType(valueType)}(&mut bsc_type);`}\n (value)\n }\n\n public(package) fun set(dapp_hub: &mut DappHub, entity_id: address, value: ${valueType}) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }\n\n public fun encode(value: ${valueType}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${isEnum ? `${projectName}::${enumModule}::encode(value)` : `to_bytes(&value)`});\n value_tuple\n }\n}`;\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nfunction generateComponentCode(projectName: string, componentName: string, component: any): string {\n const fields = component.fields;\n const keys = component.keys || ['entity_id'];\n const offchain = component.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n \n // Generate field type and name lists, excluding fields in keys\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name));\n const valueFieldNames = valueFields.map(([name]) => name);\n \n // If there is only one value field, do not generate struct\n const isSingleValue = valueFieldNames.length === 1;\n\n // Get all enum type fields (both key fields and value fields) and their corresponding module names\n const allEnumTypes = Object.entries(fields)\n .filter(([_, type]) => !isBasicType(type as string))\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => \n self.findIndex(t => t.type === item.type) === index\n );\n \n // Generate table related functions\n const tableFunctions = generateTableFunctions(projectName, componentName, fields, keys, !isAllKeys && !isSingleValue, allEnumTypes, type);\n\n // If all fields are keys or there is only one value field, do not generate struct related code\n if (isAllKeys || isSingleValue) {\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${allEnumTypes.length > 0 ? allEnumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n${tableFunctions}\n}`;\n }\n\n // Generate struct fields, excluding fields in keys\n const structFields = valueFieldNames\n .map(name => ` ${name}: ${fields[name]},`)\n .join('\\n');\n\n // Generate constructor parameters, only containing non-key fields\n const constructorParams = valueFieldNames\n .map(name => `${name}: ${fields[name]}`)\n .join(', ');\n\n // Generate constructor field assignments, only containing non-key fields\n const constructorAssignments = valueFieldNames\n .map(name => ` ${name},`)\n .join('\\n');\n\n // Generate getter functions, excluding fields in keys\n const getters = valueFieldNames\n .map(name => ` public fun ${name}(self: &${toPascalCase(componentName)}): ${fields[name]} {\n self.${name}\n }`)\n .join('\\n\\n');\n\n // Generate setter functions, excluding fields in keys\n const setters = valueFieldNames\n .map(name => ` public fun update_${name}(self: &mut ${toPascalCase(componentName)}, ${name}: ${fields[name]}) {\n self.${name} = ${name}\n }`)\n .join('\\n\\n');\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${allEnumTypes.length > 0 ? allEnumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public struct ${toPascalCase(componentName)} has copy, drop, store {\n${structFields}\n }\n\n public fun new(${constructorParams}): ${toPascalCase(componentName)} {\n ${toPascalCase(componentName)} {\n${constructorAssignments}\n }\n }\n\n${getters}\n\n${setters}\n\n${tableFunctions}\n}`;\n}\n\n// Check if it is a basic type\nfunction isBasicType(type: string): boolean {\n return ['address', 'bool', 'u8', 'u32', 'u64', 'u128', 'u256', \n 'vector<address>', 'vector<bool>', 'vector<u8>', 'vector<vector<u8>>', \n 'vector<u32>', 'vector<u64>', 'vector<u128>', 'vector<u256>'].includes(type);\n}\n\nfunction generateTableFunctions(\n projectName: string,\n componentName: string,\n fields: Record<string, string>,\n keys: string[],\n includeStruct: boolean = true,\n enumTypes: Array<{type: string, module: string}> = [],\n type: ComponentType = 'Onchain'\n): string {\n // Separate key fields and non-key fields\n const keyFields = keys.reduce((acc, key) => ({ ...acc, [key]: fields[key] }), {});\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name))\n .reduce((acc, [name, type]) => ({ ...acc, [name]: type }), {});\n \n const keyNames = Object.keys(keyFields);\n const valueNames = Object.keys(valueFields);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n // Check if there is only one value field\n const isSingleValue = valueNames.length === 1;\n\n // Generate key parameter list, if keys are empty, return empty string\n const keyParams = keys.length > 0 \n ? keys.map(k => `${k}: ${fields[k]}`).join(', ')\n : '';\n \n // Generate key tuple related code, if keys are empty, return empty string\n const keyTupleCode = keys.length > 0\n ? `let mut key_tuple = vector::empty();\n ${keys.map(k => `key_tuple.push_back(to_bytes(&${k}));`).join('\\n ')}`\n : 'let key_tuple = vector::empty();';\n \n // Generate table ID related functions\n const tableIdFunctions = ` public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${fields[k]}\"`).join(', ')}]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[${Object.values(valueFields).map(t => `b\"${t}\"`).join(', ')}]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${k}\"`).join(', ')}]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[${valueNames.map(n => `b\"${n}\"`).join(', ')}]\n }`;\n\n // Generate register table function\n const registerFunction = ` public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }`;\n\n // Generate has series functions\n const hasFunctions = ` public fun has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_not_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n${!isSingleValue ? valueNames.map((name, index) => ` public fun has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_not_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }`).join('\\n\\n') : ''}`;\n\n // Generate delete function\n const deleteFunction = ` public(package) fun delete(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }`;\n\n // Generate getter and setter functions, only generated when there are multiple value fields\n const getterSetters = !isSingleValue ? valueNames.map(name => {\n const index = valueNames.indexOf(name);\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n \n return ` public fun get_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${fieldType} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index});\n let mut bsc_type = sui::bcs::new(value);\n ${isEnum ? `let ${name} = ${projectName}::${enumType?.module}::decode(&mut bsc_type);` : `let ${name} = sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type);`}\n ${name}\n }\n\n public(package) fun set_${name}(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${name}: ${fieldType}) {\n ${keyTupleCode}\n let value = ${isEnum ? `${projectName}::${enumType?.module}::encode(${name})` : `to_bytes(&${name})`};\n dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${index}, value);\n }`;\n }).join('\\n\\n') : '';\n\n // Generate get and set functions\n const getSetFunctions = isAllKeys \n ? ` public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n let value_tuple = vector::empty();\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : isSingleValue\n ? ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${Object.values(valueFields)[0]} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);\n let mut bsc_type = sui::bcs::new(value);\n ${!isBasicType(Object.values(valueFields)[0] as string) \n ? `let value = ${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::decode(&mut bsc_type);` \n : `let value = sui::bcs::peel_${getBcsType(Object.values(valueFields)[0] as string)}(&mut bsc_type);`}\n value\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, value: ${Object.values(valueFields)[0]}) {\n ${keyTupleCode}\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): (${Object.values(valueFields).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${valueNames.map(name => {\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${name} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n (${valueNames.join(', ')})\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = encode(${valueNames.join(', ')});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`;\n\n // Generate struct related functions\n const structFunctions = includeStruct ? ` public fun get_struct(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${toPascalCase(componentName)} {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n decode(value_tuple)\n }\n\n public(package) fun set_struct(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${componentName}: ${toPascalCase(componentName)}) {\n ${keyTupleCode}\n let value_tuple = encode_struct(${componentName});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }` : '';\n\n // Generate encode and decode functions\n const encodeDecodeFunctions = isSingleValue\n ? ` public fun encode(value: ${Object.values(valueFields)[0]}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${!isBasicType(Object.values(valueFields)[0] as string) \n ? `${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::encode(value)` \n : `to_bytes(&value)`});\n value_tuple\n }`\n : includeStruct\n ? ` public fun encode(${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `value_tuple.push_back(${isEnum ? `${projectName}::${enumType?.module}::encode(${n})` : `to_bytes(&${n})`});`;\n }).join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map(n => `${componentName}.${n}`).join(', ')})\n }\n\n public fun decode(data: vector<u8>): ${toPascalCase(componentName)} {\n let mut bsc_type = sui::bcs::new(data);\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${n} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n ${toPascalCase(componentName)} {\n ${valueNames.map(n => `${n},`).join('\\n ')}\n }\n }`\n : '';\n\n return `${tableIdFunctions}\n\n${registerFunction}\n\n${hasFunctions}\n\n${deleteFunction}\n\n${getterSetters}\n\n${getSetFunctions}\n\n${structFunctions}\n\n${encodeDecodeFunctions}`;\n}\n\nfunction toPascalCase(str: string): string {\n // Split the underscore-separated string into words\n return str\n .split('_')\n .map((word, index) => {\n // If the word is a pure number, return it as is\n if (/^\\d+$/.test(word)) {\n return word;\n }\n // Otherwise, capitalize the first letter and lowercase the rest\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getBcsType(type: string): string {\n if (type.startsWith('vector<')) {\n const innerType = type.slice(7, -1);\n if (innerType === 'vector<u8>') {\n return 'vec_vec_u8';\n }\n return `vec_${getBcsType(innerType)}`;\n }\n \n switch (type) {\n case 'bool': return 'bool';\n case 'u8': return 'u8';\n case 'u32': return 'u32';\n case 'u64': return 'u64';\n case 'u128': return 'u128';\n case 'u256': return 'u256';\n case 'address': return 'address';\n default: return type;\n }\n}","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\nimport path from 'node:path';\n\nfunction capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport async function generateGenesis(config: DubheConfig, path: string) {\n // Generate register table code\n const componentRegisterCode = Object.keys(config.components || {})\n .map(componentName => ` ${componentName}::register_table(dapp_hub, ctx);`)\n .join('\\n');\n \n const resourceRegisterCode = Object.keys(config.resources || {})\n .map(resourceName => ` ${resourceName}::register_table(dapp_hub, ctx);`)\n .join('\\n');\n\n const registerTablesCode = [componentRegisterCode, resourceRegisterCode]\n .filter(code => code.trim() !== '')\n .join('\\n');\n\n let genesis_code = `module ${config.name}::genesis {\n use sui::clock::Clock;\n use dubhe::dapp_service;\n use dubhe::dapp_hub::DappHub;\n use ${config.name}::dapp_key;\n ${Object.keys(config.components || {}).map(componentName => `use ${config.name}::${componentName};`).join('\\n')}\n ${Object.keys(config.resources || {}).map(resourceName => `use ${config.name}::${resourceName};`).join('\\n')}\n\n public entry fun run(dapp_hub: &mut DappHub, clock: &Clock, ctx: &mut TxContext) {\n // Create Dapp\n let dapp_key = dapp_key::new();\n dapp_service::create_dapp(dapp_hub, dapp_key, b\"${config.name}\", b\"${config.description}\", clock, ctx);\n\n // Register tables\n${registerTablesCode}\n\n // Logic that needs to be automated once the contract is deployed\n ${config.name}::deploy_hook::run(dapp_hub, ctx);\n }\n}\n`;\n await formatAndWriteMove(\n genesis_code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nexport async function generateEnums(config: DubheConfig, path: string) {\n console.log('\\nš¦ Starting Enums Generation...');\n \n if (!config.enums) {\n return;\n }\n\n for (const [enumName, values] of Object.entries(config.enums)) {\n console.log(` āā ${enumName}: ${JSON.stringify(values)}`);\n \n // Sort enum values by first letter\n const sortedValues = [...values].sort((a, b) => a.localeCompare(b));\n \n const code = generateEnumCode(config.name, enumName, sortedValues);\n await formatAndWriteMove(\n code,\n `${path}/${toSnakeCase(enumName)}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateEnumCode(projectName: string, enumName: string, values: string[]): string {\n const enumValues = values.map(v => v.charAt(0).toUpperCase() + v.slice(1)).join(',');\n \n return `module ${projectName}::${toSnakeCase(enumName)} {\n use sui::bcs::{BCS, to_bytes, peel_enum_tag};\n\n public enum ${enumName} has copy, drop, store {\n ${enumValues}\n }\n\n${values.map(v => ` public fun new_${v.toLowerCase()}(): ${enumName} {\n ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)}\n }`).join('\\n\\n')}\n\n public fun encode(self: ${enumName}): vector<u8> {\n to_bytes(&self)\n }\n\n public fun decode(bytes: &mut BCS): ${enumName} {\n match(peel_enum_tag(bytes)) {\n${values.map((v, i) => ` ${i} => ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)},`).join('\\n')}\n _ => abort,\n }\n }\n}`;\n}\n","import { DubheConfig } from '../../types';\nimport { ComponentType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateResources(config: DubheConfig, path: string) {\n console.log('\\nš¦ Starting Resources Generation...');\n \n for (const [componentName, resource] of Object.entries(config.resources)) {\n console.log(` āā ${componentName}: ${JSON.stringify(resource)}`);\n \n // Handle simple type cases\n if (typeof resource === 'string') {\n const code = generateSimpleComponentCode(config.name, componentName, resource, 'Onchain');\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Validate that resource has fields defined\n if (!resource.fields || Object.keys(resource.fields).length === 0) {\n throw new Error(`Resource '${componentName}' must have fields defined, but found empty object`);\n }\n\n // For resources, don't default to any keys - use what's defined or empty array\n if (!resource.keys) {\n resource.keys = [];\n }\n \n const offchain = resource.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n const code = generateComponentCode(config.name, componentName, resource);\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateSimpleComponentCode(projectName: string, componentName: string, valueType: string, type: ComponentType = 'Onchain'): string {\n // Check if it's an enum type\n const isEnum = !isBasicType(valueType);\n const enumModule = isEnum ? `${toSnakeCase(valueType)}` : '';\n \n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${isEnum ? ` use ${projectName}::${enumModule};\n use ${projectName}::${enumModule}::{${valueType}};` : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[b\"${valueType}\"]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[b\"value\"]\n }\n\n public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }\n\n public fun has(dapp_hub: &DappHub): bool {\n let key_tuple = vector::empty();\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public(package) fun delete(dapp_hub: &mut DappHub) {\n let key_tuple = vector::empty();\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }\n\n public fun get(dapp_hub: &DappHub): (${valueType}) {\n let key_tuple = vector::empty();\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${isEnum ? `let value = ${projectName}::${enumModule}::decode(&mut bsc_type);` : `let value = sui::bcs::peel_${getBcsType(valueType)}(&mut bsc_type);`}\n (value)\n }\n\n public(package) fun set(dapp_hub: &mut DappHub, value: ${valueType}) {\n let key_tuple = vector::empty();\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }\n\n public fun encode(value: ${valueType}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${isEnum ? `${projectName}::${enumModule}::encode(value)` : `to_bytes(&value)`});\n value_tuple\n }\n}`;\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nfunction generateComponentCode(projectName: string, componentName: string, resource: any): string {\n const fields = resource.fields;\n const keys = resource.keys || [];\n const offchain = resource.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n \n // Generate field type and name lists, excluding fields in keys\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name));\n const valueFieldNames = valueFields.map(([name]) => name);\n \n // If there is only one value field, do not generate struct\n const isSingleValue = valueFieldNames.length === 1;\n\n // Get all enum type fields and their corresponding module names\n const enumTypes = valueFields\n .filter(([_, type]) => !isBasicType(type as string))\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => \n self.findIndex(t => t.type === item.type) === index\n );\n \n // Generate table related functions\n const tableFunctions = generateTableFunctions(projectName, componentName, fields, keys, !isAllKeys && !isSingleValue, enumTypes, type);\n\n // If all fields are keys or there is only one value field, do not generate struct related code\n if (isAllKeys || isSingleValue) {\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${enumTypes.length > 0 ? enumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n${tableFunctions}\n}`;\n }\n\n // Generate struct fields, excluding fields in keys\n const structFields = valueFieldNames\n .map(name => ` ${name}: ${fields[name]},`)\n .join('\\n');\n\n // Generate constructor parameters, only containing non-key fields\n const constructorParams = valueFieldNames\n .map(name => `${name}: ${fields[name]}`)\n .join(', ');\n\n // Generate constructor field assignments, only containing non-key fields\n const constructorAssignments = valueFieldNames\n .map(name => ` ${name},`)\n .join('\\n');\n\n // Generate getter functions, excluding fields in keys\n const getters = valueFieldNames\n .map(name => ` public fun ${name}(self: &${toPascalCase(componentName)}): ${fields[name]} {\n self.${name}\n }`)\n .join('\\n\\n');\n\n // Generate setter functions, excluding fields in keys\n const setters = valueFieldNames\n .map(name => ` public fun update_${name}(self: &mut ${toPascalCase(componentName)}, ${name}: ${fields[name]}) {\n self.${name} = ${name}\n }`)\n .join('\\n\\n');\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${enumTypes.length > 0 ? enumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public struct ${toPascalCase(componentName)} has copy, drop, store {\n${structFields}\n }\n\n public fun new(${constructorParams}): ${toPascalCase(componentName)} {\n ${toPascalCase(componentName)} {\n${constructorAssignments}\n }\n }\n\n${getters}\n\n${setters}\n\n${tableFunctions}\n}`;\n}\n\n// Check if it is a basic type\nfunction isBasicType(type: string): boolean {\n return ['address', 'bool', 'u8', 'u32', 'u64', 'u128', 'u256', \n 'vector<address>', 'vector<bool>', 'vector<u8>', 'vector<vector<u8>>', \n 'vector<u32>', 'vector<u64>', 'vector<u128>', 'vector<u256>'].includes(type);\n}\n\nfunction generateTableFunctions(\n projectName: string,\n componentName: string,\n fields: Record<string, string>,\n keys: string[],\n includeStruct: boolean = true,\n enumTypes: Array<{type: string, module: string}> = [],\n type: ComponentType = 'Onchain'\n): string {\n // Separate key fields and non-key fields\n const keyFields = keys.reduce((acc, key) => ({ ...acc, [key]: fields[key] }), {});\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name))\n .reduce((acc, [name, type]) => ({ ...acc, [name]: type }), {});\n \n const keyNames = Object.keys(keyFields);\n const valueNames = Object.keys(valueFields);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n // Check if there is only one value field\n const isSingleValue = valueNames.length === 1;\n\n // Generate key parameter list, if keys are empty, return empty string\n const keyParams = keys.length > 0 \n ? keys.map(k => `${k}: ${fields[k]}`).join(', ')\n : '';\n \n // Generate key tuple related code, if keys are empty, return empty string\n const keyTupleCode = keys.length > 0\n ? `let mut key_tuple = vector::empty();\n ${keys.map(k => `key_tuple.push_back(to_bytes(&${k}));`).join('\\n ')}`\n : 'let key_tuple = vector::empty();';\n \n // Generate table ID related functions\n const tableIdFunctions = ` public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${fields[k]}\"`).join(', ')}]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[${Object.values(valueFields).map(t => `b\"${t}\"`).join(', ')}]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${k}\"`).join(', ')}]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[${valueNames.map(n => `b\"${n}\"`).join(', ')}]\n }`;\n\n // Generate register table function\n const registerFunction = ` public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }`;\n\n // Generate has series functions\n const hasFunctions = ` public fun has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_not_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n${!isSingleValue ? valueNames.map((name, index) => ` public fun has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_not_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }`).join('\\n\\n') : ''}`;\n\n // Generate delete function\n const deleteFunction = ` public(package) fun delete(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }`;\n\n // Generate getter and setter functions, only generated when there are multiple value fields\n const getterSetters = !isSingleValue ? valueNames.map(name => {\n const index = valueNames.indexOf(name);\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n \n return ` public fun get_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${fieldType} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index});\n let mut bsc_type = sui::bcs::new(value);\n ${isEnum ? `let ${name} = ${projectName}::${enumType?.module}::decode(&mut bsc_type);` : `let ${name} = sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type);`}\n ${name}\n }\n\n public(package) fun set_${name}(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${name}: ${fieldType}) {\n ${keyTupleCode}\n let value = ${isEnum ? `${projectName}::${enumType?.module}::encode(${name})` : `to_bytes(&${name})`};\n dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${index}, value);\n }`;\n }).join('\\n\\n') : '';\n\n // Generate get and set functions\n const getSetFunctions = isAllKeys \n ? ` public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n let value_tuple = vector::empty();\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : isSingleValue\n ? ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${Object.values(valueFields)[0]} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);\n let mut bsc_type = sui::bcs::new(value);\n ${!isBasicType(Object.values(valueFields)[0] as string) \n ? `let value = ${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::decode(&mut bsc_type);` \n : `let value = sui::bcs::peel_${getBcsType(Object.values(valueFields)[0] as string)}(&mut bsc_type);`}\n value\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, value: ${Object.values(valueFields)[0]}) {\n ${keyTupleCode}\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): (${Object.values(valueFields).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${valueNames.map(name => {\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${name} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n (${valueNames.join(', ')})\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = encode(${valueNames.join(', ')});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`;\n\n // Generate struct related functions\n const structFunctions = includeStruct ? ` public fun get_struct(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${toPascalCase(componentName)} {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n decode(value_tuple)\n }\n\n public(package) fun set_struct(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${componentName}: ${toPascalCase(componentName)}) {\n ${keyTupleCode}\n let value_tuple = encode_struct(${componentName});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }` : '';\n\n // Generate encode and decode functions\n const encodeDecodeFunctions = isSingleValue\n ? ` public fun encode(value: ${Object.values(valueFields)[0]}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${!isBasicType(Object.values(valueFields)[0] as string) \n ? `${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::encode(value)` \n : `to_bytes(&value)`});\n value_tuple\n }`\n : includeStruct\n ? ` public fun encode(${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `value_tuple.push_back(${isEnum ? `${projectName}::${enumType?.module}::encode(${n})` : `to_bytes(&${n})`});`;\n }).join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map(n => `${componentName}.${n}`).join(', ')})\n }\n\n public fun decode(data: vector<u8>): ${toPascalCase(componentName)} {\n let mut bsc_type = sui::bcs::new(data);\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${n} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n ${toPascalCase(componentName)} {\n ${valueNames.map(n => `${n},`).join('\\n ')}\n }\n }`\n : '';\n\n return `${tableIdFunctions}\n\n${registerFunction}\n\n${hasFunctions}\n\n${deleteFunction}\n\n${getterSetters}\n\n${getSetFunctions}\n\n${structFunctions}\n\n${encodeDecodeFunctions}`;\n}\n\nfunction toPascalCase(str: string): string {\n // Split the underscore-separated string into words\n return str\n .split('_')\n .map((word, index) => {\n // If the word is a pure number, return it as is\n if (/^\\d+$/.test(word)) {\n return word;\n }\n // Otherwise, capitalize the first letter and lowercase the rest\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getBcsType(type: string): string {\n if (type.startsWith('vector<')) {\n const innerType = type.slice(7, -1);\n if (innerType === 'vector<u8>') {\n return 'vec_vec_u8';\n }\n return `vec_${getBcsType(innerType)}`;\n }\n \n switch (type) {\n case 'bool': return 'bool';\n case 'u8': return 'u8';\n case 'u32': return 'u32';\n case 'u64': return 'u64';\n case 'u128': return 'u128';\n case 'u256': return 'u256';\n case 'address': return 'address';\n default: return type;\n }\n}\n","import { DubheConfig } from '../../types';\n\nconst checkDuplicateKeys = (config: DubheConfig): void => {\n const componentKeys = Object.keys(config.components || {});\n const resourceKeys = Object.keys(config.resources || {});\n \n const duplicates = componentKeys.filter(key => resourceKeys.includes(key));\n \n if (duplicates.length > 0) {\n throw new Error(`Duplicate keys found between components and resources: ${duplicates.join(', ')}`);\n }\n};\n\nexport const defineDapp = (config: DubheConfig): DubheConfig => {\n checkDuplicateKeys(config);\n return config;\n};","import { findUp } from 'find-up';\nimport path from 'path';\nimport esbuild from 'esbuild';\nimport { NotInsideProjectError } from './errors';\nimport { rmSync } from 'fs';\nimport { pathToFileURL } from 'url';\nimport os from 'os';\n\n// In order of preference files are checked\nconst configFiles = ['dubhe.config.js', 'dubhe.config.mjs', 'dubhe.config.ts', 'dubhe.config.mts'];\nconst TEMP_CONFIG = 'dubhe.config.example.mjs';\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: 'esm',\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: 'node',\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: 'external'\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(configPath: string | undefined, toFileURL?: boolean) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === 'win32' ? pathToFileURL(configPath).href : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","export class NotInsideProjectError extends Error {\n name = 'NotInsideProjectError';\n message = 'You are not inside a Dubhe project';\n}\n","export const parseData = (data: any) => {\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n const parsedData: any = {};\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n // @ts-ignore\n const value = data[key];\n // console.log(\"===========\", value)\n if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value)) {\n parsedData[key] = handleArray(value);\n } else if (value.hasOwnProperty('variant')) {\n parsedData[key] = { [value.variant]: {} };\n } else if (value.hasOwnProperty('fields')) {\n parsedData[key] = parseData(value.fields);\n } else {\n parsedData[key] = parseData(value);\n }\n } else {\n parsedData[key] = value;\n }\n }\n }\n return parsedData;\n};\n\nconst handleArray = (data: any[]): any[] => {\n let returnData: any[] = [];\n data.forEach((item) => {\n if (typeof item === 'object' && item !== null) {\n if (Array.isArray(item)) {\n returnData.push(handleArray(item));\n } else if (item.hasOwnProperty('variant')) {\n returnData.push({ [item.variant]: {} });\n } else if (item.hasOwnProperty('fields')) {\n returnData.push(parseData(item.fields));\n } else {\n returnData.push(parseData(item));\n }\n } else {\n returnData.push(item);\n }\n });\n return returnData;\n};\n","export enum SubscriptionKind {\n Event = 'event',\n Schema = 'schema'\n}\n\nexport type SubscribableType =\n | { kind: SubscriptionKind.Event; name?: string; sender?: string }\n | { kind: SubscriptionKind.Schema; name?: string };\n"],"mappings":"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","names":["prettier","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","formatMove","schemaPrefix","initPrefix","code","deployHookPrefix","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","package_default","generateToml","config","srcPrefix","code","package_default","formatAndWriteMove","existsSync","generateDeployHook","config","path","existsSync","code","formatAndWriteMove","generateMigrate","srcPrefix","generateDappKey","config","path","code","formatAndWriteMove","existsSync","fs","generateSystemsAndTests","config","srcPrefix","generateSchemaError","projectName","errors","path","code","name","message","formatAndWriteMove","generateInitTest","config","path","init_test_code","formatAndWriteMove","generateComponents","config","path","componentName","component","code","generateSimpleComponentCode","formatAndWriteMove","generateComponentCode","projectName","valueType","type","isEnum","isBasicType","enumModule","toSnakeCase","getBcsType","str","letter","fields","keys","isAllKeys","name","valueFieldNames","isSingleValue","allEnumTypes","_","item","index","self","t","tableFunctions","generateTableFunctions","e","structFields","constructorParams","constructorAssignments","getters","toPascalCase","setters","includeStruct","enumTypes","keyFields","acc","key","valueFields","keyNames","valueNames","keyParams","k","keyTupleCode","tableIdFunctions","n","registerFunction","hasFunctions","deleteFunction","getterSetters","fieldType","enumType","getSetFunctions","structFunctions","encodeDecodeFunctions","word","innerType","generateGenesis","config","path","componentRegisterCode","componentName","resourceRegisterCode","resourceName","registerTablesCode","code","genesis_code","formatAndWriteMove","toSnakeCase","str","letter","generateEnums","config","path","enumName","values","sortedValues","a","b","code","generateEnumCode","formatAndWriteMove","projectName","enumValues","v","generateResources","config","path","componentName","resource","code","generateSimpleComponentCode","formatAndWriteMove","type","generateComponentCode","projectName","valueType","isEnum","isBasicType","enumModule","toSnakeCase","getBcsType","str","letter","fields","keys","isAllKeys","name","valueFields","valueFieldNames","isSingleValue","enumTypes","_","item","index","self","t","tableFunctions","generateTableFunctions","e","structFields","constructorParams","constructorAssignments","getters","toPascalCase","setters","includeStruct","keyFields","acc","key","keyNames","valueNames","keyParams","k","keyTupleCode","tableIdFunctions","n","registerFunction","hasFunctions","deleteFunction","getterSetters","fieldType","enumType","getSetFunctions","structFunctions","encodeDecodeFunctions","word","innerType","path","schemaGen","rootDir","config","network","projectDir","existsSync","deleteFolderRecursive","generateToml","genesisPath","generateGenesis","initTestPath","generateInitTest","dappKeyPath","generateDappKey","deployHookPath","generateDeployHook","componentsPath","generateComponents","resourcesPath","generateResources","enumsPath","generateEnums","generateSchemaError","generateSystemsAndTests","generateMigrate","checkDuplicateKeys","config","componentKeys","resourceKeys","duplicates","key","defineDapp","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError","parseData","data","parsedData","key","value","handleArray","returnData","item","SubscriptionKind"]}
|
|
1
|
+
{"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/schemaGen.ts","../src/codegen/utils/renderMove/common.ts","../package.json","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateError.ts","../src/codegen/utils/renderMove/generateInitTest.ts","../src/codegen/utils/renderMove/generateComponents.ts","../src/codegen/utils/renderMove/generateGenesis.ts","../src/codegen/utils/renderMove/generateEnums.ts","../src/codegen/utils/renderMove/generateResources.ts","../src/codegen/utils/renderMove/dapp.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts","../src/parseData/parser/index.ts","../src/primitives/index.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(content: string, prettierConfigPath?: string): Promise<string> {\n let config;\n if (prettierConfigPath) {\n config = await prettier.resolveConfig(prettierConfigPath);\n }\n try {\n return prettier.format(content, {\n plugins: [prettierPluginMove],\n parser: 'move-parse',\n printWidth: 120,\n semi: true,\n tabWidth: 2,\n useTabs: false,\n bracketSpacing: true,\n ...config\n });\n } catch (error) {\n let message;\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = error;\n }\n console.log(`Error during output formatting: ${message}`);\n return content;\n }\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n return prettier.format(content, {\n parser: 'typescript'\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { formatMove, formatTypescript } from './format';\nimport { debug } from '../debug';\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = await formatMove(output);\n let schemaPrefix = ` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: Apache-2.0\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `;\n\n let initPrefix = `#[test_only]`;\n\n let code = schemaPrefix + formattedOutput;\n\n let deployHookPrefix = `#[allow(lint(share_owned))]`;\n\n if (\n fullOutputPath.includes('.toml') ||\n fullOutputPath.includes('system') ||\n fullOutputPath.includes('migrate')\n ) {\n code = formattedOutput;\n } else if (fullOutputPath.includes('init')) {\n code = initPrefix + formattedOutput;\n } else if (fullOutputPath.includes('genesis')) {\n code = deployHookPrefix + formattedOutput;\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from 'debug';\n\nexport const debug = createDebug('dubhe:common');\nexport const error = createDebug('dubhe:common');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from '../debug';\n\nexport const debug = parentDebug.extend('codegen');\nexport const error = parentDebug.extend('codegen');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","/**\n * Explicitly normalize a given path to a posix path (using `/` as separator).\n * This should be used for generating Solidity files that will be consumed by solc,\n * because solc expects `/` as path separator, but path.join produces `\\` if the user is on windows.\n */\nexport function posixPath(path: string): string {\n return path.replace(/\\\\/g, '/');\n}\n","import { 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 { generateSystemsAndTests } from './generateSystem';\nimport { generateSchemaHub } from './generateSchemaHub';\nimport { generateSchemaError } from './generateError';\nimport { generateDefaultSchema } from './generateDefaultSchema';\nimport { generateInitTest } from './generateInitTest';\nimport { generateComponents } from './generateComponents';\nimport { generateGenesis } from './generateGenesis';\nimport { generateEnums } from './generateEnums';\nimport { generateResources } from './generateResources';\nimport path from 'node:path';\n\nexport async function schemaGen(\n rootDir: string,\n config: DubheConfig,\n network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n console.log('\\nš Starting Schema Generation Process...');\n console.log('š Project Configuration:');\n console.log(` āā Name: ${config.name}`);\n console.log(` āā Description: ${config.description || 'No description provided'}`);\n console.log(` āā Network: ${network || 'testnet'}`);\n\n console.log(rootDir)\n const projectDir = path.join(rootDir, 'src', config.name);\n\n if (existsSync(`${projectDir}`)) {\n deleteFolderRecursive(`${projectDir}/sources/codegen`);\n }\n\n if (!existsSync(`${projectDir}/Move.toml`)) {\n await generateToml(config, rootDir);\n }\n\n const genesisPath = path.join(projectDir, 'sources', 'codegen', 'genesis.move');\n if (!existsSync(genesisPath)) {\n await generateGenesis(config, genesisPath);\n }\n\n const initTestPath = path.join(projectDir, 'sources', 'codegen', 'init_test.move');\n if (!existsSync(initTestPath)) {\n await generateInitTest(config, initTestPath);\n }\n\n const dappKeyPath = path.join(projectDir, 'sources', 'codegen', 'dapp_key.move');\n if (!existsSync(dappKeyPath)) {\n await generateDappKey(config, dappKeyPath);\n }\n\n const deployHookPath = path.join(projectDir, 'sources', 'scripts', 'deploy_hook.move');\n if (!existsSync(deployHookPath)) {\n await generateDeployHook(config, deployHookPath);\n }\n\n const componentsPath = path.join(projectDir, 'sources', 'codegen', 'components');\n if (!existsSync(componentsPath)) {\n await generateComponents(config, componentsPath);\n } else {\n await generateComponents(config, componentsPath);\n }\n\n const resourcesPath = path.join(projectDir, 'sources', 'codegen', 'resources');\n if (!existsSync(resourcesPath)) {\n await generateResources(config, resourcesPath);\n } else {\n await generateResources(config, resourcesPath);\n }\n\n const enumsPath = path.join(projectDir, 'sources', 'codegen', 'enums');\n if (!existsSync(enumsPath)) {\n await generateEnums(config, enumsPath);\n }\n\n if (config.errors) {\n await generateSchemaError(config.name, config.errors, rootDir);\n }\n\n // await generateDefaultSchema(config, rootDir);\n // await generateInit(config, rootDir);\n await generateSystemsAndTests(config, rootDir);\n await generateMigrate(config, rootDir);\n console.log('\\nā
Schema Generation Process Complete!\\n');\n}\n","import { MoveType } from '../../types';\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n if (fs.existsSync(path)) {\n fs.readdirSync(path).forEach((file) => {\n const curPath = `${path}/${file}`;\n if (fs.lstatSync(curPath).isDirectory()) {\n deleteFolderRecursive(curPath);\n } else {\n fs.unlinkSync(curPath);\n }\n });\n fs.rmdirSync(path);\n }\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(values: Record<string, string> | string): string {\n return Object.entries(values)\n .map(([key, _]) => `${key}`)\n .join(',');\n}\n\nfunction isAddress(str: string): boolean {\n const regex = /^0x[a-fA-F0-9]+$/;\n return regex.test(str);\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaType): string {\nexport function getStructTypes(values: Record<string, string>): string {\n return `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n\nexport function containsString(obj: Record<string, any>, searchString: string): boolean {\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const value = obj[key];\n if (\n (typeof value === 'string' && value === searchString) ||\n (typeof value === 'string' && value.includes(searchString) && value.includes('>'))\n ) {\n return true;\n }\n }\n }\n return false;\n}\n","{\n \"name\": \"@0xobelisk/sui-common\",\n \"version\": \"1.2.0-pre.40\",\n \"description\": \"Common low level logic shared between packages\",\n \"keywords\": [\n \"sui\",\n \"obelisk labs\",\n \"move\",\n \"blockchain\"\n ],\n \"type\": \"module\",\n \"author\": \"team@obelisk.build\",\n \"homepage\": \"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme\",\n \"bugs\": \"https://github.com/0xobelisk/dubhe/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/0xobelisk/dubhe.git\"\n },\n \"license\": \"Apache-2.0\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"typesVersions\": {\n \"*\": {\n \"index\": [\n \"./src/index.ts\"\n ]\n }\n },\n \"types\": \"./dist/index.d.ts\",\n \"scripts\": {\n \"build\": \"pnpm run build:js\",\n \"build:js\": \"tsup && chmod +x ./dist/index.js\",\n \"clean\": \"pnpm run clean:js\",\n \"clean:js\": \"rimraf dist\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint . --ext .ts\",\n \"test\": \"vitest\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"type-check\": \"tsc --noEmit\",\n \"validate\": \"pnpm format:check && pnpm type-check\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.0.1\",\n \"debug\": \"^4.3.4\",\n \"dotenv\": \"^16.0.3\",\n \"ejs\": \"^3.1.8\",\n \"esbuild\": \"^0.17.15\",\n \"execa\": \"^7.0.0\",\n \"find-up\": \"^6.3.0\",\n \"glob\": \"^8.0.3\",\n \"path\": \"^0.12.7\",\n \"prettier\": \"^3.1.1\",\n \"prettier-plugin-move-js\": \"^0.0.5\",\n \"prettier-plugin-rust\": \"^0.1.9\",\n \"prettier-plugin-solidity\": \"^1.1.2\",\n \"typescript\": \"5.1.6\",\n \"yargs\": \"^17.7.1\",\n \"zod\": \"^3.22.3\",\n \"zod-validation-error\": \"^1.3.0\"\n },\n \"devDependencies\": {\n \"@types/debug\": \"^4.1.12\",\n \"@types/ejs\": \"^3.1.1\",\n \"@types/glob\": \"^7.2.0\",\n \"@types/node\": \"^18.15.11\",\n \"@types/yargs\": \"^17.0.10\",\n \"tsup\": \"^6.7.0\",\n \"tsx\": \"^3.12.6\",\n \"vitest\": \"^2.1.3\",\n \"eslint\": \"^8.56.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"prettier\": \"3.3.3\"\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport packageJson from '../../../../package.json';\n\nexport async function generateToml(config: DubheConfig, srcPrefix: string) {\n console.log('\\nš Starting Move.toml Generation...');\n console.log(` āā Output path: ${srcPrefix}/src/${config.name}/Move.toml`);\n\n let code = `[package]\nname = \"${config.name}\"\nversion = \"1.0.0\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.46.3\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe-wip.git\", subdir = \"packages/sui-framework/src/dubhe\", rev = \"v${packageJson.version}\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x1024\"\n`;\n await formatAndWriteMove(code, `${srcPrefix}/src/${config.name}/Move.toml`, 'formatAndWriteMove');\n console.log('ā
Move.toml Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\n\nimport { readFileSync } from 'fs';\n\nfunction capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport async function generateDeployHook(config: DubheConfig, path: string) {\n if (!existsSync(path)) {\n const code = `module ${config.name}::deploy_hook {\n\t\t\t use dubhe::dapp_hub::DappHub;\n\n public(package) fun run(_dapp_hub: &mut DappHub, _ctx: &mut TxContext) {\n\n }\n}`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`)) {\n let code = `module ${config.name}::migrate {\n const ON_CHAIN_VERSION: u32 = 1;\n\n public fun on_chain_version(): u32 {\n ON_CHAIN_VERSION\n }\n}\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`,\n 'formatAndWriteMove'\n );\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(config: DubheConfig, path: string) {\n let code = `module ${config.name}::dapp_key {\nuse std::type_name;\n use sui::address;\n use std::ascii::String;\n\n /// Authorization token for the app.\n\n public struct DappKey has copy, drop {}\n\n public(package) fun new(): DappKey {\n DappKey { }\n }\n\n public fun to_string(): String {\n type_name::get<DappKey>().into_string()\n }\n\n public fun package_id(): address {\n let package_id_str = type_name::get<DappKey>().get_address();\n address::from_ascii_bytes(package_id_str.as_bytes())\n }\n}\n`;\n await formatAndWriteMove(\n code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport async function generateSystemsAndTests(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/systems`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/systems`, { recursive: true });\n }\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/tests`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/tests`, { recursive: true });\n }\n}\n","import { BaseType, ErrorData, SchemaType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport {\n getStructAttrsWithType,\n getStructAttrs,\n getStructTypes,\n getStructAttrsQuery\n} from './common';\n\nfunction convertToSnakeCase(input: string): string {\n return input\n .replace(/([A-Z])/g, '_$1')\n .toLowerCase()\n .replace(/^_/, '');\n}\n\nexport async function generateSchemaError(projectName: string, errors: ErrorData, path: string) {\n console.log('\\nš¦ Starting Schema Error Generation...');\n\n let code = `module ${projectName}::errors {\n\t\t${Object.entries(errors)\n .map(([name, message]) => {\n console.log(` āā ${name}: ${message}`);\n return `#[error]\n\t\t\t\tconst ${name.toUpperCase()}: vector<u8> = b\"${message}\";\n\t\t\t\tpublic fun ${name}_error(condition: bool) { assert!(condition, ${name.toUpperCase()}) }\n\t\t`;\n })\n .join('\\n')}\t\t\n }`;\n\n await formatAndWriteMove(\n code,\n `${path}/src/${projectName}/sources/codegen/errors.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateInitTest(config: DubheConfig, path: string) {\n let init_test_code = `module ${config.name}::init_test {\n use sui::clock;\n use sui::test_scenario;\n use sui::test_scenario::Scenario;\n use dubhe::dapp_hub::{DappHub, Self};\n\n public fun deploy_dapp_for_testing(scenario: &mut Scenario): DappHub {\n let ctx = test_scenario::ctx(scenario);\n let clock = clock::create_for_testing(ctx);\n let mut dapp_hub = dapp_hub::create_dapp_hub_for_testing(ctx);\n ${config.name}::genesis::run(&mut dapp_hub, &clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(scenario, ctx.sender());\n dapp_hub\n }\n}\n`;\n await formatAndWriteMove(\n init_test_code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { ComponentType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateComponents(config: DubheConfig, path: string) {\n console.log('\\nš¦ Starting Components Generation...');\n \n for (const [componentName, component] of Object.entries(config.components)) {\n console.log(` āā ${componentName}: ${JSON.stringify(component)}`);\n \n // Handle simple type cases\n if (typeof component === 'string') {\n const code = generateSimpleComponentCode(config.name, componentName, component, 'Onchain');\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Handle empty object cases, representing components with only entity_id key\n if (Object.keys(component).length === 0) {\n const code = generateComponentCode(config.name, componentName, {\n fields: {\n 'entity_id': 'address'\n },\n keys: ['entity_id'],\n offchain: false\n });\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Handle cases where keys are not defined - default to entity_id for components\n if (!component.keys) {\n component.keys = ['entity_id'];\n if (!component.fields['entity_id']) {\n component.fields = {\n 'entity_id': 'address',\n ...component.fields\n };\n }\n }\n \n // Validate that components only have one key\n if (component.keys && component.keys.length > 1) {\n throw new Error(`Component '${componentName}' can only have one key, but found ${component.keys.length} keys: ${component.keys.join(', ')}`);\n }\n \n const code = generateComponentCode(config.name, componentName, component);\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateSimpleComponentCode(projectName: string, componentName: string, valueType: string, type: ComponentType = 'Onchain'): string {\n // Check if it's an enum type\n const isEnum = !isBasicType(valueType);\n const enumModule = isEnum ? `${toSnakeCase(valueType)}` : '';\n \n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${isEnum ? ` use ${projectName}::${enumModule};\n use ${projectName}::${enumModule}::{${valueType}};` : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[b\"address\"]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[b\"${valueType}\"]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[b\"entity_id\"]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[b\"value\"]\n }\n\n public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }\n\n public fun has(dapp_hub: &DappHub, entity_id: address): bool {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public(package) fun delete(dapp_hub: &mut DappHub, entity_id: address) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }\n\n public fun get(dapp_hub: &DappHub, entity_id: address): (${valueType}) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${isEnum ? `let value = ${projectName}::${enumModule}::decode(&mut bsc_type);` : `let value = sui::bcs::peel_${getBcsType(valueType)}(&mut bsc_type);`}\n (value)\n }\n\n public(package) fun set(dapp_hub: &mut DappHub, entity_id: address, value: ${valueType}) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }\n\n public fun encode(value: ${valueType}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${isEnum ? `${projectName}::${enumModule}::encode(value)` : `to_bytes(&value)`});\n value_tuple\n }\n}`;\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nfunction generateComponentCode(projectName: string, componentName: string, component: any): string {\n const fields = component.fields;\n const keys = component.keys || ['entity_id'];\n const offchain = component.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n \n // Generate field type and name lists, excluding fields in keys\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name));\n const valueFieldNames = valueFields.map(([name]) => name);\n \n // If there is only one value field, do not generate struct\n const isSingleValue = valueFieldNames.length === 1;\n\n // Get all enum type fields (both key fields and value fields) and their corresponding module names\n const allEnumTypes = Object.entries(fields)\n .filter(([_, type]) => !isBasicType(type as string))\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => \n self.findIndex(t => t.type === item.type) === index\n );\n \n // Generate table related functions\n const tableFunctions = generateTableFunctions(projectName, componentName, fields, keys, !isAllKeys && !isSingleValue, allEnumTypes, type);\n\n // If all fields are keys or there is only one value field, do not generate struct related code\n if (isAllKeys || isSingleValue) {\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${allEnumTypes.length > 0 ? allEnumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n${tableFunctions}\n}`;\n }\n\n // Generate struct fields, excluding fields in keys\n const structFields = valueFieldNames\n .map(name => ` ${name}: ${fields[name]},`)\n .join('\\n');\n\n // Generate constructor parameters, only containing non-key fields\n const constructorParams = valueFieldNames\n .map(name => `${name}: ${fields[name]}`)\n .join(', ');\n\n // Generate constructor field assignments, only containing non-key fields\n const constructorAssignments = valueFieldNames\n .map(name => ` ${name},`)\n .join('\\n');\n\n // Generate getter functions, excluding fields in keys\n const getters = valueFieldNames\n .map(name => ` public fun ${name}(self: &${toPascalCase(componentName)}): ${fields[name]} {\n self.${name}\n }`)\n .join('\\n\\n');\n\n // Generate setter functions, excluding fields in keys\n const setters = valueFieldNames\n .map(name => ` public fun update_${name}(self: &mut ${toPascalCase(componentName)}, ${name}: ${fields[name]}) {\n self.${name} = ${name}\n }`)\n .join('\\n\\n');\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${allEnumTypes.length > 0 ? allEnumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public struct ${toPascalCase(componentName)} has copy, drop, store {\n${structFields}\n }\n\n public fun new(${constructorParams}): ${toPascalCase(componentName)} {\n ${toPascalCase(componentName)} {\n${constructorAssignments}\n }\n }\n\n${getters}\n\n${setters}\n\n${tableFunctions}\n}`;\n}\n\n// Check if it is a basic type\nfunction isBasicType(type: string): boolean {\n return ['address', 'bool', 'u8', 'u32', 'u64', 'u128', 'u256', \n 'vector<address>', 'vector<bool>', 'vector<u8>', 'vector<vector<u8>>', \n 'vector<u32>', 'vector<u64>', 'vector<u128>', 'vector<u256>'].includes(type);\n}\n\nfunction generateTableFunctions(\n projectName: string,\n componentName: string,\n fields: Record<string, string>,\n keys: string[],\n includeStruct: boolean = true,\n enumTypes: Array<{type: string, module: string}> = [],\n type: ComponentType = 'Onchain'\n): string {\n // Separate key fields and non-key fields\n const keyFields = keys.reduce((acc, key) => ({ ...acc, [key]: fields[key] }), {});\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name))\n .reduce((acc, [name, type]) => ({ ...acc, [name]: type }), {});\n \n const keyNames = Object.keys(keyFields);\n const valueNames = Object.keys(valueFields);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n // Check if there is only one value field\n const isSingleValue = valueNames.length === 1;\n\n // Generate key parameter list, if keys are empty, return empty string\n const keyParams = keys.length > 0 \n ? keys.map(k => `${k}: ${fields[k]}`).join(', ')\n : '';\n \n // Generate key tuple related code, if keys are empty, return empty string\n const keyTupleCode = keys.length > 0\n ? `let mut key_tuple = vector::empty();\n ${keys.map(k => `key_tuple.push_back(to_bytes(&${k}));`).join('\\n ')}`\n : 'let key_tuple = vector::empty();';\n \n // Generate table ID related functions\n const tableIdFunctions = ` public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${fields[k]}\"`).join(', ')}]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[${Object.values(valueFields).map(t => `b\"${t}\"`).join(', ')}]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${k}\"`).join(', ')}]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[${valueNames.map(n => `b\"${n}\"`).join(', ')}]\n }`;\n\n // Generate register table function\n const registerFunction = ` public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }`;\n\n // Generate has series functions\n const hasFunctions = ` public fun has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_not_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n${!isSingleValue ? valueNames.map((name, index) => ` public fun has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_not_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }`).join('\\n\\n') : ''}`;\n\n // Generate delete function\n const deleteFunction = ` public(package) fun delete(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }`;\n\n // Generate getter and setter functions, only generated when there are multiple value fields\n const getterSetters = !isSingleValue ? valueNames.map(name => {\n const index = valueNames.indexOf(name);\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n \n return ` public fun get_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${fieldType} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index});\n let mut bsc_type = sui::bcs::new(value);\n ${isEnum ? `let ${name} = ${projectName}::${enumType?.module}::decode(&mut bsc_type);` : `let ${name} = sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type);`}\n ${name}\n }\n\n public(package) fun set_${name}(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${name}: ${fieldType}) {\n ${keyTupleCode}\n let value = ${isEnum ? `${projectName}::${enumType?.module}::encode(${name})` : `to_bytes(&${name})`};\n dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${index}, value);\n }`;\n }).join('\\n\\n') : '';\n\n // Generate get and set functions\n const getSetFunctions = isAllKeys \n ? ` public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n let value_tuple = vector::empty();\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : isSingleValue\n ? ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${Object.values(valueFields)[0]} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);\n let mut bsc_type = sui::bcs::new(value);\n ${!isBasicType(Object.values(valueFields)[0] as string) \n ? `let value = ${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::decode(&mut bsc_type);` \n : `let value = sui::bcs::peel_${getBcsType(Object.values(valueFields)[0] as string)}(&mut bsc_type);`}\n value\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, value: ${Object.values(valueFields)[0]}) {\n ${keyTupleCode}\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): (${Object.values(valueFields).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${valueNames.map(name => {\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${name} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n (${valueNames.join(', ')})\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = encode(${valueNames.join(', ')});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`;\n\n // Generate struct related functions\n const structFunctions = includeStruct ? ` public fun get_struct(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${toPascalCase(componentName)} {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n decode(value_tuple)\n }\n\n public(package) fun set_struct(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${componentName}: ${toPascalCase(componentName)}) {\n ${keyTupleCode}\n let value_tuple = encode_struct(${componentName});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }` : '';\n\n // Generate encode and decode functions\n const encodeDecodeFunctions = isSingleValue\n ? ` public fun encode(value: ${Object.values(valueFields)[0]}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${!isBasicType(Object.values(valueFields)[0] as string) \n ? `${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::encode(value)` \n : `to_bytes(&value)`});\n value_tuple\n }`\n : includeStruct\n ? ` public fun encode(${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `value_tuple.push_back(${isEnum ? `${projectName}::${enumType?.module}::encode(${n})` : `to_bytes(&${n})`});`;\n }).join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map(n => `${componentName}.${n}`).join(', ')})\n }\n\n public fun decode(data: vector<u8>): ${toPascalCase(componentName)} {\n let mut bsc_type = sui::bcs::new(data);\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${n} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n ${toPascalCase(componentName)} {\n ${valueNames.map(n => `${n},`).join('\\n ')}\n }\n }`\n : '';\n\n return `${tableIdFunctions}\n\n${registerFunction}\n\n${hasFunctions}\n\n${deleteFunction}\n\n${getterSetters}\n\n${getSetFunctions}\n\n${structFunctions}\n\n${encodeDecodeFunctions}`;\n}\n\nfunction toPascalCase(str: string): string {\n // Split the underscore-separated string into words\n return str\n .split('_')\n .map((word, index) => {\n // If the word is a pure number, return it as is\n if (/^\\d+$/.test(word)) {\n return word;\n }\n // Otherwise, capitalize the first letter and lowercase the rest\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getBcsType(type: string): string {\n if (type.startsWith('vector<')) {\n const innerType = type.slice(7, -1);\n if (innerType === 'vector<u8>') {\n return 'vec_vec_u8';\n }\n return `vec_${getBcsType(innerType)}`;\n }\n \n switch (type) {\n case 'bool': return 'bool';\n case 'u8': return 'u8';\n case 'u32': return 'u32';\n case 'u64': return 'u64';\n case 'u128': return 'u128';\n case 'u256': return 'u256';\n case 'address': return 'address';\n default: return type;\n }\n}","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport { capitalizeAndRemoveUnderscores } from './generateSchema';\nimport path from 'node:path';\n\nfunction capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport async function generateGenesis(config: DubheConfig, path: string) {\n // Generate register table code\n const componentRegisterCode = Object.keys(config.components || {})\n .map(componentName => ` ${componentName}::register_table(dapp_hub, ctx);`)\n .join('\\n');\n \n const resourceRegisterCode = Object.keys(config.resources || {})\n .map(resourceName => ` ${resourceName}::register_table(dapp_hub, ctx);`)\n .join('\\n');\n\n const registerTablesCode = [componentRegisterCode, resourceRegisterCode]\n .filter(code => code.trim() !== '')\n .join('\\n');\n\n let genesis_code = `module ${config.name}::genesis {\n use sui::clock::Clock;\n use dubhe::dapp_service;\n use dubhe::dapp_hub::DappHub;\n use ${config.name}::dapp_key;\n ${Object.keys(config.components || {}).map(componentName => `use ${config.name}::${componentName};`).join('\\n')}\n ${Object.keys(config.resources || {}).map(resourceName => `use ${config.name}::${resourceName};`).join('\\n')}\n\n public entry fun run(dapp_hub: &mut DappHub, clock: &Clock, ctx: &mut TxContext) {\n // Create Dapp\n let dapp_key = dapp_key::new();\n dapp_service::create_dapp(dapp_hub, dapp_key, b\"${config.name}\", b\"${config.description}\", clock, ctx);\n\n // Register tables\n${registerTablesCode}\n\n // Logic that needs to be automated once the contract is deployed\n ${config.name}::deploy_hook::run(dapp_hub, ctx);\n }\n}\n`;\n await formatAndWriteMove(\n genesis_code,\n path,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nexport async function generateEnums(config: DubheConfig, path: string) {\n console.log('\\nš¦ Starting Enums Generation...');\n \n if (!config.enums) {\n return;\n }\n\n for (const [enumName, values] of Object.entries(config.enums)) {\n console.log(` āā ${enumName}: ${JSON.stringify(values)}`);\n \n // Sort enum values by first letter\n const sortedValues = [...values].sort((a, b) => a.localeCompare(b));\n \n const code = generateEnumCode(config.name, enumName, sortedValues);\n await formatAndWriteMove(\n code,\n `${path}/${toSnakeCase(enumName)}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateEnumCode(projectName: string, enumName: string, values: string[]): string {\n const enumValues = values.map(v => v.charAt(0).toUpperCase() + v.slice(1)).join(',');\n \n return `module ${projectName}::${toSnakeCase(enumName)} {\n use sui::bcs::{BCS, to_bytes, peel_enum_tag};\n\n public enum ${enumName} has copy, drop, store {\n ${enumValues}\n }\n\n${values.map(v => ` public fun new_${v.toLowerCase()}(): ${enumName} {\n ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)}\n }`).join('\\n\\n')}\n\n public fun encode(self: ${enumName}): vector<u8> {\n to_bytes(&self)\n }\n\n public fun decode(bytes: &mut BCS): ${enumName} {\n match(peel_enum_tag(bytes)) {\n${values.map((v, i) => ` ${i} => ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)},`).join('\\n')}\n _ => abort,\n }\n }\n}`;\n}\n","import { DubheConfig } from '../../types';\nimport { ComponentType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateResources(config: DubheConfig, path: string) {\n console.log('\\nš¦ Starting Resources Generation...');\n \n for (const [componentName, resource] of Object.entries(config.resources)) {\n console.log(` āā ${componentName}: ${JSON.stringify(resource)}`);\n \n // Handle simple type cases\n if (typeof resource === 'string') {\n const code = generateSimpleComponentCode(config.name, componentName, resource, 'Onchain');\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n continue;\n }\n\n // Validate that resource has fields defined\n if (!resource.fields || Object.keys(resource.fields).length === 0) {\n throw new Error(`Resource '${componentName}' must have fields defined, but found empty object`);\n }\n\n // For resources, don't default to any keys - use what's defined or empty array\n if (!resource.keys) {\n resource.keys = [];\n }\n \n const offchain = resource.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n const code = generateComponentCode(config.name, componentName, resource);\n await formatAndWriteMove(\n code,\n `${path}/${componentName}.move`,\n 'formatAndWriteMove'\n );\n }\n}\n\nfunction generateSimpleComponentCode(projectName: string, componentName: string, valueType: string, type: ComponentType = 'Onchain'): string {\n // Check if it's an enum type\n const isEnum = !isBasicType(valueType);\n const enumModule = isEnum ? `${toSnakeCase(valueType)}` : '';\n \n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${isEnum ? ` use ${projectName}::${enumModule};\n use ${projectName}::${enumModule}::{${valueType}};` : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[b\"${valueType}\"]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[b\"value\"]\n }\n\n public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }\n\n public fun has(dapp_hub: &DappHub): bool {\n let key_tuple = vector::empty();\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public(package) fun delete(dapp_hub: &mut DappHub) {\n let key_tuple = vector::empty();\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }\n\n public fun get(dapp_hub: &DappHub): (${valueType}) {\n let key_tuple = vector::empty();\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${isEnum ? `let value = ${projectName}::${enumModule}::decode(&mut bsc_type);` : `let value = sui::bcs::peel_${getBcsType(valueType)}(&mut bsc_type);`}\n (value)\n }\n\n public(package) fun set(dapp_hub: &mut DappHub, value: ${valueType}) {\n let key_tuple = vector::empty();\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }\n\n public fun encode(value: ${valueType}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${isEnum ? `${projectName}::${enumModule}::encode(value)` : `to_bytes(&value)`});\n value_tuple\n }\n}`;\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nfunction generateComponentCode(projectName: string, componentName: string, resource: any): string {\n const fields = resource.fields;\n const keys = resource.keys || [];\n const offchain = resource.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n \n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n \n // Generate field type and name lists, excluding fields in keys\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name));\n const valueFieldNames = valueFields.map(([name]) => name);\n \n // If there is only one value field, do not generate struct\n const isSingleValue = valueFieldNames.length === 1;\n\n // Get all enum type fields and their corresponding module names\n const enumTypes = valueFields\n .filter(([_, type]) => !isBasicType(type as string))\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => \n self.findIndex(t => t.type === item.type) === index\n );\n \n // Generate table related functions\n const tableFunctions = generateTableFunctions(projectName, componentName, fields, keys, !isAllKeys && !isSingleValue, enumTypes, type);\n\n // If all fields are keys or there is only one value field, do not generate struct related code\n if (isAllKeys || isSingleValue) {\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${enumTypes.length > 0 ? enumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n${tableFunctions}\n}`;\n }\n\n // Generate struct fields, excluding fields in keys\n const structFields = valueFieldNames\n .map(name => ` ${name}: ${fields[name]},`)\n .join('\\n');\n\n // Generate constructor parameters, only containing non-key fields\n const constructorParams = valueFieldNames\n .map(name => `${name}: ${fields[name]}`)\n .join(', ');\n\n // Generate constructor field assignments, only containing non-key fields\n const constructorAssignments = valueFieldNames\n .map(name => ` ${name},`)\n .join('\\n');\n\n // Generate getter functions, excluding fields in keys\n const getters = valueFieldNames\n .map(name => ` public fun ${name}(self: &${toPascalCase(componentName)}): ${fields[name]} {\n self.${name}\n }`)\n .join('\\n\\n');\n\n // Generate setter functions, excluding fields in keys\n const setters = valueFieldNames\n .map(name => ` public fun update_${name}(self: &mut ${toPascalCase(componentName)}, ${name}: ${fields[name]}) {\n self.${name} = ${name}\n }`)\n .join('\\n\\n');\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use dubhe::table_id;\n use dubhe::dapp_state;\n use dubhe::dapp_service;\n use dubhe::dapp_hub;\n use dubhe::dapp_hub::DappHub;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${enumTypes.length > 0 ? enumTypes.map(e => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`).join('\\n') : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n\n public struct ${toPascalCase(componentName)} has copy, drop, store {\n${structFields}\n }\n\n public fun new(${constructorParams}): ${toPascalCase(componentName)} {\n ${toPascalCase(componentName)} {\n${constructorAssignments}\n }\n }\n\n${getters}\n\n${setters}\n\n${tableFunctions}\n}`;\n}\n\n// Check if it is a basic type\nfunction isBasicType(type: string): boolean {\n return ['address', 'bool', 'u8', 'u32', 'u64', 'u128', 'u256', \n 'vector<address>', 'vector<bool>', 'vector<u8>', 'vector<vector<u8>>', \n 'vector<u32>', 'vector<u64>', 'vector<u128>', 'vector<u256>'].includes(type);\n}\n\nfunction generateTableFunctions(\n projectName: string,\n componentName: string,\n fields: Record<string, string>,\n keys: string[],\n includeStruct: boolean = true,\n enumTypes: Array<{type: string, module: string}> = [],\n type: ComponentType = 'Onchain'\n): string {\n // Separate key fields and non-key fields\n const keyFields = keys.reduce((acc, key) => ({ ...acc, [key]: fields[key] }), {});\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name))\n .reduce((acc, [name, type]) => ({ ...acc, [name]: type }), {});\n \n const keyNames = Object.keys(keyFields);\n const valueNames = Object.keys(valueFields);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every(name => keys.includes(name));\n // Check if there is only one value field\n const isSingleValue = valueNames.length === 1;\n\n // Generate key parameter list, if keys are empty, return empty string\n const keyParams = keys.length > 0 \n ? keys.map(k => `${k}: ${fields[k]}`).join(', ')\n : '';\n \n // Generate key tuple related code, if keys are empty, return empty string\n const keyTupleCode = keys.length > 0\n ? `let mut key_tuple = vector::empty();\n ${keys.map(k => `key_tuple.push_back(to_bytes(&${k}));`).join('\\n ')}`\n : 'let key_tuple = vector::empty();';\n \n // Generate table ID related functions\n const tableIdFunctions = ` public fun get_table_id(): vector<u8> {\n table_id::encode(table_id::${type === 'Offchain' ? 'offchain_table_type' : 'onchain_table_type'}(), TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${fields[k]}\"`).join(', ')}]\n }\n\n public fun get_value_schemas(): vector<vector<u8>> { \n vector[${Object.values(valueFields).map(t => `b\"${t}\"`).join(', ')}]\n }\n\n public fun get_key_names(): vector<vector<u8>> { \n vector[${keys.map(k => `b\"${k}\"`).join(', ')}]\n }\n\n public fun get_value_names(): vector<vector<u8>> { \n vector[${valueNames.map(n => `b\"${n}\"`).join(', ')}]\n }`;\n\n // Generate register table function\n const registerFunction = ` public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n dapp_service::register_table(\n dapp_hub, \n dapp_key,\n get_table_id(), \n TABLE_NAME, \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n ctx\n );\n }`;\n\n // Generate has series functions\n const hasFunctions = ` public fun has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_not_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n${!isSingleValue ? valueNames.map((name, index) => ` public fun has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): bool {\n ${keyTupleCode}\n dapp_service::has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }\n\n public fun ensure_not_has_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::ensure_not_has_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index})\n }`).join('\\n\\n') : ''}`;\n\n // Generate delete function\n const deleteFunction = ` public(package) fun delete(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n dapp_service::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple);\n }`;\n\n // Generate getter and setter functions, only generated when there are multiple value fields\n const getterSetters = !isSingleValue ? valueNames.map(name => {\n const index = valueNames.indexOf(name);\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n \n return ` public fun get_${name}(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${fieldType} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index});\n let mut bsc_type = sui::bcs::new(value);\n ${isEnum ? `let ${name} = ${projectName}::${enumType?.module}::decode(&mut bsc_type);` : `let ${name} = sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type);`}\n ${name}\n }\n\n public(package) fun set_${name}(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${name}: ${fieldType}) {\n ${keyTupleCode}\n let value = ${isEnum ? `${projectName}::${enumType?.module}::encode(${name})` : `to_bytes(&${name})`};\n dapp_service::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${index}, value);\n }`;\n }).join('\\n\\n') : '';\n\n // Generate get and set functions\n const getSetFunctions = isAllKeys \n ? ` public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n let value_tuple = vector::empty();\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : isSingleValue\n ? ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${Object.values(valueFields)[0]} {\n ${keyTupleCode}\n let value = dapp_service::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);\n let mut bsc_type = sui::bcs::new(value);\n ${!isBasicType(Object.values(valueFields)[0] as string) \n ? `let value = ${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::decode(&mut bsc_type);` \n : `let value = sui::bcs::peel_${getBcsType(Object.values(valueFields)[0] as string)}(&mut bsc_type);`}\n value\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, value: ${Object.values(valueFields)[0]}) {\n ${keyTupleCode}\n let value_tuple = encode(value);\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`\n : ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): (${Object.values(valueFields).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${valueNames.map(name => {\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${name} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n (${valueNames.join(', ')})\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}) {\n ${keyTupleCode}\n let value_tuple = encode(${valueNames.join(', ')});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }`;\n\n // Generate struct related functions\n const structFunctions = includeStruct ? ` public fun get_struct(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${toPascalCase(componentName)} {\n ${keyTupleCode}\n let value_tuple = dapp_service::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n decode(value_tuple)\n }\n\n public(package) fun set_struct(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${componentName}: ${toPascalCase(componentName)}) {\n ${keyTupleCode}\n let value_tuple = encode_struct(${componentName});\n dapp_service::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple);\n }` : '';\n\n // Generate encode and decode functions\n const encodeDecodeFunctions = isSingleValue\n ? ` public fun encode(value: ${Object.values(valueFields)[0]}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${!isBasicType(Object.values(valueFields)[0] as string) \n ? `${projectName}::${enumTypes.find(e => e.type === Object.values(valueFields)[0])?.module}::encode(value)` \n : `to_bytes(&value)`});\n value_tuple\n }`\n : includeStruct\n ? ` public fun encode(${valueNames.map(n => `${n}: ${fields[n]}`).join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `value_tuple.push_back(${isEnum ? `${projectName}::${enumType?.module}::encode(${n})` : `to_bytes(&${n})`});`;\n }).join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map(n => `${componentName}.${n}`).join(', ')})\n }\n\n public fun decode(data: vector<u8>): ${toPascalCase(componentName)} {\n let mut bsc_type = sui::bcs::new(data);\n ${valueNames.map(n => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find(e => e.type === fieldType) : null;\n return `let ${n} = ${isEnum ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)` : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`};`;\n }).join('\\n ')}\n ${toPascalCase(componentName)} {\n ${valueNames.map(n => `${n},`).join('\\n ')}\n }\n }`\n : '';\n\n return `${tableIdFunctions}\n\n${registerFunction}\n\n${hasFunctions}\n\n${deleteFunction}\n\n${getterSetters}\n\n${getSetFunctions}\n\n${structFunctions}\n\n${encodeDecodeFunctions}`;\n}\n\nfunction toPascalCase(str: string): string {\n // Split the underscore-separated string into words\n return str\n .split('_')\n .map((word, index) => {\n // If the word is a pure number, return it as is\n if (/^\\d+$/.test(word)) {\n return word;\n }\n // Otherwise, capitalize the first letter and lowercase the rest\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getBcsType(type: string): string {\n if (type.startsWith('vector<')) {\n const innerType = type.slice(7, -1);\n if (innerType === 'vector<u8>') {\n return 'vec_vec_u8';\n }\n return `vec_${getBcsType(innerType)}`;\n }\n \n switch (type) {\n case 'bool': return 'bool';\n case 'u8': return 'u8';\n case 'u32': return 'u32';\n case 'u64': return 'u64';\n case 'u128': return 'u128';\n case 'u256': return 'u256';\n case 'address': return 'address';\n default: return type;\n }\n}\n","import { DubheConfig } from '../../types';\n\nconst checkDuplicateKeys = (config: DubheConfig): void => {\n const componentKeys = Object.keys(config.components || {});\n const resourceKeys = Object.keys(config.resources || {});\n \n const duplicates = componentKeys.filter(key => resourceKeys.includes(key));\n \n if (duplicates.length > 0) {\n throw new Error(`Duplicate keys found between components and resources: ${duplicates.join(', ')}`);\n }\n};\n\nexport const defineDapp = (config: DubheConfig): DubheConfig => {\n checkDuplicateKeys(config);\n return config;\n};","import { findUp } from 'find-up';\nimport path from 'path';\nimport esbuild from 'esbuild';\nimport { NotInsideProjectError } from './errors';\nimport { rmSync } from 'fs';\nimport { pathToFileURL } from 'url';\nimport os from 'os';\n\n// In order of preference files are checked\nconst configFiles = ['dubhe.config.js', 'dubhe.config.mjs', 'dubhe.config.ts', 'dubhe.config.mts'];\nconst TEMP_CONFIG = 'dubhe.config.example.mjs';\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: 'esm',\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: 'node',\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: 'external'\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(configPath: string | undefined, toFileURL?: boolean) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === 'win32' ? pathToFileURL(configPath).href : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","export class NotInsideProjectError extends Error {\n name = 'NotInsideProjectError';\n message = 'You are not inside a Dubhe project';\n}\n","export const parseData = (data: any) => {\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n const parsedData: any = {};\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n // @ts-ignore\n const value = data[key];\n // console.log(\"===========\", value)\n if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value)) {\n parsedData[key] = handleArray(value);\n } else if (value.hasOwnProperty('variant')) {\n parsedData[key] = { [value.variant]: {} };\n } else if (value.hasOwnProperty('fields')) {\n parsedData[key] = parseData(value.fields);\n } else {\n parsedData[key] = parseData(value);\n }\n } else {\n parsedData[key] = value;\n }\n }\n }\n return parsedData;\n};\n\nconst handleArray = (data: any[]): any[] => {\n let returnData: any[] = [];\n data.forEach((item) => {\n if (typeof item === 'object' && item !== null) {\n if (Array.isArray(item)) {\n returnData.push(handleArray(item));\n } else if (item.hasOwnProperty('variant')) {\n returnData.push({ [item.variant]: {} });\n } else if (item.hasOwnProperty('fields')) {\n returnData.push(parseData(item.fields));\n } else {\n returnData.push(parseData(item));\n }\n } else {\n returnData.push(item);\n }\n });\n return returnData;\n};\n","export enum SubscriptionKind {\n Event = 'event',\n Schema = 'schema'\n}\n\nexport type SubscribableType =\n | { kind: SubscriptionKind.Event; name?: string; sender?: string }\n | { kind: SubscriptionKind.Schema; name?: string };\n"],"mappings":"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","names":["prettier","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","formatMove","schemaPrefix","initPrefix","code","deployHookPrefix","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","package_default","generateToml","config","srcPrefix","code","package_default","formatAndWriteMove","existsSync","generateDeployHook","config","path","existsSync","code","formatAndWriteMove","generateMigrate","srcPrefix","generateDappKey","config","path","code","formatAndWriteMove","existsSync","fs","generateSystemsAndTests","config","srcPrefix","generateSchemaError","projectName","errors","path","code","name","message","formatAndWriteMove","generateInitTest","config","path","init_test_code","formatAndWriteMove","generateComponents","config","path","componentName","component","code","generateSimpleComponentCode","formatAndWriteMove","generateComponentCode","projectName","valueType","type","isEnum","isBasicType","enumModule","toSnakeCase","getBcsType","str","letter","fields","keys","isAllKeys","name","valueFieldNames","isSingleValue","allEnumTypes","_","item","index","self","t","tableFunctions","generateTableFunctions","e","structFields","constructorParams","constructorAssignments","getters","toPascalCase","setters","includeStruct","enumTypes","keyFields","acc","key","valueFields","keyNames","valueNames","keyParams","k","keyTupleCode","tableIdFunctions","n","registerFunction","hasFunctions","deleteFunction","getterSetters","fieldType","enumType","getSetFunctions","structFunctions","encodeDecodeFunctions","word","innerType","generateGenesis","config","path","componentRegisterCode","componentName","resourceRegisterCode","resourceName","registerTablesCode","code","genesis_code","formatAndWriteMove","toSnakeCase","str","letter","generateEnums","config","path","enumName","values","sortedValues","a","b","code","generateEnumCode","formatAndWriteMove","projectName","enumValues","v","generateResources","config","path","componentName","resource","code","generateSimpleComponentCode","formatAndWriteMove","type","generateComponentCode","projectName","valueType","isEnum","isBasicType","enumModule","toSnakeCase","getBcsType","str","letter","fields","keys","isAllKeys","name","valueFields","valueFieldNames","isSingleValue","enumTypes","_","item","index","self","t","tableFunctions","generateTableFunctions","e","structFields","constructorParams","constructorAssignments","getters","toPascalCase","setters","includeStruct","keyFields","acc","key","keyNames","valueNames","keyParams","k","keyTupleCode","tableIdFunctions","n","registerFunction","hasFunctions","deleteFunction","getterSetters","fieldType","enumType","getSetFunctions","structFunctions","encodeDecodeFunctions","word","innerType","path","schemaGen","rootDir","config","network","projectDir","existsSync","deleteFolderRecursive","generateToml","genesisPath","generateGenesis","initTestPath","generateInitTest","dappKeyPath","generateDappKey","deployHookPath","generateDeployHook","componentsPath","generateComponents","resourcesPath","generateResources","enumsPath","generateEnums","generateSchemaError","generateSystemsAndTests","generateMigrate","checkDuplicateKeys","config","componentKeys","resourceKeys","duplicates","key","defineDapp","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError","parseData","data","parsedData","key","value","handleArray","returnData","item","SubscriptionKind"]}
|