@zipify/wysiwyg 3.1.0-0 → 3.1.0

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 (81) hide show
  1. package/.eslintrc.js +17 -235
  2. package/.github/actions/setup/action.yaml +1 -1
  3. package/README.md +2 -0
  4. package/config/build/cli.config.js +7 -7
  5. package/config/build/lib.config.js +6 -4
  6. package/config/svgo.js +6 -3
  7. package/dist/cli.js +5 -4
  8. package/dist/wysiwyg.css +36 -33
  9. package/dist/wysiwyg.mjs +12403 -11604
  10. package/example/ExampleApp.vue +1 -1
  11. package/example/presets.js +7 -7
  12. package/example/tooltip/Tooltip.js +94 -69
  13. package/example/tooltip/tooltip.css +8 -31
  14. package/lib/Wysiwyg.vue +3 -0
  15. package/lib/__tests__/utils/buildTestExtensions.js +24 -2
  16. package/lib/cli/commands/ToJsonCommand.js +6 -6
  17. package/lib/components/base/__tests__/Button.test.js +1 -1
  18. package/lib/components/base/composables/__tests__/useDeselectionLock.test.js +2 -2
  19. package/lib/components/base/composables/__tests__/useElementRef.test.js +1 -1
  20. package/lib/components/base/composables/__tests__/useModalToggler.test.js +0 -2
  21. package/lib/components/base/composables/__tests__/useValidator.test.js +2 -2
  22. package/lib/components/base/composables/useModalToggler.js +30 -21
  23. package/lib/components/base/dropdown/DropdownActivator.vue +4 -0
  24. package/lib/components/toolbar/Toolbar.vue +1 -1
  25. package/lib/components/toolbar/base/__tests__/ToolbarDivider.test.js +1 -1
  26. package/lib/components/toolbar/controls/StylePresetControl.vue +2 -2
  27. package/lib/components/toolbar/controls/__tests__/LineHeightControl.test.js +0 -2
  28. package/lib/components/toolbar/controls/composables/__tests__/useRecentFonts.test.js +1 -1
  29. package/lib/components/toolbar/controls/link/composables/__tests__/useLink.test.js +2 -2
  30. package/lib/composables/useToolbar.js +24 -19
  31. package/lib/{entry-cli.js → entryCli.js} +0 -0
  32. package/lib/{entry-lib.js → entryLib.js} +0 -0
  33. package/lib/extensions/Alignment.js +6 -6
  34. package/lib/extensions/FontSize.js +1 -2
  35. package/lib/extensions/Link.js +2 -0
  36. package/lib/extensions/StylePreset.js +8 -46
  37. package/lib/extensions/__tests__/Alignment.test.js +1 -1
  38. package/lib/extensions/__tests__/BackgroundColor.test.js +2 -2
  39. package/lib/extensions/__tests__/FontColor.test.js +3 -3
  40. package/lib/extensions/__tests__/FontFamily.test.js +3 -3
  41. package/lib/extensions/__tests__/FontSize.test.js +3 -3
  42. package/lib/extensions/__tests__/FontWeight.test.js +4 -4
  43. package/lib/extensions/__tests__/LineHeight.test.js +2 -2
  44. package/lib/extensions/__tests__/Link.test.js +33 -5
  45. package/lib/extensions/__tests__/StylePreset.test.js +90 -119
  46. package/lib/extensions/__tests__/__snapshots__/Alignment.test.js.snap +2 -2
  47. package/lib/extensions/__tests__/__snapshots__/Link.test.js.snap +27 -0
  48. package/lib/extensions/__tests__/__snapshots__/StylePreset.test.js.snap +0 -2
  49. package/lib/extensions/core/NodeProcessor.js +9 -6
  50. package/lib/extensions/core/__tests__/NodeProcessor.test.js +6 -8
  51. package/lib/extensions/core/__tests__/TextProcessor.test.js +1 -1
  52. package/lib/extensions/core/index.js +0 -2
  53. package/lib/extensions/core/plugins/PlaceholderPlugin.js +2 -2
  54. package/lib/extensions/index.js +7 -3
  55. package/lib/extensions/list/List.js +4 -5
  56. package/lib/extensions/list/ListItem.js +1 -2
  57. package/lib/extensions/list/__tests__/List.test.js +7 -2
  58. package/lib/models/Font.js +2 -2
  59. package/lib/models/__tests__/Font.test.js +3 -9
  60. package/lib/services/ContentSerializer.js +9 -9
  61. package/lib/services/{ContextWidnow.js → ContextWindow.js} +0 -0
  62. package/lib/services/HtmlToJsonParser.js +3 -3
  63. package/lib/services/NodeFactory.js +6 -6
  64. package/lib/services/StylePresetRenderer.js +73 -0
  65. package/lib/services/__tests__/JsonSerializer.test.js +1 -1
  66. package/lib/services/__tests__/Storage.test.js +1 -1
  67. package/lib/services/__tests__/StylePresetRenderer.test.js +98 -0
  68. package/lib/services/__tests__/__snapshots__/StylePresetRenderer.test.js.snap +5 -0
  69. package/lib/services/index.js +2 -1
  70. package/lib/services/normalizer/BrowserDomParser.js +2 -2
  71. package/lib/services/normalizer/ContentNormalizer.js +3 -3
  72. package/lib/services/normalizer/HtmlNormalizer.js +52 -52
  73. package/lib/services/normalizer/JsonNormalizer.js +21 -21
  74. package/lib/styles/content.css +10 -10
  75. package/lib/utils/__tests__/convertAlignment.test.js +1 -1
  76. package/lib/utils/__tests__/renderInlineSetting.test.js +2 -2
  77. package/package.json +48 -46
  78. package/lib/extensions/core/steps/AddNodeMarkStep.js +0 -66
  79. package/lib/extensions/core/steps/AttrStep.js +0 -60
  80. package/lib/extensions/core/steps/RemoveNodeMarkStep.js +0 -56
  81. package/lib/extensions/core/steps/index.js +0 -3
