angularfix
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • Angular
  • AngularJS
  • Typescript
  • HTML
  • CSS
  • Javascript
Showing posts with label puppeteer. Show all posts
Showing posts with label puppeteer. Show all posts

Sunday

Scraping a list of items with Puppeteer

 4:50 AM     class, dom, html, javascript, puppeteer     No comments   

Issue

I'm trying to scrape my school schedule from Visma Inschool. Since it's hosted locally on the school I have permission to do so.

I'm trying to make an info screen and I'm completely lost when it comes to grabbing the schedule.

With this code:

async function getInfo() {
  // identify element
  const f = await page.$("[class='active Timetable-TimetableDays_day']")
  // obtain text
  const text = await (await f.getProperty('textContent')).jsonValue()
  console.log("The day is: " + text)
}

I get the whole active day in one text, but I want it to be split up into different texts so I can grab the next item on the schedule list as well as the teacher's name and the classroom for the class.

I do not expect anything other than the output I am getting, because I don't know what DOM to search for.

Here is the website as HTML:

<div data-v-36c1dfe8="" role="gridcell" class="active Timetable-TimetableDays_day"><h3 data-v-36c1dfe8="" class="sr-only"> 7 Avtaler, torsdag 14 desember </h3><div data-v-36c1dfe8="" class="Timetable-Items"><div data-v-45669d56="" data-v-36c1dfe8="" class="popup-container" style="top: 40px; left: 0%;"><div data-v-36c1dfe8="" data-v-45669d56=""><h4 data-v-36c1dfe8="" data-v-45669d56="" class="sr-only"> Teknologiforståelse på rom E109. Undervisningstime. Starter 14. desember 2023 klokken 08:20 og slutter 09:05 </h4><div data-v-33d0fd5d="" data-v-36c1dfe8="" tabindex="0" aria-haspopup="dialog" test-id="vs-Timetable-item-4-0-135299254" class="Timetable-TimetableItem Timetable-TimetableItem-m" role="button" aria-label="Se detaljer om Teknologiforståelse på rom E109. Undervisningstime. Starter 14. desember 2023 klokken 08:20 og slutter 09:05" subjectcode="IKM1002" tttype="LESSON" starttimeanddateunix="1702538400" readonlyitems="[object Object],[object Object],[object Object],[object Object],[object Object]" actionitems="" teachername="Teacher" entityid="135299254" block="" teachinggroupid="12459877" data-v-45669d56="" style="border-left: 6px solid rgb(83, 237, 155); height: 90px; width: 100%;"><div data-v-33d0fd5d="" aria-hidden="true" class="Timetable-TimetableItem-wrapper"><div data-v-33d0fd5d="" class="Timetable-TimetableItem-header"><small data-v-33d0fd5d="" class="Timetable-TimetableItem-hours"><i data-v-33d0fd5d="" class="far fa-clock"></i> 08:20 - 09:05 </small><small data-v-33d0fd5d="" class="Timetable-TimetableItem-location"><i data-v-33d0fd5d="" class="far fa-map-marker"></i> E109 </small><!----></div><p data-v-33d0fd5d="" class="Timetable-TimetableItem-subject-name"> Teknologiforståelse </p><!----><small data-v-33d0fd5d="" class="Timetable-TimetableItem-type"> Undervisningstime </small><!----></div></div></div><!----></div><div data-v-45669d56="" data-v-36c1dfe8="" class="popup-container" style="top: 140px; left: 0%;"><div data-v-36c1dfe8="" data-v-45669d56=""><h4 data-v-36c1dfe8="" data-v-45669d56="" class="sr-only"> Teknologiforståelse på rom E109. Undervisningstime. Starter 14. desember 2023 klokken 09:10 og slutter 09:55 </h4><div data-v-33d0fd5d="" data-v-36c1dfe8="" tabindex="0" aria-haspopup="dialog" test-id="vs-Timetable-item-4-1-135299255" class="Timetable-TimetableItem Timetable-TimetableItem-m" role="button" aria-label="Se detaljer om Teknologiforståelse på rom E109. Undervisningstime. Starter 14. desember 2023 klokken 09:10 og slutter 09:55" subjectcode="IKM1002" tttype="LESSON" starttimeanddateunix="1702541400" readonlyitems="[object Object],[object Object],[object Object],[object Object],[object Object]" actionitems="" teachername="Teacher" entityid="135299255" block="" teachinggroupid="12459877" data-v-45669d56="" style="border-left: 6px solid rgb(83, 237, 155); height: 90px; width: 100%;"><div data-v-33d0fd5d="" aria-hidden="true" class="Timetable-TimetableItem-wrapper"><div data-v-33d0fd5d="" class="Timetable-TimetableItem-header"><small data-v-33d0fd5d="" class="Timetable-TimetableItem-hours"><i data-v-33d0fd5d="" class="far fa-clock"></i> 09:10 - 09:55 </small><small data-v-33d0fd5d="" class="Timetable-TimetableItem-location"><i data-v-33d0fd5d="" class="far fa-map-marker"></i> E109 </small><!----></div><p data-v-33d0fd5d="" class="Timetable-TimetableItem-subject-name"> Teknologiforståelse </p><!----><small data-v-33d0fd5d="" class="Timetable-TimetableItem-type"> Undervisningstime </small><!----></div></div></div><!----></div><div data-v-45669d56="" data-v-36c1dfe8="" class="popup-container" style="top: 260px; left: 0%;"><div data-v-36c1dfe8="" data-v-45669d56=""><h4 data-v-36c1dfe8="" data-v-45669d56="" class="sr-only"> Matematikk 1P-Y IM på rom E208. Undervisningstime. Starter 14. desember 2023 klokken 10:10 og slutter 10:55 </h4><div data-v-33d0fd5d="" data-v-36c1dfe8="" tabindex="0" aria-haspopup="dialog" test-id="vs-Timetable-item-4-2-135353441" class="Timetable-TimetableItem Timetable-TimetableItem-m" role="button" aria-label="Se detaljer om Matematikk 1P-Y IM på rom E208. Undervisningstime. Starter 14. desember 2023 klokken 10:10 og slutter 10:55" subjectcode="MAT1121" tttype="LESSON" starttimeanddateunix="1702545000" readonlyitems="[object Object],[object Object],[object Object],[object Object],[object Object]" actionitems="" teachername="Teacher" entityid="135353441" block="" teachinggroupid="12459866" data-v-45669d56="" style="border-left: 6px solid rgb(57, 57, 96); height: 90px; width: 100%;"><div data-v-33d0fd5d="" aria-hidden="true" class="Timetable-TimetableItem-wrapper"><div data-v-33d0fd5d="" class="Timetable-TimetableItem-header"><small data-v-33d0fd5d="" class="Timetable-TimetableItem-hours"><i data-v-33d0fd5d="" class="far fa-clock"></i> 10:10 - 10:55 </small><small data-v-33d0fd5d="" class="Timetable-TimetableItem-location"><i data-v-33d0fd5d="" class="far fa-map-marker"></i> E208 </small><!----></div><p data-v-33d0fd5d="" class="Timetable-TimetableItem-subject-name"> Matematikk 1P-Y IM </p><!----><small data-v-33d0fd5d="" class="Timetable-TimetableItem-type"> Undervisningstime </small><!----></div></div></div><!----></div><div data-v-45669d56="" data-v-36c1dfe8="" class="popup-container" style="top: 360px; left: 0%;"><div data-v-36c1dfe8="" data-v-45669d56=""><h4 data-v-36c1dfe8="" data-v-45669d56="" class="sr-only"> Yrkesfaglig fordypning vg1 på rom E109. Vikar. Starter 14. desember 2023 klokken 11:00 og slutter 11:45 </h4><div data-v-33d0fd5d="" data-v-36c1dfe8="" tabindex="0" aria-haspopup="dialog" test-id="vs-Timetable-item-4-3-135317780" class="Timetable-TimetableItem Timetable-TimetableItem-m" role="button" aria-label="Se detaljer om Yrkesfaglig fordypning vg1 på rom E109. Vikar. Starter 14. desember 2023 klokken 11:00 og slutter 11:45" tttype="SUBSTITUTION" originaltype="LESSON" starttimeanddateunix="1702548000" readonlyitems="[object Object],[object Object],[object Object],[object Object],[object Object]" actionitems="" teachername="Teacher" entityid="135317780" block="" teachinggroupid="12459773" data-v-45669d56="" style="border-left: 6px solid rgb(83, 237, 155); height: 90px; width: 100%;"><div data-v-33d0fd5d="" aria-hidden="true" class="Timetable-TimetableItem-wrapper"><div data-v-33d0fd5d="" class="Timetable-TimetableItem-header"><small data-v-33d0fd5d="" class="Timetable-TimetableItem-hours"><i data-v-33d0fd5d="" class="far fa-clock"></i> 11:00 - 11:45 </small><small data-v-33d0fd5d="" class="Timetable-TimetableItem-location"><i data-v-33d0fd5d="" class="far fa-map-marker"></i> E109 </small><!----></div><p data-v-33d0fd5d="" class="Timetable-TimetableItem-subject-name"> Yrkesfaglig fordypning vg1 </p><!----><small data-v-33d0fd5d="" class="Timetable-TimetableItem-type"> Vikar </small><!----></div></div></div><!----></div><div data-v-45669d56="" data-v-36c1dfe8="" class="popup-container" style="top: 510px; left: 0%;"><div data-v-36c1dfe8="" data-v-45669d56=""><h4 data-v-36c1dfe8="" data-v-45669d56="" class="sr-only"> Yrkesfaglig fordypning vg1 på rom E109. Vikar. Starter 14. desember 2023 klokken 12:15 og slutter 13:00 </h4><div data-v-33d0fd5d="" data-v-36c1dfe8="" tabindex="0" aria-haspopup="dialog" test-id="vs-Timetable-item-4-4-135317781" class="Timetable-TimetableItem Timetable-TimetableItem-m" role="button" aria-label="Se detaljer om Yrkesfaglig fordypning vg1 på rom E109. Vikar. Starter 14. desember 2023 klokken 12:15 og slutter 13:00" tttype="SUBSTITUTION" originaltype="LESSON" starttimeanddateunix="1702552500" readonlyitems="[object Object],[object Object],[object Object],[object Object],[object Object]" actionitems="" teachername="Teacher" entityid="135317781" block="" teachinggroupid="12459773" data-v-45669d56="" style="border-left: 6px solid rgb(83, 237, 155); height: 90px; width: 100%;"><div data-v-33d0fd5d="" aria-hidden="true" class="Timetable-TimetableItem-wrapper"><div data-v-33d0fd5d="" class="Timetable-TimetableItem-header"><small data-v-33d0fd5d="" class="Timetable-TimetableItem-hours"><i data-v-33d0fd5d="" class="far fa-clock"></i> 12:15 - 13:00 </small><small data-v-33d0fd5d="" class="Timetable-TimetableItem-location"><i data-v-33d0fd5d="" class="far fa-map-marker"></i> E109 </small><!----></div><p data-v-33d0fd5d="" class="Timetable-TimetableItem-subject-name"> Yrkesfaglig fordypning vg1 </p><!----><small data-v-33d0fd5d="" class="Timetable-TimetableItem-type"> Vikar </small><!----></div></div></div><!----></div><div data-v-45669d56="" data-v-36c1dfe8="" class="popup-container" style="top: 610px; left: 0%;"><div data-v-36c1dfe8="" data-v-45669d56=""><h4 data-v-36c1dfe8="" data-v-45669d56="" class="sr-only"> Yrkesfaglig fordypning vg1 på rom E109. Undervisningstime. Starter 14. desember 2023 klokken 13:05 og slutter 13:50 </h4><div data-v-33d0fd5d="" data-v-36c1dfe8="" tabindex="0" aria-haspopup="dialog" test-id="vs-Timetable-item-4-5-135321756" class="Timetable-TimetableItem Timetable-TimetableItem-m" role="button" aria-label="Se detaljer om Yrkesfaglig fordypning vg1 på rom E109. Undervisningstime. Starter 14. desember 2023 klokken 13:05 og slutter 13:50" subjectcode="YFF4106" tttype="LESSON" starttimeanddateunix="1702555500" readonlyitems="[object Object],[object Object],[object Object],[object Object],[object Object]" actionitems="[object Object]" teachername="Teacher" entityid="135321756" block="" teachinggroupid="12459773" data-v-45669d56="" style="border-left: 6px solid rgb(83, 237, 155); height: 90px; width: 100%;"><div data-v-33d0fd5d="" aria-hidden="true" class="Timetable-TimetableItem-wrapper"><div data-v-33d0fd5d="" class="Timetable-TimetableItem-header"><small data-v-33d0fd5d="" class="Timetable-TimetableItem-hours"><i data-v-33d0fd5d="" class="far fa-clock"></i> 13:05 - 13:50 </small><small data-v-33d0fd5d="" class="Timetable-TimetableItem-location"><i data-v-33d0fd5d="" class="far fa-map-marker"></i> E109 </small><!----></div><p data-v-33d0fd5d="" class="Timetable-TimetableItem-subject-name"> Yrkesfaglig fordypning vg1 </p><!----><small data-v-33d0fd5d="" class="Timetable-TimetableItem-type"> Undervisningstime </small><!----></div></div></div><!----></div><div data-v-45669d56="" data-v-36c1dfe8="" class="popup-container" style="top: 710px; left: 0%;"><div data-v-36c1dfe8="" data-v-45669d56=""><h4 data-v-36c1dfe8="" data-v-45669d56="" class="sr-only"> Yrkesfaglig fordypning vg1 på rom E109. Undervisningstime. Starter 14. desember 2023 klokken 13:55 og slutter 14:40 </h4><div data-v-33d0fd5d="" data-v-36c1dfe8="" tabindex="0" aria-haspopup="dialog" test-id="vs-Timetable-item-4-6-135321757" class="Timetable-TimetableItem Timetable-TimetableItem-m" role="button" aria-label="Se detaljer om Yrkesfaglig fordypning vg1 på rom E109. Undervisningstime. Starter 14. desember 2023 klokken 13:55 og slutter 14:40" subjectcode="YFF4106" tttype="LESSON" starttimeanddateunix="1702558500" readonlyitems="[object Object],[object Object],[object Object],[object Object],[object Object]" actionitems="[object Object]" teachername="Teacher" entityid="135321757" block="" teachinggroupid="12459773" data-v-45669d56="" style="border-left: 6px solid rgb(83, 237, 155); height: 90px; width: 100%;"><div data-v-33d0fd5d="" aria-hidden="true" class="Timetable-TimetableItem-wrapper"><div data-v-33d0fd5d="" class="Timetable-TimetableItem-header"><small data-v-33d0fd5d="" class="Timetable-TimetableItem-hours"><i data-v-33d0fd5d="" class="far fa-clock"></i> 13:55 - 14:40 </small><small data-v-33d0fd5d="" class="Timetable-TimetableItem-location"><i data-v-33d0fd5d="" class="far fa-map-marker"></i> E109 </small><!----></div><p data-v-33d0fd5d="" class="Timetable-TimetableItem-subject-name"> Yrkesfaglig fordypning vg1 </p><!----><small data-v-33d0fd5d="" class="Timetable-TimetableItem-type"> Undervisningstime </small><!----></div></div></div><!----></div></div><div data-v-3b0485ec="" data-v-36c1dfe8="" class="Timetable-TimetableNowLine" style="top: 546.633px;"></div></div>

