@copilotkit/react-textarea 0.25.0 → 0.26.0-alpha.1
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/.turbo/turbo-build.log +313 -309
- package/CHANGELOG.md +22 -0
- package/dist/components/base-copilot-textarea/base-copilot-textarea.d.ts +29 -0
- package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs +1745 -35
- package/dist/components/base-copilot-textarea/base-copilot-textarea.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/render-element.mjs +51 -3
- package/dist/components/base-copilot-textarea/render-element.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/render-placeholder.mjs +49 -3
- package/dist/components/base-copilot-textarea/render-placeholder.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs +86 -4
- package/dist/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.mjs.map +1 -1
- package/dist/components/base-copilot-textarea/use-add-branding-css.mjs +57 -3
- package/dist/components/base-copilot-textarea/use-add-branding-css.mjs.map +1 -1
- package/dist/components/copilot-textarea/copilot-textarea.d.ts +3 -0
- package/dist/components/copilot-textarea/copilot-textarea.mjs +2202 -47
- package/dist/components/copilot-textarea/copilot-textarea.mjs.map +1 -1
- package/dist/components/hovering-toolbar/hovering-editor-provider.d.ts +7 -3
- package/dist/components/hovering-toolbar/hovering-editor-provider.mjs +17 -3
- package/dist/components/hovering-toolbar/hovering-editor-provider.mjs.map +1 -1
- package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs +137 -3
- package/dist/components/hovering-toolbar/hovering-toolbar-components.mjs.map +1 -1
- package/dist/components/hovering-toolbar/hovering-toolbar.mjs +875 -18
- package/dist/components/hovering-toolbar/hovering-toolbar.mjs.map +1 -1
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs +558 -12
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box-core.mjs.map +1 -1
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs +581 -13
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/hovering-insertion-prompt-box.mjs.map +1 -1
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs +102 -5
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/included-files-preview.mjs.map +1 -1
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs +581 -14
- package/dist/components/hovering-toolbar/text-insertion-prompt-box/index.mjs.map +1 -1
- package/dist/components/index.mjs +2203 -48
- package/dist/components/index.mjs.map +1 -1
- package/dist/components/manual-ui/chip-with-icon.mjs +10 -22
- package/dist/components/manual-ui/chip-with-icon.mjs.map +1 -1
- package/dist/components/source-search-box/source-search-box.mjs +211 -6
- package/dist/components/source-search-box/source-search-box.mjs.map +1 -1
- package/dist/components/ui/button.mjs +85 -4
- package/dist/components/ui/button.mjs.map +1 -1
- package/dist/components/ui/card.mjs +71 -31
- package/dist/components/ui/card.mjs.map +1 -1
- package/dist/components/ui/command.mjs +244 -5
- package/dist/components/ui/command.mjs.map +1 -1
- package/dist/components/ui/dialog.mjs +144 -4
- package/dist/components/ui/dialog.mjs.map +1 -1
- package/dist/components/ui/label.mjs +60 -4
- package/dist/components/ui/label.mjs.map +1 -1
- package/dist/components/ui/separator.mjs +63 -18
- package/dist/components/ui/separator.mjs.map +1 -1
- package/dist/components/ui/textarea.mjs +58 -14
- package/dist/components/ui/textarea.mjs.map +1 -1
- package/dist/context/index.d.ts +1 -0
- package/dist/context/index.mjs +0 -2
- package/dist/context/index.mjs.map +1 -1
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs +158 -6
- package/dist/hooks/base-copilot-textarea-implementation/use-autosuggestions.mjs.map +1 -1
- package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs +168 -4
- package/dist/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.mjs.map +1 -1
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs +148 -5
- package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.mjs +0 -2
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs +147 -14
- package/dist/hooks/make-autosuggestions-function/use-make-standard-autosuggestions-function.mjs.map +1 -1
- package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs +193 -14
- package/dist/hooks/make-autosuggestions-function/use-make-standard-insertion-function.mjs.map +1 -1
- package/dist/hooks/misc/use-autosize-textarea.mjs +15 -3
- package/dist/hooks/misc/use-autosize-textarea.mjs.map +1 -1
- package/dist/index.mjs +2206 -50
- package/dist/index.mjs.map +1 -1
- package/dist/lib/debouncer.mjs +51 -3
- package/dist/lib/debouncer.mjs.map +1 -1
- package/dist/lib/editor-to-text.mjs +43 -3
- package/dist/lib/editor-to-text.mjs.map +1 -1
- package/dist/lib/get-text-around-cursor.mjs +102 -3
- package/dist/lib/get-text-around-cursor.mjs.map +1 -1
- package/dist/lib/retry.mjs +17 -3
- package/dist/lib/retry.mjs.map +1 -1
- package/dist/lib/slatejs-edits/add-autocompletions.mjs +25 -3
- package/dist/lib/slatejs-edits/add-autocompletions.mjs.map +1 -1
- package/dist/lib/slatejs-edits/clear-autocompletions.mjs +20 -3
- package/dist/lib/slatejs-edits/clear-autocompletions.mjs.map +1 -1
- package/dist/lib/slatejs-edits/replace-text.mjs +27 -3
- package/dist/lib/slatejs-edits/replace-text.mjs.map +1 -1
- package/dist/lib/slatejs-edits/with-partial-history.mjs +106 -3
- package/dist/lib/slatejs-edits/with-partial-history.mjs.map +1 -1
- package/dist/lib/stream-promise-flatten.mjs +47 -3
- package/dist/lib/stream-promise-flatten.mjs.map +1 -1
- package/dist/lib/utils.mjs +71 -3
- package/dist/lib/utils.mjs.map +1 -1
- package/dist/lib/utils.test.d.ts +1 -0
- package/dist/lib/utils.test.mjs +0 -1
- package/dist/lib/utils.test.mjs.map +1 -1
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs +0 -2
- package/dist/types/autosuggestions-config/autosuggestions-config-user-specified.mjs.map +1 -1
- package/dist/types/autosuggestions-config/autosuggestions-config.mjs +265 -8
- package/dist/types/autosuggestions-config/autosuggestions-config.mjs.map +1 -1
- package/dist/types/autosuggestions-config/editing-api-config.mjs +81 -3
- package/dist/types/autosuggestions-config/editing-api-config.mjs.map +1 -1
- package/dist/types/autosuggestions-config/index.mjs +327 -10
- package/dist/types/autosuggestions-config/index.mjs.map +1 -1
- package/dist/types/autosuggestions-config/insertions-api-config.mjs +75 -3
- package/dist/types/autosuggestions-config/insertions-api-config.mjs.map +1 -1
- package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs +83 -3
- package/dist/types/autosuggestions-config/subtypes/chatlike-api-endpoint.mjs.map +1 -1
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs +0 -2
- package/dist/types/autosuggestions-config/subtypes/make-system-prompt.mjs.map +1 -1
- package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs +0 -2
- package/dist/types/autosuggestions-config/subtypes/minimal-chat-gpt-message.mjs.map +1 -1
- package/dist/types/autosuggestions-config/suggestions-api-config.mjs +64 -3
- package/dist/types/autosuggestions-config/suggestions-api-config.mjs.map +1 -1
- package/dist/types/base/autosuggestion-state.mjs +0 -2
- package/dist/types/base/autosuggestion-state.mjs.map +1 -1
- package/dist/types/base/autosuggestions-bare-function.mjs +0 -2
- package/dist/types/base/autosuggestions-bare-function.mjs.map +1 -1
- package/dist/types/base/base-autosuggestions-config.mjs +26 -3
- package/dist/types/base/base-autosuggestions-config.mjs.map +1 -1
- package/dist/types/base/base-copilot-textarea-props.mjs +0 -2
- package/dist/types/base/base-copilot-textarea-props.mjs.map +1 -1
- package/dist/types/base/custom-editor.mjs +0 -2
- package/dist/types/base/custom-editor.mjs.map +1 -1
- package/dist/types/base/editor-autocomplete-state.mjs +17 -4
- package/dist/types/base/editor-autocomplete-state.mjs.map +1 -1
- package/dist/types/base/index.mjs +26 -4
- package/dist/types/base/index.mjs.map +1 -1
- package/dist/types/html-copilot-textarea-element.mjs +0 -2
- package/dist/types/html-copilot-textarea-element.mjs.map +1 -1
- package/dist/types/index.mjs +328 -12
- package/dist/types/index.mjs.map +1 -1
- package/package.json +6 -6
- package/src/components/base-copilot-textarea/base-copilot-textarea.tsx +50 -10
- package/src/components/base-copilot-textarea/track-cursor-moved-since-last-text-change.tsx +23 -1
- package/src/components/copilot-textarea/copilot-textarea.tsx +3 -0
- package/src/components/hovering-toolbar/hovering-editor-provider.tsx +7 -3
- package/dist/chunk-2C7O2EVM.mjs +0 -27
- package/dist/chunk-2C7O2EVM.mjs.map +0 -1
- package/dist/chunk-2CDXHWVF.mjs +0 -107
- package/dist/chunk-2CDXHWVF.mjs.map +0 -1
- package/dist/chunk-2QDCE7PD.mjs +0 -29
- package/dist/chunk-2QDCE7PD.mjs.map +0 -1
- package/dist/chunk-3PQ7GSFE.mjs +0 -17
- package/dist/chunk-3PQ7GSFE.mjs.map +0 -1
- package/dist/chunk-5FO6ISW4.mjs +0 -3
- package/dist/chunk-5FO6ISW4.mjs.map +0 -1
- package/dist/chunk-5IISSXS2.mjs +0 -224
- package/dist/chunk-5IISSXS2.mjs.map +0 -1
- package/dist/chunk-5UNJXFUO.mjs +0 -29
- package/dist/chunk-5UNJXFUO.mjs.map +0 -1
- package/dist/chunk-74HF6Q3L.mjs +0 -204
- package/dist/chunk-74HF6Q3L.mjs.map +0 -1
- package/dist/chunk-7LSRNPNI.mjs +0 -59
- package/dist/chunk-7LSRNPNI.mjs.map +0 -1
- package/dist/chunk-7SZDD6XT.mjs +0 -53
- package/dist/chunk-7SZDD6XT.mjs.map +0 -1
- package/dist/chunk-7VKOE5UL.mjs +0 -45
- package/dist/chunk-7VKOE5UL.mjs.map +0 -1
- package/dist/chunk-AUCHS4VR.mjs +0 -77
- package/dist/chunk-AUCHS4VR.mjs.map +0 -1
- package/dist/chunk-BLRAOGXD.mjs +0 -10
- package/dist/chunk-BLRAOGXD.mjs.map +0 -1
- package/dist/chunk-CK7Q3Y5A.mjs +0 -21
- package/dist/chunk-CK7Q3Y5A.mjs.map +0 -1
- package/dist/chunk-DE5K76I2.mjs +0 -3
- package/dist/chunk-DE5K76I2.mjs.map +0 -1
- package/dist/chunk-ECR45NSD.mjs +0 -101
- package/dist/chunk-ECR45NSD.mjs.map +0 -1
- package/dist/chunk-EZCKXWQF.mjs +0 -16
- package/dist/chunk-EZCKXWQF.mjs.map +0 -1
- package/dist/chunk-F626GQCD.mjs +0 -47
- package/dist/chunk-F626GQCD.mjs.map +0 -1
- package/dist/chunk-FK2XUDQQ.mjs +0 -22
- package/dist/chunk-FK2XUDQQ.mjs.map +0 -1
- package/dist/chunk-FP2EKU3L.mjs +0 -28
- package/dist/chunk-FP2EKU3L.mjs.map +0 -1
- package/dist/chunk-GQN2HYFJ.mjs +0 -22
- package/dist/chunk-GQN2HYFJ.mjs.map +0 -1
- package/dist/chunk-H4VKQGVU.mjs +0 -3
- package/dist/chunk-H4VKQGVU.mjs.map +0 -1
- package/dist/chunk-IU3WTXLQ.mjs +0 -3
- package/dist/chunk-IU3WTXLQ.mjs.map +0 -1
- package/dist/chunk-K5LNB36H.mjs +0 -80
- package/dist/chunk-K5LNB36H.mjs.map +0 -1
- package/dist/chunk-KDVMG3XF.mjs +0 -63
- package/dist/chunk-KDVMG3XF.mjs.map +0 -1
- package/dist/chunk-KMXSZRIA.mjs +0 -47
- package/dist/chunk-KMXSZRIA.mjs.map +0 -1
- package/dist/chunk-KNQIEOFP.mjs +0 -18
- package/dist/chunk-KNQIEOFP.mjs.map +0 -1
- package/dist/chunk-L7VVZH4Q.mjs +0 -3
- package/dist/chunk-L7VVZH4Q.mjs.map +0 -1
- package/dist/chunk-LZ3UOAQ4.mjs +0 -83
- package/dist/chunk-LZ3UOAQ4.mjs.map +0 -1
- package/dist/chunk-M2DR4KVB.mjs +0 -33
- package/dist/chunk-M2DR4KVB.mjs.map +0 -1
- package/dist/chunk-MMVDU6DF.mjs +0 -3
- package/dist/chunk-MMVDU6DF.mjs.map +0 -1
- package/dist/chunk-MRXNTQOX.mjs +0 -55
- package/dist/chunk-MRXNTQOX.mjs.map +0 -1
- package/dist/chunk-NTLVQENP.mjs +0 -19
- package/dist/chunk-NTLVQENP.mjs.map +0 -1
- package/dist/chunk-PDCIGRCE.mjs +0 -93
- package/dist/chunk-PDCIGRCE.mjs.map +0 -1
- package/dist/chunk-QRKKPCUD.mjs +0 -21
- package/dist/chunk-QRKKPCUD.mjs.map +0 -1
- package/dist/chunk-RBR32FWA.mjs +0 -74
- package/dist/chunk-RBR32FWA.mjs.map +0 -1
- package/dist/chunk-T6MTDQZ7.mjs +0 -45
- package/dist/chunk-T6MTDQZ7.mjs.map +0 -1
- package/dist/chunk-TZLW7PBU.mjs +0 -35
- package/dist/chunk-TZLW7PBU.mjs.map +0 -1
- package/dist/chunk-U3LUDDT5.mjs +0 -65
- package/dist/chunk-U3LUDDT5.mjs.map +0 -1
- package/dist/chunk-UEQYKC4W.mjs +0 -34
- package/dist/chunk-UEQYKC4W.mjs.map +0 -1
- package/dist/chunk-V55OPCG4.mjs +0 -45
- package/dist/chunk-V55OPCG4.mjs.map +0 -1
- package/dist/chunk-VYECMH73.mjs +0 -99
- package/dist/chunk-VYECMH73.mjs.map +0 -1
- package/dist/chunk-W2ZHOUV6.mjs +0 -108
- package/dist/chunk-W2ZHOUV6.mjs.map +0 -1
- package/dist/chunk-WADHCMPK.mjs +0 -3
- package/dist/chunk-WADHCMPK.mjs.map +0 -1
- package/dist/chunk-WJHSY5T6.mjs +0 -3
- package/dist/chunk-WJHSY5T6.mjs.map +0 -1
- package/dist/chunk-WVRTFPNO.mjs +0 -91
- package/dist/chunk-WVRTFPNO.mjs.map +0 -1
- package/dist/chunk-ZEHF3AXH.mjs +0 -45
- package/dist/chunk-ZEHF3AXH.mjs.map +0 -1
- package/dist/chunk-ZKRM3DIR.mjs +0 -91
- package/dist/chunk-ZKRM3DIR.mjs.map +0 -1
- package/dist/chunk-ZMNOLW5V.mjs +0 -99
- package/dist/chunk-ZMNOLW5V.mjs.map +0 -1
|
@@ -1,22 +1,66 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
var __objRest = (source, exclude) => {
|
|
18
|
+
var target = {};
|
|
19
|
+
for (var prop in source)
|
|
20
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
21
|
+
target[prop] = source[prop];
|
|
22
|
+
if (source != null && __getOwnPropSymbols)
|
|
23
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
24
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
25
|
+
target[prop] = source[prop];
|
|
26
|
+
}
|
|
27
|
+
return target;
|
|
28
|
+
};
|
|
5
29
|
|
|
30
|
+
// src/components/ui/textarea.tsx
|
|
31
|
+
import * as React from "react";
|
|
32
|
+
|
|
33
|
+
// src/lib/utils.ts
|
|
34
|
+
import { clsx } from "clsx";
|
|
35
|
+
import { customAlphabet } from "nanoid";
|
|
36
|
+
import { twMerge } from "tailwind-merge";
|
|
37
|
+
function cn(...inputs) {
|
|
38
|
+
return twMerge(clsx(inputs));
|
|
39
|
+
}
|
|
40
|
+
var nanoid = customAlphabet(
|
|
41
|
+
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
|
|
42
|
+
7
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
// src/components/ui/textarea.tsx
|
|
46
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
47
|
var Textarea = React.forwardRef(
|
|
7
48
|
(_a, ref) => {
|
|
8
49
|
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
9
|
-
return /* @__PURE__ */ jsx(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
className
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
50
|
+
return /* @__PURE__ */ jsx(
|
|
51
|
+
"textarea",
|
|
52
|
+
__spreadValues({
|
|
53
|
+
className: cn(
|
|
54
|
+
"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
|
|
55
|
+
className
|
|
56
|
+
),
|
|
57
|
+
ref
|
|
58
|
+
}, props)
|
|
59
|
+
);
|
|
16
60
|
}
|
|
17
61
|
);
|
|
18
62
|
Textarea.displayName = "Textarea";
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
63
|
+
export {
|
|
64
|
+
Textarea
|
|
65
|
+
};
|
|
22
66
|
//# sourceMappingURL=textarea.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ui/textarea.tsx"
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ui/textarea.tsx","../../../src/lib/utils.ts"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"../../lib/utils\";\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n","import { clsx, type ClassValue } from \"clsx\";\nimport { customAlphabet } from \"nanoid\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport const nanoid = customAlphabet(\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n 7,\n); // 7-character random string\n\nexport async function fetcher<JSON = any>(input: RequestInfo, init?: RequestInit): Promise<JSON> {\n const res = await fetch(input, init);\n\n if (!res.ok) {\n const json = await res.json();\n if (json.error) {\n const error = new Error(json.error) as Error & {\n status: number;\n };\n error.status = res.status;\n throw error;\n } else {\n throw new Error(\"An unexpected error occurred\");\n }\n }\n\n return res.json();\n}\n\nexport function formatDate(input: string | number | Date): string {\n const date = new Date(input);\n return date.toLocaleDateString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nexport const arraysAreEqual = (arr1: number[], arr2: number[]): boolean =>\n arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);\n\nexport function nullableCompatibleEqualityCheck<T>(\n naiveEqualityCheck: (a: T, b: T) => boolean,\n a: T | null | undefined,\n b: T | null | undefined,\n): boolean {\n if (a === null || a === undefined || b === null || b === undefined) {\n return a === b;\n }\n\n return naiveEqualityCheck(a, b);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,YAAY,WAAW;;;ACAvB,SAAS,YAA6B;AACtC,SAAS,sBAAsB;AAC/B,SAAS,eAAe;AAEjB,SAAS,MAAM,QAAsB;AAC1C,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;AAEO,IAAM,SAAS;AAAA,EACpB;AAAA,EACA;AACF;;;ADFM;AAHN,IAAM,WAAiB;AAAA,EACrB,CAAC,IAAyB,QAAQ;AAAjC,iBAAE,YAPL,IAOG,IAAgB,kBAAhB,IAAgB,CAAd;AACD,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,SACI;AAAA,IACN;AAAA,EAEJ;AACF;AACA,SAAS,cAAc;","names":[]}
|
package/dist/context/index.d.ts
CHANGED
package/dist/context/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -1,7 +1,159 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
var __async = (__this, __arguments, generator) => {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
var fulfilled = (value) => {
|
|
4
|
+
try {
|
|
5
|
+
step(generator.next(value));
|
|
6
|
+
} catch (e) {
|
|
7
|
+
reject(e);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var rejected = (value) => {
|
|
11
|
+
try {
|
|
12
|
+
step(generator.throw(value));
|
|
13
|
+
} catch (e) {
|
|
14
|
+
reject(e);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts
|
|
23
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
24
|
+
|
|
25
|
+
// src/lib/debouncer.ts
|
|
26
|
+
var Debouncer = class {
|
|
27
|
+
constructor(wait) {
|
|
28
|
+
this.wait = wait;
|
|
29
|
+
this.debounce = (func, ...args) => __async(this, null, function* () {
|
|
30
|
+
this.cancel();
|
|
31
|
+
this.timeoutId = setTimeout(() => __async(this, null, function* () {
|
|
32
|
+
try {
|
|
33
|
+
this.activeAbortController = new AbortController();
|
|
34
|
+
yield func(...args, this.activeAbortController.signal);
|
|
35
|
+
this.activeAbortController = void 0;
|
|
36
|
+
} catch (error) {
|
|
37
|
+
}
|
|
38
|
+
}), this.wait);
|
|
39
|
+
});
|
|
40
|
+
this.cancel = () => {
|
|
41
|
+
if (this.activeAbortController) {
|
|
42
|
+
this.activeAbortController.abort();
|
|
43
|
+
this.activeAbortController = void 0;
|
|
44
|
+
}
|
|
45
|
+
if (this.timeoutId !== void 0) {
|
|
46
|
+
clearTimeout(this.timeoutId);
|
|
47
|
+
this.timeoutId = void 0;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// src/lib/utils.ts
|
|
54
|
+
import { clsx } from "clsx";
|
|
55
|
+
import { customAlphabet } from "nanoid";
|
|
56
|
+
import { twMerge } from "tailwind-merge";
|
|
57
|
+
var nanoid = customAlphabet(
|
|
58
|
+
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
|
|
59
|
+
7
|
|
60
|
+
);
|
|
61
|
+
var arraysAreEqual = (arr1, arr2) => arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
|
|
62
|
+
function nullableCompatibleEqualityCheck(naiveEqualityCheck, a, b) {
|
|
63
|
+
if (a === null || a === void 0 || b === null || b === void 0) {
|
|
64
|
+
return a === b;
|
|
65
|
+
}
|
|
66
|
+
return naiveEqualityCheck(a, b);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// src/types/base/editor-autocomplete-state.ts
|
|
70
|
+
function areEqual_autocompleteState(prev, next) {
|
|
71
|
+
return prev.cursorPoint.offset === next.cursorPoint.offset && arraysAreEqual(prev.cursorPoint.path, next.cursorPoint.path) && prev.textBeforeCursor === next.textBeforeCursor && prev.textAfterCursor === next.textAfterCursor;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts
|
|
75
|
+
function useAutosuggestions(debounceTime, shouldAcceptAutosuggestionOnKeyPress, autosuggestionFunction, insertAutocompleteSuggestion, disableWhenEmpty, disabled) {
|
|
76
|
+
const [previousAutocompleteState, setPreviousAutocompleteState] = useState(null);
|
|
77
|
+
const [currentAutocompleteSuggestion, setCurrentAutocompleteSuggestion] = useState(null);
|
|
78
|
+
const awaitForAndAppendSuggestion = useCallback(
|
|
79
|
+
(editorAutocompleteState, abortSignal) => __async(this, null, function* () {
|
|
80
|
+
if (disabled) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (disableWhenEmpty && editorAutocompleteState.textBeforeCursor === "" && editorAutocompleteState.textAfterCursor === "") {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const suggestion = yield autosuggestionFunction(editorAutocompleteState, abortSignal);
|
|
87
|
+
if (!suggestion || abortSignal.aborted) {
|
|
88
|
+
throw new DOMException("Aborted", "AbortError");
|
|
89
|
+
}
|
|
90
|
+
setCurrentAutocompleteSuggestion({
|
|
91
|
+
text: suggestion,
|
|
92
|
+
point: editorAutocompleteState.cursorPoint
|
|
93
|
+
});
|
|
94
|
+
}),
|
|
95
|
+
[autosuggestionFunction, setCurrentAutocompleteSuggestion, disableWhenEmpty, disabled]
|
|
96
|
+
);
|
|
97
|
+
const debouncedFunction = useMemo(
|
|
98
|
+
() => new Debouncer(debounceTime),
|
|
99
|
+
[debounceTime]
|
|
100
|
+
);
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
return () => {
|
|
103
|
+
debouncedFunction.cancel();
|
|
104
|
+
setCurrentAutocompleteSuggestion(null);
|
|
105
|
+
};
|
|
106
|
+
}, [debouncedFunction, disabled]);
|
|
107
|
+
const onChange = useCallback(
|
|
108
|
+
(newEditorState) => {
|
|
109
|
+
const editorStateHasChanged = !nullableCompatibleEqualityCheck(
|
|
110
|
+
areEqual_autocompleteState,
|
|
111
|
+
previousAutocompleteState,
|
|
112
|
+
newEditorState
|
|
113
|
+
);
|
|
114
|
+
setPreviousAutocompleteState(newEditorState);
|
|
115
|
+
if (!editorStateHasChanged) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
setCurrentAutocompleteSuggestion(null);
|
|
119
|
+
if (newEditorState) {
|
|
120
|
+
debouncedFunction.debounce(awaitForAndAppendSuggestion, newEditorState);
|
|
121
|
+
} else {
|
|
122
|
+
debouncedFunction.cancel();
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
[
|
|
126
|
+
previousAutocompleteState,
|
|
127
|
+
setPreviousAutocompleteState,
|
|
128
|
+
debouncedFunction,
|
|
129
|
+
awaitForAndAppendSuggestion,
|
|
130
|
+
setCurrentAutocompleteSuggestion
|
|
131
|
+
]
|
|
132
|
+
);
|
|
133
|
+
const keyDownHandler = useCallback(
|
|
134
|
+
(event) => {
|
|
135
|
+
if (currentAutocompleteSuggestion) {
|
|
136
|
+
if (shouldAcceptAutosuggestionOnKeyPress(event)) {
|
|
137
|
+
event.preventDefault();
|
|
138
|
+
insertAutocompleteSuggestion(currentAutocompleteSuggestion);
|
|
139
|
+
setCurrentAutocompleteSuggestion(null);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
[
|
|
144
|
+
currentAutocompleteSuggestion,
|
|
145
|
+
setCurrentAutocompleteSuggestion,
|
|
146
|
+
insertAutocompleteSuggestion,
|
|
147
|
+
shouldAcceptAutosuggestionOnKeyPress
|
|
148
|
+
]
|
|
149
|
+
);
|
|
150
|
+
return {
|
|
151
|
+
currentAutocompleteSuggestion,
|
|
152
|
+
onChangeHandler: onChange,
|
|
153
|
+
onKeyDownHandler: keyDownHandler
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
export {
|
|
157
|
+
useAutosuggestions
|
|
158
|
+
};
|
|
7
159
|
//# sourceMappingURL=use-autosuggestions.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/base-copilot-textarea-implementation/use-autosuggestions.ts","../../../src/lib/debouncer.ts","../../../src/lib/utils.ts","../../../src/types/base/editor-autocomplete-state.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Debouncer } from \"../../lib/debouncer\";\nimport { nullableCompatibleEqualityCheck } from \"../../lib/utils\";\nimport { AutosuggestionsBareFunction } from \"../../types/base\";\nimport { AutosuggestionState } from \"../../types/base/autosuggestion-state\";\nimport {\n EditorAutocompleteState,\n areEqual_autocompleteState,\n} from \"../../types/base/editor-autocomplete-state\";\n\nexport interface UseAutosuggestionsResult {\n currentAutocompleteSuggestion: AutosuggestionState | null;\n onChangeHandler: (newEditorState: EditorAutocompleteState | null) => void;\n onKeyDownHandler: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n}\n\nexport function useAutosuggestions(\n debounceTime: number,\n shouldAcceptAutosuggestionOnKeyPress: (event: React.KeyboardEvent<HTMLDivElement>) => boolean,\n autosuggestionFunction: AutosuggestionsBareFunction,\n insertAutocompleteSuggestion: (suggestion: AutosuggestionState) => void,\n disableWhenEmpty: boolean,\n disabled: boolean,\n): UseAutosuggestionsResult {\n const [previousAutocompleteState, setPreviousAutocompleteState] =\n useState<EditorAutocompleteState | null>(null);\n\n const [currentAutocompleteSuggestion, setCurrentAutocompleteSuggestion] =\n useState<AutosuggestionState | null>(null);\n\n const awaitForAndAppendSuggestion: (\n editorAutocompleteState: EditorAutocompleteState,\n abortSignal: AbortSignal,\n ) => Promise<void> = useCallback(\n async (editorAutocompleteState: EditorAutocompleteState, abortSignal: AbortSignal) => {\n // early return if disabled\n if (disabled) {\n return;\n }\n\n if (\n disableWhenEmpty &&\n editorAutocompleteState.textBeforeCursor === \"\" &&\n editorAutocompleteState.textAfterCursor === \"\"\n ) {\n return;\n }\n\n // fetch the suggestion\n const suggestion = await autosuggestionFunction(editorAutocompleteState, abortSignal);\n\n // We'll assume for now that the autocomplete function might or might not respect the abort signal.\n if (!suggestion || abortSignal.aborted) {\n throw new DOMException(\"Aborted\", \"AbortError\");\n }\n\n setCurrentAutocompleteSuggestion({\n text: suggestion,\n point: editorAutocompleteState.cursorPoint,\n });\n },\n [autosuggestionFunction, setCurrentAutocompleteSuggestion, disableWhenEmpty, disabled],\n );\n\n const debouncedFunction = useMemo(\n () => new Debouncer<[editorAutocompleteState: EditorAutocompleteState]>(debounceTime),\n [debounceTime],\n );\n\n // clean current state when unmounting or disabling\n useEffect(() => {\n return () => {\n debouncedFunction.cancel();\n setCurrentAutocompleteSuggestion(null);\n };\n }, [debouncedFunction, disabled]);\n\n const onChange = useCallback(\n (newEditorState: EditorAutocompleteState | null) => {\n const editorStateHasChanged = !nullableCompatibleEqualityCheck(\n areEqual_autocompleteState,\n previousAutocompleteState,\n newEditorState,\n );\n setPreviousAutocompleteState(newEditorState);\n\n // if no change, do nothing\n if (!editorStateHasChanged) {\n return;\n }\n\n // if change, then first null out the current suggestion\n setCurrentAutocompleteSuggestion(null);\n\n // then try to get a new suggestion, debouncing to avoid too many requests while typing\n if (newEditorState) {\n debouncedFunction.debounce(awaitForAndAppendSuggestion, newEditorState);\n } else {\n debouncedFunction.cancel();\n }\n },\n [\n previousAutocompleteState,\n setPreviousAutocompleteState,\n debouncedFunction,\n awaitForAndAppendSuggestion,\n setCurrentAutocompleteSuggestion,\n ],\n );\n\n const keyDownHandler = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (currentAutocompleteSuggestion) {\n if (shouldAcceptAutosuggestionOnKeyPress(event)) {\n event.preventDefault();\n insertAutocompleteSuggestion(currentAutocompleteSuggestion);\n setCurrentAutocompleteSuggestion(null);\n }\n }\n },\n [\n currentAutocompleteSuggestion,\n setCurrentAutocompleteSuggestion,\n insertAutocompleteSuggestion,\n shouldAcceptAutosuggestionOnKeyPress,\n ],\n );\n\n return {\n currentAutocompleteSuggestion,\n onChangeHandler: onChange,\n onKeyDownHandler: keyDownHandler,\n };\n}\n","export type AsyncFunction<T extends any[]> = (...args: [...T, AbortSignal]) => Promise<void>;\n\nexport class Debouncer<T extends any[]> {\n private timeoutId?: number;\n private activeAbortController?: AbortController;\n\n constructor(private wait: number) {}\n\n debounce = async (func: AsyncFunction<T>, ...args: T) => {\n // Abort the previous promise immediately\n this.cancel();\n\n this.timeoutId = setTimeout(async () => {\n try {\n this.activeAbortController = new AbortController();\n\n // Pass the signal to the async function, assuming it supports it\n await func(...args, this.activeAbortController.signal);\n\n this.activeAbortController = undefined;\n } catch (error) {}\n }, this.wait);\n };\n\n cancel = () => {\n if (this.activeAbortController) {\n this.activeAbortController.abort();\n this.activeAbortController = undefined;\n }\n\n if (this.timeoutId !== undefined) {\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n }\n };\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { customAlphabet } from \"nanoid\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport const nanoid = customAlphabet(\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n 7,\n); // 7-character random string\n\nexport async function fetcher<JSON = any>(input: RequestInfo, init?: RequestInit): Promise<JSON> {\n const res = await fetch(input, init);\n\n if (!res.ok) {\n const json = await res.json();\n if (json.error) {\n const error = new Error(json.error) as Error & {\n status: number;\n };\n error.status = res.status;\n throw error;\n } else {\n throw new Error(\"An unexpected error occurred\");\n }\n }\n\n return res.json();\n}\n\nexport function formatDate(input: string | number | Date): string {\n const date = new Date(input);\n return date.toLocaleDateString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n });\n}\n\nexport const arraysAreEqual = (arr1: number[], arr2: number[]): boolean =>\n arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);\n\nexport function nullableCompatibleEqualityCheck<T>(\n naiveEqualityCheck: (a: T, b: T) => boolean,\n a: T | null | undefined,\n b: T | null | undefined,\n): boolean {\n if (a === null || a === undefined || b === null || b === undefined) {\n return a === b;\n }\n\n return naiveEqualityCheck(a, b);\n}\n","import { BasePoint } from \"slate\";\nimport { arraysAreEqual } from \"../../lib/utils\";\n\nexport interface EditorAutocompleteState {\n cursorPoint: BasePoint;\n textBeforeCursor: string;\n textAfterCursor: string;\n}\n\nexport function areEqual_autocompleteState(\n prev: EditorAutocompleteState,\n next: EditorAutocompleteState,\n) {\n return (\n prev.cursorPoint.offset === next.cursorPoint.offset &&\n arraysAreEqual(prev.cursorPoint.path, next.cursorPoint.path) &&\n prev.textBeforeCursor === next.textBeforeCursor &&\n prev.textAfterCursor === next.textAfterCursor\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,5 +1,169 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
1
|
+
// src/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.tsx
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { createEditor, Element } from "slate";
|
|
4
|
+
import { withReact } from "slate-react";
|
|
5
|
+
|
|
6
|
+
// src/lib/slatejs-edits/with-partial-history.ts
|
|
7
|
+
import { Editor, Operation, Path, Transforms } from "slate";
|
|
8
|
+
import { HistoryEditor } from "slate-history";
|
|
9
|
+
var withPartialHistory = (editor, shouldSave2) => {
|
|
10
|
+
const e = editor;
|
|
11
|
+
const { apply } = e;
|
|
12
|
+
e.history = { undos: [], redos: [] };
|
|
13
|
+
e.redo = () => {
|
|
14
|
+
const { history } = e;
|
|
15
|
+
const { redos } = history;
|
|
16
|
+
if (redos.length > 0) {
|
|
17
|
+
const batch = redos[redos.length - 1];
|
|
18
|
+
if (batch.selectionBefore) {
|
|
19
|
+
Transforms.setSelection(e, batch.selectionBefore);
|
|
20
|
+
}
|
|
21
|
+
HistoryEditor.withoutSaving(e, () => {
|
|
22
|
+
Editor.withoutNormalizing(e, () => {
|
|
23
|
+
for (const op of batch.operations) {
|
|
24
|
+
e.apply(op);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
history.redos.pop();
|
|
29
|
+
e.writeHistory("undos", batch);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
e.undo = () => {
|
|
33
|
+
const { history } = e;
|
|
34
|
+
const { undos } = history;
|
|
35
|
+
if (undos.length > 0) {
|
|
36
|
+
const batch = undos[undos.length - 1];
|
|
37
|
+
HistoryEditor.withoutSaving(e, () => {
|
|
38
|
+
Editor.withoutNormalizing(e, () => {
|
|
39
|
+
const inverseOps = batch.operations.map(Operation.inverse).reverse();
|
|
40
|
+
for (const op of inverseOps) {
|
|
41
|
+
e.apply(op);
|
|
42
|
+
}
|
|
43
|
+
if (batch.selectionBefore) {
|
|
44
|
+
Transforms.setSelection(e, batch.selectionBefore);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
e.writeHistory("redos", batch);
|
|
49
|
+
history.undos.pop();
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
e.apply = (op) => {
|
|
53
|
+
const { operations, history } = e;
|
|
54
|
+
const { undos } = history;
|
|
55
|
+
const lastBatch = undos[undos.length - 1];
|
|
56
|
+
const lastOp = lastBatch && lastBatch.operations[lastBatch.operations.length - 1];
|
|
57
|
+
let save = HistoryEditor.isSaving(e);
|
|
58
|
+
let merge = HistoryEditor.isMerging(e);
|
|
59
|
+
if (save == null) {
|
|
60
|
+
save = shouldSave2(op, lastOp);
|
|
61
|
+
}
|
|
62
|
+
if (save) {
|
|
63
|
+
if (merge == null) {
|
|
64
|
+
if (lastBatch == null) {
|
|
65
|
+
merge = false;
|
|
66
|
+
} else if (operations.length !== 0) {
|
|
67
|
+
merge = true;
|
|
68
|
+
} else {
|
|
69
|
+
merge = shouldMerge(op, lastOp);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (lastBatch && merge) {
|
|
73
|
+
lastBatch.operations.push(op);
|
|
74
|
+
} else {
|
|
75
|
+
const batch = {
|
|
76
|
+
operations: [op],
|
|
77
|
+
selectionBefore: e.selection
|
|
78
|
+
};
|
|
79
|
+
e.writeHistory("undos", batch);
|
|
80
|
+
}
|
|
81
|
+
while (undos.length > 100) {
|
|
82
|
+
undos.shift();
|
|
83
|
+
}
|
|
84
|
+
history.redos = [];
|
|
85
|
+
}
|
|
86
|
+
apply(op);
|
|
87
|
+
};
|
|
88
|
+
e.writeHistory = (stack, batch) => {
|
|
89
|
+
e.history[stack].push(batch);
|
|
90
|
+
};
|
|
91
|
+
return e;
|
|
92
|
+
};
|
|
93
|
+
var shouldMerge = (op, prev) => {
|
|
94
|
+
if (prev && op.type === "insert_text" && prev.type === "insert_text" && op.offset === prev.offset + prev.text.length && Path.equals(op.path, prev.path)) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
if (prev && op.type === "remove_text" && prev.type === "remove_text" && op.offset + op.text.length === prev.offset && Path.equals(op.path, prev.path)) {
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
};
|
|
102
|
+
var defaultShouldSave = (op, prev) => {
|
|
103
|
+
if (op.type === "set_selection") {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
return true;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// src/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.tsx
|
|
110
|
+
var shouldSave = (op, prev) => {
|
|
111
|
+
const excludedNodeType = "suggestion";
|
|
112
|
+
if (op.type === "insert_node" && Element.isElement(op.node) && op.node.type === excludedNodeType) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
if (op.type === "remove_node" && Element.isElement(op.node) && op.node.type === excludedNodeType) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
if (op.type === "set_node" && "type" in op.newProperties && op.newProperties.type === excludedNodeType) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
if (op.type == "set_node" && "type" in op.properties && op.properties.type === excludedNodeType) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
if (op.type === "merge_node" && "type" in op.properties && op.properties.type === excludedNodeType) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
if (op.type === "split_node" && "type" in op.properties && op.properties.type === excludedNodeType) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
return defaultShouldSave(op, prev);
|
|
131
|
+
};
|
|
132
|
+
function useCopilotTextareaEditor() {
|
|
133
|
+
const editor = useMemo(() => {
|
|
134
|
+
const editor2 = withPartialHistory(withReact(createEditor()), shouldSave);
|
|
135
|
+
const { isVoid } = editor2;
|
|
136
|
+
editor2.isVoid = (element) => {
|
|
137
|
+
switch (element.type) {
|
|
138
|
+
case "suggestion":
|
|
139
|
+
return true;
|
|
140
|
+
default:
|
|
141
|
+
return isVoid(element);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const { markableVoid } = editor2;
|
|
145
|
+
editor2.markableVoid = (element) => {
|
|
146
|
+
switch (element.type) {
|
|
147
|
+
case "suggestion":
|
|
148
|
+
return true;
|
|
149
|
+
default:
|
|
150
|
+
return markableVoid(element);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const { isInline } = editor2;
|
|
154
|
+
editor2.isInline = (element) => {
|
|
155
|
+
switch (element.type) {
|
|
156
|
+
case "suggestion":
|
|
157
|
+
return element.inline;
|
|
158
|
+
default:
|
|
159
|
+
return isInline(element);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
return editor2;
|
|
163
|
+
}, []);
|
|
164
|
+
return editor;
|
|
165
|
+
}
|
|
166
|
+
export {
|
|
167
|
+
useCopilotTextareaEditor
|
|
168
|
+
};
|
|
5
169
|
//# sourceMappingURL=use-copilot-textarea-editor.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"sources":["../../../src/hooks/base-copilot-textarea-implementation/use-copilot-textarea-editor.tsx","../../../src/lib/slatejs-edits/with-partial-history.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport { createEditor, Element } from \"slate\";\nimport { withReact } from \"slate-react\";\nimport {\n defaultShouldSave,\n ShouldSaveToHistory,\n withPartialHistory,\n} from \"../../lib/slatejs-edits/with-partial-history\";\nimport { CustomEditor } from \"../../types/base/custom-editor\";\n\nconst shouldSave: ShouldSaveToHistory = (op, prev) => {\n const excludedNodeType = \"suggestion\";\n // Check if the operation involves the suggestion inline node type\n if (\n op.type === \"insert_node\" &&\n Element.isElement(op.node) &&\n op.node.type === excludedNodeType\n ) {\n return false;\n }\n\n if (\n op.type === \"remove_node\" &&\n Element.isElement(op.node) &&\n op.node.type === excludedNodeType\n ) {\n return false;\n }\n\n if (\n op.type === \"set_node\" &&\n \"type\" in op.newProperties &&\n op.newProperties.type === excludedNodeType\n ) {\n return false;\n }\n\n if (op.type == \"set_node\" && \"type\" in op.properties && op.properties.type === excludedNodeType) {\n return false;\n }\n\n if (\n op.type === \"merge_node\" &&\n \"type\" in op.properties &&\n op.properties.type === excludedNodeType\n ) {\n return false;\n }\n\n if (\n op.type === \"split_node\" &&\n \"type\" in op.properties &&\n op.properties.type === excludedNodeType\n ) {\n return false;\n }\n\n // Otherwise, save the operation to history\n return defaultShouldSave(op, prev);\n};\n\nexport function useCopilotTextareaEditor(): CustomEditor {\n const editor = useMemo(() => {\n const editor = withPartialHistory(withReact(createEditor()), shouldSave);\n\n const { isVoid } = editor;\n editor.isVoid = (element) => {\n switch (element.type) {\n case \"suggestion\":\n return true;\n default:\n return isVoid(element);\n }\n };\n\n const { markableVoid } = editor;\n editor.markableVoid = (element) => {\n switch (element.type) {\n case \"suggestion\":\n return true;\n default:\n return markableVoid(element);\n }\n };\n\n const { isInline } = editor;\n editor.isInline = (element) => {\n switch (element.type) {\n case \"suggestion\":\n return element.inline;\n default:\n return isInline(element);\n }\n };\n\n return editor;\n }, []);\n\n return editor;\n}\n","import { Editor, Operation, Path, Range, Transforms } from \"slate\";\nimport { HistoryEditor } from \"slate-history\";\n\n// Copy-pasted from `https://github.com/ianstormtaylor/slate/blob/main/packages/slate-history/src/with-history.ts`\n// With one exception: the `shouldSave` function is passed in as an argument to `withPartialHistory` instead of being hardcoded\nexport type ShouldSaveToHistory = (op: Operation, prev: Operation | undefined) => boolean;\n\nexport const withPartialHistory = <T extends Editor>(\n editor: T,\n shouldSave: ShouldSaveToHistory,\n) => {\n const e = editor as T & HistoryEditor;\n const { apply } = e;\n e.history = { undos: [], redos: [] };\n\n e.redo = () => {\n const { history } = e;\n const { redos } = history;\n\n if (redos.length > 0) {\n const batch = redos[redos.length - 1];\n\n if (batch.selectionBefore) {\n Transforms.setSelection(e, batch.selectionBefore);\n }\n\n HistoryEditor.withoutSaving(e, () => {\n Editor.withoutNormalizing(e, () => {\n for (const op of batch.operations) {\n e.apply(op);\n }\n });\n });\n\n history.redos.pop();\n e.writeHistory(\"undos\", batch);\n }\n };\n\n e.undo = () => {\n const { history } = e;\n const { undos } = history;\n\n if (undos.length > 0) {\n const batch = undos[undos.length - 1];\n\n HistoryEditor.withoutSaving(e, () => {\n Editor.withoutNormalizing(e, () => {\n const inverseOps = batch.operations.map(Operation.inverse).reverse();\n\n for (const op of inverseOps) {\n e.apply(op);\n }\n if (batch.selectionBefore) {\n Transforms.setSelection(e, batch.selectionBefore);\n }\n });\n });\n\n e.writeHistory(\"redos\", batch);\n history.undos.pop();\n }\n };\n\n e.apply = (op: Operation) => {\n const { operations, history } = e;\n const { undos } = history;\n const lastBatch = undos[undos.length - 1];\n const lastOp = lastBatch && lastBatch.operations[lastBatch.operations.length - 1];\n let save = HistoryEditor.isSaving(e);\n let merge = HistoryEditor.isMerging(e);\n\n if (save == null) {\n save = shouldSave(op, lastOp);\n }\n\n if (save) {\n if (merge == null) {\n if (lastBatch == null) {\n merge = false;\n } else if (operations.length !== 0) {\n merge = true;\n } else {\n merge = shouldMerge(op, lastOp);\n }\n }\n\n if (lastBatch && merge) {\n lastBatch.operations.push(op);\n } else {\n const batch = {\n operations: [op],\n selectionBefore: e.selection,\n };\n e.writeHistory(\"undos\", batch);\n }\n\n while (undos.length > 100) {\n undos.shift();\n }\n\n history.redos = [];\n }\n\n apply(op);\n };\n\n e.writeHistory = (stack: \"undos\" | \"redos\", batch: any) => {\n e.history[stack].push(batch);\n };\n\n return e;\n};\n\n/**\n * Check whether to merge an operation into the previous operation.\n */\n\nconst shouldMerge = (op: Operation, prev: Operation | undefined): boolean => {\n if (\n prev &&\n op.type === \"insert_text\" &&\n prev.type === \"insert_text\" &&\n op.offset === prev.offset + prev.text.length &&\n Path.equals(op.path, prev.path)\n ) {\n return true;\n }\n\n if (\n prev &&\n op.type === \"remove_text\" &&\n prev.type === \"remove_text\" &&\n op.offset + op.text.length === prev.offset &&\n Path.equals(op.path, prev.path)\n ) {\n return true;\n }\n\n return false;\n};\n\nexport const defaultShouldSave = (op: Operation, prev: Operation | undefined): boolean => {\n if (op.type === \"set_selection\") {\n return false;\n }\n\n return true;\n};\n"],"mappings":"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","names":["shouldSave","editor"]}
|
package/dist/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.mjs
CHANGED
|
@@ -1,6 +1,149 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
// src/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.ts
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { ReactEditor } from "slate-react";
|
|
4
|
+
|
|
5
|
+
// src/lib/get-text-around-cursor.ts
|
|
6
|
+
import { Editor, Path, Range, Text, Element, Point } from "slate";
|
|
7
|
+
function getFullEditorTextWithNewlines(editor) {
|
|
8
|
+
const fullDocumentRange = {
|
|
9
|
+
anchor: Editor.start(editor, []),
|
|
10
|
+
focus: Editor.end(editor, [])
|
|
11
|
+
};
|
|
12
|
+
return extractTextWithNewlines(editor, fullDocumentRange);
|
|
13
|
+
}
|
|
14
|
+
function extractTextWithNewlines(editor, range) {
|
|
15
|
+
const voids = false;
|
|
16
|
+
const [start, end] = Range.edges(range);
|
|
17
|
+
let text = "";
|
|
18
|
+
let lastBlock = null;
|
|
19
|
+
for (const [node, path] of Editor.nodes(editor, {
|
|
20
|
+
at: range,
|
|
21
|
+
match: Text.isText,
|
|
22
|
+
voids
|
|
23
|
+
})) {
|
|
24
|
+
let t = node.text;
|
|
25
|
+
const [block] = Editor.above(editor, {
|
|
26
|
+
at: path,
|
|
27
|
+
match: (n) => Element.isElement(n) && n.type === "paragraph"
|
|
28
|
+
}) || [null];
|
|
29
|
+
if (lastBlock !== block && block) {
|
|
30
|
+
if (lastBlock) {
|
|
31
|
+
text += "\n";
|
|
32
|
+
}
|
|
33
|
+
lastBlock = block;
|
|
34
|
+
}
|
|
35
|
+
if (Path.equals(path, end.path)) {
|
|
36
|
+
t = t.slice(0, end.offset);
|
|
37
|
+
}
|
|
38
|
+
if (Path.equals(path, start.path)) {
|
|
39
|
+
t = t.slice(start.offset);
|
|
40
|
+
}
|
|
41
|
+
text += t;
|
|
42
|
+
}
|
|
43
|
+
return text;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// src/lib/slatejs-edits/replace-text.ts
|
|
47
|
+
import { Editor as Editor2, Transforms } from "slate";
|
|
48
|
+
function replaceEditorText(editor, newText) {
|
|
49
|
+
Transforms.delete(editor, {
|
|
50
|
+
at: {
|
|
51
|
+
anchor: Editor2.start(editor, []),
|
|
52
|
+
focus: Editor2.end(editor, [])
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
if (newText && newText !== "") {
|
|
56
|
+
Transforms.insertNodes(
|
|
57
|
+
editor,
|
|
58
|
+
[
|
|
59
|
+
{
|
|
60
|
+
type: "paragraph",
|
|
61
|
+
children: [{ text: newText }]
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
{
|
|
65
|
+
at: [0]
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// src/hooks/base-copilot-textarea-implementation/use-populate-copilot-textarea-ref.ts
|
|
72
|
+
function usePopulateCopilotTextareaRef(editor, ref) {
|
|
73
|
+
React.useImperativeHandle(
|
|
74
|
+
ref,
|
|
75
|
+
() => {
|
|
76
|
+
class Combined {
|
|
77
|
+
constructor(customMethods2, editorHtmlElement2) {
|
|
78
|
+
this.customMethods = customMethods2;
|
|
79
|
+
this.editorHtmlElement = editorHtmlElement2;
|
|
80
|
+
}
|
|
81
|
+
get(target, propKey) {
|
|
82
|
+
if (this.isKeyOfCustomMethods(propKey)) {
|
|
83
|
+
const value = this.customMethods[propKey];
|
|
84
|
+
if (typeof value === "function") {
|
|
85
|
+
return value.bind(this.customMethods);
|
|
86
|
+
}
|
|
87
|
+
return value;
|
|
88
|
+
} else if (this.isKeyOfHTMLElement(propKey)) {
|
|
89
|
+
const value = this.editorHtmlElement[propKey];
|
|
90
|
+
if (typeof value === "function") {
|
|
91
|
+
return value.bind(this.editorHtmlElement);
|
|
92
|
+
}
|
|
93
|
+
return value;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
set(target, propKey, value) {
|
|
97
|
+
if (this.isKeyOfCustomMethods(propKey)) {
|
|
98
|
+
this.customMethods[propKey] = value;
|
|
99
|
+
} else if (this.isKeyOfHTMLElement(propKey)) {
|
|
100
|
+
this.editorHtmlElement[propKey] = value;
|
|
101
|
+
} else {
|
|
102
|
+
target[propKey] = value;
|
|
103
|
+
}
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
isKeyOfCustomMethods(key) {
|
|
107
|
+
return key in this.customMethods;
|
|
108
|
+
}
|
|
109
|
+
isKeyOfHTMLElement(key) {
|
|
110
|
+
return key in this.editorHtmlElement;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const handler = {
|
|
114
|
+
get(target, propKey) {
|
|
115
|
+
return target.get(target, propKey);
|
|
116
|
+
},
|
|
117
|
+
set(target, propKey, value) {
|
|
118
|
+
return target.set(target, propKey, value);
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
class CustomMethods {
|
|
122
|
+
constructor(editor2) {
|
|
123
|
+
this.editor = editor2;
|
|
124
|
+
}
|
|
125
|
+
focus() {
|
|
126
|
+
ReactEditor.focus(this.editor);
|
|
127
|
+
}
|
|
128
|
+
blur() {
|
|
129
|
+
ReactEditor.blur(this.editor);
|
|
130
|
+
}
|
|
131
|
+
get value() {
|
|
132
|
+
return getFullEditorTextWithNewlines(this.editor);
|
|
133
|
+
}
|
|
134
|
+
set value(value) {
|
|
135
|
+
replaceEditorText(this.editor, value);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const editorHtmlElement = ReactEditor.toDOMNode(editor, editor);
|
|
139
|
+
const customMethods = new CustomMethods(editor);
|
|
140
|
+
const combined = new Combined(customMethods, editorHtmlElement);
|
|
141
|
+
return new Proxy(combined, handler);
|
|
142
|
+
},
|
|
143
|
+
[editor]
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
export {
|
|
147
|
+
usePopulateCopilotTextareaRef
|
|
148
|
+
};
|
|
6
149
|
//# sourceMappingURL=use-populate-copilot-textarea-ref.mjs.map
|