@windrun-huaiin/lib 6.2.0 → 7.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.
package/dist/llm-utils.js DELETED
@@ -1,73 +0,0 @@
1
- 'use strict';
2
-
3
- var remark = require('remark');
4
- var remarkGfm = require('remark-gfm');
5
- var remarkMdx = require('remark-mdx');
6
- var remarkFrontmatter = require('remark-frontmatter');
7
- var unistUtilVisit = require('unist-util-visit');
8
-
9
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
-
11
- var remarkGfm__default = /*#__PURE__*/_interopDefault(remarkGfm);
12
- var remarkMdx__default = /*#__PURE__*/_interopDefault(remarkMdx);
13
- var remarkFrontmatter__default = /*#__PURE__*/_interopDefault(remarkFrontmatter);
14
-
15
- var __async = (__this, __arguments, generator) => {
16
- return new Promise((resolve, reject) => {
17
- var fulfilled = (value) => {
18
- try {
19
- step(generator.next(value));
20
- } catch (e) {
21
- reject(e);
22
- }
23
- };
24
- var rejected = (value) => {
25
- try {
26
- step(generator.throw(value));
27
- } catch (e) {
28
- reject(e);
29
- }
30
- };
31
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
32
- step((generator = generator.apply(__this, __arguments)).next());
33
- });
34
- };
35
- function remarkRemoveFrontmatter() {
36
- return (tree) => {
37
- unistUtilVisit.visit(tree, "yaml", (_node, index, parent) => {
38
- if (parent && typeof index === "number") {
39
- parent.children.splice(index, 1);
40
- }
41
- });
42
- };
43
- }
44
- var processor = remark.remark().use(remarkFrontmatter__default.default, ["yaml"]).use(remarkRemoveFrontmatter).use(remarkMdx__default.default).use(remarkGfm__default.default);
45
- function getLLMText(mdxContent, title, description) {
46
- return __async(this, null, function* () {
47
- if (typeof mdxContent !== "string") {
48
- console.error("getLLMText: mdxContent received was not a string. Type:", typeof mdxContent);
49
- return `# Error
50
-
51
- Invalid content received by text processor.`;
52
- }
53
- try {
54
- const processed = yield processor.process(mdxContent);
55
- const contentWithoutFrontmatter = processed.value;
56
- const markdownParts = [
57
- title ? `# ${title}` : null,
58
- description,
59
- contentWithoutFrontmatter.trim()
60
- ];
61
- return markdownParts.filter((part) => part != null).join("\n\n");
62
- } catch (processingError) {
63
- console.error("Error during remark processing in getLLMText:", processingError);
64
- return `# Error
65
-
66
- Error processing MDX content.`;
67
- }
68
- });
69
- }
70
-
71
- exports.getLLMText = getLLMText;
72
- //# sourceMappingURL=llm-utils.js.map
73
- //# sourceMappingURL=llm-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/llm-utils.ts"],"names":["visit","remark","remarkFrontmatter","remarkMdx","remarkGfm"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,SAAS,uBAAA,GAA0B;AAEjC,EAAA,OAAO,CAAC,IAAA,KAAc;AACpB,IAAAA,oBAAA,CAAM,IAAA,EAAM,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAO,MAAA,KAAW;AAC5C,MAAA,IAAI,MAAA,IAAU,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,QAAA,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,MACjC;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AAKA,IAAM,YAAYC,aAAA,EAAO,CAEtB,GAAA,CAAIC,kCAAA,EAAmB,CAAC,MAAM,CAAC,CAAA,CAE/B,GAAA,CAAI,uBAAuB,CAAA,CAC3B,GAAA,CAAIC,0BAAS,CAAA,CACb,IAAIC,0BAAS,CAAA;AAEhB,SAAsB,UAAA,CAAW,UAAA,EAAoB,KAAA,EAAgB,WAAA,EAAsB;AAAA,EAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACzF,IAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,MAAA,OAAA,CAAQ,KAAA,CAAM,yDAAA,EAA2D,OAAO,UAAU,CAAA;AAC1F,MAAA,OAAO,CAAA;;AAAA,2CAAA,CAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,SAAA,CAAU,OAAA,CAAQ,UAAU,CAAA;AACpD,MAAA,MAAM,4BAA4B,SAAA,CAAU,KAAA;AAE5C,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,KAAA,GAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,GAAK,IAAA;AAAA,QACvB,WAAA;AAAA,QACA,0BAA0B,IAAA;AAAK,OACjC;AAEA,MAAA,OAAO,cAAc,MAAA,CAAO,CAAA,IAAA,KAAQ,QAAQ,IAAI,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,IAC/D,SAAS,eAAA,EAAiB;AACxB,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,eAAe,CAAA;AAC9E,MAAA,OAAO,CAAA;;AAAA,6BAAA,CAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA;AAAA","file":"llm-utils.js","sourcesContent":["import { remark } from 'remark';\nimport remarkGfm from 'remark-gfm';\nimport remarkMdx from 'remark-mdx';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport { visit } from 'unist-util-visit';\n\nfunction remarkRemoveFrontmatter() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (tree: any) => {\n visit(tree, 'yaml', (_node, index, parent) => {\n if (parent && typeof index === 'number') {\n parent.children.splice(index, 1);\n }\n });\n };\n}\n\n// remark(), parse the MDX file into MDAST\n// remarkPlugins(), parse the MDAST into HAST\n// rehypePlugins(), render the HAST into React components, i.e. HTML code\nconst processor = remark()\n // parse the md file header\n .use(remarkFrontmatter, ['yaml'])\n // remove the md file header\n .use(remarkRemoveFrontmatter)\n .use(remarkMdx)\n .use(remarkGfm);\n\nexport async function getLLMText(mdxContent: string, title?: string, description?: string) {\n if (typeof mdxContent !== 'string') {\n console.error('getLLMText: mdxContent received was not a string. Type:', typeof mdxContent);\n return `# Error\\n\\nInvalid content received by text processor.`;\n }\n\n try {\n const processed = await processor.process(mdxContent);\n const contentWithoutFrontmatter = processed.value as string;\n\n const markdownParts = [\n title ? `# ${title}` : null,\n description,\n contentWithoutFrontmatter.trim()\n ];\n\n return markdownParts.filter(part => part != null).join('\\n\\n');\n } catch (processingError) {\n console.error('Error during remark processing in getLLMText:', processingError);\n return `# Error\\n\\nError processing MDX content.`;\n }\n} "]}
@@ -1,65 +0,0 @@
1
- import { remark } from 'remark';
2
- import remarkGfm from 'remark-gfm';
3
- import remarkMdx from 'remark-mdx';
4
- import remarkFrontmatter from 'remark-frontmatter';
5
- import { visit } from 'unist-util-visit';
6
-
7
- var __async = (__this, __arguments, generator) => {
8
- return new Promise((resolve, reject) => {
9
- var fulfilled = (value) => {
10
- try {
11
- step(generator.next(value));
12
- } catch (e) {
13
- reject(e);
14
- }
15
- };
16
- var rejected = (value) => {
17
- try {
18
- step(generator.throw(value));
19
- } catch (e) {
20
- reject(e);
21
- }
22
- };
23
- var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
24
- step((generator = generator.apply(__this, __arguments)).next());
25
- });
26
- };
27
- function remarkRemoveFrontmatter() {
28
- return (tree) => {
29
- visit(tree, "yaml", (_node, index, parent) => {
30
- if (parent && typeof index === "number") {
31
- parent.children.splice(index, 1);
32
- }
33
- });
34
- };
35
- }
36
- var processor = remark().use(remarkFrontmatter, ["yaml"]).use(remarkRemoveFrontmatter).use(remarkMdx).use(remarkGfm);
37
- function getLLMText(mdxContent, title, description) {
38
- return __async(this, null, function* () {
39
- if (typeof mdxContent !== "string") {
40
- console.error("getLLMText: mdxContent received was not a string. Type:", typeof mdxContent);
41
- return `# Error
42
-
43
- Invalid content received by text processor.`;
44
- }
45
- try {
46
- const processed = yield processor.process(mdxContent);
47
- const contentWithoutFrontmatter = processed.value;
48
- const markdownParts = [
49
- title ? `# ${title}` : null,
50
- description,
51
- contentWithoutFrontmatter.trim()
52
- ];
53
- return markdownParts.filter((part) => part != null).join("\n\n");
54
- } catch (processingError) {
55
- console.error("Error during remark processing in getLLMText:", processingError);
56
- return `# Error
57
-
58
- Error processing MDX content.`;
59
- }
60
- });
61
- }
62
-
63
- export { getLLMText };
64
- //# sourceMappingURL=llm-utils.mjs.map
65
- //# sourceMappingURL=llm-utils.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/llm-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,SAAS,uBAAA,GAA0B;AAEjC,EAAA,OAAO,CAAC,IAAA,KAAc;AACpB,IAAA,KAAA,CAAM,IAAA,EAAM,MAAA,EAAQ,CAAC,KAAA,EAAO,OAAO,MAAA,KAAW;AAC5C,MAAA,IAAI,MAAA,IAAU,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,QAAA,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,MACjC;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA;AACF;AAKA,IAAM,YAAY,MAAA,EAAO,CAEtB,GAAA,CAAI,iBAAA,EAAmB,CAAC,MAAM,CAAC,CAAA,CAE/B,GAAA,CAAI,uBAAuB,CAAA,CAC3B,GAAA,CAAI,SAAS,CAAA,CACb,IAAI,SAAS,CAAA;AAEhB,SAAsB,UAAA,CAAW,UAAA,EAAoB,KAAA,EAAgB,WAAA,EAAsB;AAAA,EAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACzF,IAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,MAAA,OAAA,CAAQ,KAAA,CAAM,yDAAA,EAA2D,OAAO,UAAU,CAAA;AAC1F,MAAA,OAAO,CAAA;;AAAA,2CAAA,CAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,SAAA,CAAU,OAAA,CAAQ,UAAU,CAAA;AACpD,MAAA,MAAM,4BAA4B,SAAA,CAAU,KAAA;AAE5C,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,KAAA,GAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,GAAK,IAAA;AAAA,QACvB,WAAA;AAAA,QACA,0BAA0B,IAAA;AAAK,OACjC;AAEA,MAAA,OAAO,cAAc,MAAA,CAAO,CAAA,IAAA,KAAQ,QAAQ,IAAI,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,IAC/D,SAAS,eAAA,EAAiB;AACxB,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,eAAe,CAAA;AAC9E,MAAA,OAAO,CAAA;;AAAA,6BAAA,CAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA;AAAA","file":"llm-utils.mjs","sourcesContent":["import { remark } from 'remark';\nimport remarkGfm from 'remark-gfm';\nimport remarkMdx from 'remark-mdx';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport { visit } from 'unist-util-visit';\n\nfunction remarkRemoveFrontmatter() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (tree: any) => {\n visit(tree, 'yaml', (_node, index, parent) => {\n if (parent && typeof index === 'number') {\n parent.children.splice(index, 1);\n }\n });\n };\n}\n\n// remark(), parse the MDX file into MDAST\n// remarkPlugins(), parse the MDAST into HAST\n// rehypePlugins(), render the HAST into React components, i.e. HTML code\nconst processor = remark()\n // parse the md file header\n .use(remarkFrontmatter, ['yaml'])\n // remove the md file header\n .use(remarkRemoveFrontmatter)\n .use(remarkMdx)\n .use(remarkGfm);\n\nexport async function getLLMText(mdxContent: string, title?: string, description?: string) {\n if (typeof mdxContent !== 'string') {\n console.error('getLLMText: mdxContent received was not a string. Type:', typeof mdxContent);\n return `# Error\\n\\nInvalid content received by text processor.`;\n }\n\n try {\n const processed = await processor.process(mdxContent);\n const contentWithoutFrontmatter = processed.value as string;\n\n const markdownParts = [\n title ? `# ${title}` : null,\n description,\n contentWithoutFrontmatter.trim()\n ];\n\n return markdownParts.filter(part => part != null).join('\\n\\n');\n } catch (processingError) {\n console.error('Error during remark processing in getLLMText:', processingError);\n return `# Error\\n\\nError processing MDX content.`;\n }\n} "]}
package/dist/utils.d.mts DELETED
@@ -1,8 +0,0 @@
1
- import * as React from 'react';
2
- import { ClassValue } from 'clsx';
3
-
4
- declare function cn(...inputs: ClassValue[]): string;
5
- declare function formatTimestamp(timestamp: string, formatter: string): string;
6
- declare function handlePastePlainText(e: React.ClipboardEvent<HTMLElement>): void;
7
-
8
- export { cn, formatTimestamp, handlePastePlainText };
package/dist/utils.d.ts DELETED
@@ -1,8 +0,0 @@
1
- import * as React from 'react';
2
- import { ClassValue } from 'clsx';
3
-
4
- declare function cn(...inputs: ClassValue[]): string;
5
- declare function formatTimestamp(timestamp: string, formatter: string): string;
6
- declare function handlePastePlainText(e: React.ClipboardEvent<HTMLElement>): void;
7
-
8
- export { cn, formatTimestamp, handlePastePlainText };
package/dist/utils.js DELETED
@@ -1,50 +0,0 @@
1
- 'use strict';
2
-
3
- var clsx = require('clsx');
4
- var tailwindMerge = require('tailwind-merge');
5
- var dateFns = require('date-fns');
6
-
7
- // src/utils.ts
8
- function cn(...inputs) {
9
- return tailwindMerge.twMerge(clsx.clsx(inputs));
10
- }
11
- function formatTimestamp(timestamp, formatter) {
12
- const fail = "";
13
- if (!timestamp) {
14
- return fail;
15
- }
16
- const timestampMs = parseInt(timestamp, 10);
17
- if (isNaN(timestampMs)) {
18
- return fail;
19
- }
20
- const date = new Date(timestampMs);
21
- if (!dateFns.isValid(date)) {
22
- return fail;
23
- }
24
- try {
25
- return dateFns.format(date, formatter);
26
- } catch (error) {
27
- console.error("Error formatting date:", error);
28
- return fail;
29
- }
30
- }
31
- function handlePastePlainText(e) {
32
- e.preventDefault();
33
- const text = e.clipboardData.getData("text/plain");
34
- const selection = window.getSelection();
35
- if (!selection || !selection.rangeCount) return;
36
- selection.deleteFromDocument();
37
- const textNode = document.createTextNode(text);
38
- const range = selection.getRangeAt(0);
39
- range.insertNode(textNode);
40
- range.setStartAfter(textNode);
41
- range.collapse(true);
42
- selection.removeAllRanges();
43
- selection.addRange(range);
44
- }
45
-
46
- exports.cn = cn;
47
- exports.formatTimestamp = formatTimestamp;
48
- exports.handlePastePlainText = handlePastePlainText;
49
- //# sourceMappingURL=utils.js.map
50
- //# sourceMappingURL=utils.js.map
package/dist/utils.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils.ts"],"names":["twMerge","clsx","isValid","format"],"mappings":";;;;;;;AAKO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;AAEO,SAAS,eAAA,CAAgB,WAAmB,SAAA,EAAmB;AACpE,EAAA,MAAM,IAAA,GAAO,EAAA;AACb,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,SAAA,EAAW,EAAE,CAAA;AAC1C,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,IAAA;AAAA,EACV;AAEA,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,WAAW,CAAA;AAGjC,EAAA,IAAI,CAACC,eAAA,CAAQ,IAAI,CAAA,EAAG;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI;AAED,IAAA,OAAOC,cAAA,CAAO,MAAM,SAAS,CAAA;AAAA,EAChC,SAAS,KAAA,EAAO;AAEb,IAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,IAAA,OAAO,IAAA;AAAA,EACV;AACF;AAGO,SAAS,qBAAqB,CAAA,EAAsC;AACzE,EAAA,CAAA,CAAE,cAAA,EAAe;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,aAAA,CAAc,OAAA,CAAQ,YAAY,CAAA;AACjD,EAAA,MAAM,SAAA,GAAY,OAAO,YAAA,EAAa;AACtC,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,CAAU,UAAA,EAAY;AAEzC,EAAA,SAAA,CAAU,kBAAA,EAAmB;AAE7B,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,cAAA,CAAe,IAAI,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,UAAA,CAAW,CAAC,CAAA;AACpC,EAAA,KAAA,CAAM,WAAW,QAAQ,CAAA;AAEzB,EAAA,KAAA,CAAM,cAAc,QAAQ,CAAA;AAC5B,EAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACnB,EAAA,SAAA,CAAU,eAAA,EAAgB;AAC1B,EAAA,SAAA,CAAU,SAAS,KAAK,CAAA;AAC1B","file":"utils.js","sourcesContent":["import type * as React from \"react\";\nimport { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport { format, isValid } from 'date-fns';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function formatTimestamp(timestamp: string, formatter: string) {\n const fail = \"\";\n if (!timestamp) {\n return fail;\n }\n\n // Assume gitTimestamp is a millisecond timestamp string\n const timestampMs = parseInt(timestamp, 10);\n if (isNaN(timestampMs)) {\n return fail;\n }\n\n const date = new Date(timestampMs); // or if it is determined to be seconds, use fromUnixTime(timestampSeconds)\n\n // Check if the date is valid\n if (!isValid(date)) {\n return fail;\n }\n\n // Format the date\n try {\n // 'yyyy-MM-dd HH:mm:ss' is the date-fns formatting pattern\n return format(date, formatter);\n } catch (error) {\n // format may also throw an error due to an invalid date (although isValid should have already caught it)\n console.error(\"Error formatting date:\", error);\n return fail;\n }\n} \n\n// Only allow pasting plain text, prohibit style content\nexport function handlePastePlainText(e: React.ClipboardEvent<HTMLElement>) {\n e.preventDefault();\n const text = e.clipboardData.getData('text/plain');\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount) return;\n // Delete the current selected content\n selection.deleteFromDocument();\n // Insert plain text\n const textNode = document.createTextNode(text);\n const range = selection.getRangeAt(0);\n range.insertNode(textNode);\n // Move the cursor to the inserted text\n range.setStartAfter(textNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}"]}
package/dist/utils.mjs DELETED
@@ -1,46 +0,0 @@
1
- import { clsx } from 'clsx';
2
- import { twMerge } from 'tailwind-merge';
3
- import { isValid, format } from 'date-fns';
4
-
5
- // src/utils.ts
6
- function cn(...inputs) {
7
- return twMerge(clsx(inputs));
8
- }
9
- function formatTimestamp(timestamp, formatter) {
10
- const fail = "";
11
- if (!timestamp) {
12
- return fail;
13
- }
14
- const timestampMs = parseInt(timestamp, 10);
15
- if (isNaN(timestampMs)) {
16
- return fail;
17
- }
18
- const date = new Date(timestampMs);
19
- if (!isValid(date)) {
20
- return fail;
21
- }
22
- try {
23
- return format(date, formatter);
24
- } catch (error) {
25
- console.error("Error formatting date:", error);
26
- return fail;
27
- }
28
- }
29
- function handlePastePlainText(e) {
30
- e.preventDefault();
31
- const text = e.clipboardData.getData("text/plain");
32
- const selection = window.getSelection();
33
- if (!selection || !selection.rangeCount) return;
34
- selection.deleteFromDocument();
35
- const textNode = document.createTextNode(text);
36
- const range = selection.getRangeAt(0);
37
- range.insertNode(textNode);
38
- range.setStartAfter(textNode);
39
- range.collapse(true);
40
- selection.removeAllRanges();
41
- selection.addRange(range);
42
- }
43
-
44
- export { cn, formatTimestamp, handlePastePlainText };
45
- //# sourceMappingURL=utils.mjs.map
46
- //# sourceMappingURL=utils.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils.ts"],"names":[],"mappings":";;;;;AAKO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;AAEO,SAAS,eAAA,CAAgB,WAAmB,SAAA,EAAmB;AACpE,EAAA,MAAM,IAAA,GAAO,EAAA;AACb,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,SAAA,EAAW,EAAE,CAAA;AAC1C,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,IAAA;AAAA,EACV;AAEA,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,WAAW,CAAA;AAGjC,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAI,CAAA,EAAG;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI;AAED,IAAA,OAAO,MAAA,CAAO,MAAM,SAAS,CAAA;AAAA,EAChC,SAAS,KAAA,EAAO;AAEb,IAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,IAAA,OAAO,IAAA;AAAA,EACV;AACF;AAGO,SAAS,qBAAqB,CAAA,EAAsC;AACzE,EAAA,CAAA,CAAE,cAAA,EAAe;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,aAAA,CAAc,OAAA,CAAQ,YAAY,CAAA;AACjD,EAAA,MAAM,SAAA,GAAY,OAAO,YAAA,EAAa;AACtC,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,CAAU,UAAA,EAAY;AAEzC,EAAA,SAAA,CAAU,kBAAA,EAAmB;AAE7B,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,cAAA,CAAe,IAAI,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,UAAA,CAAW,CAAC,CAAA;AACpC,EAAA,KAAA,CAAM,WAAW,QAAQ,CAAA;AAEzB,EAAA,KAAA,CAAM,cAAc,QAAQ,CAAA;AAC5B,EAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACnB,EAAA,SAAA,CAAU,eAAA,EAAgB;AAC1B,EAAA,SAAA,CAAU,SAAS,KAAK,CAAA;AAC1B","file":"utils.mjs","sourcesContent":["import type * as React from \"react\";\nimport { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport { format, isValid } from 'date-fns';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function formatTimestamp(timestamp: string, formatter: string) {\n const fail = \"\";\n if (!timestamp) {\n return fail;\n }\n\n // Assume gitTimestamp is a millisecond timestamp string\n const timestampMs = parseInt(timestamp, 10);\n if (isNaN(timestampMs)) {\n return fail;\n }\n\n const date = new Date(timestampMs); // or if it is determined to be seconds, use fromUnixTime(timestampSeconds)\n\n // Check if the date is valid\n if (!isValid(date)) {\n return fail;\n }\n\n // Format the date\n try {\n // 'yyyy-MM-dd HH:mm:ss' is the date-fns formatting pattern\n return format(date, formatter);\n } catch (error) {\n // format may also throw an error due to an invalid date (although isValid should have already caught it)\n console.error(\"Error formatting date:\", error);\n return fail;\n }\n} \n\n// Only allow pasting plain text, prohibit style content\nexport function handlePastePlainText(e: React.ClipboardEvent<HTMLElement>) {\n e.preventDefault();\n const text = e.clipboardData.getData('text/plain');\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount) return;\n // Delete the current selected content\n selection.deleteFromDocument();\n // Insert plain text\n const textNode = document.createTextNode(text);\n const range = selection.getRangeAt(0);\n range.insertNode(textNode);\n // Move the cursor to the inserted text\n range.setStartAfter(textNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}"]}