@w6w/cli 0.9.13 → 0.9.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -23,18 +23,30 @@ released together. A given version means the same set of operations in every lan
23
23
 
24
24
  ## Configuration
25
25
 
26
- Two environment variables:
26
+ With nothing configured, `w6w` talks to **`https://api.w6w.io`**. Save a token once and later
27
+ commands use it:
27
28
 
28
- | Variable | Meaning | Required |
29
- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
30
- | `W6W_BASE_URL` | The **origin** of your w6w server, e.g. `https://api.example.com`. The API is served at the root of that host, so nothing is appended — and a stale `/api` suffix from `0.1.x` must be dropped. | Yes |
31
- | `W6W_TOKEN` | Your API token, sent as `Authorization: Bearer <token>` on every request. | Yes |
29
+ ```bash
30
+ printf '%s' "$W6W_TOKEN" | w6w auth login - # preferred: keeps the token out of shell history
31
+ w6w auth login <token> # also works, but the token lands in history and `ps`
32
+ w6w auth status # base URL, where it came from, masked token
33
+ w6w auth logout
34
+ ```
35
+
36
+ The token is stored per user (`~/.config/w6w/config.json`, or `$XDG_CONFIG_HOME/w6w/…`;
37
+ `%APPDATA%\w6w\…` on Windows), mode `0600`, and **bound to the base URL it was saved for** — it is
38
+ never sent to another host. Two environment variables and two flags override it:
39
+
40
+ | Variable | Meaning | Required |
41
+ | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
42
+ | `W6W_BASE_URL` | The **origin** of your w6w server, e.g. `https://api.example.com`. Defaults to `https://api.w6w.io`. The API is served at the root of that host, so nothing is appended — and a stale `/api` suffix from `0.1.x` must be dropped. | No |
43
+ | `W6W_TOKEN` | Your API token, sent as `Authorization: Bearer <token>` on every request. Not needed after `w6w auth login`. | No |
32
44
 
33
- Both have a flag equivalent, and **a flag always wins over the environment**: `--base-url <url>` and
34
- `--token <token>`.
45
+ Both have a flag equivalent, and **a flag always wins over the environment, which wins over the
46
+ stored config**: `--base-url <url>` and `--token <token>`.
35
47
 
36
48
  ```bash
37
- export W6W_BASE_URL=https://api.example.com
49
+ export W6W_BASE_URL=https://api.example.com # only for a self-hosted server
38
50
  export W6W_TOKEN=…
39
51
  w6w workflows list
40
52
  ```
@@ -88,7 +100,6 @@ A few flags that `--help` lists aren't applied yet:
88
100
  - `functions run` / `endpoints run` read neither `--id-or-key` nor `--inputs` / `--input`, and
89
101
  reject `--payload`. Pass the key positionally, and send input with
90
102
  `w6w run fn:<key> --payload '…'` (or `ep:<key>`).
91
- - `workflows update` ignores `--if-unmodified-since`, so the save always wins.
92
103
  - `team --help` still says the routes return `404`; they are live and work.
93
104
  - `functions delete` needs the Function archived first, which the CLI can't do yet.
94
105
 
@@ -109,12 +120,12 @@ root help and exits `0`.
109
120
 
110
121
  ## Exit codes
111
122
 
112
- | Code | Meaning |
113
- | ---- | -------------------------------------------------------------------------------------------------------- |
114
- | `0` | Success — including help, and including a _queued_ or _running_ workflow |
115
- | `1` | Usage or configuration error — unknown command, missing argument, bad flag or JSON, no base URL or token |
116
- | `2` | API error — 4xx/5xx from the server, including auth failure, or the server could not be reached |
117
- | `3` | Run failure — `--wait` returned a run with status `failed` |
123
+ | Code | Meaning |
124
+ | ---- | ------------------------------------------------------------------------------------------------------------------- |
125
+ | `0` | Success — including help, and including a _queued_ or _running_ workflow |
126
+ | `1` | Usage or configuration error — unknown command, missing argument, bad flag or JSON, no token, an empty `--base-url` |
127
+ | `2` | API error — 4xx/5xx from the server, including auth failure, or the server could not be reached |
128
+ | `3` | Run failure — `--wait` returned a run with status `failed` |
118
129
 
119
130
  Code `3` exists so `w6w workflows run --wait` is usable in CI without parsing stdout. Keeping it
