@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.
Files changed (121) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +107 -0
  4. package/dist/Brand.d.ts +118 -0
  5. package/dist/Brand.d.ts.map +1 -0
  6. package/dist/Brand.js +107 -0
  7. package/dist/Brand.js.map +1 -0
  8. package/dist/Hash.d.ts +53 -0
  9. package/dist/Hash.d.ts.map +1 -0
  10. package/dist/Hash.js +63 -0
  11. package/dist/Hash.js.map +1 -0
  12. package/dist/SerializeError.d.ts +48 -0
  13. package/dist/SerializeError.d.ts.map +1 -0
  14. package/dist/SerializeError.js +42 -0
  15. package/dist/SerializeError.js.map +1 -0
  16. package/dist/ast/BlockNode.d.ts +429 -0
  17. package/dist/ast/BlockNode.d.ts.map +1 -0
  18. package/dist/ast/BlockNode.js +279 -0
  19. package/dist/ast/BlockNode.js.map +1 -0
  20. package/dist/ast/Document.d.ts +255 -0
  21. package/dist/ast/Document.d.ts.map +1 -0
  22. package/dist/ast/Document.js +80 -0
  23. package/dist/ast/Document.js.map +1 -0
  24. package/dist/ast/InlineNode.d.ts +483 -0
  25. package/dist/ast/InlineNode.d.ts.map +1 -0
  26. package/dist/ast/InlineNode.js +268 -0
  27. package/dist/ast/InlineNode.js.map +1 -0
  28. package/dist/ast/MacroNode.d.ts +214 -0
  29. package/dist/ast/MacroNode.d.ts.map +1 -0
  30. package/dist/ast/MacroNode.js +110 -0
  31. package/dist/ast/MacroNode.js.map +1 -0
  32. package/dist/ast/index.d.ts +10 -0
  33. package/dist/ast/index.d.ts.map +1 -0
  34. package/dist/ast/index.js +14 -0
  35. package/dist/ast/index.js.map +1 -0
  36. package/dist/auth/OAuthEndpoints.d.ts +95 -0
  37. package/dist/auth/OAuthEndpoints.d.ts.map +1 -0
  38. package/dist/auth/OAuthEndpoints.js +112 -0
  39. package/dist/auth/OAuthEndpoints.js.map +1 -0
  40. package/dist/auth/OAuthErrors.d.ts +76 -0
  41. package/dist/auth/OAuthErrors.d.ts.map +1 -0
  42. package/dist/auth/OAuthErrors.js +85 -0
  43. package/dist/auth/OAuthErrors.js.map +1 -0
  44. package/dist/auth/OAuthOperations.d.ts +87 -0
  45. package/dist/auth/OAuthOperations.d.ts.map +1 -0
  46. package/dist/auth/OAuthOperations.js +169 -0
  47. package/dist/auth/OAuthOperations.js.map +1 -0
  48. package/dist/auth/OAuthResponseSchemas.d.ts +65 -0
  49. package/dist/auth/OAuthResponseSchemas.d.ts.map +1 -0
  50. package/dist/auth/OAuthResponseSchemas.js +47 -0
  51. package/dist/auth/OAuthResponseSchemas.js.map +1 -0
  52. package/dist/auth/index.d.ts +11 -0
  53. package/dist/auth/index.d.ts.map +1 -0
  54. package/dist/auth/index.js +16 -0
  55. package/dist/auth/index.js.map +1 -0
  56. package/dist/auth/uuid.d.ts +14 -0
  57. package/dist/auth/uuid.d.ts.map +1 -0
  58. package/dist/auth/uuid.js +14 -0
  59. package/dist/auth/uuid.js.map +1 -0
  60. package/dist/config/ConfigPaths.d.ts +95 -0
  61. package/dist/config/ConfigPaths.d.ts.map +1 -0
  62. package/dist/config/ConfigPaths.js +102 -0
  63. package/dist/config/ConfigPaths.js.map +1 -0
  64. package/dist/config/OAuthSchemas.d.ts +144 -0
  65. package/dist/config/OAuthSchemas.d.ts.map +1 -0
  66. package/dist/config/OAuthSchemas.js +107 -0
  67. package/dist/config/OAuthSchemas.js.map +1 -0
  68. package/dist/config/TokenStorage.d.ts +96 -0
  69. package/dist/config/TokenStorage.d.ts.map +1 -0
  70. package/dist/config/TokenStorage.js +128 -0
  71. package/dist/config/TokenStorage.js.map +1 -0
  72. package/dist/config/index.d.ts +9 -0
  73. package/dist/config/index.d.ts.map +1 -0
  74. package/dist/config/index.js +12 -0
  75. package/dist/config/index.js.map +1 -0
  76. package/dist/index.d.ts +13 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +20 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/parsers/index.d.ts +7 -0
  81. package/dist/parsers/index.d.ts.map +1 -0
  82. package/dist/parsers/index.js +8 -0
  83. package/dist/parsers/index.js.map +1 -0
  84. package/dist/serializers/MarkdownSerializer.d.ts +63 -0
  85. package/dist/serializers/MarkdownSerializer.d.ts.map +1 -0
  86. package/dist/serializers/MarkdownSerializer.js +367 -0
  87. package/dist/serializers/MarkdownSerializer.js.map +1 -0
  88. package/dist/serializers/index.d.ts +7 -0
  89. package/dist/serializers/index.d.ts.map +1 -0
  90. package/dist/serializers/index.js +7 -0
  91. package/dist/serializers/index.js.map +1 -0
  92. package/package.json +86 -0
  93. package/src/Brand.ts +142 -0
  94. package/src/Hash.ts +68 -0
  95. package/src/SerializeError.ts +50 -0
  96. package/src/ast/BlockNode.ts +386 -0
  97. package/src/ast/Document.ts +101 -0
  98. package/src/ast/InlineNode.ts +328 -0
  99. package/src/ast/MacroNode.ts +172 -0
  100. package/src/ast/index.ts +87 -0
  101. package/src/auth/OAuthEndpoints.ts +142 -0
  102. package/src/auth/OAuthErrors.ts +101 -0
  103. package/src/auth/OAuthOperations.ts +276 -0
  104. package/src/auth/OAuthResponseSchemas.ts +70 -0
  105. package/src/auth/index.ts +47 -0
  106. package/src/auth/uuid.ts +14 -0
  107. package/src/config/ConfigPaths.ts +179 -0
  108. package/src/config/OAuthSchemas.ts +146 -0
  109. package/src/config/TokenStorage.ts +228 -0
  110. package/src/config/index.ts +43 -0
  111. package/src/index.ts +34 -0
  112. package/src/parsers/index.ts +8 -0
  113. package/src/serializers/MarkdownSerializer.ts +498 -0
  114. package/src/serializers/index.ts +7 -0
  115. package/test/Brand.test.ts +90 -0
  116. package/test/MarkdownSerializer.test.ts +82 -0
  117. package/test/OAuthEndpoints.test.ts +109 -0
  118. package/test/OAuthOperations.test.ts +315 -0
  119. package/tsconfig.json +11 -0
  120. package/tsconfig.tsbuildinfo +1 -0
  121. 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 `![${alt}](${src}${title})`;
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,7 @@
1
+ /**
2
+ * Barrel export for AST serializers.
3
+ *
4
+ * @module
5
+ */
6
+ export { serializeInlineNodes, type SerializeOptions, serializeToMarkdown } from "./MarkdownSerializer.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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,7 @@
1
+ /**
2
+ * Barrel export for AST serializers.
3
+ *
4
+ * @module
5
+ */
6
+ export { serializeInlineNodes, serializeToMarkdown } from "./MarkdownSerializer.js";
7
+ //# sourceMappingURL=index.js.map
@@ -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