@zipify/wysiwyg 1.0.0-dev.4 → 1.0.0-dev.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.
Files changed (61) hide show
  1. package/.release-it.json +0 -1
  2. package/README.md +3 -1
  3. package/config/jest/setupTests.js +3 -1
  4. package/example/ExampleApp.vue +39 -31
  5. package/example/example.js +26 -0
  6. package/example/presets.js +2 -0
  7. package/lib/Wysiwyg.vue +6 -0
  8. package/lib/composables/__tests__/useEditor.test.js +12 -3
  9. package/lib/composables/useEditor.js +12 -5
  10. package/lib/extensions/Alignment.js +6 -0
  11. package/lib/extensions/BackgroundColor.js +8 -1
  12. package/lib/extensions/FontColor.js +8 -1
  13. package/lib/extensions/FontFamily.js +7 -0
  14. package/lib/extensions/FontSize.js +12 -0
  15. package/lib/extensions/FontStyle.js +11 -0
  16. package/lib/extensions/FontWeight.js +25 -1
  17. package/lib/extensions/LineHeight.js +17 -0
  18. package/lib/extensions/StylePreset.js +30 -3
  19. package/lib/extensions/TextDecoration.js +11 -0
  20. package/lib/extensions/__tests__/Alignment.test.js +22 -1
  21. package/lib/extensions/__tests__/BackgroundColor.test.js +30 -1
  22. package/lib/extensions/__tests__/CaseStyle.test.js +4 -1
  23. package/lib/extensions/__tests__/FontColor.test.js +30 -1
  24. package/lib/extensions/__tests__/FontFamily.test.js +30 -1
  25. package/lib/extensions/__tests__/FontSize.test.js +30 -1
  26. package/lib/extensions/__tests__/FontStyle.test.js +38 -1
  27. package/lib/extensions/__tests__/FontWeight.test.js +58 -1
  28. package/lib/extensions/__tests__/LineHeight.test.js +41 -1
  29. package/lib/extensions/__tests__/StylePreset.test.js +76 -1
  30. package/lib/extensions/__tests__/TextDecoration.test.js +63 -1
  31. package/lib/extensions/__tests__/__snapshots__/Alignment.test.js.snap +44 -0
  32. package/lib/extensions/__tests__/__snapshots__/BackgroundColor.test.js.snap +91 -0
  33. package/lib/extensions/__tests__/__snapshots__/FontColor.test.js.snap +91 -0
  34. package/lib/extensions/__tests__/__snapshots__/FontFamily.test.js.snap +91 -0
  35. package/lib/extensions/__tests__/__snapshots__/FontSize.test.js.snap +99 -0
  36. package/lib/extensions/__tests__/__snapshots__/FontStyle.test.js.snap +120 -0
  37. package/lib/extensions/__tests__/__snapshots__/FontWeight.test.js.snap +149 -0
  38. package/lib/extensions/__tests__/__snapshots__/LineHeight.test.js.snap +92 -0
  39. package/lib/extensions/__tests__/__snapshots__/StylePreset.test.js.snap +167 -2
  40. package/lib/extensions/__tests__/__snapshots__/TextDecoration.test.js.snap +207 -0
  41. package/lib/extensions/core/__tests__/NodeProcessor.test.js +4 -1
  42. package/lib/extensions/core/__tests__/SelectionProcessor.test.js +9 -4
  43. package/lib/extensions/core/__tests__/TextProcessor.test.js +4 -1
  44. package/lib/extensions/index.js +1 -0
  45. package/lib/extensions/list/List.js +34 -0
  46. package/lib/extensions/list/__tests__/List.test.js +115 -3
  47. package/lib/extensions/list/__tests__/__snapshots__/List.test.js.snap +457 -6
  48. package/lib/services/ContentNormalizer.js +113 -0
  49. package/lib/services/Storage.js +1 -13
  50. package/lib/services/__tests__/ContentNormalizer.test.js +41 -0
  51. package/lib/services/__tests__/FavoriteColors.test.js +20 -0
  52. package/lib/services/__tests__/JsonSerializer.test.js +23 -0
  53. package/lib/services/__tests__/Storage.test.js +79 -0
  54. package/lib/services/index.js +1 -0
  55. package/lib/utils/__tests__/convertColor.test.js +19 -0
  56. package/lib/utils/__tests__/createKeyboardShortcut.test.js +25 -0
  57. package/lib/utils/__tests__/renderInlineSetting.test.js +26 -0
  58. package/lib/utils/convertColor.js +7 -0
  59. package/lib/utils/index.js +1 -0
  60. package/lib/utils/renderInlineSetting.js +1 -1
  61. package/package.json +1 -1
