@pie-lib/mask-markup 3.0.4-next.31 → 3.0.4-next.32

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 (107) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +4 -0
  2. package/dist/choices/choice.d.ts +24 -0
  3. package/dist/choices/choice.js +77 -0
  4. package/dist/choices/index.d.ts +25 -0
  5. package/dist/choices/index.js +49 -0
  6. package/dist/componentize.d.ts +12 -0
  7. package/dist/componentize.js +4 -0
  8. package/dist/components/blank.d.ts +39 -0
  9. package/dist/components/blank.js +240 -0
  10. package/dist/components/correct-input.d.ts +11 -0
  11. package/dist/components/dropdown.d.ts +37 -0
  12. package/dist/components/dropdown.js +320 -0
  13. package/dist/components/input.d.ts +37 -0
  14. package/dist/constructed-response.d.ts +44 -0
  15. package/dist/constructed-response.js +55 -0
  16. package/dist/customizable.d.ts +43 -0
  17. package/dist/customizable.js +8 -0
  18. package/dist/drag-in-the-blank.d.ts +37 -0
  19. package/dist/drag-in-the-blank.js +164 -0
  20. package/dist/index.d.ts +15 -0
  21. package/dist/index.js +7 -0
  22. package/dist/inline-dropdown.d.ts +44 -0
  23. package/dist/inline-dropdown.js +24 -0
  24. package/dist/mask.d.ts +30 -0
  25. package/dist/mask.js +99 -0
  26. package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +16 -0
  27. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/index.js +17 -0
  28. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/cssPrefix.js +9 -0
  29. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/cssUnitless.js +26 -0
  30. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/hasOwn.js +11 -0
  31. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/isFunction.js +11 -0
  32. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/isObject.js +11 -0
  33. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/prefixInfo.js +24 -0
  34. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/prefixProperties.js +32 -0
  35. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/prefixer.js +29 -0
  36. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/stringUtils/camelize.js +14 -0
  37. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/stringUtils/hyphenRe.js +8 -0
  38. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/stringUtils/hyphenate.js +12 -0
  39. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/stringUtils/separate.js +11 -0
  40. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/stringUtils/toLowerFirst.js +10 -0
  41. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/stringUtils/toUpperFirst.js +10 -0
  42. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/toStyleObject.js +55 -0
  43. package/dist/node_modules/.bun/to-style@1.3.3/node_modules/to-style/src/toStyleString.js +16 -0
  44. package/dist/serialization.d.ts +34 -0
  45. package/dist/serialization.js +132 -0
  46. package/dist/with-mask.d.ts +55 -0
  47. package/dist/with-mask.js +45 -0
  48. package/package.json +39 -20
  49. package/CHANGELOG.json +0 -17
  50. package/CHANGELOG.md +0 -1256
  51. package/LICENSE.md +0 -5
  52. package/lib/choices/choice.js +0 -116
  53. package/lib/choices/choice.js.map +0 -1
  54. package/lib/choices/index.js +0 -103
  55. package/lib/choices/index.js.map +0 -1
  56. package/lib/componentize.js +0 -21
  57. package/lib/componentize.js.map +0 -1
  58. package/lib/components/blank.js +0 -371
  59. package/lib/components/blank.js.map +0 -1
  60. package/lib/components/correct-input.js +0 -94
  61. package/lib/components/correct-input.js.map +0 -1
  62. package/lib/components/dropdown.js +0 -483
  63. package/lib/components/dropdown.js.map +0 -1
  64. package/lib/components/input.js +0 -50
  65. package/lib/components/input.js.map +0 -1
  66. package/lib/constructed-response.js +0 -101
  67. package/lib/constructed-response.js.map +0 -1
  68. package/lib/customizable.js +0 -42
  69. package/lib/customizable.js.map +0 -1
  70. package/lib/drag-in-the-blank.js +0 -254
  71. package/lib/drag-in-the-blank.js.map +0 -1
  72. package/lib/index.js +0 -55
  73. package/lib/index.js.map +0 -1
  74. package/lib/inline-dropdown.js +0 -40
  75. package/lib/inline-dropdown.js.map +0 -1
  76. package/lib/mask.js +0 -198
  77. package/lib/mask.js.map +0 -1
  78. package/lib/serialization.js +0 -261
  79. package/lib/serialization.js.map +0 -1
  80. package/lib/with-mask.js +0 -97
  81. package/lib/with-mask.js.map +0 -1
  82. package/src/__tests__/drag-in-the-blank.test.js +0 -111
  83. package/src/__tests__/index.test.js +0 -38
  84. package/src/__tests__/mask.test.js +0 -381
  85. package/src/__tests__/serialization.test.js +0 -54
  86. package/src/__tests__/utils.js +0 -1
  87. package/src/__tests__/with-mask.test.js +0 -76
  88. package/src/choices/__tests__/index.test.js +0 -75
  89. package/src/choices/choice.jsx +0 -97
  90. package/src/choices/index.jsx +0 -64
  91. package/src/componentize.js +0 -13
  92. package/src/components/__tests__/blank.test.js +0 -199
  93. package/src/components/__tests__/correct-input.test.js +0 -90
  94. package/src/components/__tests__/dropdown.test.js +0 -129
  95. package/src/components/__tests__/input.test.js +0 -102
  96. package/src/components/blank.jsx +0 -386
  97. package/src/components/correct-input.jsx +0 -82
  98. package/src/components/dropdown.jsx +0 -423
  99. package/src/components/input.jsx +0 -48
  100. package/src/constructed-response.jsx +0 -87
  101. package/src/customizable.jsx +0 -34
  102. package/src/drag-in-the-blank.jsx +0 -241
  103. package/src/index.js +0 -16
  104. package/src/inline-dropdown.jsx +0 -29
  105. package/src/mask.jsx +0 -172
  106. package/src/serialization.js +0 -260
  107. package/src/with-mask.jsx +0 -75
