@pie-lib/editable-html-tip-tap 2.1.10 → 2.2.0-beta

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 (114) hide show
  1. package/CHANGELOG.md +0 -75
  2. package/lib/__tests__/EditableHtml.test.js +831 -0
  3. package/lib/__tests__/EditableHtml.test.js.map +1 -0
  4. package/lib/__tests__/constants.test.js +21 -0
  5. package/lib/__tests__/constants.test.js.map +1 -0
  6. package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
  7. package/lib/__tests__/div-to-paragraph-conversion.test.js.map +1 -0
  8. package/lib/__tests__/extensions.test.js +209 -0
  9. package/lib/__tests__/extensions.test.js.map +1 -0
  10. package/lib/__tests__/index.test.js +250 -0
  11. package/lib/__tests__/index.test.js.map +1 -0
  12. package/lib/__tests__/size-utils.test.js +57 -0
  13. package/lib/__tests__/size-utils.test.js.map +1 -0
  14. package/lib/__tests__/theme.test.js +17 -0
  15. package/lib/__tests__/theme.test.js.map +1 -0
  16. package/lib/components/EditableHtml.js +4 -2
  17. package/lib/components/EditableHtml.js.map +1 -1
  18. package/lib/components/__tests__/AltDialog.test.js +201 -0
  19. package/lib/components/__tests__/AltDialog.test.js.map +1 -0
  20. package/lib/components/__tests__/CharacterPicker.test.js +455 -0
  21. package/lib/components/__tests__/CharacterPicker.test.js.map +1 -0
  22. package/lib/components/__tests__/CssIcon.test.js +58 -0
  23. package/lib/components/__tests__/CssIcon.test.js.map +1 -0
  24. package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
  25. package/lib/components/__tests__/DragInTheBlank.test.js.map +1 -0
  26. package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
  27. package/lib/components/__tests__/ExplicitConstructedResponse.test.js.map +1 -0
  28. package/lib/components/__tests__/ImageToolbar.test.js +185 -0
  29. package/lib/components/__tests__/ImageToolbar.test.js.map +1 -0
  30. package/lib/components/__tests__/InlineDropdown.test.js +839 -0
  31. package/lib/components/__tests__/InlineDropdown.test.js.map +1 -0
  32. package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
  33. package/lib/components/__tests__/InsertImageHandler.test.js.map +1 -0
  34. package/lib/components/__tests__/MediaDialog.test.js +433 -0
  35. package/lib/components/__tests__/MediaDialog.test.js.map +1 -0
  36. package/lib/components/__tests__/MediaToolbar.test.js +126 -0
  37. package/lib/components/__tests__/MediaToolbar.test.js.map +1 -0
  38. package/lib/components/__tests__/MediaWrapper.test.js +96 -0
  39. package/lib/components/__tests__/MediaWrapper.test.js.map +1 -0
  40. package/lib/components/__tests__/MenuBar.test.js +502 -0
  41. package/lib/components/__tests__/MenuBar.test.js.map +1 -0
  42. package/lib/components/__tests__/RespArea.test.js +171 -0
  43. package/lib/components/__tests__/RespArea.test.js.map +1 -0
  44. package/lib/components/__tests__/TableIcons.test.js +153 -0
  45. package/lib/components/__tests__/TableIcons.test.js.map +1 -0
  46. package/lib/components/__tests__/TextAlign.test.js +209 -0
  47. package/lib/components/__tests__/TextAlign.test.js.map +1 -0
  48. package/lib/components/__tests__/TiptapContainer.test.js +196 -0
  49. package/lib/components/__tests__/TiptapContainer.test.js.map +1 -0
  50. package/lib/components/__tests__/characterUtils.test.js +178 -0
  51. package/lib/components/__tests__/characterUtils.test.js.map +1 -0
  52. package/lib/components/__tests__/choice.test.js +213 -0
  53. package/lib/components/__tests__/choice.test.js.map +1 -0
  54. package/lib/components/__tests__/custom-popper.test.js +108 -0
  55. package/lib/components/__tests__/custom-popper.test.js.map +1 -0
  56. package/lib/components/__tests__/done-button.test.js +72 -0
  57. package/lib/components/__tests__/done-button.test.js.map +1 -0
  58. package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
  59. package/lib/components/__tests__/toolbar-buttons.test.js.map +1 -0
  60. package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
  61. package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js.map +1 -0
  62. package/lib/components/respArea/DragInTheBlank/choice.js +3 -0
  63. package/lib/components/respArea/DragInTheBlank/choice.js.map +1 -1
  64. package/lib/components/respArea/MathTemplated.js +2 -2
  65. package/lib/components/respArea/MathTemplated.js.map +1 -1
  66. package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
  67. package/lib/components/respArea/__tests__/MathTemplated.test.js.map +1 -0
  68. package/lib/extensions/__tests__/css.test.js +214 -0
  69. package/lib/extensions/__tests__/css.test.js.map +1 -0
  70. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
  71. package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js.map +1 -0
  72. package/lib/extensions/__tests__/divNode.test.js +108 -0
  73. package/lib/extensions/__tests__/divNode.test.js.map +1 -0
  74. package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
  75. package/lib/extensions/__tests__/ensure-empty-root-div.test.js.map +1 -0
  76. package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
  77. package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js.map +1 -0
  78. package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
  79. package/lib/extensions/__tests__/extended-list-item.test.js.map +1 -0
  80. package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
  81. package/lib/extensions/__tests__/extended-table-cell.test.js.map +1 -0
  82. package/lib/extensions/__tests__/extended-table.test.js +200 -0
  83. package/lib/extensions/__tests__/extended-table.test.js.map +1 -0
  84. package/lib/extensions/__tests__/image-component.test.js +432 -0
  85. package/lib/extensions/__tests__/image-component.test.js.map +1 -0
  86. package/lib/extensions/__tests__/image.test.js +313 -0
  87. package/lib/extensions/__tests__/image.test.js.map +1 -0
  88. package/lib/extensions/__tests__/math.test.js +1399 -0
  89. package/lib/extensions/__tests__/math.test.js.map +1 -0
  90. package/lib/extensions/__tests__/media-node-view.test.js +307 -0
  91. package/lib/extensions/__tests__/media-node-view.test.js.map +1 -0
  92. package/lib/extensions/__tests__/media.test.js +292 -0
  93. package/lib/extensions/__tests__/media.test.js.map +1 -0
  94. package/lib/extensions/__tests__/responseArea.test.js +736 -0
  95. package/lib/extensions/__tests__/responseArea.test.js.map +1 -0
  96. package/lib/extensions/image-component.js +9 -6
  97. package/lib/extensions/image-component.js.map +1 -1
  98. package/lib/extensions/responseArea.js +7 -1
  99. package/lib/extensions/responseArea.js.map +1 -1
  100. package/lib/utils/__tests__/helper.test.js +107 -0
  101. package/lib/utils/__tests__/helper.test.js.map +1 -0
  102. package/lib/utils/__tests__/toolbar.test.js +38 -0
  103. package/lib/utils/__tests__/toolbar.test.js.map +1 -0
  104. package/package.json +7 -7
  105. package/src/components/EditableHtml.jsx +5 -3
  106. package/src/components/respArea/DragInTheBlank/__tests__/choice.test.jsx +72 -0
  107. package/src/components/respArea/DragInTheBlank/choice.jsx +3 -0
  108. package/src/components/respArea/MathTemplated.jsx +1 -1
  109. package/src/components/respArea/__tests__/MathTemplated.test.jsx +1 -1
  110. package/src/extensions/__tests__/image-component.test.jsx +1 -0
  111. package/src/extensions/__tests__/responseArea.test.js +57 -3
  112. package/src/extensions/image-component.jsx +8 -6
  113. package/src/extensions/responseArea.js +7 -1
  114. package/LICENSE.md +0 -5
