@tma.js/init-data 0.2.18 → 0.2.19

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.
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Returns parser used to parse chat data.
3
+ */
4
+ export declare function chat(): import("@tma.js/parsing").ValueParser<{
5
+ id: number;
6
+ type: string;
7
+ title: string;
8
+ photoUrl: import("@tma.js/parsing").ParseResult<string, true>;
9
+ username: import("@tma.js/parsing").ParseResult<string, true>;
10
+ }, false>;
@@ -1,2 +1,6 @@
1
- export * from './parsing.js';
1
+ export * from './chat.js';
2
+ export * from './initData.js';
3
+ export * from './parse.js';
4
+ export * from './serialize.js';
2
5
  export * from './types.js';
6
+ export * from './user.js';
@@ -0,0 +1,5 @@
1
+ import type { InitData } from './types.js';
2
+ /**
3
+ * Returns parser used to parse init data, presented as search params.
4
+ */
5
+ export declare function initData(): import("@tma.js/parsing").ValueParser<InitData, false>;
@@ -0,0 +1,6 @@
1
+ import type { InitData } from './types.js';
2
+ /**
3
+ * Parses incoming value as init data.
4
+ * @param value - value to parse.
5
+ */
6
+ export declare function parse(value: unknown): InitData;
@@ -0,0 +1,6 @@
1
+ import type { InitData } from './types.js';
2
+ /**
3
+ * Converts init data to its initial representation.
4
+ * @param value - init data.
5
+ */
6
+ export declare function serialize(value: InitData): string;
@@ -0,0 +1,5 @@
1
+ import type { User } from './types.js';
2
+ /**
3
+ * Returns parser used to parse user data.
4
+ */
5
+ export declare function user(): import("@tma.js/parsing").ValueParser<User, false>;
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@tma.js/parsing");function t(o,c){return{from:c,type:o}}const n=e.string(),a=e.string().optional(),s=e.number(),l=e.number().optional(),r=e.boolean().optional();function i(){return e.json({firstName:t(n,"first_name"),id:s,isBot:t(r,"is_bot"),isPremium:t(r,"is_premium"),lastName:t(a,"last_name"),languageCode:t(a,"language_code"),photoUrl:t(a,"photo_url"),username:a})}function p(){return e.json({id:s,type:n,title:n,photoUrl:t(a,"photo_url"),username:a})}const u=e.searchParams({authDate:t(e.date(),"auth_date"),hash:n,user:i().optional(),receiver:i().optional(),chat:p().optional(),chatType:t(a,"chat_type"),chatInstance:t(a,"chat_instance"),canSendAfter:t(l,"can_send_after"),queryId:t(a,"query_id"),startParam:t(a,"start_param")});function m(o){return u.parse(o)}exports.initData=u;exports.parse=m;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("@tma.js/parsing");function g(){return t.json({id:t.number(),type:t.string(),title:t.string(),photoUrl:{type:t.string().optional(),from:"photo_url"},username:t.string().optional()})}function f(){return t.json({firstName:{type:t.string(),from:"first_name"},id:t.number(),isBot:{type:t.boolean().optional(),from:"is_bot"},isPremium:{type:t.boolean().optional(),from:"is_premium"},lastName:{type:t.string().optional(),from:"last_name"},languageCode:{type:t.string().optional(),from:"language_code"},photoUrl:{type:t.string().optional(),from:"photo_url"},username:t.string().optional()})}function _(){return t.searchParams({authDate:{type:t.date(),from:"auth_date"},canSendAfter:{type:t.number().optional(),from:"can_send_after"},chat:g().optional(),chatInstance:{type:t.string().optional(),from:"chat_instance"},chatType:{type:t.string().optional(),from:"chat_type"},hash:t.string(),queryId:{type:t.string().optional(),from:"query_id"},receiver:f().optional(),startParam:{type:t.string().optional(),from:"start_param"},user:f().optional()})}function b(r){return _().parse(r)}function o(r,n,a){a!==void 0&&r.set(n,a)}function h(r,n,a){if(a===void 0)return;const{photoUrl:s,firstName:p,lastName:u,isPremium:m,languageCode:c,isBot:l,...i}=a;r.set(n,JSON.stringify({...i,photo_url:s,first_name:p,last_name:u,is_premium:m,language_code:c,is_bot:l}))}function P(r){const{chat:n,chatType:a,chatInstance:s,hash:p,user:u,queryId:m,receiver:c,startParam:l,canSendAfter:i,authDate:y}=r,e=new URLSearchParams;if(e.set("auth_date",(y.getTime()/1e3).toString()),o(e,"chat_instance",s),o(e,"chat_type",a),o(e,"hash",p),o(e,"query_id",m),h(e,"receiver",c),o(e,"start_param",l),h(e,"user",u),n){const{photoUrl:d,...S}=n;e.set("chat",JSON.stringify({...S,photo_url:d}))}return i&&e.set("can_send_after",i.toString()),e.toString()}exports.chat=g;exports.initData=_;exports.parse=b;exports.serialize=P;exports.user=f;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/parsing.ts"],"sourcesContent":["import {\n searchParams,\n json,\n string,\n number,\n boolean,\n date,\n type AnyParser,\n} from '@tma.js/parsing';\n\nimport type { InitData, User } from './types.js';\n\nfunction field<P extends AnyParser<any>>(parser: P, from?: string) {\n return {\n from,\n type: parser,\n };\n}\n\nconst str = string();\nconst strOptional = string().optional();\nconst num = number();\nconst numOptional = number().optional();\nconst boolOptional = boolean().optional();\n\nfunction user() {\n return json<User>({\n firstName: field(str, 'first_name'),\n id: num,\n isBot: field(boolOptional, 'is_bot'),\n isPremium: field(boolOptional, 'is_premium'),\n lastName: field(strOptional, 'last_name'),\n languageCode: field(strOptional, 'language_code'),\n photoUrl: field(strOptional, 'photo_url'),\n username: strOptional,\n });\n}\n\nfunction chat() {\n return json({\n id: num,\n type: str,\n title: str,\n photoUrl: field(strOptional, 'photo_url'),\n username: strOptional,\n });\n}\n\n/**\n * Parser used to parse init data, presented as search params.\n * @deprecated Use `parse` method instead.\n */\nexport const initData = searchParams<InitData>({\n authDate: field(date(), 'auth_date'),\n hash: str,\n user: user().optional(),\n receiver: user().optional(),\n chat: chat().optional(),\n chatType: field(strOptional, 'chat_type'),\n chatInstance: field(strOptional, 'chat_instance'),\n canSendAfter: field(numOptional, 'can_send_after'),\n queryId: field(strOptional, 'query_id'),\n startParam: field(strOptional, 'start_param'),\n});\n\n/**\n * Parses incoming value as init data.\n * @param value - value to parse.\n */\nexport function parse(value: string | URLSearchParams): InitData {\n return initData.parse(value);\n}\n"],"names":["field","parser","from","str","string","strOptional","num","number","numOptional","boolOptional","boolean","user","json","chat","initData","searchParams","date","parse","value"],"mappings":"mHAYA,SAASA,EAAgCC,EAAWC,EAAe,CAC1D,MAAA,CACL,KAAAA,EACA,KAAMD,CAAA,CAEV,CAEA,MAAME,EAAMC,EAAO,OAAA,EACbC,EAAcD,EAAAA,SAAS,WACvBE,EAAMC,EAAO,OAAA,EACbC,EAAcD,EAAAA,SAAS,WACvBE,EAAeC,EAAAA,UAAU,WAE/B,SAASC,GAAO,CACd,OAAOC,OAAW,CAChB,UAAWZ,EAAMG,EAAK,YAAY,EAClC,GAAIG,EACJ,MAAON,EAAMS,EAAc,QAAQ,EACnC,UAAWT,EAAMS,EAAc,YAAY,EAC3C,SAAUT,EAAMK,EAAa,WAAW,EACxC,aAAcL,EAAMK,EAAa,eAAe,EAChD,SAAUL,EAAMK,EAAa,WAAW,EACxC,SAAUA,CAAA,CACX,CACH,CAEA,SAASQ,GAAO,CACd,OAAOD,OAAK,CACV,GAAIN,EACJ,KAAMH,EACN,MAAOA,EACP,SAAUH,EAAMK,EAAa,WAAW,EACxC,SAAUA,CAAA,CACX,CACH,CAMO,MAAMS,EAAWC,EAAAA,aAAuB,CAC7C,SAAUf,EAAMgB,OAAK,EAAG,WAAW,EACnC,KAAMb,EACN,KAAMQ,EAAK,EAAE,SAAS,EACtB,SAAUA,EAAK,EAAE,SAAS,EAC1B,KAAME,EAAK,EAAE,SAAS,EACtB,SAAUb,EAAMK,EAAa,WAAW,EACxC,aAAcL,EAAMK,EAAa,eAAe,EAChD,aAAcL,EAAMQ,EAAa,gBAAgB,EACjD,QAASR,EAAMK,EAAa,UAAU,EACtC,WAAYL,EAAMK,EAAa,aAAa,CAC9C,CAAC,EAMM,SAASY,EAAMC,EAA2C,CACxD,OAAAJ,EAAS,MAAMI,CAAK,CAC7B"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/chat.ts","../src/user.ts","../src/initData.ts","../src/parse.ts","../src/serialize.ts"],"sourcesContent":["import { json, number, string } from '@tma.js/parsing';\n\n/**\n * Returns parser used to parse chat data.\n */\nexport function chat() {\n return json({\n id: number(),\n type: string(),\n title: string(),\n photoUrl: {\n type: string().optional(),\n from: 'photo_url',\n },\n username: string().optional(),\n });\n}\n","import { json, string, boolean, number } from '@tma.js/parsing';\n\nimport type { User } from './types.js';\n\n/**\n * Returns parser used to parse user data.\n */\nexport function user() {\n return json<User>({\n firstName: {\n type: string(),\n from: 'first_name',\n },\n id: number(),\n isBot: {\n type: boolean().optional(),\n from: 'is_bot',\n },\n isPremium: {\n type: boolean().optional(),\n from: 'is_premium',\n },\n lastName: {\n type: string().optional(),\n from: 'last_name',\n },\n languageCode: {\n type: string().optional(),\n from: 'language_code',\n },\n photoUrl: {\n type: string().optional(),\n from: 'photo_url',\n },\n username: string().optional(),\n });\n}\n","import { string, number, date, searchParams } from '@tma.js/parsing';\n\nimport { user } from './user.js';\nimport { chat } from './chat.js';\nimport type { InitData } from './types.js';\n\n/**\n * Returns parser used to parse init data, presented as search params.\n */\nexport function initData() {\n return searchParams<InitData>({\n authDate: {\n type: date(),\n from: 'auth_date',\n },\n canSendAfter: {\n type: number().optional(),\n from: 'can_send_after',\n },\n chat: chat().optional(),\n chatInstance: {\n type: string().optional(),\n from: 'chat_instance',\n },\n chatType: {\n type: string().optional(),\n from: 'chat_type',\n },\n hash: string(),\n queryId: {\n type: string().optional(),\n from: 'query_id',\n },\n receiver: user().optional(),\n startParam: {\n type: string().optional(),\n from: 'start_param',\n },\n user: user().optional(),\n });\n}\n","import { initData } from './initData.js';\nimport type { InitData } from './types.js';\n\n/**\n * Parses incoming value as init data.\n * @param value - value to parse.\n */\nexport function parse(value: unknown): InitData {\n return initData().parse(value);\n}\n","import type { InitData, User } from './types.js';\n\nfunction setString(params: URLSearchParams, key: string, value: string | undefined) {\n if (value === undefined) {\n return;\n }\n params.set(key, value);\n}\n\nfunction setUser(params: URLSearchParams, key: string, value: User | undefined) {\n if (value === undefined) {\n return;\n }\n const {\n photoUrl,\n firstName,\n lastName,\n isPremium,\n languageCode,\n isBot,\n ...rest\n } = value;\n\n params.set(key, JSON.stringify({\n ...rest,\n photo_url: photoUrl,\n first_name: firstName,\n last_name: lastName,\n is_premium: isPremium,\n language_code: languageCode,\n is_bot: isBot,\n }));\n}\n\n/**\n * Converts init data to its initial representation.\n * @param value - init data.\n */\nexport function serialize(value: InitData): string {\n const {\n chat,\n chatType,\n chatInstance,\n hash,\n user,\n queryId,\n receiver,\n startParam,\n canSendAfter,\n authDate,\n } = value;\n\n const params = new URLSearchParams();\n\n params.set('auth_date', (authDate.getTime() / 1000).toString());\n setString(params, 'chat_instance', chatInstance);\n setString(params, 'chat_type', chatType);\n setString(params, 'hash', hash);\n setString(params, 'query_id', queryId);\n setUser(params, 'receiver', receiver);\n setString(params, 'start_param', startParam);\n setUser(params, 'user', user);\n\n if (chat) {\n const { photoUrl, ...rest } = chat;\n params.set('chat', JSON.stringify({\n ...rest,\n photo_url: photoUrl,\n }));\n }\n\n if (canSendAfter) {\n params.set('can_send_after', canSendAfter.toString());\n }\n\n return params.toString();\n}\n"],"names":["chat","json","number","string","user","boolean","initData","searchParams","date","parse","value","setString","params","key","setUser","photoUrl","firstName","lastName","isPremium","languageCode","isBot","rest","serialize","chatType","chatInstance","hash","queryId","receiver","startParam","canSendAfter","authDate"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- this.tmajs=this.tmajs||{};this.tmajs.initData=function(l){"use strict";class s extends Error{constructor(e,{type:i,error:p,field:r}={}){super(`Unable to parse ${r?`field "${r}"`:"value"} as ${i}`,{cause:{value:e,error:p}}),Object.setPrototypeOf(this,s.prototype)}}class d{constructor(e,i,p){this.parser=e,this.isOptional=i,this.isEmpty=p}parse(e){return this.isOptional&&this.isEmpty(e)?void 0:this.parser(e)}optional(){return this.isOptional=!0,this}}function w(t){return t===void 0}function y(){return new TypeError("Does not have any of expected types")}function h(t,{isEmpty:e=w}={}){return function({isEmpty:i=e}={}){return new d(t,!1,i)}}function O(t,e,i){const p={};for(const r in t){const n=t[r];if(!n)continue;let u,c;if("type"in n){const{type:f}=n;u=n.from||r,c=typeof f=="function"?f:f.parse.bind(f)}else u=r,c=typeof n=="function"?n:n.parse.bind(n);let _;const S=e(u);try{_=c(S)}catch(f){throw new s(S,{field:u,type:i,error:f})}_!==void 0&&(p[r]=_)}return p}const j=h(t=>{if(typeof t=="boolean")return t;throw new s(t,{type:"boolean",error:y()})}),b=h(t=>{if(typeof t=="number")return t;if(typeof t=="string"){const e=Number(t);if(!Number.isNaN(e))return e}throw new s(t,{type:"number",error:y()})}),U=b(),$=h(t=>{if(t instanceof Date)return t;try{return new Date(U.parse(t)*1e3)}catch(e){throw new s(t,{type:"Date",error:e})}});function v(t,e={}){const{type:i,isEmpty:p=w}=e;return new d(r=>{let n=r;if(typeof n=="string")try{n=JSON.parse(n)}catch(u){throw new s(r,{type:i,error:u})}if(typeof n!="object"||n===null||Array.isArray(n))throw new s(r,{type:i,error:y()});return O(t,u=>n[u])},!1,p)}const g=h(t=>{if(typeof t=="string"||typeof t=="number")return t.toString();throw new s(t,{type:"string",error:y()})});g();function A(t,e={}){const{type:i,isEmpty:p=w}=e;return new d(r=>{if(typeof r!="string"&&!(r instanceof URLSearchParams))throw new s(r,{type:i,error:y()});const n=typeof r=="string"?new URLSearchParams(r):r;return O(t,u=>{const c=n.get(u);return c===null?void 0:c})},!1,p)}function o(t,e){return{from:e,type:t}}const m=g(),a=g().optional(),D=b(),R=b().optional(),E=j().optional();function N(){return v({firstName:o(m,"first_name"),id:D,isBot:o(E,"is_bot"),isPremium:o(E,"is_premium"),lastName:o(a,"last_name"),languageCode:o(a,"language_code"),photoUrl:o(a,"photo_url"),username:a})}function T(){return v({id:D,type:m,title:m,photoUrl:o(a,"photo_url"),username:a})}const P=A({authDate:o($(),"auth_date"),hash:m,user:N().optional(),receiver:N().optional(),chat:T().optional(),chatType:o(a,"chat_type"),chatInstance:o(a,"chat_instance"),canSendAfter:o(R,"can_send_after"),queryId:o(a,"query_id"),startParam:o(a,"start_param")});function q(t){return P.parse(t)}return l.initData=P,l.parse=q,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"}),l}({});
1
+ this.tmajs=this.tmajs||{};this.tmajs.initData=function(y){"use strict";class u extends Error{constructor(e,{type:o,error:a,field:r}={}){super(`Unable to parse ${r?`field "${r}"`:"value"} as ${o}`,{cause:{value:e,error:a}}),Object.setPrototypeOf(this,u.prototype)}}class w{constructor(e,o,a){this.parser=e,this.isOptional=o,this.isEmpty=a}parse(e){return this.isOptional&&this.isEmpty(e)?void 0:this.parser(e)}optional(){return this.isOptional=!0,this}}function b(t){return t===void 0}function m(){return new TypeError("Does not have any of expected types")}function _(t,{isEmpty:e=b}={}){return function({isEmpty:o=e}={}){return new w(t,!1,o)}}function N(t,e,o){const a={};for(const r in t){const n=t[r];if(!n)continue;let s,c;if("type"in n){const{type:f}=n;s=n.from||r,c=typeof f=="function"?f:f.parse.bind(f)}else s=r,c=typeof n=="function"?n:n.parse.bind(n);let h;const l=e(s);try{h=c(l)}catch(f){throw new u(l,{field:s,type:o,error:f})}h!==void 0&&(a[r]=h)}return a}const v=_(t=>{if(typeof t=="boolean")return t;throw new u(t,{type:"boolean",error:m()})}),g=_(t=>{if(typeof t=="number")return t;if(typeof t=="string"){const e=Number(t);if(!Number.isNaN(e))return e}throw new u(t,{type:"number",error:m()})}),E=g(),j=_(t=>{if(t instanceof Date)return t;try{return new Date(E.parse(t)*1e3)}catch(e){throw new u(t,{type:"Date",error:e})}});function P(t,e={}){const{type:o,isEmpty:a=b}=e;return new w(r=>{let n=r;if(typeof n=="string")try{n=JSON.parse(n)}catch(s){throw new u(r,{type:o,error:s})}if(typeof n!="object"||n===null||Array.isArray(n))throw new u(r,{type:o,error:m()});return N(t,s=>n[s])},!1,a)}const i=_(t=>{if(typeof t=="string"||typeof t=="number")return t.toString();throw new u(t,{type:"string",error:m()})});i();function T(t,e={}){const{type:o,isEmpty:a=b}=e;return new w(r=>{if(typeof r!="string"&&!(r instanceof URLSearchParams))throw new u(r,{type:o,error:m()});const n=typeof r=="string"?new URLSearchParams(r):r;return N(t,s=>{const c=n.get(s);return c===null?void 0:c})},!1,a)}function U(){return P({id:g(),type:i(),title:i(),photoUrl:{type:i().optional(),from:"photo_url"},username:i().optional()})}function S(){return P({firstName:{type:i(),from:"first_name"},id:g(),isBot:{type:v().optional(),from:"is_bot"},isPremium:{type:v().optional(),from:"is_premium"},lastName:{type:i().optional(),from:"last_name"},languageCode:{type:i().optional(),from:"language_code"},photoUrl:{type:i().optional(),from:"photo_url"},username:i().optional()})}function D(){return T({authDate:{type:j(),from:"auth_date"},canSendAfter:{type:g().optional(),from:"can_send_after"},chat:U().optional(),chatInstance:{type:i().optional(),from:"chat_instance"},chatType:{type:i().optional(),from:"chat_type"},hash:i(),queryId:{type:i().optional(),from:"query_id"},receiver:S().optional(),startParam:{type:i().optional(),from:"start_param"},user:S().optional()})}function q(t){return D().parse(t)}function d(t,e,o){o!==void 0&&t.set(e,o)}function O(t,e,o){if(o===void 0)return;const{photoUrl:a,firstName:r,lastName:n,isPremium:s,languageCode:c,isBot:h,...l}=o;t.set(e,JSON.stringify({...l,photo_url:a,first_name:r,last_name:n,is_premium:s,language_code:c,is_bot:h}))}function A(t){const{chat:e,chatType:o,chatInstance:a,hash:r,user:n,queryId:s,receiver:c,startParam:h,canSendAfter:l,authDate:f}=t,p=new URLSearchParams;if(p.set("auth_date",(f.getTime()/1e3).toString()),d(p,"chat_instance",a),d(p,"chat_type",o),d(p,"hash",r),d(p,"query_id",s),O(p,"receiver",c),d(p,"start_param",h),O(p,"user",n),e){const{photoUrl:I,...R}=e;p.set("chat",JSON.stringify({...R,photo_url:I}))}return l&&p.set("can_send_after",l.toString()),p.toString()}return y.chat=U,y.initData=D,y.parse=q,y.serialize=A,y.user=S,Object.defineProperty(y,Symbol.toStringTag,{value:"Module"}),y}({});
2
2
  //# sourceMappingURL=index.iife.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.iife.js","sources":["../../parsing/dist/index.mjs","../src/parsing.ts"],"sourcesContent":["var g = Object.defineProperty;\nvar l = (r, t, e) => t in r ? g(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;\nvar d = (r, t, e) => (l(r, typeof t != \"symbol\" ? t + \"\" : t, e), e);\nimport { toRGB as A } from \"@tma.js/colors\";\nclass i extends Error {\n constructor(t, { type: e, error: o, field: n } = {}) {\n super(`Unable to parse ${n ? `field \"${n}\"` : \"value\"} as ${e}`, {\n cause: { value: t, error: o }\n }), Object.setPrototypeOf(this, i.prototype);\n }\n}\nclass u {\n constructor(t, e, o) {\n this.parser = t, this.isOptional = e, this.isEmpty = o;\n }\n parse(t) {\n return this.isOptional && this.isEmpty(t) ? void 0 : this.parser(t);\n }\n optional() {\n return this.isOptional = !0, this;\n }\n}\nfunction E(r) {\n if (Array.isArray(r))\n return r;\n if (typeof r == \"string\")\n try {\n const t = JSON.parse(r);\n if (Array.isArray(t))\n return t;\n } catch {\n }\n throw new i(r, { type: \"array\" });\n}\nclass O extends u {\n constructor(e, o, n) {\n super(E, o, n);\n d(this, \"itemParser\");\n this.itemParser = typeof e == \"function\" ? e : e.parse.bind(e);\n }\n parse(e) {\n const o = super.parse(e);\n return o === void 0 ? o : o.map(this.itemParser);\n }\n of(e) {\n return this.itemParser = typeof e == \"function\" ? e : e.parse.bind(e), this;\n }\n}\nfunction h(r) {\n return r === void 0;\n}\nfunction D() {\n return new O((r) => r, !1, h);\n}\nfunction f() {\n return new TypeError(\"Does not have any of expected types\");\n}\nfunction y(r, { isEmpty: t = h } = {}) {\n return function({ isEmpty: o = t } = {}) {\n return new u(r, !1, o);\n };\n}\nfunction b(r, t, e) {\n const o = {};\n for (const n in r) {\n const s = r[n];\n if (!s)\n continue;\n let a, p;\n if (\"type\" in s) {\n const { type: c } = s;\n a = s.from || n, p = typeof c == \"function\" ? c : c.parse.bind(c);\n } else\n a = n, p = typeof s == \"function\" ? s : s.parse.bind(s);\n let w;\n const m = t(a);\n try {\n w = p(m);\n } catch (c) {\n throw new i(m, {\n field: a,\n type: e,\n error: c\n });\n }\n w !== void 0 && (o[n] = w);\n }\n return o;\n}\nconst G = y((r) => {\n if (typeof r == \"boolean\")\n return r;\n throw new i(r, { type: \"boolean\", error: f() });\n}), V = y((r) => {\n if (typeof r == \"number\")\n return r;\n if (typeof r == \"string\") {\n const t = Number(r);\n if (!Number.isNaN(t))\n return t;\n }\n throw new i(r, { type: \"number\", error: f() });\n}), N = V(), R = y((r) => {\n if (r instanceof Date)\n return r;\n try {\n return new Date(N.parse(r) * 1e3);\n } catch (t) {\n throw new i(r, { type: \"Date\", error: t });\n }\n});\nfunction U(r, t = {}) {\n const {\n type: e,\n isEmpty: o = h\n } = t;\n return new u((n) => {\n let s = n;\n if (typeof s == \"string\")\n try {\n s = JSON.parse(s);\n } catch (a) {\n throw new i(n, { type: e, error: a });\n }\n if (typeof s != \"object\" || s === null || Array.isArray(s))\n throw new i(n, { type: e, error: f() });\n return b(r, (a) => s[a]);\n }, !1, o);\n}\nconst P = y((r) => {\n if (typeof r == \"string\" || typeof r == \"number\")\n return r.toString();\n throw new i(r, { type: \"string\", error: f() });\n}), S = P(), B = y((r) => {\n try {\n return A(S.parse(r));\n } catch (t) {\n throw new i(r, { type: \"RGB\", error: t });\n }\n});\nfunction $(r, t = {}) {\n const {\n type: e,\n isEmpty: o = h\n } = t;\n return new u((n) => {\n if (typeof n != \"string\" && !(n instanceof URLSearchParams))\n throw new i(n, { type: e, error: f() });\n const s = typeof n == \"string\" ? new URLSearchParams(n) : n;\n return b(r, (a) => {\n const p = s.get(a);\n return p === null ? void 0 : p;\n });\n }, !1, o);\n}\nexport {\n O as ArrayValueParser,\n i as ParsingError,\n u as ValueParser,\n D as array,\n G as boolean,\n y as createValueParserGen,\n R as date,\n U as json,\n V as number,\n B as rgb,\n $ as searchParams,\n P as string\n};\n//# sourceMappingURL=index.mjs.map\n","import {\n searchParams,\n json,\n string,\n number,\n boolean,\n date,\n type AnyParser,\n} from '@tma.js/parsing';\n\nimport type { InitData, User } from './types.js';\n\nfunction field<P extends AnyParser<any>>(parser: P, from?: string) {\n return {\n from,\n type: parser,\n };\n}\n\nconst str = string();\nconst strOptional = string().optional();\nconst num = number();\nconst numOptional = number().optional();\nconst boolOptional = boolean().optional();\n\nfunction user() {\n return json<User>({\n firstName: field(str, 'first_name'),\n id: num,\n isBot: field(boolOptional, 'is_bot'),\n isPremium: field(boolOptional, 'is_premium'),\n lastName: field(strOptional, 'last_name'),\n languageCode: field(strOptional, 'language_code'),\n photoUrl: field(strOptional, 'photo_url'),\n username: strOptional,\n });\n}\n\nfunction chat() {\n return json({\n id: num,\n type: str,\n title: str,\n photoUrl: field(strOptional, 'photo_url'),\n username: strOptional,\n });\n}\n\n/**\n * Parser used to parse init data, presented as search params.\n * @deprecated Use `parse` method instead.\n */\nexport const initData = searchParams<InitData>({\n authDate: field(date(), 'auth_date'),\n hash: str,\n user: user().optional(),\n receiver: user().optional(),\n chat: chat().optional(),\n chatType: field(strOptional, 'chat_type'),\n chatInstance: field(strOptional, 'chat_instance'),\n canSendAfter: field(numOptional, 'can_send_after'),\n queryId: field(strOptional, 'query_id'),\n startParam: field(strOptional, 'start_param'),\n});\n\n/**\n * Parses incoming value as init data.\n * @param value - value to parse.\n */\nexport function parse(value: string | URLSearchParams): InitData {\n return initData.parse(value);\n}\n"],"names":["i","t","e","o","n","u","h","r","f","y","b","s","a","p","c","w","m","G","V","N","R","U","P","$","field","parser","from","str","string","strOptional","num","number","numOptional","boolOptional","boolean","user","json","chat","initData","searchParams","date","parse","value"],"mappings":"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"}
