tupleson
Version:
A hackable JSON serializer/deserializer
1 lines • 3.47 kB
Source Map (JSON)
{"version":3,"sources":["../../src/sync/syncTypes.ts"],"sourcesContent":["const brand = Symbol(\"branded\");\n\nexport type TsonBranded<TType, TBrand> = TType & { [brand]: TBrand };\n\nexport type TsonNonce = TsonBranded<string, \"TsonNonce\">;\nexport type TsonTypeHandlerKey = TsonBranded<string, \"TsonTypeHandlerKey\">;\nexport type TsonSerializedValue = unknown;\n\nexport type TsonTuple = [TsonTypeHandlerKey, TsonSerializedValue, TsonNonce];\n\n// there's probably a better way of getting this type\nexport type TsonAllTypes =\n\t| \"bigint\"\n\t| \"boolean\"\n\t| \"function\"\n\t| \"number\"\n\t| \"object\"\n\t| \"string\"\n\t| \"symbol\"\n\t| \"undefined\";\n\ntype SerializedType =\n\t| Record<string, unknown>\n\t| boolean\n\t| number\n\t| string\n\t| unknown[];\n\nexport interface TsonTransformerNone {\n\tasync?: false;\n\tdeserialize?: never;\n\n\t/**\n\t * The key to use when serialized\n\t */\n\tkey?: never;\n\tserialize?: never;\n\tserializeIterator?: never;\n}\nexport interface TsonTransformerSerializeDeserialize<\n\tTValue,\n\tTSerializedType extends SerializedType,\n> {\n\tasync?: false;\n\t/**\n\t * From JSON-serializable value\n\t */\n\tdeserialize: (v: TSerializedType) => TValue;\n\n\t/**\n\t * The key to use when serialized\n\t */\n\tkey: string;\n\t/**\n\t * JSON-serializable value\n\t */\n\tserialize: (v: TValue) => TSerializedType;\n\tserializeIterator?: never;\n}\n\nexport type TsonTransformer<TValue, TSerializedType extends SerializedType> =\n\t| TsonTransformerNone\n\t| TsonTransformerSerializeDeserialize<TValue, TSerializedType>;\n\nexport interface TsonTypeTesterPrimitive {\n\t/**\n\t * The type of the primitive\n\t */\n\tprimitive: TsonAllTypes;\n\t/**\n\t * Test if the value is of this type\n\t */\n\ttest?: (v: unknown) => boolean;\n}\nexport interface TsonTypeTesterCustom {\n\t/**\n\t * The type of the primitive\n\t */\n\tprimitive?: never;\n\t/**\n\t * Test if the value is of this type\n\t */\n\ttest: (v: unknown) => boolean;\n}\n\ntype TsonTypeTester = TsonTypeTesterCustom | TsonTypeTesterPrimitive;\n\nexport type TsonType<\n\t/**\n\t * The type of the value\n\t */\n\tTValue,\n\t/**\n\t * JSON-serializable value how it's stored after it's serialized\n\t */\n\tTSerializedType extends SerializedType,\n> = TsonTypeTester & TsonTransformer<TValue, TSerializedType>;\n\nexport interface TsonOptions {\n\t/**\n\t * The nonce function every time we start serializing a new object\n\t * Should return a unique value every time it's called\n\t * @default `${crypto.randomUUID} if available, otherwise a random string generated by Math.random`\n\t */\n\tnonce?: () => number | string;\n\t/**\n\t * The list of types to use\n\t */\n\ttypes: (TsonType<any, any> | TsonType<any, never>)[];\n}\n\nexport const serialized = Symbol(\"serialized\");\n\nexport interface TsonSerialized<TValue = unknown> {\n\tjson: TsonSerializedValue;\n\tnonce: TsonNonce;\n\t[serialized]: TValue;\n}\n\nexport type TsonSerializeFn = <TValue>(obj: TValue) => TsonSerialized<TValue>;\n\nexport type TsonDeserializeFn = <TValue>(\n\tdata: TsonSerialized<TValue>,\n) => TValue;\n\nexport type TsonStringified<TValue> = string & { [serialized]: TValue };\n\nexport type TsonStringifyFn = <TValue>(\n\tobj: TValue,\n\tspace?: number | string,\n) => TsonStringified<TValue>;\n\nexport type TsonParseFn = <TValue>(string: TsonStringified<TValue>) => TValue;\n"],"mappings":"AAAA,MAAM,QAAQ,OAAO,SAAS;AA+GvB,MAAM,aAAa,OAAO,YAAY;","names":[]}