@sundaeswap/sprinkles 0.5.0 → 0.6.1
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/cjs/Sprinkle/__tests__/encryption.test.js +3 -1
- package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +3 -37
- package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/field-utils.test.js +170 -0
- package/dist/cjs/Sprinkle/__tests__/field-utils.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +377 -84
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/formatting.test.js +97 -0
- package/dist/cjs/Sprinkle/__tests__/formatting.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js +9 -5
- package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +9 -0
- package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/cjs/Sprinkle/index.js +174 -94
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/cjs/Sprinkle/menus/array-menu.js +195 -0
- package/dist/cjs/Sprinkle/menus/array-menu.js.map +1 -0
- package/dist/cjs/Sprinkle/menus/field-menu.js +161 -0
- package/dist/cjs/Sprinkle/menus/field-menu.js.map +1 -0
- package/dist/cjs/Sprinkle/menus/index.js +33 -0
- package/dist/cjs/Sprinkle/menus/index.js.map +1 -0
- package/dist/cjs/Sprinkle/menus/object-menu.js +324 -0
- package/dist/cjs/Sprinkle/menus/object-menu.js.map +1 -0
- package/dist/cjs/Sprinkle/prompts.js +68 -2
- package/dist/cjs/Sprinkle/prompts.js.map +1 -1
- package/dist/cjs/Sprinkle/type-guards.js +48 -1
- package/dist/cjs/Sprinkle/type-guards.js.map +1 -1
- package/dist/cjs/Sprinkle/types.js +24 -0
- package/dist/cjs/Sprinkle/types.js.map +1 -1
- package/dist/cjs/Sprinkle/utils/field-utils.js +154 -0
- package/dist/cjs/Sprinkle/utils/field-utils.js.map +1 -0
- package/dist/cjs/Sprinkle/utils/formatting.js +126 -0
- package/dist/cjs/Sprinkle/utils/formatting.js.map +1 -0
- package/dist/cjs/Sprinkle/utils/index.js +56 -0
- package/dist/cjs/Sprinkle/utils/index.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/encryption.test.js +3 -1
- package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js +3 -37
- package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/field-utils.test.js +168 -0
- package/dist/esm/Sprinkle/__tests__/field-utils.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +378 -85
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/formatting.test.js +95 -0
- package/dist/esm/Sprinkle/__tests__/formatting.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js +9 -5
- package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +9 -0
- package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
- package/dist/esm/Sprinkle/index.js +141 -96
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/menus/array-menu.js +190 -0
- package/dist/esm/Sprinkle/menus/array-menu.js.map +1 -0
- package/dist/esm/Sprinkle/menus/field-menu.js +155 -0
- package/dist/esm/Sprinkle/menus/field-menu.js.map +1 -0
- package/dist/esm/Sprinkle/menus/index.js +8 -0
- package/dist/esm/Sprinkle/menus/index.js.map +1 -0
- package/dist/esm/Sprinkle/menus/object-menu.js +318 -0
- package/dist/esm/Sprinkle/menus/object-menu.js.map +1 -0
- package/dist/esm/Sprinkle/prompts.js +59 -1
- package/dist/esm/Sprinkle/prompts.js.map +1 -1
- package/dist/esm/Sprinkle/type-guards.js +42 -0
- package/dist/esm/Sprinkle/type-guards.js.map +1 -1
- package/dist/esm/Sprinkle/types.js +24 -0
- package/dist/esm/Sprinkle/types.js.map +1 -1
- package/dist/esm/Sprinkle/utils/field-utils.js +145 -0
- package/dist/esm/Sprinkle/utils/field-utils.js.map +1 -0
- package/dist/esm/Sprinkle/utils/formatting.js +118 -0
- package/dist/esm/Sprinkle/utils/formatting.js.map +1 -0
- package/dist/esm/Sprinkle/utils/index.js +7 -0
- package/dist/esm/Sprinkle/utils/index.js.map +1 -0
- package/dist/types/Sprinkle/index.d.ts +9 -3
- package/dist/types/Sprinkle/index.d.ts.map +1 -1
- package/dist/types/Sprinkle/menus/array-menu.d.ts +31 -0
- package/dist/types/Sprinkle/menus/array-menu.d.ts.map +1 -0
- package/dist/types/Sprinkle/menus/field-menu.d.ts +34 -0
- package/dist/types/Sprinkle/menus/field-menu.d.ts.map +1 -0
- package/dist/types/Sprinkle/menus/index.d.ts +10 -0
- package/dist/types/Sprinkle/menus/index.d.ts.map +1 -0
- package/dist/types/Sprinkle/menus/object-menu.d.ts +34 -0
- package/dist/types/Sprinkle/menus/object-menu.d.ts.map +1 -0
- package/dist/types/Sprinkle/prompts.d.ts +25 -0
- package/dist/types/Sprinkle/prompts.d.ts.map +1 -1
- package/dist/types/Sprinkle/type-guards.d.ts +24 -1
- package/dist/types/Sprinkle/type-guards.d.ts.map +1 -1
- package/dist/types/Sprinkle/types.d.ts +53 -0
- package/dist/types/Sprinkle/types.d.ts.map +1 -1
- package/dist/types/Sprinkle/utils/field-utils.d.ts +47 -0
- package/dist/types/Sprinkle/utils/field-utils.d.ts.map +1 -0
- package/dist/types/Sprinkle/utils/formatting.d.ts +30 -0
- package/dist/types/Sprinkle/utils/formatting.d.ts.map +1 -0
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/Sprinkle/__tests__/encryption.test.ts +2 -0
- package/src/Sprinkle/__tests__/enhancements.test.ts +3 -42
- package/src/Sprinkle/__tests__/field-utils.test.ts +191 -0
- package/src/Sprinkle/__tests__/fill-in-struct.test.ts +393 -100
- package/src/Sprinkle/__tests__/formatting.test.ts +115 -0
- package/src/Sprinkle/__tests__/show-menu.test.ts +14 -8
- package/src/Sprinkle/__tests__/tx-dialog.test.ts +9 -0
- package/src/Sprinkle/index.ts +175 -122
- package/src/Sprinkle/menus/array-menu.ts +191 -0
- package/src/Sprinkle/menus/field-menu.ts +145 -0
- package/src/Sprinkle/menus/index.ts +12 -0
- package/src/Sprinkle/menus/object-menu.ts +336 -0
- package/src/Sprinkle/prompts.ts +71 -1
- package/src/Sprinkle/type-guards.ts +42 -0
- package/src/Sprinkle/types.ts +43 -0
- package/src/Sprinkle/utils/field-utils.ts +158 -0
- package/src/Sprinkle/utils/formatting.ts +127 -0
- package/src/Sprinkle/utils/index.ts +17 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_sdk","require","_core","_prompts","_typebox","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","fs","_interopRequireWildcard","path","_types","_schemas","_typeGuards","_wallet","_encryption","_txDialog","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","set","getOwnPropertyDescriptor","_defineProperty","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","Sprinkle","constructor","type","storagePath","options","name","createdAt","updatedAt","currentProfile","profileId","id","profileMeta","sanitizeProfileId","toLowerCase","replace","profilesDir","join","profilePath","test","includes","Error","activeProfilePath","findAvailableId","baseId","candidate","counter","existsSync","scanProfiles","dir","files","readdirSync","filter","endsWith","entries","file","content","readFileSync","parsed","JSON","parse","bigIntReviver","meta","push","loadProfile","filePath","settings","decryptSettings","defaults","writeFileSync","saveProfile","dirname","mkdirSync","recursive","Date","toISOString","settingsToSave","encryptSettings","jsonContent","stringify","bigIntReplacer","promptProfileMeta","defaultName","defaultDescription","inputCancellable","message","validate","v","trim","length","description","undefined","createProfile","result","now","prevProfileId","prevProfileMeta","prevDefaults","prevSettings","FillInStruct","UserCancelledError","migrateIfNeeded","legacyPath","SettingsPath","profileData","renameSync","selectOrCreateProfile","profiles","pointerPath","activeId","some","p","selectProfile","available","selection","selectCancellable","choices","map","duplicateProfile","console","log","renameProfile","newId","oldId","newPath","unlinkSync","deleteProfile","others","toDelete","profileToDelete","find","confirmed","confirmCancellable","showMenu","menu","_showMenu","main","beforeShow","items","item","index","title","selectionResult","settingsMenu","action","getDisplaySettings","EditStruct","saveSettings","selectedItem","New","sprinkle","GetProvider","network","GetProviderFn","GetWallet","provider","GetWalletFn","GetBlaze","providerSettings","walletSettings","GetBlazeFn","generateWalletFromMnemonic","SearchSelect","opts","searchCancellable","sep","LoadSettings","fileContent","error","encryption","encryptSensitiveFields","decryptSensitiveFields","maskSensitiveFields","TxDialog","blaze","tx","currentTx","expanded","hasSignedThisSession","isHotWallet","wallet","HotWallet","walletVkeys","addresses","getUsedAddresses","address","txHash","getTxBodyHash","sigCount","countSignatures","requiredSigners","getRequiredSigners","formatHash","signer","txCbor","toCbor","slice","beforeSign","needsStakeKey","userAddress","stakeCredential","asBase","getStakeCredential","stakeKeyHash","hash","toString","reqSigners","body","signerArray","Array","from","values","certs","hasCertificates","size","withdrawals","hasWithdrawals","warn","signed","signTransaction","ws","witnessSet","existingVkeys","vkeys","toCore","signedKeys","newSignedKeys","existingPubKeys","Set","vkey","uniqueNewKeys","setVkeys","CborSet","fromCore","VkeyWitness","setWitnessSet","signedTx","added","mergeSignatures","clipboard","Promise","resolve","then","writeSync","cborInput","importedTx","Core","Transaction","fromCbor","TxCBOR","currentHash","importedHash","proceed","sourceVkeys","sourceCount","skipped","txId","submitTransaction","current","_editStruct","isObject","obj","fields","menuItems","currentRecord","field","fieldType","menuTitle","ExtractMessage","isOptional","fieldValue","concat","editMenu","_fillInStruct","def","defs","resolvedType","shouldSet","innerType","OptionalKind","isUnion","resolved","resolveType","variant","anyOf","isString","choice","answer","passwordCancellable","defaultString","isSensitive","isBigInt","s","BigInt","isLiteral","const","isArray","arr","itemType","addMore","itemValue","continueAnswer","isTuple","isRef","isThis","isImport","$defs","realType","$ref","fieldNames"],"sources":["../../../src/Sprinkle/index.ts"],"sourcesContent":["import { type Provider } from \"@blaze-cardano/query\";\nimport {\n Blaze,\n Core,\n HotWallet,\n type Wallet,\n} from \"@blaze-cardano/sdk\";\nimport { CborSet, VkeyWitness, TxCBOR } from \"@blaze-cardano/core\";\nimport {\n selectCancellable,\n inputCancellable,\n passwordCancellable,\n confirmCancellable,\n searchCancellable,\n select,\n} from \"./prompts.js\";\nimport { type TSchema, Type, OptionalKind } from \"@sinclair/typebox\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nexport * from \"@sinclair/typebox\";\n\n// Re-export types from types.ts\nexport type { TExact } from \"./types.js\";\nexport type {\n IEncryptionOptions,\n ISprinkleOptions,\n IProfileMeta,\n ICurrentProfile,\n IProfileEntry,\n TxDialogResult,\n TxDialogOptions,\n} from \"./types.js\";\nexport { UserCancelledError } from \"./types.js\";\nimport type {\n TExact,\n IEncryptionOptions,\n ISprinkleOptions,\n IProfileMeta,\n ICurrentProfile,\n IProfileEntry,\n TxDialogResult,\n TxDialogOptions,\n} from \"./types.js\";\nimport { UserCancelledError } from \"./types.js\";\n\n// Re-export schemas from schemas.ts\nexport {\n NetworkSchema,\n MultisigScriptModule,\n MultisigScript,\n ProviderSettingsSchema,\n WalletSettingsSchema,\n} from \"./schemas.js\";\nexport type { TMultisigScript } from \"./schemas.js\";\n\n// Import and re-export type guards\nimport {\n isOptional,\n isImport,\n isArray,\n isBigInt,\n isLiteral,\n isObject,\n isRef,\n isString,\n isThis,\n isTuple,\n isUnion,\n isSensitive,\n} from \"./type-guards.js\";\nexport {\n isOptional,\n isImport,\n isArray,\n isBigInt,\n isLiteral,\n isObject,\n isRef,\n isString,\n isThis,\n isTuple,\n isUnion,\n isSensitive,\n} from \"./type-guards.js\";\n\n// Import schemas for use in this file\nimport {\n NetworkSchema,\n ProviderSettingsSchema,\n WalletSettingsSchema,\n} from \"./schemas.js\";\n\n// Import and re-export wallet utilities\nimport {\n GetProvider as GetProviderFn,\n GetWallet as GetWalletFn,\n GetBlaze as GetBlazeFn,\n generateWalletFromMnemonic,\n} from \"./wallet.js\";\nexport { GetProvider, GetWallet, GetBlaze } from \"./wallet.js\";\n\n// Import encryption utilities\nimport {\n collectSensitivePaths,\n getNestedValue,\n setNestedValue,\n bigIntReplacer,\n bigIntReviver,\n encryptSensitiveFields,\n decryptSensitiveFields,\n maskSensitiveFields,\n} from \"./encryption.js\";\n\n// Import tx-dialog utilities\nimport {\n getWalletPaymentKeyHash,\n countSignatures,\n hasVkeySigned,\n getRequiredSigners,\n getTxBodyHash,\n formatHash,\n mergeSignatures,\n} from \"./tx-dialog.js\";\n\nexport interface IMenuAction<S extends TSchema> {\n title: string;\n action: (sprinkle: Sprinkle<S>) => Promise<Sprinkle<S> | void>;\n}\nexport type TMenuItem<S extends TSchema> = IMenuAction<S> | IMenu<S>;\nexport interface IMenu<S extends TSchema> {\n title: string;\n items: TMenuItem<S>[];\n beforeShow?: (sprinkle: Sprinkle<S>) => Promise<void>;\n}\n\nexport class Sprinkle<S extends TSchema> {\n storagePath: string;\n settings: TExact<S> = {} as TExact<S>;\n type: S;\n defaults: Record<string, unknown> = {};\n options: ISprinkleOptions;\n profileId: string = \"\";\n profileMeta: IProfileMeta = { name: \"\", createdAt: \"\", updatedAt: \"\" };\n\n constructor(type: S, storagePath: string, options?: ISprinkleOptions) {\n this.type = type;\n this.storagePath = storagePath;\n this.options = options ?? {};\n }\n\n // --- Current Profile Accessor ---\n\n get currentProfile(): ICurrentProfile | null {\n if (!this.profileId) return null;\n return {\n id: this.profileId,\n ...this.profileMeta,\n };\n }\n\n // --- Profile path helpers ---\n\n static sanitizeProfileId(name: string): string {\n return (\n name\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/[\\s]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"profile\"\n );\n }\n\n private static profilesDir(storagePath: string): string {\n return path.join(storagePath, \"profiles\");\n }\n\n private static profilePath(storagePath: string, id: string): string {\n if (!id || /[\\/\\\\]/.test(id) || id.includes(\"..\")) {\n throw new Error(`Invalid profile ID: \"${id}\"`);\n }\n return path.join(storagePath, \"profiles\", `${id}.json`);\n }\n\n private static activeProfilePath(storagePath: string): string {\n return path.join(storagePath, \"active-profile\");\n }\n\n private static findAvailableId(profilesDir: string, baseId: string): string {\n let candidate = baseId;\n let counter = 2;\n while (fs.existsSync(path.join(profilesDir, `${candidate}.json`))) {\n candidate = `${baseId}-${counter}`;\n counter++;\n }\n return candidate;\n }\n\n // --- Profile I/O ---\n\n scanProfiles(): IProfileEntry[] {\n const dir = Sprinkle.profilesDir(this.storagePath);\n if (!fs.existsSync(dir)) return [];\n const files = fs.readdirSync(dir).filter((f) => f.endsWith(\".json\"));\n const entries: IProfileEntry[] = [];\n for (const file of files) {\n try {\n const content = fs.readFileSync(path.join(dir, file), \"utf-8\");\n const parsed = JSON.parse(content, Sprinkle.bigIntReviver);\n if (parsed.meta?.name) {\n entries.push({\n id: file.replace(/\\.json$/, \"\"),\n meta: parsed.meta,\n });\n }\n } catch {\n // Skip malformed profile files\n }\n }\n return entries;\n }\n\n async loadProfile(id: string): Promise<void> {\n const filePath = Sprinkle.profilePath(this.storagePath, id);\n const content = fs.readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(content, Sprinkle.bigIntReviver);\n this.profileId = id;\n this.profileMeta = parsed.meta;\n this.settings = await this.decryptSettings(parsed.settings as TExact<S>);\n this.defaults = parsed.defaults ?? {};\n // Update active profile pointer\n fs.writeFileSync(Sprinkle.activeProfilePath(this.storagePath), id, \"utf-8\");\n }\n\n private saveProfile(): void {\n if (!this.profileId) {\n throw new Error(\n \"Cannot save profile: no profile is loaded. Call loadProfile() or create a profile first.\",\n );\n }\n const filePath = Sprinkle.profilePath(this.storagePath, this.profileId);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n this.profileMeta.updatedAt = new Date().toISOString();\n const settingsToSave = this.encryptSettings(this.settings);\n const jsonContent = JSON.stringify(\n {\n meta: this.profileMeta,\n settings: settingsToSave,\n defaults: this.defaults,\n },\n bigIntReplacer,\n 2,\n );\n fs.writeFileSync(filePath, jsonContent, \"utf-8\");\n }\n\n private async promptProfileMeta(\n defaultName?: string,\n defaultDescription?: string,\n ): Promise<{ name: string; description?: string } | null> {\n const name = await inputCancellable({\n message: \"Profile name:\",\n default: defaultName,\n validate: (v) => (v.trim().length > 0 ? true : \"Name cannot be empty\"),\n });\n if (name === null) return null; // User cancelled\n const description = await inputCancellable({\n message: \"Profile description (optional):\",\n default: defaultDescription ?? \"\",\n });\n if (description === null) return null; // User cancelled\n return { name, description: description || undefined };\n }\n\n private async createProfile(): Promise<void> {\n const result = await this.promptProfileMeta();\n if (result === null) return; // User cancelled\n const { name, description } = result;\n const profilesDir = Sprinkle.profilesDir(this.storagePath);\n const id = Sprinkle.findAvailableId(\n profilesDir,\n Sprinkle.sanitizeProfileId(name),\n );\n const now = new Date().toISOString();\n\n // Snapshot current state in case we need to restore on cancellation\n const prevProfileId = this.profileId;\n const prevProfileMeta = this.profileMeta;\n const prevDefaults = this.defaults;\n const prevSettings = this.settings;\n\n this.profileId = id;\n this.profileMeta = { name, description, createdAt: now, updatedAt: now };\n this.defaults = {};\n try {\n this.settings = await this.FillInStruct(this.type);\n } catch (e) {\n // Restore previous state on cancellation\n if (e instanceof UserCancelledError) {\n this.profileId = prevProfileId;\n this.profileMeta = prevProfileMeta;\n this.defaults = prevDefaults;\n this.settings = prevSettings;\n return;\n }\n throw e;\n }\n this.saveProfile();\n fs.writeFileSync(Sprinkle.activeProfilePath(this.storagePath), id, \"utf-8\");\n }\n\n private async migrateIfNeeded(): Promise<void> {\n const profilesDir = Sprinkle.profilesDir(this.storagePath);\n const legacyPath = Sprinkle.SettingsPath(this.storagePath);\n\n if (!fs.existsSync(profilesDir)) {\n if (fs.existsSync(legacyPath)) {\n // Migrate legacy settings.json -> profiles/default.json\n const content = fs.readFileSync(legacyPath, \"utf-8\");\n const parsed = JSON.parse(content, Sprinkle.bigIntReviver);\n const now = new Date().toISOString();\n const profileData = {\n meta: {\n name: \"Default\",\n createdAt: now,\n updatedAt: now,\n },\n settings: parsed.settings,\n defaults: parsed.defaults ?? {},\n };\n fs.mkdirSync(profilesDir, { recursive: true });\n fs.writeFileSync(\n Sprinkle.profilePath(this.storagePath, \"default\"),\n JSON.stringify(profileData, bigIntReplacer, 2),\n \"utf-8\",\n );\n fs.writeFileSync(\n Sprinkle.activeProfilePath(this.storagePath),\n \"default\",\n \"utf-8\",\n );\n // Backup legacy file\n fs.renameSync(legacyPath, `${legacyPath}.bak`);\n } else {\n fs.mkdirSync(profilesDir, { recursive: true });\n }\n }\n }\n\n private async selectOrCreateProfile(): Promise<void> {\n const profiles = this.scanProfiles();\n\n if (profiles.length === 0) {\n await this.createProfile();\n return;\n }\n\n if (profiles.length === 1) {\n await this.loadProfile(profiles[0]!.id);\n return;\n }\n\n // Multiple profiles: check active-profile pointer\n const pointerPath = Sprinkle.activeProfilePath(this.storagePath);\n if (fs.existsSync(pointerPath)) {\n const activeId = fs.readFileSync(pointerPath, \"utf-8\").trim();\n if (profiles.some((p) => p.id === activeId)) {\n await this.loadProfile(activeId);\n return;\n }\n }\n\n // No valid pointer - show selector\n await this.selectProfile(profiles);\n }\n\n private async selectProfile(profiles?: IProfileEntry[]): Promise<void> {\n const available = profiles ?? this.scanProfiles();\n const selection = await selectCancellable({\n message: \"Select a profile:\",\n choices: available.map((p) => ({\n name: p.meta.description\n ? `${p.meta.name} - ${p.meta.description}`\n : p.meta.name,\n value: p.id,\n })),\n });\n if (selection === null) return; // User cancelled\n await this.loadProfile(selection as string);\n }\n\n // --- Profile management (CRUD) ---\n\n private async duplicateProfile(): Promise<void> {\n const result = await this.promptProfileMeta(\n `${this.profileMeta.name} (copy)`,\n this.profileMeta.description,\n );\n if (result === null) return; // User cancelled\n const { name, description } = result;\n const profilesDir = Sprinkle.profilesDir(this.storagePath);\n const id = Sprinkle.findAvailableId(\n profilesDir,\n Sprinkle.sanitizeProfileId(name),\n );\n const now = new Date().toISOString();\n // Write duplicate with current settings\n const settingsToSave = this.encryptSettings(this.settings);\n const jsonContent = JSON.stringify(\n {\n meta: { name, description, createdAt: now, updatedAt: now },\n settings: settingsToSave,\n defaults: this.defaults,\n },\n bigIntReplacer,\n 2,\n );\n fs.writeFileSync(\n path.join(profilesDir, `${id}.json`),\n jsonContent,\n \"utf-8\",\n );\n console.log(`Profile \"${name}\" created as a copy.`);\n }\n\n private async renameProfile(): Promise<void> {\n const result = await this.promptProfileMeta(\n this.profileMeta.name,\n this.profileMeta.description,\n );\n if (result === null) return; // User cancelled\n const { name, description } = result;\n const newId = Sprinkle.sanitizeProfileId(name);\n const oldId = this.profileId;\n\n this.profileMeta.name = name;\n this.profileMeta.description = description;\n\n if (newId !== oldId) {\n const newPath = Sprinkle.profilePath(this.storagePath, newId);\n if (fs.existsSync(newPath)) {\n console.log(\n `A profile with ID \"${newId}\" already exists. Choose a different name.`,\n );\n return;\n }\n // Save to new path, remove old file\n this.profileId = newId;\n this.saveProfile();\n fs.unlinkSync(Sprinkle.profilePath(this.storagePath, oldId));\n fs.writeFileSync(\n Sprinkle.activeProfilePath(this.storagePath),\n newId,\n \"utf-8\",\n );\n } else {\n this.saveProfile();\n }\n console.log(`Profile renamed to \"${name}\".`);\n }\n\n private async deleteProfile(): Promise<void> {\n const profiles = this.scanProfiles();\n const others = profiles.filter((p) => p.id !== this.profileId);\n\n if (others.length === 0) {\n console.log(\"Cannot delete the only profile.\");\n return;\n }\n\n const toDelete = await selectCancellable({\n message: \"Select a profile to delete:\",\n choices: others.map((p) => ({\n name: p.meta.description\n ? `${p.meta.name} - ${p.meta.description}`\n : p.meta.name,\n value: p.id,\n })),\n });\n\n if (toDelete === null) return; // User cancelled\n\n const profileId = toDelete as string;\n const profileToDelete = others.find((p) => p.id === profileId);\n const confirmed = await confirmCancellable({\n message: `Delete profile \"${profileToDelete?.meta.name ?? profileId}\"? This cannot be undone.`,\n default: false,\n });\n\n if (confirmed === null) return; // User cancelled\n\n if (confirmed) {\n fs.unlinkSync(Sprinkle.profilePath(this.storagePath, profileId));\n console.log(\n `Profile \"${profileToDelete?.meta.name ?? profileId}\" deleted.`,\n );\n }\n }\n\n // --- Menu ---\n\n async showMenu(menu: IMenu<S>): Promise<void> {\n return this._showMenu(menu, true);\n }\n\n private async _showMenu(menu: IMenu<S>, main: boolean): Promise<void> {\n if (menu.beforeShow) {\n await menu.beforeShow(this);\n }\n const choices = menu.items.map((item, index) => {\n if (\"action\" in item) {\n return { name: item.title, value: index };\n } else {\n return { name: `${item.title} Submenu`, value: index };\n }\n });\n if (!main) {\n choices.push({ name: \"Back\", value: -1 });\n } else {\n choices.push({ name: \"Settings & Profiles\", value: -5 });\n choices.push({ name: \"Exit\", value: -1 });\n }\n const selectionResult = await selectCancellable({\n message: \"Select an option:\",\n choices: choices,\n });\n // Handle escape (null) as Back\n if (selectionResult === null) {\n return;\n }\n const selection = selectionResult as number;\n if (selection === -5) {\n const settingsMenu: IMenu<S> = {\n title: \"Settings & Profiles\",\n items: [\n {\n title: \"View settings\",\n action: async () => {\n console.log(\n JSON.stringify(this.getDisplaySettings(), bigIntReplacer, 2),\n );\n },\n },\n {\n title: \"Edit settings\",\n action: async () => {\n this.settings = await this.EditStruct(this.type, this.settings);\n this.saveSettings();\n },\n },\n {\n title: \"Switch profile\",\n action: async () => {\n this.saveSettings();\n const profiles = this.scanProfiles();\n if (profiles.length <= 1) {\n console.log(\n \"No other profiles to switch to. Create a new one first.\",\n );\n } else {\n await this.selectProfile(profiles);\n }\n },\n },\n {\n title: \"Create new profile\",\n action: async () => {\n await this.createProfile();\n },\n },\n {\n title: \"Duplicate current profile\",\n action: async () => {\n await this.duplicateProfile();\n },\n },\n {\n title: \"Rename current profile\",\n action: async () => {\n await this.renameProfile();\n },\n },\n {\n title: \"Delete a profile\",\n action: async () => {\n await this.deleteProfile();\n },\n },\n ],\n };\n await this._showMenu(settingsMenu, false);\n await this._showMenu(menu, main);\n return;\n }\n if (selection === -1) {\n return;\n }\n const selectedItem = menu.items[selection]!;\n if (\"action\" in selectedItem) {\n const result = await selectedItem.action(this);\n if (result instanceof Sprinkle) {\n this.settings = result.settings;\n this.saveSettings();\n }\n await this._showMenu(menu, main);\n } else {\n await this._showMenu(selectedItem, false);\n await this._showMenu(menu, main);\n }\n return;\n }\n\n static async New<S extends TSchema>(\n type: S,\n storagePath: string,\n options?: ISprinkleOptions,\n ): Promise<Sprinkle<S>> {\n const sprinkle = new Sprinkle<S>(type, storagePath, options);\n await sprinkle.migrateIfNeeded();\n await sprinkle.selectOrCreateProfile();\n sprinkle.saveSettings();\n return sprinkle;\n }\n\n static async GetProvider(\n network: TExact<typeof NetworkSchema>,\n settings: TExact<typeof ProviderSettingsSchema>,\n ): Promise<Provider> {\n return GetProviderFn(network, settings);\n }\n\n static async GetWallet(\n settings: TExact<typeof WalletSettingsSchema>,\n provider: Provider,\n ): Promise<Wallet> {\n return GetWalletFn(settings, provider);\n }\n\n static async GetBlaze(\n network: TExact<typeof NetworkSchema>,\n providerSettings: TExact<typeof ProviderSettingsSchema>,\n walletSettings: TExact<typeof WalletSettingsSchema>,\n ): Promise<Blaze<Provider, Wallet>> {\n return GetBlazeFn(network, providerSettings, walletSettings);\n }\n\n /**\n * Generates a new wallet from a BIP39 mnemonic phrase.\n * Displays the 24-word recovery phrase and requires user confirmation.\n * @returns The Bip32PrivateKey hex string for storage\n */\n private static async generateWalletFromMnemonic(): Promise<string> {\n return generateWalletFromMnemonic();\n }\n\n static async SearchSelect<T>(opts: {\n message: string;\n source: (\n term: string | undefined,\n ) => Promise<{ name: string; value: T }[]> | { name: string; value: T }[];\n }): Promise<T | null> {\n return searchCancellable(opts) as Promise<T | null>;\n }\n\n static SettingsPath(storagePath: string): string {\n return `${storagePath}${path.sep}settings.json`;\n }\n\n async LoadSettings(type: S, storagePath: string): Promise<void> {\n try {\n // Check if the settings file exists\n if (fs.existsSync(storagePath)) {\n // Read and parse the JSON file\n const fileContent = fs.readFileSync(storagePath, \"utf-8\");\n const parsed = JSON.parse(fileContent, Sprinkle.bigIntReviver) as {\n settings: unknown;\n defaults: Record<string, unknown>;\n };\n // Convert string representations back to BigInt where needed\n this.settings = await this.decryptSettings(\n parsed.settings as TExact<S>,\n );\n this.defaults = parsed.defaults;\n } else {\n this.defaults = {};\n this.settings = await this.FillInStruct(type);\n }\n } catch (error) {\n throw new Error(`Error loading settings from ${storagePath}: ${error}`);\n }\n }\n\n static bigIntReviver(key: string, value: unknown): unknown {\n return bigIntReviver(key, value);\n }\n\n private encryptSettings(settings: TExact<S>): TExact<S> {\n if (!this.options.encryption) return settings;\n return encryptSensitiveFields(settings, this.type, this.options.encryption);\n }\n\n private async decryptSettings(settings: TExact<S>): Promise<TExact<S>> {\n if (!this.options.encryption) return settings;\n return decryptSensitiveFields(settings, this.type, this.options.encryption);\n }\n\n saveSettings(): void {\n this.saveProfile();\n }\n\n getDisplaySettings(): TExact<S> {\n return maskSensitiveFields(this.settings, this.type);\n }\n\n async TxDialog<P extends Provider, W extends Wallet>(\n blaze: Blaze<P, W>,\n tx: Core.Transaction,\n opts?: TxDialogOptions,\n ): Promise<TxDialogResult> {\n let currentTx = tx;\n let expanded = false;\n let hasSignedThisSession = false;\n\n // Check if wallet can sign (is HotWallet)\n const isHotWallet = blaze.wallet instanceof HotWallet;\n\n // Get wallet's vkeys for detecting if already signed\n let walletVkeys: string[] = [];\n if (isHotWallet) {\n try {\n // Sign a dummy to get the wallet's public keys\n // We'll use this to check if wallet has already signed\n const wallet = blaze.wallet as unknown as HotWallet;\n const addresses = await wallet.getUsedAddresses();\n const address = addresses[0];\n if (address) {\n // We can't easily get vkeys without signing, so we'll track after first sign\n }\n } catch {\n // Ignore errors in setup\n }\n }\n\n while (true) {\n // Display transaction status\n const txHash = getTxBodyHash(currentTx);\n const sigCount = countSignatures(currentTx);\n const requiredSigners = getRequiredSigners(currentTx);\n\n console.log(\"\");\n console.log(`Transaction: ${formatHash(txHash)}`);\n if (requiredSigners.length > 0) {\n console.log(`Signatures: ${sigCount} of ${requiredSigners.length} required`);\n console.log(\"Required signers:\");\n for (const signer of requiredSigners) {\n console.log(` - ${formatHash(signer)}`);\n }\n } else {\n console.log(`Signatures: ${sigCount}`);\n }\n\n // Display CBOR\n const txCbor = currentTx.toCbor();\n if (expanded) {\n console.log(\"Transaction CBOR:\", txCbor);\n } else {\n console.log(\"Transaction CBOR:\", `${String(txCbor).slice(0, 50)}...`);\n }\n\n // Build dynamic menu choices\n const choices: { name: string; value: string }[] = [];\n\n // \"Sign with this wallet\" - only if HotWallet and hasn't signed this session\n if (isHotWallet && !hasSignedThisSession) {\n choices.push({ name: \"Sign with this wallet\", value: \"sign\" });\n }\n\n // CBOR options\n if (!expanded) {\n choices.push({ name: \"Expand CBOR\", value: \"expand\" });\n }\n choices.push({ name: \"Copy CBOR to clipboard\", value: \"copy\" });\n choices.push({ name: \"Import signatures from CBOR\", value: \"import\" });\n\n // Submit and cancel\n choices.push({ name: \"Submit transaction\", value: \"submit\" });\n choices.push({ name: \"Cancel\", value: \"cancel\" });\n\n const selection = await selectCancellable({\n message: \"Select an option:\",\n choices,\n });\n\n // Handle escape/cancel as cancel action\n if (selection === null) {\n if (hasSignedThisSession) {\n return { action: \"signed\", tx: currentTx };\n }\n return { action: \"cancelled\", tx: currentTx };\n }\n\n // Handle selection\n if (selection === \"sign\") {\n if (opts?.beforeSign) {\n await opts.beforeSign();\n }\n\n // Detect if stake key signature is required\n let needsStakeKey = false;\n try {\n const wallet = blaze.wallet as unknown as HotWallet;\n const addresses = await wallet.getUsedAddresses();\n const userAddress = addresses[0];\n if (userAddress) {\n const stakeCredential = userAddress.asBase()?.getStakeCredential();\n const stakeKeyHash = stakeCredential?.hash?.toString();\n\n if (stakeKeyHash) {\n const reqSigners = currentTx.body().requiredSigners();\n if (reqSigners) {\n const signerArray = Array.from(reqSigners.values());\n needsStakeKey = signerArray.some(\n (signer) => signer.toString() === stakeKeyHash,\n );\n }\n\n const certs = currentTx.body().certs();\n const hasCertificates = certs && certs.size() > 0;\n const withdrawals = currentTx.body().withdrawals();\n const hasWithdrawals = withdrawals && withdrawals.size > 0;\n\n if (hasCertificates || hasWithdrawals) {\n needsStakeKey = true;\n }\n }\n }\n\n if (needsStakeKey) {\n console.log(\"Transaction requires stake key signature.\");\n } else {\n console.log(\"Transaction requires payment key signature only.\");\n }\n } catch (error) {\n console.warn(\n \"Could not determine stake key requirement, signing with payment key only.\",\n );\n console.warn(`Error: ${(error as Error).message}`);\n }\n\n try {\n if (needsStakeKey) {\n const wallet = blaze.wallet as unknown as HotWallet;\n const signed = await wallet.signTransaction(currentTx, true, true);\n const ws = currentTx.witnessSet();\n const existingVkeys = ws.vkeys()?.toCore() ?? [];\n\n const signedKeys = signed.vkeys();\n if (!signedKeys) {\n throw new Error(\n \"signTransaction: no signed keys in wallet witness response\",\n );\n }\n\n // Check for duplicates before adding\n const newSignedKeys = signedKeys.toCore();\n const existingPubKeys = new Set(existingVkeys.map(([vkey]) => vkey));\n const uniqueNewKeys = newSignedKeys.filter(\n ([vkey]) => !existingPubKeys.has(vkey),\n );\n\n if (uniqueNewKeys.length === 0) {\n console.log(\"Wallet has already signed this transaction.\");\n } else {\n ws.setVkeys(\n CborSet.fromCore(\n [...existingVkeys, ...uniqueNewKeys],\n VkeyWitness.fromCore,\n ),\n );\n currentTx.setWitnessSet(ws);\n console.log(`Added ${uniqueNewKeys.length} signature(s).`);\n hasSignedThisSession = true;\n }\n } else {\n const signedTx = await blaze.signTransaction(currentTx);\n // Merge signatures from signed tx into current tx\n const added = mergeSignatures(currentTx, signedTx);\n if (added > 0) {\n console.log(`Added ${added} signature(s).`);\n hasSignedThisSession = true;\n } else {\n console.log(\"Wallet has already signed this transaction.\");\n }\n }\n } catch (error) {\n console.error(`Signing failed: ${(error as Error).message}`);\n }\n // Continue loop after signing\n continue;\n }\n\n if (selection === \"expand\") {\n expanded = true;\n continue;\n }\n\n if (selection === \"copy\") {\n try {\n const { default: clipboard } = await import(\"clipboardy\");\n clipboard.writeSync(String(currentTx.toCbor()));\n console.log(\"Transaction CBOR copied to clipboard.\");\n } catch {\n console.log(\"Failed to copy to clipboard, expanding instead.\");\n expanded = true;\n }\n continue;\n }\n\n if (selection === \"import\") {\n const cborInput = await inputCancellable({\n message: \"Paste transaction CBOR (hex):\",\n });\n\n if (cborInput === null || cborInput.trim() === \"\") {\n console.log(\"No CBOR provided.\");\n continue;\n }\n\n try {\n const importedTx = Core.Transaction.fromCbor(\n TxCBOR(cborInput.trim()),\n );\n\n // Validate body hash matches\n const currentHash = getTxBodyHash(currentTx);\n const importedHash = getTxBodyHash(importedTx);\n\n if (currentHash !== importedHash) {\n const proceed = await confirmCancellable({\n message: `Warning: Imported transaction has different body hash.\\nCurrent: ${formatHash(currentHash)}\\nImported: ${formatHash(importedHash)}\\nProceed anyway?`,\n default: false,\n });\n if (proceed === null || !proceed) {\n console.log(\"Import cancelled.\");\n continue;\n }\n }\n\n // Merge signatures\n const added = mergeSignatures(currentTx, importedTx);\n const sourceVkeys = importedTx.witnessSet().vkeys();\n const sourceCount = sourceVkeys ? sourceVkeys.size() : 0;\n const skipped = sourceCount - added;\n\n if (added > 0) {\n console.log(`Added ${added} new signature(s).`);\n }\n if (skipped > 0) {\n console.log(`Skipped ${skipped} duplicate signature(s).`);\n }\n if (added === 0 && skipped === 0) {\n console.log(\"No signatures found in imported transaction.\");\n }\n } catch (error) {\n console.error(`Failed to import CBOR: ${(error as Error).message}`);\n }\n continue;\n }\n\n if (selection === \"submit\") {\n const sigCount = countSignatures(currentTx);\n if (sigCount === 0) {\n const proceed = await confirmCancellable({\n message: \"Warning: Transaction has no signatures. Submit anyway?\",\n default: false,\n });\n if (proceed === null || !proceed) {\n continue;\n }\n }\n\n try {\n const txId = await blaze.submitTransaction(currentTx);\n console.log(`Transaction submitted: ${txId}`);\n return { action: \"submitted\", txId, tx: currentTx };\n } catch (error) {\n console.error(`Submit failed: ${(error as Error).message}`);\n // Continue loop to allow retry or other actions\n continue;\n }\n }\n\n if (selection === \"cancel\") {\n if (hasSignedThisSession) {\n return { action: \"signed\", tx: currentTx };\n }\n return { action: \"cancelled\", tx: currentTx };\n }\n }\n }\n\n async EditStruct<U extends TSchema>(\n type: U,\n current: TExact<U>,\n ): Promise<TExact<U>> {\n return this._editStruct<U>(type, [\"root\"], current);\n }\n\n async _editStruct<U extends TSchema>(\n type: U,\n path: string[],\n current?: TExact<U>,\n ): Promise<TExact<U>> {\n if (isObject(type)) {\n const obj = {} as Record<string, unknown>;\n const fields = type[\"properties\"] as Record<string, U>;\n const menuItems: TMenuItem<S>[] = [];\n const currentRecord = current as Record<string, unknown>;\n for (const [field, fieldType] of Object.entries(fields)) {\n if (current && field in currentRecord) {\n obj[field] = currentRecord[field] as TExact<U>;\n }\n const menuTitle = Sprinkle.ExtractMessage(\n fieldType,\n `Edit ${field} at ${path.join(\".\")}`,\n );\n if (\n isOptional(fieldType) &&\n current &&\n currentRecord[field] !== undefined\n ) {\n menuItems.push({\n title: `Clear ${field}`,\n action: async (sprinkle: Sprinkle<S>) => {\n obj[field] = undefined;\n return sprinkle;\n },\n });\n }\n menuItems.push({\n title: menuTitle,\n action: async (sprinkle: Sprinkle<S>) => {\n const fieldValue = await sprinkle._editStruct(\n fieldType,\n path.concat([field]),\n current && field in currentRecord\n ? (currentRecord[field] as TExact<U>)\n : undefined,\n );\n obj[field] = fieldValue;\n return sprinkle;\n },\n });\n }\n const editMenu: IMenu<S> = {\n title: \"Test\",\n items: menuItems,\n };\n await this._showMenu(editMenu, false);\n return obj as TExact<U>;\n }\n\n return this._fillInStruct<U>(type, path, {}, current);\n }\n\n async FillInStruct<U extends TSchema>(\n type: U,\n def?: TExact<U>,\n ): Promise<TExact<U>> {\n return this._fillInStruct<U>(type, [\"root\"], {}, def);\n }\n\n async _fillInStruct<U extends TSchema>(\n type: U,\n path: string[],\n defs: Record<string, TSchema>,\n def?: TExact<U>,\n ): Promise<TExact<U>> {\n if (\"$ref\" in type) {\n defs = { ...defs, ...type[\"$defs\"] };\n const resolvedType = defs[type[\"$ref\"]];\n if (!resolvedType) {\n throw new Error(\n `Could not resolve type ${type[\"$ref\"]} at ${path.join(\".\")}`,\n );\n }\n return this._fillInStruct(resolvedType, path, defs, def) as Promise<\n TExact<U>\n >;\n }\n if (isOptional(type)) {\n const shouldSet = await selectCancellable({\n message: Sprinkle.ExtractMessage(\n type,\n `Set value for ${path.join(\".\")}?`,\n ),\n choices: [\n { name: \"Yes\", value: true },\n { name: \"Skip\", value: false },\n ],\n default: def !== undefined,\n });\n if (shouldSet === null) {\n throw new UserCancelledError();\n }\n if (!shouldSet) {\n return undefined as TExact<U>;\n }\n // Unwrap the optional and fill the inner type\n const innerType = { ...type };\n delete (innerType as any)[OptionalKind];\n return this._fillInStruct(innerType as U, path, defs, def);\n }\n\n if (isUnion(type)) {\n const choices = [];\n const resolved = this.resolveType(type, path, defs);\n for (const variant of resolved.anyOf) {\n choices.push({\n name: Sprinkle.ExtractMessage(variant, `${variant}`),\n value: variant,\n });\n }\n const selectionResult = await selectCancellable({\n message: Sprinkle.ExtractMessage(\n resolved,\n `Enter a choice for ${path.join(\".\")}`,\n ),\n choices: choices,\n default: def ? `${def}` : undefined,\n });\n if (selectionResult === null) {\n throw new UserCancelledError();\n }\n const selection = selectionResult as TSchema;\n return this._fillInStruct(selection, path, defs) as Promise<TExact<U>>;\n }\n\n if (isString(type)) {\n // Special handling for hot wallet private key - offer generation option\n if (type.title === \"Hot Wallet Private Key\") {\n const choice = await selectCancellable({\n message: \"Hot wallet setup:\",\n choices: [\n { name: \"Enter existing private key\", value: \"existing\" },\n { name: \"Generate new wallet\", value: \"generate\" },\n ],\n });\n\n if (choice === null) {\n throw new UserCancelledError();\n }\n if (choice === \"generate\") {\n return Sprinkle.generateWalletFromMnemonic() as Promise<TExact<U>>;\n }\n // Fall through to password prompt for \"existing\" choice\n const answer = await passwordCancellable({\n message: \"Enter your private key:\",\n });\n if (answer === null) {\n throw new UserCancelledError();\n }\n return answer as TExact<U>;\n }\n\n const defaultString = (def ? def : this.defaults[\"string\"]) as\n | string\n | undefined;\n const message = Sprinkle.ExtractMessage(\n type,\n `Enter a string for ${path.join(\".\")}`,\n );\n let answer: string | null;\n if (isSensitive(type)) {\n answer = await passwordCancellable({ message });\n } else {\n answer = await inputCancellable({ message, default: defaultString });\n if (answer !== null) {\n this.defaults[\"string\"] = answer;\n }\n }\n if (answer === null) {\n throw new UserCancelledError();\n }\n return answer as TExact<U>;\n }\n\n if (isBigInt(type)) {\n const answer = await inputCancellable({\n message: Sprinkle.ExtractMessage(\n type,\n `Enter a bigint for ${path.join(\".\")}`,\n ),\n default: def ? (def as bigint).toString() : undefined,\n validate: (s) => {\n try {\n BigInt(s);\n return true;\n } catch {\n return \"Please enter a valid bigint.\";\n }\n },\n });\n if (answer === null) {\n throw new UserCancelledError();\n }\n return BigInt(answer) as TExact<U>;\n }\n\n if (isLiteral(type)) {\n return type.const as TExact<U>;\n }\n\n if (isObject(type)) {\n const obj = {} as Record<string, unknown>;\n const fields = type[\"properties\"] as Record<string, U>;\n for (const [field, fieldType] of Object.entries(fields)) {\n const fieldValue = await this._fillInStruct(\n fieldType,\n path.concat([field]),\n defs,\n def\n ? ((def as Record<string, unknown>)[field] as TExact<U>)\n : undefined,\n );\n obj[field] = fieldValue;\n }\n return obj as TExact<U>;\n }\n\n //TODO: support starting with default values for arrays and allow removal of items\n if (isArray(type)) {\n const arr: unknown[] = [];\n const itemType = type.items as U;\n let addMore = true;\n while (addMore) {\n const itemValue = await this._fillInStruct(\n itemType,\n path.concat([`[${arr.length}]`]),\n defs,\n );\n arr.push(itemValue);\n const continueAnswer = await selectCancellable({\n message: `Add another item to ${path.join(\".\")}?`,\n choices: [\n { name: \"Yes\", value: true },\n { name: \"No\", value: false },\n ],\n });\n if (continueAnswer === null) {\n throw new UserCancelledError();\n }\n addMore = continueAnswer as boolean;\n }\n return arr as TExact<U>;\n }\n\n if (isTuple(type)) {\n const items = type.items ?? [];\n const result: unknown[] = [];\n for (let i = 0; i < items.length; i++) {\n const itemType = items[i] as U;\n const value = await this._fillInStruct(\n itemType,\n path.concat([`[${i}]`]),\n defs,\n def ? ((def as unknown[])[i] as TExact<U>) : undefined,\n );\n result.push(value);\n }\n return result as TExact<U>;\n }\n\n throw new Error(\n `Unable to fill in struct for type at path ${path.join(\".\")}`,\n );\n }\n\n resolveType<T extends TSchema>(\n type: T,\n path: string[],\n defs: Record<string, TSchema>,\n ): T {\n if (isRef(type) || isThis(type) || isImport(type)) {\n defs = { ...defs, ...type.$defs };\n const realType = defs[type.$ref];\n if (!realType) {\n throw new Error(\n `Invalid type at ${path.join(\".\")}: Unrecognized reference ${type.$ref}`,\n );\n }\n return this.resolveType(realType, path, defs) as T;\n }\n return type;\n }\n\n static ExtractMessage(type: TSchema, def: string): string {\n if (\"title\" in type) {\n return type.title!;\n }\n\n if (\"description\" in type) {\n return type.description!;\n }\n\n if (isLiteral(type)) {\n return `${type.const}`;\n }\n\n if (isObject(type)) {\n const fields = type[\"properties\"] as Record<string, TSchema>;\n if (\"type\" in fields) {\n return Sprinkle.ExtractMessage(fields[\"type\"], def);\n }\n const fieldNames = Object.keys(fields);\n if (fieldNames.length === 1) {\n return fieldNames[0]!;\n }\n }\n\n return def;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_sdk","require","_core","_prompts","_yoctocolorsCjs","_interopRequireDefault","_typebox","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_value","fs","_interopRequireWildcard","path","_types","_schemas","_typeGuards","_wallet","_encryption","_txDialog","_index","_formatting","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","set","getOwnPropertyDescriptor","_defineProperty","_toPropertyKey","value","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","Sprinkle","constructor","type","storagePath","options","name","createdAt","updatedAt","currentProfile","profileId","id","profileMeta","sanitizeProfileId","toLowerCase","replace","profilesDir","join","profilePath","test","includes","Error","activeProfilePath","findAvailableId","baseId","candidate","counter","existsSync","scanProfiles","dir","files","readdirSync","filter","endsWith","entries","file","content","readFileSync","parsed","JSON","parse","bigIntReviver","meta","push","loadProfile","filePath","settings","decryptSettings","defaults","writeFileSync","saveProfile","dirname","mkdirSync","recursive","Date","toISOString","settingsToSave","encryptSettings","jsonContent","stringify","bigIntReplacer","promptProfileMeta","defaultName","defaultDescription","inputCancellable","message","validate","v","trim","length","description","undefined","createProfile","result","now","prevProfileId","prevProfileMeta","prevDefaults","prevSettings","FillInStruct","UserCancelledError","migrateIfNeeded","legacyPath","SettingsPath","profileData","renameSync","selectOrCreateProfile","profiles","pointerPath","activeId","some","p","selectProfile","available","selection","selectCancellable","choices","map","duplicateProfile","console","log","renameProfile","newId","oldId","newPath","unlinkSync","deleteProfile","others","toDelete","profileToDelete","find","confirmed","confirmCancellable","showMenu","menu","_showMenu","title","main","clearPrevious","process","stdout","write","beforeShow","items","item","index","breadcrumb","colors","dim","selectionResult","selectWithClear","settingsMenu","action","jsonStr","getDisplaySettings","jsonLines","split","repeat","EditStruct","saveSettings","selectedItem","New","sprinkle","GetProvider","network","GetProviderFn","GetWallet","provider","GetWalletFn","GetBlaze","providerSettings","walletSettings","GetBlazeFn","generateWalletFromMnemonic","SearchSelect","opts","searchCancellable","sep","LoadSettings","fileContent","error","encryption","encryptSensitiveFields","decryptSensitiveFields","maskSensitiveFields","TxDialog","blaze","tx","currentTx","expanded","hasSignedThisSession","isHotWallet","wallet","HotWallet","walletVkeys","addresses","getUsedAddresses","address","txHash","getTxBodyHash","sigCount","countSignatures","requiredSigners","getRequiredSigners","formatHash","signer","txCbor","toCbor","slice","beforeSign","needsStakeKey","userAddress","stakeCredential","asBase","getStakeCredential","stakeKeyHash","hash","toString","reqSigners","body","signerArray","Array","from","values","certs","hasCertificates","size","withdrawals","hasWithdrawals","warn","signed","signTransaction","ws","witnessSet","existingVkeys","vkeys","toCore","signedKeys","newSignedKeys","existingPubKeys","Set","vkey","uniqueNewKeys","setVkeys","CborSet","fromCore","VkeyWitness","setWitnessSet","signedTx","added","mergeSignatures","clipboard","Promise","resolve","then","writeSync","cborInput","importedTx","Core","Transaction","fromCbor","TxCBOR","currentHash","importedHash","proceed","sourceVkeys","sourceCount","skipped","txId","submitTransaction","current","def","_fillInStruct","defs","resolvedType","isOptional","pathDisplay","formatPath","shouldSet","ExtractMessage","innerType","OptionalKind","isUnion","resolved","resolveType","variant","anyOf","matchedDef","isObject","literalFields","properties","fieldSchema","isLiteral","defRecord","allLiteralsMatch","every","fieldName","const","Value","Check","isString","choice","answer","passwordWithClear","defaultString","isSensitive","inputWithClear","isBigInt","s","BigInt","promptObject","fillField","fieldType","fieldPath","fieldDefs","fieldDef","isArray","promptArray","itemType","itemPath","itemDefs","itemDef","isTuple","concat","isRef","isThis","isImport","$defs","realType","$ref","fields","fieldNames"],"sources":["../../../src/Sprinkle/index.ts"],"sourcesContent":["import { type Provider } from \"@blaze-cardano/query\";\nimport {\n Blaze,\n Core,\n HotWallet,\n type Wallet,\n} from \"@blaze-cardano/sdk\";\nimport { CborSet, VkeyWitness, TxCBOR } from \"@blaze-cardano/core\";\nimport {\n selectCancellable,\n selectWithClear,\n inputCancellable,\n inputWithClear,\n passwordCancellable,\n passwordWithClear,\n confirmCancellable,\n searchCancellable,\n select,\n} from \"./prompts.js\";\nimport colors from \"yoctocolors-cjs\";\nimport { type TSchema, Type, OptionalKind } from \"@sinclair/typebox\";\nimport { Value } from \"@sinclair/typebox/value\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nexport * from \"@sinclair/typebox\";\n\n// Re-export types from types.ts\nexport type { TExact } from \"./types.js\";\nexport type {\n IEncryptionOptions,\n ISprinkleOptions,\n IProfileMeta,\n ICurrentProfile,\n IProfileEntry,\n TxDialogResult,\n TxDialogOptions,\n FieldState,\n RequiredFieldCount,\n FieldMenuResult,\n ObjectMenuResult,\n ArrayMenuResult,\n} from \"./types.js\";\nexport { UserCancelledError } from \"./types.js\";\nimport type {\n TExact,\n IEncryptionOptions,\n ISprinkleOptions,\n IProfileMeta,\n ICurrentProfile,\n IProfileEntry,\n TxDialogResult,\n TxDialogOptions,\n} from \"./types.js\";\nimport { UserCancelledError } from \"./types.js\";\n\n// Re-export schemas from schemas.ts\nexport {\n NetworkSchema,\n MultisigScriptModule,\n MultisigScript,\n ProviderSettingsSchema,\n WalletSettingsSchema,\n} from \"./schemas.js\";\nexport type { TMultisigScript } from \"./schemas.js\";\n\n// Import and re-export type guards\nimport {\n isOptional,\n isImport,\n isArray,\n isBigInt,\n isLiteral,\n isObject,\n isRef,\n isString,\n isThis,\n isTuple,\n isUnion,\n isSensitive,\n isNull,\n isNullable,\n unwrapNullable,\n hasDefault,\n getDefault,\n} from \"./type-guards.js\";\nexport {\n isOptional,\n isImport,\n isArray,\n isBigInt,\n isLiteral,\n isObject,\n isRef,\n isString,\n isThis,\n isTuple,\n isUnion,\n isSensitive,\n isNull,\n isNullable,\n unwrapNullable,\n hasDefault,\n getDefault,\n} from \"./type-guards.js\";\n\n// Import schemas for use in this file\nimport {\n NetworkSchema,\n ProviderSettingsSchema,\n WalletSettingsSchema,\n} from \"./schemas.js\";\n\n// Import and re-export wallet utilities\nimport {\n GetProvider as GetProviderFn,\n GetWallet as GetWalletFn,\n GetBlaze as GetBlazeFn,\n generateWalletFromMnemonic,\n} from \"./wallet.js\";\nexport { GetProvider, GetWallet, GetBlaze } from \"./wallet.js\";\n\n// Import encryption utilities\nimport {\n collectSensitivePaths,\n getNestedValue,\n setNestedValue,\n bigIntReplacer,\n bigIntReviver,\n encryptSensitiveFields,\n decryptSensitiveFields,\n maskSensitiveFields,\n} from \"./encryption.js\";\n\n// Import tx-dialog utilities\nimport {\n getWalletPaymentKeyHash,\n countSignatures,\n hasVkeySigned,\n getRequiredSigners,\n getTxBodyHash,\n formatHash,\n mergeSignatures,\n} from \"./tx-dialog.js\";\n\n// Import menu modules\nimport { promptObject, promptArray } from \"./menus/index.js\";\nimport { formatPath } from \"./utils/formatting.js\";\n\nexport interface IMenuAction<S extends TSchema> {\n title: string;\n action: (sprinkle: Sprinkle<S>) => Promise<Sprinkle<S> | void>;\n}\nexport type TMenuItem<S extends TSchema> = IMenuAction<S> | IMenu<S>;\nexport interface IMenu<S extends TSchema> {\n title: string;\n items: TMenuItem<S>[];\n beforeShow?: (sprinkle: Sprinkle<S>) => Promise<void>;\n}\n\nexport class Sprinkle<S extends TSchema> {\n storagePath: string;\n settings: TExact<S> = {} as TExact<S>;\n type: S;\n defaults: Record<string, unknown> = {};\n options: ISprinkleOptions;\n profileId: string = \"\";\n profileMeta: IProfileMeta = { name: \"\", createdAt: \"\", updatedAt: \"\" };\n\n constructor(type: S, storagePath: string, options?: ISprinkleOptions) {\n this.type = type;\n this.storagePath = storagePath;\n this.options = options ?? {};\n }\n\n // --- Current Profile Accessor ---\n\n get currentProfile(): ICurrentProfile | null {\n if (!this.profileId) return null;\n return {\n id: this.profileId,\n ...this.profileMeta,\n };\n }\n\n // --- Profile path helpers ---\n\n static sanitizeProfileId(name: string): string {\n return (\n name\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, \"\")\n .replace(/[\\s]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"profile\"\n );\n }\n\n private static profilesDir(storagePath: string): string {\n return path.join(storagePath, \"profiles\");\n }\n\n private static profilePath(storagePath: string, id: string): string {\n if (!id || /[\\/\\\\]/.test(id) || id.includes(\"..\")) {\n throw new Error(`Invalid profile ID: \"${id}\"`);\n }\n return path.join(storagePath, \"profiles\", `${id}.json`);\n }\n\n private static activeProfilePath(storagePath: string): string {\n return path.join(storagePath, \"active-profile\");\n }\n\n private static findAvailableId(profilesDir: string, baseId: string): string {\n let candidate = baseId;\n let counter = 2;\n while (fs.existsSync(path.join(profilesDir, `${candidate}.json`))) {\n candidate = `${baseId}-${counter}`;\n counter++;\n }\n return candidate;\n }\n\n // --- Profile I/O ---\n\n scanProfiles(): IProfileEntry[] {\n const dir = Sprinkle.profilesDir(this.storagePath);\n if (!fs.existsSync(dir)) return [];\n const files = fs.readdirSync(dir).filter((f) => f.endsWith(\".json\"));\n const entries: IProfileEntry[] = [];\n for (const file of files) {\n try {\n const content = fs.readFileSync(path.join(dir, file), \"utf-8\");\n const parsed = JSON.parse(content, Sprinkle.bigIntReviver);\n if (parsed.meta?.name) {\n entries.push({\n id: file.replace(/\\.json$/, \"\"),\n meta: parsed.meta,\n });\n }\n } catch {\n // Skip malformed profile files\n }\n }\n return entries;\n }\n\n async loadProfile(id: string): Promise<void> {\n const filePath = Sprinkle.profilePath(this.storagePath, id);\n const content = fs.readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(content, Sprinkle.bigIntReviver);\n this.profileId = id;\n this.profileMeta = parsed.meta;\n this.settings = await this.decryptSettings(parsed.settings as TExact<S>);\n this.defaults = parsed.defaults ?? {};\n // Update active profile pointer\n fs.writeFileSync(Sprinkle.activeProfilePath(this.storagePath), id, \"utf-8\");\n }\n\n private saveProfile(): void {\n if (!this.profileId) {\n throw new Error(\n \"Cannot save profile: no profile is loaded. Call loadProfile() or create a profile first.\",\n );\n }\n const filePath = Sprinkle.profilePath(this.storagePath, this.profileId);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n this.profileMeta.updatedAt = new Date().toISOString();\n const settingsToSave = this.encryptSettings(this.settings);\n const jsonContent = JSON.stringify(\n {\n meta: this.profileMeta,\n settings: settingsToSave,\n defaults: this.defaults,\n },\n bigIntReplacer,\n 2,\n );\n fs.writeFileSync(filePath, jsonContent, \"utf-8\");\n }\n\n private async promptProfileMeta(\n defaultName?: string,\n defaultDescription?: string,\n ): Promise<{ name: string; description?: string } | null> {\n const name = await inputCancellable({\n message: \"Profile name:\",\n default: defaultName,\n validate: (v) => (v.trim().length > 0 ? true : \"Name cannot be empty\"),\n });\n if (name === null) return null; // User cancelled\n const description = await inputCancellable({\n message: \"Profile description (optional):\",\n default: defaultDescription ?? \"\",\n });\n if (description === null) return null; // User cancelled\n return { name, description: description || undefined };\n }\n\n private async createProfile(): Promise<void> {\n const result = await this.promptProfileMeta();\n if (result === null) return; // User cancelled\n const { name, description } = result;\n const profilesDir = Sprinkle.profilesDir(this.storagePath);\n const id = Sprinkle.findAvailableId(\n profilesDir,\n Sprinkle.sanitizeProfileId(name),\n );\n const now = new Date().toISOString();\n\n // Snapshot current state in case we need to restore on cancellation\n const prevProfileId = this.profileId;\n const prevProfileMeta = this.profileMeta;\n const prevDefaults = this.defaults;\n const prevSettings = this.settings;\n\n this.profileId = id;\n this.profileMeta = { name, description, createdAt: now, updatedAt: now };\n this.defaults = {};\n try {\n this.settings = await this.FillInStruct(this.type);\n } catch (e) {\n // Restore previous state on cancellation\n if (e instanceof UserCancelledError) {\n this.profileId = prevProfileId;\n this.profileMeta = prevProfileMeta;\n this.defaults = prevDefaults;\n this.settings = prevSettings;\n return;\n }\n throw e;\n }\n this.saveProfile();\n fs.writeFileSync(Sprinkle.activeProfilePath(this.storagePath), id, \"utf-8\");\n }\n\n private async migrateIfNeeded(): Promise<void> {\n const profilesDir = Sprinkle.profilesDir(this.storagePath);\n const legacyPath = Sprinkle.SettingsPath(this.storagePath);\n\n if (!fs.existsSync(profilesDir)) {\n if (fs.existsSync(legacyPath)) {\n // Migrate legacy settings.json -> profiles/default.json\n const content = fs.readFileSync(legacyPath, \"utf-8\");\n const parsed = JSON.parse(content, Sprinkle.bigIntReviver);\n const now = new Date().toISOString();\n const profileData = {\n meta: {\n name: \"Default\",\n createdAt: now,\n updatedAt: now,\n },\n settings: parsed.settings,\n defaults: parsed.defaults ?? {},\n };\n fs.mkdirSync(profilesDir, { recursive: true });\n fs.writeFileSync(\n Sprinkle.profilePath(this.storagePath, \"default\"),\n JSON.stringify(profileData, bigIntReplacer, 2),\n \"utf-8\",\n );\n fs.writeFileSync(\n Sprinkle.activeProfilePath(this.storagePath),\n \"default\",\n \"utf-8\",\n );\n // Backup legacy file\n fs.renameSync(legacyPath, `${legacyPath}.bak`);\n } else {\n fs.mkdirSync(profilesDir, { recursive: true });\n }\n }\n }\n\n private async selectOrCreateProfile(): Promise<void> {\n const profiles = this.scanProfiles();\n\n if (profiles.length === 0) {\n await this.createProfile();\n return;\n }\n\n if (profiles.length === 1) {\n await this.loadProfile(profiles[0]!.id);\n return;\n }\n\n // Multiple profiles: check active-profile pointer\n const pointerPath = Sprinkle.activeProfilePath(this.storagePath);\n if (fs.existsSync(pointerPath)) {\n const activeId = fs.readFileSync(pointerPath, \"utf-8\").trim();\n if (profiles.some((p) => p.id === activeId)) {\n await this.loadProfile(activeId);\n return;\n }\n }\n\n // No valid pointer - show selector\n await this.selectProfile(profiles);\n }\n\n private async selectProfile(profiles?: IProfileEntry[]): Promise<void> {\n const available = profiles ?? this.scanProfiles();\n const selection = await selectCancellable({\n message: \"Select a profile:\",\n choices: available.map((p) => ({\n name: p.meta.description\n ? `${p.meta.name} - ${p.meta.description}`\n : p.meta.name,\n value: p.id,\n })),\n });\n if (selection === null) return; // User cancelled\n await this.loadProfile(selection as string);\n }\n\n // --- Profile management (CRUD) ---\n\n private async duplicateProfile(): Promise<void> {\n const result = await this.promptProfileMeta(\n `${this.profileMeta.name} (copy)`,\n this.profileMeta.description,\n );\n if (result === null) return; // User cancelled\n const { name, description } = result;\n const profilesDir = Sprinkle.profilesDir(this.storagePath);\n const id = Sprinkle.findAvailableId(\n profilesDir,\n Sprinkle.sanitizeProfileId(name),\n );\n const now = new Date().toISOString();\n // Write duplicate with current settings\n const settingsToSave = this.encryptSettings(this.settings);\n const jsonContent = JSON.stringify(\n {\n meta: { name, description, createdAt: now, updatedAt: now },\n settings: settingsToSave,\n defaults: this.defaults,\n },\n bigIntReplacer,\n 2,\n );\n fs.writeFileSync(\n path.join(profilesDir, `${id}.json`),\n jsonContent,\n \"utf-8\",\n );\n console.log(`Profile \"${name}\" created as a copy.`);\n }\n\n private async renameProfile(): Promise<void> {\n const result = await this.promptProfileMeta(\n this.profileMeta.name,\n this.profileMeta.description,\n );\n if (result === null) return; // User cancelled\n const { name, description } = result;\n const newId = Sprinkle.sanitizeProfileId(name);\n const oldId = this.profileId;\n\n this.profileMeta.name = name;\n this.profileMeta.description = description;\n\n if (newId !== oldId) {\n const newPath = Sprinkle.profilePath(this.storagePath, newId);\n if (fs.existsSync(newPath)) {\n console.log(\n `A profile with ID \"${newId}\" already exists. Choose a different name.`,\n );\n return;\n }\n // Save to new path, remove old file\n this.profileId = newId;\n this.saveProfile();\n fs.unlinkSync(Sprinkle.profilePath(this.storagePath, oldId));\n fs.writeFileSync(\n Sprinkle.activeProfilePath(this.storagePath),\n newId,\n \"utf-8\",\n );\n } else {\n this.saveProfile();\n }\n console.log(`Profile renamed to \"${name}\".`);\n }\n\n private async deleteProfile(): Promise<void> {\n const profiles = this.scanProfiles();\n const others = profiles.filter((p) => p.id !== this.profileId);\n\n if (others.length === 0) {\n console.log(\"Cannot delete the only profile.\");\n return;\n }\n\n const toDelete = await selectCancellable({\n message: \"Select a profile to delete:\",\n choices: others.map((p) => ({\n name: p.meta.description\n ? `${p.meta.name} - ${p.meta.description}`\n : p.meta.name,\n value: p.id,\n })),\n });\n\n if (toDelete === null) return; // User cancelled\n\n const profileId = toDelete as string;\n const profileToDelete = others.find((p) => p.id === profileId);\n const confirmed = await confirmCancellable({\n message: `Delete profile \"${profileToDelete?.meta.name ?? profileId}\"? This cannot be undone.`,\n default: false,\n });\n\n if (confirmed === null) return; // User cancelled\n\n if (confirmed) {\n fs.unlinkSync(Sprinkle.profilePath(this.storagePath, profileId));\n console.log(\n `Profile \"${profileToDelete?.meta.name ?? profileId}\" deleted.`,\n );\n }\n }\n\n // --- Menu ---\n\n async showMenu(menu: IMenu<S>): Promise<void> {\n return this._showMenu(menu, true, [menu.title]);\n }\n\n private async _showMenu(menu: IMenu<S>, main: boolean, path: string[], clearPrevious = false): Promise<void> {\n // Clear previous breadcrumb if coming back from action/submenu\n if (clearPrevious) {\n process.stdout.write(\"\\x1b[1A\\x1b[2K\\x1b[G\");\n }\n\n if (menu.beforeShow) {\n await menu.beforeShow(this);\n }\n const choices = menu.items.map((item, index) => {\n if (\"action\" in item) {\n return { name: item.title, value: index };\n } else {\n return { name: `${item.title} Submenu`, value: index };\n }\n });\n if (!main) {\n choices.push({ name: \"Back\", value: -1 });\n } else {\n choices.push({ name: \"Settings & Profiles\", value: -5 });\n choices.push({ name: \"Exit\", value: -1 });\n }\n\n // Show breadcrumb\n const breadcrumb = path.join(\" > \");\n console.log(colors.dim(\"🍞 \" + breadcrumb));\n\n const selectionResult = await selectWithClear({\n message: \"Select an option:\",\n choices: choices,\n });\n // Handle escape (null) as Back\n // Don't clear here - let the caller's clearPrevious handle it\n if (selectionResult === null) {\n return;\n }\n const selection = selectionResult as number;\n if (selection === -5) {\n const settingsMenu: IMenu<S> = {\n title: \"Settings & Profiles\",\n items: [\n {\n title: \"View settings\",\n action: async () => {\n const jsonStr = JSON.stringify(this.getDisplaySettings(), bigIntReplacer, 2);\n const jsonLines = jsonStr.split(\"\\n\").length;\n console.log(jsonStr);\n\n // Wait for user to press Enter\n await selectWithClear({\n message: \"Press Enter to continue...\",\n choices: [{ name: \"Continue\", value: \"continue\" }],\n });\n\n // Clear the JSON output\n process.stdout.write(\"\\x1b[1A\\x1b[2K\".repeat(jsonLines) + \"\\x1b[G\");\n },\n },\n {\n title: \"Edit settings\",\n action: async () => {\n try {\n this.settings = await this.EditStruct(this.type, this.settings);\n this.saveSettings();\n } catch (e) {\n if (e instanceof UserCancelledError) {\n return; // User cancelled, return to menu\n }\n throw e;\n }\n },\n },\n {\n title: \"Switch profile\",\n action: async () => {\n this.saveSettings();\n const profiles = this.scanProfiles();\n if (profiles.length <= 1) {\n console.log(\n \"No other profiles to switch to. Create a new one first.\",\n );\n } else {\n await this.selectProfile(profiles);\n }\n },\n },\n {\n title: \"Create new profile\",\n action: async () => {\n await this.createProfile();\n },\n },\n {\n title: \"Duplicate current profile\",\n action: async () => {\n await this.duplicateProfile();\n },\n },\n {\n title: \"Rename current profile\",\n action: async () => {\n await this.renameProfile();\n },\n },\n {\n title: \"Delete a profile\",\n action: async () => {\n await this.deleteProfile();\n },\n },\n ],\n };\n await this._showMenu(settingsMenu, false, [...path, \"Settings & Profiles\"], true);\n await this._showMenu(menu, main, path, true);\n return;\n }\n if (selection === -1) {\n // Don't clear here - let the caller's clearPrevious handle it\n return;\n }\n const selectedItem = menu.items[selection]!;\n if (\"action\" in selectedItem) {\n // Update breadcrumb to show current action\n process.stdout.write(\"\\x1b[1A\\x1b[2K\\x1b[G\");\n console.log(colors.dim(\"🍞 \" + [...path, selectedItem.title].join(\" > \")));\n\n const result = await selectedItem.action(this);\n if (result instanceof Sprinkle) {\n this.settings = result.settings;\n this.saveSettings();\n }\n await this._showMenu(menu, main, path, true);\n } else {\n await this._showMenu(selectedItem, false, [...path, selectedItem.title], true);\n await this._showMenu(menu, main, path, true);\n }\n return;\n }\n\n static async New<S extends TSchema>(\n type: S,\n storagePath: string,\n options?: ISprinkleOptions,\n ): Promise<Sprinkle<S>> {\n const sprinkle = new Sprinkle<S>(type, storagePath, options);\n await sprinkle.migrateIfNeeded();\n await sprinkle.selectOrCreateProfile();\n sprinkle.saveSettings();\n return sprinkle;\n }\n\n static async GetProvider(\n network: TExact<typeof NetworkSchema>,\n settings: TExact<typeof ProviderSettingsSchema>,\n ): Promise<Provider> {\n return GetProviderFn(network, settings);\n }\n\n static async GetWallet(\n settings: TExact<typeof WalletSettingsSchema>,\n provider: Provider,\n ): Promise<Wallet> {\n return GetWalletFn(settings, provider);\n }\n\n static async GetBlaze(\n network: TExact<typeof NetworkSchema>,\n providerSettings: TExact<typeof ProviderSettingsSchema>,\n walletSettings: TExact<typeof WalletSettingsSchema>,\n ): Promise<Blaze<Provider, Wallet>> {\n return GetBlazeFn(network, providerSettings, walletSettings);\n }\n\n /**\n * Generates a new wallet from a BIP39 mnemonic phrase.\n * Displays the 24-word recovery phrase and requires user confirmation.\n * @returns The Bip32PrivateKey hex string for storage\n */\n private static async generateWalletFromMnemonic(): Promise<string> {\n return generateWalletFromMnemonic();\n }\n\n static async SearchSelect<T>(opts: {\n message: string;\n source: (\n term: string | undefined,\n ) => Promise<{ name: string; value: T }[]> | { name: string; value: T }[];\n }): Promise<T | null> {\n return searchCancellable(opts) as Promise<T | null>;\n }\n\n static SettingsPath(storagePath: string): string {\n return `${storagePath}${path.sep}settings.json`;\n }\n\n async LoadSettings(type: S, storagePath: string): Promise<void> {\n try {\n // Check if the settings file exists\n if (fs.existsSync(storagePath)) {\n // Read and parse the JSON file\n const fileContent = fs.readFileSync(storagePath, \"utf-8\");\n const parsed = JSON.parse(fileContent, Sprinkle.bigIntReviver) as {\n settings: unknown;\n defaults: Record<string, unknown>;\n };\n // Convert string representations back to BigInt where needed\n this.settings = await this.decryptSettings(\n parsed.settings as TExact<S>,\n );\n this.defaults = parsed.defaults;\n } else {\n this.defaults = {};\n this.settings = await this.FillInStruct(type);\n }\n } catch (error) {\n throw new Error(`Error loading settings from ${storagePath}: ${error}`);\n }\n }\n\n static bigIntReviver(key: string, value: unknown): unknown {\n return bigIntReviver(key, value);\n }\n\n private encryptSettings(settings: TExact<S>): TExact<S> {\n if (!this.options.encryption) return settings;\n return encryptSensitiveFields(settings, this.type, this.options.encryption);\n }\n\n private async decryptSettings(settings: TExact<S>): Promise<TExact<S>> {\n if (!this.options.encryption) return settings;\n return decryptSensitiveFields(settings, this.type, this.options.encryption);\n }\n\n saveSettings(): void {\n this.saveProfile();\n }\n\n getDisplaySettings(): TExact<S> {\n return maskSensitiveFields(this.settings, this.type);\n }\n\n async TxDialog<P extends Provider, W extends Wallet>(\n blaze: Blaze<P, W>,\n tx: Core.Transaction,\n opts?: TxDialogOptions,\n ): Promise<TxDialogResult> {\n let currentTx = tx;\n let expanded = false;\n let hasSignedThisSession = false;\n\n // Check if wallet can sign (is HotWallet)\n const isHotWallet = blaze.wallet instanceof HotWallet;\n\n // Get wallet's vkeys for detecting if already signed\n let walletVkeys: string[] = [];\n if (isHotWallet) {\n try {\n // Sign a dummy to get the wallet's public keys\n // We'll use this to check if wallet has already signed\n const wallet = blaze.wallet as unknown as HotWallet;\n const addresses = await wallet.getUsedAddresses();\n const address = addresses[0];\n if (address) {\n // We can't easily get vkeys without signing, so we'll track after first sign\n }\n } catch {\n // Ignore errors in setup\n }\n }\n\n while (true) {\n // Display transaction status\n const txHash = getTxBodyHash(currentTx);\n const sigCount = countSignatures(currentTx);\n const requiredSigners = getRequiredSigners(currentTx);\n\n console.log(\"\");\n console.log(`Transaction: ${formatHash(txHash)}`);\n if (requiredSigners.length > 0) {\n console.log(`Signatures: ${sigCount} of ${requiredSigners.length} required`);\n console.log(\"Required signers:\");\n for (const signer of requiredSigners) {\n console.log(` - ${formatHash(signer)}`);\n }\n } else {\n console.log(`Signatures: ${sigCount}`);\n }\n\n // Display CBOR\n const txCbor = currentTx.toCbor();\n if (expanded) {\n console.log(\"Transaction CBOR:\", txCbor);\n } else {\n console.log(\"Transaction CBOR:\", `${String(txCbor).slice(0, 50)}...`);\n }\n\n // Build dynamic menu choices\n const choices: { name: string; value: string }[] = [];\n\n // \"Sign with this wallet\" - only if HotWallet and hasn't signed this session\n if (isHotWallet && !hasSignedThisSession) {\n choices.push({ name: \"Sign with this wallet\", value: \"sign\" });\n }\n\n // CBOR options\n if (!expanded) {\n choices.push({ name: \"Expand CBOR\", value: \"expand\" });\n }\n choices.push({ name: \"Copy CBOR to clipboard\", value: \"copy\" });\n choices.push({ name: \"Import signatures from CBOR\", value: \"import\" });\n\n // Submit and cancel\n choices.push({ name: \"Submit transaction\", value: \"submit\" });\n choices.push({ name: \"Cancel\", value: \"cancel\" });\n\n const selection = await selectWithClear({\n message: \"Select an option:\",\n choices,\n });\n\n // Handle escape/cancel as cancel action\n if (selection === null) {\n if (hasSignedThisSession) {\n return { action: \"signed\", tx: currentTx };\n }\n return { action: \"cancelled\", tx: currentTx };\n }\n\n // Handle selection\n if (selection === \"sign\") {\n if (opts?.beforeSign) {\n await opts.beforeSign();\n }\n\n // Detect if stake key signature is required\n let needsStakeKey = false;\n try {\n const wallet = blaze.wallet as unknown as HotWallet;\n const addresses = await wallet.getUsedAddresses();\n const userAddress = addresses[0];\n if (userAddress) {\n const stakeCredential = userAddress.asBase()?.getStakeCredential();\n const stakeKeyHash = stakeCredential?.hash?.toString();\n\n if (stakeKeyHash) {\n const reqSigners = currentTx.body().requiredSigners();\n if (reqSigners) {\n const signerArray = Array.from(reqSigners.values());\n needsStakeKey = signerArray.some(\n (signer) => signer.toString() === stakeKeyHash,\n );\n }\n\n const certs = currentTx.body().certs();\n const hasCertificates = certs && certs.size() > 0;\n const withdrawals = currentTx.body().withdrawals();\n const hasWithdrawals = withdrawals && withdrawals.size > 0;\n\n if (hasCertificates || hasWithdrawals) {\n needsStakeKey = true;\n }\n }\n }\n\n if (needsStakeKey) {\n console.log(\"Transaction requires stake key signature.\");\n } else {\n console.log(\"Transaction requires payment key signature only.\");\n }\n } catch (error) {\n console.warn(\n \"Could not determine stake key requirement, signing with payment key only.\",\n );\n console.warn(`Error: ${(error as Error).message}`);\n }\n\n try {\n if (needsStakeKey) {\n const wallet = blaze.wallet as unknown as HotWallet;\n const signed = await wallet.signTransaction(currentTx, true, true);\n const ws = currentTx.witnessSet();\n const existingVkeys = ws.vkeys()?.toCore() ?? [];\n\n const signedKeys = signed.vkeys();\n if (!signedKeys) {\n throw new Error(\n \"signTransaction: no signed keys in wallet witness response\",\n );\n }\n\n // Check for duplicates before adding\n const newSignedKeys = signedKeys.toCore();\n const existingPubKeys = new Set(existingVkeys.map(([vkey]) => vkey));\n const uniqueNewKeys = newSignedKeys.filter(\n ([vkey]) => !existingPubKeys.has(vkey),\n );\n\n if (uniqueNewKeys.length === 0) {\n console.log(\"Wallet has already signed this transaction.\");\n } else {\n ws.setVkeys(\n CborSet.fromCore(\n [...existingVkeys, ...uniqueNewKeys],\n VkeyWitness.fromCore,\n ),\n );\n currentTx.setWitnessSet(ws);\n console.log(`Added ${uniqueNewKeys.length} signature(s).`);\n hasSignedThisSession = true;\n }\n } else {\n const signedTx = await blaze.signTransaction(currentTx);\n // Merge signatures from signed tx into current tx\n const added = mergeSignatures(currentTx, signedTx);\n if (added > 0) {\n console.log(`Added ${added} signature(s).`);\n hasSignedThisSession = true;\n } else {\n console.log(\"Wallet has already signed this transaction.\");\n }\n }\n } catch (error) {\n console.error(`Signing failed: ${(error as Error).message}`);\n }\n // Continue loop after signing\n continue;\n }\n\n if (selection === \"expand\") {\n expanded = true;\n continue;\n }\n\n if (selection === \"copy\") {\n try {\n const { default: clipboard } = await import(\"clipboardy\");\n clipboard.writeSync(String(currentTx.toCbor()));\n console.log(\"Transaction CBOR copied to clipboard.\");\n } catch {\n console.log(\"Failed to copy to clipboard, expanding instead.\");\n expanded = true;\n }\n continue;\n }\n\n if (selection === \"import\") {\n const cborInput = await inputCancellable({\n message: \"Paste transaction CBOR (hex):\",\n });\n\n if (cborInput === null || cborInput.trim() === \"\") {\n console.log(\"No CBOR provided.\");\n continue;\n }\n\n try {\n const importedTx = Core.Transaction.fromCbor(\n TxCBOR(cborInput.trim()),\n );\n\n // Validate body hash matches\n const currentHash = getTxBodyHash(currentTx);\n const importedHash = getTxBodyHash(importedTx);\n\n if (currentHash !== importedHash) {\n const proceed = await confirmCancellable({\n message: `Warning: Imported transaction has different body hash.\\nCurrent: ${formatHash(currentHash)}\\nImported: ${formatHash(importedHash)}\\nProceed anyway?`,\n default: false,\n });\n if (proceed === null || !proceed) {\n console.log(\"Import cancelled.\");\n continue;\n }\n }\n\n // Merge signatures\n const added = mergeSignatures(currentTx, importedTx);\n const sourceVkeys = importedTx.witnessSet().vkeys();\n const sourceCount = sourceVkeys ? sourceVkeys.size() : 0;\n const skipped = sourceCount - added;\n\n if (added > 0) {\n console.log(`Added ${added} new signature(s).`);\n }\n if (skipped > 0) {\n console.log(`Skipped ${skipped} duplicate signature(s).`);\n }\n if (added === 0 && skipped === 0) {\n console.log(\"No signatures found in imported transaction.\");\n }\n } catch (error) {\n console.error(`Failed to import CBOR: ${(error as Error).message}`);\n }\n continue;\n }\n\n if (selection === \"submit\") {\n const sigCount = countSignatures(currentTx);\n if (sigCount === 0) {\n const proceed = await confirmCancellable({\n message: \"Warning: Transaction has no signatures. Submit anyway?\",\n default: false,\n });\n if (proceed === null || !proceed) {\n continue;\n }\n }\n\n try {\n const txId = await blaze.submitTransaction(currentTx);\n console.log(`Transaction submitted: ${txId}`);\n return { action: \"submitted\", txId, tx: currentTx };\n } catch (error) {\n console.error(`Submit failed: ${(error as Error).message}`);\n // Continue loop to allow retry or other actions\n continue;\n }\n }\n\n if (selection === \"cancel\") {\n if (hasSignedThisSession) {\n return { action: \"signed\", tx: currentTx };\n }\n return { action: \"cancelled\", tx: currentTx };\n }\n }\n }\n\n /**\n * Edit an existing struct value using a menu-based interface.\n * This is now unified with FillInStruct - both use the same menu system.\n * @param type - The TypeBox schema\n * @param current - The current value to edit\n * @returns The edited value\n */\n async EditStruct<U extends TSchema>(\n type: U,\n current: TExact<U>,\n ): Promise<TExact<U>> {\n // Use FillInStruct with current values as defaults\n // The menu system will show existing values and allow editing\n return this.FillInStruct(type, current);\n }\n\n async FillInStruct<U extends TSchema>(\n type: U,\n def?: TExact<U>,\n ): Promise<TExact<U>> {\n return this._fillInStruct<U>(type, [\"root\"], {}, def);\n }\n\n async _fillInStruct<U extends TSchema>(\n type: U,\n path: string[],\n defs: Record<string, TSchema>,\n def?: TExact<U>,\n ): Promise<TExact<U>> {\n if (\"$ref\" in type) {\n defs = { ...defs, ...type[\"$defs\"] };\n const resolvedType = defs[type[\"$ref\"]];\n if (!resolvedType) {\n throw new Error(\n `Could not resolve type ${type[\"$ref\"]} at ${path.join(\".\")}`,\n );\n }\n return this._fillInStruct(resolvedType, path, defs, def) as Promise<\n TExact<U>\n >;\n }\n if (isOptional(type)) {\n const pathDisplay = formatPath(path) || \"value\";\n const shouldSet = await selectWithClear({\n message: Sprinkle.ExtractMessage(\n type,\n `Set value for ${pathDisplay}?`,\n ),\n choices: [\n { name: \"Yes\", value: true },\n { name: \"Skip\", value: false },\n ],\n default: def !== undefined,\n });\n if (shouldSet === null) {\n throw new UserCancelledError();\n }\n if (!shouldSet) {\n return undefined as TExact<U>;\n }\n // Unwrap the optional and fill the inner type\n const innerType = { ...type };\n delete (innerType as any)[OptionalKind];\n return this._fillInStruct(innerType as U, path, defs, def);\n }\n\n if (isUnion(type)) {\n const pathDisplay = formatPath(path) || \"value\";\n const choices = [];\n const resolved = this.resolveType(type, path, defs);\n for (const variant of resolved.anyOf) {\n choices.push({\n name: Sprinkle.ExtractMessage(variant, `${variant}`),\n value: variant,\n });\n }\n const selectionResult = await selectWithClear({\n message: Sprinkle.ExtractMessage(\n resolved,\n `Enter a choice for ${pathDisplay}`,\n ),\n choices: choices,\n });\n if (selectionResult === null) {\n throw new UserCancelledError();\n }\n const selection = selectionResult as TSchema;\n // Determine if the provided default value matches the selected variant.\n // For discriminated unions (objects with literal fields like `type`), check\n // if the literal field values in the selected variant match those in `def`.\n // For non-discriminated unions, fall back to structural matching with Value.Check.\n let matchedDef: unknown = undefined;\n if (def !== undefined) {\n if (isObject(selection)) {\n // Check if all literal fields in the selected variant match def\n const literalFields = Object.entries(selection.properties ?? {}).filter(\n ([, fieldSchema]) => isLiteral(fieldSchema as TSchema),\n );\n if (literalFields.length > 0) {\n const defRecord = def as Record<string, unknown>;\n const allLiteralsMatch = literalFields.every(\n ([fieldName, fieldSchema]) =>\n defRecord[fieldName] === (fieldSchema as unknown as { const: unknown }).const,\n );\n if (allLiteralsMatch) {\n matchedDef = def;\n }\n } else {\n // No literal discriminators - use structural check\n if (Value.Check(selection, def)) {\n matchedDef = def;\n }\n }\n } else {\n // Non-object variant - use structural check\n if (Value.Check(selection, def)) {\n matchedDef = def;\n }\n }\n }\n return this._fillInStruct(selection, path, defs, matchedDef as TExact<typeof selection>) as Promise<TExact<U>>;\n }\n\n if (isString(type)) {\n // Special handling for hot wallet private key - offer generation option\n if (type.title === \"Hot Wallet Private Key\") {\n const choice = await selectWithClear({\n message: \"Hot wallet setup:\",\n choices: [\n { name: \"Enter existing private key\", value: \"existing\" },\n { name: \"Generate new wallet\", value: \"generate\" },\n ],\n });\n\n if (choice === null) {\n throw new UserCancelledError();\n }\n if (choice === \"generate\") {\n return Sprinkle.generateWalletFromMnemonic() as Promise<TExact<U>>;\n }\n // Fall through to password prompt for \"existing\" choice\n const answer = await passwordWithClear({\n message: \"Enter your private key:\",\n });\n if (answer === null) {\n throw new UserCancelledError();\n }\n return answer as TExact<U>;\n }\n\n const pathDisplay = formatPath(path) || \"value\";\n const defaultString = (def ? def : this.defaults[\"string\"]) as\n | string\n | undefined;\n const message = Sprinkle.ExtractMessage(\n type,\n `Enter a string for ${pathDisplay}`,\n );\n let answer: string | null;\n if (isSensitive(type)) {\n answer = await passwordWithClear({ message });\n } else {\n answer = await inputWithClear({ message, default: defaultString });\n if (answer !== null) {\n this.defaults[\"string\"] = answer;\n }\n }\n if (answer === null) {\n throw new UserCancelledError();\n }\n return answer as TExact<U>;\n }\n\n if (isBigInt(type)) {\n const pathDisplay = formatPath(path) || \"value\";\n const answer = await inputWithClear({\n message: Sprinkle.ExtractMessage(\n type,\n `Enter a bigint for ${pathDisplay}`,\n ),\n default: def ? (def as bigint).toString() : undefined,\n validate: (s) => {\n try {\n BigInt(s);\n return true;\n } catch {\n return \"Please enter a valid bigint.\";\n }\n },\n });\n if (answer === null) {\n throw new UserCancelledError();\n }\n return BigInt(answer) as TExact<U>;\n }\n\n if (isLiteral(type)) {\n return type.const as TExact<U>;\n }\n\n if (isObject(type)) {\n // Use menu-based editing for objects\n const defaults = def as Record<string, unknown> | undefined;\n const sprinkle = this;\n const result = await promptObject({\n type,\n path,\n defs,\n defaults,\n fillField: async <T extends TSchema>(\n fieldType: T,\n fieldPath: string[],\n fieldDefs: Record<string, TSchema>,\n fieldDef?: unknown,\n ) => {\n return sprinkle._fillInStruct(fieldType, fieldPath, fieldDefs, fieldDef as TExact<T>);\n },\n });\n\n if (result.action === \"cancel\") {\n throw new UserCancelledError();\n }\n\n return result.value as TExact<U>;\n }\n\n if (isArray(type)) {\n // Use menu-based editing for arrays\n const defaults = def as unknown[] | undefined;\n const sprinkle = this;\n const result = await promptArray({\n type,\n path,\n defs,\n defaults,\n fillField: async <T extends TSchema>(\n itemType: T,\n itemPath: string[],\n itemDefs: Record<string, TSchema>,\n itemDef?: unknown,\n ) => {\n return sprinkle._fillInStruct(itemType, itemPath, itemDefs, itemDef as TExact<T>);\n },\n });\n\n if (result.action === \"back\") {\n throw new UserCancelledError();\n }\n\n return result.value as TExact<U>;\n }\n\n if (isTuple(type)) {\n const items = type.items ?? [];\n const result: unknown[] = [];\n for (let i = 0; i < items.length; i++) {\n const itemType = items[i] as U;\n const value = await this._fillInStruct(\n itemType,\n path.concat([`[${i}]`]),\n defs,\n def ? ((def as unknown[])[i] as TExact<U>) : undefined,\n );\n result.push(value);\n }\n return result as TExact<U>;\n }\n\n const pathDisplay = formatPath(path) || \"root\";\n throw new Error(\n `Unable to fill in struct for type at path ${pathDisplay}`,\n );\n }\n\n resolveType<T extends TSchema>(\n type: T,\n path: string[],\n defs: Record<string, TSchema>,\n ): T {\n if (isRef(type) || isThis(type) || isImport(type)) {\n defs = { ...defs, ...type.$defs };\n const realType = defs[type.$ref];\n if (!realType) {\n throw new Error(\n `Invalid type at ${path.join(\".\")}: Unrecognized reference ${type.$ref}`,\n );\n }\n return this.resolveType(realType, path, defs) as T;\n }\n return type;\n }\n\n static ExtractMessage(type: TSchema, def: string): string {\n if (\"title\" in type) {\n return type.title!;\n }\n\n if (\"description\" in type) {\n return type.description!;\n }\n\n if (isLiteral(type)) {\n return `${type.const}`;\n }\n\n if (isObject(type)) {\n const fields = type[\"properties\"] as Record<string, TSchema>;\n if (\"type\" in fields) {\n return Sprinkle.ExtractMessage(fields[\"type\"], def);\n }\n const fieldNames = Object.keys(fields);\n if (fieldNames.length === 1) {\n return fieldNames[0]!;\n }\n }\n\n return def;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.promptArray = promptArray;
|
|
7
|
+
var _core = require("@inquirer/core");
|
|
8
|
+
var _prompts = require("../prompts.js");
|
|
9
|
+
var _types = require("../types.js");
|
|
10
|
+
var _formatting = require("../utils/formatting.js");
|
|
11
|
+
var _fieldMenu = require("./field-menu.js");
|
|
12
|
+
/**
|
|
13
|
+
* Array menu module for menu-based struct editing.
|
|
14
|
+
* Shows array items and allows adding/removing/editing.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Options for the array menu prompt.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Show a menu-based editor for an array.
|
|
23
|
+
* Allows adding, removing, and editing items.
|
|
24
|
+
*
|
|
25
|
+
* @param options - Array menu options
|
|
26
|
+
* @returns The edited array or back result
|
|
27
|
+
*/
|
|
28
|
+
async function promptArray(options) {
|
|
29
|
+
const {
|
|
30
|
+
type,
|
|
31
|
+
path,
|
|
32
|
+
defs,
|
|
33
|
+
defaults = [],
|
|
34
|
+
fillField
|
|
35
|
+
} = options;
|
|
36
|
+
const itemType = type.items;
|
|
37
|
+
|
|
38
|
+
// Initialize items from defaults
|
|
39
|
+
const items = [...defaults];
|
|
40
|
+
|
|
41
|
+
// Main menu loop
|
|
42
|
+
while (true) {
|
|
43
|
+
// Build menu choices
|
|
44
|
+
const choices = [];
|
|
45
|
+
|
|
46
|
+
// Add existing items
|
|
47
|
+
for (let i = 0; i < items.length; i++) {
|
|
48
|
+
const preview = (0, _formatting.formatValuePreview)(items[i], 40);
|
|
49
|
+
choices.push({
|
|
50
|
+
name: `[${i}]: ${preview}`,
|
|
51
|
+
value: `item:${i}`
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Add separator and actions
|
|
56
|
+
choices.push(new _core.Separator("\u2500\u2500\u2500 Actions \u2500\u2500\u2500"));
|
|
57
|
+
choices.push({
|
|
58
|
+
name: "Add item",
|
|
59
|
+
value: "add"
|
|
60
|
+
});
|
|
61
|
+
if (items.length > 0) {
|
|
62
|
+
choices.push({
|
|
63
|
+
name: "Remove item...",
|
|
64
|
+
value: "remove"
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
choices.push({
|
|
68
|
+
name: `Done (${items.length} item${items.length === 1 ? "" : "s"})`,
|
|
69
|
+
value: "done"
|
|
70
|
+
});
|
|
71
|
+
choices.push({
|
|
72
|
+
name: "Back",
|
|
73
|
+
value: "back"
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Show menu
|
|
77
|
+
const breadcrumb = (0, _formatting.formatBreadcrumb)(path);
|
|
78
|
+
const message = breadcrumb ? `Edit ${breadcrumb} [${items.length} items]:` : `Edit array [${items.length} items]:`;
|
|
79
|
+
const selection = await (0, _prompts.selectWithClear)({
|
|
80
|
+
message,
|
|
81
|
+
choices
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
// Handle escape - same as done
|
|
85
|
+
if (selection === null) {
|
|
86
|
+
return {
|
|
87
|
+
action: "done",
|
|
88
|
+
value: items
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Handle done
|
|
93
|
+
if (selection === "done") {
|
|
94
|
+
return {
|
|
95
|
+
action: "done",
|
|
96
|
+
value: items
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Handle back
|
|
101
|
+
if (selection === "back") {
|
|
102
|
+
return {
|
|
103
|
+
action: "back"
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Handle add
|
|
108
|
+
if (selection === "add") {
|
|
109
|
+
try {
|
|
110
|
+
const newItem = await fillField(itemType, [...path, `[${items.length}]`], defs, undefined);
|
|
111
|
+
items.push(newItem);
|
|
112
|
+
} catch (e) {
|
|
113
|
+
if (e instanceof _types.UserCancelledError) {
|
|
114
|
+
// Return to menu without adding
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
throw e;
|
|
118
|
+
}
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Handle remove
|
|
123
|
+
if (selection === "remove") {
|
|
124
|
+
const removeChoices = items.map((item, i) => ({
|
|
125
|
+
name: `[${i}]: ${(0, _formatting.formatValuePreview)(item, 40)}`,
|
|
126
|
+
value: i
|
|
127
|
+
}));
|
|
128
|
+
removeChoices.push({
|
|
129
|
+
name: "Cancel",
|
|
130
|
+
value: -1
|
|
131
|
+
});
|
|
132
|
+
const indexToRemove = await (0, _prompts.selectWithClear)({
|
|
133
|
+
message: "Select item to remove:",
|
|
134
|
+
choices: removeChoices
|
|
135
|
+
});
|
|
136
|
+
if (indexToRemove !== null && indexToRemove !== -1) {
|
|
137
|
+
items.splice(indexToRemove, 1);
|
|
138
|
+
}
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Handle item selection
|
|
143
|
+
if (typeof selection === "string" && selection.startsWith("item:")) {
|
|
144
|
+
const index = parseInt(selection.slice(5), 10);
|
|
145
|
+
const currentValue = items[index];
|
|
146
|
+
|
|
147
|
+
// Create a FieldState for the item
|
|
148
|
+
const itemState = {
|
|
149
|
+
status: "set",
|
|
150
|
+
value: currentValue
|
|
151
|
+
};
|
|
152
|
+
const menuResult = await (0, _fieldMenu.promptFieldMenu)({
|
|
153
|
+
fieldName: `[${index}]`,
|
|
154
|
+
fieldType: itemType,
|
|
155
|
+
state: itemState
|
|
156
|
+
});
|
|
157
|
+
switch (menuResult.action) {
|
|
158
|
+
case "edit":
|
|
159
|
+
{
|
|
160
|
+
try {
|
|
161
|
+
const newValue = await fillField(itemType, [...path, `[${index}]`], defs, currentValue);
|
|
162
|
+
items[index] = newValue;
|
|
163
|
+
} catch (e) {
|
|
164
|
+
if (e instanceof _types.UserCancelledError) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
throw e;
|
|
168
|
+
}
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
case "view":
|
|
172
|
+
{
|
|
173
|
+
await (0, _fieldMenu.displayFullValue)(`[${index}]`, currentValue);
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
case "clear":
|
|
177
|
+
{
|
|
178
|
+
// Remove the item
|
|
179
|
+
items.splice(index, 1);
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
case "setNull":
|
|
183
|
+
{
|
|
184
|
+
items[index] = null;
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
case "reset":
|
|
188
|
+
case "back":
|
|
189
|
+
// Do nothing
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=array-menu.js.map
|