package/.eslintrc.js CHANGED
@@ -1,254 +1,36 @@
1
- const JS_PARSER = '@babel/eslint-parser';
1
+ const appPackage = require('./package.json');
2
+
3
+ const jestVersion = appPackage.devDependencies.jest.replace('^', '');
4
+ const jestMajorVersion = Number(jestVersion.split('.')[0]);
2
5
 
3
6
  module.exports = {
4
- extends: ['eslint:recommended'],
5
- plugins: ['import'],
6
- parser: JS_PARSER,
7
- parserOptions: {
8
- ecmaVersion: 8,
9
- sourceType: 'module',
10
- allowImportExportEverywhere: true
11
- },
12
7
  settings: {
13
8
  'import/resolver': {
14
9
  node: {
15
10
  extensions: ['.js', '.css', '.vue', '.html']
16
11
  }
12
+ },
13
+ jest: {
14
+ version: jestMajorVersion
17
15
  }
18
16
  },
19
- env: {
20
- browser: true,
21
- es6: true,
22
- jquery: true,
23
- node: true,
24
- jest: true
25
- },
26
17
  globals: {
27
- noty: false,
28
- Buffer: false,
29
- gapi: true,
18
+ jest: true,
30
19
  globalThis: true,
31
20
  ZW_UPDATED_AT: true
32
21
  },
33
- rules: {
34
- // enable additional rules
35
- 'no-unused-vars': ['warn', { vars: 'local', args: 'after-used' }],
36
- 'no-extra-bind': 'error',
37
-
38
- // override default options for rules from base configurations
39
- 'no-cond-assign': ['error', 'always'],
40
- eqeqeq: ['warn', 'smart'],
41
-
42
- // disable rules from base configurations
43
- 'block-scoped-var': 'error',
44
- 'guard-for-in': 'off',
45
- 'no-loop-func': 'error',
46
- 'no-self-compare': 'error',
47
- 'no-use-before-define': 'error',
48
- 'no-unneeded-ternary': 'error',
49
- 'no-prototype-builtins': 'off',
50
- 'no-extend-native': 'error',
51
- 'padding-line-between-statements': [
52
- 'error',
53
- // offset after variables
54
- { blankLine: 'always', prev: ['const', 'let', 'var'], next: '*' },
55
- { blankLine: 'any', prev: ['const', 'let', 'var'], next: ['const', 'let', 'var'] },
56
-
57
- // offset after imports
58
- { blankLine: 'always', prev: 'import', next: '*' },
59
- { blankLine: 'any', prev: 'import', next: 'import' },
60
-
61
- // offset after oneline if statements
62
- { blankLine: 'always', prev: 'if', next: '*' },
63
- { blankLine: 'any', prev: 'if', next: 'if' },
64
- { blankLine: 'any', prev: 'multiline-block-like', next: '*' }
65
- ],
66
- 'no-console': 'error',
67
- 'comma-dangle': ['error', 'never'],
68
- quotes: ['error', 'single'],
69
- semi: ['error', 'always'],
70
- curly: ['error', 'multi-line'],
71
- 'lines-between-class-members': ['error', 'always', { exceptAfterSingleLine: true }],
72
- 'padded-blocks': ['error', 'never'],
73
- 'object-curly-spacing': ['error', 'always'],
74
- 'array-bracket-spacing': ['error', 'never'],
75
- 'comma-spacing': [
76
- 'error',
77
- {
78
- before: false,
79
- after: true
80
- }
81
- ],
82
- 'space-infix-ops': 'error',
83
- 'keyword-spacing': 'off',
84
- 'comma-style': ['error', 'last'],
85
- 'space-before-blocks': 'error',
86
- 'arrow-spacing': [
87
- 'error',
88
- {
89
- before: true,
90
- after: true
91
- }
92
- ],
93
- 'brace-style': ['error', '1tbs', { allowSingleLine: true }],
94
- 'template-curly-spacing': ['error', 'never'],
95
- 'prefer-template': 'error',
96
- 'no-useless-concat': 'error',
97
- 'no-duplicate-imports': 'error',
98
- 'no-param-reassign': ['error', { props: false }],
99
- 'new-parens': ['error', 'always'],
100
- 'default-param-last': 'error',
101
- 'max-params': ['error', 4],
102
- 'no-useless-computed-key': ['error', { enforceForClassMembers: true }],
103
- 'dot-notation': 'error',
104
- 'import/named': 'error',
105
- 'import/default': 'error',
106
- 'import/namespace': 'error',
107
- 'import/no-absolute-path': 'error',
108
- 'import/no-self-import': 'error',
109
- 'import/no-useless-path-segments': 'error',
110
- 'import/export': 'error',
111
- 'import/no-deprecated': 'warn',
112
- 'import/first': 'error',
113
- 'import/no-namespace': 'error',
114
- 'import/extensions': [
115
- 'error',
116
- 'never',
117
- { html: 'always' }
118
- ],
119
- 'import/order': [
120
- 'error',
121
- {
122
- groups: [
123
- 'builtin',
124
- 'external',
125
- 'internal',
126
- 'parent',
127
- 'sibling'
128
- ]
129
- }
130
- ],
131
- 'import/newline-after-import': 'error',
132
- 'max-len': ['error', {
133
- code: 120,
134
- ignoreUrls: true,
135
- ignoreStrings: true,
136
- ignoreTemplateLiterals: true,
137
- ignoreRegExpLiterals: true,
138
- ignoreComments: true
139
- }],
140
- indent: ['error', 4, { SwitchCase: 1 }],
141
- 'linebreak-style': ['error', 'unix'],
142
- 'arrow-parens': ['warn', 'always']
143
- },
144
22
  overrides: [
23
+ {
24
+ files: '*.js',
25
+ extends: ['@zipify/eslint-config/preset-js']
26
+ },
27
+ {
28
+ files: '*.test.js',
29
+ extends: ['@zipify/eslint-config/preset-jest']
30
+ },
145
31
  {
146
32
  files: '*.vue',
147
- extends: ['plugin:vue/essential'],
148
- parser: 'vue-eslint-parser',
149
- parserOptions: {
150
- parser: JS_PARSER
151
- },
152
- plugins: ['vue'],
153
- rules: {
154
- 'vue/script-indent': ['error', 4, { switchCase: 1 }],
155
- 'vue/html-indent': ['error', 4],
156
- 'vue/prop-name-casing': ['error', 'camelCase'],
157
- 'vue/attribute-hyphenation': 'off', // Breaks slot props
158
- 'vue/component-definition-name-casing': 'error',
159
- 'vue/component-name-in-template-casing': 'error',
160
- 'vue/require-prop-types': 'error',
161
- 'vue/require-default-prop': 'error',
162
- 'vue/mustache-interpolation-spacing': ['error', 'always'],
163
- 'vue/html-self-closing': 'error',
164
- 'vue/html-closing-bracket-spacing': [
165
- 'error',
166
- {
167
- startTag: 'never',
168
- endTag: 'never',
169
- selfClosingTag: 'always'
170
- }
171
- ],
172
- 'vue/html-closing-bracket-newline': [
173
- 'error',
174
- {
175
- singleline: 'never',
176
- multiline: 'always'
177
- }
178
- ],
179
- 'vue/no-spaces-around-equal-signs-in-attribute': 'error',
180
- 'vue/singleline-html-element-content-newline': 'error',
181
- 'vue/v-bind-style': 'error',
182
- 'vue/v-on-style': 'error',
183
- 'vue/component-tags-order': [
184
- 'error',
185
- {
186
- order: ['template', 'script', 'style']
187
- }
188
- ],
189
- 'vue/order-in-components': [
190
- 'error',
191
- {
192
- order: [
193
- 'el',
194
- 'name',
195
- 'functional',
196
- 'components',
197
- 'directives',
198
- 'mixins',
199
- 'inheritAttrs',
200
- 'model',
201
- 'props',
202
- 'propsData',
203
- 'data',
204
- 'computed',
205
- 'watch',
206
- 'LIFECYCLE_HOOKS',
207
- 'methods',
208
- ['template', 'render']
209
- ]
210
- }
211
- ],
212
- 'vue/this-in-template': 'error',
213
- 'vue/block-tag-newline': [
214
- 'error',
215
- {
216
- singleline: 'always',
217
- multiline: 'always'
218
- }
219
- ],
220
- 'vue/match-component-file-name': ['error', { extensions: ['vue'] }],
221
- 'vue/no-empty-component-block': 'error',
222
- 'vue/no-static-inline-styles': 'error',
223
- 'vue/no-useless-mustaches': 'error',
224
- 'vue/no-useless-v-bind': 'error',
225
- 'vue/padding-line-between-blocks': ['error', 'always'],
226
- 'vue/require-name-property': 'error',
227
- 'vue/html-button-has-type': ['error'],
228
- 'vue/no-unused-refs': 'error',
229
- 'vue/no-deprecated-slot-attribute': 'error',
230
- 'vue/no-deprecated-slot-scope-attribute': 'error',
231
- 'vue/no-use-computed-property-like-method': 'error',
232
- 'vue/no-v-text': 'error',
233
- 'object-shorthand': ['error', 'always', { avoidQuotes: true }],
234
- 'max-len': 'off',
235
- 'vue/max-len': [
236
- 'error',
237
- {
238
- code: 120,
239
- template: 120,
240
- ignoreComments: true,
241
- ignoreUrls: true,
242
- ignoreStrings: true,
243
- ignoreTemplateLiterals: true,
244
- ignoreRegExpLiterals: true,
245
- ignoreHTMLAttributeValues: true,
246
- ignoreHTMLTextContents: true
247
- }
248
- ],
249
- 'vue/multi-word-component-names': 'off',
250
- 'vue/no-reserved-component-names': 'off' // Conflicts with base components
251
- }
33
+ extends: ['@zipify/eslint-config/preset-vue']
252
34
  }
253
35
  ]
254
36
  };
