@grom.js/tgx 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/Line.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import type { PropsWithChildren, TgxElement } from './types.ts';
2
+ /**
3
+ * Simple component that wraps its children in a fragment and adds a newline.
4
+ *
5
+ * Useful for creating multi-line messages.
6
+ *
7
+ * @example
8
+ * ```jsx
9
+ * import { Line } from '@grom.js/tgx'
10
+ *
11
+ * const Greeting = (props) => (
12
+ * <>
13
+ * <Line>Hello, <b>{props.name}</b>!</Line>
14
+ * <Line/>
15
+ * <Line><i>How are you doing?</i></Line>
16
+ * </>
17
+ * )
18
+ * ```
19
+ */
20
+ export declare function Line({ children }: PropsWithChildren): TgxElement;
package/dist/Line.js ADDED
@@ -0,0 +1,23 @@
1
+ import { Fragment } from "./jsx.js";
2
+ /**
3
+ * Simple component that wraps its children in a fragment and adds a newline.
4
+ *
5
+ * Useful for creating multi-line messages.
6
+ *
7
+ * @example
8
+ * ```jsx
9
+ * import { Line } from '@grom.js/tgx'
10
+ *
11
+ * const Greeting = (props) => (
12
+ * <>
13
+ * <Line>Hello, <b>{props.name}</b>!</Line>
14
+ * <Line/>
15
+ * <Line><i>How are you doing?</i></Line>
16
+ * </>
17
+ * )
18
+ * ```
19
+ */
20
+ export function Line({ children }) {
21
+ return Fragment({ children: [children, '\n'] });
22
+ }
23
+ //# sourceMappingURL=Line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Line.js","sourceRoot":"","sources":["../src/Line.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAAqB;IAClD,OAAO,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;AACjD,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './jsx.ts';
2
+ export { Line } from './Line.ts';
2
3
  export * from './render.ts';
3
4
  export * from './types.ts';
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./jsx.js";
2
+ export { Line } from "./Line.js";
2
3
  export * from "./render.js";
3
4
  export * from "./types.js";