120
131
  distinct from `2` matters: a failed workflow and an unreachable API demand opposite responses, and a
package/dist/bin/w6w.js CHANGED
@@ -21,6 +21,7 @@
21
21
  import { main } from "../mod.js";
22
22
  import { COMMANDS } from "../src/commands/index.js";
23
23
  import { systemRuntime } from "../src/runtime.js";
24
+ import { fsConfigStore, readStdin, stdinIsTerminal } from "../src/store-fs.js";
24
25
  /**
25
26
  * The commands this build can run.
26
27
  *
@@ -53,6 +54,9 @@ const code = await main(runtime.args, runtime, {
53
54
  env: runtime.env,
54
55
  isTty: stdoutIsTerminal(),
55
56
  commands,
57
+ // The only place the real file store and real stdin are constructed.
58
+ store: fsConfigStore(runtime.env),
59
+ stdin: { isTerminal: stdinIsTerminal, read: readStdin },
56
60
  });
57
61
  runtime.exit(code);
58
62
  //# sourceMappingURL=w6w.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"w6w.js","sourceRoot":"","sources":["../../bin/w6w.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;;;;;GAQG;AACH,MAAM,QAAQ,GAAoB,QAAQ,CAAC;AAE3C;;;;;;;;;GASG;AACH,SAAS,gBAAgB;IACvB,MAAM,IAAI,GAAG,UAGZ,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,IAAI,IAAI,EAAE,UAAU;QAAE,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC/C,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;AAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE;IAC7C,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,KAAK,EAAE,gBAAgB,EAAE;IACzB,QAAQ;CACT,CAAC,CAAC;AACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"w6w.js","sourceRoot":"","sources":["../../bin/w6w.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE/E;;;;;;;;GAQG;AACH,MAAM,QAAQ,GAAoB,QAAQ,CAAC;AAE3C;;;;;;;;;GASG;AACH,SAAS,gBAAgB;IACvB,MAAM,IAAI,GAAG,UAGZ,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,IAAI,IAAI,EAAE,UAAU;QAAE,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC/C,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;AAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE;IAC7C,GAAG,EAAE,OAAO,CAAC,GAAG;IAChB,KAAK,EAAE,gBAAgB,EAAE;IACzB,QAAQ;IACR,qEAAqE;IACrE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC;IACjC,KAAK,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE;CACxD,CAAC,CAAC;AACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
package/dist/mod.d.ts CHANGED
@@ -27,14 +27,17 @@
27
27
  */
28
28
  import type { Invocation } from "./src/args.ts";
29
29
  import type { EnvReader } from "./src/client.ts";
30
+ import type { ConfigStore, StdinSource, StoredConfig } from "./src/config-store.ts";
30
31
  import type { Output } from "./src/output.ts";
31
32
  import type { HelpCommand } from "./src/help.generated.ts";
32
33
  import type { CliIo } from "./src/runtime.ts";
33
34
  import type { FetchLike, W6WClient } from "@w6w/sdk";
34
35
  export { parse } from "./src/args.ts";
35
36
  export type { FlagSpec, GlobalOptions, Invocation, ParseOptions, ParseResult } from "./src/args.ts";
36
- export { createClient, ENV_BASE_URL, ENV_TOKEN, envValue, NO_ENV } from "./src/client.ts";
37
- export type { ClientOptions, EnvReader } from "./src/client.ts";
37
+ export { createClient, DEFAULT_BASE_URL, ENV_BASE_URL, ENV_TOKEN, envValue, NO_ENV, resolveSettings, } from "./src/client.ts";
38
+ export type { ClientOptions, EnvReader, ResolvedSettings, Source } from "./src/client.ts";
39
+ export { configPath, loadConfig, NO_CONFIG, NO_STDIN, NO_STORE, parseConfig, serializeConfig, } from "./src/config-store.ts";
40
+ export type { ConfigStore, StdinSource, StoredConfig } from "./src/config-store.ts";
38
41
  export { createOutput, ENV_NO_COLOR, useColor } from "./src/output.ts";
39
42
  export type { Output, OutputOptions, Styles } from "./src/output.ts";
40
43
  export { EXIT_API_ERROR, EXIT_RUN_FAILURE, EXIT_SUCCESS, EXIT_USAGE, exitCodeFor, } from "./src/exit.ts";
