instant-cli 1.0.56 → 1.0.57

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 (78) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/__tests__/auth.test.ts +128 -0
  3. package/__tests__/config.test.ts +47 -0
  4. package/dist/auth/index.d.ts +4 -0
  5. package/dist/auth/index.d.ts.map +1 -0
  6. package/dist/auth/index.js +103 -0
  7. package/dist/auth/index.js.map +1 -0
  8. package/dist/commands/auth/client/add.d.ts +1 -1
  9. package/dist/commands/auth/client/delete.d.ts +1 -1
  10. package/dist/commands/auth/client/list.d.ts +1 -1
  11. package/dist/commands/auth/client/update.d.ts +1 -1
  12. package/dist/commands/auth/email/pull.d.ts +2 -2
  13. package/dist/commands/auth/email/push.d.ts +1 -1
  14. package/dist/commands/auth/email/reset.d.ts +1 -1
  15. package/dist/commands/auth/email/status.d.ts +2 -2
  16. package/dist/commands/auth/email/verify.d.ts +1 -1
  17. package/dist/commands/auth/origin/add.d.ts +1 -1
  18. package/dist/commands/auth/origin/delete.d.ts +1 -1
  19. package/dist/commands/auth/origin/list.d.ts +1 -1
  20. package/dist/commands/info.d.ts +1 -1
  21. package/dist/commands/init.d.ts +1 -1
  22. package/dist/commands/login.d.ts +1 -1
  23. package/dist/commands/login.d.ts.map +1 -1
  24. package/dist/commands/login.js +2 -2
  25. package/dist/commands/login.js.map +1 -1
  26. package/dist/commands/logout.d.ts +1 -2
  27. package/dist/commands/logout.d.ts.map +1 -1
  28. package/dist/commands/logout.js +9 -16
  29. package/dist/commands/logout.js.map +1 -1
  30. package/dist/commands/pull.d.ts +1 -1
  31. package/dist/commands/push.d.ts +1 -1
  32. package/dist/commands/query.d.ts +1 -1
  33. package/dist/context/authToken.d.ts +2 -3
  34. package/dist/context/authToken.d.ts.map +1 -1
  35. package/dist/context/authToken.js +4 -17
  36. package/dist/context/authToken.js.map +1 -1
  37. package/dist/context/currentApp.d.ts +1 -1
  38. package/dist/layer.d.ts +2 -2
  39. package/dist/layer.d.ts.map +1 -1
  40. package/dist/lib/config.d.ts +5 -0
  41. package/dist/lib/config.d.ts.map +1 -0
  42. package/dist/lib/config.js +37 -0
  43. package/dist/lib/config.js.map +1 -0
  44. package/dist/lib/createApp.d.ts +1 -1
  45. package/dist/lib/email.d.ts +1 -1
  46. package/dist/lib/handleEnv.d.ts +1 -1
  47. package/dist/lib/http.d.ts +3 -6
  48. package/dist/lib/http.d.ts.map +1 -1
  49. package/dist/lib/http.js +3 -36
  50. package/dist/lib/http.js.map +1 -1
  51. package/dist/lib/login.d.ts +3 -4
  52. package/dist/lib/login.d.ts.map +1 -1
  53. package/dist/lib/login.js +5 -6
  54. package/dist/lib/login.js.map +1 -1
  55. package/dist/lib/oauth.d.ts +9 -9
  56. package/dist/lib/pullPerms.d.ts +1 -1
  57. package/dist/lib/pullSchema.d.ts +1 -1
  58. package/dist/lib/pushPerms.d.ts +1 -1
  59. package/dist/lib/pushSchema.d.ts +1 -1
  60. package/dist/old.d.ts +1 -1
  61. package/dist/old.d.ts.map +1 -1
  62. package/dist/old.js +6 -7
  63. package/dist/old.js.map +1 -1
  64. package/dist/util/getAppName.d.ts +1 -1
  65. package/package.json +10 -4
  66. package/src/auth/index.ts +125 -0
  67. package/src/commands/login.ts +2 -2
  68. package/src/commands/logout.ts +17 -18
  69. package/src/context/authToken.ts +6 -21
  70. package/src/lib/config.ts +68 -0
  71. package/src/lib/http.ts +4 -68
  72. package/src/lib/login.ts +5 -11
  73. package/src/old.js +6 -10
  74. package/dist/util/getAuthPaths.d.ts +0 -5
  75. package/dist/util/getAuthPaths.d.ts.map +0 -1
  76. package/dist/util/getAuthPaths.js +0 -10
  77. package/dist/util/getAuthPaths.js.map +0 -1
  78. package/src/util/getAuthPaths.ts +0 -12
@@ -8,6 +8,6 @@ declare const NoPermsFileError_base: Schema.TaggedErrorClass<NoPermsFileError, "
8
8
  }>;
9
9
  export declare class NoPermsFileError extends NoPermsFileError_base {
10
10
  }