@@ -0,0 +1,313 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
5
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
7
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
+ var _state = require("@tiptap/pm/state");
9
+ var _image = require("../image");
10
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
+ jest.mock('@tiptap/core', function () {
13
+ return {
14
+ Node: {
15
+ create: jest.fn(function (config) {
16
+ return config;
17
+ })
18
+ },
19
+ mergeAttributes: jest.fn(function () {
20
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
21
+ args[_key] = arguments[_key];
22
+ }
23
+ return Object.assign.apply(Object, [{}].concat(args));
24
+ })
25
+ };
26
+ });
27
+ jest.mock('@tiptap/pm/state', function () {
28
+ return {
29
+ Plugin: jest.fn(function MockPlugin(spec) {
30
+ this.spec = spec;
31
+ return {
32
+ spec: spec
33
+ };
34
+ })
35
+ };
36
+ });
37
+ jest.mock('@tiptap/react', function () {
38
+ return {
39
+ ReactNodeViewRenderer: jest.fn(function (component) {
40
+ return component;
41
+ })
42
+ };
43
+ });
44
+ jest.mock('../image-component', function () {
45
+ return {
46
+ __esModule: true,
47
+ "default": jest.fn(function () {
48
+ return /*#__PURE__*/React.createElement("div", {
49
+ "data-testid": "image-component"
50
+ });
51
+ })
52
+ };
53
+ });
54
+ function setupPastePlugin() {
55
+ var insertContent = jest.fn();
56
+ var editor = {
57
+ commands: {
58
+ insertContent: insertContent
59
+ }
60
+ };
61
+ _state.Plugin.mockClear();
62
+ _image.ImageUploadNode.addProseMirrorPlugins.call({
63
+ editor: editor
64
+ });
65
+ expect(_state.Plugin).toHaveBeenCalledTimes(1);
66
+ var handlePaste = _state.Plugin.mock.calls[0][0].props.handlePaste;
67
+ return {
68
+ handlePaste: handlePaste,
69
+ insertContent: insertContent,
70
+ editor: editor
71
+ };
72
+ }
73
+ describe('ImageUploadNode', function () {
74
+ describe('configuration', function () {
75
+ it('has correct name', function () {
76
+ expect(_image.ImageUploadNode.name).toBe('imageUploadNode');
77
+ });
78
+ it('is in block group', function () {
79
+ expect(_image.ImageUploadNode.group).toBe('block');
80
+ });
81
+ it('is atomic', function () {
82
+ expect(_image.ImageUploadNode.atom).toBe(true);
83
+ });
84
+ it('is selectable', function () {
85
+ expect(_image.ImageUploadNode.selectable).toBe(true);
86
+ });
87
+ it('is draggable', function () {
88
+ expect(_image.ImageUploadNode.draggable).toBe(true);
89
+ });
90
+ });
91
+ describe('addAttributes', function () {
92
+ it('returns all required attributes with defaults', function () {
93
+ var attributes = _image.ImageUploadNode.addAttributes();
94
+ expect(attributes).toHaveProperty('loaded');
95
+ expect(attributes).toHaveProperty('deleteStatus');
96
+ expect(attributes).toHaveProperty('alignment');
97
+ expect(attributes).toHaveProperty('percent');
98
+ expect(attributes).toHaveProperty('width');
99
+ expect(attributes).toHaveProperty('height');
100
+ expect(attributes).toHaveProperty('src');
101
+ expect(attributes).toHaveProperty('alt');
102
+ expect(attributes.loaded).toEqual({
103
+ "default": false
104
+ });
105
+ expect(attributes.deleteStatus).toEqual({
106
+ "default": null
107
+ });
108
+ expect(attributes.alignment).toEqual({
109
+ "default": null
110
+ });
111
+ expect(attributes.percent).toEqual({
112
+ "default": null
113
+ });
114
+ expect(attributes.width).toEqual({
115
+ "default": null
116
+ });
117
+ expect(attributes.height).toEqual({
118
+ "default": null
119
+ });
120
+ expect(attributes.src).toEqual({
121
+ "default": null
122
+ });
123
+ expect(attributes.alt).toEqual({
124
+ "default": null
125
+ });
126
+ });
127
+ });
128
+ describe('parseHTML', function () {
129
+ it('returns array with div selector', function () {
130
+ var rules = _image.ImageUploadNode.parseHTML();
131
+ expect(Array.isArray(rules)).toBe(true);
132
+ expect(rules).toHaveLength(1);
133
+ expect(rules[0]).toHaveProperty('tag', 'img[data-type="image-upload-node"]');
134
+ });
135
+ });
136
+ describe('renderHTML', function () {
137
+ it('renders img tag with data-type attribute', function () {
138
+ var HTMLAttributes = {
139
+ src: 'test.jpg',
140
+ width: 100,
141
+ height: 100
142
+ };
143
+ var result = _image.ImageUploadNode.renderHTML({
144
+ HTMLAttributes: HTMLAttributes
145
+ });
146
+ expect(result[0]).toBe('img');
147
+ expect(result[1]).toEqual(_objectSpread(_objectSpread({}, HTMLAttributes), {}, {
148
+ 'data-type': 'image-upload-node'
149
+ }));
150
+ });
151
+ it('merges attributes correctly', function () {
152
+ var HTMLAttributes = {
153
+ src: 'test.jpg',
154
+ alt: 'Test image'
155
+ };
156
+ var result = _image.ImageUploadNode.renderHTML({
157
+ HTMLAttributes: HTMLAttributes
158
+ });
159
+ expect(result[1].src).toBe('test.jpg');
160
+ expect(result[1].alt).toBe('Test image');
161
+ expect(result[1]['data-type']).toBe('image-upload-node');
162
+ });
163
+ });
164
+ describe('addNodeView', function () {
165
+ it('returns ReactNodeViewRenderer result', function () {
166
+ var result = _image.ImageUploadNode.addNodeView();
167
+ expect(result).toBeDefined();
168
+ });
169
+ });
170
+ describe('addCommands', function () {
171
+ it('returns setImageUploadNode command', function () {
172
+ var context = {
173
+ name: 'imageUploadNode'
174
+ };
175
+ var commands = _image.ImageUploadNode.addCommands.call(context);
176
+ expect(commands).toHaveProperty('setImageUploadNode');
177
+ expect((0, _typeof2["default"])(commands.setImageUploadNode)).toBe('function');
178
+ });
179
+ it('setImageUploadNode inserts content', function () {
180
+ var context = {
181
+ name: 'imageUploadNode'
182
+ };
183
+ var commands = _image.ImageUploadNode.addCommands.call(context);
184
+ var mockCommands = {
185
+ insertContent: jest.fn(function () {
186
+ return true;
187
+ })
188
+ };
189
+ var result = commands.setImageUploadNode()({
190
+ commands: mockCommands
191
+ });
192
+ expect(mockCommands.insertContent).toHaveBeenCalledWith(expect.objectContaining({
193
+ type: 'imageUploadNode',
194
+ attrs: expect.objectContaining({
195
+ nodeKey: expect.any(String)
196
+ })
197
+ }));
198
+ expect(result).toBe(true);
199
+ });
200
+ });
201
+ describe('addProseMirrorPlugins', function () {
202
+ var mockView = {};
203
+ beforeEach(function () {
204
+ jest.spyOn(global, 'FileReader').mockImplementation(function MockFileReader() {
205
+ this.readAsDataURL = function readAsDataURL() {
206
+ var _this = this;
207
+ this.result = 'data:image/png;base64,Zm9v';
208
+ queueMicrotask(function () {
209
+ if (_this.onload) {
210
+ _this.onload();
211
+ }
212
+ });
213
+ };
214
+ });
215
+ });
216
+ afterEach(function () {
217
+ global.FileReader.mockRestore();
218
+ });
219
+ it('registers one paste plugin', function () {
220
+ var insertContent = jest.fn();
221
+ var editor = {
222
+ commands: {
223
+ insertContent: insertContent
224
+ }
225
+ };
226
+ _state.Plugin.mockClear();
227
+ var plugins = _image.ImageUploadNode.addProseMirrorPlugins.call({
228
+ editor: editor
229
+ });
230
+ expect(plugins).toHaveLength(1);
231
+ expect(_state.Plugin).toHaveBeenCalledTimes(1);
232
+ });
233
+ it('handlePaste returns false when clipboard has no image file', function () {
234
+ var _setupPastePlugin = setupPastePlugin(),
235
+ handlePaste = _setupPastePlugin.handlePaste;
236
+ var event = {
237
+ clipboardData: {
238
+ items: [{
239
+ kind: 'string',
240
+ type: 'text/plain',
241
+ getAsFile: function getAsFile() {
242
+ return null;
243
+ }
244
+ }]
245
+ }
246
+ };
247
+ expect(handlePaste(mockView, event)).toBe(false);
248
+ });
249
+ it('handlePaste returns false when clipboardData is missing', function () {
250
+ var _setupPastePlugin2 = setupPastePlugin(),
251
+ handlePaste = _setupPastePlugin2.handlePaste;
252
+ var event = {};
253
+ expect(handlePaste(mockView, event)).toBe(false);
254
+ });
255
+ it('handlePaste returns false when the file item has no file', function () {
256
+ var _setupPastePlugin3 = setupPastePlugin(),
257
+ handlePaste = _setupPastePlugin3.handlePaste;
258
+ var event = {
259
+ clipboardData: {
260
+ items: [{
261
+ kind: 'file',
262
+ type: 'image/png',
263
+ getAsFile: function getAsFile() {
264
+ return null;
265
+ }
266
+ }]
267
+ }
268
+ };
269
+ expect(handlePaste(mockView, event)).toBe(false);
270
+ });
271
+ it('handlePaste returns true and inserts imageUploadNode with data URL after read', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
272
+ var _setupPastePlugin4, handlePaste, insertContent, file, event;
273
+ return _regenerator["default"].wrap(function (_context) {
274
+ while (1) switch (_context.prev = _context.next) {
275
+ case 0:
276
+ _setupPastePlugin4 = setupPastePlugin(), handlePaste = _setupPastePlugin4.handlePaste, insertContent = _setupPastePlugin4.insertContent;
277
+ file = new File([new Uint8Array([1, 2, 3])], 'p.png', {
278
+ type: 'image/png'
279
+ });
280
+ event = {
281
+ clipboardData: {
282
+ items: [{
283
+ kind: 'file',
284
+ type: 'image/png',
285
+ getAsFile: function getAsFile() {
286
+ return file;
287
+ }
288
+ }]
289
+ }
290
+ };
291
+ expect(handlePaste(mockView, event)).toBe(true);
292
+ expect(insertContent).not.toHaveBeenCalled();
293
+ _context.next = 1;
294
+ return new Promise(function (resolve) {
295
+ return queueMicrotask(resolve);
296
+ });
297
+ case 1:
298
+ expect(insertContent).toHaveBeenCalledWith(expect.objectContaining({
299
+ type: 'imageUploadNode',
300
+ attrs: expect.objectContaining({
301
+ src: 'data:image/png;base64,Zm9v',
302
+ loaded: true
303
+ })
304
+ }));
305
+ case 2:
306
+ case "end":
307
+ return _context.stop();
308
+ }
309
+ }, _callee);
310
+ })));
311
+ });
312
+ });
313
+ //# sourceMappingURL=image.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.test.js","names":["_state","require","_image","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","jest","mock","Node","create","fn","config","mergeAttributes","_len","args","Array","_key","assign","concat","Plugin","MockPlugin","spec","ReactNodeViewRenderer","component","__esModule","React","createElement","setupPastePlugin","insertContent","editor","commands","mockClear","ImageUploadNode","addProseMirrorPlugins","call","expect","toHaveBeenCalledTimes","handlePaste","calls","props","describe","it","name","toBe","group","atom","selectable","draggable","attributes","addAttributes","toHaveProperty","loaded","toEqual","deleteStatus","alignment","percent","width","height","src","alt","rules","parseHTML","isArray","toHaveLength","HTMLAttributes","result","renderHTML","addNodeView","toBeDefined","context","addCommands","_typeof2","setImageUploadNode","mockCommands","toHaveBeenCalledWith","objectContaining","type","attrs","nodeKey","any","String","mockView","beforeEach","spyOn","global","mockImplementation","MockFileReader","readAsDataURL","_this","queueMicrotask","onload","afterEach","FileReader","mockRestore","plugins","_setupPastePlugin","event","clipboardData","items","kind","getAsFile","_setupPastePlugin2","_setupPastePlugin3","_asyncToGenerator2","_regenerator","mark","_callee","_setupPastePlugin4","file","wrap","_context","prev","next","File","Uint8Array","not","toHaveBeenCalled","Promise","resolve","stop"],"sources":["../../../src/extensions/__tests__/image.test.js"],"sourcesContent":["jest.mock('@tiptap/core', () => ({\n Node: { create: jest.fn((config) => config) },\n mergeAttributes: jest.fn((...args) => Object.assign({}, ...args)),\n}));\n\njest.mock('@tiptap/pm/state', () => ({\n Plugin: jest.fn(function MockPlugin(spec) {\n this.spec = spec;\n return { spec };\n }),\n}));\n\njest.mock('@tiptap/react', () => ({\n ReactNodeViewRenderer: jest.fn((component) => component),\n}));\n\njest.mock('../image-component', () => ({\n __esModule: true,\n default: jest.fn(() => <div data-testid=\"image-component\" />),\n}));\n\nimport { Plugin } from '@tiptap/pm/state';\nimport { ImageUploadNode } from '../image';\n\nfunction setupPastePlugin() {\n const insertContent = jest.fn();\n const editor = { commands: { insertContent } };\n Plugin.mockClear();\n ImageUploadNode.addProseMirrorPlugins.call({ editor });\n expect(Plugin).toHaveBeenCalledTimes(1);\n const handlePaste = Plugin.mock.calls[0][0].props.handlePaste;\n return { handlePaste, insertContent, editor };\n}\n\ndescribe('ImageUploadNode', () => {\n describe('configuration', () => {\n it('has correct name', () => {\n expect(ImageUploadNode.name).toBe('imageUploadNode');\n });\n\n it('is in block group', () => {\n expect(ImageUploadNode.group).toBe('block');\n });\n\n it('is atomic', () => {\n expect(ImageUploadNode.atom).toBe(true);\n });\n\n it('is selectable', () => {\n expect(ImageUploadNode.selectable).toBe(true);\n });\n\n it('is draggable', () => {\n expect(ImageUploadNode.draggable).toBe(true);\n });\n });\n\n describe('addAttributes', () => {\n it('returns all required attributes with defaults', () => {\n const attributes = ImageUploadNode.addAttributes();\n\n expect(attributes).toHaveProperty('loaded');\n expect(attributes).toHaveProperty('deleteStatus');\n expect(attributes).toHaveProperty('alignment');\n expect(attributes).toHaveProperty('percent');\n expect(attributes).toHaveProperty('width');\n expect(attributes).toHaveProperty('height');\n expect(attributes).toHaveProperty('src');\n expect(attributes).toHaveProperty('alt');\n\n expect(attributes.loaded).toEqual({ default: false });\n expect(attributes.deleteStatus).toEqual({ default: null });\n expect(attributes.alignment).toEqual({ default: null });\n expect(attributes.percent).toEqual({ default: null });\n expect(attributes.width).toEqual({ default: null });\n expect(attributes.height).toEqual({ default: null });\n expect(attributes.src).toEqual({ default: null });\n expect(attributes.alt).toEqual({ default: null });\n });\n });\n\n describe('parseHTML', () => {\n it('returns array with div selector', () => {\n const rules = ImageUploadNode.parseHTML();\n\n expect(Array.isArray(rules)).toBe(true);\n expect(rules).toHaveLength(1);\n expect(rules[0]).toHaveProperty('tag', 'img[data-type=\"image-upload-node\"]');\n });\n });\n\n describe('renderHTML', () => {\n it('renders img tag with data-type attribute', () => {\n const HTMLAttributes = {\n src: 'test.jpg',\n width: 100,\n height: 100,\n };\n\n const result = ImageUploadNode.renderHTML({ HTMLAttributes });\n\n expect(result[0]).toBe('img');\n expect(result[1]).toEqual({\n ...HTMLAttributes,\n 'data-type': 'image-upload-node',\n });\n });\n\n it('merges attributes correctly', () => {\n const HTMLAttributes = {\n src: 'test.jpg',\n alt: 'Test image',\n };\n\n const result = ImageUploadNode.renderHTML({ HTMLAttributes });\n\n expect(result[1].src).toBe('test.jpg');\n expect(result[1].alt).toBe('Test image');\n expect(result[1]['data-type']).toBe('image-upload-node');\n });\n });\n\n describe('addNodeView', () => {\n it('returns ReactNodeViewRenderer result', () => {\n const result = ImageUploadNode.addNodeView();\n\n expect(result).toBeDefined();\n });\n });\n\n describe('addCommands', () => {\n it('returns setImageUploadNode command', () => {\n const context = { name: 'imageUploadNode' };\n const commands = ImageUploadNode.addCommands.call(context);\n\n expect(commands).toHaveProperty('setImageUploadNode');\n expect(typeof commands.setImageUploadNode).toBe('function');\n });\n\n it('setImageUploadNode inserts content', () => {\n const context = { name: 'imageUploadNode' };\n const commands = ImageUploadNode.addCommands.call(context);\n const mockCommands = {\n insertContent: jest.fn(() => true),\n };\n const result = commands.setImageUploadNode()({ commands: mockCommands });\n expect(mockCommands.insertContent).toHaveBeenCalledWith(\n expect.objectContaining({\n type: 'imageUploadNode',\n attrs: expect.objectContaining({ nodeKey: expect.any(String) }),\n }),\n );\n expect(result).toBe(true);\n });\n });\n\n describe('addProseMirrorPlugins', () => {\n const mockView = {};\n\n beforeEach(() => {\n jest.spyOn(global, 'FileReader').mockImplementation(function MockFileReader() {\n this.readAsDataURL = function readAsDataURL() {\n this.result = 'data:image/png;base64,Zm9v';\n queueMicrotask(() => {\n if (this.onload) {\n this.onload();\n }\n });\n };\n });\n });\n\n afterEach(() => {\n global.FileReader.mockRestore();\n });\n\n it('registers one paste plugin', () => {\n const insertContent = jest.fn();\n const editor = { commands: { insertContent } };\n Plugin.mockClear();\n const plugins = ImageUploadNode.addProseMirrorPlugins.call({ editor });\n expect(plugins).toHaveLength(1);\n expect(Plugin).toHaveBeenCalledTimes(1);\n });\n\n it('handlePaste returns false when clipboard has no image file', () => {\n const { handlePaste } = setupPastePlugin();\n const event = {\n clipboardData: {\n items: [{ kind: 'string', type: 'text/plain', getAsFile: () => null }],\n },\n };\n expect(handlePaste(mockView, event)).toBe(false);\n });\n\n it('handlePaste returns false when clipboardData is missing', () => {\n const { handlePaste } = setupPastePlugin();\n const event = {};\n expect(handlePaste(mockView, event)).toBe(false);\n });\n\n it('handlePaste returns false when the file item has no file', () => {\n const { handlePaste } = setupPastePlugin();\n const event = {\n clipboardData: {\n items: [{ kind: 'file', type: 'image/png', getAsFile: () => null }],\n },\n };\n expect(handlePaste(mockView, event)).toBe(false);\n });\n\n it('handlePaste returns true and inserts imageUploadNode with data URL after read', async () => {\n const { handlePaste, insertContent } = setupPastePlugin();\n const file = new File([new Uint8Array([1, 2, 3])], 'p.png', { type: 'image/png' });\n const event = {\n clipboardData: {\n items: [{ kind: 'file', type: 'image/png', getAsFile: () => file }],\n },\n };\n\n expect(handlePaste(mockView, event)).toBe(true);\n expect(insertContent).not.toHaveBeenCalled();\n\n await new Promise((resolve) => queueMicrotask(resolve));\n\n expect(insertContent).toHaveBeenCalledWith(\n expect.objectContaining({\n type: 'imageUploadNode',\n attrs: expect.objectContaining({\n src: 'data:image/png;base64,Zm9v',\n loaded: true,\n }),\n }),\n );\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}