@@ -79,6 +82,14 @@ export interface CommandContext {
79
82
  * @throws {ConfigError} When the base URL or token is missing or unusable.
80
83
  */
81
84
  client(): W6WClient;
85
+ /** The environment seam this invocation runs with. */
86
+ readonly env: EnvReader;
87
+ /** The stored per-user config, read once before the handler runs (nothing stored by default). */
88
+ readonly stored: StoredConfig;
89
+ /** Where the config is persisted. Only the `auth` commands write through it. */
90
+ readonly store: ConfigStore;
91
+ /** Standard input, for `auth login -`. */
92
+ readonly stdin: StdinSource;
82
93
  }
83
94
  /**
84
95
  * One command's implementation.
@@ -108,6 +119,13 @@ export interface CliOptions {
108
119
  isTty?: boolean;
109
120
  /** The commands that are wired up. Defaults to none. */
110
121
  commands?: CommandRegistry;
122
+ /**
123
+ * The per-user config store. Defaults to {@linkcode NO_STORE}: nothing stored,
124
+ * no file I/O. Only `bin/w6w.ts` wires the real one.
125
+ */
126
+ store?: ConfigStore;
127
+ /** Standard input. Defaults to {@linkcode NO_STDIN}: a terminal, never read. */
128
+ stdin?: StdinSource;
111
129
  }
112
130
  /**
113
131
  * Runs a command line and returns its exit code. The whole CLI.
package/dist/mod.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../mod.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../mod.ts"],"names":[],"mappings":"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"}
package/dist/mod.js CHANGED
@@ -27,12 +27,14 @@
27
27
  */
28
28
  import { GLOBAL_FLAG_SPECS, parse } from "./src/args.js";
29
29
  import { createClient, NO_ENV } from "./src/client.js";
30
+ import { loadConfig, NO_STDIN, NO_STORE } from "./src/config-store.js";
30
31
  import { createOutput } from "./src/output.js";
31
32
  import { EXIT_SUCCESS, EXIT_USAGE, exitCodeFor } from "./src/exit.js";
32
33
  import { renderCommandHelp, renderGroupHelp, renderHelp, renderRootHelp, resolve, } from "./src/help.js";
33
34
  import { HELP_TREE } from "./src/help.generated.js";
34
35
  export { parse } from "./src/args.js";
35
- export { createClient, ENV_BASE_URL, ENV_TOKEN, envValue, NO_ENV } from "./src/client.js";
36
+ export { createClient, DEFAULT_BASE_URL, ENV_BASE_URL, ENV_TOKEN, envValue, NO_ENV, resolveSettings, } from "./src/client.js";
37
+ export { configPath, loadConfig, NO_CONFIG, NO_STDIN, NO_STORE, parseConfig, serializeConfig, } from "./src/config-store.js";
36
38
  export { createOutput, ENV_NO_COLOR, useColor } from "./src/output.js";
37
39
  export { EXIT_API_ERROR, EXIT_RUN_FAILURE, EXIT_SUCCESS, EXIT_USAGE, exitCodeFor, } from "./src/exit.js";
38
40
  export { renderCommandHelp, renderGroupHelp, renderHelp, renderRootHelp, resolve, } from "./src/help.js";
@@ -51,7 +53,7 @@ export { COMMAND_PATHS, EXIT_CODES, GLOBAL_FLAGS, HELP_TREE } from "./src/help.g
51
53
  * The explicit `: string` annotation is required, not decorative: JSR publishes
52
54
  * this file as TypeScript source and rejects inferred public types.
53
55
  */
54
- export const VERSION = "0.9.13";
56
+ export const VERSION = "0.9.16";
55
57
  /** `w6w help <command>` is accepted as an alias for `w6w <command> --help`. */
56
58
  const HELP_COMMAND = "help";