@@ -6,7 +6,7 @@ runs:
6
6
  steps:
7
7
  - uses: actions/setup-node@v2
8
8
  with:
9
- node-version: 14.18.1
9
+ node-version: 18.12.1
10
10
 
11
11
  - id: npm-cache
12
12
  uses: actions/cache@v3
package/README.md CHANGED
@@ -1,4 +1,6 @@
1
1
  # ZipifyWysiwyg
2
+ [![npm](https://img.shields.io/npm/v/@zipify/wysiwyg.svg?sanitize=true)](https://www.npmjs.com/package/@zipify/colorpicker)
3
+ [![Downloads](https://img.shields.io/npm/dm/@zipify/wysiwyg.svg?sanitize=true)](https://www.npmjs.com/package/@zipify/colorpicker)
2
4
 
3
5
  Zipify modification of TipTap text editor
4
6
 
@@ -1,17 +1,17 @@
1
1
  import { nodeResolve } from '@rollup/plugin-node-resolve';
2
2
  import { getBabelOutputPlugin } from '@rollup/plugin-babel';
3
- import { terser } from 'rollup-plugin-terser';
3
+ import terser from '@rollup/plugin-terser';
4
4
  import commonjs from '@rollup/plugin-commonjs';
5
5
  import replace from '@rollup/plugin-replace';
6
6
  import json from '@rollup/plugin-json';
7
7
  import { resolvePath, isDevelopment } from './settings';
8
8
 
9
9
  const productionPlugins = isDevelopment ? [] : [
10
- terser()
10
+ terser({ toplevel: true })
11
11
  ];
12
12
 
13
13
  export default {
14
- input: resolvePath('./lib/entry-cli.js'),
14
+ input: resolvePath('./lib/entryCli.js'),
15
15
 
16
16
  output: {
17
17
  file: resolvePath('./dist/cli.js'),
@@ -21,7 +21,8 @@ export default {
21
21
  presets: [
22
22
  ['@babel/preset-env', { targets: { node: 18 } }]
23
23
  ]
24
- })
24
+ }),
25
+ ...productionPlugins
25
26
  ]
26
27
  },
27
28
 
@@ -31,12 +32,11 @@ export default {
31
32
  values: { 'import.meta.glob': '(() => ({}))' }
32
33
  }),
