diff --git a/utils/propertiesMatcher.test.ts b/utils/propertiesMatcher.test.ts index 7239228..e462fef 100644 --- a/utils/propertiesMatcher.test.ts +++ b/utils/propertiesMatcher.test.ts @@ -596,6 +596,32 @@ const { test } = Deno; console.log("Checker = ", matches.Parser.parserAsString(checker.parser)); checker.unsafeCast({ mode: "automatic", size: 1234 }); }); + + test("A default that is invalid according to the tests", () => { + const checker = PM.typeFromProps({ + pubkey_whitelist: { + name: "Pubkey Whitelist (hex)", + description: + "A list of pubkeys that are permitted to publish through your relay. A minimum, you need to enter your own Nostr hex (not npub) pubkey. Go to https://damus.io/key/ to convert from npub to hex.", + type: "list", + nullable: true, + range: "[1,*)", + subtype: "string", + spec: { + placeholder: "hex (not npub) pubkey", + pattern: "[0-9a-fA-F]{3}", + "pattern-description": + "Must be a valid 64-digit hexadecimal value (ie a Nostr hex pubkey, not an npub). Go to https://damus.io/key/ to convert npub to hex.", + }, + default: [] as string[], // [] as string [] + }, + } as const); + + checker.unsafeCast({ + pubkey_whitelist: ["aaa"], + }); + }); + test("Full spec", () => { const checker = PM.typeFromProps(bitcoinProperties); diff --git a/utils/propertiesMatcher.ts b/utils/propertiesMatcher.ts index e4ca9d1..e9a2862 100644 --- a/utils/propertiesMatcher.ts +++ b/utils/propertiesMatcher.ts @@ -168,7 +168,7 @@ const isGenerator = matches.shape({ charset: matches.string, len: matches.number function defaultNullable(parser: matches.Parser, value: unknown) { if (matchDefault.test(value)) { if (isGenerator(value.default)) return parser.defaultTo(parser.unsafeCast(generateDefault(value.default))); - return parser.defaultTo(parser.unsafeCast(value.default)); + return parser.defaultTo(value.default); } if (matchNullable.test(value)) return parser.optional(); return parser; @@ -215,11 +215,13 @@ export function guardAll(value: A): matches.Parser true); + const { default: _, ...arrayOfSpec } = spec; + const subtype = matchSubType.unsafeCast(value).subtype; return defaultNullable( matches // deno-lint-ignore no-explicit-any - .arrayOf(guardAll({ type: subtype, ...spec } as any)) + .arrayOf(guardAll({ type: subtype, ...arrayOfSpec } as any)) .validate((x) => rangeValidate(x.length), "valid length"), value // deno-lint-ignore no-explicit-any