57
59
  /**
@@ -213,18 +215,28 @@ async function dispatch(routed, io, options) {
213
215
  // Built on demand and remembered: a command that never asks for the API never
214
216
  // needs a token, and one that asks twice gets one client, not two.
215
217
  let client = null;
216
- const context = {
217
- command: routed.command,
218
- invocation: routed.invocation,
219
- out,
220
- client: () => {
221
- if (client === null) {
222
- client = createClient(globals, options.env ?? NO_ENV, { fetch: options.fetch });
223
- }
224
- return client;
225
- },
226
- };
218
+ const env = options.env ?? NO_ENV;
219
+ const store = options.store ?? NO_STORE;
227
220
  try {
221
+ // Read once, before any handler: every dispatched command sees the same
222
+ // stored config, `createClient` stays synchronous, and a malformed file fails
223
+ // the command up front (help and `--version` never reach this point).
224
+ const stored = await loadConfig(store);
225
+ const context = {
226
+ command: routed.command,
227
+ invocation: routed.invocation,
228
+ out,
229
+ env,
230
+ stored,
231
+ store,
232
+ stdin: options.stdin ?? NO_STDIN,
233
+ client: () => {
234
+ if (client === null) {
235
+ client = createClient(globals, env, { fetch: options.fetch, stored });
236
+ }
237
+ return client;
238
+ },
239
+ };
228
240
  return (await handler(context)) ?? EXIT_SUCCESS;
229
241
  }
230
242
  catch (error) {
package/dist/mod.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mod.js","sourceRoot":"","sources":["../mod.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,cAAc,EACd,OAAO,GACR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAKpD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,MAAM,EACN,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,cAAc,EACd,OAAO,GACR,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,8EAA8E;AAC9E,gFAAgF;AAChF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAU7F;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAW,QAAQ,CAAC;AAExC,+EAA+E;AAC/E,MAAM,YAAY,GAAG,MAAM,CAAC;AAoF5B;;;;;;;;;;GAUG;AACH,MAAM,YAAY,GAAa,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAE9E;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CAAC,OAAoB;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACpC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAS,eAAe,CAAC,IAAc;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAChD,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,OAAO,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,KAAK,CAAC,IAAc,EAAE,EAAS;IACtC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACd,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;IAE5D,+EAA+E;IAC/E,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC;QACrD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAClC,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,sBAAsB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACd,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;QACD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpC,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,8EAA8E;QAC9E,KAAK,MAAM;YACT,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;QAE5B,KAAK,SAAS;YACZ,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,sBAAsB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACxE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACd,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;QAE1B,yEAAyE;QACzE,uEAAuE;QACvE,KAAK,OAAO;YACV,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7C,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5B,CAAC;YACD,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,uBAAuB,CAAC,CAAC;YAClF,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACd,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;QAE1B,KAAK,SAAS;YACZ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;gBACjD,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5B,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;IACvF,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,QAAQ,CAAC,MAAgB,EAAE,EAAS,EAAE,OAAmB;IACtE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;IACtC,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,EAAE;QAC3B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CACP,KAAK,GAAG,qCAAqC;YAC3C,SAAS,SAAS,CAAC,MAAM,IAAI,GAAG,YAAY,CAC/C,CAAC;QACF,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,8EAA8E;IAC9E,mEAAmE;IACnE,IAAI,MAAM,GAAqB,IAAI,CAAC;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;IAExC,IAAI,CAAC;QACH,wEAAwE;QACxE,8EAA8E;QAC9E,sEAAsE;QACtE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,OAAO,GAAmB;YAC9B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,GAAG;YACH,GAAG;YACH,MAAM;YACN,KAAK;YACL,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,QAAQ;YAChC,MAAM,EAAE,GAAG,EAAE;gBACX,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACxE,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC;QACF,OAAO,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,YAAY,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,4EAA4E;QAC5E,4EAA4E;QAC5E,4EAA4E;QAC5E,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1E,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc,EAAE,EAAS,EAAE,UAAsB,EAAE;IAC5E,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAC/C,OAAO,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,EAAS;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,EAAE,CAAC,MAAM,CACP,GAAG,SAAS,CAAC,MAAM,OAAO,IAAI,2DAA2D;QACvF,SAAS,SAAS,CAAC,MAAM,IAAI,IAAI,YAAY,CAChD,CAAC;IACF,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -9,9 +9,16 @@
9
9
  * has a flag which outranks the environment variable.
10
10
  *
11
11
  * ```
12
- * CLI flag (--base-url / --token) > environment variable > nothing (an error)
12
+ * base URL CLI flag (--base-url) > W6W_BASE_URL > stored `baseUrl` > DEFAULT_BASE_URL
13
+ * token CLI flag (--token) > W6W_TOKEN > the stored token for the resolved base URL
13
14
  * ```
14
15
  *
16
+ * The stored tier is the per-user config `w6w auth login` writes (see
17
+ * `src/config-store.ts`). A stored token is **bound to the base URL it was saved
18
+ * for**: it is looked up by the canonical resolved base URL, exact match only, so
19
+ * pointing `--base-url` or `W6W_BASE_URL` at another host can never send it
20
+ * there. That is the trust boundary of this module.
21
+ *
15
22
  * The resolved values are passed to the SDK **explicitly**, and the SDK is never
16
23
  * left to read the environment on the CLI's behalf. That is a mechanism choice,
17
24
  * not a stylistic one: the CLI has to be able to say *which* source it was
@@ -25,6 +32,11 @@
25
32
  */
