UNPKG

@randajan/revert

Version:

A minimalist utility for running sequential steps with automatic rollback on failure.

8 lines (7 loc) 7.1 kB
{ "version": 3, "sources": ["../../../src/sync/index.js", "../../../src/uni.js", "../../../src/sync/utils.js"], "sourcesContent": ["// Converted to sync\r\n\r\nimport { defaultLogFormat, verifyFn, verifyPassMode } from \"../uni\";\r\nimport { revertable, attempt } from \"./utils\";\r\n\r\nexport { revertable, attempt }\r\n\r\nconst wrapWithLogMsg = (passMode, msg, fn)=>{\r\n return (a1, a2, ...a)=>{\r\n (passMode === \"omit\" ? a1 : a2)(msg);\r\n return fn(a1, a2, ...a);\r\n }\r\n}\r\n\r\nexport class Revertable extends Array {\r\n\r\n constructor({logger, logFormat, pass=\"omit\"}) {\r\n super();\r\n\r\n Object.defineProperty(this, \"passMode\", { value:verifyPassMode(pass) });\r\n\r\n logger = verifyFn(\"Option logger\", logger);\r\n\r\n if (logger) {\r\n logFormat = verifyFn(\"Option logFormat\", logFormat) || defaultLogFormat;\r\n Object.defineProperty(this, \"logger\", {\r\n value:(data, kind, dir, s, c)=>logger(logFormat(kind, data, dir, s, c), kind, data, dir, s, c)\r\n });\r\n }\r\n }\r\n \r\n push(fwd, rwd) {\r\n super.push(Object.freeze({\r\n fwd:verifyFn(\"fwd\", fwd, true),\r\n rwd:verifyFn(\"rwd\", rwd, true)\r\n }));\r\n return this;\r\n }\r\n\r\n pushNamed(fwdName, fwd, rwdName, rwd) {\r\n const { logger, passMode } = this;\r\n if (!logger) { throw new Error(\"pushNamed(...) requires opt.logger to be provided\"); }\r\n return this.push(\r\n wrapWithLogMsg(passMode, fwdName, fwd),\r\n wrapWithLogMsg(passMode, rwdName, rwd)\r\n )\r\n }\r\n\r\n run(value) {\r\n const { logger, passMode, length } = this;\r\n const onError = logger ? (err, dir, s, c)=>logger(err, \"error\", dir, s, c) : undefined;\r\n const omit = passMode == \"omit\";\r\n\r\n return revertable(!omit ? value : undefined, length, (value, dir, s, c)=>{\r\n const { fwd, rwd } = this[s-1];\r\n const a = [];\r\n if (!omit) { a.push(value); }\r\n if (logger) { a.push((msg, kind=\"info\")=>logger(msg, kind, dir, s, c)); }\r\n const r = (dir ? fwd : rwd)(...a, s, c);\r\n if (!omit) { return passMode == \"keep\" ? value : r; }\r\n }, onError);\r\n }\r\n\r\n}\r\n\r\nexport default (opt)=>new Revertable(opt);\r\n", "\r\n\r\n\r\nconst _passModes = [\"omit\", \"keep\", \"reduce\"];\r\n\r\nexport const verifyFn = (argMsg, fn, req=false)=>{\r\n if (typeof fn === \"function\") { return fn; }\r\n if (fn == null && !req) { return; }\r\n throw new Error(`${argMsg} must be typeof function`);\r\n}\r\n\r\nexport const verifyPassMode = (passMode)=>{\r\n if (_passModes.includes(passMode)) { return passMode; }\r\n throw new Error(`Option pass '${passMode}' must be one of '${_passModes.join(\"', '\")}'`);\r\n}\r\n\r\nexport const defaultLogFormat = (kind, data, dir, s, c)=>{\r\n const symbol = kind === \"error\" ? (dir ? \"\u2500\" : \"\u292B\") : (dir ? \"\u2193\" :\"\u2191\");\r\n return (`${symbol} ${s}/${c} [${kind}] ${data?.message || data}`);\r\n};\r\n", "// Converted to sync\r\n\r\n\r\nexport const revertable = (value, steps, fn, onError)=>{\r\n let dir=true, s = 1;\r\n const r = { status:\"pass\", pass:value };\r\n\r\n while (s > 0 && s <= steps) {\r\n try { r.pass = fn(r.pass, dir, s, steps); }\r\n catch (err) {\r\n if (onError) { onError(err, dir, s, steps); }\r\n r.status = dir ? \"undo\" : \"fail\";\r\n r[r.status] = err;\r\n r[r.status + \"Step\"] = s;\r\n if (dir) { dir = false; } else { break; }\r\n }\r\n s += dir*2-1;\r\n }\r\n\r\n if (r.pass === undefined) { delete r.pass; }\r\n\r\n return Object.freeze(r);\r\n}\r\n\r\nexport const attempt = (exec, attemptCount=3, delay=2000)=>{\r\n let a = 1, e;\r\n\r\n while (true) {\r\n try { return exec(a); }\r\n catch(err) { e = err; }\r\n if (a >= attemptCount) { throw e; }\r\n a ++;\r\n }\r\n}"], "mappings": "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", "names": ["value"] }