@earthranger/react-native-jsonforms-formatter 0.1.0 → 0.2.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.
package/README.md CHANGED
@@ -3,11 +3,11 @@
3
3
 
4
4
  [ci-url]: https://github.com/PADAS/react-native-jsonforms-formatter/actions/workflows/npm-build.yml/badge.svg
5
5
 
6
- A [React Native](https://reactnative.dev/) [JSON Schema](https://json-schema.org/) formatter to build mobile forms based on [JSON Forms](https://jsonforms.io/)
6
+ A Node.js library for validating JSONSchema and generating UISchema for a custom ReactNative JSONForms element.
7
7
 
8
- React Native JSON Forms Formatter is an alternative solution for rendering JTD schemas in JSON Forms. It validates JSON Schemas and generates UI schemas compatible with the [JSON Forms library](https://github.com/eclipsesource/jsonforms), even for schemas that are not supported by other JSON Schema libraries.
8
+ ## Installation
9
9
 
10
- ## Install
10
+ You can install the library using npm or yarn:
11
11
 
12
12
  #### Using `yarn`
13
13
 
@@ -22,27 +22,96 @@ npm install --save react-native-jsonforms-formatter
22
22
  ```
23
23
 
24
24
  ## Usage
25
+ The library provides two main functions: `validateJSONSchema` and `generateUISchema`.
25
26
 
26
- ```javascript
27
- import { validateJSONSchema, generateUISchema } 'react-native-jsonforms-formatter';
27
+ ### Validating JSONSchema
28
+
29
+ You can use the `validateJSONSchema` function to validate a JSONSchema string:
30
+
31
+ ```typescript
32
+ import { validateJSONSchema } from 'react-native-jsonforms-formatter';
33
+
34
+ const stringSchema = `
35
+ {
36
+ "type": "object",
37
+ "properties": {
38
+ "name": {
39
+ "type": "string",
40
+ "title": "Name"
41
+ },
42
+ "age": {
43
+ "type": "integer",
44
+ "title": "Age"
45
+ }
46
+ }
47
+ }
48
+ `;
49
+
50
+ const jsonSchema = validateJSONSchema(stringSchema);
51
+ ```
52
+
53
+ The `validateJSONSchema` function returns a valid JSONSchema object if the input string is a valid JSONSchema. If the input is not valid, it will throw an error.
54
+
55
+ ### Generating UISchema
56
+ You can use the `generateUISchema` function to generate a UISchema object from a valid JSONSchema:
57
+
58
+ ```typescript
59
+ import { generateUISchema } from 'react-native-jsonforms-formatter';
60
+
61
+ const uiSchema = generateUISchema(jsonSchema);
28
62
  ```
29
63
 
30
- Your json schema needs to be validated and formatted in order to make it parsable and valid for JSON Forms library. The library will generate a valid UI schema for input into JSON Forms to be used in a `JsonForms` component.
64
+ The `generateUISchema` function returns a `UISchema` object that can be used with the ReactNative JSONForms library.
65
+
66
+ ## Putting it all together
67
+ Here's an example of how you can use the library in a ReactNative application:
68
+
69
+ ```typescript
70
+ import React from 'react';
71
+ import { JsonForms } from '@jsonforms/react-native';
72
+ import { validateJSONSchema, generateUISchema } from 'react-native-jsonforms-formatter';
73
+ import { RNRenderers, RNCells } from '@jsonforms/react-native-renderers';
74
+
75
+ const stringSchema = `
76
+ {
77
+ "type": "object",
78
+ "properties": {
79
+ "name": {
80
+ "type": "string",
81
+ "title": "Name"
82
+ },
83
+ "age": {
84
+ "type": "integer",
85
+ "title": "Age"
86
+ }
87
+ }
88
+ }
89
+ `;
31
90
 
32
- ```javascript
33
91
  const jsonSchema = validateJSONSchema(stringSchema);
34
- const uiSchema = generateJSONUISchema(jsonSchema);
35
-
36
- <JsonForms
37
- schema={jsonSchema}
38
- uischema={uiSchema}
39
- data={data}
40
- renderers={RNRenderers}
41
- cells={RNCells}
42
- />
92
+ const uiSchema = generateUISchema(jsonSchema);
93
+
94
+ const App = () => {
95
+ const [data, setData] = React.useState({ name: 'John Doe', age: 30 });
96
+
97
+ return (
98
+ <JsonForms
99
+ schema={jsonSchema}
100
+ uischema={uiSchema}
101
+ data={data}
102
+ renderers={RNRenderers}
103
+ cells={RNCells}
104
+ onChange={(event) => setData(event.data)}
105
+ />
106
+ );
107
+ };
108
+
109
+ export default App;
43
110
  ```
44
111
 
45
112
  ## Contributors
113
+ Contributions are welcome! If you find a bug or have a feature request, please open an issue.
114
+
46
115
  <a href="https://github.com/PADAS/react-native-jsonforms-formatter/graphs/contributors">
47
116
  <img src="https://contributors-img.web.app/image?repo=PADAS/react-native-jsonforms-formatter" />
48
117
  </a>
package/dist/bundle.js ADDED
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var e={d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{void 0!==l&&l.toStringTag&&Object.defineProperty(e,l.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{generateUISchema:()=>Ue,validateJSONSchema:()=>rt});var r=Object.prototype;const n=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||r)},i=(o=Object.keys,a=Object,function(e){return o(a(e))});var o,a,c=Object.prototype.hasOwnProperty;const s="object"==typeof global&&global&&global.Object===Object&&global;var u="object"==typeof self&&self&&self.Object===Object&&self;const p=s||u||Function("return this")();var l=p.Symbol;const f=l;var d=Object.prototype,m=d.hasOwnProperty,h=d.toString,v=f?f.toStringTag:void 0;var y=Object.prototype.toString;var b=f?f.toStringTag:void 0;const j=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":b&&b in Object(e)?function(e){var t=m.call(e,v),r=e[v];try{e[v]=void 0;var n=!0}catch(e){}var i=h.call(e);return n&&(t?e[v]=r:delete e[v]),i}(e):function(e){return y.call(e)}(e)},g=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)},O=function(e){if(!g(e))return!1;var t=j(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t},k=p["__core-js_shared__"];var w,S=(w=/[^.]+$/.exec(k&&k.keys&&k.keys.IE_PROTO||""))?"Symbol(src)_1."+w:"";var x=Function.prototype.toString;const _=function(e){if(null!=e){try{return x.call(e)}catch(e){}try{return e+""}catch(e){}}return""};var M=/^\[object .+?Constructor\]$/,A=Function.prototype,N=Object.prototype,P=A.toString,F=N.hasOwnProperty,D=RegExp("^"+P.call(F).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");const E=function(e){return!(!g(e)||function(e){return!!S&&S in e}(e))&&(O(e)?D:M).test(_(e))},T=function(e,t){var r=function(e,t){return null==e?void 0:e[t]}(e,t);return E(r)?r:void 0},C=T(p,"DataView"),q=T(p,"Map"),H=T(p,"Promise"),I=T(p,"Set"),R=T(p,"WeakMap");var $="[object Map]",U="[object Promise]",B="[object Set]",L="[object WeakMap]",J="[object DataView]",V=_(C),W=_(q),z=_(H),G=_(I),K=_(R),Q=j;(C&&Q(new C(new ArrayBuffer(1)))!=J||q&&Q(new q)!=$||H&&Q(H.resolve())!=U||I&&Q(new I)!=B||R&&Q(new R)!=L)&&(Q=function(e){var t=j(e),r="[object Object]"==t?e.constructor:void 0,n=r?_(r):"";if(n)switch(n){case V:return J;case W:return $;case z:return U;case G:return B;case K:return L}return t});const X=Q,Y=function(e){return null!=e&&"object"==typeof e},Z=function(e){return Y(e)&&"[object Arguments]"==j(e)};var ee=Object.prototype,te=ee.hasOwnProperty,re=ee.propertyIsEnumerable;const ne=Z(function(){return arguments}())?Z:function(e){return Y(e)&&te.call(e,"callee")&&!re.call(e,"callee")},ie=Array.isArray,oe=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991};var ae="object"==typeof exports&&exports&&!exports.nodeType&&exports,ce=ae&&"object"==typeof module&&module&&!module.nodeType&&module,se=ce&&ce.exports===ae?p.Buffer:void 0;const ue=(se?se.isBuffer:void 0)||function(){return!1};var pe={};pe["[object Float32Array]"]=pe["[object Float64Array]"]=pe["[object Int8Array]"]=pe["[object Int16Array]"]=pe["[object Int32Array]"]=pe["[object Uint8Array]"]=pe["[object Uint8ClampedArray]"]=pe["[object Uint16Array]"]=pe["[object Uint32Array]"]=!0,pe["[object Arguments]"]=pe["[object Array]"]=pe["[object ArrayBuffer]"]=pe["[object Boolean]"]=pe["[object DataView]"]=pe["[object Date]"]=pe["[object Error]"]=pe["[object Function]"]=pe["[object Map]"]=pe["[object Number]"]=pe["[object Object]"]=pe["[object RegExp]"]=pe["[object Set]"]=pe["[object String]"]=pe["[object WeakMap]"]=!1;var le="object"==typeof exports&&exports&&!exports.nodeType&&exports,fe=le&&"object"==typeof module&&module&&!module.nodeType&&module,de=fe&&fe.exports===le&&s.process,me=function(){try{return fe&&fe.require&&fe.require("util").types||de&&de.binding&&de.binding("util")}catch(e){}}(),he=me&&me.isTypedArray;const ve=he?function(e){return function(t){return e(t)}}(he):function(e){return Y(e)&&oe(e.length)&&!!pe[j(e)]};var ye=Object.prototype.hasOwnProperty;const be=function(e){if(null==e)return!0;if(function(e){return null!=e&&oe(e.length)&&!O(e)}(e)&&(ie(e)||"string"==typeof e||"function"==typeof e.splice||ue(e)||ve(e)||ne(e)))return!e.length;var t=X(e);if("[object Map]"==t||"[object Set]"==t)return!e.size;if(n(e))return!function(e){if(!n(e))return i(e);var t=[];for(var r in Object(e))c.call(e,r)&&"constructor"!=r&&t.push(r);return t}(e).length;for(var r in e)if(ye.call(e,r))return!1;return!0};var je,ge,Oe;!function(e){e.DateTime="date-time",e.Date="date"}(je||(je={})),function(e){e.DateTime="date-time",e.MultiSelect="multiselect",e.RepeatableField="repeatable-field",e.FormLabel="form-label"}(ge||(ge={})),function(e){e.Header="header"}(Oe||(Oe={}));var ke,we="fieldset",Se="checkboxes",xe="string",_e=function(e){return e instanceof Object},Me=function(e){return typeof e===xe},Ae=function(e){return 0!==e.length&&void 0!==e.find((function(e){return _e(e)&&e&&(e.type||"")===we}))},Ne=function(e){return _e(e)&&e.type===we&&!be(e.title)},Pe=function(e){return _e(e)&&e.type===we&&e.items.length>0},Fe=function(e){return!be(e.key)},De=function(e){var t=e.toLowerCase().replace(/[\s\\/\\%]/gi,"_");return"fieldset__title_".concat(t)},Ee=function(e){var t,r;return"array"===e.type&&!(null===(t=e.items)||void 0===t?void 0:t.enum)&&!(null===(r=e.items)||void 0===r?void 0:r.enumNames)},Te=function(e){return"true"===e.required||e.required>0},Ce=function(e){return e.includes(Se)},qe=function(e){return e.includes("inactive_enum")},He=function(e){return e.includes("inactive_titleMap")},Ie=function(e){var t,r;return e.type===xe&&(null===(t=e.enum)||void 0===t?void 0:t.length)>0&&(null===(r=e.inactive_enum)||void 0===r?void 0:r.length)>0},Re=function(){return Re=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var i in t=arguments[r])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},Re.apply(this,arguments)};!function(e){e.Number="number",e.String="string",e.Array="array"}(ke||(ke={}));var $e=function(e,t,r){return void 0===r&&(r={}),Re({type:"Control",scope:"#/properties/".concat(e),label:t},r&&{options:r})},Ue=function(e){var t=[];return Ae(e.definition)?t.push.apply(t,Be(e)):Object.keys(e.schema.properties).forEach((function(r){var n=Je(r,e);n&&t.push(n)})),{type:"Category",elements:t}},Be=function(e){var t=[];return e.definition.forEach((function(r){if("string"==typeof r)t.push($e(r,e.schema.properties[r].title||""));else if(r instanceof Object)switch(!0){case function(e){return _e(e)&&e.type===we&&0===e.items.length&&!be(e.title)}(r):t.push($e(De(r.title),r.title,Le(ge.FormLabel)));break;case Pe(r):r.title&&t.push($e(De(r.title),r.title,Le(ge.FormLabel))),r.items.forEach((function(r){if(r instanceof Object){var n=Je(r.key||"",e,r);n&&t.push(n)}else if("string"==typeof r){var i=Je(r,e);i&&t.push(i)}}));break;case Fe(r):var n=Je(r.key,e);n&&t.push(n)}})),t},Le=function(e,t){if(void 0===e&&(e=""),void 0===t&&(t=""),be(e))return{};var r={format:e};return be(t)||(r.display=t),r},Je=function(e,t,r){void 0===r&&(r=void 0);var n={};switch(t.schema.properties[e].type){case ke.Number:return $e(e,t.schema.properties[e].title||"");case ke.String:var i=function(e,t,r){void 0===r&&(r=void 0);try{var n=r||t.definition.find((function(t){return t.key===e}));if("date-time-picker json-schema"===n.fieldHtmlClass||n&&"datetime"===(n.type||""))return"date"===t.schema.properties[e].format?je.Date:je.DateTime;if("date-picker json-schema"===n.fieldHtmlClass||"date"===t.schema.properties[e].format)return je.Date}catch(e){return}}(e,t,r);return be(i)?t.schema.properties[e].display&&t.schema.properties[e].display===Oe.Header&&(n=Le(ge.FormLabel)):n=Le(ge.DateTime,i),$e(e,t.schema.properties[e].title||"",n);case ke.Array:return t.schema.properties[e].items.enum&&t.schema.properties[e].items.enumNames?n=Le(ge.MultiSelect):t.schema.properties[e].items&&(n=Le(ge.RepeatableField)),$e(e,t.schema.properties[e].title||"",n)}},Ve=function(){return Ve=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var i in t=arguments[r])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},Ve.apply(this,arguments)},We=/[^\w\n\s_"](?=[^:\n\s{}[]]*:[\t\n\s]*(\{|\[)+)/g,ze=/"minimum"(?:[^\\"]|\\\\|\\")*"\d+\.*\d*"/g,Ge=/"maximum"(?:[^\\"]|\\\\|\\")*"\d+\.*\d*"/g,Ke=/"(?=[^"]*(?:"[^"]*)?$)/g,Qe=function(e){return{type:"string",readOnly:!0,isHidden:!1,display:Oe.Header,title:e}},Xe=function(e){return(null==e?void 0:e.isHidden)||!1},Ye=function(e){for(var t=[],r=0,n=Object.keys(e.properties);r<n.length;r++){var i=n[r],o=e.properties[i];Te(o)&&(t.push(i),delete e.properties[i].required),Ee(o)&&Ye(o.items)}return t.length>0&&(e.required=t),e},Ze=function(e){return e.enum.filter((function(t){return!e.inactive_enum.includes(t)}))},et=function(e){return e.titleMap.filter((function(t){return!e.inactive_titleMap.includes(t.value)}))},tt=function(e,t,r,n){var i,o,a,c,s=e.hasCheckboxes,u=e.hasDisabledChoices;if(Me(t)&&r.schema.properties[t])r.schema.properties[t].isHidden=Xe(r.schema.properties[t]);else{if((_e(t)||Fe(t))&&t.key&&r.schema.properties[t.key]&&(r.schema.properties[t.key].isHidden=Xe(r.schema.properties[t.key])),u&&function(e){var t,r;return _e(e)&&e.type===Se&&(null===(t=e.inactive_titleMap)||void 0===t?void 0:t.length)>0&&(null===(r=e.titleMap)||void 0===r?void 0:r.length)>0}(t))if(n){var p=r.definition.indexOf(n),l=r.definition[p].items.indexOf(t);r.definition[p].items[l].titleMap=et(t)}else r.definition[r.definition.indexOf(t)].titleMap=et(t);s&&function(e){return _e(e)&&e.type===Se}(t)&&(r.schema.properties[t.key]=(i=t,o=r.schema.properties[t.key].title||"",a=r.schema.properties[t.key].required||!1,c=r.schema.properties[t.key].default||!1,Ve(Ve(Ve({type:"array",uniqueItems:!0,isHidden:!1},a&&{required:a}),{title:o||i.title,items:{enum:i.titleMap.map((function(e){return e.value})),enumNames:i.titleMap.map((function(e){return e.name}))}}),c&&{default:c})))}},rt=function(e){e=function(e){if(null!==e.match(We))throw Error("Special characters not supported in JSON Schema");return(e=(e=(e=(e=(e=e.replace(/([“”])/g,'"')).replace(new RegExp('\\"enum\\"\\n*\\s*\\:\\n*\\s*\\[\\n*\\s*\\]',"g"),'"enum": ["0"]')).replace(new RegExp('\\"enumNames\\"\\n*\\s*\\:\\n*\\s*\\{\\n*\\s*\\}',"g"),'"enumNames": {"0":"No Options"}')).replace(new RegExp('\\"titleMap\\"\\n*\\s*\\:\\n*\\s*\\[\\n*\\s*\\]',"g"),'"titleMap": [{"value":"no_option", "name":"No Option"}]')).replace(ze,(function(e){return e.replace(Ke,"")}))).replace(Ge,(function(e){return e.replace(Ke,"")}))}(e);var t=JSON.parse(e);delete t.schema.$schema,delete t.schema.id,function(e){if(e.schema.definition){var t=e.schema.definition;delete e.schema.definition,e.definition=t}}(t);var r=function(e){return{hasCheckboxes:Ce(e),hasInactiveChoices:qe(e),hasDisabledChoices:He(e)}}(e);return function(e,t){var r,n,i=e.hasInactiveChoices,o=e.hasEnums;if(i)for(var a=0,c=Object.keys(t.schema.properties);a<c.length;a++){var s=c[a],u=t.schema.properties[s];Ie(u)&&(t.schema.properties[s].enum=Ze(u),0===t.schema.properties[s].enum.length&&(t.schema.properties[s].enum=["0"],t.schema.properties[s].enumNames={0:"No Options"}))}if(o)for(var p=0,l=Object.keys(t.schema.properties);p<l.length;p++)if(s=l[p],(null===(r=t.schema.properties[s].enum)||void 0===r?void 0:r.length)>0&&(n=t.schema.properties[s].enum,new Set(n).size!==n.length))throw new Error("Duplicated items")}(r,t),function(e,t){var r;if(Ae(t.definition))!function(e,t){for(var r=0,n=t.definition;r<n.length;r++){var i=n[r];switch(!0){case Me(i):break;case Ne(i):var o=De(i.title);t.schema.properties[o]=Qe(i.title);break;case Pe(i):for(var a=0,c=i.items;a<c.length;a++){var s=c[a];tt(e,s,t,i)}}}}(e,t);else if((null===(r=t.definition)||void 0===r?void 0:r.length)>0)for(var n=0,i=t.definition;n<i.length;n++){var o=i[n];tt(e,o,t)}}(r,t),e.includes("helpvalue")&&function(e){for(var t={},r=0,n=0,i=e.definition;n<i.length;n++){var o=i[n];if(Me(o))t[o]=e.schema.properties[o],delete e.schema.properties[o];else if(_e(o))if(o.helpvalue){var a="help_value_".concat(r);r+=1,t[a]=Qe((o.helpvalue||"").replace(/(<.+?>)/g,""))}else o.key&&(t[o.key]=e.schema.properties[o.key],delete e.schema.properties[o.key])}e.schema.properties=Object.assign(t,e.schema.properties)}(t),e.includes("required")&&(t.schema=Ye(t.schema)),t};module.exports=t})();
@@ -0,0 +1,5 @@
1
+ export declare const generateUISchema: (schema: any) => {
2
+ type: string;
3
+ elements: Object[];
4
+ };
5
+ //# sourceMappingURL=generateUISchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateUISchema.d.ts","sourceRoot":"","sources":["../src/generateUISchema.ts"],"names":[],"mappings":"AAkDA,eAAO,MAAM,gBAAgB,WAAY,GAAG;;;CAiB3C,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export { generateUISchema } from './generateUISchema';
2
2
  export { validateJSONSchema } from './validateJsonSchema';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,41 @@
1
+ export declare enum DateTimeFormat {
2
+ DateTime = "date-time",
3
+ Date = "date"
4
+ }
5
+ export declare enum PropertyFormat {
6
+ DateTime = "date-time",
7
+ MultiSelect = "multiselect",
8
+ RepeatableField = "repeatable-field",
9
+ FormLabel = "form-label"
10
+ }
11
+ export declare enum ElementDisplay {
12
+ Header = "header"
13
+ }
14
+ export declare const FIELD_SET = "fieldset";
15
+ export declare const HELP_VALUE = "helpvalue";
16
+ export declare const REQUIRED_PROPERTY = "required";
17
+ export declare const CHECKBOXES = "checkboxes";
18
+ export declare const INACTIVE_ENUM = "inactive_enum";
19
+ export declare const DISABLED_ENUM = "inactive_titleMap";
20
+ export declare const STRING_TYPE = "string";
21
+ export declare const ARRAY_TYPE = "array";
22
+ export declare const isObject: (item: any) => boolean;
23
+ export declare const isString: (item: any) => boolean;
24
+ export declare const isSchemaFieldSet: (definition: any[]) => boolean;
25
+ export declare const isFieldSetTitle: (item: any) => boolean;
26
+ export declare const isFieldSetTitleWithoutItems: (item: any) => boolean;
27
+ export declare const isFieldSet: (item: any) => boolean;
28
+ export declare const isCheckbox: (item: any) => boolean;
29
+ export declare const isPropertyKey: (item: any) => boolean;
30
+ export declare const getFieldSetTitleKey: (title: string) => string;
31
+ export declare const getSchemaValidations: (stringSchema: string) => {
32
+ hasCheckboxes: boolean;
33
+ hasInactiveChoices: boolean;
34
+ hasDisabledChoices: boolean;
35
+ };
36
+ export declare const isArrayProperty: (property: any) => boolean;
37
+ export declare const isRequiredProperty: (property: any) => boolean;
38
+ export declare const isInactiveChoice: (item: any) => boolean;
39
+ export declare const isDisabledChoice: (item: any) => boolean;
40
+ export declare const hasEnumDuplicatedItems: (options: string[]) => boolean;
41
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAIA,oBAAY,cAAc;IACxB,QAAQ,cAAc;IACtB,IAAI,SAAS;CACd;AAED,oBAAY,cAAc;IACxB,QAAQ,cAAc;IACtB,WAAW,gBAAgB;IAC3B,eAAe,qBAAqB;IACpC,SAAS,eAAe;CACzB;AAED,oBAAY,cAAc;IACxB,MAAM,WAAW;CAClB;AAED,eAAO,MAAM,SAAS,aAAa,CAAC;AACpC,eAAO,MAAM,UAAU,cAAc,CAAC;AAEtC,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAC5C,eAAO,MAAM,UAAU,eAAe,CAAC;AACvC,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,aAAa,sBAAsB,CAAC;AACjD,eAAO,MAAM,WAAW,WAAW,CAAC;AACpC,eAAO,MAAM,UAAU,UAAU,CAAC;AAElC,eAAO,MAAM,QAAQ,SAAU,GAAG,YAA2B,CAAC;AAE9D,eAAO,MAAM,QAAQ,SAAU,GAAG,YAAgC,CAAC;AACnE,eAAO,MAAM,gBAAgB,eAAgB,GAAG,EAAE,YAOjD,CAAC;AAEF,eAAO,MAAM,eAAe,SAAU,GAAG,YAChB,CAAC;AAE1B,eAAO,MAAM,2BAA2B,SAAU,GAAG,YACD,CAAC;AAErD,eAAO,MAAM,UAAU,SAAU,GAAG,YAAuE,CAAC;AAE5G,eAAO,MAAM,UAAU,SAAU,GAAG,YAA+C,CAAC;AAEpF,eAAO,MAAM,aAAa,SAAU,GAAG,YAAuB,CAAC;AAE/D,eAAO,MAAM,mBAAmB,UAAW,MAAM,WAGhD,CAAC;AAEF,eAAO,MAAM,oBAAoB,iBAAkB,MAAM;;;;CAIvD,CAAC;AAEH,eAAO,MAAM,eAAe,aAAc,GAAG,YAChB,CAAC;AAE9B,eAAO,MAAM,kBAAkB,aAAc,GAAG,YAA0D,CAAC;AAQ3G,eAAO,MAAM,gBAAgB,SAAU,GAAG,YACiB,CAAC;AAE5D,eAAO,MAAM,gBAAgB,SAAU,GAAG,YACZ,CAAC;AAE/B,eAAO,MAAM,sBAAsB,YAAa,MAAM,EAAE,YAA+C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const validateJSONSchema: (stringSchema: string) => any;
2
+ //# sourceMappingURL=validateJsonSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateJsonSchema.d.ts","sourceRoot":"","sources":["../src/validateJsonSchema.ts"],"names":[],"mappings":"AAsPA,eAAO,MAAM,kBAAkB,iBAAkB,MAAM,QA4BtD,CAAC"}
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@earthranger/react-native-jsonforms-formatter",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "description": "Converts JTD into JSON Schema ",
6
- "main": "src/index.js",
7
- "types": "src/index.d.ts",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
8
  "scripts": {
9
9
  "preinstall": "git config core.hooksPath .githooks",
10
- "build": "tsc",
10
+ "build": "npx webpack",
11
11
  "clean": "rm -rf dist",
12
12
  "lint": "eslint src/ --ext .js,.jsx,.ts,.tsx",
13
- "test": "jest src/.*\\.test\\..* --coverage",
13
+ "test": "jest test/.*\\.test\\..* --coverage",
14
14
  "typecheck": "tsc -b"
15
15
  },
16
16
  "repository": {
@@ -20,6 +20,9 @@
20
20
  "publishConfig": {
21
21
  "access": "public"
22
22
  },
23
+ "files": [
24
+ "./dist"
25
+ ],
23
26
  "keywords": [
24
27
  "json",
25
28
  "schema",
@@ -54,6 +57,8 @@
54
57
  "@babel/preset-typescript": "^7.21.5",
55
58
  "@types/jest": "^29.5.1",
56
59
  "@types/lodash-es": "^4.17.7",
60
+ "@types/node": "^20.12.5",
61
+ "@types/webpack": "^5.28.5",
57
62
  "@typescript-eslint/eslint-plugin": "^6.8.0",
58
63
  "@typescript-eslint/parser": "^6.8.0",
59
64
  "babel-jest": "^29.5.0",
@@ -62,7 +67,10 @@
62
67
  "jest": "^29.5.0",
63
68
  "jest-extended": "^3.2.4",
64
69
  "ts-jest": "^29.1.0",
70
+ "ts-loader": "^9.5.1",
65
71
  "ts-node": "^10.9.1",
66
- "typescript": "^5.2.2"
72
+ "typescript": "^5.2.2",
73
+ "webpack": "^5.91.0",
74
+ "webpack-cli": "^5.1.4"
67
75
  }
68
76
  }
package/ jest.config.js DELETED
@@ -1,4 +0,0 @@
1
- module.exports = {
2
- preset: 'ts-jest',
3
- testEnvironment: 'node',
4
- };
package/.eslintrc.cjs DELETED
@@ -1,18 +0,0 @@
1
- /* eslint-env node */
2
- module.exports = {
3
- extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],
4
- parser: '@typescript-eslint/parser',
5
- parserOptions: {
6
- ecmaVersion: 13,
7
- project: './tsconfig.json',
8
- sourceType: 'module',
9
- },
10
- plugins: ['@typescript-eslint'],
11
- rules: {
12
- 'import/prefer-default-export': 'off',
13
- 'react/require-default-props': 'off',
14
- '@typescript-eslint/no-use-before-define': 'off',
15
- 'no-plusplus': [2, { allowForLoopAfterthoughts: true }]
16
- },
17
- root: true,
18
- };
@@ -1,3 +0,0 @@
1
- #!/bin/sh
2
-
3
- yarn run eslint --no-error-on-unmatched-pattern $(git diff --staged --name-only HEAD | grep -E '\.(js|jsx|ts|tsx)$' | xargs)
@@ -1,2 +0,0 @@
1
- # global er-mobile team
2
- * @doneill @leo-ori @Alex79373 @hugohabel
@@ -1,40 +0,0 @@
1
- name: Node.js build
2
-
3
- on:
4
- push:
5
- branches: [ develop ]
6
- pull_request:
7
- branches: [ develop ]
8
-
9
- jobs:
10
- build:
11
- runs-on: ubuntu-latest
12
-
13
- strategy:
14
- matrix:
15
- node-version: [16.x]
16
-
17
- steps:
18
- - uses: actions/checkout@v4
19
- - name: Use Node.js ${{ matrix.node-version }}
20
- uses: actions/setup-node@v4
21
- with:
22
- node-version: ${{ matrix.node-version }}
23
- cache: 'npm'
24
- - run: npm ci
25
- - run: npm run build --if-present
26
- - run: npm test
27
-
28
- # publish-npm:
29
- # needs: build
30
- # runs-on: ubuntu-latest
31
- # steps:
32
- # - uses: actions/checkout@v3
33
- # - uses: actions/setup-node@v3
34
- # with:
35
- # node-version: 16
36
- # registry-url: https://registry.npmjs.org/
37
- # - run: npm ci
38
- # - run: npm publish
39
- # env:
40
- # NODE_AUTH_TOKEN: ${{secrets.npm_token}}
package/babel.config.cjs DELETED
@@ -1,6 +0,0 @@
1
- module.exports = {
2
- presets: [
3
- ['@babel/preset-env', {targets: {node: 'current'}}],
4
- '@babel/preset-typescript',
5
- ],
6
- };
package/extJestSetup.js DELETED
@@ -1,3 +0,0 @@
1
- import * as matchers from 'jest-extended';
2
- expect.extend(matchers);
3
-
@@ -1,168 +0,0 @@
1
- // Internal Dependencies
2
- import jsonSchema from "../common/mockData/jsonSchemaMock.json";
3
- import jsonSchemaFieldSets from "../common/mockData/jsonSchemaFielSetMock.json";
4
- import expectedSchema from "../common/mockData/jsonSchemaExpectedMock.json";
5
- import expectedUISchema from "../common/mockData/uiSchemaExpectedMock.json";
6
- import expectedFieldSetUISchema from "../common/mockData/uiSchemaFielSetExpectedMock.json";
7
- import { validateJSONSchema } from "../validateJsonSchema";
8
- import { generateUISchema } from "../generateUISchema";
9
- import {
10
- JSON_SCHEMA_ID_$SCHEMA_FAKE_DATA,
11
- JSON_SCHEMA_EMPTY_CHOICES_FAKE_DATA,
12
- JSON_SCHEMA_INVALID_DOUBLE_QUOTES_FAKE_DATA,
13
- JSON_SCHEMA_SPECIAL_CHARS_FAKE_DATA,
14
- JSON_SCHEMA_INACTIVE_CHOICES_FAKE_DATA,
15
- JSON_SCHEMA_INVALID_DEFINITION_LOCATION_FAKE_DATA,
16
- JSON_SCHEMA_FIELD_SETS_FAKE_DATA,
17
- FIELD_SET_HEADER_FAKE_DATA,
18
- JSON_SCHEMA_COLLECTION_FIELD_FAKE_DATA,
19
- COLLECTION_FIELD_HEADER_FAKE_DATA,
20
- JSON_SCHEMA_INLINE_REQUIRED_PROPERTIES,
21
- JSON_SCHEMA_INACTIVE_TITLE_MAP_FAKE_DATA,
22
- JSON_SCHEMA_INACTIVE_FIELD_SET_TITLE_MAP_FAKE_DATA, JSON_SCHEMA_DEFAULT_VALUES,
23
- } from "../common/mockData/formatterMockData";
24
-
25
- describe('JSON Schema validation', () => {
26
-
27
- it('Special chars should throw an exception', () => {
28
- expect(() => { validateJSONSchema(JSON_SCHEMA_SPECIAL_CHARS_FAKE_DATA) }).toThrowError('Special characters not supported in JSON Schema');
29
- });
30
-
31
- it('Validate invalid double quotes', () => {
32
- expect(validateJSONSchema(JSON_SCHEMA_INVALID_DOUBLE_QUOTES_FAKE_DATA).toString).not.toContain(/([“”])/g);
33
- });
34
-
35
- it('Validate empty choices', () => {
36
- const validSchema = validateJSONSchema(JSON_SCHEMA_EMPTY_CHOICES_FAKE_DATA).toString;
37
- expect(validSchema).not.toContain(/\"enum\"\n*\s*\:\n*\s*\[\n*\s*\]/g);
38
- expect(validSchema).not.toContain(/\"enumNames\"\n*\s*\:\n*\s*\{\n*\s*\}/g);
39
- expect(validSchema).not.toContain(/\"titleMap\"\n*\s*\:\n*\s*\[\n*\s*\]/g);
40
- });
41
-
42
- it('Validate remove $schema and id properties', () => {
43
- const validSchema = validateJSONSchema(JSON_SCHEMA_ID_$SCHEMA_FAKE_DATA);
44
- expect(validSchema.schema.$schema).toBeUndefined();
45
- expect(validSchema.schema.id).toBeUndefined();
46
- });
47
-
48
- it('Validate field default values', () => {
49
- const validSchema = validateJSONSchema(JSON_SCHEMA_DEFAULT_VALUES);
50
- expect(validSchema.schema.properties.test_one_date.default).toBe('2023-08-14 15:15');
51
- expect(validSchema.schema.properties.test_two_string.default).toBe('Test 2');
52
- expect(validSchema.schema.properties.test_three_number.default).toBe(25);
53
- expect(validSchema.schema.properties.test_four_number.default).toBe(6);
54
- expect(validSchema.schema.properties.test_five_enumString.default).toBe('behavior1');
55
- expect(validSchema.schema.properties.test_six_enum_dictionary.default).toBe('testone');
56
- expect(validSchema.schema.properties.testseven.default).toMatchObject(['testseventhree']);
57
- expect(validSchema.schema.properties.test_eight_checkbox_query.default).toMatchObject(['9b5cb19e-b7bd-4fa8-9263-8e34502e35ca']);
58
- expect(validSchema.schema.properties.test_nine_dropdown_query.default).toBe('9b5cb19e-b7bd-4fa8-9263-8e34502e35ca');
59
- expect(validSchema.schema.properties.testElevenArrayTest.default).toMatchObject([
60
- {
61
- "test_array_number": 1,
62
- "test_array_string": "string"
63
- }
64
- ]);
65
- expect(validSchema.schema.properties.test_fourteen_textarea.default).toBe('Test 14');
66
- });
67
-
68
- it('Validate remove inactive enum choices', () => {
69
- const validSchema = validateJSONSchema(JSON_SCHEMA_INACTIVE_CHOICES_FAKE_DATA);
70
- expect(validSchema.schema.properties.invasivespecies_urgency.enum).not.toContain('test');
71
- });
72
-
73
- it('Validate remove disabled titleMap choices', () => {
74
- const validSchema = validateJSONSchema(JSON_SCHEMA_INACTIVE_TITLE_MAP_FAKE_DATA);
75
- expect(validSchema.schema.properties.behavior.items.enum).not.toContain('phot_evidence_collected');
76
- });
77
-
78
- it('Validate remove disabled fieldset titleMap choices', () => {
79
- const validSchema = validateJSONSchema(JSON_SCHEMA_INACTIVE_FIELD_SET_TITLE_MAP_FAKE_DATA);
80
- expect(validSchema.schema.properties.reportorigin.items.enum).not.toContain('phot_evidence_collected');
81
- });
82
-
83
- it('Format schema definition location', () => {
84
- const validSchema = validateJSONSchema(JSON_SCHEMA_INVALID_DEFINITION_LOCATION_FAKE_DATA);
85
- expect(validSchema.schema.definition).toBeUndefined();
86
- expect(validSchema.definition).not.toBeUndefined();
87
- });
88
-
89
- it('Format readonly properties for field set headers', () => {
90
- const validSchema = validateJSONSchema(JSON_SCHEMA_FIELD_SETS_FAKE_DATA);
91
- expect(validSchema.schema.properties['fieldset__title_fieldset_title']).toMatchObject(FIELD_SET_HEADER_FAKE_DATA.fieldset__title_fieldset_title);
92
- expect(validSchema.schema.properties['fieldset__title_fieldset_number_title']).toMatchObject(FIELD_SET_HEADER_FAKE_DATA.fieldset__title_fieldset_number_title);
93
- });
94
-
95
- it('Format collection field headers', () => {
96
- const validSchema = validateJSONSchema(JSON_SCHEMA_COLLECTION_FIELD_FAKE_DATA);
97
- expect(validSchema.schema.properties['help_value_0']).toMatchObject(COLLECTION_FIELD_HEADER_FAKE_DATA.help_value_0);
98
- });
99
-
100
- it('Validate field visibility', () => {
101
- const validSchema = validateJSONSchema(JSON.stringify(jsonSchema));
102
- expect(validSchema.schema.properties['string'].isHidden).toBe(false);
103
- expect(validSchema.schema.properties['paragraph'].isHidden).toBe(false);
104
- expect(validSchema.schema.properties['number_no_min_max'].isHidden).toBe(false);
105
- expect(validSchema.schema.properties['number_with_min'].isHidden).toBe(false);
106
- expect(validSchema.schema.properties['number_with_max'].isHidden).toBe(false);
107
- expect(validSchema.schema.properties['number_with_min_and_max'].isHidden).toBe(false);
108
- expect(validSchema.schema.properties['single_select'].isHidden).toBe(false);
109
- expect(validSchema.schema.properties['single_select_choices'].isHidden).toBe(false);
110
- expect(validSchema.schema.properties['collection'].isHidden).toBe(false);
111
- expect(validSchema.schema.properties['calendar'].isHidden).toBe(false);
112
- expect(validSchema.schema.properties['checkbox_static_choice'].isHidden).toBe(false);
113
- expect(validSchema.schema.properties['checkbox_query'].isHidden).toBe(false);
114
- });
115
-
116
- it('Format required inline properties', () => {
117
- const validSchema = validateJSONSchema(JSON_SCHEMA_INLINE_REQUIRED_PROPERTIES);
118
- expect(validSchema.schema.properties['string'].required).toBeUndefined();
119
- expect(validSchema.schema.properties['paragraph'].required).toBeUndefined();
120
- expect(validSchema.schema.properties['number_no_min_max'].required).toBeUndefined();
121
- expect(validSchema.schema.properties['number_with_min'].required).toBeUndefined();
122
- expect(validSchema.schema.properties['number_with_max'].required).toBeUndefined();
123
- expect(validSchema.schema.properties['number_with_min_and_max'].required).toBeUndefined();
124
- expect(validSchema.schema.properties['single_select'].required).toBeUndefined();
125
- expect(validSchema.schema.properties['single_select_choices'].required).toBeUndefined();
126
- expect(validSchema.schema.properties['collection'].required).toBeUndefined();
127
- expect(validSchema.schema.properties['collection'].items.properties['ItemConfiscated'].required).toBeUndefined();
128
- expect(validSchema.schema.properties['collection'].items.properties['ItemNumber'].required).toBeUndefined();
129
- expect(validSchema.schema.properties['calendar'].required).toBeUndefined();
130
- expect(validSchema.schema.properties['checkbox_static_choice'].required).toBeUndefined();
131
- expect(validSchema.schema.properties['checkbox_query'].required).toBeUndefined();
132
- // @ts-ignore
133
- expect(validSchema.schema.required).toIncludeAllMembers([
134
- 'string',
135
- 'paragraph',
136
- 'number_no_min_max',
137
- 'number_with_min',
138
- 'number_with_max',
139
- 'number_with_min_and_max',
140
- 'single_select',
141
- 'single_select_choices',
142
- 'collection',
143
- 'calendar',
144
- 'checkbox_static_choice',
145
- 'checkbox_query',
146
- ]);
147
- });
148
-
149
- it('Validate schema validator should match expected json schema', () => {
150
- const validSchema = validateJSONSchema(JSON.stringify(jsonSchema));
151
- expect(validSchema).toMatchObject(expectedSchema);
152
- });
153
- });
154
-
155
- describe('JSON UI Schema generation', () => {
156
-
157
- it('Generate UI Schema for all renderers', () => {
158
- const validSchema = validateJSONSchema(JSON.stringify(jsonSchema));
159
- const uiSchema = generateUISchema(validSchema);
160
- expect(uiSchema).toMatchObject(expectedUISchema);
161
- });
162
-
163
- it('Generate UI Schema for field sets', () => {
164
- const validSchema = validateJSONSchema(JSON.stringify(jsonSchemaFieldSets));
165
- const uiSchema = generateUISchema(validSchema);
166
- expect(uiSchema).toMatchObject(expectedFieldSetUISchema);
167
- });
168
- });