automation_model 1.0.65 → 1.0.66
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/package.json +1 -1
- package/.github/workflows/npm-publish.yml +0 -38
- package/.vscode/launch.json +0 -30
- package/README.md +0 -3
- package/ai_config.json +0 -53
- package/build/package.json +0 -33
- package/env.json +0 -3
- package/src/auto_page.ts +0 -58
- package/src/browser_manager.ts +0 -87
- package/src/environment.ts +0 -24
- package/src/index.ts +0 -6
- package/src/init_browser.ts +0 -65
- package/src/locator.ts +0 -173
- package/src/stable_browser.ts +0 -523
- package/src/table_analyze.ts +0 -69
- package/src/test_context.ts +0 -16
- package/tests/create_new_repository.test.js +0 -62
- package/tests/debug.test.js +0 -41
- package/tests/gmail_login.test.js +0 -39
- package/tests/launch_page.test.js +0 -32
- package/tests/navigate_to_new_repository_page.test.js +0 -45
- package/tsconfig.json +0 -110
- /package/{build/lib → lib}/auto_page.d.ts +0 -0
- /package/{build/lib → lib}/auto_page.js +0 -0
- /package/{build/lib → lib}/auto_page.js.map +0 -0
- /package/{build/lib → lib}/browser_manager.d.ts +0 -0
- /package/{build/lib → lib}/browser_manager.js +0 -0
- /package/{build/lib → lib}/browser_manager.js.map +0 -0
- /package/{build/lib → lib}/environment.d.ts +0 -0
- /package/{build/lib → lib}/environment.js +0 -0
- /package/{build/lib → lib}/environment.js.map +0 -0
- /package/{build/lib → lib}/index.d.ts +0 -0
- /package/{build/lib → lib}/index.js +0 -0
- /package/{build/lib → lib}/index.js.map +0 -0
- /package/{build/lib → lib}/init_browser.d.ts +0 -0
- /package/{build/lib → lib}/init_browser.js +0 -0
- /package/{build/lib → lib}/init_browser.js.map +0 -0
- /package/{build/lib → lib}/locator.d.ts +0 -0
- /package/{build/lib → lib}/locator.js +0 -0
- /package/{build/lib → lib}/locator.js.map +0 -0
- /package/{build/lib → lib}/stable_browser.d.ts +0 -0
- /package/{build/lib → lib}/stable_browser.js +0 -0
- /package/{build/lib → lib}/stable_browser.js.map +0 -0
- /package/{build/lib → lib}/table_analyze.d.ts +0 -0
- /package/{build/lib → lib}/table_analyze.js +0 -0
- /package/{build/lib → lib}/table_analyze.js.map +0 -0
- /package/{build/lib → lib}/test_context.d.ts +0 -0
- /package/{build/lib → lib}/test_context.js +0 -0
- /package/{build/lib → lib}/test_context.js.map +0 -0
package/package.json
CHANGED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
|
|
2
|
-
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
|
3
|
-
|
|
4
|
-
name: Javascript client CI
|
|
5
|
-
|
|
6
|
-
on:
|
|
7
|
-
push:
|
|
8
|
-
branches: ["main"]
|
|
9
|
-
pull_request:
|
|
10
|
-
branches: ["main"]
|
|
11
|
-
|
|
12
|
-
jobs:
|
|
13
|
-
build-javascript-client:
|
|
14
|
-
runs-on: ubuntu-latest
|
|
15
|
-
|
|
16
|
-
steps:
|
|
17
|
-
- uses: actions/checkout@v3
|
|
18
|
-
- name: Use Node.js 16.x
|
|
19
|
-
uses: actions/setup-node@v3
|
|
20
|
-
with:
|
|
21
|
-
node-version: 16.x
|
|
22
|
-
cache: "npm"
|
|
23
|
-
cache-dependency-path: "**/package-lock.json"
|
|
24
|
-
- run: npm install
|
|
25
|
-
working-directory: ${{ github.workspace }}
|
|
26
|
-
- name: Install Playwright dependencies
|
|
27
|
-
run: npx playwright install
|
|
28
|
-
working-directory: ${{ github.workspace }}
|
|
29
|
-
- run: npm run build
|
|
30
|
-
working-directory: ${{ github.workspace }}
|
|
31
|
-
- run: npm test
|
|
32
|
-
working-directory: ${{ github.workspace }}
|
|
33
|
-
- name: publish server to npm
|
|
34
|
-
uses: JS-DevTools/npm-publish@v1
|
|
35
|
-
with:
|
|
36
|
-
token: ${{ secrets.NPM_PASSWORD }}
|
|
37
|
-
package: ${{ github.workspace }}/build/package.json
|
|
38
|
-
check-version: true
|
package/.vscode/launch.json
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
// Use IntelliSense to learn about possible attributes.
|
|
3
|
-
// Hover to view descriptions of existing attributes.
|
|
4
|
-
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
5
|
-
"version": "0.2.0",
|
|
6
|
-
"configurations": [
|
|
7
|
-
{
|
|
8
|
-
"type": "node",
|
|
9
|
-
"request": "launch",
|
|
10
|
-
"name": "launch_page",
|
|
11
|
-
"skipFiles": ["<node_internals>/**"],
|
|
12
|
-
"program": "${workspaceFolder}/tests/launch_page.js",
|
|
13
|
-
// set default directory to the workspace folder
|
|
14
|
-
"cwd": "${workspaceFolder}",
|
|
15
|
-
"stopOnEntry": false,
|
|
16
|
-
"console": "integratedTerminal"
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"type": "node",
|
|
20
|
-
"request": "launch",
|
|
21
|
-
"name": "debug",
|
|
22
|
-
"skipFiles": ["<node_internals>/**"],
|
|
23
|
-
"program": "${workspaceFolder}/tests/debug.js",
|
|
24
|
-
// set default directory to the workspace folder
|
|
25
|
-
"cwd": "${workspaceFolder}",
|
|
26
|
-
"stopOnEntry": false,
|
|
27
|
-
"console": "integratedTerminal"
|
|
28
|
-
}
|
|
29
|
-
]
|
|
30
|
-
}
|
package/README.md
DELETED
package/ai_config.json
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"page_timeout": 60000,
|
|
3
|
-
"changes": [
|
|
4
|
-
{
|
|
5
|
-
"css": "gb-side-navigation-menu-item",
|
|
6
|
-
"changes": {
|
|
7
|
-
"role": "link"
|
|
8
|
-
}
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
"css": "gb-toolbar-icon",
|
|
12
|
-
"changes": {
|
|
13
|
-
"role": "button"
|
|
14
|
-
}
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"css": "gb-period-picker-button",
|
|
18
|
-
"changes": {
|
|
19
|
-
"role": "button"
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"css": "gb-simple-table",
|
|
24
|
-
"changes": {
|
|
25
|
-
"role": "table"
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"css": ".header-row",
|
|
30
|
-
"changes": {
|
|
31
|
-
"role": "row"
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"css": ".table-row",
|
|
36
|
-
"changes": {
|
|
37
|
-
"role": "row"
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"css": "gb-simple-data-cell",
|
|
42
|
-
"changes": {
|
|
43
|
-
"role": "cell"
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
"css": "gb-header-cell",
|
|
48
|
-
"changes": {
|
|
49
|
-
"role": "columnheader"
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
]
|
|
53
|
-
}
|
package/build/package.json
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "automation_model",
|
|
3
|
-
"version": "1.0.65",
|
|
4
|
-
"description": "An automation infrastructure module to be use for generative AI automation projects.",
|
|
5
|
-
"main": "build/index.js",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"types": "build/index.d.ts",
|
|
8
|
-
"directories": {
|
|
9
|
-
"lib": "lib"
|
|
10
|
-
},
|
|
11
|
-
"scripts": {
|
|
12
|
-
"compile": "tsc",
|
|
13
|
-
"publish":"",
|
|
14
|
-
"pack": "mkdir build && mkdir build/bin && cp ./src/auto_page.js ./build/bin/auto_page.js && cp ./src/environment.js ./build/bin/environment.js && cp ./src/browser_manager.js ./build/bin/browser_manager.js && cp ./src/test_context.js ./build/bin/test_context.js && cp ./src/init_browser.js ./build/bin/init_browser.js && cp ./src/stable_browser.js ./build/bin/stable_browser.js && cp ./package.json ./build/package.json",
|
|
15
|
-
"clean": "rimraf -g build && rimraf -g types",
|
|
16
|
-
"build": "npm run clean && npm run compile && ncp package.json build/package.json",
|
|
17
|
-
"test": "node tests/debug.test.js",
|
|
18
|
-
"types": "tsc --declaration --allowJs --emitDeclarationOnly --outDir types"
|
|
19
|
-
},
|
|
20
|
-
"author": "",
|
|
21
|
-
"license": "ISC",
|
|
22
|
-
"dependencies": {
|
|
23
|
-
"playwright": "^1.39.0",
|
|
24
|
-
"regex-parser": "^2.2.11"
|
|
25
|
-
},
|
|
26
|
-
"devDependencies": {
|
|
27
|
-
"@playwright/test": "^1.40.0",
|
|
28
|
-
"@types/node": "^20.9.3",
|
|
29
|
-
"ncp": "^2.0.0",
|
|
30
|
-
"rimraf": "^5.0.5",
|
|
31
|
-
"typescript": "^5.2.2"
|
|
32
|
-
}
|
|
33
|
-
}
|
package/env.json
DELETED
package/src/auto_page.ts
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { browserManager } from "./browser_manager.js";
|
|
2
|
-
import { getContext } from "./init_browser.js";
|
|
3
|
-
import fs from "fs";
|
|
4
|
-
import path from "path";
|
|
5
|
-
import type { TestContext } from "./test_context.js";
|
|
6
|
-
let context:TestContext|null = null;
|
|
7
|
-
const navigate = async (path = "") => {
|
|
8
|
-
let url = null;
|
|
9
|
-
if (path === null) {
|
|
10
|
-
url = context!.environment!.baseUrl!;
|
|
11
|
-
} else {
|
|
12
|
-
url = new URL(path, context!.environment!.baseUrl).href;
|
|
13
|
-
}
|
|
14
|
-
await context!.stable!.goto(url);
|
|
15
|
-
await context!.stable!.waitForPageLoad();
|
|
16
|
-
};
|
|
17
|
-
const _findEmptyFolder = (folder?:string) => {
|
|
18
|
-
if (!folder) {
|
|
19
|
-
folder = "./runs";
|
|
20
|
-
}
|
|
21
|
-
if (!fs.existsSync(folder)) {
|
|
22
|
-
fs.mkdirSync(folder);
|
|
23
|
-
}
|
|
24
|
-
let nextIndex = 1;
|
|
25
|
-
while (fs.existsSync(path.join(folder, nextIndex.toString()))) {
|
|
26
|
-
nextIndex++;
|
|
27
|
-
}
|
|
28
|
-
return path.join(folder, nextIndex.toString());
|
|
29
|
-
};
|
|
30
|
-
const initContext = async (path:string, doNavigate = true, headless = false, world:any = null) => {
|
|
31
|
-
if (context) {
|
|
32
|
-
return context;
|
|
33
|
-
}
|
|
34
|
-
context = await getContext(null, headless);
|
|
35
|
-
|
|
36
|
-
if (world) {
|
|
37
|
-
world.screenshot = true;
|
|
38
|
-
const reportFolder = _findEmptyFolder();
|
|
39
|
-
if (world.attach) {
|
|
40
|
-
world.attach(reportFolder, { mediaType: "text/plain" });
|
|
41
|
-
}
|
|
42
|
-
world.screenshotPath = reportFolder;
|
|
43
|
-
context.reportFolder = reportFolder;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (doNavigate) {
|
|
47
|
-
await navigate(path);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return context;
|
|
51
|
-
};
|
|
52
|
-
const closeContext = async () => {
|
|
53
|
-
if (context && context.browser) {
|
|
54
|
-
await browserManager.closeBrowser(context.browser);
|
|
55
|
-
}
|
|
56
|
-
context = null;
|
|
57
|
-
};
|
|
58
|
-
export { initContext, navigate, closeContext };
|
package/src/browser_manager.ts
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { chromium, Browser as PlaywrightBrowser, BrowserContext, Page, BrowserContextOptions } from "playwright";
|
|
2
|
-
import type { Cookie, LocalStorage } from "./environment.js";
|
|
3
|
-
|
|
4
|
-
type StorageState = {
|
|
5
|
-
cookies: Cookie[],
|
|
6
|
-
origins: {origin: string, localStorage: LocalStorage}[]
|
|
7
|
-
}
|
|
8
|
-
class BrowserManager {
|
|
9
|
-
constructor(public browsers: Browser[] = []) {
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
async closeAll() {
|
|
13
|
-
await Promise.all(this.browsers.map((browser) => browser.close()));
|
|
14
|
-
this.browsers = [];
|
|
15
|
-
}
|
|
16
|
-
async closeBrowser(browser?: PlaywrightBrowser |Browser) {
|
|
17
|
-
if (!browser && this.browsers.length > 0) {
|
|
18
|
-
browser = this.browsers[0];
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if (browser) {
|
|
22
|
-
await browser.close();
|
|
23
|
-
for (let i = 0; i < this.browsers.length; i++) {
|
|
24
|
-
if (this.browsers[i].browser === browser || this.browsers[i] === browser) {
|
|
25
|
-
this.browsers.splice(i, 1);
|
|
26
|
-
i--;
|
|
27
|
-
break;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async createBrowser(headless = false, storageState?:StorageState) {
|
|
34
|
-
const browser = new Browser();
|
|
35
|
-
await browser.init(headless, storageState);
|
|
36
|
-
this.browsers.push(browser);
|
|
37
|
-
return browser;
|
|
38
|
-
}
|
|
39
|
-
async getBrowser(headless = false, storageState?:StorageState) {
|
|
40
|
-
if (this.browsers.length === 0) {
|
|
41
|
-
return await this.createBrowser(headless, storageState);
|
|
42
|
-
}
|
|
43
|
-
return this.browsers[0];
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
class Browser {
|
|
47
|
-
browser : PlaywrightBrowser|null;
|
|
48
|
-
context : BrowserContext | null;
|
|
49
|
-
page : Page | null;
|
|
50
|
-
constructor() {
|
|
51
|
-
this.browser = null;
|
|
52
|
-
this.context = null;
|
|
53
|
-
this.page = null;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async init(headless = false, storageState?:StorageState) {
|
|
57
|
-
this.browser = await chromium.launch({
|
|
58
|
-
headless: headless,
|
|
59
|
-
timeout: 0,
|
|
60
|
-
args: ["--ignore-https-errors"],
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
const contextOptions = !!storageState ? {storageState} : undefined
|
|
64
|
-
this.context = await this.browser.newContext(contextOptions as unknown as BrowserContextOptions);
|
|
65
|
-
this.page = await this.context.newPage();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async close() {
|
|
69
|
-
if (this.browser !== null) {
|
|
70
|
-
await this.browser.close();
|
|
71
|
-
this.browser = null;
|
|
72
|
-
this.context = null;
|
|
73
|
-
this.page = null;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
const browserManager = new BrowserManager();
|
|
78
|
-
|
|
79
|
-
export { browserManager };
|
|
80
|
-
export type {BrowserManager, Browser}
|
|
81
|
-
// let browser = await browserManager.createBrowser();
|
|
82
|
-
// browser.page.goto("https://www.cnn.com");
|
|
83
|
-
// let browser2 = await browserManager.createBrowser();
|
|
84
|
-
// await browser2.page.goto("https://www.google.com");
|
|
85
|
-
// // sleep for 2 seconds
|
|
86
|
-
// await new Promise((r) => setTimeout(r, 1000));
|
|
87
|
-
// await browserManager.closeAll();
|
package/src/environment.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
type Cookie ={
|
|
2
|
-
name: string
|
|
3
|
-
value: string
|
|
4
|
-
domain?: string
|
|
5
|
-
path?: string
|
|
6
|
-
expires?: number
|
|
7
|
-
httpOnly?: boolean
|
|
8
|
-
secure?: boolean
|
|
9
|
-
sameSite?: string
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
type LocalStorage = Record<string, string>
|
|
13
|
-
|
|
14
|
-
class Environment {
|
|
15
|
-
cookies:Cookie[] = []
|
|
16
|
-
origins:{origin:string, localStorage:LocalStorage}[] = []
|
|
17
|
-
constructor(public baseUrl?: string) {
|
|
18
|
-
}
|
|
19
|
-
setBaseUrl(url: string) {
|
|
20
|
-
this.baseUrl = url;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
export { Environment };
|
|
24
|
-
export type { Cookie, LocalStorage };
|
package/src/index.ts
DELETED
package/src/init_browser.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import { Environment } from "./environment.js";
|
|
3
|
-
import { browserManager } from "./browser_manager.js";
|
|
4
|
-
import { TestContext } from "./test_context.js";
|
|
5
|
-
import { StableBrowser } from "./stable_browser.js";
|
|
6
|
-
import { Browser as PlaywrightBrowser } from "playwright";
|
|
7
|
-
import { Browser } from "./browser_manager.js";
|
|
8
|
-
|
|
9
|
-
// let environment = null;
|
|
10
|
-
|
|
11
|
-
// init browser create context and page, if context and page are not null
|
|
12
|
-
const getContext = async function (environment: Environment|null, headless = false, logger?: null) {
|
|
13
|
-
if (environment === null) {
|
|
14
|
-
environment = initEnvironment();
|
|
15
|
-
}
|
|
16
|
-
const {cookies, origins} = environment;
|
|
17
|
-
const storageState = {cookies, origins};
|
|
18
|
-
let browser = await browserManager.getBrowser(headless, storageState);
|
|
19
|
-
let context = new TestContext();
|
|
20
|
-
context.browser = browser.browser;
|
|
21
|
-
context.playContext = browser.context;
|
|
22
|
-
context.page = browser.page;
|
|
23
|
-
context.environment = environment;
|
|
24
|
-
|
|
25
|
-
context.stable = new StableBrowser(context.browser!, context.page!, logger);
|
|
26
|
-
// await _initCookies(context);
|
|
27
|
-
return context;
|
|
28
|
-
};
|
|
29
|
-
// const _initCookies = async function (context) {
|
|
30
|
-
// if (context.environment.cookies) {
|
|
31
|
-
// const cookies = [];
|
|
32
|
-
// for (let i = 0; i < context.environment.cookies.length; i++) {
|
|
33
|
-
// const cookie = context.environment.cookies[i];
|
|
34
|
-
// if (cookie.expires && cookie.expires == "undefined") {
|
|
35
|
-
// delete cookie.expires;
|
|
36
|
-
// }
|
|
37
|
-
// cookies.push(cookie);
|
|
38
|
-
// }
|
|
39
|
-
// await context.playContext.addCookies(cookies);
|
|
40
|
-
// }
|
|
41
|
-
// };
|
|
42
|
-
|
|
43
|
-
const closeBrowser = async function (browser? :Browser|PlaywrightBrowser) {
|
|
44
|
-
await browserManager.closeBrowser(browser);
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const initEnvironment = function () {
|
|
48
|
-
// if (environment === null) {
|
|
49
|
-
const environment = new Environment();
|
|
50
|
-
try {
|
|
51
|
-
const data = fs.readFileSync("env.json", "utf8");
|
|
52
|
-
//console.log("data", data);
|
|
53
|
-
const envObject = JSON.parse(data);
|
|
54
|
-
//console.log("envObject", envObject);
|
|
55
|
-
Object.assign(environment, envObject);
|
|
56
|
-
//console.log("env", environment);
|
|
57
|
-
console.log("Base url: " + environment.baseUrl);
|
|
58
|
-
} catch (err) {
|
|
59
|
-
console.error("Error reading env.json", err);
|
|
60
|
-
}
|
|
61
|
-
// }
|
|
62
|
-
return environment;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
export { getContext, closeBrowser };
|
package/src/locator.ts
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
type Change = {css:string, changes:{role:string}};
|
|
2
|
-
declare const document: Document & { selectors: Change[]|null ; tableSelector: string|null; processTableQuery: TprocessTableQuery };
|
|
3
|
-
const selectors = null;
|
|
4
|
-
document.selectors = selectors;
|
|
5
|
-
const tableSelector = null;
|
|
6
|
-
document.tableSelector = tableSelector;
|
|
7
|
-
|
|
8
|
-
// locator | operator | value
|
|
9
|
-
// table.rows | >= | 1
|
|
10
|
-
// table[1]["Availability"].text | equals | 100%
|
|
11
|
-
// table[*][2].text |not_equals| error
|
|
12
|
-
|
|
13
|
-
function processTableQuery(table:Element, query:string) {
|
|
14
|
-
|
|
15
|
-
if (document.selectors && document.selectors.length > 0) {
|
|
16
|
-
for (let i = 0; i < document.selectors.length; i++) {
|
|
17
|
-
const selector = document.selectors[i];
|
|
18
|
-
const allElementsList = document.querySelectorAll(selector.css);
|
|
19
|
-
const allElements = Array.from(allElementsList);
|
|
20
|
-
for (let j = 0; j < allElements.length; j++) {
|
|
21
|
-
const element = allElements[j];
|
|
22
|
-
element.setAttribute("data-blinq-role", selector.changes.role);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const rows = Array.from(table.querySelectorAll("tr, [data-blinq-role='row'], [role='row']"));
|
|
28
|
-
const _rows = rows.length;
|
|
29
|
-
const _columnNames = [];
|
|
30
|
-
let _columns:number = 0;
|
|
31
|
-
let columnheader:HTMLElement[] = [];
|
|
32
|
-
if (rows.length > 0) {
|
|
33
|
-
//const rowheader = rows[0];
|
|
34
|
-
columnheader = Array.from(table.querySelectorAll("th, [data-blinq-role='columnheader'], [role='columnheader']"));
|
|
35
|
-
console.log("columnheader length", columnheader.length);
|
|
36
|
-
_columns = columnheader.length;
|
|
37
|
-
for (let i = 0; i < columnheader.length; i++) {
|
|
38
|
-
const cell = columnheader[i];
|
|
39
|
-
const cellText = cell.innerText;
|
|
40
|
-
_columnNames.push(cellText);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
let _rowStartIndex = 0;
|
|
44
|
-
// if (columnheader.length > 0) {
|
|
45
|
-
// tableData.rowStartIndex = 1;
|
|
46
|
-
// }
|
|
47
|
-
const tableData = {
|
|
48
|
-
rows: _rows,
|
|
49
|
-
columns: _columns,
|
|
50
|
-
columnNames: _columnNames,
|
|
51
|
-
rowStartIndex: _rowStartIndex,
|
|
52
|
-
};
|
|
53
|
-
if (query.startsWith("table.")) {
|
|
54
|
-
const result = [];
|
|
55
|
-
const property = query.substring(6);
|
|
56
|
-
//console.log("property", property);
|
|
57
|
-
// @ts-ignore
|
|
58
|
-
const value = tableData[property];
|
|
59
|
-
//console.log("value", value);
|
|
60
|
-
result.push(value);
|
|
61
|
-
return { cells: result };
|
|
62
|
-
}
|
|
63
|
-
const pattern = /^table\[(.+)\]\[(.+)\]\.(.+)$/;
|
|
64
|
-
const match = query.match(pattern);
|
|
65
|
-
if (!match) {
|
|
66
|
-
return { error: "Invalid quary" };
|
|
67
|
-
}
|
|
68
|
-
const rowSelector = match[1];
|
|
69
|
-
let columnSelector = match[2];
|
|
70
|
-
const property = match[3];
|
|
71
|
-
let selectedRows = [];
|
|
72
|
-
if (rowSelector === "*") {
|
|
73
|
-
selectedRows = rows;
|
|
74
|
-
} else {
|
|
75
|
-
// @ts-ignore
|
|
76
|
-
if (isNaN(rowSelector)) {
|
|
77
|
-
return { error: "Invalid row selector" };
|
|
78
|
-
}
|
|
79
|
-
const rowIndex = parseInt(rowSelector);
|
|
80
|
-
if (rowIndex < 0 || rowIndex >= rows.length) {
|
|
81
|
-
return { error: "Invalid row selector" };
|
|
82
|
-
}
|
|
83
|
-
selectedRows.push(rows[rowIndex]);
|
|
84
|
-
}
|
|
85
|
-
console.log("selectedRows count", selectedRows.length);
|
|
86
|
-
const selectedCells:HTMLElement[] = [];
|
|
87
|
-
// @ts-ignore
|
|
88
|
-
if (isNaN(columnSelector)) {
|
|
89
|
-
if (columnSelector.startsWith('"') && columnSelector.endsWith('"')) {
|
|
90
|
-
columnSelector = columnSelector.substring(1, columnSelector.length - 1);
|
|
91
|
-
} else if (columnSelector.startsWith("'") && columnSelector.endsWith("'")) {
|
|
92
|
-
columnSelector = columnSelector.substring(1, columnSelector.length - 1);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
if (columnheader.length === 0) {
|
|
96
|
-
return { error: "No column header available" };
|
|
97
|
-
}
|
|
98
|
-
let foundHeader = null;
|
|
99
|
-
for (let i = 0; i < columnheader.length; i++) {
|
|
100
|
-
const cell = columnheader[i];
|
|
101
|
-
const cellText = cell.innerText;
|
|
102
|
-
console.log("cellText", cellText);
|
|
103
|
-
if (cellText === columnSelector) {
|
|
104
|
-
foundHeader = cell;
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
if (!foundHeader) {
|
|
109
|
-
return { error: "No column header found" };
|
|
110
|
-
}
|
|
111
|
-
const foundHeaderRec = foundHeader.getBoundingClientRect();
|
|
112
|
-
for (let i = 0; i < selectedRows.length; i++) {
|
|
113
|
-
const row = selectedRows[i];
|
|
114
|
-
const cells:HTMLElement[] = Array.from(row.querySelectorAll("td, [data-blinq-role='cell'], [role='cell']"));
|
|
115
|
-
console.log("cells count", cells.length);
|
|
116
|
-
for (let j = 0; j < cells.length; j++) {
|
|
117
|
-
const cell = cells[j];
|
|
118
|
-
const rec = cell.getBoundingClientRect();
|
|
119
|
-
const xCenter = rec.left + rec.width / 2;
|
|
120
|
-
if (foundHeaderRec.left <= xCenter && xCenter <= foundHeaderRec.right) {
|
|
121
|
-
selectedCells.push(cell);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
} else {
|
|
126
|
-
const columnIndex = parseInt(columnSelector);
|
|
127
|
-
if (columnIndex < 0 || columnIndex >= columnheader.length) {
|
|
128
|
-
return { error: "Column index out of bounds" };
|
|
129
|
-
}
|
|
130
|
-
for (let i = 0; i < selectedRows.length; i++) {
|
|
131
|
-
const row = selectedRows[i];
|
|
132
|
-
const cells:HTMLElement[] = Array.from(row.querySelectorAll("td, [data-blinq-role='cell'], [role='cell']"));
|
|
133
|
-
selectedCells.push(cells[columnIndex]);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
let rect:DOMRect|null = null;
|
|
137
|
-
const result = [];
|
|
138
|
-
for (let i = 0; i < selectedCells.length; i++) {
|
|
139
|
-
let added = false;
|
|
140
|
-
if (property === "element") {
|
|
141
|
-
added = true;
|
|
142
|
-
result.push(selectedCells[i]);
|
|
143
|
-
} else {
|
|
144
|
-
if (property === "text" || property === "innerText") {
|
|
145
|
-
added = true;
|
|
146
|
-
result.push(selectedCells[i].innerText);
|
|
147
|
-
} else {
|
|
148
|
-
if (selectedCells[i].hasAttribute(property)) {
|
|
149
|
-
added = true;
|
|
150
|
-
result.push(selectedCells[i].getAttribute(property));
|
|
151
|
-
} else {
|
|
152
|
-
added = true;
|
|
153
|
-
// @ts-ignore
|
|
154
|
-
result.push(selectedCells[i][property]);
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
if (added) {
|
|
158
|
-
rect = rect ? merge(rect, selectedCells[i].getBoundingClientRect()) : selectedCells[i].getBoundingClientRect();
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return { cells: result, rect };
|
|
163
|
-
}
|
|
164
|
-
const merge = (rec1:DOMRect, rec2:DOMRect) => {
|
|
165
|
-
const x = Math.min(rec1.left, rec2.left);
|
|
166
|
-
const y = Math.min(rec1.top, rec2.top);
|
|
167
|
-
const width = Math.max(rec1.right, rec2.right) - x;
|
|
168
|
-
const height = Math.max(rec1.bottom, rec2.bottom) - y;
|
|
169
|
-
return { x, y, width, height } as DOMRect;
|
|
170
|
-
};
|
|
171
|
-
document.processTableQuery = processTableQuery;
|
|
172
|
-
type TprocessTableQuery = typeof processTableQuery;
|
|
173
|
-
export type {TprocessTableQuery}
|