@baseplate-dev/project-builder-web 0.2.5 → 0.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.
Files changed (198) hide show
  1. package/dist/assets/-constants-C0cnDlAn.js +4 -0
  2. package/dist/assets/-constants-C0cnDlAn.js.map +1 -0
  3. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/web-BCejYgPM.js +2 -0
  4. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/{web-dPVRSC8L.js.map → web-BCejYgPM.js.map} +1 -1
  5. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-BxDAWgq7.js +2 -0
  6. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-BxDAWgq7.js.map +1 -0
  7. package/dist/assets/__federation_shared_@baseplate-dev/ui-components-D6OnTPTN.js +46 -0
  8. package/dist/assets/__federation_shared_@baseplate-dev/ui-components-D6OnTPTN.js.map +1 -0
  9. package/dist/assets/__federation_shared_@baseplate-dev/utils-DvvrgoSE.js +5 -0
  10. package/dist/assets/__federation_shared_@baseplate-dev/utils-DvvrgoSE.js.map +1 -0
  11. package/dist/assets/__federation_shared_@tanstack/react-router-B5c6YNeC.js +19 -0
  12. package/dist/assets/__federation_shared_@tanstack/react-router-B5c6YNeC.js.map +1 -0
  13. package/dist/assets/__federation_shared_react-WURrSs1p.js +2 -0
  14. package/dist/assets/{__federation_shared_react-CTQ9xfiH.js.map → __federation_shared_react-WURrSs1p.js.map} +1 -1
  15. package/dist/assets/__federation_shared_react-dom-CWagDEjd.js +2 -0
  16. package/dist/assets/{__federation_shared_react-dom-DPv53nVg.js.map → __federation_shared_react-dom-CWagDEjd.js.map} +1 -1
  17. package/dist/assets/_commonjsHelpers-CqkleIqs.js +2 -0
  18. package/dist/assets/_commonjsHelpers-CqkleIqs.js.map +1 -0
  19. package/dist/assets/_virtual___federation_fn_import-DXu2m-ZE.js +2 -0
  20. package/dist/assets/{_virtual___federation_fn_import-DK_YYIlv.js.map → _virtual___federation_fn_import-DXu2m-ZE.js.map} +1 -1
  21. package/dist/assets/admin-Bw70Pql0.js +2 -0
  22. package/dist/assets/admin-Bw70Pql0.js.map +1 -0
  23. package/dist/assets/backend-CoqSwiCt.js +2 -0
  24. package/dist/assets/{backend-B_UhUC1z.js.map → backend-CoqSwiCt.js.map} +1 -1
  25. package/dist/assets/badge-with-type-label-BXoSRTRE.js +2 -0
  26. package/dist/assets/{badge-with-type-label-Cvf-Kq7s.js.map → badge-with-type-label-BXoSRTRE.js.map} +1 -1
  27. package/dist/assets/edit._key-CtMMGDWu.js +2 -0
  28. package/dist/assets/edit._key-CtMMGDWu.js.map +1 -0
  29. package/dist/assets/edit._sectionKey-CTX9L0j4.js +3 -0
  30. package/dist/assets/edit._sectionKey-CTX9L0j4.js.map +1 -0
  31. package/dist/assets/enum-info-form-D5bAsvPH.js +2 -0
  32. package/dist/assets/{enum-info-form-CfQbLUQ3.js.map → enum-info-form-D5bAsvPH.js.map} +1 -1
  33. package/dist/assets/graphql-BmA-sAqU.js +2 -0
  34. package/dist/assets/{graphql-DTRjqtIq.js.map → graphql-BmA-sAqU.js.map} +1 -1
  35. package/dist/assets/hierarchy-CZorhmS7.js +2 -0
  36. package/dist/assets/{hierarchy-BDu76BxG.js.map → hierarchy-CZorhmS7.js.map} +1 -1
  37. package/dist/assets/immer-B7fdkLVi.js +2 -0
  38. package/dist/assets/immer-B7fdkLVi.js.map +1 -0
  39. package/dist/assets/index-BABen-rU.js +2 -0
  40. package/dist/assets/index-BABen-rU.js.map +1 -0
  41. package/dist/assets/index-BGLRovL6.js +2 -0
  42. package/dist/assets/index-BGLRovL6.js.map +1 -0
  43. package/dist/assets/index-BPzqpd9P.js +2 -0
  44. package/dist/assets/{index-CKCJuR7p.js.map → index-BPzqpd9P.js.map} +1 -1
  45. package/dist/assets/index-BUYA3Tes.js +40 -0
  46. package/dist/assets/index-BUYA3Tes.js.map +1 -0
  47. package/dist/assets/index-Bl_iRlKL.js +2 -0
  48. package/dist/assets/index-Bl_iRlKL.js.map +1 -0
  49. package/dist/assets/index-BpDkQSTy.js +2 -0
  50. package/dist/assets/{index-01LAxHjt.js.map → index-BpDkQSTy.js.map} +1 -1
  51. package/dist/assets/index-CaiaVpxa.js +2 -0
  52. package/dist/assets/index-CaiaVpxa.js.map +1 -0
  53. package/dist/assets/index-CsGKSjOd.js +2 -0
  54. package/dist/assets/index-CsGKSjOd.js.map +1 -0
  55. package/dist/assets/index-D-dbw3Qx.js +2 -0
  56. package/dist/assets/{index-DITwAD5X.js.map → index-D-dbw3Qx.js.map} +1 -1
  57. package/dist/assets/index-DCiH936w.js +2 -0
  58. package/dist/assets/{index-D8LleqeK.js.map → index-DCiH936w.js.map} +1 -1
  59. package/dist/assets/index-DDivWD4R.js +2 -0
  60. package/dist/assets/index-DDivWD4R.js.map +1 -0
  61. package/dist/assets/index-DpJKJe06.js +2 -0
  62. package/dist/assets/index-DpJKJe06.js.map +1 -0
  63. package/dist/assets/{index-B0D_rfGi.js → index-DqHVrEeL.js} +2 -2
  64. package/dist/assets/{index-B0D_rfGi.js.map → index-DqHVrEeL.js.map} +1 -1
  65. package/dist/assets/index-PlVWOW99.css +1 -0
  66. package/dist/assets/index-_mf2naQd.js +2 -0
  67. package/dist/assets/index-_mf2naQd.js.map +1 -0
  68. package/dist/assets/{index-9Ra4Lmds.js → index-c0qeY2gs.js} +3 -3
  69. package/dist/assets/{index-9Ra4Lmds.js.map → index-c0qeY2gs.js.map} +1 -1
  70. package/dist/assets/index-p--SDqro.js +2 -0
  71. package/dist/assets/{index-DhWOhNFS.js.map → index-p--SDqro.js.map} +1 -1
  72. package/dist/assets/index.esm-CTDJ8Wko.js +2 -0
  73. package/dist/assets/index.esm-CTDJ8Wko.js.map +1 -0
  74. package/dist/assets/jsx-runtime-D_zvdyIk.js +10 -0
  75. package/dist/assets/jsx-runtime-D_zvdyIk.js.map +1 -0
  76. package/dist/assets/model-info-form-pKQBCJu4.js +2 -0
  77. package/dist/assets/{model-info-form-tJoD-VwE.js.map → model-info-form-pKQBCJu4.js.map} +1 -1
  78. package/dist/assets/model-merger-vEOkdVdS.js +2 -0
  79. package/dist/assets/model-merger-vEOkdVdS.js.map +1 -0
  80. package/dist/assets/new-admin-section-dialog-F58HZ0yO.js +2 -0
  81. package/dist/assets/new-admin-section-dialog-F58HZ0yO.js.map +1 -0
  82. package/dist/assets/new-app-dialog-DPQv-mvi.js +2 -0
  83. package/dist/assets/new-app-dialog-DPQv-mvi.js.map +1 -0
  84. package/dist/assets/new-enum-dialog-xVvneRQN.js +2 -0
  85. package/dist/assets/{new-enum-dialog-BxDxXwX_.js.map → new-enum-dialog-xVvneRQN.js.map} +1 -1
  86. package/dist/assets/new-model-dialog-ApenxGWq.js +2 -0
  87. package/dist/assets/{new-model-dialog-D4pnLGR_.js.map → new-model-dialog-ApenxGWq.js.map} +1 -1
  88. package/dist/assets/route-1RLqcpwJ.js +2 -0
  89. package/dist/assets/{route-DYHQ0t6P.js.map → route-1RLqcpwJ.js.map} +1 -1
  90. package/dist/assets/route-9nRSk82v.js +2 -0
  91. package/dist/assets/route-9nRSk82v.js.map +1 -0
  92. package/dist/assets/route-B5_zLW88.js +2 -0
  93. package/dist/assets/{route-DSICQIL3.js.map → route-B5_zLW88.js.map} +1 -1
  94. package/dist/assets/route-BPsno3Cl.js +2 -0
  95. package/dist/assets/route-BPsno3Cl.js.map +1 -0
  96. package/dist/assets/route-BW0F_EH4.js +2 -0
  97. package/dist/assets/{route-BGYla1q4.js.map → route-BW0F_EH4.js.map} +1 -1
  98. package/dist/assets/route-C1hyfOXp.js +2 -0
  99. package/dist/assets/route-C1hyfOXp.js.map +1 -0
  100. package/dist/assets/route-CH7VQVwb.js +2 -0
  101. package/dist/assets/route-CH7VQVwb.js.map +1 -0
  102. package/dist/assets/route-CpoiDvOD.js +2 -0
  103. package/dist/assets/route-CpoiDvOD.js.map +1 -0
  104. package/dist/assets/route-Dq2UgkxS.js +2 -0
  105. package/dist/assets/{route-CO2y2T3j.js.map → route-Dq2UgkxS.js.map} +1 -1
  106. package/dist/assets/route-z54yq2nP.js +2 -0
  107. package/dist/assets/route-z54yq2nP.js.map +1 -0
  108. package/dist/assets/service-Cv-U7NUv.js +2 -0
  109. package/dist/assets/service-Cv-U7NUv.js.map +1 -0
  110. package/dist/assets/sortBy-C9bvycg5.js +2 -0
  111. package/dist/assets/sortBy-C9bvycg5.js.map +1 -0
  112. package/dist/assets/template-extractor-ElrbBsVj.js +2 -0
  113. package/dist/assets/{template-extractor-1dzSeRMo.js.map → template-extractor-ElrbBsVj.js.map} +1 -1
  114. package/dist/assets/{theme-builder-NSOA1xIw.js → theme-builder-Butjmy7L.js} +6 -6
  115. package/dist/assets/{theme-builder-NSOA1xIw.js.map → theme-builder-Butjmy7L.js.map} +1 -1
  116. package/dist/assets/{use-definition-schema-DOTr2MSB.js → use-definition-schema-e7us6WfR.js} +2 -2
  117. package/dist/assets/{use-definition-schema-DOTr2MSB.js.map → use-definition-schema-e7us6WfR.js.map} +1 -1
  118. package/dist/assets/use-enum-form-CEyTBPQn.js +2 -0
  119. package/dist/assets/{use-enum-form-Bon-b8Oc.js.map → use-enum-form-CEyTBPQn.js.map} +1 -1
  120. package/dist/assets/use-model-form-Ch_tz0Rd.js +2 -0
  121. package/dist/assets/{use-model-form-Bjm8n0m8.js.map → use-model-form-Ch_tz0Rd.js.map} +1 -1
  122. package/dist/assets/words-Cs2RBKRm.js +2 -0
  123. package/dist/assets/words-Cs2RBKRm.js.map +1 -0
  124. package/dist/index.html +11 -8
  125. package/package.json +11 -11
  126. package/dist/assets/-constants-CyTNHADu.js +0 -4
  127. package/dist/assets/-constants-CyTNHADu.js.map +0 -1
  128. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib/web-dPVRSC8L.js +0 -2
  129. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-DnM8acZf.js +0 -5
  130. package/dist/assets/__federation_shared_@baseplate-dev/project-builder-lib-DnM8acZf.js.map +0 -1
  131. package/dist/assets/__federation_shared_@baseplate-dev/ui-components-z-HwX7Wv.js +0 -46
  132. package/dist/assets/__federation_shared_@baseplate-dev/ui-components-z-HwX7Wv.js.map +0 -1
  133. package/dist/assets/__federation_shared_react-CTQ9xfiH.js +0 -2
  134. package/dist/assets/__federation_shared_react-dom-DPv53nVg.js +0 -2
  135. package/dist/assets/_virtual___federation_fn_import-DK_YYIlv.js +0 -2
  136. package/dist/assets/backend-B_UhUC1z.js +0 -2
  137. package/dist/assets/badge-with-type-label-Cvf-Kq7s.js +0 -2
  138. package/dist/assets/edit._id-TYAWf8Zb.js +0 -2
  139. package/dist/assets/edit._id-TYAWf8Zb.js.map +0 -1
  140. package/dist/assets/enum-info-form-CfQbLUQ3.js +0 -2
  141. package/dist/assets/graphql-DTRjqtIq.js +0 -2
  142. package/dist/assets/hierarchy-BDu76BxG.js +0 -2
  143. package/dist/assets/immer-BOh2djD_.js +0 -2
  144. package/dist/assets/immer-BOh2djD_.js.map +0 -1
  145. package/dist/assets/index-01LAxHjt.js +0 -2
  146. package/dist/assets/index-B7G2CMwL.js +0 -58
  147. package/dist/assets/index-B7G2CMwL.js.map +0 -1
  148. package/dist/assets/index-B9Di1LKs.css +0 -1
  149. package/dist/assets/index-BgFEd-vA.js +0 -2
  150. package/dist/assets/index-BgFEd-vA.js.map +0 -1
  151. package/dist/assets/index-BkkIaDrq.js +0 -2
  152. package/dist/assets/index-BkkIaDrq.js.map +0 -1
  153. package/dist/assets/index-CKCJuR7p.js +0 -2
  154. package/dist/assets/index-Cg4QKyV6.js +0 -2
  155. package/dist/assets/index-Cg4QKyV6.js.map +0 -1
  156. package/dist/assets/index-D8LleqeK.js +0 -2
  157. package/dist/assets/index-DITwAD5X.js +0 -2
  158. package/dist/assets/index-DhWOhNFS.js +0 -2
  159. package/dist/assets/index-PWrncK3R.js +0 -2
  160. package/dist/assets/index-PWrncK3R.js.map +0 -1
  161. package/dist/assets/index-tLZ1b0Gc.js +0 -2
  162. package/dist/assets/index-tLZ1b0Gc.js.map +0 -1
  163. package/dist/assets/index.esm-Bvv3vNQh.js +0 -10
  164. package/dist/assets/index.esm-Bvv3vNQh.js.map +0 -1
  165. package/dist/assets/model-info-form-tJoD-VwE.js +0 -2
  166. package/dist/assets/model-merger-DuBMgrZ3.js +0 -2
  167. package/dist/assets/model-merger-DuBMgrZ3.js.map +0 -1
  168. package/dist/assets/new-app-dialog-CFhp6QLe.js +0 -2
  169. package/dist/assets/new-app-dialog-CFhp6QLe.js.map +0 -1
  170. package/dist/assets/new-enum-dialog-BxDxXwX_.js +0 -2
  171. package/dist/assets/new-model-dialog-D4pnLGR_.js +0 -2
  172. package/dist/assets/route-BGYla1q4.js +0 -2
  173. package/dist/assets/route-BILZA_nq.js +0 -2
  174. package/dist/assets/route-BILZA_nq.js.map +0 -1
  175. package/dist/assets/route-BLMjDHl_.js +0 -2
  176. package/dist/assets/route-BLMjDHl_.js.map +0 -1
  177. package/dist/assets/route-CO2y2T3j.js +0 -2
  178. package/dist/assets/route-DSICQIL3.js +0 -2
  179. package/dist/assets/route-DYHQ0t6P.js +0 -2
  180. package/dist/assets/route-DvbGaH6v.js +0 -2
  181. package/dist/assets/route-DvbGaH6v.js.map +0 -1
  182. package/dist/assets/route-MA2rDgPd.js +0 -2
  183. package/dist/assets/route-MA2rDgPd.js.map +0 -1
  184. package/dist/assets/route-rzAviP-P.js +0 -2
  185. package/dist/assets/route-rzAviP-P.js.map +0 -1
  186. package/dist/assets/sections-BSA71xrl.js +0 -2
  187. package/dist/assets/sections-BSA71xrl.js.map +0 -1
  188. package/dist/assets/sections._sectionKey-DSatzih8.js +0 -2
  189. package/dist/assets/sections._sectionKey-DSatzih8.js.map +0 -1
  190. package/dist/assets/service-C0mRE7Wd.js +0 -2
  191. package/dist/assets/service-C0mRE7Wd.js.map +0 -1
  192. package/dist/assets/template-extractor-1dzSeRMo.js +0 -2
  193. package/dist/assets/use-enum-form-Bon-b8Oc.js +0 -2
  194. package/dist/assets/use-model-form-Bjm8n0m8.js +0 -2
  195. package/dist/assets/utils-BGrwv_U7.js +0 -2
  196. package/dist/assets/utils-BGrwv_U7.js.map +0 -1
  197. package/dist/assets/web-B598C4Bq.js +0 -2
  198. package/dist/assets/web-B598C4Bq.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{i as r}from"./_virtual___federation_fn_import-DXu2m-ZE.js";import{j as e}from"./jsx-runtime-D_zvdyIk.js";import{G as $,H as S,A as E,I as z}from"./index-BGLRovL6.js";import{s as I,U as A,b as M}from"./index-BUYA3Tes.js";import{b as B}from"./index.esm-CTDJ8Wko.js";import{s as P}from"./sortBy-C9bvycg5.js";function H(t){return $({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"15 10 20 15 15 20"},child:[]},{tag:"path",attr:{d:"M4 4v7a4 4 0 0 0 4 4h12"},child:[]}]})(t)}const{useProjectDefinition:T}=await r("@baseplate-dev/project-builder-lib/web"),{Button:D,ComboboxFieldController:U,Dialog:V,DialogContent:W,DialogFooter:G,DialogHeader:L,DialogTitle:O,InputFieldController:q}=await r("@baseplate-dev/ui-components"),{useEffect:J,useMemo:K}=await r("react"),{z:j}=await r("zod"),Q=j.object({id:j.string(),childName:j.string().min(1).regex(/^[a-z0-9-]+$/,"Must be lowercase, numbers, and dashes only"),parentRef:j.string().optional()});function X({feature:t,open:i,onClose:a}){const{definitionContainer:{definition:p},saveDefinitionWithFeedback:d}=T(),l=K(()=>({id:t?.id??"",childName:t?.name.split("/").pop()??"",parentRef:t?.parentRef}),[t]),{control:f,handleSubmit:w,reset:m,formState:{isSubmitting:v}}=B({resolver:I(Q),values:l});J(()=>{i&&m(l)},[i,l,m]);const y=w(n=>d(c=>{const x=c.features.find(s=>s.id===n.parentRef)?.name,h=n.parentRef?`${x}/${n.childName}`:n.childName;if(c.features.some(s=>s.id!==n.id&&s.name===h))throw new A("Feature with this name already exists");const b=[...c.features.filter(s=>s.id!==n.id),{id:n.id,name:h,parentRef:n.parentRef}];function F(s){const R=b.filter(u=>s?new RegExp(`^${s.name}/[^/]+$`).exec(u.name):!u.name.includes("/"));for(const u of R){const g=u.name.split("/").pop();if(!g)throw new Error("Invalid feature name");u.name=s?`${s.name}/${g}`:g,F(u)}}F(),c.features=P(b,[s=>s.name])},{onSuccess:()=>{a?.()}})),o=[{label:"None",value:void 0},...p.features.filter(n=>n.id!==t?.id).map(n=>({label:n.name,value:n.id}))];return e.jsx(V,{open:i,onOpenChange:n=>{n||a?.()},children:e.jsx(W,{children:e.jsxs("form",{className:"space-y-4",onSubmit:y,children:[e.jsx(L,{children:e.jsxs(O,{children:[t?.name?"Edit":"Add"," Feature"]})}),e.jsx(q,{control:f,name:"childName",label:"Name",autoComplete:"off","data-1p-ignore":!0}),e.jsx(U,{control:f,name:"parentRef",label:"Parent Feature",options:o}),e.jsxs(G,{children:[e.jsx(D,{onClick:a,variant:"secondary",children:"Cancel"}),e.jsx(D,{type:"submit",disabled:v,children:"Save"})]})]})})})}const{featureEntityType:C}=await r("@baseplate-dev/project-builder-lib"),{useProjectDefinition:Y}=await r("@baseplate-dev/project-builder-lib/web"),{Button:N,buttonVariants:Z,cn:_,useConfirmDialog:ee}=await r("@baseplate-dev/ui-components"),{useState:k}=await r("react");function te({feature:t,setFeatureToEdit:i,setShowFeatureForm:a,handleRemoveFeature:p}){const d=t.name.split("/").pop()??"";return e.jsxs("div",{className:"flex space-x-1",children:[e.jsx("button",{className:"mr-1 flex w-full flex-row items-center space-x-3",onClick:()=>{i(t),a(!0)},children:e.jsxs("div",{className:"flex w-full items-center space-x-1 truncate",title:d,children:[t.name.includes("/")&&e.jsxs(e.Fragment,{children:[t.name.split("/").slice(0,-2).map(l=>e.jsx("div",{className:"w-8 shrink-0"},l)),e.jsx(H,{className:"size-8 shrink-0 p-2"})]}),e.jsxs("div",{className:_(Z({variant:"secondary",size:"sm"}),"group w-full"),style:{justifyContent:"flex-start"},children:[d,e.jsx("div",{className:"flex-1"}),e.jsx(S,{className:"opacity-0 transition-opacity group-hover:opacity-100"})]})]})}),e.jsx(N,{className:"shrink-0",variant:"ghost",onClick:()=>{i({id:C.generateNewId(),name:"",parentRef:t.id}),a(!0)},size:"icon",title:`Add Sub-Feature to ${t.name}`,children:e.jsx(E,{})}),e.jsx(N,{className:"shrink-0",variant:"ghost",onClick:()=>{p(t)},size:"icon",title:`Delete ${t.name}`,children:e.jsx(z,{})})]})}const le=function(){const{definitionContainer:i,saveDefinitionWithFeedbackSync:a}=Y(),{requestConfirm:p}=ee(),{showRefIssues:d}=M(),[l,f]=k(),[w,m]=k(!1),{features:v}=i.definition,y=o=>{function n(x){const h=x.features.findIndex(b=>b.id===o.id);if(h===-1)throw new Error("Feature not found");x.features.splice(h,1)}const c=i.fixRefDeletions(n);if(c.type==="failure"){d({issues:c.issues});return}p({title:"Delete Feature",content:`Are you sure you want to delete ${o.name}?`,onConfirm:()=>{a(n,{successMessage:`Feature ${o.name} removed`})}})};return e.jsx("div",{className:"relative h-full max-h-full pb-(--action-bar-height)",children:e.jsxs("div",{className:"flex h-full max-h-full flex-1 flex-col overflow-y-auto px-6",children:[e.jsxs("div",{className:"sticky top-0 space-y-2 border-b bg-background py-6",children:[e.jsx("h1",{children:"Hierarchy"}),e.jsx("p",{className:"max-w-3xl text-muted-foreground",children:"All business logic and features are organized in a hierarchy. The structure of the features in the list below is the way the folder structure will be created in your backend/admin applications."})]}),e.jsxs("div",{className:"py-6",children:[e.jsx("div",{className:"mb-4 flex max-w-md flex-col gap-1",children:v.map(o=>e.jsx(te,{feature:o,setFeatureToEdit:f,setShowFeatureForm:m,handleRemoveFeature:y},o.id))}),e.jsx(N,{onClick:()=>{f({id:C.generateNewId(),name:"",parentRef:void 0}),m(!0)},variant:"secondary",size:"sm",children:"Add Feature"}),e.jsx(X,{feature:l,open:w,onClose:()=>{m(!1)}})]})]})})};export{le as component};
2
+ //# sourceMappingURL=hierarchy-CZorhmS7.js.map