@stll/folio-core
The headless, framework-neutral core of folio:
the OOXML (.docx) parser, the document model, the ProseMirror integration, and
the page-layout engine. It opens a real .docx, models it, paginates it, and
writes a real .docx back — preserving tables, headers and footers, tracked
changes, and footnotes.
There is no React in the import graph, so the core runs on a server or under
any framework. The React editor lives in
@stll/folio-react, and the
Vue editor lives in @stll/folio-vue.
Part of stella, an open-source legal workspace.
Install
bun add @stll/folio-core
Exports
@stll/folio-core | the headless public API — createEmptyDocument, createDocx, the document model, AI-suggestion primitives, ProseMirror plugins |
@stll/folio-core/markdown | DOCX ↔ Markdown conversion |
@stll/folio-core/server | DOM-free document review, explicit tracked edits, comparison, creation, and package helpers |
@stll/folio-core/redline | Compare two .docx buffers and generate a native Word redline |
@stll/folio-core/* | the source-mirrored module tree (e.g. @stll/folio-core/types/document, @stll/folio-core/prosemirror/schema) for adapters that need lower-level building blocks |
New documents and reusable style sets
Create a legal-shaped blank document with the built-in preset:
import { createDocx, createEmptyDocument, createStellaStyleDocumentPreset } from "@stll/folio-core";
const document = createEmptyDocument({
preset: createStellaStyleDocumentPreset(),
});
const docx = await createDocx(document);
Style sets are content-free JSON values. Inspect a source file before presenting
styles for selection, extract the selected dependency closure, persist the
result, and load it into any later document:
import {
createEmptyDocument,
extractDocumentStyleSetFromDocx,
inspectDocumentStylesFromDocx,
} from "@stll/folio-core";
const catalog = await inspectDocumentStylesFromDocx(sourceDocx);
const styleSet = await extractDocumentStyleSetFromDocx(sourceDocx, {
name: "Firm contract styles",
styleIds: catalog.styles
.filter(({ role }) => role === "default" || role === "quick")
.map(({ styleId }) => styleId),
});
const document = createEmptyDocument({ styleSet });
Extraction excludes document content, metadata, relationships, media, comments,
and revision data. It keeps only the selected styles and the numbering, theme,
font-table, and settings data required to reproduce their formatting.
Native Word redlines
Generate a reviewable .docx whose text and supported inline-formatting
differences are native tracked changes:
import { generateRedlineDocx } from "@stll/folio-core/redline";
const result = await generateRedlineDocx(originalDocx, revisedDocx, {
author: "Reviewer",
});
await store(result.buffer);
console.log(result.applied, result.skipped, result.unprocessedStories);
For deterministic operations against one document, use FolioDocxReviewer
from @stll/folio-core/server. Its operations default to tracked changes and
can be enumerated, accepted, or rejected before saving. getChanges() includes
inline edits, formatting, paragraph marks, and paragraph, section, table, row,
and cell property changes.
License
Apache-2.0
folio began as a private fork of Eigenpal's
docx-editor; the original license and
copyright are preserved in NOTICE.md.