@vbotma/transformers 1.1.5 → 2.0.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.
@@ -159,7 +159,7 @@ export declare const parseLaunchParamsQuery: ((value: string | URLSearchParams)
159
159
  subtitle_text_color?: `#${string}` | undefined;
160
160
  text_color?: `#${string}` | undefined;
161
161
  };
162
- vbWebAppVersion: string;
162
+ vbWebAppVersion?: string | undefined;
163
163
  } & {
164
164
  [key: string]: unknown;
165
165
  }) & {};
@@ -181,7 +181,7 @@ export declare function launchParams(): import('valibot').LooseObjectSchema<{
181
181
  vbWebAppShowSettings: import('valibot').OptionalSchema<SchemaWithPipe<readonly [StringSchema<undefined>, TransformAction<string, boolean>]>, undefined>;
182
182
  vbWebAppStartParam: import('valibot').OptionalSchema<StringSchema<undefined>, undefined>;
183
183
  vbWebAppThemeParams: import('./pipes.js').JsonToSchemaPipe<RecordSchema<SchemaWithPipe<[StringSchema<undefined>, TransformAction<string, KnownThemeParamsKey>]>, SchemaWithPipe<[UnionSchema<[StringSchema<undefined>, NumberSchema<undefined>], any>, TransformAction<string | number, string>, CheckAction<`#${string}`, undefined>]>, undefined>>;
184
- vbWebAppVersion: StringSchema<undefined>;
184
+ vbWebAppVersion: import('valibot').OptionalSchema<StringSchema<undefined>, undefined>;
185
185
  }, undefined>;
186
186
  export declare function launchParamsQuery(): import('./pipes.js').QueryToSchemaPipe<import('valibot').LooseObjectSchema<{
187
187
  vbWebAppBotInline: import('valibot').OptionalSchema<SchemaWithPipe<readonly [StringSchema<undefined>, TransformAction<string, boolean>]>, undefined>;
@@ -238,7 +238,7 @@ export declare function launchParamsQuery(): import('./pipes.js').QueryToSchemaP
238
238
  vbWebAppShowSettings: import('valibot').OptionalSchema<SchemaWithPipe<readonly [StringSchema<undefined>, TransformAction<string, boolean>]>, undefined>;
239
239
  vbWebAppStartParam: import('valibot').OptionalSchema<StringSchema<undefined>, undefined>;
240
240
  vbWebAppThemeParams: import('./pipes.js').JsonToSchemaPipe<RecordSchema<SchemaWithPipe<[StringSchema<undefined>, TransformAction<string, KnownThemeParamsKey>]>, SchemaWithPipe<[UnionSchema<[StringSchema<undefined>, NumberSchema<undefined>], any>, TransformAction<string | number, string>, CheckAction<`#${string}`, undefined>]>, undefined>>;
241
- vbWebAppVersion: StringSchema<undefined>;
241
+ vbWebAppVersion: import('valibot').OptionalSchema<StringSchema<undefined>, undefined>;
242
242
  }, undefined>>;
