@radiofrance/svelte-leaflet 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,91 @@
1
+ # @radiofrance/svelte-leaflet
2
+
3
+ A library that wraps leaflet classes in domless/renderless svelte components.
4
+
5
+ ## Install
6
+
7
+ `npm i -D @radiofrance/svelte-leaflet`
8
+
9
+ ## Components
10
+
11
+ ### Map
12
+
13
+ Renders a map with the given center and zoom level.
14
+
15
+ #### Attributes
16
+
17
+ | Attribute | Type | Default | Notes |
18
+ | ------------- | ----------------------------------------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------------- |
19
+ | `center` | [LatLng](https://leafletjs.com/reference.html#latlng) | _required_ | initial center of the map. |
20
+ | `zoom` | number | _required_ | initial zoom level |
21
+ | `tilesUrl` | string | `'https://tile.openstreetmap.org/{z}/{x}/{y}.png'` | more free tile services can be found at https://alexurquhart.github.io/free-tiles/ |
22
+ | `attribution` | string | `'©OpenStreetMap'` _(link to openstreetmap)_ | |
23
+
24
+ #### Events
25
+
26
+ All events are forwarded from the Map class, see the leaflet documentation for more information.
27
+
28
+ - https://leafletjs.com/reference.html#map-event
29
+
30
+ Example:
31
+
32
+ ```svelte
33
+ <Map {center} {zoom} on:click={(e) => console.log(e.detail.latlng)} />
34
+ ```
35
+
36
+ ### Marker
37
+
38
+ Add a marker to the map.
39
+
40
+ - Can be used as a child of `<Map>` or `<MarkerClusterGroup>`
41
+ - A `<Popup>` component can be passed as the Marker child to display a popup when the marker is clicked.
42
+ - A component with `slot="icon"` attribute can be passed as the Marker child to display a custom icon.
43
+
44
+ #### Attributes
45
+
46
+ | Name | Type | Default | Notes |
47
+ | -------- | ----------------------------------------------------- | ---------- | --------------------------------------------- |
48
+ | `latlng` | [LatLng](https://leafletjs.com/reference.html#latlng) | _required_ | position of the marker |
49
+ | `size` | number | `25` | icon size (only used with a custom icon) |
50
+ | `id` | string | `''` | an identifier to link the maker with you data |
51
+
52
+ #### Events
53
+
54
+ All events are forwarded from the Marker class, see the leaflet documentation for more information.
55
+
56
+ - https://leafletjs.com/reference.html#marker-event
57
+
58
+ ### Popup
59
+
60
+ `<Popup>` children will be displayed when the marker is clicked.
61
+
62
+ - Use as a `<Marker>` child.
63
+
64
+ #### Attributes
65
+
66
+ | Name | Type | Default | Notes |
67
+ | --------- | ----------------------------------------------------------------- | ------- | ------------------------------------ |
68
+ | `options` | [PopupOptions](https://leafletjs.com/reference.html#popup-option) | `{}` | options to pass to the leaflet popup |
69
+
70
+ ### MarkerClusterGroup
71
+
72
+ Enables clustering of child markers
73
+
74
+ - Use as a `<Map>` child
75
+
76
+ #### Attributes
77
+
78
+ | Name | Type | Default | Notes |
79
+ | --------- | -------------------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------- |
80
+ | `options` | [MarkerClusterGroupOptions](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/leaflet.markercluster/index.d.ts#L36) | `{}` | [MarkerClusterGroup options](https://github.com/leaflet/Leaflet.markercluster?tab=readme-ov-file#defaults) |
81
+
82
+ ### Polyline
83
+
84
+ - Allows to draw lines on the map
85
+
86
+ #### Attributes
87
+
88
+ | Name | Type | Default | Notes |
89
+ | --------- | ----------------------------------------------------------------------- | ---------- | --------------------------------------- |
90
+ | `latlngs` | [LatLng[]](https://leafletjs.com/reference.html#latlng) | _required_ | array of points to draw the line |
91
+ | `options` | [PolylineOptions](https://leafletjs.com/reference.html#polyline-option) | `{}` | options to pass to the leaflet polyline |
@@ -0,0 +1,50 @@
1
+ <script>import "leaflet/dist/leaflet.css";
2
+ import "leaflet.markercluster/dist/MarkerCluster.css";
3
+ import "leaflet.markercluster/dist/MarkerCluster.Default.css";
4
+ import { createEventDispatcher, setContext } from "svelte";
5
+ let L;
6
+ export let center;
7
+ export let zoom;
8
+ export let tilesUrl = "https://tile.openstreetmap.org/{z}/{x}/{y}.png";
9
+ export let attribution = `&copy;<a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a>`;
10
+ const dispatch = createEventDispatcher();
11
+ let thisMap;
12
+ export const getMarkers = () => {
13
+ const markers = [];
14
+ thisMap?.eachLayer((layer) => {
15
+ if (layer instanceof L.Marker) {
16
+ markers.push(layer);
17
+ }
18
+ });
19
+ return markers;
20
+ };
21
+ export const map = () => thisMap;
22
+ setContext("map", () => thisMap);
23
+ let container;
24
+ $:
25
+ thisMap?.setView(center, zoom);
26
+ function resizeMap() {
27
+ thisMap?.invalidateSize();
28
+ }
29
+ function onLoad() {
30
+ L = window.L;
31
+ thisMap = L.map(container).on("baselayerchange", (e) => dispatch("baselayerchange", e)).on("overlayadd", (e) => dispatch("overlayadd", e)).on("overlayremove", (e) => dispatch("overlayremove", e)).on("layeradd", (e) => dispatch("layeradd", e)).on("layerremove", (e) => dispatch("layerremove", e)).on("zoomlevelschange", (e) => dispatch("zoomlevelschange", e)).on("resize", (e) => dispatch("resize", e)).on("unload", (e) => dispatch("unload", e)).on("load", (e) => dispatch("load", e)).on("move", (e) => dispatch("move", e)).on("moveend", (e) => dispatch("moveend", e)).on("movestart", (e) => dispatch("movestart", e)).on("viewreset", (e) => dispatch("viewreset", e)).on("zoom", (e) => dispatch("zoom", e)).on("zoomend", (e) => dispatch("zoomend", e)).on("zoomstart", (e) => dispatch("zoomstart", e)).on("autopanstart", (e) => dispatch("autopanstart", e)).on("popupclose", (e) => dispatch("popupclose", e)).on("popupopen", (e) => dispatch("popupopen", e)).on("tooltipclose", (e) => dispatch("tooltipclose", e)).on("tooltipopen", (e) => dispatch("tooltipopen", e)).on("locationerror", (e) => dispatch("locationerror", e)).on("locationfound", (e) => dispatch("locationfound", e)).on("click", (e) => dispatch("click", e)).on("contextmenu", (e) => dispatch("contextmenu", e)).on("dblclick", (e) => dispatch("dblclick", e)).on("keydown", (e) => dispatch("keydown", e)).on("keypress", (e) => dispatch("keypress", e)).on("keyup", (e) => dispatch("keyup", e)).on("mousedown", (e) => dispatch("mousedown", e)).on("mousemove", (e) => dispatch("mousemove", e)).on("mouseout", (e) => dispatch("mouseout", e)).on("mouseover", (e) => dispatch("mouseover", e)).on("mouseup", (e) => dispatch("mouseup", e)).on("preclick", (e) => dispatch("preclick", e)).on("zoomanim", (e) => dispatch("zoomanim", e)).setView(center, zoom).setMinZoom(5).setMaxZoom(20);
32
+ L.tileLayer(tilesUrl, {
33
+ attribution,
34
+ maxZoom: 20
35
+ }).addTo(thisMap);
36
+ }
37
+ function leafletLoader(_node) {
38
+ import("leaflet").then(() => {
39
+ import("leaflet.markercluster").then(onLoad);
40
+ });
41
+ }
42
+ </script>
43
+
44
+ <svelte:window on:resize={resizeMap} use:leafletLoader />
45
+
46
+ <div class="Map" bind:this={container} style="height: 100%; width: 100%">
47
+ {#if thisMap}
48
+ <slot map={thisMap} />
49
+ {/if}
50
+ </div>
@@ -0,0 +1,69 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { LatLngExpression, Map, Marker } from 'leaflet';
3
+ import type Leaflet from 'leaflet';
4
+ import 'leaflet/dist/leaflet.css';
5
+ import 'leaflet.markercluster/dist/MarkerCluster.css';
6
+ import 'leaflet.markercluster/dist/MarkerCluster.Default.css';
7
+ declare const __propDef: {
8
+ props: {
9
+ center: LatLngExpression;
10
+ zoom: number;
11
+ tilesUrl?: string | undefined;
12
+ attribution?: string | undefined;
13
+ getMarkers?: (() => Leaflet.Marker[]) | undefined;
14
+ map?: (() => Map) | undefined;
15
+ };
16
+ events: {
17
+ baselayerchange: CustomEvent<any>;
18
+ overlayadd: CustomEvent<any>;
19
+ overlayremove: CustomEvent<any>;
20
+ layeradd: CustomEvent<any>;
21
+ layerremove: CustomEvent<any>;
22
+ zoomlevelschange: CustomEvent<any>;
23
+ resize: CustomEvent<any>;
24
+ unload: CustomEvent<any>;
25
+ load: CustomEvent<any>;
26
+ move: CustomEvent<any>;
27
+ moveend: CustomEvent<any>;
28
+ movestart: CustomEvent<any>;
29
+ viewreset: CustomEvent<any>;
30
+ zoom: CustomEvent<any>;
31
+ zoomend: CustomEvent<any>;
32
+ zoomstart: CustomEvent<any>;
33
+ autopanstart: CustomEvent<any>;
34
+ popupclose: CustomEvent<any>;
35
+ popupopen: CustomEvent<any>;
36
+ tooltipclose: CustomEvent<any>;
37
+ tooltipopen: CustomEvent<any>;
38
+ locationerror: CustomEvent<any>;
39
+ locationfound: CustomEvent<any>;
40
+ click: CustomEvent<any>;
41
+ contextmenu: CustomEvent<any>;
42
+ dblclick: CustomEvent<any>;
43
+ keydown: CustomEvent<any>;
44
+ keypress: CustomEvent<any>;
45
+ keyup: CustomEvent<any>;
46
+ mousedown: CustomEvent<any>;
47
+ mousemove: CustomEvent<any>;
48
+ mouseout: CustomEvent<any>;
49
+ mouseover: CustomEvent<any>;
50
+ mouseup: CustomEvent<any>;
51
+ preclick: CustomEvent<any>;
52
+ zoomanim: CustomEvent<any>;
53
+ } & {
54
+ [evt: string]: CustomEvent<any>;
55
+ };
56
+ slots: {
57
+ default: {
58
+ map: Map;
59
+ };
60
+ };
61
+ };
62
+ export type MapProps = typeof __propDef.props;
63
+ export type MapEvents = typeof __propDef.events;
64
+ export type MapSlots = typeof __propDef.slots;
65
+ export default class Map extends SvelteComponent<MapProps, MapEvents, MapSlots> {
66
+ get getMarkers(): () => Marker<any>[];
67
+ get map(): () => Map;
68
+ }
69
+ export {};
@@ -0,0 +1,75 @@
1
+ <script context="module"></script>
2
+
3
+ <script>import { createEventDispatcher, getContext, onDestroy, setContext, tick } from "svelte";
4
+ const dispatch = createEventDispatcher();
5
+ const L = globalThis.window.L;
6
+ export let size = 25;
7
+ export let latlng;
8
+ export let id = "";
9
+ let markerElement;
10
+ let marker;
11
+ const getMap = getContext("map");
12
+ const getLayerGroup = getContext("layerGroup");
13
+ setContext("layer", () => marker);
14
+ $:
15
+ recreateMarker(size, latlng, id);
16
+ async function recreateMarker(size2, latlng2, id2) {
17
+ removeMarker();
18
+ await tick();
19
+ createMarker(size2, latlng2, id2);
20
+ }
21
+ async function createMarker(size2, latlng2, id2) {
22
+ await tick();
23
+ const layerGroup = getLayerGroup?.();
24
+ const map = getMap();
25
+ const mapOrLayerGroup = layerGroup || map;
26
+ const markerOptions = {};
27
+ marker = L.marker(latlng2, markerOptions);
28
+ marker.id = id2;
29
+ marker.on("click", (e) => dispatch("click", e)).on("dblclick", (e) => dispatch("dblclick", e)).on("contextmenu", (e) => dispatch("contextmenu", e));
30
+ mapOrLayerGroup.addLayer(marker);
31
+ const icon = marker.getIcon();
32
+ await tick();
33
+ if (markerElement.childElementCount > 0) {
34
+ marker.setIcon(
35
+ L.divIcon({
36
+ html: markerElement,
37
+ className: "map-marker",
38
+ iconSize: L.point(size2, size2)
39
+ })
40
+ );
41
+ }
42
+ }
43
+ function removeMarker() {
44
+ if (!marker)
45
+ return;
46
+ const layerGroup = getLayerGroup?.();
47
+ const map = getMap();
48
+ const mapOrLayerGroup = layerGroup || map;
49
+ mapOrLayerGroup.removeLayer(marker);
50
+ }
51
+ onDestroy(() => {
52
+ removeMarker();
53
+ });
54
+ </script>
55
+
56
+ <template>
57
+ {#key marker}
58
+ {#if marker}
59
+ <div bind:this={markerElement} class="leaflet-marker">
60
+ <slot name="icon" />
61
+ </div>
62
+ <slot />
63
+ {/if}
64
+ {/key}
65
+ </template>
66
+
67
+ <style>
68
+ .leaflet-marker {
69
+ display: none;
70
+ }
71
+
72
+ :global(.map-marker .leaflet-marker) {
73
+ display: inherit;
74
+ }
75
+ </style>
@@ -0,0 +1,30 @@
1
+ import { SvelteComponent } from "svelte";
2
+ type MarkerContext = {
3
+ id?: string;
4
+ };
5
+ export type Marker = LeafletMarker & MarkerContext;
6
+ import type { LatLngExpression, Marker as LeafletMarker } from 'leaflet';
7
+ declare const __propDef: {
8
+ props: {
9
+ size?: number | undefined;
10
+ latlng: LatLngExpression;
11
+ id?: string | undefined;
12
+ };
13
+ events: {
14
+ click: CustomEvent<any>;
15
+ dblclick: CustomEvent<any>;
16
+ contextmenu: CustomEvent<any>;
17
+ } & {
18
+ [evt: string]: CustomEvent<any>;
19
+ };
20
+ slots: {
21
+ icon: {};
22
+ default: {};
23
+ };
24
+ };
25
+ export type MarkerProps = typeof __propDef.props;
26
+ export type MarkerEvents = typeof __propDef.events;
27
+ export type MarkerSlots = typeof __propDef.slots;
28
+ export default class Marker extends SvelteComponent<MarkerProps, MarkerEvents, MarkerSlots> {
29
+ }
30
+ export {};
@@ -0,0 +1,14 @@
1
+ <script>import { getContext, onMount, setContext } from "svelte";
2
+ export let options = {};
3
+ const L = globalThis.window.L;
4
+ const getMap = getContext("map");
5
+ let markers;
6
+ setContext("layerGroup", () => markers);
7
+ onMount(async () => {
8
+ const map = getMap();
9
+ markers = L.markerClusterGroup(options);
10
+ map.addLayer(markers);
11
+ });
12
+ </script>
13
+
14
+ <slot />
@@ -0,0 +1,19 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { MarkerClusterGroupOptions } from 'leaflet';
3
+ declare const __propDef: {
4
+ props: {
5
+ options?: MarkerClusterGroupOptions | undefined;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {
11
+ default: {};
12
+ };
13
+ };
14
+ export type MarkerClusterGroupProps = typeof __propDef.props;
15
+ export type MarkerClusterGroupEvents = typeof __propDef.events;
16
+ export type MarkerClusterGroupSlots = typeof __propDef.slots;
17
+ export default class MarkerClusterGroup extends SvelteComponent<MarkerClusterGroupProps, MarkerClusterGroupEvents, MarkerClusterGroupSlots> {
18
+ }
19
+ export {};
@@ -0,0 +1,26 @@
1
+ <script>import { createEventDispatcher, getContext, onDestroy, onMount } from "svelte";
2
+ export let latlngs;
3
+ export let options = {};
4
+ let line;
5
+ let map = getContext("map")();
6
+ const dispatch = createEventDispatcher();
7
+ $:
8
+ updateLine(latlngs, options);
9
+ function updateLine(latLngs, lineStyle) {
10
+ if (line) {
11
+ line.setLatLngs(latLngs);
12
+ line.setStyle(lineStyle);
13
+ }
14
+ }
15
+ onMount(async () => {
16
+ const L = window.L;
17
+ line = new L.Polyline(latlngs);
18
+ line.on("click", (e) => dispatch("click", e));
19
+ line.addTo(map);
20
+ });
21
+ onDestroy(() => {
22
+ line?.remove();
23
+ });
24
+ </script>
25
+
26
+ <slot />
@@ -0,0 +1,22 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { LatLngExpression, PathOptions } from 'leaflet';
3
+ declare const __propDef: {
4
+ props: {
5
+ latlngs: LatLngExpression[];
6
+ options?: PathOptions | undefined;
7
+ };
8
+ events: {
9
+ click: CustomEvent<any>;
10
+ } & {
11
+ [evt: string]: CustomEvent<any>;
12
+ };
13
+ slots: {
14
+ default: {};
15
+ };
16
+ };
17
+ export type PolylineProps = typeof __propDef.props;
18
+ export type PolylineEvents = typeof __propDef.events;
19
+ export type PolylineSlots = typeof __propDef.slots;
20
+ export default class Polyline extends SvelteComponent<PolylineProps, PolylineEvents, PolylineSlots> {
21
+ }
22
+ export {};
@@ -0,0 +1,46 @@
1
+ <script>import { getContext, onDestroy, onMount, tick } from "svelte";
2
+ const L = globalThis.window.L;
3
+ export let options = {
4
+ autoPan: false
5
+ };
6
+ let popup = void 0;
7
+ let popupElement;
8
+ let showContents = false;
9
+ let popupOpen = false;
10
+ const getLayer = getContext("layer");
11
+ let layer;
12
+ function removePopup() {
13
+ if (!popup)
14
+ return;
15
+ layer.unbindPopup();
16
+ popup.remove();
17
+ }
18
+ async function createPopup() {
19
+ await tick();
20
+ layer = getLayer();
21
+ popup = L.popup().setContent(popupElement);
22
+ layer.bindPopup(popup, options);
23
+ layer.on("popupopen", () => {
24
+ popupOpen = true;
25
+ showContents = true;
26
+ });
27
+ layer.on("popupclose", () => {
28
+ popupOpen = false;
29
+ setTimeout(() => {
30
+ if (!popupOpen) {
31
+ showContents = false;
32
+ }
33
+ }, 500);
34
+ });
35
+ }
36
+ onMount(createPopup);
37
+ onDestroy(() => {
38
+ removePopup();
39
+ });
40
+ </script>
41
+
42
+ <div bind:this={popupElement}>
43
+ {#if showContents}
44
+ <slot />
45
+ {/if}
46
+ </div>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { PopupOptions } from 'leaflet';
3
+ declare const __propDef: {
4
+ props: {
5
+ options?: PopupOptions | undefined;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {
11
+ default: {};
12
+ };
13
+ };
14
+ export type PopupProps = typeof __propDef.props;
15
+ export type PopupEvents = typeof __propDef.events;
16
+ export type PopupSlots = typeof __propDef.slots;
17
+ export default class Popup extends SvelteComponent<PopupProps, PopupEvents, PopupSlots> {
18
+ }
19
+ export {};
@@ -0,0 +1,6 @@
1
+ export { default as Map } from './Map.svelte';
2
+ export { default as Marker } from './Marker.svelte';
3
+ export { default as MarkerClusterGroup } from './MarkerClusterGroup.svelte';
4
+ export { default as Polyline } from './Polyline.svelte';
5
+ export { default as Popup } from './Popup.svelte';
6
+ export type { LatLngTuple, LatLng, LatLngExpression } from 'leaflet';
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ // Reexport your entry components here
2
+ export { default as Map } from './Map.svelte';
3
+ export { default as Marker } from './Marker.svelte';
4
+ export { default as MarkerClusterGroup } from './MarkerClusterGroup.svelte';
5
+ export { default as Polyline } from './Polyline.svelte';
6
+ export { default as Popup } from './Popup.svelte';
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@radiofrance/svelte-leaflet",
3
+ "version": "0.1.0-alpha.0",
4
+ "description": "A library that wraps leaflet classes in domless/renderless svelte components.",
5
+ "author": {
6
+ "email": "romain.durand@radiofrance.com",
7
+ "name": "Romain Durand"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/radiofrance/svelte-leaflet"
12
+ },
13
+ "scripts": {
14
+ "dev": "vite dev",
15
+ "build": "vite build && npm run package",
16
+ "preview": "vite preview",
17
+ "package": "svelte-kit sync && svelte-package && publint",
18
+ "prepublishOnly": "npm run package",
19
+ "test": "npm run test:integration && npm run test:unit",
20
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
21
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
22
+ "lint": "prettier --check . && eslint .",
23
+ "format": "prettier --write .",
24
+ "test:integration": "playwright test",
25
+ "test:unit": "vitest"
26
+ },
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "svelte": "./dist/index.js"
31
+ }
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "!dist/**/*.test.*",
36
+ "!dist/**/*.spec.*"
37
+ ],
38
+ "peerDependencies": {
39
+ "svelte": "^4.0.0"
40
+ },
41
+ "devDependencies": {
42
+ "@playwright/test": "^1.28.1",
43
+ "@sveltejs/adapter-auto": "^3.0.0",
44
+ "@sveltejs/kit": "^2.0.0",
45
+ "@sveltejs/package": "^2.0.0",
46
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
47
+ "@types/d3-scale": "^4.0.8",
48
+ "@types/d3-scale-chromatic": "^3.0.3",
49
+ "@types/eslint": "8.56.0",
50
+ "@types/leaflet": "^1.9.8",
51
+ "@types/leaflet.markercluster": "^1.5.4",
52
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
53
+ "@typescript-eslint/parser": "^6.0.0",
54
+ "d3-scale": "^4.0.2",
55
+ "d3-scale-chromatic": "^3.0.0",
56
+ "eslint": "^8.56.0",
57
+ "eslint-config-prettier": "^9.1.0",
58
+ "eslint-plugin-svelte": "^2.35.1",
59
+ "leaflet": "^1.9.4",
60
+ "leaflet.markercluster": "^1.5.3",
61
+ "prettier": "^3.1.1",
62
+ "prettier-plugin-svelte": "^3.1.2",
63
+ "publint": "^0.1.9",
64
+ "svelte": "^4.2.7",
65
+ "svelte-check": "^3.6.0",
66
+ "tslib": "^2.4.1",
67
+ "typescript": "^5.0.0",
68
+ "vite": "^5.0.11",
69
+ "vitest": "^1.2.0"
70
+ },
71
+ "svelte": "./dist/index.js",
72
+ "types": "./dist/index.d.ts",
73
+ "type": "module"
74
+ }