Comparing version 0.20.1 to 0.20.2-dev.0
var e=require("../library/node/module/Option/preset") | ||
const t=(...t)=>t.map(t=>e.Preset.parseCompact(t,{optional:!0})) | ||
const o=t("help,h/T|show full help, or human readable output","quiet,q/T|less log","version,v/T|show version","host,H/SS|common option: $1=hostname:port/localhost:unusedPort","root,R/SP|common option","input-file,I/SP|common option","output-file,O/SP|common option") | ||
const o=t("help,h/T|show full help, or human readable output","quiet,q/T|less log","version,v/T|show version","host,H/SS|common option: $0=hostname:port (hostname default to 0.0.0.0)","root,R/SP|common option: $0=path/cwd","input-file,I/SP|common option","output-file,O/SP|common option") | ||
const s=t("eval,e/A|eval file or string: -O=outputFile, -I/$0=scriptFile/scriptString, $@=...evalArgv","eval-readline,erl/A|eval with readline: -R=readlineFile, ...eval","repl,i/T|start node REPL","echo/A|show args: $@=...args","cat/AP/0-|with 0 args pipe stdin to stdout, else read $@ as file and pipe to stdout",'write/SP|for use like ">": `dr-js --cat sourceFile | dr-js --write outputFile`','append/SP|for use like ">>": `dr-js --cat sourceFile | dr-js --append outputFile`',"open,o//0-1|use system default app to open uri or path: $0=uriOrPath/cwd","status,s/T|basic system status: -h=isHumanReadableOutput","file-list,ls/AP/0-1|list file: $0=path/cwd","file-list-all,ls-R,lla/AP/0-1|list all file: $0=path/cwd","file-tree,tree/AP/0-1|list all file in tree: $0=path/cwd","file-create-directory,mkdir/AP/0-|create directory: $@=...pathList","file-modify-copy,cp/AP/2|copy path: $@=pathFrom,pathTo","file-modify-move,mv/AP/2|move path: $@=pathFrom,pathTo","file-modify-delete,rm/AP/0-|delete path: $@=...pathList","file-merge,merge/AP/2-|merge to one file: $@=mergedFile,...inputFileList","fetch,f//1-3|fetch uri: -O=outputFile/stdout, $@=initialUrl,jumpMax/4,timeout/0",'process-status,ps//0-1|show system process status: -h=isHumanReadableOutput, $0=outputMode/"pid--"',"server-serve-static,sss//0-1|static file server: -H=hostname:port, -R=staticRoot/cwd, $0=expireTime/5*60*1000","server-serve-static-simple,ssss//0-1|static file server, no HTML: -H=hostname:port, -R=staticRoot/cwd, $0=expireTime/5*60*1000","server-websocket-group,swg|websocket chat server: -H=hostname:port","server-test-connection,stc|connection test server: -H=hostname:port","server-tcp-proxy,stp//1-|tcp proxy server: -H=hostname:port, $@=toHostname:toPort,toHostname:toPort,...") | ||
@@ -5,0 +5,0 @@ const r=s.map(({name:e})=>e) |
@@ -23,6 +23,6 @@ var e=require("path") | ||
const p=[];(await(0,n.getDirectorySubInfoList)(t)).forEach(e=>e.stat.isDirectory()?l.push(e):p.push(e)) | ||
return(0,c.responderSendBufferCompress)(r,{type:i.BASIC_EXTENSION_MAP.html,buffer:Buffer.from((0,d.COMMON_LAYOUT)([`<title>${s}</title>`,(0,d.COMMON_STYLE)(),u],[`<b class="auto-height">${s}</b>`,a&&S("/list",[(0,e.dirname)(a)],"🔙|.."),...l.sort(f).map(({name:e,stat:{mtimeMs:r}})=>S("/list",[a,e],`📁|${e}/`,0,r)),...p.sort(f).map(({name:e,stat:{size:r,mtimeMs:t}})=>S("/file",[a,e],`📄|${e}`,r,t,`download="${e}"`))]))})} | ||
return(0,c.responderSendBufferCompress)(r,{type:i.BASIC_EXTENSION_MAP.html,buffer:Buffer.from((0,d.COMMON_LAYOUT)([`<title>${s}</title>`,(0,d.COMMON_STYLE)(),u],[`<b class="auto-height">${s}</b>`,a&&S("/list",[(0,e.dirname)(a)],"🔙",".."),...l.sort(f).map(({name:e,stat:{mtimeMs:r}})=>S("/list",[a,e],"📁",`${e}/`,0,r)),...p.sort(f).map(({name:e,stat:{size:r,mtimeMs:t}})=>S("/file",[a,e],"📄",e,r,t,`download="${e}"`))]))})} | ||
const u="<style>\nbody { white-space: pre; }\na, b { display: flex; align-items: center; }\na { text-decoration: none; border-top: 1px solid #ddd; }\na:hover { background: #eee; }\np.name { overflow: hidden; text-overflow: ellipsis; }\np.size, p.date { padding-left: 1em; text-align: right; opacity: 0.5 }\np.size { flex: 1; }\n@media only screen and (max-width: 768px) { p.date { display: none; } }\n</style>" | ||
const f=({name:e},{name:t})=>(0,r.compareStringWithNumber)(e,t) | ||
const y=e=>(0,o.escapeHTML)((0,a.toPosixPath)(e)) | ||
const S=(r,i,n,s,c,l)=>`<a class="auto-height" href="${r}/${(r=>encodeURIComponent((0,a.toPosixPath)((0,e.join)(...r))))(i)}" ${l||""}>\n<p class="name">${y(n)}</p>\n<p class="size">${s?`${(0,t.binary)(s)}B`:""}</p>\n<p class="date">${c?(0,o.escapeHTML)(new Date(c).toISOString()):""}</p>\n</a>` | ||
const S=(r,i,n,s,c,l,p,d=`${r}/${(r=>encodeURIComponent((0,a.toPosixPath)((0,e.join)(...r))))(i)}`)=>`<a class="auto-height" href="${d}" ${p?`download="${p}"`:""}>\n<object class="name">${p?`<a href="${d}" target="_blank">${n}</a>`:n}</object>\n<p class="name">|${(0,o.escapeHTML)(s)}</p>\n<p class="size">${c?`${(0,t.binary)(c)}B`:""}</p>\n<p class="date">${l?(0,o.escapeHTML)(new Date(l).toISOString()):""}</p>\n</a>` |
@@ -1,52 +0,56 @@ | ||
var e=require("./time") | ||
var t=require("./error") | ||
const r=(e,t=250,r=!1)=>{let o=null | ||
return(...s)=>{const i=r&&null===o | ||
var t=require("./time") | ||
var e=require("./error") | ||
const r=(t,e=250,r=!1)=>{let o=null | ||
return(...s)=>{const n=r&&null===o | ||
clearTimeout(o) | ||
o=setTimeout(()=>{o=null | ||
!r&&e.apply(null,s)},t) | ||
i&&e.apply(null,s)}} | ||
!r&&t.apply(null,s)},e) | ||
n&&t.apply(null,s)}} | ||
exports.debounce=r | ||
exports.throttle=((e,t=250,r=!1)=>{let o=null | ||
exports.throttle=((t,e=250,r=!1)=>{let o=null | ||
return(...s)=>{if(o)return | ||
const i=r&&null===o | ||
const n=r&&null===o | ||
o=setTimeout(()=>{o=null | ||
!r&&e.apply(null,s)},t) | ||
i&&e.apply(null,s)}}) | ||
exports.lossyAsync=((e,r=t.rethrowError)=>{let o | ||
!r&&t.apply(null,s)},e) | ||
n&&t.apply(null,s)}}) | ||
exports.lossyAsync=((t,r=e.rethrowError)=>{let o | ||
const s=()=>{o=void 0} | ||
const i=e=>{o=void 0 | ||
r(e)} | ||
return{trigger:(...t)=>{if(!o)try{const r=e.apply(null,t) | ||
r instanceof Object&&r.then?o=r.then(s,i):s()}catch(e){i(e)}},getRunningPromise:()=>o}}) | ||
exports.withDelayArgvQueue=((e,t=r,...o)=>{let s=[] | ||
const i=t(()=>{const t=s | ||
const n=t=>{o=void 0 | ||
r(t)} | ||
return{trigger:(...e)=>{if(!o)try{const r=t.apply(null,e) | ||
r instanceof Object&&r.then?o=r.then(s,n):s()}catch(t){n(t)}},getRunningPromise:()=>o}}) | ||
exports.withDelayArgvQueue=((t,e=r,...o)=>{let s=[] | ||
const n=e(()=>{const e=s | ||
s=[] | ||
e(t)},...o) | ||
return(...e)=>{s.push(e) | ||
i()}}) | ||
exports.withRepeat=((e,t=0)=>{let r=0 | ||
for(;t>r;){e(r,t) | ||
t(e)},...o) | ||
return(...t)=>{s.push(t) | ||
n()}}) | ||
exports.withRepeat=((t,e=0)=>{let r=0 | ||
for(;e>r;){t(r,e) | ||
r++}}) | ||
exports.withRepeatAsync=(async(t,r=0,o=0)=>{let s=0 | ||
for(;r>s;){const i=(0,e.clock)() | ||
await t(s,r) | ||
exports.withRepeatAsync=(async(e,r=0,o=0)=>{let s=0 | ||
for(;r>s;){const n=(0,t.clock)() | ||
await e(s,r) | ||
s++ | ||
const n=o-((0,e.clock)()-i) | ||
n>0&&await(0,e.setTimeoutAsync)(n)}}) | ||
exports.withRetry=((e,t=1/0)=>{let r=0 | ||
for(;;)try{return e(r,t)}catch(e){if(t<++r)throw e}}) | ||
exports.withRetryAsync=(async(t,r=1/0,o=0)=>{let s=0 | ||
for(;;){const i=(0,e.clock)() | ||
try{return await t(s,r)}catch(t){if(r<++s)throw t | ||
const n=o-((0,e.clock)()-i) | ||
n>0&&await(0,e.setTimeoutAsync)(n)}}}) | ||
exports.withTimeoutAsync=((e,t)=>Promise.race([e(),new Promise((e,r)=>setTimeout(()=>r(new Error(`[withTimeoutAsync] timeout after: ${t}`)),t))])) | ||
exports.withTimeoutPromise=((e,t)=>Promise.race([e,new Promise((e,r)=>setTimeout(()=>r(new Error(`[withTimeoutPromise] timeout after: ${t}`)),t))])) | ||
exports.createInsideOutPromise=(()=>{let e,t | ||
return{promise:new Promise((r,o)=>{e=r | ||
t=o}),resolve:r=>{const o=e | ||
e=t=void 0 | ||
o&&o(r)},reject:r=>{const o=t | ||
e=t=void 0 | ||
const i=o-((0,t.clock)()-n) | ||
i>0&&await(0,t.setTimeoutAsync)(i)}}) | ||
exports.withRetry=((t,e=1/0)=>{let r=0 | ||
for(;;)try{return t(r,e)}catch(t){if(e<++r)throw t}}) | ||
exports.withRetryAsync=(async(e,r=1/0,o=0)=>{let s=0 | ||
for(;;){const n=(0,t.clock)() | ||
try{return await e(s,r)}catch(e){if(r<++s)throw e | ||
const i=o-((0,t.clock)()-n) | ||
i>0&&await(0,t.setTimeoutAsync)(i)}}}) | ||
exports.withTimeoutAsync=((t,e)=>o(t(),e)) | ||
const o=(t,e)=>{let r=null | ||
return Promise.race([t,new Promise((t,o)=>{r=setTimeout(()=>o(new Error(`timeout after: ${e}`)),e)})]).then(t=>{clearTimeout(r) | ||
return t},t=>{clearTimeout(r) | ||
throw t})} | ||
exports.withTimeoutPromise=o | ||
exports.createInsideOutPromise=(()=>{let t,e | ||
return{promise:new Promise((r,o)=>{t=r | ||
e=o}),resolve:r=>{const o=t | ||
t=e=void 0 | ||
o&&o(r)},reject:r=>{const o=e | ||
t=e=void 0 | ||
o&&o(r)}}}) |
@@ -8,38 +8,39 @@ var e=require("path") | ||
var s=require("./parser") | ||
const i=(e,t=(()=>{}),r=(e=>e),o="",n=!1)=>({argumentCount:e,argumentListNormalize:r,argumentListVerify:t,description:o,optional:n}) | ||
const p={Optional:{optional:!0},Path:{isPath:!0},Any:i("0-",void 0,void 0,"any",!0),Toggle:i("0-",void 0,()=>[!0],"set to enable",!0)} | ||
exports.Preset=p | ||
Object.assign(p,...[["String",o.string,e=>e.map(String)],["Number",o.number,e=>e.map(Number)],["Boolean",o.boolean,e=>e.map(Boolean)],["Integer",o.integer,e=>e.map(parseInt)],["Function",o.basicFunction,void 0]].map(([e,t,r])=>{return{[`Single${e}`]:i(1,r=>{(0,o.arrayLength)(r,1) | ||
t(r[0],`expect ${e}`)},r),[`All${e}`]:i("1-",r=>r.forEach((r,o)=>t(r,`expect ${e} at #${o}`)),r)}})) | ||
const c=(e,t={})=>{const[r,...o]=e.split("|") | ||
const[a,s="",i]=r.split(/\s*[\s\/]\s*/) | ||
const[c,...l]=a.split(",") | ||
const m=l[0] | ||
const g=s.split(",") | ||
return Object.assign({},...g.map(e=>{if(e&&!p[e])throw new Error(`invalid presetName: ${e}`) | ||
return p[e]}).filter(Boolean),(0,n.objectDeleteUndefined)({name:c,shortName:m&&1===m.length?l[0]:void 0,aliasNameList:l,argumentCount:i||void 0,description:o.join("|")||void 0}),Array.isArray(t)?{extendFormatList:t}:t)} | ||
Object.assign(p,{SinglePath:c("/SingleString,Path"),AllPath:c("/AllString,Path"),Config:c('config,c/SingleString,Optional|from ENV: set to "env"\nfrom JS/JSON file: set to "path/to/config.js|json"'),pickOneOf:e=>{if(e.length<=2)throw new Error(`expect more to pick: ${e}`) | ||
return i(1,t=>{(0,o.arrayLength)(t,1);(0,o.oneOf)(t[0],e)},void 0,`one of:\n ${(0,a.arraySplitChunk)(e,4).map(e=>e.join(" ")).join("\n ")}`)},parseCompact:c,parseCompactList:(...e)=>e.map(e=>Array.isArray(e)?c(...e):c(e))}) | ||
Object.entries(p).forEach(([e,t])=>{const o=(0,r.splitCamelCase)(e).map(e=>e.charAt(0)).join("") | ||
const i=e=>{throw new Error(e)} | ||
const p=(e,t=(()=>{}),r=(e=>e),o="",n=!1)=>({argumentCount:e,argumentListNormalize:r,argumentListVerify:t,description:o,optional:n}) | ||
const c={Optional:{optional:!0},Path:{isPath:!0},Any:p("0-",void 0,void 0,"any",!0),Toggle:p("0-",void 0,()=>[!0],"set to enable",!0)} | ||
exports.Preset=c | ||
Object.assign(c,...[["String",o.string,e=>e.map(String)],["Number",o.number,e=>e.map(Number)],["Boolean",o.boolean,e=>e.map(Boolean)],["Integer",o.integer,e=>e.map(parseInt)],["Function",o.basicFunction,void 0]].map(([e,t,r])=>{return{[`Single${e}`]:p(1,r=>{(0,o.arrayLength)(r,1) | ||
t(r[0],`expect ${e}`)},r),[`All${e}`]:p("1-",r=>r.forEach((r,o)=>t(r,`expect ${e} at #${o}`)),r)}})) | ||
const l=(e,t={})=>{const[r,...o]=e.split("|") | ||
const[a,s="",p]=r.split(/\s*[\s\/]\s*/) | ||
const[l,...m]=a.split(",") | ||
const g=m[0] | ||
const u=s.split(",") | ||
return Object.assign({},...u.map(e=>{e&&!c[e]&&i(`invalid presetName: ${e}`) | ||
return c[e]}).filter(Boolean),(0,n.objectDeleteUndefined)({name:l,shortName:g&&1===g.length?m[0]:void 0,aliasNameList:m,argumentCount:p||void 0,description:o.join("|")||void 0}),Array.isArray(t)?{extendFormatList:t}:t)} | ||
Object.assign(c,{SinglePath:l("/SingleString,Path"),AllPath:l("/AllString,Path"),Config:l('config,c/SingleString,Optional|from ENV: set to "env"\nfrom JS/JSON file: set to "path/to/config.js|json"'),pickOneOf:e=>{e.length<=2&&i(`expect more to pick: ${e}`) | ||
return p(1,t=>{(0,o.arrayLength)(t,1);(0,o.oneOf)(t[0],e)},void 0,`one of:\n ${(0,a.arraySplitChunk)(e,4).map(e=>e.join(" ")).join("\n ")}`)},parseCompact:l,parseCompactList:(...e)=>e.map(e=>Array.isArray(e)?l(...e):l(e))}) | ||
Object.entries(c).forEach(([e,t])=>{const o=(0,r.splitCamelCase)(e).map(e=>e.charAt(0)).join("") | ||
0 | ||
p[o]=t}) | ||
c[o]=t}) | ||
exports.getOptionalFormatFlag=((...e)=>t=>!e.some(e=>Boolean(t[e]))) | ||
exports.getOptionalFormatValue=((e,...t)=>r=>{const o=r[e] | ||
return o&&!t.includes(o.argumentList[0])}) | ||
const l=async({parseCLI:r,parseENV:o,parseCONFIG:n,processOptionMap:a})=>{const s=m(r(process.argv.slice(2)),process.cwd()) | ||
const i=s.config&&s.config.argumentList[0] | ||
const p=i?"env"===i?m(o(process.env),process.cwd()):m(n((0,t.tryRequire)((0,e.resolve)(process.cwd(),i))),(0,e.dirname)((0,e.resolve)(process.cwd(),i))):null | ||
const c=a(Object.assign({},p,s)) | ||
return c} | ||
exports.parseOptionMap=l | ||
const m=(t,r)=>{Object.values(t).forEach(({format:{isPath:t},argumentList:o})=>t&&o.forEach((t,n)=>o[n]=(0,e.resolve)(r,t))) | ||
const m=async({parseCLI:r,parseENV:o,parseCONFIG:n,processOptionMap:a})=>{const s=g(r(process.argv.slice(2)),process.cwd()) | ||
const p=s.config&&s.config.argumentList[0] | ||
const c=p?"env"===p?g(o(process.env),process.cwd()):g(n((0,t.tryRequire)((0,e.resolve)(process.cwd(),p))||i(`failed to load config: ${p}`)),(0,e.dirname)((0,e.resolve)(process.cwd(),p))):null | ||
const l=a(Object.assign({},c,s)) | ||
return l} | ||
exports.parseOptionMap=m | ||
const g=(t,r)=>{Object.values(t).forEach(({format:{isPath:t},argumentList:o})=>t&&o.forEach((t,n)=>o[n]=(0,e.resolve)(r,t))) | ||
return t} | ||
const g=e=>{const t=t=>e[t]&&e[t].argumentList | ||
const u=e=>{const t=t=>e[t]&&e[t].argumentList | ||
const r=(e,r)=>{const o=t(e) | ||
if(!o)throw new Error(`expect option ${e}`) | ||
if(void 0!==r&&o.length!==r)throw new Error(`expect option ${e} with ${r} value, get ${o.length}`) | ||
o||i(`expect option ${e}`) | ||
void 0!==r&&o.length!==r&&i(`expect option ${e} with ${r} value, get ${o.length}`) | ||
return o} | ||
return{optionMap:e,tryGet:t,tryGetFirst:t=>e[t]&&e[t].argumentList[0],get:r,getFirst:e=>r(e,1)[0]}} | ||
exports.createOptionGetter=g | ||
exports.createOptionGetter=u | ||
exports.prepareOption=(e=>{const{parseCLI:t,parseENV:r,parseCONFIG:o,processOptionMap:n,formatUsage:a}=(0,s.createOptionParser)(e) | ||
return{parseOption:async()=>g(await l({parseCLI:t,parseENV:r,parseCONFIG:o,processOptionMap:n})),formatUsage:a}}) | ||
return{parseOption:async()=>u(await m({parseCLI:t,parseENV:r,parseCONFIG:o,processOptionMap:n})),formatUsage:a}}) |
@@ -98,4 +98,15 @@ import { clock, setTimeoutAsync } from "./time"; | ||
}; | ||
const withTimeoutAsync = (func, timeout) => Promise.race([ func(), new Promise((resolve, reject) => setTimeout(() => reject(new Error(`[withTimeoutAsync] timeout after: ${timeout}`)), timeout)) ]); | ||
const withTimeoutPromise = (promise, timeout) => Promise.race([ promise, new Promise((resolve, reject) => setTimeout(() => reject(new Error(`[withTimeoutPromise] timeout after: ${timeout}`)), timeout)) ]); | ||
const withTimeoutAsync = (func, timeout) => withTimeoutPromise(func(), timeout); | ||
const withTimeoutPromise = (promise, timeout) => { | ||
let timeoutToken = null; | ||
return Promise.race([ promise, new Promise((resolve, reject) => { | ||
timeoutToken = setTimeout(() => reject(new Error(`timeout after: ${timeout}`)), timeout); | ||
}) ]).then(result => { | ||
clearTimeout(timeoutToken); | ||
return result; | ||
}, error => { | ||
clearTimeout(timeoutToken); | ||
throw error; | ||
}); | ||
}; | ||
const createInsideOutPromise = () => { | ||
@@ -102,0 +113,0 @@ let promiseResolve, promiseReject; |
@@ -8,2 +8,5 @@ import { resolve, dirname } from "path"; | ||
import { createOptionParser } from "./parser"; | ||
const throwError = message => { | ||
throw new Error(message); | ||
}; | ||
const getPreset = (argumentCount, argumentListVerify = (() => {}), argumentListNormalize = (v => v), description = "", optional = !1) => ({ | ||
@@ -42,3 +45,3 @@ argumentCount, | ||
return Object.assign({}, ...presetList.map(presetName => { | ||
if (presetName && !Preset[presetName]) throw new Error(`invalid presetName: ${presetName}`); | ||
presetName && !Preset[presetName] && throwError(`invalid presetName: ${presetName}`); | ||
return Preset[presetName]; | ||
@@ -60,3 +63,3 @@ }).filter(Boolean), objectDeleteUndefined({ | ||
pickOneOf: selectList => { | ||
if (selectList.length <= 2) throw new Error(`expect more to pick: ${selectList}`); | ||
selectList.length <= 2 && throwError(`expect more to pick: ${selectList}`); | ||
return getPreset(1, argumentList => { | ||
@@ -84,3 +87,3 @@ arrayLength(argumentList, 1); | ||
const optionMap = processOptionMap({ | ||
...config ? "env" === config ? optionMapResolvePath(parseENV(process.env), process.cwd()) : optionMapResolvePath(parseCONFIG(tryRequire(resolve(process.cwd(), config))), dirname(resolve(process.cwd(), config))) : null, | ||
...config ? "env" === config ? optionMapResolvePath(parseENV(process.env), process.cwd()) : optionMapResolvePath(parseCONFIG(tryRequire(resolve(process.cwd(), config)) || throwError(`failed to load config: ${config}`)), dirname(resolve(process.cwd(), config))) : null, | ||
...optionMapCLI | ||
@@ -98,4 +101,4 @@ }); | ||
const argumentList = tryGet(name); | ||
if (!argumentList) throw new Error(`expect option ${name}`); | ||
if (void 0 !== argumentCount && argumentList.length !== argumentCount) throw new Error(`expect option ${name} with ${argumentCount} value, get ${argumentList.length}`); | ||
argumentList || throwError(`expect option ${name}`); | ||
void 0 !== argumentCount && argumentList.length !== argumentCount && throwError(`expect option ${name} with ${argumentCount} value, get ${argumentList.length}`); | ||
return argumentList; | ||
@@ -102,0 +105,0 @@ }; |
@@ -1,1 +0,1 @@ | ||
{"name":"dr-js","version":"0.20.1","description":"A collection of strange functions","author":"dr-js","license":"MIT","keywords":["Dr","Dr-js","JavaScript"],"repository":"github:dr-js/dr-js","bin":"bin/index.js","browser":"library/Dr.browser.js","engines":{"node":">=8.12","npm":">=6"},"sideEffects":false} | ||
{"name":"dr-js","version":"0.20.2-dev.0","description":"A collection of strange functions","author":"dr-js","license":"MIT","keywords":["Dr","Dr-js","JavaScript"],"repository":"github:dr-js/dr-js","bin":"bin/index.js","browser":"library/Dr.browser.js","engines":{"node":">=8.12","npm":">=6"},"sideEffects":false} |
Sorry, the diff of this file is too big to display
454460
10573