@knpkv/atlassian-common 1.3.0 → 1.5.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.
Files changed (72) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +1 -1
  3. package/dist/Brand.d.ts +2 -2
  4. package/dist/Brand.d.ts.map +1 -1
  5. package/dist/Brand.js.map +1 -1
  6. package/dist/Hash.d.ts.map +1 -1
  7. package/dist/Hash.js +2 -2
  8. package/dist/Hash.js.map +1 -1
  9. package/dist/ast/Document.d.ts +3 -19
  10. package/dist/ast/Document.d.ts.map +1 -1
  11. package/dist/ast/Document.js +4 -3
  12. package/dist/ast/Document.js.map +1 -1
  13. package/dist/ast/MacroNode.d.ts +3 -3
  14. package/dist/attachments.d.ts.map +1 -1
  15. package/dist/attachments.js +2 -6
  16. package/dist/attachments.js.map +1 -1
  17. package/dist/auth/OAuthEndpoints.d.ts +13 -0
  18. package/dist/auth/OAuthEndpoints.d.ts.map +1 -1
  19. package/dist/auth/OAuthEndpoints.js +24 -3
  20. package/dist/auth/OAuthEndpoints.js.map +1 -1
  21. package/dist/auth/OAuthErrors.d.ts +22 -0
  22. package/dist/auth/OAuthErrors.d.ts.map +1 -1
  23. package/dist/auth/OAuthErrors.js +1 -1
  24. package/dist/auth/OAuthErrors.js.map +1 -1
  25. package/dist/auth/OAuthOperations.d.ts +8 -2
  26. package/dist/auth/OAuthOperations.d.ts.map +1 -1
  27. package/dist/auth/OAuthOperations.js +18 -8
  28. package/dist/auth/OAuthOperations.js.map +1 -1
  29. package/dist/auth/OAuthResponseSchemas.d.ts +11 -0
  30. package/dist/auth/OAuthResponseSchemas.d.ts.map +1 -1
  31. package/dist/auth/OAuthResponseSchemas.js +11 -0
  32. package/dist/auth/OAuthResponseSchemas.js.map +1 -1
  33. package/dist/auth/index.d.ts +1 -1
  34. package/dist/auth/index.d.ts.map +1 -1
  35. package/dist/auth/index.js +1 -1
  36. package/dist/auth/index.js.map +1 -1
  37. package/dist/bin.js +2 -2
  38. package/dist/bin.js.map +1 -1
  39. package/dist/config/AuthProfiles.d.ts +140 -175
  40. package/dist/config/AuthProfiles.d.ts.map +1 -1
  41. package/dist/config/AuthProfiles.js +2 -1
  42. package/dist/config/AuthProfiles.js.map +1 -1
  43. package/dist/config/ConfigPaths.d.ts.map +1 -1
  44. package/dist/config/ConfigPaths.js +2 -2
  45. package/dist/config/ProfileManager.d.ts +14 -3
  46. package/dist/config/ProfileManager.d.ts.map +1 -1
  47. package/dist/config/ProfileManager.js +33 -5
  48. package/dist/config/ProfileManager.js.map +1 -1
  49. package/dist/config/TokenStorage.d.ts.map +1 -1
  50. package/dist/config/TokenStorage.js +2 -1
  51. package/dist/config/TokenStorage.js.map +1 -1
  52. package/dist/serializers/MarkdownSerializer.d.ts.map +1 -1
  53. package/dist/serializers/MarkdownSerializer.js.map +1 -1
  54. package/package.json +8 -8
  55. package/src/Brand.ts +5 -5
  56. package/src/Hash.ts +2 -2
  57. package/src/ast/Document.ts +5 -4
  58. package/src/attachments.ts +2 -1
  59. package/src/auth/OAuthEndpoints.ts +25 -3
  60. package/src/auth/OAuthErrors.ts +23 -1
  61. package/src/auth/OAuthOperations.ts +33 -20
  62. package/src/auth/OAuthResponseSchemas.ts +12 -0
  63. package/src/auth/index.ts +1 -0
  64. package/src/bin.ts +5 -3
  65. package/src/config/AuthProfiles.ts +4 -2
  66. package/src/config/ConfigPaths.ts +3 -3
  67. package/src/config/ProfileManager.ts +42 -6
  68. package/src/config/TokenStorage.ts +4 -2
  69. package/test/ApiUpdateWorkflows.test.ts +356 -0
  70. package/test/OAuthEndpoints.test.ts +23 -0
  71. package/test/OAuthOperations.test.ts +2 -2
  72. package/test/ProfileManager.test.ts +61 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,77 @@
1
1
  # @knpkv/atlassian-common
2
2
 