26
33
  import { type FetchLike, W6WClient } from "@w6w/sdk";
27
34
  import type { GlobalOptions } from "./args.ts";
35
+ import { type StoredConfig } from "./config-store.ts";
36
+ /** The API every command targets unless told otherwise. Equals endpoints.json `defaultBaseUrl`. */
37
+ export declare const DEFAULT_BASE_URL = "https://api.w6w.io";
38
+ /** Where a resolved setting came from. */
39
+ export type Source = "flag" | "env" | "config" | "default";
28
40
  /**
29
41
  * Reads one environment variable, or `undefined` where the host has none.
30
42
  *
@@ -43,8 +55,8 @@ export declare const NO_ENV: EnvReader;
43
55
  * Read an environment variable, treating a blank value as **absent**.
44
56
  *
45
57
  * `W6W_BASE_URL=`, `W6W_BASE_URL=" "` and an unset `W6W_BASE_URL` are the same
46
- * thing: all three fall through the precedence chain to the next source, and
47
- * ultimately to a usage error naming both sources.
58
+ * thing: all three fall through the precedence chain to the next source (the
59
+ * stored base URL, then the default).
48
60
  *
49
61
  * The check is a trim-and-emptiness test and deliberately **not** a nullish
50
62
  * coalesce. `??` does not convert `""`, so a set-but-empty variable would
@@ -64,6 +76,17 @@ export declare const NO_ENV: EnvReader;
64
76
  * @returns The value, or `undefined` when it is unset or blank.
65
77
  */
66
78
  export declare function envValue(env: EnvReader, name: string): string | undefined;
79
+ /**
80
+ * Characters that cannot be carried in an HTTP header value: the C0 controls,
81
+ * `DEL`, and anything above the single-byte range.
82
+ *
83
+ * A token is normally opaque ASCII, so this rejects almost nothing real — except
84
+ * the one thing that happens constantly, which is a trailing newline on a token
85
+ * read out of a file (`W6W_TOKEN=$(cat token.txt)`). Left unchecked that reaches
86
+ * the header builder and comes back as a bare `TypeError` from outside anyone's
87
+ * error model: a stack trace, for a typo.
88
+ */
89
+ export declare function isUnsendable(token: string): boolean;
67
90
  /** Anything the caller wants to hand the client beyond the global flags. */
68
91
  export interface ClientOptions {
69
92
  /**
@@ -73,7 +96,31 @@ export interface ClientOptions {
73
96
  fetch?: FetchLike;
74
97
  /** Default project id for the project-scoped operations. */
75
98
  project?: string;
99
+ /** The stored per-user config, already read. Defaults to nothing stored. */
100
+ stored?: StoredConfig;
101
+ }
102
+ /** The base URL and token one invocation resolves to, with where each came from. */
103
+ export interface ResolvedSettings {
104
+ /** Canonical (the SDK's join: trailing slashes stripped); also the `hosts` key. */
105
+ readonly baseUrl: string;
106
+ readonly baseUrlSource: Source;
107
+ /** Absent when no source holds a token for {@linkcode baseUrl}. */
108
+ readonly token?: string;
109
+ readonly tokenSource?: Source;
76
110
  }
