@knpkv/confluence-to-markdown 0.2.0 → 0.4.1
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 +60 -0
- package/LICENSE +21 -0
- package/README.md +282 -14
- package/dist/ConfluenceAuth.d.ts +76 -0
- package/dist/ConfluenceAuth.d.ts.map +1 -0
- package/dist/ConfluenceAuth.js +356 -0
- package/dist/ConfluenceAuth.js.map +1 -0
- package/dist/ConfluenceClient.d.ts +26 -2
- package/dist/ConfluenceClient.d.ts.map +1 -1
- package/dist/ConfluenceClient.js +98 -92
- package/dist/ConfluenceClient.js.map +1 -1
- package/dist/ConfluenceConfig.d.ts +4 -24
- package/dist/ConfluenceConfig.d.ts.map +1 -1
- package/dist/ConfluenceConfig.js +45 -7
- package/dist/ConfluenceConfig.js.map +1 -1
- package/dist/ConfluenceError.d.ts +89 -6
- package/dist/ConfluenceError.d.ts.map +1 -1
- package/dist/ConfluenceError.js +88 -5
- package/dist/ConfluenceError.js.map +1 -1
- package/dist/GitError.d.ts +103 -0
- package/dist/GitError.d.ts.map +1 -0
- package/dist/GitError.js +85 -0
- package/dist/GitError.js.map +1 -0
- package/dist/GitService.d.ts +175 -0
- package/dist/GitService.d.ts.map +1 -0
- package/dist/GitService.js +431 -0
- package/dist/GitService.js.map +1 -0
- package/dist/LocalFileSystem.d.ts +29 -4
- package/dist/LocalFileSystem.d.ts.map +1 -1
- package/dist/LocalFileSystem.js +80 -6
- package/dist/LocalFileSystem.js.map +1 -1
- package/dist/MarkdownConverter.d.ts +49 -2
- package/dist/MarkdownConverter.d.ts.map +1 -1
- package/dist/MarkdownConverter.js +73 -111
- package/dist/MarkdownConverter.js.map +1 -1
- package/dist/SchemaConverterError.d.ts +108 -0
- package/dist/SchemaConverterError.d.ts.map +1 -0
- package/dist/SchemaConverterError.js +84 -0
- package/dist/SchemaConverterError.js.map +1 -0
- package/dist/Schemas.d.ts +225 -1
- package/dist/Schemas.d.ts.map +1 -1
- package/dist/Schemas.js +155 -6
- package/dist/Schemas.js.map +1 -1
- package/dist/SyncEngine.d.ts +30 -20
- package/dist/SyncEngine.d.ts.map +1 -1
- package/dist/SyncEngine.js +566 -117
- package/dist/SyncEngine.js.map +1 -1
- package/dist/ast/BlockNode.d.ts +468 -0
- package/dist/ast/BlockNode.d.ts.map +1 -0
- package/dist/ast/BlockNode.js +319 -0
- package/dist/ast/BlockNode.js.map +1 -0
- package/dist/ast/Document.d.ts +244 -0
- package/dist/ast/Document.d.ts.map +1 -0
- package/dist/ast/Document.js +69 -0
- package/dist/ast/Document.js.map +1 -0
- package/dist/ast/InlineNode.d.ts +477 -0
- package/dist/ast/InlineNode.d.ts.map +1 -0
- package/dist/ast/InlineNode.js +263 -0
- package/dist/ast/InlineNode.js.map +1 -0
- package/dist/ast/MacroNode.d.ts +267 -0
- package/dist/ast/MacroNode.d.ts.map +1 -0
- package/dist/ast/MacroNode.js +164 -0
- package/dist/ast/MacroNode.js.map +1 -0
- package/dist/ast/index.d.ts +10 -0
- package/dist/ast/index.d.ts.map +1 -0
- package/dist/ast/index.js +14 -0
- package/dist/ast/index.js.map +1 -0
- package/dist/bin.js +33 -149
- package/dist/bin.js.map +1 -1
- package/dist/commands/auth.d.ts +15 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +86 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/clone.d.ts +12 -0
- package/dist/commands/clone.d.ts.map +1 -0
- package/dist/commands/clone.js +93 -0
- package/dist/commands/clone.js.map +1 -0
- package/dist/commands/delete.d.ts +13 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +48 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/errorHandler.d.ts +14 -0
- package/dist/commands/errorHandler.d.ts.map +1 -0
- package/dist/commands/errorHandler.js +33 -0
- package/dist/commands/errorHandler.js.map +1 -0
- package/dist/commands/git.d.ts +22 -0
- package/dist/commands/git.d.ts.map +1 -0
- package/dist/commands/git.js +72 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/index.d.ts +11 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +11 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/layers.d.ts +31 -0
- package/dist/commands/layers.d.ts.map +1 -0
- package/dist/commands/layers.js +137 -0
- package/dist/commands/layers.js.map +1 -0
- package/dist/commands/new.d.ts +9 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +80 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/pageTree.d.ts +18 -0
- package/dist/commands/pageTree.d.ts.map +1 -0
- package/dist/commands/pageTree.js +20 -0
- package/dist/commands/pageTree.js.map +1 -0
- package/dist/commands/shared.d.ts +15 -0
- package/dist/commands/shared.d.ts.map +1 -0
- package/dist/commands/shared.js +27 -0
- package/dist/commands/shared.js.map +1 -0
- package/dist/commands/sync.d.ts +15 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +101 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +10 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/NodeLayers.d.ts +7 -0
- package/dist/internal/NodeLayers.d.ts.map +1 -0
- package/dist/internal/NodeLayers.js +19 -0
- package/dist/internal/NodeLayers.js.map +1 -0
- package/dist/internal/frontmatter.d.ts +10 -0
- package/dist/internal/frontmatter.d.ts.map +1 -1
- package/dist/internal/frontmatter.js +16 -0
- package/dist/internal/frontmatter.js.map +1 -1
- package/dist/internal/gitCommands.d.ts +78 -0
- package/dist/internal/gitCommands.d.ts.map +1 -0
- package/dist/internal/gitCommands.js +156 -0
- package/dist/internal/gitCommands.js.map +1 -0
- package/dist/internal/hashUtils.d.ts +42 -1
- package/dist/internal/hashUtils.d.ts.map +1 -1
- package/dist/internal/hashUtils.js +38 -2
- package/dist/internal/hashUtils.js.map +1 -1
- package/dist/internal/oauthServer.d.ts +55 -0
- package/dist/internal/oauthServer.d.ts.map +1 -0
- package/dist/internal/oauthServer.js +110 -0
- package/dist/internal/oauthServer.js.map +1 -0
- package/dist/internal/pathUtils.d.ts +21 -4
- package/dist/internal/pathUtils.d.ts.map +1 -1
- package/dist/internal/pathUtils.js +24 -13
- package/dist/internal/pathUtils.js.map +1 -1
- package/dist/internal/tokenStorage.d.ts +75 -0
- package/dist/internal/tokenStorage.d.ts.map +1 -0
- package/dist/internal/tokenStorage.js +149 -0
- package/dist/internal/tokenStorage.js.map +1 -0
- package/dist/internal/userCache.d.ts +42 -0
- package/dist/internal/userCache.d.ts.map +1 -0
- package/dist/internal/userCache.js +51 -0
- package/dist/internal/userCache.js.map +1 -0
- package/dist/parsers/ConfluenceParser.d.ts +26 -0
- package/dist/parsers/ConfluenceParser.d.ts.map +1 -0
- package/dist/parsers/ConfluenceParser.js +792 -0
- package/dist/parsers/ConfluenceParser.js.map +1 -0
- package/dist/parsers/MarkdownParser.d.ts +26 -0
- package/dist/parsers/MarkdownParser.d.ts.map +1 -0
- package/dist/parsers/MarkdownParser.js +873 -0
- package/dist/parsers/MarkdownParser.js.map +1 -0
- package/dist/parsers/index.d.ts +8 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +8 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/schemas/ConfluenceSchema.d.ts +21 -0
- package/dist/schemas/ConfluenceSchema.d.ts.map +1 -0
- package/dist/schemas/ConfluenceSchema.js +38 -0
- package/dist/schemas/ConfluenceSchema.js.map +1 -0
- package/dist/schemas/ConversionSchema.d.ts +35 -0
- package/dist/schemas/ConversionSchema.d.ts.map +1 -0
- package/dist/schemas/ConversionSchema.js +208 -0
- package/dist/schemas/ConversionSchema.js.map +1 -0
- package/dist/schemas/MarkdownSchema.d.ts +21 -0
- package/dist/schemas/MarkdownSchema.d.ts.map +1 -0
- package/dist/schemas/MarkdownSchema.js +38 -0
- package/dist/schemas/MarkdownSchema.js.map +1 -0
- package/dist/schemas/hast/HastFromHtml.d.ts +27 -0
- package/dist/schemas/hast/HastFromHtml.d.ts.map +1 -0
- package/dist/schemas/hast/HastFromHtml.js +107 -0
- package/dist/schemas/hast/HastFromHtml.js.map +1 -0
- package/dist/schemas/hast/HastSchema.d.ts +195 -0
- package/dist/schemas/hast/HastSchema.d.ts.map +1 -0
- package/dist/schemas/hast/HastSchema.js +183 -0
- package/dist/schemas/hast/HastSchema.js.map +1 -0
- package/dist/schemas/hast/index.d.ts +9 -0
- package/dist/schemas/hast/index.d.ts.map +1 -0
- package/dist/schemas/hast/index.js +3 -0
- package/dist/schemas/hast/index.js.map +1 -0
- package/dist/schemas/index.d.ts +14 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +16 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/mdast/MdastFromMarkdown.d.ts +30 -0
- package/dist/schemas/mdast/MdastFromMarkdown.d.ts.map +1 -0
- package/dist/schemas/mdast/MdastFromMarkdown.js +79 -0
- package/dist/schemas/mdast/MdastFromMarkdown.js.map +1 -0
- package/dist/schemas/mdast/MdastSchema.d.ts +385 -0
- package/dist/schemas/mdast/MdastSchema.d.ts.map +1 -0
- package/dist/schemas/mdast/MdastSchema.js +266 -0
- package/dist/schemas/mdast/MdastSchema.js.map +1 -0
- package/dist/schemas/mdast/index.d.ts +10 -0
- package/dist/schemas/mdast/index.d.ts.map +1 -0
- package/dist/schemas/mdast/index.js +4 -0
- package/dist/schemas/mdast/index.js.map +1 -0
- package/dist/schemas/mdast/mdastToString.d.ts +13 -0
- package/dist/schemas/mdast/mdastToString.d.ts.map +1 -0
- package/dist/schemas/mdast/mdastToString.js +85 -0
- package/dist/schemas/mdast/mdastToString.js.map +1 -0
- package/dist/schemas/nodes/block/BlockSchema.d.ts +43 -0
- package/dist/schemas/nodes/block/BlockSchema.d.ts.map +1 -0
- package/dist/schemas/nodes/block/BlockSchema.js +634 -0
- package/dist/schemas/nodes/block/BlockSchema.js.map +1 -0
- package/dist/schemas/nodes/block/index.d.ts +7 -0
- package/dist/schemas/nodes/block/index.d.ts.map +1 -0
- package/dist/schemas/nodes/block/index.js +7 -0
- package/dist/schemas/nodes/block/index.js.map +1 -0
- package/dist/schemas/nodes/index.d.ts +9 -0
- package/dist/schemas/nodes/index.d.ts.map +1 -0
- package/dist/schemas/nodes/index.js +12 -0
- package/dist/schemas/nodes/index.js.map +1 -0
- package/dist/schemas/nodes/inline/InlineSchema.d.ts +48 -0
- package/dist/schemas/nodes/inline/InlineSchema.d.ts.map +1 -0
- package/dist/schemas/nodes/inline/InlineSchema.js +436 -0
- package/dist/schemas/nodes/inline/InlineSchema.js.map +1 -0
- package/dist/schemas/nodes/inline/index.d.ts +7 -0
- package/dist/schemas/nodes/inline/index.d.ts.map +1 -0
- package/dist/schemas/nodes/inline/index.js +7 -0
- package/dist/schemas/nodes/inline/index.js.map +1 -0
- package/dist/schemas/nodes/macro/MacroSchema.d.ts +27 -0
- package/dist/schemas/nodes/macro/MacroSchema.d.ts.map +1 -0
- package/dist/schemas/nodes/macro/MacroSchema.js +162 -0
- package/dist/schemas/nodes/macro/MacroSchema.js.map +1 -0
- package/dist/schemas/nodes/macro/index.d.ts +7 -0
- package/dist/schemas/nodes/macro/index.d.ts.map +1 -0
- package/dist/schemas/nodes/macro/index.js +7 -0
- package/dist/schemas/nodes/macro/index.js.map +1 -0
- package/dist/schemas/preprocessing/ConfluencePreprocessor.d.ts +24 -0
- package/dist/schemas/preprocessing/ConfluencePreprocessor.d.ts.map +1 -0
- package/dist/schemas/preprocessing/ConfluencePreprocessor.js +351 -0
- package/dist/schemas/preprocessing/ConfluencePreprocessor.js.map +1 -0
- package/dist/schemas/preprocessing/index.d.ts +8 -0
- package/dist/schemas/preprocessing/index.d.ts.map +1 -0
- package/dist/schemas/preprocessing/index.js +2 -0
- package/dist/schemas/preprocessing/index.js.map +1 -0
- package/dist/serializers/ConfluenceSerializer.d.ts +30 -0
- package/dist/serializers/ConfluenceSerializer.d.ts.map +1 -0
- package/dist/serializers/ConfluenceSerializer.js +551 -0
- package/dist/serializers/ConfluenceSerializer.js.map +1 -0
- package/dist/serializers/MarkdownSerializer.d.ts +34 -0
- package/dist/serializers/MarkdownSerializer.d.ts.map +1 -0
- package/dist/serializers/MarkdownSerializer.js +355 -0
- package/dist/serializers/MarkdownSerializer.js.map +1 -0
- package/dist/serializers/index.d.ts +8 -0
- package/dist/serializers/index.d.ts.map +1 -0
- package/dist/serializers/index.js +8 -0
- package/dist/serializers/index.js.map +1 -0
- package/package.json +27 -16
- package/src/ConfluenceAuth.ts +571 -0
- package/src/ConfluenceClient.ts +188 -156
- package/src/ConfluenceConfig.ts +63 -7
- package/src/ConfluenceError.ts +110 -14
- package/src/GitError.ts +92 -0
- package/src/GitService.ts +859 -0
- package/src/LocalFileSystem.ts +179 -9
- package/src/MarkdownConverter.ts +126 -122
- package/src/SchemaConverterError.ts +108 -0
- package/src/Schemas.ts +223 -6
- package/src/SyncEngine.ts +745 -162
- package/src/ast/BlockNode.ts +425 -0
- package/src/ast/Document.ts +90 -0
- package/src/ast/InlineNode.ts +323 -0
- package/src/ast/MacroNode.ts +245 -0
- package/src/ast/index.ts +83 -0
- package/src/bin.ts +50 -249
- package/src/commands/auth.ts +117 -0
- package/src/commands/clone.ts +145 -0
- package/src/commands/delete.ts +57 -0
- package/src/commands/errorHandler.ts +32 -0
- package/src/commands/git.ts +114 -0
- package/src/commands/index.ts +10 -0
- package/src/commands/layers.ts +211 -0
- package/src/commands/new.ts +99 -0
- package/src/commands/pageTree.ts +40 -0
- package/src/commands/shared.ts +35 -0
- package/src/commands/sync.ts +129 -0
- package/src/index.ts +21 -1
- package/src/internal/NodeLayers.ts +21 -0
- package/src/internal/frontmatter.ts +21 -0
- package/src/internal/gitCommands.ts +229 -0
- package/src/internal/hashUtils.ts +65 -3
- package/src/internal/oauthServer.ts +199 -0
- package/src/internal/pathUtils.ts +34 -17
- package/src/internal/tokenStorage.ts +240 -0
- package/src/internal/userCache.ts +90 -0
- package/src/parsers/ConfluenceParser.ts +950 -0
- package/src/parsers/MarkdownParser.ts +1198 -0
- package/src/parsers/index.ts +8 -0
- package/src/schemas/ConfluenceSchema.ts +56 -0
- package/src/schemas/ConversionSchema.ts +318 -0
- package/src/schemas/MarkdownSchema.ts +56 -0
- package/src/schemas/hast/HastFromHtml.ts +153 -0
- package/src/schemas/hast/HastSchema.ts +274 -0
- package/src/schemas/hast/index.ts +35 -0
- package/src/schemas/index.ts +20 -0
- package/src/schemas/mdast/MdastFromMarkdown.ts +118 -0
- package/src/schemas/mdast/MdastSchema.ts +566 -0
- package/src/schemas/mdast/index.ts +59 -0
- package/src/schemas/mdast/mdastToString.ts +102 -0
- package/src/schemas/nodes/block/BlockSchema.ts +773 -0
- package/src/schemas/nodes/block/index.ts +13 -0
- package/src/schemas/nodes/index.ts +20 -0
- package/src/schemas/nodes/inline/InlineSchema.ts +523 -0
- package/src/schemas/nodes/inline/index.ts +14 -0
- package/src/schemas/nodes/macro/MacroSchema.ts +226 -0
- package/src/schemas/nodes/macro/index.ts +6 -0
- package/src/schemas/preprocessing/ConfluencePreprocessor.ts +446 -0
- package/src/schemas/preprocessing/index.ts +8 -0
- package/src/serializers/ConfluenceSerializer.ts +717 -0
- package/src/serializers/MarkdownSerializer.ts +493 -0
- package/src/serializers/index.ts +8 -0
- package/test/GitService.test.ts +209 -0
- package/test/MarkdownConverter.test.ts +37 -3
- package/test/Schemas.test.ts +97 -2
- package/test/ast/BlockNode.test.ts +265 -0
- package/test/ast/Document.test.ts +126 -0
- package/test/ast/InlineNode.test.ts +161 -0
- package/test/fixtures/integration-test.html.fixture +103 -0
- package/test/fixtures/integration-test.md.expected +257 -0
- package/test/integration.test.ts +269 -0
- package/test/oauthServer.test.ts +50 -0
- package/test/parsers/ConfluenceParser.test.ts +283 -0
- package/test/schemas/ConfluencePreprocessor.test.ts +180 -0
- package/test/schemas/ConversionSchema.test.ts +159 -0
- package/test/schemas/HastSchema.test.ts +138 -0
- package/test/schemas/MdastSchema.test.ts +145 -0
- package/test/schemas/nodes/block/BlockSchema.test.ts +173 -0
- package/test/schemas/nodes/inline/InlineSchema.test.ts +198 -0
- package/test/schemas/nodes/macro/MacroSchema.test.ts +142 -0
- package/test/tokenStorage.test.ts +99 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,65 @@
|
|
|
1
1
|
# @knpkv/confluence-to-markdown
|
|
2
2
|
|
|
3
|
+
## 0.4.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#23](https://github.com/knpkv/npm/pull/23) [`bd5bbf4`](https://github.com/knpkv/npm/commit/bd5bbf4679ae1d41b33182fcca70adf0960f0839) Thanks @konopkov! - feat(confluence-api-client): new package for Confluence Cloud REST API
|
|
8
|
+
|
|
9
|
+
New `@knpkv/confluence-api-client` package with Effect-based Confluence Cloud REST API client:
|
|
10
|
+
- V1 API: `/user`, `/content/{id}/property/{key}` endpoints
|
|
11
|
+
- V2 API: Pages CRUD with pagination support
|
|
12
|
+
- Basic auth (email + API token) and OAuth2 (access token + cloud ID)
|
|
13
|
+
- Effect Layer wrapper with config service
|
|
14
|
+
- Daily CI workflow for spec updates
|
|
15
|
+
|
|
16
|
+
Migrated `confluence-to-markdown` to use new API client package.
|
|
17
|
+
|
|
18
|
+
- [#24](https://github.com/knpkv/npm/pull/24) [`cbbe42f`](https://github.com/knpkv/npm/commit/cbbe42f8747af8955aacfa64a7e3868035cffec5) Thanks @konopkov! - Fix Confluence link handling and consolidate preprocessing modules
|
|
19
|
+
- Handle `<ac:link><ac:link-body>` pattern that was being lost during conversion
|
|
20
|
+
- Consolidate duplicate preprocessing code (deleted `parsers/preprocessing/`)
|
|
21
|
+
- Remove type assertion casts in favor of Schema.decodeSync
|
|
22
|
+
- Fix CI: configure git user.name/email in init for fresh repos
|
|
23
|
+
|
|
24
|
+
- Updated dependencies [[`bd5bbf4`](https://github.com/knpkv/npm/commit/bd5bbf4679ae1d41b33182fcca70adf0960f0839)]:
|
|
25
|
+
- @knpkv/confluence-api-client@0.2.0
|
|
26
|
+
|
|
27
|
+
## 0.4.0
|
|
28
|
+
|
|
29
|
+
### Minor Changes
|
|
30
|
+
|
|
31
|
+
- [#21](https://github.com/knpkv/npm/pull/21) [`f696d00`](https://github.com/knpkv/npm/commit/f696d0056de28f2871a48a0caac88b696c86ba68) Thanks @konopkov! - Add git version tracking and CLI improvements
|
|
32
|
+
- Add GitService for git operations with version history replay
|
|
33
|
+
- Add clone command that pulls pages with full version history
|
|
34
|
+
- Flatten git commands: confluence commit/log/diff (was: confluence git ...)
|
|
35
|
+
- Add auth status subcommand
|
|
36
|
+
- Reorganize bin.ts into separate command files
|
|
37
|
+
- Add nice error messages without stack traces
|
|
38
|
+
- Clone fails if already cloned
|
|
39
|
+
|
|
40
|
+
## 0.3.0
|
|
41
|
+
|
|
42
|
+
### Minor Changes
|
|
43
|
+
|
|
44
|
+
- [#19](https://github.com/knpkv/npm/pull/19) [`15b1ff7`](https://github.com/knpkv/npm/commit/15b1ff70e9e7a406ddbc4ce8bcd0673965464421) Thanks @konopkov! - Add OAuth authentication for Confluence Cloud
|
|
45
|
+
- `confluence auth create` - opens Atlassian Developer Console to create OAuth app
|
|
46
|
+
- `confluence auth configure` - save client ID/secret
|
|
47
|
+
- `confluence auth login` - browser-based OAuth flow
|
|
48
|
+
- `confluence auth logout` - remove stored token
|
|
49
|
+
- Show login status in `confluence status`
|
|
50
|
+
- Auto-refresh tokens when expired
|
|
51
|
+
- Use granular scopes for API v2: read:page:confluence, write:page:confluence
|
|
52
|
+
|
|
53
|
+
## 0.2.1
|
|
54
|
+
|
|
55
|
+
### Patch Changes
|
|
56
|
+
|
|
57
|
+
- [#17](https://github.com/knpkv/npm/pull/17) [`879af56`](https://github.com/knpkv/npm/commit/879af56383230d852e1434efb67e6f5cdffd3507) Thanks @konopkov! - Improve type safety and code organization:
|
|
58
|
+
- Add MdastRootSchema with runtime validation
|
|
59
|
+
- Extract preprocessing to separate module
|
|
60
|
+
- Consolidate duplicate mdastToString utility
|
|
61
|
+
- Use exhaustive switch statements
|
|
62
|
+
|
|
3
63
|
## 0.2.0
|
|
4
64
|
|
|
5
65
|
### Minor Changes
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 knpkv
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
> **Warning**
|
|
4
4
|
> This package is experimental and in early development. Code is primarily AI-generated and not yet publicly published. For preview, use snapshot releases.
|
|
5
5
|
|
|
6
|
-
Sync Confluence Cloud pages to local GitHub Flavored Markdown files.
|
|
6
|
+
Sync Confluence Cloud pages to local GitHub Flavored Markdown files with built-in git version tracking.
|
|
7
7
|
|
|
8
8
|
## Installation
|
|
9
9
|
|
|
@@ -13,47 +13,315 @@ npm install @knpkv/confluence-to-markdown effect
|
|
|
13
13
|
|
|
14
14
|
## CLI Usage
|
|
15
15
|
|
|
16
|
+
### Core Commands
|
|
17
|
+
|
|
16
18
|
```bash
|
|
17
|
-
#
|
|
18
|
-
confluence
|
|
19
|
+
# Clone pages with full version history
|
|
20
|
+
confluence clone --root-page-id <ID> --base-url <URL>
|
|
19
21
|
|
|
20
22
|
# Pull pages from Confluence
|
|
21
23
|
confluence pull
|
|
24
|
+
confluence pull -f, --force # overwrite local changes
|
|
25
|
+
confluence pull --replay-history # replay each version as separate git commit
|
|
22
26
|
|
|
23
27
|
# Push local changes to Confluence
|
|
24
28
|
confluence push
|
|
29
|
+
confluence push -n, --dry-run # preview changes without applying
|
|
25
30
|
|
|
26
|
-
#
|
|
27
|
-
confluence
|
|
31
|
+
# Delete a page (interactive selector, deletes local file)
|
|
32
|
+
confluence delete
|
|
28
33
|
|
|
29
34
|
# Check sync status
|
|
30
35
|
confluence status
|
|
31
36
|
```
|
|
32
37
|
|
|
38
|
+
### Authentication Commands
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Create OAuth app (opens browser to Atlassian Developer Console)
|
|
42
|
+
confluence auth create
|
|
43
|
+
|
|
44
|
+
# Configure OAuth credentials
|
|
45
|
+
confluence auth configure --client-id <ID> --client-secret <SECRET>
|
|
46
|
+
|
|
47
|
+
# Login via browser
|
|
48
|
+
confluence auth login
|
|
49
|
+
confluence auth login --site <URL> # for accounts with multiple sites
|
|
50
|
+
|
|
51
|
+
# Check auth status
|
|
52
|
+
confluence auth status
|
|
53
|
+
|
|
54
|
+
# Logout
|
|
55
|
+
confluence auth logout
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Page Creation
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Create a new page (interactive parent selector)
|
|
62
|
+
confluence new
|
|
63
|
+
|
|
64
|
+
# Workflow:
|
|
65
|
+
# 1. Create new page: confluence new
|
|
66
|
+
# 2. Edit the file
|
|
67
|
+
# 3. Commit: confluence commit -m "Add new page"
|
|
68
|
+
# 4. Push to Confluence: confluence push
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Page Deletion
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Delete a page (interactive selector)
|
|
75
|
+
confluence delete
|
|
76
|
+
|
|
77
|
+
# Workflow:
|
|
78
|
+
# 1. Delete page: confluence delete (or rm <file>)
|
|
79
|
+
# 2. Commit: confluence commit -m "Delete page"
|
|
80
|
+
# 3. Push to Confluence: confluence push # deletes from Confluence
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Git Commands
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# Commit current changes
|
|
87
|
+
confluence commit
|
|
88
|
+
confluence commit -m "message"
|
|
89
|
+
|
|
90
|
+
# Show commit history
|
|
91
|
+
confluence log
|
|
92
|
+
confluence log -n 5 # last 5 commits
|
|
93
|
+
confluence log --oneline # compact format
|
|
94
|
+
confluence log --since 2024-01-01 # since date
|
|
95
|
+
|
|
96
|
+
# Show changes in working directory
|
|
97
|
+
confluence diff
|
|
98
|
+
confluence diff --staged # staged changes only
|
|
99
|
+
confluence diff --commit HEAD~1 # compare with commit
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## How It Works
|
|
103
|
+
|
|
104
|
+
1. `confluence clone` creates `.confluence/` directory, initializes git, and pulls pages with full version history
|
|
105
|
+
2. `confluence pull` downloads pages and auto-commits changes
|
|
106
|
+
3. `confluence pull --replay-history` replays each Confluence version as a separate git commit with original author/date
|
|
107
|
+
4. Version messages from Confluence are preserved in markdown front-matter
|
|
108
|
+
5. Use standard git commands in `.confluence/` for advanced operations
|
|
109
|
+
|
|
110
|
+
## Git Implementation
|
|
111
|
+
|
|
112
|
+
### Two-Branch Model
|
|
113
|
+
|
|
114
|
+
The CLI uses a two-branch model to track sync state:
|
|
115
|
+
|
|
116
|
+
- **`local`** (current branch): Your working branch for edits
|
|
117
|
+
- **`origin/confluence`**: Tracks the remote Confluence state
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
Clone:
|
|
121
|
+
Confluence ──pull──> local + origin/confluence (both at same commit)
|
|
122
|
+
|
|
123
|
+
Pull:
|
|
124
|
+
Confluence ──pull──> origin/confluence ──merge──> local
|
|
125
|
+
|
|
126
|
+
Push:
|
|
127
|
+
local ──push──> Confluence
|
|
128
|
+
│
|
|
129
|
+
└──> origin/confluence (updated to HEAD)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Commit Behavior
|
|
133
|
+
|
|
134
|
+
When you commit:
|
|
135
|
+
|
|
136
|
+
1. **Sync external docs** (if configured): Copies files from external `docsPath` to `.confluence/`
|
|
137
|
+
2. **Stage all changes**: Runs `git add -A`
|
|
138
|
+
3. **Create commit**: Records changes with your message
|
|
139
|
+
|
|
140
|
+
Note: Front-matter (`contentHash`, `version`) is **not** updated at commit time. Changes are detected by comparing actual content hash vs stored hash.
|
|
141
|
+
|
|
142
|
+
### Push Behavior
|
|
143
|
+
|
|
144
|
+
When you push:
|
|
145
|
+
|
|
146
|
+
1. **Detect changes**: Compares content hash vs stored `contentHash` in front-matter
|
|
147
|
+
2. **Push to Confluence**: Uploads markdown converted to Confluence storage format
|
|
148
|
+
3. **Fetch canonical content**: Downloads what Confluence actually stored (may differ slightly)
|
|
149
|
+
4. **Amend commit**: Updates local file with canonical content so future clones match exactly
|
|
150
|
+
5. **Update tracking branch**: Moves `origin/confluence` to HEAD
|
|
151
|
+
|
|
152
|
+
Multiple local commits combine into a single Confluence version (uses last commit's message).
|
|
153
|
+
|
|
154
|
+
### Content Hash Tracking
|
|
155
|
+
|
|
156
|
+
Each markdown file has front-matter with a `contentHash` field:
|
|
157
|
+
|
|
158
|
+
```yaml
|
|
159
|
+
---
|
|
160
|
+
pageId: "123456"
|
|
161
|
+
version: 42
|
|
162
|
+
title: My Page
|
|
163
|
+
contentHash: 7a8b9c... # SHA-256 of markdown content
|
|
164
|
+
---
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
- After clone/pull: `contentHash` matches the actual content
|
|
168
|
+
- After local edit: content differs from `contentHash` → detected as "needs push"
|
|
169
|
+
- After push: `contentHash` updated to match canonical Confluence content
|
|
170
|
+
|
|
171
|
+
### Why Canonical Content?
|
|
172
|
+
|
|
173
|
+
Confluence may transform your content (normalize whitespace, reorder attributes, etc.). By fetching and storing the canonical content after push:
|
|
174
|
+
|
|
175
|
+
- `clone` on another machine produces **identical** files
|
|
176
|
+
- Git history shows exactly what Confluence has
|
|
177
|
+
- No false "modified" status from round-trip differences
|
|
178
|
+
|
|
179
|
+
## Authentication
|
|
180
|
+
|
|
181
|
+
### OAuth (recommended)
|
|
182
|
+
|
|
183
|
+
#### 1. Create OAuth App
|
|
184
|
+
|
|
185
|
+
1. Go to [Atlassian Developer Console](https://developer.atlassian.com/console/myapps/)
|
|
186
|
+
2. Click **Create** → **OAuth 2.0 integration**
|
|
187
|
+
3. Enter app name (e.g., "Confluence CLI")
|
|
188
|
+
4. Configure permissions in **Permissions** tab:
|
|
189
|
+
- Add **Confluence API** with scopes:
|
|
190
|
+
- `read:page:confluence` - read pages
|
|
191
|
+
- `write:page:confluence` - push changes
|
|
192
|
+
- `delete:page:confluence` - delete pages
|
|
193
|
+
- Add **User Identity API**:
|
|
194
|
+
- `read:me` - get current user info
|
|
195
|
+
5. In **Authorization** tab, set callback URL: `http://localhost:8585/callback`
|
|
196
|
+
6. In **Settings** tab, copy **Client ID** and **Secret**
|
|
197
|
+
|
|
198
|
+
#### 2. Configure and Login
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
# Configure with your client ID and secret
|
|
202
|
+
confluence auth configure --client-id <ID> --client-secret <SECRET>
|
|
203
|
+
|
|
204
|
+
# Login via browser
|
|
205
|
+
confluence auth login
|
|
206
|
+
|
|
207
|
+
# Check login status
|
|
208
|
+
confluence status
|
|
209
|
+
|
|
210
|
+
# Logout
|
|
211
|
+
confluence auth logout
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### API Token (alternative)
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
export CONFLUENCE_API_KEY=your-api-token
|
|
218
|
+
export CONFLUENCE_EMAIL=your-email@example.com
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Generate API token at [Atlassian Account Settings](https://id.atlassian.com/manage-profile/security/api-tokens).
|
|
222
|
+
|
|
223
|
+
### Security Notes
|
|
224
|
+
|
|
225
|
+
- OAuth credentials stored in `~/.confluence/` with restricted permissions (0600)
|
|
226
|
+
- Treat these files as sensitive - do not share or commit
|
|
227
|
+
- Create separate OAuth apps per developer for team projects
|
|
228
|
+
- Tokens auto-refresh; if refresh fails, re-run `confluence auth login`
|
|
229
|
+
|
|
33
230
|
## Configuration
|
|
34
231
|
|
|
35
|
-
|
|
232
|
+
Initialize configuration with `confluence clone`:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
confluence clone --root-page-id 123456 --base-url https://yoursite.atlassian.net
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
This creates `.confluence/config.json` in your project root:
|
|
36
239
|
|
|
37
240
|
```json
|
|
38
241
|
{
|
|
39
242
|
"rootPageId": "123456",
|
|
40
243
|
"baseUrl": "https://yoursite.atlassian.net",
|
|
41
|
-
"
|
|
42
|
-
"
|
|
244
|
+
"docsPath": ".confluence/docs",
|
|
245
|
+
"excludePatterns": [],
|
|
246
|
+
"saveSource": false,
|
|
247
|
+
"trackedPaths": ["**/*.md"]
|
|
43
248
|
}
|
|
44
249
|
```
|
|
45
250
|
|
|
46
|
-
|
|
251
|
+
### Configuration Options
|
|
47
252
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
253
|
+
| Option | Description | Default |
|
|
254
|
+
| ----------------- | ------------------------------------- | ------------------ |
|
|
255
|
+
| `rootPageId` | Confluence page ID to sync from | Required |
|
|
256
|
+
| `baseUrl` | Confluence Cloud URL | Required |
|
|
257
|
+
| `spaceKey` | Optional space key | - |
|
|
258
|
+
| `docsPath` | Local path for markdown files | `.confluence/docs` |
|
|
259
|
+
| `excludePatterns` | Glob patterns to exclude | `[]` |
|
|
260
|
+
| `saveSource` | Save original HTML alongside markdown | `false` |
|
|
261
|
+
| `trackedPaths` | Glob patterns for git tracking | `["**/*.md"]` |
|
|
262
|
+
|
|
263
|
+
## Directory Structure
|
|
264
|
+
|
|
265
|
+
```
|
|
266
|
+
project/
|
|
267
|
+
├── .confluence/
|
|
268
|
+
│ ├── config.json # Configuration file
|
|
269
|
+
│ ├── .git/ # Git repository for version tracking
|
|
270
|
+
│ └── docs/ # Synced markdown files
|
|
271
|
+
│ ├── page1.md
|
|
272
|
+
│ ├── page1/ # Children of page1
|
|
273
|
+
│ │ └── child.md
|
|
274
|
+
│ └── subdir/
|
|
275
|
+
│ └── page2.md
|
|
276
|
+
└── ...
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Page Hierarchy Rules
|
|
280
|
+
|
|
281
|
+
Directory structure determines Confluence page hierarchy:
|
|
282
|
+
|
|
283
|
+
- Files in `docs/` root → children of root page
|
|
284
|
+
- `foo.md` → page "foo"
|
|
285
|
+
- `foo/` directory → contains children of "foo.md"
|
|
286
|
+
- `foo/bar.md` → child page of "foo.md"
|
|
287
|
+
|
|
288
|
+
Example structure:
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
docs/
|
|
292
|
+
├── guide.md # Child of root
|
|
293
|
+
├── guide/ # Children of guide.md
|
|
294
|
+
│ ├── getting-started.md
|
|
295
|
+
│ └── advanced.md
|
|
296
|
+
└── reference.md # Child of root
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### New Page Front-matter
|
|
300
|
+
|
|
301
|
+
New pages require only a `title` in front-matter:
|
|
302
|
+
|
|
303
|
+
```yaml
|
|
304
|
+
---
|
|
305
|
+
title: "My New Page"
|
|
306
|
+
---
|
|
307
|
+
Page content here...
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
After pushing, the file is updated with full metadata:
|
|
311
|
+
|
|
312
|
+
```yaml
|
|
313
|
+
---
|
|
314
|
+
pageId: "123456"
|
|
315
|
+
version: 1
|
|
316
|
+
title: "My New Page"
|
|
317
|
+
updated: 2024-01-15T10:30:00.000Z
|
|
318
|
+
parentId: "789012"
|
|
319
|
+
contentHash: "7a8b9c..."
|
|
320
|
+
---
|
|
51
321
|
```
|
|
52
322
|
|
|
53
323
|
## Known Limitations
|
|
54
324
|
|
|
55
|
-
- **Page creation**: Creating new pages from local markdown is not yet implemented
|
|
56
|
-
- **Conflict detection**: Bidirectional sync does not detect conflicts (last write wins)
|
|
57
325
|
- **Attachments**: Image and file attachments are not synced
|
|
58
326
|
- **Comments**: Page comments are not preserved
|
|
59
327
|
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import * as CommandExecutor from "@effect/platform/CommandExecutor";
|
|
2
|
+
import * as HttpClient from "@effect/platform/HttpClient";
|
|
3
|
+
import * as Context from "effect/Context";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Layer from "effect/Layer";
|
|
6
|
+
import type { FileSystemError } from "./ConfluenceError.js";
|
|
7
|
+
import { AuthMissingError, OAuthError } from "./ConfluenceError.js";
|
|
8
|
+
import type { OAuthConfig, OAuthUser } from "./Schemas.js";
|
|
9
|
+
/**
|
|
10
|
+
* Options for the login method.
|
|
11
|
+
*/
|
|
12
|
+
export interface LoginOptions {
|
|
13
|
+
/** Site URL to select (for accounts with multiple sites) */
|
|
14
|
+
readonly siteUrl?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Information about an accessible Confluence site.
|
|
18
|
+
*/
|
|
19
|
+
export interface AccessibleSite {
|
|
20
|
+
readonly id: string;
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly url: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* ConfluenceAuth service interface.
|
|
26
|
+
*
|
|
27
|
+
* @category Services
|
|
28
|
+
*/
|
|
29
|
+
export interface ConfluenceAuthService {
|
|
30
|
+
/** Configure OAuth client credentials */
|
|
31
|
+
readonly configure: (config: OAuthConfig) => Effect.Effect<void, FileSystemError>;
|
|
32
|
+
/** Check if OAuth is configured */
|
|
33
|
+
readonly isConfigured: () => Effect.Effect<boolean, FileSystemError>;
|
|
34
|
+
/** Start OAuth login flow. Returns list of sites if multiple are available. */
|
|
35
|
+
readonly login: (options?: LoginOptions) => Effect.Effect<ReadonlyArray<AccessibleSite> | void, OAuthError | FileSystemError>;
|
|
36
|
+
/** Remove stored authentication */
|
|
37
|
+
readonly logout: () => Effect.Effect<void, OAuthError | FileSystemError>;
|
|
38
|
+
/** Get access token, refreshing if needed */
|
|
39
|
+
readonly getAccessToken: () => Effect.Effect<string, AuthMissingError | OAuthError | FileSystemError>;
|
|
40
|
+
/** Get cloud ID from stored token */
|
|
41
|
+
readonly getCloudId: () => Effect.Effect<string, AuthMissingError | FileSystemError>;
|
|
42
|
+
/** Get current user info from stored token */
|
|
43
|
+
readonly getCurrentUser: () => Effect.Effect<OAuthUser | null, FileSystemError>;
|
|
44
|
+
/** Check if user is logged in */
|
|
45
|
+
readonly isLoggedIn: () => Effect.Effect<boolean, FileSystemError>;
|
|
46
|
+
}
|
|
47
|
+
declare const ConfluenceAuth_base: Context.TagClass<ConfluenceAuth, "@knpkv/confluence-to-markdown/ConfluenceAuth", ConfluenceAuthService>;
|
|
48
|
+
/**
|
|
49
|
+
* ConfluenceAuth service tag.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* import { Effect } from "effect"
|
|
54
|
+
* import { ConfluenceAuth } from "@knpkv/confluence-to-markdown/ConfluenceAuth"
|
|
55
|
+
*
|
|
56
|
+
* Effect.gen(function* () {
|
|
57
|
+
* const auth = yield* ConfluenceAuth
|
|
58
|
+
* const isLoggedIn = yield* auth.isLoggedIn()
|
|
59
|
+
* if (!isLoggedIn) {
|
|
60
|
+
* yield* auth.login()
|
|
61
|
+
* }
|
|
62
|
+
* })
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @category Services
|
|
66
|
+
*/
|
|
67
|
+
export declare class ConfluenceAuth extends ConfluenceAuth_base {
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Layer for ConfluenceAuth service.
|
|
71
|
+
*
|
|
72
|
+
* @category Layers
|
|
73
|
+
*/
|
|
74
|
+
export declare const layer: Layer.Layer<ConfluenceAuth, never, HttpClient.HttpClient | CommandExecutor.CommandExecutor>;
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=ConfluenceAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfluenceAuth.d.ts","sourceRoot":"","sources":["../src/ConfluenceAuth.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,eAAe,MAAM,kCAAkC,CAAA;AACnE,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAA;AAEzD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAIrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAWnE,OAAO,KAAK,EAAE,WAAW,EAAc,SAAS,EAAE,MAAM,cAAc,CAAA;AAqEtE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;IACjF,mCAAmC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;IACpE,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,CACd,OAAO,CAAC,EAAE,YAAY,KACnB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,IAAI,EAAE,UAAU,GAAG,eAAe,CAAC,CAAA;IACtF,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,CAAC,CAAA;IACxE,6CAA6C;IAC7C,QAAQ,CAAC,cAAc,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,GAAG,eAAe,CAAC,CAAA;IACrG,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,CAAC,CAAA;IACpF,8CAA8C;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE,eAAe,CAAC,CAAA;IAC/E,iCAAiC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;CACnE;;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,cAAe,SAAQ,mBAGjC;CAAG;AA6YN;;;;GAIG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAC7B,cAAc,EACd,KAAK,EACL,UAAU,CAAC,UAAU,GAAG,eAAe,CAAC,eAAe,CACnB,CAAA"}
|