3
+ ## 1.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#452](https://github.com/knpkv/npm/pull/452) [`755eafa`](https://github.com/knpkv/npm/commit/755eafab8c0bc3e82b00e2dd27c68d669a1de87e) Thanks [@konopkov](https://github.com/konopkov)! - Upgrade to Effect 4.0.0 stable. `effect` and every `@effect/*` dependency or peer dependency now require `4.0.0`; imports move from the removed `effect/unstable/*` paths to `effect/*`.
8
+
9
+ ## 1.4.1
10
+
11
+ ### Patch Changes
12
+
13
+ - [#361](https://github.com/knpkv/npm/pull/361) [`676419e`](https://github.com/knpkv/npm/commit/676419e39c395dd4cfea6d9ffaee7d002a3f75e2) Thanks [@konopkov](https://github.com/konopkov)! - Upgrade the workspace to Effect 4.0.0-rc.109, pin the vendored Effect reference to that exact upstream release, guard source/package alignment, and bound Control Center test concurrency for reliable CI execution.
14
+
15
+ ## 1.4.0
16
+
17
+ ### Minor Changes
18
+
19
+ - [#358](https://github.com/knpkv/npm/pull/358) [`503d345`](https://github.com/knpkv/npm/commit/503d3459b419a3c9fd366715d5916e41086f493d) Thanks [@konopkov](https://github.com/konopkov)! - Add `OAuthError.status` and `OAuthError.errorCode`, and make
20
+ `refreshActiveProfiles`' token rotation atomic and bounded.
21
+
22
+ `OAuthError` now carries the HTTP `status` when the provider actually answered,
23
+ plus the OAuth 2.0 `errorCode` from the response body (RFC 6749 §5.2) when it is
24
+ parseable. Both are absent for transport failures, timeouts and interruptions —
25
+ cases where no response arrived and nothing can be concluded about the
26
+ credential. `refreshToken` populates them on a non-2xx response.
27
+
28
+ They exist so callers can tell "the provider rejected this token" from "we never
29
+ found out", which is the difference between correctly forcing a re-login and
30
+ destroying a working credential. Status alone is too coarse: `400` covers
31
+ `invalid_client` and `invalid_request`, which indict the request rather than the
32
+ token, so `@knpkv/jira-cli` and `@knpkv/confluence-to-markdown` delete only on
33
+ `400 invalid_grant` or a `403` revocation, leaving `429`, `408`, middlebox
34
+ replies and unparseable bodies alone.
35
+
36
+ `refreshActiveProfiles` performed the same rotate-then-persist sequence as
37
+ `@knpkv/jira-cli`'s `JiraAuth`: `refreshToken(...)` followed by a separate,
38
+ interruptible `saveProfileToken(...)`. Atlassian rotates refresh tokens, so an
39
+ interrupt between the two spends the stored credential without persisting its
40
+ replacement, and the next refresh fails — the user is silently logged out of
41
+ that profile. The grant and the persist now share one `Effect.uninterruptible`
42
+ region.
43
+
44
+ That region carries its own 30s deadline. An uninterruptible region with no
45
+ bound of its own absorbs SIGINT/SIGTERM entirely, since `runMain`'s handlers do
46
+ nothing but interrupt the main fiber, so `atlassian auth refresh` would have
47
+ stopped answering Ctrl-C against a stalled token endpoint. A deadline forked
48
+ inside the region is itself interruptible, so it does bound it.
49
+
50
+ Covered by a test asserting an interrupt mid-rotation still persists the
51
+ replacement token.
52
+
53
+ - [#366](https://github.com/knpkv/npm/pull/366) [`b08ca20`](https://github.com/knpkv/npm/commit/b08ca2004b3efcd72a695b44c72b56dae20afdfd) Thanks [@konopkov](https://github.com/konopkov)! - Add `confluence folder` and `confluence search`, so folders and content lookup no longer need the Confluence UI or a separate MCP client.
54
+
55
+ `folder get`, `folder children` and `folder create` cover the container the page commands cannot address — `/pages/{id}` 404s on a folder id and vice versa. `folder get` and `folder children` accept either `--folder-id` or `--url`, and a folder URL pasted into either is read for its id, because the URL bar is the only place a folder id is actually visible: it appears in no page's front-matter. `folder children` follows pagination and reports each child's type, since a folder holds mixed content (pages, sub-folders, whiteboards, databases, embeds).
56
+
57
+ `confluence search --cql "<query>"` runs a CQL query — the only way to find content by title or by parent, as there is no children-by-title endpoint. It sits at the top level rather than under `page` because CQL matches any content type.
58
+
59
+ Request the OAuth scopes these endpoints need: `read:folder:confluence`, `write:folder:confluence`, `read:hierarchical-content:confluence` (direct children) and `read:content-details:confluence` (CQL search). They are requested on every `confluence auth login`, so add them to the OAuth app **before** logging in again — Atlassian rejects an authorization request naming a scope the app does not enable, which makes `auth login` itself fail at the authorize step. Existing tokens keep working for page and attachment commands until then; `folder` and `search` fail with 401/403 until the re-login lands. The scopes are kept in a separate `CONFLUENCE_FOLDER_SCOPES` constant so control-center, which shares `CONFLUENCE_SCOPES` for its own sign-in, keeps requesting only what it uses.
60
+
61
+ Add `confluence auth manage`, which opens the Developer Console app list and prints the scopes to enable. It opens the list rather than the app itself because the console addresses an app by an id that is not the OAuth client id, and the client id is all this CLI stores. Both it and `auth create` derive the printed scopes from the constant `auth login` reads, so the setup instructions cannot drift from what login requests — the previous hardcoded list in `auth create` had already fallen behind the attachment scopes.
62
+
63
+ `folder` and `search` refuse a site mismatch rather than acting on the wrong site. Content ids are per-site, so a `--base-url` disagreeing with the URL, a `--parent` pasted from another site, and — under OAuth — a `--base-url` that is not the active profile's site are all rejected. The OAuth case is the one that bites: those requests route by the profile's cloud id and ignore `--base-url` entirely, so `folder create --base-url site-a` while signed in to site B would otherwise create the folder on site B with no warning.
64
+
65
+ Accept a folder's `createdAt` as epoch milliseconds. The v2 folder endpoints return a number there even though the upstream spec declares an ISO-8601 string and every other content type honours it — so before this, `folder get` and `folder create` failed to decode every real folder. The spec patch widens the generated schema to accept both shapes and the client normalizes to ISO-8601, so callers see one representation.
66
+
67
+ Patch the Confluence v2 spec so `FolderSingle.position`/`parentId`/`parentType` and `ChildrenResponse.childPosition` generate as nullable rather than `never`. The generator turns the upstream `{"type": "integer", "nullable": true}` shape into `never`, so a folder or child payload carrying any of these fields failed the generated decode before the response reached the caller — the same fix already applied to `Page`, `PageBulk` and `ChildPage`.
68
+
69
+ - [#370](https://github.com/knpkv/npm/pull/370) [`27d2ca1`](https://github.com/knpkv/npm/commit/27d2ca18b0c0b0f8a252d461c0aaf10eb92e9ffc) Thanks [@konopkov](https://github.com/konopkov)! - Enforce the complete anti-slop rule set with zero accepted diagnostics and update affected APIs and implementations to satisfy the required contracts.
70
+
71
+ ### Patch Changes
72
+
73
+ - [#361](https://github.com/knpkv/npm/pull/361) [`676419e`](https://github.com/knpkv/npm/commit/676419e39c395dd4cfea6d9ffaee7d002a3f75e2) Thanks [@konopkov](https://github.com/konopkov)! - Update Effect and effect-qb, migrate schema-tagged errors to the current Effect API, and adopt the dialect-scoped SQLite function and type APIs introduced by effect-qb 0.22.
74
+
3
75
  ## 1.3.0
4
76
 
5
77
  ### Minor Changes
package/README.md CHANGED
@@ -20,7 +20,7 @@ pnpm add @knpkv/atlassian-common
20
20
 
21
21
  ## OAuth2 + PKCE
22
22
 
23
- Uses Effect's platform `Crypto` service. PKCE code verifier/challenge use `effect/Encoding` for base64url.
23
+ Uses Effect's platform `Crypto` service. PKCE code verifier/challenge use `effect/encoding/Base64Url` for base64url.
24
24
 
25
25
  ```typescript
26
26
  import * as NodeCrypto from "@effect/platform-node/NodeCrypto"
package/dist/Brand.d.ts CHANGED
@@ -41,7 +41,7 @@ import * as Schema from "effect/Schema";
41
41
  *
42
42
  * @category Brand
43
43
  */
44
- export declare const makeBrandedString: <B extends string>(name: B, pattern: RegExp) => Brand.Constructor<string & Brand.Brand<B>> & {
44
+ export declare const makeBrandedString: <const B extends string>(name: Parameters<typeof Schema.brand<B>>[0], pattern: RegExp) => Brand.Constructor<string & Brand.Brand<B>> & {
45
45
  schema: Schema.brand<Schema.String, B>;
46
46
  Type: string & Brand.Brand<B>;
47
47
  };
@@ -61,7 +61,7 @@ export declare const makeBrandedString: <B extends string>(name: B, pattern: Reg
61
61
  *
62
62
  * @category Brand
63
63
  */
64
- export declare const makeBrandedNonEmptyString: <B extends string>(name: B) => Brand.Constructor<string & Brand.Brand<B>> & {
64
+ export declare const makeBrandedNonEmptyString: <const B extends string>(name: Parameters<typeof Schema.brand<B>>[0]) => Brand.Constructor<string & Brand.Brand<B>> & {
65
65
  schema: Schema.brand<Schema.NonEmptyString, B>;
66
66
  Type: string & Brand.Brand<B>;
67
67
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Brand.d.ts","sourceRoot":"","sources":["../src/Brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,EAChD,MAAM,CAAC,EACP,SAAS,MAAM;;;CAahB,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,yBAAyB,GAAI,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC;;;CAYlE,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,MAAM;;;CAAsC,CAAA;AACzD,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AAEvC;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;CAAoD,CAAA;AACzE,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;CAAwD,CAAA;AAC7E,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C;;;;GAIG;AACH,eAAO,MAAM,UAAU;;;CAAsD,CAAA;AAC7E,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;CAAqD,CAAA;AAC7E,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA"}
1
+ {"version":3,"file":"Brand.d.ts","sourceRoot":"","sources":["../src/Brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,CAAC,CAAC,SAAS,MAAM,QAChD,UAAU,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAClC,MAAM;;;CAahB,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,yBAAyB,GAAI,KAAK,CAAC,CAAC,SAAS,MAAM,QAAQ,UAAU,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;CAY5G,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,MAAM;;;CAAsC,CAAA;AACzD,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AAEvC;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;CAAoD,CAAA;AACzE,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;CAAwD,CAAA;AAC7E,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C;;;;GAIG;AACH,eAAO,MAAM,UAAU;;;CAAsD,CAAA;AAC7E,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;CAAqD,CAAA;AAC7E,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA"}
package/dist/Brand.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Brand.js","sourceRoot":"","sources":["../src/Brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAO,EACP,OAAe,EACf,EAAE;IAGF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAc,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAA;IAElH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACtF,MAAM,IAAI,GAAgB,SAAU,CAAA;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;QAC1B,MAAM;QACN,IAAI;KACL,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAmB,IAAO,EAAE,EAAE;IAGrE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,IAAI,kBAAkB,CAAC,CAAA;IAEvF,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IAC7D,MAAM,IAAI,GAAgB,SAAU,CAAA;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;QAC1B,MAAM;QACN,IAAI;KACL,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,8CAA8C;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAA;AAGzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;AAGzE;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAA;AAG7E;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAA;AAG7E;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAA"}
1
+ {"version":3,"file":"Brand.js","sourceRoot":"","sources":["../src/Brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAA2C,EAC3C,OAAe,EACf,EAAE;IAGF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAc,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAA;IAElH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAI,IAAI,CAAC,CAAC,CAAA;IACzF,MAAM,IAAI,GAAgB,SAAU,CAAA;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;QAC1B,MAAM;QACN,IAAI;KACL,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAyB,IAA2C,EAAE,EAAE;IAG/G,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,IAAI,kBAAkB,CAAC,CAAA;IAEvF,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAI,IAAI,CAAC,CAAC,CAAA;IAChE,MAAM,IAAI,GAAgB,SAAU,CAAA;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;QAC1B,MAAM;QACN,IAAI;KACL,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,8CAA8C;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAA;AAGzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;AAGzE;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAA;AAG7E;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAA;AAG7E;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Hash.d.ts","sourceRoot":"","sources":["../src/Hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAaxC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CACxE,CAAA;AAE3C;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,QAAQ,UAAU,KACjB,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAyB,CAAA;AAEjG;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,GAAG,WAAW,EAAE,GAAG,WAAW,KAAG,OAAkB,CAAA"}
1
+ {"version":3,"file":"Hash.d.ts","sourceRoot":"","sources":["../src/Hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAaxC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW,YAAa,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CACxE,CAAA;AAE3C;;;;GAIG;AACH,eAAO,MAAM,UAAU,WACb,UAAU,KACjB,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAyB,CAAA;AAEjG;;;;GAIG;AACH,eAAO,MAAM,UAAU,MAAO,WAAW,KAAK,WAAW,KAAG,OAAkB,CAAA"}
package/dist/Hash.js CHANGED
@@ -17,13 +17,13 @@
17
17
  */
18
18
  import * as Crypto from "effect/Crypto";
19
19
  import * as Effect from "effect/Effect";
20
- import * as Encoding from "effect/Encoding";
20
+ import { Hex } from "effect/encoding";
21
21
  import { ContentHash } from "./Brand.js";
22
22
  const textEncoder = new TextEncoder();
23
23
  const digestSha256 = (bytes) => Effect.gen(function* () {
24
24
  const cryptoService = yield* Crypto.Crypto;
25
25
  const digest = yield* cryptoService.digest("SHA-256", bytes);
26
- return ContentHash(Encoding.encodeHex(digest));
26
+ return ContentHash(Hex.encode(digest));
27
27
  });
28
28
  /**
29
29
  * Compute SHA256 hash of a string.
package/dist/Hash.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Hash.js","sourceRoot":"","sources":["../src/Hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAA;AAErC,MAAM,YAAY,GAAG,CACnB,KAAiB,EACuD,EAAE,CAC1E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC5D,OAAO,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;AAChD,CAAC,CAAC,CAAA;AAEJ;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAA0E,EAAE,CACrH,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,MAAkB,EACsD,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;AAEjG;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAc,EAAE,CAAc,EAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA"}
1
+ {"version":3,"file":"Hash.js","sourceRoot":"","sources":["../src/Hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAA;AAErC,MAAM,YAAY,GAAG,CACnB,KAAiB,EACuD,EAAE,CAC1E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC5D,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;AACxC,CAAC,CAAC,CAAA;AAEJ;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAA0E,EAAE,CACrH,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,MAAkB,EACsD,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;AAEjG;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAc,EAAE,CAAc,EAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA"}
@@ -1,19 +1,3 @@
1
- /**
2
- * Root AST node wrapping a sequence of {@link DocumentNode} children.
3
- *
4
- * **Mental model**
5
- *
6
- * - **Document = version + children**: The top-level container for parsed Atlassian content.
7
- * `children` is a union of `BlockNode | MacroNode`.
8
- * - **Raw source preservation**: Optional `rawSource` field enables lossless roundtripping.
9
- *
10
- * **Common tasks**
11
- *
12
- * - Construct a document: {@link makeDocument}
13
- * - Type-guard check: {@link isDocument}
14
- *
15
- * @module
16
- */
17
1
  import * as Schema from "effect/Schema";
18
2
  import { type BlockNode as BlockNodeType } from "./BlockNode.js";
19
3
  import { type MacroNode as MacroNodeType } from "./MacroNode.js";
@@ -54,7 +38,7 @@ export declare const DocumentNode: Schema.Union<readonly [Schema.Union<readonly
54
38
  }>, typeof import("./BlockNode.js").UnsupportedBlock]>, Schema.Union<readonly [Schema.Struct<{
55
39
  readonly _tag: Schema.Literal<"InfoPanel">;
56
40
  readonly version: Schema.withConstructorDefault<Schema.Int>;
57
- readonly panelType: Schema.Literals<readonly ("info" | "warning" | "note" | "tip" | "error" | "panel")[]>;
41
+ readonly panelType: Schema.Literals<readonly ("error" | "info" | "note" | "panel" | "tip" | "warning")[]>;
58
42
  readonly title: Schema.optional<Schema.String>;
59
43
  readonly children: Schema.$Array<Schema.Union<readonly [typeof import("./BlockNode.js").Heading, typeof import("./BlockNode.js").Paragraph, typeof import("./BlockNode.js").CodeBlock, typeof import("./BlockNode.js").ThematicBreak, typeof import("./BlockNode.js").Image, typeof import("./BlockNode.js").Table, typeof import("./BlockNode.js").UnsupportedBlock]>>;
60
44
  readonly rawSource: Schema.optional<Schema.String>;
@@ -148,7 +132,7 @@ export declare const Document: Schema.Struct<{
148
132
  }>, typeof import("./BlockNode.js").UnsupportedBlock]>, Schema.Union<readonly [Schema.Struct<{
149
133
  readonly _tag: Schema.Literal<"InfoPanel">;
150
134
  readonly version: Schema.withConstructorDefault<Schema.Int>;
151
- readonly panelType: Schema.Literals<readonly ("info" | "warning" | "note" | "tip" | "error" | "panel")[]>;
135
+ readonly panelType: Schema.Literals<readonly ("error" | "info" | "note" | "panel" | "tip" | "warning")[]>;
152
136
  readonly title: Schema.optional<Schema.String>;
153
137
  readonly children: Schema.$Array<Schema.Union<readonly [typeof import("./BlockNode.js").Heading, typeof import("./BlockNode.js").Paragraph, typeof import("./BlockNode.js").CodeBlock, typeof import("./BlockNode.js").ThematicBreak, typeof import("./BlockNode.js").Image, typeof import("./BlockNode.js").Table, typeof import("./BlockNode.js").UnsupportedBlock]>>;
154
138
  readonly rawSource: Schema.optional<Schema.String>;
@@ -209,5 +193,5 @@ export declare const makeDocument: (children: ReadonlyArray<DocumentNode>, rawSo
209
193
  *
210
194
  * @category Guards
211
195
  */
212
- export declare const isDocument: (value: unknown) => value is Document;
196
+ export declare const isDocument: <UnparsedInput>(value: UnparsedInput) => value is UnparsedInput & Document;
213
197
  //# sourceMappingURL=Document.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Document.d.ts","sourceRoot":"","sources":["../../src/ast/Document.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAa,KAAK,SAAS,IAAI,aAAa,EAA4B,MAAM,gBAAgB,CAAA;AACrG,OAAO,EAAa,KAAK,SAAS,IAAI,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE3E;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAuC,CAAA;AAEhE;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,aAAa,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAInB,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE1D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,aAAa,CAAC,YAAY,CAAC,EACrC,YAAY,MAAM,KACjB,QAID,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,QAIN,CAAA"}
1
+ {"version":3,"file":"Document.d.ts","sourceRoot":"","sources":["../../src/ast/Document.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAa,KAAK,SAAS,IAAI,aAAa,EAA4B,MAAM,gBAAgB,CAAA;AACrG,OAAO,EAAa,KAAK,SAAS,IAAI,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE3E;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAuC,CAAA;AAEhE;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,aAAa,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAInB,CAAA;AAEF;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE1D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,aACb,aAAa,CAAC,YAAY,CAAC,cACzB,MAAM,KACjB,QAID,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,aAAa,SAAS,aAAa,KAAG,KAAK,IAAI,aAAa,GAAG,QAI3D,CAAA"}
@@ -14,6 +14,7 @@
14
14
  *
15
15
  * @module
16
16
  */
17
+ import * as Predicate from "effect/Predicate";
17
18
  import * as Schema from "effect/Schema";
18
19
  import { BlockNode, RawSource, SchemaVersion } from "./BlockNode.js";
19
20
  import { MacroNode } from "./MacroNode.js";
@@ -66,15 +67,15 @@ export const Document = Schema.Struct({
66
67
  export const makeDocument = (children, rawSource) => ({
67
68
  version: 1,
68
69
  children,
69
- ...(rawSource !== undefined ? { rawSource } : {})
70
+ ...((rawSource !== undefined) && { rawSource })
70
71
  });
71
72
  /**
72
73
  * Check if a node is a Document.
73
74
  *
74
75
  * @category Guards
75
76
  */
76
- export const isDocument = (value) => typeof value === "object" &&
77
+ export const isDocument = (value) => Predicate.isObjectOrArray(value) &&
77
78
  value !== null &&
78
79
  "children" in value &&
79
- Array.isArray(Reflect.get(value, "children"));
80
+ Array.isArray(value.children);
80
81
  //# sourceMappingURL=Document.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Document.js","sourceRoot":"","sources":["../../src/ast/Document.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAmC,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACrG,OAAO,EAAE,SAAS,EAAmC,MAAM,gBAAgB,CAAA;AAE3E;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;AAShE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;IACpC,SAAS,EAAE,SAAS;CACrB,CAAC,CAAA;AASF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,QAAqC,EACrC,SAAkB,EACR,EAAE,CAAC,CAAC;IACd,OAAO,EAAE,CAAC;IACV,QAAQ;IACR,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;CAClD,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CAC9D,OAAO,KAAK,KAAK,QAAQ;IACzB,KAAK,KAAK,IAAI;IACd,UAAU,IAAI,KAAK;IACnB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"Document.js","sourceRoot":"","sources":["../../src/ast/Document.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAmC,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACrG,OAAO,EAAE,SAAS,EAAmC,MAAM,gBAAgB,CAAA;AAE3E;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAA;AAShE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;IACpC,SAAS,EAAE,SAAS;CACrB,CAAC,CAAA;AASF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,QAAqC,EACrC,SAAkB,EACR,EAAE,CAAC,CAAC;IACd,OAAO,EAAE,CAAC;IACV,QAAQ;IACR,GAAG,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;CAChD,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAgB,KAAoB,EAAqC,EAAE,CACnG,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC;IAChC,KAAK,KAAK,IAAI;IACd,UAAU,IAAI,KAAK;IACnB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA"}
@@ -10,7 +10,7 @@ export declare const PanelTypes: ReadonlyArray<"info" | "warning" | "note" | "ti
10
10
  *
11
11
  * @category MacroNode
12
12
  */
13
- export declare const PanelType: Schema.Literals<readonly ("info" | "warning" | "note" | "tip" | "error" | "panel")[]>;
13
+ export declare const PanelType: Schema.Literals<readonly ("error" | "info" | "note" | "panel" | "tip" | "warning")[]>;
14
14
  /**
15
15
  * Type for panel type.
16
16
  *
@@ -37,7 +37,7 @@ export type PanelType = Schema.Schema.Type<typeof PanelType>;
37
37
  export declare const InfoPanel: Schema.Struct<{
38
38
  readonly _tag: Schema.Literal<"InfoPanel">;
39
39
  readonly version: Schema.withConstructorDefault<Schema.Int>;
40
- readonly panelType: Schema.Literals<readonly ("info" | "warning" | "note" | "tip" | "error" | "panel")[]>;
40
+ readonly panelType: Schema.Literals<readonly ("error" | "info" | "note" | "panel" | "tip" | "warning")[]>;
41
41
  readonly title: Schema.optional<Schema.String>;
42
42
  readonly children: Schema.$Array<Schema.Union<readonly [typeof import("./BlockNode.js").Heading, typeof import("./BlockNode.js").Paragraph, typeof import("./BlockNode.js").CodeBlock, typeof import("./BlockNode.js").ThematicBreak, typeof import("./BlockNode.js").Image, typeof import("./BlockNode.js").Table, typeof import("./BlockNode.js").UnsupportedBlock]>>;
43
43
  readonly rawSource: Schema.optional<Schema.String>;
@@ -132,7 +132,7 @@ export type StatusMacro = Schema.Schema.Type<typeof StatusMacro>;
132
132
  export declare const MacroNode: Schema.Union<readonly [Schema.Struct<{
133
133
  readonly _tag: Schema.Literal<"InfoPanel">;
134
134
  readonly version: Schema.withConstructorDefault<Schema.Int>;
135
- readonly panelType: Schema.Literals<readonly ("info" | "warning" | "note" | "tip" | "error" | "panel")[]>;
135
+ readonly panelType: Schema.Literals<readonly ("error" | "info" | "note" | "panel" | "tip" | "warning")[]>;
136
136
  readonly title: Schema.optional<Schema.String>;
137
137
  readonly children: Schema.$Array<Schema.Union<readonly [typeof import("./BlockNode.js").Heading, typeof import("./BlockNode.js").Paragraph, typeof import("./BlockNode.js").CodeBlock, typeof import("./BlockNode.js").ThematicBreak, typeof import("./BlockNode.js").Image, typeof import("./BlockNode.js").Table, typeof import("./BlockNode.js").UnsupportedBlock]>>;
138
138
  readonly rawSource: Schema.optional<Schema.String>;
@@ -1 +1 @@
1
- {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAC1C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAID;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,YAAY,sBAAsB,KAAG,OAG5E,CAAA;AAED,eAAO,MAAM,4BAA4B,GACvC,WAAW,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,WAAW,MAAM,GAAG,IAAI,GAAG,SAAS,KACnC,MAAM,GAAG,IAGX,CAAA;AAED,eAAO,MAAM,wBAAwB,GACnC,YAAY,wBAAwB,EACpC,UAAU;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,KACtG,MAOF,CAAA;AAED,eAAO,MAAM,4BAA4B,GACvC,SAAS,MAAM,EACf,iBAAiB,MAAM,EACvB,oBAAoB,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,0BAA0B,KAAK,MAAM,CAAC,EAC5E,UAAU;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,KACtD,gCAcF,CAAA"}
1
+ {"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAEH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAC1C;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAID;;;GAGG;AACH,eAAO,MAAM,uBAAuB,eAAgB,sBAAsB,KAAG,OAG5E,CAAA;AAED,eAAO,MAAM,4BAA4B,cAC5B,MAAM,GAAG,IAAI,GAAG,SAAS,aACzB,MAAM,GAAG,IAAI,GAAG,SAAS,KACnC,MAAM,GAAG,IAGX,CAAA;AAED,eAAO,MAAM,wBAAwB,eACvB,wBAAwB,YAC1B;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,KACtG,MAOF,CAAA;AAED,eAAO,MAAM,4BAA4B,YAC9B,MAAM,mBACE,MAAM,sBACH,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,0BAA0B,KAAK,MAAM,CAAC,YAClE;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,KACtD,gCAcF,CAAA"}
@@ -1,8 +1,4 @@
1
- /**
2
- * Shared attachment reference helpers for Atlassian Markdown surfaces.
3
- *
4
- * @module
5
- */
1
+ import * as Predicate from "effect/Predicate";
6
2
  const IMAGE_EXTENSION_RE = /\.(avif|bmp|gif|jpe?g|png|svg|webp)$/i;
7
3
  /**
8
4
  * Returns true when an attachment should render as a Markdown image preview.
@@ -30,7 +26,7 @@ export const replaceAttachmentPlaceholder = (content, placeholderPath, renderedA
30
26
  let replacements = 0;
31
27
  const replaced = content.replace(placeholder, (match, label) => {
32
28
  replacements++;
33
- return typeof renderedAttachment === "string"
29
+ return Predicate.isString(renderedAttachment)
34
30
  ? renderedAttachment
35
31
  : renderedAttachment({ isImage: match.startsWith("!"), label });
36
32
  });
@@ -1 +1 @@
1
- {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,19 @@ export declare const ME_URL = "https://api.atlassian.com/me";
51
51
  * @category Scopes
52
52
  */
53
53
  export declare const CONFLUENCE_SCOPES: string[];
54
+ /**
55
+ * Additional scopes for the CLI's folder and CQL-search commands.
56
+ *
57
+ * Deliberately *not* folded into {@link CONFLUENCE_SCOPES}: that constant is the
58
+ * shared page/attachment set, and control-center feeds it straight into its own
59
+ * `authorize` request. Adding folder authority there would widen every
60
+ * control-center sign-in — asking for a scope its documented OAuth app does not
61
+ * enable, and granting `write:folder:confluence` to a product that never creates
62
+ * folders. Union these in only where the folder/search commands actually live.
63
+ *
64
+ * @category Scopes
65
+ */
66
+ export declare const CONFLUENCE_FOLDER_SCOPES: string[];
54
67
  /**
55
68
  * Jira scopes for OAuth2.
56
69
  *
@@ -1 +1 @@
1
- {"version":3,"file":"OAuthEndpoints.d.ts","sourceRoot":"","sources":["../../src/auth/OAuthEndpoints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAE1D;;;;GAIG;AACH,eAAO,MAAM,QAAQ,yCAAyC,CAAA;AAE9D;;;;GAIG;AACH,eAAO,MAAM,SAAS,2CAA2C,CAAA;AAEjE;;;;GAIG;AACH,eAAO,MAAM,UAAU,4CAA4C,CAAA;AAEnE;;;;GAIG;AACH,eAAO,MAAM,aAAa,+DAA+D,CAAA;AAEzF;;;;GAIG;AACH,eAAO,MAAM,MAAM,iCAAiC,CAAA;AAEpD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,UAQ7B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,UAQvB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,UAKhC,CAAA;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,uBAAuB;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC,oBAAoB;IACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACtC,qDAAqD;IACrD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5C;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,mBAAmB,KAAG,MAe3D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAKpG,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAK/D,CAAA"}
1
+ {"version":3,"file":"OAuthEndpoints.d.ts","sourceRoot":"","sources":["../../src/auth/OAuthEndpoints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAE1D;;;;GAIG;AACH,eAAO,MAAM,QAAQ,yCAAyC,CAAA;AAE9D;;;;GAIG;AACH,eAAO,MAAM,SAAS,2CAA2C,CAAA;AAEjE;;;;GAIG;AACH,eAAO,MAAM,UAAU,4CAA4C,CAAA;AAEnE;;;;GAIG;AACH,eAAO,MAAM,aAAa,+DAA+D,CAAA;AAEzF;;;;GAIG;AACH,eAAO,MAAM,MAAM,iCAAiC,CAAA;AAEpD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,UAQ7B,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,UAQpC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,UAQvB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,UAKhC,CAAA;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,uBAAuB;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC,oBAAoB;IACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACtC,qDAAqD;IACrD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5C;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,YAAa,mBAAmB,KAAG,MAe3D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAKpG,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,aACrB,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAK/D,CAAA"}
@@ -14,7 +14,7 @@
14
14
  */
15
15
  import * as Crypto from "effect/Crypto";
16
16
  import * as Effect from "effect/Effect";
17
- import * as Encoding from "effect/Encoding";
17
+ import { Base64Url } from "effect/encoding";
18
18
  /**
19
19
  * OAuth2 authorization endpoint.
20
20
  *
@@ -59,6 +59,27 @@ export const CONFLUENCE_SCOPES = [
59
59
  "read:me",
60
60
  "offline_access"
61
61
  ];
62
+ /**
63
+ * Additional scopes for the CLI's folder and CQL-search commands.
64
+ *
65
+ * Deliberately *not* folded into {@link CONFLUENCE_SCOPES}: that constant is the
66
+ * shared page/attachment set, and control-center feeds it straight into its own
67
+ * `authorize` request. Adding folder authority there would widen every
68
+ * control-center sign-in — asking for a scope its documented OAuth app does not
69
+ * enable, and granting `write:folder:confluence` to a product that never creates
70
+ * folders. Union these in only where the folder/search commands actually live.
71
+ *
72
+ * @category Scopes
73
+ */
74
+ export const CONFLUENCE_FOLDER_SCOPES = [
75
+ // Folders are a separate v2 content type: read/write for the folder itself,
76
+ // hierarchical-content for its direct children.
77
+ "read:folder:confluence",
78
+ "write:folder:confluence",
79
+ "read:hierarchical-content:confluence",
80
+ // CQL search (`GET /wiki/rest/api/search`).
81
+ "read:content-details:confluence"
82
+ ];
62
83
  /**
63
84
  * Jira scopes for OAuth2.
64
85
  *
@@ -118,7 +139,7 @@ export const buildAuthUrl = (options) => {
118
139
  export const generateCodeVerifier = () => Effect.gen(function* () {
119
140
  const cryptoService = yield* Crypto.Crypto;
120
141
  const bytes = yield* cryptoService.randomBytes(32);
121
- return Encoding.encodeBase64Url(bytes);
142
+ return Base64Url.encode(bytes);
122
143
  });
123
144
  /**
124
145
  * Compute S256 code challenge from a code verifier (RFC 7636).
@@ -129,6 +150,6 @@ export const generateCodeVerifier = () => Effect.gen(function* () {
129
150
  export const computeCodeChallenge = (verifier) => Effect.gen(function* () {
130
151
  const cryptoService = yield* Crypto.Crypto;
131
152
  const hash = yield* cryptoService.digest("SHA-256", new TextEncoder().encode(verifier));
132
- return Encoding.encodeBase64Url(hash);
153
+ return Base64Url.encode(hash);
133
154
  });
134
155
  //# sourceMappingURL=OAuthEndpoints.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OAuthEndpoints.js","sourceRoot":"","sources":["../../src/auth/OAuthEndpoints.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OAuthEndpoints.js","sourceRoot":"","sources":["../../src/auth/OAuthEndpoints.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,28 @@ declare const OAuthError_base: new <A extends Record<string, any> = {}>(args: im
29
29
  export declare class OAuthError extends OAuthError_base<{
30
30
  readonly step: OAuthStep;
31
31
  readonly cause?: unknown;
32
+ /**
33
+ * HTTP status, present only when the provider actually answered.
34
+ *
35
+ * Absent means the request never produced a response — transport failure,
36
+ * timeout, interruption — which is *not* evidence about the credential.
37
+ * Callers deciding whether to discard stored tokens must key off this and
38
+ * {@link errorCode} rather than off {@link step}, since a refresh that merely
39
+ * failed to complete may well have been consumed server-side.
40
+ */
41
+ readonly status?: number;
42
+ /**
43
+ * The OAuth 2.0 `error` code from the response body (RFC 6749 §5.2), when the
44
+ * provider sent a parseable one.
45
+ *
46
+ * Status alone is too coarse to act on: `400` covers `invalid_grant` (the
47
+ * stored token really is spent) as well as `invalid_client`,
48
+ * `invalid_request` and `unsupported_grant_type`, which say the *request* was
49
+ * wrong and imply nothing about the token. Absent when the body was missing
50
+ * or unparseable, in which case callers should assume the credential is still
51
+ * good rather than discard it on a guess.
52
+ */
53
+ readonly errorCode?: string;
32
54
  }> {
33
55
  get message(): string;
34
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"OAuthErrors.d.ts","sourceRoot":"","sources":["../../src/auth/OAuthErrors.ts"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAA;;;;AAE9G;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAW,SAAQ,gBAA+B;IAC7D,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAQ7B;CACF;;;;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAG7B;CACF;;;;AAED;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,6BAA4C;IACvF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAG7B;CACF"}
1
+ {"version":3,"file":"OAuthErrors.d.ts","sourceRoot":"","sources":["../../src/auth/OAuthErrors.ts"],"names":[],"mappings":"AAoBA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAA;;;;AAE9G;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAW,SAAQ,gBAA+B;IAC7D,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;;;;OAQG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAQ7B;CACF;;;;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAG7B;CACF;;;;AAED;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,6BAA4C;IACvF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAG7B;CACF"}
@@ -38,7 +38,7 @@ import * as Predicate from "effect/Predicate";
38
38
  */
39
39
  export class OAuthError extends Data.TaggedError("OAuthError") {
40
40
  get message() {
41
- if (typeof this.cause === "string") {
41
+ if (Predicate.isString(this.cause)) {
42
42
  return `OAuth ${this.step} failed: ${this.cause}`;
43
43
  }
44
44
  if (Predicate.hasProperty(this.cause, "message")) {
@@ -1 +1 @@
1
- {"version":3,"file":"OAuthErrors.js","sourceRoot":"","sources":["../../src/auth/OAuthErrors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAA;AAS7C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,UAAW,SAAQ,IAAI,CAAC,WAAW,CAAC,YAAY,CAG3D;IACA,IAAa,OAAO;QAClB,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,OAAO,SAAS,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,KAAK,EAAE,CAAA;QACnD,CAAC;QACD,IAAI,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;YACjD,OAAO,SAAS,IAAI,CAAC,IAAI,YAAY,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAA;QACnE,CAAC;QACD,OAAO,SAAS,IAAI,CAAC,IAAI,SAAS,CAAA;IACpC,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,gBAAiB,SAAQ,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAEvE;IACA,IAAa,OAAO;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACrD,OAAO,gBAAgB,QAAQ,kCAAkC,CAAA;IACnE,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,uBAAwB,SAAQ,IAAI,CAAC,WAAW,CAAC,yBAAyB,CAErF;IACA,IAAa,OAAO;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAA;QACjF,OAAO,6BAA6B,QAAQ,SAAS,CAAA;IACvD,CAAC;CACF"}
1
+ {"version":3,"file":"OAuthErrors.js","sourceRoot":"","sources":["../../src/auth/OAuthErrors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAA;AAS7C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,UAAW,SAAQ,IAAI,CAAC,WAAW,CAAC,YAAY,CAyB3D;IACA,IAAa,OAAO;QAClB,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,SAAS,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,KAAK,EAAE,CAAA;QACnD,CAAC;QACD,IAAI,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;YACjD,OAAO,SAAS,IAAI,CAAC,IAAI,YAAY,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAA;QACnE,CAAC;QACD,OAAO,SAAS,IAAI,CAAC,IAAI,SAAS,CAAA;IACpC,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,gBAAiB,SAAQ,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAEvE;IACA,IAAa,OAAO;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACrD,OAAO,gBAAgB,QAAQ,kCAAkC,CAAA;IACnE,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,uBAAwB,SAAQ,IAAI,CAAC,WAAW,CAAC,yBAAyB,CAErF;IACA,IAAa,OAAO;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAA;QACjF,OAAO,6BAA6B,QAAQ,SAAS,CAAA;IACvD,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  import * as Effect from "effect/Effect";
2
- import { HttpClient } from "effect/unstable/http";
2
+ import { HttpClient } from "effect/http";
3
3
  import { type OAuthConfig, type OAuthToken } from "../config/OAuthSchemas.js";
4
4
  import { OAuthError } from "./OAuthErrors.js";
5
5
  import { type AccessibleResource, type TokenResponse, type UserInfo } from "./OAuthResponseSchemas.js";
@@ -21,7 +21,13 @@ export interface ExchangeCodeOptions {
21
21
  *
22
22
  * @category Operations
23
23
  */
24
- export declare const exchangeCodeForTokens: (code: string, config: OAuthConfig, options: ExchangeCodeOptions) => Effect.Effect<TokenResponse, OAuthError, HttpClient.HttpClient>;
24
+ export declare const exchangeCodeForTokens: (code: string, config: OAuthConfig, options: ExchangeCodeOptions) => Effect.Effect<{
25
+ readonly access_token: string;
26
+ readonly refresh_token: string;
27
+ readonly expires_in: number;
28
+ readonly scope: string;
29
+ readonly token_type: string;
30
+ }, OAuthError, HttpClient.HttpClient>;
25
31
  /**
26
32
  * Get accessible resources (sites) for the authenticated user.
27
33
  *
@@ -1 +1 @@
1
- {"version":3,"file":"OAuthOperations.d.ts","sourceRoot":"","sources":["../../src/auth/OAuthOperations.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,UAAU,EAAqB,MAAM,sBAAsB,CAAA;AACpE,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAG7E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EACL,KAAK,kBAAkB,EAEvB,KAAK,aAAa,EAElB,KAAK,QAAQ,EAEd,MAAM,2BAA2B,CAAA;AAElC;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3C;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,MAAM,EACZ,QAAQ,WAAW,EACnB,SAAS,mBAAmB,KAC3B,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CA+B9D,CAAA;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GACjC,aAAa,MAAM,KAClB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAuBlF,CAAA;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,aAAa,MAAM,KAClB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAuBzD,CAAA;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GACvB,OAAO,UAAU,EACjB,QAAQ,WAAW,KAClB,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CA0C1D,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,UAAU,EACjB,QAAQ,WAAW,KAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAyBpD,CAAA;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,GAC5B,eAAe,aAAa,EAC5B,MAAM,kBAAkB,EACxB,MAAM,QAAQ,EACd,OAAO,MAAM,KACZ,UAYD,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAC1B,eAAe,aAAa,EAC5B,MAAM,kBAAkB,EACxB,MAAM,QAAQ,KACb,UAAqF,CAAA"}
1
+ {"version":3,"file":"OAuthOperations.d.ts","sourceRoot":"","sources":["../../src/auth/OAuthOperations.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAA;AAE3D,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAG7E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EACL,KAAK,kBAAkB,EAGvB,KAAK,aAAa,EAElB,KAAK,QAAQ,EAEd,MAAM,2BAA2B,CAAA;AAElC;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3C;AAWD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAC1B,MAAM,UACJ,WAAW,WACV,mBAAmB;;;;;;qCA8B3B,CAAA;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,gBACpB,MAAM,KAClB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAqBlF,CAAA;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,gBACT,MAAM,KAClB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAqBzD,CAAA;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,UAChB,UAAU,UACT,WAAW,KAClB,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAqD1D,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,UACf,UAAU,UACT,WAAW,KAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAuBpD,CAAA;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,kBACb,aAAa,QACtB,kBAAkB,QAClB,QAAQ,SACP,MAAM,KACZ,UAYD,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,kBACX,aAAa,QACtB,kBAAkB,QAClB,QAAQ,KACb,UAAqF,CAAA"}
@@ -20,13 +20,13 @@
20
20
  */
21
21
  import * as Clock from "effect/Clock";
22
22
  import * as Effect from "effect/Effect";
23
+ import { HttpClient, HttpClientRequest } from "effect/http";
23
24
  import * as Schema from "effect/Schema";
24
- import { HttpClient, HttpClientRequest } from "effect/unstable/http";
25
25
  import {} from "../config/OAuthSchemas.js";
26
26
  import { unsafeCurrentTimeMillis } from "../internal/legacyWallClock.js";
27
27
  import { ME_URL, RESOURCES_URL, REVOKE_URL, TOKEN_URL } from "./OAuthEndpoints.js";
28
28
  import { OAuthError } from "./OAuthErrors.js";
29
- import { AccessibleResourceSchema, TokenResponseSchema, UserInfoSchema } from "./OAuthResponseSchemas.js";
29
+ import { AccessibleResourceSchema, TokenErrorSchema, TokenResponseSchema, UserInfoSchema } from "./OAuthResponseSchemas.js";
30
30
  /**
31
31
  * Exchange authorization code for tokens.
32
32
  *
@@ -48,7 +48,7 @@ export const exchangeCodeForTokens = (code, config, options) => Effect.gen(funct
48
48
  if (response.status >= 400) {
49
49
  const text = yield* response.text;
50
50
  yield* Effect.logDebug(`Token exchange failed (${response.status}): ${text}`);
51
- return yield* Effect.fail(new OAuthError({ step: "token", cause: `HTTP ${response.status}` }));
51
+ return yield* new OAuthError({ step: "token", cause: `HTTP ${response.status}` });
52
52
  }
53
53
  const body = yield* response.json;
54
54
  return yield* Schema.decodeUnknownEffect(TokenResponseSchema)(body);
@@ -67,7 +67,7 @@ export const getAccessibleResources = (accessToken) => Effect.gen(function* () {
67
67
  if (response.status >= 400) {
68
68
  const text = yield* response.text;
69
69
  yield* Effect.logDebug(`Accessible resources failed (${response.status}): ${text}`);
70
- return yield* Effect.fail(new OAuthError({ step: "resources", cause: `HTTP ${response.status}` }));
70
+ return yield* new OAuthError({ step: "resources", cause: `HTTP ${response.status}` });
71
71
  }
72
72
  const body = yield* response.json;
73
73
  return yield* Schema.decodeUnknownEffect(Schema.Array(AccessibleResourceSchema))(body);
@@ -86,7 +86,7 @@ export const getUserInfo = (accessToken) => Effect.gen(function* () {
86
86
  if (response.status >= 400) {
87
87
  const text = yield* response.text;
88
88
  yield* Effect.logDebug(`User info failed (${response.status}): ${text}`);
89
- return yield* Effect.fail(new OAuthError({ step: "user-info", cause: `HTTP ${response.status}` }));
89
+ return yield* new OAuthError({ step: "user-info", cause: `HTTP ${response.status}` });
90
90
  }
91
91
  const body = yield* response.json;
92
92
  return yield* Schema.decodeUnknownEffect(UserInfoSchema)(body);
@@ -110,7 +110,17 @@ export const refreshToken = (token, config) => Effect.gen(function* () {
110
110
  const response = yield* httpClient.execute(request).pipe(Effect.mapError((cause) => new OAuthError({ step: "refresh", cause })));
111
111
  if (response.status >= 400) {
112
112
  const text = yield* response.text.pipe(Effect.mapError((cause) => new OAuthError({ step: "refresh", cause })));
113
- return yield* Effect.fail(new OAuthError({ step: "refresh", cause: `HTTP ${response.status}: ${text}` }));
113
+ // The OAuth `error` code is what distinguishes "this grant is spent" from
114
+ // "your request was malformed", and callers key credential deletion off
115
+ // it. A body that is not JSON, or not shaped like an OAuth error, simply
116
+ // leaves it absent — which callers read as "no verdict", not "rejected".
117
+ const errorCode = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(TokenErrorSchema))(text).pipe(Effect.map((decoded) => decoded.error), Effect.catch(() => Effect.succeed(undefined)));
118
+ return yield* new OAuthError({
119
+ step: "refresh",
120
+ cause: `HTTP ${response.status}: ${text}`,
121
+ status: response.status,
122
+ ...(!(errorCode === undefined) && { errorCode })
123
+ });
114
124
  }
115
125
  const body = yield* response.json.pipe(Effect.mapError((cause) => new OAuthError({ step: "refresh", cause })));
116
126
  const tokenResponse = yield* Schema.decodeUnknownEffect(TokenResponseSchema)(body).pipe(Effect.mapError((cause) => new OAuthError({ step: "refresh", cause })));
@@ -140,10 +150,10 @@ export const revokeToken = (token, config) => Effect.gen(function* () {
140
150
  }), Effect.mapError((cause) => new OAuthError({ step: "revoke", cause })));
141
151
  const response = yield* httpClient.execute(request).pipe(Effect.mapError((cause) => new OAuthError({ step: "revoke", cause })));
142
152
  if (response.status >= 400) {
143
- return yield* Effect.fail(new OAuthError({
153
+ return yield* new OAuthError({
144
154
  step: "revoke",
145
155
  cause: `Token revocation failed with status ${response.status}`
146
- }));
156
+ });
147
157
  }
148
158
  });
149
159
  /**