@@ -0,0 +1,79 @@
1
+ import { Storage } from '../Storage';
2
+
3
+ const createNativeStorage = (data) => ({
4
+ data: data ?? {},
5
+ setItem: jest.fn(function (key, data) {
6
+ this.data[key] = data;
7
+ }),
8
+ getItem: jest.fn(function (key) {
9
+ return this.data[key] || null;
10
+ })
11
+ });
12
+
13
+ function createStorage({ storage }) {
14
+ return new Storage(storage ?? createNativeStorage());
15
+ }
16
+
17
+ describe('get item', () => {
18
+ test('should return null if no data', () => {
19
+ const storage = createStorage({
20
+ storage: createNativeStorage({})
21
+ });
22
+
23
+ expect(storage.getItem('test')).toBe(null);
24
+ });
25
+
26
+ test('should parse json', () => {
27
+ const storage = createStorage({
28
+ storage: createNativeStorage({
29
+ 'zp.test': '{ "test": 1 }'
30
+ })
31
+ });
32
+
33
+ expect(storage.getItem('test')).toEqual({ test: 1 });
34
+ });
35
+
36
+ test('should handle error in private mode', () => {
37
+ const nativeStorage = createNativeStorage({});
38
+ const storage = createStorage({ storage: nativeStorage });
39
+ const error = new Error('private mode');
40
+
41
+ nativeStorage.getItem.mockImplementation(() => { throw error; });
42
+ storage.getItem('test');
43
+
44
+ // eslint-disable-next-line no-console
45
+ expect(console.error).toHaveBeenCalledWith(error);
46
+ });
47
+ });
48
+
49
+ describe('set item', () => {
50
+ test('should set item to storage', () => {
51
+ const nativeStorage = createNativeStorage({});
52
+ const storage = createStorage({ storage: nativeStorage });
53
+
54
+ storage.setItem('test', 'hello');
55
+
56
+ expect(nativeStorage.data).toEqual({ 'zp.test': '"hello"' });
57
+ });
58
+
59
+ test('should stringify json', () => {
60
+ const nativeStorage = createNativeStorage({});
61
+ const storage = createStorage({ storage: nativeStorage });
62
+
63
+ storage.setItem('test', { test: 1 });
64
+
65
+ expect(nativeStorage.data).toEqual({ 'zp.test': '{"test":1}' });
66
+ });
67
+
68
+ test('should handle error in private mode', () => {
69
+ const nativeStorage = createNativeStorage({});
70
+ const storage = createStorage({ storage: nativeStorage });
71
+ const error = new Error('private mode');
72
+
73
+ nativeStorage.getItem.mockImplementation(() => { throw error; });
74
+ storage.setItem('test', 'test');
75
+
76
+ // eslint-disable-next-line no-console
77
+ expect(console.error).toHaveBeenCalledWith(error);
78
+ });
79
+ });
@@ -1,3 +1,4 @@
1
1
  export { JsonSerializer } from './JsonSerializer';
2
2
  export { Storage } from './Storage';
3
3
  export { FavoriteColors } from './FavoriteColors';