243
243
  /**
244
244
  * @returns True if the passed value contains valid launch parameters query.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("@vbotma/toolkit"),o=require("fp-ts"),t=require("valibot");function $(r){const n=e=>{const a={};return new URLSearchParams(e).forEach((i,u)=>{const p=a[u];Array.isArray(p)?p.push(i):p===void 0?a[u]=i:a[u]=[p,i]}),t.parse(r,a)};return t.pipe(t.union([t.string(),t.instance(URLSearchParams)]),t.check(e=>{try{return n(e),!0}catch{return!1}},"The value doesn't match required schema"),t.transform(n))}function C(r){return t.pipe(t.string(),t.check(n=>{try{return JSON.parse(n),!0}catch{return!1}},"Input is not a valid JSON value"),t.transform(JSON.parse),r)}function s(r){return t.pipe(t.string(),C(r))}function m(r){return t.pipe(t.union([t.string(),t.instance(URLSearchParams)]),$(r))}function f(r){return n=>r.test(n)}const S=f(/^#[\da-f]{3}$/i),A=f(/^#[\da-f]{4}$/i),R=f(/^#[\da-f]{6}$/i),B=f(/^#[\da-f]{8}$/i);function D(r){return[R,B,S,A].some(n=>n(r))}function b(r){let n="#";for(let e=0;e<r.length-1;e+=1)n+=r[1+e].repeat(2);return n}function g(r){const n=r.replace(/\s/g,"").toLowerCase();if(/^#[\da-f]{3}$/i.test(n))return o.either.right(b(n.toLowerCase()+"f"));if(/^#[\da-f]{4}$/i.test(n))return o.either.right(b(n.toLowerCase()));if(/^#[\da-f]{6}$/i.test(n))return o.either.right(n.toLowerCase()+"ff");if(/^#[\da-f]{8}$/i.test(n))return o.either.right(n.toLowerCase());const e=n.match(/^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/)||n.match(/^rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\)$/);return e?o.either.right(e.slice(1).reduce((a,i)=>a+parseInt(i,10).toString(16).padStart(2,"0"),"#").padEnd(9,"f")):o.either.left(new Error(`Value "${r}" does not satisfy any of known RGB formats.`))}function P(r){return o.function.pipe(g(r),o.either.map(n=>n.slice(0,7)))}const I=c.throwifyFpFn(P),W=c.throwifyFpFn(g);function Q(){return t.looseObject({id:t.number(),photo_url:t.optional(t.string()),type:t.string(),title:t.string(),username:t.optional(t.string())})}function h(){return t.looseObject({added_to_attachment_menu:t.optional(t.boolean()),allows_write_to_pm:t.optional(t.boolean()),first_name:t.string(),id:t.number(),is_bot:t.optional(t.boolean()),is_premium:t.optional(t.boolean()),last_name:t.optional(t.string()),language_code:t.optional(t.string()),photo_url:t.optional(t.string()),username:t.optional(t.string())})}function F(){return t.looseObject({projectCode:t.string(),uid:t.string(),sessionId:t.string(),rootToken:t.string()})}function _(){return t.looseObject({auth_date:t.pipe(t.string(),t.transform(r=>new Date(Number(r)*1e3)),t.date()),can_send_after:t.optional(t.pipe(t.string(),t.transform(Number),t.integer())),chat:t.optional(s(Q())),chat_type:t.optional(t.string()),chat_instance:t.optional(t.string()),hash:t.optional(t.string()),query_id:t.optional(t.string()),receiver:t.optional(s(h())),start_param:t.optional(t.string()),signature:t.optional(t.string()),user:t.optional(s(h())),auth:t.optional(s(F()))})}function y(){return m(_())}function l(){return t.record(t.string(),t.pipe(t.union([t.string(),t.number()]),t.transform(r=>typeof r=="number"?`#${(r&16777215).toString(16).padStart(6,"0")}`:r),t.check(D)))}function G(){const r=t.optional(t.pipe(t.string(),t.transform(n=>n==="1")));return t.looseObject({vbWebAppBotInline:r,vbWebAppData:t.optional(y()),vbWebAppDefaultColors:t.optional(s(l())),vbWebAppFullscreen:r,vbWebAppPlatform:t.string(),vbWebAppShowSettings:r,vbWebAppStartParam:t.optional(t.string()),vbWebAppThemeParams:s(l()),vbWebAppVersion:t.string()})}function d(){return m(G())}function j(r){try{return t.is(d(),r)}catch{return!1}}function J(){return t.looseObject({eventType:t.string(),eventData:t.optional(t.unknown())})}function w(r){return o.either.tryCatch(()=>t.parse(y(),r),n=>n)}function L(r){return o.either.tryCatch(()=>t.parse(d(),r),n=>n)}const N=c.throwifyFpFn(w),U=c.throwifyFpFn(L);function T(r,n){return n||(n=(e,a)=>JSON.stringify(a)),new URLSearchParams(Object.entries(r).reduce((e,[a,i])=>(Array.isArray(i)?e.push(...i.map(u=>[a,String(u)])):i!=null&&e.push([a,i instanceof Date?(i.getTime()/1e3|0).toString():typeof i=="string"||typeof i=="number"?String(i):typeof i=="boolean"?i?"1":"0":n(a,i)]),e),[])).toString()}function O(r){return T(r)}function q(r){return T(r,(n,e)=>n==="vbWebAppData"?O(e):JSON.stringify(e))}exports.initData=_;exports.initDataAuth=F;exports.initDataChat=Q;exports.initDataQuery=y;exports.initDataUser=h;exports.isAnyRGB=D;exports.isLaunchParamsQuery=j;exports.isRGB=R;exports.isRGBA=B;exports.isRGBAShort=A;exports.isRGBShort=S;exports.launchParams=G;exports.launchParamsQuery=d;exports.miniAppsMessage=J;exports.parseInitDataQuery=N;exports.parseInitDataQueryFp=w;exports.parseLaunchParamsQuery=U;exports.parseLaunchParamsQueryFp=L;exports.pipeJsonToSchema=s;exports.pipeQueryToSchema=m;exports.serializeInitDataQuery=O;exports.serializeLaunchParamsQuery=q;exports.themeParams=l;exports.toRGB=I;exports.toRGBFp=P;exports.toRGBFull=W;exports.toRGBFullFp=g;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("@vbotma/toolkit"),o=require("fp-ts"),t=require("valibot");function $(r){const n=e=>{const a={};return new URLSearchParams(e).forEach((i,u)=>{const p=a[u];Array.isArray(p)?p.push(i):p===void 0?a[u]=i:a[u]=[p,i]}),t.parse(r,a)};return t.pipe(t.union([t.string(),t.instance(URLSearchParams)]),t.check(e=>{try{return n(e),!0}catch{return!1}},"The value doesn't match required schema"),t.transform(n))}function C(r){return t.pipe(t.string(),t.check(n=>{try{return JSON.parse(n),!0}catch{return!1}},"Input is not a valid JSON value"),t.transform(JSON.parse),r)}function s(r){return t.pipe(t.string(),C(r))}function m(r){return t.pipe(t.union([t.string(),t.instance(URLSearchParams)]),$(r))}function f(r){return n=>r.test(n)}const S=f(/^#[\da-f]{3}$/i),A=f(/^#[\da-f]{4}$/i),R=f(/^#[\da-f]{6}$/i),B=f(/^#[\da-f]{8}$/i);function D(r){return[R,B,S,A].some(n=>n(r))}function b(r){let n="#";for(let e=0;e<r.length-1;e+=1)n+=r[1+e].repeat(2);return n}function g(r){const n=r.replace(/\s/g,"").toLowerCase();if(/^#[\da-f]{3}$/i.test(n))return o.either.right(b(n.toLowerCase()+"f"));if(/^#[\da-f]{4}$/i.test(n))return o.either.right(b(n.toLowerCase()));if(/^#[\da-f]{6}$/i.test(n))return o.either.right(n.toLowerCase()+"ff");if(/^#[\da-f]{8}$/i.test(n))return o.either.right(n.toLowerCase());const e=n.match(/^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/)||n.match(/^rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\)$/);return e?o.either.right(e.slice(1).reduce((a,i)=>a+parseInt(i,10).toString(16).padStart(2,"0"),"#").padEnd(9,"f")):o.either.left(new Error(`Value "${r}" does not satisfy any of known RGB formats.`))}function P(r){return o.function.pipe(g(r),o.either.map(n=>n.slice(0,7)))}const I=c.throwifyFpFn(P),W=c.throwifyFpFn(g);function Q(){return t.looseObject({id:t.number(),photo_url:t.optional(t.string()),type:t.string(),title:t.string(),username:t.optional(t.string())})}function h(){return t.looseObject({added_to_attachment_menu:t.optional(t.boolean()),allows_write_to_pm:t.optional(t.boolean()),first_name:t.string(),id:t.number(),is_bot:t.optional(t.boolean()),is_premium:t.optional(t.boolean()),last_name:t.optional(t.string()),language_code:t.optional(t.string()),photo_url:t.optional(t.string()),username:t.optional(t.string())})}function F(){return t.looseObject({projectCode:t.string(),uid:t.string(),sessionId:t.string(),rootToken:t.string()})}function _(){return t.looseObject({auth_date:t.pipe(t.string(),t.transform(r=>new Date(Number(r)*1e3)),t.date()),can_send_after:t.optional(t.pipe(t.string(),t.transform(Number),t.integer())),chat:t.optional(s(Q())),chat_type:t.optional(t.string()),chat_instance:t.optional(t.string()),hash:t.optional(t.string()),query_id:t.optional(t.string()),receiver:t.optional(s(h())),start_param:t.optional(t.string()),signature:t.optional(t.string()),user:t.optional(s(h())),auth:t.optional(s(F()))})}function y(){return m(_())}function l(){return t.record(t.string(),t.pipe(t.union([t.string(),t.number()]),t.transform(r=>typeof r=="number"?`#${(r&16777215).toString(16).padStart(6,"0")}`:r),t.check(D)))}function G(){const r=t.optional(t.pipe(t.string(),t.transform(n=>n==="1")));return t.looseObject({vbWebAppBotInline:r,vbWebAppData:t.optional(y()),vbWebAppDefaultColors:t.optional(s(l())),vbWebAppFullscreen:r,vbWebAppPlatform:t.string(),vbWebAppShowSettings:r,vbWebAppStartParam:t.optional(t.string()),vbWebAppThemeParams:s(l()),vbWebAppVersion:t.optional(t.string())})}function d(){return m(G())}function j(r){try{return t.is(d(),r)}catch{return!1}}function J(){return t.looseObject({eventType:t.string(),eventData:t.optional(t.unknown())})}function w(r){return o.either.tryCatch(()=>t.parse(y(),r),n=>n)}function L(r){return o.either.tryCatch(()=>t.parse(d(),r),n=>n)}const N=c.throwifyFpFn(w),U=c.throwifyFpFn(L);function T(r,n){return n||(n=(e,a)=>JSON.stringify(a)),new URLSearchParams(Object.entries(r).reduce((e,[a,i])=>(Array.isArray(i)?e.push(...i.map(u=>[a,String(u)])):i!=null&&e.push([a,i instanceof Date?(i.getTime()/1e3|0).toString():typeof i=="string"||typeof i=="number"?String(i):typeof i=="boolean"?i?"1":"0":n(a,i)]),e),[])).toString()}function O(r){return T(r)}function q(r){return T(r,(n,e)=>n==="vbWebAppData"?O(e):JSON.stringify(e))}exports.initData=_;exports.initDataAuth=F;exports.initDataChat=Q;exports.initDataQuery=y;exports.initDataUser=h;exports.isAnyRGB=D;exports.isLaunchParamsQuery=j;exports.isRGB=R;exports.isRGBA=B;exports.isRGBAShort=A;exports.isRGBShort=S;exports.launchParams=G;exports.launchParamsQuery=d;exports.miniAppsMessage=J;exports.parseInitDataQuery=N;exports.parseInitDataQueryFp=w;exports.parseLaunchParamsQuery=U;exports.parseLaunchParamsQueryFp=L;exports.pipeJsonToSchema=s;exports.pipeQueryToSchema=m;exports.serializeInitDataQuery=O;exports.serializeLaunchParamsQuery=q;exports.themeParams=l;exports.toRGB=I;exports.toRGBFp=P;exports.toRGBFull=W;exports.toRGBFullFp=g;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/transformers.ts","../src/pipes.ts","../src/rgb.ts","../src/structures.ts","../src/parsers.ts","../src/serializers.ts"],"sourcesContent":["import {\n type BaseIssue,\n type BaseSchema,\n check,\n type CheckAction,\n type InferOutput,\n instance,\n type InstanceSchema,\n parse,\n pipe,\n type SchemaWithPipe,\n string,\n type StringSchema,\n transform,\n type TransformAction,\n union,\n type UnionSchema,\n} from 'valibot';\n\ntype RequiredSchema = BaseSchema<any, any, BaseIssue<any>>;\n\nexport type TransformJsonToSchemaAction<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n StringSchema<any>,\n CheckAction<string, string>,\n TransformAction<string, unknown>,\n Schema,\n]>;\n\nexport type TransformQueryToSchemaAction<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n UnionSchema<[\n StringSchema<undefined>,\n InstanceSchema<typeof URLSearchParams, undefined>,\n ], undefined>,\n CheckAction<string | URLSearchParams, string>,\n TransformAction<string | URLSearchParams, InferOutput<Schema>>,\n]>;\n\nexport function transformQueryToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): TransformQueryToSchemaAction<Schema> {\n const transformer = (input: string | URLSearchParams) => {\n const result: Record<string, string | string[]> = {};\n\n new URLSearchParams(input).forEach((value, key) => {\n const accValue = result[key];\n if (Array.isArray(accValue)) {\n accValue.push(value);\n } else if (accValue === undefined) {\n result[key] = value;\n } else {\n result[key] = [accValue, value];\n }\n });\n\n return parse(schema, result);\n };\n\n return pipe(\n union([string(), instance(URLSearchParams)]),\n check(input => {\n try {\n transformer(input);\n return true;\n } catch {\n return false;\n }\n }, 'The value doesn\\'t match required schema'),\n transform(transformer),\n );\n}\n\n/**\n * @returns A transformer applying `JSON.parse` to the input.\n */\nexport function transformJsonToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): TransformJsonToSchemaAction<Schema> {\n return pipe(\n string(),\n check(input => {\n try {\n JSON.parse(input);\n return true;\n } catch {\n return false;\n }\n }, 'Input is not a valid JSON value'),\n transform(JSON.parse),\n schema,\n );\n}\n","import {\n type BaseIssue,\n type BaseSchema,\n instance,\n type InstanceSchema,\n pipe,\n type SchemaWithPipe,\n string,\n type StringSchema,\n union,\n type UnionSchema,\n} from 'valibot';\n\nimport {\n transformJsonToSchema,\n type TransformJsonToSchemaAction,\n transformQueryToSchema,\n type TransformQueryToSchemaAction,\n} from './transformers.js';\n\ntype RequiredSchema = BaseSchema<any, any, BaseIssue<any>>;\n\nexport type JsonToSchemaPipe<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n StringSchema<undefined>,\n TransformJsonToSchemaAction<Schema>,\n]>;\n\nexport type QueryToSchemaPipe<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n UnionSchema<[\n StringSchema<undefined>,\n InstanceSchema<typeof URLSearchParams, undefined>,\n ], undefined>,\n TransformQueryToSchemaAction<Schema>,\n]>;\n\nexport function pipeJsonToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): JsonToSchemaPipe<Schema> {\n return pipe(string(), transformJsonToSchema(schema));\n}\n\nexport function pipeQueryToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): QueryToSchemaPipe<Schema> {\n return pipe(\n union([string(), instance(URLSearchParams)]),\n transformQueryToSchema(schema),\n );\n}\n","import { throwifyFpFn } from '@vbotma/toolkit';\nimport type { RGB } from '@vbotma/types';\nimport { either as E, function as fn } from 'fp-ts';\n\nfunction guardBasedOn(re: RegExp) {\n return (value: string): value is RGB => re.test(value);\n}\n\n/**\n * @returns True if the value has the #RGB format.\n */\nexport const isRGBShort = guardBasedOn(/^#[\\da-f]{3}$/i);\n\n/**\n * @returns True if the value has the #RGBA format.\n */\nexport const isRGBAShort = guardBasedOn(/^#[\\da-f]{4}$/i);\n\n/**\n * @returns True if the value has the #RRGGBB format.\n */\nexport const isRGB = guardBasedOn(/^#[\\da-f]{6}$/i);\n\n/**\n * @returns True if the value has the #RRGGBBAA format.\n */\nexport const isRGBA = guardBasedOn(/^#[\\da-f]{8}$/i);\n\n/**\n * @returns True if the value has any known RGB format.\n * @param value - value to check.\n */\nexport function isAnyRGB(value: string): value is RGB {\n return [isRGB, isRGBA, isRGBShort, isRGBAShort].some(fn => fn(value));\n}\n\n/**\n * Converts a short version of RGB (#RGB) to a complete one (#RRGGBB).\n * @param value\n */\nfunction expandRgb(value: RGB): RGB {\n let color: RGB = '#';\n for (let i = 0; i < value.length - 1; i += 1) {\n color += value[1 + i].repeat(2);\n }\n return color;\n}\n\n/**\n * Converts passed value to #RRGGBBAA format. Accepts the following color formats:\n * - `#RGB`\n * - `#RGBA`\n * - `#RRGGBB`\n * - `#RRGGBBAA`\n * - `rgb(1,2,3)`\n * - `rgba(1,2,3,4)`\n * @param value - a value to convert.\n * @returns A value in the #RRGGBBAA format.\n */\nexport function toRGBFullFp(value: string): E.Either<Error, RGB> {\n const clean = value.replace(/\\s/g, '').toLowerCase();\n if (/^#[\\da-f]{3}$/i.test(clean)) {\n return E.right(expandRgb(clean.toLowerCase() + 'f' as RGB));\n }\n\n if (/^#[\\da-f]{4}$/i.test(clean)) {\n return E.right(expandRgb(clean.toLowerCase() as RGB));\n }\n\n if (/^#[\\da-f]{6}$/i.test(clean)) {\n return E.right(clean.toLowerCase() + 'ff' as RGB);\n }\n\n if (/^#[\\da-f]{8}$/i.test(clean)) {\n return E.right(clean.toLowerCase() as RGB);\n }\n\n // Example valid values: rgb(0,3,10) rgba(32,114,8,0)\n const match = clean.match(/^rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$/)\n || clean.match(/^rgba\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$/);\n\n // If this didn't work as well, we can't extract RGB color from passed text.\n if (!match) {\n return E.left(new Error(`Value \"${value}\" does not satisfy any of known RGB formats.`));\n }\n\n // Otherwise, take R, G and B components, convert to hex and create #RRGGBB string.\n return E.right(\n match\n .slice(1)\n .reduce(\n (acc, component) => {\n return acc + parseInt(component, 10)\n .toString(16)\n .padStart(2, '0');\n }, '#',\n )\n // We are adding f-s here to match the pattern: #RRGGBBAA\n .padEnd(9, 'f') as RGB,\n );\n}\n\n/**\n * Converts passed value to #RRGGBB format. Accepts the following color formats:\n * - `#RGB`\n * - `#RGBA`\n * - `#RRGGBB`\n * - `#RRGGBBAA`\n * - `rgb(1,2,3)`\n * - `rgba(1,2,3,4)`\n * @param value - a value to convert.\n * @returns A value in the #RRGGBB format.\n * @deprecated This function cuts the RGB's alpha channel. Use the `toRGBFullFp` function instead.\n */\nexport function toRGBFp(value: string): E.Either<Error, RGB> {\n return fn.pipe(\n toRGBFullFp(value),\n E.map(rgb => rgb.slice(0, 7) as RGB),\n );\n}\n\n/**\n * @see toRGBFp\n * @deprecated This function cuts the RGB's alpha channel. Use the `toRGBFull` function instead.\n */\nexport const toRGB = throwifyFpFn(toRGBFp);\n\n/**\n * @see toRGBFullFp\n */\nexport const toRGBFull = throwifyFpFn(toRGBFullFp);\n","import type {\n Chat,\n InitData,\n KnownThemeParamsKey,\n LaunchParams,\n RGB,\n User,\n Auth\n} from '@vbotma/types';\nimport {\n type BaseSchema,\n boolean,\n check,\n type CheckAction,\n date,\n type InferOutput,\n integer,\n is,\n looseObject,\n number,\n type NumberSchema,\n optional,\n pipe,\n record,\n type RecordSchema,\n type SchemaWithPipe,\n string,\n type StringSchema,\n transform,\n type TransformAction,\n union,\n type UnionSchema,\n unknown,\n} from 'valibot';\n\nimport { pipeJsonToSchema, pipeQueryToSchema } from './pipes.js';\nimport { isAnyRGB } from './rgb.js';\n\nexport type InitDataGenSchema = ReturnType<typeof initData>;\nexport type InitDataGenType = InferOutput<InitDataGenSchema>;\n\nexport type LaunchParamsGenSchema = ReturnType<typeof launchParams>;\nexport type LaunchParamsGenType = InferOutput<LaunchParamsGenSchema>;\n\nexport type MiniAppsMessageGenSchema = ReturnType<typeof miniAppsMessage>;\nexport type MiniAppsMessageGenType = InferOutput<MiniAppsMessageGenSchema>;\n\nexport function initDataChat() {\n return looseObject({\n id: number(),\n photo_url: optional(string()),\n type: string(),\n title: string(),\n username: optional(string()),\n } satisfies { [K in keyof Chat]-?: BaseSchema<unknown, Chat[K], any> });\n}\n\nexport function initDataUser() {\n return looseObject({\n added_to_attachment_menu: optional(boolean()),\n allows_write_to_pm: optional(boolean()),\n first_name: string(),\n id: number(),\n is_bot: optional(boolean()),\n is_premium: optional(boolean()),\n last_name: optional(string()),\n language_code: optional(string()),\n photo_url: optional(string()),\n username: optional(string()),\n } satisfies { [K in keyof User]-?: BaseSchema<unknown, User[K], any> });\n}\n\nexport function initDataAuth() {\n return looseObject({\n projectCode: string(),\n uid: string(),\n sessionId: string(),\n rootToken: string(),\n } satisfies { [K in keyof Auth]-?: BaseSchema<unknown, Auth[K], any> });\n}\n\nexport function initData() {\n return looseObject({\n auth_date: pipe(\n string(),\n transform(input => new Date(Number(input) * 1000)),\n date(),\n ),\n can_send_after: optional(pipe(string(), transform(Number), integer())),\n chat: optional(pipeJsonToSchema(initDataChat())),\n chat_type: optional(string()),\n chat_instance: optional(string()),\n hash: optional(string()),\n query_id: optional(string()),\n receiver: optional(pipeJsonToSchema(initDataUser())),\n start_param: optional(string()),\n signature: optional(string()),\n user: optional(pipeJsonToSchema(initDataUser())),\n auth: optional(pipeJsonToSchema(initDataAuth())),\n } satisfies { [K in keyof InitData]-?: unknown });\n}\n\nexport function initDataQuery() {\n return pipeQueryToSchema(initData());\n}\n\nexport function themeParams() {\n return record(\n string(),\n pipe(\n union([string(), number()]),\n transform(value => {\n return typeof value === 'number'\n ? `#${(value & 0x00FFFFFF).toString(16).padStart(6, '0')}`\n : value;\n }),\n check(isAnyRGB),\n ),\n ) as RecordSchema<\n SchemaWithPipe<[\n StringSchema<undefined>,\n TransformAction<string, KnownThemeParamsKey>,\n ]>,\n SchemaWithPipe<[\n UnionSchema<[StringSchema<undefined>, NumberSchema<undefined>], any>,\n TransformAction<string | number, string>,\n CheckAction<RGB, undefined>,\n ]>,\n undefined\n >;\n}\n\nexport function launchParams() {\n const optBool = optional(pipe(string(), transform(v => v === '1')));\n\n return looseObject({\n vbWebAppBotInline: optBool,\n vbWebAppData: optional(initDataQuery()),\n vbWebAppDefaultColors: optional(pipeJsonToSchema(themeParams())),\n vbWebAppFullscreen: optBool,\n vbWebAppPlatform: string(),\n vbWebAppShowSettings: optBool,\n vbWebAppStartParam: optional(string()),\n vbWebAppThemeParams: pipeJsonToSchema(themeParams()),\n vbWebAppVersion: string(),\n } satisfies { [K in keyof LaunchParams]-?: BaseSchema<any, LaunchParams[K], any> });\n}\n\nexport function launchParamsQuery() {\n return pipeQueryToSchema(launchParams());\n}\n\n/**\n * @returns True if the passed value contains valid launch parameters query.\n */\nexport function isLaunchParamsQuery(value: string | URLSearchParams): boolean {\n try {\n return is(launchParamsQuery(), value);\n } catch {\n return false;\n }\n}\n\nexport function miniAppsMessage() {\n return looseObject({\n eventType: string(),\n eventData: optional(unknown()),\n });\n}\n","import { throwifyFpFn } from '@vbotma/toolkit';\nimport { either as E } from 'fp-ts';\nimport { parse, type ValiError } from 'valibot';\n\nimport {\n type InitDataGenSchema,\n type InitDataGenType,\n initDataQuery,\n type LaunchParamsGenSchema,\n type LaunchParamsGenType,\n launchParamsQuery,\n} from './structures.js';\n\nexport type ParseInitDataQueryError = ValiError<InitDataGenSchema>;\nexport type ParseLaunchParamsQueryError = ValiError<LaunchParamsGenSchema>;\n\nexport function parseInitDataQueryFp(value: string | URLSearchParams): E.Either<\n ParseInitDataQueryError,\n InitDataGenType\n> {\n return E.tryCatch(\n () => parse(initDataQuery(), value),\n e => e as ValiError<InitDataGenSchema>,\n );\n}\n\nexport function parseLaunchParamsQueryFp(value: string | URLSearchParams): E.Either<\n ParseLaunchParamsQueryError,\n LaunchParamsGenType\n> {\n return E.tryCatch(\n () => parse(launchParamsQuery(), value),\n e => e as ValiError<LaunchParamsGenSchema>,\n );\n}\n\nexport const parseInitDataQuery = throwifyFpFn(parseInitDataQueryFp);\nexport const parseLaunchParamsQuery = throwifyFpFn(parseLaunchParamsQueryFp);\n","import type { InitData, LaunchParams } from '@vbotma/types';\nimport type { InferOutput } from 'valibot';\n\nimport type { initData, launchParams } from './structures.js';\n\nexport type InitDataLike = Partial<InferOutput<ReturnType<typeof initData>> | InitData>;\nexport type LaunchParamsLike = Partial<InferOutput<ReturnType<typeof launchParams>> | LaunchParams>;\n\n/**\n * Converts the passed object to query parameters.\n * @param value - value to serialize.\n * @param onObject - function returning serialized object value.\n */\nfunction serializeToQuery(\n value: object,\n onObject?: (key: string, value: object) => string,\n): string {\n onObject ||= (_, value) => JSON.stringify(value);\n\n return new URLSearchParams(\n Object\n .entries(value)\n .reduce<[string, string][]>((acc, [key, value]) => {\n if (Array.isArray(value)) {\n acc.push(...value.map(v => [key, String(v)] as [string, string]));\n } else {\n if (value !== null && value !== undefined) {\n acc.push([\n key,\n value instanceof Date\n ? (value.getTime() / 1000 | 0).toString()\n : typeof value === 'string' || typeof value === 'number'\n ? String(value)\n : typeof value === 'boolean'\n ? value ? '1' : '0'\n : onObject(key, value),\n ]);\n }\n }\n return acc;\n }, []),\n ).toString();\n}\n\n/**\n * Serializes the InitDataQuery shape.\n * @param value - value to serialize.\n */\nexport function serializeInitDataQuery(value: InitDataLike): string {\n return serializeToQuery(value);\n}\n\n/**\n * Serializes the LaunchParamsQuery shape.\n * @param value - value to serialize.\n */\nexport function serializeLaunchParamsQuery(value: LaunchParamsLike): string {\n return serializeToQuery(value, (k, v) => {\n return k === 'vbWebAppData' ? serializeInitDataQuery(v as any) : JSON.stringify(v);\n });\n}\n"],"names":["transformQueryToSchema","schema","transformer","input","result","value","key","accValue","parse","pipe","union","string","instance","check","transform","transformJsonToSchema","pipeJsonToSchema","pipeQueryToSchema","guardBasedOn","re","isRGBShort","isRGBAShort","isRGB","isRGBA","isAnyRGB","fn","expandRgb","color","i","toRGBFullFp","clean","E","match","acc","component","toRGBFp","rgb","toRGB","throwifyFpFn","toRGBFull","initDataChat","looseObject","number","optional","initDataUser","boolean","initDataAuth","initData","date","integer","initDataQuery","themeParams","record","launchParams","optBool","v","launchParamsQuery","isLaunchParamsQuery","is","miniAppsMessage","unknown","parseInitDataQueryFp","e","parseLaunchParamsQueryFp","parseInitDataQuery","parseLaunchParamsQuery","serializeToQuery","onObject","_","serializeInitDataQuery","serializeLaunchParamsQuery","k"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/transformers.ts","../src/pipes.ts","../src/rgb.ts","../src/structures.ts","../src/parsers.ts","../src/serializers.ts"],"sourcesContent":["import {\n type BaseIssue,\n type BaseSchema,\n check,\n type CheckAction,\n type InferOutput,\n instance,\n type InstanceSchema,\n parse,\n pipe,\n type SchemaWithPipe,\n string,\n type StringSchema,\n transform,\n type TransformAction,\n union,\n type UnionSchema,\n} from 'valibot';\n\ntype RequiredSchema = BaseSchema<any, any, BaseIssue<any>>;\n\nexport type TransformJsonToSchemaAction<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n StringSchema<any>,\n CheckAction<string, string>,\n TransformAction<string, unknown>,\n Schema,\n]>;\n\nexport type TransformQueryToSchemaAction<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n UnionSchema<[\n StringSchema<undefined>,\n InstanceSchema<typeof URLSearchParams, undefined>,\n ], undefined>,\n CheckAction<string | URLSearchParams, string>,\n TransformAction<string | URLSearchParams, InferOutput<Schema>>,\n]>;\n\nexport function transformQueryToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): TransformQueryToSchemaAction<Schema> {\n const transformer = (input: string | URLSearchParams) => {\n const result: Record<string, string | string[]> = {};\n\n new URLSearchParams(input).forEach((value, key) => {\n const accValue = result[key];\n if (Array.isArray(accValue)) {\n accValue.push(value);\n } else if (accValue === undefined) {\n result[key] = value;\n } else {\n result[key] = [accValue, value];\n }\n });\n\n return parse(schema, result);\n };\n\n return pipe(\n union([string(), instance(URLSearchParams)]),\n check(input => {\n try {\n transformer(input);\n return true;\n } catch {\n return false;\n }\n }, 'The value doesn\\'t match required schema'),\n transform(transformer),\n );\n}\n\n/**\n * @returns A transformer applying `JSON.parse` to the input.\n */\nexport function transformJsonToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): TransformJsonToSchemaAction<Schema> {\n return pipe(\n string(),\n check(input => {\n try {\n JSON.parse(input);\n return true;\n } catch {\n return false;\n }\n }, 'Input is not a valid JSON value'),\n transform(JSON.parse),\n schema,\n );\n}\n","import {\n type BaseIssue,\n type BaseSchema,\n instance,\n type InstanceSchema,\n pipe,\n type SchemaWithPipe,\n string,\n type StringSchema,\n union,\n type UnionSchema,\n} from 'valibot';\n\nimport {\n transformJsonToSchema,\n type TransformJsonToSchemaAction,\n transformQueryToSchema,\n type TransformQueryToSchemaAction,\n} from './transformers.js';\n\ntype RequiredSchema = BaseSchema<any, any, BaseIssue<any>>;\n\nexport type JsonToSchemaPipe<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n StringSchema<undefined>,\n TransformJsonToSchemaAction<Schema>,\n]>;\n\nexport type QueryToSchemaPipe<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n UnionSchema<[\n StringSchema<undefined>,\n InstanceSchema<typeof URLSearchParams, undefined>,\n ], undefined>,\n TransformQueryToSchemaAction<Schema>,\n]>;\n\nexport function pipeJsonToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): JsonToSchemaPipe<Schema> {\n return pipe(string(), transformJsonToSchema(schema));\n}\n\nexport function pipeQueryToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): QueryToSchemaPipe<Schema> {\n return pipe(\n union([string(), instance(URLSearchParams)]),\n transformQueryToSchema(schema),\n );\n}\n","import { throwifyFpFn } from '@vbotma/toolkit';\nimport type { RGB } from '@vbotma/types';\nimport { either as E, function as fn } from 'fp-ts';\n\nfunction guardBasedOn(re: RegExp) {\n return (value: string): value is RGB => re.test(value);\n}\n\n/**\n * @returns True if the value has the #RGB format.\n */\nexport const isRGBShort = guardBasedOn(/^#[\\da-f]{3}$/i);\n\n/**\n * @returns True if the value has the #RGBA format.\n */\nexport const isRGBAShort = guardBasedOn(/^#[\\da-f]{4}$/i);\n\n/**\n * @returns True if the value has the #RRGGBB format.\n */\nexport const isRGB = guardBasedOn(/^#[\\da-f]{6}$/i);\n\n/**\n * @returns True if the value has the #RRGGBBAA format.\n */\nexport const isRGBA = guardBasedOn(/^#[\\da-f]{8}$/i);\n\n/**\n * @returns True if the value has any known RGB format.\n * @param value - value to check.\n */\nexport function isAnyRGB(value: string): value is RGB {\n return [isRGB, isRGBA, isRGBShort, isRGBAShort].some(fn => fn(value));\n}\n\n/**\n * Converts a short version of RGB (#RGB) to a complete one (#RRGGBB).\n * @param value\n */\nfunction expandRgb(value: RGB): RGB {\n let color: RGB = '#';\n for (let i = 0; i < value.length - 1; i += 1) {\n color += value[1 + i].repeat(2);\n }\n return color;\n}\n\n/**\n * Converts passed value to #RRGGBBAA format. Accepts the following color formats:\n * - `#RGB`\n * - `#RGBA`\n * - `#RRGGBB`\n * - `#RRGGBBAA`\n * - `rgb(1,2,3)`\n * - `rgba(1,2,3,4)`\n * @param value - a value to convert.\n * @returns A value in the #RRGGBBAA format.\n */\nexport function toRGBFullFp(value: string): E.Either<Error, RGB> {\n const clean = value.replace(/\\s/g, '').toLowerCase();\n if (/^#[\\da-f]{3}$/i.test(clean)) {\n return E.right(expandRgb(clean.toLowerCase() + 'f' as RGB));\n }\n\n if (/^#[\\da-f]{4}$/i.test(clean)) {\n return E.right(expandRgb(clean.toLowerCase() as RGB));\n }\n\n if (/^#[\\da-f]{6}$/i.test(clean)) {\n return E.right(clean.toLowerCase() + 'ff' as RGB);\n }\n\n if (/^#[\\da-f]{8}$/i.test(clean)) {\n return E.right(clean.toLowerCase() as RGB);\n }\n\n // Example valid values: rgb(0,3,10) rgba(32,114,8,0)\n const match = clean.match(/^rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$/)\n || clean.match(/^rgba\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$/);\n\n // If this didn't work as well, we can't extract RGB color from passed text.\n if (!match) {\n return E.left(new Error(`Value \"${value}\" does not satisfy any of known RGB formats.`));\n }\n\n // Otherwise, take R, G and B components, convert to hex and create #RRGGBB string.\n return E.right(\n match\n .slice(1)\n .reduce(\n (acc, component) => {\n return acc + parseInt(component, 10)\n .toString(16)\n .padStart(2, '0');\n }, '#',\n )\n // We are adding f-s here to match the pattern: #RRGGBBAA\n .padEnd(9, 'f') as RGB,\n );\n}\n\n/**\n * Converts passed value to #RRGGBB format. Accepts the following color formats:\n * - `#RGB`\n * - `#RGBA`\n * - `#RRGGBB`\n * - `#RRGGBBAA`\n * - `rgb(1,2,3)`\n * - `rgba(1,2,3,4)`\n * @param value - a value to convert.\n * @returns A value in the #RRGGBB format.\n * @deprecated This function cuts the RGB's alpha channel. Use the `toRGBFullFp` function instead.\n */\nexport function toRGBFp(value: string): E.Either<Error, RGB> {\n return fn.pipe(\n toRGBFullFp(value),\n E.map(rgb => rgb.slice(0, 7) as RGB),\n );\n}\n\n/**\n * @see toRGBFp\n * @deprecated This function cuts the RGB's alpha channel. Use the `toRGBFull` function instead.\n */\nexport const toRGB = throwifyFpFn(toRGBFp);\n\n/**\n * @see toRGBFullFp\n */\nexport const toRGBFull = throwifyFpFn(toRGBFullFp);\n","import type {\n Chat,\n InitData,\n KnownThemeParamsKey,\n LaunchParams,\n RGB,\n User,\n Auth\n} from '@vbotma/types';\nimport {\n type BaseSchema,\n boolean,\n check,\n type CheckAction,\n date,\n type InferOutput,\n integer,\n is,\n looseObject,\n number,\n type NumberSchema,\n optional,\n pipe,\n record,\n type RecordSchema,\n type SchemaWithPipe,\n string,\n type StringSchema,\n transform,\n type TransformAction,\n union,\n type UnionSchema,\n unknown,\n} from 'valibot';\n\nimport { pipeJsonToSchema, pipeQueryToSchema } from './pipes.js';\nimport { isAnyRGB } from './rgb.js';\n\nexport type InitDataGenSchema = ReturnType<typeof initData>;\nexport type InitDataGenType = InferOutput<InitDataGenSchema>;\n\nexport type LaunchParamsGenSchema = ReturnType<typeof launchParams>;\nexport type LaunchParamsGenType = InferOutput<LaunchParamsGenSchema>;\n\nexport type MiniAppsMessageGenSchema = ReturnType<typeof miniAppsMessage>;\nexport type MiniAppsMessageGenType = InferOutput<MiniAppsMessageGenSchema>;\n\nexport function initDataChat() {\n return looseObject({\n id: number(),\n photo_url: optional(string()),\n type: string(),\n title: string(),\n username: optional(string()),\n } satisfies { [K in keyof Chat]-?: BaseSchema<unknown, Chat[K], any> });\n}\n\nexport function initDataUser() {\n return looseObject({\n added_to_attachment_menu: optional(boolean()),\n allows_write_to_pm: optional(boolean()),\n first_name: string(),\n id: number(),\n is_bot: optional(boolean()),\n is_premium: optional(boolean()),\n last_name: optional(string()),\n language_code: optional(string()),\n photo_url: optional(string()),\n username: optional(string()),\n } satisfies { [K in keyof User]-?: BaseSchema<unknown, User[K], any> });\n}\n\nexport function initDataAuth() {\n return looseObject({\n projectCode: string(),\n uid: string(),\n sessionId: string(),\n rootToken: string(),\n } satisfies { [K in keyof Auth]-?: BaseSchema<unknown, Auth[K], any> });\n}\n\nexport function initData() {\n return looseObject({\n auth_date: pipe(\n string(),\n transform(input => new Date(Number(input) * 1000)),\n date(),\n ),\n can_send_after: optional(pipe(string(), transform(Number), integer())),\n chat: optional(pipeJsonToSchema(initDataChat())),\n chat_type: optional(string()),\n chat_instance: optional(string()),\n hash: optional(string()),\n query_id: optional(string()),\n receiver: optional(pipeJsonToSchema(initDataUser())),\n start_param: optional(string()),\n signature: optional(string()),\n user: optional(pipeJsonToSchema(initDataUser())),\n auth: optional(pipeJsonToSchema(initDataAuth())),\n } satisfies { [K in keyof InitData]-?: unknown });\n}\n\nexport function initDataQuery() {\n return pipeQueryToSchema(initData());\n}\n\nexport function themeParams() {\n return record(\n string(),\n pipe(\n union([string(), number()]),\n transform(value => {\n return typeof value === 'number'\n ? `#${(value & 0x00FFFFFF).toString(16).padStart(6, '0')}`\n : value;\n }),\n check(isAnyRGB),\n ),\n ) as RecordSchema<\n SchemaWithPipe<[\n StringSchema<undefined>,\n TransformAction<string, KnownThemeParamsKey>,\n ]>,\n SchemaWithPipe<[\n UnionSchema<[StringSchema<undefined>, NumberSchema<undefined>], any>,\n TransformAction<string | number, string>,\n CheckAction<RGB, undefined>,\n ]>,\n undefined\n >;\n}\n\nexport function launchParams() {\n const optBool = optional(pipe(string(), transform(v => v === '1')));\n\n return looseObject({\n vbWebAppBotInline: optBool,\n vbWebAppData: optional(initDataQuery()),\n vbWebAppDefaultColors: optional(pipeJsonToSchema(themeParams())),\n vbWebAppFullscreen: optBool,\n vbWebAppPlatform: string(),\n vbWebAppShowSettings: optBool,\n vbWebAppStartParam: optional(string()),\n vbWebAppThemeParams: pipeJsonToSchema(themeParams()),\n vbWebAppVersion: optional(string()),\n } satisfies { [K in keyof LaunchParams]-?: BaseSchema<any, LaunchParams[K], any> });\n}\n\nexport function launchParamsQuery() {\n return pipeQueryToSchema(launchParams());\n}\n\n/**\n * @returns True if the passed value contains valid launch parameters query.\n */\nexport function isLaunchParamsQuery(value: string | URLSearchParams): boolean {\n try {\n return is(launchParamsQuery(), value);\n } catch {\n return false;\n }\n}\n\nexport function miniAppsMessage() {\n return looseObject({\n eventType: string(),\n eventData: optional(unknown()),\n });\n}\n","import { throwifyFpFn } from '@vbotma/toolkit';\nimport { either as E } from 'fp-ts';\nimport { parse, type ValiError } from 'valibot';\n\nimport {\n type InitDataGenSchema,\n type InitDataGenType,\n initDataQuery,\n type LaunchParamsGenSchema,\n type LaunchParamsGenType,\n launchParamsQuery,\n} from './structures.js';\n\nexport type ParseInitDataQueryError = ValiError<InitDataGenSchema>;\nexport type ParseLaunchParamsQueryError = ValiError<LaunchParamsGenSchema>;\n\nexport function parseInitDataQueryFp(value: string | URLSearchParams): E.Either<\n ParseInitDataQueryError,\n InitDataGenType\n> {\n return E.tryCatch(\n () => parse(initDataQuery(), value),\n e => e as ValiError<InitDataGenSchema>,\n );\n}\n\nexport function parseLaunchParamsQueryFp(value: string | URLSearchParams): E.Either<\n ParseLaunchParamsQueryError,\n LaunchParamsGenType\n> {\n return E.tryCatch(\n () => parse(launchParamsQuery(), value),\n e => e as ValiError<LaunchParamsGenSchema>,\n );\n}\n\nexport const parseInitDataQuery = throwifyFpFn(parseInitDataQueryFp);\nexport const parseLaunchParamsQuery = throwifyFpFn(parseLaunchParamsQueryFp);\n","import type { InitData, LaunchParams } from '@vbotma/types';\nimport type { InferOutput } from 'valibot';\n\nimport type { initData, launchParams } from './structures.js';\n\nexport type InitDataLike = Partial<InferOutput<ReturnType<typeof initData>> | InitData>;\nexport type LaunchParamsLike = Partial<InferOutput<ReturnType<typeof launchParams>> | LaunchParams>;\n\n/**\n * Converts the passed object to query parameters.\n * @param value - value to serialize.\n * @param onObject - function returning serialized object value.\n */\nfunction serializeToQuery(\n value: object,\n onObject?: (key: string, value: object) => string,\n): string {\n onObject ||= (_, value) => JSON.stringify(value);\n\n return new URLSearchParams(\n Object\n .entries(value)\n .reduce<[string, string][]>((acc, [key, value]) => {\n if (Array.isArray(value)) {\n acc.push(...value.map(v => [key, String(v)] as [string, string]));\n } else {\n if (value !== null && value !== undefined) {\n acc.push([\n key,\n value instanceof Date\n ? (value.getTime() / 1000 | 0).toString()\n : typeof value === 'string' || typeof value === 'number'\n ? String(value)\n : typeof value === 'boolean'\n ? value ? '1' : '0'\n : onObject(key, value),\n ]);\n }\n }\n return acc;\n }, []),\n ).toString();\n}\n\n/**\n * Serializes the InitDataQuery shape.\n * @param value - value to serialize.\n */\nexport function serializeInitDataQuery(value: InitDataLike): string {\n return serializeToQuery(value);\n}\n\n/**\n * Serializes the LaunchParamsQuery shape.\n * @param value - value to serialize.\n */\nexport function serializeLaunchParamsQuery(value: LaunchParamsLike): string {\n return serializeToQuery(value, (k, v) => {\n return k === 'vbWebAppData' ? serializeInitDataQuery(v as any) : JSON.stringify(v);\n });\n}\n"],"names":["transformQueryToSchema","schema","transformer","input","result","value","key","accValue","parse","pipe","union","string","instance","check","transform","transformJsonToSchema","pipeJsonToSchema","pipeQueryToSchema","guardBasedOn","re","isRGBShort","isRGBAShort","isRGB","isRGBA","isAnyRGB","fn","expandRgb","color","i","toRGBFullFp","clean","E","match","acc","component","toRGBFp","rgb","toRGB","throwifyFpFn","toRGBFull","initDataChat","looseObject","number","optional","initDataUser","boolean","initDataAuth","initData","date","integer","initDataQuery","themeParams","record","launchParams","optBool","v","launchParamsQuery","isLaunchParamsQuery","is","miniAppsMessage","unknown","parseInitDataQueryFp","e","parseLaunchParamsQueryFp","parseInitDataQuery","parseLaunchParamsQuery","serializeToQuery","onObject","_","serializeInitDataQuery","serializeLaunchParamsQuery","k"],"mappings":"2JAqCO,SAASA,EACdC,EACsC,CACtC,MAAMC,EAAeC,GAAoC,CACvD,MAAMC,EAA4C,CAAA,EAElD,WAAI,gBAAgBD,CAAK,EAAE,QAAQ,CAACE,EAAOC,IAAQ,CACjD,MAAMC,EAAWH,EAAOE,CAAG,EACvB,MAAM,QAAQC,CAAQ,EACxBA,EAAS,KAAKF,CAAK,EACVE,IAAa,OACtBH,EAAOE,CAAG,EAAID,EAEdD,EAAOE,CAAG,EAAI,CAACC,EAAUF,CAAK,CAElC,CAAC,EAEMG,EAAAA,MAAMP,EAAQG,CAAM,CAC7B,EAEA,OAAOK,EAAAA,KACLC,EAAAA,MAAM,CAACC,EAAAA,OAAA,EAAUC,EAAAA,SAAS,eAAe,CAAC,CAAC,EAC3CC,EAAAA,MAAMV,GAAS,CACb,GAAI,CACF,OAAAD,EAAYC,CAAK,EACV,EACT,MAAQ,CACN,MAAO,EACT,CACF,EAAG,yCAA0C,EAC7CW,EAAAA,UAAUZ,CAAW,CAAA,CAEzB,CAKO,SAASa,EACdd,EACqC,CACrC,OAAOQ,EAAAA,KACLE,SAAA,EACAE,EAAAA,MAAMV,GAAS,CACb,GAAI,CACF,YAAK,MAAMA,CAAK,EACT,EACT,MAAQ,CACN,MAAO,EACT,CACF,EAAG,iCAAiC,EACpCW,EAAAA,UAAU,KAAK,KAAK,EACpBb,CAAA,CAEJ,CCvDO,SAASe,EACdf,EAC0B,CAC1B,OAAOQ,EAAAA,KAAKE,EAAAA,OAAA,EAAUI,EAAsBd,CAAM,CAAC,CACrD,CAEO,SAASgB,EACdhB,EAC2B,CAC3B,OAAOQ,EAAAA,KACLC,EAAAA,MAAM,CAACC,EAAAA,OAAA,EAAUC,EAAAA,SAAS,eAAe,CAAC,CAAC,EAC3CZ,EAAuBC,CAAM,CAAA,CAEjC,CC5CA,SAASiB,EAAaC,EAAY,CAChC,OAAQd,GAAgCc,EAAG,KAAKd,CAAK,CACvD,CAKO,MAAMe,EAAaF,EAAa,gBAAgB,EAK1CG,EAAcH,EAAa,gBAAgB,EAK3CI,EAAQJ,EAAa,gBAAgB,EAKrCK,EAASL,EAAa,gBAAgB,EAM5C,SAASM,EAASnB,EAA6B,CACpD,MAAO,CAACiB,EAAOC,EAAQH,EAAYC,CAAW,EAAE,KAAKI,GAAMA,EAAGpB,CAAK,CAAC,CACtE,CAMA,SAASqB,EAAUrB,EAAiB,CAClC,IAAIsB,EAAa,IACjB,QAASC,EAAI,EAAGA,EAAIvB,EAAM,OAAS,EAAGuB,GAAK,EACzCD,GAAStB,EAAM,EAAIuB,CAAC,EAAE,OAAO,CAAC,EAEhC,OAAOD,CACT,CAaO,SAASE,EAAYxB,EAAqC,CAC/D,MAAMyB,EAAQzB,EAAM,QAAQ,MAAO,EAAE,EAAE,YAAA,EACvC,GAAI,iBAAiB,KAAKyB,CAAK,EAC7B,OAAOC,EAAAA,OAAE,MAAML,EAAUI,EAAM,YAAA,EAAgB,GAAU,CAAC,EAG5D,GAAI,iBAAiB,KAAKA,CAAK,EAC7B,OAAOC,EAAAA,OAAE,MAAML,EAAUI,EAAM,YAAA,CAAoB,CAAC,EAGtD,GAAI,iBAAiB,KAAKA,CAAK,EAC7B,OAAOC,EAAAA,OAAE,MAAMD,EAAM,YAAA,EAAgB,IAAW,EAGlD,GAAI,iBAAiB,KAAKA,CAAK,EAC7B,OAAOC,SAAE,MAAMD,EAAM,YAAA,CAAoB,EAI3C,MAAME,EAAQF,EAAM,MAAM,wCAAwC,GAC7DA,EAAM,MAAM,mDAAmD,EAGpE,OAAKE,EAKED,EAAAA,OAAE,MACPC,EACG,MAAM,CAAC,EACP,OACC,CAACC,EAAKC,IACGD,EAAM,SAASC,EAAW,EAAE,EAChC,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,EACjB,GAAA,EAGJ,OAAO,EAAG,GAAG,CAAA,EAfTH,EAAAA,OAAE,KAAK,IAAI,MAAM,UAAU1B,CAAK,8CAA8C,CAAC,CAiB1F,CAcO,SAAS8B,EAAQ9B,EAAqC,CAC3D,OAAOoB,EAAAA,SAAG,KACRI,EAAYxB,CAAK,EACjB0B,EAAAA,OAAE,IAAIK,GAAOA,EAAI,MAAM,EAAG,CAAC,CAAQ,CAAA,CAEvC,CAMO,MAAMC,EAAQC,EAAAA,aAAaH,CAAO,EAK5BI,EAAYD,EAAAA,aAAaT,CAAW,ECnF1C,SAASW,GAAe,CAC7B,OAAOC,cAAY,CACjB,GAAIC,EAAAA,OAAA,EACJ,UAAWC,EAAAA,SAAShC,EAAAA,QAAQ,EAC5B,KAAMA,EAAAA,OAAA,EACN,MAAOA,EAAAA,OAAA,EACP,SAAUgC,EAAAA,SAAShC,SAAA,CAAQ,CAAA,CACyC,CACxE,CAEO,SAASiC,GAAe,CAC7B,OAAOH,cAAY,CACjB,yBAA0BE,EAAAA,SAASE,EAAAA,SAAS,EAC5C,mBAAoBF,EAAAA,SAASE,EAAAA,SAAS,EACtC,WAAYlC,EAAAA,OAAA,EACZ,GAAI+B,EAAAA,OAAA,EACJ,OAAQC,EAAAA,SAASE,EAAAA,SAAS,EAC1B,WAAYF,EAAAA,SAASE,EAAAA,SAAS,EAC9B,UAAWF,EAAAA,SAAShC,EAAAA,QAAQ,EAC5B,cAAegC,EAAAA,SAAShC,EAAAA,QAAQ,EAChC,UAAWgC,EAAAA,SAAShC,EAAAA,QAAQ,EAC5B,SAAUgC,EAAAA,SAAShC,SAAA,CAAQ,CAAA,CACyC,CACxE,CAEO,SAASmC,GAAe,CAC7B,OAAOL,cAAY,CACjB,YAAa9B,EAAAA,OAAA,EACb,IAAKA,EAAAA,OAAA,EACL,UAAWA,EAAAA,OAAA,EACX,UAAWA,EAAAA,OAAA,CAAO,CACkD,CACxE,CAEO,SAASoC,GAAW,CACzB,OAAON,cAAY,CACjB,UAAWhC,EAAAA,KACTE,SAAA,EACAG,EAAAA,aAAmB,IAAI,KAAK,OAAOX,CAAK,EAAI,GAAI,CAAC,EACjD6C,EAAAA,KAAA,CAAK,EAEP,eAAgBL,EAAAA,SAASlC,EAAAA,KAAKE,EAAAA,OAAA,EAAUG,EAAAA,UAAU,MAAM,EAAGmC,EAAAA,QAAA,CAAS,CAAC,EACrE,KAAMN,EAAAA,SAAS3B,EAAiBwB,EAAA,CAAc,CAAC,EAC/C,UAAWG,EAAAA,SAAShC,EAAAA,QAAQ,EAC5B,cAAegC,EAAAA,SAAShC,EAAAA,QAAQ,EAChC,KAAMgC,EAAAA,SAAShC,EAAAA,QAAQ,EACvB,SAAUgC,EAAAA,SAAShC,EAAAA,QAAQ,EAC3B,SAAUgC,EAAAA,SAAS3B,EAAiB4B,EAAA,CAAc,CAAC,EACnD,YAAaD,EAAAA,SAAShC,EAAAA,QAAQ,EAC9B,UAAWgC,EAAAA,SAAShC,EAAAA,QAAQ,EAC5B,KAAMgC,EAAAA,SAAS3B,EAAiB4B,EAAA,CAAc,CAAC,EAC/C,KAAMD,EAAAA,SAAS3B,EAAiB8B,GAAc,CAAC,CAAA,CACD,CAClD,CAEO,SAASI,GAAgB,CAC9B,OAAOjC,EAAkB8B,GAAU,CACrC,CAEO,SAASI,GAAc,CAC5B,OAAOC,EAAAA,OACLzC,SAAA,EACAF,EAAAA,KACEC,EAAAA,MAAM,CAACC,EAAAA,SAAU+B,EAAAA,OAAA,CAAQ,CAAC,EAC1B5B,EAAAA,UAAUT,GACD,OAAOA,GAAU,SACpB,KAAKA,EAAQ,UAAY,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,GACtDA,CACL,EACDQ,EAAAA,MAAMW,CAAQ,CAAA,CAChB,CAaJ,CAEO,SAAS6B,GAAe,CAC7B,MAAMC,EAAUX,EAAAA,SAASlC,EAAAA,KAAKE,SAAA,EAAUG,YAAUyC,GAAKA,IAAM,GAAG,CAAC,CAAC,EAElE,OAAOd,cAAY,CACjB,kBAAmBa,EACnB,aAAcX,EAAAA,SAASO,GAAe,EACtC,sBAAuBP,EAAAA,SAAS3B,EAAiBmC,EAAA,CAAa,CAAC,EAC/D,mBAAoBG,EACpB,iBAAkB3C,EAAAA,OAAA,EAClB,qBAAsB2C,EACtB,mBAAoBX,EAAAA,SAAShC,EAAAA,QAAQ,EACrC,oBAAqBK,EAAiBmC,GAAa,EACnD,gBAAiBR,EAAAA,SAAShC,SAAA,CAAQ,CAAA,CAC8C,CACpF,CAEO,SAAS6C,GAAoB,CAClC,OAAOvC,EAAkBoC,GAAc,CACzC,CAKO,SAASI,EAAoBpD,EAA0C,CAC5E,GAAI,CACF,OAAOqD,EAAAA,GAAGF,EAAA,EAAqBnD,CAAK,CACtC,MAAQ,CACN,MAAO,EACT,CACF,CAEO,SAASsD,GAAkB,CAChC,OAAOlB,cAAY,CACjB,UAAW9B,EAAAA,OAAA,EACX,UAAWgC,EAAAA,SAASiB,UAAA,CAAS,CAAA,CAC9B,CACH,CCxJO,SAASC,EAAqBxD,EAGnC,CACA,OAAO0B,EAAAA,OAAE,SACP,IAAMvB,EAAAA,MAAM0C,EAAA,EAAiB7C,CAAK,EAClCyD,GAAKA,CAAA,CAET,CAEO,SAASC,EAAyB1D,EAGvC,CACA,OAAO0B,EAAAA,OAAE,SACP,IAAMvB,EAAAA,MAAMgD,EAAA,EAAqBnD,CAAK,EACtCyD,GAAKA,CAAA,CAET,CAEO,MAAME,EAAqB1B,EAAAA,aAAauB,CAAoB,EACtDI,EAAyB3B,EAAAA,aAAayB,CAAwB,ECxB3E,SAASG,EACP7D,EACA8D,EACQ,CACR,OAAAA,MAAa,CAACC,EAAG/D,IAAU,KAAK,UAAUA,CAAK,GAExC,IAAI,gBACT,OACG,QAAQA,CAAK,EACb,OAA2B,CAAC4B,EAAK,CAAC3B,EAAKD,CAAK,KACvC,MAAM,QAAQA,CAAK,EACrB4B,EAAI,KAAK,GAAG5B,EAAM,IAAIkD,GAAK,CAACjD,EAAK,OAAOiD,CAAC,CAAC,CAAqB,CAAC,EAE5DlD,GAAU,MACZ4B,EAAI,KAAK,CACP3B,EACAD,aAAiB,MACZA,EAAM,QAAA,EAAY,IAAO,GAAG,SAAA,EAC7B,OAAOA,GAAU,UAAY,OAAOA,GAAU,SAC5C,OAAOA,CAAK,EACZ,OAAOA,GAAU,UACfA,EAAQ,IAAM,IACd8D,EAAS7D,EAAKD,CAAK,CAAA,CAC5B,EAGE4B,GACN,CAAA,CAAE,CAAA,EACP,SAAA,CACJ,CAMO,SAASoC,EAAuBhE,EAA6B,CAClE,OAAO6D,EAAiB7D,CAAK,CAC/B,CAMO,SAASiE,EAA2BjE,EAAiC,CAC1E,OAAO6D,EAAiB7D,EAAO,CAACkE,EAAGhB,IAC1BgB,IAAM,eAAiBF,EAAuBd,CAAQ,EAAI,KAAK,UAAUA,CAAC,CAClF,CACH"}
package/dist/index.js CHANGED
@@ -157,7 +157,7 @@ function k() {
157
157
  vbWebAppShowSettings: t,
158
158
  vbWebAppStartParam: n(e()),
159
159
  vbWebAppThemeParams: c(R()),
160
- vbWebAppVersion: e()
160
+ vbWebAppVersion: n(e())
161
161
  });
