@dreamboard-games/cli 0.1.30-alpha.4 → 0.1.30-alpha.40

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.
Files changed (156) hide show
  1. package/README.md +32 -113
  2. package/dist/agent-verifier/agent-workspace-verifier.mjs +2084 -57
  3. package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -1
  4. package/dist/agent-verifier/{chunk-XQXDOBYB.mjs → chunk-4I2WWAPK.mjs} +27 -10
  5. package/dist/agent-verifier/chunk-4I2WWAPK.mjs.map +1 -0
  6. package/dist/agent-verifier/{chunk-C3VW3DTA.mjs → chunk-BWBN2TDJ.mjs} +535 -633
  7. package/dist/agent-verifier/chunk-BWBN2TDJ.mjs.map +1 -0
  8. package/dist/agent-verifier/{chunk-TAEQKBJB.mjs → chunk-GWRZRWCF.mjs} +1 -1
  9. package/dist/agent-verifier/chunk-GWRZRWCF.mjs.map +1 -0
  10. package/dist/agent-verifier/chunk-HUBV22JQ.mjs +89 -0
  11. package/dist/agent-verifier/chunk-HUBV22JQ.mjs.map +1 -0
  12. package/dist/agent-verifier/{chunk-MW2QIWWA.mjs → chunk-KAA3B4DI.mjs} +215 -223
  13. package/dist/agent-verifier/chunk-KAA3B4DI.mjs.map +1 -0
  14. package/dist/agent-verifier/{chunk-27EEIZCI.mjs → chunk-KDAQ4CZY.mjs} +34 -27
  15. package/dist/agent-verifier/chunk-KDAQ4CZY.mjs.map +1 -0
  16. package/dist/agent-verifier/{chunk-IAYRNVUC.mjs → chunk-LMW66VBH.mjs} +2 -13
  17. package/dist/agent-verifier/{chunk-IAYRNVUC.mjs.map → chunk-LMW66VBH.mjs.map} +1 -1
  18. package/dist/agent-verifier/{chunk-776W3UGV.mjs → chunk-LROY5SN2.mjs} +7 -45
  19. package/dist/agent-verifier/chunk-LROY5SN2.mjs.map +1 -0
  20. package/dist/agent-verifier/{chunk-H76MT5UR.mjs → chunk-M7UVBANQ.mjs} +2 -1
  21. package/dist/agent-verifier/chunk-M7UVBANQ.mjs.map +1 -0
  22. package/dist/agent-verifier/{chunk-5NYBTZB4.mjs → chunk-MIRGCMUC.mjs} +112 -26
  23. package/dist/agent-verifier/chunk-MIRGCMUC.mjs.map +1 -0
  24. package/dist/agent-verifier/{chunk-NAK77WXW.mjs → chunk-MYMVXTZT.mjs} +4 -5
  25. package/dist/agent-verifier/chunk-MYMVXTZT.mjs.map +1 -0
  26. package/dist/agent-verifier/chunk-OJFZVGEL.mjs +492 -0
  27. package/dist/agent-verifier/chunk-OJFZVGEL.mjs.map +1 -0
  28. package/dist/agent-verifier/{chunk-XKCJBIRY.mjs → chunk-QD4SQNUP.mjs} +2 -2
  29. package/dist/agent-verifier/{chunk-QBAF7EYR.mjs → chunk-TTB7AIHZ.mjs} +4 -4
  30. package/dist/agent-verifier/{chunk-QBAF7EYR.mjs.map → chunk-TTB7AIHZ.mjs.map} +1 -1
  31. package/dist/agent-verifier/{chunk-F2DIOJJZ.mjs → chunk-XCQQIPCO.mjs} +5 -46
  32. package/dist/agent-verifier/chunk-XCQQIPCO.mjs.map +1 -0
  33. package/dist/agent-verifier/{global-config-NYCSCAUI.mjs → global-config-2NUESNEQ.mjs} +5 -5
  34. package/dist/agent-verifier/{keychain-backend-A3MRWLPF.mjs → keychain-backend-FF4I6ODB.mjs} +11 -6
  35. package/dist/agent-verifier/keychain-backend-FF4I6ODB.mjs.map +1 -0
  36. package/dist/agent-verifier/{local-files-QVJ2H3MH.mjs → local-files-OF4QFISU.mjs} +8 -8
  37. package/dist/agent-verifier/{chunk-UIOLGH4A.mjs → local-typecheck-DHVLM37Z.mjs} +4 -4
  38. package/dist/agent-verifier/local-typecheck-DHVLM37Z.mjs.map +1 -0
  39. package/dist/agent-verifier/{materialize-workspace-OZKOQCSQ.mjs → materialize-workspace-JBDL6LF4.mjs} +22 -22
  40. package/dist/agent-verifier/materialize-workspace-JBDL6LF4.mjs.map +1 -0
  41. package/dist/agent-verifier/{chunk-Z6OZWUIZ.mjs → reducer-bundle-preflight-GLUJKTWU.mjs} +75 -24
  42. package/dist/agent-verifier/reducer-bundle-preflight-GLUJKTWU.mjs.map +1 -0
  43. package/dist/agent-verifier/{chunk-YDIOW2BO.mjs → reducer-contract-preflight-WVQQPW5F.mjs} +7 -6
  44. package/dist/agent-verifier/reducer-contract-preflight-WVQQPW5F.mjs.map +1 -0
  45. package/dist/agent-verifier/{chunk-ON62IGWK.mjs → reducer-native-test-harness-XQUPIT5D.mjs} +480 -703
  46. package/dist/agent-verifier/reducer-native-test-harness-XQUPIT5D.mjs.map +1 -0
  47. package/dist/agent-verifier/static-scaffold-U5DXE23S.mjs +24 -0
  48. package/dist/agent-verifier/{workspace-codegen-WPZHMATU.mjs → workspace-codegen-SPPVHURX.mjs} +3 -3
  49. package/dist/agent-verifier/{workspace-dependencies-B6A2ZX55.mjs → workspace-dependencies-5HEEKZFP.mjs} +5 -3
  50. package/dist/authoring-compatibility-internal.js +12 -0
  51. package/dist/chunk-5IYJOVUA.js +3902 -0
  52. package/dist/chunk-5IYJOVUA.js.map +1 -0
  53. package/dist/chunk-6NYVJYN4.js +313 -0
  54. package/dist/chunk-6NYVJYN4.js.map +1 -0
  55. package/dist/chunk-EQNBQVIW.js +204 -0
  56. package/dist/chunk-EQNBQVIW.js.map +1 -0
  57. package/dist/{chunk-M4SCKH5M.js → chunk-USZAPMQ4.js} +2488 -4993
  58. package/dist/chunk-USZAPMQ4.js.map +1 -0
  59. package/dist/{global-config-YBFEGJQG.js → global-config-RBMW7IVA.js} +3 -2
  60. package/dist/index.js +3099 -6188
  61. package/dist/index.js.map +1 -1
  62. package/dist/internal.js +35 -9
  63. package/dist/internal.js.map +1 -1
  64. package/dist/{keychain-backend-JHTXAKWC.js → keychain-backend-FSNTNTZE.js} +11 -6
  65. package/dist/keychain-backend-FSNTNTZE.js.map +1 -0
  66. package/package.json +9 -19
  67. package/release/authoring-release-set.json +38 -0
  68. package/skills/dreamboard/SKILL.md +32 -30
  69. package/skills/dreamboard/references/building-your-first-game.md +16 -16
  70. package/skills/dreamboard/references/cli.md +54 -54
  71. package/skills/dreamboard/references/manifest-authoring.md +11 -3
  72. package/skills/dreamboard/references/quickstart.md +19 -16
  73. package/skills/dreamboard/references/testing.md +6 -13
  74. package/dist/agent-verifier/chunk-27EEIZCI.mjs.map +0 -1
  75. package/dist/agent-verifier/chunk-5NYBTZB4.mjs.map +0 -1
  76. package/dist/agent-verifier/chunk-776W3UGV.mjs.map +0 -1
  77. package/dist/agent-verifier/chunk-C3VW3DTA.mjs.map +0 -1
  78. package/dist/agent-verifier/chunk-F2DIOJJZ.mjs.map +0 -1
  79. package/dist/agent-verifier/chunk-G42BGGG2.mjs +0 -70
  80. package/dist/agent-verifier/chunk-G42BGGG2.mjs.map +0 -1
  81. package/dist/agent-verifier/chunk-H76MT5UR.mjs.map +0 -1
  82. package/dist/agent-verifier/chunk-IDVQXGAO.mjs +0 -222
  83. package/dist/agent-verifier/chunk-IDVQXGAO.mjs.map +0 -1
  84. package/dist/agent-verifier/chunk-JO5AMVZU.mjs +0 -1744
  85. package/dist/agent-verifier/chunk-JO5AMVZU.mjs.map +0 -1
  86. package/dist/agent-verifier/chunk-KDBSVLCF.mjs +0 -624
  87. package/dist/agent-verifier/chunk-KDBSVLCF.mjs.map +0 -1
  88. package/dist/agent-verifier/chunk-MW2QIWWA.mjs.map +0 -1
  89. package/dist/agent-verifier/chunk-NAK77WXW.mjs.map +0 -1
  90. package/dist/agent-verifier/chunk-ON62IGWK.mjs.map +0 -1
  91. package/dist/agent-verifier/chunk-QZH6IEZS.mjs +0 -39
  92. package/dist/agent-verifier/chunk-QZH6IEZS.mjs.map +0 -1
  93. package/dist/agent-verifier/chunk-TAEQKBJB.mjs.map +0 -1
  94. package/dist/agent-verifier/chunk-UIOLGH4A.mjs.map +0 -1
  95. package/dist/agent-verifier/chunk-XQXDOBYB.mjs.map +0 -1
  96. package/dist/agent-verifier/chunk-YDIOW2BO.mjs.map +0 -1
  97. package/dist/agent-verifier/chunk-Z6OZWUIZ.mjs.map +0 -1
  98. package/dist/agent-verifier/compile-576O7TYP.mjs +0 -312
  99. package/dist/agent-verifier/compile-576O7TYP.mjs.map +0 -1
  100. package/dist/agent-verifier/keychain-backend-A3MRWLPF.mjs.map +0 -1
  101. package/dist/agent-verifier/local-typecheck-2JWG5IGL.mjs +0 -10
  102. package/dist/agent-verifier/materialize-workspace-OZKOQCSQ.mjs.map +0 -1
  103. package/dist/agent-verifier/reducer-bundle-preflight-7NYZF5ZT.mjs +0 -20
  104. package/dist/agent-verifier/reducer-contract-preflight-COD2CO22.mjs +0 -11
  105. package/dist/agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs +0 -50
  106. package/dist/agent-verifier/static-scaffold-JBUE3ROP.mjs +0 -27
  107. package/dist/agent-verifier/sync-C6S3OGCD.mjs +0 -588
  108. package/dist/agent-verifier/sync-C6S3OGCD.mjs.map +0 -1
  109. package/dist/agent-verifier/test-Y5UGQV7J.mjs +0 -353
  110. package/dist/agent-verifier/test-Y5UGQV7J.mjs.map +0 -1
  111. package/dist/agent-verifier/workspace-codegen-WPZHMATU.mjs.map +0 -1
  112. package/dist/agent-verifier/workspace-dependencies-B6A2ZX55.mjs.map +0 -1
  113. package/dist/chunk-3NRROR4P.js +0 -432
  114. package/dist/chunk-3NRROR4P.js.map +0 -1
  115. package/dist/chunk-M4SCKH5M.js.map +0 -1
  116. package/dist/dev-host/components/drawer.tsx +0 -132
  117. package/dist/dev-host/components/input.tsx +0 -21
  118. package/dist/dev-host/dev-api-proxy-plugin.ts +0 -328
  119. package/dist/dev-host/dev-author-dom-warnings.ts +0 -100
  120. package/dist/dev-host/dev-diagnostics.ts +0 -62
  121. package/dist/dev-host/dev-fallback-stylesheet.ts +0 -53
  122. package/dist/dev-host/dev-hmr-guard-plugin.ts +0 -47
  123. package/dist/dev-host/dev-host-controller.ts +0 -674
  124. package/dist/dev-host/dev-host-player-query.ts +0 -17
  125. package/dist/dev-host/dev-host-session-transport.ts +0 -52
  126. package/dist/dev-host/dev-host-storage.ts +0 -56
  127. package/dist/dev-host/dev-log-relay-plugin.ts +0 -510
  128. package/dist/dev-host/dev-runtime-config.ts +0 -14
  129. package/dist/dev-host/dev-runtime-platform.ts +0 -335
  130. package/dist/dev-host/dev-virtual-modules-plugin.ts +0 -64
  131. package/dist/dev-host/host-main.css +0 -224
  132. package/dist/dev-host/host-main.tsx +0 -948
  133. package/dist/dev-host/index.html +0 -56
  134. package/dist/dev-host/lib/utils.ts +0 -6
  135. package/dist/dev-host/plugin-main.ts +0 -61
  136. package/dist/dev-host/plugin.html +0 -24
  137. package/dist/dev-host/shared-styles.css +0 -144
  138. package/dist/dev-host/start-dev-server.ts +0 -140
  139. package/dist/dev-host/virtual-modules.d.ts +0 -27
  140. package/dist/global-config-YBFEGJQG.js.map +0 -1
  141. package/dist/keychain-backend-JHTXAKWC.js.map +0 -1
  142. package/skills/dreamboard/scripts/events-extract.mjs +0 -218
  143. /package/dist/agent-verifier/{chunk-XKCJBIRY.mjs.map → chunk-QD4SQNUP.mjs.map} +0 -0
  144. /package/dist/agent-verifier/{global-config-NYCSCAUI.mjs.map → global-config-2NUESNEQ.mjs.map} +0 -0
  145. /package/dist/agent-verifier/{local-files-QVJ2H3MH.mjs.map → local-files-OF4QFISU.mjs.map} +0 -0
  146. /package/dist/agent-verifier/{local-typecheck-2JWG5IGL.mjs.map → static-scaffold-U5DXE23S.mjs.map} +0 -0
  147. /package/dist/agent-verifier/{reducer-bundle-preflight-7NYZF5ZT.mjs.map → workspace-codegen-SPPVHURX.mjs.map} +0 -0
  148. /package/dist/agent-verifier/{reducer-contract-preflight-COD2CO22.mjs.map → workspace-dependencies-5HEEKZFP.mjs.map} +0 -0
  149. /package/dist/{agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs.map → authoring-compatibility-internal.js.map} +0 -0
  150. /package/dist/{agent-verifier/static-scaffold-JBUE3ROP.mjs.map → global-config-RBMW7IVA.js.map} +0 -0
  151. /package/{dist/scaffold → scaffold}/assets/static/app/tsconfig.framework.json +0 -0
  152. /package/{dist/scaffold → scaffold}/assets/static/app/tsconfig.json +0 -0
  153. /package/{dist/scaffold → scaffold}/assets/static/ui/index.tsx +0 -0
  154. /package/{dist/scaffold → scaffold}/assets/static/ui/style.css +0 -0
  155. /package/{dist/scaffold → scaffold}/assets/static/ui/tsconfig.framework.json +0 -0
  156. /package/{dist/scaffold → scaffold}/assets/static/ui/tsconfig.json +0 -0
