@crashbytes/react-version-compare 1.0.3 → 1.0.5
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/README.md +89 -6
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/package.json +36 -32
package/README.md
CHANGED
|
@@ -2,16 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
A React component for comparing strings and arrays with precise word-level and item-level highlighting of differences.
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/@crashbytes/react-version-compare)
|
|
6
|
+
[](https://www.npmjs.com/package/@crashbytes/react-version-compare)
|
|
6
7
|
[](LICENSE)
|
|
8
|
+
[](https://github.com/CrashBytes/react-version-compare/actions/workflows/security-audit.yml)
|
|
9
|
+
[](https://github.com/CrashBytes/react-version-compare/security/code-scanning)
|
|
10
|
+
[](https://github.com/CrashBytes/react-version-compare/actions/workflows/react-compat.yml)
|
|
11
|
+
[](https://github.com/CrashBytes/react-version-compare/actions/workflows/react-compat.yml)
|
|
12
|
+
[](https://www.npmjs.com/package/@crashbytes/react-version-compare)
|
|
13
|
+
[](https://crashbytes.github.io/react-version-compare/coverage/)
|
|
14
|
+
[](https://crashbytes.github.io/react-version-compare/coverage/)
|
|
7
15
|
|
|
8
|
-
## Live
|
|
16
|
+
## Live Demos
|
|
9
17
|
|
|
10
|
-
|
|
18
|
+
### Interactive Storybook
|
|
11
19
|
|
|
12
|
-
👉 **[Live Storybook Demo](https://crashbytes.github.io/react-version-compare/)**
|
|
20
|
+
👉 **[Live Storybook Demo](https://crashbytes.github.io/react-version-compare/storybook/)**
|
|
13
21
|
|
|
14
|
-
|
|
22
|
+
Explore and interact with all features of this component. Adjust inputs and props using the controls panel to see how the component behaves with different data.
|
|
23
|
+
|
|
24
|
+
### Test Coverage Report
|
|
25
|
+
|
|
26
|
+
📊 **[View Coverage Report](https://crashbytes.github.io/react-version-compare/coverage/)**
|
|
27
|
+
|
|
28
|
+
Detailed test coverage metrics showing 99.31% statement coverage, 94.39% branch coverage, and 100% function coverage.
|
|
15
29
|
|
|
16
30
|
## Features
|
|
17
31
|
|
|
@@ -23,6 +37,7 @@ The Storybook provides interactive examples for all comparison scenarios. You ca
|
|
|
23
37
|
- 📱 **Responsive**: Works on desktop and mobile devices
|
|
24
38
|
- ⚡ **TypeScript Support**: Full TypeScript definitions included
|
|
25
39
|
- 🎛️ **Multiple Views**: Side-by-side or inline comparison modes
|
|
40
|
+
- ✅ **Comprehensive Testing**: 80%+ test coverage with 114+ test scenarios
|
|
26
41
|
|
|
27
42
|
## Installation
|
|
28
43
|
|
|
@@ -161,6 +176,55 @@ const modified = ['Item A', 'Modified Item B', 'Item C', 'Item D'];
|
|
|
161
176
|
/>
|
|
162
177
|
```
|
|
163
178
|
|
|
179
|
+
## Testing
|
|
180
|
+
|
|
181
|
+
This package includes comprehensive unit and integration tests with 80%+ coverage.
|
|
182
|
+
|
|
183
|
+
### Running Tests
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# Run all tests
|
|
187
|
+
npm test
|
|
188
|
+
|
|
189
|
+
# Run tests with coverage report
|
|
190
|
+
npm run test:coverage
|
|
191
|
+
|
|
192
|
+
# Run tests in watch mode (for development)
|
|
193
|
+
npm run test:watch
|
|
194
|
+
|
|
195
|
+
# Run specific test file
|
|
196
|
+
npm test -- Compare.enhanced.test.tsx
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### Test Coverage
|
|
200
|
+
|
|
201
|
+
The test suite includes:
|
|
202
|
+
- **114+ test scenarios** covering edge cases and real-world usage
|
|
203
|
+
- **Unit tests**: Component logic, utility functions, type guards
|
|
204
|
+
- **Integration tests**: Real-world scenarios (code snippets, JSON, SQL, URLs)
|
|
205
|
+
- **Edge case tests**: Empty inputs, null/undefined, large datasets, unicode
|
|
206
|
+
- **Accessibility tests**: Semantic structure, screen reader support
|
|
207
|
+
- **Performance tests**: Large arrays (100+ items), large strings (1000+ words)
|
|
208
|
+
|
|
209
|
+
Coverage thresholds enforced by Jest:
|
|
210
|
+
- Branches: 75%
|
|
211
|
+
- Functions: 80%
|
|
212
|
+
- Lines: 80%
|
|
213
|
+
- Statements: 80%
|
|
214
|
+
|
|
215
|
+
See [TEST-COVERAGE-SUMMARY.md](./TEST-COVERAGE-SUMMARY.md) for detailed test documentation.
|
|
216
|
+
|
|
217
|
+
### Test Files
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
__tests__/
|
|
221
|
+
├── Compare.test.tsx # Original basic tests
|
|
222
|
+
├── Compare.enhanced.test.tsx # Edge cases & comprehensive coverage
|
|
223
|
+
├── Compare.integration.test.tsx # Real-world scenarios
|
|
224
|
+
├── ContentfulDiff.test.tsx # Original utility tests
|
|
225
|
+
└── ContentfulDiff.enhanced.test.tsx # Complete utility coverage
|
|
226
|
+
```
|
|
227
|
+
|
|
164
228
|
## Styling
|
|
165
229
|
|
|
166
230
|
The component uses CSS classes that you can customize:
|
|
@@ -205,6 +269,25 @@ Apache License 2.0 - see the [LICENSE](LICENSE) file for details.
|
|
|
205
269
|
|
|
206
270
|
Contributions are welcome! Please feel free to submit a Pull Request.
|
|
207
271
|
|
|
272
|
+
### Development Setup
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
# Install dependencies
|
|
276
|
+
npm install
|
|
277
|
+
|
|
278
|
+
# Run tests
|
|
279
|
+
npm test
|
|
280
|
+
|
|
281
|
+
# Run tests with coverage
|
|
282
|
+
npm run test:coverage
|
|
283
|
+
|
|
284
|
+
# Build the package
|
|
285
|
+
npm run build
|
|
286
|
+
|
|
287
|
+
# Run Storybook for local development
|
|
288
|
+
npm run storybook
|
|
289
|
+
```
|
|
290
|
+
|
|
208
291
|
## Support
|
|
209
292
|
|
|
210
293
|
If you encounter any issues or have questions, please [open an issue](https://github.com/CrashBytes/react-version-compare/issues) on GitHub.
|
|
@@ -221,4 +304,4 @@ To bump the version, use [npm version](https://docs.npmjs.com/cli/v10/commands/n
|
|
|
221
304
|
npm version patch # or 'minor' or 'major'
|
|
222
305
|
```
|
|
223
306
|
|
|
224
|
-
This will update `package.json`, create a git tag, and (optionally) commit the change.
|
|
307
|
+
This will update `package.json`, create a git tag, and (optionally) commit the change.
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/components/contentfulDiff.tsx","../../src/components/Compare.tsx"],"sourcesContent":["import React from 'react';\nimport { BLOCKS, Document, Block, Inline, Text } from '@contentful/rich-text-types';\n\n// Exported type guard for Contentful documents\nexport function isContentfulDocument(value: any): value is Document {\n return (\n value &&\n typeof value === 'object' &&\n value.nodeType === BLOCKS.DOCUMENT &&\n Array.isArray(value.content)\n );\n}\n\n// Extract plain text from Contentful document\nexport function extractPlainText(document: Document): string {\n const extractFromNode = (node: Block | Inline | Text): string => {\n if (node.nodeType === 'text') {\n return (node as Text).value;\n }\n if ('content' in node && node.content) {\n return node.content.map(child => extractFromNode(child)).join('');\n }\n return '';\n };\n return extractFromNode(document);\n}\n\n// Extract structured content for structure diff\nexport function extractStructuredContent(document: Document): Array<{ type: string; content: string; level?: number }> {\n const result: Array<{ type: string; content: string; level?: number }> = [];\n const extractFromNode = (node: Block | Inline | Text): void => {\n if (node.nodeType === 'text') return;\n if ('content' in node && node.content) {\n const textContent = node.content.map(child =>\n child.nodeType === 'text' ? (child as Text).value : ''\n ).join('');\n let displayType: string = node.nodeType;\n let headingLevel: number | undefined;\n switch (node.nodeType) {\n case BLOCKS.HEADING_1: displayType = 'Heading'; headingLevel = 1; break;\n case BLOCKS.HEADING_2: displayType = 'Heading'; headingLevel = 2; break;\n case BLOCKS.HEADING_3: displayType = 'Heading'; headingLevel = 3; break;\n case BLOCKS.HEADING_4: displayType = 'Heading'; headingLevel = 4; break;\n case BLOCKS.HEADING_5: displayType = 'Heading'; headingLevel = 5; break;\n case BLOCKS.HEADING_6: displayType = 'Heading'; headingLevel = 6; break;\n case BLOCKS.PARAGRAPH: displayType = 'Text'; break;\n case BLOCKS.UL_LIST: displayType = 'List'; break;\n case BLOCKS.OL_LIST: displayType = 'Numbered List'; break;\n case BLOCKS.LIST_ITEM: displayType = 'List Item'; break;\n case BLOCKS.QUOTE: displayType = 'Quote'; break;\n case BLOCKS.TABLE: displayType = 'Table'; break;\n default: displayType = node.nodeType.charAt(0).toUpperCase() + node.nodeType.slice(1);\n }\n if (textContent.trim()) {\n result.push({ type: displayType, content: textContent.trim(), level: headingLevel });\n }\n node.content.forEach(child => {\n if (child.nodeType !== 'text') extractFromNode(child);\n });\n }\n };\n if (document.content) document.content.forEach(node => extractFromNode(node));\n return result;\n}\n\n// Main Contentful diff renderer\nexport async function renderContentfulDiff(\n origDoc: Document,\n modDoc: Document,\n compareMode: 'text' | 'structure',\n caseSensitive: boolean,\n renderStringDiff: (a: string, b: string) => { originalParts: any[]; modifiedParts: any[] }\n) {\n // Dynamically import diff for Vite/ESM compatibility\n const DiffModule = await import('diff');\n const Diff = DiffModule.default ?? DiffModule;\n const { diffWords, diffArrays } = Diff;\n\n if (compareMode === 'structure') {\n const origStructure = extractStructuredContent(origDoc);\n const modStructure = extractStructuredContent(modDoc);\n\n const diff = diffArrays(\n origStructure,\n modStructure,\n {\n comparator: (a: any, b: any) =>\n a.type === b.type &&\n a.content === b.content &&\n a.level === b.level\n }\n );\n\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n\n let origIdx = 0;\n let modIdx = 0;\n\n diff.forEach((part: any) => {\n if (part.added) {\n part.value.forEach((modItem: any, i: number) => {\n originalParts.push(\n <div key={`blank-orig-${modIdx + i}`} className=\"diff-blank-line\" />\n );\n modifiedParts.push(\n <div key={`added-mod-${modIdx + i}`} className=\"diff-added-line\">\n <span className=\"diff-structure-type\">{modItem.type}</span>\n {modItem.level && <span className=\"diff-structure-level\"> H{modItem.level}</span>}\n <span className=\"diff-structure-content\">: {modItem.content}</span>\n </div>\n );\n });\n modIdx += part.count || 0;\n } else if (part.removed) {\n part.value.forEach((origItem: any, i: number) => {\n originalParts.push(\n <div key={`removed-orig-${origIdx + i}`} className=\"diff-removed-line\">\n <span className=\"diff-structure-type\">{origItem.type}</span>\n {origItem.level && <span className=\"diff-structure-level\"> H{origItem.level}</span>}\n <span className=\"diff-structure-content\">: {origItem.content}</span>\n </div>\n );\n modifiedParts.push(\n <div key={`blank-mod-${origIdx + i}`} className=\"diff-blank-line\" />\n );\n });\n origIdx += part.count || 0;\n } else {\n part.value.forEach((item: any, i: number) => {\n originalParts.push(\n <div key={`unchanged-orig-${origIdx + i}`} className=\"diff-unchanged-line\">\n <span className=\"diff-structure-type\">{item.type}</span>\n {item.level && <span className=\"diff-structure-level\"> H{item.level}</span>}\n <span className=\"diff-structure-content\">: {item.content}</span>\n </div>\n );\n modifiedParts.push(\n <div key={`unchanged-mod-${modIdx + i}`} className=\"diff-unchanged-line\">\n <span className=\"diff-structure-type\">{item.type}</span>\n {item.level && <span className=\"diff-structure-level\"> H{item.level}</span>}\n <span className=\"diff-structure-content\">: {item.content}</span>\n </div>\n );\n });\n origIdx += part.count || 0;\n modIdx += part.count || 0;\n }\n });\n\n return { originalParts, modifiedParts };\n } else {\n // Text-based comparison of Contentful documents\n const origText = extractPlainText(origDoc);\n const modText = extractPlainText(modDoc);\n return renderStringDiff(origText, modText);\n }\n}","import React, { useEffect, useState } from 'react';\nimport { Document } from '@contentful/rich-text-types';\nimport {\n isContentfulDocument,\n renderContentfulDiff\n} from './contentfulDiff';\nimport * as Diff from 'diff';\n\nfunction renderStringDiff(orig: string, mod: string) {\n const difference = Diff.diffWords(orig, mod);\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n for (const part of difference) {\n if (part.removed) {\n originalParts.push(\n <span key={originalParts.length} className=\"diff-removed\">\n {part.value}\n </span>\n );\n } else if (part.added) {\n modifiedParts.push(\n <span key={modifiedParts.length} className=\"diff-added\">\n {part.value}\n </span>\n );\n } else {\n originalParts.push(\n <span key={originalParts.length} className=\"diff-unchanged\">\n {part.value}\n </span>\n );\n modifiedParts.push(\n <span key={modifiedParts.length} className=\"diff-unchanged\">\n {part.value}\n </span>\n );\n }\n }\n return { originalParts, modifiedParts };\n}\n\nfunction renderArrayDiff(original: string[], modified: string[]) {\n const maxLength = Math.max(original.length, modified.length);\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n for (let i = 0; i < maxLength; i++) {\n const orig = original[i] ?? '';\n const mod = modified[i] ?? '';\n if (orig === mod) {\n originalParts.push(\n <div key={`orig-${i}`} className=\"diff-unchanged-line\">{orig}</div>\n );\n modifiedParts.push(\n <div key={`mod-${i}`} className=\"diff-unchanged-line\">{mod}</div>\n );\n } else {\n originalParts.push(\n <div key={`orig-${i}`} className={orig ? \"diff-removed-line\" : \"diff-blank-line\"}>{orig}</div>\n );\n modifiedParts.push(\n <div key={`mod-${i}`} className={mod ? \"diff-added-line\" : \"diff-blank-line\"}>{mod}</div>\n );\n }\n }\n return { originalParts, modifiedParts };\n}\n\nexport interface CompareProps {\n original: string | string[] | Document;\n modified: string | string[] | Document;\n className?: string;\n viewMode?: 'side-by-side' | 'inline';\n caseSensitive?: boolean;\n compareMode?: 'text' | 'structure';\n}\n\nexport const Compare: React.FC<CompareProps> = ({\n original,\n modified,\n className = '',\n viewMode = 'side-by-side',\n caseSensitive = true,\n compareMode = 'text',\n}) => {\n const isStringComparison = typeof original === 'string' && typeof modified === 'string';\n const isArrayComparison = Array.isArray(original) && Array.isArray(modified);\n const isContentfulComparison = isContentfulDocument(original) && isContentfulDocument(modified);\n\n const [contentfulParts, setContentfulParts] = useState<{ originalParts: any[]; modifiedParts: any[] } | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n if (isContentfulComparison) {\n setContentfulParts(null); // reset while loading\n renderContentfulDiff(\n original as Document,\n modified as Document,\n compareMode,\n caseSensitive,\n renderStringDiff\n ).then(result => {\n if (!cancelled) setContentfulParts(result);\n });\n }\n return () => { cancelled = true; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [original, modified, compareMode, caseSensitive, isContentfulComparison]);\n\n let originalParts: any[] = [], modifiedParts: any[] = [];\n if (isStringComparison) {\n ({ originalParts, modifiedParts } = renderStringDiff(original as string, modified as string));\n } else if (isArrayComparison) {\n ({ originalParts, modifiedParts } = renderArrayDiff(original as string[], modified as string[]));\n } else if (isContentfulComparison) {\n if (contentfulParts) {\n originalParts = contentfulParts.originalParts;\n modifiedParts = contentfulParts.modifiedParts;\n } else {\n originalParts = [<div key=\"loading\">Loading...</div>];\n modifiedParts = [<div key=\"loading\">Loading...</div>];\n }\n }\n\n if (\n !isStringComparison &&\n !isArrayComparison &&\n !isContentfulComparison\n ) {\n return (\n <div className={`compare-error ${className}`}>\n Error: Invalid input for comparison.\n </div>\n );\n }\n\n if (viewMode === 'inline') {\n return (\n <div className={`compare-inline ${className}`}>\n <div className=\"compare-content\">\n {originalParts}\n {modifiedParts}\n </div>\n </div>\n );\n }\n \n\n return (\n <div className={`compare-side-by-side ${className}`}>\n <div className=\"compare-panel\">\n <div className=\"compare-header original-header\">Original</div>\n <div className=\"compare-content original-content\">\n {originalParts}\n </div>\n </div>\n <div className=\"compare-panel\">\n <div className=\"compare-header modified-header\">Modified</div>\n <div className=\"compare-content modified-content\">\n {modifiedParts}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Compare;"],"names":["isContentfulDocument","value","nodeType","BLOCKS","DOCUMENT","Array","isArray","content","extractPlainText","document","extractFromNode","node","map","child","join","extractStructuredContent","result","textContent","displayType","headingLevel","HEADING_1","HEADING_2","HEADING_3","HEADING_4","HEADING_5","HEADING_6","PARAGRAPH","UL_LIST","OL_LIST","LIST_ITEM","QUOTE","TABLE","charAt","toUpperCase","slice","trim","push","type","level","forEach","renderContentfulDiff","origDoc","modDoc","compareMode","caseSensitive","renderStringDiff","DiffModule","Diff","default","diffWords","diffArrays","origStructure","modStructure","diff","comparator","a","b","originalParts","modifiedParts","origIdx","modIdx","part","added","modItem","i","_jsx","className","_jsxs","children","count","removed","origItem","item","origText","modText","orig","mod","difference","length","renderArrayDiff","original","modified","maxLength","Math","max","Compare","viewMode","isStringComparison","isArrayComparison","isContentfulComparison","contentfulParts","setContentfulParts","useState","useEffect","cancelled","then"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/contentfulDiff.tsx","../../../src/components/Compare.tsx"],"sourcesContent":["import React from 'react';\nimport { BLOCKS, Document, Block, Inline, Text } from '@contentful/rich-text-types';\n\n// Exported type guard for Contentful documents\nexport function isContentfulDocument(value: any): value is Document {\n return (\n value &&\n typeof value === 'object' &&\n value.nodeType === BLOCKS.DOCUMENT &&\n Array.isArray(value.content)\n );\n}\n\n// Extract plain text from Contentful document\nexport function extractPlainText(document: Document): string {\n const extractFromNode = (node: Block | Inline | Text): string => {\n if (node.nodeType === 'text') {\n return (node as Text).value;\n }\n if ('content' in node && node.content) {\n return node.content.map(child => extractFromNode(child)).join('');\n }\n return '';\n };\n return extractFromNode(document);\n}\n\n// Extract structured content for structure diff\nexport function extractStructuredContent(document: Document): Array<{ type: string; content: string; level?: number }> {\n const result: Array<{ type: string; content: string; level?: number }> = [];\n const extractFromNode = (node: Block | Inline | Text): void => {\n if (node.nodeType === 'text') return;\n if ('content' in node && node.content) {\n const textContent = node.content.map(child =>\n child.nodeType === 'text' ? (child as Text).value : ''\n ).join('');\n let displayType: string = node.nodeType;\n let headingLevel: number | undefined;\n switch (node.nodeType) {\n case BLOCKS.HEADING_1: displayType = 'Heading'; headingLevel = 1; break;\n case BLOCKS.HEADING_2: displayType = 'Heading'; headingLevel = 2; break;\n case BLOCKS.HEADING_3: displayType = 'Heading'; headingLevel = 3; break;\n case BLOCKS.HEADING_4: displayType = 'Heading'; headingLevel = 4; break;\n case BLOCKS.HEADING_5: displayType = 'Heading'; headingLevel = 5; break;\n case BLOCKS.HEADING_6: displayType = 'Heading'; headingLevel = 6; break;\n case BLOCKS.PARAGRAPH: displayType = 'Text'; break;\n case BLOCKS.UL_LIST: displayType = 'List'; break;\n case BLOCKS.OL_LIST: displayType = 'Numbered List'; break;\n case BLOCKS.LIST_ITEM: displayType = 'List Item'; break;\n case BLOCKS.QUOTE: displayType = 'Quote'; break;\n case BLOCKS.TABLE: displayType = 'Table'; break;\n default: displayType = node.nodeType.charAt(0).toUpperCase() + node.nodeType.slice(1);\n }\n if (textContent.trim()) {\n result.push({ type: displayType, content: textContent.trim(), level: headingLevel });\n }\n node.content.forEach(child => {\n if (child.nodeType !== 'text') extractFromNode(child);\n });\n }\n };\n if (document.content) document.content.forEach(node => extractFromNode(node));\n return result;\n}\n\n// Main Contentful diff renderer\nexport async function renderContentfulDiff(\n origDoc: Document,\n modDoc: Document,\n compareMode: 'text' | 'structure',\n caseSensitive: boolean,\n renderStringDiff: (a: string, b: string) => { originalParts: any[]; modifiedParts: any[] }\n) {\n // Dynamically import diff for Vite/ESM compatibility\n const DiffModule = await import('diff');\n const Diff = DiffModule.default ?? DiffModule;\n const { diffWords, diffArrays } = Diff;\n\n if (compareMode === 'structure') {\n const origStructure = extractStructuredContent(origDoc);\n const modStructure = extractStructuredContent(modDoc);\n\n const diff = diffArrays(\n origStructure,\n modStructure,\n {\n comparator: (a: any, b: any) =>\n a.type === b.type &&\n a.content === b.content &&\n a.level === b.level\n }\n );\n\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n\n let origIdx = 0;\n let modIdx = 0;\n\n diff.forEach((part: any) => {\n if (part.added) {\n part.value.forEach((modItem: any, i: number) => {\n originalParts.push(\n <div key={`blank-orig-${modIdx + i}`} className=\"diff-blank-line\" />\n );\n modifiedParts.push(\n <div key={`added-mod-${modIdx + i}`} className=\"diff-added-line\">\n <span className=\"diff-structure-type\">{modItem.type}</span>\n {modItem.level && <span className=\"diff-structure-level\"> H{modItem.level}</span>}\n <span className=\"diff-structure-content\">: {modItem.content}</span>\n </div>\n );\n });\n modIdx += part.count || 0;\n } else if (part.removed) {\n part.value.forEach((origItem: any, i: number) => {\n originalParts.push(\n <div key={`removed-orig-${origIdx + i}`} className=\"diff-removed-line\">\n <span className=\"diff-structure-type\">{origItem.type}</span>\n {origItem.level && <span className=\"diff-structure-level\"> H{origItem.level}</span>}\n <span className=\"diff-structure-content\">: {origItem.content}</span>\n </div>\n );\n modifiedParts.push(\n <div key={`blank-mod-${origIdx + i}`} className=\"diff-blank-line\" />\n );\n });\n origIdx += part.count || 0;\n } else {\n part.value.forEach((item: any, i: number) => {\n originalParts.push(\n <div key={`unchanged-orig-${origIdx + i}`} className=\"diff-unchanged-line\">\n <span className=\"diff-structure-type\">{item.type}</span>\n {item.level && <span className=\"diff-structure-level\"> H{item.level}</span>}\n <span className=\"diff-structure-content\">: {item.content}</span>\n </div>\n );\n modifiedParts.push(\n <div key={`unchanged-mod-${modIdx + i}`} className=\"diff-unchanged-line\">\n <span className=\"diff-structure-type\">{item.type}</span>\n {item.level && <span className=\"diff-structure-level\"> H{item.level}</span>}\n <span className=\"diff-structure-content\">: {item.content}</span>\n </div>\n );\n });\n origIdx += part.count || 0;\n modIdx += part.count || 0;\n }\n });\n\n return { originalParts, modifiedParts };\n } else {\n // Text-based comparison of Contentful documents\n const origText = extractPlainText(origDoc);\n const modText = extractPlainText(modDoc);\n return renderStringDiff(origText, modText);\n }\n}","import React, { useEffect, useState } from 'react';\nimport { Document } from '@contentful/rich-text-types';\nimport {\n isContentfulDocument,\n renderContentfulDiff\n} from './contentfulDiff';\nimport * as Diff from 'diff';\n\nfunction renderStringDiff(orig: string, mod: string) {\n const difference = Diff.diffWords(orig, mod);\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n for (const part of difference) {\n if (part.removed) {\n originalParts.push(\n <span key={originalParts.length} className=\"diff-removed\">\n {part.value}\n </span>\n );\n } else if (part.added) {\n modifiedParts.push(\n <span key={modifiedParts.length} className=\"diff-added\">\n {part.value}\n </span>\n );\n } else {\n originalParts.push(\n <span key={originalParts.length} className=\"diff-unchanged\">\n {part.value}\n </span>\n );\n modifiedParts.push(\n <span key={modifiedParts.length} className=\"diff-unchanged\">\n {part.value}\n </span>\n );\n }\n }\n return { originalParts, modifiedParts };\n}\n\nfunction renderArrayDiff(original: string[], modified: string[]) {\n const maxLength = Math.max(original.length, modified.length);\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n for (let i = 0; i < maxLength; i++) {\n const orig = original[i] ?? '';\n const mod = modified[i] ?? '';\n if (orig === mod) {\n originalParts.push(\n <div key={`orig-${i}`} className=\"diff-unchanged-line\">{orig}</div>\n );\n modifiedParts.push(\n <div key={`mod-${i}`} className=\"diff-unchanged-line\">{mod}</div>\n );\n } else {\n originalParts.push(\n <div key={`orig-${i}`} className={orig ? \"diff-removed-line\" : \"diff-blank-line\"}>{orig}</div>\n );\n modifiedParts.push(\n <div key={`mod-${i}`} className={mod ? \"diff-added-line\" : \"diff-blank-line\"}>{mod}</div>\n );\n }\n }\n return { originalParts, modifiedParts };\n}\n\nexport interface CompareProps {\n original: string | string[] | Document;\n modified: string | string[] | Document;\n className?: string;\n viewMode?: 'side-by-side' | 'inline';\n caseSensitive?: boolean;\n compareMode?: 'text' | 'structure';\n}\n\nexport const Compare: React.FC<CompareProps> = ({\n original,\n modified,\n className = '',\n viewMode = 'side-by-side',\n caseSensitive = true,\n compareMode = 'text',\n}) => {\n const isStringComparison = typeof original === 'string' && typeof modified === 'string';\n const isArrayComparison = Array.isArray(original) && Array.isArray(modified);\n const isContentfulComparison = isContentfulDocument(original) && isContentfulDocument(modified);\n\n const [contentfulParts, setContentfulParts] = useState<{ originalParts: any[]; modifiedParts: any[] } | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n if (isContentfulComparison) {\n setContentfulParts(null); // reset while loading\n renderContentfulDiff(\n original as Document,\n modified as Document,\n compareMode,\n caseSensitive,\n renderStringDiff\n ).then(result => {\n if (!cancelled) setContentfulParts(result);\n });\n }\n return () => { cancelled = true; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [original, modified, compareMode, caseSensitive, isContentfulComparison]);\n\n let originalParts: any[] = [], modifiedParts: any[] = [];\n if (isStringComparison) {\n ({ originalParts, modifiedParts } = renderStringDiff(original as string, modified as string));\n } else if (isArrayComparison) {\n ({ originalParts, modifiedParts } = renderArrayDiff(original as string[], modified as string[]));\n } else if (isContentfulComparison) {\n if (contentfulParts) {\n originalParts = contentfulParts.originalParts;\n modifiedParts = contentfulParts.modifiedParts;\n } else {\n originalParts = [<div key=\"loading\">Loading...</div>];\n modifiedParts = [<div key=\"loading\">Loading...</div>];\n }\n }\n\n if (\n !isStringComparison &&\n !isArrayComparison &&\n !isContentfulComparison\n ) {\n return (\n <div className={`compare-error ${className}`}>\n Error: Invalid input for comparison.\n </div>\n );\n }\n\n if (viewMode === 'inline') {\n return (\n <div className={`compare-inline ${className}`}>\n <div className=\"compare-content\">\n {originalParts}\n {modifiedParts}\n </div>\n </div>\n );\n }\n \n\n return (\n <div className={`compare-side-by-side ${className}`}>\n <div className=\"compare-panel\">\n <div className=\"compare-header original-header\">Original</div>\n <div className=\"compare-content original-content\">\n {originalParts}\n </div>\n </div>\n <div className=\"compare-panel\">\n <div className=\"compare-header modified-header\">Modified</div>\n <div className=\"compare-content modified-content\">\n {modifiedParts}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Compare;"],"names":["isContentfulDocument","value","nodeType","BLOCKS","DOCUMENT","Array","isArray","content","extractPlainText","document","extractFromNode","node","map","child","join","extractStructuredContent","result","textContent","displayType","headingLevel","HEADING_1","HEADING_2","HEADING_3","HEADING_4","HEADING_5","HEADING_6","PARAGRAPH","UL_LIST","OL_LIST","LIST_ITEM","QUOTE","TABLE","charAt","toUpperCase","slice","trim","push","type","level","forEach","renderContentfulDiff","origDoc","modDoc","compareMode","caseSensitive","renderStringDiff","DiffModule","Diff","default","diffWords","diffArrays","origStructure","modStructure","diff","comparator","a","b","originalParts","modifiedParts","origIdx","modIdx","part","added","modItem","i","_jsx","className","_jsxs","children","count","removed","origItem","item","origText","modText","orig","mod","difference","length","renderArrayDiff","original","modified","maxLength","Math","max","Compare","viewMode","isStringComparison","isArrayComparison","isContentfulComparison","contentfulParts","setContentfulParts","useState","useEffect","cancelled","then"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;AACM,SAAUA,oBAAoBA,CAACC,KAAU,EAAA;EAC7C,OACEA,KAAK,IACL,OAAOA,KAAK,KAAK,QAAQ,IACzBA,KAAK,CAACC,QAAQ,KAAKC,oBAAM,CAACC,QAAQ,IAClCC,KAAK,CAACC,OAAO,CAACL,KAAK,CAACM,OAAO,CAAC;AAEhC;AAEA;AACM,SAAUC,gBAAgBA,CAACC,QAAkB,EAAA;EACjD,MAAMC,eAAe,GAAIC,IAA2B,IAAY;AAC9D,IAAA,IAAIA,IAAI,CAACT,QAAQ,KAAK,MAAM,EAAE;MAC5B,OAAQS,IAAa,CAACV,KAAK;AAC7B,IAAA;AACA,IAAA,IAAI,SAAS,IAAIU,IAAI,IAAIA,IAAI,CAACJ,OAAO,EAAE;AACrC,MAAA,OAAOI,IAAI,CAACJ,OAAO,CAACK,GAAG,CAACC,KAAK,IAAIH,eAAe,CAACG,KAAK,CAAC,CAAC,CAACC,IAAI,CAAC,EAAE,CAAC;AACnE,IAAA;AACA,IAAA,OAAO,EAAE;EACX,CAAC;EACD,OAAOJ,eAAe,CAACD,QAAQ,CAAC;AAClC;AAEA;AACM,SAAUM,wBAAwBA,CAACN,QAAkB,EAAA;EACzD,MAAMO,MAAM,GAA6D,EAAE;EAC3E,MAAMN,eAAe,GAAIC,IAA2B,IAAU;AAC5D,IAAA,IAAIA,IAAI,CAACT,QAAQ,KAAK,MAAM,EAAE;AAC9B,IAAA,IAAI,SAAS,IAAIS,IAAI,IAAIA,IAAI,CAACJ,OAAO,EAAE;MACrC,MAAMU,WAAW,GAAGN,IAAI,CAACJ,OAAO,CAACK,GAAG,CAACC,KAAK,IACxCA,KAAK,CAACX,QAAQ,KAAK,MAAM,GAAIW,KAAc,CAACZ,KAAK,GAAG,EAAE,CACvD,CAACa,IAAI,CAAC,EAAE,CAAC;AACV,MAAA,IAAII,WAAW,GAAWP,IAAI,CAACT,QAAQ;AACvC,MAAA,IAAIiB,YAAgC;MACpC,QAAQR,IAAI,CAACT,QAAQ;QACnB,KAAKC,oBAAM,CAACiB,SAAS;AAAEF,UAAAA,WAAW,GAAG,SAAS;AAAEC,UAAAA,YAAY,GAAG,CAAC;AAAE,UAAA;QAClE,KAAKhB,oBAAM,CAACkB,SAAS;AAAEH,UAAAA,WAAW,GAAG,SAAS;AAAEC,UAAAA,YAAY,GAAG,CAAC;AAAE,UAAA;QAClE,KAAKhB,oBAAM,CAACmB,SAAS;AAAEJ,UAAAA,WAAW,GAAG,SAAS;AAAEC,UAAAA,YAAY,GAAG,CAAC;AAAE,UAAA;QAClE,KAAKhB,oBAAM,CAACoB,SAAS;AAAEL,UAAAA,WAAW,GAAG,SAAS;AAAEC,UAAAA,YAAY,GAAG,CAAC;AAAE,UAAA;QAClE,KAAKhB,oBAAM,CAACqB,SAAS;AAAEN,UAAAA,WAAW,GAAG,SAAS;AAAEC,UAAAA,YAAY,GAAG,CAAC;AAAE,UAAA;QAClE,KAAKhB,oBAAM,CAACsB,SAAS;AAAEP,UAAAA,WAAW,GAAG,SAAS;AAAEC,UAAAA,YAAY,GAAG,CAAC;AAAE,UAAA;QAClE,KAAKhB,oBAAM,CAACuB,SAAS;AAAER,UAAAA,WAAW,GAAG,MAAM;AAAE,UAAA;QAC7C,KAAKf,oBAAM,CAACwB,OAAO;AAAET,UAAAA,WAAW,GAAG,MAAM;AAAE,UAAA;QAC3C,KAAKf,oBAAM,CAACyB,OAAO;AAAEV,UAAAA,WAAW,GAAG,eAAe;AAAE,UAAA;QACpD,KAAKf,oBAAM,CAAC0B,SAAS;AAAEX,UAAAA,WAAW,GAAG,WAAW;AAAE,UAAA;QAClD,KAAKf,oBAAM,CAAC2B,KAAK;AAAEZ,UAAAA,WAAW,GAAG,OAAO;AAAE,UAAA;QAC1C,KAAKf,oBAAM,CAAC4B,KAAK;AAAEb,UAAAA,WAAW,GAAG,OAAO;AAAE,UAAA;AAC1C,QAAA;UAASA,WAAW,GAAGP,IAAI,CAACT,QAAQ,CAAC8B,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,EAAE,GAAGtB,IAAI,CAACT,QAAQ,CAACgC,KAAK,CAAC,CAAC,CAAC;AACvF;AACA,MAAA,IAAIjB,WAAW,CAACkB,IAAI,EAAE,EAAE;QACtBnB,MAAM,CAACoB,IAAI,CAAC;AAAEC,UAAAA,IAAI,EAAEnB,WAAW;AAAEX,UAAAA,OAAO,EAAEU,WAAW,CAACkB,IAAI,EAAE;AAAEG,UAAAA,KAAK,EAAEnB;AAAY,SAAE,CAAC;AACtF,MAAA;AACAR,MAAAA,IAAI,CAACJ,OAAO,CAACgC,OAAO,CAAC1B,KAAK,IAAG;QAC3B,IAAIA,KAAK,CAACX,QAAQ,KAAK,MAAM,EAAEQ,eAAe,CAACG,KAAK,CAAC;AACvD,MAAA,CAAC,CAAC;AACJ,IAAA;EACF,CAAC;AACD,EAAA,IAAIJ,QAAQ,CAACF,OAAO,EAAEE,QAAQ,CAACF,OAAO,CAACgC,OAAO,CAAC5B,IAAI,IAAID,eAAe,CAACC,IAAI,CAAC,CAAC;AAC7E,EAAA,OAAOK,MAAM;AACf;AAEA;AACO,eAAewB,oBAAoBA,CACxCC,OAAiB,EACjBC,MAAgB,EAChBC,WAAiC,EACjCC,aAAsB,EACtBC,gBAA0F,EAAA;AAE1F;AACA,EAAA,MAAMC,UAAU,GAAG,MAAM,OAAO,MAAM,CAAC;AACvC,EAAA,MAAMC,IAAI,GAAGD,UAAU,CAACE,OAAO,IAAIF,UAAU;EAC7C,MAAM;IAAEG,SAAS;AAAEC,IAAAA;AAAU,GAAE,GAAGH,IAAI;EAEtC,IAAIJ,WAAW,KAAK,WAAW,EAAE;AAC/B,IAAA,MAAMQ,aAAa,GAAGpC,wBAAwB,CAAC0B,OAAO,CAAC;AACvD,IAAA,MAAMW,YAAY,GAAGrC,wBAAwB,CAAC2B,MAAM,CAAC;AAErD,IAAA,MAAMW,IAAI,GAAGH,UAAU,CACrBC,aAAa,EACbC,YAAY,EACZ;MACEE,UAAU,EAAEA,CAACC,CAAM,EAAEC,CAAM,KACzBD,CAAC,CAAClB,IAAI,KAAKmB,CAAC,CAACnB,IAAI,IACjBkB,CAAC,CAAChD,OAAO,KAAKiD,CAAC,CAACjD,OAAO,IACvBgD,CAAC,CAACjB,KAAK,KAAKkB,CAAC,CAAClB;AACjB,KAAA,CACF;IAED,MAAMmB,aAAa,GAAU,EAAE;IAC/B,MAAMC,aAAa,GAAU,EAAE;IAE/B,IAAIC,OAAO,GAAG,CAAC;IACf,IAAIC,MAAM,GAAG,CAAC;AAEdP,IAAAA,IAAI,CAACd,OAAO,CAAEsB,IAAS,IAAI;MACzB,IAAIA,IAAI,CAACC,KAAK,EAAE;QACdD,IAAI,CAAC5D,KAAK,CAACsC,OAAO,CAAC,CAACwB,OAAY,EAAEC,CAAS,KAAI;AAC7CP,UAAAA,aAAa,CAACrB,IAAI,CAChB6B,cAAA,CAAA,KAAA,EAAA;AAAsCC,YAAAA,SAAS,EAAC;AAAiB,WAAA,EAAvD,CAAA,WAAA,EAAcN,MAAM,GAAGI,CAAC,CAAA,CAAE,CAAgC,CACrE;AACDN,UAAAA,aAAa,CAACtB,IAAI,CAChB+B,eAAA,CAAA,KAAA,EAAA;AAAqCD,YAAAA,SAAS,EAAC,iBAAiB;AAAAE,YAAAA,QAAA,EAAA,CAC9DH,cAAA,CAAA,MAAA,EAAA;AAAMC,cAAAA,SAAS,EAAC,qBAAqB;cAAAE,QAAA,EAAEL,OAAO,CAAC1B;aAAI,CAAQ,EAC1D0B,OAAO,CAACzB,KAAK,IAAI6B,eAAA,CAAA,MAAA,EAAA;AAAMD,cAAAA,SAAS,EAAC,sBAAsB;AAAAE,cAAAA,QAAA,EAAA,CAAA,IAAA,EAAIL,OAAO,CAACzB,KAAK;cAAQ,EACjF6B,eAAA,CAAA,MAAA,EAAA;AAAMD,cAAAA,SAAS,EAAC,wBAAwB;AAAAE,cAAAA,QAAA,EAAA,CAAA,IAAA,EAAIL,OAAO,CAACxD,OAAO;AAAA,aAAA,CAAQ;AAAA,WAAA,EAH3D,CAAA,UAAA,EAAaqD,MAAM,GAAGI,CAAC,CAAA,CAAE,CAI7B,CACP;AACH,QAAA,CAAC,CAAC;AACFJ,QAAAA,MAAM,IAAIC,IAAI,CAACQ,KAAK,IAAI,CAAC;AAC3B,MAAA,CAAC,MAAM,IAAIR,IAAI,CAACS,OAAO,EAAE;QACvBT,IAAI,CAAC5D,KAAK,CAACsC,OAAO,CAAC,CAACgC,QAAa,EAAEP,CAAS,KAAI;AAC9CP,UAAAA,aAAa,CAACrB,IAAI,CAChB+B,eAAA,CAAA,KAAA,EAAA;AAAyCD,YAAAA,SAAS,EAAC,mBAAmB;AAAAE,YAAAA,QAAA,EAAA,CACpEH,cAAA,CAAA,MAAA,EAAA;AAAMC,cAAAA,SAAS,EAAC,qBAAqB;cAAAE,QAAA,EAAEG,QAAQ,CAAClC;aAAI,CAAQ,EAC3DkC,QAAQ,CAACjC,KAAK,IAAI6B,eAAA,CAAA,MAAA,EAAA;AAAMD,cAAAA,SAAS,EAAC,sBAAsB;AAAAE,cAAAA,QAAA,EAAA,CAAA,IAAA,EAAIG,QAAQ,CAACjC,KAAK;cAAQ,EACnF6B,eAAA,CAAA,MAAA,EAAA;AAAMD,cAAAA,SAAS,EAAC,wBAAwB;AAAAE,cAAAA,QAAA,EAAA,CAAA,IAAA,EAAIG,QAAQ,CAAChE,OAAO;AAAA,aAAA,CAAQ;AAAA,WAAA,EAH5D,CAAA,aAAA,EAAgBoD,OAAO,GAAGK,CAAC,CAAA,CAAE,CAIjC,CACP;AACDN,UAAAA,aAAa,CAACtB,IAAI,CAChB6B,cAAA,CAAA,KAAA,EAAA;AAAsCC,YAAAA,SAAS,EAAC;AAAiB,WAAA,EAAvD,CAAA,UAAA,EAAaP,OAAO,GAAGK,CAAC,CAAA,CAAE,CAAgC,CACrE;AACH,QAAA,CAAC,CAAC;AACFL,QAAAA,OAAO,IAAIE,IAAI,CAACQ,KAAK,IAAI,CAAC;AAC5B,MAAA,CAAC,MAAM;QACLR,IAAI,CAAC5D,KAAK,CAACsC,OAAO,CAAC,CAACiC,IAAS,EAAER,CAAS,KAAI;AAC1CP,UAAAA,aAAa,CAACrB,IAAI,CAChB+B,eAAA,CAAA,KAAA,EAAA;AAA2CD,YAAAA,SAAS,EAAC,qBAAqB;AAAAE,YAAAA,QAAA,EAAA,CACxEH,cAAA,CAAA,MAAA,EAAA;AAAMC,cAAAA,SAAS,EAAC,qBAAqB;cAAAE,QAAA,EAAEI,IAAI,CAACnC;aAAI,CAAQ,EACvDmC,IAAI,CAAClC,KAAK,IAAI6B,eAAA,CAAA,MAAA,EAAA;AAAMD,cAAAA,SAAS,EAAC,sBAAsB;AAAAE,cAAAA,QAAA,EAAA,CAAA,IAAA,EAAII,IAAI,CAAClC,KAAK;cAAQ,EAC3E6B,eAAA,CAAA,MAAA,EAAA;AAAMD,cAAAA,SAAS,EAAC,wBAAwB;AAAAE,cAAAA,QAAA,EAAA,CAAA,IAAA,EAAII,IAAI,CAACjE,OAAO;AAAA,aAAA,CAAQ;AAAA,WAAA,EAHxD,CAAA,eAAA,EAAkBoD,OAAO,GAAGK,CAAC,CAAA,CAAE,CAInC,CACP;AACDN,UAAAA,aAAa,CAACtB,IAAI,CAChB+B,eAAA,CAAA,KAAA,EAAA;AAAyCD,YAAAA,SAAS,EAAC,qBAAqB;AAAAE,YAAAA,QAAA,EAAA,CACtEH,cAAA,CAAA,MAAA,EAAA;AAAMC,cAAAA,SAAS,EAAC,qBAAqB;cAAAE,QAAA,EAAEI,IAAI,CAACnC;aAAI,CAAQ,EACvDmC,IAAI,CAAClC,KAAK,IAAI6B,eAAA,CAAA,MAAA,EAAA;AAAMD,cAAAA,SAAS,EAAC,sBAAsB;AAAAE,cAAAA,QAAA,EAAA,CAAA,IAAA,EAAII,IAAI,CAAClC,KAAK;cAAQ,EAC3E6B,eAAA,CAAA,MAAA,EAAA;AAAMD,cAAAA,SAAS,EAAC,wBAAwB;AAAAE,cAAAA,QAAA,EAAA,CAAA,IAAA,EAAII,IAAI,CAACjE,OAAO;AAAA,aAAA,CAAQ;AAAA,WAAA,EAHxD,CAAA,cAAA,EAAiBqD,MAAM,GAAGI,CAAC,CAAA,CAAE,CAIjC,CACP;AACH,QAAA,CAAC,CAAC;AACFL,QAAAA,OAAO,IAAIE,IAAI,CAACQ,KAAK,IAAI,CAAC;AAC1BT,QAAAA,MAAM,IAAIC,IAAI,CAACQ,KAAK,IAAI,CAAC;AAC3B,MAAA;AACF,IAAA,CAAC,CAAC;IAEF,OAAO;MAAEZ,aAAa;AAAEC,MAAAA;KAAe;AACzC,EAAA,CAAC,MAAM;AACL;AACA,IAAA,MAAMe,QAAQ,GAAGjE,gBAAgB,CAACiC,OAAO,CAAC;AAC1C,IAAA,MAAMiC,OAAO,GAAGlE,gBAAgB,CAACkC,MAAM,CAAC;AACxC,IAAA,OAAOG,gBAAgB,CAAC4B,QAAQ,EAAEC,OAAO,CAAC;AAC5C,EAAA;AACF;;ACrJA,SAAS7B,gBAAgBA,CAAC8B,IAAY,EAAEC,GAAW,EAAA;EACjD,MAAMC,UAAU,GAAG9B,eAAI,CAACE,SAAS,CAAC0B,IAAI,EAAEC,GAAG,CAAC;EAC5C,MAAMnB,aAAa,GAAU,EAAE;EAC/B,MAAMC,aAAa,GAAU,EAAE;AAC/B,EAAA,KAAK,MAAMG,IAAI,IAAIgB,UAAU,EAAE;IAC7B,IAAIhB,IAAI,CAACS,OAAO,EAAE;AAChBb,MAAAA,aAAa,CAACrB,IAAI,CAChB6B,cAAA,CAAA,MAAA,EAAA;AAAiCC,QAAAA,SAAS,EAAC,cAAc;QAAAE,QAAA,EACtDP,IAAI,CAAC5D;AAAK,OAAA,EADFwD,aAAa,CAACqB,MAAM,CAExB,CACR;AACH,IAAA,CAAC,MAAM,IAAIjB,IAAI,CAACC,KAAK,EAAE;AACrBJ,MAAAA,aAAa,CAACtB,IAAI,CAChB6B,cAAA,CAAA,MAAA,EAAA;AAAiCC,QAAAA,SAAS,EAAC,YAAY;QAAAE,QAAA,EACpDP,IAAI,CAAC5D;AAAK,OAAA,EADFyD,aAAa,CAACoB,MAAM,CAExB,CACR;AACH,IAAA,CAAC,MAAM;AACLrB,MAAAA,aAAa,CAACrB,IAAI,CAChB6B,cAAA,CAAA,MAAA,EAAA;AAAiCC,QAAAA,SAAS,EAAC,gBAAgB;QAAAE,QAAA,EACxDP,IAAI,CAAC5D;AAAK,OAAA,EADFwD,aAAa,CAACqB,MAAM,CAExB,CACR;AACDpB,MAAAA,aAAa,CAACtB,IAAI,CAChB6B,cAAA,CAAA,MAAA,EAAA;AAAiCC,QAAAA,SAAS,EAAC,gBAAgB;QAAAE,QAAA,EACxDP,IAAI,CAAC5D;AAAK,OAAA,EADFyD,aAAa,CAACoB,MAAM,CAExB,CACR;AACH,IAAA;AACF,EAAA;EACA,OAAO;IAAErB,aAAa;AAAEC,IAAAA;GAAe;AACzC;AAEA,SAASqB,eAAeA,CAACC,QAAkB,EAAEC,QAAkB,EAAA;AAC7D,EAAA,MAAMC,SAAS,GAAGC,IAAI,CAACC,GAAG,CAACJ,QAAQ,CAACF,MAAM,EAAEG,QAAQ,CAACH,MAAM,CAAC;EAC5D,MAAMrB,aAAa,GAAU,EAAE;EAC/B,MAAMC,aAAa,GAAU,EAAE;EAC/B,KAAK,IAAIM,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGkB,SAAS,EAAElB,CAAC,EAAE,EAAE;AAClC,IAAA,MAAMW,IAAI,GAAGK,QAAQ,CAAChB,CAAC,CAAC,IAAI,EAAE;AAC9B,IAAA,MAAMY,GAAG,GAAGK,QAAQ,CAACjB,CAAC,CAAC,IAAI,EAAE;IAC7B,IAAIW,IAAI,KAAKC,GAAG,EAAE;AAChBnB,MAAAA,aAAa,CAACrB,IAAI,CAChB6B,cAAA,CAAA,KAAA,EAAA;AAAuBC,QAAAA,SAAS,EAAC,qBAAqB;AAAAE,QAAAA,QAAA,EAAEO;SAA9C,CAAA,KAAA,EAAQX,CAAC,CAAA,CAAE,CAA8C,CACpE;AACDN,MAAAA,aAAa,CAACtB,IAAI,CAChB6B,cAAA,CAAA,KAAA,EAAA;AAAsBC,QAAAA,SAAS,EAAC,qBAAqB;AAAAE,QAAAA,QAAA,EAAEQ;SAA7C,CAAA,IAAA,EAAOZ,CAAC,CAAA,CAAE,CAA6C,CAClE;AACH,IAAA,CAAC,MAAM;AACLP,MAAAA,aAAa,CAACrB,IAAI,CAChB6B,cAAA,CAAA,KAAA,EAAA;AAAuBC,QAAAA,SAAS,EAAES,IAAI,GAAG,mBAAmB,GAAG,iBAAiB;AAAAP,QAAAA,QAAA,EAAGO;AAAI,OAAA,EAA7E,CAAA,KAAA,EAAQX,CAAC,CAAA,CAAE,CAAyE,CAC/F;AACDN,MAAAA,aAAa,CAACtB,IAAI,CAChB6B,cAAA,CAAA,KAAA,EAAA;AAAsBC,QAAAA,SAAS,EAAEU,GAAG,GAAG,iBAAiB,GAAG,iBAAiB;AAAAR,QAAAA,QAAA,EAAGQ;AAAG,OAAA,EAAxE,CAAA,IAAA,EAAOZ,CAAC,CAAA,CAAE,CAAqE,CAC1F;AACH,IAAA;AACF,EAAA;EACA,OAAO;IAAEP,aAAa;AAAEC,IAAAA;GAAe;AACzC;AAWO,MAAM2B,OAAO,GAA2BA,CAAC;EAC9CL,QAAQ;EACRC,QAAQ;AACRf,EAAAA,SAAS,GAAG,EAAE;AACdoB,EAAAA,QAAQ,GAAG,cAAc;AACzB1C,EAAAA,aAAa,GAAG,IAAI;AACpBD,EAAAA,WAAW,GAAG;AAAM,CACrB,KAAI;EACH,MAAM4C,kBAAkB,GAAG,OAAOP,QAAQ,KAAK,QAAQ,IAAI,OAAOC,QAAQ,KAAK,QAAQ;AACvF,EAAA,MAAMO,iBAAiB,GAAGnF,KAAK,CAACC,OAAO,CAAC0E,QAAQ,CAAC,IAAI3E,KAAK,CAACC,OAAO,CAAC2E,QAAQ,CAAC;EAC5E,MAAMQ,sBAAsB,GAAGzF,oBAAoB,CAACgF,QAAQ,CAAC,IAAIhF,oBAAoB,CAACiF,QAAQ,CAAC;EAE/F,MAAM,CAACS,eAAe,EAAEC,kBAAkB,CAAC,GAAGC,cAAQ,CAAwD,IAAI,CAAC;AAEnHC,EAAAA,eAAS,CAAC,MAAK;IACb,IAAIC,SAAS,GAAG,KAAK;AACrB,IAAA,IAAIL,sBAAsB,EAAE;AAC1BE,MAAAA,kBAAkB,CAAC,IAAI,CAAC,CAAC;AACzBnD,MAAAA,oBAAoB,CAClBwC,QAAoB,EACpBC,QAAoB,EACpBtC,WAAW,EACXC,aAAa,EACbC,gBAAgB,CACjB,CAACkD,IAAI,CAAC/E,MAAM,IAAG;AACd,QAAA,IAAI,CAAC8E,SAAS,EAAEH,kBAAkB,CAAC3E,MAAM,CAAC;AAC5C,MAAA,CAAC,CAAC;AACJ,IAAA;AACA,IAAA,OAAO,MAAK;AAAG8E,MAAAA,SAAS,GAAG,IAAI;IAAE,CAAC;AAClC;AACF,EAAA,CAAC,EAAE,CAACd,QAAQ,EAAEC,QAAQ,EAAEtC,WAAW,EAAEC,aAAa,EAAE6C,sBAAsB,CAAC,CAAC;EAE5E,IAAIhC,aAAa,GAAU,EAAE;AAAEC,IAAAA,aAAa,GAAU,EAAE;AACxD,EAAA,IAAI6B,kBAAkB,EAAE;IACtB,CAAC;MAAE9B,aAAa;AAAEC,MAAAA;AAAa,KAAE,GAAGb,gBAAgB,CAACmC,QAAkB,EAAEC,QAAkB,CAAC;EAC9F,CAAC,MAAM,IAAIO,iBAAiB,EAAE;IAC5B,CAAC;MAAE/B,aAAa;AAAEC,MAAAA;AAAa,KAAE,GAAGqB,eAAe,CAACC,QAAoB,EAAEC,QAAoB,CAAC;EACjG,CAAC,MAAM,IAAIQ,sBAAsB,EAAE;AACjC,IAAA,IAAIC,eAAe,EAAE;MACnBjC,aAAa,GAAGiC,eAAe,CAACjC,aAAa;MAC7CC,aAAa,GAAGgC,eAAe,CAAChC,aAAa;AAC/C,IAAA,CAAC,MAAM;AACLD,MAAAA,aAAa,GAAG,CAACQ,cAAA,CAAA,KAAA,EAAA;AAAAG,QAAAA,QAAA,EAAA;OAAA,EAAS,SAAS,CAAiB,CAAC;AACrDV,MAAAA,aAAa,GAAG,CAACO,cAAA,CAAA,KAAA,EAAA;AAAAG,QAAAA,QAAA,EAAA;OAAA,EAAS,SAAS,CAAiB,CAAC;AACvD,IAAA;AACF,EAAA;EAEA,IACE,CAACmB,kBAAkB,IACnB,CAACC,iBAAiB,IAClB,CAACC,sBAAsB,EACvB;IACA,OACExB;MAAKC,SAAS,EAAE,CAAA,cAAA,EAAiBA,SAAS,CAAA,CAAE;AAAAE,MAAAA,QAAA,EAAA;AAAA,KAAA,CAEtC;AAEV,EAAA;EAEA,IAAIkB,QAAQ,KAAK,QAAQ,EAAE;IACzB,OACErB,cAAA,CAAA,KAAA,EAAA;MAAKC,SAAS,EAAE,CAAA,eAAA,EAAkBA,SAAS,CAAA,CAAE;AAAAE,MAAAA,QAAA,EAC3CD,eAAA,CAAA,KAAA,EAAA;AAAKD,QAAAA,SAAS,EAAC,iBAAiB;mBAC7BT,aAAa,EACbC,aAAa;OAAA;AACV,KAAA,CACF;AAEV,EAAA;EAGA,OACES;IAAKD,SAAS,EAAE,CAAA,qBAAA,EAAwBA,SAAS,CAAA,CAAE;AAAAE,IAAAA,QAAA,EAAA,CACjDD,eAAA,CAAA,KAAA,EAAA;AAAKD,MAAAA,SAAS,EAAC,eAAe;AAAAE,MAAAA,QAAA,EAAA,CAC5BH,cAAA,CAAA,KAAA,EAAA;AAAKC,QAAAA,SAAS,EAAC,gCAAgC;;QAAe,EAC9DD,cAAA,CAAA,KAAA,EAAA;AAAKC,QAAAA,SAAS,EAAC,kCAAkC;AAAAE,QAAAA,QAAA,EAC9CX;AAAa,OAAA,CACV;AAAA,KAAA,CACF,EACNU,eAAA,CAAA,KAAA,EAAA;AAAKD,MAAAA,SAAS,EAAC,eAAe;AAAAE,MAAAA,QAAA,EAAA,CAC5BH,cAAA,CAAA,KAAA,EAAA;AAAKC,QAAAA,SAAS,EAAC,gCAAgC;;QAAe,EAC9DD,cAAA,CAAA,KAAA,EAAA;AAAKC,QAAAA,SAAS,EAAC,kCAAkC;AAAAE,QAAAA,QAAA,EAC9CV;AAAa,OAAA,CACV;AAAA,KAAA,CACF;AAAA,GAAA,CACF;AAEV;;;;;"}
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/components/contentfulDiff.tsx","../../src/components/Compare.tsx"],"sourcesContent":["import React from 'react';\nimport { BLOCKS, Document, Block, Inline, Text } from '@contentful/rich-text-types';\n\n// Exported type guard for Contentful documents\nexport function isContentfulDocument(value: any): value is Document {\n return (\n value &&\n typeof value === 'object' &&\n value.nodeType === BLOCKS.DOCUMENT &&\n Array.isArray(value.content)\n );\n}\n\n// Extract plain text from Contentful document\nexport function extractPlainText(document: Document): string {\n const extractFromNode = (node: Block | Inline | Text): string => {\n if (node.nodeType === 'text') {\n return (node as Text).value;\n }\n if ('content' in node && node.content) {\n return node.content.map(child => extractFromNode(child)).join('');\n }\n return '';\n };\n return extractFromNode(document);\n}\n\n// Extract structured content for structure diff\nexport function extractStructuredContent(document: Document): Array<{ type: string; content: string; level?: number }> {\n const result: Array<{ type: string; content: string; level?: number }> = [];\n const extractFromNode = (node: Block | Inline | Text): void => {\n if (node.nodeType === 'text') return;\n if ('content' in node && node.content) {\n const textContent = node.content.map(child =>\n child.nodeType === 'text' ? (child as Text).value : ''\n ).join('');\n let displayType: string = node.nodeType;\n let headingLevel: number | undefined;\n switch (node.nodeType) {\n case BLOCKS.HEADING_1: displayType = 'Heading'; headingLevel = 1; break;\n case BLOCKS.HEADING_2: displayType = 'Heading'; headingLevel = 2; break;\n case BLOCKS.HEADING_3: displayType = 'Heading'; headingLevel = 3; break;\n case BLOCKS.HEADING_4: displayType = 'Heading'; headingLevel = 4; break;\n case BLOCKS.HEADING_5: displayType = 'Heading'; headingLevel = 5; break;\n case BLOCKS.HEADING_6: displayType = 'Heading'; headingLevel = 6; break;\n case BLOCKS.PARAGRAPH: displayType = 'Text'; break;\n case BLOCKS.UL_LIST: displayType = 'List'; break;\n case BLOCKS.OL_LIST: displayType = 'Numbered List'; break;\n case BLOCKS.LIST_ITEM: displayType = 'List Item'; break;\n case BLOCKS.QUOTE: displayType = 'Quote'; break;\n case BLOCKS.TABLE: displayType = 'Table'; break;\n default: displayType = node.nodeType.charAt(0).toUpperCase() + node.nodeType.slice(1);\n }\n if (textContent.trim()) {\n result.push({ type: displayType, content: textContent.trim(), level: headingLevel });\n }\n node.content.forEach(child => {\n if (child.nodeType !== 'text') extractFromNode(child);\n });\n }\n };\n if (document.content) document.content.forEach(node => extractFromNode(node));\n return result;\n}\n\n// Main Contentful diff renderer\nexport async function renderContentfulDiff(\n origDoc: Document,\n modDoc: Document,\n compareMode: 'text' | 'structure',\n caseSensitive: boolean,\n renderStringDiff: (a: string, b: string) => { originalParts: any[]; modifiedParts: any[] }\n) {\n // Dynamically import diff for Vite/ESM compatibility\n const DiffModule = await import('diff');\n const Diff = DiffModule.default ?? DiffModule;\n const { diffWords, diffArrays } = Diff;\n\n if (compareMode === 'structure') {\n const origStructure = extractStructuredContent(origDoc);\n const modStructure = extractStructuredContent(modDoc);\n\n const diff = diffArrays(\n origStructure,\n modStructure,\n {\n comparator: (a: any, b: any) =>\n a.type === b.type &&\n a.content === b.content &&\n a.level === b.level\n }\n );\n\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n\n let origIdx = 0;\n let modIdx = 0;\n\n diff.forEach((part: any) => {\n if (part.added) {\n part.value.forEach((modItem: any, i: number) => {\n originalParts.push(\n <div key={`blank-orig-${modIdx + i}`} className=\"diff-blank-line\" />\n );\n modifiedParts.push(\n <div key={`added-mod-${modIdx + i}`} className=\"diff-added-line\">\n <span className=\"diff-structure-type\">{modItem.type}</span>\n {modItem.level && <span className=\"diff-structure-level\"> H{modItem.level}</span>}\n <span className=\"diff-structure-content\">: {modItem.content}</span>\n </div>\n );\n });\n modIdx += part.count || 0;\n } else if (part.removed) {\n part.value.forEach((origItem: any, i: number) => {\n originalParts.push(\n <div key={`removed-orig-${origIdx + i}`} className=\"diff-removed-line\">\n <span className=\"diff-structure-type\">{origItem.type}</span>\n {origItem.level && <span className=\"diff-structure-level\"> H{origItem.level}</span>}\n <span className=\"diff-structure-content\">: {origItem.content}</span>\n </div>\n );\n modifiedParts.push(\n <div key={`blank-mod-${origIdx + i}`} className=\"diff-blank-line\" />\n );\n });\n origIdx += part.count || 0;\n } else {\n part.value.forEach((item: any, i: number) => {\n originalParts.push(\n <div key={`unchanged-orig-${origIdx + i}`} className=\"diff-unchanged-line\">\n <span className=\"diff-structure-type\">{item.type}</span>\n {item.level && <span className=\"diff-structure-level\"> H{item.level}</span>}\n <span className=\"diff-structure-content\">: {item.content}</span>\n </div>\n );\n modifiedParts.push(\n <div key={`unchanged-mod-${modIdx + i}`} className=\"diff-unchanged-line\">\n <span className=\"diff-structure-type\">{item.type}</span>\n {item.level && <span className=\"diff-structure-level\"> H{item.level}</span>}\n <span className=\"diff-structure-content\">: {item.content}</span>\n </div>\n );\n });\n origIdx += part.count || 0;\n modIdx += part.count || 0;\n }\n });\n\n return { originalParts, modifiedParts };\n } else {\n // Text-based comparison of Contentful documents\n const origText = extractPlainText(origDoc);\n const modText = extractPlainText(modDoc);\n return renderStringDiff(origText, modText);\n }\n}","import React, { useEffect, useState } from 'react';\nimport { Document } from '@contentful/rich-text-types';\nimport {\n isContentfulDocument,\n renderContentfulDiff\n} from './contentfulDiff';\nimport * as Diff from 'diff';\n\nfunction renderStringDiff(orig: string, mod: string) {\n const difference = Diff.diffWords(orig, mod);\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n for (const part of difference) {\n if (part.removed) {\n originalParts.push(\n <span key={originalParts.length} className=\"diff-removed\">\n {part.value}\n </span>\n );\n } else if (part.added) {\n modifiedParts.push(\n <span key={modifiedParts.length} className=\"diff-added\">\n {part.value}\n </span>\n );\n } else {\n originalParts.push(\n <span key={originalParts.length} className=\"diff-unchanged\">\n {part.value}\n </span>\n );\n modifiedParts.push(\n <span key={modifiedParts.length} className=\"diff-unchanged\">\n {part.value}\n </span>\n );\n }\n }\n return { originalParts, modifiedParts };\n}\n\nfunction renderArrayDiff(original: string[], modified: string[]) {\n const maxLength = Math.max(original.length, modified.length);\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n for (let i = 0; i < maxLength; i++) {\n const orig = original[i] ?? '';\n const mod = modified[i] ?? '';\n if (orig === mod) {\n originalParts.push(\n <div key={`orig-${i}`} className=\"diff-unchanged-line\">{orig}</div>\n );\n modifiedParts.push(\n <div key={`mod-${i}`} className=\"diff-unchanged-line\">{mod}</div>\n );\n } else {\n originalParts.push(\n <div key={`orig-${i}`} className={orig ? \"diff-removed-line\" : \"diff-blank-line\"}>{orig}</div>\n );\n modifiedParts.push(\n <div key={`mod-${i}`} className={mod ? \"diff-added-line\" : \"diff-blank-line\"}>{mod}</div>\n );\n }\n }\n return { originalParts, modifiedParts };\n}\n\nexport interface CompareProps {\n original: string | string[] | Document;\n modified: string | string[] | Document;\n className?: string;\n viewMode?: 'side-by-side' | 'inline';\n caseSensitive?: boolean;\n compareMode?: 'text' | 'structure';\n}\n\nexport const Compare: React.FC<CompareProps> = ({\n original,\n modified,\n className = '',\n viewMode = 'side-by-side',\n caseSensitive = true,\n compareMode = 'text',\n}) => {\n const isStringComparison = typeof original === 'string' && typeof modified === 'string';\n const isArrayComparison = Array.isArray(original) && Array.isArray(modified);\n const isContentfulComparison = isContentfulDocument(original) && isContentfulDocument(modified);\n\n const [contentfulParts, setContentfulParts] = useState<{ originalParts: any[]; modifiedParts: any[] } | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n if (isContentfulComparison) {\n setContentfulParts(null); // reset while loading\n renderContentfulDiff(\n original as Document,\n modified as Document,\n compareMode,\n caseSensitive,\n renderStringDiff\n ).then(result => {\n if (!cancelled) setContentfulParts(result);\n });\n }\n return () => { cancelled = true; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [original, modified, compareMode, caseSensitive, isContentfulComparison]);\n\n let originalParts: any[] = [], modifiedParts: any[] = [];\n if (isStringComparison) {\n ({ originalParts, modifiedParts } = renderStringDiff(original as string, modified as string));\n } else if (isArrayComparison) {\n ({ originalParts, modifiedParts } = renderArrayDiff(original as string[], modified as string[]));\n } else if (isContentfulComparison) {\n if (contentfulParts) {\n originalParts = contentfulParts.originalParts;\n modifiedParts = contentfulParts.modifiedParts;\n } else {\n originalParts = [<div key=\"loading\">Loading...</div>];\n modifiedParts = [<div key=\"loading\">Loading...</div>];\n }\n }\n\n if (\n !isStringComparison &&\n !isArrayComparison &&\n !isContentfulComparison\n ) {\n return (\n <div className={`compare-error ${className}`}>\n Error: Invalid input for comparison.\n </div>\n );\n }\n\n if (viewMode === 'inline') {\n return (\n <div className={`compare-inline ${className}`}>\n <div className=\"compare-content\">\n {originalParts}\n {modifiedParts}\n </div>\n </div>\n );\n }\n \n\n return (\n <div className={`compare-side-by-side ${className}`}>\n <div className=\"compare-panel\">\n <div className=\"compare-header original-header\">Original</div>\n <div className=\"compare-content original-content\">\n {originalParts}\n </div>\n </div>\n <div className=\"compare-panel\">\n <div className=\"compare-header modified-header\">Modified</div>\n <div className=\"compare-content modified-content\">\n {modifiedParts}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Compare;"],"names":["isContentfulDocument","value","nodeType","BLOCKS","DOCUMENT","Array","isArray","content","extractPlainText","document","extractFromNode","node","map","child","join","extractStructuredContent","result","textContent","displayType","headingLevel","HEADING_1","HEADING_2","HEADING_3","HEADING_4","HEADING_5","HEADING_6","PARAGRAPH","UL_LIST","OL_LIST","LIST_ITEM","QUOTE","TABLE","charAt","toUpperCase","slice","trim","push","type","level","forEach","renderContentfulDiff","origDoc","modDoc","compareMode","caseSensitive","renderStringDiff","DiffModule","Diff","default","diffWords","diffArrays","origStructure","modStructure","diff","comparator","a","b","originalParts","modifiedParts","origIdx","modIdx","part","added","modItem","i","_jsx","className","_jsxs","children","count","removed","origItem","item","origText","modText","orig","mod","difference","length","renderArrayDiff","original","modified","maxLength","Math","max","Compare","viewMode","isStringComparison","isArrayComparison","isContentfulComparison","contentfulParts","setContentfulParts","useState","useEffect","cancelled","then"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/contentfulDiff.tsx","../../../src/components/Compare.tsx"],"sourcesContent":["import React from 'react';\nimport { BLOCKS, Document, Block, Inline, Text } from '@contentful/rich-text-types';\n\n// Exported type guard for Contentful documents\nexport function isContentfulDocument(value: any): value is Document {\n return (\n value &&\n typeof value === 'object' &&\n value.nodeType === BLOCKS.DOCUMENT &&\n Array.isArray(value.content)\n );\n}\n\n// Extract plain text from Contentful document\nexport function extractPlainText(document: Document): string {\n const extractFromNode = (node: Block | Inline | Text): string => {\n if (node.nodeType === 'text') {\n return (node as Text).value;\n }\n if ('content' in node && node.content) {\n return node.content.map(child => extractFromNode(child)).join('');\n }\n return '';\n };\n return extractFromNode(document);\n}\n\n// Extract structured content for structure diff\nexport function extractStructuredContent(document: Document): Array<{ type: string; content: string; level?: number }> {\n const result: Array<{ type: string; content: string; level?: number }> = [];\n const extractFromNode = (node: Block | Inline | Text): void => {\n if (node.nodeType === 'text') return;\n if ('content' in node && node.content) {\n const textContent = node.content.map(child =>\n child.nodeType === 'text' ? (child as Text).value : ''\n ).join('');\n let displayType: string = node.nodeType;\n let headingLevel: number | undefined;\n switch (node.nodeType) {\n case BLOCKS.HEADING_1: displayType = 'Heading'; headingLevel = 1; break;\n case BLOCKS.HEADING_2: displayType = 'Heading'; headingLevel = 2; break;\n case BLOCKS.HEADING_3: displayType = 'Heading'; headingLevel = 3; break;\n case BLOCKS.HEADING_4: displayType = 'Heading'; headingLevel = 4; break;\n case BLOCKS.HEADING_5: displayType = 'Heading'; headingLevel = 5; break;\n case BLOCKS.HEADING_6: displayType = 'Heading'; headingLevel = 6; break;\n case BLOCKS.PARAGRAPH: displayType = 'Text'; break;\n case BLOCKS.UL_LIST: displayType = 'List'; break;\n case BLOCKS.OL_LIST: displayType = 'Numbered List'; break;\n case BLOCKS.LIST_ITEM: displayType = 'List Item'; break;\n case BLOCKS.QUOTE: displayType = 'Quote'; break;\n case BLOCKS.TABLE: displayType = 'Table'; break;\n default: displayType = node.nodeType.charAt(0).toUpperCase() + node.nodeType.slice(1);\n }\n if (textContent.trim()) {\n result.push({ type: displayType, content: textContent.trim(), level: headingLevel });\n }\n node.content.forEach(child => {\n if (child.nodeType !== 'text') extractFromNode(child);\n });\n }\n };\n if (document.content) document.content.forEach(node => extractFromNode(node));\n return result;\n}\n\n// Main Contentful diff renderer\nexport async function renderContentfulDiff(\n origDoc: Document,\n modDoc: Document,\n compareMode: 'text' | 'structure',\n caseSensitive: boolean,\n renderStringDiff: (a: string, b: string) => { originalParts: any[]; modifiedParts: any[] }\n) {\n // Dynamically import diff for Vite/ESM compatibility\n const DiffModule = await import('diff');\n const Diff = DiffModule.default ?? DiffModule;\n const { diffWords, diffArrays } = Diff;\n\n if (compareMode === 'structure') {\n const origStructure = extractStructuredContent(origDoc);\n const modStructure = extractStructuredContent(modDoc);\n\n const diff = diffArrays(\n origStructure,\n modStructure,\n {\n comparator: (a: any, b: any) =>\n a.type === b.type &&\n a.content === b.content &&\n a.level === b.level\n }\n );\n\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n\n let origIdx = 0;\n let modIdx = 0;\n\n diff.forEach((part: any) => {\n if (part.added) {\n part.value.forEach((modItem: any, i: number) => {\n originalParts.push(\n <div key={`blank-orig-${modIdx + i}`} className=\"diff-blank-line\" />\n );\n modifiedParts.push(\n <div key={`added-mod-${modIdx + i}`} className=\"diff-added-line\">\n <span className=\"diff-structure-type\">{modItem.type}</span>\n {modItem.level && <span className=\"diff-structure-level\"> H{modItem.level}</span>}\n <span className=\"diff-structure-content\">: {modItem.content}</span>\n </div>\n );\n });\n modIdx += part.count || 0;\n } else if (part.removed) {\n part.value.forEach((origItem: any, i: number) => {\n originalParts.push(\n <div key={`removed-orig-${origIdx + i}`} className=\"diff-removed-line\">\n <span className=\"diff-structure-type\">{origItem.type}</span>\n {origItem.level && <span className=\"diff-structure-level\"> H{origItem.level}</span>}\n <span className=\"diff-structure-content\">: {origItem.content}</span>\n </div>\n );\n modifiedParts.push(\n <div key={`blank-mod-${origIdx + i}`} className=\"diff-blank-line\" />\n );\n });\n origIdx += part.count || 0;\n } else {\n part.value.forEach((item: any, i: number) => {\n originalParts.push(\n <div key={`unchanged-orig-${origIdx + i}`} className=\"diff-unchanged-line\">\n <span className=\"diff-structure-type\">{item.type}</span>\n {item.level && <span className=\"diff-structure-level\"> H{item.level}</span>}\n <span className=\"diff-structure-content\">: {item.content}</span>\n </div>\n );\n modifiedParts.push(\n <div key={`unchanged-mod-${modIdx + i}`} className=\"diff-unchanged-line\">\n <span className=\"diff-structure-type\">{item.type}</span>\n {item.level && <span className=\"diff-structure-level\"> H{item.level}</span>}\n <span className=\"diff-structure-content\">: {item.content}</span>\n </div>\n );\n });\n origIdx += part.count || 0;\n modIdx += part.count || 0;\n }\n });\n\n return { originalParts, modifiedParts };\n } else {\n // Text-based comparison of Contentful documents\n const origText = extractPlainText(origDoc);\n const modText = extractPlainText(modDoc);\n return renderStringDiff(origText, modText);\n }\n}","import React, { useEffect, useState } from 'react';\nimport { Document } from '@contentful/rich-text-types';\nimport {\n isContentfulDocument,\n renderContentfulDiff\n} from './contentfulDiff';\nimport * as Diff from 'diff';\n\nfunction renderStringDiff(orig: string, mod: string) {\n const difference = Diff.diffWords(orig, mod);\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n for (const part of difference) {\n if (part.removed) {\n originalParts.push(\n <span key={originalParts.length} className=\"diff-removed\">\n {part.value}\n </span>\n );\n } else if (part.added) {\n modifiedParts.push(\n <span key={modifiedParts.length} className=\"diff-added\">\n {part.value}\n </span>\n );\n } else {\n originalParts.push(\n <span key={originalParts.length} className=\"diff-unchanged\">\n {part.value}\n </span>\n );\n modifiedParts.push(\n <span key={modifiedParts.length} className=\"diff-unchanged\">\n {part.value}\n </span>\n );\n }\n }\n return { originalParts, modifiedParts };\n}\n\nfunction renderArrayDiff(original: string[], modified: string[]) {\n const maxLength = Math.max(original.length, modified.length);\n const originalParts: any[] = [];\n const modifiedParts: any[] = [];\n for (let i = 0; i < maxLength; i++) {\n const orig = original[i] ?? '';\n const mod = modified[i] ?? '';\n if (orig === mod) {\n originalParts.push(\n <div key={`orig-${i}`} className=\"diff-unchanged-line\">{orig}</div>\n );\n modifiedParts.push(\n <div key={`mod-${i}`} className=\"diff-unchanged-line\">{mod}</div>\n );\n } else {\n originalParts.push(\n <div key={`orig-${i}`} className={orig ? \"diff-removed-line\" : \"diff-blank-line\"}>{orig}</div>\n );\n modifiedParts.push(\n <div key={`mod-${i}`} className={mod ? \"diff-added-line\" : \"diff-blank-line\"}>{mod}</div>\n );\n }\n }\n return { originalParts, modifiedParts };\n}\n\nexport interface CompareProps {\n original: string | string[] | Document;\n modified: string | string[] | Document;\n className?: string;\n viewMode?: 'side-by-side' | 'inline';\n caseSensitive?: boolean;\n compareMode?: 'text' | 'structure';\n}\n\nexport const Compare: React.FC<CompareProps> = ({\n original,\n modified,\n className = '',\n viewMode = 'side-by-side',\n caseSensitive = true,\n compareMode = 'text',\n}) => {\n const isStringComparison = typeof original === 'string' && typeof modified === 'string';\n const isArrayComparison = Array.isArray(original) && Array.isArray(modified);\n const isContentfulComparison = isContentfulDocument(original) && isContentfulDocument(modified);\n\n const [contentfulParts, setContentfulParts] = useState<{ originalParts: any[]; modifiedParts: any[] } | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n if (isContentfulComparison) {\n setContentfulParts(null); // reset while loading\n renderContentfulDiff(\n original as Document,\n modified as Document,\n compareMode,\n caseSensitive,\n renderStringDiff\n ).then(result => {\n if (!cancelled) setContentfulParts(result);\n });\n }\n return () => { cancelled = true; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [original, modified, compareMode, caseSensitive, isContentfulComparison]);\n\n let originalParts: any[] = [], modifiedParts: any[] = [];\n if (isStringComparison) {\n ({ originalParts, modifiedParts } = renderStringDiff(original as string, modified as string));\n } else if (isArrayComparison) {\n ({ originalParts, modifiedParts } = renderArrayDiff(original as string[], modified as string[]));\n } else if (isContentfulComparison) {\n if (contentfulParts) {\n originalParts = contentfulParts.originalParts;\n modifiedParts = contentfulParts.modifiedParts;\n } else {\n originalParts = [<div key=\"loading\">Loading...</div>];\n modifiedParts = [<div key=\"loading\">Loading...</div>];\n }\n }\n\n if (\n !isStringComparison &&\n !isArrayComparison &&\n !isContentfulComparison\n ) {\n return (\n <div className={`compare-error ${className}`}>\n Error: Invalid input for comparison.\n </div>\n );\n }\n\n if (viewMode === 'inline') {\n return (\n <div className={`compare-inline ${className}`}>\n <div className=\"compare-content\">\n {originalParts}\n {modifiedParts}\n </div>\n </div>\n );\n }\n \n\n return (\n <div className={`compare-side-by-side ${className}`}>\n <div className=\"compare-panel\">\n <div className=\"compare-header original-header\">Original</div>\n <div className=\"compare-content original-content\">\n {originalParts}\n </div>\n </div>\n <div className=\"compare-panel\">\n <div className=\"compare-header modified-header\">Modified</div>\n <div className=\"compare-content modified-content\">\n {modifiedParts}\n </div>\n </div>\n </div>\n );\n};\n\nexport default Compare;"],"names":["isContentfulDocument","value","nodeType","BLOCKS","DOCUMENT","Array","isArray","content","extractPlainText","document","extractFromNode","node","map","child","join","extractStructuredContent","result","textContent","displayType","headingLevel","HEADING_1","HEADING_2","HEADING_3","HEADING_4","HEADING_5","HEADING_6","PARAGRAPH","UL_LIST","OL_LIST","LIST_ITEM","QUOTE","TABLE","charAt","toUpperCase","slice","trim","push","type","level","forEach","renderContentfulDiff","origDoc","modDoc","compareMode","caseSensitive","renderStringDiff","DiffModule","Diff","default","diffWords","diffArrays","origStructure","modStructure","diff","comparator","a","b","originalParts","modifiedParts","origIdx","modIdx","part","added","modItem","i","_jsx","className","_jsxs","children","count","removed","origItem","item","origText","modText","orig","mod","difference","length","renderArrayDiff","original","modified","maxLength","Math","max","Compare","viewMode","isStringComparison","isArrayComparison","isContentfulComparison","contentfulParts","setContentfulParts","useState","useEffect","cancelled","then"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crashbytes/react-version-compare",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "A React component for comparing strings and arrays with precise word-level and item-level highlighting of differences.",
|
|
5
5
|
"main": "dist/cjs/index.js",
|
|
6
6
|
"module": "dist/esm/index.js",
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
"test": "jest --no-coverage",
|
|
19
19
|
"test:coverage": "jest --coverage",
|
|
20
20
|
"test:watch": "jest --watch",
|
|
21
|
+
"coverage:report": "jest --coverage && open coverage/lcov-report/index.html",
|
|
22
|
+
"coverage:deploy": "npm run test:coverage && gh-pages -d coverage/lcov-report -e coverage",
|
|
21
23
|
"clean": "rm -rf dist",
|
|
22
24
|
"prepublishOnly": "npm run clean && npm run build",
|
|
23
25
|
"lint": "eslint src --ext .ts,.tsx",
|
|
@@ -27,7 +29,9 @@
|
|
|
27
29
|
"storybook": "storybook dev -p 6006",
|
|
28
30
|
"build-storybook": "storybook build",
|
|
29
31
|
"storybook:build": "storybook build",
|
|
30
|
-
"storybook:deploy": "
|
|
32
|
+
"storybook:deploy": "npm run build-storybook && gh-pages -d storybook-static",
|
|
33
|
+
"deploy:all": "npm run test:coverage && npm run build-storybook && npm run deploy:combined",
|
|
34
|
+
"deploy:combined": "node scripts/deploy-gh-pages.js"
|
|
31
35
|
},
|
|
32
36
|
"keywords": [
|
|
33
37
|
"react",
|
|
@@ -56,42 +60,42 @@
|
|
|
56
60
|
"react-dom": ">=16.8.0"
|
|
57
61
|
},
|
|
58
62
|
"dependencies": {
|
|
59
|
-
"@contentful/rich-text-types": "^17.
|
|
60
|
-
"diff": "^8.0.
|
|
63
|
+
"@contentful/rich-text-types": "^17.2.5",
|
|
64
|
+
"diff": "^8.0.3",
|
|
61
65
|
"tslib": "^2.8.1"
|
|
62
66
|
},
|
|
63
67
|
"devDependencies": {
|
|
64
|
-
"@babel/core": "^7.
|
|
65
|
-
"@babel/preset-env": "^7.
|
|
66
|
-
"@babel/preset-react": "^7.
|
|
67
|
-
"@babel/preset-typescript": "^7.
|
|
68
|
-
"@rollup/plugin-babel": "^6.0
|
|
69
|
-
"@rollup/plugin-commonjs": "^
|
|
70
|
-
"@rollup/plugin-node-resolve": "^16.0.
|
|
71
|
-
"@rollup/plugin-typescript": "^12.
|
|
72
|
-
"@storybook/addon-docs": "^
|
|
73
|
-
"@storybook/addon-onboarding": "^
|
|
74
|
-
"@storybook/react-vite": "^
|
|
75
|
-
"@testing-library/jest-dom": "^6.1
|
|
76
|
-
"@testing-library/react": "^
|
|
77
|
-
"@testing-library/user-event": "^14.
|
|
78
|
-
"@types/jest": "^
|
|
79
|
-
"@types/react": "^
|
|
80
|
-
"@types/react-dom": "^
|
|
81
|
-
"@vitejs/plugin-react": "^
|
|
82
|
-
"babel-jest": "^
|
|
68
|
+
"@babel/core": "^7.29.0",
|
|
69
|
+
"@babel/preset-env": "^7.29.0",
|
|
70
|
+
"@babel/preset-react": "^7.28.5",
|
|
71
|
+
"@babel/preset-typescript": "^7.28.5",
|
|
72
|
+
"@rollup/plugin-babel": "^6.1.0",
|
|
73
|
+
"@rollup/plugin-commonjs": "^29.0.0",
|
|
74
|
+
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
75
|
+
"@rollup/plugin-typescript": "^12.3.0",
|
|
76
|
+
"@storybook/addon-docs": "^10.2.7",
|
|
77
|
+
"@storybook/addon-onboarding": "^10.2.7",
|
|
78
|
+
"@storybook/react-vite": "^10.2.7",
|
|
79
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
80
|
+
"@testing-library/react": "^16.3.2",
|
|
81
|
+
"@testing-library/user-event": "^14.6.1",
|
|
82
|
+
"@types/jest": "^30.0.0",
|
|
83
|
+
"@types/react": "^19.2.13",
|
|
84
|
+
"@types/react-dom": "^19.2.3",
|
|
85
|
+
"@vitejs/plugin-react": "^5.1.3",
|
|
86
|
+
"babel-jest": "^30.2.0",
|
|
83
87
|
"gh-pages": "^6.3.0",
|
|
84
88
|
"identity-obj-proxy": "^3.0.0",
|
|
85
|
-
"jest": "^
|
|
86
|
-
"jest-environment-jsdom": "^
|
|
87
|
-
"react": "^
|
|
88
|
-
"react-dom": "^
|
|
89
|
-
"rollup": "^4.
|
|
90
|
-
"rollup-plugin-dts": "^6.
|
|
89
|
+
"jest": "^30.2.0",
|
|
90
|
+
"jest-environment-jsdom": "^30.2.0",
|
|
91
|
+
"react": "^19.2.4",
|
|
92
|
+
"react-dom": "^19.2.4",
|
|
93
|
+
"rollup": "^4.57.1",
|
|
94
|
+
"rollup-plugin-dts": "^6.3.0",
|
|
91
95
|
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
92
96
|
"rollup-plugin-postcss": "^4.0.2",
|
|
93
|
-
"storybook": "^
|
|
94
|
-
"typescript": "^5.
|
|
95
|
-
"vite": "^7.
|
|
97
|
+
"storybook": "^10.2.7",
|
|
98
|
+
"typescript": "^5.9.3",
|
|
99
|
+
"vite": "^7.3.1"
|
|
96
100
|
}
|
|
97
101
|
}
|