11
- export declare const pushPerms: Effect.Effect<void, import("effect/Cause").UnknownException | import("./http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("effect/ParseResult").ParseError | import("@effect/platform/HttpClientError").ResponseError | import("@effect/platform/HttpBody").HttpBodyError | NoPermsFileError, import("../context/globalOpts.ts").GlobalOpts | InstantHttpAuthed | CurrentApp>;
11
+ export declare const pushPerms: Effect.Effect<void, import("effect/Cause").UnknownException | import("effect/ParseResult").ParseError | import("./http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("@effect/platform/HttpClientError").ResponseError | import("@effect/platform/HttpBody").HttpBodyError | NoPermsFileError, import("../context/globalOpts.ts").GlobalOpts | InstantHttpAuthed | CurrentApp>;
12
12
  export {};
13
13
  //# sourceMappingURL=pushPerms.d.ts.map
@@ -34,7 +34,7 @@ declare const SchemaValidationError_base: Schema.TaggedErrorClass<SchemaValidati
34
34
  }>;
35
35
  export declare class SchemaValidationError extends SchemaValidationError_base {
36
36
  }
37
- export declare const pushSchema: (rename?: OptsFromCommand<typeof pushDef>["rename"]) => Effect.Effect<undefined, import("../errors.ts").BadArgsError | import("effect/Cause").UnknownException | import("./http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("effect/ParseResult").ParseError | import("@effect/platform/HttpClientError").ResponseError | import("effect/ConfigError").ConfigError | import("@effect/platform/HttpBody").HttpBodyError | ReadSchemaFileError | SchemaDiffError | GetSchemaError | SchemaValidationError | WaitForJobsError | CancelSchemaError, GlobalOpts | AuthToken | InstantHttpAuthed | CurrentApp>;
37
+ export declare const pushSchema: (rename?: OptsFromCommand<typeof pushDef>["rename"]) => Effect.Effect<undefined, import("../errors.ts").BadArgsError | import("effect/Cause").UnknownException | import("effect/ConfigError").ConfigError | import("effect/ParseResult").ParseError | import("./http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("@effect/platform/HttpClientError").ResponseError | import("@effect/platform/HttpBody").HttpBodyError | ReadSchemaFileError | SchemaDiffError | GetSchemaError | SchemaValidationError | WaitForJobsError | CancelSchemaError, GlobalOpts | AuthToken | InstantHttpAuthed | CurrentApp>;
38
38
  declare const WaitForJobsError_base: Schema.TaggedErrorClass<WaitForJobsError, "WaitForJobsError", {
39
39
  readonly _tag: Schema.tag<"WaitForJobsError">;
40
40
  } & {
package/dist/old.d.ts CHANGED
@@ -11,7 +11,7 @@ export function readLocalEmailFile(emailPath: any): Promise<{
11
11
  path: string;
12
12
  email: any;
13
13
  } | undefined>;
14
- export function readConfigAuthTokenWithErrorLogging(): Promise<any>;
14
+ export function readConfigAuthTokenWithErrorLogging(apiURI: any): Promise<any>;
15
15
  export function countEntities(o: any): number;
16
16
  export function resolveRenames(created: any, promptData: any, extraInfo: any): Promise<string | import("./util/renamePrompt.ts").RenamePromptItem<string>>;
17
17
  //# sourceMappingURL=old.d.ts.map
package/dist/old.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"old.d.ts","sourceRoot":"","sources":["../src/old.js"],"names":[],"mappings":"AAuLA,+GA2FC;AAmID;;;eASC;AAED;;;eASC;AAED;;;eASC;AAoCD,oEAQC;AAQD,8CAEC;AAtNM,2JAoBN"}
1
+ {"version":3,"file":"old.d.ts","sourceRoot":"","sources":["../src/old.js"],"names":[],"mappings":"AAsLA,+GA2FC;AAmID;;;eASC;AAED;;;eASC;AAED;;;eASC;AAiCD,+EAQC;AAQD,8CAEC;AAnNM,2JAoBN"}
package/dist/old.js CHANGED
@@ -1,12 +1,11 @@
1
1
  import boxen from 'boxen';
2
2
  import chalk from 'chalk';
3
3
  import { program } from '@commander-js/extra-typings';
4
- import { readFile } from 'node:fs/promises';
5
4
  import path from 'node:path';
5
+ import { readAuthToken } from "./auth/index.js";
6
6
  import { UI } from "./ui/index.js";
7
7
  import { deferred, renderUnwrap } from "./ui/lib.js";
8
8
  import { getEmailReadCandidates, getPermsReadCandidates, getSchemaReadCandidates, } from "./util/findConfigCandidates.js";
9
- import { getAuthPaths } from "./util/getAuthPaths.js";
10
9
  import { loadConfig } from "./util/loadConfig.js";
11
10
  import { ResolveRenamePrompt } from "./util/renamePrompt.js";
12
11
  import version from './version.js';
@@ -269,7 +268,7 @@ async function fetchJson({ debugName, errorMessage, path, body, method, noAuth,
269
268
  let authToken = null;
270
269
  if (withAuth) {
271
270
  authToken =
272
- providedAuthToken ?? (await readConfigAuthTokenWithErrorLogging());
271
+ providedAuthToken ?? (await readConfigAuthTokenWithErrorLogging(apiURI));
273
272
  if (!authToken) {
274
273
  return { ok: false, data: undefined };
275
274
  }
@@ -369,7 +368,7 @@ export async function readLocalEmailFile(emailPath) {
369
368
  const relativePath = path.relative(process.cwd(), res.sources[0]);
370
369
  return { path: relativePath, email: res.config };
371
370
  }
372
- async function readConfigAuthToken(allowAdminToken = true) {
371
+ async function readConfigAuthToken(apiURI, allowAdminToken = true) {
373
372
  const options = program.opts();
374
373
  // @ts-expect-error command opts type is unknown
375
374
  if (typeof options.token === 'string') {
@@ -388,14 +387,14 @@ async function readConfigAuthToken(allowAdminToken = true) {
388
387
  }
389
388
  }
390
389
  }
391
- const authToken = await readFile(getAuthPaths().authConfigFilePath, 'utf-8').catch(() => null);
390
+ const authToken = await readAuthToken(apiURI).catch(() => null);
392
391
  if (authToken) {
393
392
  return authToken;
394
393
  }
395
394
  return null;
396
395
  }
397
- export async function readConfigAuthTokenWithErrorLogging() {
398
- const token = await readConfigAuthToken();
396
+ export async function readConfigAuthTokenWithErrorLogging(apiURI) {
397
+ const token = await readConfigAuthToken(apiURI);
399
398
  if (!token) {
400
399
  error(`Looks like you are not logged in. Please log in with ${chalk.green('`instant-cli login`')}`);
401
400
  }
package/dist/old.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"old.js","sourceRoot":"","sources":["../src/old.js"],"names":[],"mappings":"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","sourcesContent":["import boxen from 'boxen';\nimport chalk from 'chalk';\nimport { program } from '@commander-js/extra-typings';\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { UI } from './ui/index.ts';\nimport { deferred, renderUnwrap } from './ui/lib.ts';\nimport {\n getEmailReadCandidates,\n getPermsReadCandidates,\n getSchemaReadCandidates,\n} from './util/findConfigCandidates.ts';\nimport { getAuthPaths } from './util/getAuthPaths.ts';\nimport { loadConfig } from './util/loadConfig.ts';\nimport { ResolveRenamePrompt } from './util/renamePrompt.ts';\nimport version from './version.js';\nimport { link } from './logging.ts';\n\nconst dev = Boolean(process.env.INSTANT_CLI_DEV);\nconst verbose = Boolean(process.env.INSTANT_CLI_VERBOSE);\n\nfunction error(firstArg, ...rest) {\n console.error(chalk.red('[error]') + ' ' + firstArg, ...rest);\n}\n\nconst potentialAdminTokenEnvs = {\n default: 'INSTANT_APP_ADMIN_TOKEN',\n short: 'INSTANT_ADMIN_TOKEN',\n};\n\nconst instantDashOrigin = dev\n ? 'http://localhost:3000'\n : 'https://instantdb.com';\n\nfunction indexingJobCompletedActionMessage(job) {\n if (job.job_type === 'check-data-type') {\n return `setting type of ${job.attr_name} to ${job.checked_data_type}`;\n }\n if (job.job_type === 'remove-data-type') {\n return `removing type from ${job.attr_name}`;\n }\n if (job.job_type === 'index') {\n return `adding index to ${job.attr_name}`;\n }\n if (job.job_type === 'remove-index') {\n return `removing index from ${job.attr_name}`;\n }\n if (job.job_type === 'unique') {\n return `adding uniqueness constraint to ${job.attr_name}`;\n }\n if (job.job_type === 'remove-unique') {\n return `removing uniqueness constraint from ${job.attr_name}`;\n }\n if (job.job_type === 'required') {\n return `adding required constraint to ${job.attr_name}`;\n }\n if (job.job_type === 'remove-required') {\n return `removing required constraint from ${job.attr_name}`;\n }\n return `unexpected job type ${job.job_type} - please ping us on discord with this job id (${job.id})`;\n}\n\nfunction truncate(s, maxLen) {\n if (s.length > maxLen) {\n return `${s.substr(0, maxLen - 3)}...`;\n }\n return s;\n}\n\nfunction formatSamples(triples_samples) {\n return triples_samples.slice(0, 3).map((t) => {\n return { ...t, value: truncate(JSON.stringify(t.value), 32) };\n });\n}\n\nfunction createUrl(triple, job) {\n const urlParams = new URLSearchParams({\n s: 'main',\n app: job.app_id,\n t: 'explorer',\n ns: job.attr_name.split('.')[0],\n where: JSON.stringify(['id', triple.entity_id]),\n });\n const url = new URL(instantDashOrigin);\n url.pathname = '/dash';\n url.search = urlParams.toString();\n return url;\n}\n\nfunction padCell(value, width) {\n const trimmed = value.length > width ? value.substring(0, width) : value;\n return trimmed + ' '.repeat(width - trimmed.length);\n}\n\nfunction indexingJobCompletedMessage(job) {\n const actionMessage = indexingJobCompletedActionMessage(job);\n if (job.job_status === 'canceled') {\n return `Canceled ${actionMessage} before it could finish.`;\n }\n if (job.job_status === 'completed') {\n return `Finished ${actionMessage}.`;\n }\n if (job.job_status === 'errored') {\n if (job.invalid_triples_sample?.length) {\n const [etype, label] = job.attr_name.split('.');\n const samples = formatSamples(job.invalid_triples_sample);\n const longestValue = samples.reduce(\n (acc, { value }) => Math.max(acc, value.length),\n label.length,\n );\n\n const columns = [\n { header: 'namespace', width: 15, getValue: () => etype },\n {\n header: 'id',\n width: 37,\n getValue: (triple) =>\n link(createUrl(triple, job).toString(), triple.entity_id),\n },\n {\n header: label,\n width: longestValue + 2,\n getValue: (triple) => triple.value,\n },\n { header: 'type', width: 8, getValue: (triple) => triple.json_type },\n ];\n\n let msg = `${chalk.red('INVALID DATA')} ${actionMessage}.\\n`;\n if (job.invalid_unique_value) {\n msg += ` Found multiple entities with value ${truncate(JSON.stringify(job.invalid_unique_value), 64)}.\\n`;\n }\n if (job.error === 'triple-too-large-error') {\n msg += ` Some of the existing data is too large to index.\\n`;\n }\n\n msg += ` First few examples:\\n`;\n msg += ` ${columns.map((col) => chalk.bold(padCell(col.header, col.width))).join(' | ')}\\n`;\n msg += ` ${columns.map((col) => '-'.repeat(col.width)).join('-|-')}\\n`;\n\n for (const triple of samples) {\n const cells = columns.map((col) =>\n padCell(col.getValue(triple), col.width),\n );\n msg += ` ${cells.join(' | ')}\\n`;\n }\n return msg;\n }\n return `Error ${actionMessage}.`;\n }\n}\n\nfunction joinInSentence(items) {\n if (items.length === 0) {\n return '';\n }\n if (items.length === 1) {\n return items[0];\n }\n if (items.length === 2) {\n return `${items[0]} and ${items[1]}`;\n }\n return `${items.slice(0, -1).join(', ')}, and ${items[items.length - 1]}`;\n}\n\nfunction jobGroupDescription(jobs) {\n const actions = new Set();\n const jobActions = {\n 'check-data-type': 'updating types',\n 'remove-data-type': 'updating types',\n index: 'updating indexes',\n 'remove-index': 'updating indexes',\n unique: 'updating uniqueness constraints',\n 'remove-unique': 'updating uniqueness constraints',\n required: 'making attributes required',\n 'remove-required': 'making attributes optional',\n };\n for (const job of jobs) {\n actions.add(jobActions[job.job_type]);\n }\n return joinInSentence([...actions].sort()) || 'updating schema';\n}\n\n// TODO: rewrite in effect\nexport async function waitForIndexingJobsToFinish(\n appId,\n data,\n authToken,\n apiURI,\n) {\n const spinnerDefferedPromise = deferred();\n const spinner = new UI.Spinner({\n promise: spinnerDefferedPromise.promise,\n });\n const spinnerRenderPromise = renderUnwrap(spinner);\n\n const groupId = data['group-id'];\n let jobs = data.jobs;\n let waitMs = 20;\n let lastUpdatedAt = new Date(0);\n\n const completedIds = new Set();\n\n const errorMessages = [];\n\n while (true) {\n let stillRunning = false;\n let updated = false;\n let workEstimateTotal = 0;\n let workCompletedTotal = 0;\n\n for (const job of jobs) {\n const updatedAt = new Date(job.updated_at);\n if (updatedAt > lastUpdatedAt) {\n updated = true;\n lastUpdatedAt = updatedAt;\n }\n if (job.job_status === 'waiting' || job.job_status === 'processing') {\n stillRunning = true;\n // Default estimate to high value to prevent % from jumping around\n workEstimateTotal += job.work_estimate ?? 50000;\n workCompletedTotal += job.work_completed ?? 0;\n } else {\n if (!completedIds.has(job.id)) {\n completedIds.add(job.id);\n const msg = indexingJobCompletedMessage(job);\n if (msg) {\n if (job.job_status === 'errored') {\n spinner.addMessage(msg);\n errorMessages.push(msg);\n } else {\n spinner.addMessage(msg);\n }\n }\n }\n }\n }\n if (!stillRunning) {\n break;\n }\n if (workEstimateTotal) {\n const percent = Math.floor(\n (workCompletedTotal / workEstimateTotal) * 100,\n );\n spinner.updateText(`${jobGroupDescription(jobs)} ${percent}%`);\n }\n waitMs = updated ? 1 : Math.min(10000, waitMs * 2);\n await sleep(waitMs);\n const res = await fetchJson({\n debugName: 'Check indexing status',\n method: 'GET',\n authToken,\n apiURI,\n path: `/dash/apps/${appId}/indexing-jobs/group/${groupId}`,\n errorMessage: 'Failed to check indexing status.',\n command: 'push',\n });\n if (!res.ok) {\n break;\n }\n jobs = res.data.jobs;\n }\n\n spinnerDefferedPromise.resolve(null);\n\n await spinnerRenderPromise;\n\n // Log errors at the end so that they're easier to see.\n if (errorMessages.length) {\n for (const msg of errorMessages) {\n console.log(msg);\n }\n console.log(chalk.red('Some steps failed while updating schema.'));\n process.exit(1);\n }\n}\n\nexport const resolveRenames = async (created, promptData, extraInfo) => {\n const answer = await renderUnwrap(\n new ResolveRenamePrompt(\n created,\n promptData,\n extraInfo,\n UI.modifiers.piped([\n (out) =>\n boxen(out, {\n dimBorder: true,\n padding: {\n left: 1,\n right: 1,\n },\n }),\n UI.modifiers.vanishOnComplete,\n ]),\n ),\n );\n return answer;\n};\n\n/**\n * Fetches JSON data from a specified path using the POST method.\n *\n * @param {Object} options\n * @param {string} options.debugName\n * @param {string} options.errorMessage\n * @param {string} options.path\n * @param {'POST' | 'GET'} [options.method]\n * @param {Object} [options.body=undefined]\n * @param {boolean} [options.noAuth]\n * @param {boolean} [options.noLogError]\n * @param {string} [options.command] - The CLI command being executed (e.g., 'push', 'pull', 'login')\n * @param {string} [options.authToken] - Optional auth token to use instead of reading from config\n * @param {string} options.apiURI - Backend API origin\n * @param {Record<string, string>} [options.headers] - Extra headers to include in the request\n * @returns {Promise<{ ok: boolean; data: any }>}\n */\nasync function fetchJson({\n debugName,\n errorMessage,\n path,\n body,\n method,\n noAuth,\n noLogError,\n command,\n authToken: providedAuthToken,\n apiURI,\n headers: extraHeaders,\n}) {\n const withAuth = !noAuth;\n const withErrorLogging = !noLogError;\n let authToken = null;\n if (withAuth) {\n authToken =\n providedAuthToken ?? (await readConfigAuthTokenWithErrorLogging());\n if (!authToken) {\n return { ok: false, data: undefined };\n }\n }\n const timeoutMs = 1000 * 60 * 5; // 5 minutes\n\n try {\n const res = await fetch(`${apiURI}${path}`, {\n method: method ?? 'GET',\n headers: {\n ...(withAuth ? { Authorization: `Bearer ${authToken}` } : {}),\n 'Content-Type': 'application/json',\n 'X-Instant-Source': 'instant-cli',\n 'X-Instant-Version': version,\n ...(command ? { 'X-Instant-Command': command } : {}),\n ...extraHeaders,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (verbose) {\n console.log(debugName, 'response:', res.status, res.statusText);\n }\n\n let data;\n try {\n data = await res.json();\n } catch {\n data = null;\n }\n if (verbose && data) {\n console.log(debugName, 'json:', JSON.stringify(data, null, 2));\n }\n if (!res.ok) {\n if (withErrorLogging) {\n error(errorMessage);\n prettyPrintJSONErr(data);\n }\n return { ok: false, data };\n }\n\n return { ok: true, data };\n } catch (err) {\n if (withErrorLogging) {\n if (err.name === 'AbortError') {\n error(\n `Timeout: It took more than ${timeoutMs / 60000} minutes to get the result.`,\n );\n } else {\n error(`Error: type: ${err.name}, message: ${err.message}`);\n }\n }\n return { ok: false, data: null };\n }\n}\n\nfunction prettyPrintJSONErr(data) {\n if (data?.message) {\n error(data.message);\n }\n if (Array.isArray(data?.hint?.errors)) {\n for (const err of data.hint.errors) {\n error(`${err.in ? err.in.join('->') + ': ' : ''}${err.message}`);\n }\n }\n if (!data) {\n error('Failed to parse error response');\n }\n}\n\nexport async function readLocalPermsFile() {\n const readCandidates = getPermsReadCandidates();\n const res = await loadConfig({\n sources: readCandidates,\n merge: false,\n });\n if (!res.config) return;\n const relativePath = path.relative(process.cwd(), res.sources[0]);\n return { path: relativePath, perms: res.config };\n}\n\nexport async function readLocalSchemaFile() {\n const readCandidates = getSchemaReadCandidates();\n const res = await loadConfig({\n sources: readCandidates,\n merge: false,\n });\n if (!res.config) return;\n const relativePath = path.relative(process.cwd(), res.sources[0]);\n return { path: relativePath, schema: res.config };\n}\n\nexport async function readLocalEmailFile(emailPath) {\n const readCandidates = getEmailReadCandidates(emailPath);\n const res = await loadConfig({\n sources: readCandidates,\n merge: false,\n });\n if (!res.config) return;\n const relativePath = path.relative(process.cwd(), res.sources[0]);\n return { path: relativePath, email: res.config };\n}\n\nasync function readConfigAuthToken(allowAdminToken = true) {\n const options = program.opts();\n // @ts-expect-error command opts type is unknown\n if (typeof options.token === 'string') {\n // @ts-expect-error command opts type is unknown\n return options.token;\n }\n\n if (process.env.INSTANT_CLI_AUTH_TOKEN) {\n return process.env.INSTANT_CLI_AUTH_TOKEN;\n }\n\n if (allowAdminToken) {\n const adminTokenNames = Object.values(potentialAdminTokenEnvs);\n for (const envName of adminTokenNames) {\n const token = process.env[envName];\n if (token) {\n return token;\n }\n }\n }\n\n const authToken = await readFile(\n getAuthPaths().authConfigFilePath,\n 'utf-8',\n ).catch(() => null);\n\n if (authToken) {\n return authToken;\n }\n\n return null;\n}\n\nexport async function readConfigAuthTokenWithErrorLogging() {\n const token = await readConfigAuthToken();\n if (!token) {\n error(\n `Looks like you are not logged in. Please log in with ${chalk.green('`instant-cli login`')}`,\n );\n }\n return token;\n}\n\n// utils\n\nfunction sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function countEntities(o) {\n return Object.keys(o).length;\n}\n"]}
1
+ {"version":3,"file":"old.js","sourceRoot":"","sources":["../src/old.js"],"names":[],"mappings":"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","sourcesContent":["import boxen from 'boxen';\nimport chalk from 'chalk';\nimport { program } from '@commander-js/extra-typings';\nimport path from 'node:path';\nimport { readAuthToken } from './auth/index.ts';\nimport { UI } from './ui/index.ts';\nimport { deferred, renderUnwrap } from './ui/lib.ts';\nimport {\n getEmailReadCandidates,\n getPermsReadCandidates,\n getSchemaReadCandidates,\n} from './util/findConfigCandidates.ts';\nimport { loadConfig } from './util/loadConfig.ts';\nimport { ResolveRenamePrompt } from './util/renamePrompt.ts';\nimport version from './version.js';\nimport { link } from './logging.ts';\n\nconst dev = Boolean(process.env.INSTANT_CLI_DEV);\nconst verbose = Boolean(process.env.INSTANT_CLI_VERBOSE);\n\nfunction error(firstArg, ...rest) {\n console.error(chalk.red('[error]') + ' ' + firstArg, ...rest);\n}\n\nconst potentialAdminTokenEnvs = {\n default: 'INSTANT_APP_ADMIN_TOKEN',\n short: 'INSTANT_ADMIN_TOKEN',\n};\n\nconst instantDashOrigin = dev\n ? 'http://localhost:3000'\n : 'https://instantdb.com';\n\nfunction indexingJobCompletedActionMessage(job) {\n if (job.job_type === 'check-data-type') {\n return `setting type of ${job.attr_name} to ${job.checked_data_type}`;\n }\n if (job.job_type === 'remove-data-type') {\n return `removing type from ${job.attr_name}`;\n }\n if (job.job_type === 'index') {\n return `adding index to ${job.attr_name}`;\n }\n if (job.job_type === 'remove-index') {\n return `removing index from ${job.attr_name}`;\n }\n if (job.job_type === 'unique') {\n return `adding uniqueness constraint to ${job.attr_name}`;\n }\n if (job.job_type === 'remove-unique') {\n return `removing uniqueness constraint from ${job.attr_name}`;\n }\n if (job.job_type === 'required') {\n return `adding required constraint to ${job.attr_name}`;\n }\n if (job.job_type === 'remove-required') {\n return `removing required constraint from ${job.attr_name}`;\n }\n return `unexpected job type ${job.job_type} - please ping us on discord with this job id (${job.id})`;\n}\n\nfunction truncate(s, maxLen) {\n if (s.length > maxLen) {\n return `${s.substr(0, maxLen - 3)}...`;\n }\n return s;\n}\n\nfunction formatSamples(triples_samples) {\n return triples_samples.slice(0, 3).map((t) => {\n return { ...t, value: truncate(JSON.stringify(t.value), 32) };\n });\n}\n\nfunction createUrl(triple, job) {\n const urlParams = new URLSearchParams({\n s: 'main',\n app: job.app_id,\n t: 'explorer',\n ns: job.attr_name.split('.')[0],\n where: JSON.stringify(['id', triple.entity_id]),\n });\n const url = new URL(instantDashOrigin);\n url.pathname = '/dash';\n url.search = urlParams.toString();\n return url;\n}\n\nfunction padCell(value, width) {\n const trimmed = value.length > width ? value.substring(0, width) : value;\n return trimmed + ' '.repeat(width - trimmed.length);\n}\n\nfunction indexingJobCompletedMessage(job) {\n const actionMessage = indexingJobCompletedActionMessage(job);\n if (job.job_status === 'canceled') {\n return `Canceled ${actionMessage} before it could finish.`;\n }\n if (job.job_status === 'completed') {\n return `Finished ${actionMessage}.`;\n }\n if (job.job_status === 'errored') {\n if (job.invalid_triples_sample?.length) {\n const [etype, label] = job.attr_name.split('.');\n const samples = formatSamples(job.invalid_triples_sample);\n const longestValue = samples.reduce(\n (acc, { value }) => Math.max(acc, value.length),\n label.length,\n );\n\n const columns = [\n { header: 'namespace', width: 15, getValue: () => etype },\n {\n header: 'id',\n width: 37,\n getValue: (triple) =>\n link(createUrl(triple, job).toString(), triple.entity_id),\n },\n {\n header: label,\n width: longestValue + 2,\n getValue: (triple) => triple.value,\n },\n { header: 'type', width: 8, getValue: (triple) => triple.json_type },\n ];\n\n let msg = `${chalk.red('INVALID DATA')} ${actionMessage}.\\n`;\n if (job.invalid_unique_value) {\n msg += ` Found multiple entities with value ${truncate(JSON.stringify(job.invalid_unique_value), 64)}.\\n`;\n }\n if (job.error === 'triple-too-large-error') {\n msg += ` Some of the existing data is too large to index.\\n`;\n }\n\n msg += ` First few examples:\\n`;\n msg += ` ${columns.map((col) => chalk.bold(padCell(col.header, col.width))).join(' | ')}\\n`;\n msg += ` ${columns.map((col) => '-'.repeat(col.width)).join('-|-')}\\n`;\n\n for (const triple of samples) {\n const cells = columns.map((col) =>\n padCell(col.getValue(triple), col.width),\n );\n msg += ` ${cells.join(' | ')}\\n`;\n }\n return msg;\n }\n return `Error ${actionMessage}.`;\n }\n}\n\nfunction joinInSentence(items) {\n if (items.length === 0) {\n return '';\n }\n if (items.length === 1) {\n return items[0];\n }\n if (items.length === 2) {\n return `${items[0]} and ${items[1]}`;\n }\n return `${items.slice(0, -1).join(', ')}, and ${items[items.length - 1]}`;\n}\n\nfunction jobGroupDescription(jobs) {\n const actions = new Set();\n const jobActions = {\n 'check-data-type': 'updating types',\n 'remove-data-type': 'updating types',\n index: 'updating indexes',\n 'remove-index': 'updating indexes',\n unique: 'updating uniqueness constraints',\n 'remove-unique': 'updating uniqueness constraints',\n required: 'making attributes required',\n 'remove-required': 'making attributes optional',\n };\n for (const job of jobs) {\n actions.add(jobActions[job.job_type]);\n }\n return joinInSentence([...actions].sort()) || 'updating schema';\n}\n\n// TODO: rewrite in effect\nexport async function waitForIndexingJobsToFinish(\n appId,\n data,\n authToken,\n apiURI,\n) {\n const spinnerDefferedPromise = deferred();\n const spinner = new UI.Spinner({\n promise: spinnerDefferedPromise.promise,\n });\n const spinnerRenderPromise = renderUnwrap(spinner);\n\n const groupId = data['group-id'];\n let jobs = data.jobs;\n let waitMs = 20;\n let lastUpdatedAt = new Date(0);\n\n const completedIds = new Set();\n\n const errorMessages = [];\n\n while (true) {\n let stillRunning = false;\n let updated = false;\n let workEstimateTotal = 0;\n let workCompletedTotal = 0;\n\n for (const job of jobs) {\n const updatedAt = new Date(job.updated_at);\n if (updatedAt > lastUpdatedAt) {\n updated = true;\n lastUpdatedAt = updatedAt;\n }\n if (job.job_status === 'waiting' || job.job_status === 'processing') {\n stillRunning = true;\n // Default estimate to high value to prevent % from jumping around\n workEstimateTotal += job.work_estimate ?? 50000;\n workCompletedTotal += job.work_completed ?? 0;\n } else {\n if (!completedIds.has(job.id)) {\n completedIds.add(job.id);\n const msg = indexingJobCompletedMessage(job);\n if (msg) {\n if (job.job_status === 'errored') {\n spinner.addMessage(msg);\n errorMessages.push(msg);\n } else {\n spinner.addMessage(msg);\n }\n }\n }\n }\n }\n if (!stillRunning) {\n break;\n }\n if (workEstimateTotal) {\n const percent = Math.floor(\n (workCompletedTotal / workEstimateTotal) * 100,\n );\n spinner.updateText(`${jobGroupDescription(jobs)} ${percent}%`);\n }\n waitMs = updated ? 1 : Math.min(10000, waitMs * 2);\n await sleep(waitMs);\n const res = await fetchJson({\n debugName: 'Check indexing status',\n method: 'GET',\n authToken,\n apiURI,\n path: `/dash/apps/${appId}/indexing-jobs/group/${groupId}`,\n errorMessage: 'Failed to check indexing status.',\n command: 'push',\n });\n if (!res.ok) {\n break;\n }\n jobs = res.data.jobs;\n }\n\n spinnerDefferedPromise.resolve(null);\n\n await spinnerRenderPromise;\n\n // Log errors at the end so that they're easier to see.\n if (errorMessages.length) {\n for (const msg of errorMessages) {\n console.log(msg);\n }\n console.log(chalk.red('Some steps failed while updating schema.'));\n process.exit(1);\n }\n}\n\nexport const resolveRenames = async (created, promptData, extraInfo) => {\n const answer = await renderUnwrap(\n new ResolveRenamePrompt(\n created,\n promptData,\n extraInfo,\n UI.modifiers.piped([\n (out) =>\n boxen(out, {\n dimBorder: true,\n padding: {\n left: 1,\n right: 1,\n },\n }),\n UI.modifiers.vanishOnComplete,\n ]),\n ),\n );\n return answer;\n};\n\n/**\n * Fetches JSON data from a specified path using the POST method.\n *\n * @param {Object} options\n * @param {string} options.debugName\n * @param {string} options.errorMessage\n * @param {string} options.path\n * @param {'POST' | 'GET'} [options.method]\n * @param {Object} [options.body=undefined]\n * @param {boolean} [options.noAuth]\n * @param {boolean} [options.noLogError]\n * @param {string} [options.command] - The CLI command being executed (e.g., 'push', 'pull', 'login')\n * @param {string} [options.authToken] - Optional auth token to use instead of reading from config\n * @param {string} options.apiURI - Backend API origin\n * @param {Record<string, string>} [options.headers] - Extra headers to include in the request\n * @returns {Promise<{ ok: boolean; data: any }>}\n */\nasync function fetchJson({\n debugName,\n errorMessage,\n path,\n body,\n method,\n noAuth,\n noLogError,\n command,\n authToken: providedAuthToken,\n apiURI,\n headers: extraHeaders,\n}) {\n const withAuth = !noAuth;\n const withErrorLogging = !noLogError;\n let authToken = null;\n if (withAuth) {\n authToken =\n providedAuthToken ?? (await readConfigAuthTokenWithErrorLogging(apiURI));\n if (!authToken) {\n return { ok: false, data: undefined };\n }\n }\n const timeoutMs = 1000 * 60 * 5; // 5 minutes\n\n try {\n const res = await fetch(`${apiURI}${path}`, {\n method: method ?? 'GET',\n headers: {\n ...(withAuth ? { Authorization: `Bearer ${authToken}` } : {}),\n 'Content-Type': 'application/json',\n 'X-Instant-Source': 'instant-cli',\n 'X-Instant-Version': version,\n ...(command ? { 'X-Instant-Command': command } : {}),\n ...extraHeaders,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (verbose) {\n console.log(debugName, 'response:', res.status, res.statusText);\n }\n\n let data;\n try {\n data = await res.json();\n } catch {\n data = null;\n }\n if (verbose && data) {\n console.log(debugName, 'json:', JSON.stringify(data, null, 2));\n }\n if (!res.ok) {\n if (withErrorLogging) {\n error(errorMessage);\n prettyPrintJSONErr(data);\n }\n return { ok: false, data };\n }\n\n return { ok: true, data };\n } catch (err) {\n if (withErrorLogging) {\n if (err.name === 'AbortError') {\n error(\n `Timeout: It took more than ${timeoutMs / 60000} minutes to get the result.`,\n );\n } else {\n error(`Error: type: ${err.name}, message: ${err.message}`);\n }\n }\n return { ok: false, data: null };\n }\n}\n\nfunction prettyPrintJSONErr(data) {\n if (data?.message) {\n error(data.message);\n }\n if (Array.isArray(data?.hint?.errors)) {\n for (const err of data.hint.errors) {\n error(`${err.in ? err.in.join('->') + ': ' : ''}${err.message}`);\n }\n }\n if (!data) {\n error('Failed to parse error response');\n }\n}\n\nexport async function readLocalPermsFile() {\n const readCandidates = getPermsReadCandidates();\n const res = await loadConfig({\n sources: readCandidates,\n merge: false,\n });\n if (!res.config) return;\n const relativePath = path.relative(process.cwd(), res.sources[0]);\n return { path: relativePath, perms: res.config };\n}\n\nexport async function readLocalSchemaFile() {\n const readCandidates = getSchemaReadCandidates();\n const res = await loadConfig({\n sources: readCandidates,\n merge: false,\n });\n if (!res.config) return;\n const relativePath = path.relative(process.cwd(), res.sources[0]);\n return { path: relativePath, schema: res.config };\n}\n\nexport async function readLocalEmailFile(emailPath) {\n const readCandidates = getEmailReadCandidates(emailPath);\n const res = await loadConfig({\n sources: readCandidates,\n merge: false,\n });\n if (!res.config) return;\n const relativePath = path.relative(process.cwd(), res.sources[0]);\n return { path: relativePath, email: res.config };\n}\n\nasync function readConfigAuthToken(apiURI, allowAdminToken = true) {\n const options = program.opts();\n // @ts-expect-error command opts type is unknown\n if (typeof options.token === 'string') {\n // @ts-expect-error command opts type is unknown\n return options.token;\n }\n\n if (process.env.INSTANT_CLI_AUTH_TOKEN) {\n return process.env.INSTANT_CLI_AUTH_TOKEN;\n }\n\n if (allowAdminToken) {\n const adminTokenNames = Object.values(potentialAdminTokenEnvs);\n for (const envName of adminTokenNames) {\n const token = process.env[envName];\n if (token) {\n return token;\n }\n }\n }\n\n const authToken = await readAuthToken(apiURI).catch(() => null);\n\n if (authToken) {\n return authToken;\n }\n\n return null;\n}\n\nexport async function readConfigAuthTokenWithErrorLogging(apiURI) {\n const token = await readConfigAuthToken(apiURI);\n if (!token) {\n error(\n `Looks like you are not logged in. Please log in with ${chalk.green('`instant-cli login`')}`,\n );\n }\n return token;\n}\n\n// utils\n\nfunction sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function countEntities(o) {\n return Object.keys(o).length;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { Effect } from 'effect';
2
2
  import { InstantHttpAuthed } from '../lib/http.ts';
3
3
  import { CurrentApp } from '../context/currentApp.ts';
4
- export declare const getAppName: Effect.Effect<string, import("../lib/http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("effect/ParseResult").ParseError | import("@effect/platform/HttpClientError").ResponseError, InstantHttpAuthed | CurrentApp>;
4
+ export declare const getAppName: Effect.Effect<string, import("effect/ParseResult").ParseError | import("../lib/http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("@effect/platform/HttpClientError").ResponseError, InstantHttpAuthed | CurrentApp>;
5
5
  //# sourceMappingURL=getAppName.d.ts.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "instant-cli",
3
3
  "type": "module",
4
- "version": "1.0.56",
4
+ "version": "1.0.57",
5
5
  "description": "Instant's CLI",
6
6
  "license": "Apache-2.0",
7
7
  "homepage": "https://github.com/instantdb/instant/tree/main/client/packages/cli",
@@ -11,6 +11,12 @@
11
11
  "directory": "client/packages/cli"
12
12
  },
13
13
  "exports": {
14
+ "./auth": {
15
+ "import": {
16
+ "types": "./dist/auth/index.d.ts",
17
+ "default": "./dist/auth/index.js"
18
+ }
19
+ },
14
20
  "./ui": {
15
21
  "import": {
16
22
  "types": "./dist/ui/index.d.ts",
@@ -50,9 +56,9 @@
50
56
  "strip-ansi": "^7.1.2",
51
57
  "supports-hyperlinks": "^4.4.0",
52
58
  "unconfig": "^7.5.0",
53
- "@instantdb/core": "1.0.56",
54
- "@instantdb/platform": "1.0.56",
55
- "@instantdb/version": "1.0.56"
59
+ "@instantdb/core": "1.0.57",
60
+ "@instantdb/platform": "1.0.57",
61
+ "@instantdb/version": "1.0.57"
56
62
  },
57
63
  "devDependencies": {
58
64
  "@babel/core": "^7.17.9",
@@ -0,0 +1,125 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { mkdir, readFile, unlink, writeFile } from 'node:fs/promises';
3
+ import { dirname, join } from 'node:path';
4
+ import envPaths from 'env-paths';
5
+
6
+ const CLOUD_API_URI = 'https://api.instantdb.com';
7
+ const LOCAL_API_URI = 'http://localhost:8888';
8
+
9
+ function normalizeApiURI(apiURI: string) {
10
+ const url = new URL(apiURI);
11
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
12
+ throw new Error('Instant API URI must use http:// or https://');
13
+ }
14
+
15
+ url.search = '';
16
+ url.hash = '';
17
+ url.pathname = url.pathname.replace(/\/+$/, '');
18
+
19
+ return url.toString().replace(/\/$/, '');
20
+ }
21
+
22
+ function getAuthConfigFilePath(apiURI: string) {
23
+ const normalizedApiURI = normalizeApiURI(apiURI);
24
+ const backendKey = createHash('sha256')
25
+ .update(normalizedApiURI)
26
+ .digest('hex');
27
+ const { config: configDir } = envPaths('instantdb-prod');
28
+
29
+ return join(configDir, 'auth', backendKey);
30
+ }
31
+
32
+ function getLegacyAuthConfigFilePath(apiURI: string) {
33
+ const normalizedApiURI = normalizeApiURI(apiURI);
34
+ const legacyConfigName =
35
+ normalizedApiURI === CLOUD_API_URI
36
+ ? 'instantdb-prod'
37
+ : normalizedApiURI === LOCAL_API_URI
38
+ ? 'instantdb-dev'
39
+ : null;
40
+
41
+ if (!legacyConfigName) {
42
+ return null;
43
+ }
44
+
45
+ return join(envPaths(legacyConfigName).config, 'a');
46
+ }
47
+
48
+ async function readFileOrNull(filePath: string) {
49
+ try {
50
+ return (await readFile(filePath, 'utf8')).trim();
51
+ } catch (error) {
52
+ if (isFileNotFoundError(error)) {
53
+ return null;
54
+ }
55
+ throw error;
56
+ }
57
+ }
58
+
59
+ export async function readAuthToken(apiURI: string) {
60
+ const authConfigFilePath = getAuthConfigFilePath(apiURI);
61
+ const authToken = await readFileOrNull(authConfigFilePath);
62
+ if (authToken) {
63
+ return authToken;
64
+ }
65
+
66
+ const legacyPath = getLegacyAuthConfigFilePath(apiURI);
67
+ if (!legacyPath) {
68
+ return null;
69
+ }
70
+
71
+ const legacyAuthToken = await readFileOrNull(legacyPath);
72
+ if (!legacyAuthToken) {
73
+ return null;
74
+ }
75
+
76
+ await writeAuthTokenFile(authConfigFilePath, legacyAuthToken).catch(
77
+ () => undefined,
78
+ );
79
+ return legacyAuthToken;
80
+ }
81
+
82
+ export async function writeAuthToken(apiURI: string, authToken: string) {
83
+ const authConfigFilePath = getAuthConfigFilePath(apiURI);
84
+ await writeAuthTokenFile(authConfigFilePath, authToken);
85
+
86
+ const legacyPath = getLegacyAuthConfigFilePath(apiURI);
87
+ if (legacyPath) {
88
+ await writeAuthTokenFile(legacyPath, authToken).catch(() => undefined);
89
+ }
90
+ }
91
+
92
+ async function writeAuthTokenFile(filePath: string, authToken: string) {
93
+ await mkdir(dirname(filePath), { recursive: true });
94
+ await writeFile(filePath, authToken, { encoding: 'utf8', mode: 0o600 });
95
+ }
96
+
97
+ export async function removeAuthToken(apiURI: string) {
98
+ const authConfigFilePath = getAuthConfigFilePath(apiURI);
99
+ const legacyPath = getLegacyAuthConfigFilePath(apiURI);
100
+ const paths = legacyPath
101
+ ? [authConfigFilePath, legacyPath]
102
+ : [authConfigFilePath];
103
+ const removed = await Promise.all(paths.map(removeFileIfExists));
104
+ return removed.some(Boolean);
105
+ }
106
+
107
+ async function removeFileIfExists(filePath: string) {
108
+ try {
109
+ await unlink(filePath);
110
+ return true;
111
+ } catch (error) {
112
+ if (isFileNotFoundError(error)) {
113
+ return false;
114
+ }
115
+ throw error;
116
+ }
117
+ }
118
+
119
+ function isFileNotFoundError(error: unknown): error is NodeJS.ErrnoException {
120
+ return (
121
+ error instanceof Error &&
122
+ 'code' in error &&
123
+ (error as NodeJS.ErrnoException).code === 'ENOENT'
124
+ );
125
+ }
@@ -3,7 +3,7 @@ import { Effect } from 'effect';
3
3
  import openInBrowser from 'open';
4
4
  import { loginDef } from '../index.ts';
5
5
  import type { OptsFromCommand } from '../index.ts';
6
- import { getDashUrl } from '../lib/http.ts';
6
+ import { getDashUrl } from '../lib/config.ts';
7
7
  import {
8
8
  getLoginTicketAndSecret,
9
9
  saveConfigAuthToken,
@@ -31,7 +31,7 @@ export const loginCommand = Effect.fn(function* (
31
31
  const ok = yield* promptOk(
32
32
  {
33
33
  promptText:
34
- 'This will open instantdb.com in your browser, OK to proceed?',
34
+ 'This will open your Instant dashboard in your browser, OK to proceed?',
35
35
  },
36
36
  true,
37
37
  );
@@ -1,23 +1,22 @@
1
1
  import { Effect } from 'effect';
2
- import { getAuthPaths } from '../util/getAuthPaths.ts';
3
- import { FileSystem } from '@effect/platform';
4
2
  import chalk from 'chalk';
5
- import { SystemError } from '@effect/platform/Error';
3
+ import { removeAuthToken } from '../auth/index.ts';
4
+ import { getBaseUrl } from '../lib/config.ts';
6
5
 
7
6
  export const logoutCommand = Effect.fn(function* () {
8
- const { authConfigFilePath } = getAuthPaths();
9
- const fs = yield* FileSystem.FileSystem;
10
-
11
- yield* Effect.matchEffect(fs.remove(authConfigFilePath), {
12
- onFailure: (e) =>
13
- Effect.gen(function* () {
14
- if (e instanceof SystemError && e.reason === 'NotFound') {
15
- yield* Effect.log(chalk.green('You were already logged out!'));
16
- } else {
17
- yield* Effect.logError(chalk.red('Failed to logout: ' + e.message));
18
- }
19
- }),
20
- onSuccess: () =>
21
- Effect.log(chalk.green('Successfully logged out from Instant!')),
22
- });
7
+ const apiURI = yield* getBaseUrl;
8
+ yield* Effect.tryPromise(() => removeAuthToken(apiURI)).pipe(
9
+ Effect.matchEffect({
10
+ onFailure: (error) =>
11
+ Effect.logError(chalk.red(`Failed to logout: ${error.message}`)),
12
+ onSuccess: (removed) =>
13
+ Effect.log(
14
+ chalk.green(
15
+ removed
16
+ ? 'Successfully logged out from Instant!'
17
+ : 'You were already logged out!',
18
+ ),
19
+ ),
20
+ }),
21
+ );
23
22
  });
@@ -1,8 +1,7 @@
1
- import { FileSystem } from '@effect/platform';
2
1
  import { Config, Context, Effect, Layer, Option, Ref, Schema } from 'effect';
3
- import envPaths from 'env-paths';
4
- import { join } from 'node:path';
2
+ import { readAuthToken } from '../auth/index.ts';
5
3
  import { loginCommand } from '../commands/login.ts';
4
+ import { getBaseUrl } from '../lib/config.ts';
6
5
  import { program } from '../program.ts';
7
6
 
8
7
  type AuthTokenSource = 'admin' | 'env' | 'opt' | 'file';
@@ -64,14 +63,10 @@ export const authTokenGetEffect = (allowAdminToken: boolean = true) =>
64
63
  };
65
64
  }
66
65
 
67
- const authPaths = yield* getAuthPaths;
68
- const fs = yield* FileSystem.FileSystem;
69
- const file = yield* fs
70
- .readFileString(authPaths.authConfigFilePath, 'utf8')
71
- .pipe(
72
- // will usually fail if file not found, return null instead
73
- Effect.orElseSucceed(() => null),
74
- );
66
+ const apiURI = yield* getBaseUrl;
67
+ const file = yield* Effect.tryPromise(() => readAuthToken(apiURI)).pipe(
68
+ Effect.orElseSucceed(() => null),
69
+ );
75
70
  if (file) {
76
71
  return {
77
72
  authToken: file,
@@ -137,13 +132,3 @@ export const AuthTokenLive = ({
137
132
  ),
138
133
  ),
139
134
  );
140
-
141
- const getAuthPaths = Effect.gen(function* () {
142
- const dev = yield* Config.boolean('INSTANT_CLI_DEV').pipe(
143
- Config.withDefault(false),
144
- );
145
- const key = `instantdb-${dev ? 'dev' : 'prod'}`;
146
- const { config: appConfigDirPath } = envPaths(key);
147
- const authConfigFilePath = join(appConfigDirPath, 'a');
148
- return { authConfigFilePath, appConfigDirPath };
149
- });
@@ -0,0 +1,68 @@
1
+ import { Config, Effect, Option, Schema } from 'effect';
2
+ import { BadArgsError } from '../errors.ts';
3
+ import { readInstantConfigFile } from '../util/instantConfig.ts';
4
+
5
+ const HttpUrl = Schema.URL.pipe(
6
+ Schema.filter(
7
+ (url) =>
8
+ url.protocol === 'http:' ||
9
+ url.protocol === 'https:' ||
10
+ 'Expected an HTTP(S) URL',
11
+ ),
12
+ );
13
+
14
+ export const getBaseUrl = Effect.gen(function* () {
15
+ const setEnv = yield* Config.string('INSTANT_CLI_API_URI').pipe(
16
+ Config.option,
17
+ );
18
+ const dev = yield* Config.boolean('INSTANT_CLI_DEV').pipe(
19
+ Config.withDefault(false),
20
+ );
21
+
22
+ if (Option.isSome(setEnv)) {
23
+ return setEnv.value;
24
+ }
25
+
26
+ const instantConfig = yield* Effect.tryPromise(readInstantConfigFile);
27
+ if (instantConfig?.apiURI !== undefined) {
28
+ yield* Schema.decodeUnknown(HttpUrl)(instantConfig.apiURI).pipe(
29
+ Effect.mapError(() =>
30
+ BadArgsError.make({
31
+ message:
32
+ 'Invalid apiURI in instant.config.ts. Expected a valid HTTP(S) URL.',
33
+ }),
34
+ ),
35
+ );
36
+ return instantConfig.apiURI;
37
+ }
38
+
39
+ return dev ? 'http://localhost:8888' : 'https://api.instantdb.com';
40
+ });
41
+
42
+ export const getDashUrl = Effect.gen(function* () {
43
+ const setEnv = yield* Config.string('INSTANT_CLI_DASH_URI').pipe(
44
+ Config.option,
45
+ );
46
+ const dev = yield* Config.boolean('INSTANT_CLI_DEV').pipe(
47
+ Config.withDefault(false),
48
+ );
49
+
50
+ if (Option.isSome(setEnv)) {
51
+ return setEnv.value;
52
+ }
53
+
54
+ const instantConfig = yield* Effect.tryPromise(readInstantConfigFile);
55
+ if (instantConfig?.dashURI !== undefined) {
56
+ yield* Schema.decodeUnknown(HttpUrl)(instantConfig.dashURI).pipe(
57
+ Effect.mapError(() =>
58
+ BadArgsError.make({
59
+ message:
60
+ 'Invalid dashURI in instant.config.ts. Expected a valid HTTP(S) URL.',
61
+ }),
62
+ ),
63
+ );
64
+ return instantConfig.dashURI;
65
+ }
66
+
67
+ return dev ? 'http://localhost:3000' : 'https://instantdb.com';
68
+ });