@knpkv/atlassian-common 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +107 -0
- package/dist/Brand.d.ts +118 -0
- package/dist/Brand.d.ts.map +1 -0
- package/dist/Brand.js +107 -0
- package/dist/Brand.js.map +1 -0
- package/dist/Hash.d.ts +53 -0
- package/dist/Hash.d.ts.map +1 -0
- package/dist/Hash.js +63 -0
- package/dist/Hash.js.map +1 -0
- package/dist/SerializeError.d.ts +48 -0
- package/dist/SerializeError.d.ts.map +1 -0
- package/dist/SerializeError.js +42 -0
- package/dist/SerializeError.js.map +1 -0
- package/dist/ast/BlockNode.d.ts +429 -0
- package/dist/ast/BlockNode.d.ts.map +1 -0
- package/dist/ast/BlockNode.js +279 -0
- package/dist/ast/BlockNode.js.map +1 -0
- package/dist/ast/Document.d.ts +255 -0
- package/dist/ast/Document.d.ts.map +1 -0
- package/dist/ast/Document.js +80 -0
- package/dist/ast/Document.js.map +1 -0
- package/dist/ast/InlineNode.d.ts +483 -0
- package/dist/ast/InlineNode.d.ts.map +1 -0
- package/dist/ast/InlineNode.js +268 -0
- package/dist/ast/InlineNode.js.map +1 -0
- package/dist/ast/MacroNode.d.ts +214 -0
- package/dist/ast/MacroNode.d.ts.map +1 -0
- package/dist/ast/MacroNode.js +110 -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/auth/OAuthEndpoints.d.ts +95 -0
- package/dist/auth/OAuthEndpoints.d.ts.map +1 -0
- package/dist/auth/OAuthEndpoints.js +112 -0
- package/dist/auth/OAuthEndpoints.js.map +1 -0
- package/dist/auth/OAuthErrors.d.ts +76 -0
- package/dist/auth/OAuthErrors.d.ts.map +1 -0
- package/dist/auth/OAuthErrors.js +85 -0
- package/dist/auth/OAuthErrors.js.map +1 -0
- package/dist/auth/OAuthOperations.d.ts +87 -0
- package/dist/auth/OAuthOperations.d.ts.map +1 -0
- package/dist/auth/OAuthOperations.js +169 -0
- package/dist/auth/OAuthOperations.js.map +1 -0
- package/dist/auth/OAuthResponseSchemas.d.ts +65 -0
- package/dist/auth/OAuthResponseSchemas.d.ts.map +1 -0
- package/dist/auth/OAuthResponseSchemas.js +47 -0
- package/dist/auth/OAuthResponseSchemas.js.map +1 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +16 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/uuid.d.ts +14 -0
- package/dist/auth/uuid.d.ts.map +1 -0
- package/dist/auth/uuid.js +14 -0
- package/dist/auth/uuid.js.map +1 -0
- package/dist/config/ConfigPaths.d.ts +95 -0
- package/dist/config/ConfigPaths.d.ts.map +1 -0
- package/dist/config/ConfigPaths.js +102 -0
- package/dist/config/ConfigPaths.js.map +1 -0
- package/dist/config/OAuthSchemas.d.ts +144 -0
- package/dist/config/OAuthSchemas.d.ts.map +1 -0
- package/dist/config/OAuthSchemas.js +107 -0
- package/dist/config/OAuthSchemas.js.map +1 -0
- package/dist/config/TokenStorage.d.ts +96 -0
- package/dist/config/TokenStorage.d.ts.map +1 -0
- package/dist/config/TokenStorage.js +128 -0
- package/dist/config/TokenStorage.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +12 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/index.d.ts +7 -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/serializers/MarkdownSerializer.d.ts +63 -0
- package/dist/serializers/MarkdownSerializer.d.ts.map +1 -0
- package/dist/serializers/MarkdownSerializer.js +367 -0
- package/dist/serializers/MarkdownSerializer.js.map +1 -0
- package/dist/serializers/index.d.ts +7 -0
- package/dist/serializers/index.d.ts.map +1 -0
- package/dist/serializers/index.js +7 -0
- package/dist/serializers/index.js.map +1 -0
- package/package.json +86 -0
- package/src/Brand.ts +142 -0
- package/src/Hash.ts +68 -0
- package/src/SerializeError.ts +50 -0
- package/src/ast/BlockNode.ts +386 -0
- package/src/ast/Document.ts +101 -0
- package/src/ast/InlineNode.ts +328 -0
- package/src/ast/MacroNode.ts +172 -0
- package/src/ast/index.ts +87 -0
- package/src/auth/OAuthEndpoints.ts +142 -0
- package/src/auth/OAuthErrors.ts +101 -0
- package/src/auth/OAuthOperations.ts +276 -0
- package/src/auth/OAuthResponseSchemas.ts +70 -0
- package/src/auth/index.ts +47 -0
- package/src/auth/uuid.ts +14 -0
- package/src/config/ConfigPaths.ts +179 -0
- package/src/config/OAuthSchemas.ts +146 -0
- package/src/config/TokenStorage.ts +228 -0
- package/src/config/index.ts +43 -0
- package/src/index.ts +34 -0
- package/src/parsers/index.ts +8 -0
- package/src/serializers/MarkdownSerializer.ts +498 -0
- package/src/serializers/index.ts +7 -0
- package/test/Brand.test.ts +90 -0
- package/test/MarkdownSerializer.test.ts +82 -0
- package/test/OAuthEndpoints.test.ts +109 -0
- package/test/OAuthOperations.test.ts +315 -0
- package/tsconfig.json +11 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/vitest.config.ts +12 -0
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST-to-Markdown serializer with roundtrip comment encoding for non-Markdown features.
|
|
3
|
+
*
|
|
4
|
+
* **Mental model**
|
|
5
|
+
*
|
|
6
|
+
* - **Visitor over DocumentNode union**: {@link serializeToMarkdown} walks the AST, dispatching
|
|
7
|
+
* on `_tag` to emit Markdown. Effect-based for composability with the rest of the pipeline.
|
|
8
|
+
* - **Roundtrip via HTML comments**: Confluence-specific data (panel types, task status,
|
|
9
|
+
* image alignment) is encoded in `<!-- ... -->` comments with base64/URL encoding so
|
|
10
|
+
* a future parser can reconstruct the original.
|
|
11
|
+
*
|
|
12
|
+
* **Common tasks**
|
|
13
|
+
*
|
|
14
|
+
* - Serialize a document: {@link serializeToMarkdown}
|
|
15
|
+
* - Serialize inline nodes only: {@link serializeInlineNodes}
|
|
16
|
+
*
|
|
17
|
+
* **Gotchas**
|
|
18
|
+
*
|
|
19
|
+
* - Comment-encoded data is fragile if users hand-edit the Markdown — edits inside
|
|
20
|
+
* `<!-- -->` blocks will break roundtripping.
|
|
21
|
+
*
|
|
22
|
+
* @module
|
|
23
|
+
*/
|
|
24
|
+
import * as Effect from "effect/Effect";
|
|
25
|
+
/**
|
|
26
|
+
* Serialize Document AST to GitHub Flavored Markdown.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* import { serializeToMarkdown, makeDocument, Heading, Text } from "@knpkv/atlassian-common"
|
|
31
|
+
* import { Effect } from "effect"
|
|
32
|
+
*
|
|
33
|
+
* Effect.gen(function* () {
|
|
34
|
+
* const doc = makeDocument([
|
|
35
|
+
* new Heading({ level: 1, children: [new Text({ value: "Title" })] })
|
|
36
|
+
* ])
|
|
37
|
+
* const md = yield* serializeToMarkdown(doc)
|
|
38
|
+
* console.log(md) // # Title
|
|
39
|
+
* })
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @category Serializers
|
|
43
|
+
*/
|
|
44
|
+
export const serializeToMarkdown = (doc, options = {}) => Effect.gen(function* () {
|
|
45
|
+
const parts = [];
|
|
46
|
+
for (const node of doc.children) {
|
|
47
|
+
const serialized = yield* serializeDocumentNode(node, options);
|
|
48
|
+
parts.push(serialized);
|
|
49
|
+
}
|
|
50
|
+
const content = parts.join("\n\n");
|
|
51
|
+
// Embed rawSource in comment for roundtrip preservation
|
|
52
|
+
if (options.includeRawSource && doc.rawSource !== undefined) {
|
|
53
|
+
const prefix = options.commentPrefix ?? "src";
|
|
54
|
+
const encoded = Buffer.from(doc.rawSource, "utf-8").toString("base64");
|
|
55
|
+
return `${content}\n\n<!--${prefix}:raw:${encoded}-->`;
|
|
56
|
+
}
|
|
57
|
+
return content;
|
|
58
|
+
});
|
|
59
|
+
/**
|
|
60
|
+
* Serialize a document node to Markdown.
|
|
61
|
+
*/
|
|
62
|
+
const serializeDocumentNode = (node, options) => Effect.gen(function* () {
|
|
63
|
+
switch (node._tag) {
|
|
64
|
+
// Block nodes
|
|
65
|
+
case "Heading":
|
|
66
|
+
return yield* serializeHeading(node);
|
|
67
|
+
case "Paragraph":
|
|
68
|
+
return yield* serializeParagraph(node);
|
|
69
|
+
case "CodeBlock":
|
|
70
|
+
return serializeCodeBlock(node);
|
|
71
|
+
case "ThematicBreak":
|
|
72
|
+
return "---";
|
|
73
|
+
case "Image":
|
|
74
|
+
return serializeImage(node, options);
|
|
75
|
+
case "Table":
|
|
76
|
+
return yield* serializeTable(node);
|
|
77
|
+
case "List":
|
|
78
|
+
return yield* serializeList(node, options);
|
|
79
|
+
case "BlockQuote":
|
|
80
|
+
return yield* serializeBlockQuote(node, options);
|
|
81
|
+
case "UnsupportedBlock":
|
|
82
|
+
return node.rawMarkdown ?? node.rawHtml ?? node.rawAdf ?? "";
|
|
83
|
+
// Macro nodes
|
|
84
|
+
case "InfoPanel":
|
|
85
|
+
return yield* serializeInfoPanel(node, options);
|
|
86
|
+
case "ExpandMacro":
|
|
87
|
+
return yield* serializeExpandMacro(node, options);
|
|
88
|
+
case "TocMacro":
|
|
89
|
+
return "[[toc]]";
|
|
90
|
+
case "CodeMacro":
|
|
91
|
+
return serializeCodeMacro(node);
|
|
92
|
+
case "StatusMacro":
|
|
93
|
+
return `**[${node.text}]**`;
|
|
94
|
+
case "TaskList":
|
|
95
|
+
return yield* serializeTaskList(node.children, options);
|
|
96
|
+
default:
|
|
97
|
+
return "";
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
/**
|
|
101
|
+
* Serialize heading.
|
|
102
|
+
*/
|
|
103
|
+
const serializeHeading = (node) => Effect.gen(function* () {
|
|
104
|
+
const prefix = "#".repeat(node.level);
|
|
105
|
+
const content = yield* serializeInlineNodes(node.children);
|
|
106
|
+
return `${prefix} ${content}`;
|
|
107
|
+
});
|
|
108
|
+
/**
|
|
109
|
+
* Serialize paragraph.
|
|
110
|
+
*/
|
|
111
|
+
const serializeParagraph = (node) => Effect.gen(function* () {
|
|
112
|
+
const content = yield* serializeInlineNodes(node.children);
|
|
113
|
+
// If has alignment or indent, wrap in HTML for roundtrip
|
|
114
|
+
if (node.alignment || node.indent) {
|
|
115
|
+
const styles = [];
|
|
116
|
+
if (node.alignment)
|
|
117
|
+
styles.push(`text-align: ${node.alignment};`);
|
|
118
|
+
if (node.indent)
|
|
119
|
+
styles.push(`margin-left: ${node.indent}px;`);
|
|
120
|
+
return `<p style="${styles.join(" ")}">${content}</p>`;
|
|
121
|
+
}
|
|
122
|
+
return content;
|
|
123
|
+
});
|
|
124
|
+
/**
|
|
125
|
+
* Serialize code block.
|
|
126
|
+
*/
|
|
127
|
+
const serializeCodeBlock = (node) => {
|
|
128
|
+
const lang = node.language ?? "";
|
|
129
|
+
return `\`\`\`${lang}\n${node.code}\n\`\`\``;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Serialize image.
|
|
133
|
+
*/
|
|
134
|
+
const serializeImage = (node, options) => {
|
|
135
|
+
const prefix = options.commentPrefix ?? "src";
|
|
136
|
+
// If image has attachment or align/width, use comment encoding for roundtrip
|
|
137
|
+
if (node.attachment || node.align || node.width) {
|
|
138
|
+
const parts = [];
|
|
139
|
+
if (node.attachment) {
|
|
140
|
+
parts.push(`f=${encodeURIComponent(node.attachment.filename)}`);
|
|
141
|
+
if (node.attachment.version)
|
|
142
|
+
parts.push(`v=${node.attachment.version}`);
|
|
143
|
+
}
|
|
144
|
+
if (node.src)
|
|
145
|
+
parts.push(`s=${encodeURIComponent(node.src)}`);
|
|
146
|
+
if (node.alt)
|
|
147
|
+
parts.push(`a=${encodeURIComponent(node.alt)}`);
|
|
148
|
+
if (node.title)
|
|
149
|
+
parts.push(`t=${encodeURIComponent(node.title)}`);
|
|
150
|
+
if (node.align)
|
|
151
|
+
parts.push(`al=${node.align}`);
|
|
152
|
+
if (node.width)
|
|
153
|
+
parts.push(`w=${node.width}`);
|
|
154
|
+
return `<!--${prefix}:image:${parts.join("|")}-->`;
|
|
155
|
+
}
|
|
156
|
+
// Simple external image - use markdown syntax
|
|
157
|
+
const alt = node.alt ?? "";
|
|
158
|
+
const title = node.title ? ` "${node.title}"` : "";
|
|
159
|
+
const src = node.src ?? "";
|
|
160
|
+
return ``;
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Serialize table.
|
|
164
|
+
*/
|
|
165
|
+
const serializeTable = (node) => Effect.gen(function* () {
|
|
166
|
+
const lines = [];
|
|
167
|
+
// Header
|
|
168
|
+
if (node.header) {
|
|
169
|
+
const headerCells = [];
|
|
170
|
+
for (const cell of node.header.cells) {
|
|
171
|
+
headerCells.push(yield* serializeInlineNodes(cell.children));
|
|
172
|
+
}
|
|
173
|
+
lines.push(`| ${headerCells.join(" | ")} |`);
|
|
174
|
+
lines.push(`| ${headerCells.map(() => "---").join(" | ")} |`);
|
|
175
|
+
}
|
|
176
|
+
// Body rows
|
|
177
|
+
for (const row of node.rows) {
|
|
178
|
+
const cells = [];
|
|
179
|
+
for (const cell of row.cells) {
|
|
180
|
+
cells.push(yield* serializeInlineNodes(cell.children));
|
|
181
|
+
}
|
|
182
|
+
lines.push(`| ${cells.join(" | ")} |`);
|
|
183
|
+
}
|
|
184
|
+
return lines.join("\n");
|
|
185
|
+
});
|
|
186
|
+
/**
|
|
187
|
+
* Serialize list.
|
|
188
|
+
*/
|
|
189
|
+
const serializeList = (node, options) => Effect.gen(function* () {
|
|
190
|
+
const lines = [];
|
|
191
|
+
let counter = node.start ?? 1;
|
|
192
|
+
for (const item of node.children) {
|
|
193
|
+
const prefix = node.ordered ? `${counter}.` : "-";
|
|
194
|
+
const checkbox = item.checked !== undefined ? (item.checked ? "[x] " : "[ ] ") : "";
|
|
195
|
+
// Serialize item content
|
|
196
|
+
const itemParts = [];
|
|
197
|
+
for (const child of item.children) {
|
|
198
|
+
const serialized = yield* serializeSimpleBlock(child, options);
|
|
199
|
+
itemParts.push(serialized);
|
|
200
|
+
}
|
|
201
|
+
const content = itemParts.join("\n");
|
|
202
|
+
const indentedContent = content
|
|
203
|
+
.split("\n")
|
|
204
|
+
.map((line, i) => (i === 0 ? `${prefix} ${checkbox}${line}` : ` ${line}`))
|
|
205
|
+
.join("\n");
|
|
206
|
+
lines.push(indentedContent);
|
|
207
|
+
counter++;
|
|
208
|
+
}
|
|
209
|
+
return lines.join("\n");
|
|
210
|
+
});
|
|
211
|
+
/**
|
|
212
|
+
* Serialize simple block (for nested content).
|
|
213
|
+
*/
|
|
214
|
+
const serializeSimpleBlock = (node, options) => Effect.gen(function* () {
|
|
215
|
+
const tagged = node;
|
|
216
|
+
switch (tagged._tag) {
|
|
217
|
+
case "Heading":
|
|
218
|
+
return yield* serializeHeading(node);
|
|
219
|
+
case "Paragraph":
|
|
220
|
+
return yield* serializeParagraph(node);
|
|
221
|
+
case "CodeBlock":
|
|
222
|
+
return serializeCodeBlock(node);
|
|
223
|
+
case "ThematicBreak":
|
|
224
|
+
return "---";
|
|
225
|
+
case "Image":
|
|
226
|
+
return serializeImage(node, options);
|
|
227
|
+
case "Table":
|
|
228
|
+
return yield* serializeTable(node);
|
|
229
|
+
case "UnsupportedBlock": {
|
|
230
|
+
const unsupported = node;
|
|
231
|
+
return unsupported.rawMarkdown ?? unsupported.rawHtml ?? unsupported.rawAdf ?? "";
|
|
232
|
+
}
|
|
233
|
+
default:
|
|
234
|
+
return "";
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
/**
|
|
238
|
+
* Serialize block quote.
|
|
239
|
+
*/
|
|
240
|
+
const serializeBlockQuote = (node, options) => Effect.gen(function* () {
|
|
241
|
+
const lines = [];
|
|
242
|
+
for (const child of node.children) {
|
|
243
|
+
const serialized = yield* serializeSimpleBlock(child, options);
|
|
244
|
+
const quoted = serialized.split("\n").map((line) => `> ${line}`).join("\n");
|
|
245
|
+
lines.push(quoted);
|
|
246
|
+
}
|
|
247
|
+
return lines.join("\n>\n");
|
|
248
|
+
});
|
|
249
|
+
/**
|
|
250
|
+
* Serialize info panel to container syntax.
|
|
251
|
+
*/
|
|
252
|
+
const serializeInfoPanel = (node, options) => Effect.gen(function* () {
|
|
253
|
+
const type = node.panelType;
|
|
254
|
+
const title = node.title ? ` ${node.title}` : "";
|
|
255
|
+
const lines = [`:::${type}${title}`];
|
|
256
|
+
for (const child of node.children) {
|
|
257
|
+
const serialized = yield* serializeSimpleBlock(child, options);
|
|
258
|
+
lines.push(serialized);
|
|
259
|
+
}
|
|
260
|
+
lines.push(":::");
|
|
261
|
+
return lines.join("\n");
|
|
262
|
+
});
|
|
263
|
+
/**
|
|
264
|
+
* Serialize expand macro.
|
|
265
|
+
*/
|
|
266
|
+
const serializeExpandMacro = (node, options) => Effect.gen(function* () {
|
|
267
|
+
const prefix = options.commentPrefix ?? "src";
|
|
268
|
+
const title = node.title ?? "";
|
|
269
|
+
const contentParts = [];
|
|
270
|
+
for (const child of node.children) {
|
|
271
|
+
const serialized = yield* serializeSimpleBlock(child, options);
|
|
272
|
+
contentParts.push(serialized);
|
|
273
|
+
}
|
|
274
|
+
const content = contentParts.join("\n");
|
|
275
|
+
return `<!--${prefix}:expand:${encodeURIComponent(title)}:${encodeURIComponent(content)}-->`;
|
|
276
|
+
});
|
|
277
|
+
/**
|
|
278
|
+
* Serialize code macro (similar to code block but may have title).
|
|
279
|
+
*/
|
|
280
|
+
const serializeCodeMacro = (node) => {
|
|
281
|
+
const lang = node.language ?? "";
|
|
282
|
+
const title = node.title ? ` title="${node.title}"` : "";
|
|
283
|
+
return `\`\`\`${lang}${title}\n${node.code}\n\`\`\``;
|
|
284
|
+
};
|
|
285
|
+
/**
|
|
286
|
+
* Serialize task list.
|
|
287
|
+
*/
|
|
288
|
+
const serializeTaskList = (children, options) => Effect.gen(function* () {
|
|
289
|
+
const prefix = options.commentPrefix ?? "src";
|
|
290
|
+
const items = [];
|
|
291
|
+
for (const item of children) {
|
|
292
|
+
const body = yield* serializeInlineNodes(item.body);
|
|
293
|
+
items.push(`${item.id}|${item.uuid}|${item.status}|${encodeURIComponent(body)}`);
|
|
294
|
+
}
|
|
295
|
+
return `<!--${prefix}:tasklist:${items.join(";")}-->`;
|
|
296
|
+
});
|
|
297
|
+
/**
|
|
298
|
+
* Serialize inline nodes to Markdown.
|
|
299
|
+
*/
|
|
300
|
+
export const serializeInlineNodes = (nodes) => Effect.gen(function* () {
|
|
301
|
+
const parts = [];
|
|
302
|
+
for (const node of nodes) {
|
|
303
|
+
parts.push(yield* serializeInlineNode(node));
|
|
304
|
+
}
|
|
305
|
+
return parts.join("");
|
|
306
|
+
});
|
|
307
|
+
/**
|
|
308
|
+
* Serialize inline node to Markdown.
|
|
309
|
+
*/
|
|
310
|
+
const serializeInlineNode = (node) => Effect.gen(function* () {
|
|
311
|
+
switch (node._tag) {
|
|
312
|
+
case "Text":
|
|
313
|
+
return node.value;
|
|
314
|
+
case "Strong": {
|
|
315
|
+
const content = yield* serializeInlineNodes(node.children);
|
|
316
|
+
return `**${content}**`;
|
|
317
|
+
}
|
|
318
|
+
case "Emphasis": {
|
|
319
|
+
const content = yield* serializeInlineNodes(node.children);
|
|
320
|
+
return `*${content}*`;
|
|
321
|
+
}
|
|
322
|
+
case "Underline": {
|
|
323
|
+
const content = yield* serializeInlineNodes(node.children);
|
|
324
|
+
return `<u>${content}</u>`;
|
|
325
|
+
}
|
|
326
|
+
case "Strikethrough": {
|
|
327
|
+
const content = yield* serializeInlineNodes(node.children);
|
|
328
|
+
return `~~${content}~~`;
|
|
329
|
+
}
|
|
330
|
+
case "Subscript": {
|
|
331
|
+
const content = yield* serializeInlineNodes(node.children);
|
|
332
|
+
return `<sub>${content}</sub>`;
|
|
333
|
+
}
|
|
334
|
+
case "Superscript": {
|
|
335
|
+
const content = yield* serializeInlineNodes(node.children);
|
|
336
|
+
return `<sup>${content}</sup>`;
|
|
337
|
+
}
|
|
338
|
+
case "InlineCode":
|
|
339
|
+
return `\`${node.value}\``;
|
|
340
|
+
case "Link": {
|
|
341
|
+
const content = yield* serializeInlineNodes(node.children);
|
|
342
|
+
const title = node.title ? ` "${node.title}"` : "";
|
|
343
|
+
return `[${content}](${node.href}${title})`;
|
|
344
|
+
}
|
|
345
|
+
case "LineBreak":
|
|
346
|
+
return " \n";
|
|
347
|
+
case "Emoticon":
|
|
348
|
+
return node.fallback;
|
|
349
|
+
case "UserMention":
|
|
350
|
+
return `@${node.accountId}`;
|
|
351
|
+
case "DateTime":
|
|
352
|
+
return node.datetime;
|
|
353
|
+
case "ColoredText": {
|
|
354
|
+
const content = yield* serializeInlineNodes(node.children);
|
|
355
|
+
return `<span style="color: ${node.color};">${content}</span>`;
|
|
356
|
+
}
|
|
357
|
+
case "Highlight": {
|
|
358
|
+
const content = yield* serializeInlineNodes(node.children);
|
|
359
|
+
return `<span style="background-color: ${node.backgroundColor};">${content}</span>`;
|
|
360
|
+
}
|
|
361
|
+
case "UnsupportedInline":
|
|
362
|
+
return node.raw;
|
|
363
|
+
default:
|
|
364
|
+
return "";
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
//# sourceMappingURL=MarkdownSerializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownSerializer.js","sourceRoot":"","sources":["../../src/serializers/MarkdownSerializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serializers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,KAAK,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serializers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAyB,mBAAmB,EAAE,MAAM,yBAAyB,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@knpkv/atlassian-common",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Shared utilities for Atlassian tools (AST, serializers, auth, config)",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "knpkv",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/knpkv/npm.git",
|
|
10
|
+
"directory": "packages/atlassian-common"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/knpkv/npm/issues"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/knpkv/npm/tree/main/packages/atlassian-common#readme",
|
|
16
|
+
"type": "module",
|
|
17
|
+
"sideEffects": false,
|
|
18
|
+
"main": "./dist/index.js",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"import": "./dist/index.js",
|
|
23
|
+
"types": "./dist/index.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"./ast": {
|
|
26
|
+
"import": "./dist/ast/index.js",
|
|
27
|
+
"types": "./dist/ast/index.d.ts"
|
|
28
|
+
},
|
|
29
|
+
"./serializers": {
|
|
30
|
+
"import": "./dist/serializers/index.js",
|
|
31
|
+
"types": "./dist/serializers/index.d.ts"
|
|
32
|
+
},
|
|
33
|
+
"./parsers": {
|
|
34
|
+
"import": "./dist/parsers/index.js",
|
|
35
|
+
"types": "./dist/parsers/index.d.ts"
|
|
36
|
+
},
|
|
37
|
+
"./auth": {
|
|
38
|
+
"import": "./dist/auth/index.js",
|
|
39
|
+
"types": "./dist/auth/index.d.ts"
|
|
40
|
+
},
|
|
41
|
+
"./config": {
|
|
42
|
+
"import": "./dist/config/index.js",
|
|
43
|
+
"types": "./dist/config/index.d.ts"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public"
|
|
48
|
+
},
|
|
49
|
+
"peerDependencies": {
|
|
50
|
+
"@effect/platform": ">=0.93.0 <0.96.0",
|
|
51
|
+
"effect": ">=3.19.3"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"remark-gfm": "^4.0.1",
|
|
55
|
+
"remark-parse": "^11.0.0",
|
|
56
|
+
"remark-stringify": "^11.0.0",
|
|
57
|
+
"unified": "^11.0.5"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@effect/platform": "latest",
|
|
61
|
+
"@effect/platform-node": "latest",
|
|
62
|
+
"@effect/vitest": "latest",
|
|
63
|
+
"@types/node": "latest",
|
|
64
|
+
"effect": "latest",
|
|
65
|
+
"typescript": "~5.9.0",
|
|
66
|
+
"vitest": "^4.0.13"
|
|
67
|
+
},
|
|
68
|
+
"keywords": [
|
|
69
|
+
"effect",
|
|
70
|
+
"effect-ts",
|
|
71
|
+
"atlassian",
|
|
72
|
+
"confluence",
|
|
73
|
+
"jira",
|
|
74
|
+
"ast",
|
|
75
|
+
"markdown"
|
|
76
|
+
],
|
|
77
|
+
"scripts": {
|
|
78
|
+
"build": "tsc",
|
|
79
|
+
"clean": "rimraf dist dist-test .tsbuildinfo",
|
|
80
|
+
"test": "vitest run",
|
|
81
|
+
"test:watch": "vitest",
|
|
82
|
+
"lint": "eslint src",
|
|
83
|
+
"lint:fix": "eslint src --fix",
|
|
84
|
+
"check": "tsc --noEmit"
|
|
85
|
+
}
|
|
86
|
+
}
|
package/src/Brand.ts
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branded string types for type-safe Atlassian domain values.
|
|
3
|
+
*
|
|
4
|
+
* **Mental model**
|
|
5
|
+
*
|
|
6
|
+
* - **Brand = runtime validation + compile-time narrowing**: Each brand combines
|
|
7
|
+
* an Effect `Brand.refined` (throws on invalid values) with an Effect `Schema`
|
|
8
|
+
* (composable validation). The `Type` property exposes the branded type for use
|
|
9
|
+
* in type annotations.
|
|
10
|
+
* - **Pattern-guarded strings**: `SpaceKey`, `IssueKey`, `ProjectKey` are regex-branded;
|
|
11
|
+
* `PageId` is non-empty branded; `ContentHash` is SHA256 hex branded.
|
|
12
|
+
*
|
|
13
|
+
* **Common tasks**
|
|
14
|
+
*
|
|
15
|
+
* - Create a custom brand: {@link makeBrandedString}, {@link makeBrandedNonEmptyString}
|
|
16
|
+
* - Validate a Jira ticket key: {@link IssueKey}
|
|
17
|
+
* - Validate a content hash: {@link ContentHash}
|
|
18
|
+
*
|
|
19
|
+
* **Gotchas**
|
|
20
|
+
*
|
|
21
|
+
* - Brand constructors throw synchronously on invalid input — wrap in `Effect.try` if
|
|
22
|
+
* the input is untrusted.
|
|
23
|
+
*
|
|
24
|
+
* @module
|
|
25
|
+
*/
|
|
26
|
+
import * as Brand from "effect/Brand"
|
|
27
|
+
import * as Schema from "effect/Schema"
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Create a branded string type with pattern validation.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* import { makeBrandedString } from "@knpkv/atlassian-common"
|
|
35
|
+
*
|
|
36
|
+
* const IssueKey = makeBrandedString("IssueKey", /^[A-Z]+-\d+$/)
|
|
37
|
+
* type IssueKey = typeof IssueKey.Type
|
|
38
|
+
*
|
|
39
|
+
* const key = IssueKey("PROJ-123") // OK
|
|
40
|
+
* const bad = IssueKey("invalid") // Throws
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* @category Brand
|
|
44
|
+
*/
|
|
45
|
+
export const makeBrandedString = <B extends string>(
|
|
46
|
+
name: B,
|
|
47
|
+
pattern: RegExp
|
|
48
|
+
) => {
|
|
49
|
+
type BrandedType = string & Brand.Brand<B>
|
|
50
|
+
|
|
51
|
+
const brand = Brand.refined<BrandedType>(
|
|
52
|
+
(s) => pattern.test(s),
|
|
53
|
+
(s) => Brand.error(`Invalid ${name}: ${s} does not match ${pattern}`)
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
const schema = Schema.String.pipe(
|
|
57
|
+
Schema.pattern(pattern),
|
|
58
|
+
Schema.brand(name)
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
return Object.assign(brand, {
|
|
62
|
+
schema,
|
|
63
|
+
Type: undefined as unknown as BrandedType
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Create a branded non-empty string type.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* import { makeBrandedNonEmptyString } from "@knpkv/atlassian-common"
|
|
73
|
+
*
|
|
74
|
+
* const PageId = makeBrandedNonEmptyString("PageId")
|
|
75
|
+
* type PageId = typeof PageId.Type
|
|
76
|
+
*
|
|
77
|
+
* const id = PageId("12345") // OK
|
|
78
|
+
* const bad = PageId("") // Throws
|
|
79
|
+
* ```
|
|
80
|
+
*
|
|
81
|
+
* @category Brand
|
|
82
|
+
*/
|
|
83
|
+
export const makeBrandedNonEmptyString = <B extends string>(name: B) => {
|
|
84
|
+
type BrandedType = string & Brand.Brand<B>
|
|
85
|
+
|
|
86
|
+
const brand = Brand.refined<BrandedType>(
|
|
87
|
+
(s) => s.length > 0,
|
|
88
|
+
(_s) => Brand.error(`${name} cannot be empty`)
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
const schema = Schema.String.pipe(
|
|
92
|
+
Schema.nonEmptyString(),
|
|
93
|
+
Schema.brand(name)
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
return Object.assign(brand, {
|
|
97
|
+
schema,
|
|
98
|
+
Type: undefined as unknown as BrandedType
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Common branded types for Atlassian products
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Confluence Page ID (non-empty string).
|
|
106
|
+
*
|
|
107
|
+
* @category Brand
|
|
108
|
+
*/
|
|
109
|
+
export const PageId = makeBrandedNonEmptyString("PageId")
|
|
110
|
+
export type PageId = typeof PageId.Type
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Confluence Space Key (uppercase alphanumeric).
|
|
114
|
+
*
|
|
115
|
+
* @category Brand
|
|
116
|
+
*/
|
|
117
|
+
export const SpaceKey = makeBrandedString("SpaceKey", /^[A-Z][A-Z0-9]*$/)
|
|
118
|
+
export type SpaceKey = typeof SpaceKey.Type
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Jira Issue Key (PROJECT-123 format).
|
|
122
|
+
*
|
|
123
|
+
* @category Brand
|
|
124
|
+
*/
|
|
125
|
+
export const IssueKey = makeBrandedString("IssueKey", /^[A-Z][A-Z0-9]*-\d+$/)
|
|
126
|
+
export type IssueKey = typeof IssueKey.Type
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Jira Project Key (uppercase alphanumeric).
|
|
130
|
+
*
|
|
131
|
+
* @category Brand
|
|
132
|
+
*/
|
|
133
|
+
export const ProjectKey = makeBrandedString("ProjectKey", /^[A-Z][A-Z0-9]*$/)
|
|
134
|
+
export type ProjectKey = typeof ProjectKey.Type
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Content hash (SHA256 hex string).
|
|
138
|
+
*
|
|
139
|
+
* @category Brand
|
|
140
|
+
*/
|
|
141
|
+
export const ContentHash = makeBrandedString("ContentHash", /^[a-f0-9]{64}$/)
|
|
142
|
+
export type ContentHash = typeof ContentHash.Type
|