@@ -2,14 +2,14 @@
2
2
  import {
3
3
  atomicWriteFile,
4
4
  withFileLock
5
- } from "./chunk-TAEQKBJB.mjs";
5
+ } from "./chunk-GWRZRWCF.mjs";
6
6
  import {
7
7
  ensureDir,
8
8
  readJsonFile
9
- } from "./chunk-IAYRNVUC.mjs";
9
+ } from "./chunk-LMW66VBH.mjs";
10
10
  import {
11
11
  PROJECT_DIR_NAME
12
- } from "./chunk-H76MT5UR.mjs";
12
+ } from "./chunk-M7UVBANQ.mjs";
13
13
 
14
14
  // src/config/global-config.ts
15
15
  import os2 from "os";
@@ -19,12 +19,36 @@ import path2 from "path";
19
19
  import os from "os";
20
20
  import path from "path";
21
21
  import { promises as fs } from "fs";
22
+ var credentialDirectoryOverrideForTests = null;
23
+ function getCredentialDirectory() {
24
+ return credentialDirectoryOverrideForTests ?? path.join(os.homedir(), PROJECT_DIR_NAME);
25
+ }
22
26
  function getCredentialFilePath() {
23
- return path.join(os.homedir(), PROJECT_DIR_NAME, "auth.json");
27
+ return path.join(getCredentialDirectory(), "auth.json");
28
+ }
29
+ function getCredentialAuditLogPath() {
30
+ return path.join(getCredentialDirectory(), "auth-events.log");
24
31
  }
25
32
  function getCredentialLockPath() {
26
33
  return `${getCredentialFilePath()}.lock`;
27
34
  }