package/lib/with-mask.js DELETED
@@ -1,97 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.withMask = exports.buildLayoutFromMarkup = void 0;
8
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
11
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
12
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
13
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
14
- var _react = _interopRequireDefault(require("react"));
15
- var _propTypes = _interopRequireDefault(require("prop-types"));
16
- var _mask = _interopRequireDefault(require("./mask"));
17
- var _componentize2 = _interopRequireDefault(require("./componentize"));
18
- var _serialization = require("./serialization");
19
- function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
20
- function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
21
- var buildLayoutFromMarkup = exports.buildLayoutFromMarkup = function buildLayoutFromMarkup(markup, type) {
22
- var _componentize = (0, _componentize2["default"])(markup, type),
23
- processed = _componentize.markup;
24
- var value = (0, _serialization.deserialize)(processed);
25
- return value.document;
26
- };
27
- var withMask = exports.withMask = function withMask(type, renderChildren) {
28
- var _WithMask;
29
- return _WithMask = /*#__PURE__*/function (_React$Component) {
30
- function WithMask(props) {
31
- var _this;
32
- (0, _classCallCheck2["default"])(this, WithMask);
33
- _this = _callSuper(this, WithMask, [props]);
34
- _this.containerRef = /*#__PURE__*/_react["default"].createRef();
35
- return _this;
36
- }
37
- (0, _inherits2["default"])(WithMask, _React$Component);
38
- return (0, _createClass2["default"])(WithMask, [{
39
- key: "componentDidUpdate",
40
- value: function componentDidUpdate(prevProps) {
41
- if (this.props.markup !== prevProps.markup) {
42
- var domNode = this.containerRef.current;
43
- var mathElements = domNode && domNode.querySelectorAll('[data-latex][data-math-handled="true"]');
44
-
45
- // Clean up for fresh MathJax processing
46
- (mathElements || []).forEach(function (el) {
47
- // Remove the MathJax container to allow for clean updates
48
- var mjxContainer = el.querySelector('mjx-container');
49
- if (mjxContainer) {
50
- el.removeChild(mjxContainer);
51
- }
52
-
53
- // Update the innerHTML to match the raw LaTeX data, ensuring it is reprocessed correctly
54
- var latexCode = el.getAttribute('data-raw');
55
- el.innerHTML = latexCode;
56
-
57
- // Remove the attribute to signal that MathJax should reprocess this element
58
- el.removeAttribute('data-math-handled');
59
- });
60
- }
61
- }
62
- }, {
63
- key: "render",
64
- value: function render() {
65
- var _this$props = this.props,
66
- markup = _this$props.markup,
67
- layout = _this$props.layout,
68
- value = _this$props.value,
69
- onChange = _this$props.onChange,
70
- elementType = _this$props.elementType;
71
- var maskLayout = layout ? layout : buildLayoutFromMarkup(markup, type);
72
- return /*#__PURE__*/_react["default"].createElement(_mask["default"], {
73
- containerRef: this.containerRef,
74
- elementType: elementType,
75
- layout: maskLayout,
76
- value: value,
77
- onChange: onChange,
78
- renderChildren: renderChildren(this.props)
79
- });
80
- }
81
- }]);
82
- }(_react["default"].Component), (0, _defineProperty2["default"])(_WithMask, "propTypes", {
83
- /**
84
- * At the start we'll probably work with markup
85
- */
86
- markup: _propTypes["default"].string,
87
- /**
88
- * Once we start authoring, it may make sense for use to us layout, which will be a simple js object that maps to `slate.Value`.
89
- */
90
- layout: _propTypes["default"].object,
91
- value: _propTypes["default"].object,
92
- onChange: _propTypes["default"].func,
93
- customMarkMarkupComponent: _propTypes["default"].func,
94
- elementType: _propTypes["default"].string
95
- }), _WithMask;
96
- };
97
- //# sourceMappingURL=with-mask.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"with-mask.js","names":["_react","_interopRequireDefault","require","_propTypes","_mask","_componentize2","_serialization","_callSuper","t","o","e","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","Reflect","construct","constructor","apply","Boolean","prototype","valueOf","call","buildLayoutFromMarkup","exports","markup","type","_componentize","componentize","processed","value","deserialize","document","withMask","renderChildren","_WithMask","_React$Component","WithMask","props","_this","_classCallCheck2","containerRef","React","createRef","_inherits2","_createClass2","key","componentDidUpdate","prevProps","domNode","current","mathElements","querySelectorAll","forEach","el","mjxContainer","querySelector","removeChild","latexCode","getAttribute","innerHTML","removeAttribute","render","_this$props","layout","onChange","elementType","maskLayout","createElement","Component","_defineProperty2","PropTypes","string","object","func","customMarkMarkupComponent"],"sources":["../src/with-mask.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport Mask from './mask';\nimport componentize from './componentize';\nimport { deserialize } from './serialization';\n\nexport const buildLayoutFromMarkup = (markup, type) => {\n const { markup: processed } = componentize(markup, type);\n const value = deserialize(processed);\n return value.document;\n};\n\nexport const withMask = (type, renderChildren) => {\n return class WithMask extends React.Component {\n static propTypes = {\n /**\n * At the start we'll probably work with markup\n */\n markup: PropTypes.string,\n /**\n * Once we start authoring, it may make sense for use to us layout, which will be a simple js object that maps to `slate.Value`.\n */\n layout: PropTypes.object,\n value: PropTypes.object,\n onChange: PropTypes.func,\n customMarkMarkupComponent: PropTypes.func,\n elementType: PropTypes.string,\n };\n\n constructor(props) {\n super(props);\n this.containerRef = React.createRef();\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.markup !== prevProps.markup) {\n const domNode = this.containerRef.current;\n const mathElements = domNode && domNode.querySelectorAll('[data-latex][data-math-handled=\"true\"]');\n\n // Clean up for fresh MathJax processing\n (mathElements || []).forEach((el) => {\n // Remove the MathJax container to allow for clean updates\n const mjxContainer = el.querySelector('mjx-container');\n\n if (mjxContainer) {\n el.removeChild(mjxContainer);\n }\n\n // Update the innerHTML to match the raw LaTeX data, ensuring it is reprocessed correctly\n const latexCode = el.getAttribute('data-raw');\n el.innerHTML = latexCode;\n\n // Remove the attribute to signal that MathJax should reprocess this element\n el.removeAttribute('data-math-handled');\n });\n }\n }\n\n render() {\n const { markup, layout, value, onChange, elementType } = this.props;\n\n const maskLayout = layout ? layout : buildLayoutFromMarkup(markup, type);\n return (\n <Mask\n containerRef={this.containerRef}\n elementType={elementType}\n layout={maskLayout}\n value={value}\n onChange={onChange}\n renderChildren={renderChildren(this.props)}\n />\n );\n }\n };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,111 +0,0 @@
1
- import * as React from 'react';
2
- import { render, screen } from '@testing-library/react';
3
- import DragInTheBlank from '../drag-in-the-blank';
4
-
5
- const markup = `<div>
6
- <img src="https://image.shutterstock.com/image-vector/cow-jumped-over-moon-traditional-260nw-1152899330.jpg"></img>
7
- <h5>Hey Diddle Diddle <i>by ?</i></h5>
8
- <p>1: Hey, diddle, diddle,</p>
9
- <p>2: The cat and the fiddle,</p>
10
- <p>3: The cow {{0}} over the moon;</p>
11
- <p>4: The little dog {{1}},</p>
12
- <p>5: To see such sport,</p>
13
- <p>6: And the dish ran away with the {{2}}.</p>
14
- </div>`;
15
- const choice = (v, id) => ({ value: v, id });
16
-
17
- // Mock DragProvider and DragDroppablePlaceholder to avoid DndContext requirement
18
- jest.mock('@pie-lib/drag', () => ({
19
- DragProvider: ({ children, onDragStart, onDragEnd }) => {
20
- // Simple wrapper that doesn't require DndContext
21
- return <div data-testid="drag-provider">{children}</div>;
22
- },
23
- DragDroppablePlaceholder: ({ children, disabled, instanceId }) => {
24
- // Simple wrapper that doesn't require useDroppable
25
- return <div data-testid="drag-droppable-placeholder">{children}</div>;
26
- },
27
- }));
28
-
29
- // Mock @dnd-kit/core components and hooks used by DragInTheBlank and child components
30
- jest.mock('@dnd-kit/core', () => ({
31
- DragOverlay: ({ children }) => <div data-testid="drag-overlay">{children}</div>,
32
- closestCenter: jest.fn(),
33
- useDraggable: jest.fn(() => ({
34
- attributes: {},
35
- listeners: {},
36
- setNodeRef: jest.fn(),
37
- transform: null,
38
- isDragging: false,
39
- })),
40
- useDroppable: jest.fn(() => ({
41
- setNodeRef: jest.fn(),
42
- isOver: false,
43
- active: null,
44
- })),
45
- }));
46
-
47
- jest.mock('@dnd-kit/utilities', () => ({
48
- CSS: {
49
- Translate: {
50
- toString: jest.fn(() => 'translate3d(0, 0, 0)'),
51
- },
52
- },
53
- }));
54
-
55
- describe('DragInTheBlank', () => {
56
- const defaultProps = {
57
- disabled: false,
58
- feedback: {},
59
- markup,
60
- choices: [
61
- choice('Jumped', '0'),
62
- choice('Laughed', '1'),
63
- choice('Spoon', '2'),
64
- choice('Fork', '3'),
65
- choice('Bumped', '4'),
66
- choice('Smiled', '5'),
67
- ],
68
-
69
- value: {
70
- 0: undefined,
71
- },
72
- };
73
-
74
- describe('render', () => {
75
- it('renders correctly with default props', () => {
76
- const { container } = render(<DragInTheBlank {...defaultProps} />);
77
- expect(container.firstChild).toBeInTheDocument();
78
- // Check that markup content is rendered
79
- expect(screen.getByText(/Hey Diddle Diddle/)).toBeInTheDocument();
80
- expect(screen.getByText(/Hey, diddle, diddle,/)).toBeInTheDocument();
81
- });
82
-
83
- it('renders correctly with disabled prop as true', () => {
84
- const { container } = render(<DragInTheBlank {...defaultProps} disabled={true} />);
85
- expect(container.firstChild).toBeInTheDocument();
86
- });
87
-
88
- it('renders correctly with feedback', () => {
89
- const { container } = render(
90
- <DragInTheBlank
91
- {...defaultProps}
92
- feedback={{
93
- 0: {
94
- value: 'Jumped',
95
- correct: 'Jumped',
96
- },
97
- 1: {
98
- value: 'Laughed',
99
- correct: 'Laughed',
100
- },
101
- 2: {
102
- value: 'Spoon',
103
- correct: 'Spoon',
104
- },
105
- }}
106
- />,
107
- );
108
- expect(container.firstChild).toBeInTheDocument();
109
- });
110
- });
111
- });
@@ -1,38 +0,0 @@
1
- import componentize from '../componentize';
2
- import { deserialize } from '../serialization';
3
-
4
- describe('index', () => {
5
- describe('componentize', () => {
6
- it('should return an array with the appropriate markup', () => {
7
- const dropDownMarkup = componentize('{{0}} foo {{1}}', 'dropdown');
8
-
9
- expect(dropDownMarkup).toEqual({
10
- markup:
11
- '<span data-component="dropdown" data-id="0"></span> foo <span data-component="dropdown" data-id="1"></span>',
12
- });
13
- });
14
- });
15
-
16
- describe('serialization', () => {
17
- it('should have default node a span', () => {
18
- expect(deserialize('something')).toEqual(
19
- expect.objectContaining({
20
- object: 'value',
21
- document: {
22
- object: 'document',
23
- data: {},
24
- nodes: [
25
- {
26
- object: 'block',
27
- data: {},
28
- isVoid: false,
29
- type: 'span',
30
- nodes: [{ object: 'text', leaves: [{ text: 'something' }] }],
31
- },
32
- ],
33
- },
34
- }),
35
- );
36
- });
37
- });
38
- });
@@ -1,381 +0,0 @@
1
- import * as React from 'react';
2
- import { render, screen } from '@testing-library/react';
3
- import Mask from '../mask';
4
-
5
- describe('Mask', () => {
6
- // Don't mock renderChildren - let the component render naturally
7
- const onChange = jest.fn();
8
- const defaultProps = {
9
- onChange,
10
- layout: {
11
- nodes: [
12
- {
13
- object: 'text',
14
- leaves: [
15
- {
16
- text: 'Foo',
17
- },
18
- ],
19
- },
20
- ],
21
- },
22
- value: {},
23
- };
24
-
25
- beforeEach(() => {
26
- onChange.mockClear();
27
- });
28
-
29
- describe('rendering', () => {
30
- it('renders with default props', () => {
31
- const { container } = render(<Mask {...defaultProps} />);
32
- expect(container.firstChild).toBeInTheDocument();
33
- });
34
-
35
- it('renders text content', () => {
36
- render(<Mask {...defaultProps} />);
37
- expect(screen.getByText('Foo')).toBeInTheDocument();
38
- });
39
-
40
- it('renders a paragraph element', () => {
41
- const { container } = render(
42
- <Mask
43
- {...defaultProps}
44
- layout={{
45
- nodes: [
46
- {
47
- type: 'p',
48
- nodes: [
49
- {
50
- object: 'text',
51
- leaves: [
52
- {
53
- text: 'Foo',
54
- },
55
- ],
56
- },
57
- ],
58
- },
59
- ],
60
- }}
61
- />,
62
- );
63
-
64
- // Paragraph is rendered as a styled div, not a <p> tag
65
- expect(screen.getByText('Foo')).toBeInTheDocument();
66
- });
67
-
68
- it('renders nested div and paragraph', () => {
69
- const { container } = render(
70
- <Mask
71
- {...defaultProps}
72
- layout={{
73
- nodes: [
74
- {
75
- type: 'div',
76
- data: {
77
- attributes: {},
78
- },
79
- nodes: [
80
- {
81
- type: 'p',
82
- data: {
83
- attributes: {},
84
- },
85
- nodes: [
86
- {
87
- object: 'text',
88
- leaves: [
89
- {
90
- text: 'Foo',
91
- },
92
- ],
93
- },
94
- ],
95
- },
96
- ],
97
- },
98
- ],
99
- }}
100
- />,
101
- );
102
-
103
- expect(container.querySelector('div')).toBeInTheDocument();
104
- // Paragraph is rendered as a styled div, not a <p> tag
105
- expect(screen.getByText('Foo')).toBeInTheDocument();
106
- });
107
-
108
- it('renders text with italic marks', () => {
109
- const { container } = render(
110
- <Mask
111
- {...defaultProps}
112
- layout={{
113
- nodes: [
114
- {
115
- leaves: [{ text: 'Foo ' }],
116
- object: 'text',
117
- },
118
- {
119
- leaves: [
120
- {
121
- marks: [
122
- {
123
- data: undefined,
124
- type: 'italic',
125
- },
126
- ],
127
- text: 'x',
128
- },
129
- ],
130
- object: 'text',
131
- },
132
- {
133
- leaves: [{ text: ' bar' }],
134
- object: 'text',
135
- },
136
- ],
137
- object: 'block',
138
- type: 'div',
139
- }}
140
- />,
141
- );
142
-
143
- // Text "Foo " is split with spaces, use regex
144
- expect(screen.getByText(/Foo/)).toBeInTheDocument();
145
- expect(screen.getByText('x')).toBeInTheDocument();
146
- expect(screen.getByText(/bar/)).toBeInTheDocument();
147
- // Check for italic/em element
148
- const em = container.querySelector('em, i');
149
- expect(em).toBeInTheDocument();
150
- expect(em.textContent).toBe('x');
151
- });
152
-
153
- it('renders tbody without extra space', () => {
154
- const da = () => ({ data: { attributes: {} } });
155
- const { container } = render(
156
- <Mask
157
- {...defaultProps}
158
- layout={{
159
- nodes: [
160
- {
161
- type: 'table',
162
- ...da(),
163
- nodes: [
164
- {
165
- type: 'tbody',
166
- ...da(),
167
- nodes: [
168
- {
169
- object: 'text',
170
- leaves: [{ text: ' ' }],
171
- },
172
- { type: 'tr', ...da(), nodes: [] },
173
- ],
174
- },
175
- ],
176
- },
177
- ],
178
- }}
179
- />,
180
- );
181
-
182
- expect(container.querySelector('table')).toBeInTheDocument();
183
- expect(container.querySelector('tbody')).toBeInTheDocument();
184
- expect(container.querySelector('tr')).toBeInTheDocument();
185
- });
186
- });
187
-
188
- describe('spacer rendering for DnD components', () => {
189
- it('adds spacers before and after DnD blank components', () => {
190
- const mockRenderChildren = jest.fn((n) => {
191
- if (n.data?.dataset?.component === 'blank') {
192
- return <span data-testid="blank-component">Blank</span>;
193
- }
194
- return null;
195
- });
196
-
197
- const { container } = render(
198
- <Mask
199
- {...defaultProps}
200
- renderChildren={mockRenderChildren}
201
- layout={{
202
- nodes: [
203
- {
204
- type: 'div',
205
- data: {
206
- dataset: { component: 'blank' },
207
- attributes: {},
208
- },
209
- nodes: [],
210
- },
211
- ],
212
- }}
213
- />,
214
- );
215
-
216
- // Check that renderChildren was called and spacers are present
217
- // Count all children in the container - should be: spacer + blank + spacer = 3 elements
218
- const maskContainer = container.firstChild;
219
- expect(maskContainer.childNodes.length).toBe(3);
220
- expect(screen.getByTestId('blank-component')).toBeInTheDocument();
221
- });
222
-
223
- it('does not add spacers for non-DnD components', () => {
224
- const mockRenderChildren = jest.fn((n) => {
225
- return <span data-testid="regular-component">Regular</span>;
226
- });
227
-
228
- const { container } = render(
229
- <Mask
230
- {...defaultProps}
231
- renderChildren={mockRenderChildren}
232
- layout={{
233
- nodes: [
234
- {
235
- type: 'div',
236
- data: {
237
- attributes: {},
238
- },
239
- nodes: [],
240
- },
241
- ],
242
- }}
243
- />,
244
- );
245
-
246
- // Should not have spacers - only the regular component
247
- const maskContainer = container.firstChild;
248
- expect(maskContainer.childNodes.length).toBe(1);
249
- expect(screen.getByTestId('regular-component')).toBeInTheDocument();
250
- });
251
-
252
- it('adds spacers regardless of parent node type', () => {
253
- const mockRenderChildren = jest.fn((n) => {
254
- if (n.data?.dataset?.component === 'blank') {
255
- return <span data-testid="blank-in-td">Blank in TD</span>;
256
- }
257
- return null;
258
- });
259
-
260
- const { container } = render(
261
- <Mask
262
- {...defaultProps}
263
- renderChildren={mockRenderChildren}
264
- elementType="drag-in-the-blank"
265
- layout={{
266
- nodes: [
267
- {
268
- type: 'table',
269
- data: { attributes: {} },
270
- nodes: [
271
- {
272
- type: 'tbody',
273
- data: { attributes: {} },
274
- nodes: [
275
- {
276
- type: 'tr',
277
- data: { attributes: {} },
278
- nodes: [
279
- {
280
- type: 'td',
281
- data: { attributes: {} },
282
- nodes: [
283
- {
284
- type: 'div',
285
- data: {
286
- dataset: { component: 'blank' },
287
- attributes: {},
288
- },
289
- nodes: [],
290
- },
291
- ],
292
- },
293
- ],
294
- },
295
- ],
296
- },
297
- ],
298
- },
299
- ],
300
- }}
301
- />,
302
- );
303
-
304
- // Should have spacers even inside td element
305
- const td = container.querySelector('td');
306
- expect(td.childNodes.length).toBe(3); // spacer + blank + spacer
307
- expect(screen.getByTestId('blank-in-td')).toBeInTheDocument();
308
- });
309
-
310
- it('does not add spacers for text content', () => {
311
- const { container } = render(
312
- <Mask
313
- {...defaultProps}
314
- elementType="drag-in-the-blank"
315
- layout={{
316
- nodes: [
317
- {
318
- object: 'text',
319
- leaves: [
320
- {
321
- text: 'Some text',
322
- },
323
- ],
324
- },
325
- ],
326
- }}
327
- />,
328
- );
329
-
330
- // Should not have spacers for plain text - just text node
331
- const maskContainer = container.firstChild;
332
- expect(maskContainer.childNodes.length).toBe(1);
333
- expect(maskContainer.childNodes[0].nodeType).toBe(Node.TEXT_NODE);
334
- expect(screen.getByText('Some text')).toBeInTheDocument();
335
- });
336
-
337
- it('handles multiple DnD components with correct spacer placement', () => {
338
- const mockRenderChildren = jest.fn((n) => {
339
- if (n.data?.dataset?.component === 'blank') {
340
- return <span data-testid={`blank-${n.data.testId}`}>Blank</span>;
341
- }
342
- return null;
343
- });
344
-
345
- const { container } = render(
346
- <Mask
347
- {...defaultProps}
348
- renderChildren={mockRenderChildren}
349
- layout={{
350
- nodes: [
351
- {
352
- type: 'div',
353
- data: {
354
- dataset: { component: 'blank' },
355
- attributes: {},
356
- testId: '1',
357
- },
358
- nodes: [],
359
- },
360
- {
361
- type: 'div',
362
- data: {
363
- dataset: { component: 'blank' },
364
- attributes: {},
365
- testId: '2',
366
- },
367
- nodes: [],
368
- },
369
- ],
370
- }}
371
- />,
372
- );
373
-
374
- // Should have 2 spacers per component = 4 spacers + 2 blanks = 6 total children
375
- const maskContainer = container.firstChild;
376
- expect(maskContainer.childNodes.length).toBe(6);
377
- expect(screen.getByTestId('blank-1')).toBeInTheDocument();
378
- expect(screen.getByTestId('blank-2')).toBeInTheDocument();
379
- });
380
- });
381
- });
@@ -1,54 +0,0 @@
1
- import { deserialize } from '../serialization';
2
-
3
- describe('serialization', () => {
4
- it('ignores comments', () => {
5
- const out = deserialize(`<!-- hi -->`);
6
- expect(out.document.nodes[0]).toEqual(expect.objectContaining({ type: 'span' }));
7
- });
8
-
9
- it('ignores comments', () => {
10
- const out = deserialize(`<!-- hi --><div>foo</div>`);
11
- expect(out.document.nodes[0]).toEqual(
12
- expect.objectContaining({
13
- type: 'div',
14
- nodes: [
15
- expect.objectContaining({
16
- object: 'text',
17
- leaves: [{ text: 'foo' }],
18
- }),
19
- ],
20
- }),
21
- );
22
- });
23
-
24
- it('deserializes an em', () => {
25
- const out = deserialize(`<!-- hi --><div> <em>x</em> </div>`);
26
- expect(out.document.nodes[0]).toEqual(
27
- expect.objectContaining({
28
- type: 'div',
29
- nodes: [
30
- expect.objectContaining({
31
- object: 'text',
32
- }),
33
- expect.objectContaining({
34
- leaves: [
35
- {
36
- marks: [
37
- {
38
- data: undefined,
39
- type: 'italic',
40
- },
41
- ],
42
- text: 'x',
43
- },
44
- ],
45
- object: 'text',
46
- }),
47
- expect.objectContaining({
48
- object: 'text',
49
- }),
50
- ],
51
- }),
52
- );
53
- });
54
- });