@idetik/core 0.2.3 → 0.4.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.
@@ -2,21 +2,53 @@ import { Location } from "@zarrita/core";
2
2
  import { Readable } from "@zarrita/storage";
3
3
  import { OmeZarrImageLoader } from "./image_loader";
4
4
  import { Version as OmeZarrVersion } from "./metadata_loaders";
5
+ import { type S3FetchStoreProps } from "../zarr/s3_fetch_store";
6
+ type HttpOmeZarrImageSourceProps = {
7
+ url: string;
8
+ version?: OmeZarrVersion;
9
+ };
10
+ type S3OmeZarrImageSourceProps = S3FetchStoreProps & {
11
+ version?: OmeZarrVersion;
12
+ };
13
+ type FileSystemOmeZarrImageSourceProps = {
14
+ directory: FileSystemDirectoryHandle;
15
+ version?: OmeZarrVersion;
16
+ path?: `/${string}`;
17
+ };
5
18
  /** Opens an OME-Zarr multiscale image Zarr group from either a URL or local directory. */
6
19
  export declare class OmeZarrImageSource {
7
20
  readonly location: Location<Readable>;
8
21
  readonly version?: OmeZarrVersion;
22
+ private constructor();
23
+ open(): Promise<OmeZarrImageLoader>;
9
24
  /**
25
+ * Creates an OmeZarrImageSource from an HTTP(S) URL.
26
+ *
10
27
  * @param url URL of Zarr root
28
+ * @param version OME-Zarr version
11
29
  */
12
- constructor(url: string, version?: OmeZarrVersion);
30
+ static fromHttp(props: HttpOmeZarrImageSourceProps): OmeZarrImageSource;
13
31
  /**
32
+ * Creates an OmeZarrImageSource from an S3 HTTP(S) URL.
33
+ *
34
+ * @param url URL of Zarr root
35
+ * @param version OME-Zarr version
36
+ * @param credentials AWS credentials for S3 authentication (will generate signatures per-request)
37
+ * @param region AWS region for S3 bucket (e.g., 'us-east-1')
38
+ * @param overrides RequestInit overrides to customize fetch behavior (e.g., custom headers for S3 authentication)
39
+ * @param useSuffixRequest Whether to use suffix requests for range queries
40
+ */
41
+ static fromS3(props: S3OmeZarrImageSourceProps): OmeZarrImageSource;
42
+ /**
43
+ * Creates an OmeZarrImageSource from a local filesystem directory.
44
+ *
14
45
  * @param directory return value of `window.showDirectoryPicker()` which gives the browser
15
46
  * permission to access a directory (only works in Chrome/Edge)
47
+ * @param version OME-Zarr version
16
48
  * @param path path to image, beginning with "/". This argument allows the application to only
17
49
  * ask the user once for permission to the root directory
18
50
  */
19
- constructor(directory: FileSystemDirectoryHandle, version?: OmeZarrVersion, path?: `/${string}`);
20
- open(): Promise<OmeZarrImageLoader>;
51
+ static fromFileSystem(props: FileSystemOmeZarrImageSourceProps): OmeZarrImageSource;
21
52
  }
53
+ export {};
22
54
  //# sourceMappingURL=image_source.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"image_source.d.ts","sourceRoot":"","sources":["../../../../../src/data/ome_zarr/image_source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQ5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAGL,OAAO,IAAI,cAAc,EAC1B,MAAM,oBAAoB,CAAC;AAE5B,0FAA0F;AAC1F,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAElC;;OAEG;gBACS,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc;IACjD;;;;;OAKG;gBAED,SAAS,EAAE,yBAAyB,EACpC,OAAO,CAAC,EAAE,cAAc,EACxB,IAAI,CAAC,EAAE,IAAI,MAAM,EAAE;IAcR,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC;CAqCjD"}