111
+ /**
112
+ * The one resolver. `createClient` and every `auth` command use it, so what
113
+ * `auth status` reports is what a command will do.
114
+ *
115
+ * Base URL: flag (given, even empty) > env (blank = absent) > stored `baseUrl` >
116
+ * {@linkcode DEFAULT_BASE_URL}, validated, then canonicalised once. Token: flag >
117
+ * env > `stored.hosts[<canonical base URL>]` — exact key only.
118
+ *
119
+ * @throws {ConfigError} When the base URL is blank-by-flag, relative, or not http(s),
120
+ * or a resolved token cannot be sent in a header. A *missing* token is not an
121
+ * error here; `createClient` raises that.
122
+ */
123
+ export declare function resolveSettings(globals: GlobalOptions, env?: EnvReader, stored?: StoredConfig): ResolvedSettings;
77
124
  /**
78
125
  * Build the API client for one invocation.
79
126
  *
@@ -83,7 +130,7 @@ export interface ClientOptions {
83
130
  *
84
131
  * @param globals - The parsed global flags.
85
132
  * @param env - The environment seam. Defaults to an empty environment.
86
- * @param options - Transport and default project.
133
+ * @param options - Transport, default project and the stored config.
87
134
  * @returns A configured client.
88
135
  * @throws {ConfigError} When the base URL or token is missing or unusable — a usage error.
89
136
  */
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAe,KAAK,SAAS,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAE7D,qFAAqF;AACrF,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAE3C,6EAA6E;AAC7E,eAAO,MAAM,SAAS,cAAc,CAAC;AAErC,uFAAuF;AACvF,eAAO,MAAM,MAAM,EAAE,SAA2B,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIzE;AAkGD,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,EACtB,GAAG,GAAE,SAAkB,EACvB,OAAO,GAAE,aAAkB,GAC1B,SAAS,CA8BX"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAe,KAAK,SAAS,EAAe,SAAS,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjE,mGAAmG;AACnG,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AAErD,0CAA0C;AAC1C,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE3D;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAE7D,qFAAqF;AACrF,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAE3C,6EAA6E;AAC7E,eAAO,MAAM,SAAS,cAAc,CAAC;AAErC,uFAAuF;AACvF,eAAO,MAAM,MAAM,EAAE,SAA2B,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIzE;AAqDD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAMnD;AAcD,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,oFAAoF;AACpF,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,EACtB,GAAG,GAAE,SAAkB,EACvB,MAAM,GAAE,YAAwB,GAC/B,gBAAgB,CAgDlB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,EACtB,GAAG,GAAE,SAAkB,EACvB,OAAO,GAAE,aAAkB,GAC1B,SAAS,CAqBX"}
@@ -9,9 +9,16 @@
9
9
  * has a flag which outranks the environment variable.
10
10
  *
11
11
  * ```
12
- * CLI flag (--base-url / --token) > environment variable > nothing (an error)
12
+ * base URL CLI flag (--base-url) > W6W_BASE_URL > stored `baseUrl` > DEFAULT_BASE_URL
13
+ * token CLI flag (--token) > W6W_TOKEN > the stored token for the resolved base URL
13
14
  * ```
14
15
  *
16
+ * The stored tier is the per-user config `w6w auth login` writes (see
17
+ * `src/config-store.ts`). A stored token is **bound to the base URL it was saved
18
+ * for**: it is looked up by the canonical resolved base URL, exact match only, so
19
+ * pointing `--base-url` or `W6W_BASE_URL` at another host can never send it
20
+ * there. That is the trust boundary of this module.
21
+ *
15
22
  * The resolved values are passed to the SDK **explicitly**, and the SDK is never
16
23
  * left to read the environment on the CLI's behalf. That is a mechanism choice,
17
24
  * not a stylistic one: the CLI has to be able to say *which* source it was
@@ -23,7 +30,10 @@
23
30
  *
24
31
  * @module
25
32
  */
26
- import { ConfigError, W6WClient } from "@w6w/sdk";
33
+ import { ConfigError, joinBaseUrl, W6WClient } from "@w6w/sdk";
34
+ import { NO_CONFIG } from "./config-store.js";
35
+ /** The API every command targets unless told otherwise. Equals endpoints.json `defaultBaseUrl`. */
36
+ export const DEFAULT_BASE_URL = "https://api.w6w.io";
27
37
  /** Environment variable holding the server **origin**. Falls behind `--base-url`. */
28
38
  export const ENV_BASE_URL = "W6W_BASE_URL";
29
39
  /** Environment variable holding the bearer token. Falls behind `--token`. */
@@ -34,8 +44,8 @@ export const NO_ENV = () => undefined;
34
44
  * Read an environment variable, treating a blank value as **absent**.
35
45
  *