35
+ async function appendCredentialAuditEvent(event) {
36
+ try {
37
+ const logPath = getCredentialAuditLogPath();
38
+ await fs.mkdir(path.dirname(logPath), { recursive: true, mode: 448 });
39
+ await fs.appendFile(
40
+ logPath,
41
+ `${JSON.stringify({
42
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
43
+ pid: process.pid,
44
+ ...event
45
+ })}
46
+ `,
47
+ { mode: 384 }
48
+ );
49
+ } catch {
50
+ }
51
+ }
28
52
  async function fileRead() {
29
53
  const filePath = getCredentialFilePath();
30
54
  let data;
@@ -43,13 +67,15 @@ async function fileRead() {
43
67
  } catch {
44
68
  return null;
45
69
  }
46
- const accessToken = parsed.accessToken ?? parsed.authToken;
70
+ const accessToken = parsed.clerkAccessToken ?? parsed.accessToken ?? parsed.authToken;
47
71
  const refreshToken = parsed.refreshToken;
48
72
  if (!accessToken && !refreshToken) return null;
49
73
  return {
50
74
  accessToken: accessToken || void 0,
51
75
  refreshToken: refreshToken || void 0,
52
- tokenExpiresAt: parsed.tokenExpiresAt || void 0,
76
+ tokenExpiresAt: parsed.clerkAccessExpiresAt || parsed.tokenExpiresAt || void 0,
77
+ dreamboardApiToken: parsed.dreamboardApiToken || void 0,
78
+ dreamboardApiExpiresAt: parsed.dreamboardApiExpiresAt || void 0,
53
79
  clerkOAuthIssuer: parsed.clerkOAuthIssuer || void 0,
54
80
  clerkOAuthClientId: parsed.clerkOAuthClientId || void 0,
55
81
  clerkOAuthTokenUrl: parsed.clerkOAuthTokenUrl || void 0,
@@ -71,9 +97,11 @@ async function fileWriteFull(creds) {
71
97
  );
72
98
  }
73
99
  await writeFilePayload({
74
- authToken: creds.accessToken,
100
+ clerkAccessToken: creds.accessToken,
75
101
  refreshToken: creds.refreshToken,
76
- tokenExpiresAt: creds.tokenExpiresAt,
102
+ clerkAccessExpiresAt: creds.tokenExpiresAt,
103
+ dreamboardApiToken: creds.dreamboardApiToken,
104
+ dreamboardApiExpiresAt: creds.dreamboardApiExpiresAt,
77
105
  clerkOAuthIssuer: creds.clerkOAuthIssuer,
78
106
  clerkOAuthClientId: creds.clerkOAuthClientId,
79
107
  clerkOAuthTokenUrl: creds.clerkOAuthTokenUrl,
@@ -86,12 +114,27 @@ async function fileWriteAccessOnly(accessToken) {
86
114
  }
87
115
  await writeFilePayload({ authToken: accessToken });
88
116
  }
89
- async function fileClear() {
117
+ async function fileClear(reason = "credential_store_clear") {
90
118
  const filePath = getCredentialFilePath();
91
119
  try {
92
120
  await fs.unlink(filePath);
121
+ await appendCredentialAuditEvent({
122
+ event: "auth_file_deleted",
123
+ reason,
124
+ authPath: filePath,
125
+ backend: "file"
126
+ });
93
127
  } catch (err) {
94
- if (err.code !== "ENOENT") throw err;
128
+ if (err.code === "ENOENT") {
129
+ await appendCredentialAuditEvent({
130
+ event: "auth_file_delete_missing",
131
+ reason,
132
+ authPath: filePath,
133
+ backend: "file"
134
+ });
135
+ return;
136
+ }
137
+ throw err;
95
138
  }
96
139
  }
97
140
  var fileCredentialBackend = {
@@ -101,6 +144,13 @@ var fileCredentialBackend = {
101
144
  writeAccessOnly: fileWriteAccessOnly,
102
145
  clear: fileClear
103
146
  };
147
+ var CredentialStoreUnavailableError = class extends Error {
148
+ code = "CREDENTIAL_STORE_UNAVAILABLE";
149
+ constructor(reason) {
150
+ super(`Credential store unavailable: ${reason}`);
151
+ this.name = "CredentialStoreUnavailableError";
152
+ }
153
+ };
104
154
  var cachedBackend = null;
105
155
  var migrationCompleted = false;
106
156
  var backendResolver = defaultBackendResolver;
@@ -118,7 +168,7 @@ async function defaultBackendResolver() {
118
168
  if (!useKeychain) {
119
169
  return fileCredentialBackend;
120
170
  }
121
- const { tryKeychainBackend } = await import("./keychain-backend-A3MRWLPF.mjs");
171
+ const { tryKeychainBackend } = await import("./keychain-backend-FF4I6ODB.mjs");
122
172
  const keychain = await tryKeychainBackend();
123
173
  if (keychain.available) {
124
174
  return keychain.backend;
@@ -127,7 +177,7 @@ async function defaultBackendResolver() {
127
177
  }
128
178
  async function readCredentialBackendPreference() {
129
179
  try {
130
- const { loadGlobalConfig: loadGlobalConfig2 } = await import("./global-config-NYCSCAUI.mjs");
180
+ const { loadGlobalConfig: loadGlobalConfig2 } = await import("./global-config-2NUESNEQ.mjs");
131
181
  const config = await loadGlobalConfig2();
132
182
  return config.credentialBackend === "keychain";
133
183
  } catch {
@@ -144,7 +194,7 @@ async function getCredentialBackend() {
144
194
  }
145
195
  return cachedBackend;
146
196
  }
147
- async function migrateFromFileBackendIfNeeded(target) {
197
+ async function migrateFromFileBackendIfNeeded(target, options = {}) {
148
198
  try {
149
199
  const [onDisk, onTarget] = await Promise.all([
150
200
  fileCredentialBackend.read(),
@@ -152,32 +202,68 @@ async function migrateFromFileBackendIfNeeded(target) {
152
202
  ]);
153
203
  if (!onDisk) return;
154
204
  if (onTarget) {
155
- await fileCredentialBackend.clear();
156
205
  return;
157
206
  }
158
207
  if (onDisk.accessToken && onDisk.refreshToken) {
159
- await target.writeFull({
208
+ const migrated = {
160
209
  accessToken: onDisk.accessToken,
161
- refreshToken: onDisk.refreshToken
162
- });
210
+ refreshToken: onDisk.refreshToken,
211
+ tokenExpiresAt: onDisk.tokenExpiresAt,
212
+ dreamboardApiToken: onDisk.dreamboardApiToken,
213
+ dreamboardApiExpiresAt: onDisk.dreamboardApiExpiresAt,
214
+ clerkOAuthIssuer: onDisk.clerkOAuthIssuer,
215
+ clerkOAuthClientId: onDisk.clerkOAuthClientId,
216
+ clerkOAuthTokenUrl: onDisk.clerkOAuthTokenUrl,
217
+ environment: onDisk.environment
218
+ };
219
+ await target.writeFull(migrated);
220
+ await verifyMigratedSession(target, migrated);
163
221
  } else if (onDisk.accessToken) {
164
222
  await target.writeAccessOnly(onDisk.accessToken);
223
+ const migrated = await target.read();
224
+ if (migrated?.accessToken !== onDisk.accessToken) {
225
+ throw new Error("Credential migration verification failed.");
226
+ }
165
227
  } else {
166
228
  return;
167
229
  }
168
- await fileCredentialBackend.clear();
169
- } catch {
230
+ } catch (error) {
231
+ if (options.failClosed) {
232
+ throw new CredentialStoreUnavailableError(
233
+ error instanceof Error ? error.message : String(error)
234
+ );
235
+ }
236
+ }
237
+ }
238
+ async function verifyMigratedSession(target, expected) {
239
+ const migrated = await target.read();
240
+ if (migrated?.accessToken !== expected.accessToken || migrated.refreshToken !== expected.refreshToken) {
241
+ throw new Error("Credential migration verification failed.");
170
242
  }
171
243
  }
172
244
  async function getStoredSession() {
245
+ if (process.env.DREAMBOARD_AGENT_TOKEN?.trim()) {
246
+ return null;
247
+ }
173
248
  const backend = await getCredentialBackend();
174
249
  return backend.read();
175
250
  }
176
- async function setCredentials(creds) {
177
- await withFileLock(getCredentialLockPath(), async () => {
178
- const backend = await getCredentialBackend();
179
- await backend.writeFull(creds);
180
- });
251
+ async function withCredentialLock(fn, options) {
252
+ return withFileLock(
253
+ getCredentialLockPath(),
254
+ async () => {
255
+ const backend = await getCredentialBackend();
256
+ const ops = {
257
+ backendName: backend.name,
258
+ read: () => backend.read(),
259
+ writeFull: (creds) => backend.writeFull(creds),
260
+ writeAccessOnly: (accessToken) => backend.writeAccessOnly(accessToken),
261
+ clear: (reason) => backend.clear(reason)
262
+ };
263
+ return fn(ops);
264
+ },
265
+ options
266
+ );
181
267
  }
182
268
 
183
269
  // src/config/global-config.ts
@@ -217,10 +303,10 @@ async function saveGlobalConfig(config) {
217
303
 
218
304
  export {
219
305
  getStoredSession,
220
- setCredentials,
306
+ withCredentialLock,
221
307
  getGlobalConfigPath,
222
308
  getGlobalAuthPath,
223
309
  loadGlobalConfig,
224
310
  saveGlobalConfig
225
311
  };
226
- //# sourceMappingURL=chunk-5NYBTZB4.mjs.map
312
+ //# sourceMappingURL=chunk-MIRGCMUC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/global-config.ts","../../src/config/credential-store.ts"],"sourcesContent":["import os from \"node:os\";\nimport path from \"node:path\";\nimport type { CredentialBackendPreference, GlobalConfig } from \"../types.js\";\nimport { PROJECT_DIR_NAME } from \"../constants.js\";\nimport { ensureDir, readJsonFile } from \"../utils/fs.js\";\nimport { atomicWriteFile } from \"../utils/atomic-file.js\";\nimport { getCredentialFilePath } from \"./credential-store.js\";\n\nfunction normalizeCredentialBackend(\n value: unknown,\n): CredentialBackendPreference | undefined {\n if (value === \"file\" || value === \"keychain\") return value;\n // Tolerate unknown / malformed values rather than refusing to load the\n // whole config - an unrecognised backend name should degrade to \"use\n // the default\" instead of locking the user out of their CLI.\n return undefined;\n}\n\nexport function getGlobalConfigPath(): string {\n return path.join(os.homedir(), PROJECT_DIR_NAME, \"config.json\");\n}\n\n/**\n * Path to the on-disk credential file used by the file backend of\n * `CredentialStore`. Re-exported here to avoid circular / ad-hoc imports\n * in UI surface (`auth status`, `config show`, etc).\n */\nexport function getGlobalAuthPath(): string {\n return getCredentialFilePath();\n}\n\n/**\n * Load non-credential CLI configuration.\n *\n * Note: this function used to also load `authToken` / `refreshToken`\n * from `auth.json` and flatten them onto `GlobalConfig`. That shape\n * enabled the refresh-token-wipe bug: `saveGlobalConfig({ ...config })`\n * without explicit auth fields erased the stored refresh token.\n *\n * Credentials are now owned exclusively by `CredentialStore`. Callers\n * that need them must import `getCredentials()` directly.\n */\nexport async function loadGlobalConfig(): Promise<GlobalConfig> {\n const config = await readJsonFile<GlobalConfig>(getGlobalConfigPath()).catch(\n () => ({}) as GlobalConfig,\n );\n return {\n environment: config.environment,\n credentialBackend: normalizeCredentialBackend(config.credentialBackend),\n };\n}\n\n/**\n * Persist non-credential CLI configuration.\n *\n * This function cannot write credentials, by construction: the\n * `GlobalConfig` type has no credential fields. Credentials must be\n * persisted through the user session manager.\n */\nexport async function saveGlobalConfig(config: GlobalConfig): Promise<void> {\n const configDir = path.join(os.homedir(), PROJECT_DIR_NAME);\n await ensureDir(configDir);\n const normalized: GlobalConfig = {\n environment: config.environment,\n credentialBackend: normalizeCredentialBackend(config.credentialBackend),\n };\n await atomicWriteFile(\n getGlobalConfigPath(),\n `${JSON.stringify(normalized, null, 2)}\\n`,\n { mode: 0o600 },\n );\n}\n","/**\n * Single writer for the long-lived Dreamboard session credentials.\n *\n * Design invariants (enforced at the type level and tested in\n * `credential-store.test.ts`):\n *\n * 1. This module is the ONLY place in the CLI that writes credentials to\n * disk or the OS keychain. `global-config.ts` used to own both the\n * config and the credentials via `saveGlobalConfig`, which made it\n * trivial to wipe a refresh token by accident. The `GlobalConfig` type\n * no longer carries credentials, so attempting to persist one through\n * the config path is a type error.\n *\n * 2. Product credential mutations are owned by `user-session-manager.ts`.\n * This module exposes the locked backend operations it needs, but no\n * command-level write helpers. `Credentials` requires both the Clerk\n * access and refresh tokens, while derived Dreamboard audience tokens are\n * optional caches.\n *\n * 3. Writes go through `atomicWriteFile` + `withFileLock`, so a crash or\n * interrupt during CLI writes cannot leave `auth.json`\n * truncated, and parallel CLI invocations cannot clobber each other's\n * rotated refresh tokens.\n *\n * 4. The on-disk JSON shape for the file backend is kept backward\n * compatible: we continue to read/write `authToken` + `refreshToken`\n * so existing users are not forced to log in again after this change.\n * A newer `accessToken` key is also accepted for read to ease any\n * future format bump.\n *\n * 5. All builds default to the file backend. The OS keychain is an explicit\n * opt-in through config or `DREAMBOARD_CREDENTIAL_BACKEND=keychain`.\n */\n\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { promises as fs } from \"node:fs\";\nimport { PROJECT_DIR_NAME } from \"../constants.js\";\nimport {\n atomicWriteFile,\n withFileLock,\n type FileLockOptions,\n} from \"../utils/atomic-file.js\";\n\n/**\n * Fully refreshable session. `accessToken` is the Clerk OAuth bootstrap token\n * retained for refresh/exchange compatibility; ordinary API calls use\n * `dreamboardApiToken`.\n */\nexport type Credentials = {\n readonly accessToken: string;\n readonly refreshToken: string;\n readonly tokenExpiresAt?: string;\n readonly dreamboardApiToken?: string;\n readonly dreamboardApiExpiresAt?: string;\n readonly clerkOAuthIssuer?: string;\n readonly clerkOAuthClientId?: string;\n readonly clerkOAuthTokenUrl?: string;\n readonly environment?: string;\n};\n\n/**\n * Raw on-disk snapshot. Either or both fields may be present. The refresh\n * coordinator only acts on snapshots that have both tokens populated.\n */\nexport type StoredSessionSnapshot = {\n readonly accessToken?: string;\n readonly refreshToken?: string;\n readonly tokenExpiresAt?: string;\n readonly dreamboardApiToken?: string;\n readonly dreamboardApiExpiresAt?: string;\n readonly clerkOAuthIssuer?: string;\n readonly clerkOAuthClientId?: string;\n readonly clerkOAuthTokenUrl?: string;\n readonly environment?: string;\n};\n\nexport type CredentialBackendName = \"file\" | \"keychain\";\n\nexport type CredentialBackend = {\n readonly name: CredentialBackendName;\n read(): Promise<StoredSessionSnapshot | null>;\n writeFull(creds: Credentials): Promise<void>;\n writeAccessOnly(accessToken: string): Promise<void>;\n clear(reason?: CredentialClearReason): Promise<void>;\n};\n\nexport type CredentialLockOps = {\n readonly backendName: CredentialBackendName;\n read(): Promise<StoredSessionSnapshot | null>;\n writeFull(creds: Credentials): Promise<void>;\n writeAccessOnly(accessToken: string): Promise<void>;\n clear(reason?: CredentialClearReason): Promise<void>;\n};\n\nexport type CredentialClearReason =\n | \"auth_clear_command\"\n | \"logout_command\"\n | \"credential_store_clear\";\n\ntype DiskShape = Partial<{\n clerkAccessToken: string;\n clerkAccessExpiresAt: string;\n accessToken: string;\n authToken: string;\n refreshToken: string;\n tokenExpiresAt: string;\n dreamboardApiToken: string;\n dreamboardApiExpiresAt: string;\n clerkOAuthIssuer: string;\n clerkOAuthClientId: string;\n clerkOAuthTokenUrl: string;\n environment: string;\n}>;\n\nlet credentialDirectoryOverrideForTests: string | null = null;\n\nfunction getCredentialDirectory(): string {\n return (\n credentialDirectoryOverrideForTests ??\n path.join(os.homedir(), PROJECT_DIR_NAME)\n );\n}\n\nexport function getCredentialFilePath(): string {\n return path.join(getCredentialDirectory(), \"auth.json\");\n}\n\nexport function getCredentialAuditLogPath(): string {\n return path.join(getCredentialDirectory(), \"auth-events.log\");\n}\n\nfunction getCredentialLockPath(): string {\n return `${getCredentialFilePath()}.lock`;\n}\n\nasync function appendCredentialAuditEvent(event: {\n readonly event: \"auth_file_deleted\" | \"auth_file_delete_missing\";\n readonly reason: CredentialClearReason;\n readonly authPath: string;\n readonly backend: CredentialBackendName;\n}): Promise<void> {\n try {\n const logPath = getCredentialAuditLogPath();\n await fs.mkdir(path.dirname(logPath), { recursive: true, mode: 0o700 });\n await fs.appendFile(\n logPath,\n `${JSON.stringify({\n timestamp: new Date().toISOString(),\n pid: process.pid,\n ...event,\n })}\\n`,\n { mode: 0o600 },\n );\n } catch {\n // Credential clearing must not fail because local diagnostic logging failed.\n }\n}\n\nasync function fileRead(): Promise<StoredSessionSnapshot | null> {\n const filePath = getCredentialFilePath();\n let data: string;\n try {\n data = await fs.readFile(filePath, \"utf8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw err;\n }\n if (data.trim().length === 0) {\n return null;\n }\n let parsed: DiskShape;\n try {\n parsed = JSON.parse(data) as DiskShape;\n } catch {\n return null;\n }\n const accessToken =\n parsed.clerkAccessToken ?? parsed.accessToken ?? parsed.authToken;\n const refreshToken = parsed.refreshToken;\n if (!accessToken && !refreshToken) return null;\n return {\n accessToken: accessToken || undefined,\n refreshToken: refreshToken || undefined,\n tokenExpiresAt:\n parsed.clerkAccessExpiresAt || parsed.tokenExpiresAt || undefined,\n dreamboardApiToken: parsed.dreamboardApiToken || undefined,\n dreamboardApiExpiresAt: parsed.dreamboardApiExpiresAt || undefined,\n clerkOAuthIssuer: parsed.clerkOAuthIssuer || undefined,\n clerkOAuthClientId: parsed.clerkOAuthClientId || undefined,\n clerkOAuthTokenUrl: parsed.clerkOAuthTokenUrl || undefined,\n environment: parsed.environment || undefined,\n };\n}\n\nasync function writeFilePayload(payload: DiskShape): Promise<void> {\n await atomicWriteFile(\n getCredentialFilePath(),\n `${JSON.stringify(payload, null, 2)}\\n`,\n { mode: 0o600 },\n );\n}\n\nasync function fileWriteFull(creds: Credentials): Promise<void> {\n if (!creds.accessToken || !creds.refreshToken) {\n throw new Error(\n \"Refusing to persist credentials with an empty accessToken or refreshToken.\",\n );\n }\n await writeFilePayload({\n clerkAccessToken: creds.accessToken,\n refreshToken: creds.refreshToken,\n clerkAccessExpiresAt: creds.tokenExpiresAt,\n dreamboardApiToken: creds.dreamboardApiToken,\n dreamboardApiExpiresAt: creds.dreamboardApiExpiresAt,\n clerkOAuthIssuer: creds.clerkOAuthIssuer,\n clerkOAuthClientId: creds.clerkOAuthClientId,\n clerkOAuthTokenUrl: creds.clerkOAuthTokenUrl,\n environment: creds.environment,\n });\n}\n\nasync function fileWriteAccessOnly(accessToken: string): Promise<void> {\n if (!accessToken) {\n throw new Error(\"Refusing to persist an empty access token.\");\n }\n await writeFilePayload({ authToken: accessToken });\n}\n\nasync function fileClear(\n reason: CredentialClearReason = \"credential_store_clear\",\n): Promise<void> {\n const filePath = getCredentialFilePath();\n try {\n await fs.unlink(filePath);\n await appendCredentialAuditEvent({\n event: \"auth_file_deleted\",\n reason,\n authPath: filePath,\n backend: \"file\",\n });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n await appendCredentialAuditEvent({\n event: \"auth_file_delete_missing\",\n reason,\n authPath: filePath,\n backend: \"file\",\n });\n return;\n }\n throw err;\n }\n}\n\nexport const fileCredentialBackend: CredentialBackend = {\n name: \"file\",\n read: fileRead,\n writeFull: fileWriteFull,\n writeAccessOnly: fileWriteAccessOnly,\n clear: fileClear,\n};\n\nexport type BackendResolver = () =>\n | CredentialBackend\n | Promise<CredentialBackend>;\n\nexport class CredentialStoreUnavailableError extends Error {\n readonly code = \"CREDENTIAL_STORE_UNAVAILABLE\";\n\n constructor(reason: string) {\n super(`Credential store unavailable: ${reason}`);\n this.name = \"CredentialStoreUnavailableError\";\n }\n}\n\nlet cachedBackend: CredentialBackend | null = null;\nlet migrationCompleted = false;\nlet backendResolver: BackendResolver = defaultBackendResolver;\n\n/**\n * Resolver precedence for all builds:\n *\n * 1. `DREAMBOARD_CREDENTIAL_BACKEND` env var (debugging / CI override).\n * - \"file\" -> force file\n * - \"keychain\" -> force keychain (falls back to file if the native\n * module or the OS keyring is unavailable)\n * - \"auto\" -> same as unset (use config)\n * - unknown -> throw so typos fail loud\n * 2. `credentialBackend` in `~/.dreamboard/config.json`.\n * - \"keychain\" -> opt in to the OS keychain (with file fallback)\n * - \"file\" / unset / malformed -> file\n * 3. Default: file backend.\n *\n * Keychain is opt-in because on macOS the OS login-keychain prompts for\n * the user's password the first time a new binary tries to write to an\n * item, and re-prompts whenever the Node binary signature changes. We\n * would rather ship a zero-prompt default and let users who care about\n * encrypted-at-rest storage enable it.\n *\n * The resolver is async because the keychain probe requires a dynamic\n * `@napi-rs/keyring` import.\n */\nasync function defaultBackendResolver(): Promise<CredentialBackend> {\n const override = (process.env.DREAMBOARD_CREDENTIAL_BACKEND ?? \"\")\n .trim()\n .toLowerCase();\n if (override === \"file\") {\n return fileCredentialBackend;\n }\n if (override && override !== \"keychain\" && override !== \"auto\") {\n // Fail loud on typos rather than silently falling back: this env\n // var exists specifically for users who are debugging auth issues\n // and need to know their override took effect.\n throw new Error(\n `Unknown DREAMBOARD_CREDENTIAL_BACKEND value \"${override}\" (expected \"file\", \"keychain\", or \"auto\").`,\n );\n }\n\n const useKeychain =\n override === \"keychain\" || (await readCredentialBackendPreference());\n if (!useKeychain) {\n return fileCredentialBackend;\n }\n\n const { tryKeychainBackend } = await import(\"./keychain-backend.js\");\n const keychain = await tryKeychainBackend();\n if (keychain.available) {\n return keychain.backend;\n }\n // The user explicitly asked for keychain but the platform can't\n // provide one (no libsecret on Linux, missing native module, etc).\n // Silently degrade to the file backend so the CLI stays usable; the\n // active backend is still visible through `dreamboard auth status`.\n return fileCredentialBackend;\n}\n\nasync function readCredentialBackendPreference(): Promise<boolean> {\n try {\n // Dynamic import to avoid a top-level cycle with `global-config.ts`\n // (which imports `getCredentialFilePath` from this module). Using\n // the async path keeps the cycle purely lazy.\n const { loadGlobalConfig } = await import(\"./global-config.js\");\n const config = await loadGlobalConfig();\n return config.credentialBackend === \"keychain\";\n } catch {\n // If the config file is unreadable or the dynamic import fails\n // (e.g. during early bootstrap), fall back to the file-backed\n // default rather than crashing credential lookups.\n return false;\n }\n}\n\n/**\n * Override which backend is used. Tests use this to inject in-memory\n * backends; production code uses the file-default resolver.\n */\nexport function setCredentialBackendResolver(resolver: BackendResolver): void {\n backendResolver = resolver;\n cachedBackend = null;\n migrationCompleted = false;\n}\n\nexport async function getCredentialBackend(): Promise<CredentialBackend> {\n if (cachedBackend === null) {\n cachedBackend = await backendResolver();\n // One-time migration: if we resolved to a non-file backend and\n // `auth.json` still has credentials from the old layout, copy them\n // over. The file is intentionally left in place; implicit backend\n // migration must not make a working CLI session appear to vanish from\n // the default file-backed view.\n if (!migrationCompleted && cachedBackend.name !== \"file\") {\n await migrateFromFileBackendIfNeeded(cachedBackend);\n }\n migrationCompleted = true;\n }\n return cachedBackend;\n}\n\nasync function migrateFromFileBackendIfNeeded(\n target: CredentialBackend,\n options: { failClosed?: boolean } = {},\n): Promise<void> {\n try {\n const [onDisk, onTarget] = await Promise.all([\n fileCredentialBackend.read(),\n target.read(),\n ]);\n if (!onDisk) return;\n if (onTarget) {\n // Target already has a session - the user has already migrated. Leave the\n // file copy alone so a transient keychain override/probe cannot remove\n // the visible file-backed session.\n return;\n }\n if (onDisk.accessToken && onDisk.refreshToken) {\n const migrated: Credentials = {\n accessToken: onDisk.accessToken,\n refreshToken: onDisk.refreshToken,\n tokenExpiresAt: onDisk.tokenExpiresAt,\n dreamboardApiToken: onDisk.dreamboardApiToken,\n dreamboardApiExpiresAt: onDisk.dreamboardApiExpiresAt,\n clerkOAuthIssuer: onDisk.clerkOAuthIssuer,\n clerkOAuthClientId: onDisk.clerkOAuthClientId,\n clerkOAuthTokenUrl: onDisk.clerkOAuthTokenUrl,\n environment: onDisk.environment,\n };\n await target.writeFull(migrated);\n await verifyMigratedSession(target, migrated);\n } else if (onDisk.accessToken) {\n await target.writeAccessOnly(onDisk.accessToken);\n const migrated = await target.read();\n if (migrated?.accessToken !== onDisk.accessToken) {\n throw new Error(\"Credential migration verification failed.\");\n }\n } else {\n return;\n }\n } catch (error) {\n if (options.failClosed) {\n throw new CredentialStoreUnavailableError(\n error instanceof Error ? error.message : String(error),\n );\n }\n // Migration is best-effort. A failure here should not block CLI\n // operation; on next run the file backend is still consulted\n // directly because the keychain backend's `read` returns null and\n // callers fall through to \"missing session\" → login prompt.\n }\n}\n\nasync function verifyMigratedSession(\n target: CredentialBackend,\n expected: Credentials,\n): Promise<void> {\n const migrated = await target.read();\n if (\n migrated?.accessToken !== expected.accessToken ||\n migrated.refreshToken !== expected.refreshToken\n ) {\n throw new Error(\"Credential migration verification failed.\");\n }\n}\n\nexport async function getActiveCredentialBackendName(): Promise<CredentialBackendName> {\n const backend = await getCredentialBackend();\n return backend.name;\n}\n\n/** Loose read: returns whatever is on disk, including access-only sessions. */\nexport async function getStoredSession(): Promise<StoredSessionSnapshot | null> {\n if (process.env.DREAMBOARD_AGENT_TOKEN?.trim()) {\n return null;\n }\n const backend = await getCredentialBackend();\n return backend.read();\n}\n\n/** Strict read: returns a refreshable pair, or null if either token is missing. */\nexport async function getCredentials(): Promise<Credentials | null> {\n const snapshot = await getStoredSession();\n if (!snapshot) return null;\n const { accessToken, refreshToken } = snapshot;\n if (!accessToken || !refreshToken) return null;\n return {\n accessToken,\n refreshToken,\n tokenExpiresAt: snapshot.tokenExpiresAt,\n dreamboardApiToken: snapshot.dreamboardApiToken,\n dreamboardApiExpiresAt: snapshot.dreamboardApiExpiresAt,\n clerkOAuthIssuer: snapshot.clerkOAuthIssuer,\n clerkOAuthClientId: snapshot.clerkOAuthClientId,\n clerkOAuthTokenUrl: snapshot.clerkOAuthTokenUrl,\n environment: snapshot.environment,\n };\n}\n\n/**\n * Run `fn` while holding the cross-process credential lock. `fn` receives\n * an ops handle that reads/writes the active backend without re-acquiring\n * the lock (avoiding deadlock).\n *\n * This is the only correct way to perform a read-modify-write on stored\n * credentials (e.g. CLI refresh rotation) in the presence of\n * concurrent CLI invocations.\n */\nexport async function withCredentialLock<T>(\n fn: (ops: CredentialLockOps) => Promise<T>,\n options?: FileLockOptions,\n): Promise<T> {\n return withFileLock(\n getCredentialLockPath(),\n async () => {\n const backend = await getCredentialBackend();\n const ops: CredentialLockOps = {\n backendName: backend.name,\n read: () => backend.read(),\n writeFull: (creds) => backend.writeFull(creds),\n writeAccessOnly: (accessToken) => backend.writeAccessOnly(accessToken),\n clear: (reason) => backend.clear(reason),\n };\n return fn(ops);\n },\n options,\n );\n}\n\n/** Test-only reset of module state. Not exported through the barrel. */\nexport function _resetCredentialStoreForTests(): void {\n cachedBackend = null;\n migrationCompleted = false;\n backendResolver = defaultBackendResolver;\n credentialDirectoryOverrideForTests = null;\n}\n\n/** Test-only override of the credential directory. Not exported through the barrel. */\nexport function _setCredentialDirectoryForTests(\n directory: string | null,\n): void {\n credentialDirectoryOverrideForTests = directory;\n cachedBackend = null;\n migrationCompleted = false;\n}\n"],"mappings":"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","names":["os","path","loadGlobalConfig","path","os"]}
@@ -63,8 +63,7 @@ var createSseClient = ({ onRequest, onSseError, onSseEvent, responseTransformer,
63
63
  if (done)
64
64
  break;
65
65
  buffer += value;
66
- buffer = buffer.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
67
- const chunks = buffer.split("\n\n");
66
+ const chunks = buffer.split("\r\n");
68
67
  buffer = chunks.pop() ?? "";
69
68
  for (const chunk of chunks) {
70
69
  const lines = chunk.split("\n");
@@ -109,7 +108,7 @@ var createSseClient = ({ onRequest, onSseError, onSseEvent, responseTransformer,
109
108
  id: lastEventId,
110
109
  retry: retryDelay
111
110
  });
112
- if (dataLines.length && data !== "") {
111
+ if (dataLines.length) {
113
112
  yield data;
114
113
  }
115
114
  }
@@ -122,7 +121,7 @@ var createSseClient = ({ onRequest, onSseError, onSseEvent, responseTransformer,
122
121
  } catch (error) {
123
122
  onSseError?.(error);
124
123
  if (sseMaxRetryAttempts !== void 0 && attempt >= sseMaxRetryAttempts) {
125
- throw error;
124
+ break;
126
125
  }
127
126
  const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 3e4);
128
127
  await sleep(backoff);
@@ -764,4 +763,4 @@ var client = createClient(createConfig({ baseUrl: "https://dreamboard.games" }))
764
763
  export {
765
764
  client
766
765
  };
767
- //# sourceMappingURL=chunk-NAK77WXW.mjs.map
766
+ //# sourceMappingURL=chunk-MYMVXTZT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../packages/api-client/dist/core/bodySerializer.gen.js","../../../../packages/api-client/dist/core/params.gen.js","../../../../packages/api-client/dist/core/serverSentEvents.gen.js","../../../../packages/api-client/dist/core/pathSerializer.gen.js","../../../../packages/api-client/dist/core/utils.gen.js","../../../../packages/api-client/dist/core/auth.gen.js","../../../../packages/api-client/dist/client/utils.gen.js","../../../../packages/api-client/dist/client/client.gen.js","../../../../packages/api-client/dist/client.gen.js"],"sourcesContent":["// This file is auto-generated by @hey-api/openapi-ts\nconst serializeFormDataPair = (data, key, value) => {\n if (typeof value === 'string' || value instanceof Blob) {\n data.append(key, value);\n }\n else if (value instanceof Date) {\n data.append(key, value.toISOString());\n }\n else {\n data.append(key, JSON.stringify(value));\n }\n};\nconst serializeUrlSearchParamsPair = (data, key, value) => {\n if (typeof value === 'string') {\n data.append(key, value);\n }\n else {\n data.append(key, JSON.stringify(value));\n }\n};\nexport const formDataBodySerializer = {\n bodySerializer: (body) => {\n const data = new FormData();\n Object.entries(body).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeFormDataPair(data, key, v));\n }\n else {\n serializeFormDataPair(data, key, value);\n }\n });\n return data;\n },\n};\nexport const jsonBodySerializer = {\n bodySerializer: (body) => JSON.stringify(body, (_key, value) => typeof value === 'bigint' ? value.toString() : value),\n};\nexport const urlSearchParamsBodySerializer = {\n bodySerializer: (body) => {\n const data = new URLSearchParams();\n Object.entries(body).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((v) => serializeUrlSearchParamsPair(data, key, v));\n }\n else {\n serializeUrlSearchParamsPair(data, key, value);\n }\n });\n return data.toString();\n },\n};\n","// This file is auto-generated by @hey-api/openapi-ts\nconst extraPrefixesMap = {\n $body_: 'body',\n $headers_: 'headers',\n $path_: 'path',\n $query_: 'query',\n};\nconst extraPrefixes = Object.entries(extraPrefixesMap);\nconst buildKeyMap = (fields, map) => {\n if (!map) {\n map = new Map();\n }\n for (const config of fields) {\n if ('in' in config) {\n if (config.key) {\n map.set(config.key, {\n in: config.in,\n map: config.map,\n });\n }\n }\n else if ('key' in config) {\n map.set(config.key, {\n map: config.map,\n });\n }\n else if (config.args) {\n buildKeyMap(config.args, map);\n }\n }\n return map;\n};\nconst stripEmptySlots = (params) => {\n for (const [slot, value] of Object.entries(params)) {\n if (value && typeof value === 'object' && !Object.keys(value).length) {\n delete params[slot];\n }\n }\n};\nexport const buildClientParams = (args, fields) => {\n const params = {\n body: {},\n headers: {},\n path: {},\n query: {},\n };\n const map = buildKeyMap(fields);\n let config;\n for (const [index, arg] of args.entries()) {\n if (fields[index]) {\n config = fields[index];\n }\n if (!config) {\n continue;\n }\n if ('in' in config) {\n if (config.key) {\n const field = map.get(config.key);\n const name = field.map || config.key;\n if (field.in) {\n params[field.in][name] = arg;\n }\n }\n else {\n params.body = arg;\n }\n }\n else {\n for (const [key, value] of Object.entries(arg ?? {})) {\n const field = map.get(key);\n if (field) {\n if (field.in) {\n const name = field.map || key;\n params[field.in][name] = value;\n }\n else {\n params[field.map] = value;\n }\n }\n else {\n const extra = extraPrefixes.find(([prefix]) => key.startsWith(prefix));\n if (extra) {\n const [prefix, slot] = extra;\n params[slot][key.slice(prefix.length)] = value;\n }\n else if ('allowExtra' in config && config.allowExtra) {\n for (const [slot, allowed] of Object.entries(config.allowExtra)) {\n if (allowed) {\n params[slot][key] = value;\n break;\n }\n }\n }\n }\n }\n }\n }\n stripEmptySlots(params);\n return params;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\nexport const createSseClient = ({ onRequest, onSseError, onSseEvent, responseTransformer, responseValidator, sseDefaultRetryDelay, sseMaxRetryAttempts, sseMaxRetryDelay, sseSleepFn, url, ...options }) => {\n let lastEventId;\n const sleep = sseSleepFn ??\n ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));\n const createStream = async function* () {\n let retryDelay = sseDefaultRetryDelay ?? 3000;\n let attempt = 0;\n const signal = options.signal ?? new AbortController().signal;\n while (true) {\n if (signal.aborted)\n break;\n attempt++;\n const headers = options.headers instanceof Headers\n ? options.headers\n : new Headers(options.headers);\n if (lastEventId !== undefined) {\n headers.set(\"Last-Event-ID\", lastEventId);\n }\n try {\n const requestInit = {\n redirect: \"follow\",\n ...options,\n body: options.serializedBody,\n headers,\n signal,\n };\n let request = new Request(url, requestInit);\n if (onRequest) {\n request = await onRequest(url, requestInit);\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = options.fetch ?? globalThis.fetch;\n const response = await _fetch(request);\n if (!response.ok)\n throw new Error(`SSE failed: ${response.status} ${response.statusText}`);\n if (!response.body)\n throw new Error(\"No body in SSE response\");\n const reader = response.body\n .pipeThrough(new TextDecoderStream())\n .getReader();\n let buffer = \"\";\n const abortHandler = () => {\n try {\n reader.cancel();\n }\n catch {\n // noop\n }\n };\n signal.addEventListener(\"abort\", abortHandler);\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done)\n break;\n buffer += value;\n const chunks = buffer.split(\"\\r\\n\");\n buffer = chunks.pop() ?? \"\";\n for (const chunk of chunks) {\n const lines = chunk.split(\"\\n\");\n const dataLines = [];\n let eventName;\n for (const line of lines) {\n if (line.startsWith(\"data:\")) {\n dataLines.push(line.replace(/^data:\\s*/, \"\"));\n }\n else if (line.startsWith(\"event:\")) {\n eventName = line.replace(/^event:\\s*/, \"\");\n }\n else if (line.startsWith(\"id:\")) {\n lastEventId = line.replace(/^id:\\s*/, \"\");\n }\n else if (line.startsWith(\"retry:\")) {\n const parsed = Number.parseInt(line.replace(/^retry:\\s*/, \"\"), 10);\n if (!Number.isNaN(parsed)) {\n retryDelay = parsed;\n }\n }\n }\n let data;\n let parsedJson = false;\n if (dataLines.length) {\n const rawData = dataLines.join(\"\\n\");\n try {\n data = JSON.parse(rawData);\n parsedJson = true;\n }\n catch {\n data = rawData;\n }\n }\n if (parsedJson) {\n if (responseValidator) {\n await responseValidator(data);\n }\n if (responseTransformer) {\n data = await responseTransformer(data);\n }\n }\n onSseEvent?.({\n data,\n event: eventName,\n id: lastEventId,\n retry: retryDelay,\n });\n if (dataLines.length) {\n yield data;\n }\n }\n }\n }\n finally {\n signal.removeEventListener(\"abort\", abortHandler);\n reader.releaseLock();\n }\n break; // exit loop on normal completion\n }\n catch (error) {\n // connection failed or aborted; retry after delay\n onSseError?.(error);\n if (sseMaxRetryAttempts !== undefined &&\n attempt >= sseMaxRetryAttempts) {\n break; // stop after firing error\n }\n // exponential backoff: double retry each attempt, cap at 30s\n const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 30000);\n await sleep(backoff);\n }\n }\n };\n const stream = createStream();\n return { stream };\n};\n","// This file is auto-generated by @hey-api/openapi-ts\nexport const separatorArrayExplode = (style) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\nexport const separatorArrayNoExplode = (style) => {\n switch (style) {\n case 'form':\n return ',';\n case 'pipeDelimited':\n return '|';\n case 'spaceDelimited':\n return '%20';\n default:\n return ',';\n }\n};\nexport const separatorObjectExplode = (style) => {\n switch (style) {\n case 'label':\n return '.';\n case 'matrix':\n return ';';\n case 'simple':\n return ',';\n default:\n return '&';\n }\n};\nexport const serializeArrayParam = ({ allowReserved, explode, name, style, value, }) => {\n if (!explode) {\n const joinedValues = (allowReserved ? value : value.map((v) => encodeURIComponent(v))).join(separatorArrayNoExplode(style));\n switch (style) {\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n case 'simple':\n return joinedValues;\n default:\n return `${name}=${joinedValues}`;\n }\n }\n const separator = separatorArrayExplode(style);\n const joinedValues = value\n .map((v) => {\n if (style === 'label' || style === 'simple') {\n return allowReserved ? v : encodeURIComponent(v);\n }\n return serializePrimitiveParam({\n allowReserved,\n name,\n value: v,\n });\n })\n .join(separator);\n return style === 'label' || style === 'matrix'\n ? separator + joinedValues\n : joinedValues;\n};\nexport const serializePrimitiveParam = ({ allowReserved, name, value, }) => {\n if (value === undefined || value === null) {\n return '';\n }\n if (typeof value === 'object') {\n throw new Error('Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.');\n }\n return `${name}=${allowReserved ? value : encodeURIComponent(value)}`;\n};\nexport const serializeObjectParam = ({ allowReserved, explode, name, style, value, valueOnly, }) => {\n if (value instanceof Date) {\n return valueOnly ? value.toISOString() : `${name}=${value.toISOString()}`;\n }\n if (style !== 'deepObject' && !explode) {\n let values = [];\n Object.entries(value).forEach(([key, v]) => {\n values = [\n ...values,\n key,\n allowReserved ? v : encodeURIComponent(v),\n ];\n });\n const joinedValues = values.join(',');\n switch (style) {\n case 'form':\n return `${name}=${joinedValues}`;\n case 'label':\n return `.${joinedValues}`;\n case 'matrix':\n return `;${name}=${joinedValues}`;\n default:\n return joinedValues;\n }\n }\n const separator = separatorObjectExplode(style);\n const joinedValues = Object.entries(value)\n .map(([key, v]) => serializePrimitiveParam({\n allowReserved,\n name: style === 'deepObject' ? `${name}[${key}]` : key,\n value: v,\n }))\n .join(separator);\n return style === 'label' || style === 'matrix'\n ? separator + joinedValues\n : joinedValues;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\nimport { serializeArrayParam, serializeObjectParam, serializePrimitiveParam, } from './pathSerializer.gen.js';\nexport const PATH_PARAM_RE = /\\{[^{}]+\\}/g;\nexport const defaultPathSerializer = ({ path, url: _url }) => {\n let url = _url;\n const matches = _url.match(PATH_PARAM_RE);\n if (matches) {\n for (const match of matches) {\n let explode = false;\n let name = match.substring(1, match.length - 1);\n let style = 'simple';\n if (name.endsWith('*')) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n if (name.startsWith('.')) {\n name = name.substring(1);\n style = 'label';\n }\n else if (name.startsWith(';')) {\n name = name.substring(1);\n style = 'matrix';\n }\n const value = path[name];\n if (value === undefined || value === null) {\n continue;\n }\n if (Array.isArray(value)) {\n url = url.replace(match, serializeArrayParam({ explode, name, style, value }));\n continue;\n }\n if (typeof value === 'object') {\n url = url.replace(match, serializeObjectParam({\n explode,\n name,\n style,\n value: value,\n valueOnly: true,\n }));\n continue;\n }\n if (style === 'matrix') {\n url = url.replace(match, `;${serializePrimitiveParam({\n name,\n value: value,\n })}`);\n continue;\n }\n const replaceValue = encodeURIComponent(style === 'label' ? `.${value}` : value);\n url = url.replace(match, replaceValue);\n }\n }\n return url;\n};\nexport const getUrl = ({ baseUrl, path, query, querySerializer, url: _url, }) => {\n const pathUrl = _url.startsWith('/') ? _url : `/${_url}`;\n let url = (baseUrl ?? '') + pathUrl;\n if (path) {\n url = defaultPathSerializer({ path, url });\n }\n let search = query ? querySerializer(query) : '';\n if (search.startsWith('?')) {\n search = search.substring(1);\n }\n if (search) {\n url += `?${search}`;\n }\n return url;\n};\nexport function getValidRequestBody(options) {\n const hasBody = options.body !== undefined;\n const isSerializedBody = hasBody && options.bodySerializer;\n if (isSerializedBody) {\n if ('serializedBody' in options) {\n const hasSerializedBody = options.serializedBody !== undefined && options.serializedBody !== '';\n return hasSerializedBody ? options.serializedBody : null;\n }\n // not all clients implement a serializedBody property (i.e. client-axios)\n return options.body !== '' ? options.body : null;\n }\n // plain/text body\n if (hasBody) {\n return options.body;\n }\n // no body was provided\n return undefined;\n}\n","// This file is auto-generated by @hey-api/openapi-ts\nexport const getAuthToken = async (auth, callback) => {\n const token = typeof callback === 'function' ? await callback(auth) : callback;\n if (!token) {\n return;\n }\n if (auth.scheme === 'bearer') {\n return `Bearer ${token}`;\n }\n if (auth.scheme === 'basic') {\n return `Basic ${btoa(token)}`;\n }\n return token;\n};\n","// This file is auto-generated by @hey-api/openapi-ts\nimport { getAuthToken } from '../core/auth.gen.js';\nimport { jsonBodySerializer } from '../core/bodySerializer.gen.js';\nimport { serializeArrayParam, serializeObjectParam, serializePrimitiveParam, } from '../core/pathSerializer.gen.js';\nimport { getUrl } from '../core/utils.gen.js';\nexport const createQuerySerializer = ({ parameters = {}, ...args } = {}) => {\n const querySerializer = (queryParams) => {\n const search = [];\n if (queryParams && typeof queryParams === 'object') {\n for (const name in queryParams) {\n const value = queryParams[name];\n if (value === undefined || value === null) {\n continue;\n }\n const options = parameters[name] || args;\n if (Array.isArray(value)) {\n const serializedArray = serializeArrayParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: 'form',\n value,\n ...options.array,\n });\n if (serializedArray)\n search.push(serializedArray);\n }\n else if (typeof value === 'object') {\n const serializedObject = serializeObjectParam({\n allowReserved: options.allowReserved,\n explode: true,\n name,\n style: 'deepObject',\n value: value,\n ...options.object,\n });\n if (serializedObject)\n search.push(serializedObject);\n }\n else {\n const serializedPrimitive = serializePrimitiveParam({\n allowReserved: options.allowReserved,\n name,\n value: value,\n });\n if (serializedPrimitive)\n search.push(serializedPrimitive);\n }\n }\n }\n return search.join('&');\n };\n return querySerializer;\n};\n/**\n * Infers parseAs value from provided Content-Type header.\n */\nexport const getParseAs = (contentType) => {\n if (!contentType) {\n // If no Content-Type header is provided, the best we can do is return the raw response body,\n // which is effectively the same as the 'stream' option.\n return 'stream';\n }\n const cleanContent = contentType.split(';')[0]?.trim();\n if (!cleanContent) {\n return;\n }\n if (cleanContent.startsWith('application/json') ||\n cleanContent.endsWith('+json')) {\n return 'json';\n }\n if (cleanContent === 'multipart/form-data') {\n return 'formData';\n }\n if (['application/', 'audio/', 'image/', 'video/'].some((type) => cleanContent.startsWith(type))) {\n return 'blob';\n }\n if (cleanContent.startsWith('text/')) {\n return 'text';\n }\n return;\n};\nconst checkForExistence = (options, name) => {\n if (!name) {\n return false;\n }\n if (options.headers.has(name) ||\n options.query?.[name] ||\n options.headers.get('Cookie')?.includes(`${name}=`)) {\n return true;\n }\n return false;\n};\nexport const setAuthParams = async ({ security, ...options }) => {\n for (const auth of security) {\n if (checkForExistence(options, auth.name)) {\n continue;\n }\n const token = await getAuthToken(auth, options.auth);\n if (!token) {\n continue;\n }\n const name = auth.name ?? 'Authorization';\n switch (auth.in) {\n case 'query':\n if (!options.query) {\n options.query = {};\n }\n options.query[name] = token;\n break;\n case 'cookie':\n options.headers.append('Cookie', `${name}=${token}`);\n break;\n case 'header':\n default:\n options.headers.set(name, token);\n break;\n }\n }\n};\nexport const buildUrl = (options) => getUrl({\n baseUrl: options.baseUrl,\n path: options.path,\n query: options.query,\n querySerializer: typeof options.querySerializer === 'function'\n ? options.querySerializer\n : createQuerySerializer(options.querySerializer),\n url: options.url,\n});\nexport const mergeConfigs = (a, b) => {\n const config = { ...a, ...b };\n if (config.baseUrl?.endsWith('/')) {\n config.baseUrl = config.baseUrl.substring(0, config.baseUrl.length - 1);\n }\n config.headers = mergeHeaders(a.headers, b.headers);\n return config;\n};\nconst headersEntries = (headers) => {\n const entries = [];\n headers.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries;\n};\nexport const mergeHeaders = (...headers) => {\n const mergedHeaders = new Headers();\n for (const header of headers) {\n if (!header) {\n continue;\n }\n const iterator = header instanceof Headers\n ? headersEntries(header)\n : Object.entries(header);\n for (const [key, value] of iterator) {\n if (value === null) {\n mergedHeaders.delete(key);\n }\n else if (Array.isArray(value)) {\n for (const v of value) {\n mergedHeaders.append(key, v);\n }\n }\n else if (value !== undefined) {\n // assume object headers are meant to be JSON stringified, i.e. their\n // content value in OpenAPI specification is 'application/json'\n mergedHeaders.set(key, typeof value === 'object' ? JSON.stringify(value) : value);\n }\n }\n }\n return mergedHeaders;\n};\nclass Interceptors {\n constructor() {\n this.fns = [];\n }\n clear() {\n this.fns = [];\n }\n eject(id) {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = null;\n }\n }\n exists(id) {\n const index = this.getInterceptorIndex(id);\n return Boolean(this.fns[index]);\n }\n getInterceptorIndex(id) {\n if (typeof id === 'number') {\n return this.fns[id] ? id : -1;\n }\n return this.fns.indexOf(id);\n }\n update(id, fn) {\n const index = this.getInterceptorIndex(id);\n if (this.fns[index]) {\n this.fns[index] = fn;\n return id;\n }\n return false;\n }\n use(fn) {\n this.fns.push(fn);\n return this.fns.length - 1;\n }\n}\nexport const createInterceptors = () => ({\n error: new Interceptors(),\n request: new Interceptors(),\n response: new Interceptors(),\n});\nconst defaultQuerySerializer = createQuerySerializer({\n allowReserved: false,\n array: {\n explode: true,\n style: 'form',\n },\n object: {\n explode: true,\n style: 'deepObject',\n },\n});\nconst defaultHeaders = {\n 'Content-Type': 'application/json',\n};\nexport const createConfig = (override = {}) => ({\n ...jsonBodySerializer,\n headers: defaultHeaders,\n parseAs: 'auto',\n querySerializer: defaultQuerySerializer,\n ...override,\n});\n","// This file is auto-generated by @hey-api/openapi-ts\nimport { createSseClient } from '../core/serverSentEvents.gen.js';\nimport { getValidRequestBody } from '../core/utils.gen.js';\nimport { buildUrl, createConfig, createInterceptors, getParseAs, mergeConfigs, mergeHeaders, setAuthParams, } from './utils.gen.js';\nexport const createClient = (config = {}) => {\n let _config = mergeConfigs(createConfig(), config);\n const getConfig = () => ({ ..._config });\n const setConfig = (config) => {\n _config = mergeConfigs(_config, config);\n return getConfig();\n };\n const interceptors = createInterceptors();\n const beforeRequest = async (options) => {\n const opts = {\n ..._config,\n ...options,\n fetch: options.fetch ?? _config.fetch ?? globalThis.fetch,\n headers: mergeHeaders(_config.headers, options.headers),\n serializedBody: undefined,\n };\n if (opts.security) {\n await setAuthParams({\n ...opts,\n security: opts.security,\n });\n }\n if (opts.requestValidator) {\n await opts.requestValidator(opts);\n }\n if (opts.body !== undefined && opts.bodySerializer) {\n opts.serializedBody = opts.bodySerializer(opts.body);\n }\n // remove Content-Type header if body is empty to avoid sending invalid requests\n if (opts.body === undefined || opts.serializedBody === '') {\n opts.headers.delete('Content-Type');\n }\n const url = buildUrl(opts);\n return { opts, url };\n };\n const request = async (options) => {\n // @ts-expect-error\n const { opts, url } = await beforeRequest(options);\n const requestInit = {\n redirect: 'follow',\n ...opts,\n body: getValidRequestBody(opts),\n };\n let request = new Request(url, requestInit);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n // fetch must be assigned here, otherwise it would throw the error:\n // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation\n const _fetch = opts.fetch;\n let response;\n try {\n response = await _fetch(request);\n }\n catch (error) {\n // Handle fetch exceptions (AbortError, network errors, etc.)\n let finalError = error;\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = (await fn(error, undefined, request, opts));\n }\n }\n finalError = finalError || {};\n if (opts.throwOnError) {\n throw finalError;\n }\n // Return error response\n return opts.responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n request,\n response: undefined,\n };\n }\n for (const fn of interceptors.response.fns) {\n if (fn) {\n response = await fn(response, request, opts);\n }\n }\n const result = {\n request,\n response,\n };\n if (response.ok) {\n const parseAs = (opts.parseAs === 'auto'\n ? getParseAs(response.headers.get('Content-Type'))\n : opts.parseAs) ?? 'json';\n if (response.status === 204 ||\n response.headers.get('Content-Length') === '0') {\n let emptyData;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'text':\n emptyData = await response[parseAs]();\n break;\n case 'formData':\n emptyData = new FormData();\n break;\n case 'stream':\n emptyData = response.body;\n break;\n case 'json':\n default:\n emptyData = {};\n break;\n }\n return opts.responseStyle === 'data'\n ? emptyData\n : {\n data: emptyData,\n ...result,\n };\n }\n let data;\n switch (parseAs) {\n case 'arrayBuffer':\n case 'blob':\n case 'formData':\n case 'text':\n data = await response[parseAs]();\n break;\n case 'json': {\n // Some servers return 200 with no Content-Length and empty body.\n // response.json() would throw; read as text and parse if non-empty.\n const text = await response.text();\n data = text ? JSON.parse(text) : {};\n break;\n }\n case 'stream':\n return opts.responseStyle === 'data'\n ? response.body\n : {\n data: response.body,\n ...result,\n };\n }\n if (parseAs === 'json') {\n if (opts.responseValidator) {\n await opts.responseValidator(data);\n }\n if (opts.responseTransformer) {\n data = await opts.responseTransformer(data);\n }\n }\n return opts.responseStyle === 'data'\n ? data\n : {\n data,\n ...result,\n };\n }\n const textError = await response.text();\n let jsonError;\n try {\n jsonError = JSON.parse(textError);\n }\n catch {\n // noop\n }\n const error = jsonError ?? textError;\n let finalError = error;\n for (const fn of interceptors.error.fns) {\n if (fn) {\n finalError = (await fn(error, response, request, opts));\n }\n }\n finalError = finalError || {};\n if (opts.throwOnError) {\n throw finalError;\n }\n // TODO: we probably want to return error and improve types\n return opts.responseStyle === 'data'\n ? undefined\n : {\n error: finalError,\n ...result,\n };\n };\n const makeMethodFn = (method) => (options) => request({ ...options, method });\n const makeSseFn = (method) => async (options) => {\n const { opts, url } = await beforeRequest(options);\n return createSseClient({\n ...opts,\n body: opts.body,\n headers: opts.headers,\n method,\n onRequest: async (url, init) => {\n let request = new Request(url, init);\n for (const fn of interceptors.request.fns) {\n if (fn) {\n request = await fn(request, opts);\n }\n }\n return request;\n },\n serializedBody: getValidRequestBody(opts),\n url,\n });\n };\n return {\n buildUrl,\n connect: makeMethodFn('CONNECT'),\n delete: makeMethodFn('DELETE'),\n get: makeMethodFn('GET'),\n getConfig,\n head: makeMethodFn('HEAD'),\n interceptors,\n options: makeMethodFn('OPTIONS'),\n patch: makeMethodFn('PATCH'),\n post: makeMethodFn('POST'),\n put: makeMethodFn('PUT'),\n request,\n setConfig,\n sse: {\n connect: makeSseFn('CONNECT'),\n delete: makeSseFn('DELETE'),\n get: makeSseFn('GET'),\n head: makeSseFn('HEAD'),\n options: makeSseFn('OPTIONS'),\n patch: makeSseFn('PATCH'),\n post: makeSseFn('POST'),\n put: makeSseFn('PUT'),\n trace: makeSseFn('TRACE'),\n },\n trace: makeMethodFn('TRACE'),\n };\n};\n","// This file is auto-generated by @hey-api/openapi-ts\nimport { createClient, createConfig } from './client/index.js';\nexport const client = createClient(createConfig({ baseUrl: 'https://dreamboard.games' }));\n"],"mappings":"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","names":["joinedValues","config","request","error","finalError","url"]}