Solution

Instead of selecting the top-level element wrapping all of the elements, select the inner item elements and map over them to extract data from each one, dipping into leaf nodes and attributes as appropriate:

const fs = require("node:fs/promises");
const puppeteer = require("puppeteer"); // ^21.6.0

let browser;
(async () => {
  browser = await puppeteer.launch({headless: "new"});
  const [page] = await browser.pages();
  const html = await fs.readFile("test.html", {
    encoding: "utf-8",
  });
  await page.setContent(html); // replace with goto
  const data = await page.$$eval(
    ".Timetable-TimetableItem",
    els =>
      els.map(el => {
        const text = s =>
          el
            .querySelector(`.TimeTable-TimetableItem-${s}`)
            .textContent.trim();
        return {
          header: el.previousElementSibling.textContent.trim(),
          label: el.getAttribute("aria-label"),
          subjectCode: el.getAttribute("subjectcode"),
          tttype: el.getAttribute("tttype"),
          entityId: el.getAttribute("entityid"),
          teachingGroupId: el.getAttribute("teachinggroupid"),
          startTimeAndDateUnix: el.getAttribute(
            "starttimeanddateunix"
          ),
          teacher: el.getAttribute("teachername"),
          hours: text("hours"),
          location: text("location"),
          name: text("subject-name"),
          type: text("type"),
        };
      })
  );
  console.log(data);
})()
  .catch(err => console.error(err))
  .finally(() => browser?.close());

Output:

[
  {
    header: 'Teknologiforståelse på rom E109. Undervisningstime. Starter 14. desember 2023 klokken 08:20 og slutter 09:05 ',
    label: 'Se detaljer om Teknologiforståelse på rom E109. Undervisningstime. Starter 14. desember 2023 klokken 08:20 og slutter 09:05',
    subjectCode: 'IKM1002',
    tttype: 'LESSON',
    entityId: '135299254',
    teachingGroupId: '12459877',
    startTimeAndDateUnix: '1702538400',
    teacher: 'Teacher',
    hours: '08:20 - 09:05',
    location: 'E109',
    name: 'Teknologiforståelse',
    type: 'Undervisningstime'
  },
// ...
]

Before selecting, use something like

await page.waitForSelector(".TimeTable-TimetableItem-hours");

to make sure the elements are there.

Tips:

  • Generally speaking, avoid attribute selectors for classes like [class='active Timetable-TimetableDays_day']. These are hyper-rigid and brittle--if the order of the classes changes, or an additional class is added, it'll break. Instead, use .active.Timetable-TimetableDays_day which is more flexible, or even drop the .active if .Timetable-TimetableDays_day is already distinct.
  • Avoid ElementHandles when possible. They're harder to code than $$eval, slower (more network calls to the browser) and can go stale between selection and property accesses.


Answered By - ggorlen
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Thursday

Puppeteer does not load images stored locally when generate PDF

 12:13 AM     html, javascript, pdf, pdf-generation, puppeteer     No comments   

Issue

I'm trying to generate a PDF using Puppeteer and Handlebars inside a Electron app. But the images are not showing in the .PDF file, I tried to debug using headless mode, but did not find nothing usefull.

My folder structure is:

+-- pdf_template
|   +-- generatePDF.js
|   +-- template.html
|   +-- template.css
|   +-- logo.png
|   +-- bg.png

generatePDF.js :

try {
    (async () => {
        var dataBinding = {
            total: 123456,
        };

        var templateHtml = fs.readFileSync(
            path.join(
                process.cwd(),
                '/app/pages/pdf_template/template.html'
            ),
            'utf-8'
        );

        var template = handlebars.compile(templateHtml);
        var finalHtml = template(dataBinding);
        var options = {
            path: 'report.pdf',
            printBackground: true,
            format: 'A4',
        };

        const browser = await puppeteer.launch({
            args: ['--no-sandbox'],
            headless: true,
        });

        const page = await browser.newPage();
        await page.goto(
            `data:text/html;charset=UTF-8,${encodeURIComponent(finalHtml)}`,
            {
                waitUntil: ['domcontentloaded', 'networkidle0', 'load', 'networkidle2'],
            }
        );

        await page.addStyleTag({
            path: __dirname + '/node_modules/bootstrap/dist/css/bootstrap.min.css',
        });
        await page.addStyleTag({
            path: __dirname + '/app/pages/pdf_template/template.css',
        });

        await page.emulateMedia('screen');

        await page.pdf(options);
        await browser.close();

        console.log('Done: PDF is created!');
    })();
} catch (err) {
    console.log('ERROR:', err);
}

template.html:

<!DOCTYPE html>
<html>
    <head>
        <mate charest="utf-8" />
        <title>Report</title>

    </head>
    <body>
        <div class="row" id="header">
            <div class="col" id="logo-box">
                <img
                    src="logo.png"
                    id="logo"
                />
            </div>
            <div class="col-8">
                ...
        </div>

        ...
    </body>
</html>

template.css

body {
    background-image: url('bg.png');
    background-size: cover;
    width: 21cm;
    height: 29.7cm;
    padding: 15mm;
    margin: 0;
}

Both images from HTML and CSS are not showing. Am I missing something?


Solution

An answer can be found here : How to point Puppeteer to local images/fonts?

It seems as the generated page URL is about:blank chromium does not allow local resources to be loaded for safety reasons. I managed to bypass this problem by including the binaries of the images in my HTML template as :

//In CSS
background-image: url("data:image/png;base64,BINARY_CHUNKS");
//In HTML
<img src="data:image/png;base64,BINARY_CHUNKS" class="logo">

As for getting a local file in binary I would suggest fs:

fs.readFileSync(`${process.cwd()}\\your_image_path.png`).toString('base64')

Hope someone found that usefull !



Answered By - Chalibou
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Tuesday

How do you click on an element with text in Puppeteer?

 9:38 PM     html, javascript, puppeteer     No comments   

Issue

Is there any method or solution to click on an element with text? I couldn't find one in the API.

For example I have the following HTML:

<div class="elements">
    <button>Button text</button>
    <a href=#>Href text</a>
    <div>Div text</div>
</div>

And I want to click on an element in which text is wrapped (click on the button inside .elements), like so:

Page.click('Button text', '.elements')

Solution

Short answer

This XPath expression will query a button which contains the text "Button text":

const [button] = await page.$x("//button[contains(., 'Button text')]");
if (button) {
    await button.click();
}

To also respect the <div class="elements"> surrounding the buttons, use the following code:

const [button] = await page.$x("//div[@class='elements']/button[contains(., 'Button text')]");

Explanation

To explain why using the text node (text()) is wrong in some cases, let's look at an example:

<div>
    <button>Start End</button>
    <button>Start <em>Middle</em> End</button>
</div>

First, let's check the results when using contains(text(), 'Text'):

  • //button[contains(text(), 'Start')] will return both two nodes (as expected)
  • //button[contains(text(), 'End')] will only return one nodes (the first) as text() returns a list with two texts (Start and End), but contains will only check the first one
  • //button[contains(text(), 'Middle')] will return no results as text() does not include the text of child nodes

Here are the XPath expressions for contains(., 'Text'), which works on the element itself including its child nodes:

  • //button[contains(., 'Start')] will return both two buttons
  • //button[contains(., 'End')] will again return both two buttons
  • //button[contains(., 'Middle')] will return one (the last button)

So in most cases, it makes more sense to use the . instead of text() in an XPath expression.



Answered By - Thomas Dondorf
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

JEST - SyntaxError: Unexpected token 'export' with uuid library

 5:16 AM     babeljs, jestjs, nest, puppeteer, typescript     No comments   

Issue

I used to solve similar errors while I was using Jest with only Javascript but currently Im not able to do so with Typescript.

All my tests were running fine until I installed Puppeteer which requires "@types/jest-environment-puppeteer", "@types/puppeteer" and "@types/expect-puppeteer".