1
+ {"version":3,"file":"image_source.d.ts","sourceRoot":"","sources":["../../../../../src/data/ome_zarr/image_source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQ5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAGL,OAAO,IAAI,cAAc,EAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAO9E,KAAK,2BAA2B,GAAG;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,KAAK,yBAAyB,GAAG,iBAAiB,GAAG;IACnD,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,KAAK,iCAAiC,GAAG;IACvC,SAAS,EAAE,yBAAyB,CAAC;IACrC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,IAAI,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,0FAA0F;AAC1F,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAElC,OAAO;IAKM,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAsChD;;;;;OAKG;WACW,QAAQ,CAAC,KAAK,EAAE,2BAA2B;IAQzD;;;;;;;;;OASG;WACW,MAAM,CAAC,KAAK,EAAE,yBAAyB;IAQrD;;;;;;;;OAQG;WACW,cAAc,CAAC,KAAK,EAAE,iCAAiC;CAOtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"metadata_loaders.d.ts","sourceRoot":"","sources":["../../../../../src/data/ome_zarr/metadata_loaders.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAa,MAAM,cAAc,CAAC;AAEjE,QAAA,MAAM,QAAQ,yBAA0B,CAAC;AAEzC,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG;IACvB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAqBF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,OAAO,GAAG,SAAS,GAC9B,WAAW,GAAG,SAAS,CAQzB;AAQD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAWnC;AA4DD,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAWlC;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,YAAY,EAAE,CAAC,CAKzB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAKjC;AA4BD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAM1B"}
1
+ {"version":3,"file":"metadata_loaders.d.ts","sourceRoot":"","sources":["../../../../../src/data/ome_zarr/metadata_loaders.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAa,MAAM,cAAc,CAAC;AAEjE,QAAA,MAAM,QAAQ,yBAA0B,CAAC;AAEzC,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhD,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG;IACvB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AAqBF,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,OAAO,GAAG,SAAS,GAC9B,WAAW,GAAG,SAAS,CAQzB;AAQD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAYnC;AA4DD,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAalC;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,YAAY,EAAE,CAAC,CAKzB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAKjC;AA4BD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAM1B"}
@@ -1,6 +1,7 @@
1
1
  import * as zarr from "zarrita";
2
2
  import { Location } from "@zarrita/core";
3
3
  import { Readable } from "@zarrita/storage";
4
+ import { type S3FetchStoreProps } from "./s3_fetch_store";
4
5
  export type Version = "v2" | "v3";
5
6
  export type ZarrArrayParams = {
6
7
  arrayPath: string;
@@ -8,11 +9,9 @@ export type ZarrArrayParams = {
8
9
  } & ({
9
10
  type: "fetch";
10
11
  url: string;
11
- fetchOptions?: {
12
- overrides?: RequestInit;
13
- useSuffixRequest?: boolean;
14
- };
15
- } | {
12
+ } | ({
13
+ type: "s3";
14
+ } & S3FetchStoreProps) | {
16
15
  type: "filesystem";
17
16
  directoryHandle: FileSystemDirectoryHandle;
18
17
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../../../src/data/zarr/open.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;AAElC,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC,GAAG,CACA;IACE,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE;QACb,SAAS,CAAC,EAAE,WAAW,CAAC;QACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;CACH,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,eAAe,EAAE,yBAAyB,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd,CACJ,CAAC;AAEF,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACjC,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAoB/B;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACjC,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAoB9C;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CA4B9C;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC5B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,GAAG,SAAS,GAC/B,eAAe,CAqBjB"}
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../../../src/data/zarr/open.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAgB,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAExE,MAAM,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;AAElC,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC,GAAG,CACA;IACE,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,GACD,CAAC;IACC,IAAI,EAAE,IAAI,CAAC;CACZ,GAAG,iBAAiB,CAAC,GACtB;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,eAAe,EAAE,yBAAyB,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd,CACJ,CAAC;AAEF,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACjC,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAoB/B;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACjC,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAoB9C;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAgC9C;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC5B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,GAAG,SAAS,GAC/B,eAAe,CAgCjB"}
@@ -0,0 +1,60 @@
1
+ import FetchStore from "@zarrita/storage/fetch";
2
+ type AwsCredentials = {
3
+ accessKeyId: string;
4
+ secretAccessKey: string;
5
+ sessionToken?: string;
6
+ };
7
+ export type S3FetchStoreProps = {
8
+ url: string;
9
+ region?: string;
10
+ credentials?: AwsCredentials;
11
+ overrides?: RequestInit;
12
+ useSuffixRequest?: boolean;
13
+ };
14
+ /**
15
+ * A FetchStore that generates AWS Signature V4 headers for each request.
16
+ * This is necessary because AWS signatures are path-specific and expire quickly.
17
+ *
18
+ * SECURITY WARNING: This class is only intended for local development.
19
+ * Credentials are passed to worker threads and stored in memory.
20
+ * Do not use in production - implement a secure backend proxy instead.
21
+ */
22
+ export declare class S3FetchStore extends FetchStore {
23
+ readonly credentials?: AwsCredentials;
24
+ readonly region?: string;
25
+ private signingKeyCache_;
26
+ readonly overrides?: RequestInit;
27
+ readonly useSuffixRequest?: boolean;
28
+ constructor(props: S3FetchStoreProps);
29
+ /**
30
+ * Override get() to generate fresh auth headers for each request
31
+ */
32
+ get(key: `/${string}`, options?: RequestInit): Promise<Uint8Array | undefined>;
33
+ /**
34
+ * Override getRange() to generate fresh auth headers for range requests
35
+ * This handles HEAD requests made by fetch_suffix
36
+ */
37
+ getRange(key: `/${string}`, range: {
38
+ offset: number;
39
+ length: number;
40
+ } | {
41
+ suffixLength: number;
42
+ }, options?: RequestInit): Promise<Uint8Array | undefined>;
43
+ /**
44
+ * Generate AWS Signature V4 headers for a specific URL and HTTP method
45
+ * This uses the Web Crypto API for browser compatibility
46
+ */
47
+ private generateAuthHeaders;
48
+ private getAmzDate;
49
+ private sha256;
50
+ private hmacSha256;
51
+ private hmacSha256Bytes;
52
+ /**
53
+ * Get the signing key for a given date/region combination.
54
+ * Caches the key to avoid regenerating it for every request (key is valid for 24 hours).
55
+ */
56
+ private getSignatureKey;
57
+ private bufferToHex;
58
+ }
59
+ export {};
60
+ //# sourceMappingURL=s3_fetch_store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3_fetch_store.d.ts","sourceRoot":"","sources":["../../../../../src/data/zarr/s3_fetch_store.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAEhD,KAAK,cAAc,GAAG;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AA6BF;;;;;;;GAOG;AACH,qBAAa,YAAa,SAAQ,UAAU;IAC1C,SAAgB,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7C,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhC,OAAO,CAAC,gBAAgB,CAAiC;IACzD,SAAgB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxC,SAAgB,gBAAgB,CAAC,EAAE,OAAO,CAAC;gBAE/B,KAAK,EAAE,iBAAiB;IAgBpC;;OAEG;IACG,GAAG,CACP,GAAG,EAAE,IAAI,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAuBlC;;;OAGG;IACG,QAAQ,CACZ,GAAG,EAAE,IAAI,MAAM,EAAE,EACjB,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,EACpE,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IA+ClC;;;OAGG;YACW,mBAAmB;IAoEjC,OAAO,CAAC,UAAU;YAIJ,MAAM;YAON,UAAU;YAgBV,eAAe;IAoB7B;;;OAGG;YACW,eAAe;IA2B7B,OAAO,CAAC,WAAW;CAKpB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@idetik/core",
3
- "version": "0.2.3",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "dev": "vite",