36
46
  * `W6W_BASE_URL=`, `W6W_BASE_URL=" "` and an unset `W6W_BASE_URL` are the same
37
- * thing: all three fall through the precedence chain to the next source, and
38
- * ultimately to a usage error naming both sources.
47
+ * thing: all three fall through the precedence chain to the next source (the
48
+ * stored base URL, then the default).
39
49
  *
40
50
  * The check is a trim-and-emptiness test and deliberately **not** a nullish
41
51
  * coalesce. `??` does not convert `""`, so a set-but-empty variable would
@@ -60,21 +70,6 @@ export function envValue(env, name) {
60
70
  return undefined;
61
71
  return value;
62
72
  }
63
- /**
64
- * Apply the precedence rule to one setting.
65
- *
66
- * A flag that was **given** wins outright, even when what it was given is empty:
67
- * that is a value the user typed, and quietly consulting the environment behind
68
- * an explicit `--token=` would be the CLI second-guessing them. (It still does
69
- * not produce a usable value — an empty flag reaches the same error — but it
70
- * gets there without a detour through the environment.) Only an **absent** flag
71
- * falls through.
72
- */
73
- function resolve(flag, env, name) {
74
- if (flag !== undefined)
75
- return flag;
76
- return envValue(env, name);
77
- }
78
73
  /**
79
74
  * A value the CLI cannot work with, phrased as a usage error.
80
75
  *
@@ -123,7 +118,7 @@ function requireAbsolute(baseUrl) {
123
118
  * the header builder and comes back as a bare `TypeError` from outside anyone's
124
119
  * error model: a stack trace, for a typo.
125
120
  */