1
+ {"version":3,"file":"index.iife.js","sources":["../../parsing/dist/index.mjs","../src/chat.ts","../src/user.ts","../src/initData.ts","../src/parse.ts","../src/serialize.ts"],"sourcesContent":["var g = Object.defineProperty;\nvar l = (r, t, e) => t in r ? g(r, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : r[t] = e;\nvar d = (r, t, e) => (l(r, typeof t != \"symbol\" ? t + \"\" : t, e), e);\nimport { toRGB as A } from \"@tma.js/colors\";\nclass i extends Error {\n constructor(t, { type: e, error: o, field: n } = {}) {\n super(`Unable to parse ${n ? `field \"${n}\"` : \"value\"} as ${e}`, {\n cause: { value: t, error: o }\n }), Object.setPrototypeOf(this, i.prototype);\n }\n}\nclass u {\n constructor(t, e, o) {\n this.parser = t, this.isOptional = e, this.isEmpty = o;\n }\n parse(t) {\n return this.isOptional && this.isEmpty(t) ? void 0 : this.parser(t);\n }\n optional() {\n return this.isOptional = !0, this;\n }\n}\nfunction E(r) {\n if (Array.isArray(r))\n return r;\n if (typeof r == \"string\")\n try {\n const t = JSON.parse(r);\n if (Array.isArray(t))\n return t;\n } catch {\n }\n throw new i(r, { type: \"array\" });\n}\nclass O extends u {\n constructor(e, o, n) {\n super(E, o, n);\n d(this, \"itemParser\");\n this.itemParser = typeof e == \"function\" ? e : e.parse.bind(e);\n }\n parse(e) {\n const o = super.parse(e);\n return o === void 0 ? o : o.map(this.itemParser);\n }\n of(e) {\n return this.itemParser = typeof e == \"function\" ? e : e.parse.bind(e), this;\n }\n}\nfunction h(r) {\n return r === void 0;\n}\nfunction D() {\n return new O((r) => r, !1, h);\n}\nfunction f() {\n return new TypeError(\"Does not have any of expected types\");\n}\nfunction y(r, { isEmpty: t = h } = {}) {\n return function({ isEmpty: o = t } = {}) {\n return new u(r, !1, o);\n };\n}\nfunction b(r, t, e) {\n const o = {};\n for (const n in r) {\n const s = r[n];\n if (!s)\n continue;\n let a, p;\n if (\"type\" in s) {\n const { type: c } = s;\n a = s.from || n, p = typeof c == \"function\" ? c : c.parse.bind(c);\n } else\n a = n, p = typeof s == \"function\" ? s : s.parse.bind(s);\n let w;\n const m = t(a);\n try {\n w = p(m);\n } catch (c) {\n throw new i(m, {\n field: a,\n type: e,\n error: c\n });\n }\n w !== void 0 && (o[n] = w);\n }\n return o;\n}\nconst G = y((r) => {\n if (typeof r == \"boolean\")\n return r;\n throw new i(r, { type: \"boolean\", error: f() });\n}), V = y((r) => {\n if (typeof r == \"number\")\n return r;\n if (typeof r == \"string\") {\n const t = Number(r);\n if (!Number.isNaN(t))\n return t;\n }\n throw new i(r, { type: \"number\", error: f() });\n}), N = V(), R = y((r) => {\n if (r instanceof Date)\n return r;\n try {\n return new Date(N.parse(r) * 1e3);\n } catch (t) {\n throw new i(r, { type: \"Date\", error: t });\n }\n});\nfunction U(r, t = {}) {\n const {\n type: e,\n isEmpty: o = h\n } = t;\n return new u((n) => {\n let s = n;\n if (typeof s == \"string\")\n try {\n s = JSON.parse(s);\n } catch (a) {\n throw new i(n, { type: e, error: a });\n }\n if (typeof s != \"object\" || s === null || Array.isArray(s))\n throw new i(n, { type: e, error: f() });\n return b(r, (a) => s[a]);\n }, !1, o);\n}\nconst P = y((r) => {\n if (typeof r == \"string\" || typeof r == \"number\")\n return r.toString();\n throw new i(r, { type: \"string\", error: f() });\n}), S = P(), B = y((r) => {\n try {\n return A(S.parse(r));\n } catch (t) {\n throw new i(r, { type: \"RGB\", error: t });\n }\n});\nfunction $(r, t = {}) {\n const {\n type: e,\n isEmpty: o = h\n } = t;\n return new u((n) => {\n if (typeof n != \"string\" && !(n instanceof URLSearchParams))\n throw new i(n, { type: e, error: f() });\n const s = typeof n == \"string\" ? new URLSearchParams(n) : n;\n return b(r, (a) => {\n const p = s.get(a);\n return p === null ? void 0 : p;\n });\n }, !1, o);\n}\nexport {\n O as ArrayValueParser,\n i as ParsingError,\n u as ValueParser,\n D as array,\n G as boolean,\n y as createValueParserGen,\n R as date,\n U as json,\n V as number,\n B as rgb,\n $ as searchParams,\n P as string\n};\n//# sourceMappingURL=index.mjs.map\n","import { json, number, string } from '@tma.js/parsing';\n\n/**\n * Returns parser used to parse chat data.\n */\nexport function chat() {\n return json({\n id: number(),\n type: string(),\n title: string(),\n photoUrl: {\n type: string().optional(),\n from: 'photo_url',\n },\n username: string().optional(),\n });\n}\n","import { json, string, boolean, number } from '@tma.js/parsing';\n\nimport type { User } from './types.js';\n\n/**\n * Returns parser used to parse user data.\n */\nexport function user() {\n return json<User>({\n firstName: {\n type: string(),\n from: 'first_name',\n },\n id: number(),\n isBot: {\n type: boolean().optional(),\n from: 'is_bot',\n },\n isPremium: {\n type: boolean().optional(),\n from: 'is_premium',\n },\n lastName: {\n type: string().optional(),\n from: 'last_name',\n },\n languageCode: {\n type: string().optional(),\n from: 'language_code',\n },\n photoUrl: {\n type: string().optional(),\n from: 'photo_url',\n },\n username: string().optional(),\n });\n}\n","import { string, number, date, searchParams } from '@tma.js/parsing';\n\nimport { user } from './user.js';\nimport { chat } from './chat.js';\nimport type { InitData } from './types.js';\n\n/**\n * Returns parser used to parse init data, presented as search params.\n */\nexport function initData() {\n return searchParams<InitData>({\n authDate: {\n type: date(),\n from: 'auth_date',\n },\n canSendAfter: {\n type: number().optional(),\n from: 'can_send_after',\n },\n chat: chat().optional(),\n chatInstance: {\n type: string().optional(),\n from: 'chat_instance',\n },\n chatType: {\n type: string().optional(),\n from: 'chat_type',\n },\n hash: string(),\n queryId: {\n type: string().optional(),\n from: 'query_id',\n },\n receiver: user().optional(),\n startParam: {\n type: string().optional(),\n from: 'start_param',\n },\n user: user().optional(),\n });\n}\n","import { initData } from './initData.js';\nimport type { InitData } from './types.js';\n\n/**\n * Parses incoming value as init data.\n * @param value - value to parse.\n */\nexport function parse(value: unknown): InitData {\n return initData().parse(value);\n}\n","import type { InitData, User } from './types.js';\n\nfunction setString(params: URLSearchParams, key: string, value: string | undefined) {\n if (value === undefined) {\n return;\n }\n params.set(key, value);\n}\n\nfunction setUser(params: URLSearchParams, key: string, value: User | undefined) {\n if (value === undefined) {\n return;\n }\n const {\n photoUrl,\n firstName,\n lastName,\n isPremium,\n languageCode,\n isBot,\n ...rest\n } = value;\n\n params.set(key, JSON.stringify({\n ...rest,\n photo_url: photoUrl,\n first_name: firstName,\n last_name: lastName,\n is_premium: isPremium,\n language_code: languageCode,\n is_bot: isBot,\n }));\n}\n\n/**\n * Converts init data to its initial representation.\n * @param value - init data.\n */\nexport function serialize(value: InitData): string {\n const {\n chat,\n chatType,\n chatInstance,\n hash,\n user,\n queryId,\n receiver,\n startParam,\n canSendAfter,\n authDate,\n } = value;\n\n const params = new URLSearchParams();\n\n params.set('auth_date', (authDate.getTime() / 1000).toString());\n setString(params, 'chat_instance', chatInstance);\n setString(params, 'chat_type', chatType);\n setString(params, 'hash', hash);\n setString(params, 'query_id', queryId);\n setUser(params, 'receiver', receiver);\n setString(params, 'start_param', startParam);\n setUser(params, 'user', user);\n\n if (chat) {\n const { photoUrl, ...rest } = chat;\n params.set('chat', JSON.stringify({\n ...rest,\n photo_url: photoUrl,\n }));\n }\n\n if (canSendAfter) {\n params.set('can_send_after', canSendAfter.toString());\n }\n\n return params.toString();\n}\n"],"names":["i","t","e","o","n","u","h","r","f","y","b","s","a","p","c","w","m","G","V","N","R","U","P","$","chat","json","number","string","user","boolean","initData","searchParams","date","parse","value","setString","params","key","setUser","photoUrl","firstName","lastName","isPremium","languageCode","isBot","rest","serialize","chatType","chatInstance","hash","queryId","receiver","startParam","canSendAfter","authDate"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,49 +1,133 @@
1
- import { string as i, number as s, boolean as l, searchParams as m, date as h, json as u } from "@tma.js/parsing";
2
- function t(e, p) {
3
- return {
4
- from: p,
5
- type: e
6
- };
1
+ import { json as d, number as l, string as t, boolean as h, searchParams as P, date as U } from "@tma.js/parsing";
2
+ function b() {
3
+ return d({
4
+ id: l(),
5
+ type: t(),
6
+ title: t(),
7
+ photoUrl: {
8
+ type: t().optional(),
9
+ from: "photo_url"
10
+ },
11
+ username: t().optional()
12
+ });
7
13
  }
8
- const n = i(), a = i().optional(), c = s(), _ = s().optional(), o = l().optional();
9
- function r() {
10
- return u({
11
- firstName: t(n, "first_name"),
12
- id: c,
13
- isBot: t(o, "is_bot"),
14
- isPremium: t(o, "is_premium"),
15
- lastName: t(a, "last_name"),
16
- languageCode: t(a, "language_code"),
17
- photoUrl: t(a, "photo_url"),
18
- username: a
14
+ function _() {
15
+ return d({
16
+ firstName: {
17
+ type: t(),
18
+ from: "first_name"
19
+ },
20
+ id: l(),
21
+ isBot: {
22
+ type: h().optional(),
23
+ from: "is_bot"
24
+ },
25
+ isPremium: {
26
+ type: h().optional(),
27
+ from: "is_premium"
28
+ },
29
+ lastName: {
30
+ type: t().optional(),
31
+ from: "last_name"
32
+ },
33
+ languageCode: {
34
+ type: t().optional(),
35
+ from: "language_code"
36
+ },
37
+ photoUrl: {
38
+ type: t().optional(),
39
+ from: "photo_url"
40
+ },
41
+ username: t().optional()
19
42
  });
20
43
  }
21
- function d() {
22
- return u({
23
- id: c,
24
- type: n,
25
- title: n,
26
- photoUrl: t(a, "photo_url"),
27
- username: a
44
+ function q() {
45
+ return P({
46
+ authDate: {
47
+ type: U(),
48
+ from: "auth_date"
49
+ },
50
+ canSendAfter: {
51
+ type: l().optional(),
52
+ from: "can_send_after"
53
+ },
54
+ chat: b().optional(),
55
+ chatInstance: {
56
+ type: t().optional(),
57
+ from: "chat_instance"
58
+ },
59
+ chatType: {
60
+ type: t().optional(),
61
+ from: "chat_type"
62
+ },
63
+ hash: t(),
64
+ queryId: {
65
+ type: t().optional(),
66
+ from: "query_id"
67
+ },
68
+ receiver: _().optional(),
69
+ startParam: {
70
+ type: t().optional(),
71
+ from: "start_param"
72
+ },
73
+ user: _().optional()
28
74
  });
29
75
  }
30
- const f = m({
31
- authDate: t(h(), "auth_date"),
32
- hash: n,
33
- user: r().optional(),
34
- receiver: r().optional(),
35
- chat: d().optional(),
36
- chatType: t(a, "chat_type"),
37
- chatInstance: t(a, "chat_instance"),
38
- canSendAfter: t(_, "can_send_after"),
39
- queryId: t(a, "query_id"),
40
- startParam: t(a, "start_param")
41
- });
42
- function g(e) {
43
- return f.parse(e);
76
+ function v(a) {
77
+ return q().parse(a);
78
+ }
79
+ function n(a, o, r) {
80
+ r !== void 0 && a.set(o, r);
81
+ }
82
+ function y(a, o, r) {
83
+ if (r === void 0)
84
+ return;
85
+ const {
86
+ photoUrl: s,
87
+ firstName: p,
88
+ lastName: m,
89
+ isPremium: u,
90
+ languageCode: c,
91
+ isBot: f,
92
+ ...i
93
+ } = r;
94
+ a.set(o, JSON.stringify({
95
+ ...i,
96
+ photo_url: s,
97
+ first_name: p,
98
+ last_name: m,
99
+ is_premium: u,
100
+ language_code: c,
101
+ is_bot: f
102
+ }));
103
+ }
104
+ function D(a) {
105
+ const {
106
+ chat: o,
107
+ chatType: r,
108
+ chatInstance: s,
109
+ hash: p,
110
+ user: m,
111
+ queryId: u,
112
+ receiver: c,
113
+ startParam: f,
114
+ canSendAfter: i,
115
+ authDate: g
116
+ } = a, e = new URLSearchParams();
117
+ if (e.set("auth_date", (g.getTime() / 1e3).toString()), n(e, "chat_instance", s), n(e, "chat_type", r), n(e, "hash", p), n(e, "query_id", u), y(e, "receiver", c), n(e, "start_param", f), y(e, "user", m), o) {
118
+ const { photoUrl: S, ...N } = o;
119
+ e.set("chat", JSON.stringify({
120
+ ...N,
121
+ photo_url: S
122
+ }));
123
+ }
124
+ return i && e.set("can_send_after", i.toString()), e.toString();
44
125
  }
45
126
  export {
46
- f as initData,
47
- g as parse
127
+ b as chat,
128
+ q as initData,
129
+ v as parse,
130
+ D as serialize,
131
+ _ as user
48
132
  };
49
133
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/parsing.ts"],"sourcesContent":["import {\n searchParams,\n json,\n string,\n number,\n boolean,\n date,\n type AnyParser,\n} from '@tma.js/parsing';\n\nimport type { InitData, User } from './types.js';\n\nfunction field<P extends AnyParser<any>>(parser: P, from?: string) {\n return {\n from,\n type: parser,\n };\n}\n\nconst str = string();\nconst strOptional = string().optional();\nconst num = number();\nconst numOptional = number().optional();\nconst boolOptional = boolean().optional();\n\nfunction user() {\n return json<User>({\n firstName: field(str, 'first_name'),\n id: num,\n isBot: field(boolOptional, 'is_bot'),\n isPremium: field(boolOptional, 'is_premium'),\n lastName: field(strOptional, 'last_name'),\n languageCode: field(strOptional, 'language_code'),\n photoUrl: field(strOptional, 'photo_url'),\n username: strOptional,\n });\n}\n\nfunction chat() {\n return json({\n id: num,\n type: str,\n title: str,\n photoUrl: field(strOptional, 'photo_url'),\n username: strOptional,\n });\n}\n\n/**\n * Parser used to parse init data, presented as search params.\n * @deprecated Use `parse` method instead.\n */\nexport const initData = searchParams<InitData>({\n authDate: field(date(), 'auth_date'),\n hash: str,\n user: user().optional(),\n receiver: user().optional(),\n chat: chat().optional(),\n chatType: field(strOptional, 'chat_type'),\n chatInstance: field(strOptional, 'chat_instance'),\n canSendAfter: field(numOptional, 'can_send_after'),\n queryId: field(strOptional, 'query_id'),\n startParam: field(strOptional, 'start_param'),\n});\n\n/**\n * Parses incoming value as init data.\n * @param value - value to parse.\n */\nexport function parse(value: string | URLSearchParams): InitData {\n return initData.parse(value);\n}\n"],"names":["field","parser","from","str","string","strOptional","num","number","numOptional","boolOptional","boolean","user","json","chat","initData","searchParams","date","parse","value"],"mappings":";AAYA,SAASA,EAAgCC,GAAWC,GAAe;AAC1D,SAAA;AAAA,IACL,MAAAA;AAAA,IACA,MAAMD;AAAA,EAAA;AAEV;AAEA,MAAME,IAAMC,EAAO,GACbC,IAAcD,IAAS,YACvBE,IAAMC,EAAO,GACbC,IAAcD,IAAS,YACvBE,IAAeC,IAAU;AAE/B,SAASC,IAAO;AACd,SAAOC,EAAW;AAAA,IAChB,WAAWZ,EAAMG,GAAK,YAAY;AAAA,IAClC,IAAIG;AAAA,IACJ,OAAON,EAAMS,GAAc,QAAQ;AAAA,IACnC,WAAWT,EAAMS,GAAc,YAAY;AAAA,IAC3C,UAAUT,EAAMK,GAAa,WAAW;AAAA,IACxC,cAAcL,EAAMK,GAAa,eAAe;AAAA,IAChD,UAAUL,EAAMK,GAAa,WAAW;AAAA,IACxC,UAAUA;AAAA,EAAA,CACX;AACH;AAEA,SAASQ,IAAO;AACd,SAAOD,EAAK;AAAA,IACV,IAAIN;AAAA,IACJ,MAAMH;AAAA,IACN,OAAOA;AAAA,IACP,UAAUH,EAAMK,GAAa,WAAW;AAAA,IACxC,UAAUA;AAAA,EAAA,CACX;AACH;AAMO,MAAMS,IAAWC,EAAuB;AAAA,EAC7C,UAAUf,EAAMgB,EAAK,GAAG,WAAW;AAAA,EACnC,MAAMb;AAAA,EACN,MAAMQ,EAAK,EAAE,SAAS;AAAA,EACtB,UAAUA,EAAK,EAAE,SAAS;AAAA,EAC1B,MAAME,EAAK,EAAE,SAAS;AAAA,EACtB,UAAUb,EAAMK,GAAa,WAAW;AAAA,EACxC,cAAcL,EAAMK,GAAa,eAAe;AAAA,EAChD,cAAcL,EAAMQ,GAAa,gBAAgB;AAAA,EACjD,SAASR,EAAMK,GAAa,UAAU;AAAA,EACtC,YAAYL,EAAMK,GAAa,aAAa;AAC9C,CAAC;AAMM,SAASY,EAAMC,GAA2C;AACxD,SAAAJ,EAAS,MAAMI,CAAK;AAC7B;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/chat.ts","../src/user.ts","../src/initData.ts","../src/parse.ts","../src/serialize.ts"],"sourcesContent":["import { json, number, string } from '@tma.js/parsing';\n\n/**\n * Returns parser used to parse chat data.\n */\nexport function chat() {\n return json({\n id: number(),\n type: string(),\n title: string(),\n photoUrl: {\n type: string().optional(),\n from: 'photo_url',\n },\n username: string().optional(),\n });\n}\n","import { json, string, boolean, number } from '@tma.js/parsing';\n\nimport type { User } from './types.js';\n\n/**\n * Returns parser used to parse user data.\n */\nexport function user() {\n return json<User>({\n firstName: {\n type: string(),\n from: 'first_name',\n },\n id: number(),\n isBot: {\n type: boolean().optional(),\n from: 'is_bot',\n },\n isPremium: {\n type: boolean().optional(),\n from: 'is_premium',\n },\n lastName: {\n type: string().optional(),\n from: 'last_name',\n },\n languageCode: {\n type: string().optional(),\n from: 'language_code',\n },\n photoUrl: {\n type: string().optional(),\n from: 'photo_url',\n },\n username: string().optional(),\n });\n}\n","import { string, number, date, searchParams } from '@tma.js/parsing';\n\nimport { user } from './user.js';\nimport { chat } from './chat.js';\nimport type { InitData } from './types.js';\n\n/**\n * Returns parser used to parse init data, presented as search params.\n */\nexport function initData() {\n return searchParams<InitData>({\n authDate: {\n type: date(),\n from: 'auth_date',\n },\n canSendAfter: {\n type: number().optional(),\n from: 'can_send_after',\n },\n chat: chat().optional(),\n chatInstance: {\n type: string().optional(),\n from: 'chat_instance',\n },\n chatType: {\n type: string().optional(),\n from: 'chat_type',\n },\n hash: string(),\n queryId: {\n type: string().optional(),\n from: 'query_id',\n },\n receiver: user().optional(),\n startParam: {\n type: string().optional(),\n from: 'start_param',\n },\n user: user().optional(),\n });\n}\n","import { initData } from './initData.js';\nimport type { InitData } from './types.js';\n\n/**\n * Parses incoming value as init data.\n * @param value - value to parse.\n */\nexport function parse(value: unknown): InitData {\n return initData().parse(value);\n}\n","import type { InitData, User } from './types.js';\n\nfunction setString(params: URLSearchParams, key: string, value: string | undefined) {\n if (value === undefined) {\n return;\n }\n params.set(key, value);\n}\n\nfunction setUser(params: URLSearchParams, key: string, value: User | undefined) {\n if (value === undefined) {\n return;\n }\n const {\n photoUrl,\n firstName,\n lastName,\n isPremium,\n languageCode,\n isBot,\n ...rest\n } = value;\n\n params.set(key, JSON.stringify({\n ...rest,\n photo_url: photoUrl,\n first_name: firstName,\n last_name: lastName,\n is_premium: isPremium,\n language_code: languageCode,\n is_bot: isBot,\n }));\n}\n\n/**\n * Converts init data to its initial representation.\n * @param value - init data.\n */\nexport function serialize(value: InitData): string {\n const {\n chat,\n chatType,\n chatInstance,\n hash,\n user,\n queryId,\n receiver,\n startParam,\n canSendAfter,\n authDate,\n } = value;\n\n const params = new URLSearchParams();\n\n params.set('auth_date', (authDate.getTime() / 1000).toString());\n setString(params, 'chat_instance', chatInstance);\n setString(params, 'chat_type', chatType);\n setString(params, 'hash', hash);\n setString(params, 'query_id', queryId);\n setUser(params, 'receiver', receiver);\n setString(params, 'start_param', startParam);\n setUser(params, 'user', user);\n\n if (chat) {\n const { photoUrl, ...rest } = chat;\n params.set('chat', JSON.stringify({\n ...rest,\n photo_url: photoUrl,\n }));\n }\n\n if (canSendAfter) {\n params.set('can_send_after', canSendAfter.toString());\n }\n\n return params.toString();\n}\n"],"names":["chat","json","number","string","user","boolean","initData","searchParams","date","parse","value","setString","params","key","setUser","photoUrl","firstName","lastName","isPremium","languageCode","isBot","rest","serialize","chatType","chatInstance","hash","queryId","receiver","startParam","canSendAfter","authDate"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tma.js/init-data",
3
- "version": "0.2.18",
3
+ "version": "0.2.19",
4
4
  "description": "Frontend TypeScript library to make work with Web Apps init data easier.",
5
5
  "author": "Vladislav Kibenko <wolfram.deus@gmail.com>",
6
6
  "homepage": "https://github.com/Telegram-Mini-Apps/tma.js#readme",
package/src/chat.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { json, number, string } from '@tma.js/parsing';
2
+
3
+ /**
4
+ * Returns parser used to parse chat data.
5
+ */
6
+ export function chat() {
7
+ return json({
8
+ id: number(),
9
+ type: string(),
10
+ title: string(),
11
+ photoUrl: {
12
+ type: string().optional(),
13
+ from: 'photo_url',
14
+ },
15
+ username: string().optional(),
16
+ });
17
+ }
package/src/index.ts CHANGED
@@ -1,2 +1,6 @@
1
- export * from './parsing.js';
1
+ export * from './chat.js';
2
+ export * from './initData.js';
3
+ export * from './parse.js';
4
+ export * from './serialize.js';
2
5
  export * from './types.js';
6
+ export * from './user.js';
@@ -0,0 +1,41 @@
1
+ import { string, number, date, searchParams } from '@tma.js/parsing';
2
+
3
+ import { user } from './user.js';
4
+ import { chat } from './chat.js';
5
+ import type { InitData } from './types.js';
6
+
7
+ /**
8
+ * Returns parser used to parse init data, presented as search params.
9
+ */
10
+ export function initData() {
11
+ return searchParams<InitData>({
12
+ authDate: {
13
+ type: date(),
14
+ from: 'auth_date',
15
+ },
16
+ canSendAfter: {
17
+ type: number().optional(),
18
+ from: 'can_send_after',
19
+ },
20
+ chat: chat().optional(),
21
+ chatInstance: {
22
+ type: string().optional(),
23
+ from: 'chat_instance',
24
+ },
25
+ chatType: {
26
+ type: string().optional(),
27
+ from: 'chat_type',
28
+ },
29
+ hash: string(),
30
+ queryId: {
31
+ type: string().optional(),
32
+ from: 'query_id',
33
+ },
34
+ receiver: user().optional(),
35
+ startParam: {
36
+ type: string().optional(),
37
+ from: 'start_param',
38
+ },
39
+ user: user().optional(),
40
+ });
41
+ }
package/src/parse.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { initData } from './initData.js';
2
+ import type { InitData } from './types.js';
3
+
4
+ /**
5
+ * Parses incoming value as init data.
6
+ * @param value - value to parse.
7
+ */
8
+ export function parse(value: unknown): InitData {
9
+ return initData().parse(value);
10
+ }
@@ -0,0 +1,77 @@
1
+ import type { InitData, User } from './types.js';
2
+
3
+ function setString(params: URLSearchParams, key: string, value: string | undefined) {
4
+ if (value === undefined) {
5
+ return;
6
+ }
7
+ params.set(key, value);
8
+ }
9
+
10
+ function setUser(params: URLSearchParams, key: string, value: User | undefined) {
11
+ if (value === undefined) {
12
+ return;
13
+ }
14
+ const {
15
+ photoUrl,
16
+ firstName,
17
+ lastName,
18
+ isPremium,
19
+ languageCode,
20
+ isBot,
21
+ ...rest
22
+ } = value;
23
+
24
+ params.set(key, JSON.stringify({
25
+ ...rest,
26
+ photo_url: photoUrl,
27
+ first_name: firstName,
28
+ last_name: lastName,
29
+ is_premium: isPremium,
30
+ language_code: languageCode,
31
+ is_bot: isBot,
32
+ }));
33
+ }
34
+
35
+ /**
36
+ * Converts init data to its initial representation.
37
+ * @param value - init data.
38
+ */
39
+ export function serialize(value: InitData): string {
40
+ const {
41
+ chat,
42
+ chatType,
43
+ chatInstance,
44
+ hash,
45
+ user,
46
+ queryId,
47
+ receiver,
48
+ startParam,
49
+ canSendAfter,
50
+ authDate,
51
+ } = value;
52
+
53
+ const params = new URLSearchParams();
54
+
55
+ params.set('auth_date', (authDate.getTime() / 1000).toString());
56
+ setString(params, 'chat_instance', chatInstance);
57
+ setString(params, 'chat_type', chatType);
58
+ setString(params, 'hash', hash);
59
+ setString(params, 'query_id', queryId);
60
+ setUser(params, 'receiver', receiver);
61
+ setString(params, 'start_param', startParam);
62
+ setUser(params, 'user', user);
63
+
64
+ if (chat) {
65
+ const { photoUrl, ...rest } = chat;
66
+ params.set('chat', JSON.stringify({
67
+ ...rest,
68
+ photo_url: photoUrl,
69
+ }));
70
+ }
71
+
72
+ if (canSendAfter) {
73
+ params.set('can_send_after', canSendAfter.toString());
74
+ }
75
+
76
+ return params.toString();
77
+ }
package/src/user.ts ADDED
@@ -0,0 +1,37 @@
1
+ import { json, string, boolean, number } from '@tma.js/parsing';
2
+
3
+ import type { User } from './types.js';
4
+
5
+ /**
6
+ * Returns parser used to parse user data.
7
+ */
8
+ export function user() {
9
+ return json<User>({
10
+ firstName: {
11
+ type: string(),
12
+ from: 'first_name',
13
+ },
14
+ id: number(),
15
+ isBot: {
16
+ type: boolean().optional(),
17
+ from: 'is_bot',
18
+ },
19
+ isPremium: {
20
+ type: boolean().optional(),
21
+ from: 'is_premium',
22
+ },
23
+ lastName: {
24
+ type: string().optional(),
25
+ from: 'last_name',
26
+ },
27
+ languageCode: {
28
+ type: string().optional(),
29
+ from: 'language_code',
30
+ },
31
+ photoUrl: {
32
+ type: string().optional(),
33
+ from: 'photo_url',
34
+ },
35
+ username: string().optional(),
36
+ });
37
+ }
@@ -1,11 +0,0 @@
1
- import type { InitData } from './types.js';
2
- /**
3
- * Parser used to parse init data, presented as search params.
4
- * @deprecated Use `parse` method instead.
5
- */
6
- export declare const initData: import("@tma.js/parsing").ValueParser<InitData, false>;
7
- /**
8
- * Parses incoming value as init data.
9
- * @param value - value to parse.
10
- */
11
- export declare function parse(value: string | URLSearchParams): InitData;
package/src/parsing.ts DELETED
@@ -1,72 +0,0 @@
1
- import {
2
- searchParams,
3
- json,
4
- string,
5
- number,
6
- boolean,
7
- date,
8
- type AnyParser,
9
- } from '@tma.js/parsing';
10
-
11
- import type { InitData, User } from './types.js';
12
-
13
- function field<P extends AnyParser<any>>(parser: P, from?: string) {
14
- return {
15
- from,
16
- type: parser,
17
- };
18
- }
19
-
20
- const str = string();
21
- const strOptional = string().optional();
22
- const num = number();
23
- const numOptional = number().optional();
24
- const boolOptional = boolean().optional();
25
-
26
- function user() {
27
- return json<User>({
28
- firstName: field(str, 'first_name'),
29
- id: num,
30
- isBot: field(boolOptional, 'is_bot'),
31
- isPremium: field(boolOptional, 'is_premium'),
32
- lastName: field(strOptional, 'last_name'),
33
- languageCode: field(strOptional, 'language_code'),
34
- photoUrl: field(strOptional, 'photo_url'),
35
- username: strOptional,
36
- });
37
- }
38
-
39
- function chat() {
40
- return json({
41
- id: num,
42
- type: str,
43
- title: str,
44
- photoUrl: field(strOptional, 'photo_url'),
45
- username: strOptional,
46
- });
47
- }
48
-
49
- /**
50
- * Parser used to parse init data, presented as search params.
51
- * @deprecated Use `parse` method instead.
52
- */
53
- export const initData = searchParams<InitData>({
54
- authDate: field(date(), 'auth_date'),
55
- hash: str,
56
- user: user().optional(),
57
- receiver: user().optional(),
58
- chat: chat().optional(),
59
- chatType: field(strOptional, 'chat_type'),
60
- chatInstance: field(strOptional, 'chat_instance'),
61
- canSendAfter: field(numOptional, 'can_send_after'),
62
- queryId: field(strOptional, 'query_id'),
63
- startParam: field(strOptional, 'start_param'),
64
- });
65
-
66
- /**
67
- * Parses incoming value as init data.
68
- * @param value - value to parse.
69
- */
70
- export function parse(value: string | URLSearchParams): InitData {
71
- return initData.parse(value);
72
- }