A JSDOM alternative with support for server side rendering of web components

Overview

Happy DOM Logo

About

A JSDOM alternative with support for server side rendering of web components.

Happy DOM aim to support the most common functionality of a web browser.

Read more about how to use Happy DOM

DOM Features

  • Custom Elements (Web Components)

  • Shadow Root (Shadow DOM)

  • Mutation Observer

  • Tree Walker

  • Fetch

And much more..

Works With

Packages

This repository is a Monorepo. Each package lives under packages/ .

Published on npm happy-dom

This package contains the core functionality of Happy DOM.


Published on npm jest-environment

This package makes it possible to use Happy DOM with Jest.


Published on npm server-rendering

This package makes it easier to setup servering side rendering of web components by handling the setup of the Node VM Context for you.


Published on npm global-registrator

A utility that registers Happy DOM globally, which makes it possible to use Happy DOM for testing in a Node environment.

Performance

Operation JSDOM Happy DOM
Import / Require 333 ms 45 ms
Parse HTML 256 ms 26 ms
Serialize HTML 65 ms 8 ms
Render custom element 214 ms 19 ms
querySelectorAll('tagname') 4.9 ms 0.7 ms
querySelectorAll('.class') 6.4 ms 3.7 ms
querySelectorAll('[attribute]') 4.0 ms 1.7 ms
querySelectorAll('[class~="name"]') 5.5 ms 2.9 ms
querySelectorAll(':nth-child(2n+1)') 10.4 ms 3.8 ms

See how the test was done here

Whats New in v2.0.0?

  • The methods window.whenAsyncComplete() and window.cancelAsync() has been moved to window.happyDOM.whenAsyncComplete() and window.happyDOM.cancelAsync()

Whats New in v1.0.0?

  • Lerna is used for managing all packages within a single repository

  • Support for React, Angular, Vue

  • Full support for querySelector() and querySelectorAll()

  • Server side rendering has been split out to its own package

  • All functionality is now covered by unit tests

  • Automated release process by publishing to NPM automatically when a pull request is merged

  • Release notes are generated automatically by using Github Releases

  • A lot of minor bug fixes

Contributing

Read more about how to develop and contribute

