@archipelago-js/client 0.2.0 → 0.10.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @archipelago-js/client
2
2
 
3
- Core client utilities for Archipelago islands.
3
+ Core client library for [Archipelago](https://github.com/Catchhook/archipelago-rails) — the low-level fetch, response parsing, and error handling used by `@archipelago-js/react` and available standalone.
4
4
 
5
5
  ## Install
6
6
 
@@ -8,8 +8,166 @@ Core client utilities for Archipelago islands.
8
8
  yarn add @archipelago-js/client
9
9
  ```
10
10
 
11
- ## API
11
+ ## Quick Start
12
12
 
13
- - `islandFetch(component, operation, payload, options)`
14
- - `buildIslandPayload(payload, fixedParams, overridePayload)`
15
- - `parseIslandResponse(value)`
13
+ ```ts
14
+ import { islandFetch } from "@archipelago-js/client"
15
+
16
+ const response = await islandFetch("TeamMembers", "add_member", {
17
+ team_id: 42,
18
+ email: "new@example.com"
19
+ })
20
+
21
+ if (response.status === "ok") {
22
+ console.log("Updated props:", response.props)
23
+ }
24
+ ```
25
+
26
+ ## `islandFetch(component, operation, payload?, options?)`
27
+
28
+ Sends a POST to the Archipelago Rails endpoint and returns a typed `IslandResponse`.
29
+
30
+ ```ts
31
+ const response = await islandFetch("TeamMembers", "add_member", payload, {
32
+ endpoint: "/islands", // default
33
+ fixedParams: { team_id: 42 }, // merged under payload
34
+ overridePayload: {}, // merged over payload
35
+ headers: {}, // extra request headers
36
+ signal: abortController.signal,
37
+ stream: "TeamMembers:42", // sent as X-Archipelago-Stream header
38
+ navigate: (url) => { ... }, // called on redirect responses (default: Turbo.visit or location.assign)
39
+ fetchImpl: fetch, // swap fetch for testing
40
+ onUploadProgress: (progress) => {
41
+ // progress.percentage (0-100), progress.loaded, progress.total
42
+ // automatically switches to XHR transport when provided
43
+ }
44
+ })
45
+ ```
46
+
47
+ ## Response Types
48
+
49
+ Every response is a discriminated union on `status`:
50
+
51
+ ```ts
52
+ type IslandResponse =
53
+ | { status: "ok"; props: Record<string, unknown>; version: number }
54
+ | { status: "redirect"; location: string }
55
+ | { status: "error"; errors: Record<string, string[]> }
56
+ | { status: "forbidden" }
57
+ ```
58
+
59
+ `ArchipelagoResponse` is exported as an alias for `IslandResponse`.
60
+
61
+ ### Handling responses
62
+
63
+ ```ts
64
+ switch (response.status) {
65
+ case "ok":
66
+ // response.props, response.version
67
+ break
68
+ case "redirect":
69
+ // response.location — navigation already happened via navigate()
70
+ break
71
+ case "error":
72
+ // response.errors — e.g. { email: ["can't be blank"] }
73
+ break
74
+ case "forbidden":
75
+ // no additional data
76
+ break
77
+ }
78
+ ```
79
+
80
+ ## `parseIslandResponse(value)`
81
+
82
+ Parses a raw JSON value into a typed `IslandResponse`. Throws `ArchipelagoTransportError` on invalid payloads. Used internally by `islandFetch` and useful for parsing ActionCable broadcast payloads.
83
+
84
+ ```ts
85
+ import { parseIslandResponse } from "@archipelago-js/client"
86
+
87
+ const parsed = parseIslandResponse(rawPayload)
88
+ ```
89
+
90
+ ## `buildIslandPayload(payload?, fixedParams?, overridePayload?)`
91
+
92
+ Merges three layers of params with precedence: `fixedParams` < `payload` < `overridePayload`.
93
+
94
+ ```ts
95
+ import { buildIslandPayload } from "@archipelago-js/client"
96
+
97
+ buildIslandPayload(
98
+ { email: "user@example.com" },
99
+ { team_id: 42 },
100
+ { email: "override@example.com" }
101
+ )
102
+ // => { team_id: 42, email: "override@example.com" }
103
+ ```
104
+
105
+ ## Error Handling
106
+
107
+ ### `FORM_ERROR`
108
+
109
+ A constant equal to `"_base"` — the conventional key for form-level (non-field) errors:
110
+
111
+ ```ts
112
+ import { FORM_ERROR } from "@archipelago-js/client"
113
+
114
+ if (response.status === "error" && response.errors[FORM_ERROR]) {
115
+ console.log("Form-level errors:", response.errors[FORM_ERROR])
116
+ }
117
+ ```
118
+
119
+ ### `ArchipelagoTransportError`
120
+
121
+ A typed `Error` subclass thrown when the network request fails, the response is HTML instead of JSON, or JSON parsing fails. Properties:
122
+
123
+ | Property | Type | Description |
124
+ |----------------|-----------------------|--------------------------------------|
125
+ | `message` | `string` | Human-readable error description |
126
+ | `statusCode` | `number \| undefined` | HTTP status code (if available) |
127
+ | `responseBody` | `string \| undefined` | First 500 chars of the response body |
128
+
129
+ ```ts
130
+ import { ArchipelagoTransportError } from "@archipelago-js/client"
131
+
132
+ try {
133
+ await islandFetch("TeamMembers", "add_member", payload)
134
+ } catch (error) {
135
+ if (error instanceof ArchipelagoTransportError) {
136
+ console.error("Transport failed:", error.message, error.statusCode)
137
+ }
138
+ }
139
+ ```
140
+
141
+ ## CSRF
142
+
143
+ CSRF tokens are automatically read from `<meta name="csrf-token">` and sent as `X-CSRF-Token`. The cache refreshes automatically on 422 responses (Rails CSRF rotation).
144
+
145
+ ```ts
146
+ import { getCsrfToken, refreshCsrfToken, clearCsrfCache } from "@archipelago-js/client"
147
+
148
+ getCsrfToken() // read cached or from DOM
149
+ refreshCsrfToken() // force re-read from DOM
150
+ clearCsrfCache() // clear cache (next call reads from DOM)
151
+ ```
152
+
153
+ ## API Reference
154
+
155
+ | Export | Description |
156
+ |-----------------------------|--------------------------------------------------|
157
+ | `islandFetch` | POST to island endpoint, returns typed response |
158
+ | `buildIslandPayload` | Merge fixed/payload/override params |
159
+ | `parseIslandResponse` | Parse raw JSON into typed `IslandResponse` |
160
+ | `FORM_ERROR` | `"_base"` constant for form-level errors |
161
+ | `ArchipelagoTransportError` | Typed error for network/parse failures |
162
+ | `getCsrfToken` | Read CSRF token from DOM (cached) |
163
+ | `refreshCsrfToken` | Force re-read CSRF token |
164
+ | `clearCsrfCache` | Clear CSRF token cache |
165
+ | `IslandResponse` | Union type for all response statuses |
166
+ | `ArchipelagoResponse` | Alias for `IslandResponse` |
167
+ | `IslandOkResponse` | `{ status: "ok", props, version }` |
168
+ | `IslandRedirectResponse` | `{ status: "redirect", location }` |
169
+ | `IslandErrorResponse` | `{ status: "error", errors }` |
170
+ | `IslandForbiddenResponse` | `{ status: "forbidden" }` |
171
+ | `IslandFetchOptions` | Options type for `islandFetch` |
172
+ | `IslandFetchPayload` | Payload type (`Record<string, unknown>`) |
173
+ | `UploadProgress` | `{ percentage, loaded, total }` for upload tracking |
package/dist/fetch.d.ts CHANGED
@@ -1,4 +1,9 @@
1
1
  import { IslandResponse } from "./types";
2
+ export type UploadProgress = {
3
+ percentage: number;
4
+ loaded: number;
5
+ total: number | undefined;
6
+ };
2
7
  export type IslandFetchOptions = {
3
8
  endpoint?: string;
4
9
  fixedParams?: Record<string, unknown>;
@@ -8,6 +13,7 @@ export type IslandFetchOptions = {
8
13
  fetchImpl?: typeof fetch;
9
14
  navigate?: (location: string) => void;
10
15
  stream?: string;
16
+ onUploadProgress?: (progress: UploadProgress) => void;
11
17
  };
12
18
  export type IslandFetchPayload = Record<string, unknown>;
13
19
  export declare function buildIslandPayload(payload?: IslandFetchPayload, fixedParams?: Record<string, unknown>, overridePayload?: Record<string, unknown>): Record<string, unknown>;
package/dist/fetch.js CHANGED
@@ -23,11 +23,76 @@ export function buildIslandPayload(payload = {}, fixedParams = {}, overridePaylo
23
23
  ...overridePayload
24
24
  };
25
25
  }
26
+ function xhrFetch(url, headers, body, signal, onUploadProgress) {
27
+ return new Promise((resolve, reject) => {
28
+ const xhr = new XMLHttpRequest();
29
+ xhr.open("POST", url, true);
30
+ xhr.withCredentials = true;
31
+ for (const [key, value] of Object.entries(headers)) {
32
+ xhr.setRequestHeader(key, value);
33
+ }
34
+ xhr.upload.addEventListener("progress", (event) => {
35
+ onUploadProgress({
36
+ percentage: event.lengthComputable ? Math.round((event.loaded / event.total) * 100) : 0,
37
+ loaded: event.loaded,
38
+ total: event.lengthComputable ? event.total : undefined
39
+ });
40
+ });
41
+ xhr.addEventListener("load", () => {
42
+ resolve({
43
+ status: xhr.status,
44
+ text: xhr.responseText,
45
+ getHeader: (name) => xhr.getResponseHeader(name)
46
+ });
47
+ });
48
+ xhr.addEventListener("error", () => {
49
+ reject(new ArchipelagoTransportError("Network request failed"));
50
+ });
51
+ xhr.addEventListener("abort", () => {
52
+ reject(new DOMException("The operation was aborted.", "AbortError"));
53
+ });
54
+ if (signal) {
55
+ if (signal.aborted) {
56
+ xhr.abort();
57
+ return;
58
+ }
59
+ signal.addEventListener("abort", () => xhr.abort(), { once: true });
60
+ }
61
+ xhr.send(body);
62
+ });
63
+ }
64
+ function parseResponseText(text, statusCode, navigate) {
65
+ if (text.trim().length === 0) {
66
+ return { status: "ok", props: {}, version: Date.now() };
67
+ }
68
+ if (looksLikeHtml(text)) {
69
+ throw new ArchipelagoTransportError("Received HTML instead of JSON", {
70
+ statusCode,
71
+ responseBody: text.slice(0, 500)
72
+ });
73
+ }
74
+ let parsed;
75
+ try {
76
+ parsed = JSON.parse(text);
77
+ }
78
+ catch (error) {
79
+ throw new ArchipelagoTransportError("Failed to parse JSON response", {
80
+ statusCode,
81
+ responseBody: text.slice(0, 500),
82
+ cause: error
83
+ });
84
+ }
85
+ const result = parseIslandResponse(parsed);
86
+ if (result.status === "redirect") {
87
+ navigate(result.location);
88
+ }
89
+ return result;
90
+ }
26
91
  export async function islandFetch(component, operation, payload = {}, options = {}) {
27
- const fetchImpl = options.fetchImpl ?? fetch;
28
92
  const endpoint = options.endpoint ?? "/islands";
29
93
  const mergedPayload = buildIslandPayload(payload, options.fixedParams, options.overridePayload);
30
94
  const csrfToken = getCsrfToken();
95
+ const navigate = options.navigate ?? defaultNavigate;
31
96
  const requestHeaders = {
32
97
  "content-type": "application/json",
33
98
  "x-requested-with": "XMLHttpRequest",
@@ -35,14 +100,32 @@ export async function islandFetch(component, operation, payload = {}, options =
35
100
  ...(options.stream ? { "x-archipelago-stream": options.stream } : {}),
36
101
  ...(options.headers ?? {})
37
102
  };
103
+ const url = `${endpoint}/${encodeURIComponent(component)}/${encodeURIComponent(operation)}`;
104
+ const body = JSON.stringify(mergedPayload);
105
+ if (options.onUploadProgress) {
106
+ const xhrResult = await xhrFetch(url, requestHeaders, body, options.signal, options.onUploadProgress);
107
+ if (xhrResult.status === 422) {
108
+ clearCsrfCache();
109
+ }
110
+ const contentLength = xhrResult.getHeader("content-length");
111
+ const hasBody = contentLength == null || contentLength !== "0";
112
+ if (xhrResult.status === 403 && !hasBody) {
113
+ return { status: "forbidden" };
114
+ }
115
+ if (!hasBody) {
116
+ return { status: "ok", props: {}, version: Date.now() };
117
+ }
118
+ return parseResponseText(xhrResult.text, xhrResult.status, navigate);
119
+ }
120
+ const fetchImpl = options.fetchImpl ?? fetch;
38
121
  let response;
39
122
  try {
40
- response = await fetchImpl(`${endpoint}/${encodeURIComponent(component)}/${encodeURIComponent(operation)}`, {
123
+ response = await fetchImpl(url, {
41
124
  method: "POST",
42
125
  signal: options.signal,
43
126
  credentials: "same-origin",
44
127
  headers: requestHeaders,
45
- body: JSON.stringify(mergedPayload)
128
+ body
46
129
  });
47
130
  }
48
131
  catch (error) {
@@ -67,31 +150,6 @@ export async function islandFetch(component, operation, payload = {}, options =
67
150
  cause: error
68
151
  });
69
152
  }
70
- if (text.trim().length === 0) {
71
- return { status: "ok", props: {}, version: Date.now() };
72
- }
73
- if (looksLikeHtml(text)) {
74
- throw new ArchipelagoTransportError("Received HTML instead of JSON", {
75
- statusCode: response.status,
76
- responseBody: text.slice(0, 500)
77
- });
78
- }
79
- let parsed;
80
- try {
81
- parsed = JSON.parse(text);
82
- }
83
- catch (error) {
84
- throw new ArchipelagoTransportError("Failed to parse JSON response", {
85
- statusCode: response.status,
86
- responseBody: text.slice(0, 500),
87
- cause: error
88
- });
89
- }
90
- const result = parseIslandResponse(parsed);
91
- if (result.status === "redirect") {
92
- const navigate = options.navigate ?? defaultNavigate;
93
- navigate(result.location);
94
- }
95
- return result;
153
+ return parseResponseText(text, response.status, navigate);
96
154
  }
97
155
  //# sourceMappingURL=fetch.js.map
package/dist/fetch.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrD,OAAO,EACL,yBAAyB,EAEzB,mBAAmB,EACpB,MAAM,SAAS,CAAA;AAsBhB,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,KAAK,GAAI,MAAwE,CAAC,KAAK,CAAA;IAE7F,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;QACjB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACrB,OAAM;IACR,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,QAAkB;IACpC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC5D,OAAO,aAAa,IAAI,IAAI,IAAI,aAAa,KAAK,GAAG,CAAA;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;IAChC,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;AAC/F,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,UAA8B,EAAE,EAChC,cAAuC,EAAE,EACzC,kBAA2C,EAAE;IAE7C,OAAO;QACL,GAAG,WAAW;QACd,GAAG,OAAO;QACV,GAAG,eAAe;KACnB,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CACf,GAAW,EACX,OAA+B,EAC/B,IAAY,EACZ,MAA+B,EAC/B,gBAAoD;IAEpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAA;QAChC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QAC3B,GAAG,CAAC,eAAe,GAAG,IAAI,CAAA;QAE1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAClC,CAAC;QAED,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE;YAChD,gBAAgB,CAAC;gBACf,UAAU,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvF,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aACxD,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YAChC,OAAO,CAAC;gBACN,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,YAAY;gBACtB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC;aACzD,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACjC,MAAM,CAAC,IAAI,yBAAyB,CAAC,wBAAwB,CAAC,CAAC,CAAA;QACjE,CAAC,CAAC,CAAA;QAEF,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACjC,MAAM,CAAC,IAAI,YAAY,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;QAEF,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,GAAG,CAAC,KAAK,EAAE,CAAA;gBACX,OAAM;YACR,CAAC;YACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACrE,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAChB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAY,EACZ,UAAkB,EAClB,QAAoC;IAEpC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;IACzD,CAAC;IAED,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,yBAAyB,CAAC,+BAA+B,EAAE;YACnE,UAAU;YACV,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACjC,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,yBAAyB,CAAC,+BAA+B,EAAE;YACnE,UAAU;YACV,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAChC,KAAK,EAAE,KAAK;SACb,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;IAE1C,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC3B,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,SAAiB,EACjB,UAA8B,EAAE,EAChC,UAA8B,EAAE;IAEhC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAA;IAC/C,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IAC/F,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAA;IAEpD,MAAM,cAAc,GAA2B;QAC7C,cAAc,EAAE,kBAAkB;QAClC,kBAAkB,EAAE,gBAAgB;QACpC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;KAC3B,CAAA;IAED,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,kBAAkB,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAA;IAC3F,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;IAE1C,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAErG,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7B,cAAc,EAAE,CAAA;QAClB,CAAC;QAED,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;QAC3D,MAAM,OAAO,GAAG,aAAa,IAAI,IAAI,IAAI,aAAa,KAAK,GAAG,CAAA;QAE9D,IAAI,SAAS,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;QAChC,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;QACzD,CAAC;QAED,OAAO,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACtE,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAA;IAC5C,IAAI,QAAkB,CAAA;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,WAAW,EAAE,aAAa;YAC1B,OAAO,EAAE,cAAc;YACvB,IAAI;SACL,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,yBAAyB,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IACjF,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,cAAc,EAAE,CAAA;IAClB,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;IAChC,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;IACzD,CAAC;IAED,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,yBAAyB,CAAC,8BAA8B,EAAE;YAClE,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,KAAK,EAAE,KAAK;SACb,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;AAC3D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@archipelago-js/client",
3
- "version": "0.2.0",
3
+ "version": "0.10.0",
4
4
  "description": "Core client utilities for Archipelago islands",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -28,11 +28,10 @@
28
28
  },
29
29
  "repository": {
30
30
  "type": "git",
31
- "url": "git+https://github.com/robrace/archipelago.git",
32
- "directory": "packages/client"
31
+ "url": "git+https://github.com/Catchhook/archipelago-js-client.git"
33
32
  },
34
33
  "bugs": {
35
- "url": "https://github.com/robrace/archipelago/issues"
34
+ "url": "https://github.com/Catchhook/archipelago-js-client/issues"
36
35
  },
37
- "homepage": "https://github.com/robrace/archipelago/tree/main/packages/client"
36
+ "homepage": "https://github.com/Catchhook/archipelago-js-client"
38
37
  }