@sundaeswap/sprinkles 0.3.0 → 0.4.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.
- package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js +120 -0
- package/dist/cjs/Sprinkle/__tests__/settings-persistence.test.js.map +1 -1
- package/dist/cjs/Sprinkle/index.js +21 -0
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js +120 -0
- package/dist/esm/Sprinkle/__tests__/settings-persistence.test.js.map +1 -1
- package/dist/esm/Sprinkle/index.js +21 -0
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/types/Sprinkle/index.d.ts +5 -0
- package/dist/types/Sprinkle/index.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/Sprinkle/__tests__/settings-persistence.test.ts +108 -0
- package/src/Sprinkle/index.ts +29 -0
|
@@ -195,5 +195,125 @@ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r
|
|
|
195
195
|
});
|
|
196
196
|
(0, _bunTest.expect)(sprinkle.profileMeta.name).toBe("Default");
|
|
197
197
|
});
|
|
198
|
+
(0, _bunTest.describe)("currentProfile", () => {
|
|
199
|
+
(0, _bunTest.test)("returns null when no profile loaded", () => {
|
|
200
|
+
const schema = _index.Type.Object({
|
|
201
|
+
name: _index.Type.String()
|
|
202
|
+
});
|
|
203
|
+
const sprinkle = new _index.Sprinkle(schema, tmpDir);
|
|
204
|
+
(0, _bunTest.expect)(sprinkle.currentProfile).toBeNull();
|
|
205
|
+
});
|
|
206
|
+
(0, _bunTest.test)("returns profile info when loaded", () => {
|
|
207
|
+
const schema = _index.Type.Object({
|
|
208
|
+
name: _index.Type.String()
|
|
209
|
+
});
|
|
210
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
211
|
+
const profile = sprinkle.currentProfile;
|
|
212
|
+
(0, _bunTest.expect)(profile).not.toBeNull();
|
|
213
|
+
(0, _bunTest.expect)(profile.id).toBe("test");
|
|
214
|
+
(0, _bunTest.expect)(profile.name).toBe("Test");
|
|
215
|
+
(0, _bunTest.expect)(profile.createdAt).toBeDefined();
|
|
216
|
+
(0, _bunTest.expect)(profile.updatedAt).toBeDefined();
|
|
217
|
+
});
|
|
218
|
+
(0, _bunTest.test)("includes description when present", () => {
|
|
219
|
+
const schema = _index.Type.Object({
|
|
220
|
+
name: _index.Type.String()
|
|
221
|
+
});
|
|
222
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
223
|
+
sprinkle.profileMeta.description = "Test profile description";
|
|
224
|
+
const profile = sprinkle.currentProfile;
|
|
225
|
+
(0, _bunTest.expect)(profile.description).toBe("Test profile description");
|
|
226
|
+
});
|
|
227
|
+
(0, _bunTest.test)("has undefined description when not set", () => {
|
|
228
|
+
const schema = _index.Type.Object({
|
|
229
|
+
name: _index.Type.String()
|
|
230
|
+
});
|
|
231
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
232
|
+
delete sprinkle.profileMeta.description;
|
|
233
|
+
const profile = sprinkle.currentProfile;
|
|
234
|
+
(0, _bunTest.expect)(profile.description).toBeUndefined();
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
(0, _bunTest.describe)("getDisplaySettings", () => {
|
|
238
|
+
(0, _bunTest.test)("masks sensitive fields", () => {
|
|
239
|
+
const schema = _index.Type.Object({
|
|
240
|
+
name: _index.Type.String(),
|
|
241
|
+
secret: _index.Type.String({
|
|
242
|
+
sensitive: true
|
|
243
|
+
})
|
|
244
|
+
});
|
|
245
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
246
|
+
sprinkle.settings = {
|
|
247
|
+
name: "visible",
|
|
248
|
+
secret: "hidden"
|
|
249
|
+
};
|
|
250
|
+
const display = sprinkle.getDisplaySettings();
|
|
251
|
+
(0, _bunTest.expect)(display.name).toBe("visible");
|
|
252
|
+
(0, _bunTest.expect)(display.secret).toBe("********");
|
|
253
|
+
});
|
|
254
|
+
(0, _bunTest.test)("preserves non-sensitive fields", () => {
|
|
255
|
+
const schema = _index.Type.Object({
|
|
256
|
+
name: _index.Type.String(),
|
|
257
|
+
count: _index.Type.Number()
|
|
258
|
+
});
|
|
259
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
260
|
+
sprinkle.settings = {
|
|
261
|
+
name: "test",
|
|
262
|
+
count: 42
|
|
263
|
+
};
|
|
264
|
+
const display = sprinkle.getDisplaySettings();
|
|
265
|
+
(0, _bunTest.expect)(display.name).toBe("test");
|
|
266
|
+
(0, _bunTest.expect)(display.count).toBe(42);
|
|
267
|
+
});
|
|
268
|
+
(0, _bunTest.test)("preserves BigInt values", () => {
|
|
269
|
+
const schema = _index.Type.Object({
|
|
270
|
+
amount: _index.Type.BigInt(),
|
|
271
|
+
secret: _index.Type.String({
|
|
272
|
+
sensitive: true
|
|
273
|
+
})
|
|
274
|
+
});
|
|
275
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
276
|
+
sprinkle.settings = {
|
|
277
|
+
amount: 42n,
|
|
278
|
+
secret: "hidden"
|
|
279
|
+
};
|
|
280
|
+
const display = sprinkle.getDisplaySettings();
|
|
281
|
+
(0, _bunTest.expect)(display.amount).toBe(42n);
|
|
282
|
+
(0, _bunTest.expect)(display.secret).toBe("********");
|
|
283
|
+
});
|
|
284
|
+
(0, _bunTest.test)("masks nested sensitive fields", () => {
|
|
285
|
+
const schema = _index.Type.Object({
|
|
286
|
+
wallet: _index.Type.Object({
|
|
287
|
+
key: _index.Type.String({
|
|
288
|
+
sensitive: true
|
|
289
|
+
}),
|
|
290
|
+
address: _index.Type.String()
|
|
291
|
+
})
|
|
292
|
+
});
|
|
293
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
294
|
+
sprinkle.settings = {
|
|
295
|
+
wallet: {
|
|
296
|
+
key: "secret",
|
|
297
|
+
address: "addr1..."
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
const display = sprinkle.getDisplaySettings();
|
|
301
|
+
(0, _bunTest.expect)(display.wallet.key).toBe("********");
|
|
302
|
+
(0, _bunTest.expect)(display.wallet.address).toBe("addr1...");
|
|
303
|
+
});
|
|
304
|
+
(0, _bunTest.test)("does not mask empty sensitive fields", () => {
|
|
305
|
+
const schema = _index.Type.Object({
|
|
306
|
+
secret: _index.Type.String({
|
|
307
|
+
sensitive: true
|
|
308
|
+
})
|
|
309
|
+
});
|
|
310
|
+
const sprinkle = (0, _testHelpers.withProfile)(new _index.Sprinkle(schema, tmpDir));
|
|
311
|
+
sprinkle.settings = {
|
|
312
|
+
secret: ""
|
|
313
|
+
};
|
|
314
|
+
const display = sprinkle.getDisplaySettings();
|
|
315
|
+
(0, _bunTest.expect)(display.secret).toBe("");
|
|
316
|
+
});
|
|
317
|
+
});
|
|
198
318
|
});
|
|
199
319
|
//# sourceMappingURL=settings-persistence.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-persistence.test.js","names":["_bunTest","require","_index","fs","_interopRequireWildcard","path","os","_testHelpers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","describe","tmpDir","beforeEach","mkdtempSync","join","tmpdir","afterEach","rmSync","recursive","force","test","result","Sprinkle","SettingsPath","expect","toBe","sep","nestedDir","schema","Type","name","String","sprinkle","withProfile","settings","saveSettings","existsSync","content","readFileSync","parsed","JSON","parse","defaults","toEqual","meta","amount","BigInt","raw","sprinkle2","loadProfile","string","user","score","profileMeta","profiles","scanProfiles","length","id","sanitizeProfileId","mkdirSync","writeFileSync","stringify","migrateIfNeeded"],"sources":["../../../../src/Sprinkle/__tests__/settings-persistence.test.ts"],"sourcesContent":["import { describe, expect, test, beforeEach, afterEach } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { withProfile } from \"./test-helpers.js\";\n\ndescribe(\"Settings Persistence\", () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sprinkles-test-\"));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n test(\"SettingsPath returns correct path\", () => {\n const result = Sprinkle.SettingsPath(\"/some/path\");\n expect(result).toBe(`/some/path${path.sep}settings.json`);\n });\n\n test(\"saveSettings creates directory if missing\", () => {\n const nestedDir = path.join(tmpDir, \"nested\", \"deep\");\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, nestedDir));\n sprinkle.settings = { name: \"test\" } as any;\n\n sprinkle.saveSettings();\n\n expect(fs.existsSync(path.join(nestedDir, \"profiles\", \"test.json\"))).toBe(\n true,\n );\n });\n\n test(\"saveSettings writes valid JSON with profile format\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"hello\" } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.name).toBe(\"hello\");\n expect(parsed.defaults).toEqual({});\n expect(parsed.meta.name).toBe(\"Test\");\n });\n\n test(\"saveSettings serializes BigInt values\", () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 42n } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const raw = JSON.parse(content);\n expect(raw.settings.amount).toBe(\"42n\");\n });\n\n test(\"saveSettings and loadProfile round-trip with BigInt\", async () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 99n } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({ amount: 99n });\n });\n\n test(\"saveSettings preserves defaults\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"last-input\" };\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.defaults.string).toBe(\"last-input\");\n });\n\n test(\"loadProfile restores defaults\", async () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"remembered\" };\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.defaults).toEqual({ string: \"remembered\" });\n });\n\n test(\"round-trip with nested objects\", async () => {\n const schema = Type.Object({\n user: Type.Object({\n name: Type.String(),\n score: Type.BigInt(),\n }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { user: { name: \"alice\", score: 100n } } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({\n user: { name: \"alice\", score: 100n },\n });\n });\n\n test(\"scanProfiles returns profile entries\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir), \"alice\");\n sprinkle.profileMeta.name = \"Alice\";\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.saveSettings();\n\n const profiles = sprinkle.scanProfiles();\n expect(profiles.length).toBe(1);\n expect(profiles[0]!.id).toBe(\"alice\");\n expect(profiles[0]!.meta.name).toBe(\"Alice\");\n });\n\n test(\"sanitizeProfileId handles various inputs\", () => {\n expect(Sprinkle.sanitizeProfileId(\"Mainnet Alice\")).toBe(\"mainnet-alice\");\n expect(Sprinkle.sanitizeProfileId(\"test--profile\")).toBe(\"test-profile\");\n expect(Sprinkle.sanitizeProfileId(\"Hello World!@#$\")).toBe(\"hello-world\");\n expect(Sprinkle.sanitizeProfileId(\" \")).toBe(\"profile\");\n expect(Sprinkle.sanitizeProfileId(\"simple\")).toBe(\"simple\");\n });\n\n test(\"migration converts legacy settings.json to profile\", async () => {\n const schema = Type.Object({ name: Type.String() });\n\n // Write legacy settings.json\n fs.mkdirSync(tmpDir, { recursive: true });\n fs.writeFileSync(\n path.join(tmpDir, \"settings.json\"),\n JSON.stringify({\n settings: { name: \"legacy\" },\n defaults: { string: \"old\" },\n }),\n );\n\n // Create sprinkle and trigger migration\n const sprinkle = new Sprinkle(schema, tmpDir);\n await (sprinkle as any).migrateIfNeeded();\n\n // Check profile was created\n expect(fs.existsSync(path.join(tmpDir, \"profiles\", \"default.json\"))).toBe(\n true,\n );\n // Check legacy file was backed up\n expect(fs.existsSync(path.join(tmpDir, \"settings.json.bak\"))).toBe(true);\n expect(fs.existsSync(path.join(tmpDir, \"settings.json\"))).toBe(false);\n\n // Load the migrated profile\n await sprinkle.loadProfile(\"default\");\n expect(sprinkle.settings).toEqual({ name: \"legacy\" });\n expect(sprinkle.defaults).toEqual({ string: \"old\" });\n expect(sprinkle.profileMeta.name).toBe(\"Default\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"settings-persistence.test.js","names":["_bunTest","require","_index","fs","_interopRequireWildcard","path","os","_testHelpers","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","describe","tmpDir","beforeEach","mkdtempSync","join","tmpdir","afterEach","rmSync","recursive","force","test","result","Sprinkle","SettingsPath","expect","toBe","sep","nestedDir","schema","Type","name","String","sprinkle","withProfile","settings","saveSettings","existsSync","content","readFileSync","parsed","JSON","parse","defaults","toEqual","meta","amount","BigInt","raw","sprinkle2","loadProfile","string","user","score","profileMeta","profiles","scanProfiles","length","id","sanitizeProfileId","mkdirSync","writeFileSync","stringify","migrateIfNeeded","currentProfile","toBeNull","profile","not","createdAt","toBeDefined","updatedAt","description","toBeUndefined","secret","sensitive","display","getDisplaySettings","count","Number","wallet","key","address"],"sources":["../../../../src/Sprinkle/__tests__/settings-persistence.test.ts"],"sourcesContent":["import { describe, expect, test, beforeEach, afterEach } from \"bun:test\";\nimport { Sprinkle, Type } from \"../index.js\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { withProfile } from \"./test-helpers.js\";\n\ndescribe(\"Settings Persistence\", () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"sprinkles-test-\"));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n test(\"SettingsPath returns correct path\", () => {\n const result = Sprinkle.SettingsPath(\"/some/path\");\n expect(result).toBe(`/some/path${path.sep}settings.json`);\n });\n\n test(\"saveSettings creates directory if missing\", () => {\n const nestedDir = path.join(tmpDir, \"nested\", \"deep\");\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, nestedDir));\n sprinkle.settings = { name: \"test\" } as any;\n\n sprinkle.saveSettings();\n\n expect(fs.existsSync(path.join(nestedDir, \"profiles\", \"test.json\"))).toBe(\n true,\n );\n });\n\n test(\"saveSettings writes valid JSON with profile format\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"hello\" } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.settings.name).toBe(\"hello\");\n expect(parsed.defaults).toEqual({});\n expect(parsed.meta.name).toBe(\"Test\");\n });\n\n test(\"saveSettings serializes BigInt values\", () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 42n } as any;\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const raw = JSON.parse(content);\n expect(raw.settings.amount).toBe(\"42n\");\n });\n\n test(\"saveSettings and loadProfile round-trip with BigInt\", async () => {\n const schema = Type.Object({ amount: Type.BigInt() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 99n } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({ amount: 99n });\n });\n\n test(\"saveSettings preserves defaults\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"last-input\" };\n\n sprinkle.saveSettings();\n\n const content = fs.readFileSync(\n path.join(tmpDir, \"profiles\", \"test.json\"),\n \"utf-8\",\n );\n const parsed = JSON.parse(content);\n expect(parsed.defaults.string).toBe(\"last-input\");\n });\n\n test(\"loadProfile restores defaults\", async () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.defaults = { string: \"remembered\" };\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.defaults).toEqual({ string: \"remembered\" });\n });\n\n test(\"round-trip with nested objects\", async () => {\n const schema = Type.Object({\n user: Type.Object({\n name: Type.String(),\n score: Type.BigInt(),\n }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { user: { name: \"alice\", score: 100n } } as any;\n sprinkle.saveSettings();\n\n const sprinkle2 = new Sprinkle(schema, tmpDir);\n await sprinkle2.loadProfile(\"test\");\n\n expect(sprinkle2.settings).toEqual({\n user: { name: \"alice\", score: 100n },\n });\n });\n\n test(\"scanProfiles returns profile entries\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir), \"alice\");\n sprinkle.profileMeta.name = \"Alice\";\n sprinkle.settings = { name: \"test\" } as any;\n sprinkle.saveSettings();\n\n const profiles = sprinkle.scanProfiles();\n expect(profiles.length).toBe(1);\n expect(profiles[0]!.id).toBe(\"alice\");\n expect(profiles[0]!.meta.name).toBe(\"Alice\");\n });\n\n test(\"sanitizeProfileId handles various inputs\", () => {\n expect(Sprinkle.sanitizeProfileId(\"Mainnet Alice\")).toBe(\"mainnet-alice\");\n expect(Sprinkle.sanitizeProfileId(\"test--profile\")).toBe(\"test-profile\");\n expect(Sprinkle.sanitizeProfileId(\"Hello World!@#$\")).toBe(\"hello-world\");\n expect(Sprinkle.sanitizeProfileId(\" \")).toBe(\"profile\");\n expect(Sprinkle.sanitizeProfileId(\"simple\")).toBe(\"simple\");\n });\n\n test(\"migration converts legacy settings.json to profile\", async () => {\n const schema = Type.Object({ name: Type.String() });\n\n // Write legacy settings.json\n fs.mkdirSync(tmpDir, { recursive: true });\n fs.writeFileSync(\n path.join(tmpDir, \"settings.json\"),\n JSON.stringify({\n settings: { name: \"legacy\" },\n defaults: { string: \"old\" },\n }),\n );\n\n // Create sprinkle and trigger migration\n const sprinkle = new Sprinkle(schema, tmpDir);\n await (sprinkle as any).migrateIfNeeded();\n\n // Check profile was created\n expect(fs.existsSync(path.join(tmpDir, \"profiles\", \"default.json\"))).toBe(\n true,\n );\n // Check legacy file was backed up\n expect(fs.existsSync(path.join(tmpDir, \"settings.json.bak\"))).toBe(true);\n expect(fs.existsSync(path.join(tmpDir, \"settings.json\"))).toBe(false);\n\n // Load the migrated profile\n await sprinkle.loadProfile(\"default\");\n expect(sprinkle.settings).toEqual({ name: \"legacy\" });\n expect(sprinkle.defaults).toEqual({ string: \"old\" });\n expect(sprinkle.profileMeta.name).toBe(\"Default\");\n });\n\n describe(\"currentProfile\", () => {\n test(\"returns null when no profile loaded\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = new Sprinkle(schema, tmpDir);\n\n expect(sprinkle.currentProfile).toBeNull();\n });\n\n test(\"returns profile info when loaded\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n\n const profile = sprinkle.currentProfile;\n expect(profile).not.toBeNull();\n expect(profile!.id).toBe(\"test\");\n expect(profile!.name).toBe(\"Test\");\n expect(profile!.createdAt).toBeDefined();\n expect(profile!.updatedAt).toBeDefined();\n });\n\n test(\"includes description when present\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.profileMeta.description = \"Test profile description\";\n\n const profile = sprinkle.currentProfile;\n expect(profile!.description).toBe(\"Test profile description\");\n });\n\n test(\"has undefined description when not set\", () => {\n const schema = Type.Object({ name: Type.String() });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n delete sprinkle.profileMeta.description;\n\n const profile = sprinkle.currentProfile;\n expect(profile!.description).toBeUndefined();\n });\n });\n\n describe(\"getDisplaySettings\", () => {\n test(\"masks sensitive fields\", () => {\n const schema = Type.Object({\n name: Type.String(),\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"visible\", secret: \"hidden\" } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.name).toBe(\"visible\");\n expect(display.secret).toBe(\"********\");\n });\n\n test(\"preserves non-sensitive fields\", () => {\n const schema = Type.Object({\n name: Type.String(),\n count: Type.Number(),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { name: \"test\", count: 42 } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.name).toBe(\"test\");\n expect(display.count).toBe(42);\n });\n\n test(\"preserves BigInt values\", () => {\n const schema = Type.Object({\n amount: Type.BigInt(),\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { amount: 42n, secret: \"hidden\" } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.amount).toBe(42n);\n expect(display.secret).toBe(\"********\");\n });\n\n test(\"masks nested sensitive fields\", () => {\n const schema = Type.Object({\n wallet: Type.Object({\n key: Type.String({ sensitive: true }),\n address: Type.String(),\n }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = {\n wallet: { key: \"secret\", address: \"addr1...\" },\n } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.wallet.key).toBe(\"********\");\n expect(display.wallet.address).toBe(\"addr1...\");\n });\n\n test(\"does not mask empty sensitive fields\", () => {\n const schema = Type.Object({\n secret: Type.String({ sensitive: true }),\n });\n const sprinkle = withProfile(new Sprinkle(schema, tmpDir));\n sprinkle.settings = { secret: \"\" } as any;\n\n const display = sprinkle.getDisplaySettings();\n expect(display.secret).toBe(\"\");\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -144,6 +144,16 @@ class Sprinkle {
|
|
|
144
144
|
this.options = options ?? {};
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
+
// --- Current Profile Accessor ---
|
|
148
|
+
|
|
149
|
+
get currentProfile() {
|
|
150
|
+
if (!this.profileId) return null;
|
|
151
|
+
return {
|
|
152
|
+
id: this.profileId,
|
|
153
|
+
...this.profileMeta
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
147
157
|
// --- Profile path helpers ---
|
|
148
158
|
|
|
149
159
|
static sanitizeProfileId(name) {
|
|
@@ -673,6 +683,17 @@ class Sprinkle {
|
|
|
673
683
|
saveSettings() {
|
|
674
684
|
this.saveProfile();
|
|
675
685
|
}
|
|
686
|
+
getDisplaySettings() {
|
|
687
|
+
const clone = JSON.parse(JSON.stringify(this.settings, Sprinkle.bigIntReplacer), Sprinkle.bigIntReviver);
|
|
688
|
+
const sensitivePaths = Sprinkle.collectSensitivePaths(this.type);
|
|
689
|
+
for (const p of sensitivePaths) {
|
|
690
|
+
const value = Sprinkle.getNestedValue(clone, p);
|
|
691
|
+
if (typeof value === "string" && value.length > 0) {
|
|
692
|
+
Sprinkle.setNestedValue(clone, p, "********");
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
return clone;
|
|
696
|
+
}
|
|
676
697
|
|
|
677
698
|
// --- TxDialog Helpers ---
|
|
678
699
|
|