JavaScript callback / async problem? Background script of Chrome Extension stops function before finishing

I am trying to create a small crawler as a chrome extension. How it works is:
Open new window or tab.
Perform a search for Google / Google News / YouTube with given keywords.
Store information of the results in a small database

I first created and tested the functions with a popup.html. There it works perfectly.You click on a button and all pages are visited and the results are stored in a database. But I want to start the program without clicking anything first. That’s why I migrated it to background.js. There it also works, but only if the Service Worker / DevTool console is open. Only then it runs completely.

I would be grateful for any helpful answer.

const keywords = [
    "Keyword1",
    "Keyword2",
    // ...
    "Keyword13"
];

chrome.runtime.onStartup.addListener(() => {
    chrome.tabs.onUpdated.addListener(loadingWindow);
    openWindow();
});

// Opens new Window or Tab with the correct URL
function openWindow() {
    chrome.tabs.onUpdated.addListener(loadingWindow);
    if (runs == 0) {
        chrome.windows.create({ url: getUrl(keywords[runs]), type: "normal" }, newWindow => {
            window_id = newWindow.id;
        });
    } else {
        chrome.tabs.update(tab_id, { url: getUrl(keywords[runs]) });
    }
}

// Wait to load the new tab
function loadingWindow(tabId, changeInfo, tab) {
    if (changeInfo.status === 'complete' && tab.status == 'complete' && tab.windowId == window_id) {
        tab_id = tabId;
        console.log(tab.windowId);
        chrome.tabs.onUpdated.removeListener(loadingWindow);
        chrome.tabs.sendMessage(tab.id, { text: source }, doStuffWithDom);
    }
};

// Get information from content script -> payload and then send to database
function doStuffWithDom(domContent) {
    let payload = {... }
    var data = new FormData();
    data.append("json", JSON.stringify(payload));
    fetch(".../store.php", { method: "POST", body: data });
    crawlDone();
}

// open new window / tab or close the open window
function crawlDone() {

    runs++;
    if (runs < keywords.length) {
        openWindow();
    } else if (runs == keywords.length) {
        chrome.windows.remove(window_id);
    }
};

If the value in the price class in HTML is equal to a string, how can it be discarded and not counted and sum the rest of the values of type Number

I have this code, but I want to add it in case if the value in the price field is equal to a string, how can this value be discarded and not counted and sum the rest of the values of type number

var theSummry = 0;
$(".price").each(function() {
  theSummry += parseInt($(this).text());
})
$(".the-total").text(theSummry);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<table style="width:70%;text-align: center;margin: 30px auto;">
  <tr>
    <th>Person 1</th>
    <th>Person 2</th>
    <th>Person 3</th>
  </tr>
  <tr>
    <td>Emil</td>
    <td>Tobias</td>
    <td>Linus</td>
  </tr>
  <tr>
    <td>Emil</td>
    <td>Tobias</td>
    <td class="price">10</td>
  </tr>
  <tr>
    <td>Emil</td>
    <td>Tobias</td>
    <td class="price">qwe</td>
  </tr>
  <tr>
    <td>Emil</td>
    <td>Tobias</td>
    <td class="price">10</td>
  </tr>
  <tr>
    <td>Emil</td>
    <td>Tobias</td>
    <td class="price">30</td>
  </tr>
  <tr>
    <td>Emil</td>
    <td>Tobias</td>
    <td class="price">10</td>
  </tr>
  <tr class="the-total"></tr>
</table>

How can I export images path with require() from one index.js file in react naitve?

I want to export all images from one file which index.js so that If in future I have to change the path of image then I have to only make changes in one file.

like this:

export {default as avatar} from './avatar.png';
export {default as career} from './PsychoScreenImages/career.jpeg';
export {default as application} from './redeemIcons/application.jpeg';
export {default as featured} from './redeemIcons/featured.jpeg';

But I can’t do like this require(avatar) as it requires the only a path. So, How can I export and import images from just one js file?

I have Fetched Value from Ajax to the Input but when I put in alert after that, It shows NaN, Even I can See the Value in input box [closed]

I have used code of ajax to fetch the value, It appears in input box, but when I pass value to alert it show NaN and If I inspect the Input Box in code, Value not showing.

In Html Page I can see value in input box but not in inspect element, So I am unable to use this value further as its showing NaN in alert.

VSCode’s Find all references/Go to definition does not work

I have:

  • mono repository, more projects inside
  • js/ts, react
  1. When Find all references is tried on react component (I suppose on anything) that is imported in another project inside monorepo, it starts finding references.
  2. Initializing JS/TS language features starts – from Typescript and Javascript Language Features built-in extension.
  3. It takes about 2 minutes (depends on project size)
  4. After that references outside project/folder are not found
  5. During that process I cannot use Go to definition

I have also solution and will be written in answer below to help other folks (maybe my future me :D) to not waste halfday as I did on this 😉

How to add Redis environmental variables in virtual event starter kit by vercel (NextJS)

I just started next.js and javascript as a whole. I am stuck in a problem, that if anyone explains would be cool. So, I started using the virtual event starter kit template in vercel which is made using NextJS. I was able to set up everything, except the redis (Upstash) part. I am not sure on how to set it up, if anyone could go through the docs and explain me would be really cool

Thanks

Download files automatically through firefox with nodeJS and webdriverio

I want to verify file download using NodeJS and Webdriverio. The file to download is of PDF format. When WebDriverIO clicks on “Download” Firefox opens up the following download confirmation window:download confirmation pop-up

I want Firefox to download the file automatically without showing above confirmation window, so I used the below code:

 conf_firefox.js file
require('dotenv').config();
const path = require('path');
const merge = require('deepmerge');
const baseConfig = require('./wdio.conf_base');

