@contentful/field-editor-json 3.1.7 → 3.3.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.
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return JsonEditor;
9
+ }
10
+ });
11
+ const _react = _interop_require_wildcard(require("react"));
12
+ const _fieldeditorshared = require("@contentful/field-editor-shared");
13
+ const _deepequal = _interop_require_default(require("deep-equal"));
14
+ const _throttle = _interop_require_default(require("lodash/throttle"));
15
+ const _JsonEditorField = require("./JsonEditorField");
16
+ const _JsonEditorToolbar = require("./JsonEditorToolbar");
17
+ const _JsonInvalidStatus = require("./JsonInvalidStatus");
18
+ const _utils = require("./utils");
19
+ function _define_property(obj, key, value) {
20
+ if (key in obj) {
21
+ Object.defineProperty(obj, key, {
22
+ value: value,
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true
26
+ });
27
+ } else {
28
+ obj[key] = value;
29
+ }
30
+ return obj;
31
+ }
32
+ function _interop_require_default(obj) {
33
+ return obj && obj.__esModule ? obj : {
34
+ default: obj
35
+ };
36
+ }
37
+ function _getRequireWildcardCache(nodeInterop) {
38
+ if (typeof WeakMap !== "function") return null;
39
+ var cacheBabelInterop = new WeakMap();
40
+ var cacheNodeInterop = new WeakMap();
41
+ return (_getRequireWildcardCache = function(nodeInterop) {
42
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
43
+ })(nodeInterop);
44
+ }
45
+ function _interop_require_wildcard(obj, nodeInterop) {
46
+ if (!nodeInterop && obj && obj.__esModule) {
47
+ return obj;
48
+ }
49
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
50
+ return {
51
+ default: obj
52
+ };
53
+ }
54
+ var cache = _getRequireWildcardCache(nodeInterop);
55
+ if (cache && cache.has(obj)) {
56
+ return cache.get(obj);
57
+ }
58
+ var newObj = {};
59
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
60
+ for(var key in obj){
61
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
62
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
63
+ if (desc && (desc.get || desc.set)) {
64
+ Object.defineProperty(newObj, key, desc);
65
+ } else {
66
+ newObj[key] = obj[key];
67
+ }
68
+ }
69
+ }
70
+ newObj.default = obj;
71
+ if (cache) {
72
+ cache.set(obj, newObj);
73
+ }
74
+ return newObj;
75
+ }
76
+ var _React_Component;
77
+ class ConnectedJsonEditor extends (_React_Component = _react.Component) {
78
+ render() {
79
+ return _react.createElement("div", {
80
+ "data-test-id": "json-editor"
81
+ }, _react.createElement(_JsonEditorToolbar.JsonEditorToolbar, {
82
+ isRedoDisabled: this.props.disabled || this.state.redoStack.length === 0,
83
+ isUndoDisabled: this.props.disabled || this.state.undoStack.length === 0,
84
+ onUndo: this.onUndo,
85
+ onRedo: this.onRedo
86
+ }), _react.createElement(_JsonEditorField.JsonEditorField, {
87
+ value: this.state.value,
88
+ onChange: this.onChange,
89
+ isDisabled: this.props.disabled
90
+ }), !this.state.isValidJson && _react.createElement(_JsonInvalidStatus.JsonInvalidStatus, null));
91
+ }
92
+ constructor(props){
93
+ super(props);
94
+ _define_property(this, "setValidJson", (value)=>{
95
+ this.setState({
96
+ isValidJson: value
97
+ });
98
+ });
99
+ _define_property(this, "pushUndo", (0, _throttle.default)((value)=>{
100
+ this.setState((state)=>({
101
+ undoStack: [
102
+ ...state.undoStack,
103
+ value
104
+ ]
105
+ }));
106
+ }, 400));
107
+ _define_property(this, "onChange", (value)=>{
108
+ const parsed = (0, _utils.parseJSON)(value);
109
+ if (value !== this.state.lastUndo) {
110
+ this.pushUndo(this.state.value);
111
+ }
112
+ this.setState({
113
+ value,
114
+ isValidJson: parsed.valid
115
+ });
116
+ if (parsed.valid) {
117
+ this.props.setValue(parsed.value);
118
+ }
119
+ });
120
+ _define_property(this, "onUndo", ()=>{
121
+ const undoStack = this.state.undoStack;
122
+ if (undoStack.length === 0) {
123
+ return;
124
+ }
125
+ const value = undoStack.pop() || '';
126
+ const parsedValue = (0, _utils.parseJSON)(value);
127
+ this.setState((state)=>({
128
+ ...state,
129
+ value,
130
+ isValidJson: parsedValue.valid,
131
+ undoStack,
132
+ redoStack: [
133
+ ...state.redoStack,
134
+ state.value
135
+ ],
136
+ lastUndo: value
137
+ }), ()=>{
138
+ if (parsedValue.valid) {
139
+ this.props.setValue(parsedValue.value);
140
+ }
141
+ });
142
+ });
143
+ _define_property(this, "onRedo", ()=>{
144
+ const redoStack = [
145
+ ...this.state.redoStack
146
+ ];
147
+ if (redoStack.length === 0) {
148
+ return;
149
+ }
150
+ const value = redoStack.pop() || '';
151
+ const parsedValue = (0, _utils.parseJSON)(value);
152
+ this.setState((state)=>({
153
+ ...state,
154
+ value,
155
+ isValidJson: parsedValue.valid,
156
+ redoStack,
157
+ undoStack: [
158
+ ...state.undoStack,
159
+ state.value
160
+ ]
161
+ }), ()=>{
162
+ if (parsedValue.valid) {
163
+ this.props.setValue(parsedValue.value);
164
+ }
165
+ });
166
+ });
167
+ this.state = {
168
+ value: (0, _utils.stringifyJSON)(props.initialValue),
169
+ isValidJson: true,
170
+ undoStack: [],
171
+ redoStack: [],
172
+ lastUndo: ''
173
+ };
174
+ }
175
+ }
176
+ _define_property(ConnectedJsonEditor, "defaultProps", {
177
+ isInitiallyDisabled: true
178
+ });
179
+ function JsonEditor(props) {
180
+ return _react.createElement(_fieldeditorshared.FieldConnector, {
181
+ field: props.field,
182
+ isInitiallyDisabled: props.isInitiallyDisabled,
183
+ isEqualValues: (value1, value2)=>{
184
+ return (0, _deepequal.default)(value1, value2);
185
+ }
186
+ }, ({ value , disabled , setValue , externalReset })=>{
187
+ return _react.createElement(ConnectedJsonEditor, {
188
+ key: `json-editor-${externalReset}`,
189
+ initialValue: value,
190
+ disabled: disabled,
191
+ setValue: setValue
192
+ });
193
+ });
194
+ }
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "JsonEditorField", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return JsonEditorField;
9
+ }
10
+ });
11
+ const _react = _interop_require_wildcard(require("react"));
12
+ const _langjson = require("@codemirror/lang-json");
13
+ const _view = require("@codemirror/view");
14
+ const _f36tokens = _interop_require_default(require("@contentful/f36-tokens"));
15
+ const _reactcodemirror = _interop_require_default(require("@uiw/react-codemirror"));
16
+ const _emotion = require("emotion");
17
+ function _interop_require_default(obj) {
18
+ return obj && obj.__esModule ? obj : {
19
+ default: obj
20
+ };
21
+ }
22
+ function _getRequireWildcardCache(nodeInterop) {
23
+ if (typeof WeakMap !== "function") return null;
24
+ var cacheBabelInterop = new WeakMap();
25
+ var cacheNodeInterop = new WeakMap();
26
+ return (_getRequireWildcardCache = function(nodeInterop) {
27
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
28
+ })(nodeInterop);
29
+ }
30
+ function _interop_require_wildcard(obj, nodeInterop) {
31
+ if (!nodeInterop && obj && obj.__esModule) {
32
+ return obj;
33
+ }
34
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
35
+ return {
36
+ default: obj
37
+ };
38
+ }
39
+ var cache = _getRequireWildcardCache(nodeInterop);
40
+ if (cache && cache.has(obj)) {
41
+ return cache.get(obj);
42
+ }
43
+ var newObj = {};
44
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
45
+ for(var key in obj){
46
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
47
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
48
+ if (desc && (desc.get || desc.set)) {
49
+ Object.defineProperty(newObj, key, desc);
50
+ } else {
51
+ newObj[key] = obj[key];
52
+ }
53
+ }
54
+ }
55
+ newObj.default = obj;
56
+ if (cache) {
57
+ cache.set(obj, newObj);
58
+ }
59
+ return newObj;
60
+ }
61
+ const styles = {
62
+ root: (0, _emotion.css)({
63
+ cursor: 'text',
64
+ padding: _f36tokens.default.spacingS,
65
+ border: `1px solid ${_f36tokens.default.gray200}`,
66
+ borderTop: 'none',
67
+ borderBottomLeftRadius: _f36tokens.default.borderRadiusSmall,
68
+ borderBottomRightRadius: _f36tokens.default.borderRadiusSmall,
69
+ fontSize: _f36tokens.default.fontSizeM,
70
+ '.cm-editor': {
71
+ color: _f36tokens.default.gray900,
72
+ '&.cm-focused': {
73
+ outline: 'none'
74
+ }
75
+ },
76
+ '.cm-scroller': {
77
+ fontFamily: _f36tokens.default.fontStackMonospace,
78
+ minHeight: '6rem'
79
+ },
80
+ '&.disabled': {
81
+ cursor: 'auto',
82
+ '.cm-scroller ': {
83
+ minHeight: '6rem',
84
+ backgroundColor: _f36tokens.default.gray100,
85
+ cursor: 'not-allowed'
86
+ },
87
+ '.cm-editor': {
88
+ border: `1px solid ${_f36tokens.default.gray200}`
89
+ },
90
+ '.cm-line': {
91
+ cursor: 'not-allowed'
92
+ },
93
+ '.cm-lines': {
94
+ cursor: 'not-allowed'
95
+ }
96
+ }
97
+ })
98
+ };
99
+ function JsonEditorField(props) {
100
+ return _react.createElement("div", {
101
+ className: (0, _emotion.cx)(styles.root, {
102
+ disabled: props.isDisabled
103
+ }),
104
+ "data-test-id": "json-editor-code-mirror"
105
+ }, _react.createElement(_reactcodemirror.default, {
106
+ value: props.value,
107
+ onChange: props.onChange,
108
+ theme: "light",
109
+ extensions: [
110
+ (0, _langjson.json)(),
111
+ _view.EditorView.lineWrapping
112
+ ],
113
+ basicSetup: {
114
+ closeBrackets: false,
115
+ lineNumbers: false,
116
+ highlightActiveLineGutter: false,
117
+ searchKeymap: false,
118
+ highlightActiveLine: false,
119
+ foldGutter: false,
120
+ bracketMatching: false,
121
+ syntaxHighlighting: false
122
+ },
123
+ width: "100%",
124
+ editable: !props.isDisabled,
125
+ indentWithTab: true
126
+ }));
127
+ }
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "JsonEditorToolbar", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return JsonEditorToolbar;
9
+ }
10
+ });
11
+ const _react = _interop_require_wildcard(require("react"));
12
+ const _f36components = require("@contentful/f36-components");
13
+ const _f36tokens = _interop_require_default(require("@contentful/f36-tokens"));
14
+ const _emotion = require("emotion");
15
+ function _interop_require_default(obj) {
16
+ return obj && obj.__esModule ? obj : {
17
+ default: obj
18
+ };
19
+ }
20
+ function _getRequireWildcardCache(nodeInterop) {
21
+ if (typeof WeakMap !== "function") return null;
22
+ var cacheBabelInterop = new WeakMap();
23
+ var cacheNodeInterop = new WeakMap();
24
+ return (_getRequireWildcardCache = function(nodeInterop) {
25
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
26
+ })(nodeInterop);
27
+ }
28
+ function _interop_require_wildcard(obj, nodeInterop) {
29
+ if (!nodeInterop && obj && obj.__esModule) {
30
+ return obj;
31
+ }
32
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
33
+ return {
34
+ default: obj
35
+ };
36
+ }
37
+ var cache = _getRequireWildcardCache(nodeInterop);
38
+ if (cache && cache.has(obj)) {
39
+ return cache.get(obj);
40
+ }
41
+ var newObj = {};
42
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
43
+ for(var key in obj){
44
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
45
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
46
+ if (desc && (desc.get || desc.set)) {
47
+ Object.defineProperty(newObj, key, desc);
48
+ } else {
49
+ newObj[key] = obj[key];
50
+ }
51
+ }
52
+ }
53
+ newObj.default = obj;
54
+ if (cache) {
55
+ cache.set(obj, newObj);
56
+ }
57
+ return newObj;
58
+ }
59
+ const styles = {
60
+ toolbar: (0, _emotion.css)({
61
+ display: 'flex',
62
+ alignItems: 'center',
63
+ padding: _f36tokens.default.spacingXs,
64
+ justifyContent: 'space-between',
65
+ backgroundColor: _f36tokens.default.gray100,
66
+ border: `1px solid ${_f36tokens.default.gray200}`,
67
+ borderTopLeftRadius: _f36tokens.default.borderRadiusSmall,
68
+ borderTopRightRadius: _f36tokens.default.borderRadiusSmall,
69
+ borderBottom: 'none'
70
+ }),
71
+ title: (0, _emotion.css)({
72
+ fontFamily: _f36tokens.default.fontStackPrimary,
73
+ fontSize: _f36tokens.default.fontSizeM,
74
+ color: _f36tokens.default.gray600
75
+ }),
76
+ actions: (0, _emotion.css)({
77
+ button: {
78
+ marginLeft: _f36tokens.default.spacingS
79
+ }
80
+ })
81
+ };
82
+ function JsonEditorToolbar(props) {
83
+ return _react.createElement("div", {
84
+ className: styles.toolbar
85
+ }, _react.createElement("div", {
86
+ className: styles.title
87
+ }, "JSON Editor"), _react.createElement("div", {
88
+ className: styles.actions
89
+ }, _react.createElement(_f36components.Button, {
90
+ variant: "secondary",
91
+ size: "small",
92
+ isDisabled: props.isUndoDisabled,
93
+ testId: "json-editor-undo",
94
+ onClick: ()=>{
95
+ props.onUndo();
96
+ }
97
+ }, "Undo"), _react.createElement(_f36components.Button, {
98
+ variant: "secondary",
99
+ size: "small",
100
+ isDisabled: props.isRedoDisabled,
101
+ testId: "json-editor-redo",
102
+ onClick: ()=>{
103
+ props.onRedo();
104
+ }
105
+ }, "Redo")));
106
+ }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "JsonInvalidStatus", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return JsonInvalidStatus;
9
+ }
10
+ });
11
+ const _react = _interop_require_wildcard(require("react"));
12
+ const _f36components = require("@contentful/f36-components");
13
+ const _f36tokens = _interop_require_default(require("@contentful/f36-tokens"));
14
+ const _emotion = require("emotion");
15
+ function _interop_require_default(obj) {
16
+ return obj && obj.__esModule ? obj : {
17
+ default: obj
18
+ };
19
+ }
20
+ function _getRequireWildcardCache(nodeInterop) {
21
+ if (typeof WeakMap !== "function") return null;
22
+ var cacheBabelInterop = new WeakMap();
23
+ var cacheNodeInterop = new WeakMap();
24
+ return (_getRequireWildcardCache = function(nodeInterop) {
25
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
26
+ })(nodeInterop);
27
+ }
28
+ function _interop_require_wildcard(obj, nodeInterop) {
29
+ if (!nodeInterop && obj && obj.__esModule) {
30
+ return obj;
31
+ }
32
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
33
+ return {
34
+ default: obj
35
+ };
36
+ }
37
+ var cache = _getRequireWildcardCache(nodeInterop);
38
+ if (cache && cache.has(obj)) {
39
+ return cache.get(obj);
40
+ }
41
+ var newObj = {};
42
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
43
+ for(var key in obj){
44
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
45
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
46
+ if (desc && (desc.get || desc.set)) {
47
+ Object.defineProperty(newObj, key, desc);
48
+ } else {
49
+ newObj[key] = obj[key];
50
+ }
51
+ }
52
+ }
53
+ newObj.default = obj;
54
+ if (cache) {
55
+ cache.set(obj, newObj);
56
+ }
57
+ return newObj;
58
+ }
59
+ function JsonInvalidStatus() {
60
+ return _react.createElement("div", {
61
+ role: "status",
62
+ "data-test-id": "json-editor.invalid-json",
63
+ className: (0, _emotion.css)({
64
+ marginTop: _f36tokens.default.spacingS
65
+ })
66
+ }, _react.createElement(_f36components.ValidationMessage, null, "This is not valid JSON"));
67
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "JsonEditor", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _JsonEditor.default;
9
+ }
10
+ });
11
+ const _JsonEditor = _interop_require_default(require("./JsonEditor"));
12
+ function _interop_require_default(obj) {
13
+ return obj && obj.__esModule ? obj : {
14
+ default: obj
15
+ };
16
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ stringifyJSON: function() {
13
+ return stringifyJSON;
14
+ },
15
+ isValidJson: function() {
16
+ return isValidJson;
17
+ },
18
+ parseJSON: function() {
19
+ return parseJSON;
20
+ }
21
+ });
22
+ function stringifyJSON(obj) {
23
+ if (obj === null || obj === undefined) {
24
+ return '';
25
+ } else {
26
+ return JSON.stringify(obj, null, 4);
27
+ }
28
+ }
29
+ function isValidJson(str) {
30
+ let parsed;
31
+ try {
32
+ parsed = JSON.parse(str);
33
+ } catch (e) {
34
+ return false;
35
+ }
36
+ if (typeof parsed !== 'object') {
37
+ return false;
38
+ }
39
+ return true;
40
+ }
41
+ function parseJSON(str) {
42
+ if (str === '') {
43
+ return {
44
+ value: undefined,
45
+ valid: true
46
+ };
47
+ } else if (isValidJson(str)) {
48
+ return {
49
+ value: JSON.parse(str),
50
+ valid: true
51
+ };
52
+ } else {
53
+ return {
54
+ value: undefined,
55
+ valid: false
56
+ };
57
+ }
58
+ }