126
- function isUnsendable(token) {
121
+ export function isUnsendable(token) {
127
122
  for (const character of token) {
128
123
  const code = character.codePointAt(0) ?? 0;
129
124
  if (code < 0x20 || code === 0x7f || code > 0xff)
@@ -138,6 +133,67 @@ function requireSendableToken(token) {
138
133
  throw configError("The w6w API token contains a character that cannot be sent in an HTTP header " +
139
134
  "(a control character, such as a newline).", "--token", ENV_TOKEN, "A token read out of a file usually carries a trailing newline — strip it.");
140
135
  }
136
+ /**
137
+ * The one resolver. `createClient` and every `auth` command use it, so what
138
+ * `auth status` reports is what a command will do.
139
+ *
140
+ * Base URL: flag (given, even empty) > env (blank = absent) > stored `baseUrl` >
141
+ * {@linkcode DEFAULT_BASE_URL}, validated, then canonicalised once. Token: flag >
142
+ * env > `stored.hosts[<canonical base URL>]` — exact key only.
143
+ *
144
+ * @throws {ConfigError} When the base URL is blank-by-flag, relative, or not http(s),
145
+ * or a resolved token cannot be sent in a header. A *missing* token is not an
146
+ * error here; `createClient` raises that.
147
+ */
148
+ export function resolveSettings(globals, env = NO_ENV, stored = NO_CONFIG) {
149
+ let raw;
150
+ let baseUrlSource;
151
+ if (globals.baseUrl !== undefined) {
152
+ raw = globals.baseUrl;
153
+ baseUrlSource = "flag";
154
+ }
155
+ else {
156
+ const fromEnv = envValue(env, ENV_BASE_URL);
157
+ if (fromEnv !== undefined) {
158
+ raw = fromEnv;
159
+ baseUrlSource = "env";
160
+ }
161
+ else if (stored.baseUrl.trim().length > 0) {
162
+ raw = stored.baseUrl;
163
+ baseUrlSource = "config";
164
+ }
165
+ else {
166
+ raw = DEFAULT_BASE_URL;
167
+ baseUrlSource = "default";
168
+ }
169
+ }
170
+ if (raw.trim().length === 0) {
171
+ throw configError("No w6w base URL is configured.", "--base-url", ENV_BASE_URL, "It holds the server's origin, like `https://api.example.com`; the API is served at its root, so no path is appended.");
172
+ }
173
+ // Validate for the CLI's own message, then canonicalise with the SDK's join —
174
+ // the single key used both to look a token up and to build the client.
175
+ const baseUrl = joinBaseUrl(requireAbsolute(raw.trim()));
176
+ let token;
177
+ let tokenSource;
178
+ if (globals.token !== undefined) {
179
+ token = globals.token;
180
+ tokenSource = "flag";
181
+ }
182
+ else {
183
+ const fromEnv = envValue(env, ENV_TOKEN);
184
+ if (fromEnv !== undefined) {
185
+ token = fromEnv;
186
+ tokenSource = "env";
187
+ }
188
+ else if (Object.hasOwn(stored.hosts, baseUrl)) {
189
+ token = stored.hosts[baseUrl].token;
190
+ tokenSource = "config";
191
+ }
192
+ }
193
+ if (token === undefined || token.trim().length === 0)
194
+ return { baseUrl, baseUrlSource };
195
+ return { baseUrl, baseUrlSource, token: requireSendableToken(token), tokenSource };
196
+ }
141
197
  /**
142
198
  * Build the API client for one invocation.
143
199
  *
@@ -147,25 +203,22 @@ function requireSendableToken(token) {
147
203
  *
148
204
  * @param globals - The parsed global flags.
149
205
  * @param env - The environment seam. Defaults to an empty environment.
150
- * @param options - Transport and default project.
206
+ * @param options - Transport, default project and the stored config.
151
207
  * @returns A configured client.
152
208
  * @throws {ConfigError} When the base URL or token is missing or unusable — a usage error.
153
209
  */
154
210
  export function createClient(globals, env = NO_ENV, options = {}) {
155
- const baseUrl = resolve(globals.baseUrl, env, ENV_BASE_URL);
156
- if (baseUrl === undefined || baseUrl.trim().length === 0) {
157
- throw configError("No w6w base URL is configured.", "--base-url", ENV_BASE_URL, "It holds the server's origin, like `https://api.example.com`; the API is served at its root, so no path is appended.");
158
- }
159
- const token = resolve(globals.token, env, ENV_TOKEN);
160
- if (token === undefined || token.trim().length === 0) {
161
- throw configError("No w6w API token is configured.", "--token", ENV_TOKEN, "Every w6w API command is authenticated.");
211
+ const settings = resolveSettings(globals, env, options.stored);
212
+ if (settings.token === undefined) {
213
+ throw configError(`No w6w API token is configured for ${settings.baseUrl}.`, "--token", ENV_TOKEN, "Or save one with `w6w auth login` (a saved token only applies to the base URL it was saved for). " +
214
+ "Every w6w API command is authenticated.");
162
215
  }
163
216
  // The join rule (origin in, base path appended, never doubled) belongs to the
164
217
  // SDK and is applied by the constructor. Nothing here re-derives it — read it
165
218
  // back off `client.config.baseUrl` if you need to know where a request went.
166
219
  return new W6WClient({
167
- baseUrl: requireAbsolute(baseUrl.trim()),
168
- token: requireSendableToken(token),
220
+ baseUrl: settings.baseUrl,
221
+ token: settings.token,
169
222
  project: options.project,
170
223
  fetch: options.fetch,
171
224
  });
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * `w6w auth login | logout | status` — the stored API token.
3
+ *
4
+ * Declared in `endpoints.json` `cli.commands[]` (CLI-only: no API operation sits
5
+ * behind them) and routed like any other group. None of them touches the
6
+ * network, and none ever prints a token.
7
+ *
8
+ * The token is **bound to the base URL it is saved for**. All three commands
9
+ * resolve that URL through the one resolver in `src/client.ts`
10
+ * ({@linkcode resolveSettings}), the same code a real command uses, so
11
+ * `auth status` reports exactly what the next command will do.
12
+ *
13
+ * `login` takes the token as a positional (`w6w auth login <token>`) or from
14
+ * standard input (`w6w auth login -`, or no argument with piped input). The
15
+ * stdin form is the safer one: a positional lands in shell history and in the
16
+ * process list. `login` never stores the global `--token` or `W6W_TOKEN` — they
17
+ * are overrides, not credentials to save.
18
+ *
19
+ * @module
20
+ */
21
+ import type { CommandRegistry } from "../../mod.ts";
22
+ /** The three `w6w auth` commands. */
23
+ export declare const AUTH_COMMANDS: CommandRegistry;
24
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAkC,eAAe,EAAE,MAAM,cAAc,CAAC;AAqHpF,qCAAqC;AACrC,eAAO,MAAM,aAAa,EAAE,eAI3B,CAAC"}