4
+ export { ContentNormalizer } from './ContentNormalizer';
@@ -0,0 +1,19 @@
1
+ import { convertColor } from '../convertColor';
2
+
3
+ describe('convert color', () => {
4
+ test('should convert alias to color', () => {
5
+ expect(convertColor('red')).toBe('#FF0000');
6
+ });
7
+
8
+ test('should convert short hex to full', () => {
9
+ expect(convertColor('#F00')).toBe('#FF0000');
10
+ });
11
+
12
+ test('should convert short hex with alpha to rgba', () => {
13
+ expect(convertColor('#F003')).toBe('rgba(255, 0, 0, 20%)');
14
+ });
15
+
16
+ test('should convert rgba from float to percent', () => {
17
+ expect(convertColor('rgba(255, 0, 0, 0.2)')).toBe('rgba(255, 0, 0, 20%)');
18
+ });
19
+ });
@@ -0,0 +1,25 @@
1
+ import { createKeyboardShortcut } from '../createKeyboardShortcut';
2
+
3
+ describe('create shortcut', () => {
4
+ test('should bind command', () => {
5
+ const editor = {
6
+ commands: { toggleBold: jest.fn() }
7
+ };
8
+ const shortcut = createKeyboardShortcut('toggleBold');
9
+
10
+ shortcut({ editor });
11
+
12
+ expect(editor.commands.toggleBold).toHaveBeenCalled();
13
+ });
14
+
15
+ test('should bind command with arguments', () => {
16
+ const editor = {
17
+ commands: { applyAlignment: jest.fn() }
18
+ };
19
+ const shortcut = createKeyboardShortcut('applyAlignment', 'left');
20
+
21
+ shortcut({ editor });
22
+
23
+ expect(editor.commands.applyAlignment).toHaveBeenCalledWith('left');
24
+ });
25
+ });
@@ -27,6 +27,16 @@ describe('render settings', () => {
27
27
  expect(result).toMatchSnapshot();
28
28
  });
29
29
 
30
+ test('should render no attributes if all styles empty', () => {
31
+ const result = renderMark({
32
+ mobile_font_size: null,
33
+ tablet_font_size: null,
34
+ desktop_font_size: null
35
+ });
36
+
37
+ expect(result[1]).toEqual({});
38
+ });
39
+
30
40
  test('should render unwrapped styles', () => {
31
41
  const result = renderInlineSetting({
32
42
  mobile_font_size: '',
@@ -36,4 +46,20 @@ describe('render settings', () => {
36
46
 
37
47
  expect(result).toMatchSnapshot();
38
48
  });
49
+
50
+ test('should return null if no styles', () => {
51
+ const result = renderInlineSetting({});
52
+
53
+ expect(result).toBe(null);
54
+ });
55
+
56
+ test('should return null if all styles empty', () => {
57
+ const result = renderInlineSetting({
58
+ mobile_font_size: null,
59
+ tablet_font_size: null,
60
+ desktop_font_size: null
61
+ });
62
+
63
+ expect(result).toBe(null);
64
+ });
39
65
  });
@@ -0,0 +1,7 @@
1
+ import { ColorModel } from 'zipify-colorpicker';
2
+
3
+ export function convertColor(raw) {
4
+ const model = ColorModel.create(raw);
5
+
6
+ return model.alpha === 1 ? model.toHexString() : model.toRgbaString();
7
+ }
@@ -2,3 +2,4 @@ export { createCommand } from './createCommand';
2
2
  export { renderInlineSetting, renderMark } from './renderInlineSetting';
3
3
  export { capitalize } from './capitalize';
4
4
  export { createKeyboardShortcut } from './createKeyboardShortcut';
5
+ export { convertColor } from './convertColor';
@@ -13,5 +13,5 @@ export function renderInlineSetting(setting) {
13
13
  export function renderMark(setting) {
14
14
  const attrs = renderInlineSetting(setting);
15
15
 
16
- return ['span', attrs ? { ...attrs, class: 'zw-style' } : null, 0];
16
+ return ['span', attrs ? { ...attrs, class: 'zw-style' } : {}, 0];
17
17
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zipify/wysiwyg",
3
- "version": "1.0.0-dev.4",
3
+ "version": "1.0.0-dev.5",
4
4
  "description": "Zipify modification of TipTap text editor",
5
5
  "main": "lib/index.js",
6
6
  "repository": {