From ec0c71ef31e097450465b9ba2a46a3a90e577485 Mon Sep 17 00:00:00 2001 From: Richard Rodger Date: Mon, 19 Feb 2024 19:02:27 +0000 Subject: [PATCH] add --- dist/browser-store.cjs.js | 2 +- dist/browser-store.cjs.js.map | 2 +- dist/browser-store.es.js | 118 ++++++++++++++++++--------------- dist/browser-store.es.js.map | 2 +- dist/browser-store.iife.js | 2 +- dist/browser-store.iife.js.map | 2 +- dist/browser-store.umd.js | 2 +- dist/browser-store.umd.js.map | 2 +- src/browser-store.ts | 56 +++++++++++----- 9 files changed, 113 insertions(+), 75 deletions(-) diff --git a/dist/browser-store.cjs.js b/dist/browser-store.cjs.js index c5fd650..10343b2 100644 --- a/dist/browser-store.cjs.js +++ b/dist/browser-store.cjs.js @@ -1,2 +1,2 @@ -"use strict";function y(t){let e=this,m=e.export("entity/init"),u=t.handleResponse,a=["save","load","list","remove"].reduce((n,i)=>(n[i]=u[i]||u.any,n),{});const w=[];function c(n,i,f){let r={},l=f.apimsg;for(let s in l){let g=l[s];typeof g=="function"?r[s]=g(n,i,f):r[s]=JSON.parse(JSON.stringify(g))}return r}let d={name:"BrowserStore",save:function(n,i,f){let r=t.debug&&v(arguments),l=t.prepareCtx(n),s=c(n,l,t);r&&$(r,l,s),this.act(s,function(_,p,b){return r&&h(r,arguments),a.save(this,l,i,_,p,s,b,r)})},load:function(n,i,f){let r=t.debug&&v(arguments),l=t.prepareCtx(n),s=c(n,l,t);r&&$(r,l,s),this.act(s,function(_,p,b){return r&&h(r,arguments),a.load(this,l,i,_,p,s,b,r)})},list:function(n,i,f){let r=t.debug&&v(arguments),l=t.prepareCtx(n),s=c(n,l,t);r&&$(r,l,s),this.act(s,function(_,p,b){return r&&h(r,arguments),a.list(this,l,i,_,p,s,b,r)})},remove:function(n,i,f){let r=t.debug&&v(arguments),l=t.prepareCtx(n),s=c(n,l,t);r&&$(r,l,s),this.act(s,function(_,p,b){return r&&h(r,arguments),a.remove(this,l,i,_,p,s,b,r)})},close:function(n,i){i()},native:function(n,i){i()}},o=m(e,t,d);function v(n){let i=t.debug&&{msg:n[0],meta:n[2],start:Date.now()};return i&&w.push(i),i}function $(n,i,f){return n.apistart=Date.now(),n.ctx=i,n.apimsg=f,n}function h(n,i){return n.apiend=Date.now(),n.err=i[0],n.res=i[1],n.apimeta=i[2],n}return{name:d.name,tag:o.tag,exports:{makeApiMsg:c,msglog:w}}}function k(t,e){return t.entity(e.zone,e.base,e.name).canon$()}y.defaults={debug:!1,apimsg:{aim:"req",on:"entity",debounce$:!0,q:(t,e)=>t.q,ent:(t,e)=>t.ent,save:(t,e)=>e.cmd==="save"?"entity":void 0,load:(t,e)=>e.cmd==="load"?"entity":void 0,list:(t,e)=>e.cmd==="list"?"entity":void 0,remove:(t,e)=>e.cmd==="remove"?"entity":void 0,store:(t,e)=>e.store,name:(t,e)=>e.name,base:(t,e)=>e.base,zone:(t,e)=>e.zone},prepareCtx:(t,e)=>{e=e||{};let m=t.q;e.store=m.store$!==!1,delete m.store$,e.cmd=t.cmd;let u=t.ent||t.qent;if(u){if(u.canon$)Object.assign(e,u.canon$({object:!0}));else if(u.entity$){let a=u.entity$.split("/");Object.assign(e,{zone:a[0]==="-"?null:a[0],base:a[1]==="-"?null:a[1],name:a[2]==="-"?null:a[2]})}}return e},handleResponse:{any:function(t,e,m,u,a,w,c,d){if(d&&(d.end=Date.now()),u)return m(u);if(w.load==="entity"&&(a==null||a.ok==null))return m(null);if(a&&a.ok&&a.item){let o=t.entity({zone:e.zone,base:e.base,name:e.name});return m(o.make$().data$(a.item))}else{let o=a&&a.err;return o=o||new Error(`BrowserStore: ${e.cmd} ${k(t,e)}: unknown error`),m(o)}},list:function(t,e,m,u,a,w,c,d){if(d&&(d.end=Date.now()),u&&m(u),a&&a.ok&&a.list){let o=t.entity({zone:e.zone,base:e.base,name:e.name}),v=a.list.map($=>o.make$().data$($));d&&(d.end=Date.now()),m(v)}else{let o=a&&a.err;o=o||new Error(`BrowserStore: ${e.cmd} ${k(t,e)}: unknown list error`),m(o)}}}};Object.defineProperty(y,"name",{value:"BrowserStore"});module.exports=y; +"use strict";console.log("BrowserStore 2");function y(t){let e=this,m=e.export("entity/init"),u=t.handleResponse,a=["save","load","list","remove"].reduce((n,i)=>(n[i]=u[i]||u.any,n),{});const h=[];function g(n,i,f){let r={},s=f.apimsg;for(let l in s){let _=s[l];typeof _=="function"?r[l]=_(n,i,f):r[l]=JSON.parse(JSON.stringify(_))}return r}let d={name:"BrowserStore",save:function(n,i,f){let r=t.debug&&c(arguments),s=t.prepareCtx(n),l=g(n,s,t);if(l.q.add$===!0&&l.ent.id==null&&l.ent.id$==null)return a.save(this,s,i,null,{ok:!0,item:l.ent},l,o,r);r&&b(r,s,l),this.act(l,function(p,v,$){return r&&w(r,arguments),a.save(this,s,i,p,v,l,$,r)})},load:function(n,i,f){let r=t.debug&&c(arguments),s=t.prepareCtx(n),l=g(n,s,t);r&&b(r,s,l),this.act(l,function(p,v,$){return r&&w(r,arguments),a.load(this,s,i,p,v,l,$,r)})},list:function(n,i,f){let r=t.debug&&c(arguments),s=t.prepareCtx(n),l=g(n,s,t);r&&b(r,s,l),this.act(l,function(p,v,$){return r&&w(r,arguments),a.list(this,s,i,p,v,l,$,r)})},remove:function(n,i,f){let r=t.debug&&c(arguments),s=t.prepareCtx(n),l=g(n,s,t);r&&b(r,s,l),this.act(l,function(p,v,$){return r&&w(r,arguments),a.remove(this,s,i,p,v,l,$,r)})},close:function(n,i){i()},native:function(n,i){i()}},o=m(e,t,d);function c(n){let i=t.debug&&{msg:n[0],meta:n[2],start:Date.now()};return i&&h.push(i),i}function b(n,i,f){return n.apistart=Date.now(),n.ctx=i,n.apimsg=f,n}function w(n,i){return n.apiend=Date.now(),n.err=i[0],n.res=i[1],n.apimeta=i[2],n}return{name:d.name,tag:o.tag,exports:{makeApiMsg:g,msglog:h}}}function S(t,e){return t.entity(e.zone,e.base,e.name).canon$()}y.defaults={debug:!1,apimsg:{aim:"req",on:"entity",debounce$:!0,q:(t,e)=>t.q,ent:(t,e)=>t.ent,save:(t,e)=>e.cmd==="save"?"entity":void 0,load:(t,e)=>e.cmd==="load"?"entity":void 0,list:(t,e)=>e.cmd==="list"?"entity":void 0,remove:(t,e)=>e.cmd==="remove"?"entity":void 0,store:(t,e)=>e.store,name:(t,e)=>e.name,base:(t,e)=>e.base,zone:(t,e)=>e.zone},prepareCtx:(t,e)=>{e=e||{};let m=t.q;e.store=m.store$!==!1,delete m.store$,e.cmd=t.cmd;let u=t.ent||t.qent;if(u){if(u.canon$)Object.assign(e,u.canon$({object:!0}));else if(u.entity$){let a=u.entity$.split("/");Object.assign(e,{zone:a[0]==="-"?null:a[0],base:a[1]==="-"?null:a[1],name:a[2]==="-"?null:a[2]})}}return e},handleResponse:{any:function(t,e,m,u,a,h,g,d){if(d&&(d.end=Date.now()),u)return m(u);if(h.load==="entity"&&(a==null||a.ok==null))return m(null);if(a&&a.ok&&a.item){let o=[e.zone,e.base,e.name],c=t.entity(...o);return m(c.clone$().data$(a.item))}else{let o=a&&a.err;return o=o||new Error(`BrowserStore: ${e.cmd} ${S(t,e)}: unknown error`),m(o)}},list:function(t,e,m,u,a,h,g,d){if(d&&(d.end=Date.now()),u&&m(u),a&&a.ok&&a.list){let o=[e.zone,e.base,e.name],c=t.entity(...o),b=a.list.map(w=>c.clone$().data$(w));d&&(d.end=Date.now()),m(b)}else{let o=a&&a.err;o=o||new Error(`BrowserStore: ${e.cmd} ${S(t,e)}: unknown list error`),m(o)}}}};Object.defineProperty(y,"name",{value:"BrowserStore"});module.exports=y; //# sourceMappingURL=browser-store.cjs.js.map diff --git a/dist/browser-store.cjs.js.map b/dist/browser-store.cjs.js.map index 4a9fc06..85ccef1 100644 --- a/dist/browser-store.cjs.js.map +++ b/dist/browser-store.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"browser-store.cjs.js","sources":["../src/browser-store.ts"],"sourcesContent":["/* Copyright (c) 2023-2024 Richard Rodger and other contributors, MIT License */\n\nfunction BrowserStore(this: any, options: any) {\n let seneca: any = this\n\n let init = seneca.export('entity/init')\n\n let ohr = options.handleResponse\n let handleResponse = ['save', 'load', 'list', 'remove'].reduce(\n (a: any, n) => ((a[n] = ohr[n] || ohr.any), a),\n {},\n )\n\n const msglog: {\n msg: any\n meta: any\n start: number\n ctx?: any\n apimsg?: any\n res?: any\n err?: any\n apimeta?: any\n apiend?: number\n end?: number\n }[] = []\n\n function makeApiMsg(msg: any, ctx: any, options: any) {\n let apimsg: any = {}\n let apimsgtm = options.apimsg\n\n for (let pn in apimsgtm) {\n let pv = apimsgtm[pn]\n if ('function' === typeof pv) {\n apimsg[pn] = pv(msg, ctx, options)\n } else {\n apimsg[pn] = JSON.parse(JSON.stringify(pv))\n }\n }\n\n return apimsg\n }\n\n let store = {\n name: 'BrowserStore',\n\n save: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function save_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.save(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n load: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function load_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.load(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n list: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function list_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.list(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n remove: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function remove_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.remove(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n close: function (this: any, _msg: any, reply: any) {\n reply()\n },\n\n native: function (this: any, _msg: any, reply: any) {\n reply()\n },\n }\n\n let meta = init(seneca, options, store)\n\n function logstart(args: any) {\n let logn = options.debug && {\n msg: args[0],\n meta: args[2],\n start: Date.now(),\n }\n logn && msglog.push(logn)\n return logn\n }\n\n function logreq(logn: any, ctx: any, apimsg: any) {\n logn.apistart = Date.now()\n logn.ctx = ctx\n logn.apimsg = apimsg\n return logn\n }\n\n function logres(logn: any, args: any) {\n logn.apiend = Date.now()\n logn.err = args[0]\n logn.res = args[1]\n logn.apimeta = args[2]\n return logn\n }\n\n return {\n name: store.name,\n tag: meta.tag,\n exports: {\n makeApiMsg,\n msglog,\n },\n }\n}\n\nfunction canonStr(seneca: any, ctx: any) {\n return seneca.entity(ctx.zone, ctx.base, ctx.name).canon$()\n}\n\nBrowserStore.defaults = {\n debug: false,\n\n apimsg: {\n aim: 'req',\n on: 'entity',\n debounce$: true,\n q: (msg: any, _ctx: any) => msg.q,\n ent: (msg: any, _ctx: any) => msg.ent,\n // cmd: (_msg: any, ctx: any) => ctx.cmd,\n save: (_msg: any, ctx: any) => ('save' === ctx.cmd ? 'entity' : undefined),\n load: (_msg: any, ctx: any) => ('load' === ctx.cmd ? 'entity' : undefined),\n list: (_msg: any, ctx: any) => ('list' === ctx.cmd ? 'entity' : undefined),\n remove: (_msg: any, ctx: any) =>\n 'remove' === ctx.cmd ? 'entity' : undefined,\n store: (_msg: any, ctx: any) => ctx.store,\n name: (_msg: any, ctx: any) => ctx.name,\n base: (_msg: any, ctx: any) => ctx.base,\n zone: (_msg: any, ctx: any) => ctx.zone,\n },\n\n prepareCtx: (msg: any, ctx: any) => {\n ctx = ctx || {}\n\n let q = msg.q\n ctx.store = false !== q.store$\n delete q.store$\n\n ctx.cmd = msg.cmd\n\n let ent = msg.ent || msg.qent\n\n if (ent) {\n if (ent.canon$) {\n Object.assign(ctx, ent.canon$({ object: true }))\n } else if (ent.entity$) {\n let parts = ent.entity$.split('/')\n Object.assign(ctx, {\n zone: '-' === parts[0] ? null : parts[0],\n base: '-' === parts[1] ? null : parts[1],\n name: '-' === parts[2] ? null : parts[2],\n })\n }\n }\n\n return ctx\n },\n\n handleResponse: {\n any: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n return reply(err)\n }\n\n // TODO: debounce response could be empty object - review\n if ('entity' === apimsg.load && (null == res || null == res.ok)) {\n return reply(null)\n }\n\n if (res && res.ok && res.item) {\n let ent = seneca.entity({\n zone: ctx.zone,\n base: ctx.base,\n name: ctx.name,\n })\n return reply(ent.make$().data$(res.item))\n } else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(seneca, ctx)}: unknown error`,\n )\n return reply(err)\n }\n },\n\n list: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n _apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n reply(err)\n }\n\n if (res && res.ok && res.list) {\n let ent = seneca.entity({\n zone: ctx.zone,\n base: ctx.base,\n name: ctx.name,\n })\n let list = res.list.map((item: any) => ent.make$().data$(item))\n logn && (logn.end = Date.now())\n reply(list)\n } else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(\n seneca,\n ctx,\n )}: unknown list error`,\n )\n reply(err)\n }\n },\n },\n}\n\n// Prevent name mangling\nObject.defineProperty(BrowserStore, 'name', { value: 'BrowserStore' })\n\nexport default BrowserStore\n"],"names":["BrowserStore","options","seneca","init","ohr","handleResponse","a","n","msglog","makeApiMsg","msg","ctx","apimsg","apimsgtm","pn","pv","store","reply","_meta","logn","logstart","logreq","err","res","apimeta","logres","_msg","meta","args","canonStr","_ctx","q","ent","parts","_apimeta","_apimsg","list","item"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"browser-store.cjs.js","sources":["../src/browser-store.ts"],"sourcesContent":["/* Copyright (c) 2023-2024 Richard Rodger and other contributors, MIT License */\n\n\nconsole.log('BrowserStore 2')\n\nfunction BrowserStore(this: any, options: any) {\n let seneca: any = this\n\n let init = seneca.export('entity/init')\n\n let ohr = options.handleResponse\n let handleResponse = ['save', 'load', 'list', 'remove'].reduce(\n (a: any, n) => ((a[n] = ohr[n] || ohr.any), a),\n {},\n )\n\n const msglog: {\n msg: any\n meta: any\n start: number\n ctx?: any\n apimsg?: any\n res?: any\n err?: any\n apimeta?: any\n apiend?: number\n end?: number\n }[] = []\n\n function makeApiMsg(msg: any, ctx: any, options: any) {\n let apimsg: any = {}\n let apimsgtm = options.apimsg\n\n for (let pn in apimsgtm) {\n let pv = apimsgtm[pn]\n if ('function' === typeof pv) {\n apimsg[pn] = pv(msg, ctx, options)\n } else {\n apimsg[pn] = JSON.parse(JSON.stringify(pv))\n }\n }\n\n return apimsg\n }\n\n let store = {\n name: 'BrowserStore',\n\n save: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n // console.log('SAVE', msg, apimsg)\n\n // Provide a new entity with no id for saving later.\n if (true === apimsg.q.add$ && null == apimsg.ent.id && null == apimsg.ent.id$) {\n return handleResponse.save(\n this,\n ctx,\n reply,\n null,\n { ok: true, item: apimsg.ent },\n apimsg,\n meta,\n logn,\n )\n }\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function save_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.save(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n load: function (this: any, msg: any, reply: any, meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function load_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.load(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n list: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function list_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.list(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n remove: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function remove_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.remove(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n close: function (this: any, _msg: any, reply: any) {\n reply()\n },\n\n native: function (this: any, _msg: any, reply: any) {\n reply()\n },\n }\n\n let meta = init(seneca, options, store)\n\n function logstart(args: any) {\n let logn = options.debug && {\n msg: args[0],\n meta: args[2],\n start: Date.now(),\n }\n logn && msglog.push(logn)\n return logn\n }\n\n function logreq(logn: any, ctx: any, apimsg: any) {\n logn.apistart = Date.now()\n logn.ctx = ctx\n logn.apimsg = apimsg\n return logn\n }\n\n function logres(logn: any, args: any) {\n logn.apiend = Date.now()\n logn.err = args[0]\n logn.res = args[1]\n logn.apimeta = args[2]\n return logn\n }\n\n return {\n name: store.name,\n tag: meta.tag,\n exports: {\n makeApiMsg,\n msglog,\n },\n }\n}\n\nfunction canonStr(seneca: any, ctx: any) {\n return seneca.entity(ctx.zone, ctx.base, ctx.name).canon$()\n}\n\nBrowserStore.defaults = {\n debug: false,\n\n apimsg: {\n aim: 'req',\n on: 'entity',\n debounce$: true,\n q: (msg: any, _ctx: any) => msg.q,\n ent: (msg: any, _ctx: any) => msg.ent,\n // cmd: (_msg: any, ctx: any) => ctx.cmd,\n save: (_msg: any, ctx: any) => ('save' === ctx.cmd ? 'entity' : undefined),\n load: (_msg: any, ctx: any) => ('load' === ctx.cmd ? 'entity' : undefined),\n list: (_msg: any, ctx: any) => ('list' === ctx.cmd ? 'entity' : undefined),\n remove: (_msg: any, ctx: any) =>\n 'remove' === ctx.cmd ? 'entity' : undefined,\n store: (_msg: any, ctx: any) => ctx.store,\n name: (_msg: any, ctx: any) => ctx.name,\n base: (_msg: any, ctx: any) => ctx.base,\n zone: (_msg: any, ctx: any) => ctx.zone,\n },\n\n prepareCtx: (msg: any, ctx: any) => {\n ctx = ctx || {}\n\n let q = msg.q\n ctx.store = false !== q.store$\n delete q.store$\n\n ctx.cmd = msg.cmd\n\n let ent = msg.ent || msg.qent\n\n if (ent) {\n if (ent.canon$) {\n Object.assign(ctx, ent.canon$({ object: true }))\n } else if (ent.entity$) {\n let parts = ent.entity$.split('/')\n Object.assign(ctx, {\n zone: '-' === parts[0] ? null : parts[0],\n base: '-' === parts[1] ? null : parts[1],\n name: '-' === parts[2] ? null : parts[2],\n })\n }\n }\n\n return ctx\n },\n\n handleResponse: {\n any: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n return reply(err)\n }\n\n // TODO: debounce response could be empty object - review\n if ('entity' === apimsg.load && (null == res || null == res.ok)) {\n return reply(null)\n }\n\n if (res && res.ok && res.item) {\n let canon = [\n ctx.zone,\n ctx.base,\n ctx.name,\n ]\n let ent = seneca.entity(...canon)\n\n // TODO: FIX entity make$() should already have canon\n return reply(ent.clone$().data$(res.item))\n }\n else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(seneca, ctx)}: unknown error`,\n )\n return reply(err)\n }\n },\n\n list: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n _apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n reply(err)\n }\n\n if (res && res.ok && res.list) {\n let canon = [\n ctx.zone,\n ctx.base,\n ctx.name,\n ]\n let ent = seneca.entity(...canon)\n\n let list = res.list.map((item: any) => ent.clone$().data$(item))\n logn && (logn.end = Date.now())\n reply(list)\n }\n else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(\n seneca,\n ctx,\n )}: unknown list error`,\n )\n reply(err)\n }\n },\n },\n}\n\n// Prevent name mangling\nObject.defineProperty(BrowserStore, 'name', { value: 'BrowserStore' })\n\nexport default BrowserStore\n"],"names":["BrowserStore","options","seneca","init","ohr","handleResponse","a","n","msglog","makeApiMsg","msg","ctx","apimsg","apimsgtm","pn","pv","store","reply","_meta","logn","logstart","meta","logreq","err","res","apimeta","logres","_msg","args","canonStr","_ctx","q","ent","parts","_apimeta","canon","_apimsg","list","item"],"mappings":"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"} \ No newline at end of file diff --git a/dist/browser-store.es.js b/dist/browser-store.es.js index 148a58b..1bbf60f 100644 --- a/dist/browser-store.es.js +++ b/dist/browser-store.es.js @@ -1,86 +1,98 @@ -function k(t) { +console.log("BrowserStore 2"); +function S(t) { let e = this, m = e.export("entity/init"), u = t.handleResponse, a = ["save", "load", "list", "remove"].reduce( (n, i) => (n[i] = u[i] || u.any, n), {} ); - const w = []; - function c(n, i, f) { + const h = []; + function g(n, i, f) { let r = {}, s = f.apimsg; for (let l in s) { - let g = s[l]; - typeof g == "function" ? r[l] = g(n, i, f) : r[l] = JSON.parse(JSON.stringify(g)); + let _ = s[l]; + typeof _ == "function" ? r[l] = _(n, i, f) : r[l] = JSON.parse(JSON.stringify(_)); } return r; } let d = { name: "BrowserStore", save: function(n, i, f) { - let r = t.debug && v(arguments), s = t.prepareCtx(n), l = c(n, s, t); - r && $(r, s, l), this.act( + let r = t.debug && c(arguments), s = t.prepareCtx(n), l = g(n, s, t); + if (l.q.add$ === !0 && l.ent.id == null && l.ent.id$ == null) + return a.save( + this, + s, + i, + null, + { ok: !0, item: l.ent }, + l, + o, + r + ); + r && b(r, s, l), this.act( l, - function(_, p, b) { - return r && h(r, arguments), a.save( + function(p, v, $) { + return r && w(r, arguments), a.save( this, s, i, - _, p, + v, l, - b, + $, r ); } ); }, load: function(n, i, f) { - let r = t.debug && v(arguments), s = t.prepareCtx(n), l = c(n, s, t); - r && $(r, s, l), this.act( + let r = t.debug && c(arguments), s = t.prepareCtx(n), l = g(n, s, t); + r && b(r, s, l), this.act( l, - function(_, p, b) { - return r && h(r, arguments), a.load( + function(p, v, $) { + return r && w(r, arguments), a.load( this, s, i, - _, p, + v, l, - b, + $, r ); } ); }, list: function(n, i, f) { - let r = t.debug && v(arguments), s = t.prepareCtx(n), l = c(n, s, t); - r && $(r, s, l), this.act( + let r = t.debug && c(arguments), s = t.prepareCtx(n), l = g(n, s, t); + r && b(r, s, l), this.act( l, - function(_, p, b) { - return r && h(r, arguments), a.list( + function(p, v, $) { + return r && w(r, arguments), a.list( this, s, i, - _, p, + v, l, - b, + $, r ); } ); }, remove: function(n, i, f) { - let r = t.debug && v(arguments), s = t.prepareCtx(n), l = c(n, s, t); - r && $(r, s, l), this.act( + let r = t.debug && c(arguments), s = t.prepareCtx(n), l = g(n, s, t); + r && b(r, s, l), this.act( l, - function(_, p, b) { - return r && h(r, arguments), a.remove( + function(p, v, $) { + return r && w(r, arguments), a.remove( this, s, i, - _, p, + v, l, - b, + $, r ); } @@ -93,33 +105,33 @@ function k(t) { i(); } }, o = m(e, t, d); - function v(n) { + function c(n) { let i = t.debug && { msg: n[0], meta: n[2], start: Date.now() }; - return i && w.push(i), i; + return i && h.push(i), i; } - function $(n, i, f) { + function b(n, i, f) { return n.apistart = Date.now(), n.ctx = i, n.apimsg = f, n; } - function h(n, i) { + function w(n, i) { return n.apiend = Date.now(), n.err = i[0], n.res = i[1], n.apimeta = i[2], n; } return { name: d.name, tag: o.tag, exports: { - makeApiMsg: c, - msglog: w + makeApiMsg: g, + msglog: h } }; } function y(t, e) { return t.entity(e.zone, e.base, e.name).canon$(); } -k.defaults = { +S.defaults = { debug: !1, apimsg: { aim: "req", @@ -157,18 +169,18 @@ k.defaults = { return e; }, handleResponse: { - any: function(t, e, m, u, a, w, c, d) { + any: function(t, e, m, u, a, h, g, d) { if (d && (d.end = Date.now()), u) return m(u); - if (w.load === "entity" && (a == null || a.ok == null)) + if (h.load === "entity" && (a == null || a.ok == null)) return m(null); if (a && a.ok && a.item) { - let o = t.entity({ - zone: e.zone, - base: e.base, - name: e.name - }); - return m(o.make$().data$(a.item)); + let o = [ + e.zone, + e.base, + e.name + ], c = t.entity(...o); + return m(c.clone$().data$(a.item)); } else { let o = a && a.err; return o = o || new Error( @@ -176,14 +188,14 @@ k.defaults = { ), m(o); } }, - list: function(t, e, m, u, a, w, c, d) { + list: function(t, e, m, u, a, h, g, d) { if (d && (d.end = Date.now()), u && m(u), a && a.ok && a.list) { - let o = t.entity({ - zone: e.zone, - base: e.base, - name: e.name - }), v = a.list.map(($) => o.make$().data$($)); - d && (d.end = Date.now()), m(v); + let o = [ + e.zone, + e.base, + e.name + ], c = t.entity(...o), b = a.list.map((w) => c.clone$().data$(w)); + d && (d.end = Date.now()), m(b); } else { let o = a && a.err; o = o || new Error( @@ -196,8 +208,8 @@ k.defaults = { } } }; -Object.defineProperty(k, "name", { value: "BrowserStore" }); +Object.defineProperty(S, "name", { value: "BrowserStore" }); export { - k as default + S as default }; //# sourceMappingURL=browser-store.es.js.map diff --git a/dist/browser-store.es.js.map b/dist/browser-store.es.js.map index e486fbd..17c2b16 100644 --- a/dist/browser-store.es.js.map +++ b/dist/browser-store.es.js.map @@ -1 +1 @@ -{"version":3,"file":"browser-store.es.js","sources":["../src/browser-store.ts"],"sourcesContent":["/* Copyright (c) 2023-2024 Richard Rodger and other contributors, MIT License */\n\nfunction BrowserStore(this: any, options: any) {\n let seneca: any = this\n\n let init = seneca.export('entity/init')\n\n let ohr = options.handleResponse\n let handleResponse = ['save', 'load', 'list', 'remove'].reduce(\n (a: any, n) => ((a[n] = ohr[n] || ohr.any), a),\n {},\n )\n\n const msglog: {\n msg: any\n meta: any\n start: number\n ctx?: any\n apimsg?: any\n res?: any\n err?: any\n apimeta?: any\n apiend?: number\n end?: number\n }[] = []\n\n function makeApiMsg(msg: any, ctx: any, options: any) {\n let apimsg: any = {}\n let apimsgtm = options.apimsg\n\n for (let pn in apimsgtm) {\n let pv = apimsgtm[pn]\n if ('function' === typeof pv) {\n apimsg[pn] = pv(msg, ctx, options)\n } else {\n apimsg[pn] = JSON.parse(JSON.stringify(pv))\n }\n }\n\n return apimsg\n }\n\n let store = {\n name: 'BrowserStore',\n\n save: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function save_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.save(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n load: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function load_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.load(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n list: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function list_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.list(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n remove: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function remove_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.remove(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n close: function (this: any, _msg: any, reply: any) {\n reply()\n },\n\n native: function (this: any, _msg: any, reply: any) {\n reply()\n },\n }\n\n let meta = init(seneca, options, store)\n\n function logstart(args: any) {\n let logn = options.debug && {\n msg: args[0],\n meta: args[2],\n start: Date.now(),\n }\n logn && msglog.push(logn)\n return logn\n }\n\n function logreq(logn: any, ctx: any, apimsg: any) {\n logn.apistart = Date.now()\n logn.ctx = ctx\n logn.apimsg = apimsg\n return logn\n }\n\n function logres(logn: any, args: any) {\n logn.apiend = Date.now()\n logn.err = args[0]\n logn.res = args[1]\n logn.apimeta = args[2]\n return logn\n }\n\n return {\n name: store.name,\n tag: meta.tag,\n exports: {\n makeApiMsg,\n msglog,\n },\n }\n}\n\nfunction canonStr(seneca: any, ctx: any) {\n return seneca.entity(ctx.zone, ctx.base, ctx.name).canon$()\n}\n\nBrowserStore.defaults = {\n debug: false,\n\n apimsg: {\n aim: 'req',\n on: 'entity',\n debounce$: true,\n q: (msg: any, _ctx: any) => msg.q,\n ent: (msg: any, _ctx: any) => msg.ent,\n // cmd: (_msg: any, ctx: any) => ctx.cmd,\n save: (_msg: any, ctx: any) => ('save' === ctx.cmd ? 'entity' : undefined),\n load: (_msg: any, ctx: any) => ('load' === ctx.cmd ? 'entity' : undefined),\n list: (_msg: any, ctx: any) => ('list' === ctx.cmd ? 'entity' : undefined),\n remove: (_msg: any, ctx: any) =>\n 'remove' === ctx.cmd ? 'entity' : undefined,\n store: (_msg: any, ctx: any) => ctx.store,\n name: (_msg: any, ctx: any) => ctx.name,\n base: (_msg: any, ctx: any) => ctx.base,\n zone: (_msg: any, ctx: any) => ctx.zone,\n },\n\n prepareCtx: (msg: any, ctx: any) => {\n ctx = ctx || {}\n\n let q = msg.q\n ctx.store = false !== q.store$\n delete q.store$\n\n ctx.cmd = msg.cmd\n\n let ent = msg.ent || msg.qent\n\n if (ent) {\n if (ent.canon$) {\n Object.assign(ctx, ent.canon$({ object: true }))\n } else if (ent.entity$) {\n let parts = ent.entity$.split('/')\n Object.assign(ctx, {\n zone: '-' === parts[0] ? null : parts[0],\n base: '-' === parts[1] ? null : parts[1],\n name: '-' === parts[2] ? null : parts[2],\n })\n }\n }\n\n return ctx\n },\n\n handleResponse: {\n any: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n return reply(err)\n }\n\n // TODO: debounce response could be empty object - review\n if ('entity' === apimsg.load && (null == res || null == res.ok)) {\n return reply(null)\n }\n\n if (res && res.ok && res.item) {\n let ent = seneca.entity({\n zone: ctx.zone,\n base: ctx.base,\n name: ctx.name,\n })\n return reply(ent.make$().data$(res.item))\n } else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(seneca, ctx)}: unknown error`,\n )\n return reply(err)\n }\n },\n\n list: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n _apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n reply(err)\n }\n\n if (res && res.ok && res.list) {\n let ent = seneca.entity({\n zone: ctx.zone,\n base: ctx.base,\n name: ctx.name,\n })\n let list = res.list.map((item: any) => ent.make$().data$(item))\n logn && (logn.end = Date.now())\n reply(list)\n } else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(\n seneca,\n ctx,\n )}: unknown list error`,\n )\n reply(err)\n }\n },\n },\n}\n\n// Prevent name mangling\nObject.defineProperty(BrowserStore, 'name', { value: 'BrowserStore' })\n\nexport default BrowserStore\n"],"names":["BrowserStore","options","seneca","init","ohr","handleResponse","a","n","msglog","makeApiMsg","msg","ctx","apimsg","apimsgtm","pn","pv","store","reply","_meta","logn","logstart","logreq","err","res","apimeta","logres","_msg","meta","args","canonStr","_ctx","q","ent","parts","_apimeta","_apimsg","list","item"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"browser-store.es.js","sources":["../src/browser-store.ts"],"sourcesContent":["/* Copyright (c) 2023-2024 Richard Rodger and other contributors, MIT License */\n\n\nconsole.log('BrowserStore 2')\n\nfunction BrowserStore(this: any, options: any) {\n let seneca: any = this\n\n let init = seneca.export('entity/init')\n\n let ohr = options.handleResponse\n let handleResponse = ['save', 'load', 'list', 'remove'].reduce(\n (a: any, n) => ((a[n] = ohr[n] || ohr.any), a),\n {},\n )\n\n const msglog: {\n msg: any\n meta: any\n start: number\n ctx?: any\n apimsg?: any\n res?: any\n err?: any\n apimeta?: any\n apiend?: number\n end?: number\n }[] = []\n\n function makeApiMsg(msg: any, ctx: any, options: any) {\n let apimsg: any = {}\n let apimsgtm = options.apimsg\n\n for (let pn in apimsgtm) {\n let pv = apimsgtm[pn]\n if ('function' === typeof pv) {\n apimsg[pn] = pv(msg, ctx, options)\n } else {\n apimsg[pn] = JSON.parse(JSON.stringify(pv))\n }\n }\n\n return apimsg\n }\n\n let store = {\n name: 'BrowserStore',\n\n save: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n // console.log('SAVE', msg, apimsg)\n\n // Provide a new entity with no id for saving later.\n if (true === apimsg.q.add$ && null == apimsg.ent.id && null == apimsg.ent.id$) {\n return handleResponse.save(\n this,\n ctx,\n reply,\n null,\n { ok: true, item: apimsg.ent },\n apimsg,\n meta,\n logn,\n )\n }\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function save_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.save(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n load: function (this: any, msg: any, reply: any, meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function load_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.load(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n list: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function list_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.list(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n remove: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function remove_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.remove(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n close: function (this: any, _msg: any, reply: any) {\n reply()\n },\n\n native: function (this: any, _msg: any, reply: any) {\n reply()\n },\n }\n\n let meta = init(seneca, options, store)\n\n function logstart(args: any) {\n let logn = options.debug && {\n msg: args[0],\n meta: args[2],\n start: Date.now(),\n }\n logn && msglog.push(logn)\n return logn\n }\n\n function logreq(logn: any, ctx: any, apimsg: any) {\n logn.apistart = Date.now()\n logn.ctx = ctx\n logn.apimsg = apimsg\n return logn\n }\n\n function logres(logn: any, args: any) {\n logn.apiend = Date.now()\n logn.err = args[0]\n logn.res = args[1]\n logn.apimeta = args[2]\n return logn\n }\n\n return {\n name: store.name,\n tag: meta.tag,\n exports: {\n makeApiMsg,\n msglog,\n },\n }\n}\n\nfunction canonStr(seneca: any, ctx: any) {\n return seneca.entity(ctx.zone, ctx.base, ctx.name).canon$()\n}\n\nBrowserStore.defaults = {\n debug: false,\n\n apimsg: {\n aim: 'req',\n on: 'entity',\n debounce$: true,\n q: (msg: any, _ctx: any) => msg.q,\n ent: (msg: any, _ctx: any) => msg.ent,\n // cmd: (_msg: any, ctx: any) => ctx.cmd,\n save: (_msg: any, ctx: any) => ('save' === ctx.cmd ? 'entity' : undefined),\n load: (_msg: any, ctx: any) => ('load' === ctx.cmd ? 'entity' : undefined),\n list: (_msg: any, ctx: any) => ('list' === ctx.cmd ? 'entity' : undefined),\n remove: (_msg: any, ctx: any) =>\n 'remove' === ctx.cmd ? 'entity' : undefined,\n store: (_msg: any, ctx: any) => ctx.store,\n name: (_msg: any, ctx: any) => ctx.name,\n base: (_msg: any, ctx: any) => ctx.base,\n zone: (_msg: any, ctx: any) => ctx.zone,\n },\n\n prepareCtx: (msg: any, ctx: any) => {\n ctx = ctx || {}\n\n let q = msg.q\n ctx.store = false !== q.store$\n delete q.store$\n\n ctx.cmd = msg.cmd\n\n let ent = msg.ent || msg.qent\n\n if (ent) {\n if (ent.canon$) {\n Object.assign(ctx, ent.canon$({ object: true }))\n } else if (ent.entity$) {\n let parts = ent.entity$.split('/')\n Object.assign(ctx, {\n zone: '-' === parts[0] ? null : parts[0],\n base: '-' === parts[1] ? null : parts[1],\n name: '-' === parts[2] ? null : parts[2],\n })\n }\n }\n\n return ctx\n },\n\n handleResponse: {\n any: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n return reply(err)\n }\n\n // TODO: debounce response could be empty object - review\n if ('entity' === apimsg.load && (null == res || null == res.ok)) {\n return reply(null)\n }\n\n if (res && res.ok && res.item) {\n let canon = [\n ctx.zone,\n ctx.base,\n ctx.name,\n ]\n let ent = seneca.entity(...canon)\n\n // TODO: FIX entity make$() should already have canon\n return reply(ent.clone$().data$(res.item))\n }\n else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(seneca, ctx)}: unknown error`,\n )\n return reply(err)\n }\n },\n\n list: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n _apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n reply(err)\n }\n\n if (res && res.ok && res.list) {\n let canon = [\n ctx.zone,\n ctx.base,\n ctx.name,\n ]\n let ent = seneca.entity(...canon)\n\n let list = res.list.map((item: any) => ent.clone$().data$(item))\n logn && (logn.end = Date.now())\n reply(list)\n }\n else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(\n seneca,\n ctx,\n )}: unknown list error`,\n )\n reply(err)\n }\n },\n },\n}\n\n// Prevent name mangling\nObject.defineProperty(BrowserStore, 'name', { value: 'BrowserStore' })\n\nexport default BrowserStore\n"],"names":["BrowserStore","options","seneca","init","ohr","handleResponse","a","n","msglog","makeApiMsg","msg","ctx","apimsg","apimsgtm","pn","pv","store","reply","_meta","logn","logstart","meta","logreq","err","res","apimeta","logres","_msg","args","canonStr","_ctx","q","ent","parts","_apimeta","canon","_apimsg","list","item"],"mappings":"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"} \ No newline at end of file diff --git a/dist/browser-store.iife.js b/dist/browser-store.iife.js index 3dadc8f..cd84dbf 100644 --- a/dist/browser-store.iife.js +++ b/dist/browser-store.iife.js @@ -1,2 +1,2 @@ -var BrowserStore=function(){"use strict";function y(t){let e=this,m=e.export("entity/init"),u=t.handleResponse,a=["save","load","list","remove"].reduce((n,i)=>(n[i]=u[i]||u.any,n),{});const $=[];function c(n,i,f){let r={},l=f.apimsg;for(let s in l){let g=l[s];typeof g=="function"?r[s]=g(n,i,f):r[s]=JSON.parse(JSON.stringify(g))}return r}let d={name:"BrowserStore",save:function(n,i,f){let r=t.debug&&b(arguments),l=t.prepareCtx(n),s=c(n,l,t);r&&w(r,l,s),this.act(s,function(_,p,v){return r&&h(r,arguments),a.save(this,l,i,_,p,s,v,r)})},load:function(n,i,f){let r=t.debug&&b(arguments),l=t.prepareCtx(n),s=c(n,l,t);r&&w(r,l,s),this.act(s,function(_,p,v){return r&&h(r,arguments),a.load(this,l,i,_,p,s,v,r)})},list:function(n,i,f){let r=t.debug&&b(arguments),l=t.prepareCtx(n),s=c(n,l,t);r&&w(r,l,s),this.act(s,function(_,p,v){return r&&h(r,arguments),a.list(this,l,i,_,p,s,v,r)})},remove:function(n,i,f){let r=t.debug&&b(arguments),l=t.prepareCtx(n),s=c(n,l,t);r&&w(r,l,s),this.act(s,function(_,p,v){return r&&h(r,arguments),a.remove(this,l,i,_,p,s,v,r)})},close:function(n,i){i()},native:function(n,i){i()}},o=m(e,t,d);function b(n){let i=t.debug&&{msg:n[0],meta:n[2],start:Date.now()};return i&&$.push(i),i}function w(n,i,f){return n.apistart=Date.now(),n.ctx=i,n.apimsg=f,n}function h(n,i){return n.apiend=Date.now(),n.err=i[0],n.res=i[1],n.apimeta=i[2],n}return{name:d.name,tag:o.tag,exports:{makeApiMsg:c,msglog:$}}}function S(t,e){return t.entity(e.zone,e.base,e.name).canon$()}return y.defaults={debug:!1,apimsg:{aim:"req",on:"entity",debounce$:!0,q:(t,e)=>t.q,ent:(t,e)=>t.ent,save:(t,e)=>e.cmd==="save"?"entity":void 0,load:(t,e)=>e.cmd==="load"?"entity":void 0,list:(t,e)=>e.cmd==="list"?"entity":void 0,remove:(t,e)=>e.cmd==="remove"?"entity":void 0,store:(t,e)=>e.store,name:(t,e)=>e.name,base:(t,e)=>e.base,zone:(t,e)=>e.zone},prepareCtx:(t,e)=>{e=e||{};let m=t.q;e.store=m.store$!==!1,delete m.store$,e.cmd=t.cmd;let u=t.ent||t.qent;if(u){if(u.canon$)Object.assign(e,u.canon$({object:!0}));else if(u.entity$){let a=u.entity$.split("/");Object.assign(e,{zone:a[0]==="-"?null:a[0],base:a[1]==="-"?null:a[1],name:a[2]==="-"?null:a[2]})}}return e},handleResponse:{any:function(t,e,m,u,a,$,c,d){if(d&&(d.end=Date.now()),u)return m(u);if($.load==="entity"&&(a==null||a.ok==null))return m(null);if(a&&a.ok&&a.item){let o=t.entity({zone:e.zone,base:e.base,name:e.name});return m(o.make$().data$(a.item))}else{let o=a&&a.err;return o=o||new Error(`BrowserStore: ${e.cmd} ${S(t,e)}: unknown error`),m(o)}},list:function(t,e,m,u,a,$,c,d){if(d&&(d.end=Date.now()),u&&m(u),a&&a.ok&&a.list){let o=t.entity({zone:e.zone,base:e.base,name:e.name}),b=a.list.map(w=>o.make$().data$(w));d&&(d.end=Date.now()),m(b)}else{let o=a&&a.err;o=o||new Error(`BrowserStore: ${e.cmd} ${S(t,e)}: unknown list error`),m(o)}}}},Object.defineProperty(y,"name",{value:"BrowserStore"}),y}(); +var BrowserStore=function(){"use strict";console.log("BrowserStore 2");function y(t){let e=this,m=e.export("entity/init"),u=t.handleResponse,r=["save","load","list","remove"].reduce((n,i)=>(n[i]=u[i]||u.any,n),{});const h=[];function g(n,i,f){let a={},s=f.apimsg;for(let l in s){let _=s[l];typeof _=="function"?a[l]=_(n,i,f):a[l]=JSON.parse(JSON.stringify(_))}return a}let d={name:"BrowserStore",save:function(n,i,f){let a=t.debug&&c(arguments),s=t.prepareCtx(n),l=g(n,s,t);if(l.q.add$===!0&&l.ent.id==null&&l.ent.id$==null)return r.save(this,s,i,null,{ok:!0,item:l.ent},l,o,a);a&&b(a,s,l),this.act(l,function(v,p,$){return a&&w(a,arguments),r.save(this,s,i,v,p,l,$,a)})},load:function(n,i,f){let a=t.debug&&c(arguments),s=t.prepareCtx(n),l=g(n,s,t);a&&b(a,s,l),this.act(l,function(v,p,$){return a&&w(a,arguments),r.load(this,s,i,v,p,l,$,a)})},list:function(n,i,f){let a=t.debug&&c(arguments),s=t.prepareCtx(n),l=g(n,s,t);a&&b(a,s,l),this.act(l,function(v,p,$){return a&&w(a,arguments),r.list(this,s,i,v,p,l,$,a)})},remove:function(n,i,f){let a=t.debug&&c(arguments),s=t.prepareCtx(n),l=g(n,s,t);a&&b(a,s,l),this.act(l,function(v,p,$){return a&&w(a,arguments),r.remove(this,s,i,v,p,l,$,a)})},close:function(n,i){i()},native:function(n,i){i()}},o=m(e,t,d);function c(n){let i=t.debug&&{msg:n[0],meta:n[2],start:Date.now()};return i&&h.push(i),i}function b(n,i,f){return n.apistart=Date.now(),n.ctx=i,n.apimsg=f,n}function w(n,i){return n.apiend=Date.now(),n.err=i[0],n.res=i[1],n.apimeta=i[2],n}return{name:d.name,tag:o.tag,exports:{makeApiMsg:g,msglog:h}}}function S(t,e){return t.entity(e.zone,e.base,e.name).canon$()}return y.defaults={debug:!1,apimsg:{aim:"req",on:"entity",debounce$:!0,q:(t,e)=>t.q,ent:(t,e)=>t.ent,save:(t,e)=>e.cmd==="save"?"entity":void 0,load:(t,e)=>e.cmd==="load"?"entity":void 0,list:(t,e)=>e.cmd==="list"?"entity":void 0,remove:(t,e)=>e.cmd==="remove"?"entity":void 0,store:(t,e)=>e.store,name:(t,e)=>e.name,base:(t,e)=>e.base,zone:(t,e)=>e.zone},prepareCtx:(t,e)=>{e=e||{};let m=t.q;e.store=m.store$!==!1,delete m.store$,e.cmd=t.cmd;let u=t.ent||t.qent;if(u){if(u.canon$)Object.assign(e,u.canon$({object:!0}));else if(u.entity$){let r=u.entity$.split("/");Object.assign(e,{zone:r[0]==="-"?null:r[0],base:r[1]==="-"?null:r[1],name:r[2]==="-"?null:r[2]})}}return e},handleResponse:{any:function(t,e,m,u,r,h,g,d){if(d&&(d.end=Date.now()),u)return m(u);if(h.load==="entity"&&(r==null||r.ok==null))return m(null);if(r&&r.ok&&r.item){let o=[e.zone,e.base,e.name],c=t.entity(...o);return m(c.clone$().data$(r.item))}else{let o=r&&r.err;return o=o||new Error(`BrowserStore: ${e.cmd} ${S(t,e)}: unknown error`),m(o)}},list:function(t,e,m,u,r,h,g,d){if(d&&(d.end=Date.now()),u&&m(u),r&&r.ok&&r.list){let o=[e.zone,e.base,e.name],c=t.entity(...o),b=r.list.map(w=>c.clone$().data$(w));d&&(d.end=Date.now()),m(b)}else{let o=r&&r.err;o=o||new Error(`BrowserStore: ${e.cmd} ${S(t,e)}: unknown list error`),m(o)}}}},Object.defineProperty(y,"name",{value:"BrowserStore"}),y}(); //# sourceMappingURL=browser-store.iife.js.map diff --git a/dist/browser-store.iife.js.map b/dist/browser-store.iife.js.map index d64c605..81942e5 100644 --- a/dist/browser-store.iife.js.map +++ b/dist/browser-store.iife.js.map @@ -1 +1 @@ -{"version":3,"file":"browser-store.iife.js","sources":["../src/browser-store.ts"],"sourcesContent":["/* Copyright (c) 2023-2024 Richard Rodger and other contributors, MIT License */\n\nfunction BrowserStore(this: any, options: any) {\n let seneca: any = this\n\n let init = seneca.export('entity/init')\n\n let ohr = options.handleResponse\n let handleResponse = ['save', 'load', 'list', 'remove'].reduce(\n (a: any, n) => ((a[n] = ohr[n] || ohr.any), a),\n {},\n )\n\n const msglog: {\n msg: any\n meta: any\n start: number\n ctx?: any\n apimsg?: any\n res?: any\n err?: any\n apimeta?: any\n apiend?: number\n end?: number\n }[] = []\n\n function makeApiMsg(msg: any, ctx: any, options: any) {\n let apimsg: any = {}\n let apimsgtm = options.apimsg\n\n for (let pn in apimsgtm) {\n let pv = apimsgtm[pn]\n if ('function' === typeof pv) {\n apimsg[pn] = pv(msg, ctx, options)\n } else {\n apimsg[pn] = JSON.parse(JSON.stringify(pv))\n }\n }\n\n return apimsg\n }\n\n let store = {\n name: 'BrowserStore',\n\n save: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function save_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.save(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n load: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function load_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.load(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n list: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function list_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.list(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n remove: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function remove_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.remove(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n close: function (this: any, _msg: any, reply: any) {\n reply()\n },\n\n native: function (this: any, _msg: any, reply: any) {\n reply()\n },\n }\n\n let meta = init(seneca, options, store)\n\n function logstart(args: any) {\n let logn = options.debug && {\n msg: args[0],\n meta: args[2],\n start: Date.now(),\n }\n logn && msglog.push(logn)\n return logn\n }\n\n function logreq(logn: any, ctx: any, apimsg: any) {\n logn.apistart = Date.now()\n logn.ctx = ctx\n logn.apimsg = apimsg\n return logn\n }\n\n function logres(logn: any, args: any) {\n logn.apiend = Date.now()\n logn.err = args[0]\n logn.res = args[1]\n logn.apimeta = args[2]\n return logn\n }\n\n return {\n name: store.name,\n tag: meta.tag,\n exports: {\n makeApiMsg,\n msglog,\n },\n }\n}\n\nfunction canonStr(seneca: any, ctx: any) {\n return seneca.entity(ctx.zone, ctx.base, ctx.name).canon$()\n}\n\nBrowserStore.defaults = {\n debug: false,\n\n apimsg: {\n aim: 'req',\n on: 'entity',\n debounce$: true,\n q: (msg: any, _ctx: any) => msg.q,\n ent: (msg: any, _ctx: any) => msg.ent,\n // cmd: (_msg: any, ctx: any) => ctx.cmd,\n save: (_msg: any, ctx: any) => ('save' === ctx.cmd ? 'entity' : undefined),\n load: (_msg: any, ctx: any) => ('load' === ctx.cmd ? 'entity' : undefined),\n list: (_msg: any, ctx: any) => ('list' === ctx.cmd ? 'entity' : undefined),\n remove: (_msg: any, ctx: any) =>\n 'remove' === ctx.cmd ? 'entity' : undefined,\n store: (_msg: any, ctx: any) => ctx.store,\n name: (_msg: any, ctx: any) => ctx.name,\n base: (_msg: any, ctx: any) => ctx.base,\n zone: (_msg: any, ctx: any) => ctx.zone,\n },\n\n prepareCtx: (msg: any, ctx: any) => {\n ctx = ctx || {}\n\n let q = msg.q\n ctx.store = false !== q.store$\n delete q.store$\n\n ctx.cmd = msg.cmd\n\n let ent = msg.ent || msg.qent\n\n if (ent) {\n if (ent.canon$) {\n Object.assign(ctx, ent.canon$({ object: true }))\n } else if (ent.entity$) {\n let parts = ent.entity$.split('/')\n Object.assign(ctx, {\n zone: '-' === parts[0] ? null : parts[0],\n base: '-' === parts[1] ? null : parts[1],\n name: '-' === parts[2] ? null : parts[2],\n })\n }\n }\n\n return ctx\n },\n\n handleResponse: {\n any: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n return reply(err)\n }\n\n // TODO: debounce response could be empty object - review\n if ('entity' === apimsg.load && (null == res || null == res.ok)) {\n return reply(null)\n }\n\n if (res && res.ok && res.item) {\n let ent = seneca.entity({\n zone: ctx.zone,\n base: ctx.base,\n name: ctx.name,\n })\n return reply(ent.make$().data$(res.item))\n } else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(seneca, ctx)}: unknown error`,\n )\n return reply(err)\n }\n },\n\n list: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n _apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n reply(err)\n }\n\n if (res && res.ok && res.list) {\n let ent = seneca.entity({\n zone: ctx.zone,\n base: ctx.base,\n name: ctx.name,\n })\n let list = res.list.map((item: any) => ent.make$().data$(item))\n logn && (logn.end = Date.now())\n reply(list)\n } else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(\n seneca,\n ctx,\n )}: unknown list error`,\n )\n reply(err)\n }\n },\n },\n}\n\n// Prevent name mangling\nObject.defineProperty(BrowserStore, 'name', { value: 'BrowserStore' })\n\nexport default BrowserStore\n"],"names":["BrowserStore","options","seneca","init","ohr","handleResponse","a","n","msglog","makeApiMsg","msg","ctx","apimsg","apimsgtm","pn","pv","store","reply","_meta","logn","logstart","logreq","err","res","apimeta","logres","_msg","meta","args","canonStr","_ctx","q","ent","parts","_apimeta","_apimsg","list","item"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"browser-store.iife.js","sources":["../src/browser-store.ts"],"sourcesContent":["/* Copyright (c) 2023-2024 Richard Rodger and other contributors, MIT License */\n\n\nconsole.log('BrowserStore 2')\n\nfunction BrowserStore(this: any, options: any) {\n let seneca: any = this\n\n let init = seneca.export('entity/init')\n\n let ohr = options.handleResponse\n let handleResponse = ['save', 'load', 'list', 'remove'].reduce(\n (a: any, n) => ((a[n] = ohr[n] || ohr.any), a),\n {},\n )\n\n const msglog: {\n msg: any\n meta: any\n start: number\n ctx?: any\n apimsg?: any\n res?: any\n err?: any\n apimeta?: any\n apiend?: number\n end?: number\n }[] = []\n\n function makeApiMsg(msg: any, ctx: any, options: any) {\n let apimsg: any = {}\n let apimsgtm = options.apimsg\n\n for (let pn in apimsgtm) {\n let pv = apimsgtm[pn]\n if ('function' === typeof pv) {\n apimsg[pn] = pv(msg, ctx, options)\n } else {\n apimsg[pn] = JSON.parse(JSON.stringify(pv))\n }\n }\n\n return apimsg\n }\n\n let store = {\n name: 'BrowserStore',\n\n save: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n // console.log('SAVE', msg, apimsg)\n\n // Provide a new entity with no id for saving later.\n if (true === apimsg.q.add$ && null == apimsg.ent.id && null == apimsg.ent.id$) {\n return handleResponse.save(\n this,\n ctx,\n reply,\n null,\n { ok: true, item: apimsg.ent },\n apimsg,\n meta,\n logn,\n )\n }\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function save_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.save(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n load: function (this: any, msg: any, reply: any, meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function load_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.load(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n list: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function list_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.list(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n remove: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function remove_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.remove(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n close: function (this: any, _msg: any, reply: any) {\n reply()\n },\n\n native: function (this: any, _msg: any, reply: any) {\n reply()\n },\n }\n\n let meta = init(seneca, options, store)\n\n function logstart(args: any) {\n let logn = options.debug && {\n msg: args[0],\n meta: args[2],\n start: Date.now(),\n }\n logn && msglog.push(logn)\n return logn\n }\n\n function logreq(logn: any, ctx: any, apimsg: any) {\n logn.apistart = Date.now()\n logn.ctx = ctx\n logn.apimsg = apimsg\n return logn\n }\n\n function logres(logn: any, args: any) {\n logn.apiend = Date.now()\n logn.err = args[0]\n logn.res = args[1]\n logn.apimeta = args[2]\n return logn\n }\n\n return {\n name: store.name,\n tag: meta.tag,\n exports: {\n makeApiMsg,\n msglog,\n },\n }\n}\n\nfunction canonStr(seneca: any, ctx: any) {\n return seneca.entity(ctx.zone, ctx.base, ctx.name).canon$()\n}\n\nBrowserStore.defaults = {\n debug: false,\n\n apimsg: {\n aim: 'req',\n on: 'entity',\n debounce$: true,\n q: (msg: any, _ctx: any) => msg.q,\n ent: (msg: any, _ctx: any) => msg.ent,\n // cmd: (_msg: any, ctx: any) => ctx.cmd,\n save: (_msg: any, ctx: any) => ('save' === ctx.cmd ? 'entity' : undefined),\n load: (_msg: any, ctx: any) => ('load' === ctx.cmd ? 'entity' : undefined),\n list: (_msg: any, ctx: any) => ('list' === ctx.cmd ? 'entity' : undefined),\n remove: (_msg: any, ctx: any) =>\n 'remove' === ctx.cmd ? 'entity' : undefined,\n store: (_msg: any, ctx: any) => ctx.store,\n name: (_msg: any, ctx: any) => ctx.name,\n base: (_msg: any, ctx: any) => ctx.base,\n zone: (_msg: any, ctx: any) => ctx.zone,\n },\n\n prepareCtx: (msg: any, ctx: any) => {\n ctx = ctx || {}\n\n let q = msg.q\n ctx.store = false !== q.store$\n delete q.store$\n\n ctx.cmd = msg.cmd\n\n let ent = msg.ent || msg.qent\n\n if (ent) {\n if (ent.canon$) {\n Object.assign(ctx, ent.canon$({ object: true }))\n } else if (ent.entity$) {\n let parts = ent.entity$.split('/')\n Object.assign(ctx, {\n zone: '-' === parts[0] ? null : parts[0],\n base: '-' === parts[1] ? null : parts[1],\n name: '-' === parts[2] ? null : parts[2],\n })\n }\n }\n\n return ctx\n },\n\n handleResponse: {\n any: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n return reply(err)\n }\n\n // TODO: debounce response could be empty object - review\n if ('entity' === apimsg.load && (null == res || null == res.ok)) {\n return reply(null)\n }\n\n if (res && res.ok && res.item) {\n let canon = [\n ctx.zone,\n ctx.base,\n ctx.name,\n ]\n let ent = seneca.entity(...canon)\n\n // TODO: FIX entity make$() should already have canon\n return reply(ent.clone$().data$(res.item))\n }\n else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(seneca, ctx)}: unknown error`,\n )\n return reply(err)\n }\n },\n\n list: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n _apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n reply(err)\n }\n\n if (res && res.ok && res.list) {\n let canon = [\n ctx.zone,\n ctx.base,\n ctx.name,\n ]\n let ent = seneca.entity(...canon)\n\n let list = res.list.map((item: any) => ent.clone$().data$(item))\n logn && (logn.end = Date.now())\n reply(list)\n }\n else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(\n seneca,\n ctx,\n )}: unknown list error`,\n )\n reply(err)\n }\n },\n },\n}\n\n// Prevent name mangling\nObject.defineProperty(BrowserStore, 'name', { value: 'BrowserStore' })\n\nexport default BrowserStore\n"],"names":["BrowserStore","options","seneca","init","ohr","handleResponse","a","n","msglog","makeApiMsg","msg","ctx","apimsg","apimsgtm","pn","pv","store","reply","_meta","logn","logstart","meta","logreq","err","res","apimeta","logres","_msg","args","canonStr","_ctx","q","ent","parts","_apimeta","canon","_apimsg","list","item"],"mappings":"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"} \ No newline at end of file diff --git a/dist/browser-store.umd.js b/dist/browser-store.umd.js index 005caf6..5daecdf 100644 --- a/dist/browser-store.umd.js +++ b/dist/browser-store.umd.js @@ -1,2 +1,2 @@ -(function(c,h){typeof exports=="object"&&typeof module<"u"?module.exports=h():typeof define=="function"&&define.amd?define(h):(c=typeof globalThis<"u"?globalThis:c||self,c.BrowserStore=h())})(this,function(){"use strict";function c(t){let e=this,o=e.export("entity/init"),l=t.handleResponse,a=["save","load","list","remove"].reduce((n,i)=>(n[i]=l[i]||l.any,n),{});const y=[];function g(n,i,f){let r={},u=f.apimsg;for(let s in u){let p=u[s];typeof p=="function"?r[s]=p(n,i,f):r[s]=JSON.parse(JSON.stringify(p))}return r}let d={name:"BrowserStore",save:function(n,i,f){let r=t.debug&&w(arguments),u=t.prepareCtx(n),s=g(n,u,t);r&&$(r,u,s),this.act(s,function(_,b,v){return r&&S(r,arguments),a.save(this,u,i,_,b,s,v,r)})},load:function(n,i,f){let r=t.debug&&w(arguments),u=t.prepareCtx(n),s=g(n,u,t);r&&$(r,u,s),this.act(s,function(_,b,v){return r&&S(r,arguments),a.load(this,u,i,_,b,s,v,r)})},list:function(n,i,f){let r=t.debug&&w(arguments),u=t.prepareCtx(n),s=g(n,u,t);r&&$(r,u,s),this.act(s,function(_,b,v){return r&&S(r,arguments),a.list(this,u,i,_,b,s,v,r)})},remove:function(n,i,f){let r=t.debug&&w(arguments),u=t.prepareCtx(n),s=g(n,u,t);r&&$(r,u,s),this.act(s,function(_,b,v){return r&&S(r,arguments),a.remove(this,u,i,_,b,s,v,r)})},close:function(n,i){i()},native:function(n,i){i()}},m=o(e,t,d);function w(n){let i=t.debug&&{msg:n[0],meta:n[2],start:Date.now()};return i&&y.push(i),i}function $(n,i,f){return n.apistart=Date.now(),n.ctx=i,n.apimsg=f,n}function S(n,i){return n.apiend=Date.now(),n.err=i[0],n.res=i[1],n.apimeta=i[2],n}return{name:d.name,tag:m.tag,exports:{makeApiMsg:g,msglog:y}}}function h(t,e){return t.entity(e.zone,e.base,e.name).canon$()}return c.defaults={debug:!1,apimsg:{aim:"req",on:"entity",debounce$:!0,q:(t,e)=>t.q,ent:(t,e)=>t.ent,save:(t,e)=>e.cmd==="save"?"entity":void 0,load:(t,e)=>e.cmd==="load"?"entity":void 0,list:(t,e)=>e.cmd==="list"?"entity":void 0,remove:(t,e)=>e.cmd==="remove"?"entity":void 0,store:(t,e)=>e.store,name:(t,e)=>e.name,base:(t,e)=>e.base,zone:(t,e)=>e.zone},prepareCtx:(t,e)=>{e=e||{};let o=t.q;e.store=o.store$!==!1,delete o.store$,e.cmd=t.cmd;let l=t.ent||t.qent;if(l){if(l.canon$)Object.assign(e,l.canon$({object:!0}));else if(l.entity$){let a=l.entity$.split("/");Object.assign(e,{zone:a[0]==="-"?null:a[0],base:a[1]==="-"?null:a[1],name:a[2]==="-"?null:a[2]})}}return e},handleResponse:{any:function(t,e,o,l,a,y,g,d){if(d&&(d.end=Date.now()),l)return o(l);if(y.load==="entity"&&(a==null||a.ok==null))return o(null);if(a&&a.ok&&a.item){let m=t.entity({zone:e.zone,base:e.base,name:e.name});return o(m.make$().data$(a.item))}else{let m=a&&a.err;return m=m||new Error(`BrowserStore: ${e.cmd} ${h(t,e)}: unknown error`),o(m)}},list:function(t,e,o,l,a,y,g,d){if(d&&(d.end=Date.now()),l&&o(l),a&&a.ok&&a.list){let m=t.entity({zone:e.zone,base:e.base,name:e.name}),w=a.list.map($=>m.make$().data$($));d&&(d.end=Date.now()),o(w)}else{let m=a&&a.err;m=m||new Error(`BrowserStore: ${e.cmd} ${h(t,e)}: unknown list error`),o(m)}}}},Object.defineProperty(c,"name",{value:"BrowserStore"}),c}); +(function(g,$){typeof exports=="object"&&typeof module<"u"?module.exports=$():typeof define=="function"&&define.amd?define($):(g=typeof globalThis<"u"?globalThis:g||self,g.BrowserStore=$())})(this,function(){"use strict";console.log("BrowserStore 2");function g(t){let e=this,m=e.export("entity/init"),u=t.handleResponse,r=["save","load","list","remove"].reduce((n,i)=>(n[i]=u[i]||u.any,n),{});const S=[];function p(n,i,c){let a={},s=c.apimsg;for(let l in s){let _=s[l];typeof _=="function"?a[l]=_(n,i,c):a[l]=JSON.parse(JSON.stringify(_))}return a}let d={name:"BrowserStore",save:function(n,i,c){let a=t.debug&&f(arguments),s=t.prepareCtx(n),l=p(n,s,t);if(l.q.add$===!0&&l.ent.id==null&&l.ent.id$==null)return r.save(this,s,i,null,{ok:!0,item:l.ent},l,o,a);a&&w(a,s,l),this.act(l,function(v,b,h){return a&&y(a,arguments),r.save(this,s,i,v,b,l,h,a)})},load:function(n,i,c){let a=t.debug&&f(arguments),s=t.prepareCtx(n),l=p(n,s,t);a&&w(a,s,l),this.act(l,function(v,b,h){return a&&y(a,arguments),r.load(this,s,i,v,b,l,h,a)})},list:function(n,i,c){let a=t.debug&&f(arguments),s=t.prepareCtx(n),l=p(n,s,t);a&&w(a,s,l),this.act(l,function(v,b,h){return a&&y(a,arguments),r.list(this,s,i,v,b,l,h,a)})},remove:function(n,i,c){let a=t.debug&&f(arguments),s=t.prepareCtx(n),l=p(n,s,t);a&&w(a,s,l),this.act(l,function(v,b,h){return a&&y(a,arguments),r.remove(this,s,i,v,b,l,h,a)})},close:function(n,i){i()},native:function(n,i){i()}},o=m(e,t,d);function f(n){let i=t.debug&&{msg:n[0],meta:n[2],start:Date.now()};return i&&S.push(i),i}function w(n,i,c){return n.apistart=Date.now(),n.ctx=i,n.apimsg=c,n}function y(n,i){return n.apiend=Date.now(),n.err=i[0],n.res=i[1],n.apimeta=i[2],n}return{name:d.name,tag:o.tag,exports:{makeApiMsg:p,msglog:S}}}function $(t,e){return t.entity(e.zone,e.base,e.name).canon$()}return g.defaults={debug:!1,apimsg:{aim:"req",on:"entity",debounce$:!0,q:(t,e)=>t.q,ent:(t,e)=>t.ent,save:(t,e)=>e.cmd==="save"?"entity":void 0,load:(t,e)=>e.cmd==="load"?"entity":void 0,list:(t,e)=>e.cmd==="list"?"entity":void 0,remove:(t,e)=>e.cmd==="remove"?"entity":void 0,store:(t,e)=>e.store,name:(t,e)=>e.name,base:(t,e)=>e.base,zone:(t,e)=>e.zone},prepareCtx:(t,e)=>{e=e||{};let m=t.q;e.store=m.store$!==!1,delete m.store$,e.cmd=t.cmd;let u=t.ent||t.qent;if(u){if(u.canon$)Object.assign(e,u.canon$({object:!0}));else if(u.entity$){let r=u.entity$.split("/");Object.assign(e,{zone:r[0]==="-"?null:r[0],base:r[1]==="-"?null:r[1],name:r[2]==="-"?null:r[2]})}}return e},handleResponse:{any:function(t,e,m,u,r,S,p,d){if(d&&(d.end=Date.now()),u)return m(u);if(S.load==="entity"&&(r==null||r.ok==null))return m(null);if(r&&r.ok&&r.item){let o=[e.zone,e.base,e.name],f=t.entity(...o);return m(f.clone$().data$(r.item))}else{let o=r&&r.err;return o=o||new Error(`BrowserStore: ${e.cmd} ${$(t,e)}: unknown error`),m(o)}},list:function(t,e,m,u,r,S,p,d){if(d&&(d.end=Date.now()),u&&m(u),r&&r.ok&&r.list){let o=[e.zone,e.base,e.name],f=t.entity(...o),w=r.list.map(y=>f.clone$().data$(y));d&&(d.end=Date.now()),m(w)}else{let o=r&&r.err;o=o||new Error(`BrowserStore: ${e.cmd} ${$(t,e)}: unknown list error`),m(o)}}}},Object.defineProperty(g,"name",{value:"BrowserStore"}),g}); //# sourceMappingURL=browser-store.umd.js.map diff --git a/dist/browser-store.umd.js.map b/dist/browser-store.umd.js.map index fea88c9..83fb01c 100644 --- a/dist/browser-store.umd.js.map +++ b/dist/browser-store.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"browser-store.umd.js","sources":["../src/browser-store.ts"],"sourcesContent":["/* Copyright (c) 2023-2024 Richard Rodger and other contributors, MIT License */\n\nfunction BrowserStore(this: any, options: any) {\n let seneca: any = this\n\n let init = seneca.export('entity/init')\n\n let ohr = options.handleResponse\n let handleResponse = ['save', 'load', 'list', 'remove'].reduce(\n (a: any, n) => ((a[n] = ohr[n] || ohr.any), a),\n {},\n )\n\n const msglog: {\n msg: any\n meta: any\n start: number\n ctx?: any\n apimsg?: any\n res?: any\n err?: any\n apimeta?: any\n apiend?: number\n end?: number\n }[] = []\n\n function makeApiMsg(msg: any, ctx: any, options: any) {\n let apimsg: any = {}\n let apimsgtm = options.apimsg\n\n for (let pn in apimsgtm) {\n let pv = apimsgtm[pn]\n if ('function' === typeof pv) {\n apimsg[pn] = pv(msg, ctx, options)\n } else {\n apimsg[pn] = JSON.parse(JSON.stringify(pv))\n }\n }\n\n return apimsg\n }\n\n let store = {\n name: 'BrowserStore',\n\n save: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function save_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.save(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n load: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function load_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.load(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n list: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function list_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.list(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n remove: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function remove_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.remove(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n close: function (this: any, _msg: any, reply: any) {\n reply()\n },\n\n native: function (this: any, _msg: any, reply: any) {\n reply()\n },\n }\n\n let meta = init(seneca, options, store)\n\n function logstart(args: any) {\n let logn = options.debug && {\n msg: args[0],\n meta: args[2],\n start: Date.now(),\n }\n logn && msglog.push(logn)\n return logn\n }\n\n function logreq(logn: any, ctx: any, apimsg: any) {\n logn.apistart = Date.now()\n logn.ctx = ctx\n logn.apimsg = apimsg\n return logn\n }\n\n function logres(logn: any, args: any) {\n logn.apiend = Date.now()\n logn.err = args[0]\n logn.res = args[1]\n logn.apimeta = args[2]\n return logn\n }\n\n return {\n name: store.name,\n tag: meta.tag,\n exports: {\n makeApiMsg,\n msglog,\n },\n }\n}\n\nfunction canonStr(seneca: any, ctx: any) {\n return seneca.entity(ctx.zone, ctx.base, ctx.name).canon$()\n}\n\nBrowserStore.defaults = {\n debug: false,\n\n apimsg: {\n aim: 'req',\n on: 'entity',\n debounce$: true,\n q: (msg: any, _ctx: any) => msg.q,\n ent: (msg: any, _ctx: any) => msg.ent,\n // cmd: (_msg: any, ctx: any) => ctx.cmd,\n save: (_msg: any, ctx: any) => ('save' === ctx.cmd ? 'entity' : undefined),\n load: (_msg: any, ctx: any) => ('load' === ctx.cmd ? 'entity' : undefined),\n list: (_msg: any, ctx: any) => ('list' === ctx.cmd ? 'entity' : undefined),\n remove: (_msg: any, ctx: any) =>\n 'remove' === ctx.cmd ? 'entity' : undefined,\n store: (_msg: any, ctx: any) => ctx.store,\n name: (_msg: any, ctx: any) => ctx.name,\n base: (_msg: any, ctx: any) => ctx.base,\n zone: (_msg: any, ctx: any) => ctx.zone,\n },\n\n prepareCtx: (msg: any, ctx: any) => {\n ctx = ctx || {}\n\n let q = msg.q\n ctx.store = false !== q.store$\n delete q.store$\n\n ctx.cmd = msg.cmd\n\n let ent = msg.ent || msg.qent\n\n if (ent) {\n if (ent.canon$) {\n Object.assign(ctx, ent.canon$({ object: true }))\n } else if (ent.entity$) {\n let parts = ent.entity$.split('/')\n Object.assign(ctx, {\n zone: '-' === parts[0] ? null : parts[0],\n base: '-' === parts[1] ? null : parts[1],\n name: '-' === parts[2] ? null : parts[2],\n })\n }\n }\n\n return ctx\n },\n\n handleResponse: {\n any: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n return reply(err)\n }\n\n // TODO: debounce response could be empty object - review\n if ('entity' === apimsg.load && (null == res || null == res.ok)) {\n return reply(null)\n }\n\n if (res && res.ok && res.item) {\n let ent = seneca.entity({\n zone: ctx.zone,\n base: ctx.base,\n name: ctx.name,\n })\n return reply(ent.make$().data$(res.item))\n } else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(seneca, ctx)}: unknown error`,\n )\n return reply(err)\n }\n },\n\n list: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n _apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n reply(err)\n }\n\n if (res && res.ok && res.list) {\n let ent = seneca.entity({\n zone: ctx.zone,\n base: ctx.base,\n name: ctx.name,\n })\n let list = res.list.map((item: any) => ent.make$().data$(item))\n logn && (logn.end = Date.now())\n reply(list)\n } else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(\n seneca,\n ctx,\n )}: unknown list error`,\n )\n reply(err)\n }\n },\n },\n}\n\n// Prevent name mangling\nObject.defineProperty(BrowserStore, 'name', { value: 'BrowserStore' })\n\nexport default BrowserStore\n"],"names":["BrowserStore","options","seneca","init","ohr","handleResponse","a","n","msglog","makeApiMsg","msg","ctx","apimsg","apimsgtm","pn","pv","store","reply","_meta","logn","logstart","logreq","err","res","apimeta","logres","_msg","meta","args","canonStr","_ctx","q","ent","parts","_apimeta","_apimsg","list","item"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"browser-store.umd.js","sources":["../src/browser-store.ts"],"sourcesContent":["/* Copyright (c) 2023-2024 Richard Rodger and other contributors, MIT License */\n\n\nconsole.log('BrowserStore 2')\n\nfunction BrowserStore(this: any, options: any) {\n let seneca: any = this\n\n let init = seneca.export('entity/init')\n\n let ohr = options.handleResponse\n let handleResponse = ['save', 'load', 'list', 'remove'].reduce(\n (a: any, n) => ((a[n] = ohr[n] || ohr.any), a),\n {},\n )\n\n const msglog: {\n msg: any\n meta: any\n start: number\n ctx?: any\n apimsg?: any\n res?: any\n err?: any\n apimeta?: any\n apiend?: number\n end?: number\n }[] = []\n\n function makeApiMsg(msg: any, ctx: any, options: any) {\n let apimsg: any = {}\n let apimsgtm = options.apimsg\n\n for (let pn in apimsgtm) {\n let pv = apimsgtm[pn]\n if ('function' === typeof pv) {\n apimsg[pn] = pv(msg, ctx, options)\n } else {\n apimsg[pn] = JSON.parse(JSON.stringify(pv))\n }\n }\n\n return apimsg\n }\n\n let store = {\n name: 'BrowserStore',\n\n save: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n // console.log('SAVE', msg, apimsg)\n\n // Provide a new entity with no id for saving later.\n if (true === apimsg.q.add$ && null == apimsg.ent.id && null == apimsg.ent.id$) {\n return handleResponse.save(\n this,\n ctx,\n reply,\n null,\n { ok: true, item: apimsg.ent },\n apimsg,\n meta,\n logn,\n )\n }\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function save_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.save(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n load: function (this: any, msg: any, reply: any, meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function load_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.load(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n list: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function list_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.list(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n remove: function (this: any, msg: any, reply: any, _meta: any) {\n let logn = options.debug && logstart(arguments)\n let ctx = options.prepareCtx(msg)\n let apimsg = makeApiMsg(msg, ctx, options)\n\n logn && logreq(logn, ctx, apimsg)\n this.act(\n apimsg,\n function remove_result(this: any, err: Error, res: any, apimeta: any) {\n logn && logres(logn, arguments)\n return handleResponse.remove(\n this,\n ctx,\n reply,\n err,\n res,\n apimsg,\n apimeta,\n logn,\n )\n },\n )\n },\n\n close: function (this: any, _msg: any, reply: any) {\n reply()\n },\n\n native: function (this: any, _msg: any, reply: any) {\n reply()\n },\n }\n\n let meta = init(seneca, options, store)\n\n function logstart(args: any) {\n let logn = options.debug && {\n msg: args[0],\n meta: args[2],\n start: Date.now(),\n }\n logn && msglog.push(logn)\n return logn\n }\n\n function logreq(logn: any, ctx: any, apimsg: any) {\n logn.apistart = Date.now()\n logn.ctx = ctx\n logn.apimsg = apimsg\n return logn\n }\n\n function logres(logn: any, args: any) {\n logn.apiend = Date.now()\n logn.err = args[0]\n logn.res = args[1]\n logn.apimeta = args[2]\n return logn\n }\n\n return {\n name: store.name,\n tag: meta.tag,\n exports: {\n makeApiMsg,\n msglog,\n },\n }\n}\n\nfunction canonStr(seneca: any, ctx: any) {\n return seneca.entity(ctx.zone, ctx.base, ctx.name).canon$()\n}\n\nBrowserStore.defaults = {\n debug: false,\n\n apimsg: {\n aim: 'req',\n on: 'entity',\n debounce$: true,\n q: (msg: any, _ctx: any) => msg.q,\n ent: (msg: any, _ctx: any) => msg.ent,\n // cmd: (_msg: any, ctx: any) => ctx.cmd,\n save: (_msg: any, ctx: any) => ('save' === ctx.cmd ? 'entity' : undefined),\n load: (_msg: any, ctx: any) => ('load' === ctx.cmd ? 'entity' : undefined),\n list: (_msg: any, ctx: any) => ('list' === ctx.cmd ? 'entity' : undefined),\n remove: (_msg: any, ctx: any) =>\n 'remove' === ctx.cmd ? 'entity' : undefined,\n store: (_msg: any, ctx: any) => ctx.store,\n name: (_msg: any, ctx: any) => ctx.name,\n base: (_msg: any, ctx: any) => ctx.base,\n zone: (_msg: any, ctx: any) => ctx.zone,\n },\n\n prepareCtx: (msg: any, ctx: any) => {\n ctx = ctx || {}\n\n let q = msg.q\n ctx.store = false !== q.store$\n delete q.store$\n\n ctx.cmd = msg.cmd\n\n let ent = msg.ent || msg.qent\n\n if (ent) {\n if (ent.canon$) {\n Object.assign(ctx, ent.canon$({ object: true }))\n } else if (ent.entity$) {\n let parts = ent.entity$.split('/')\n Object.assign(ctx, {\n zone: '-' === parts[0] ? null : parts[0],\n base: '-' === parts[1] ? null : parts[1],\n name: '-' === parts[2] ? null : parts[2],\n })\n }\n }\n\n return ctx\n },\n\n handleResponse: {\n any: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n return reply(err)\n }\n\n // TODO: debounce response could be empty object - review\n if ('entity' === apimsg.load && (null == res || null == res.ok)) {\n return reply(null)\n }\n\n if (res && res.ok && res.item) {\n let canon = [\n ctx.zone,\n ctx.base,\n ctx.name,\n ]\n let ent = seneca.entity(...canon)\n\n // TODO: FIX entity make$() should already have canon\n return reply(ent.clone$().data$(res.item))\n }\n else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(seneca, ctx)}: unknown error`,\n )\n return reply(err)\n }\n },\n\n list: function (\n seneca: any,\n ctx: any,\n reply: any,\n err: Error,\n res: any,\n _apimsg: any,\n _apimeta: any,\n logn: any,\n ) {\n logn && (logn.end = Date.now())\n\n if (err) {\n reply(err)\n }\n\n if (res && res.ok && res.list) {\n let canon = [\n ctx.zone,\n ctx.base,\n ctx.name,\n ]\n let ent = seneca.entity(...canon)\n\n let list = res.list.map((item: any) => ent.clone$().data$(item))\n logn && (logn.end = Date.now())\n reply(list)\n }\n else {\n let err = res && res.err\n err =\n err ||\n new Error(\n `BrowserStore: ${ctx.cmd} ${canonStr(\n seneca,\n ctx,\n )}: unknown list error`,\n )\n reply(err)\n }\n },\n },\n}\n\n// Prevent name mangling\nObject.defineProperty(BrowserStore, 'name', { value: 'BrowserStore' })\n\nexport default BrowserStore\n"],"names":["BrowserStore","options","seneca","init","ohr","handleResponse","a","n","msglog","makeApiMsg","msg","ctx","apimsg","apimsgtm","pn","pv","store","reply","_meta","logn","logstart","meta","logreq","err","res","apimeta","logres","_msg","args","canonStr","_ctx","q","ent","parts","_apimeta","canon","_apimsg","list","item"],"mappings":"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"} \ No newline at end of file diff --git a/src/browser-store.ts b/src/browser-store.ts index 8403b62..79c0abe 100644 --- a/src/browser-store.ts +++ b/src/browser-store.ts @@ -1,5 +1,8 @@ /* Copyright (c) 2023-2024 Richard Rodger and other contributors, MIT License */ + +console.log('BrowserStore 2') + function BrowserStore(this: any, options: any) { let seneca: any = this @@ -48,6 +51,22 @@ function BrowserStore(this: any, options: any) { let ctx = options.prepareCtx(msg) let apimsg = makeApiMsg(msg, ctx, options) + // console.log('SAVE', msg, apimsg) + + // Provide a new entity with no id for saving later. + if (true === apimsg.q.add$ && null == apimsg.ent.id && null == apimsg.ent.id$) { + return handleResponse.save( + this, + ctx, + reply, + null, + { ok: true, item: apimsg.ent }, + apimsg, + meta, + logn, + ) + } + logn && logreq(logn, ctx, apimsg) this.act( apimsg, @@ -67,7 +86,7 @@ function BrowserStore(this: any, options: any) { ) }, - load: function (this: any, msg: any, reply: any, _meta: any) { + load: function (this: any, msg: any, reply: any, meta: any) { let logn = options.debug && logstart(arguments) let ctx = options.prepareCtx(msg) let apimsg = makeApiMsg(msg, ctx, options) @@ -260,13 +279,17 @@ BrowserStore.defaults = { } if (res && res.ok && res.item) { - let ent = seneca.entity({ - zone: ctx.zone, - base: ctx.base, - name: ctx.name, - }) - return reply(ent.make$().data$(res.item)) - } else { + let canon = [ + ctx.zone, + ctx.base, + ctx.name, + ] + let ent = seneca.entity(...canon) + + // TODO: FIX entity make$() should already have canon + return reply(ent.clone$().data$(res.item)) + } + else { let err = res && res.err err = err || @@ -294,15 +317,18 @@ BrowserStore.defaults = { } if (res && res.ok && res.list) { - let ent = seneca.entity({ - zone: ctx.zone, - base: ctx.base, - name: ctx.name, - }) - let list = res.list.map((item: any) => ent.make$().data$(item)) + let canon = [ + ctx.zone, + ctx.base, + ctx.name, + ] + let ent = seneca.entity(...canon) + + let list = res.list.map((item: any) => ent.clone$().data$(item)) logn && (logn.end = Date.now()) reply(list) - } else { + } + else { let err = res && res.err err = err ||