After installing them, puppeteer tests are running perfectly, but other tests started to fail with below error.

  D:\...\api\node_modules\uuid\dist\esm-browser\index.js:1    
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){export { default as v1 } from './v1.js';
                                                                                      ^^^^^^  

    SyntaxError: Unexpected token 'export'

      at Runtime.createScriptFromCode (../node_modules/jest-runtime/build/index.js:1796:14)   
      at Object.require (../node_modules/@nestjs/common/decorators/core/injectable.decorator.js:4:16)

WHAT I DID?

allowJs: true on tsconfig.json and set the transformIgnorePatterns on jest configs. So that jest can compile files from node_modules/ After that this error stopped but test failed for another strange reason. And worse is that test start time have increased too much.

So I left allowJs as in original setup and updated jest config from

"transform": {
   "^.+\\.(t|j)s$": "ts-jest"
}

to

"transform": {
   "^.+\\.(t)s$": "ts-jest"
}

So currently ts-jest doesnt compile js files. But I think I am not able to make babel pick the transformation for js files. These are my jest configs:

{
  "moduleFileExtensions": ["js", "json", "ts"],
  "rootDir": ".",
  "testEnvironment": "node",
  "testRegex": ".e2e-spec.ts$",
  "transform": {
    "^.+\\.(t)s$": "ts-jest",
    "^.+\\.(js|jsx)$": "babel-jest"
  },
  "transformIgnorePatterns": ["<rootDir>/node_modules/.+.(js|jsx)$"]
}

Solution

Thanks to this reply: https://stackoverflow.com/a/54117206/15741905

I started googling for similar fixes and ended up here: https://github.com/uuidjs/uuid/issues/451

And this solved my problem: https://github.com/uuidjs/uuid/issues/451#issuecomment-1112328417

// jest.config.js
{
//................
  moduleNameMapper: {
    // Force module uuid to resolve with the CJS entry point, because Jest does not support package.json.exports. See https://github.com/uuidjs/uuid/issues/451
    "uuid": require.resolve('uuid'),
  }
}

Tough I would still be happy if there is solution to this by using jest-babel.

Because I had to carry jest configs from package.json to a seperate .js file.

Edit: According to this github issue compatibility issue has been solved with the latest release of the uuid library.



Answered By - damdafayton
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Thursday

How to fix , Bug: Cannot read property 'contentFrame' of null using puppeteer

 6:48 PM     iframe, puppeteer, typescript     No comments   

Issue

I am experiencing a bug when I request an api that I implement. Once I have used one of the endpoints, it shows me the error following error, which can be seen below.

There will be no way to control that error?

Error message:

TypeError: Cannot read property 'contentFrame' of null
    at Object.getAnimeVideo (C:\Users\c\Desktop\ryuanime\src\api\scraper.ts:89:37)
    at process._tickCallback (internal/process/next_tick.js:68:7)

Code:

const getAnimeVideo = async (id: string, chapter: number) => {
  const BASE_URL = `${url}${id}/${chapter}/`;
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(BASE_URL);
  const elementHandle = await page.$('.player_conte');
  const frame = await elementHandle.contentFrame(); //line 89 error
  const video = await frame.$eval('#jkvideo_html5_api', el =>
    Array.from(el.getElementsByTagName('source')).map(e => e.getAttribute("src")));
  await browser.close();
  return video;
}

Solution

Problem

elementHandle is null. That's why you get the error that there is not function contentFrame on null. page.$ is null, when the selector cannot be found.

Solution

To solve the problem, you can do two things:

  • Is the selector actually the selector you are looking for? Is it maybe inside a frame and not on the page itself or maybe misspelled?
  • Maybe the element is not present at the time when your script is running? Maybe the page asynchronously loads more data and change the DOM? In that case, you can use page.waitForSelector like this to wait until the element is present:

    const elementHandle = await page.waitForSelector('.player_conte');
    


Answered By - Thomas Dondorf
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

How to manipulate mat-slider value using puppeteer

 9:47 AM     puppeteer, typescript     No comments   

Issue

I am trying to change a mat-slider value programmatically with puppeteer but I can't get it to work.

This is what I have tried:

async function changeSliderValue(page:Page){
    try {
        const thumb = await page.$('.mat-slider-thumb'); 
        const position = await thumb.boundingBox();
        await page.mouse.move(position.x, position.y);
        await page.mouse.down();
        await page.mouse.move(position.x + 100, position.y);
        await page.mouse.up();
    } catch (error) {
        console.log(error);
    }
}

but the thumb position/slider value doesn't change.

Can you suggest a better way?

This is the slider:

<mat-slider _ngcontent-c28="" class="scale-slider mat-slider mat-accent mat-slider-horizontal" max="100" min="1"
    name="scale" role="slider" step="1" tabindex="0" aria-disabled="false" aria-valuemax="100" aria-valuemin="1"
    aria-valuenow="28.000000000000004" aria-orientation="horizontal"
    style="touch-action: none; user-select: none; -webkit-user-drag: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);">
    <div class="mat-slider-wrapper">
        <div class="mat-slider-track-wrapper">
            <div class="mat-slider-track-background" style="transform: translateX(0px) scaleX(0.727273);"></div>
            <div class="mat-slider-track-fill" style="transform: translateX(0px) scaleX(0.272727);"></div>
        </div>
        <div class="mat-slider-ticks-container" style="transform: translateX(0%);">
            <div class="mat-slider-ticks" style="background-size: 0% 2px; transform: translateZ(0px) translateX(0%);">
            </div>
        </div>
        <div class="mat-slider-thumb-container" style="transform: translateX(-72.7273%);">
            <div class="mat-slider-focus-ring"></div>
            <div class="mat-slider-thumb"></div>
            <div class="mat-slider-thumb-label"><span class="mat-slider-thumb-label-text">28.000000000000004</span>
            </div>
        </div>
    </div>
</mat-slider>

Solution

Here's my demo on Angular Material Slider

const puppeteer = require("puppeteer");

(async function main() {
  try {
    console.log("launching");
    const browser = await puppeteer.launch({
      headless: false
    });
    const page = await browser.newPage();
    await page.goto(
      "https://material.angular.io/components/slider/overview",
      {
        waitUntil: "networkidle2"
      }
    );

    const cookieBtnSelector =
      "body > material-docs-app > app-cookie-popup > div > div > button";

    await page.click(cookieBtnSelector);

    const sliderSelector =
      "#slider-overview > div > div.docs-example-viewer-body.ng-star-inserted > slider-overview-example > mat-slider > div";
    await page.waitForSelector(sliderSelector);

    const sliderElement = await page.$(sliderSelector);
    const pos = await sliderElement.asElement().boundingBox();

    const percentage = 90; // adjust slider percentage;

    await page.mouse.click(
      pos.x + percentage * (pos.width / 100),
      pos.y
    );
  } catch (e) {
    console.log("our error", e);
  }
})();


Answered By - Hoàng Huy Khánh
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Tuesday

Test background style has changed on hover

 1:30 AM     css, puppeteer, stenciljs     No comments   

Issue

As the title states I want to test that my simple style is applied to an element on hover. This code below "works" but it's not quite doing what I want.

it('changes style on hover', async () => {
  const page = await newE2EPage();
  await page.setContent('<some-button></some-button>');

  const button = await page.find('some-button >>> button');
  await button.hover();
  await page.waitForChanges();
  const background = (await button.getComputedStyle()).background;
  expect(background).toBe('rgb(104, 107, 149) none repeat scroll 0% 0% / auto padding-box border-box');
});

I don't want 'rgb(104, 107, 149) none repeat scroll 0% 0% / auto padding-box border-box' but the hex value.

Here's my CSS:

button:hover:not([disabled]) {
  background: #686B95;
}

Is there a better way to do this?


Solution

Looks like I would have to implement an rgb to hex function which is overkill for what I'm testing but I was able to solve my issue. Ignoring the fact that I'm applying my style as hex it will be returned by getComputedStyle as rgb so I can test for that by changing background in my css to background-color and pull that like so:

const style = (await button.getComputedStyle()).getPropertyValue('background-color');
// working rgb to hex conversion https://g.co/kgs/VCGy9H
expect(style).toBe('rgb(104, 107, 149)');

Here I can see that the hover style is being applied properly and my test passes.



Answered By - Micky
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Friday

Puppeteer select element id where beginning and end are dynamically generated

 10:52 PM     css-selectors, html, javascript, puppeteer     No comments   

Issue

I'm trying to use puppeteer to select a dynamic element id. I've found how to select and element using just the beginning or just the end, but what I'm currently trying to do is find the element by the static part of the id in the center.

await page.waitForSelector('[id^="holder"][id$="_private_1"]');

In the above code snippet the original id looks like holder123456_private_1. I've gotten that part fine. However, the end of "_private_1" the number may change. So essentially I need the same code above but leave off the number at the end.


Solution

What you probably could do is to use '[id^="holder"][id*="_private_"]' as your selector (id starts with "holder" and has "_private_" somewhere in the id name. That would work if you don't have elements with e.g. id="holder123_not_private_321" which you don't want to target. Otherwise i don't think there is any other selector options (https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors)



Answered By - mbehzad
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Wednesday

Angular & puppeteer installation errors

 12:22 AM     angular, npm, puppeteer, typescript     No comments   

Issue

I've started a new angular project where I want to scrape some data from a website and redisplay it on my page. I expected to start a new project and just NPM install puppeteer to be up and running but the compiler is throwing multiple errors after I installed puppeteer.

I've installed angular with ng new and added puppeteer with NPM, but when I run the code I'm getting the following errors:

ERROR in node_modules/puppeteer/lib/types.d.ts(6,13): error TS1005: '=' expected.
node_modules/puppeteer/lib/types.d.ts(6,31): error TS1005: ';' expected.
node_modules/puppeteer/lib/types.d.ts(3460,46): error TS1005: ';' expected.
node_modules/puppeteer/lib/types.d.ts(3460,59): error TS1011: An element access expression should take an argument.

these issues are specifically these two lines of code in puppeteer:

import type { Readable } from 'stream';
//... and...
export declare type JSONArray = readonly Serializable[];

I'm using nodejs version v16.13.2, I've upgraded typescript to version 4.6.2 and tried upgrading @types/node because it was throwing errors before. If I upgrade @types/node to the latest my error list upgrades to even more issues

ERROR in node_modules/@types/node/assert.d.ts(12,72): error TS1144: '{' or ';' expected.
node_modules/@types/node/assert.d.ts(229,72): error TS1144: '{' or ';' expected.
node_modules/@types/node/assert.d.ts(400,98): error TS1144: '{' or ';' expected.
node_modules/@types/node/assert.d.ts(400,105): error TS1005: ';' expected.
node_modules/@types/node/assert.d.ts(400,108): error TS1005: ';' expected.
node_modules/@types/node/assert.d.ts(432,102): error TS1144: '{' or ';' expected.
node_modules/@types/node/assert.d.ts(432,109): error TS1005: ';' expected.
node_modules/@types/node/assert.d.ts(432,112): error TS1005: ';' expected.
node_modules/@types/node/assert.d.ts(734,51): error TS1144: '{' or ';' expected.
node_modules/@types/node/assert.d.ts(734,57): error TS1005: ';' expected.
node_modules/@types/node/assert.d.ts(734,60): error TS1005: ';' expected.
node_modules/@types/node/assert.d.ts(892,65): error TS1005: ';' expected.
node_modules/puppeteer/lib/types.d.ts(6,13): error TS1005: '=' expected.
node_modules/puppeteer/lib/types.d.ts(6,31): error TS1005: ';' expected.
node_modules/puppeteer/lib/types.d.ts(3460,46): error TS1005: ';' expected.
node_modules/puppeteer/lib/types.d.ts(3460,59): error TS1011: An element access expression should take an argument.

So I've rolled back to version 12.0.2 where I only get the puppeteer issues.

My current package.json is:

{
  "name": "ciaw-scrapper",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~7.2.0",
    "@angular/common": "~7.2.0",
    "@angular/compiler": "~7.2.0",
    "@angular/core": "~7.2.0",
    "@angular/forms": "~7.2.0",
    "@angular/platform-browser": "~7.2.0",
    "@angular/platform-browser-dynamic": "~7.2.0",
    "@angular/router": "~7.2.0",
    "core-js": "^2.5.4",
    "puppeteer": "^13.5.0",
    "rxjs": "~6.3.3",
    "sass": "^1.49.9",
    "tslib": "^1.9.0",
    "zone.js": "~0.8.26"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.13.0",
    "@angular/cli": "~7.3.4",
    "@angular/compiler-cli": "~7.2.0",
    "@angular/language-service": "~7.2.0",
    "@types/jasmine": "~2.8.8",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "^12.0.2",
    "codelyzer": "~4.5.0",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~4.0.0",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.11.0",
    "typescript": "~3.2.2"
  }
}

When I run on a newer version of angular (13) and CLI ,as a second attempt, I get a whole different set of errors:

./node_modules/puppeteer/node_modules/ws/lib/buffer-util.js:103:21-42 - Warning: Module not found: Error: Can't resolve 'bufferutil' in 'C:\Users\james\Desktop\scraper\ciaw-scraper\node_modules\puppeteer\node_modules\ws\lib'

./node_modules/puppeteer/node_modules/ws/lib/validation.js:109:22-47 - Warning: Module not found: Error: Can't resolve 'utf-8-validate' in 'C:\Users\james\Desktop\scraper\ciaw-scraper\node_modules\puppeteer\node_modules\ws\lib'



./node_modules/fs-constants/browser.js:1:0-37 - Error: Module not found: Error: Can't resolve 'constants' in 'C:\Users\james\Desktop\scraper\ciaw-scraper\node_modules\fs-constants'

BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.

If you want to include a polyfill, you need to:
        - add a fallback 'resolve.fallback: { "constants": require.resolve("constants-browserify") }'
        - install 'constants-browserify'
If you don't want to include a polyfill, you can use an empty module like this:
        resolve.fallback: { "constants": false }

./node_modules/glob/glob.js:49:13-30 - Error: Module not found: Error: Can't resolve 'assert' in 'C:\Users\james\Desktop\scraper\ciaw-scraper\node_modules\glob'

BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.
This is no longer the case. Verify if you need this module and configure a polyfill for it.

If you want to include a polyfill, you need to:
        - add a fallback 'resolve.fallback: { "assert": require.resolve("assert/") }'
        - install 'assert'
If you don't want to include a polyfill, you can use an empty module like this:
        resolve.fallback: { "assert": false }


........ (this continues on like this

I've tried adding following to the package.json to fix these, but this didn't fix it:

"browser": {
   "fs": false,
   "path": false,
   "os": false
}

I've also tried adding path and stream through NPM.

I tried puppeteer before in a small javascript project and had everything up and running, but adding it on top of angular has not worked so far.


Solution

Puppeteer is a node.js library - it doesn't work as-is in browser.

There was additional documentation here doc, seems to have expired.



Answered By - New-Way
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg

Clicking navigation button in Puppeteer returns null response? How to see which function is being clicked?

 1:06 PM     angularjs, mocha.js, puppeteer, testing     No comments   

Issue

I'm trying to test clicking a button on a registration app to make sure that the page correctly navigates to the right page.

When I console.log out response in the code it returns an array that looks like this

[undefined, null]

However when I take a screenshot of the page or check the url, the click and navigation worked. It is on the correct page.

I don't understand why this is returning undefined/null. Also, I could not figure out how to test which function was being called when you click on the button.

I wanted to be able to see the actual function that is being called.

I'm using AngularJS 1.6, Mocha, Puppeteer 1.11, and Node 6.4.0

I'm also a junior dev so it could be something simple that I just didn't understand, please help!

it('should rederict to guest_sms_code state when clicking \'I have a guest code\'', async (function () {
    var response = await (Promise.all([
        page.waitForNavigation({waitUntil: 'domcontentloaded'}),
        page.click('[ng-click="enterSmsCode()"]'),
      ]));
    var url = await (page.url());
    if (url.indexOf('guest_sms_code') === -1) {
        assert.ok(false, 'The URL does not contain \'guest_sms_code\'')
    }
}))

Solution

I'm not convinced that you can tell which method is called from a UI test. That's something that a JavaScript unit test can prove using, say, something like Mocha or Jest to test your codes behaviour. However an automated UI test, from my experience, won't tell you that. After all, you're trying to hide the inner workings of your app from an external user, right?

As for why the Promise.all([]) call is returning [undefined, null], well I can at least help you with that.

Firstly, you should have a look at the API documentation for both methods you've invoked in your test:

waitForNavigation docs: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagewaitfornavigationoptions

click docs: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageclickselector-options

In the case of waitForNavigation the response actually returns a Promise which may or may not have a Response value. Whether any data is returned with that Response is dependent on the navigation that occurs in the UI. In your case, you're seeing that undefined value in your array to indicate that there has not been any Response data returned from the navigation.

For the click method, this also just returns a resolved or rejected Promise with no data of any kind returned. So, naturally, you've no actual value returned here at all hence the null value being pushed to the array.



Answered By - AJC24
Read More
  • Share This:  
  •  Facebook
  •  Twitter
  •  Google+
  •  Stumble
  •  Digg
Older Posts Home

Popular Posts

  • Letting items go off the div in a horizontal list
    Issue I am trying to recreate this concept app's home page with html css only....
  • Scroll capturing not working because the Svelte slot is inside the Drawer component (Header)
    Issue I was searching for a way to scroll to an element in order to trigger an event. I no...
  • npm ci command failing with "Cannot read property '@angular/animations' of undefined"
    Issue While performing docker build for my Angular project, In the npm ci step, I...
  • How to test Input with React Testing Library?
    Issue I am trying to test an input value of Search component via React Testing L...
  • Typescript generating javascript that doesn't work
    Issue Node is not happy about something in the Javascript that TypeScript is gener...
  • Create a DisplayComponent having a display-component selector
    Issue I am asked to create an Angular component named DisplayComponent and having display...
  • Typescript DiscordJS bot audio stops working after a few seconds of playing
    Issue I am currently facing an issue with playing audio through a bot I made for d...
  • Ionic Capacitor no capacitor.config.json but instead capacitor.config.ts
    Issue I created an Angular/Ionic project with capacitor. Now I wanted to make changes in m...
  • Angular FormGroup in Storybook: Converting circular structure to JSON
    Issue I'm work with angular and storybook. I have a FormGroup and FormArray in...
  • TypeError: Body is unusable - NextJS Server Action POST
    Issue I am using NextJS v14.1.0 and server action in client component. I get the p...

Labels

.d.ts .htaccess .net .net-5 .net-6.0 .net-8.0 .net-core 2-way-object-databinding 2d 3d 3d-model 3d-modelling 960.gs a2hs aar abortcontroller abp abp-framework absolute abstract abstract-class accelerator access-control-allow-origin access-token accessibility accordion ace-editor acfpro ack acronym action actioncable actionsheet active-directory adal adb adblock addeventlistener adfs adjustment adminlte admob adobe-brackets adonis.js adonisjs-ace ads adsense advanced-custom-fields advertisement-server adyen aes aframe ag-grid ag-grid-angular ag-grid-ng2 ag-grid-react aggregation agm agm-core agm-map agora-web-sdk-ng agora.io airbrake airplay airtable ajax ajax.net ajsf ajv alert alexa-skill alexa-skills-kit algebraic-data-types algolia algorithm alias alignment alpine.js alt alt-attribute altbeacon alter amazon-cloudformation amazon-cloudfront amazon-cognito amazon-dynamodb amazon-dynamodb-streams amazon-ec2 amazon-ecr amazon-elastic-beanstalk amazon-glacier amazon-iam amazon-rds amazon-s3 amazon-sns amazon-sqs amazon-vpc amazon-web-services amcharts amcharts4 amcharts5 amp-html ampersand amplify amplifyjs amplitude-analytics analytics anchor anchor-scroll anchor-solana android android-10.0 android-11 android-12 android-app-bundle android-appcompat android-build android-chrome android-dark-theme android-emulator android-espresso android-gradle-plugin android-intent android-location android-night-mode android-permissions android-sdk-tools android-softkeyboard android-spannable android-sqlite android-studio android-studio-4.2 android-toast android-tv android-vibration android-view android-webview androidx angle angular angular-abstract-control angular-activatedroute angular-akita angular-animations angular-auth-oidc-client angular-auxiliary-routes angular-binding angular-bootstrap angular-bootstrap-calendar angular-breadcrumb angular-broadcast angular-builder angular-cache angular-calendar angular-cdk angular-cdk-drag-drop angular-cdk-overlay angular-cdk-virtual-scroll angular-changedetection angular-chart angular-chosen angular-cli angular-cli-v6 angular-cli-v8 angular-cli-v9 angular-compiler angular-compiler-cli angular-component-life-cycle angular-component-router angular-components angular-config angular-content-projection angular-controller angular-controlvalueaccessor angular-cookies angular-custom-validators angular-dart angular-datatables angular-date-format angular-daterangepicker angular-decorator angular-dependency-injection angular-devkit angular-di angular-directive angular-dom-sanitizer angular-dragdrop angular-dynamic-components angular-dynamic-forms angular-e2e angular-elements angular-errorhandler angular-eslint angular-event-emitter angular-factory angular-file-upload angular-filters angular-flex-layout angular-fontawesome angular-formbuilder angular-formly angular-forms angular-fullstack angular-google-maps angular-gridster2 angular-guards angular-highcharts angular-http angular-http-interceptors angular-httpclient angular-httpclient-interceptors angular-hybrid angular-i18n angular-in-memory-web-api angular-inheritance angular-injector angular-input angular-ivy angular-jest angular-json angular-kendo angular-language-service angular-lazyloading angular-leaflet-directive angular-library angular-lifecycle-hooks angular-load-children angular-local-storage angular-localize angular-maps angular-material angular-material-15 angular-material-5 angular-material-6 angular-material-7 angular-material-datetimepicker angular-material-paginator angular-material-stepper angular-material-table angular-material-theming angular-material2 angular-migration angular-mock angular-module angular-module-federation angular-moment angular-nativescript angular-ng-class angular-ng-if angular-ngfor angular-ngmodel angular-ngmodelchange angular-ngrx-data angular-ngselect angular-nvd3 angular-oauth2-oidc angular-observable angular-output angular-package-format angular-pipe angular-promise angular-providers angular-pwa angular-reactive-forms angular-renderer angular-renderer2 angular-resolver angular-resource angular-route-guards angular-router angular-router-events angular-router-guards angular-router-params angular-routerlink angular-routing angular-schema-form angular-schematics angular-seed angular-service-worker angular-services angular-signals angular-slickgrid angular-social-login angular-socket-io angular-spectator angular-ssr angular-standalone-components angular-state-managmement angular-storybook angular-strap angular-structural-directive angular-template angular-template-form angular-template-variable angular-test angular-testing-library angular-theming angular-toastr angular-tour-of-heroes angular-transfer-state angular-translate angular-tree-component angular-trix angular-ui angular-ui-bootstrap angular-ui-grid angular-ui-modal angular-ui-router angular-ui-router-extras angular-ui-select angular-ui-tree angular-ui-typeahead angular-unit-test angular-universal angular-upgrade angular-validation angular-validator angular-webpack angular10 angular11 angular12 angular13 angular14 angular14upgrade angular15 angular16 angular17 angular2-animation angular2-aot angular2-changedetection angular2-cli angular2-components angular2-custom-pipes angular2-databinding angular2-decorators angular2-di angular2-directives angular2-form-validation angular2-formbuilder angular2-forms angular2-google-maps angular2-guards angular2-highcharts angular2-hostbinding angular2-http angular2-material angular2-meteor angular2-modules angular2-moment angular2-nativescript angular2-ngcontent angular2-ngmodel angular2-observables angular2-pipe angular2-providers angular2-router angular2-router3 angular2-routing angular2-select angular2-services angular2-styleguide angular2-template angular2-testing angular2-toaster angular2-ui-bootstrap angular2-universal angular2viewencapsulation angular4 angular4-aot angular4-forms angular4-router angular5 angular6 angular7 angular8 angular9 angularbuild angulardraganddroplists angularfire angularfire2 angularjs angularjs-1.5 angularjs-1.6 angularjs-authentication angularjs-bindings angularjs-bootstrap angularjs-compile angularjs-components angularjs-controller angularjs-controlleras angularjs-digest angularjs-directive angularjs-e2e angularjs-filter angularjs-forms angularjs-google-maps angularjs-http angularjs-interpolate angularjs-log angularjs-material angularjs-module angularjs-ng-change angularjs-ng-checked angularjs-ng-class angularjs-ng-click angularjs-ng-disabled angularjs-ng-form angularjs-ng-href angularjs-ng-if angularjs-ng-init angularjs-ng-model angularjs-ng-repeat angularjs-ng-route angularjs-ng-show angularjs-ng-switch angularjs-ng-transclude angularjs-ng-value angularjs-ngmock angularjs-nvd3-directives angularjs-orderby angularjs-q angularjs-resource angularjs-routing angularjs-scope angularjs-select angularjs-service angularjs-slider angularjs-templates angularjs-timeout angularjs-track-by angularjs-validation angularjs-watch angulartics animate-on-scroll animate.css animated animation anime.js annotations anonymous anonymous-function ansible ant-design-pro ant-media-server antd antialiasing antora antplus antv any aos.js aot apache apache-echarts apache-fop apache-kafka apache-spark apache-superset apache-zeppelin apache2 apex apexcharts api api-design api-gateway api-key apk apollo apollo-angular apollo-client apollo-server app-initializer app-router app-service-environment app-store appbar appdata appearance append appendchild appery.io appium appium-android apple-app-site-association apple-m1 apple-push-notifications applepay applepay-web applepayjs application-server apply aptana arabic arcgis-js-api architecture argument-passing arguments aria-role arima arquero array-filter array-merge array-reduce array-splice arraybuffer arraylist arrayobject arrayofarrays arrays arrow-functions arrow-keys article asar ascii asp-net-core-spa-services asp.net asp.net-ajax asp.net-core asp.net-core-2.0 asp.net-core-2.1 asp.net-core-3.1 asp.net-core-6.0 asp.net-core-7.0 asp.net-core-8 asp.net-core-css-isolation asp.net-core-identity asp.net-core-mvc asp.net-core-razor-pages asp.net-core-signalr asp.net-core-webapi asp.net-identity asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-5 asp.net-web-api asp.net-web-api-routing asp.net-web-api2 aspect-ratio aspnetboilerplate aspnetcore-environment assets assign astro astrojs async-await async-pipe asynchronous asynchronous-javascript atom-editor attachment attr attributes audio audio-streaming audiocontext audiotrack augmented-reality auth-guard auth0 auth0-connection authentication authority authorization authorize.net autocomplete autofill autofocus autogrow automated-tests automatic-ref-counting automation automation-testing autonumeric.js autoplay autoprefixer autoresize autosize autosuggest avatar avif awk aws-amplify aws-amplify-cli aws-amplify-vue aws-api-gateway aws-appsync aws-cdk aws-cdk-typescript aws-chatbot aws-cloudformation aws-cloudformation-custom-resource aws-code-deploy aws-codeartifact aws-codebuild aws-codepipeline aws-lambda aws-sam aws-sdk aws-sdk-js aws-secrets-manager aws-security-group aws-serverless aws-ssm aws-step-functions aws-userpools axes axios axis-labels azure azure-active-directory azure-ad-b2c azure-ad-b2c-custom-policy azure-ad-graph-api azure-ad-msal azure-api-management azure-application-insights azure-application-insights-profiler azure-appservice azure-blob-storage azure-cdn azure-cosmosdb azure-cosmosdb-sqlapi azure-devops azure-devops-extensions azure-devops-rest-api azure-functions azure-maps azure-notificationhub azure-pipelines azure-pipelines-yaml azure-signalr azure-static-web-app azure-static-website-hosting azure-storage azure-virtual-machine azure-virtual-network azure-web-app-service b2b babel-jest babel-loader babel-plugin-react-css-modules babeljs back back-button backbone-events backbone.js backdrop backend background background-clip background-color background-image background-size backstage badge bamboo banner bar-chart barcode-scanner base-tag base58 base64 base64url bash basic-authentication batch-file batch-processing bazel bdd bearer-token beautifulsoup beego behaviorsubject bem bigcartel bigint biginteger binance binance-api-client binary bind binding bing bing-maps bitbucket bitbucket-pipelines bitmap blade blazor blazor-hybrid blazor-server-side blazor-webassembly blazorise blending blob block blockchain blockly blockquote blogdown blogger blogs bluebird bluetooth bluetooth-lowenergy blur bnf body-parser boilerplate bokeh bold boolean boolean-logic boost-propertytree bootbox bootstrap-3 bootstrap-4 bootstrap-5 bootstrap-5.1 bootstrap-accordion bootstrap-cards bootstrap-carousel bootstrap-datepicker bootstrap-datetimepicker bootstrap-icons bootstrap-modal bootstrap-popover bootstrap-select bootstrap-table bootstrap-tags-input bootstrap-vue bootstrap5-modal border border-box border-image border-radius border-spacing botframework bottomnavigationview bower box box-shadow brain.js braintree branch breadcrumbs break breakpoints brightcove brightness broadcast browser browser-cache browser-detection browser-history browser-support browser-sync browser-tab browserstack bryntum-scheduler brython bubble-sort buffer build build-automation build-definition build-error build.gradle builtwith bull.js bullmq bulma bun bundler bundling-and-minification button buttonclick buttongroup buybutton.js c c# c#-4.0 c++ cache-control caching cakephp calc calculation calculator calendar calendly call callback callkit callstack camelcasing camera camera-api canactivate canactivatechild candeactivate cannon.js canvas capacitor capacitor-plugin capitalization capitalize capslock captcha caption capture capturestream capturing-group carbon-design-system card caret cargo carousel carriage-return cart cas case casting catalyst cdn cell center centering centos cgi cgi-bin chai chai-as-promised chakra-ui chalk change-detector-ref character character-encoding chart.js chart.js2 chartjs-2.6.0 chartjs-plugin-zoom charts chat chatbot checkbox checked checkmarx checkout cheerio child-process children chinese-locale chm choicesjs chord chrome-custom-tabs chrome-extension-manifest-v3 chromium chron chunking cicd circular-dependency citations cjk ckeditor ckeditor4.x ckeditor5 claims-authentication clasp class class-attributes class-names class-transformer class-validator classname clean-architecture clearfix clerk click clickable client client-side client-side-attacks client-side-validation clip clip-path clipboard clipping clock clone clonenode cloning closures cloud cloud-foundry cloudflare cloudinary cmd cocoapods code-coverage code-formatting code-generation code-injection code-push code-reuse code-signing code-translation codegen codehooks.io codeigniter codeigniter-3 codeigniter-restserver codelyzer codenameone codepen codesandbox coding-style coffeescript col collapsable collapse collation collect collections colon color-blending color-picker color-scheme color-space colors column-chart column-count column-width combinelatest combo-chart combobox cometchat command-line command-line-interface comments commonjs communication comobject compare comparison compass compass-sass compatibility compilation compile-time compiler-errors compiler-options compiler-warnings complextype component-store components compound-operator computed-properties computer-science computer-vision concatenation concatmap concurrently conditional conditional-compilation conditional-formatting conditional-operator conditional-rendering conditional-statements conditional-types config config.json configuration confirm confirm-dialog conflict connect-four connectivity console console.log constants constraint-validation-api constructor constructor-overloading contact contact-form-7 container-queries containers contains content-management-system content-security-policy content-type contenteditable contentproperty context-api contextmenu contextpath continuous-integration contrast contravariance controller controlvalueaccessor conventions converters cookies copy copy-constructor copy-paste cordova cordova-2.0.0 cordova-3 cordova-android cordova-ios cordova-plugin-advanced-http cordova-plugin-fcm cordova-plugin-firebasex cordova-plugin-proguard cordova-plugins core-js core-web-vitals correlation cors cors-anywhere couchdb countdown covariance cpanel cpu cpu-word crash create-react-app createcontext createelement createjs cron cropperjs cross-browser cross-domain cross-origin-read-blocking cross-origin-resource-policy cross-platform cross-window-scripting crt crud cryptography cryptojs cs50 csp csproj csrf csrf-token css css-animations css-calc css-cascade css-content css-counter css-filters css-float css-functions css-gradients css-grid css-houdini css-hyphens css-import css-in-js css-layer css-loader css-mask css-modules css-multicolumn-layout css-position css-print css-reset css-selectors css-shapes css-specificity css-sprites css-tables css-transforms css-transitions css-variables cssnano cssom csv cucumber cucumberjs cufon cumulative-layout-shift cups curl currency currency-formatting currency-pipe currying cursor curve custom-attributes custom-build custom-button custom-component custom-controls custom-cursor custom-data-attribute custom-directive custom-domain custom-element custom-font custom-post-type custom-type customization customvalidator cypress cypress-component-test-runner cypress-conditional-testing cypress-cucumber-preprocessor cypress-each d3-dag d3.js d3tree daisyui danfojs dangerouslysetinnerhtml darkmode dart dart-html dart-sass dashboard data-binding data-conversion data-retrieval data-structures data-transform data-uri data-visualization database database-migration dataframe datagrid datalist datasource datatable datatables date date-fns date-format date-formatting date-pipe date-range datepicker daterangepicker datetime datetime-format datetimepicker dayjs days deadline-timer debian debounce debouncing debugging decentralized-applications decimal decimalformat deck.gl declaration declarative declarative-programming declare decoder decoding decorator deep-copy deep-linking deeplink default default-value deferred deferred-loading defineproperty definitelytyped definition delay delegates deno denodb dependencies dependency-injection dependency-management deploying deployment deprecated descendant deserialization design-patterns desktop desktop-application destructuring details-tag detection dev-to-production developer-tools development-environment devexpress devextreme devextreme-angular device device-detection device-orientation devise devops devtools dexie dexiejs dhtml dhtmlx diagonal diagram dialog dictionary diff difference digital-ocean digital-signature dijit.layout directive directory directory-structure dirpagination disable disabled-control disabled-input discord discord.js discriminated-union dispatch display displayobject displaytag disqus distinct-values divi divi-theme divider division django django-admin django-celery django-crispy-forms django-csrf django-extensions django-filter django-forms django-models django-rest-framework django-templates django-views django-weasyprint django-webpack-loader djangocms-text-ckeditor dji-sdk dns docfx docker docker-compose docker-swarm dockerfile doctype document document-ready documentation dojo dom dom-events dom-manipulation dom-to-image domain-driven-design domain-name domdocument domparser dompdf donut-chart dotenv dotnetnuke download drag drag-and-drop draggable drake draw drawimage drawing drizzle drop-down-menu dropdown dropdownbox dropshadow dropzone.js drupal dry dspace dt dto duplicates durandal duration dwr dx-data-grid dynamic dynamic-arrays dynamic-data dynamic-html dynamic-import dynamic-programming dynamic-routing dynamic-values dynamically-generated dynamicgridview dynamics-crm dynamics-marketing dynamodb-queries e-commerce e2e e2e-testing each eager-loading easeljs easy-peasy echarts echo eclipse ecma ecmascript-2016 ecmascript-2017 ecmascript-2019 ecmascript-2020 ecmascript-5 ecmascript-6 ecmascript-next editor editorconfig editorjs effect effects ej2-gantt ej2-syncfusion ejs el-plus elastic-stack elasticsearch electron electron-builder electron-forge electron-packager element element-plus element-ui elementor elementref elementtree elixir elk ellipse ellipsis elm elysiajs emacs email email-attachments email-confirmation email-formats email-templates email-validation embed embedded-fonts ember.js emitter emmet emoji emojione emotion empty-list emulation encapsulation encoding encryption end-to-end endpoint enjoyhint enter enterprise entities entity entity-framework entity-framework-core enums environment environment-variables enzyme eos epub equivalent erase erb error-handling es6-class es6-module-loader es6-modules es6-promise esbuild escaping escpos eslint eslint-config-airbnb eslintrc esmodules esri esri-maps ethereum euro event-binding event-driven event-handling event-listener event-loop event-propagation eventemitter events eventstoredb excel excel-addins excel-formula excel-online excel-web-addins excel4node exceljs exception execcommand exif-js expand expandable-table expansion expo expo-sqlite export export-to-csv export-to-excel express express-handlebars express-session extend extending extends external external-js external-url extjs extract fabricjs facade facebook facebook-comments facebook-graph-api facebook-ios-sdk facebook-javascript-sdk facebook-login facebook-opengraph facebook-sharer facebook-social-plugins facelets factory factory-pattern fade fadein failed-installation faker.js fallback fancybox farsi fast-xml-parser fastapi fastcgi fastify fastlane faunadb favicon fetch fetch-api ffmpeg fido figma figure file file-io file-link file-not-found file-structure file-upload fileapi filelist filenames filepath filereader files-app filesaver.js filesystems filetree filter filtering final find findall findelement fingerprint firebase firebase-admin firebase-analytics firebase-app-check firebase-authentication firebase-cli firebase-cloud-messaging firebase-console firebase-dynamic-links firebase-extensions firebase-hosting firebase-notifications firebase-realtime-database firebase-security firebase-storage firebase-tools firebaseui firebug fireflysemantics-slice firefox firefox-addon firefox-addon-webextensions firefox-developer-tools firefox4 firewall fixed fixed-length-array fixed-width fixtures flash flask flask-autoindex flask-cors flask-mail flask-restful flask-socketio flask-sqlalchemy flask-wtforms flatpickr flex3 flexbox flexdashboard flexslider flextable flicker flickity flickr flip floating-action-button flowbite flower fluent-ui fluentui-react fluentvalidation fluid fluid-layout flutter flutter-test flutter-web flying-saucer focus folium font-awesome font-awesome-4 font-awesome-5 font-awesome-6 font-face font-family font-size fonts footer for-in-loop for-loop foreach foreground-service foregroundnotification foreignobject forgerock forgot-password fork-join form-control form-data form-fields form-submit form-verification formarray format formatdatetime formatting formbuilder formgroups formik formio formmail forms formula forward-reference forwarding foundation foundry-slate fp-ts fpm fragment framer-motion frameset frameworks freemarker freeze freshjs froala frontend frontpage fs full-width fullcalendar fullcalendar-3 fullcalendar-4 fullcalendar-5 fullcalendar-6 fullcalendar-scheduler fullscreen function function-call function-parameter functional-programming fusioncharts fxml gallery game-development gantt-chart garbage-collection gatsby gatsby-plugin-mdx gauge gcloud gdi+ generator generic-function generic-type-argument generic-type-parameters generics geojson geolocation geometry geonames geoserver gesture get getattribute getcomputedstyle getdate getelementbyid getelementsbyclassname getelementsbytagname getimagesize getter getter-setter getuikit getusermedia getvalue gherkin ghost-blog gif gis git git-bash git-diff git-husky gitbook github github-actions github-api github-flavored-markdown github-pages gitignore gitlab gitlab-ci gitlab-ci-runner global global-variables glyphicons gmail gmail-api go go-echo gojs golden-layout google-admin-sdk google-ads-api google-analytics google-analytics-4 google-analytics-api google-api google-api-java-client google-api-js-client google-app-engine google-apps-marketplace google-apps-script google-authentication google-calendar-api google-chrome google-chrome-console google-chrome-devtools google-chrome-extension google-chrome-headless google-chrome-warning google-cloud-build google-cloud-firestore google-cloud-functions google-cloud-platform google-cloud-pubsub google-cloud-scheduler google-cloud-sql google-cloud-storage google-cloud-vertex-ai google-colaboratory google-compute-engine google-developer-tools google-dfp google-diff-match-patch google-docs google-docs-api google-drive-api google-finance-api google-font-api google-fonts google-forms google-geolocation google-index google-login google-map-react google-maps google-maps-api-3 google-maps-autocomplete google-maps-markers google-material-icons google-oauth google-one-tap google-pagespeed google-places-api google-play google-play-billing google-play-console google-play-services google-plus google-plus-signin google-reviews google-roads-api google-search google-secret-manager google-sheets google-signin google-street-view google-street-view-static-api google-tag-manager google-text-to-speech google-translate google-visualization google-web-designer google-webfonts google-workspace googleplacesautocomplete gps gradient gradle grammar graph graphical-logo graphics graphql graphql-codegen graphql-js graphql-mutation graphviz gravatar gravity grayscale greasemonkey grecaptcha grep grid grid-layout gridstack gridster gridview groovy group-by grouping grpc grpc-js grpc-node grpc-web gruntjs gsap gsub gtag.js gtk gtk3 guard guid guidewire gulp gulp-imagemin gulp-sass gulp-typescript gulp-uglify gun gutenberg-blocks gwt h2 hamburger-menu hammer.js hana handle handlebars.js handsontable hapi hapijs hardhat hardware hash hash-location-strategy hashbang hashmap hashtag hbs hdiv hdpi header headless-cms headless-ui heads-up-notifications heatmap heic height helmet.js helper heroku heuristics hex hibernate hidden hide hierarchy highcharts highcharts-gantt higher-order-components higher-order-functions highlight highlight.js highlighting histogram history history.js hls.js home-button hono hook hook-woocommerce horizontal-alignment horizontal-scrolling host hosting hot-module-replacement hot-reload hotkeys hover href hsl htdocs html html-agility-pack html-content-extraction html-datalist html-email html-encode html-entities html-frames html-framework-7 html-head html-heading html-helper html-imports html-injections html-input html-lists html-parsing html-pdf html-rendering html-sanitizing html-select html-table html-tbody html-templates html-to-pdf html-validation html-webpack-plugin html.actionlink html2canvas html2pdf html4 html5-audio html5-canvas html5-draggable html5-filesystem html5-history html5-template html5-video htmlcollection htmlelements htmllint htmlspecialchars htmltools htmlunit htmx http http-accept-language http-delete http-equiv http-error http-get http-headers http-live-streaming http-options-method http-parameters http-patch http-post http-proxy http-proxy-middleware http-status-code-400 http-status-code-401 http-status-code-404 http-status-code-405 http-status-code-415 http-status-code-500 http-status-code-503 http-status-codes http2 httpbackend httpclient httpcontext httpcookie httpexception httpinterceptor httprequest httpresponse https httpserver httpwebrequest httpwebresponse httr huawei-mobile-services hugo husky hybrid-mobile-app hybris hydration hyperledger-composer hyperledger-fabric hyperlink hyperscript hyphen hyphenation i18next ibeacon icecast ico icon-fonts icons id3 ide identityserver3 identityserver4 idioms idp ienumerable if-statement ifc iframe iframe-resizer ignite-ui iife iis iis-10 iis-7 iis-7.5 iis-8 iisnode image image-cropper image-gallery image-processing image-resizing image-scaling image-size image-slider imagemap imagepicker imageset imaskjs imei imgur immutability immutable.js implements import import-from-excel importerror in-app-purchase inappbrowser include increment indentation index-signature indexeddb indexing indexof inertiajs inference infinite-scroll influxdb info information-visualization infragistics inheritance init initialization initializer inject injectable injection-tokens inline inline-styles inline-svg inner-classes innerhtml innertext input input-mask input-type-file inputbox inputevent inquirer insert inspect instagram installation instance instanceof integer integration intellij-idea intellisense interact.js intercept interceptor interface internationalization internet-explorer internet-explorer-11 internet-explorer-6 internet-explorer-7 internet-explorer-8 internet-radio interpolation intersection intersection-observer intersection-types intl-tel-input intrinsicattributes intro.js invariance inversion-of-control invisible-recaptcha invokescript ion-checkbox ion-content ion-grid ion-infinite-scroll ion-item ion-menu ion-radio-group ion-range-slider ion-segment ion-select ion-slides ion-toggle ionic ionic-appflow ionic-cli ionic-cordova ionic-enterprise-auth ionic-framework ionic-native ionic-native-http ionic-plugins ionic-popover ionic-popup ionic-react ionic-storage ionic-tabs ionic-v1 ionic-view ionic-vue ionic-webview ionic2 ionic2-calendar ionic3 ionic4 ionic5 ionic6 ionic7 ionicons ios ios-camera ios-permissions ios-simulator ios10 ios11 ios13 ios15 ip ipad ipc ipcmain ipconfig ipcrenderer iphone iphone-standalone-web-app ipython isnull iso8601 isodate istanbul itemcontainerstyle iter-ops iteration iterm2 itext itext7 itfoxtec-identity-saml2 itms-90809 itunes-search-api ivy jackson jaeger jakarta-ee jar jasmin jasmine jasmine-marbles jasmine-ts jasmine2.0 java java-8 javafx javafx-8 javascript javascript-debugger javascript-decorators javascript-framework javascript-import javascript-marked javascript-objects javascript-proxy jaws-screen-reader jdl jeditorpane jekyll jenkins jenkins-pipeline jersey jest-dom jest-preset-angular jestjs jhipster jinja2 jinja2-cli jira jira-rest-api jodit joi join joomla jose jpa jpeg jquery jquery-animate jquery-autocomplete jquery-deferred jquery-events jquery-lazyload jquery-masonry jquery-mobile jquery-plugins jquery-select2 jquery-selectors jquery-terminal jquery-ui jquery-ui-button jquery-ui-datepicker jquery-ui-dialog jquery-ui-draggable jquery-ui-menu jquery-ui-selectable jquery-ui-slider jquery-ui-sortable jquery-validate jqxgrid js-routes js-scrollintoview js-xlsx js-yaml jsbarcode jsbundling-rails jscompress jscontext jsdoc jsdom jsencrypt jsf jsf-2 jsfiddle jsgrid jshint json json-api json-ld json-schema-validator json-server json.net json2html json5 jsoneditor jsonidentityinfo jsonp jsonplaceholder jsonschema jsoup jsp jsp-tags jspdf jspdf-autotable jspsych jsrender jsreport jss jstl jstree jsx jszip jtable junit jupyter jupyter-notebook justify jvectormap jwplayer jwt kable kableextra karma-coverage karma-jasmine karma-mocha karma-runner kebab-case kendo-chart kendo-combobox kendo-datepicker kendo-dropdown kendo-grid kendo-ui kendo-ui-angular2 kendo-upload kepler.gl keras kestrel key key-bindings key-value keyboard keyboard-events keyboard-navigation keyboard-shortcuts keycloak keycloak-js keycloak-rest-api keycloak-services keycode keydown keyframe keyof keypress keyup keyword kibana-4 kill kill-process kineticjs knex.js knitr knockout.js koa koa-bodyparser kong konva konvajs kotlin kramdown kubernetes kubernetes-ingress label labels lagom lambda lan lang language-design language-lawyer language-server-protocol laravel laravel-4 laravel-5 laravel-5.3 laravel-5.8 laravel-8 laravel-9 laravel-blade laravel-breeze laravel-livewire laravel-passport laravel-sanctum laravel-snappy laravel-validation lastpass late-binding latex layer layout lazy-initialization lazy-loading leaderboard leaflet leaflet-geoman leaflet.draw less lets-encrypt letter-spacing lexicaljs libphonenumber libraries lifecycle ligature lightbox lightbox2 lightgallery lighthouse limit line line-breaks line-height line-through linear-gradients linechart linefeed linkedin-api linksys linq linq-to-sql lint lint-staged linter linux liquid liskov-substitution-principle list listbox listener listitem listjs listobject listpicker listview lit lit-element lit-html literals live live-streaming livereload liveserver load load-balancing load-order loader loading local local-storage localdate locale localhost localization localnotification location-href lodash logentries logging logic login login-page login-system logout logstash long-press loopback loopbackjs loops lottie lowercase lucid lumen luxon lxml lynx m3u m3u8 mac-address macos macos-big-sur macos-catalina macos-high-sierra macos-monterey macros magento magento2 magnific-popup mailchimp-api-v3.0 mailto makestyles mako manifest manifest.json many-to-many map mapbox mapbox-gl mapbox-gl-js mapped-types mapper mapping maps margin margins markdown markerclusterer markup marp marpit marquee mask masking masonry master-detail master-pages mat mat-autocomplete mat-card mat-datepicker mat-dialog mat-drawer mat-error mat-expansion-panel mat-form-field mat-icon mat-input mat-list mat-option mat-pagination mat-select mat-sidenav mat-slider mat-stepper mat-tab mat-table match material-components material-components-web material-design material-design-lite material-dialog material-icons material-table material-ui materialbutton materialize math math-functions mathematical-expressions mathjax mathml matter.js maven max maxlength mcu md-autocomplete md-select mdbootstrap mdc-components mddialog mean mean-stack meanjs measurement mechanize media media-queries mediastream megamenu memoization memoized-selectors memory memory-leaks memory-management mention menu menubar menuitem mercurius merge mergemap mern mesh message meta meta-tags metadata metamask metaplex meteor meteor-blaze methods metrics metro-bundler micro-frontend microservices microsoft-edge microsoft-graph-api microsoft-identity-platform microsoft-teams microsoft-web-deploy middleware midi migration mikro-orm milvus mime mime-message mime-types mindmap minesweeper minify minimist minio minmax miragejs mithril.js mix-blend-mode mixins mjml mkdocs mobile mobile-angular-ui mobile-application mobile-browser mobile-development mobile-safari mobile-website mobx mobx-react mobx-state-tree mocha-webpack mocha.js mocking mod-rewrite modal-dialog modal-sheet modal-window modalviewcontroller model model-binding model-view-controller model-viewer modifier modular-design module moment-timezone momentjs monaco-editor mongodb mongodb-query mongoid mongoose mongoose-middleware mongoose-schema monorepo monospace monthcalendar moodle mootools mosaic motorola mouse-cursor mouseevent mousehover mouseleave mousemove mouseover mousewheel moving-average mozilla mp3 mp4 mpd mpdf mpmediaquery mqtt ms-access ms-office ms-word msal msal-angular msal.js msbuild msgpack mudblazor mui5 muipickersutilsprovider multer multer-gridfs-storage multer-s3 multi-level multi-page-application multi-select multi-tenant multi-user multidimensional-array multiline multipage multipart multipartfile multipartform-data multiple-columns multiple-inheritance multiple-instances multiplication mutable mutation-observers mvvm mvw mxgraph mysql mysqli namecheap namespaces naming-conventions nan nanoid narrowing native native-base native-web-component nativescript nativescript-angular nativescript-plugin nativescript-telerik-ui nativescript-vue nav nav-pills navbar navigateurl navigation navigation-drawer navigationbar navigationcontroller navigator nebular nedb nest nest-commander nested nested-json nested-lists nested-loops nested-object nestjs nestjs-config nestjs-jwt nestjs-swagger netbeans netlify netsuite network-efficiency new-operator new-project new-window newline newsletter next next-auth next-images next-link next.js next.js13 next.js14 nextjs-dynamic-routing nextjs-image nexus nexus-js nexus-prisma nfc nft ng ng-animate ng-apexcharts ng-bootstrap ng-build ng-class ng-component-outlet ng-container ng-content ng-controller ng-deep ng-dialog ng-file-upload ng-filter ng-flow ng-grid ng-hide ng-image-compress ng-map ng-messages ng-mocks ng-modal ng-modules ng-multiselect-dropdown ng-options ng-otp-input ng-packagr ng-pattern ng-repeat ng-required ng-select ng-show ng-storage ng-style ng-submit ng-switch ng-tags-input ng-template ng-upgrade ng-view ng-zorro-antd ng2-bootstrap ng2-charts ng2-redux ng2-smart-table ng2-translate ngb-datepicker ngcordova ngfor nginfinitescroll nginx nginx-cache nginx-config nginx-location nginx-reverse-proxy ngmock ngmodel ngonchanges ngondestroy ngoninit ngresource ngrok ngroute ngrx ngrx-component-store ngrx-data ngrx-effects ngrx-entity ngrx-reducers ngrx-router-store ngrx-selectors ngrx-store ngrx-store-4.0 ngtable ngtemplateoutlet ngu-carousel ngx-admin ngx-bootstrap ngx-bootstrap-modal ngx-bootstrap-popover ngx-charts ngx-chips ngx-cookie-service ngx-datatable ngx-daterangepicker-material ngx-drag-drop ngx-echarts ngx-extended-pdf-viewer ngx-formly ngx-image-cropper ngx-international-phone-number ngx-leaflet ngx-mask ngx-monaco-editor ngx-mydatepicker ngx-pagination ngx-paypal ngx-quill ngx-restangular ngx-socket-io ngx-spinner ngx-swiper-wrapper ngx-toastr ngx-translate ngx-translate-multi-http-loader ngx-ui-loader ngxs nightwatch.js nl2br nlp noborder node-commander node-config node-fetch node-gyp node-modules node-red node-redis node-sass node-sqlite3 node-streams node-webkit node.js node.js-addon node.js-connect nodelist nodemailer nodemon nodes noise nokogiri nomachine-nx nominatim normalization normalize-css noscript nosql notepad++ notifications notify nouislider npm npm-build npm-install npm-link npm-live-server npm-package npm-publish npm-run npm-scripts npm-start npm-update npm-version npm-vulnerabilities npx nrwl nrwl-nx nsattributedstring nsstring nuget null null-check nullable number-formatting numbers nuxt.js nuxt3 nuxtjs3 nvd3.js nvda nvm nwjs nx-devkit nx-workspace nx.dev nyc oak oauth oauth-2.0 obfuscation object object-destructuring object-fit object-literal object-position object-property objective-c objloader observable observers ocelot odata odometer odoo odoo-13 odoo-15 oembed office-addins office-app office-js office-scripts office365 offline offline-caching offset ohif oidc-client okhttp okta on-screen-keyboard onbeforeunload onblur onchange onclick onclicklistener one-trust onedrive onerror onesignal onfocus onhover onload onmousedown onmouseover onsen-ui onsubmit oop opacity opayo open-telemetry openapi openapi-generator opencart opencart2.3 opencv opendatasoft openid openid-connect openlayers openlayers-5 openlayers-6 openstreetmap opentype-svg-font openvidu openweathermap opera operating-system operators opine optgroup optimization option option-type optional optional-chaining optional-parameters options oracle oracle-apex orchardcms orchardcore org-mode orientation-changes orm orphan out outdir outline outlook outlook-2010 outlook-2016 output overflow overlap overlapping overlay overloading overriding owasp owl-carousel owl-carousel-2 owl-date-time p-dropdown p-table p2p p5.js pack package package-info package-managers package.json pact padding page-break page-break-before page-layout page-load-time page-refresh pageload pageobjects pagespeed pagespeed-insights pagination paginator paging paint palantir-foundry palindrome pandas pandas-styles pandoc pane panel pannellum panning panzoom papaparse paragraph parallax parallel-processing parameter-passing parameters parcel parceljs parent parent-child parse-platform parseint parsel parsing partial partial-classes partial-views partials particles particles.js pass-by-reference pass-by-value passport-azure-ad passport-jwt passport-local passport.js password-protection passwords patch patch-package patchvalue path pattern-matching payment-gateway payment-method paypal pdf pdf-form pdf-generation pdf-viewer pdf.js pdfjs-dist pdfmake peer-dependencies peerjs pelco penetration-testing percentage performance perl permalinks permissions permutation perspective pg-promise phantom-types phantomjs phaser phaser-framework phaserjs phoenix-framework phone-call phonegap phonegap-build phonegap-plugins photo photography php phpmailer phppresentation phpstorm phpstorm-2017.1 physics-engine picasa pick picklist picture-element picturefill pie-chart pikaday pinchzoom ping pinia pinterest pipe pipeline pipes-filters pixel pixi.js pkce pkgdown placeholder plaintext play-billing-library playframework playframework-2.0 playwright playwright-test playwright-typescript plesk plot plotly plotly-dash plotly-express plotly-python plotly.js plsql plugins plyr.js pm2 png pnp-js pnpm pointer-events pointers pokeapi polling polyfills polyglot-markup polygon polymer polymorphism popover populate popup popupwindow port portfolio porting portrait position positional-operator positioning post postcss postcss-cli poster postgis postgresql postgresql-9.5 postman pouchdb power-automate power-automate-desktop powerbi powerbi-embedded powerpoint powershell powershell-core pre pre-commit-hook pre-rendering precompile predicate preflight preg-match preg-replace preload preloader preloading preprocessor prerender prestashop prestashop-1.7 prettier pretty-print prettytable preventdefault preview primefaces primeflex primeicons primeng primeng-calendar primeng-datatable primeng-dialog primeng-dropdowns primeng-menu primeng-table primeng-tree primeng-turbotable primereact primevue printing printing-web-page printthis prism.js prisma prisma-graphql prisma-orm prisma2 prismic.io privacy private private-constructor processing product production production-environment profiler progress progress-bar progressive-enhancement progressive-web-apps proj project projection promise prompt prop properties property-binding proportions protected proto protocol-buffers protocol-relative prototype prototype-chain prototypejs protractor provider proxy pseudo-class pseudo-element public publish publishing pug pull-to-refresh pulumi punycode puppeteer pure-css pure-function push push-notification pushstate pushy put putimagedata pwa pygments pyodide pyqt pyqt5 pyscript pyscripter pyside2 python python-2.7 python-3.x python-requests python-requests-html python-sphinx pythonanywhere q qlabel qr-code qt qtextedit qtstylesheets qtwebkit quarkus quarkus-rest-client quarto quasar quasar-framework query-builder query-optimization query-parameters query-string queryparam queryselector queue quill quote quotes r r-markdown rabbitmq race-condition rack rackspace radial-gradients radio radio-button radio-group radix-ui radzen railway ramda.js random range rapidapi rasa raspberry-pi rating razor razor-pages razorpay react-18 react-admin react-animated react-big-calendar react-bootstrap react-bootstrap-nav react-chartjs react-chartjs-2 react-class-based-component react-component react-context react-create-app react-css-modules react-custom-hooks react-data-table-component react-datepicker react-dnd react-dom react-dom-server react-dropdown-tree-select react-dropzone react-error-boundary react-fiber react-flow react-forms react-forwardref react-functional-component react-google-charts react-google-recaptcha react-hoc react-hook-form react-hooks react-hooks-testing-library react-i18next react-icons react-infinite-scroll-component react-jsx react-konva react-leaflet react-leaflet-v3 react-map-gl react-material react-mui react-native react-native-android react-native-drawer react-native-firebase react-native-flatlist react-native-gesture-handler react-native-navigation react-native-reanimated react-native-reanimated-v2 react-native-sqlite-storage react-native-stylesheet react-native-testing-library react-native-textinput react-navigation react-navigation-bottom-tab react-navigation-drawer react-navigation-stack react-navigation-v6 react-oauth react-otp-input react-pdf react-phone-input-2 react-phone-number-input react-player react-props react-proptypes react-query react-redux react-rendering react-router react-router-dom react-scripts react-select react-slick react-spring react-state react-state-management react-testing-library react-three-drei react-tooltip react-transition-group react-tsx react-typescript react-usecallback react-usememo reactive reactive-forms reactive-programming reactivex reactjs reactstrap readfile readme readonly real-time real-time-updates reason recaptcha recaptcha-v3 recharts recoiljs record recursion recursive-datastructures redaction redcap redirect redis redoc redocly reduce reducers redux redux-devtools redux-logger redux-observable redux-persist redux-reducers redux-saga redux-thunk redux-toolkit ref refactoring reference referrals referrer-policy reflect-metadata reflection reflow refresh refresh-token regex regex-lookarounds regexp-replace region rel relationship relative-path relative-url release reload remix-auth-socials remix-run remix.run remove-if removing-whitespace rename render renderer rendering renovate reorderlist repeat repeating-linear-gradient replace replaysubject reporting-services request request-headers requestanimationframe require required requiredfieldvalidator requirejs rerender rescript reselect reserved-words reset reset-password resharper resizable resize resolve resources response response-headers responsive responsive-design responsive-design-view responsive-images responsiveness rest rest-parameters restangular restapi restart restful-authentication restrict restructuredtext retina-display return return-type return-value reusability reveal.js reverse reverse-engineering reverse-proxy rgba rgl rich-text-editor richtext rider right-to-left ringcentral riot.js robotframework roboto role-based roles rollup rollup-plugin-postcss rollupjs roman-numerals roslyn rotatetransform rotation round-slider rounded-corners route-provider routeparams router router-outlet routerlink routerlinkactive routes routing row row-height rows rss rstudio rsuite rtcpeerconnection rtk-query rtmp rtos rtsp ruby ruby-characters ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-5 ruby-on-rails-7 rules run-configuration runtime runtime-configuration runtime-error rust rvest rx-angular rxfire rxjs rxjs-filter rxjs-fromevent rxjs-marbles rxjs-observables rxjs-pipeable-operators rxjs-subscriptions rxjs5 rxjs6 rxjs7 safari safe-navigation-operator sails.js salesforce salesforce-communities salesforce-marketing-cloud saml samsung-galaxy samsung-smart-tv sanctum sandbox sanitization sanitizer sap-commerce-cloud sap-fiori sapui5 sass sass-loader sass-maps sass-variables saucelabs save savefiledialog scale scaling scheduled-tasks scheduler schema scope scoping scrapy screen screen-capture screen-orientation screen-readers screen-scraping script script-src script-tag scripting scroll scroll-paging scroll-snap scrollbar scroller scrollmagic scrollspy scrolltop scrolltrigger scrollview scss-functions scss-lint scss-mixins sdk search search-engine search-form searchbar sections secure-coding security sed seek segment select select-options selected selectedindex selectinput selection selection-api selectionmodel selectize.js selector selectors-api selenium selenium-chromedriver selenium-ide selenium-iedriver selenium-webdriver selenium-webdriver-python self-destruction semantic-html semantic-markup semantic-ui semantic-ui-react semantics sencha-touch-2 send sendbeacon sendgrid sendmail sendmessage seo separation-of-concerns sequelize-cli sequelize-typescript sequelize.js sequential serialization serve server server-sent-events server-side-includes server-side-rendering serverless serverless-architecture serverless-framework serverless-framework-step-functions service service-worker servicenow servlets session session-cookies session-storage session-timeout set setattribute setinterval setstate setter settimeout settings sfu sgml sh sha256 shadcnui shader shadow shadow-dom shadow-root shaka shallow-copy shape shape-outside shapes share share-open-graph shared-directory shared-libraries shared-module sharepoint sharepoint-2013 sharepoint-online sharp sheetjs shell shiny shinybs shinyjqui shop shopify shopify-api shopizer shopping-cart shopware6 shortcut shoutcast show show-hide showmodaldialog shuffle siblings side-effects sidebar sidenav sigma.js sign sign-in-with-apple signalr signalr-hub signalr.client signals signature signaturepad sim-card simplemodal sinatra single-page-application single-sign-on single-spa single-spa-angular singleton singularitygs sinon sip sitedesign size sizing skeleton-css-boilerplate skeleton-ui skiasharp slice slick slick.js slickgrid slickgriduniversal slide slider slideshow sliding-tile-puzzle slim slim-4 slim-lang smart-table smartcontracts smil smooth-scrolling smtp smtpjs snackbar snap snapshot-testing snipcart soap social-authentication social-media socialsharing-plugin socket-timeout-exception socket.io socket.io-client sockets sockjs soft-hyphen solana solana-web3js solaris solid-js sonarlint sonarqube sorting soundcloud source-code-protection source-maps spa-template space spaces spacing spartacus-storefront speaker special-characters specifications spectator speech speech-synthesis spfx spfx-extension spinner splash-screen splidejs split splitter spotify spotlight spread spread-syntax spreadjs spring spring-batch spring-boot spring-boot-security spring-cloud spring-cloud-gateway spring-data spring-data-jpa spring-form spring-mvc spring-restcontroller spring-security spring-security-oauth2 spring-security-rest spring-security-saml2 spring-thymeleaf spring-webflux sprite spy spyon sql sql-like sql-server sqlalchemy sqlite squarespace squirrel.windows src srcset ssh2-sftp ssl ssl-certificate ssrs-2012 stack stack-navigator stack-trace stackblitz stacking-context standards startup state state-machine static static-files static-site-generation static-typing static-web-apps statistics status stenciljs step stepper sticky sticky-footer stomp stoppropagation stopwatch storage store storefront storybook str-replace strapi stream streamable.com streaming streaming-video streamlit strict strictnullchecks strikethrough string string-concatenation string-formatting string-interpolation string-literals stringify strip stripe-payments stripes stroke stroke-dasharray strokeshadow strong-typing strpos struct structured-clone struts-1 struts2 stryker style-dictionary styled-components styled-system stylelint styles stylesheet styling stylus stylus-pen subclassing subdirectory subject subject-observer sublime-text-plugin sublimetext sublimetext2 sublimetext3 submenu submit subpixel subscribe subscript subscription substring subtitle sudo sudoku suitescript sum summary-tag summernote supabase supabase-js superscript supertest survey susy-compass svelte svelte-3 svelte-component svelte-store svelte-transition sveltekit svg svg-animate svg-defs svg-filters svg-map svg-morphing svg.js sw-precache swagger swagger-ui sweetalert sweetalert2 swift swiftui swing swipe swipe.js swiper swiper.js swiperjs switch-statement switching switchmap swr symbols symfony symfony-flex symfony4 symfony5 syncfusion synchronization syntax syntax-error syntax-highlighting systemjs t4 tabindex tablecelleditor tablecellrenderer tableheader tablelayout tablet tabmenu tabs tabular tabulator tags tailwind-3 tailwind-css tailwind-elements tailwind-in-js tailwind-ui tampermonkey tanstack tanstackreact-query task tauri tcl tcp tcpdf teamcity teams-toolkit tedious tel telegram telegram-bot telerik telerik-mvc template-engine template-literals templatebinding templates tempus-dominus-datetimepicker tensorflow tensorflow.js tensorflowjs-converter terminal terminology ternary-operator testbed testcafe testing testing-library text text-align text-alignment text-cursor text-decorations text-editor text-extraction text-files text-indent text-size text-to-speech textarea textbox textcolor textfield textinput textnode textout textselection textual textview tfs themes theming thermal-printer thickness thingsboard this this-keyword three.js throttling throw thumbnails thymeleaf tic-tac-toe tiktok tilt time time-series time-tracking timeago timeout timepicker timer timestamp timezone timezone-offset tint tinymce tinymce-4 tinymce-5 tinymce-plugins tippyjs tiptap title tkinter toast toast-ui-image-editor toastr toggle togglebutton toggleswitch token tomcat tomcat9 tone.js toolbars tooltip top-level-await tornado tostring touch touch-event touchableopacity touchmove traffic trail trailing-whitespace transactions transform transition transitions translate translation transloco transparency transparent transpiler transpose travis-ci tree tree-shaking tree-traversal treemap treesitter treetableview treeview tri-state-logic triangle triggers trim trpc.io truetype truncate truncation try-catch ts-check ts-jest ts-loader ts-node ts-node-dev tsc tsconfig tsconfig-paths tsd tslint tsserver tsx tsyringe tumblr tumblr-html tumblr-themes tuples turborepo twa tween twig twilio twilio-api twilio-conversations twilio-video twitter twitter-bootstrap twitter-bootstrap-2 twitter-bootstrap-3 twitter-bootstrap-4 twitter-card two-way-binding txt type-alias type-assertion type-conversion type-declaration type-definition type-erasure type-hinting type-inference type-level-computation type-narrowing type-only-import-export type-parameter type-safety typeahead typeahead.js typechecking typedjs typeerror typeface.js typeform typegoose typegraphql typeguards typemoq typeof typeorm types typescript typescript-5 typescript-class typescript-compiler-api typescript-conditional-types typescript-declarations typescript-decorator typescript-eslint typescript-eslintparser typescript-generics typescript-mixins typescript-module-resolution typescript-namespace typescript-never typescript-types typescript-typings typescript-utility typescript1.5 typescript1.6 typescript1.8 typescript2.0 typescript2.2 typescript2.4 typescript2.9 typescript3.0 typescript4.0 typetraits typing typo3 typo3-10.x typography typoscript ubuntu ubuntu-16.04 ubuntu-20.04 udp uglifyjs ui-automation ui-calendar ui-grid ui-scroll ui-select ui-testing ui-toolkit ui.bootstrap uiactionsheet uialertcontroller uibinder uicomponents uikit uint uint8array uiscrollview uiswitch uiview uiwebview ultrawingrid umd uncaught-exception undefined underline underscore.js undertow unexpected-token unhandled-promise-rejection unicode unicode-string unified.js union union-types unique-values unit-testing units-of-measurement unity-game-engine universal unlink unsafe-inline unsubscribe unused-variables updates upgrade upload uploader uppercase uri uri.js url url-parameters url-parsing url-redirection url-rewriting url-routing url-scheme urllib2 urlsearchparams urql usability use-case use-context use-effect use-reducer use-ref use-state usefaketimers user-agent user-controls user-event user-experience user-input user-interface user-permissions user-roles userchrome.css userscripts utc utf utf-8 uuid uwp uwsgi v-autocomplete v-data-table v-for v-slider v-slot vaadin vaadin-flow vaadin14 vagrant validation validationerror valuechangelistener vanilla-extract var variable-assignment variable-fonts variable-length variables variadic-functions variadic-tuple-types variance vb.net vba vbscript vector-graphics vega vega-embed vega-lite velo vendor-prefix vercel version version-control versioning vertical-alignment vertical-scrolling vetur video video-codecs video-processing video-streaming video.js videogular videogular2 view view-transitions-api viewchild viewport viewport-units vim vimeo vimium virtual-dom virtualscroll virus vis.js vis.js-network visibility visible visual-studio visual-studio-2010 visual-studio-2012 visual-studio-2013 visual-studio-2015 visual-studio-2017 visual-studio-2019 visual-studio-2022 visual-studio-code visual-studio-cordova visual-studio-monaco visual-testing visual-web-developer vite vitepress vitest vlc vmware vmware-clarity voiceover void vpc vs-web-site-project vscode-debugger vscode-extensions vscode-jsconfig vscode-settings vsto vue-class-components vue-cli vue-cli-3 vue-component vue-composition-api vue-data vue-i18n vue-mixin vue-property-decorator vue-props vue-router vue-router4 vue-script-setup vue-test-utils vue-transitions vue-typescript vue.js vuejs-transition vuejs2 vuejs3 vuejs3-composition-api vuelidate vuepress vuetify.js vuetifyjs3 vueuse vuex vuex4 w3.css w3c w3c-validation wai-aria wait walkthrough wallet-connect war warnings was watch watch-face-api wav waveform wcag wcag2.0 wcag2.1 wcf wear-os weasyprint weather-api web web-accessibility web-applications web-audio-api web-chat web-component web-config web-crawler web-deployment web-deployment-project web-development-server web-frameworks web-frontend web-hosting web-inspector web-notifications web-parts web-performance web-scraping web-scraping-language web-services web-site-project web-sql web-standards web-storage web-technologies web-vitals web-worker web.xml web3 web3js webapi webapi2 webassembly webauthn webbrowser-control webcam webclient webcodecs webdatarocks webdeploy-3.5 webdriver webflow webfonts webforms webgl webgpu webhooks webintents webix webkit webkit-animation weblogic webmethod webp webpack webpack-2 webpack-4 webpack-5 webpack-bundle-analyzer webpack-config webpack-dev-server webpack-file-loader webpack-hmr webpack-html-loader webpack-module-federation webpack-style-loader webpage-screenshot webrtc websecurity webserver websocket webspeech-api webstorm webusb webview webview2 webvtt weebly week-number wget wgsl whatsapp while-loop white-labelling whitelist whitespace widget width wildwebdeveloper window window-resize window.location windows windows-10 windows-7 windows-8.1 windows-authentication windows-server-2008 windows-subsystem-for-linux winforms winston winui-3 wireless wix wkhtmltopdf wkwebview wkwebviewconfiguration woff woff2 wonderpush woocommerce woocommerce-theming woothemes word-break word-cloud word-count word-spacing word-wrap wordpress wordpress-gutenberg wordpress-rest-api wordpress-theming worker worker-loader workflow workspace wow.js wpbakery wpf wrapper ws wsh wsl-2 wso2 wso2-identity-server wso2-micro-integrator wtforms wysiwyg x-editable x-xsrf-token xaml xampp xaringan xcode xcode12 xcodebuild xhtml xhtml-1.0-strict xhtml-1.1 xhtml2pdf xliff xlsx xml xml-namespaces xml-parsing xml.etree xmlhttprequest xng-breadcrumb xor xpath xslt xss xstate xtermjs yahoo-mail yaml yarn-v2 yarn-workspaces yarnpkg yarnpkg-v2 yaxis yeoman yeoman-generator yeoman-generator-angular yii2 yii2-advanced-app youtube youtube-api youtube-data-api youtube-iframe-api ytdl yui yup z-index zend-form zend-framework zend-framework2 zendesk zigzag zingchart zip zipalign zipkin zod zoho zone zone.js zonejs zooming zsh zurb-foundation zustand

Copyright © angularfix