exports.config = merge(baseConfig.config, {
  services: ['selenium-standalone'],
  capabilities: [
    {
      maxInstances: 2,
      browserName: 'firefox',
      'moz:firefoxOptions': {
        prefs: {
          'browser.download.dir': path.join(__dirname, '../test-data/tmp/download/firefox'),
          'browser.helperApps.neverAsk.saveToDisk': 'application/pdf',
        },
      },
      acceptInsecureCerts: true,
    },
  ],
});

but still Firefox shows the same window. How can I set Firefox profile so that PDF files are downloaded automatically without showing the confirmation dialogue?
For chrome everything works correctly. Thanks!

Vue JS setting image through file uploader on v-model applies empty object

I’m using Vue JS 2 to create an image uploader. My input has a change function which runs a function and sets my file on v-model property.

When I console.log my data, all what’s set is an empty object rather than the image, this is also causing my Vee Validate rule to fail as it thinks it’s empty.

What am I missing?

My HTML for uploading a logo

<div>
  <validation-provider
    name="base64_logo"
    rules="mimes:image/jpeg,image/png"
    v-slot="{ errors, classes, validate }"
  >
    <label for="base64_logo" class="block text-sm font-medium text-gray-500 mb-2">
      Brand logo <em>(PNG or JPG)</em>
    </label>
    <div class="mt-1 relative rounded-md shadow-sm">
      <input @change="selectFilesToUpload('base64_logo', $event.target.files[0]); validate()" type="file" name="base64_logo" id="base64_logo" :class="classes" class="focus:ring-green-500 focus:border-green-500 block w-full py-3 px-4 sm:text-sm border border-gray-300 rounded-md" accept="image/png, image/jpeg">
    </div>
    <span class="text-xs text-red-500">{{ errors[0] }}</span>
  </validation-provider>
</div>

The following function runs:

/*
** Select files to upload (file uploader)
*/
selectFilesToUpload (model, file) {
  try {
    this.form[model] = file
  } catch (err) { }
},

Which form should now contain everything associated with my image, but when adding an image, it shows as an empty object (see attached)

enter image description here

I’ve also tried a JSON.stringify before setting my model, no luck here either.

How to use wildcard characters in ts typeorm?

I’m coding a query in my NestTs project, so I would like to retrieve information matched with LIKE clause values. the problem with my query is the table has three types of records ‘_INFORMED’, ‘_UNINFORMED’ and ‘WITHOUT’. If I use the sentence .where(“user.firstName like :name”, { name:%_INFORMED% }) It matches with _INFORMED and _UNINFORMED records, then I tried to use the wildcard character as to standard SQL ‘%_INFORMED%’ but it looks wrong. Do you have any idea? Thanks!

Few utf-8 characters are not being decoded properly in linux OS

I have a javascript file where i encode, decode and remove/modify some characters from the url. I have been recently facing some issues during the decoding of this particular character (“ and ”). When this character is parsed it throws a Uncaught SyntaxError: Invalid regular expression: /?/: Nothing to repeat error. When i commented the decoding it parsed the file without an issue. I want to know why this character is being not parsed by the browser.

This is my function for reference:

decodeEntities = function(v){
if (v !== null && v !== '' && typeof(v) == 'string') {
v = v.replace(/&gt;/gi,">"); // 62
v = v.replace(/&lt;/gi,"<"); // 60
v = v.replace(/&#38;/g, "&");
v = v.replace(/``/g, " ");
v = v.replace(/“/gi,""");//<-- exception in chrome version 95 and up, works for 94
v = v.replace(/”/gi,""");//<-- exception in chrome version 95 and up, works for 94
}
return v;
};

Following two statements from the function above fails with the error above for chrome versions 95 and above. 94 however has no problem with it. v = v.replace(/“/gi,”””);
v = v.replace(/”/gi,”””); Any help as to how to rewrite the last two lines of the code would be greatly appreciated. Thanks.

Is there a way to use Reacts useLocation to restart Gsaps animation timeline?

I have three links which I am currently animating to slide down when the user clicks the toggle menu button. It works fine when the user clicks the toggle again.

The problem: when the user clicks on a route and navigates away THEN comes back to select another route, the animation doesn’t restart again. The animation should restart to initial position even if the user navigates to another route.

Here is what I currently have:

let linkOne = useRef(null);
let linkTwo = useRef(null);
let linkThree = useRef(null);

const [dropped, setDropped] = useState()

const tl = useRef()
useEffect(() => {
    // tl.current = gsap.timeline({paused: true})
    tl.current = new gsap.timeline()
        .to([linkOne, linkTwo, linkThree], { y: 30, stagger: { amount: .3 } });
    return tl.current.kill()
}, [])

useEffect(() => {
    dropped ? tl.current.play() : tl.current.reverse();
}, [dropped])

HTML:

<Navbar.Toggle onClick={() => setDropped(!dropped)} aria-controls="responsive-navbar-nav" />

<Nav.Link ref={el => linkOne = el} as={Link} to="/About" href="#About">About</Nav.Link>
<Nav.Link ref={el => linkTwo = el} as={Link} to="/TestPage" href="#TestPage">Test Page</Nav.Link>
<Nav.Link ref={el => linkThree = el} as={Link} to="/GsapImageReveal" href="#GsapImageReveal">GsapImageReveal</Nav.Link>

I have tried using useLocation:

let location = useLocation()
useEffect(() => {
    dropped ? tl.current.play() : tl.current.reverse();
    console.log(location)
}, [dropped, location])

This doesn’t work. But i think useLocation is on the right track because it gives me a route change.

Can anyone suggest a work around or a better way to approach this?