scordi-extension 1.16.3 → 1.16.4
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/README.md +61 -29
- package/dist/blocks/AiParseDataBlock.d.ts.map +1 -1
- package/dist/blocks/EventClickBlock.d.ts.map +1 -1
- package/dist/blocks/ExportDataBlock.d.ts.map +1 -1
- package/dist/blocks/KeypressBlock.d.ts.map +1 -1
- package/dist/blocks/NetworkCatchBlock.d.ts.map +1 -1
- package/dist/blocks/WaitForConditionBlock.d.ts.map +1 -1
- package/dist/blocks/index.d.ts +1 -1
- package/dist/blocks/index.d.ts.map +1 -1
- package/dist/sdk/EightGClient.d.ts +6 -3
- package/dist/sdk/EightGClient.d.ts.map +1 -1
- package/dist/sdk/index.cjs +2 -2
- package/dist/sdk/index.js +166 -160
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/types/internal-messages.d.ts.map +1 -1
- package/dist/workflow/context/execution-context/binding.d.ts.map +1 -1
- package/dist/workflow/context/execution-context/condition.d.ts.map +1 -1
- package/dist/workflow/context/execution-context/index.d.ts +3 -3
- package/dist/workflow/context/execution-context/index.d.ts.map +1 -1
- package/dist/workflow/context/execution-context/resolver.d.ts.map +1 -1
- package/dist/workflow/context/loop-context/index.d.ts +1 -1
- package/dist/workflow/context/loop-context/index.d.ts.map +1 -1
- package/dist/workflow/context/loop-context/loop-context.d.ts.map +1 -1
- package/dist/workflow/context/loop-context/resolver.d.ts.map +1 -1
- package/dist/workflow/context/step-context/index.d.ts +1 -1
- package/dist/workflow/context/step-context/index.d.ts.map +1 -1
- package/dist/workflow/context/step-context/resolver.d.ts.map +1 -1
- package/dist/workflow/context/step-context/step-context.d.ts.map +1 -1
- package/dist/workflow/context/var-context/index.d.ts +1 -1
- package/dist/workflow/context/var-context/index.d.ts.map +1 -1
- package/dist/workflow/context/var-context/resolver.d.ts.map +1 -1
- package/dist/workflow/context/var-context/var-context.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/.vite/manifest.json +0 -75
- package/dist/assets/index-B45Q7XiR.js +0 -49
- package/dist/assets/index-BqQ8JinV.js +0 -1
- package/dist/assets/index-CVzjlC_s.js +0 -1
- package/dist/assets/index-CYVwV_2L.js +0 -1
- package/dist/assets/index-DkFIvNAm.css +0 -1
- package/dist/assets/index-DxZcS402.js +0 -1
- package/dist/assets/index-tW55lo_h.js +0 -4
- package/dist/assets/index.html-DZ7AUTQZ.js +0 -1
- package/dist/assets/index.ts-2nFLTUkL.js +0 -238
- package/dist/assets/index.ts-BRPHoTRl.js +0 -256
- package/dist/assets/index.ts-C2f2hGoV.js +0 -158
- package/dist/assets/index.ts-CD2jVezi.js +0 -256
- package/dist/assets/index.ts-COMnxBfB.js +0 -238
- package/dist/assets/index.ts-mAOhzdZJ.js +0 -238
- package/dist/assets/internal-messages-BMRA0i8A.js +0 -1
- package/dist/assets/internal-messages-BS1uEgeS.js +0 -1
- package/dist/assets/internal-messages-CP1ANEcL.js +0 -1
- package/dist/assets/internal-messages-Drf0Gb9U.js +0 -1
- package/dist/assets/loading-page-1924caaa.js +0 -51
- package/dist/assets/main.tsx-CHn9k-P7.js +0 -38
- package/dist/assets/main.tsx-DnGNeWWr.js +0 -38
- package/dist/assets/main.tsx-DtStYr-r.js +0 -2
- package/dist/assets/main.tsx-UFslEqbd.js +0 -38
- package/dist/assets/main.tsx-loader-6Ftbg0YS.js +0 -13
- package/dist/assets/main.tsx-loader-ByFSLdJ4.js +0 -13
- package/dist/assets/main.tsx-loader-CuF0J02t.js +0 -13
- package/dist/assets/main.tsx-loader-sjxNXQPw.js +0 -13
- package/dist/assets/types-BId3CBm7.js +0 -1
- package/dist/assets/types-CeXfY5Yv.js +0 -4
- package/dist/assets/types-Dzn4eD9c.js +0 -22
- package/dist/assets/types-q2_wITfk.js +0 -4
- package/dist/blocks/CaptureNetworkBlock.d.ts +0 -75
- package/dist/blocks/CaptureNetworkBlock.d.ts.map +0 -1
- package/dist/blocks/DataExtractBlock.d.ts +0 -23
- package/dist/blocks/DataExtractBlock.d.ts.map +0 -1
- package/dist/blocks/index.cjs +0 -4
- package/dist/blocks/index.js +0 -7839
- package/dist/blocks/logo.png +0 -0
- package/dist/logo.png +0 -0
- package/dist/manifest.json +0 -55
- package/dist/public/logo.png +0 -0
- package/dist/service-worker-loader.js +0 -3
- package/dist/src/blocks/AiParseDataBlock.ts.js +0 -111
- package/dist/src/blocks/CaptureNetworkBlock.ts.js +0 -55
- package/dist/src/blocks/ClearValueFormBlock.ts.js +0 -55
- package/dist/src/blocks/DataExtractBlock.ts.js +0 -28
- package/dist/src/blocks/ElementExistsBlock.ts.js +0 -26
- package/dist/src/blocks/EventClickBlock.ts.js +0 -143
- package/dist/src/blocks/ExportDataBlock.ts.js +0 -47
- package/dist/src/blocks/FetchApiBlock.ts.js +0 -50
- package/dist/src/blocks/GetAttributeValueBlock.ts.js +0 -33
- package/dist/src/blocks/GetElementDataBlock.ts.js +0 -114
- package/dist/src/blocks/GetTextBlock.ts.js +0 -152
- package/dist/src/blocks/GetValueFormBlock.ts.js +0 -52
- package/dist/src/blocks/KeypressBlock.ts.js +0 -89
- package/dist/src/blocks/NavigateBlock.ts.js +0 -48
- package/dist/src/blocks/NetworkCatchBlock.ts.js +0 -61
- package/dist/src/blocks/SaveAssetsBlock.ts.js +0 -35
- package/dist/src/blocks/ScrollBlock.ts.js +0 -111
- package/dist/src/blocks/SetValueFormBlock.ts.js +0 -56
- package/dist/src/blocks/TransformDataBlock.ts.js +0 -42
- package/dist/src/blocks/WaitBlock.ts.js +0 -24
- package/dist/src/blocks/WaitForConditionBlock.ts.js +0 -187
- package/dist/src/blocks/index.ts.js +0 -198
- package/dist/src/blocks/types.ts.js +0 -11
- package/dist/src/content/components/ConfirmationUI.tsx.js +0 -244
- package/dist/src/content/components/ExecutionStatusUI.tsx.js +0 -223
- package/dist/src/content/elements/finders/CssSelector.ts.js +0 -51
- package/dist/src/content/elements/finders/ElementSelector.ts.js +0 -20
- package/dist/src/content/elements/finders/IframeSelector.ts.js +0 -32
- package/dist/src/content/elements/finders/ShadowDOMSelector.ts.js +0 -38
- package/dist/src/content/elements/finders/XPathFinder.ts.js +0 -32
- package/dist/src/content/elements/index.ts.js +0 -26
- package/dist/src/content/elements/utils/CSSSelectorGenerator.ts.js +0 -72
- package/dist/src/content/elements/utils/XPathGenerator.ts.js +0 -62
- package/dist/src/content/handler/ExternalMessageHandler.ts.js +0 -78
- package/dist/src/content/handler/InternalMessageHandler.ts.js +0 -40
- package/dist/src/content/kernel/MessageKernel.ts.js +0 -83
- package/dist/src/content/main.tsx-loader.js +0 -22
- package/dist/src/content/main.tsx.js +0 -50
- package/dist/src/content/utils/index.ts.js +0 -1
- package/dist/src/content/utils/synchronizedLock.ts.js +0 -35
- package/dist/src/popup/index.html +0 -12
- package/dist/src/sdk/types.ts.js +0 -150
- package/dist/src/types/internal-messages.ts.js +0 -27
- package/dist/src/workflow/context/execution-context/types.ts.js +0 -0
- package/dist/vendor/.vite-deps-chunk-2TUXWMP5.js__v--29d58732.js +0 -45
- package/dist/vendor/.vite-deps-chunk-2TUXWMP5.js__v--34285d49.js +0 -45
- package/dist/vendor/.vite-deps-chunk-2TUXWMP5.js__v--36a0c079.js +0 -45
- package/dist/vendor/.vite-deps-chunk-2TUXWMP5.js__v--7cce5f32.js +0 -45
- package/dist/vendor/.vite-deps-chunk-2TUXWMP5.js__v--8598b0e0.js +0 -45
- package/dist/vendor/.vite-deps-chunk-2TUXWMP5.js__v--9054997c.js +0 -45
- package/dist/vendor/.vite-deps-chunk-2TUXWMP5.js__v--a79cb78d.js +0 -45
- package/dist/vendor/.vite-deps-chunk-2TUXWMP5.js__v--af906259.js +0 -45
- package/dist/vendor/.vite-deps-chunk-2TUXWMP5.js__v--e041f26d.js +0 -45
- package/dist/vendor/.vite-deps-chunk-2TUXWMP5.js__v--e1405dc4.js +0 -45
- package/dist/vendor/.vite-deps-chunk-2TUXWMP5.js__v--e2a1f584.js +0 -45
- package/dist/vendor/.vite-deps-chunk-DC5AMYBS.js__v--87b685c1.js +0 -38
- package/dist/vendor/.vite-deps-chunk-EL3BNLGW.js__v--29d58732.js +0 -975
- package/dist/vendor/.vite-deps-chunk-EL3BNLGW.js__v--34285d49.js +0 -975
- package/dist/vendor/.vite-deps-chunk-EL3BNLGW.js__v--36a0c079.js +0 -975
- package/dist/vendor/.vite-deps-chunk-EL3BNLGW.js__v--7cce5f32.js +0 -975
- package/dist/vendor/.vite-deps-chunk-EL3BNLGW.js__v--8598b0e0.js +0 -975
- package/dist/vendor/.vite-deps-chunk-EL3BNLGW.js__v--a79cb78d.js +0 -975
- package/dist/vendor/.vite-deps-chunk-EL3BNLGW.js__v--af906259.js +0 -975
- package/dist/vendor/.vite-deps-chunk-EL3BNLGW.js__v--e041f26d.js +0 -975
- package/dist/vendor/.vite-deps-chunk-EL3BNLGW.js__v--e1405dc4.js +0 -975
- package/dist/vendor/.vite-deps-chunk-EL3BNLGW.js__v--e2a1f584.js +0 -975
- package/dist/vendor/.vite-deps-chunk-KDMJ4XM7.js__v--87b685c1.js +0 -4154
- package/dist/vendor/.vite-deps-chunk-MANNBT4V.js__v--87b685c1.js +0 -280
- package/dist/vendor/.vite-deps-chunk-NZP3G7XT.js__v--87b685c1.js +0 -975
- package/dist/vendor/.vite-deps-chunk-QIBDMRD4.js__v--36a0c079.js +0 -4158
- package/dist/vendor/.vite-deps-chunk-QIBDMRD4.js__v--8598b0e0.js +0 -4158
- package/dist/vendor/.vite-deps-chunk-QIBDMRD4.js__v--9054997c.js +0 -4158
- package/dist/vendor/.vite-deps-chunk-QIBDMRD4.js__v--a79cb78d.js +0 -4158
- package/dist/vendor/.vite-deps-chunk-QIBDMRD4.js__v--e041f26d.js +0 -4158
- package/dist/vendor/.vite-deps-chunk-QIBDMRD4.js__v--e2a1f584.js +0 -4158
- package/dist/vendor/.vite-deps-chunk-UW5CEYRC.js__v--29d58732.js +0 -4154
- package/dist/vendor/.vite-deps-chunk-UW5CEYRC.js__v--34285d49.js +0 -4154
- package/dist/vendor/.vite-deps-chunk-UW5CEYRC.js__v--7cce5f32.js +0 -4154
- package/dist/vendor/.vite-deps-chunk-UW5CEYRC.js__v--af906259.js +0 -4154
- package/dist/vendor/.vite-deps-chunk-UW5CEYRC.js__v--e1405dc4.js +0 -4154
- package/dist/vendor/.vite-deps-chunk-XHY3JSIG.js__v--29d58732.js +0 -280
- package/dist/vendor/.vite-deps-chunk-XHY3JSIG.js__v--34285d49.js +0 -280
- package/dist/vendor/.vite-deps-chunk-XHY3JSIG.js__v--36a0c079.js +0 -280
- package/dist/vendor/.vite-deps-chunk-XHY3JSIG.js__v--7cce5f32.js +0 -280
- package/dist/vendor/.vite-deps-chunk-XHY3JSIG.js__v--8598b0e0.js +0 -280
- package/dist/vendor/.vite-deps-chunk-XHY3JSIG.js__v--a79cb78d.js +0 -280
- package/dist/vendor/.vite-deps-chunk-XHY3JSIG.js__v--af906259.js +0 -280
- package/dist/vendor/.vite-deps-chunk-XHY3JSIG.js__v--e041f26d.js +0 -280
- package/dist/vendor/.vite-deps-chunk-XHY3JSIG.js__v--e1405dc4.js +0 -280
- package/dist/vendor/.vite-deps-chunk-XHY3JSIG.js__v--e2a1f584.js +0 -280
- package/dist/vendor/.vite-deps-jsonata.js__v--1f855851.js +0 -5761
- package/dist/vendor/.vite-deps-jsonata.js__v--34285d49.js +0 -5761
- package/dist/vendor/.vite-deps-jsonata.js__v--370b8ffe.js +0 -5761
- package/dist/vendor/.vite-deps-jsonata.js__v--7496ecd5.js +0 -5761
- package/dist/vendor/.vite-deps-jsonata.js__v--7cce5f32.js +0 -5761
- package/dist/vendor/.vite-deps-jsonata.js__v--8598b0e0.js +0 -5761
- package/dist/vendor/.vite-deps-jsonata.js__v--989ee283.js +0 -5761
- package/dist/vendor/.vite-deps-jsonata.js__v--aa4cf553.js +0 -5761
- package/dist/vendor/.vite-deps-jsonata.js__v--af906259.js +0 -5761
- package/dist/vendor/.vite-deps-jsonata.js__v--d602c657.js +0 -5761
- package/dist/vendor/.vite-deps-jsonata.js__v--e041f26d.js +0 -5761
- package/dist/vendor/.vite-deps-jsonata.js__v--e2a1f584.js +0 -5761
- package/dist/vendor/.vite-deps-react-dom.js__v--1217aa43.js +0 -6
- package/dist/vendor/.vite-deps-react-dom.js__v--34285d49.js +0 -6
- package/dist/vendor/.vite-deps-react-dom.js__v--36c31e85.js +0 -6
- package/dist/vendor/.vite-deps-react-dom.js__v--7cce5f32.js +0 -6
- package/dist/vendor/.vite-deps-react-dom.js__v--8313ef2c.js +0 -6
- package/dist/vendor/.vite-deps-react-dom.js__v--8598b0e0.js +0 -6
- package/dist/vendor/.vite-deps-react-dom.js__v--87af57af.js +0 -6
- package/dist/vendor/.vite-deps-react-dom.js__v--9967e564.js +0 -6
- package/dist/vendor/.vite-deps-react-dom.js__v--af906259.js +0 -6
- package/dist/vendor/.vite-deps-react-dom.js__v--e041f26d.js +0 -6
- package/dist/vendor/.vite-deps-react-dom.js__v--e2a1f584.js +0 -6
- package/dist/vendor/.vite-deps-react-dom_client.js__v--05e7db8c.js +0 -18108
- package/dist/vendor/.vite-deps-react-dom_client.js__v--34285d49.js +0 -18108
- package/dist/vendor/.vite-deps-react-dom_client.js__v--7cce5f32.js +0 -18108
- package/dist/vendor/.vite-deps-react-dom_client.js__v--8598b0e0.js +0 -18108
- package/dist/vendor/.vite-deps-react-dom_client.js__v--8ec6d0f4.js +0 -18108
- package/dist/vendor/.vite-deps-react-dom_client.js__v--a69c8f91.js +0 -18108
- package/dist/vendor/.vite-deps-react-dom_client.js__v--aaaed31d.js +0 -18108
- package/dist/vendor/.vite-deps-react-dom_client.js__v--af906259.js +0 -18108
- package/dist/vendor/.vite-deps-react-dom_client.js__v--e041f26d.js +0 -18108
- package/dist/vendor/.vite-deps-react-dom_client.js__v--e2a1f584.js +0 -18108
- package/dist/vendor/.vite-deps-react-dom_client.js__v--f80719e9.js +0 -18108
- package/dist/vendor/.vite-deps-react.js__v--1217aa43.js +0 -5
- package/dist/vendor/.vite-deps-react.js__v--34285d49.js +0 -5
- package/dist/vendor/.vite-deps-react.js__v--36c31e85.js +0 -5
- package/dist/vendor/.vite-deps-react.js__v--7cce5f32.js +0 -5
- package/dist/vendor/.vite-deps-react.js__v--8313ef2c.js +0 -5
- package/dist/vendor/.vite-deps-react.js__v--8598b0e0.js +0 -5
- package/dist/vendor/.vite-deps-react.js__v--87af57af.js +0 -5
- package/dist/vendor/.vite-deps-react.js__v--9967e564.js +0 -5
- package/dist/vendor/.vite-deps-react.js__v--af906259.js +0 -5
- package/dist/vendor/.vite-deps-react.js__v--e041f26d.js +0 -5
- package/dist/vendor/.vite-deps-react.js__v--e2a1f584.js +0 -5
- package/dist/vendor/.vite-deps-react_jsx-dev-runtime.js__v--1217aa43.js +0 -281
- package/dist/vendor/.vite-deps-react_jsx-dev-runtime.js__v--34285d49.js +0 -281
- package/dist/vendor/.vite-deps-react_jsx-dev-runtime.js__v--36c31e85.js +0 -281
- package/dist/vendor/.vite-deps-react_jsx-dev-runtime.js__v--7cce5f32.js +0 -281
- package/dist/vendor/.vite-deps-react_jsx-dev-runtime.js__v--8313ef2c.js +0 -281
- package/dist/vendor/.vite-deps-react_jsx-dev-runtime.js__v--8598b0e0.js +0 -281
- package/dist/vendor/.vite-deps-react_jsx-dev-runtime.js__v--87af57af.js +0 -281
- package/dist/vendor/.vite-deps-react_jsx-dev-runtime.js__v--9967e564.js +0 -281
- package/dist/vendor/.vite-deps-react_jsx-dev-runtime.js__v--af906259.js +0 -281
- package/dist/vendor/.vite-deps-react_jsx-dev-runtime.js__v--e041f26d.js +0 -281
- package/dist/vendor/.vite-deps-react_jsx-dev-runtime.js__v--e2a1f584.js +0 -281
- package/dist/vendor/.vite-deps-zod.js__v--34285d49.js +0 -222
- package/dist/vendor/.vite-deps-zod.js__v--6548a37a.js +0 -222
- package/dist/vendor/.vite-deps-zod.js__v--706a718e.js +0 -219
- package/dist/vendor/.vite-deps-zod.js__v--7cce5f32.js +0 -222
- package/dist/vendor/.vite-deps-zod.js__v--8598b0e0.js +0 -219
- package/dist/vendor/.vite-deps-zod.js__v--9e0f4cc1.js +0 -219
- package/dist/vendor/.vite-deps-zod.js__v--af906259.js +0 -222
- package/dist/vendor/.vite-deps-zod.js__v--b73c580c.js +0 -219
- package/dist/vendor/.vite-deps-zod.js__v--dc9842e6.js +0 -222
- package/dist/vendor/.vite-deps-zod.js__v--e041f26d.js +0 -219
- package/dist/vendor/.vite-deps-zod.js__v--e2a1f584.js +0 -219
- package/dist/vendor/.vite-deps-zod.js__v--e4714212.js +0 -222
- package/dist/vendor/crx-client-port.js +0 -66
- package/dist/vendor/crx-client-preamble.js +0 -4
- package/dist/vendor/react-refresh.js +0 -670
- package/dist/vendor/vite-client.js +0 -1134
- package/dist/vendor/vite-dist-client-env.mjs.js +0 -24
- package/dist/vendor/webcomponents-custom-elements.js +0 -47
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import z from "/vendor/.vite-deps-zod.js__v--34285d49.js";
|
|
2
|
-
import { BaseBlockSchema } from "/src/blocks/types.ts.js";
|
|
3
|
-
import { findElement } from "/src/content/elements/index.ts.js";
|
|
4
|
-
import { CSSSelectorGenerator } from "/src/content/elements/utils/CSSSelectorGenerator.ts.js";
|
|
5
|
-
import { XPathGenerator } from "/src/content/elements/utils/XPathGenerator.ts.js";
|
|
6
|
-
export const GetElementDataBlockSchema = BaseBlockSchema.extend({
|
|
7
|
-
name: z.literal("get-element-data"),
|
|
8
|
-
includeText: z.boolean().optional(),
|
|
9
|
-
includeTags: z.boolean().optional(),
|
|
10
|
-
useTextContent: z.boolean().optional(),
|
|
11
|
-
regex: z.string().optional(),
|
|
12
|
-
prefixText: z.string().optional(),
|
|
13
|
-
suffixText: z.string().optional(),
|
|
14
|
-
attributes: z.array(z.string()).optional(),
|
|
15
|
-
includeSelector: z.boolean().optional(),
|
|
16
|
-
includeXPath: z.boolean().optional()
|
|
17
|
-
});
|
|
18
|
-
export function validateGetElementDataBlock(data) {
|
|
19
|
-
return GetElementDataBlockSchema.parse(data);
|
|
20
|
-
}
|
|
21
|
-
export async function handlerGetElementData(data) {
|
|
22
|
-
try {
|
|
23
|
-
const {
|
|
24
|
-
selector = "",
|
|
25
|
-
includeText = true,
|
|
26
|
-
includeTags = false,
|
|
27
|
-
useTextContent = false,
|
|
28
|
-
regex,
|
|
29
|
-
prefixText = "",
|
|
30
|
-
suffixText = "",
|
|
31
|
-
attributes = [],
|
|
32
|
-
includeSelector = false,
|
|
33
|
-
includeXPath = false,
|
|
34
|
-
findBy = "cssSelector",
|
|
35
|
-
option
|
|
36
|
-
} = data;
|
|
37
|
-
if (!selector) {
|
|
38
|
-
throw new Error("Selector is required for get-element-data block");
|
|
39
|
-
}
|
|
40
|
-
if (!includeText && attributes.length === 0) {
|
|
41
|
-
throw new Error("Either includeText must be true or attributes must be provided");
|
|
42
|
-
}
|
|
43
|
-
const elements = await findElement({ selector, findBy, option });
|
|
44
|
-
if (!elements) {
|
|
45
|
-
return { data: Array.isArray(elements) ? [] : {} };
|
|
46
|
-
}
|
|
47
|
-
const extractElementData = createElementDataExtractor(
|
|
48
|
-
includeText,
|
|
49
|
-
includeTags,
|
|
50
|
-
useTextContent,
|
|
51
|
-
regex,
|
|
52
|
-
prefixText,
|
|
53
|
-
suffixText,
|
|
54
|
-
attributes,
|
|
55
|
-
includeSelector,
|
|
56
|
-
includeXPath
|
|
57
|
-
);
|
|
58
|
-
if (Array.isArray(elements)) {
|
|
59
|
-
const elementsData = elements.map(extractElementData);
|
|
60
|
-
return { data: elementsData };
|
|
61
|
-
} else {
|
|
62
|
-
const elementData = extractElementData(elements);
|
|
63
|
-
return { data: elementData };
|
|
64
|
-
}
|
|
65
|
-
} catch (error) {
|
|
66
|
-
return {
|
|
67
|
-
hasError: true,
|
|
68
|
-
message: error instanceof Error ? error.message : "Unknown error in get-element-data handler",
|
|
69
|
-
data: {}
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
function createElementDataExtractor(includeText, includeTags, useTextContent, regex, prefixText = "", suffixText = "", attributes = [], includeSelector = false, includeXPath = false) {
|
|
74
|
-
return (element) => {
|
|
75
|
-
const result = {};
|
|
76
|
-
if (includeText) {
|
|
77
|
-
let text = "";
|
|
78
|
-
if (includeTags) {
|
|
79
|
-
text = element.innerHTML;
|
|
80
|
-
} else {
|
|
81
|
-
text = useTextContent ? element.textContent || "" : element.innerText || "";
|
|
82
|
-
}
|
|
83
|
-
if (regex) {
|
|
84
|
-
const regexPattern = new RegExp(regex, "g");
|
|
85
|
-
const matches = text.match(regexPattern);
|
|
86
|
-
text = matches ? matches.join(" ") : "";
|
|
87
|
-
}
|
|
88
|
-
if (text.trim()) {
|
|
89
|
-
text = prefixText + text.trim() + suffixText;
|
|
90
|
-
}
|
|
91
|
-
result.text = text;
|
|
92
|
-
}
|
|
93
|
-
if (attributes.length > 0) {
|
|
94
|
-
result.attributes = {};
|
|
95
|
-
attributes.forEach((attrName) => {
|
|
96
|
-
let attrValue = element.getAttribute(attrName);
|
|
97
|
-
if (attrValue === null) {
|
|
98
|
-
const childWithAttr = element.querySelector(`[${attrName}]`);
|
|
99
|
-
if (childWithAttr) {
|
|
100
|
-
attrValue = childWithAttr.getAttribute(attrName);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
result.attributes[attrName] = attrValue;
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
if (includeSelector) {
|
|
107
|
-
result.selector = CSSSelectorGenerator.generate(element);
|
|
108
|
-
}
|
|
109
|
-
if (includeXPath) {
|
|
110
|
-
result.xpath = XPathGenerator.generate(element);
|
|
111
|
-
}
|
|
112
|
-
return result;
|
|
113
|
-
};
|
|
114
|
-
}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import z from "/vendor/.vite-deps-zod.js__v--34285d49.js";
|
|
2
|
-
import { BaseBlockSchema } from "/src/blocks/types.ts.js";
|
|
3
|
-
import { findElement } from "/src/content/elements/index.ts.js";
|
|
4
|
-
export const GetTextBlockSchema = BaseBlockSchema.extend({
|
|
5
|
-
name: z.literal("get-text"),
|
|
6
|
-
includeTags: z.boolean().optional(),
|
|
7
|
-
useTextContent: z.boolean().optional(),
|
|
8
|
-
regex: z.string().optional(),
|
|
9
|
-
prefixText: z.string().optional(),
|
|
10
|
-
suffixText: z.string().optional(),
|
|
11
|
-
filterEmpty: z.boolean().optional(),
|
|
12
|
-
scrollToCollect: z.boolean().optional(),
|
|
13
|
-
scrollDistance: z.number().optional(),
|
|
14
|
-
scrollWaitMs: z.number().optional(),
|
|
15
|
-
maxScrollAttempts: z.number().optional()
|
|
16
|
-
});
|
|
17
|
-
export function validateGetTextBlock(data) {
|
|
18
|
-
return GetTextBlockSchema.parse(data);
|
|
19
|
-
}
|
|
20
|
-
export async function handlerGetText(data) {
|
|
21
|
-
try {
|
|
22
|
-
const {
|
|
23
|
-
selector = "",
|
|
24
|
-
includeTags = false,
|
|
25
|
-
useTextContent = false,
|
|
26
|
-
regex,
|
|
27
|
-
prefixText = "",
|
|
28
|
-
suffixText = "",
|
|
29
|
-
findBy = "cssSelector",
|
|
30
|
-
option,
|
|
31
|
-
filterEmpty = true,
|
|
32
|
-
scrollToCollect = false,
|
|
33
|
-
scrollDistance = 500,
|
|
34
|
-
scrollWaitMs = 300,
|
|
35
|
-
maxScrollAttempts = 100
|
|
36
|
-
} = data;
|
|
37
|
-
if (!selector) {
|
|
38
|
-
throw new Error("Selector is required for get-text block");
|
|
39
|
-
}
|
|
40
|
-
if (scrollToCollect && option?.multiple) {
|
|
41
|
-
return await collectWithScroll({
|
|
42
|
-
selector,
|
|
43
|
-
findBy,
|
|
44
|
-
option,
|
|
45
|
-
includeTags,
|
|
46
|
-
useTextContent,
|
|
47
|
-
regex,
|
|
48
|
-
prefixText,
|
|
49
|
-
suffixText,
|
|
50
|
-
filterEmpty,
|
|
51
|
-
scrollDistance,
|
|
52
|
-
scrollWaitMs,
|
|
53
|
-
maxScrollAttempts
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
const elements = await findElement({ selector, findBy, option });
|
|
57
|
-
if (!elements) {
|
|
58
|
-
return { data: "" };
|
|
59
|
-
}
|
|
60
|
-
const extractText = createTextExtractor(
|
|
61
|
-
includeTags,
|
|
62
|
-
useTextContent,
|
|
63
|
-
regex,
|
|
64
|
-
prefixText,
|
|
65
|
-
suffixText
|
|
66
|
-
);
|
|
67
|
-
if (Array.isArray(elements)) {
|
|
68
|
-
const texts = elements.map(extractText);
|
|
69
|
-
const filteredTexts = filterEmpty ? texts.filter((text) => text.trim() !== "") : texts;
|
|
70
|
-
return { data: filteredTexts };
|
|
71
|
-
} else {
|
|
72
|
-
const text = extractText(elements);
|
|
73
|
-
return { data: text };
|
|
74
|
-
}
|
|
75
|
-
} catch (error) {
|
|
76
|
-
return {
|
|
77
|
-
hasError: true,
|
|
78
|
-
message: error instanceof Error ? error.message : "Unknown error in get-text handler",
|
|
79
|
-
data: ""
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
async function collectWithScroll(params) {
|
|
84
|
-
const {
|
|
85
|
-
selector,
|
|
86
|
-
findBy,
|
|
87
|
-
option,
|
|
88
|
-
includeTags,
|
|
89
|
-
useTextContent,
|
|
90
|
-
regex,
|
|
91
|
-
prefixText,
|
|
92
|
-
suffixText,
|
|
93
|
-
filterEmpty,
|
|
94
|
-
scrollDistance,
|
|
95
|
-
scrollWaitMs,
|
|
96
|
-
maxScrollAttempts
|
|
97
|
-
} = params;
|
|
98
|
-
const extractText = createTextExtractor(includeTags, useTextContent, regex, prefixText, suffixText);
|
|
99
|
-
const collectedTexts = /* @__PURE__ */ new Set();
|
|
100
|
-
let scrollAttempts = 0;
|
|
101
|
-
let consecutiveNoNewData = 0;
|
|
102
|
-
const maxConsecutiveNoNewData = 5;
|
|
103
|
-
while (scrollAttempts < maxScrollAttempts) {
|
|
104
|
-
const elements = await findElement({ selector, findBy, option });
|
|
105
|
-
if (elements && Array.isArray(elements)) {
|
|
106
|
-
const beforeSize = collectedTexts.size;
|
|
107
|
-
elements.forEach((element) => {
|
|
108
|
-
const text = extractText(element);
|
|
109
|
-
if (!filterEmpty || text.trim() !== "") {
|
|
110
|
-
collectedTexts.add(text);
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
const afterSize = collectedTexts.size;
|
|
114
|
-
if (afterSize === beforeSize) {
|
|
115
|
-
consecutiveNoNewData++;
|
|
116
|
-
if (consecutiveNoNewData >= maxConsecutiveNoNewData) {
|
|
117
|
-
break;
|
|
118
|
-
}
|
|
119
|
-
} else {
|
|
120
|
-
consecutiveNoNewData = 0;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
const currentScrollTop = window.pageYOffset || document.documentElement.scrollTop;
|
|
124
|
-
window.scrollBy({ top: scrollDistance, behavior: "auto" });
|
|
125
|
-
await new Promise((resolve) => setTimeout(resolve, scrollWaitMs));
|
|
126
|
-
const newScrollTop = window.pageYOffset || document.documentElement.scrollTop;
|
|
127
|
-
if (newScrollTop === currentScrollTop) {
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
scrollAttempts++;
|
|
131
|
-
}
|
|
132
|
-
return { data: Array.from(collectedTexts) };
|
|
133
|
-
}
|
|
134
|
-
function createTextExtractor(includeTags, useTextContent, regex, prefixText = "", suffixText = "") {
|
|
135
|
-
return (element) => {
|
|
136
|
-
let text = "";
|
|
137
|
-
if (includeTags) {
|
|
138
|
-
text = element.innerHTML;
|
|
139
|
-
} else {
|
|
140
|
-
text = useTextContent ? element.textContent || "" : element.innerText || "";
|
|
141
|
-
}
|
|
142
|
-
if (regex) {
|
|
143
|
-
const regexPattern = new RegExp(regex, "g");
|
|
144
|
-
const matches = text.match(regexPattern);
|
|
145
|
-
text = matches ? matches.join(" ") : "";
|
|
146
|
-
}
|
|
147
|
-
if (text.trim()) {
|
|
148
|
-
text = prefixText + text.trim() + suffixText;
|
|
149
|
-
}
|
|
150
|
-
return text;
|
|
151
|
-
};
|
|
152
|
-
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { findElement } from "/src/content/elements/index.ts.js";
|
|
2
|
-
import { BaseBlockSchema } from "/src/blocks/types.ts.js";
|
|
3
|
-
import z from "/vendor/.vite-deps-zod.js__v--34285d49.js";
|
|
4
|
-
export const GetValueFormsBlockSchema = BaseBlockSchema.extend({
|
|
5
|
-
name: z.literal("get-value-form"),
|
|
6
|
-
type: z.enum(["text-field", "select", "checkbox"]).optional()
|
|
7
|
-
});
|
|
8
|
-
export function validateGetValueFormsBlock(data) {
|
|
9
|
-
return GetValueFormsBlockSchema.parse(data);
|
|
10
|
-
}
|
|
11
|
-
export async function handlerGetValueForm(data) {
|
|
12
|
-
try {
|
|
13
|
-
const { selector = "", type = "text-field", findBy = "cssSelector" } = data;
|
|
14
|
-
if (!selector) {
|
|
15
|
-
throw new Error("Selector is required for get-value-form block");
|
|
16
|
-
}
|
|
17
|
-
const element = await findElement({ selector, findBy, option: data.option });
|
|
18
|
-
if (!element) {
|
|
19
|
-
throw new Error("Form element not found");
|
|
20
|
-
}
|
|
21
|
-
const value = getFormValue(element, type);
|
|
22
|
-
return { data: value };
|
|
23
|
-
} catch (error) {
|
|
24
|
-
return {
|
|
25
|
-
hasError: true,
|
|
26
|
-
message: error instanceof Error ? error.message : "Unknown error in get-value-form handler",
|
|
27
|
-
data: null
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function getFormValue(element, type) {
|
|
32
|
-
switch (type) {
|
|
33
|
-
case "text-field":
|
|
34
|
-
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
|
|
35
|
-
return element.value;
|
|
36
|
-
}
|
|
37
|
-
break;
|
|
38
|
-
case "select":
|
|
39
|
-
if (element instanceof HTMLSelectElement) {
|
|
40
|
-
return element.value;
|
|
41
|
-
}
|
|
42
|
-
break;
|
|
43
|
-
case "checkbox":
|
|
44
|
-
if (element instanceof HTMLInputElement && element.type === "checkbox") {
|
|
45
|
-
return element.checked;
|
|
46
|
-
}
|
|
47
|
-
break;
|
|
48
|
-
default:
|
|
49
|
-
throw new Error(`Unsupported form element type: ${type}`);
|
|
50
|
-
}
|
|
51
|
-
throw new Error(`Invalid element type for ${type}`);
|
|
52
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import z from "/vendor/.vite-deps-zod.js__v--34285d49.js";
|
|
2
|
-
export const KeypressBlockSchema = z.object({
|
|
3
|
-
name: z.literal("keypress"),
|
|
4
|
-
key: z.string(),
|
|
5
|
-
code: z.string().optional(),
|
|
6
|
-
keyCode: z.number().optional(),
|
|
7
|
-
modifiers: z.array(z.enum(["Alt", "Control", "Meta", "Shift"])).optional()
|
|
8
|
-
});
|
|
9
|
-
export function validateKeypressBlock(data) {
|
|
10
|
-
return KeypressBlockSchema.parse(data);
|
|
11
|
-
}
|
|
12
|
-
export async function handlerKeypress(data) {
|
|
13
|
-
try {
|
|
14
|
-
const { key, code, keyCode, modifiers = [] } = data;
|
|
15
|
-
await simulateKeypress(key, code, keyCode, modifiers);
|
|
16
|
-
return { data: true };
|
|
17
|
-
} catch (error) {
|
|
18
|
-
console.log(error);
|
|
19
|
-
return {
|
|
20
|
-
hasError: true,
|
|
21
|
-
message: error instanceof Error ? error.message : "Unknown error in keypress handler",
|
|
22
|
-
data: false
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
async function simulateKeypress(key, code, keyCode, modifiers = []) {
|
|
27
|
-
try {
|
|
28
|
-
const response = await chrome.runtime.sendMessage({
|
|
29
|
-
type: "CDP_KEYPRESS",
|
|
30
|
-
data: {
|
|
31
|
-
key,
|
|
32
|
-
code: code || key,
|
|
33
|
-
keyCode: keyCode || getKeyCodeFromKey(key),
|
|
34
|
-
modifiers
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
if (response && !response.$isError) {
|
|
38
|
-
console.log("[Keypress] CDP keypress successful:", response);
|
|
39
|
-
} else {
|
|
40
|
-
throw new Error(response?.message || "CDP keypress failed");
|
|
41
|
-
}
|
|
42
|
-
} catch (error) {
|
|
43
|
-
console.error("[Keypress] CDP keypress failed, falling back to native dispatch:", error);
|
|
44
|
-
const keydownEvent = new KeyboardEvent("keydown", {
|
|
45
|
-
key,
|
|
46
|
-
code: code || key,
|
|
47
|
-
keyCode: keyCode || getKeyCodeFromKey(key),
|
|
48
|
-
bubbles: true,
|
|
49
|
-
cancelable: true,
|
|
50
|
-
...getModifierStates(modifiers)
|
|
51
|
-
});
|
|
52
|
-
const keyupEvent = new KeyboardEvent("keyup", {
|
|
53
|
-
key,
|
|
54
|
-
code: code || key,
|
|
55
|
-
keyCode: keyCode || getKeyCodeFromKey(key),
|
|
56
|
-
bubbles: true,
|
|
57
|
-
cancelable: true,
|
|
58
|
-
...getModifierStates(modifiers)
|
|
59
|
-
});
|
|
60
|
-
document.dispatchEvent(keydownEvent);
|
|
61
|
-
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
62
|
-
document.dispatchEvent(keyupEvent);
|
|
63
|
-
}
|
|
64
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
65
|
-
}
|
|
66
|
-
function getKeyCodeFromKey(key) {
|
|
67
|
-
const keyCodeMap = {
|
|
68
|
-
"Escape": 27,
|
|
69
|
-
"Enter": 13,
|
|
70
|
-
"Tab": 9,
|
|
71
|
-
"Backspace": 8,
|
|
72
|
-
"Delete": 46,
|
|
73
|
-
"ArrowUp": 38,
|
|
74
|
-
"ArrowDown": 40,
|
|
75
|
-
"ArrowLeft": 37,
|
|
76
|
-
"ArrowRight": 39,
|
|
77
|
-
"Space": 32,
|
|
78
|
-
" ": 32
|
|
79
|
-
};
|
|
80
|
-
return keyCodeMap[key] || 0;
|
|
81
|
-
}
|
|
82
|
-
function getModifierStates(modifiers) {
|
|
83
|
-
return {
|
|
84
|
-
altKey: modifiers.includes("Alt"),
|
|
85
|
-
ctrlKey: modifiers.includes("Control"),
|
|
86
|
-
metaKey: modifiers.includes("Meta"),
|
|
87
|
-
shiftKey: modifiers.includes("Shift")
|
|
88
|
-
};
|
|
89
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import z from "/vendor/.vite-deps-zod.js__v--34285d49.js";
|
|
2
|
-
export const NavigateBlockSchema = z.object({
|
|
3
|
-
name: z.literal("navigate"),
|
|
4
|
-
url: z.string().url("Valid URL is required"),
|
|
5
|
-
waitForLoad: z.boolean().optional(),
|
|
6
|
-
timeout: z.number().min(0).optional()
|
|
7
|
-
});
|
|
8
|
-
export function validateNavigateBlock(data) {
|
|
9
|
-
return NavigateBlockSchema.parse(data);
|
|
10
|
-
}
|
|
11
|
-
export async function handlerNavigate(data) {
|
|
12
|
-
try {
|
|
13
|
-
const { url, waitForLoad = true, timeout = 3e4 } = data;
|
|
14
|
-
console.log(`[Navigate] Navigating to: ${url}`);
|
|
15
|
-
if (waitForLoad) {
|
|
16
|
-
return new Promise((resolve, reject) => {
|
|
17
|
-
const timeoutId = setTimeout(() => {
|
|
18
|
-
reject(new Error(`Navigation timeout after ${timeout}ms`));
|
|
19
|
-
}, timeout);
|
|
20
|
-
const handleLoad = () => {
|
|
21
|
-
clearTimeout(timeoutId);
|
|
22
|
-
window.removeEventListener("load", handleLoad);
|
|
23
|
-
console.log(`[Navigate] Page loaded: ${url}`);
|
|
24
|
-
resolve({ data: true });
|
|
25
|
-
};
|
|
26
|
-
if (document.readyState === "complete") {
|
|
27
|
-
clearTimeout(timeoutId);
|
|
28
|
-
console.log(`[Navigate] Page already loaded: ${url}`);
|
|
29
|
-
resolve({ data: true });
|
|
30
|
-
} else {
|
|
31
|
-
window.addEventListener("load", handleLoad);
|
|
32
|
-
}
|
|
33
|
-
window.location.href = url;
|
|
34
|
-
});
|
|
35
|
-
} else {
|
|
36
|
-
window.location.href = url;
|
|
37
|
-
console.log(`[Navigate] Navigation initiated (no wait): ${url}`);
|
|
38
|
-
return { data: true };
|
|
39
|
-
}
|
|
40
|
-
} catch (error) {
|
|
41
|
-
console.error("[Navigate] Error:", error);
|
|
42
|
-
return {
|
|
43
|
-
hasError: true,
|
|
44
|
-
message: error instanceof Error ? error.message : "Unknown error in navigate handler",
|
|
45
|
-
data: false
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import z from "/vendor/.vite-deps-zod.js__v--34285d49.js";
|
|
2
|
-
export const NetworkCatchBlockSchema = z.object({
|
|
3
|
-
name: z.literal("network-catch"),
|
|
4
|
-
urlPattern: z.string().optional(),
|
|
5
|
-
method: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"]).optional(),
|
|
6
|
-
status: z.union([
|
|
7
|
-
z.number(),
|
|
8
|
-
z.object({
|
|
9
|
-
min: z.number().optional(),
|
|
10
|
-
max: z.number().optional()
|
|
11
|
-
})
|
|
12
|
-
]).optional(),
|
|
13
|
-
mimeType: z.string().optional(),
|
|
14
|
-
requestBodyPattern: z.union([
|
|
15
|
-
z.string(),
|
|
16
|
-
z.record(z.any())
|
|
17
|
-
]).optional(),
|
|
18
|
-
waitForRequest: z.boolean().optional(),
|
|
19
|
-
waitTimeout: z.number().min(0).optional(),
|
|
20
|
-
returnAll: z.boolean().optional(),
|
|
21
|
-
includeHeaders: z.boolean().optional()
|
|
22
|
-
});
|
|
23
|
-
export function validateNetworkCatchBlock(data) {
|
|
24
|
-
return NetworkCatchBlockSchema.parse(data);
|
|
25
|
-
}
|
|
26
|
-
export async function handlerNetworkCatch(data) {
|
|
27
|
-
try {
|
|
28
|
-
console.log("[NetworkCatchBlock] Fetching network requests with pattern:", data.urlPattern);
|
|
29
|
-
const response = await chrome.runtime.sendMessage({
|
|
30
|
-
type: "NETWORK_CATCH",
|
|
31
|
-
data: {
|
|
32
|
-
urlPattern: data.urlPattern,
|
|
33
|
-
method: data.method,
|
|
34
|
-
status: data.status,
|
|
35
|
-
mimeType: data.mimeType,
|
|
36
|
-
requestBodyPattern: data.requestBodyPattern,
|
|
37
|
-
waitForRequest: data.waitForRequest || false,
|
|
38
|
-
waitTimeout: data.waitTimeout || 5e3,
|
|
39
|
-
returnAll: data.returnAll || false,
|
|
40
|
-
includeHeaders: data.includeHeaders || false
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
if (response.$isError) {
|
|
44
|
-
return {
|
|
45
|
-
hasError: true,
|
|
46
|
-
message: response.message || "Failed to fetch network data",
|
|
47
|
-
data: void 0
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
console.log("[NetworkCatchBlock] Retrieved network data:", response.data);
|
|
51
|
-
return {
|
|
52
|
-
data: response.data
|
|
53
|
-
};
|
|
54
|
-
} catch (error) {
|
|
55
|
-
console.error("[NetworkCatchBlock] Error:", error);
|
|
56
|
-
return {
|
|
57
|
-
hasError: true,
|
|
58
|
-
message: error instanceof Error ? error.message : "Failed to fetch network data"
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { findElement } from "/src/content/elements/index.ts.js";
|
|
2
|
-
import { BaseBlockSchema } from "/src/blocks/types.ts.js";
|
|
3
|
-
import z from "/vendor/.vite-deps-zod.js__v--34285d49.js";
|
|
4
|
-
export const SaveAssetsBlockSchema = BaseBlockSchema.extend({
|
|
5
|
-
name: z.literal("save-assets")
|
|
6
|
-
});
|
|
7
|
-
export function validateSaveAssetsBlock(data) {
|
|
8
|
-
return SaveAssetsBlockSchema.parse(data);
|
|
9
|
-
}
|
|
10
|
-
export async function handlerSaveAssets(data) {
|
|
11
|
-
try {
|
|
12
|
-
const { selector = "img, audio, video, source", findBy = "cssSelector", option } = data;
|
|
13
|
-
const elements = await findElement({ selector, findBy, option });
|
|
14
|
-
if (!elements || !Array.isArray(elements)) {
|
|
15
|
-
return { data: [] };
|
|
16
|
-
}
|
|
17
|
-
const assetUrls = [];
|
|
18
|
-
elements.forEach((element) => {
|
|
19
|
-
let src = "";
|
|
20
|
-
if (element instanceof HTMLImageElement || element instanceof HTMLAudioElement || element instanceof HTMLVideoElement || element instanceof HTMLSourceElement) {
|
|
21
|
-
src = element.src;
|
|
22
|
-
}
|
|
23
|
-
if (src && !assetUrls.includes(src)) {
|
|
24
|
-
assetUrls.push(src);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
return { data: assetUrls };
|
|
28
|
-
} catch (error) {
|
|
29
|
-
return {
|
|
30
|
-
hasError: true,
|
|
31
|
-
message: error instanceof Error ? error.message : "Unknown error in save-assets handler",
|
|
32
|
-
data: null
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import z from "/vendor/.vite-deps-zod.js__v--34285d49.js";
|
|
2
|
-
import { BaseBlockSchema } from "/src/blocks/types.ts.js";
|
|
3
|
-
import { findElement } from "/src/content/elements/index.ts.js";
|
|
4
|
-
export const ScrollBlockSchema = BaseBlockSchema.extend({
|
|
5
|
-
name: z.literal("scroll"),
|
|
6
|
-
scrollType: z.enum(["toElement", "toBottom", "byDistance", "untilLoaded"]).optional(),
|
|
7
|
-
distance: z.number().optional(),
|
|
8
|
-
behavior: z.enum(["auto", "smooth"]).optional(),
|
|
9
|
-
maxScrolls: z.number().optional(),
|
|
10
|
-
waitAfterScroll: z.number().optional()
|
|
11
|
-
});
|
|
12
|
-
export function validateScrollBlock(data) {
|
|
13
|
-
return ScrollBlockSchema.parse(data);
|
|
14
|
-
}
|
|
15
|
-
export async function handlerScroll(data) {
|
|
16
|
-
try {
|
|
17
|
-
const {
|
|
18
|
-
selector = "",
|
|
19
|
-
scrollType = "toBottom",
|
|
20
|
-
distance = 500,
|
|
21
|
-
behavior = "smooth",
|
|
22
|
-
maxScrolls = 50,
|
|
23
|
-
waitAfterScroll = 300,
|
|
24
|
-
findBy = "cssSelector",
|
|
25
|
-
option
|
|
26
|
-
} = data;
|
|
27
|
-
switch (scrollType) {
|
|
28
|
-
case "toElement":
|
|
29
|
-
if (!selector) {
|
|
30
|
-
throw new Error("Selector is required for toElement scroll type");
|
|
31
|
-
}
|
|
32
|
-
return await scrollToElement(selector, findBy, option, behavior);
|
|
33
|
-
case "toBottom":
|
|
34
|
-
return await scrollToBottom(behavior, waitAfterScroll);
|
|
35
|
-
case "byDistance":
|
|
36
|
-
return await scrollByDistance(distance, behavior);
|
|
37
|
-
case "untilLoaded":
|
|
38
|
-
return await scrollUntilLoaded(maxScrolls, distance, behavior, waitAfterScroll);
|
|
39
|
-
default:
|
|
40
|
-
throw new Error(`Unknown scroll type: ${scrollType}`);
|
|
41
|
-
}
|
|
42
|
-
} catch (error) {
|
|
43
|
-
return {
|
|
44
|
-
hasError: true,
|
|
45
|
-
message: error instanceof Error ? error.message : "Unknown error in scroll handler",
|
|
46
|
-
data: false
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
async function scrollToElement(selector, findBy, option, behavior) {
|
|
51
|
-
const element = await findElement({ selector, findBy, option });
|
|
52
|
-
if (!element) {
|
|
53
|
-
return {
|
|
54
|
-
hasError: true,
|
|
55
|
-
message: "Element not found for scrolling",
|
|
56
|
-
data: false
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
const targetElement = Array.isArray(element) ? element[0] : element;
|
|
60
|
-
targetElement.scrollIntoView({ behavior, block: "center" });
|
|
61
|
-
return { data: true };
|
|
62
|
-
}
|
|
63
|
-
async function scrollToBottom(behavior, waitAfterScroll) {
|
|
64
|
-
let lastHeight = document.body.scrollHeight;
|
|
65
|
-
let attempts = 0;
|
|
66
|
-
const maxAttempts = 50;
|
|
67
|
-
while (attempts < maxAttempts) {
|
|
68
|
-
window.scrollTo({
|
|
69
|
-
top: document.body.scrollHeight,
|
|
70
|
-
behavior
|
|
71
|
-
});
|
|
72
|
-
await new Promise((resolve) => setTimeout(resolve, waitAfterScroll));
|
|
73
|
-
const newHeight = document.body.scrollHeight;
|
|
74
|
-
if (newHeight === lastHeight) {
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
lastHeight = newHeight;
|
|
78
|
-
attempts++;
|
|
79
|
-
}
|
|
80
|
-
return { data: true };
|
|
81
|
-
}
|
|
82
|
-
async function scrollByDistance(distance, behavior) {
|
|
83
|
-
window.scrollBy({
|
|
84
|
-
top: distance,
|
|
85
|
-
behavior
|
|
86
|
-
});
|
|
87
|
-
return { data: true };
|
|
88
|
-
}
|
|
89
|
-
async function scrollUntilLoaded(maxScrolls, distance, behavior, waitAfterScroll) {
|
|
90
|
-
let scrollCount = 0;
|
|
91
|
-
let lastHeight = document.body.scrollHeight;
|
|
92
|
-
while (scrollCount < maxScrolls) {
|
|
93
|
-
window.scrollBy({
|
|
94
|
-
top: distance,
|
|
95
|
-
behavior
|
|
96
|
-
// Use provided behavior
|
|
97
|
-
});
|
|
98
|
-
await new Promise((resolve) => setTimeout(resolve, waitAfterScroll));
|
|
99
|
-
const newHeight = document.body.scrollHeight;
|
|
100
|
-
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
|
|
101
|
-
const windowHeight = window.innerHeight;
|
|
102
|
-
if (scrollTop + windowHeight >= newHeight - 10) {
|
|
103
|
-
if (newHeight === lastHeight) {
|
|
104
|
-
break;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
lastHeight = newHeight;
|
|
108
|
-
scrollCount++;
|
|
109
|
-
}
|
|
110
|
-
return { data: true };
|
|
111
|
-
}
|