@stack0/sdk 0.5.9 → 0.5.12

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.
@@ -0,0 +1,151 @@
1
+ 'use strict';
2
+
3
+ // src/lib/http-client.ts
4
+ var HttpClient = class {
5
+ apiKey;
6
+ baseUrl;
7
+ constructor(config) {
8
+ this.apiKey = config.apiKey;
9
+ this.baseUrl = config.baseUrl || "https://api.stack0.dev/v1";
10
+ }
11
+ getHeaders(includeContentType = true) {
12
+ const headers = {
13
+ Authorization: `Bearer ${this.apiKey}`
14
+ };
15
+ if (includeContentType) {
16
+ headers["Content-Type"] = "application/json";
17
+ }
18
+ return headers;
19
+ }
20
+ async request(method, path, body) {
21
+ const url = `${this.baseUrl}${path}`;
22
+ const bodyString = body === void 0 ? void 0 : JSON.stringify(body);
23
+ const hasBody = bodyString !== void 0;
24
+ try {
25
+ const response = await fetch(url, {
26
+ method,
27
+ headers: this.getHeaders(hasBody),
28
+ body: hasBody ? bodyString : void 0
29
+ });
30
+ if (!response.ok) {
31
+ await this.handleErrorResponse(response);
32
+ }
33
+ const data = await response.json();
34
+ return data;
35
+ } catch (error) {
36
+ if (error instanceof Error && "statusCode" in error) {
37
+ throw error;
38
+ }
39
+ throw this.createError("Network error", error);
40
+ }
41
+ }
42
+ async handleErrorResponse(response) {
43
+ let errorBody;
44
+ try {
45
+ errorBody = await response.json();
46
+ } catch {
47
+ errorBody = { message: response.statusText };
48
+ }
49
+ const error = new Error(errorBody?.message || `HTTP ${response.status}`);
50
+ error.statusCode = response.status;
51
+ error.code = errorBody?.code ?? "";
52
+ error.response = errorBody;
53
+ throw error;
54
+ }
55
+ createError(message, cause) {
56
+ const error = new Error(message);
57
+ error.cause = cause;
58
+ return error;
59
+ }
60
+ async get(path) {
61
+ return this.request("GET", path);
62
+ }
63
+ async post(path, body) {
64
+ return this.request("POST", path, body);
65
+ }
66
+ async put(path, body) {
67
+ return this.request("PUT", path, body);
68
+ }
69
+ async delete(path) {
70
+ return this.request("DELETE", path);
71
+ }
72
+ async deleteWithBody(path, body) {
73
+ return this.request("DELETE", path, body);
74
+ }
75
+ async patch(path, body) {
76
+ return this.request("PATCH", path, body);
77
+ }
78
+ };
79
+
80
+ // src/map/client.ts
81
+ var Map$ = class {
82
+ http;
83
+ constructor(config) {
84
+ this.http = new HttpClient(config);
85
+ }
86
+ /**
87
+ * Start a map job.
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * const { id } = await stack0.map.create({
92
+ * url: 'https://docs.example.com',
93
+ * search: 'api',
94
+ * limit: 1000,
95
+ * });
96
+ * ```
97
+ */
98
+ async create(request) {
99
+ return this.http.post("/webdata/map", request);
100
+ }
101
+ async get(request) {
102
+ const params = new URLSearchParams();
103
+ if (request.environment) params.set("environment", request.environment);
104
+ if (request.projectId) params.set("projectId", request.projectId);
105
+ const query = params.toString();
106
+ return this.http.get(`/webdata/map/${request.id}${query ? `?${query}` : ""}`);
107
+ }
108
+ async list(request = {}) {
109
+ const params = new URLSearchParams();
110
+ if (request.environment) params.set("environment", request.environment);
111
+ if (request.projectId) params.set("projectId", request.projectId);
112
+ if (request.status) params.set("status", request.status);
113
+ if (request.limit) params.set("limit", String(request.limit));
114
+ if (request.cursor) params.set("cursor", request.cursor);
115
+ const query = params.toString();
116
+ return this.http.get(`/webdata/map${query ? `?${query}` : ""}`);
117
+ }
118
+ async delete(request) {
119
+ const params = new URLSearchParams();
120
+ if (request.environment) params.set("environment", request.environment);
121
+ if (request.projectId) params.set("projectId", request.projectId);
122
+ const query = params.toString();
123
+ return this.http.deleteWithBody(
124
+ `/webdata/map/${request.id}${query ? `?${query}` : ""}`,
125
+ request
126
+ );
127
+ }
128
+ /**
129
+ * Create a map job and poll until it completes. Maps usually finish in
130
+ * seconds, so default timeout is generous.
131
+ */
132
+ async createAndWait(request, options = {}) {
133
+ const { pollInterval = 1e3, timeout = 12e4 } = options;
134
+ const { id } = await this.create(request);
135
+ const start = Date.now();
136
+ while (Date.now() - start < timeout) {
137
+ const result = await this.get({ id, environment: request.environment, projectId: request.projectId });
138
+ if (result.status === "completed" || result.status === "failed") {
139
+ if (result.status === "failed") throw new Error(result.error || "Map failed");
140
+ return result;
141
+ }
142
+ await new Promise((r) => setTimeout(r, pollInterval));
143
+ }
144
+ throw new Error("Map timed out");
145
+ }
146
+ };
147
+
148
+ exports.Map = Map$;
149
+ exports.Map$ = Map$;
150
+ //# sourceMappingURL=index.js.map
151
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/http-client.ts","../../src/map/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * HTTP client for Stack0 API\n * Handles authentication, request/response formatting, and error handling\n */\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class HttpClient {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(config: HttpClientConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || \"https://api.stack0.dev/v1\";\n }\n\n private getHeaders(includeContentType = true): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n };\n if (includeContentType) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n return headers;\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const bodyString = body === undefined ? undefined : JSON.stringify(body);\n const hasBody = bodyString !== undefined;\n\n try {\n const response = await fetch(url, {\n method,\n headers: this.getHeaders(hasBody),\n body: hasBody ? bodyString : undefined,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = await response.json();\n return data as T;\n } catch (error) {\n if (error instanceof Error && \"statusCode\" in error) {\n throw error; // Re-throw our custom errors\n }\n throw this.createError(\"Network error\", error);\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let errorBody: { message: string } | undefined;\n try {\n errorBody = (await response.json()) as { message: string };\n } catch {\n errorBody = { message: response.statusText };\n }\n\n const error = new Error(errorBody?.message || `HTTP ${response.status}`) as Error & {\n statusCode: number;\n code: string;\n response: unknown;\n };\n error.statusCode = response.status;\n error.code = (errorBody as unknown as { code: string } | undefined)?.code ?? \"\";\n error.response = errorBody;\n throw error;\n }\n\n private createError(message: string, cause?: unknown): Error {\n const error = new Error(message) as Error & { cause: unknown };\n error.cause = cause;\n return error;\n }\n\n async get<T>(path: string): Promise<T> {\n return this.request<T>(\"GET\", path);\n }\n\n async post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, body);\n }\n\n async put<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"PUT\", path, body);\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n\n async deleteWithBody<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"DELETE\", path, body);\n }\n\n async patch<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, body);\n }\n}\n","/**\n * Stack0 Map Client\n * Fast URL discovery for a domain — returns every URL without scraping.\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type {\n CreateMapRequest,\n CreateMapResponse,\n GetMapRequest,\n ListMapsRequest,\n ListMapsResponse,\n WebdataMap,\n} from \"./types\";\n\nexport class Map$ {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n /**\n * Start a map job.\n *\n * @example\n * ```typescript\n * const { id } = await stack0.map.create({\n * url: 'https://docs.example.com',\n * search: 'api',\n * limit: 1000,\n * });\n * ```\n */\n async create(request: CreateMapRequest): Promise<CreateMapResponse> {\n return this.http.post<CreateMapResponse>(\"/webdata/map\", request);\n }\n\n async get(request: GetMapRequest): Promise<WebdataMap> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n const query = params.toString();\n return this.http.get<WebdataMap>(`/webdata/map/${request.id}${query ? `?${query}` : \"\"}`);\n }\n\n async list(request: ListMapsRequest = {}): Promise<ListMapsResponse> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.status) params.set(\"status\", request.status);\n if (request.limit) params.set(\"limit\", String(request.limit));\n if (request.cursor) params.set(\"cursor\", request.cursor);\n const query = params.toString();\n return this.http.get<ListMapsResponse>(`/webdata/map${query ? `?${query}` : \"\"}`);\n }\n\n async delete(request: GetMapRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n const query = params.toString();\n return this.http.deleteWithBody<{ success: boolean }>(\n `/webdata/map/${request.id}${query ? `?${query}` : \"\"}`,\n request,\n );\n }\n\n /**\n * Create a map job and poll until it completes. Maps usually finish in\n * seconds, so default timeout is generous.\n */\n async createAndWait(\n request: CreateMapRequest,\n options: { pollInterval?: number; timeout?: number } = {},\n ): Promise<WebdataMap> {\n const { pollInterval = 1000, timeout = 120_000 } = options;\n const { id } = await this.create(request);\n const start = Date.now();\n while (Date.now() - start < timeout) {\n const result = await this.get({ id, environment: request.environment, projectId: request.projectId });\n if (result.status === \"completed\" || result.status === \"failed\") {\n if (result.status === \"failed\") throw new Error(result.error || \"Map failed\");\n return result;\n }\n await new Promise((r) => setTimeout(r, pollInterval));\n }\n throw new Error(\"Map timed out\");\n }\n}\n\nexport { Map$ as Map };\n"]}
@@ -0,0 +1,148 @@
1
+ // src/lib/http-client.ts
2
+ var HttpClient = class {
3
+ apiKey;
4
+ baseUrl;
5
+ constructor(config) {
6
+ this.apiKey = config.apiKey;
7
+ this.baseUrl = config.baseUrl || "https://api.stack0.dev/v1";
8
+ }
9
+ getHeaders(includeContentType = true) {
10
+ const headers = {
11
+ Authorization: `Bearer ${this.apiKey}`
12
+ };
13
+ if (includeContentType) {
14
+ headers["Content-Type"] = "application/json";
15
+ }
16
+ return headers;
17
+ }
18
+ async request(method, path, body) {
19
+ const url = `${this.baseUrl}${path}`;
20
+ const bodyString = body === void 0 ? void 0 : JSON.stringify(body);
21
+ const hasBody = bodyString !== void 0;
22
+ try {
23
+ const response = await fetch(url, {
24
+ method,
25
+ headers: this.getHeaders(hasBody),
26
+ body: hasBody ? bodyString : void 0
27
+ });
28
+ if (!response.ok) {
29
+ await this.handleErrorResponse(response);
30
+ }
31
+ const data = await response.json();
32
+ return data;
33
+ } catch (error) {
34
+ if (error instanceof Error && "statusCode" in error) {
35
+ throw error;
36
+ }
37
+ throw this.createError("Network error", error);
38
+ }
39
+ }
40
+ async handleErrorResponse(response) {
41
+ let errorBody;
42
+ try {
43
+ errorBody = await response.json();
44
+ } catch {
45
+ errorBody = { message: response.statusText };
46
+ }
47
+ const error = new Error(errorBody?.message || `HTTP ${response.status}`);
48
+ error.statusCode = response.status;
49
+ error.code = errorBody?.code ?? "";
50
+ error.response = errorBody;
51
+ throw error;
52
+ }
53
+ createError(message, cause) {
54
+ const error = new Error(message);
55
+ error.cause = cause;
56
+ return error;
57
+ }
58
+ async get(path) {
59
+ return this.request("GET", path);
60
+ }
61
+ async post(path, body) {
62
+ return this.request("POST", path, body);
63
+ }
64
+ async put(path, body) {
65
+ return this.request("PUT", path, body);
66
+ }
67
+ async delete(path) {
68
+ return this.request("DELETE", path);
69
+ }
70
+ async deleteWithBody(path, body) {
71
+ return this.request("DELETE", path, body);
72
+ }
73
+ async patch(path, body) {
74
+ return this.request("PATCH", path, body);
75
+ }
76
+ };
77
+
78
+ // src/map/client.ts
79
+ var Map$ = class {
80
+ http;
81
+ constructor(config) {
82
+ this.http = new HttpClient(config);
83
+ }
84
+ /**
85
+ * Start a map job.
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const { id } = await stack0.map.create({
90
+ * url: 'https://docs.example.com',
91
+ * search: 'api',
92
+ * limit: 1000,
93
+ * });
94
+ * ```
95
+ */
96
+ async create(request) {
97
+ return this.http.post("/webdata/map", request);
98
+ }
99
+ async get(request) {
100
+ const params = new URLSearchParams();
101
+ if (request.environment) params.set("environment", request.environment);
102
+ if (request.projectId) params.set("projectId", request.projectId);
103
+ const query = params.toString();
104
+ return this.http.get(`/webdata/map/${request.id}${query ? `?${query}` : ""}`);
105
+ }
106
+ async list(request = {}) {
107
+ const params = new URLSearchParams();
108
+ if (request.environment) params.set("environment", request.environment);
109
+ if (request.projectId) params.set("projectId", request.projectId);
110
+ if (request.status) params.set("status", request.status);
111
+ if (request.limit) params.set("limit", String(request.limit));
112
+ if (request.cursor) params.set("cursor", request.cursor);
113
+ const query = params.toString();
114
+ return this.http.get(`/webdata/map${query ? `?${query}` : ""}`);
115
+ }
116
+ async delete(request) {
117
+ const params = new URLSearchParams();
118
+ if (request.environment) params.set("environment", request.environment);
119
+ if (request.projectId) params.set("projectId", request.projectId);
120
+ const query = params.toString();
121
+ return this.http.deleteWithBody(
122
+ `/webdata/map/${request.id}${query ? `?${query}` : ""}`,
123
+ request
124
+ );
125
+ }
126
+ /**
127
+ * Create a map job and poll until it completes. Maps usually finish in
128
+ * seconds, so default timeout is generous.
129
+ */
130
+ async createAndWait(request, options = {}) {
131
+ const { pollInterval = 1e3, timeout = 12e4 } = options;
132
+ const { id } = await this.create(request);
133
+ const start = Date.now();
134
+ while (Date.now() - start < timeout) {
135
+ const result = await this.get({ id, environment: request.environment, projectId: request.projectId });
136
+ if (result.status === "completed" || result.status === "failed") {
137
+ if (result.status === "failed") throw new Error(result.error || "Map failed");
138
+ return result;
139
+ }
140
+ await new Promise((r) => setTimeout(r, pollInterval));
141
+ }
142
+ throw new Error("Map timed out");
143
+ }
144
+ };
145
+
146
+ export { Map$ as Map, Map$ };
147
+ //# sourceMappingURL=index.mjs.map
148
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/http-client.ts","../../src/map/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * HTTP client for Stack0 API\n * Handles authentication, request/response formatting, and error handling\n */\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class HttpClient {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(config: HttpClientConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || \"https://api.stack0.dev/v1\";\n }\n\n private getHeaders(includeContentType = true): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n };\n if (includeContentType) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n return headers;\n }\n\n async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const bodyString = body === undefined ? undefined : JSON.stringify(body);\n const hasBody = bodyString !== undefined;\n\n try {\n const response = await fetch(url, {\n method,\n headers: this.getHeaders(hasBody),\n body: hasBody ? bodyString : undefined,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response);\n }\n\n const data = await response.json();\n return data as T;\n } catch (error) {\n if (error instanceof Error && \"statusCode\" in error) {\n throw error; // Re-throw our custom errors\n }\n throw this.createError(\"Network error\", error);\n }\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n let errorBody: { message: string } | undefined;\n try {\n errorBody = (await response.json()) as { message: string };\n } catch {\n errorBody = { message: response.statusText };\n }\n\n const error = new Error(errorBody?.message || `HTTP ${response.status}`) as Error & {\n statusCode: number;\n code: string;\n response: unknown;\n };\n error.statusCode = response.status;\n error.code = (errorBody as unknown as { code: string } | undefined)?.code ?? \"\";\n error.response = errorBody;\n throw error;\n }\n\n private createError(message: string, cause?: unknown): Error {\n const error = new Error(message) as Error & { cause: unknown };\n error.cause = cause;\n return error;\n }\n\n async get<T>(path: string): Promise<T> {\n return this.request<T>(\"GET\", path);\n }\n\n async post<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, body);\n }\n\n async put<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"PUT\", path, body);\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n\n async deleteWithBody<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"DELETE\", path, body);\n }\n\n async patch<T>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, body);\n }\n}\n","/**\n * Stack0 Map Client\n * Fast URL discovery for a domain — returns every URL without scraping.\n */\n\nimport { HttpClient, type HttpClientConfig } from \"../lib/http-client\";\nimport type {\n CreateMapRequest,\n CreateMapResponse,\n GetMapRequest,\n ListMapsRequest,\n ListMapsResponse,\n WebdataMap,\n} from \"./types\";\n\nexport class Map$ {\n private http: HttpClient;\n\n constructor(config: HttpClientConfig) {\n this.http = new HttpClient(config);\n }\n\n /**\n * Start a map job.\n *\n * @example\n * ```typescript\n * const { id } = await stack0.map.create({\n * url: 'https://docs.example.com',\n * search: 'api',\n * limit: 1000,\n * });\n * ```\n */\n async create(request: CreateMapRequest): Promise<CreateMapResponse> {\n return this.http.post<CreateMapResponse>(\"/webdata/map\", request);\n }\n\n async get(request: GetMapRequest): Promise<WebdataMap> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n const query = params.toString();\n return this.http.get<WebdataMap>(`/webdata/map/${request.id}${query ? `?${query}` : \"\"}`);\n }\n\n async list(request: ListMapsRequest = {}): Promise<ListMapsResponse> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n if (request.status) params.set(\"status\", request.status);\n if (request.limit) params.set(\"limit\", String(request.limit));\n if (request.cursor) params.set(\"cursor\", request.cursor);\n const query = params.toString();\n return this.http.get<ListMapsResponse>(`/webdata/map${query ? `?${query}` : \"\"}`);\n }\n\n async delete(request: GetMapRequest): Promise<{ success: boolean }> {\n const params = new URLSearchParams();\n if (request.environment) params.set(\"environment\", request.environment);\n if (request.projectId) params.set(\"projectId\", request.projectId);\n const query = params.toString();\n return this.http.deleteWithBody<{ success: boolean }>(\n `/webdata/map/${request.id}${query ? `?${query}` : \"\"}`,\n request,\n );\n }\n\n /**\n * Create a map job and poll until it completes. Maps usually finish in\n * seconds, so default timeout is generous.\n */\n async createAndWait(\n request: CreateMapRequest,\n options: { pollInterval?: number; timeout?: number } = {},\n ): Promise<WebdataMap> {\n const { pollInterval = 1000, timeout = 120_000 } = options;\n const { id } = await this.create(request);\n const start = Date.now();\n while (Date.now() - start < timeout) {\n const result = await this.get({ id, environment: request.environment, projectId: request.projectId });\n if (result.status === \"completed\" || result.status === \"failed\") {\n if (result.status === \"failed\") throw new Error(result.error || \"Map failed\");\n return result;\n }\n await new Promise((r) => setTimeout(r, pollInterval));\n }\n throw new Error(\"Map timed out\");\n }\n}\n\nexport { Map$ as Map };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stack0/sdk",
3
- "version": "0.5.9",
3
+ "version": "0.5.12",
4
4
  "description": "Official Stack0 SDK for Node.js",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -36,13 +36,31 @@
36
36
  "require": "./dist/webdata/index.js",
37
37
  "import": "./dist/webdata/index.mjs"
38
38
  },
39
+ "./crawl": {
40
+ "types": "./dist/crawl/index.d.ts",
41
+ "require": "./dist/crawl/index.js",
42
+ "import": "./dist/crawl/index.mjs"
43
+ },
44
+ "./map": {
45
+ "types": "./dist/map/index.d.ts",
46
+ "require": "./dist/map/index.js",
47
+ "import": "./dist/map/index.mjs"
48
+ },
49
+ "./documents": {
50
+ "types": "./dist/documents/index.d.ts",
51
+ "require": "./dist/documents/index.js",
52
+ "import": "./dist/documents/index.mjs"
53
+ },
39
54
  "./memory": {
40
55
  "types": "./dist/memory/index.d.ts",
41
56
  "require": "./dist/memory/index.js",
42
57
  "import": "./dist/memory/index.mjs"
43
58
  }
44
59
  },
45
- "files": ["dist", "README.md"],
60
+ "files": [
61
+ "dist",
62
+ "README.md"
63
+ ],
46
64
  "keywords": [
47
65
  "stack0",
48
66
  "email",