浏览代码

Merge pull request #1306 from AutomaApp/dev

v1.28.2
Ahmad Kholid 2 年之前
父节点
当前提交
9364095e74

+ 6 - 6
package.json

@@ -1,6 +1,6 @@
 {
   "name": "automa",
-  "version": "1.28.0",
+  "version": "1.28.1",
   "description": "An extension for automating your browser by connecting blocks",
   "repository": {
     "type": "git",
@@ -29,7 +29,7 @@
   },
   "dependencies": {
     "@codemirror/autocomplete": "^6.4.0",
-    "@codemirror/lang-css": "^6.0.1",
+    "@codemirror/lang-css": "^6.0.2",
     "@codemirror/lang-html": "^6.4.0",
     "@codemirror/lang-javascript": "^6.1.2",
     "@codemirror/lang-json": "^6.0.1",
@@ -49,7 +49,7 @@
     "@vue-flow/additional-components": "^1.3.3",
     "@vue-flow/core": "^1.12.7",
     "@vueuse/head": "^1.0.23",
-    "@vueuse/rxjs": "^9.11.1",
+    "@vueuse/rxjs": "^9.12.0",
     "@vuex-orm/core": "^0.36.4",
     "codemirror": "^6.0.1",
     "compare-versions": "^6.0.0-rc.1",
@@ -59,8 +59,8 @@
     "css-selector-generator": "^3.6.4",
     "dagre": "^0.8.5",
     "dayjs": "^1.11.6",
-    "defu": "^6.1.0",
-    "dexie": "^3.2.2",
+    "defu": "^6.1.2",
+    "dexie": "^3.2.3",
     "html2canvas": "^1.4.1",
     "idb": "^7.0.2",
     "json5": "^2.2.3",
@@ -110,7 +110,7 @@
     "core-js": "^3.27.2",
     "cross-env": "^7.0.3",
     "css-loader": "^6.7.3",
-    "eslint": "^8.31.0",
+    "eslint": "^8.34.0",
     "eslint-config-airbnb-base": "^15.0.0",
     "eslint-config-prettier": "^8.6.0",
     "eslint-friendly-formatter": "^4.0.1",

+ 4 - 2
src/background/BackgroundUtils.js

@@ -26,13 +26,15 @@ class BackgroundUtils {
         }
       } else {
         const windowOptions = {
+          top: 0,
+          left: 0,
+          width: 715,
+          height: 715,
           url: tabUrl,
           type: 'popup',
         };
 
         if (updateTab) {
-          windowOptions.height = 715;
-          windowOptions.width = 715;
           windowOptions.focused = true;
         } else {
           windowOptions.state = 'minimized';

+ 1 - 1
src/components/newtab/workflow/edit/EditWebhook.vue

@@ -174,7 +174,7 @@ const emit = defineEmits(['update:data']);
 const { t } = useI18n();
 
 const methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'];
-const notHaveBody = ['GET', 'DELETE'];
+const notHaveBody = ['GET'];
 const copyHeaders = JSON.parse(JSON.stringify(props.data.headers));
 
 const activeTab = ref('headers');

+ 9 - 0
src/content/index.js

@@ -43,6 +43,15 @@ function messageToFrame(frameElement, blockData) {
   });
 }
 async function executeBlock(data) {
+  if ((data.name || data.label) === 'javascript-code') {
+    const { workflowStates } = await browser.storage.local.get(
+      'workflowStates'
+    );
+    if (workflowStates && workflowStates.length === 0) {
+      throw new Error('Invalid execution');
+    }
+  }
+
   const removeExecutedBlock = showExecutedBlock(data, data.executedBlockOnWeb);
   if (data.data?.selector?.includes('|>')) {
     const [frameSelector, selector] = data.data.selector.split(/\|>(.+)/);

+ 2 - 1
src/content/services/webService.js

@@ -210,10 +210,11 @@ window.addEventListener('app-mounted', async () => {
     ]);
 
     const setUserSession = async () => {
+      console.log(session);
       const saveToStorage = { session };
 
       const isGoogleProvider =
-        session?.user?.user_metadata?.iss.includes('googleapis.com');
+        session?.user?.user_metadata?.iss.includes('google.com');
       const { session: currSession, sessionToken: currSessionToken } =
         await browser.storage.local.get(['session', 'sessionToken']);
       if (

+ 11 - 1
src/locales/fr/common.json

@@ -5,6 +5,9 @@
     "collection": "Collection | Collections",
     "log": "Log | Logs",
     "block": "Bloc | Blocs",
+    "schedule": "Planificateur",
+    "folder": "Dossier | Dossiers",
+    "new": "Nouveau",
     "docs": "Documentation",
     "search": "Rechercher",
     "example": "Example | Examples",
@@ -27,6 +30,10 @@
     "running": "En cours",
     "globalData": "Données générales",
     "fileName": "Nom du fichier",
+    "editor": "Editeur",
+    "running": "En cours",
+    "globalData": "Donnée Globale",
+    "fileName": "Nom de fichier",
     "description": "Description",
     "disable": "Désactiver",
     "disabled": "Désactivé",
@@ -35,7 +42,10 @@
     "update": "Mettre à jour",
     "duplicate": "Dupliquer",
     "password": "Mot de passe",
-    "category": "Catégorie"
+    "category": "Catégorie",
+    "category": "Catégorie",
+    "optional": "Optionnel",
+    "0disable": "0 pour désactiver"
   },
   "message": {
     "noBlock": "Pas de bloc",

+ 2 - 1
src/utils/FindElement.js

@@ -25,7 +25,8 @@ class FindElement {
       : data.selector;
 
     if (specialSelectorsRegex.test(selector)) {
-      const elements = Sizzle.matches(selector);
+      // Fix Sizzle incorrect context in iframe, passed as context of iframe
+      const elements = Sizzle(selector, documentCtx);
       if (!elements) return null;
 
       return data.multiple ? elements : elements[0];

+ 7 - 0
src/utils/handleFormElement.js

@@ -23,6 +23,13 @@ function formEvent(element, data) {
       code: `Key${currentKey}`,
     };
 
+    simulateEvent(element, 'input', {
+      inputType: 'insertText',
+      data: data.value,
+      bubbles: true,
+      cancelable: true,
+    });
+
     simulateEvent(element, 'keydown', {
       key,
       code,

+ 2 - 2
src/utils/helper.js

@@ -211,8 +211,8 @@ export function fileSaver(filename, data) {
 
 export function countDuration(started, ended) {
   const duration = Math.round((ended - started) / 1000);
-  const minutes = parseInt((duration / 60) % 60, 10);
-  const seconds = parseInt(duration % 60, 10);
+  const minutes = Math.floor(duration / 60);
+  const seconds = Math.floor(duration % 60);
 
   const getText = (num, suffix) => (num > 0 ? `${num}${suffix}` : '');
 

+ 4 - 2
src/workflowEngine/blocksHandler/handlerCreateElement.js

@@ -49,13 +49,15 @@ async function handleCreateElement(block, { refData }) {
     (data.javascript || data.preloadScripts.length > 0) && !this.engine.isMV2;
   const payload = {
     ...block,
-    data,
+    data: {
+      ...data,
+      automaScript: getAutomaScript({ ...refData, secrets: {} }),
+    },
     preloadCSS: data.preloadScripts.filter((item) => item.type === 'style'),
   };
 
   if (isMV3) {
     payload.data.dontInjectJS = true;
-    payload.data.automaScript = getAutomaScript({ ...refData, secrets: {} });
   }
 
   await this._sendMessageToTab(payload, {}, data.runBeforeLoad ?? false);

+ 11 - 3
src/workflowEngine/blocksHandler/handlerNewTab.js

@@ -7,6 +7,16 @@ import {
   injectPreloadScript,
 } from '../helper';
 
+function isValidURL(url) {
+  try {
+    // eslint-disable-next-line
+    new URL(url);
+    return true;
+  } catch (error) {
+    return false;
+  }
+}
+
 async function newTab({ id, data }) {
   if (this.windowId) {
     try {
@@ -16,9 +26,7 @@ async function newTab({ id, data }) {
     }
   }
 
-  const isInvalidUrl = !/^https?/.test(data.url);
-
-  if (isInvalidUrl) {
+  if (!isValidURL(data.url)) {
     const error = new Error(
       isWhitespace(data.url) ? 'url-empty' : 'invalid-active-tab'
     );

+ 18 - 73
src/workflowEngine/index.js

@@ -5,7 +5,6 @@ import dayjs from '@/lib/dayjs';
 import { parseJSON } from '@/utils/helper';
 import { fetchApi } from '@/utils/api';
 import { sendMessage } from '@/utils/message';
-import getBlockMessage from '@/utils/getBlockMessage';
 import convertWorkflowData from '@/utils/convertWorkflowData';
 import WorkflowState from './WorkflowState';
 import WorkflowLogger from './WorkflowLogger';
@@ -65,81 +64,27 @@ export function startWorkflowExec(workflowData, options, isPopup = true) {
   });
 
   engine.init();
-  engine.on(
-    'destroyed',
-    ({
-      id,
-      status,
-      history,
-      startedTimestamp,
-      endedTimestamp,
-      blockDetail,
-    }) => {
-      if (
-        clonedWorkflowData.id.startsWith('team') &&
-        clonedWorkflowData.teamId
-      ) {
-        const payload = {
-          status,
-          workflowId: clonedWorkflowData.id,
-          workflowLog: {
-            status,
-            endedTimestamp,
-            startedTimestamp,
-          },
-        };
-
-        if (status === 'error') {
-          const message = getBlockMessage(blockDetail);
-          const workflowHistory = history.map((item) => {
-            delete item.logId;
-            delete item.prevBlockData;
-            delete item.workerId;
-
-            item.description = item.description || '';
-
-            return item;
+  engine.on('destroyed', ({ id, status }) => {
+    if (status !== 'stopped') {
+      browser.permissions
+        .contains({ permissions: ['notifications'] })
+        .then((hasPermission) => {
+          if (!hasPermission || !clonedWorkflowData.settings.notification)
+            return;
+
+          const name = clonedWorkflowData.name.slice(0, 32);
+
+          browser.notifications.create(`logs:${id}`, {
+            type: 'basic',
+            iconUrl: browser.runtime.getURL('icon-128.png'),
+            title: status === 'success' ? 'Success' : 'Error',
+            message: `${
+              status === 'success' ? 'Successfully' : 'Failed'
+            } to run the "${name}" workflow`,
           });
-          payload.workflowLog = {
-            status,
-            message,
-            endedTimestamp,
-            startedTimestamp,
-            history: workflowHistory,
-            blockId: blockDetail.blockId,
-          };
-        }
-
-        fetchApi(`/teams/${clonedWorkflowData.teamId}/workflows/logs`, {
-          auth: true,
-          method: 'POST',
-          body: JSON.stringify(payload),
-        }).catch((error) => {
-          console.error(error);
         });
-      }
-
-      if (status !== 'stopped') {
-        browser.permissions
-          .contains({ permissions: ['notifications'] })
-          .then((hasPermission) => {
-            if (!hasPermission || !clonedWorkflowData.settings.notification)
-              return;
-
-            const name = clonedWorkflowData.name.slice(0, 32);
-
-            browser.notifications.create(`logs:${id}`, {
-              type: 'basic',
-              iconUrl: browser.runtime.getURL('icon-128.png'),
-              title: status === 'success' ? 'Success' : 'Error',
-              message: `${
-                status === 'success' ? 'Successfully' : 'Failed'
-              } to run the "${name}" workflow`,
-            });
-          });
-      }
     }
-  );
+  });
 
   browser.storage.local.get('checkStatus').then(({ checkStatus }) => {
     const isSameDay = dayjs().isSame(checkStatus, 'day');

+ 32 - 22
yarn.lock

@@ -933,7 +933,7 @@
     "@codemirror/view" "^6.0.0"
     "@lezer/common" "^1.0.0"
 
-"@codemirror/lang-css@^6.0.0", "@codemirror/lang-css@^6.0.1":
+"@codemirror/lang-css@^6.0.0":
   version "6.0.1"
   resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.0.1.tgz#470fff614e4cfbbe796ec43103420d59c797dd7a"
   integrity sha512-rlLq1Dt0WJl+2epLQeAsfqIsx3lGu4HStHCJu95nGGuz2P2fNugbU3dQYafr2VRjM4eMC9HviI6jvS98CNtG5w==
@@ -943,6 +943,16 @@
     "@codemirror/state" "^6.0.0"
     "@lezer/css" "^1.0.0"
 
+"@codemirror/lang-css@^6.0.2":
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.0.2.tgz#b286d0226755a751f60599e1e2969d351aebbd4c"
+  integrity sha512-4V4zmUOl2Glx0GWw0HiO1oGD4zvMlIQ3zx5hXOE6ipCjhohig2bhWRAasrZylH9pRNTcl1VMa59Lsl8lZWlTzw==
+  dependencies:
+    "@codemirror/autocomplete" "^6.0.0"
+    "@codemirror/language" "^6.0.0"
+    "@codemirror/state" "^6.0.0"
+    "@lezer/css" "^1.0.0"
+
 "@codemirror/lang-html@^6.4.0":
   version "6.4.1"
   resolved "https://registry.yarnpkg.com/@codemirror/lang-html/-/lang-html-6.4.1.tgz#fe739212aa3e4931077da5ab178c4f7df1601ac5"
@@ -1812,12 +1822,12 @@
   resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.11.0.tgz#07133eb3d78cbea376b6ad216950b4bbfafd041c"
   integrity sha512-HhtG2SWkcfZBLbamHdvLn7jKOCFpw/ifXjVTd5ilFkj98WVUk/3UTQ03wF1XIkuhSO4+b45hD2lfG9/GdKCF7w==
 
-"@vueuse/rxjs@^9.11.1":
-  version "9.11.1"
-  resolved "https://registry.yarnpkg.com/@vueuse/rxjs/-/rxjs-9.11.1.tgz#8c024ddb1bf1b4ae7f6d68d7e37c520c0151cb3a"
-  integrity sha512-QlrN81HfOEmiiVDUyySuVtPHrDX/iqXLpIQe+a8ArenCsfG9lIrn/kK3xorzD56In6bprrjw3QRk1MUIpftfAg==
+"@vueuse/rxjs@^9.12.0":
+  version "9.12.0"
+  resolved "https://registry.yarnpkg.com/@vueuse/rxjs/-/rxjs-9.12.0.tgz#d718a359078ff182cf16e4a30b92941b92cc5b5c"
+  integrity sha512-slzucPMzFhVkurXiLZ8YusyfHrkmwB3MFm3vKo1qrStpho3jof0mwDAJJE5xsucBxrVBSBbLeiPxCehMBj1tIQ==
   dependencies:
-    "@vueuse/shared" "9.11.1"
+    "@vueuse/shared" "9.12.0"
     vue-demi "*"
 
 "@vueuse/shared@9.11.0":
@@ -1827,10 +1837,10 @@
   dependencies:
     vue-demi "*"
 
-"@vueuse/shared@9.11.1":
-  version "9.11.1"
-  resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.11.1.tgz#c76805c9d86da109b132529b4745d7d706106e7f"
-  integrity sha512-UTZYGAjT96hWn4buf4wstZbeheBVNcKPQuej6qpoSkjF1atdaeCD6kqm9uGL2waHfisSgH9mq0qCRiBOk5C/2w==
+"@vueuse/shared@9.12.0":
+  version "9.12.0"
+  resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.12.0.tgz#e6597da80084cba8fc3d6545f4c2fa9817b80428"
+  integrity sha512-TWuJLACQ0BVithVTRbex4Wf1a1VaRuSpVeyEd4vMUWl54PzlE0ciFUshKCXnlLuD0lxIaLK4Ypj3NXYzZh4+SQ==
   dependencies:
     vue-demi "*"
 
@@ -2996,10 +3006,10 @@ defined@^1.0.0:
   resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf"
   integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==
 
-defu@^6.1.0:
-  version "6.1.1"
-  resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.1.tgz#a12c712349197c545dc61d3cd3b607b4cc7ef0c1"
-  integrity sha512-aA964RUCsBt0FGoNIlA3uFgo2hO+WWC0fiC6DBps/0SFzkKcYoM/3CzVLIa5xSsrFjdioMdYgAIbwo80qp2MoA==
+defu@^6.1.2:
+  version "6.1.2"
+  resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.2.tgz#1217cba167410a1765ba93893c6dbac9ed9d9e5c"
+  integrity sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==
 
 del@^4.1.1:
   version "4.1.1"
@@ -3043,10 +3053,10 @@ detective@^5.2.1:
     defined "^1.0.0"
     minimist "^1.2.6"
 
-dexie@^3.2.2:
-  version "3.2.2"
-  resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.2.tgz#fa6f2a3c0d6ed0766f8d97a03720056f88fe0e01"
-  integrity sha512-q5dC3HPmir2DERlX+toCBbHQXW5MsyrFqPFcovkH9N2S/UW/H3H5AWAB6iEOExeraAu+j+zRDG+zg/D7YhH0qg==
+dexie@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.3.tgz#f35c91ca797599df8e771b998e9ae9669c877f8c"
+  integrity sha512-iHayBd4UYryDCVUNa3PMsJMEnd8yjyh5p7a+RFeC8i8n476BC9wMhVvqiImq5zJZJf5Tuer+s4SSj+AA3x+ZbQ==
 
 didyoumean@^1.2.2:
   version "1.2.2"
@@ -3474,10 +3484,10 @@ eslint-visitor-keys@^3.3.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
   integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
 
-eslint@^8.31.0:
-  version "8.32.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.32.0.tgz#d9690056bb6f1a302bd991e7090f5b68fbaea861"
-  integrity sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==
+eslint@^8.34.0:
+  version "8.34.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.34.0.tgz#fe0ab0ef478104c1f9ebc5537e303d25a8fb22d6"
+  integrity sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==
   dependencies:
     "@eslint/eslintrc" "^1.4.1"
     "@humanwhocodes/config-array" "^0.11.8"