33
34
  nodeResolve({
34
- extensions: ['*', '.js', '.vue', '.json'],
35
+ extensions: ['*', '.js', '.json'],
35
36
  preferBuiltins: true
36
37
  }),
37
38
  commonjs({ ignore: ['canvas'] }),
38
- json(),
39
- ...productionPlugins
39
+ json()
40
40
  ],
41
41
 
42
42
  external: ['jsdom']
@@ -8,7 +8,7 @@ export default defineConfig({
8
8
  minify: false,
9
9
 
10
10
  lib: {
11
- entry: resolvePath('./lib/entry-lib.js'),
11
+ entry: resolvePath('./lib/entryLib.js'),
12
12
  fileName: 'wysiwyg',
13
13
  formats: ['es']
14
14
  },
@@ -19,8 +19,7 @@ export default defineConfig({
19
19
  return asset.name === 'style.css' ? 'wysiwyg.css' : asset.name;
20
20
  }
21
21
  },
22
- external: ['vue', '@zipify/colorpicker'],
23
- plugins: [optimizeLodashImports()]
22
+ external: ['vue', '@zipify/colorpicker']
24
23
  }
25
24
  },
26
25
 
@@ -28,5 +27,8 @@ export default defineConfig({
28
27
  extensions: ['*', '.js', '.vue', '.json']
29
28
  },
30
29
 
31
- plugins: [createVuePlugin()]
30
+ plugins: [
31
+ createVuePlugin(),
32
+ optimizeLodashImports()
33
+ ]
32
34
  });
package/config/svgo.js CHANGED
@@ -1,16 +1,19 @@
1
1
  module.exports = {
2
2
  js2svg: {
3
- indent: 4,
3
+ indent: 2,
4
4
  pretty: true
5
5
  },
6
6
  multipass: true,
7
7
  plugins: [
8
8
  {
9
9
  name: 'preset-default',
10
- params: { removeViewBox: false }
10
+ params: {
11
+ overrides: {
12
+ removeViewBox: false
13
+ }
14
+ }
11
15
  },
12
16
  'removeDimensions',
13
- 'sortAttrs',
14
17
  'convertStyleToAttrs',
15
18
  {
16
19
  name: 'removeAttrs',