Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/jira

src/adf.js

48 lines · 1.4 KB · JavaScript
export function isAdfDoc(value) {
	return (
		value !== null &&
		typeof value === 'object' &&
		!Array.isArray(value) &&
		value.type === 'doc' &&
		value.version === 1 &&
		Array.isArray(value.content)
	)
}

/**
 * Convert plain text (or an existing ADF doc) into Jira Cloud ADF.
 * Multi-line strings become one paragraph per line.
 */
export function toAdf(textOrDoc) {
	if (isAdfDoc(textOrDoc)) return textOrDoc
	if (typeof textOrDoc !== 'string') {
		throw new Error('Jira description/comment body must be a string or an ADF document.')
	}
	const lines = textOrDoc.replace(/\r\n/g, '\n').split('\n')
	const content = lines.map((line) => ({
		type: 'paragraph',
		content: line ? [{ type: 'text', text: line }] : [],
	}))
	return {
		type: 'doc',
		version: 1,
		content: content.length > 0 ? content : [{ type: 'paragraph', content: [] }],
	}
}

export function adfToPlainText(doc) {
	if (typeof doc === 'string') return doc
	if (!isAdfDoc(doc)) return null
	const parts = []
	const walk = (node) => {
		if (!node || typeof node !== 'object') return
		if (node.type === 'text' && typeof node.text === 'string') parts.push(node.text)
		if (node.type === 'hardBreak') parts.push('\n')
		if (Array.isArray(node.content)) {
			for (const child of node.content) walk(child)
			if (node.type === 'paragraph') parts.push('\n')
		}
	}
	walk(doc)
	return parts.join('').replace(/\n+$/, '')
}