@uniformdev/canvas-react 12.2.1-alpha.59 → 13.0.1-alpha.83

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/LICENSE.txt CHANGED
@@ -1,2 +1,2 @@
1
- © 2021 Uniform Systems, Inc. All Rights Reserved.
1
+ © 2021 Uniform Systems, Inc. All Rights Reserved.
2
2
  See details of Uniform Systems, Inc. Master Subscription Agreement here: https://uniform.dev/eula
package/README.md CHANGED
@@ -1,3 +1,3 @@
1
- React SDK for Uniform Canvas
2
-
3
- part of the [Uniform Platform](https://uniform.app). See our [documentation](https://docs.uniform.app) for more details.
1
+ React SDK for Uniform Canvas
2
+
3
+ part of the [Uniform Platform](https://uniform.app). See our [documentation](https://docs.uniform.app) for more details.
package/dist/index.d.ts CHANGED
@@ -13,7 +13,7 @@ declare type ComponentProps<TProps = unknown> = TProps & {
13
13
  * Function that maps a Canvas component instance to its React component to render it.
14
14
  * The resolver would commonly inspect the `type` and possibly `variant` of the component to decide.
15
15
  */
16
- declare type RenderComponentResolver = (component: ComponentInstance) => React.ComponentType<ComponentProps<unknown>> | null;
16
+ declare type RenderComponentResolver = (component: ComponentInstance) => React.ComponentType<ComponentProps<any>> | null;
17
17
  /** Function that renders Canvas system internals */
18
18
  declare type SystemRenderFunction = (component: ComponentInstance, key: Key, renderChild: (component: ComponentInstance, key: Key) => JSX.Element | null) => JSX.Element | null;
19
19
  /** Configures rendering of system components (tests, pz) */
package/dist/index.esm.js CHANGED
@@ -1 +1 @@
1
- import{useBehaviorTracking as N}from"@uniformdev/optimize-tracker-react";import{CANVAS_INTENT_TAG_PARAM as g}from"@uniformdev/canvas";import R,{createContext as h,useContext as b}from"react";function d(e){var t;let o=(t=e.parameters)!=null?t:{};return{...Object.keys(o).reduce((s,r)=>(s[r]=o[r].value,s),{}),...e.data,component:e}}var T=h({});function v(){return b(T)}function E({data:e,resolveRenderer:o,children:n}){var r,i;let t=v();if(N((i=(r=e==null?void 0:e.parameters)==null?void 0:r[g])==null?void 0:i.value),!e)return process.env.NODE_ENV==="development"&&console.warn("[canvas-dev] Composition was rendered with no data, nothing will be output."),null;let s={composition:e,resolveRenderer:o!=null?o:t.resolveRenderer};return R.createElement(T.Provider,{value:s},typeof n=="function"?n(d(e)):n)}import C from"react";import{CANVAS_PERSONALIZE_TYPE as z,CANVAS_TEST_TYPE as _}from"@uniformdev/canvas";import{Personalize as w,Test as A}from"@uniformdev/optimize-tracker-react";import{mapSlotToPersonalizedVariations as k}from"@uniformdev/canvas";import{createElement as x}from"react";var S={test:(e,o,n)=>{var c,l,m;let t=e,s=(l=(c=t.slots)==null?void 0:c.test)!=null?l:[],r=((m=t.parameters.test)==null?void 0:m.value)||"Untitled Test",i=s.map((p,u)=>{var f,P;return{...p,id:(P=I((f=p.parameters)==null?void 0:f.testId))!=null?P:`variation-${u+1}-${p.type}`}});return x(A,{key:o,variations:i,name:r,component:p=>n(p,o)})},personalization:(e,o,n)=>{var r,i,c,l,m,p,u;let t=e,s=k((r=t==null?void 0:t.slots)==null?void 0:r.pz);return x(w,{key:o,variations:s,count:Number((l=(c=(i=t.parameters)==null?void 0:i.count)==null?void 0:c.value)!=null?l:1),trackingEventName:(p=(m=t.parameters)==null?void 0:m.trackingEventName)==null?void 0:p.value,matchFilter:(u=t.parameters.matchFilter)==null?void 0:u.value,component:f=>n(f,0)})}};function I(e){if(typeof(e==null?void 0:e.value)=="string")return e.value}function ie({name:e,resolveRenderer:o,children:n}){var m;let{composition:t,resolveRenderer:s}=v();if(!t)throw new Error("Cannot use Slot without a Composition wrapper.");let r=(m=t.slots)==null?void 0:m[e];if(!r||!Array.isArray(r))return process.env.NODE_ENV==="development"&&console.warn(`[canvas-dev] slot '${e}' was rendered, but it was not defined on its component. This is expected if the slot is optional, otherwise it may indicate a typo. Component:`,t),null;let i=o!=null?o:s,c=S,l=r.map((p,u)=>{let f=y({component:p,resolveRenderer:i,resolveSystem:c,key:u});return n?n({child:f,component:p,key:u}):f});return C.createElement(C.Fragment,void 0,l)}function y({component:e,resolveRenderer:o,resolveSystem:n,key:t=0}){let s=o==null?void 0:o(e);if(e.type===_)return n.test(e,t,(r,i)=>y({component:r,resolveRenderer:o,resolveSystem:n,key:i}));if(e.type===z)return n.personalization(e,t,(r,i)=>y({component:r,resolveRenderer:o,resolveSystem:n,key:i}));if(s){let r=d(e);return C.createElement(E,{key:t,data:e,resolveRenderer:o},C.createElement(s,{...r}))}else process.env.NODE_ENV!=="production"&&console.warn(`[canvas] found component of type '${e.type}' which the resolveRenderer prop returned no component for. Nothing will be rendered. The resolveRenderer function may need to be extended to handle the new type.`,e);return null}import a from"react";function ae(e){var n;let o=(n=e.component)==null?void 0:n.type;return o?a.createElement("div",{style:{borderLeft:"10px solid #e42535!important",padding:"0.01em 16px 16px",borderRadius:"16px",backgroundColor:"rgba(122, 215, 218, 0.3)",color:"#1d3557"}},a.createElement("h2",null,"Component: ",o),a.createElement("p",null,a.createElement("strong",null,o)," has no React implementation. It may need to be added to your"," ",a.createElement("code",null,"resolveRenderer()")," function."),a.createElement("details",null,a.createElement("summary",null,"Props"),a.createElement("pre",null,JSON.stringify(e,null,2)))):null}import{CANVAS_DRAFT_STATE as O,createEventBus as V,subscribeToComposition as F}from"@uniformdev/canvas";import{useEffect as D}from"react";function de({enabled:e,projectId:o,compositionId:n,effect:t}){D(()=>{if(!e||!n||!o)return;let s;return(async()=>{let i=await V();i&&(s=F({eventBus:i,compositionId:n,compositionState:O,projectId:o,callback:t,event:"updated"}))})(),()=>{s&&s()}},[n,e,o,t])}export{E as Composition,ae as DefaultNotImplementedComponent,ie as Slot,v as useComposition,de as useCompositionEventEffect};
1
+ import{useBehaviorTracking as R}from"@uniformdev/optimize-tracker-react";import{CANVAS_INTENT_TAG_PARAM as h}from"@uniformdev/canvas";import b,{createContext as w,useContext as A}from"react";function v(e){var t;let o=(t=e.parameters)!=null?t:{};return{...Object.keys(o).reduce((s,r)=>(s[r]=o[r].value,s),{}),...e.data,component:e}}var x=w({});function P(){return A(x)}function N({data:e,resolveRenderer:o,children:n}){var r,i;let t=P();if(R((i=(r=e==null?void 0:e.parameters)==null?void 0:r[h])==null?void 0:i.value),!e)return process.env.NODE_ENV==="development"&&console.warn("[canvas-dev] Composition was rendered with no data, nothing will be output."),null;let s={composition:e,resolveRenderer:o!=null?o:t.resolveRenderer};return b.createElement(x.Provider,{value:s},typeof n=="function"?n(v(e)):n)}import y from"react";import{CANVAS_PERSONALIZE_TYPE as O,CANVAS_TEST_TYPE as V}from"@uniformdev/canvas";import{Personalize as k,Test as I}from"@uniformdev/optimize-tracker-react";import{mapSlotToPersonalizedVariations as z}from"@uniformdev/canvas";import*as T from"react";var g={test:(e,o,n)=>{var c,l,m;let t=e,s=(l=(c=t.slots)==null?void 0:c.test)!=null?l:[],r=((m=t.parameters.test)==null?void 0:m.value)||"Untitled Test",i=s.map((p,u)=>{var f,S;return{...p,id:(S=_((f=p.parameters)==null?void 0:f.testId))!=null?S:`variation-${u+1}-${p.type}`}});return T.createElement(I,{key:o,variations:i,name:r,component:p=>n(p,o)})},personalization:(e,o,n)=>{var r,i,c,l,m,p,u;let t=e,s=z((r=t==null?void 0:t.slots)==null?void 0:r.pz);return T.createElement(k,{key:o,variations:s,count:Number((l=(c=(i=t.parameters)==null?void 0:i.count)==null?void 0:c.value)!=null?l:1),trackingEventName:(p=(m=t.parameters)==null?void 0:m.trackingEventName)==null?void 0:p.value,matchFilter:(u=t.parameters.matchFilter)==null?void 0:u.value,component:f=>n(f,0)})}};function _(e){if(typeof(e==null?void 0:e.value)=="string")return e.value}function pe({name:e,resolveRenderer:o,children:n}){var m;let{composition:t,resolveRenderer:s}=P();if(!t)throw new Error("Cannot use Slot without a Composition wrapper.");let r=(m=t.slots)==null?void 0:m[e];if(!r||!Array.isArray(r))return process.env.NODE_ENV==="development"&&console.warn(`[canvas-dev] slot '${e}' was rendered, but it was not defined on its component. This is expected if the slot is optional, otherwise it may indicate a typo. Component:`,t),null;let i=o!=null?o:s,c=g,l=r.map((p,u)=>{let f=E({component:p,resolveRenderer:i,resolveSystem:c,key:u});return n?n({child:f,component:p,key:u}):f});return y.createElement(y.Fragment,void 0,l)}function E({component:e,resolveRenderer:o,resolveSystem:n,key:t=0}){let s=o==null?void 0:o(e);if(e.type===V)return n.test(e,t,(r,i)=>E({component:r,resolveRenderer:o,resolveSystem:n,key:i}));if(e.type===O)return n.personalization(e,t,(r,i)=>E({component:r,resolveRenderer:o,resolveSystem:n,key:i}));if(s){let r=v(e);return y.createElement(N,{key:t,data:e,resolveRenderer:o},y.createElement(s,{...r}))}else process.env.NODE_ENV!=="production"&&console.warn(`[canvas] found component of type '${e.type}' which the resolveRenderer prop returned no component for. Nothing will be rendered. The resolveRenderer function may need to be extended to handle the new type.`,e);return null}import a from"react";function ce(e){var n;let o=(n=e.component)==null?void 0:n.type;return o?a.createElement("div",{style:{borderLeft:"10px solid #e42535!important",padding:"0.01em 16px 16px",borderRadius:"16px",backgroundColor:"rgba(122, 215, 218, 0.3)",color:"#1d3557"}},a.createElement("h2",null,"Component: ",o),a.createElement("p",null,a.createElement("strong",null,o)," has no React implementation. It may need to be added to your"," ",a.createElement("code",null,"resolveRenderer()")," function."),a.createElement("details",null,a.createElement("summary",null,"Props"),a.createElement("pre",null,JSON.stringify(e,null,2)))):null}import{CANVAS_DRAFT_STATE as F,createEventBus as D,subscribeToComposition as J}from"@uniformdev/canvas";import{useEffect as L}from"react";function Ce({enabled:e,projectId:o,compositionId:n,effect:t}){L(()=>{if(!e||!n||!o)return;let s;return(async()=>{let i=await D();i&&(s=J({eventBus:i,compositionId:n,compositionState:F,projectId:o,callback:t,event:"updated"}))})(),()=>{s&&s()}},[n,e,o,t])}export{N as Composition,ce as DefaultNotImplementedComponent,pe as Slot,P as useComposition,Ce as useCompositionEventEffect};
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{useBehaviorTracking as N}from"@uniformdev/optimize-tracker-react";import{CANVAS_INTENT_TAG_PARAM as g}from"@uniformdev/canvas";import R,{createContext as h,useContext as b}from"react";function d(e){var t;let o=(t=e.parameters)!=null?t:{};return{...Object.keys(o).reduce((s,r)=>(s[r]=o[r].value,s),{}),...e.data,component:e}}var T=h({});function v(){return b(T)}function E({data:e,resolveRenderer:o,children:n}){var r,i;let t=v();if(N((i=(r=e==null?void 0:e.parameters)==null?void 0:r[g])==null?void 0:i.value),!e)return process.env.NODE_ENV==="development"&&console.warn("[canvas-dev] Composition was rendered with no data, nothing will be output."),null;let s={composition:e,resolveRenderer:o!=null?o:t.resolveRenderer};return R.createElement(T.Provider,{value:s},typeof n=="function"?n(d(e)):n)}import C from"react";import{CANVAS_PERSONALIZE_TYPE as z,CANVAS_TEST_TYPE as _}from"@uniformdev/canvas";import{Personalize as w,Test as A}from"@uniformdev/optimize-tracker-react";import{mapSlotToPersonalizedVariations as k}from"@uniformdev/canvas";import{createElement as x}from"react";var S={test:(e,o,n)=>{var c,l,m;let t=e,s=(l=(c=t.slots)==null?void 0:c.test)!=null?l:[],r=((m=t.parameters.test)==null?void 0:m.value)||"Untitled Test",i=s.map((p,u)=>{var f,P;return{...p,id:(P=I((f=p.parameters)==null?void 0:f.testId))!=null?P:`variation-${u+1}-${p.type}`}});return x(A,{key:o,variations:i,name:r,component:p=>n(p,o)})},personalization:(e,o,n)=>{var r,i,c,l,m,p,u;let t=e,s=k((r=t==null?void 0:t.slots)==null?void 0:r.pz);return x(w,{key:o,variations:s,count:Number((l=(c=(i=t.parameters)==null?void 0:i.count)==null?void 0:c.value)!=null?l:1),trackingEventName:(p=(m=t.parameters)==null?void 0:m.trackingEventName)==null?void 0:p.value,matchFilter:(u=t.parameters.matchFilter)==null?void 0:u.value,component:f=>n(f,0)})}};function I(e){if(typeof(e==null?void 0:e.value)=="string")return e.value}function ie({name:e,resolveRenderer:o,children:n}){var m;let{composition:t,resolveRenderer:s}=v();if(!t)throw new Error("Cannot use Slot without a Composition wrapper.");let r=(m=t.slots)==null?void 0:m[e];if(!r||!Array.isArray(r))return process.env.NODE_ENV==="development"&&console.warn(`[canvas-dev] slot '${e}' was rendered, but it was not defined on its component. This is expected if the slot is optional, otherwise it may indicate a typo. Component:`,t),null;let i=o!=null?o:s,c=S,l=r.map((p,u)=>{let f=y({component:p,resolveRenderer:i,resolveSystem:c,key:u});return n?n({child:f,component:p,key:u}):f});return C.createElement(C.Fragment,void 0,l)}function y({component:e,resolveRenderer:o,resolveSystem:n,key:t=0}){let s=o==null?void 0:o(e);if(e.type===_)return n.test(e,t,(r,i)=>y({component:r,resolveRenderer:o,resolveSystem:n,key:i}));if(e.type===z)return n.personalization(e,t,(r,i)=>y({component:r,resolveRenderer:o,resolveSystem:n,key:i}));if(s){let r=d(e);return C.createElement(E,{key:t,data:e,resolveRenderer:o},C.createElement(s,{...r}))}else process.env.NODE_ENV!=="production"&&console.warn(`[canvas] found component of type '${e.type}' which the resolveRenderer prop returned no component for. Nothing will be rendered. The resolveRenderer function may need to be extended to handle the new type.`,e);return null}import a from"react";function ae(e){var n;let o=(n=e.component)==null?void 0:n.type;return o?a.createElement("div",{style:{borderLeft:"10px solid #e42535!important",padding:"0.01em 16px 16px",borderRadius:"16px",backgroundColor:"rgba(122, 215, 218, 0.3)",color:"#1d3557"}},a.createElement("h2",null,"Component: ",o),a.createElement("p",null,a.createElement("strong",null,o)," has no React implementation. It may need to be added to your"," ",a.createElement("code",null,"resolveRenderer()")," function."),a.createElement("details",null,a.createElement("summary",null,"Props"),a.createElement("pre",null,JSON.stringify(e,null,2)))):null}import{CANVAS_DRAFT_STATE as O,createEventBus as V,subscribeToComposition as F}from"@uniformdev/canvas";import{useEffect as D}from"react";function de({enabled:e,projectId:o,compositionId:n,effect:t}){D(()=>{if(!e||!n||!o)return;let s;return(async()=>{let i=await V();i&&(s=F({eventBus:i,compositionId:n,compositionState:O,projectId:o,callback:t,event:"updated"}))})(),()=>{s&&s()}},[n,e,o,t])}export{E as Composition,ae as DefaultNotImplementedComponent,ie as Slot,v as useComposition,de as useCompositionEventEffect};
1
+ import{useBehaviorTracking as R}from"@uniformdev/optimize-tracker-react";import{CANVAS_INTENT_TAG_PARAM as h}from"@uniformdev/canvas";import b,{createContext as w,useContext as A}from"react";function v(e){var t;let o=(t=e.parameters)!=null?t:{};return{...Object.keys(o).reduce((s,r)=>(s[r]=o[r].value,s),{}),...e.data,component:e}}var x=w({});function P(){return A(x)}function N({data:e,resolveRenderer:o,children:n}){var r,i;let t=P();if(R((i=(r=e==null?void 0:e.parameters)==null?void 0:r[h])==null?void 0:i.value),!e)return process.env.NODE_ENV==="development"&&console.warn("[canvas-dev] Composition was rendered with no data, nothing will be output."),null;let s={composition:e,resolveRenderer:o!=null?o:t.resolveRenderer};return b.createElement(x.Provider,{value:s},typeof n=="function"?n(v(e)):n)}import y from"react";import{CANVAS_PERSONALIZE_TYPE as O,CANVAS_TEST_TYPE as V}from"@uniformdev/canvas";import{Personalize as k,Test as I}from"@uniformdev/optimize-tracker-react";import{mapSlotToPersonalizedVariations as z}from"@uniformdev/canvas";import*as T from"react";var g={test:(e,o,n)=>{var c,l,m;let t=e,s=(l=(c=t.slots)==null?void 0:c.test)!=null?l:[],r=((m=t.parameters.test)==null?void 0:m.value)||"Untitled Test",i=s.map((p,u)=>{var f,S;return{...p,id:(S=_((f=p.parameters)==null?void 0:f.testId))!=null?S:`variation-${u+1}-${p.type}`}});return T.createElement(I,{key:o,variations:i,name:r,component:p=>n(p,o)})},personalization:(e,o,n)=>{var r,i,c,l,m,p,u;let t=e,s=z((r=t==null?void 0:t.slots)==null?void 0:r.pz);return T.createElement(k,{key:o,variations:s,count:Number((l=(c=(i=t.parameters)==null?void 0:i.count)==null?void 0:c.value)!=null?l:1),trackingEventName:(p=(m=t.parameters)==null?void 0:m.trackingEventName)==null?void 0:p.value,matchFilter:(u=t.parameters.matchFilter)==null?void 0:u.value,component:f=>n(f,0)})}};function _(e){if(typeof(e==null?void 0:e.value)=="string")return e.value}function pe({name:e,resolveRenderer:o,children:n}){var m;let{composition:t,resolveRenderer:s}=P();if(!t)throw new Error("Cannot use Slot without a Composition wrapper.");let r=(m=t.slots)==null?void 0:m[e];if(!r||!Array.isArray(r))return process.env.NODE_ENV==="development"&&console.warn(`[canvas-dev] slot '${e}' was rendered, but it was not defined on its component. This is expected if the slot is optional, otherwise it may indicate a typo. Component:`,t),null;let i=o!=null?o:s,c=g,l=r.map((p,u)=>{let f=E({component:p,resolveRenderer:i,resolveSystem:c,key:u});return n?n({child:f,component:p,key:u}):f});return y.createElement(y.Fragment,void 0,l)}function E({component:e,resolveRenderer:o,resolveSystem:n,key:t=0}){let s=o==null?void 0:o(e);if(e.type===V)return n.test(e,t,(r,i)=>E({component:r,resolveRenderer:o,resolveSystem:n,key:i}));if(e.type===O)return n.personalization(e,t,(r,i)=>E({component:r,resolveRenderer:o,resolveSystem:n,key:i}));if(s){let r=v(e);return y.createElement(N,{key:t,data:e,resolveRenderer:o},y.createElement(s,{...r}))}else process.env.NODE_ENV!=="production"&&console.warn(`[canvas] found component of type '${e.type}' which the resolveRenderer prop returned no component for. Nothing will be rendered. The resolveRenderer function may need to be extended to handle the new type.`,e);return null}import a from"react";function ce(e){var n;let o=(n=e.component)==null?void 0:n.type;return o?a.createElement("div",{style:{borderLeft:"10px solid #e42535!important",padding:"0.01em 16px 16px",borderRadius:"16px",backgroundColor:"rgba(122, 215, 218, 0.3)",color:"#1d3557"}},a.createElement("h2",null,"Component: ",o),a.createElement("p",null,a.createElement("strong",null,o)," has no React implementation. It may need to be added to your"," ",a.createElement("code",null,"resolveRenderer()")," function."),a.createElement("details",null,a.createElement("summary",null,"Props"),a.createElement("pre",null,JSON.stringify(e,null,2)))):null}import{CANVAS_DRAFT_STATE as F,createEventBus as D,subscribeToComposition as J}from"@uniformdev/canvas";import{useEffect as L}from"react";function Ce({enabled:e,projectId:o,compositionId:n,effect:t}){L(()=>{if(!e||!n||!o)return;let s;return(async()=>{let i=await D();i&&(s=J({eventBus:i,compositionId:n,compositionState:F,projectId:o,callback:t,event:"updated"}))})(),()=>{s&&s()}},[n,e,o,t])}export{N as Composition,ce as DefaultNotImplementedComponent,pe as Slot,P as useComposition,Ce as useCompositionEventEffect};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniformdev/canvas-react",
3
- "version": "12.2.1-alpha.59+ee5a4745",
3
+ "version": "13.0.1-alpha.83+ca85e1db",
4
4
  "description": "React SDK for Uniform Canvas",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "main": "./dist/index.js",
@@ -25,25 +25,25 @@
25
25
  "ci:build": "tsup --minify --clean"
26
26
  },
27
27
  "dependencies": {
28
- "@uniformdev/canvas": "^12.2.1-alpha.59+ee5a4745",
29
- "@uniformdev/optimize-common": "^12.2.1-alpha.59+ee5a4745",
30
- "@uniformdev/optimize-tracker-react": "^12.2.1-alpha.59+ee5a4745"
28
+ "@uniformdev/canvas": "^13.0.1-alpha.83+ca85e1db",
29
+ "@uniformdev/optimize-common": "^13.0.1-alpha.83+ca85e1db",
30
+ "@uniformdev/optimize-tracker-react": "^13.0.1-alpha.83+ca85e1db"
31
31
  },
32
32
  "peerDependencies": {
33
33
  "react": ">= 16"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/jest": "27.0.3",
37
- "@types/node": "16.7.1",
38
- "eslint": "7.32.0",
37
+ "@types/node": "16.11.12",
38
+ "eslint": "8.4.1",
39
39
  "eslint-plugin-react": "7.27.1",
40
40
  "eslint-plugin-react-hooks": "4.3.0",
41
- "jest": "27.3.1",
41
+ "jest": "27.4.5",
42
42
  "npm-run-all": "4.1.5",
43
43
  "react": "17.0.2",
44
44
  "rimraf": "3.0.2",
45
- "ts-jest": "27.0.7",
46
- "tsup": "5.7.2"
45
+ "ts-jest": "27.1.1",
46
+ "tsup": "5.11.1"
47
47
  },
48
48
  "files": [
49
49
  "/dist"
@@ -51,5 +51,5 @@
51
51
  "publishConfig": {
52
52
  "access": "public"
53
53
  },
54
- "gitHead": "ee5a4745535ac342d62ba2472e2a681c9867255b"
54
+ "gitHead": "ca85e1dbe78e521ab829624f9b4c8ad0744d3a95"
55
55
  }