@wordpress/preferences-persistence 1.0.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 (58) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE.md +788 -0
  3. package/README.md +59 -0
  4. package/build/create/debounce-async.js +80 -0
  5. package/build/create/debounce-async.js.map +1 -0
  6. package/build/create/index.js +115 -0
  7. package/build/create/index.js.map +1 -0
  8. package/build/index.js +61 -0
  9. package/build/index.js.map +1 -0
  10. package/build/migrations/legacy-local-storage-data/convert-edit-post-panels.js +60 -0
  11. package/build/migrations/legacy-local-storage-data/convert-edit-post-panels.js.map +1 -0
  12. package/build/migrations/legacy-local-storage-data/index.js +111 -0
  13. package/build/migrations/legacy-local-storage-data/index.js.map +1 -0
  14. package/build/migrations/legacy-local-storage-data/move-feature-preferences.js +135 -0
  15. package/build/migrations/legacy-local-storage-data/move-feature-preferences.js.map +1 -0
  16. package/build/migrations/legacy-local-storage-data/move-individual-preference.js +91 -0
  17. package/build/migrations/legacy-local-storage-data/move-individual-preference.js.map +1 -0
  18. package/build/migrations/legacy-local-storage-data/move-interface-enable-items.js +114 -0
  19. package/build/migrations/legacy-local-storage-data/move-interface-enable-items.js.map +1 -0
  20. package/build/migrations/legacy-local-storage-data/move-third-party-feature-preferences.js +99 -0
  21. package/build/migrations/legacy-local-storage-data/move-third-party-feature-preferences.js.map +1 -0
  22. package/build-module/create/debounce-async.js +73 -0
  23. package/build-module/create/debounce-async.js.map +1 -0
  24. package/build-module/create/index.js +104 -0
  25. package/build-module/create/index.js.map +1 -0
  26. package/build-module/index.js +45 -0
  27. package/build-module/index.js.map +1 -0
  28. package/build-module/migrations/legacy-local-storage-data/convert-edit-post-panels.js +53 -0
  29. package/build-module/migrations/legacy-local-storage-data/convert-edit-post-panels.js.map +1 -0
  30. package/build-module/migrations/legacy-local-storage-data/index.js +95 -0
  31. package/build-module/migrations/legacy-local-storage-data/index.js.map +1 -0
  32. package/build-module/migrations/legacy-local-storage-data/move-feature-preferences.js +128 -0
  33. package/build-module/migrations/legacy-local-storage-data/move-feature-preferences.js.map +1 -0
  34. package/build-module/migrations/legacy-local-storage-data/move-individual-preference.js +84 -0
  35. package/build-module/migrations/legacy-local-storage-data/move-individual-preference.js.map +1 -0
  36. package/build-module/migrations/legacy-local-storage-data/move-interface-enable-items.js +107 -0
  37. package/build-module/migrations/legacy-local-storage-data/move-interface-enable-items.js.map +1 -0
  38. package/build-module/migrations/legacy-local-storage-data/move-third-party-feature-preferences.js +92 -0
  39. package/build-module/migrations/legacy-local-storage-data/move-third-party-feature-preferences.js.map +1 -0
  40. package/package.json +37 -0
  41. package/src/create/debounce-async.js +75 -0
  42. package/src/create/index.js +112 -0
  43. package/src/create/test/debounce-async.js +129 -0
  44. package/src/create/test/index.js +178 -0
  45. package/src/index.js +49 -0
  46. package/src/migrations/legacy-local-storage-data/README.md +42 -0
  47. package/src/migrations/legacy-local-storage-data/convert-edit-post-panels.js +50 -0
  48. package/src/migrations/legacy-local-storage-data/index.js +102 -0
  49. package/src/migrations/legacy-local-storage-data/move-feature-preferences.js +135 -0
  50. package/src/migrations/legacy-local-storage-data/move-individual-preference.js +90 -0
  51. package/src/migrations/legacy-local-storage-data/move-interface-enable-items.js +120 -0
  52. package/src/migrations/legacy-local-storage-data/move-third-party-feature-preferences.js +98 -0
  53. package/src/migrations/legacy-local-storage-data/test/convert-edit-post-panels.js +47 -0
  54. package/src/migrations/legacy-local-storage-data/test/index.js +229 -0
  55. package/src/migrations/legacy-local-storage-data/test/move-feature-preferences.js +260 -0
  56. package/src/migrations/legacy-local-storage-data/test/move-individual-preference.js +188 -0
  57. package/src/migrations/legacy-local-storage-data/test/move-interface-enable-items.js +118 -0
  58. package/src/migrations/legacy-local-storage-data/test/move-third-party-feature-preferences.js +107 -0
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import moveFeaturePreferences from '../move-feature-preferences';
5
+
6
+ describe( 'moveFeaturePreferences', () => {
7
+ it( 'migrates multiple preferences from persisted source stores to preferences without overwriting data', () => {
8
+ const state = {
9
+ 'core/test-a': {
10
+ preferences: {
11
+ features: {
12
+ featureA: true,
13
+ featureB: false,
14
+ featureC: true,
15
+ },
16
+ },
17
+ },
18
+ 'core/test-b': {
19
+ preferences: {
20
+ features: {
21
+ featureD: true,
22
+ featureE: false,
23
+ featureF: true,
24
+ },
25
+ },
26
+ },
27
+ };
28
+
29
+ let convertedState = moveFeaturePreferences( state, 'core/test-a' );
30
+
31
+ convertedState = moveFeaturePreferences(
32
+ convertedState,
33
+ 'core/test-b'
34
+ );
35
+
36
+ expect( convertedState ).toEqual( {
37
+ 'core/preferences': {
38
+ preferences: {
39
+ 'core/test-a': {
40
+ featureA: true,
41
+ featureB: false,
42
+ featureC: true,
43
+ },
44
+ 'core/test-b': {
45
+ featureD: true,
46
+ featureE: false,
47
+ featureF: true,
48
+ },
49
+ },
50
+ },
51
+ 'core/test-a': {
52
+ preferences: {
53
+ features: undefined,
54
+ },
55
+ },
56
+ 'core/test-b': {
57
+ preferences: {
58
+ features: undefined,
59
+ },
60
+ },
61
+ } );
62
+ } );
63
+
64
+ it( 'migrates multiple preferences from the persisted interface store to preferences, with interface state taking precedence over source stores', () => {
65
+ const state = {
66
+ 'core/test-a': {
67
+ preferences: {
68
+ features: {
69
+ featureA: true,
70
+ featureB: false,
71
+ featureC: true,
72
+ },
73
+ },
74
+ },
75
+ 'core/test-b': {
76
+ preferences: {
77
+ features: {
78
+ featureD: true,
79
+ featureE: false,
80
+ featureF: true,
81
+ },
82
+ },
83
+ },
84
+ 'core/interface': {
85
+ otherData: {
86
+ test: 1,
87
+ },
88
+ preferences: {
89
+ features: {
90
+ 'core/test-a': {
91
+ featureG: true,
92
+ featureH: false,
93
+ featureI: true,
94
+ },
95
+ 'core/test-b': {
96
+ featureJ: true,
97
+ featureK: false,
98
+ featureL: true,
99
+ },
100
+ },
101
+ },
102
+ },
103
+ };
104
+
105
+ let convertedState = moveFeaturePreferences( state, 'core/test-a' );
106
+
107
+ convertedState = moveFeaturePreferences(
108
+ convertedState,
109
+ 'core/test-b'
110
+ );
111
+
112
+ expect( convertedState ).toEqual( {
113
+ 'core/preferences': {
114
+ preferences: {
115
+ 'core/test-a': {
116
+ featureG: true,
117
+ featureH: false,
118
+ featureI: true,
119
+ },
120
+ 'core/test-b': {
121
+ featureJ: true,
122
+ featureK: false,
123
+ featureL: true,
124
+ },
125
+ },
126
+ },
127
+ 'core/interface': {
128
+ otherData: {
129
+ test: 1,
130
+ },
131
+ preferences: {
132
+ features: {
133
+ 'core/test-a': undefined,
134
+ 'core/test-b': undefined,
135
+ },
136
+ },
137
+ },
138
+ 'core/test-a': {
139
+ preferences: {
140
+ features: undefined,
141
+ },
142
+ },
143
+ 'core/test-b': {
144
+ preferences: {
145
+ features: undefined,
146
+ },
147
+ },
148
+ } );
149
+ } );
150
+
151
+ it( 'only migrates persisted preference data for the source name from source stores', () => {
152
+ const state = {
153
+ 'core/test-a': {
154
+ otherData: {
155
+ test: 1,
156
+ },
157
+ preferences: {
158
+ features: {
159
+ featureA: true,
160
+ featureB: false,
161
+ featureC: true,
162
+ },
163
+ },
164
+ },
165
+ 'core/test-b': {
166
+ otherData: {
167
+ test: 2,
168
+ },
169
+ preferences: {
170
+ features: {
171
+ featureD: true,
172
+ featureE: false,
173
+ featureF: true,
174
+ },
175
+ },
176
+ },
177
+ };
178
+
179
+ const convertedState = moveFeaturePreferences( state, 'core/test-a' );
180
+
181
+ expect( convertedState ).toEqual( {
182
+ 'core/preferences': {
183
+ preferences: {
184
+ 'core/test-a': {
185
+ featureA: true,
186
+ featureB: false,
187
+ featureC: true,
188
+ },
189
+ },
190
+ },
191
+ 'core/test-a': {
192
+ otherData: {
193
+ test: 1,
194
+ },
195
+ preferences: {
196
+ features: undefined,
197
+ },
198
+ },
199
+ 'core/test-b': {
200
+ otherData: {
201
+ test: 2,
202
+ },
203
+ preferences: {
204
+ features: {
205
+ featureD: true,
206
+ featureE: false,
207
+ featureF: true,
208
+ },
209
+ },
210
+ },
211
+ } );
212
+ } );
213
+
214
+ it( 'only migrates persisted data for the source name from interface', () => {
215
+ const state = {
216
+ 'core/interface': {
217
+ preferences: {
218
+ features: {
219
+ 'core/test-a': {
220
+ featureG: true,
221
+ featureH: false,
222
+ featureI: true,
223
+ },
224
+ 'core/test-b': {
225
+ featureJ: true,
226
+ featureK: false,
227
+ featureL: true,
228
+ },
229
+ },
230
+ },
231
+ },
232
+ };
233
+
234
+ const convertedState = moveFeaturePreferences( state, 'core/test-a' );
235
+
236
+ expect( convertedState ).toEqual( {
237
+ 'core/preferences': {
238
+ preferences: {
239
+ 'core/test-a': {
240
+ featureG: true,
241
+ featureH: false,
242
+ featureI: true,
243
+ },
244
+ },
245
+ },
246
+ 'core/interface': {
247
+ preferences: {
248
+ features: {
249
+ 'core/test-a': undefined,
250
+ 'core/test-b': {
251
+ featureJ: true,
252
+ featureK: false,
253
+ featureL: true,
254
+ },
255
+ },
256
+ },
257
+ },
258
+ } );
259
+ } );
260
+ } );
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import moveIndividualPreference from '../move-individual-preference';
5
+
6
+ describe( 'moveIndividualPreference', () => {
7
+ it( 'migrates an individual preference from the source to the preferences store', () => {
8
+ const initialState = {
9
+ 'core/test': {
10
+ preferences: {
11
+ myPreference: '123',
12
+ },
13
+ },
14
+ };
15
+
16
+ const convertedData = moveIndividualPreference(
17
+ initialState,
18
+ { from: 'core/test', to: 'core/test' },
19
+ 'myPreference'
20
+ );
21
+
22
+ expect( convertedData ).toEqual( {
23
+ 'core/preferences': {
24
+ preferences: {
25
+ 'core/test': {
26
+ myPreference: '123',
27
+ },
28
+ },
29
+ },
30
+ 'core/test': {
31
+ preferences: {
32
+ myPreference: undefined,
33
+ },
34
+ },
35
+ } );
36
+ } );
37
+
38
+ it( 'does not overwrite other preferences in the preferences store', () => {
39
+ const initialState = {
40
+ 'core/test': {
41
+ otherData: {
42
+ test: 1,
43
+ },
44
+ preferences: {
45
+ myPreference: '123',
46
+ },
47
+ },
48
+ 'core/preferences': {
49
+ preferences: {
50
+ 'core/other-store': {
51
+ preferenceA: 1,
52
+ preferenceB: 2,
53
+ },
54
+ 'core/test': {
55
+ unrelatedPreference: 'unrelated-value',
56
+ },
57
+ },
58
+ },
59
+ };
60
+
61
+ const convertedData = moveIndividualPreference(
62
+ initialState,
63
+ { from: 'core/test', to: 'core/test' },
64
+ 'myPreference'
65
+ );
66
+
67
+ expect( convertedData ).toEqual( {
68
+ 'core/preferences': {
69
+ preferences: {
70
+ 'core/other-store': {
71
+ preferenceA: 1,
72
+ preferenceB: 2,
73
+ },
74
+ 'core/test': {
75
+ unrelatedPreference: 'unrelated-value',
76
+ myPreference: '123',
77
+ },
78
+ },
79
+ },
80
+ 'core/test': {
81
+ otherData: {
82
+ test: 1,
83
+ },
84
+ preferences: {
85
+ myPreference: undefined,
86
+ },
87
+ },
88
+ } );
89
+ } );
90
+
91
+ it( 'supports moving data to a scope that is differently named to the source store', () => {
92
+ const initialState = {
93
+ 'core/source': {
94
+ preferences: {
95
+ myPreference: '123',
96
+ },
97
+ },
98
+ };
99
+
100
+ const convertedData = moveIndividualPreference(
101
+ initialState,
102
+ { from: 'core/source', to: 'core/destination' },
103
+ 'myPreference'
104
+ );
105
+
106
+ expect( convertedData ).toEqual( {
107
+ 'core/preferences': {
108
+ preferences: {
109
+ 'core/destination': {
110
+ myPreference: '123',
111
+ },
112
+ },
113
+ },
114
+ 'core/source': {
115
+ preferences: {
116
+ myPreference: undefined,
117
+ },
118
+ },
119
+ } );
120
+ } );
121
+
122
+ it( 'does not migrate data if there is already a matching preference key at the target', () => {
123
+ const initialState = {
124
+ 'core/test': {
125
+ preferences: {
126
+ myPreference: '123',
127
+ },
128
+ },
129
+ 'core/preferences': {
130
+ preferences: {
131
+ 'core/test': {
132
+ myPreference: 'already-set',
133
+ },
134
+ },
135
+ },
136
+ };
137
+
138
+ const convertedData = moveIndividualPreference(
139
+ initialState,
140
+ { from: 'core/test', to: 'core/test' },
141
+ 'myPreference'
142
+ );
143
+
144
+ expect( convertedData ).toEqual( {
145
+ 'core/preferences': {
146
+ preferences: {
147
+ 'core/test': {
148
+ myPreference: 'already-set',
149
+ },
150
+ },
151
+ },
152
+ 'core/test': {
153
+ preferences: {
154
+ myPreference: '123',
155
+ },
156
+ },
157
+ } );
158
+ } );
159
+
160
+ it( 'migrates preferences that have a `false` value', () => {
161
+ const initialState = {
162
+ 'core/test': {
163
+ preferences: {
164
+ myFalsePreference: false,
165
+ },
166
+ },
167
+ };
168
+
169
+ const convertedData = moveIndividualPreference(
170
+ initialState,
171
+ { from: 'core/test', to: 'core/test' },
172
+ 'myFalsePreference'
173
+ );
174
+
175
+ expect( convertedData ).toEqual( {
176
+ 'core/preferences': {
177
+ preferences: {
178
+ 'core/test': {
179
+ myFalsePreference: false,
180
+ },
181
+ },
182
+ },
183
+ 'core/test': {
184
+ preferences: {},
185
+ },
186
+ } );
187
+ } );
188
+ } );
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import moveInterfaceEnableItems from '../move-interface-enable-items';
5
+
6
+ describe( 'moveInterfaceEnableItems', () => {
7
+ it( 'migrates enableItems to the preferences store', () => {
8
+ const state = {
9
+ 'core/interface': {
10
+ enableItems: {
11
+ singleEnableItems: {
12
+ complementaryArea: {
13
+ 'core/edit-post': 'edit-post/document',
14
+ 'core/edit-site': 'edit-site/global-styles',
15
+ },
16
+ },
17
+ multipleEnableItems: {
18
+ pinnedItems: {
19
+ 'core/edit-post': {
20
+ 'plugin-1': true,
21
+ },
22
+ 'core/edit-site': {
23
+ 'plugin-2': true,
24
+ },
25
+ },
26
+ },
27
+ },
28
+ },
29
+ };
30
+
31
+ const convertedState = moveInterfaceEnableItems( state );
32
+
33
+ expect( convertedState ).toEqual( {
34
+ 'core/preferences': {
35
+ preferences: {
36
+ 'core/edit-post': {
37
+ complementaryArea: 'edit-post/document',
38
+ pinnedItems: {
39
+ 'plugin-1': true,
40
+ },
41
+ },
42
+ 'core/edit-site': {
43
+ complementaryArea: 'edit-site/global-styles',
44
+ pinnedItems: {
45
+ 'plugin-2': true,
46
+ },
47
+ },
48
+ },
49
+ },
50
+ 'core/interface': {
51
+ enableItems: undefined,
52
+ },
53
+ } );
54
+ } );
55
+
56
+ it( 'merges pinnedItems and complementaryAreas with existing preferences store data', () => {
57
+ const state = {
58
+ 'core/interface': {
59
+ enableItems: {
60
+ singleEnableItems: {
61
+ complementaryArea: {
62
+ 'core/edit-post': 'edit-post/document',
63
+ 'core/edit-site': 'edit-site/global-styles',
64
+ },
65
+ },
66
+ multipleEnableItems: {
67
+ pinnedItems: {
68
+ 'core/edit-post': {
69
+ 'plugin-1': true,
70
+ },
71
+ 'core/edit-site': {
72
+ 'plugin-2': true,
73
+ },
74
+ },
75
+ },
76
+ },
77
+ },
78
+ 'core/preferences': {
79
+ preferences: {
80
+ 'core/edit-post': {
81
+ preferenceA: 1,
82
+ preferenceB: 2,
83
+ },
84
+ 'core/edit-site': {
85
+ preferenceC: true,
86
+ },
87
+ },
88
+ },
89
+ };
90
+
91
+ const convertedState = moveInterfaceEnableItems( state );
92
+
93
+ expect( convertedState ).toEqual( {
94
+ 'core/preferences': {
95
+ preferences: {
96
+ 'core/edit-post': {
97
+ preferenceA: 1,
98
+ preferenceB: 2,
99
+ complementaryArea: 'edit-post/document',
100
+ pinnedItems: {
101
+ 'plugin-1': true,
102
+ },
103
+ },
104
+ 'core/edit-site': {
105
+ preferenceC: true,
106
+ complementaryArea: 'edit-site/global-styles',
107
+ pinnedItems: {
108
+ 'plugin-2': true,
109
+ },
110
+ },
111
+ },
112
+ },
113
+ 'core/interface': {
114
+ enableItems: undefined,
115
+ },
116
+ } );
117
+ } );
118
+ } );
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import moveThirdPartyFeaturePreferences from '../move-third-party-feature-preferences';
5
+
6
+ describe( 'moveThirdPartyFeaturePreferences', () => {
7
+ it( 'migrates multiple scopes from the interface package to the preferences package', () => {
8
+ const state = {
9
+ 'core/interface': {
10
+ otherData: {
11
+ test: 1,
12
+ },
13
+ preferences: {
14
+ features: {
15
+ 'plugin-a': {
16
+ featureA: true,
17
+ featureB: false,
18
+ featureC: true,
19
+ },
20
+ 'plugin-b': {
21
+ featureD: true,
22
+ featureE: false,
23
+ featureF: true,
24
+ },
25
+ },
26
+ },
27
+ },
28
+ };
29
+
30
+ const convertedState = moveThirdPartyFeaturePreferences( state );
31
+
32
+ expect( convertedState ).toEqual( {
33
+ 'core/preferences': {
34
+ preferences: {
35
+ 'plugin-a': {
36
+ featureA: true,
37
+ featureB: false,
38
+ featureC: true,
39
+ },
40
+ 'plugin-b': {
41
+ featureD: true,
42
+ featureE: false,
43
+ featureF: true,
44
+ },
45
+ },
46
+ },
47
+ 'core/interface': {
48
+ otherData: {
49
+ test: 1,
50
+ },
51
+ preferences: {
52
+ features: {
53
+ 'plugin-a': undefined,
54
+ 'plugin-b': undefined,
55
+ },
56
+ },
57
+ },
58
+ } );
59
+ } );
60
+
61
+ it( 'ignores any core scopes', () => {
62
+ const state = {
63
+ 'core/interface': {
64
+ preferences: {
65
+ features: {
66
+ 'plugin-a': {
67
+ featureA: true,
68
+ featureB: false,
69
+ featureC: true,
70
+ },
71
+ 'core/edit-post': {
72
+ featureD: true,
73
+ featureE: false,
74
+ featureF: true,
75
+ },
76
+ },
77
+ },
78
+ },
79
+ };
80
+
81
+ const convertedState = moveThirdPartyFeaturePreferences( state );
82
+
83
+ expect( convertedState ).toEqual( {
84
+ 'core/preferences': {
85
+ preferences: {
86
+ 'plugin-a': {
87
+ featureA: true,
88
+ featureB: false,
89
+ featureC: true,
90
+ },
91
+ },
92
+ },
93
+ 'core/interface': {
94
+ preferences: {
95
+ features: {
96
+ 'plugin-a': undefined,
97
+ 'core/edit-post': {
98
+ featureD: true,
99
+ featureE: false,
100
+ featureF: true,
101
+ },
102
+ },
103
+ },
104
+ },
105
+ } );
106
+ } );
107
+ } );