@sundaeswap/sprinkles 0.4.0 → 0.6.0

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.
Files changed (140) hide show
  1. package/dist/cjs/Sprinkle/__tests__/encryption.test.js +22 -8
  2. package/dist/cjs/Sprinkle/__tests__/encryption.test.js.map +1 -1
  3. package/dist/cjs/Sprinkle/__tests__/enhancements.test.js +37 -46
  4. package/dist/cjs/Sprinkle/__tests__/enhancements.test.js.map +1 -1
  5. package/dist/cjs/Sprinkle/__tests__/field-utils.test.js +170 -0
  6. package/dist/cjs/Sprinkle/__tests__/field-utils.test.js.map +1 -0
  7. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +283 -81
  8. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  9. package/dist/cjs/Sprinkle/__tests__/formatting.test.js +97 -0
  10. package/dist/cjs/Sprinkle/__tests__/formatting.test.js.map +1 -0
  11. package/dist/cjs/Sprinkle/__tests__/show-menu.test.js +97 -7
  12. package/dist/cjs/Sprinkle/__tests__/show-menu.test.js.map +1 -1
  13. package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js +30 -0
  14. package/dist/cjs/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
  15. package/dist/cjs/Sprinkle/encryption.js +131 -0
  16. package/dist/cjs/Sprinkle/encryption.js.map +1 -0
  17. package/dist/cjs/Sprinkle/index.js +427 -438
  18. package/dist/cjs/Sprinkle/index.js.map +1 -1
  19. package/dist/cjs/Sprinkle/menus/array-menu.js +195 -0
  20. package/dist/cjs/Sprinkle/menus/array-menu.js.map +1 -0
  21. package/dist/cjs/Sprinkle/menus/field-menu.js +161 -0
  22. package/dist/cjs/Sprinkle/menus/field-menu.js.map +1 -0
  23. package/dist/cjs/Sprinkle/menus/index.js +33 -0
  24. package/dist/cjs/Sprinkle/menus/index.js.map +1 -0
  25. package/dist/cjs/Sprinkle/menus/object-menu.js +324 -0
  26. package/dist/cjs/Sprinkle/menus/object-menu.js.map +1 -0
  27. package/dist/cjs/Sprinkle/prompts.js +459 -0
  28. package/dist/cjs/Sprinkle/prompts.js.map +1 -0
  29. package/dist/cjs/Sprinkle/schemas.js +97 -0
  30. package/dist/cjs/Sprinkle/schemas.js.map +1 -0
  31. package/dist/cjs/Sprinkle/tx-dialog.js +101 -0
  32. package/dist/cjs/Sprinkle/tx-dialog.js.map +1 -0
  33. package/dist/cjs/Sprinkle/type-guards.js +89 -0
  34. package/dist/cjs/Sprinkle/type-guards.js.map +1 -0
  35. package/dist/cjs/Sprinkle/types.js +73 -0
  36. package/dist/cjs/Sprinkle/types.js.map +1 -0
  37. package/dist/cjs/Sprinkle/utils/field-utils.js +154 -0
  38. package/dist/cjs/Sprinkle/utils/field-utils.js.map +1 -0
  39. package/dist/cjs/Sprinkle/utils/formatting.js +126 -0
  40. package/dist/cjs/Sprinkle/utils/formatting.js.map +1 -0
  41. package/dist/cjs/Sprinkle/utils/index.js +56 -0
  42. package/dist/cjs/Sprinkle/utils/index.js.map +1 -0
  43. package/dist/cjs/Sprinkle/wallet.js +98 -0
  44. package/dist/cjs/Sprinkle/wallet.js.map +1 -0
  45. package/dist/esm/Sprinkle/__tests__/encryption.test.js +22 -8
  46. package/dist/esm/Sprinkle/__tests__/encryption.test.js.map +1 -1
  47. package/dist/esm/Sprinkle/__tests__/enhancements.test.js +37 -46
  48. package/dist/esm/Sprinkle/__tests__/enhancements.test.js.map +1 -1
  49. package/dist/esm/Sprinkle/__tests__/field-utils.test.js +168 -0
  50. package/dist/esm/Sprinkle/__tests__/field-utils.test.js.map +1 -0
  51. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +284 -82
  52. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  53. package/dist/esm/Sprinkle/__tests__/formatting.test.js +95 -0
  54. package/dist/esm/Sprinkle/__tests__/formatting.test.js.map +1 -0
  55. package/dist/esm/Sprinkle/__tests__/show-menu.test.js +98 -8
  56. package/dist/esm/Sprinkle/__tests__/show-menu.test.js.map +1 -1
  57. package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js +30 -0
  58. package/dist/esm/Sprinkle/__tests__/tx-dialog.test.js.map +1 -1
  59. package/dist/esm/Sprinkle/encryption.js +117 -0
  60. package/dist/esm/Sprinkle/encryption.js.map +1 -0
  61. package/dist/esm/Sprinkle/index.js +248 -425
  62. package/dist/esm/Sprinkle/index.js.map +1 -1
  63. package/dist/esm/Sprinkle/menus/array-menu.js +190 -0
  64. package/dist/esm/Sprinkle/menus/array-menu.js.map +1 -0
  65. package/dist/esm/Sprinkle/menus/field-menu.js +155 -0
  66. package/dist/esm/Sprinkle/menus/field-menu.js.map +1 -0
  67. package/dist/esm/Sprinkle/menus/index.js +8 -0
  68. package/dist/esm/Sprinkle/menus/index.js.map +1 -0
  69. package/dist/esm/Sprinkle/menus/object-menu.js +318 -0
  70. package/dist/esm/Sprinkle/menus/object-menu.js.map +1 -0
  71. package/dist/esm/Sprinkle/prompts.js +443 -0
  72. package/dist/esm/Sprinkle/prompts.js.map +1 -0
  73. package/dist/esm/Sprinkle/schemas.js +91 -0
  74. package/dist/esm/Sprinkle/schemas.js.map +1 -0
  75. package/dist/esm/Sprinkle/tx-dialog.js +90 -0
  76. package/dist/esm/Sprinkle/tx-dialog.js.map +1 -0
  77. package/dist/esm/Sprinkle/type-guards.js +66 -0
  78. package/dist/esm/Sprinkle/type-guards.js.map +1 -0
  79. package/dist/esm/Sprinkle/types.js +66 -0
  80. package/dist/esm/Sprinkle/types.js.map +1 -0
  81. package/dist/esm/Sprinkle/utils/field-utils.js +145 -0
  82. package/dist/esm/Sprinkle/utils/field-utils.js.map +1 -0
  83. package/dist/esm/Sprinkle/utils/formatting.js +118 -0
  84. package/dist/esm/Sprinkle/utils/formatting.js.map +1 -0
  85. package/dist/esm/Sprinkle/utils/index.js +7 -0
  86. package/dist/esm/Sprinkle/utils/index.js.map +1 -0
  87. package/dist/esm/Sprinkle/wallet.js +90 -0
  88. package/dist/esm/Sprinkle/wallet.js.map +1 -0
  89. package/dist/types/Sprinkle/encryption.d.ts +43 -0
  90. package/dist/types/Sprinkle/encryption.d.ts.map +1 -0
  91. package/dist/types/Sprinkle/index.d.ts +17 -177
  92. package/dist/types/Sprinkle/index.d.ts.map +1 -1
  93. package/dist/types/Sprinkle/menus/array-menu.d.ts +31 -0
  94. package/dist/types/Sprinkle/menus/array-menu.d.ts.map +1 -0
  95. package/dist/types/Sprinkle/menus/field-menu.d.ts +34 -0
  96. package/dist/types/Sprinkle/menus/field-menu.d.ts.map +1 -0
  97. package/dist/types/Sprinkle/menus/index.d.ts +10 -0
  98. package/dist/types/Sprinkle/menus/index.d.ts.map +1 -0
  99. package/dist/types/Sprinkle/menus/object-menu.d.ts +34 -0
  100. package/dist/types/Sprinkle/menus/object-menu.d.ts.map +1 -0
  101. package/dist/types/Sprinkle/prompts.d.ts +119 -0
  102. package/dist/types/Sprinkle/prompts.d.ts.map +1 -0
  103. package/dist/types/Sprinkle/schemas.d.ts +125 -0
  104. package/dist/types/Sprinkle/schemas.d.ts.map +1 -0
  105. package/dist/types/Sprinkle/tx-dialog.d.ts +37 -0
  106. package/dist/types/Sprinkle/tx-dialog.d.ts.map +1 -0
  107. package/dist/types/Sprinkle/type-guards.d.ts +45 -0
  108. package/dist/types/Sprinkle/type-guards.d.ts.map +1 -0
  109. package/dist/types/Sprinkle/types.d.ts +115 -0
  110. package/dist/types/Sprinkle/types.d.ts.map +1 -0
  111. package/dist/types/Sprinkle/utils/field-utils.d.ts +47 -0
  112. package/dist/types/Sprinkle/utils/field-utils.d.ts.map +1 -0
  113. package/dist/types/Sprinkle/utils/formatting.d.ts +30 -0
  114. package/dist/types/Sprinkle/utils/formatting.d.ts.map +1 -0
  115. package/dist/types/Sprinkle/wallet.d.ts +27 -0
  116. package/dist/types/Sprinkle/wallet.d.ts.map +1 -0
  117. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  118. package/package.json +1 -1
  119. package/src/Sprinkle/__tests__/encryption.test.ts +23 -8
  120. package/src/Sprinkle/__tests__/enhancements.test.ts +34 -47
  121. package/src/Sprinkle/__tests__/field-utils.test.ts +191 -0
  122. package/src/Sprinkle/__tests__/fill-in-struct.test.ts +301 -86
  123. package/src/Sprinkle/__tests__/formatting.test.ts +115 -0
  124. package/src/Sprinkle/__tests__/show-menu.test.ts +102 -8
  125. package/src/Sprinkle/__tests__/tx-dialog.test.ts +30 -0
  126. package/src/Sprinkle/encryption.ts +130 -0
  127. package/src/Sprinkle/index.ts +368 -598
  128. package/src/Sprinkle/menus/array-menu.ts +191 -0
  129. package/src/Sprinkle/menus/field-menu.ts +145 -0
  130. package/src/Sprinkle/menus/index.ts +12 -0
  131. package/src/Sprinkle/menus/object-menu.ts +336 -0
  132. package/src/Sprinkle/prompts.ts +551 -0
  133. package/src/Sprinkle/schemas.ts +111 -0
  134. package/src/Sprinkle/tx-dialog.ts +100 -0
  135. package/src/Sprinkle/type-guards.ts +93 -0
  136. package/src/Sprinkle/types.ts +116 -0
  137. package/src/Sprinkle/utils/field-utils.ts +158 -0
  138. package/src/Sprinkle/utils/formatting.ts +127 -0
  139. package/src/Sprinkle/utils/index.ts +17 -0
  140. package/src/Sprinkle/wallet.ts +133 -0
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Encryption utilities for sensitive field handling.
3
+ * Functions for encrypting, decrypting, and masking sensitive data in settings.
4
+ */
5
+
6
+ import { isObject, isUnion, isSensitive } from "./type-guards.js";
7
+ /**
8
+ * Recursively collect paths to all sensitive fields in a schema.
9
+ */
10
+ export function collectSensitivePaths(type, prefix = "") {
11
+ const paths = [];
12
+ if (isObject(type)) {
13
+ const fields = type["properties"];
14
+ for (const [field, fieldType] of Object.entries(fields)) {
15
+ const fieldPath = prefix ? `${prefix}.${field}` : field;
16
+ if (isSensitive(fieldType)) {
17
+ paths.push(fieldPath);
18
+ }
19
+ paths.push(...collectSensitivePaths(fieldType, fieldPath));
20
+ }
21
+ }
22
+ if (isUnion(type)) {
23
+ for (const variant of type.anyOf) {
24
+ paths.push(...collectSensitivePaths(variant, prefix));
25
+ }
26
+ }
27
+ return paths;
28
+ }
29
+
30
+ /**
31
+ * Get a nested value from an object by dot-separated path.
32
+ */
33
+ export function getNestedValue(obj, path) {
34
+ return path.split(".").reduce((o, k) => o?.[k], obj);
35
+ }
36
+
37
+ /**
38
+ * Set a nested value in an object by dot-separated path.
39
+ */
40
+ export function setNestedValue(obj, path, value) {
41
+ const keys = path.split(".");
42
+ const last = keys.pop();
43
+ const parent = keys.reduce((o, k) => o?.[k], obj);
44
+ if (parent && typeof parent === "object") {
45
+ parent[last] = value;
46
+ }
47
+ }
48
+
49
+ /**
50
+ * JSON replacer that converts BigInt to string with 'n' suffix.
51
+ */
52
+ export function bigIntReplacer(_key, value) {
53
+ return typeof value === "bigint" ? `${value.toString()}n` : value;
54
+ }
55
+
56
+ /**
57
+ * JSON reviver that converts strings with 'n' suffix back to BigInt.
58
+ */
59
+ export function bigIntReviver(_key, value) {
60
+ if (typeof value === "string" && /^\d+n$/.test(value)) {
61
+ return BigInt(value.slice(0, -1));
62
+ }
63
+ return value;
64
+ }
65
+
66
+ /**
67
+ * Deep clone an object, preserving BigInt values.
68
+ */
69
+ export function cloneWithBigInt(obj) {
70
+ return JSON.parse(JSON.stringify(obj, bigIntReplacer), bigIntReviver);
71
+ }
72
+
73
+ /**
74
+ * Encrypt all sensitive fields in a settings object.
75
+ */
76
+ export function encryptSensitiveFields(settings, type, encryption) {
77
+ const clone = cloneWithBigInt(settings);
78
+ const sensitivePaths = collectSensitivePaths(type);
79
+ for (const p of sensitivePaths) {
80
+ const value = getNestedValue(clone, p);
81
+ if (typeof value === "string" && value.length > 0) {
82
+ setNestedValue(clone, p, encryption.encrypt(value));
83
+ }
84
+ }
85
+ return clone;
86
+ }
87
+
88
+ /**
89
+ * Decrypt all sensitive fields in a settings object.
90
+ */
91
+ export async function decryptSensitiveFields(settings, type, encryption) {
92
+ const clone = cloneWithBigInt(settings);
93
+ const sensitivePaths = collectSensitivePaths(type);
94
+ for (const p of sensitivePaths) {
95
+ const value = getNestedValue(clone, p);
96
+ if (typeof value === "string" && value.length > 0) {
97
+ setNestedValue(clone, p, await encryption.decrypt(value));
98
+ }
99
+ }
100
+ return clone;
101
+ }
102
+
103
+ /**
104
+ * Mask all sensitive fields in a settings object for display.
105
+ */
106
+ export function maskSensitiveFields(settings, type) {
107
+ const clone = cloneWithBigInt(settings);
108
+ const sensitivePaths = collectSensitivePaths(type);
109
+ for (const p of sensitivePaths) {
110
+ const value = getNestedValue(clone, p);
111
+ if (typeof value === "string" && value.length > 0) {
112
+ setNestedValue(clone, p, "********");
113
+ }
114
+ }
115
+ return clone;
116
+ }
117
+ //# sourceMappingURL=encryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.js","names":["isObject","isUnion","isSensitive","collectSensitivePaths","type","prefix","paths","fields","field","fieldType","Object","entries","fieldPath","push","variant","anyOf","getNestedValue","obj","path","split","reduce","o","k","setNestedValue","value","keys","last","pop","parent","bigIntReplacer","_key","toString","bigIntReviver","test","BigInt","slice","cloneWithBigInt","JSON","parse","stringify","encryptSensitiveFields","settings","encryption","clone","sensitivePaths","p","length","encrypt","decryptSensitiveFields","decrypt","maskSensitiveFields"],"sources":["../../../src/Sprinkle/encryption.ts"],"sourcesContent":["/**\n * Encryption utilities for sensitive field handling.\n * Functions for encrypting, decrypting, and masking sensitive data in settings.\n */\n\nimport type { TSchema } from \"@sinclair/typebox\";\nimport { isObject, isUnion, isSensitive } from \"./type-guards.js\";\nimport type { IEncryptionOptions } from \"./types.js\";\n\n/**\n * Recursively collect paths to all sensitive fields in a schema.\n */\nexport function collectSensitivePaths(\n type: TSchema,\n prefix: string = \"\",\n): string[] {\n const paths: string[] = [];\n if (isObject(type)) {\n const fields = type[\"properties\"] as Record<string, TSchema>;\n for (const [field, fieldType] of Object.entries(fields)) {\n const fieldPath = prefix ? `${prefix}.${field}` : field;\n if (isSensitive(fieldType)) {\n paths.push(fieldPath);\n }\n paths.push(...collectSensitivePaths(fieldType, fieldPath));\n }\n }\n if (isUnion(type)) {\n for (const variant of type.anyOf) {\n paths.push(...collectSensitivePaths(variant, prefix));\n }\n }\n return paths;\n}\n\n/**\n * Get a nested value from an object by dot-separated path.\n */\nexport function getNestedValue(obj: any, path: string): unknown {\n return path.split(\".\").reduce((o, k) => o?.[k], obj);\n}\n\n/**\n * Set a nested value in an object by dot-separated path.\n */\nexport function setNestedValue(obj: any, path: string, value: unknown): void {\n const keys = path.split(\".\");\n const last = keys.pop()!;\n const parent = keys.reduce((o, k) => o?.[k], obj);\n if (parent && typeof parent === \"object\") {\n parent[last] = value;\n }\n}\n\n/**\n * JSON replacer that converts BigInt to string with 'n' suffix.\n */\nexport function bigIntReplacer(_key: string, value: unknown): unknown {\n return typeof value === \"bigint\" ? `${value.toString()}n` : value;\n}\n\n/**\n * JSON reviver that converts strings with 'n' suffix back to BigInt.\n */\nexport function bigIntReviver(_key: string, value: unknown): unknown {\n if (typeof value === \"string\" && /^\\d+n$/.test(value)) {\n return BigInt(value.slice(0, -1));\n }\n return value;\n}\n\n/**\n * Deep clone an object, preserving BigInt values.\n */\nexport function cloneWithBigInt<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj, bigIntReplacer), bigIntReviver);\n}\n\n/**\n * Encrypt all sensitive fields in a settings object.\n */\nexport function encryptSensitiveFields<T>(\n settings: T,\n type: TSchema,\n encryption: IEncryptionOptions,\n): T {\n const clone = cloneWithBigInt(settings);\n const sensitivePaths = collectSensitivePaths(type);\n for (const p of sensitivePaths) {\n const value = getNestedValue(clone, p);\n if (typeof value === \"string\" && value.length > 0) {\n setNestedValue(clone, p, encryption.encrypt(value));\n }\n }\n return clone;\n}\n\n/**\n * Decrypt all sensitive fields in a settings object.\n */\nexport async function decryptSensitiveFields<T>(\n settings: T,\n type: TSchema,\n encryption: IEncryptionOptions,\n): Promise<T> {\n const clone = cloneWithBigInt(settings);\n const sensitivePaths = collectSensitivePaths(type);\n for (const p of sensitivePaths) {\n const value = getNestedValue(clone, p);\n if (typeof value === \"string\" && value.length > 0) {\n setNestedValue(clone, p, await encryption.decrypt(value));\n }\n }\n return clone;\n}\n\n/**\n * Mask all sensitive fields in a settings object for display.\n */\nexport function maskSensitiveFields<T>(settings: T, type: TSchema): T {\n const clone = cloneWithBigInt(settings);\n const sensitivePaths = collectSensitivePaths(type);\n for (const p of sensitivePaths) {\n const value = getNestedValue(clone, p);\n if (typeof value === \"string\" && value.length > 0) {\n setNestedValue(clone, p, \"********\");\n }\n }\n return clone;\n}\n"],"mappings":"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","ignoreList":[]}