162
162
  }
163
163
  function Q() {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/transformers.ts","../src/pipes.ts","../src/rgb.ts","../src/structures.ts","../src/parsers.ts","../src/serializers.ts"],"sourcesContent":["import {\n type BaseIssue,\n type BaseSchema,\n check,\n type CheckAction,\n type InferOutput,\n instance,\n type InstanceSchema,\n parse,\n pipe,\n type SchemaWithPipe,\n string,\n type StringSchema,\n transform,\n type TransformAction,\n union,\n type UnionSchema,\n} from 'valibot';\n\ntype RequiredSchema = BaseSchema<any, any, BaseIssue<any>>;\n\nexport type TransformJsonToSchemaAction<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n StringSchema<any>,\n CheckAction<string, string>,\n TransformAction<string, unknown>,\n Schema,\n]>;\n\nexport type TransformQueryToSchemaAction<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n UnionSchema<[\n StringSchema<undefined>,\n InstanceSchema<typeof URLSearchParams, undefined>,\n ], undefined>,\n CheckAction<string | URLSearchParams, string>,\n TransformAction<string | URLSearchParams, InferOutput<Schema>>,\n]>;\n\nexport function transformQueryToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): TransformQueryToSchemaAction<Schema> {\n const transformer = (input: string | URLSearchParams) => {\n const result: Record<string, string | string[]> = {};\n\n new URLSearchParams(input).forEach((value, key) => {\n const accValue = result[key];\n if (Array.isArray(accValue)) {\n accValue.push(value);\n } else if (accValue === undefined) {\n result[key] = value;\n } else {\n result[key] = [accValue, value];\n }\n });\n\n return parse(schema, result);\n };\n\n return pipe(\n union([string(), instance(URLSearchParams)]),\n check(input => {\n try {\n transformer(input);\n return true;\n } catch {\n return false;\n }\n }, 'The value doesn\\'t match required schema'),\n transform(transformer),\n );\n}\n\n/**\n * @returns A transformer applying `JSON.parse` to the input.\n */\nexport function transformJsonToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): TransformJsonToSchemaAction<Schema> {\n return pipe(\n string(),\n check(input => {\n try {\n JSON.parse(input);\n return true;\n } catch {\n return false;\n }\n }, 'Input is not a valid JSON value'),\n transform(JSON.parse),\n schema,\n );\n}\n","import {\n type BaseIssue,\n type BaseSchema,\n instance,\n type InstanceSchema,\n pipe,\n type SchemaWithPipe,\n string,\n type StringSchema,\n union,\n type UnionSchema,\n} from 'valibot';\n\nimport {\n transformJsonToSchema,\n type TransformJsonToSchemaAction,\n transformQueryToSchema,\n type TransformQueryToSchemaAction,\n} from './transformers.js';\n\ntype RequiredSchema = BaseSchema<any, any, BaseIssue<any>>;\n\nexport type JsonToSchemaPipe<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n StringSchema<undefined>,\n TransformJsonToSchemaAction<Schema>,\n]>;\n\nexport type QueryToSchemaPipe<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n UnionSchema<[\n StringSchema<undefined>,\n InstanceSchema<typeof URLSearchParams, undefined>,\n ], undefined>,\n TransformQueryToSchemaAction<Schema>,\n]>;\n\nexport function pipeJsonToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): JsonToSchemaPipe<Schema> {\n return pipe(string(), transformJsonToSchema(schema));\n}\n\nexport function pipeQueryToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): QueryToSchemaPipe<Schema> {\n return pipe(\n union([string(), instance(URLSearchParams)]),\n transformQueryToSchema(schema),\n );\n}\n","import { throwifyFpFn } from '@vbotma/toolkit';\nimport type { RGB } from '@vbotma/types';\nimport { either as E, function as fn } from 'fp-ts';\n\nfunction guardBasedOn(re: RegExp) {\n return (value: string): value is RGB => re.test(value);\n}\n\n/**\n * @returns True if the value has the #RGB format.\n */\nexport const isRGBShort = guardBasedOn(/^#[\\da-f]{3}$/i);\n\n/**\n * @returns True if the value has the #RGBA format.\n */\nexport const isRGBAShort = guardBasedOn(/^#[\\da-f]{4}$/i);\n\n/**\n * @returns True if the value has the #RRGGBB format.\n */\nexport const isRGB = guardBasedOn(/^#[\\da-f]{6}$/i);\n\n/**\n * @returns True if the value has the #RRGGBBAA format.\n */\nexport const isRGBA = guardBasedOn(/^#[\\da-f]{8}$/i);\n\n/**\n * @returns True if the value has any known RGB format.\n * @param value - value to check.\n */\nexport function isAnyRGB(value: string): value is RGB {\n return [isRGB, isRGBA, isRGBShort, isRGBAShort].some(fn => fn(value));\n}\n\n/**\n * Converts a short version of RGB (#RGB) to a complete one (#RRGGBB).\n * @param value\n */\nfunction expandRgb(value: RGB): RGB {\n let color: RGB = '#';\n for (let i = 0; i < value.length - 1; i += 1) {\n color += value[1 + i].repeat(2);\n }\n return color;\n}\n\n/**\n * Converts passed value to #RRGGBBAA format. Accepts the following color formats:\n * - `#RGB`\n * - `#RGBA`\n * - `#RRGGBB`\n * - `#RRGGBBAA`\n * - `rgb(1,2,3)`\n * - `rgba(1,2,3,4)`\n * @param value - a value to convert.\n * @returns A value in the #RRGGBBAA format.\n */\nexport function toRGBFullFp(value: string): E.Either<Error, RGB> {\n const clean = value.replace(/\\s/g, '').toLowerCase();\n if (/^#[\\da-f]{3}$/i.test(clean)) {\n return E.right(expandRgb(clean.toLowerCase() + 'f' as RGB));\n }\n\n if (/^#[\\da-f]{4}$/i.test(clean)) {\n return E.right(expandRgb(clean.toLowerCase() as RGB));\n }\n\n if (/^#[\\da-f]{6}$/i.test(clean)) {\n return E.right(clean.toLowerCase() + 'ff' as RGB);\n }\n\n if (/^#[\\da-f]{8}$/i.test(clean)) {\n return E.right(clean.toLowerCase() as RGB);\n }\n\n // Example valid values: rgb(0,3,10) rgba(32,114,8,0)\n const match = clean.match(/^rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$/)\n || clean.match(/^rgba\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$/);\n\n // If this didn't work as well, we can't extract RGB color from passed text.\n if (!match) {\n return E.left(new Error(`Value \"${value}\" does not satisfy any of known RGB formats.`));\n }\n\n // Otherwise, take R, G and B components, convert to hex and create #RRGGBB string.\n return E.right(\n match\n .slice(1)\n .reduce(\n (acc, component) => {\n return acc + parseInt(component, 10)\n .toString(16)\n .padStart(2, '0');\n }, '#',\n )\n // We are adding f-s here to match the pattern: #RRGGBBAA\n .padEnd(9, 'f') as RGB,\n );\n}\n\n/**\n * Converts passed value to #RRGGBB format. Accepts the following color formats:\n * - `#RGB`\n * - `#RGBA`\n * - `#RRGGBB`\n * - `#RRGGBBAA`\n * - `rgb(1,2,3)`\n * - `rgba(1,2,3,4)`\n * @param value - a value to convert.\n * @returns A value in the #RRGGBB format.\n * @deprecated This function cuts the RGB's alpha channel. Use the `toRGBFullFp` function instead.\n */\nexport function toRGBFp(value: string): E.Either<Error, RGB> {\n return fn.pipe(\n toRGBFullFp(value),\n E.map(rgb => rgb.slice(0, 7) as RGB),\n );\n}\n\n/**\n * @see toRGBFp\n * @deprecated This function cuts the RGB's alpha channel. Use the `toRGBFull` function instead.\n */\nexport const toRGB = throwifyFpFn(toRGBFp);\n\n/**\n * @see toRGBFullFp\n */\nexport const toRGBFull = throwifyFpFn(toRGBFullFp);\n","import type {\n Chat,\n InitData,\n KnownThemeParamsKey,\n LaunchParams,\n RGB,\n User,\n Auth\n} from '@vbotma/types';\nimport {\n type BaseSchema,\n boolean,\n check,\n type CheckAction,\n date,\n type InferOutput,\n integer,\n is,\n looseObject,\n number,\n type NumberSchema,\n optional,\n pipe,\n record,\n type RecordSchema,\n type SchemaWithPipe,\n string,\n type StringSchema,\n transform,\n type TransformAction,\n union,\n type UnionSchema,\n unknown,\n} from 'valibot';\n\nimport { pipeJsonToSchema, pipeQueryToSchema } from './pipes.js';\nimport { isAnyRGB } from './rgb.js';\n\nexport type InitDataGenSchema = ReturnType<typeof initData>;\nexport type InitDataGenType = InferOutput<InitDataGenSchema>;\n\nexport type LaunchParamsGenSchema = ReturnType<typeof launchParams>;\nexport type LaunchParamsGenType = InferOutput<LaunchParamsGenSchema>;\n\nexport type MiniAppsMessageGenSchema = ReturnType<typeof miniAppsMessage>;\nexport type MiniAppsMessageGenType = InferOutput<MiniAppsMessageGenSchema>;\n\nexport function initDataChat() {\n return looseObject({\n id: number(),\n photo_url: optional(string()),\n type: string(),\n title: string(),\n username: optional(string()),\n } satisfies { [K in keyof Chat]-?: BaseSchema<unknown, Chat[K], any> });\n}\n\nexport function initDataUser() {\n return looseObject({\n added_to_attachment_menu: optional(boolean()),\n allows_write_to_pm: optional(boolean()),\n first_name: string(),\n id: number(),\n is_bot: optional(boolean()),\n is_premium: optional(boolean()),\n last_name: optional(string()),\n language_code: optional(string()),\n photo_url: optional(string()),\n username: optional(string()),\n } satisfies { [K in keyof User]-?: BaseSchema<unknown, User[K], any> });\n}\n\nexport function initDataAuth() {\n return looseObject({\n projectCode: string(),\n uid: string(),\n sessionId: string(),\n rootToken: string(),\n } satisfies { [K in keyof Auth]-?: BaseSchema<unknown, Auth[K], any> });\n}\n\nexport function initData() {\n return looseObject({\n auth_date: pipe(\n string(),\n transform(input => new Date(Number(input) * 1000)),\n date(),\n ),\n can_send_after: optional(pipe(string(), transform(Number), integer())),\n chat: optional(pipeJsonToSchema(initDataChat())),\n chat_type: optional(string()),\n chat_instance: optional(string()),\n hash: optional(string()),\n query_id: optional(string()),\n receiver: optional(pipeJsonToSchema(initDataUser())),\n start_param: optional(string()),\n signature: optional(string()),\n user: optional(pipeJsonToSchema(initDataUser())),\n auth: optional(pipeJsonToSchema(initDataAuth())),\n } satisfies { [K in keyof InitData]-?: unknown });\n}\n\nexport function initDataQuery() {\n return pipeQueryToSchema(initData());\n}\n\nexport function themeParams() {\n return record(\n string(),\n pipe(\n union([string(), number()]),\n transform(value => {\n return typeof value === 'number'\n ? `#${(value & 0x00FFFFFF).toString(16).padStart(6, '0')}`\n : value;\n }),\n check(isAnyRGB),\n ),\n ) as RecordSchema<\n SchemaWithPipe<[\n StringSchema<undefined>,\n TransformAction<string, KnownThemeParamsKey>,\n ]>,\n SchemaWithPipe<[\n UnionSchema<[StringSchema<undefined>, NumberSchema<undefined>], any>,\n TransformAction<string | number, string>,\n CheckAction<RGB, undefined>,\n ]>,\n undefined\n >;\n}\n\nexport function launchParams() {\n const optBool = optional(pipe(string(), transform(v => v === '1')));\n\n return looseObject({\n vbWebAppBotInline: optBool,\n vbWebAppData: optional(initDataQuery()),\n vbWebAppDefaultColors: optional(pipeJsonToSchema(themeParams())),\n vbWebAppFullscreen: optBool,\n vbWebAppPlatform: string(),\n vbWebAppShowSettings: optBool,\n vbWebAppStartParam: optional(string()),\n vbWebAppThemeParams: pipeJsonToSchema(themeParams()),\n vbWebAppVersion: string(),\n } satisfies { [K in keyof LaunchParams]-?: BaseSchema<any, LaunchParams[K], any> });\n}\n\nexport function launchParamsQuery() {\n return pipeQueryToSchema(launchParams());\n}\n\n/**\n * @returns True if the passed value contains valid launch parameters query.\n */\nexport function isLaunchParamsQuery(value: string | URLSearchParams): boolean {\n try {\n return is(launchParamsQuery(), value);\n } catch {\n return false;\n }\n}\n\nexport function miniAppsMessage() {\n return looseObject({\n eventType: string(),\n eventData: optional(unknown()),\n });\n}\n","import { throwifyFpFn } from '@vbotma/toolkit';\nimport { either as E } from 'fp-ts';\nimport { parse, type ValiError } from 'valibot';\n\nimport {\n type InitDataGenSchema,\n type InitDataGenType,\n initDataQuery,\n type LaunchParamsGenSchema,\n type LaunchParamsGenType,\n launchParamsQuery,\n} from './structures.js';\n\nexport type ParseInitDataQueryError = ValiError<InitDataGenSchema>;\nexport type ParseLaunchParamsQueryError = ValiError<LaunchParamsGenSchema>;\n\nexport function parseInitDataQueryFp(value: string | URLSearchParams): E.Either<\n ParseInitDataQueryError,\n InitDataGenType\n> {\n return E.tryCatch(\n () => parse(initDataQuery(), value),\n e => e as ValiError<InitDataGenSchema>,\n );\n}\n\nexport function parseLaunchParamsQueryFp(value: string | URLSearchParams): E.Either<\n ParseLaunchParamsQueryError,\n LaunchParamsGenType\n> {\n return E.tryCatch(\n () => parse(launchParamsQuery(), value),\n e => e as ValiError<LaunchParamsGenSchema>,\n );\n}\n\nexport const parseInitDataQuery = throwifyFpFn(parseInitDataQueryFp);\nexport const parseLaunchParamsQuery = throwifyFpFn(parseLaunchParamsQueryFp);\n","import type { InitData, LaunchParams } from '@vbotma/types';\nimport type { InferOutput } from 'valibot';\n\nimport type { initData, launchParams } from './structures.js';\n\nexport type InitDataLike = Partial<InferOutput<ReturnType<typeof initData>> | InitData>;\nexport type LaunchParamsLike = Partial<InferOutput<ReturnType<typeof launchParams>> | LaunchParams>;\n\n/**\n * Converts the passed object to query parameters.\n * @param value - value to serialize.\n * @param onObject - function returning serialized object value.\n */\nfunction serializeToQuery(\n value: object,\n onObject?: (key: string, value: object) => string,\n): string {\n onObject ||= (_, value) => JSON.stringify(value);\n\n return new URLSearchParams(\n Object\n .entries(value)\n .reduce<[string, string][]>((acc, [key, value]) => {\n if (Array.isArray(value)) {\n acc.push(...value.map(v => [key, String(v)] as [string, string]));\n } else {\n if (value !== null && value !== undefined) {\n acc.push([\n key,\n value instanceof Date\n ? (value.getTime() / 1000 | 0).toString()\n : typeof value === 'string' || typeof value === 'number'\n ? String(value)\n : typeof value === 'boolean'\n ? value ? '1' : '0'\n : onObject(key, value),\n ]);\n }\n }\n return acc;\n }, []),\n ).toString();\n}\n\n/**\n * Serializes the InitDataQuery shape.\n * @param value - value to serialize.\n */\nexport function serializeInitDataQuery(value: InitDataLike): string {\n return serializeToQuery(value);\n}\n\n/**\n * Serializes the LaunchParamsQuery shape.\n * @param value - value to serialize.\n */\nexport function serializeLaunchParamsQuery(value: LaunchParamsLike): string {\n return serializeToQuery(value, (k, v) => {\n return k === 'vbWebAppData' ? serializeInitDataQuery(v as any) : JSON.stringify(v);\n });\n}\n"],"names":["transformQueryToSchema","schema","transformer","input","result","value","key","accValue","parse","pipe","union","string","instance","check","transform","transformJsonToSchema","pipeJsonToSchema","pipeQueryToSchema","guardBasedOn","re","isRGBShort","isRGBAShort","isRGB","isRGBA","isAnyRGB","fn","expandRgb","color","i","toRGBFullFp","clean","E","match","acc","component","toRGBFp","rgb","toRGB","throwifyFpFn","toRGBFull","initDataChat","looseObject","number","optional","initDataUser","boolean","initDataAuth","initData","date","integer","initDataQuery","themeParams","record","launchParams","optBool","v","launchParamsQuery","isLaunchParamsQuery","is","miniAppsMessage","unknown","parseInitDataQueryFp","e","parseLaunchParamsQueryFp","parseInitDataQuery","parseLaunchParamsQuery","serializeToQuery","onObject","_","serializeInitDataQuery","serializeLaunchParamsQuery","k"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/transformers.ts","../src/pipes.ts","../src/rgb.ts","../src/structures.ts","../src/parsers.ts","../src/serializers.ts"],"sourcesContent":["import {\n type BaseIssue,\n type BaseSchema,\n check,\n type CheckAction,\n type InferOutput,\n instance,\n type InstanceSchema,\n parse,\n pipe,\n type SchemaWithPipe,\n string,\n type StringSchema,\n transform,\n type TransformAction,\n union,\n type UnionSchema,\n} from 'valibot';\n\ntype RequiredSchema = BaseSchema<any, any, BaseIssue<any>>;\n\nexport type TransformJsonToSchemaAction<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n StringSchema<any>,\n CheckAction<string, string>,\n TransformAction<string, unknown>,\n Schema,\n]>;\n\nexport type TransformQueryToSchemaAction<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n UnionSchema<[\n StringSchema<undefined>,\n InstanceSchema<typeof URLSearchParams, undefined>,\n ], undefined>,\n CheckAction<string | URLSearchParams, string>,\n TransformAction<string | URLSearchParams, InferOutput<Schema>>,\n]>;\n\nexport function transformQueryToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): TransformQueryToSchemaAction<Schema> {\n const transformer = (input: string | URLSearchParams) => {\n const result: Record<string, string | string[]> = {};\n\n new URLSearchParams(input).forEach((value, key) => {\n const accValue = result[key];\n if (Array.isArray(accValue)) {\n accValue.push(value);\n } else if (accValue === undefined) {\n result[key] = value;\n } else {\n result[key] = [accValue, value];\n }\n });\n\n return parse(schema, result);\n };\n\n return pipe(\n union([string(), instance(URLSearchParams)]),\n check(input => {\n try {\n transformer(input);\n return true;\n } catch {\n return false;\n }\n }, 'The value doesn\\'t match required schema'),\n transform(transformer),\n );\n}\n\n/**\n * @returns A transformer applying `JSON.parse` to the input.\n */\nexport function transformJsonToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): TransformJsonToSchemaAction<Schema> {\n return pipe(\n string(),\n check(input => {\n try {\n JSON.parse(input);\n return true;\n } catch {\n return false;\n }\n }, 'Input is not a valid JSON value'),\n transform(JSON.parse),\n schema,\n );\n}\n","import {\n type BaseIssue,\n type BaseSchema,\n instance,\n type InstanceSchema,\n pipe,\n type SchemaWithPipe,\n string,\n type StringSchema,\n union,\n type UnionSchema,\n} from 'valibot';\n\nimport {\n transformJsonToSchema,\n type TransformJsonToSchemaAction,\n transformQueryToSchema,\n type TransformQueryToSchemaAction,\n} from './transformers.js';\n\ntype RequiredSchema = BaseSchema<any, any, BaseIssue<any>>;\n\nexport type JsonToSchemaPipe<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n StringSchema<undefined>,\n TransformJsonToSchemaAction<Schema>,\n]>;\n\nexport type QueryToSchemaPipe<Schema extends RequiredSchema> = SchemaWithPipe<readonly [\n UnionSchema<[\n StringSchema<undefined>,\n InstanceSchema<typeof URLSearchParams, undefined>,\n ], undefined>,\n TransformQueryToSchemaAction<Schema>,\n]>;\n\nexport function pipeJsonToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): JsonToSchemaPipe<Schema> {\n return pipe(string(), transformJsonToSchema(schema));\n}\n\nexport function pipeQueryToSchema<Schema extends RequiredSchema>(\n schema: Schema,\n): QueryToSchemaPipe<Schema> {\n return pipe(\n union([string(), instance(URLSearchParams)]),\n transformQueryToSchema(schema),\n );\n}\n","import { throwifyFpFn } from '@vbotma/toolkit';\nimport type { RGB } from '@vbotma/types';\nimport { either as E, function as fn } from 'fp-ts';\n\nfunction guardBasedOn(re: RegExp) {\n return (value: string): value is RGB => re.test(value);\n}\n\n/**\n * @returns True if the value has the #RGB format.\n */\nexport const isRGBShort = guardBasedOn(/^#[\\da-f]{3}$/i);\n\n/**\n * @returns True if the value has the #RGBA format.\n */\nexport const isRGBAShort = guardBasedOn(/^#[\\da-f]{4}$/i);\n\n/**\n * @returns True if the value has the #RRGGBB format.\n */\nexport const isRGB = guardBasedOn(/^#[\\da-f]{6}$/i);\n\n/**\n * @returns True if the value has the #RRGGBBAA format.\n */\nexport const isRGBA = guardBasedOn(/^#[\\da-f]{8}$/i);\n\n/**\n * @returns True if the value has any known RGB format.\n * @param value - value to check.\n */\nexport function isAnyRGB(value: string): value is RGB {\n return [isRGB, isRGBA, isRGBShort, isRGBAShort].some(fn => fn(value));\n}\n\n/**\n * Converts a short version of RGB (#RGB) to a complete one (#RRGGBB).\n * @param value\n */\nfunction expandRgb(value: RGB): RGB {\n let color: RGB = '#';\n for (let i = 0; i < value.length - 1; i += 1) {\n color += value[1 + i].repeat(2);\n }\n return color;\n}\n\n/**\n * Converts passed value to #RRGGBBAA format. Accepts the following color formats:\n * - `#RGB`\n * - `#RGBA`\n * - `#RRGGBB`\n * - `#RRGGBBAA`\n * - `rgb(1,2,3)`\n * - `rgba(1,2,3,4)`\n * @param value - a value to convert.\n * @returns A value in the #RRGGBBAA format.\n */\nexport function toRGBFullFp(value: string): E.Either<Error, RGB> {\n const clean = value.replace(/\\s/g, '').toLowerCase();\n if (/^#[\\da-f]{3}$/i.test(clean)) {\n return E.right(expandRgb(clean.toLowerCase() + 'f' as RGB));\n }\n\n if (/^#[\\da-f]{4}$/i.test(clean)) {\n return E.right(expandRgb(clean.toLowerCase() as RGB));\n }\n\n if (/^#[\\da-f]{6}$/i.test(clean)) {\n return E.right(clean.toLowerCase() + 'ff' as RGB);\n }\n\n if (/^#[\\da-f]{8}$/i.test(clean)) {\n return E.right(clean.toLowerCase() as RGB);\n }\n\n // Example valid values: rgb(0,3,10) rgba(32,114,8,0)\n const match = clean.match(/^rgb\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$/)\n || clean.match(/^rgba\\((\\d{1,3}),(\\d{1,3}),(\\d{1,3}),(\\d{1,3})\\)$/);\n\n // If this didn't work as well, we can't extract RGB color from passed text.\n if (!match) {\n return E.left(new Error(`Value \"${value}\" does not satisfy any of known RGB formats.`));\n }\n\n // Otherwise, take R, G and B components, convert to hex and create #RRGGBB string.\n return E.right(\n match\n .slice(1)\n .reduce(\n (acc, component) => {\n return acc + parseInt(component, 10)\n .toString(16)\n .padStart(2, '0');\n }, '#',\n )\n // We are adding f-s here to match the pattern: #RRGGBBAA\n .padEnd(9, 'f') as RGB,\n );\n}\n\n/**\n * Converts passed value to #RRGGBB format. Accepts the following color formats:\n * - `#RGB`\n * - `#RGBA`\n * - `#RRGGBB`\n * - `#RRGGBBAA`\n * - `rgb(1,2,3)`\n * - `rgba(1,2,3,4)`\n * @param value - a value to convert.\n * @returns A value in the #RRGGBB format.\n * @deprecated This function cuts the RGB's alpha channel. Use the `toRGBFullFp` function instead.\n */\nexport function toRGBFp(value: string): E.Either<Error, RGB> {\n return fn.pipe(\n toRGBFullFp(value),\n E.map(rgb => rgb.slice(0, 7) as RGB),\n );\n}\n\n/**\n * @see toRGBFp\n * @deprecated This function cuts the RGB's alpha channel. Use the `toRGBFull` function instead.\n */\nexport const toRGB = throwifyFpFn(toRGBFp);\n\n/**\n * @see toRGBFullFp\n */\nexport const toRGBFull = throwifyFpFn(toRGBFullFp);\n","import type {\n Chat,\n InitData,\n KnownThemeParamsKey,\n LaunchParams,\n RGB,\n User,\n Auth\n} from '@vbotma/types';\nimport {\n type BaseSchema,\n boolean,\n check,\n type CheckAction,\n date,\n type InferOutput,\n integer,\n is,\n looseObject,\n number,\n type NumberSchema,\n optional,\n pipe,\n record,\n type RecordSchema,\n type SchemaWithPipe,\n string,\n type StringSchema,\n transform,\n type TransformAction,\n union,\n type UnionSchema,\n unknown,\n} from 'valibot';\n\nimport { pipeJsonToSchema, pipeQueryToSchema } from './pipes.js';\nimport { isAnyRGB } from './rgb.js';\n\nexport type InitDataGenSchema = ReturnType<typeof initData>;\nexport type InitDataGenType = InferOutput<InitDataGenSchema>;\n\nexport type LaunchParamsGenSchema = ReturnType<typeof launchParams>;\nexport type LaunchParamsGenType = InferOutput<LaunchParamsGenSchema>;\n\nexport type MiniAppsMessageGenSchema = ReturnType<typeof miniAppsMessage>;\nexport type MiniAppsMessageGenType = InferOutput<MiniAppsMessageGenSchema>;\n\nexport function initDataChat() {\n return looseObject({\n id: number(),\n photo_url: optional(string()),\n type: string(),\n title: string(),\n username: optional(string()),\n } satisfies { [K in keyof Chat]-?: BaseSchema<unknown, Chat[K], any> });\n}\n\nexport function initDataUser() {\n return looseObject({\n added_to_attachment_menu: optional(boolean()),\n allows_write_to_pm: optional(boolean()),\n first_name: string(),\n id: number(),\n is_bot: optional(boolean()),\n is_premium: optional(boolean()),\n last_name: optional(string()),\n language_code: optional(string()),\n photo_url: optional(string()),\n username: optional(string()),\n } satisfies { [K in keyof User]-?: BaseSchema<unknown, User[K], any> });\n}\n\nexport function initDataAuth() {\n return looseObject({\n projectCode: string(),\n uid: string(),\n sessionId: string(),\n rootToken: string(),\n } satisfies { [K in keyof Auth]-?: BaseSchema<unknown, Auth[K], any> });\n}\n\nexport function initData() {\n return looseObject({\n auth_date: pipe(\n string(),\n transform(input => new Date(Number(input) * 1000)),\n date(),\n ),\n can_send_after: optional(pipe(string(), transform(Number), integer())),\n chat: optional(pipeJsonToSchema(initDataChat())),\n chat_type: optional(string()),\n chat_instance: optional(string()),\n hash: optional(string()),\n query_id: optional(string()),\n receiver: optional(pipeJsonToSchema(initDataUser())),\n start_param: optional(string()),\n signature: optional(string()),\n user: optional(pipeJsonToSchema(initDataUser())),\n auth: optional(pipeJsonToSchema(initDataAuth())),\n } satisfies { [K in keyof InitData]-?: unknown });\n}\n\nexport function initDataQuery() {\n return pipeQueryToSchema(initData());\n}\n\nexport function themeParams() {\n return record(\n string(),\n pipe(\n union([string(), number()]),\n transform(value => {\n return typeof value === 'number'\n ? `#${(value & 0x00FFFFFF).toString(16).padStart(6, '0')}`\n : value;\n }),\n check(isAnyRGB),\n ),\n ) as RecordSchema<\n SchemaWithPipe<[\n StringSchema<undefined>,\n TransformAction<string, KnownThemeParamsKey>,\n ]>,\n SchemaWithPipe<[\n UnionSchema<[StringSchema<undefined>, NumberSchema<undefined>], any>,\n TransformAction<string | number, string>,\n CheckAction<RGB, undefined>,\n ]>,\n undefined\n >;\n}\n\nexport function launchParams() {\n const optBool = optional(pipe(string(), transform(v => v === '1')));\n\n return looseObject({\n vbWebAppBotInline: optBool,\n vbWebAppData: optional(initDataQuery()),\n vbWebAppDefaultColors: optional(pipeJsonToSchema(themeParams())),\n vbWebAppFullscreen: optBool,\n vbWebAppPlatform: string(),\n vbWebAppShowSettings: optBool,\n vbWebAppStartParam: optional(string()),\n vbWebAppThemeParams: pipeJsonToSchema(themeParams()),\n vbWebAppVersion: optional(string()),\n } satisfies { [K in keyof LaunchParams]-?: BaseSchema<any, LaunchParams[K], any> });\n}\n\nexport function launchParamsQuery() {\n return pipeQueryToSchema(launchParams());\n}\n\n/**\n * @returns True if the passed value contains valid launch parameters query.\n */\nexport function isLaunchParamsQuery(value: string | URLSearchParams): boolean {\n try {\n return is(launchParamsQuery(), value);\n } catch {\n return false;\n }\n}\n\nexport function miniAppsMessage() {\n return looseObject({\n eventType: string(),\n eventData: optional(unknown()),\n });\n}\n","import { throwifyFpFn } from '@vbotma/toolkit';\nimport { either as E } from 'fp-ts';\nimport { parse, type ValiError } from 'valibot';\n\nimport {\n type InitDataGenSchema,\n type InitDataGenType,\n initDataQuery,\n type LaunchParamsGenSchema,\n type LaunchParamsGenType,\n launchParamsQuery,\n} from './structures.js';\n\nexport type ParseInitDataQueryError = ValiError<InitDataGenSchema>;\nexport type ParseLaunchParamsQueryError = ValiError<LaunchParamsGenSchema>;\n\nexport function parseInitDataQueryFp(value: string | URLSearchParams): E.Either<\n ParseInitDataQueryError,\n InitDataGenType\n> {\n return E.tryCatch(\n () => parse(initDataQuery(), value),\n e => e as ValiError<InitDataGenSchema>,\n );\n}\n\nexport function parseLaunchParamsQueryFp(value: string | URLSearchParams): E.Either<\n ParseLaunchParamsQueryError,\n LaunchParamsGenType\n> {\n return E.tryCatch(\n () => parse(launchParamsQuery(), value),\n e => e as ValiError<LaunchParamsGenSchema>,\n );\n}\n\nexport const parseInitDataQuery = throwifyFpFn(parseInitDataQueryFp);\nexport const parseLaunchParamsQuery = throwifyFpFn(parseLaunchParamsQueryFp);\n","import type { InitData, LaunchParams } from '@vbotma/types';\nimport type { InferOutput } from 'valibot';\n\nimport type { initData, launchParams } from './structures.js';\n\nexport type InitDataLike = Partial<InferOutput<ReturnType<typeof initData>> | InitData>;\nexport type LaunchParamsLike = Partial<InferOutput<ReturnType<typeof launchParams>> | LaunchParams>;\n\n/**\n * Converts the passed object to query parameters.\n * @param value - value to serialize.\n * @param onObject - function returning serialized object value.\n */\nfunction serializeToQuery(\n value: object,\n onObject?: (key: string, value: object) => string,\n): string {\n onObject ||= (_, value) => JSON.stringify(value);\n\n return new URLSearchParams(\n Object\n .entries(value)\n .reduce<[string, string][]>((acc, [key, value]) => {\n if (Array.isArray(value)) {\n acc.push(...value.map(v => [key, String(v)] as [string, string]));\n } else {\n if (value !== null && value !== undefined) {\n acc.push([\n key,\n value instanceof Date\n ? (value.getTime() / 1000 | 0).toString()\n : typeof value === 'string' || typeof value === 'number'\n ? String(value)\n : typeof value === 'boolean'\n ? value ? '1' : '0'\n : onObject(key, value),\n ]);\n }\n }\n return acc;\n }, []),\n ).toString();\n}\n\n/**\n * Serializes the InitDataQuery shape.\n * @param value - value to serialize.\n */\nexport function serializeInitDataQuery(value: InitDataLike): string {\n return serializeToQuery(value);\n}\n\n/**\n * Serializes the LaunchParamsQuery shape.\n * @param value - value to serialize.\n */\nexport function serializeLaunchParamsQuery(value: LaunchParamsLike): string {\n return serializeToQuery(value, (k, v) => {\n return k === 'vbWebAppData' ? serializeInitDataQuery(v as any) : JSON.stringify(v);\n });\n}\n"],"names":["transformQueryToSchema","schema","transformer","input","result","value","key","accValue","parse","pipe","union","string","instance","check","transform","transformJsonToSchema","pipeJsonToSchema","pipeQueryToSchema","guardBasedOn","re","isRGBShort","isRGBAShort","isRGB","isRGBA","isAnyRGB","fn","expandRgb","color","i","toRGBFullFp","clean","E","match","acc","component","toRGBFp","rgb","toRGB","throwifyFpFn","toRGBFull","initDataChat","looseObject","number","optional","initDataUser","boolean","initDataAuth","initData","date","integer","initDataQuery","themeParams","record","launchParams","optBool","v","launchParamsQuery","isLaunchParamsQuery","is","miniAppsMessage","unknown","parseInitDataQueryFp","e","parseLaunchParamsQueryFp","parseInitDataQuery","parseLaunchParamsQuery","serializeToQuery","onObject","_","serializeInitDataQuery","serializeLaunchParamsQuery","k"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vbotma/transformers",
3
- "version": "1.1.5",
3
+ "version": "2.0.0",
4
4
  "description": "Transformation utilities we use in the @vbot packages.",
5
5
  "keywords": [
6
6
  "vbot-mini-apps",
@@ -26,12 +26,12 @@
26
26
  "dependencies": {
27
27
  "fp-ts": "^2.16.11",
28
28
  "valibot": "^1.1.0",
29
- "@vbotma/toolkit": "^1.0.6",
30
- "@vbotma/types": "^1.0.6"
29
+ "@vbotma/toolkit": "^2.0.0",
30
+ "@vbotma/types": "^2.0.0"
31
31
  },
32
32
  "devDependencies": {
33
- "test-utils": "0.0.3",
34
- "tsconfig": "0.0.4"
33
+ "tsconfig": "1.0.0",
34
+ "test-utils": "1.0.0"
35
35
  },
36
36
  "publishConfig": {
37
37
  "access": "public"