UNPKG

dua

Version:
2 lines (1 loc) 4.58 kB
const e=(e,t)=>(e.roots||(e.roots=[]),e.childMap||(e.childMap={}),t.parentId?e.childMap[t.parentId]?e.childMap[t.parentId].push(t):e.childMap[t.parentId]=[t]:(e.childMap.hasOwnProperty(t.id)||(e.childMap[t.id]=[]),e.roots.push(t)),e),t=(e,a)=>{const r=a[e.id];return r&&r.forEach(e=>{t(e,a)}),e.children=r,e},a={normalize:(a,r)=>{const d=a&&a.reduce((t,a)=>(a&&a.id&&(t.byId[a.id]=a,t.workspace=e(t.workspace,a)),t),{byId:{},workspace:{}})||{byId:{},workspace:{}};return{byId:d.byId,allIds:d.workspace.roots.map(e=>t(e,d.workspace.childMap)),total:"number"==typeof r?r:a.length}},transform:a=>{const r=Object.keys(a||{}).reduce((t,r)=>e(t,a[r]),{});return r.workspace.roots.map(e=>t(e,r.workspace.childMap))},reduce:e=>e},r=(e,t)=>{const a=t.parentIds&&t.parentIds.length||0;return e[a]||(e[a]={}),e[a][t.id]=t,e},d=e=>{for(let t=e.length-1;t>0;--t)Object.keys(e[t]).forEach(a=>{const r=e[t][a];if(r.parentIds&&r.parentIds.length>0){const a=e[t-1][r.parentIds[0]];a&&(a.children?a.children.push(r):a.children=[r])}});return e&&e.length>0?Object.keys(e[0]).map(t=>e[0][t]):[]},l={normalize:(e,t)=>{const a=e&&e.reduce((e,t)=>(t&&t.id&&(e.byId[t.id]=t,e.workspace=r(e.workspace,t)),e),{byId:{},workspace:[]})||{byId:{},workspace:[]};return{byId:a.byId,allIds:d(a.workspace),total:"number"==typeof t?t:e.length}},transform:e=>{const t=Object.keys(e||{}).reduce((t,a)=>r(t,{...e[a],children:void 0}),{}),a=Object.keys(t).map(e=>t[e]);return d(a)},reduce:e=>e},o={};o.flat={normalize:(e,t)=>({byId:e&&e.reduce((e,t)=>(t&&t.id&&(e[t.id]=t),e),{})||{},allIds:e||[],total:"number"==typeof t?t:e.length}),transform:e=>Object.keys(e||{}).reduce((t,a)=>t.concat(e[a]),[]),reduce:e=>e},o["single-tree"]=a,o["multiple-tree"]=l;var n={get:e=>o[e],clone:(e,t)=>{const a=o[e];return a?{...a,...t}:null},list:()=>Object.keys(o),install:(e,t)=>o[e]=t};function c(e,t,a){const{fetch:r,fetchPart:d,create:l,update:o,remove:c,detail:i}=t,s=a&&a.type||"flat",p=a&&a.drive||n.get(s);if(!p)throw Error(`no drive for this type [${s}]`);const{transform:y,normalize:u,mixed:_}=p,h=p.reduce;return{namespace:e,state:{byId:{},allIds:[],total:0},effects:{*fetch({payload:e},{call:t,put:a,select:d}){if(r){const l=yield t(r,e);if(l&&(200===l.code||0===l.code)){const e=l.data.list||l.data.retlist||l.data||[],t=l.data.total||e.length,r=_?yield d(e=>e):null;return yield a({type:"onFetch",payload:{list:e,total:t,__extra__:r}}),l||!0}}return!1},*fetchPart({payload:e},{call:t,put:a,select:r}){if(d){const l=yield t(d,e);if(l&&(200===l.code||0===l.code)){const e=l.data.list||l.data||[],t=l.data.total,d=_?yield r(e=>e):null;return yield a({type:"onFetchPart",payload:{list:e,total:t,__extra__:d}}),l||!0}}return!1},*create({payload:e},{call:t,put:a,select:r}){if(l){const d=yield t(l,e);if(d&&(200===d.code||0===d.code)){const t=d.data,l=_?yield r(e=>e):null;return yield a({type:"onCreate",payload:{...e,...t,__extra__:l}}),d||!0}}return!1},*update({payload:e},{call:t,put:a,select:r}){if(o){const{id:d,...l}=e||{},n=yield t(o,d||e,l);if(n&&(200===n.code||0===n.code)){const t=n.data,d=_?yield r(e=>e):null;return yield a({type:"onUpdate",payload:{...e,...t,__extra__:d}}),n||!0}}return!1},*remove({payload:e},{call:t,put:a,select:r}){if(c){const d=e&&e.id||e,l=yield t(c,d);if(l&&(200===l.code||0===l.code)){const e=_?yield r(e=>e):null;return yield a({type:"onRemove",payload:{id:d,__extra__:e},__extra__:e}),l||!0}}return!1},*detail({payload:e},{call:t,put:a,select:r}){if(i){const d=yield t(i,e);if(d&&(200===d.code||0===d.code)){const e=d.data,t=_?yield r(e=>e):null;return yield a({type:"onUpdate",payload:e,__extra__:t}),d||!0}}return!1}},reducers:{onFetch(e,{payload:t}){const{list:a,total:r,__extra__:d}=t,l=u(a,r);return h({...e,...l},d)},onFetchPart(e,{payload:t}){const{list:a,total:r,__extra__:d}=t;const l=function e(t){return t.reduce((t,a)=>(a.children&&(t=t.concat(e(a.children))),t=t.concat({...a,children:void 0})),[])}(e.allIds),o=u([].concat(l,a),r||e.total+a.length);return h({...e,...o},d)},onCreate(e,{payload:t}){if(t&&t.id){const a={...e.byId,[t.id]:t},r=y(a);return h({...e,byId:a,allIds:r,total:e.total+1},t.__extra__)}return e},onUpdate(e,{payload:t}){if(t){if(t.id){const a={...e.byId,[t.id]:{...e.byId[t.id],...t}},r=y(a);return h({...e,byId:a,allIds:r},t.__extra__)}{const a={...e.byId,__auto_id__:{...e.byId[t.id],...t}},r=y(a);return h({...e,byId:a,allIds:r},t.__extra__)}}return e},onRemove(e,{payload:t}){if(t&&t.id){const a={...e.byId};delete a[t.id];const r=y(a);return h({...e,byId:a,allIds:r,total:e.total-1},t.__extra__)}return e}}}}export{c as create,n as driver};