Comments
  • #463@minor: Added partial support for XMLHttpRequest.

    #463@minor: Added partial support for XMLHttpRequest.

    Tasks

    • [x] #401

    • [x] #452

    • [x] #508

    • [x] #514

    • [x] #521

    • [x] #522

    • [x] #526

    • [x] #463

    • URL & URLSearchParams we try to use node:url module solve problems about URL and URLSearchParams now.

    • Document.URL & Document.documentURI I have implemented it in https://github.com/capricorn86/happy-dom/pull/520/commits/a71819f7bd813a3e0bc528f9fa8995a0896f52d7

    • XMLHttpRequest finished.

    References: https://github.com/souldreamer/xhr2-cookies https://xhr.spec.whatwg.org/#xmlhttprequesteventtarget https://developer.mozilla.org/en-US/docs/Web/API/Document/URL https://dom.spec.whatwg.org/#dom-document-url https://github.com/jsdom/jsdom

    opened by Mas0nShi 20
  • DOMParser is not defined

    DOMParser is not defined

    I am testing de-serializing an XML string into an object using jest and happy-dom

    When I run the test I get:

    ReferenceError: DOMParser is not defined

    Code is below: switch(contentType) { case 'application/json': return JSON.parse(content); case 'application/xml': return (new DOMParser()).parseFromString(content, "text/xml"); | ^ default: return content;

    Thanks :-)

    opened by jgonte 14
  • URL constructor is missing 'base' option

    URL constructor is missing 'base' option

    The URL constructor at https://github.com/capricorn86/happy-dom/blob/57a8d33d4b1ba3bdd4df0f7f8bc02e0d06bd8e9e/packages/happy-dom/src/location/URL.ts#L23 does not support the second form of the URL constructor which takes a base url:

    new URL(url)
    new URL(url, base)
    

    Quick test:

    # expected
    > new URL('', 'https://example.com').pathname
    '/'
    # actual
    > new URL('', 'https://example.com').pathname
    ''
    
    opened by silverwind 12
  • Element.matches fails when using non-matching descendant selector on element attached to document

    Element.matches fails when using non-matching descendant selector on element attached to document

    const element = document.createElement('div');
    document.appendChild(element);
    expect(element.matches('.nonexistent-class div')).toBe(false);
    
    TypeError: Cannot read properties of undefined (reading 'split')
    
      296 |     ): { priorityWeight: number; matches: boolean } {
      297 |             const regexp = new RegExp(CLASS_REGEXP, 'g');
    > 298 |             const classList = element.className.split(' ');
    	  |                                                 ^
      299 |             const classSelector = selector.split(':')[0];
      300 |             let priorityWeight = 0;
      301 |             let match: RegExpMatchArray;
    
      at SelectorItem.matchesClass (src/query-selector/SelectorItem.ts:298:39)
      at SelectorItem.match (src/query-selector/SelectorItem.ts:91:24)
      at Function.matchesSelector (src/query-selector/QuerySelector.ts:107:27)
      at Function.matchesSelector (src/query-selector/QuerySelector.ts:113:15)
      at Function.matchesSelector (src/query-selector/QuerySelector.ts:113:15)
      at Function.matchesSelector (src/query-selector/QuerySelector.ts:113:15)
      at Function.match (src/query-selector/QuerySelector.ts:66:24)
      at HTMLElement.matches (src/nodes/element/Element.ts:734:24)
    
    bug 
    opened by IGx89 11
  • #475@minor: Adds support for HTMLMediaElement.

    #475@minor: Adds support for HTMLMediaElement.

    Resolves https://github.com/capricorn86/happy-dom/issues/484 Resolves https://github.com/capricorn86/happy-dom/issues/475

    It's a very basic implementation mostly covering the API (at least what is common between audio and video and widely supported in browsers) timeRanges implementation coming from jsdom as the comment mentioned. I try to implement some basic logic but mostly is missing, I hope this can be good enough as a first step.

    References: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement https://html.spec.whatwg.org/#htmlmediaelement https://github.com/jsdom/jsdom

    p.s.: should I need to add HTMLAudioElement and HTMLVideoELement to window.ts and index.ts or the changes is the packages/happy-dom/src/config/ElementTag.ts in enough for use?

    opened by rudywaltz 11
  • Cannot add function to Array prototype

    Cannot add function to Array prototype

    Hi!

    I decided to try happy-dom instead of jsdom for my Jest tests due to the advertised speedup. My code adds a function to Array.prototype:

    Array.prototype.groupBy = () => ...
    

    With jsdom, this works. With happy-dom, it doesn't. If I put a breakpoint right after the function has been added, I can see that the function is present ([].groupBy is a function) with jsdom but is undefined with happy-dom.

    Do I have to configure happy-dom to allow adding to the prototype of native objects?

    bug high priority 
    opened by provegard 9
  • Cannot read properties of undefined (reading 'getRootNode')

    Cannot read properties of undefined (reading 'getRootNode')

    Hi there đŸ‘‹đŸ» ,

    I hope it is the right place to ask, and I apologize if not. I'm currently trying to bump version of happy-dom from 2.51.0 to a greater one using vitest & vue 3 but I'm facing the following error:

    image

    happy-dom version: 3.1.0 (I've tried multiple version between this one and 2.51.0)
    vitest version: 0.10.0

    It seems to be related to usage of @headlessui/vue (version 1.5.0) but I haven't found yet the root cause.

    Thanks in advance for your help, wish you a nice day ☀

    bug high priority 
    opened by smarlhens 8
  • Elment.attributes does not implement the NamedNodeMap interface

    Elment.attributes does not implement the NamedNodeMap interface

    I was trying to replace JSDOM with Happy DOM and the app was failing to run something akin to:

    const element = document.createElement('div');
    const someAttribute = document.createAttribute('someattribute');
    element.attributes.setNamedItem(someAttribute);
    

    I see the current implementation is:

    readonly attributes: { [k: string]: Attr | number };
    

    Is there any chance there will be a switch to NamedNodeMapin the future?

    enhancement high priority 
    opened by sondr 8
  • Support for insertAdjecentText

    Support for insertAdjecentText

    Hi, looking to replace jsdom so I'm looking to add either just the insertAdjecentText method or the entire insert-adjecent suite of methods, depending on projects philosophy.

    Looking at the code structure I wasn't quite sure how to split the methods. Guidance would be appreciated so I can put together a PR.

    Thanks.

    opened by kr8n3r 8
  • jsdom -> happy-dom migration with vitest is not simple

    jsdom -> happy-dom migration with vitest is not simple

    Kind of a question for help, I'm trying to use happy-dom instead of jsdom using vitest, it should be as simple as changing the vitest environment setting. However, when I switch over, it comes with many issues. Such line as,

        await $radios[0].trigger('click')
        expect(wrapper.vm.modelValue).toEqual('one')
    

    Which worked fine before, doesn't seem to do anything.

    I also get weird fails saying value.trim is not a function on vue-test-utils...

    const wrapper = mount(FormSelectOptionGroup, {` 
    

    Component mounting function.

    Also, on some other mounting functions, some will fill with TypeError: Cannot set properties of undefined (setting 'hasOwnProperty'), while others in the same file seemingly have no issues.

    Any help would be appreciated. Here's the repo, if anyone wants to take a deeper look and help me figure out what I'm doing wrong. https://github.com/cdmoro/bootstrap-vue-3/tree/main/packages/bootstrap-vue-3

    bug high priority 
    opened by VividLemon 7
  • ci stuck

    ci stuck

    I updated from ^2.55.0 to latest and this causes my github pipeline to get stuck after the tests are done. Oddly enough it works on windows. only linux and macos get stuck.

    Am I overseeing something in the upgrade notes which can cause this?

    I'm using vitest for testing.

    link to repo: https://github.com/ueberbit/lib

    image

    bug high priority 
    opened by woldtwerk 7
  • Bump json5 from 1.0.1 to 1.0.2

    Bump json5 from 1.0.1 to 1.0.2

    Bumps json5 from 1.0.1 to 1.0.2.

    Release notes

    Sourced from json5's releases.

    v1.0.2

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295). This has been backported to v1. (#298)
    Changelog

    Sourced from json5's changelog.

    Unreleased [code, diff]

    v2.2.3 [code, diff]

    v2.2.2 [code, diff]

    • Fix: Properties with the name __proto__ are added to objects and arrays. (#199) This also fixes a prototype pollution vulnerability reported by Jonathan Gregson! (#295).

    v2.2.1 [code, diff]

    • Fix: Removed dependence on minimist to patch CVE-2021-44906. (#266)

    v2.2.0 [code, diff]

    • New: Accurate and documented TypeScript declarations are now included. There is no need to install @types/json5. (#236, #244)

    v2.1.3 [code, diff]

    • Fix: An out of memory bug when parsing numbers has been fixed. (#228, #229)

    v2.1.2 [code, diff]

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Unexpected token 'export' loading a Vue + Vite app

    Unexpected token 'export' loading a Vue + Vite app

    I've got the "Unexpected token 'export'" error when loading a vue + vite application. I'm assuming is not parsing the main javascript correctly, is this something that should be supported?

    enhancement 
    opened by malizarraga 4
  • regression: assign of window.location.href

    regression: assign of window.location.href

    Describe the bug A clear and concise description of what the bug is.

    Starting with version 7.8.0, setting the href property like this:

    window.location.href = '/foo'
    

    Will throw an exception: ERR_INVALID_URL.

    To Reproduce Steps to reproduce the behavior:

    1. Create a test with happy-dom
    2. In the test, insert window.location.href = '/foo'
    3. See error ERR_INVALID_URL

    Expected behavior I can set the href property using a string which doest not represent a full url, in the same exact way in which both chrome and firefox works.

    Screenshots image

    Device:

    • OS: OS X
    • Browser: Vitest
    • Version: v0.25.6

    Additional context This happens using happy-dom during tests.

    bug high priority 
    opened by ilteoood 1
Releases(v8.1.3)
  • v8.1.3(Jan 5, 2023)

    :construction_worker_man: Patch fixes

    • Fixed infinite loop bug when there is no number before "n" in an ":nth-child" query selector. (#686)
    Source code(tar.gz)
    Source code(zip)
  • v8.1.2(Jan 4, 2023)

  • v8.1.1(Dec 20, 2022)

  • v8.1.0(Dec 7, 2022)

  • v8.0.0(Dec 7, 2022)

    :bomb: Breaking Changes

    • In v7.0.0 of Happy DOM, the default values for window.innerWidth and window.innerHeight was changed to 0. This fix will revert this change and set the default resolution to 1024x768 again. This is a major change as it potentially can break logic. Sorry for any inconvenience. (#673)
    Source code(tar.gz)
    Source code(zip)
  • v7.8.1(Dec 7, 2022)

  • v7.8.0(Dec 7, 2022)

    :art: Features

    • Adds support for XMLHttpRequest. (#520)
    • Adds support for Document.documentURI and Document.URL. (#526)
    • Adds the headers "referer", "set-cookie", "user-agent" to window.fetch() requests. (#520)
    • Adds support for sending in URL or Request objects to window.fetch(). (#582)
    • Replaces sync-request with XMLHttpRequest as it supports synchronous requests using a custom solution (#650)

    :construction_worker_man: Patch fixes

    • Replaces a custom solution for window.URL with the native module url. (#521)
    Source code(tar.gz)
    Source code(zip)
  • v7.7.2(Dec 3, 2022)

  • v7.7.1(Dec 3, 2022)

    :construction_worker_man: Patch fixes

    • Adds support for escaped characters to class names in CSS query selectors (e.g. \\:, \\#, \\&) (#661)
    Source code(tar.gz)
    Source code(zip)
  • v7.7.0(Nov 11, 2022)

  • v7.6.7(Nov 8, 2022)

  • v7.6.6(Oct 25, 2022)

  • v7.6.5(Oct 25, 2022)

    :construction_worker_man: Patch fixes

    • Fixes problem with HTMLSelectElement.selectedIndex not reflecting the select attribute set on options. (#637)
    Source code(tar.gz)
    Source code(zip)
  • v7.6.4(Oct 25, 2022)

    :construction_worker_man: Patch fixes

    • Makes it possible to set a CSS string to HTMLElement.style (e.g. HTMLElement.style = 'color: red'). (#628)
    Source code(tar.gz)
    Source code(zip)
  • v7.6.3(Oct 24, 2022)

    :construction_worker_man: Patch fixes

    • Multiples fixes related to how HTMLSelectElement.selectedIndex and HTMLOptionElement.selected are handled. (#635)
    • Setting HTMLSelectElement.selectedIndex to an invalid value will no longer cause an exception to be thrown. (#635)
    Source code(tar.gz)
    Source code(zip)
  • v7.6.2(Oct 24, 2022)

    :construction_worker_man: Patch fixes

    • Adds support for wildcard searches to Element.getElementsByTagName() and Document.getElementsByTagName() (improves jQuery support). (#633)
    Source code(tar.gz)
    Source code(zip)
  • v7.6.1(Oct 24, 2022)

  • v7.6.0(Oct 18, 2022)

  • v7.5.14(Oct 18, 2022)

    :construction_worker_man: Patch fixes

    • Fixes problem with Element.matches() failing when using non-matching descendant selector on element detached from document. (#622)
    Source code(tar.gz)
    Source code(zip)
  • v7.5.13(Oct 17, 2022)

    :construction_worker_man: Patch fixes

    • Fixes problem related to Element.matches() failing when using a non-matching descendant selector on an element attached to document. (#622)
    Source code(tar.gz)
    Source code(zip)
  • v7.5.12(Oct 14, 2022)

    :construction_worker_man: Patch fixes

    • HTMLOptionElement.value should not sanitize the value by removing new lines and trimming it. This caused a crash when the value was set to another type than "string". (#620)
    Source code(tar.gz)
    Source code(zip)
  • v7.5.11(Oct 14, 2022)

    :construction_worker_man: Patch fixes

    • HTMLSelectElement.options.add() and HTMLSelectElement.options.remove() has to update the actual DOM
    • HTMLSelectElement.appendChild(), HTMLSelectElement.beforeChild() and HTMLSelectElement.removeChild() has to update the option elements in HTMLSelectElement.options
    • HTMLSelectElement.options.selectedIndex was not updated correctly after removing a selected option
    • Adds support for HTMLSelectElement.length
    • HTMLSelectElement now supports to do get options by index (e.g. select[1])
    Source code(tar.gz)
    Source code(zip)
  • v7.5.10(Oct 12, 2022)

    :construction_worker_man: Patch fixes

    • Adds check for if the active element is of type Element before handling custom elements by calling Element.getRootNode(). (#467)
    Source code(tar.gz)
    Source code(zip)
  • v7.5.9(Oct 12, 2022)

    :construction_worker_man: Patch fixes

    • Fixes problem with Document.activeElement still pointing to an Element that has been disconnected from the DOM. (#456)
    Source code(tar.gz)
    Source code(zip)
  • v7.5.8(Oct 12, 2022)

  • v7.5.7(Oct 11, 2022)

    :construction_worker_man: Patch fixes

    • Fixes issue related to sending in other types of values than string to CSSStyleDeclaration properties, causing the property parser to throw an error. (#612)
    Source code(tar.gz)
    Source code(zip)
  • v7.5.6(Oct 11, 2022)

    :construction_worker_man: Patch fixes

    • Does not set Event.target and Event.currrentTarget directly to solve a problem with Vitest typechecking the internals of Happy DOM. (#544)
    Source code(tar.gz)
    Source code(zip)
  • v7.5.2(Oct 10, 2022)

    :construction_worker_man: Patch fixes

    • Fixes problem in the "global-registrator" package where unregister only deletes/pops half the registered keys. (#603)
    Source code(tar.gz)
    Source code(zip)
  • v7.5.1(Oct 10, 2022)

    :construction_worker_man: Patch fixes

    • Add toStringTag in Element class to handle Object.prototype.toString.call on implemented element classes. (#540)
    Source code(tar.gz)
    Source code(zip)
  • v7.5.0(Oct 10, 2022)

    :art: Features

    • Improves performance of window.getComputedStyle() by adding a cache that gets updated whenever something happens to the DOM tree (appendChild, removeChild etc.). (#599)
    • Adds support for CSS selector priority to window.getComputedStyle(). (#599)
    • Adds support for selectors with parent elements to Element.matches(). (#599)
    Source code(tar.gz)
    Source code(zip)
Owner
David Ortner
David Ortner
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till mÀnniskor pÄ flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
Server-side rendering blog runs on Cloudflare workers

Serverside rendered blog I have tried something completely against to current web trends. What are these? I am using the React as backend framework wi

null 3 Jun 24, 2022
A server side rendering framework for Deno CLI and Deploy. 🩟 🩕

nat A server side rendering framework for Deno CLI and Deploy. Incorporating acorn, nano-jsx, and twind, it provides the tooling to provide a server c

oak 12 Nov 17, 2022
Example of a Cloudflare Pages server side rendering (SSR) project powered by Hono.

Hono SSR on Cloudflare Pages Example of a Cloudflare Pages server side rendered (SSR) project powered by Hono. This project demonstrates: Accessing en

Justin Noel 9 Nov 19, 2022
Fast and minimal JS server-side writer and client-side manager.

unihead Fast and minimal JS <head> server-side writer and client-side manager. Nearly every SSR framework out there relies on server-side components t

Jonas Galvez 24 Sep 4, 2022
Easy server-side and client-side validation for FormData, URLSearchParams and JSON data in your Fresh app 🍋

Fresh Validation ??     Easily validate FormData, URLSearchParams and JSON data in your Fresh app server-side or client-side! Validation Fresh Validat

Steven Yung 20 Dec 23, 2022
A modular front-end framework - inspired by the server-side and Web Components.

The NX framework Home page, Docs NX is a modular front-end framework - built with ES6 and Web Components. The building blocks of NX are the core, the

NX framework 464 Dec 5, 2022
Query for CSS brower support data, combined from caniuse and MDN, including version support started and global support percentages.

css-browser-support Query for CSS browser support data, combined from caniuse and MDN, including version support started and global support percentage

Stephanie Eckles 65 Nov 2, 2022
Make drag-and-drop easier using DropPoint. Drag content without having to open side-by-side windows

Make drag-and-drop easier using DropPoint! DropPoint helps you drag content without having to open side-by-side windows Works on Windows, Linux and Ma

Sudev Suresh Sreedevi 391 Dec 29, 2022
This is an application that entered the market with a mobile application in real life. We wrote the backend side with node.js and the mobile side with flutter.

HAUSE TAXI API Get Started Must be installed on your computer Git Node Firebase Database Config You should read this easy documentation Firebase-Fires

Muhammet Çokyaman 4 Nov 4, 2021
This plugin allows side-by-side notetaking with videos. Annotate your notes with timestamps to directly control the video and remember where each note comes from.

Obsidian Timestamp Notes Use Case Hello Obsidian users! Like all of you, I love using Obsidian for taking notes. My usual workflow is a video in my br

null 74 Jan 2, 2023
This Plugin is For Logseq. If you're using wide monitors, you can place journals, linked references, and journal queries side by side.

Logseq Column-Layout Plugin Journals, linked references, and journal queries can be placed side by side if the minimum screen width is "1850px" or mor

YU 14 Dec 14, 2022
Svelte debugging tool for re-rendering components

resvelte README This is the README for your extension "resvelte". After writing up a brief description, we recommend including the following sections.

OSLabs Beta 44 Oct 4, 2022
Monolithic repo for api server, image server, web server

Onsecondary Market Deployed at https://market.onsecondary.com Monolithic repo for api server, image server, web server TODO -use a script to cull expi

Admazzola 2 Jan 11, 2022
A POC of a Discord.js bot that sends 3D rendering instructions to a Go server through gRPC which responds with the image bytes which are then sent back on Discord.

A POC of a Discord.js bot that sends 3D rendering instructions to a Go server through gRPC which responds with the image bytes which are then sent back on Discord.

Henrique CorrĂȘa 5 Jan 8, 2022
An informal website of the alternative of KdB, an curriculum planning support system used in University of Tsukuba

alternative-tsukuba-kdb An informal website of the alternative of KdB, a curriculum planning support system used in University of Tsukuba. This reposi

いăȘă«ă‚ă†ă©ă‚“ 27 Nov 25, 2022
generate a map server side and save/return it as png image

NFT map generator Request a new map to be generated with latitude and longitude params, for example http://localhost:3000/maps?lat=45.3579&lng=9.4427

Mattia Asti 3 Jul 12, 2022