@doist/outline-cli 1.10.4 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## [2.0.0](https://github.com/Doist/outline-cli/compare/v1.10.5...v2.0.0) (2026-08-27)
2
+
3
+ ### ⚠ BREAKING CHANGES
4
+
5
+ * update @doist/cli-core to 1.4.0 and require Node 24 (#93)
6
+
7
+ ### Features
8
+
9
+ * update @doist/cli-core to 1.4.0 and require Node 24 ([#93](https://github.com/Doist/outline-cli/issues/93)) ([e695029](https://github.com/Doist/outline-cli/commit/e6950291d895133887505c67c984601825320407))
10
+
11
+ ## [1.10.5](https://github.com/Doist/outline-cli/compare/v1.10.4...v1.10.5) (2026-08-27)
12
+
13
+ ### Bug Fixes
14
+
15
+ * pair the undici dispatcher with its own fetch and bump to 7.29.0 ([#92](https://github.com/Doist/outline-cli/issues/92)) ([173d857](https://github.com/Doist/outline-cli/commit/173d857df858615b81e7d903630fdd379eb93db6))
16
+
1
17
  ## [1.10.4](https://github.com/Doist/outline-cli/compare/v1.10.3...v1.10.4) (2026-07-29)
2
18
 
3
19
  ### Bug Fixes
package/README.md CHANGED
@@ -4,7 +4,7 @@ CLI for the [Outline](https://www.getoutline.com) wiki/knowledge base API.
4
4
 
5
5
  ## Installation
6
6
 
7
- Requires Node 20.18.1+.
7
+ Requires Node 24+.
8
8
 
9
9
  > ```bash
10
10
  > npm install -g @doist/outline-cli
@@ -1,4 +1,4 @@
1
- import { getDefaultDispatcher } from './http-dispatcher.js';
1
+ import { getDefaultTransport } from './http-dispatcher.js';
2
2
  const DEFAULT_RETRY_CONFIG = {
3
3
  retries: 0,
4
4
  retryCondition: isNetworkError,
@@ -46,8 +46,50 @@ function createTimeoutSignal(timeoutMs, existingSignal) {
46
46
  });
47
47
  return { signal: controller.signal, clear };
48
48
  }
49
+ /**
50
+ * Both `Request` classes in play here — the global one and undici's — reject
51
+ * each other's instances: the check is a plain `instanceof`, and anything that
52
+ * fails it gets stringified, so the request dies with `Failed to parse URL
53
+ * from [object Request]`. Duck-typing catches either class.
54
+ */
55
+ function isRequestLike(value) {
56
+ return (typeof value === 'object' &&
57
+ value !== null &&
58
+ 'url' in value &&
59
+ 'method' in value &&
60
+ 'headers' in value);
61
+ }
62
+ /**
63
+ * Flatten a `Request` input into a plain URL and init, so neither `fetch`
64
+ * implementation is ever handed a `Request` the other one owns.
65
+ * `fetchWithRetry` is exposed as a `typeof fetch` (see `outlineFetch` in
66
+ * `auth-provider.ts`), so a `Request` is a shape callers may legitimately pass.
67
+ *
68
+ * Reading the body to a buffer up front also keeps it replayable: a request
69
+ * stream is consumed by the first attempt and would replay as an empty body.
70
+ *
71
+ * Explicit `options` win over the request's own fields, matching
72
+ * `fetch(request, init)`.
73
+ */
74
+ async function flattenRequestInput(url, options) {
75
+ if (typeof url === 'string' || url instanceof URL || !isRequestLike(url)) {
76
+ return { url: url, options };
77
+ }
78
+ const body = url.body ? await url.arrayBuffer() : undefined;
79
+ return {
80
+ url: url.url,
81
+ options: {
82
+ method: url.method,
83
+ headers: [...url.headers],
84
+ ...(body === undefined ? {} : { body }),
85
+ ...(url.signal ? { signal: url.signal } : {}),
86
+ ...options,
87
+ },
88
+ };
89
+ }
49
90
  export async function fetchWithRetry(args) {
50
- const { url, options = {}, retryConfig = {} } = args;
91
+ const { url, options: rawOptions = {}, retryConfig = {} } = args;
92
+ const { url: requestUrl, options } = await flattenRequestInput(url, rawOptions);
51
93
  const config = { ...DEFAULT_RETRY_CONFIG, ...retryConfig };
52
94
  const { timeout, signal: userSignal, ...requestOptions } = options;
53
95
  let lastError;
@@ -64,9 +106,19 @@ export async function fetchWithRetry(args) {
64
106
  ...requestOptions,
65
107
  signal: requestSignal,
66
108
  };
109
+ // Take the dispatcher and its `fetch` as one value: the dispatcher
110
+ // decompresses the body itself, so a `fetch` from a different
111
+ // undici build decodes it a second time and the request fails with
112
+ // `terminated`. A `fetch` of `undefined` means the global one is
113
+ // the right partner (see `DefaultTransport`).
114
+ const transport = getDefaultTransport();
67
115
  // @ts-expect-error dispatcher is supported by Node.js fetch via Undici
68
- fetchOptions.dispatcher = getDefaultDispatcher();
69
- const response = await fetch(url, fetchOptions);
116
+ fetchOptions.dispatcher = transport.dispatcher;
117
+ // undici's `fetch` and the global `fetch` have the same call shape;
118
+ // the cast only reconciles undici's own Request/Response types with
119
+ // the global lib types.
120
+ const fetchImpl = (transport.fetch ?? fetch);
121
+ const response = await fetchImpl(requestUrl, fetchOptions);
70
122
  if (clearTimeoutFn) {
71
123
  clearTimeoutFn();
72
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-with-retry.js","sourceRoot":"","sources":["../../src/transport/fetch-with-retry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch-with-retry.js","sourceRoot":"","sources":["../../src/transport/fetch-with-retry.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,36 @@
1
- import { type Dispatcher } from 'undici';
2
- export declare function getDefaultDispatcher(): Dispatcher;
1
+ import { type Dispatcher, fetch as undiciFetch } from 'undici';
2
+ type UndiciFetch = typeof undiciFetch;
3
+ /**
4
+ * A dispatcher and the `fetch` it must be used with. `fetch` is undici's own
5
+ * `fetch` when the decompress interceptor is composed, or `undefined` (meaning:
6
+ * use the runtime's global `fetch`) on runtimes that ship a partial undici.
7
+ *
8
+ * The two halves are cached together so a caller can never hold a dispatcher
9
+ * paired with a mismatched `fetch`. The dispatcher decompresses the response
10
+ * body itself and strips `content-encoding` from the parsed headers only; a
11
+ * `fetch` from a different undici build reads the *raw* headers, still sees
12
+ * `content-encoding: gzip`, and decodes an already-decoded body — the request
13
+ * then dies mid-stream with `TypeError: terminated`. Node's global `fetch` is
14
+ * backed by whatever undici ships inside that Node release (6.x on Node 22 …
15
+ * 8.x on Node 26), which is never the npm `undici` this dispatcher comes from,
16
+ * so sourcing `fetch` from the same package keeps the whole request path on
17
+ * one version.
18
+ */
19
+ export type DefaultTransport = {
20
+ dispatcher: Dispatcher;
21
+ fetch: UndiciFetch | undefined;
22
+ };
23
+ /**
24
+ * The default dispatcher and the `fetch` it must be used with, as a single
25
+ * value so the two are always read together. Use both halves:
26
+ *
27
+ * ```ts
28
+ * const transport = getDefaultTransport()
29
+ * const fetchImpl = transport.fetch ?? fetch
30
+ * await fetchImpl(url, { ...options, dispatcher: transport.dispatcher })
31
+ * ```
32
+ */
33
+ export declare function getDefaultTransport(): DefaultTransport;
3
34
  export declare function resetDefaultDispatcherForTests(): Promise<void>;
4
35
  type SyncOnly<T> = T extends PromiseLike<unknown> ? never : T;
5
36
  export declare function suppressExperimentalWarningsSync<T>(fn: () => SyncOnly<T>): SyncOnly<T>;
@@ -1,10 +1,10 @@
1
- import { Agent, EnvHttpProxyAgent, interceptors } from 'undici';
1
+ import { Agent, EnvHttpProxyAgent, fetch as undiciFetch, interceptors, } from 'undici';
2
2
  const KEEP_ALIVE_OPTIONS = {
3
3
  keepAliveTimeout: 1,
4
4
  keepAliveMaxTimeout: 1,
5
5
  };
6
6
  const PROXY_ENV_KEYS = ['HTTPS_PROXY', 'https_proxy', 'HTTP_PROXY', 'http_proxy'];
7
- let defaultDispatcher;
7
+ let defaultTransport;
8
8
  function hasProxyEnv() {
9
9
  for (const key of PROXY_ENV_KEYS) {
10
10
  if (process.env[key]) {
@@ -13,7 +13,7 @@ function hasProxyEnv() {
13
13
  }
14
14
  return false;
15
15
  }
16
- function createDefaultDispatcher() {
16
+ function createDefaultTransport() {
17
17
  const base = hasProxyEnv()
18
18
  ? new EnvHttpProxyAgent(KEEP_ALIVE_OPTIONS)
19
19
  : new Agent(KEEP_ALIVE_OPTIONS);
@@ -24,7 +24,9 @@ function createDefaultDispatcher() {
24
24
  // skip the interceptor instead of crashing on the missing API. Optional
25
25
  // chaining also guards a runtime that omits the `interceptors` export.
26
26
  if (typeof interceptors?.decompress !== 'function') {
27
- return base;
27
+ // Nothing decompresses on our side, so the global `fetch` — which
28
+ // decompresses natively here — is the correct partner.
29
+ return { dispatcher: base, fetch: undefined };
28
30
  }
29
31
  // Compose the response-decompression interceptor so gzip/deflate/br/zstd
30
32
  // bodies are decoded before consumers parse them. Required on Node 24+:
@@ -33,18 +35,28 @@ function createDefaultDispatcher() {
33
35
  // so callers receive raw gzipped bytes and `JSON.parse` fails.
34
36
  // See https://github.com/Doist/todoist-cli/issues/318.
35
37
  const decompress = suppressExperimentalWarningsSync(() => interceptors.decompress());
36
- return base.compose(decompress);
38
+ return { dispatcher: base.compose(decompress), fetch: undiciFetch };
37
39
  }
38
- export function getDefaultDispatcher() {
39
- defaultDispatcher ??= createDefaultDispatcher();
40
- return defaultDispatcher;
40
+ /**
41
+ * The default dispatcher and the `fetch` it must be used with, as a single
42
+ * value so the two are always read together. Use both halves:
43
+ *
44
+ * ```ts
45
+ * const transport = getDefaultTransport()
46
+ * const fetchImpl = transport.fetch ?? fetch
47
+ * await fetchImpl(url, { ...options, dispatcher: transport.dispatcher })
48
+ * ```
49
+ */
50
+ export function getDefaultTransport() {
51
+ defaultTransport ??= createDefaultTransport();
52
+ return defaultTransport;
41
53
  }
42
54
  export async function resetDefaultDispatcherForTests() {
43
- if (!defaultDispatcher) {
55
+ if (!defaultTransport) {
44
56
  return;
45
57
  }
46
- const dispatcher = defaultDispatcher;
47
- defaultDispatcher = undefined;
58
+ const { dispatcher } = defaultTransport;
59
+ defaultTransport = undefined;
48
60
  await dispatcher.close();
49
61
  }
50
62
  export function suppressExperimentalWarningsSync(fn) {
@@ -1 +1 @@
1
- {"version":3,"file":"http-dispatcher.js","sourceRoot":"","sources":["../../src/transport/http-dispatcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-dispatcher.js","sourceRoot":"","sources":["../../src/transport/http-dispatcher.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doist/outline-cli",
3
- "version": "1.10.4",
3
+ "version": "2.0.0",
4
4
  "description": "CLI for the Outline wiki/knowledge base API",
5
5
  "type": "module",
6
6
  "bin": {
@@ -45,17 +45,18 @@
45
45
  ],
46
46
  "license": "MIT",
47
47
  "engines": {
48
- "node": ">=20.18.1"
48
+ "node": ">=24",
49
+ "npm": ">=11"
49
50
  },
50
51
  "dependencies": {
51
- "@doist/cli-core": "0.24.0",
52
+ "@doist/cli-core": "1.4.0",
52
53
  "chalk": "5.6.2",
53
54
  "commander": "14.0.2",
54
55
  "marked": "18.0.3",
55
56
  "marked-terminal-renderer": "2.2.0",
56
57
  "oauth4webapi": "3.8.6",
57
58
  "open": "10.2.0",
58
- "undici": "7.24.8"
59
+ "undici": "^7.29.0"
59
60
  },
60
61
  "devDependencies": {
61
62
  "@semantic-release/changelog": "6.0.3",