4
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA"}
package/dist/jsx.js CHANGED
@@ -36,6 +36,7 @@ const INTRINSIC_ELEMENTS = new Set([
36
36
  'spoiler',
37
37
  'a',
38
38
  'emoji',
39
+ 'time',
39
40
  'code',
40
41
  'codeblock',
41
42
  'blockquote',
@@ -87,6 +88,12 @@ function createElementIntrinsic(options) {
87
88
  entity: { type: 'custom-emoji', id: options.props.id, alt: options.props.alt },
88
89
  subelements: [],
89
90
  };
91
+ case 'time':
92
+ return {
93
+ type: 'text',
94
+ entity: { type: 'date-time', unix: options.props.unix, format: options.props.format },
95
+ subelements: elementsFromNode(options.props.children ?? []),
96
+ };
90
97
  case 'code':
91
98
  return {
92
99
  type: 'text',
package/dist/jsx.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"jsx.js","sourceRoot":"","sources":["../src/jsx.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jsx.js","sourceRoot":"","sources":["../src/jsx.ts"],"names":[],"mappings":"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"}
package/dist/render.js CHANGED
@@ -24,6 +24,9 @@ function renderTextElement(el) {
24
24
  // TODO: Shouldn't we urlencode this?
25
25
  case 'link': return `<a href="${el.entity.url}">${renderHtml(el.subelements)}</a>`;
26
26
  case 'custom-emoji': return `<tg-emoji emoji-id="${el.entity.id}">${el.entity.alt}</tg-emoji>`;
27
+ case 'date-time': return (el.entity.format
28
+ ? `<tg-time unix="${el.entity.unix}" format="${el.entity.format}">${renderHtml(el.subelements)}</tg-time>`
29
+ : `<tg-time unix="${el.entity.unix}">${renderHtml(el.subelements)}</tg-time>`);
27
30
  case 'code': return `<code>${renderHtml(el.subelements)}</code>`;
28
31
  case 'codeblock': return (el.entity.language
29
32
  ? `<pre><code class="language-${el.entity.language}">${renderHtml(el.subelements)}</code></pre>`
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -48,6 +48,27 @@ export interface IntrinsicElements {
48
48
  */
49
49
  alt: string;
50
50
  };
51
+ /**
52
+ * Date and time.
53
+ *
54
+ * Recipients can tap it to add an event to their calendar or set
55
+ * a quick reminder. It also automatically adapts to each recipient's local
56
+ * date and time.
57
+ *
58
+ * @see https://telegram.org/blog/member-tags-disable-sharing-and-more#time-and-date-formatting
59
+ */
60
+ time: PropsWithChildren<{
61
+ /**
62
+ * Unix timestamp.
63
+ */
64
+ unix: number;
65
+ /**
66
+ * Specifies how the date and time should be formatted.
67
+ *
68
+ * @see https://core.telegram.org/bots/api#date-time-entity-formatting
69
+ */
70
+ format?: 'r' | `${'w' | ''}${'d' | 'D' | ''}${'t' | 'T' | ''}`;
71
+ }>;
51
72
  /**
52
73
  * Inline fixed-width code.
53
74
  */
@@ -106,6 +127,10 @@ export type TextEntity = {
106
127
  type: 'custom-emoji';
107
128
  id: string;
108
129
  alt: string;
130
+ } | {
131
+ type: 'date-time';
132
+ unix: number;
133
+ format?: string;
109
134
  } | {
110
135
  type: 'code';
111
136
  } | {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@grom.js/tgx",
3
3
  "type": "module",
4
- "version": "1.0.0",
4
+ "version": "1.2.0",
5
5
  "description": "JSX runtime for composing Telegram messages",
6
6
  "author": {
7
7
  "name": "Vladislav Deryabkin",
@@ -38,14 +38,14 @@
38
38
  "node": "22.x"
39
39
  },
40
40
  "devDependencies": {
41
- "@antfu/eslint-config": "6.2.0",
42
- "@types/node": "22.19.1",
43
- "@vitest/coverage-v8": "4.0.10",
44
- "bumpp": "10.3.1",
45
- "eslint": "9.39.1",
46
- "eslint-plugin-format": "1.0.2",
47
- "taze": "19.9.0",
48
- "vitest": "4.0.10"
41
+ "@antfu/eslint-config": "7.4.3",
42
+ "@types/node": "22.19.11",
43
+ "@vitest/coverage-v8": "4.0.18",
44
+ "bumpp": "10.4.1",
45
+ "eslint": "9.39.2",
46
+ "eslint-plugin-format": "1.4.0",
47
+ "taze": "19.9.2",
48
+ "vitest": "4.0.18"
49
49
  },
50
50
  "scripts": {
51
51
  "build": "rm -rf ./dist/ && tsc --project ./tsconfig.lib.json",
package/src/Line.ts ADDED
@@ -0,0 +1,24 @@
1
+ import type { PropsWithChildren, TgxElement } from './types.ts'
2
+ import { Fragment } from './jsx.ts'
3
+
4
+ /**
5
+ * Simple component that wraps its children in a fragment and adds a newline.
6
+ *
7
+ * Useful for creating multi-line messages.
8
+ *
9
+ * @example
10
+ * ```jsx
11
+ * import { Line } from '@grom.js/tgx'
12
+ *
13
+ * const Greeting = (props) => (
14
+ * <>
15
+ * <Line>Hello, <b>{props.name}</b>!</Line>
16
+ * <Line/>
17
+ * <Line><i>How are you doing?</i></Line>
18
+ * </>
19
+ * )
20
+ * ```
21
+ */
22
+ export function Line({ children }: PropsWithChildren): TgxElement {
23
+ return Fragment({ children: [children, '\n'] })
24
+ }
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './jsx.ts'
2
+ export { Line } from './Line.ts'
2
3
  export * from './render.ts'
3
4
  export * from './types.ts'
package/src/jsx.ts CHANGED
@@ -66,6 +66,7 @@ const INTRINSIC_ELEMENTS = new Set([
66
66
  'spoiler',
67
67
  'a',
68
68
  'emoji',
69
+ 'time',
69
70
  'code',
70
71
  'codeblock',
71
72
  'blockquote',
@@ -126,6 +127,12 @@ function createElementIntrinsic(
126
127
  entity: { type: 'custom-emoji', id: options.props.id, alt: options.props.alt },
127
128
  subelements: [],
128
129
  }
130
+ case 'time':
131
+ return {
132
+ type: 'text',
133
+ entity: { type: 'date-time', unix: options.props.unix, format: options.props.format },
134
+ subelements: elementsFromNode(options.props.children ?? []),
135
+ }
129
136
  case 'code':
130
137
  return {
131
138
  type: 'text',
package/src/render.ts CHANGED
@@ -29,6 +29,13 @@ function renderTextElement(el: TgxElementText): string {
29
29
  case 'link': return `<a href="${el.entity.url}">${renderHtml(el.subelements)}</a>`
30
30
 
31
31
  case 'custom-emoji': return `<tg-emoji emoji-id="${el.entity.id}">${el.entity.alt}</tg-emoji>`
32
+
33
+ case 'date-time': return (
34
+ el.entity.format
35
+ ? `<tg-time unix="${el.entity.unix}" format="${el.entity.format}">${renderHtml(el.subelements)}</tg-time>`
36
+ : `<tg-time unix="${el.entity.unix}">${renderHtml(el.subelements)}</tg-time>`
37
+ )
38
+
32
39
  case 'code': return `<code>${renderHtml(el.subelements)}</code>`
33
40
 
34
41
  case 'codeblock': return (
package/src/types.ts CHANGED
@@ -56,6 +56,29 @@ export interface IntrinsicElements {
56
56
  alt: string
57
57
  }
58
58
 
59
+ /**
60
+ * Date and time.
61
+ *
62
+ * Recipients can tap it to add an event to their calendar or set
63
+ * a quick reminder. It also automatically adapts to each recipient's local
64
+ * date and time.
65
+ *
66
+ * @see https://telegram.org/blog/member-tags-disable-sharing-and-more#time-and-date-formatting
67
+ */
68
+ time: PropsWithChildren<{
69
+ /**
70
+ * Unix timestamp.
71
+ */
72
+ unix: number
73
+
74
+ /**
75
+ * Specifies how the date and time should be formatted.
76
+ *
77
+ * @see https://core.telegram.org/bots/api#date-time-entity-formatting
78
+ */
79
+ format?: 'r' | `${'w' | ''}${'d' | 'D' | ''}${'t' | 'T' | ''}`
80
+ }>
81
+
59
82
  /**
60
83
  * Inline fixed-width code.
61
84
  */
@@ -515,6 +538,7 @@ export type TextEntity
515
538
  | { type: 'spoiler' }
516
539
  | { type: 'link', url: string }
517
540
  | { type: 'custom-emoji', id: string, alt: string }
541
+ | { type: 'date-time', unix: number, format?: string }
518
542
  | { type: 'code' }
519
543
  | { type: 'codeblock', language?: string }
520
544
  | { type: 'blockquote', expandable: boolean }