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.
Files changed (49) hide show
  1. package/package.json +1 -1
  2. package/.github/workflows/npm-publish.yml +0 -38
  3. package/.vscode/launch.json +0 -30
  4. package/README.md +0 -3
  5. package/ai_config.json +0 -53
  6. package/build/package.json +0 -33
  7. package/env.json +0 -3
  8. package/src/auto_page.ts +0 -58
  9. package/src/browser_manager.ts +0 -87
  10. package/src/environment.ts +0 -24
  11. package/src/index.ts +0 -6
  12. package/src/init_browser.ts +0 -65
  13. package/src/locator.ts +0 -173
  14. package/src/stable_browser.ts +0 -523
  15. package/src/table_analyze.ts +0 -69
  16. package/src/test_context.ts +0 -16
  17. package/tests/create_new_repository.test.js +0 -62
  18. package/tests/debug.test.js +0 -41
  19. package/tests/gmail_login.test.js +0 -39
  20. package/tests/launch_page.test.js +0 -32
  21. package/tests/navigate_to_new_repository_page.test.js +0 -45
  22. package/tsconfig.json +0 -110
  23. /package/{build/lib → lib}/auto_page.d.ts +0 -0
  24. /package/{build/lib → lib}/auto_page.js +0 -0
  25. /package/{build/lib → lib}/auto_page.js.map +0 -0
  26. /package/{build/lib → lib}/browser_manager.d.ts +0 -0
  27. /package/{build/lib → lib}/browser_manager.js +0 -0
  28. /package/{build/lib → lib}/browser_manager.js.map +0 -0
  29. /package/{build/lib → lib}/environment.d.ts +0 -0
  30. /package/{build/lib → lib}/environment.js +0 -0
  31. /package/{build/lib → lib}/environment.js.map +0 -0
  32. /package/{build/lib → lib}/index.d.ts +0 -0
  33. /package/{build/lib → lib}/index.js +0 -0
  34. /package/{build/lib → lib}/index.js.map +0 -0
  35. /package/{build/lib → lib}/init_browser.d.ts +0 -0
  36. /package/{build/lib → lib}/init_browser.js +0 -0
  37. /package/{build/lib → lib}/init_browser.js.map +0 -0
  38. /package/{build/lib → lib}/locator.d.ts +0 -0
  39. /package/{build/lib → lib}/locator.js +0 -0
  40. /package/{build/lib → lib}/locator.js.map +0 -0
  41. /package/{build/lib → lib}/stable_browser.d.ts +0 -0
  42. /package/{build/lib → lib}/stable_browser.js +0 -0
  43. /package/{build/lib → lib}/stable_browser.js.map +0 -0
  44. /package/{build/lib → lib}/table_analyze.d.ts +0 -0
  45. /package/{build/lib → lib}/table_analyze.js +0 -0
  46. /package/{build/lib → lib}/table_analyze.js.map +0 -0
  47. /package/{build/lib → lib}/test_context.d.ts +0 -0
  48. /package/{build/lib → lib}/test_context.js +0 -0
  49. /package/{build/lib → lib}/test_context.js.map +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "automation_model",
3
- "version": "1.0.65",
3
+ "version": "1.0.66",
4
4
  "description": "An automation infrastructure module to be use for generative AI automation projects.",
5
5
  "main": "build/index.js",
6
6
  "type": "module",
@@ -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
@@ -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
@@ -1,3 +0,0 @@
1
- # automation_model
2
- An automation infrastructure module to be use for generative AI automation projects.
3
-
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
- }
@@ -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
@@ -1,3 +0,0 @@
1
- {
2
- "baseUrl": "https://github.com"
3
- }
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 };
@@ -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();
@@ -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
@@ -1,6 +0,0 @@
1
- export * from "./auto_page.js";
2
- export * from "./init_browser.js";
3
- export * from "./stable_browser.js";
4
- export * from "./environment.js";
5
- export * from "./auto_page.js";
6
- export * from "./browser_manager.js";
@@ -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}