From d17f1a9eab7f0d60feb959f5d7c99922d223de5c Mon Sep 17 00:00:00 2001 From: Josh Date: Sun, 13 Dec 2020 21:42:14 +1100 Subject: [PATCH] better string formatting --- coverage/clover.xml | 172 +++++++-------- coverage/coverage-final.json | 2 +- coverage/lcov-report/index.html | 34 +-- coverage/lcov-report/index.ts.html | 273 ++++++++++++++---------- coverage/lcov.info | 323 ++++++++++++++++------------- src/index.ts | 98 +++++---- test/duration.test.ts | 88 +++++--- 7 files changed, 579 insertions(+), 411 deletions(-) diff --git a/coverage/clover.xml b/coverage/clover.xml index bfa9c13..68caafa 100644 --- a/coverage/clover.xml +++ b/coverage/clover.xml @@ -1,94 +1,104 @@ - - - + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json index 7b720c8..379bef4 100644 --- a/coverage/coverage-final.json +++ b/coverage/coverage-final.json @@ -1,2 +1,2 @@ -{"/Users/josh/dev/duration/src/index.ts": {"path":"/Users/josh/dev/duration/src/index.ts","statementMap":{"0":{"start":{"line":11,"column":10},"end":{"line":11,"column":11}},"1":{"start":{"line":12,"column":6},"end":{"line":12,"column":14}},"2":{"start":{"line":13,"column":6},"end":{"line":13,"column":12}},"3":{"start":{"line":14,"column":6},"end":{"line":14,"column":12}},"4":{"start":{"line":15,"column":4},"end":{"line":15,"column":10}},"5":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"6":{"start":{"line":21,"column":4},"end":{"line":21,"column":23}},"7":{"start":{"line":24,"column":9},"end":{"line":42,"column":null}},"8":{"start":{"line":24,"column":26},"end":{"line":24,"column":null}},"9":{"start":{"line":25,"column":4},"end":{"line":25,"column":26}},"10":{"start":{"line":26,"column":4},"end":{"line":29,"column":null}},"11":{"start":{"line":27,"column":6},"end":{"line":27,"column":69}},"12":{"start":{"line":28,"column":6},"end":{"line":28,"column":61}},"13":{"start":{"line":30,"column":4},"end":{"line":41,"column":null}},"14":{"start":{"line":32,"column":8},"end":{"line":32,"column":null}},"15":{"start":{"line":34,"column":8},"end":{"line":34,"column":39}},"16":{"start":{"line":36,"column":8},"end":{"line":36,"column":39}},"17":{"start":{"line":38,"column":8},"end":{"line":38,"column":39}},"18":{"start":{"line":40,"column":8},"end":{"line":40,"column":35}},"19":{"start":{"line":44,"column":9},"end":{"line":46,"column":null}},"20":{"start":{"line":45,"column":4},"end":{"line":45,"column":37}},"21":{"start":{"line":48,"column":9},"end":{"line":50,"column":null}},"22":{"start":{"line":49,"column":4},"end":{"line":49,"column":37}},"23":{"start":{"line":52,"column":9},"end":{"line":54,"column":null}},"24":{"start":{"line":53,"column":4},"end":{"line":53,"column":37}},"25":{"start":{"line":56,"column":9},"end":{"line":58,"column":null}},"26":{"start":{"line":57,"column":4},"end":{"line":57,"column":37}},"27":{"start":{"line":60,"column":9},"end":{"line":62,"column":null}},"28":{"start":{"line":61,"column":4},"end":{"line":61,"column":37}},"29":{"start":{"line":64,"column":2},"end":{"line":66,"column":null}},"30":{"start":{"line":65,"column":4},"end":{"line":65,"column":22}},"31":{"start":{"line":68,"column":2},"end":{"line":81,"column":null}},"32":{"start":{"line":69,"column":4},"end":{"line":80,"column":null}},"33":{"start":{"line":71,"column":8},"end":{"line":71,"column":42}},"34":{"start":{"line":73,"column":8},"end":{"line":73,"column":42}},"35":{"start":{"line":75,"column":8},"end":{"line":75,"column":42}},"36":{"start":{"line":77,"column":8},"end":{"line":77,"column":42}},"37":{"start":{"line":79,"column":8},"end":{"line":79,"column":38}},"38":{"start":{"line":83,"column":2},"end":{"line":85,"column":null}},"39":{"start":{"line":84,"column":4},"end":{"line":84,"column":24}},"40":{"start":{"line":87,"column":2},"end":{"line":89,"column":null}},"41":{"start":{"line":88,"column":4},"end":{"line":88,"column":24}},"42":{"start":{"line":91,"column":2},"end":{"line":93,"column":null}},"43":{"start":{"line":92,"column":4},"end":{"line":92,"column":24}},"44":{"start":{"line":95,"column":2},"end":{"line":97,"column":null}},"45":{"start":{"line":96,"column":4},"end":{"line":96,"column":24}},"46":{"start":{"line":99,"column":2},"end":{"line":101,"column":null}},"47":{"start":{"line":100,"column":4},"end":{"line":100,"column":24}},"48":{"start":{"line":103,"column":2},"end":{"line":142,"column":null}},"49":{"start":{"line":103,"column":31},"end":{"line":103,"column":null}},"50":{"start":{"line":104,"column":26},"end":{"line":104,"column":38}},"51":{"start":{"line":105,"column":28},"end":{"line":105,"column":38}},"52":{"start":{"line":107,"column":4},"end":{"line":112,"column":null}},"53":{"start":{"line":108,"column":19},"end":{"line":108,"column":52}},"54":{"start":{"line":109,"column":6},"end":{"line":109,"column":55}},"55":{"start":{"line":110,"column":18},"end":{"line":110,"column":60}},"56":{"start":{"line":111,"column":6},"end":{"line":111,"column":58}},"57":{"start":{"line":114,"column":4},"end":{"line":119,"column":null}},"58":{"start":{"line":115,"column":20},"end":{"line":115,"column":53}},"59":{"start":{"line":116,"column":6},"end":{"line":116,"column":56}},"60":{"start":{"line":117,"column":18},"end":{"line":117,"column":61}},"61":{"start":{"line":118,"column":6},"end":{"line":118,"column":58}},"62":{"start":{"line":121,"column":4},"end":{"line":126,"column":null}},"63":{"start":{"line":122,"column":22},"end":{"line":122,"column":55}},"64":{"start":{"line":123,"column":6},"end":{"line":123,"column":58}},"65":{"start":{"line":124,"column":18},"end":{"line":124,"column":63}},"66":{"start":{"line":125,"column":6},"end":{"line":125,"column":58}},"67":{"start":{"line":128,"column":4},"end":{"line":133,"column":null}},"68":{"start":{"line":129,"column":22},"end":{"line":129,"column":55}},"69":{"start":{"line":130,"column":6},"end":{"line":130,"column":58}},"70":{"start":{"line":131,"column":18},"end":{"line":131,"column":63}},"71":{"start":{"line":132,"column":6},"end":{"line":132,"column":58}},"72":{"start":{"line":135,"column":4},"end":{"line":139,"column":null}},"73":{"start":{"line":136,"column":27},"end":{"line":136,"column":60}},"74":{"start":{"line":137,"column":18},"end":{"line":137,"column":68}},"75":{"start":{"line":138,"column":6},"end":{"line":138,"column":58}},"76":{"start":{"line":141,"column":4},"end":{"line":141,"column":27}},"77":{"start":{"line":144,"column":17},"end":{"line":157,"column":null}},"78":{"start":{"line":146,"column":4},"end":{"line":146,"column":null}},"79":{"start":{"line":148,"column":19},"end":{"line":148,"column":32}},"80":{"start":{"line":149,"column":25},"end":{"line":149,"column":33}},"81":{"start":{"line":150,"column":4},"end":{"line":152,"column":null}},"82":{"start":{"line":151,"column":6},"end":{"line":151,"column":37}},"83":{"start":{"line":153,"column":4},"end":{"line":155,"column":null}},"84":{"start":{"line":154,"column":6},"end":{"line":154,"column":60}},"85":{"start":{"line":156,"column":4},"end":{"line":156,"column":18}},"86":{"start":{"line":158,"column":0},"end":{"line":158,"column":null}},"87":{"start":{"line":17,"column":13},"end":{"line":17,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":17,"column":0},"end":{"line":17,"column":13}},"loc":{"start":{"line":17,"column":0},"end":{"line":158,"column":null}}},"1":{"name":"Duration","decl":{"start":{"line":20,"column":2},"end":{"line":20,"column":14}},"loc":{"start":{"line":20,"column":27},"end":{"line":22,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":24,"column":2},"end":{"line":24,"column":9}},"loc":{"start":{"line":24,"column":43},"end":{"line":42,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":44,"column":2},"end":{"line":44,"column":9}},"loc":{"start":{"line":44,"column":27},"end":{"line":46,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":48,"column":2},"end":{"line":48,"column":9}},"loc":{"start":{"line":48,"column":28},"end":{"line":50,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":52,"column":2},"end":{"line":52,"column":9}},"loc":{"start":{"line":52,"column":30},"end":{"line":54,"column":3}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":56,"column":2},"end":{"line":56,"column":9}},"loc":{"start":{"line":56,"column":30},"end":{"line":58,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":60,"column":2},"end":{"line":60,"column":9}},"loc":{"start":{"line":60,"column":35},"end":{"line":62,"column":3}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":64,"column":2},"end":{"line":64,"column":9}},"loc":{"start":{"line":64,"column":2},"end":{"line":66,"column":3}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":68,"column":2},"end":{"line":68,"column":4}},"loc":{"start":{"line":68,"column":15},"end":{"line":81,"column":3}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":83,"column":2},"end":{"line":83,"column":6}},"loc":{"start":{"line":83,"column":2},"end":{"line":85,"column":3}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":87,"column":2},"end":{"line":87,"column":7}},"loc":{"start":{"line":87,"column":2},"end":{"line":89,"column":3}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":91,"column":2},"end":{"line":91,"column":9}},"loc":{"start":{"line":91,"column":2},"end":{"line":93,"column":3}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":95,"column":2},"end":{"line":95,"column":9}},"loc":{"start":{"line":95,"column":2},"end":{"line":97,"column":3}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":99,"column":2},"end":{"line":99,"column":14}},"loc":{"start":{"line":99,"column":2},"end":{"line":101,"column":3}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":103,"column":2},"end":{"line":103,"column":8}},"loc":{"start":{"line":103,"column":58},"end":{"line":142,"column":3}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":144,"column":2},"end":{"line":144,"column":17}},"loc":{"start":{"line":146,"column":31},"end":{"line":157,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":26},"end":{"line":24,"column":null}},"type":"if","locations":[{"start":{"line":24,"column":26},"end":{"line":24,"column":null}},{"start":{"line":24,"column":26},"end":{"line":24,"column":null}}]},"1":{"loc":{"start":{"line":26,"column":4},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":29,"column":null}},{"start":{"line":26,"column":4},"end":{"line":29,"column":null}}]},"2":{"loc":{"start":{"line":31,"column":6},"end":{"line":32,"column":null}},"type":"switch","locations":[{"start":{"line":31,"column":6},"end":{"line":32,"column":null}},{"start":{"line":33,"column":6},"end":{"line":34,"column":39}},{"start":{"line":35,"column":6},"end":{"line":36,"column":39}},{"start":{"line":37,"column":6},"end":{"line":38,"column":39}},{"start":{"line":39,"column":6},"end":{"line":40,"column":35}}]},"3":{"loc":{"start":{"line":70,"column":6},"end":{"line":71,"column":42}},"type":"switch","locations":[{"start":{"line":70,"column":6},"end":{"line":71,"column":42}},{"start":{"line":72,"column":6},"end":{"line":73,"column":42}},{"start":{"line":74,"column":6},"end":{"line":75,"column":42}},{"start":{"line":76,"column":6},"end":{"line":77,"column":42}},{"start":{"line":78,"column":6},"end":{"line":79,"column":38}}]},"4":{"loc":{"start":{"line":103,"column":31},"end":{"line":103,"column":null}},"type":"if","locations":[{"start":{"line":103,"column":31},"end":{"line":103,"column":null}},{"start":{"line":103,"column":31},"end":{"line":103,"column":null}}]},"5":{"loc":{"start":{"line":107,"column":4},"end":{"line":112,"column":null}},"type":"if","locations":[{"start":{"line":107,"column":4},"end":{"line":112,"column":null}},{"start":{"line":107,"column":4},"end":{"line":112,"column":null}}]},"6":{"loc":{"start":{"line":114,"column":4},"end":{"line":119,"column":null}},"type":"if","locations":[{"start":{"line":114,"column":4},"end":{"line":119,"column":null}},{"start":{"line":114,"column":4},"end":{"line":119,"column":null}}]},"7":{"loc":{"start":{"line":121,"column":4},"end":{"line":126,"column":null}},"type":"if","locations":[{"start":{"line":121,"column":4},"end":{"line":126,"column":null}},{"start":{"line":121,"column":4},"end":{"line":126,"column":null}}]},"8":{"loc":{"start":{"line":128,"column":4},"end":{"line":133,"column":null}},"type":"if","locations":[{"start":{"line":128,"column":4},"end":{"line":133,"column":null}},{"start":{"line":128,"column":4},"end":{"line":133,"column":null}}]},"9":{"loc":{"start":{"line":135,"column":4},"end":{"line":139,"column":null}},"type":"if","locations":[{"start":{"line":135,"column":4},"end":{"line":139,"column":null}},{"start":{"line":135,"column":4},"end":{"line":139,"column":null}}]},"10":{"loc":{"start":{"line":146,"column":4},"end":{"line":146,"column":null}},"type":"if","locations":[{"start":{"line":146,"column":4},"end":{"line":146,"column":null}},{"start":{"line":146,"column":4},"end":{"line":146,"column":null}}]},"11":{"loc":{"start":{"line":150,"column":4},"end":{"line":152,"column":null}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":152,"column":null}},{"start":{"line":150,"column":4},"end":{"line":152,"column":null}}]},"12":{"loc":{"start":{"line":153,"column":4},"end":{"line":155,"column":null}},"type":"if","locations":[{"start":{"line":153,"column":4},"end":{"line":155,"column":null}},{"start":{"line":153,"column":4},"end":{"line":155,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":21,"7":1,"8":21,"9":21,"10":21,"11":0,"12":0,"13":21,"14":4,"15":8,"16":3,"17":3,"18":3,"19":1,"20":3,"21":1,"22":7,"23":1,"24":2,"25":1,"26":2,"27":1,"28":2,"29":1,"30":5,"31":1,"32":10,"33":2,"34":2,"35":2,"36":2,"37":2,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":35,"50":18,"51":18,"52":18,"53":1,"54":1,"55":1,"56":1,"57":18,"58":14,"59":14,"60":14,"61":14,"62":18,"63":10,"64":10,"65":10,"66":10,"67":18,"68":6,"69":6,"70":6,"71":6,"72":18,"73":3,"74":3,"75":3,"76":18,"77":1,"78":34,"79":34,"80":34,"81":34,"82":2,"83":32,"84":0,"85":32,"86":1,"87":1},"f":{"0":1,"1":21,"2":21,"3":3,"4":7,"5":2,"6":2,"7":2,"8":5,"9":10,"10":1,"11":1,"12":1,"13":1,"14":1,"15":18,"16":34},"b":{"0":[0,21],"1":[0,21],"2":[4,8,3,3,3],"3":[2,2,2,2,2],"4":[17,1],"5":[1,17],"6":[14,4],"7":[10,8],"8":[6,12],"9":[3,15],"10":[0,34],"11":[2,32],"12":[0,32]}} +{"/Users/josh/dev/duration/src/index.ts": {"path":"/Users/josh/dev/duration/src/index.ts","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":50}},"1":{"start":{"line":2,"column":25},"end":{"line":2,"column":50}},"2":{"start":{"line":14,"column":10},"end":{"line":14,"column":11}},"3":{"start":{"line":15,"column":6},"end":{"line":15,"column":14}},"4":{"start":{"line":16,"column":6},"end":{"line":16,"column":12}},"5":{"start":{"line":17,"column":6},"end":{"line":17,"column":12}},"6":{"start":{"line":18,"column":6},"end":{"line":18,"column":12}},"7":{"start":{"line":20,"column":36},"end":{"line":20,"column":51}},"8":{"start":{"line":22,"column":0},"end":{"line":22,"column":13}},"9":{"start":{"line":26,"column":4},"end":{"line":26,"column":23}},"10":{"start":{"line":29,"column":9},"end":{"line":47,"column":null}},"11":{"start":{"line":29,"column":26},"end":{"line":29,"column":null}},"12":{"start":{"line":30,"column":4},"end":{"line":30,"column":26}},"13":{"start":{"line":31,"column":4},"end":{"line":34,"column":null}},"14":{"start":{"line":32,"column":6},"end":{"line":32,"column":69}},"15":{"start":{"line":33,"column":6},"end":{"line":33,"column":61}},"16":{"start":{"line":35,"column":4},"end":{"line":46,"column":null}},"17":{"start":{"line":37,"column":8},"end":{"line":37,"column":39}},"18":{"start":{"line":39,"column":8},"end":{"line":39,"column":39}},"19":{"start":{"line":41,"column":8},"end":{"line":41,"column":39}},"20":{"start":{"line":43,"column":8},"end":{"line":43,"column":39}},"21":{"start":{"line":45,"column":8},"end":{"line":45,"column":35}},"22":{"start":{"line":49,"column":9},"end":{"line":51,"column":null}},"23":{"start":{"line":50,"column":4},"end":{"line":50,"column":37}},"24":{"start":{"line":53,"column":9},"end":{"line":55,"column":null}},"25":{"start":{"line":54,"column":4},"end":{"line":54,"column":37}},"26":{"start":{"line":57,"column":9},"end":{"line":59,"column":null}},"27":{"start":{"line":58,"column":4},"end":{"line":58,"column":37}},"28":{"start":{"line":61,"column":9},"end":{"line":63,"column":null}},"29":{"start":{"line":62,"column":4},"end":{"line":62,"column":37}},"30":{"start":{"line":65,"column":9},"end":{"line":67,"column":null}},"31":{"start":{"line":66,"column":4},"end":{"line":66,"column":37}},"32":{"start":{"line":69,"column":2},"end":{"line":71,"column":null}},"33":{"start":{"line":70,"column":4},"end":{"line":70,"column":22}},"34":{"start":{"line":73,"column":2},"end":{"line":86,"column":null}},"35":{"start":{"line":74,"column":4},"end":{"line":85,"column":null}},"36":{"start":{"line":76,"column":8},"end":{"line":76,"column":42}},"37":{"start":{"line":78,"column":8},"end":{"line":78,"column":42}},"38":{"start":{"line":80,"column":8},"end":{"line":80,"column":42}},"39":{"start":{"line":82,"column":8},"end":{"line":82,"column":42}},"40":{"start":{"line":84,"column":8},"end":{"line":84,"column":38}},"41":{"start":{"line":88,"column":2},"end":{"line":90,"column":null}},"42":{"start":{"line":89,"column":4},"end":{"line":89,"column":24}},"43":{"start":{"line":92,"column":2},"end":{"line":94,"column":null}},"44":{"start":{"line":93,"column":4},"end":{"line":93,"column":24}},"45":{"start":{"line":96,"column":2},"end":{"line":98,"column":null}},"46":{"start":{"line":97,"column":4},"end":{"line":97,"column":24}},"47":{"start":{"line":100,"column":2},"end":{"line":102,"column":null}},"48":{"start":{"line":101,"column":4},"end":{"line":101,"column":24}},"49":{"start":{"line":104,"column":2},"end":{"line":106,"column":null}},"50":{"start":{"line":105,"column":4},"end":{"line":105,"column":24}},"51":{"start":{"line":108,"column":2},"end":{"line":121,"column":null}},"52":{"start":{"line":109,"column":4},"end":{"line":120,"column":null}},"53":{"start":{"line":111,"column":8},"end":{"line":111,"column":null}},"54":{"start":{"line":113,"column":8},"end":{"line":113,"column":null}},"55":{"start":{"line":115,"column":8},"end":{"line":115,"column":null}},"56":{"start":{"line":117,"column":8},"end":{"line":117,"column":null}},"57":{"start":{"line":119,"column":8},"end":{"line":119,"column":null}},"58":{"start":{"line":123,"column":2},"end":{"line":164,"column":null}},"59":{"start":{"line":123,"column":2},"end":{"line":123,"column":8}},"60":{"start":{"line":123,"column":31},"end":{"line":123,"column":null}},"61":{"start":{"line":124,"column":26},"end":{"line":124,"column":38}},"62":{"start":{"line":126,"column":24},"end":{"line":126,"column":69}},"63":{"start":{"line":127,"column":25},"end":{"line":127,"column":70}},"64":{"start":{"line":128,"column":54},"end":{"line":128,"column":79}},"65":{"start":{"line":130,"column":4},"end":{"line":137,"column":null}},"66":{"start":{"line":131,"column":6},"end":{"line":135,"column":null}},"67":{"start":{"line":131,"column":39},"end":{"line":131,"column":60}},"68":{"start":{"line":132,"column":22},"end":{"line":132,"column":61}},"69":{"start":{"line":133,"column":8},"end":{"line":133,"column":null}},"70":{"start":{"line":134,"column":8},"end":{"line":134,"column":null}},"71":{"start":{"line":136,"column":6},"end":{"line":136,"column":null}},"72":{"start":{"line":139,"column":4},"end":{"line":149,"column":null}},"73":{"start":{"line":140,"column":18},"end":{"line":140,"column":36}},"74":{"start":{"line":141,"column":32},"end":{"line":141,"column":45}},"75":{"start":{"line":141,"column":17},"end":{"line":141,"column":19}},"76":{"start":{"line":141,"column":28},"end":{"line":141,"column":32}},"77":{"start":{"line":142,"column":20},"end":{"line":142,"column":52}},"78":{"start":{"line":143,"column":29},"end":{"line":143,"column":72}},"79":{"start":{"line":144,"column":6},"end":{"line":148,"column":null}},"80":{"start":{"line":145,"column":8},"end":{"line":145,"column":null}},"81":{"start":{"line":147,"column":8},"end":{"line":147,"column":null}},"82":{"start":{"line":151,"column":4},"end":{"line":161,"column":null}},"83":{"start":{"line":152,"column":18},"end":{"line":152,"column":36}},"84":{"start":{"line":153,"column":32},"end":{"line":153,"column":45}},"85":{"start":{"line":153,"column":17},"end":{"line":153,"column":19}},"86":{"start":{"line":153,"column":28},"end":{"line":153,"column":32}},"87":{"start":{"line":154,"column":20},"end":{"line":154,"column":41}},"88":{"start":{"line":155,"column":29},"end":{"line":155,"column":72}},"89":{"start":{"line":156,"column":6},"end":{"line":160,"column":null}},"90":{"start":{"line":157,"column":8},"end":{"line":157,"column":null}},"91":{"start":{"line":159,"column":8},"end":{"line":159,"column":null}},"92":{"start":{"line":163,"column":4},"end":{"line":163,"column":27}},"93":{"start":{"line":166,"column":17},"end":{"line":179,"column":null}},"94":{"start":{"line":168,"column":4},"end":{"line":168,"column":null}},"95":{"start":{"line":170,"column":19},"end":{"line":170,"column":32}},"96":{"start":{"line":171,"column":25},"end":{"line":171,"column":33}},"97":{"start":{"line":172,"column":4},"end":{"line":174,"column":null}},"98":{"start":{"line":173,"column":6},"end":{"line":173,"column":37}},"99":{"start":{"line":175,"column":4},"end":{"line":177,"column":null}},"100":{"start":{"line":176,"column":6},"end":{"line":176,"column":61}},"101":{"start":{"line":178,"column":4},"end":{"line":178,"column":18}},"102":{"start":{"line":180,"column":0},"end":{"line":180,"column":null}},"103":{"start":{"line":22,"column":13},"end":{"line":22,"column":21}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":22,"column":0},"end":{"line":22,"column":13}},"loc":{"start":{"line":22,"column":0},"end":{"line":180,"column":null}}},"1":{"name":"Duration","decl":{"start":{"line":25,"column":2},"end":{"line":25,"column":14}},"loc":{"start":{"line":25,"column":27},"end":{"line":27,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":2},"end":{"line":29,"column":9}},"loc":{"start":{"line":29,"column":43},"end":{"line":47,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":49,"column":2},"end":{"line":49,"column":9}},"loc":{"start":{"line":49,"column":27},"end":{"line":51,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":2},"end":{"line":53,"column":9}},"loc":{"start":{"line":53,"column":28},"end":{"line":55,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":57,"column":2},"end":{"line":57,"column":9}},"loc":{"start":{"line":57,"column":30},"end":{"line":59,"column":3}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":61,"column":2},"end":{"line":61,"column":9}},"loc":{"start":{"line":61,"column":30},"end":{"line":63,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":65,"column":2},"end":{"line":65,"column":9}},"loc":{"start":{"line":65,"column":35},"end":{"line":67,"column":3}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":69,"column":2},"end":{"line":69,"column":9}},"loc":{"start":{"line":69,"column":2},"end":{"line":71,"column":3}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":73,"column":2},"end":{"line":73,"column":4}},"loc":{"start":{"line":73,"column":15},"end":{"line":86,"column":3}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":88,"column":2},"end":{"line":88,"column":6}},"loc":{"start":{"line":88,"column":2},"end":{"line":90,"column":3}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":92,"column":2},"end":{"line":92,"column":7}},"loc":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":96,"column":2},"end":{"line":96,"column":9}},"loc":{"start":{"line":96,"column":2},"end":{"line":98,"column":3}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":100,"column":2},"end":{"line":100,"column":9}},"loc":{"start":{"line":100,"column":2},"end":{"line":102,"column":3}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":104,"column":2},"end":{"line":104,"column":14}},"loc":{"start":{"line":104,"column":2},"end":{"line":106,"column":3}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":108,"column":2},"end":{"line":108,"column":7}},"loc":{"start":{"line":108,"column":33},"end":{"line":121,"column":3}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":123,"column":2},"end":{"line":123,"column":8}},"loc":{"start":{"line":123,"column":58},"end":{"line":164,"column":3}}},"17":{"name":"(anonymous_17)","decl":{"start":{"line":130,"column":20},"end":{"line":130,"column":21}},"loc":{"start":{"line":130,"column":44},"end":{"line":137,"column":5}}},"18":{"name":"(anonymous_18)","decl":{"start":{"line":131,"column":30},"end":{"line":131,"column":35}},"loc":{"start":{"line":131,"column":35},"end":{"line":131,"column":44}}},"19":{"name":"(anonymous_19)","decl":{"start":{"line":139,"column":45},"end":{"line":139,"column":46}},"loc":{"start":{"line":139,"column":56},"end":{"line":149,"column":5}}},"20":{"name":"(anonymous_20)","decl":{"start":{"line":151,"column":44},"end":{"line":151,"column":45}},"loc":{"start":{"line":151,"column":55},"end":{"line":161,"column":5}}},"21":{"name":"(anonymous_21)","decl":{"start":{"line":166,"column":2},"end":{"line":166,"column":17}},"loc":{"start":{"line":168,"column":31},"end":{"line":179,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":26},"end":{"line":29,"column":null}},"type":"if","locations":[{"start":{"line":29,"column":26},"end":{"line":29,"column":null}},{"start":{"line":29,"column":26},"end":{"line":29,"column":null}}]},"1":{"loc":{"start":{"line":31,"column":4},"end":{"line":34,"column":null}},"type":"if","locations":[{"start":{"line":31,"column":4},"end":{"line":34,"column":null}},{"start":{"line":31,"column":4},"end":{"line":34,"column":null}}]},"2":{"loc":{"start":{"line":36,"column":6},"end":{"line":37,"column":39}},"type":"switch","locations":[{"start":{"line":36,"column":6},"end":{"line":37,"column":39}},{"start":{"line":38,"column":6},"end":{"line":39,"column":39}},{"start":{"line":40,"column":6},"end":{"line":41,"column":39}},{"start":{"line":42,"column":6},"end":{"line":43,"column":39}},{"start":{"line":44,"column":6},"end":{"line":45,"column":35}}]},"3":{"loc":{"start":{"line":75,"column":6},"end":{"line":76,"column":42}},"type":"switch","locations":[{"start":{"line":75,"column":6},"end":{"line":76,"column":42}},{"start":{"line":77,"column":6},"end":{"line":78,"column":42}},{"start":{"line":79,"column":6},"end":{"line":80,"column":42}},{"start":{"line":81,"column":6},"end":{"line":82,"column":42}},{"start":{"line":83,"column":6},"end":{"line":84,"column":38}}]},"4":{"loc":{"start":{"line":110,"column":6},"end":{"line":111,"column":null}},"type":"switch","locations":[{"start":{"line":110,"column":6},"end":{"line":111,"column":null}},{"start":{"line":112,"column":6},"end":{"line":113,"column":null}},{"start":{"line":114,"column":6},"end":{"line":115,"column":null}},{"start":{"line":116,"column":6},"end":{"line":117,"column":null}},{"start":{"line":118,"column":6},"end":{"line":119,"column":null}}]},"5":{"loc":{"start":{"line":111,"column":29},"end":{"line":111,"column":34}},"type":"cond-expr","locations":[{"start":{"line":111,"column":29},"end":{"line":111,"column":34}},{"start":{"line":111,"column":37},"end":{"line":111,"column":43}}]},"6":{"loc":{"start":{"line":113,"column":29},"end":{"line":113,"column":35}},"type":"cond-expr","locations":[{"start":{"line":113,"column":29},"end":{"line":113,"column":35}},{"start":{"line":113,"column":38},"end":{"line":113,"column":45}}]},"7":{"loc":{"start":{"line":115,"column":29},"end":{"line":115,"column":37}},"type":"cond-expr","locations":[{"start":{"line":115,"column":29},"end":{"line":115,"column":37}},{"start":{"line":115,"column":40},"end":{"line":115,"column":49}}]},"8":{"loc":{"start":{"line":117,"column":29},"end":{"line":117,"column":37}},"type":"cond-expr","locations":[{"start":{"line":117,"column":29},"end":{"line":117,"column":37}},{"start":{"line":117,"column":40},"end":{"line":117,"column":49}}]},"9":{"loc":{"start":{"line":119,"column":29},"end":{"line":119,"column":42}},"type":"cond-expr","locations":[{"start":{"line":119,"column":29},"end":{"line":119,"column":42}},{"start":{"line":119,"column":45},"end":{"line":119,"column":59}}]},"10":{"loc":{"start":{"line":123,"column":31},"end":{"line":123,"column":null}},"type":"if","locations":[{"start":{"line":123,"column":31},"end":{"line":123,"column":null}},{"start":{"line":123,"column":31},"end":{"line":123,"column":null}}]},"11":{"loc":{"start":{"line":126,"column":63},"end":{"line":126,"column":67}},"type":"cond-expr","locations":[{"start":{"line":126,"column":63},"end":{"line":126,"column":67}},{"start":{"line":126,"column":67},"end":{"line":126,"column":69}}]},"12":{"loc":{"start":{"line":126,"column":24},"end":{"line":126,"column":67}},"type":"binary-expr","locations":[{"start":{"line":126,"column":24},"end":{"line":126,"column":67}},{"start":{"line":126,"column":63},"end":{"line":126,"column":67}}]},"13":{"loc":{"start":{"line":127,"column":64},"end":{"line":127,"column":68}},"type":"cond-expr","locations":[{"start":{"line":127,"column":64},"end":{"line":127,"column":68}},{"start":{"line":127,"column":68},"end":{"line":127,"column":70}}]},"14":{"loc":{"start":{"line":127,"column":25},"end":{"line":127,"column":68}},"type":"binary-expr","locations":[{"start":{"line":127,"column":25},"end":{"line":127,"column":68}},{"start":{"line":127,"column":64},"end":{"line":127,"column":68}}]},"15":{"loc":{"start":{"line":131,"column":6},"end":{"line":135,"column":null}},"type":"if","locations":[{"start":{"line":131,"column":6},"end":{"line":135,"column":null}},{"start":{"line":131,"column":6},"end":{"line":135,"column":null}}]},"16":{"loc":{"start":{"line":144,"column":6},"end":{"line":148,"column":null}},"type":"if","locations":[{"start":{"line":144,"column":6},"end":{"line":148,"column":null}},{"start":{"line":144,"column":6},"end":{"line":148,"column":null}}]},"17":{"loc":{"start":{"line":156,"column":6},"end":{"line":160,"column":null}},"type":"if","locations":[{"start":{"line":156,"column":6},"end":{"line":160,"column":null}},{"start":{"line":156,"column":6},"end":{"line":160,"column":null}}]},"18":{"loc":{"start":{"line":168,"column":4},"end":{"line":168,"column":null}},"type":"if","locations":[{"start":{"line":168,"column":4},"end":{"line":168,"column":null}},{"start":{"line":168,"column":4},"end":{"line":168,"column":null}}]},"19":{"loc":{"start":{"line":172,"column":4},"end":{"line":174,"column":null}},"type":"if","locations":[{"start":{"line":172,"column":4},"end":{"line":174,"column":null}},{"start":{"line":172,"column":4},"end":{"line":174,"column":null}}]},"20":{"loc":{"start":{"line":175,"column":4},"end":{"line":177,"column":null}},"type":"if","locations":[{"start":{"line":175,"column":4},"end":{"line":177,"column":null}},{"start":{"line":175,"column":4},"end":{"line":177,"column":null}}]}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":29,"10":1,"11":29,"12":29,"13":29,"14":0,"15":0,"16":29,"17":11,"18":6,"19":4,"20":4,"21":4,"22":1,"23":10,"24":1,"25":5,"26":1,"27":3,"28":1,"29":3,"30":1,"31":3,"32":1,"33":5,"34":1,"35":22,"36":4,"37":4,"38":5,"39":5,"40":4,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":10,"53":2,"54":2,"55":2,"56":2,"57":2,"58":1,"59":32,"60":61,"61":32,"62":32,"63":32,"64":32,"65":32,"66":160,"67":176,"68":42,"69":42,"70":42,"71":118,"72":32,"73":43,"74":43,"75":43,"76":43,"77":43,"78":43,"79":43,"80":5,"81":38,"82":32,"83":12,"84":12,"85":12,"86":12,"87":12,"88":12,"89":12,"90":5,"91":7,"92":32,"93":1,"94":55,"95":55,"96":55,"97":55,"98":5,"99":50,"100":3,"101":47,"102":1,"103":1},"f":{"0":1,"1":29,"2":29,"3":10,"4":5,"5":3,"6":3,"7":3,"8":5,"9":22,"10":1,"11":1,"12":1,"13":1,"14":1,"15":10,"16":32,"17":160,"18":176,"19":43,"20":12,"21":55},"b":{"0":[0,29],"1":[0,29],"2":[11,6,4,4,4],"3":[4,4,5,5,4],"4":[2,2,2,2,2],"5":[1,1],"6":[1,1],"7":[1,1],"8":[1,1],"9":[1,1],"10":[29,3],"11":[12,20],"12":[32,12],"13":[22,10],"14":[32,22],"15":[42,118],"16":[5,38],"17":[5,7],"18":[0,55],"19":[5,50],"20":[3,47]}} } diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html index be26fca..d6ddde1 100644 --- a/coverage/lcov-report/index.html +++ b/coverage/lcov-report/index.html @@ -23,30 +23,30 @@

All files

- 96.59% + 98.08% Statements - 85/88 + 102/104
- 87.5% + 94.12% Branches - 28/32 + 48/51
100% Functions - 17/17 + 22/22
- 96.47% + 97.89% Lines - 82/85 + 93/95
@@ -74,17 +74,17 @@

All files

index.ts - -
+ +
- 96.59% - 85/88 - 87.5% - 28/32 + 98.08% + 102/104 + 94.12% + 48/51 100% - 17/17 - 96.47% - 82/85 + 22/22 + 97.89% + 93/95 @@ -95,7 +95,7 @@

All files

diff --git a/coverage/lcov-report/index.ts.html b/coverage/lcov-report/index.ts.html index a1cfdd8..55654db 100644 --- a/coverage/lcov-report/index.ts.html +++ b/coverage/lcov-report/index.ts.html @@ -23,30 +23,30 @@

All files index.ts

- 96.59% + 98.08% Statements - 85/88 + 102/104
- 87.5% + 94.12% Branches - 28/32 + 48/51
100% Functions - 17/17 + 22/22
- 96.47% + 97.89% Lines - 82/85 + 93/95
@@ -215,7 +215,31 @@

All files index.ts

156 157 158 -159  +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +1801x +1x +  +        @@ -233,49 +257,51 @@

All files index.ts

  1x   +1x +      -21x +29x     -21x -21x -21x +29x +29x +29x       -21x +29x   -4x +11x   -8x +6x   -3x +4x   -3x +4x   -3x +4x       1x -3x +10x     1x -7x +5x     1x -2x +3x     1x -2x +3x     1x -2x +3x     1x @@ -283,17 +309,17 @@

All files index.ts

    1x -10x +22x   -2x +4x   -2x +4x   -2x +5x   -2x +5x   -2x +4x       @@ -317,68 +343,87 @@

All files index.ts

1x     -35x -18x -18x -  -18x -1x -1x -1x 1x +10x   +2x   -18x -14x -14x -14x -14x +2x   +2x   -18x -10x -10x -10x -10x +2x   +2x   -18x -6x -6x -6x -6x     -18x -3x -3x -3x +61x +32x   +32x +32x +32x   -18x +32x +176x +42x +42x +42x   +118x   -1x   -34x +32x +43x +43x +43x +43x +43x +5x +  +38x +    -34x -34x -34x -2x   32x -  +12x +12x +12x +12x +12x +5x +  +7x +  +    32x   +  1x - 
export type Unit = 'd' | 'h' | 'm' | 's' | 'i';
+ 
+55x
+ 
+55x
+55x
+55x
+5x
+ 
+50x
+3x
+ 
+47x
+ 
+1x
const units = <const> ['d' , 'h' , 'm' , 's', 'i']
+const remUnits = <const> ['D', 'H', 'M', 'S', 'I']
+export type Unit = typeof units[number];
+export type RemUnit = typeof remUnits[number]
  
 export interface FormatOptions {
   padStart?: {
     char: string;
-    count: number;
+    length: number;
   };
   leadingZero?: boolean;
 }
@@ -387,7 +432,9 @@ 

All files index.ts

S = I * 1000, M = S * 60, H = M * 60, -D = H * 24; + D = H * 24; +  +const U: {[K in RemUnit]: number} = {I, S, M, H, D}   export class Duration { private value: number; @@ -404,7 +451,7 @@

All files index.ts

} switch (unit) { case 'd': - return new Duration(value * D) + return new Duration(value * D); case 'h': return new Duration(value * H); case 'm': @@ -416,7 +463,7 @@

All files index.ts

} }   - static days(value: number){ + static days(value: number) { return Duration.from('d', value); }   @@ -474,44 +521,61 @@

All files index.ts

milliseconds() { return this.in('i'); } +  + units(value: number, unit: Unit): string { + switch(unit) { + case "d": + return value === 1 ? 'day' : 'days' + case "h": + return value === 1 ? 'hour' : 'hours' + case "m": + return value === 1 ? 'minute' : 'minutes' + case "s": + return value === 1 ? 'second' : 'seconds' + case "i": + return value === 1 ? 'millisecond' : 'milliseconds' + } + }   format(formatString: string, options: FormatOptions = {}) { let formattedString = formatString; - let remainingDuration = this.value;   - if (formatString.includes('d')) { - const days = Math.floor(remainingDuration / D); - remainingDuration = remainingDuration - days * D; - const str = Duration.applyFormatOptions(days, options); - formattedString = formattedString.replace(/d/, str); - } + const durationTokens = formatString.match(/{([dhmsi]o?)}/g) ?? [] + const remainingTokens = formatString.match(/{([DHMSI]o?)}/g) ?? [] + const remainingValues: {[K in RemUnit]: number} = {D:0, H:0, M:0, S:0, I:0}   - if (formatString.includes('h')) { - const hours = Math.floor(remainingDuration / H); - remainingDuration = remainingDuration - hours * H; - const str = Duration.applyFormatOptions(hours, options); - formattedString = formattedString.replace(/h/, str); - } + remUnits.reduce((remainingDuration, unit) => { + if(remainingTokens.some(token => token.includes(unit))) { + const value = Math.floor(remainingDuration / U[unit]) + remainingValues[unit] = value + return remainingDuration - value * U[unit] + } + return remainingDuration + }, this.value)   - if (formatString.includes('m')) { - const minutes = Math.floor(remainingDuration / M); - remainingDuration = remainingDuration - minutes * M; - const str = Duration.applyFormatOptions(minutes, options); - formattedString = formattedString.replace(/m/, str); - } + formattedString = remainingTokens.reduce((str, token) => { + const tag = token.slice(1, -1) + const [unit, withUnits] = tag.split('') + const value = remainingValues[unit as RemUnit] + const formattedValue = Duration.applyFormatOptions(value, options) + if(withUnits) { + return str.replace(new RegExp(token, 'g'), `${formattedValue} ${this.units(value, unit.toLowerCase() as Unit)}`) + } else { + return str.replace(new RegExp(token, 'g'), formattedValue) + } + }, formattedString)   - if (formatString.includes('s')) { - const seconds = Math.floor(remainingDuration / S); - remainingDuration = remainingDuration - seconds * S; - const str = Duration.applyFormatOptions(seconds, options); - formattedString = formattedString.replace(/s/, str); - } -  - if (formatString.includes('i')) { - const milliseconds = Math.floor(remainingDuration / I); - const str = Duration.applyFormatOptions(milliseconds, options); - formattedString = formattedString.replace(/i/, str); - } + formattedString = durationTokens.reduce((str, token) => { + const tag = token.slice(1, -1) + const [unit, withUnits] = tag.split('') + const value = this.in(unit as Unit) + const formattedValue = Duration.applyFormatOptions(value, options) + if(withUnits) { + return str.replace(new RegExp(token, 'g'), `${formattedValue} ${this.units(value, unit as Unit)}`) + } else { + return str.replace(new RegExp(token, 'g'), formattedValue) + } + }, formattedString)   return formattedString; } @@ -525,20 +589,19 @@

All files index.ts

if (options.leadingZero) { return string.padStart(2, '0'); } - Iif (padStart) { - return string.padStart(padStart.count, padStart.char); + if (padStart) { + return string.padStart(padStart.length, padStart.char); } return string; } -} - 
+}
diff --git a/coverage/lcov.info b/coverage/lcov.info index 890d39c..d5e8335 100644 --- a/coverage/lcov.info +++ b/coverage/lcov.info @@ -1,160 +1,199 @@ TN: SF:src/index.ts -FN:17,(anonymous_0) -FN:20,Duration -FN:24,(anonymous_2) -FN:44,(anonymous_3) -FN:48,(anonymous_4) -FN:52,(anonymous_5) -FN:56,(anonymous_6) -FN:60,(anonymous_7) -FN:64,(anonymous_8) -FN:68,(anonymous_9) -FN:83,(anonymous_10) -FN:87,(anonymous_11) -FN:91,(anonymous_12) -FN:95,(anonymous_13) -FN:99,(anonymous_14) -FN:103,(anonymous_15) -FN:144,(anonymous_16) -FNF:17 -FNH:17 +FN:22,(anonymous_0) +FN:25,Duration +FN:29,(anonymous_2) +FN:49,(anonymous_3) +FN:53,(anonymous_4) +FN:57,(anonymous_5) +FN:61,(anonymous_6) +FN:65,(anonymous_7) +FN:69,(anonymous_8) +FN:73,(anonymous_9) +FN:88,(anonymous_10) +FN:92,(anonymous_11) +FN:96,(anonymous_12) +FN:100,(anonymous_13) +FN:104,(anonymous_14) +FN:108,(anonymous_15) +FN:123,(anonymous_16) +FN:130,(anonymous_17) +FN:131,(anonymous_18) +FN:139,(anonymous_19) +FN:151,(anonymous_20) +FN:166,(anonymous_21) +FNF:22 +FNH:22 FNDA:1,(anonymous_0) -FNDA:21,Duration -FNDA:21,(anonymous_2) -FNDA:3,(anonymous_3) -FNDA:7,(anonymous_4) -FNDA:2,(anonymous_5) -FNDA:2,(anonymous_6) -FNDA:2,(anonymous_7) +FNDA:29,Duration +FNDA:29,(anonymous_2) +FNDA:10,(anonymous_3) +FNDA:5,(anonymous_4) +FNDA:3,(anonymous_5) +FNDA:3,(anonymous_6) +FNDA:3,(anonymous_7) FNDA:5,(anonymous_8) -FNDA:10,(anonymous_9) +FNDA:22,(anonymous_9) FNDA:1,(anonymous_10) FNDA:1,(anonymous_11) FNDA:1,(anonymous_12) FNDA:1,(anonymous_13) FNDA:1,(anonymous_14) -FNDA:18,(anonymous_15) -FNDA:34,(anonymous_16) -DA:11,1 -DA:12,1 -DA:13,1 +FNDA:10,(anonymous_15) +FNDA:32,(anonymous_16) +FNDA:160,(anonymous_17) +FNDA:176,(anonymous_18) +FNDA:43,(anonymous_19) +FNDA:12,(anonymous_20) +FNDA:55,(anonymous_21) +DA:1,1 +DA:2,1 DA:14,1 DA:15,1 +DA:16,1 DA:17,1 -DA:21,21 -DA:24,21 -DA:25,21 -DA:26,21 -DA:27,0 -DA:28,0 -DA:30,21 -DA:32,4 -DA:34,8 -DA:36,3 -DA:38,3 -DA:40,3 -DA:44,1 -DA:45,3 -DA:48,1 -DA:49,7 -DA:52,1 -DA:53,2 -DA:56,1 -DA:57,2 -DA:60,1 -DA:61,2 -DA:64,1 -DA:65,5 -DA:68,1 -DA:69,10 -DA:71,2 -DA:73,2 -DA:75,2 -DA:77,2 -DA:79,2 -DA:83,1 -DA:84,1 -DA:87,1 +DA:18,1 +DA:20,1 +DA:22,1 +DA:26,29 +DA:29,29 +DA:30,29 +DA:31,29 +DA:32,0 +DA:33,0 +DA:35,29 +DA:37,11 +DA:39,6 +DA:41,4 +DA:43,4 +DA:45,4 +DA:49,1 +DA:50,10 +DA:53,1 +DA:54,5 +DA:57,1 +DA:58,3 +DA:61,1 +DA:62,3 +DA:65,1 +DA:66,3 +DA:69,1 +DA:70,5 +DA:73,1 +DA:74,22 +DA:76,4 +DA:78,4 +DA:80,5 +DA:82,5 +DA:84,4 DA:88,1 -DA:91,1 +DA:89,1 DA:92,1 -DA:95,1 +DA:93,1 DA:96,1 -DA:99,1 +DA:97,1 DA:100,1 -DA:103,35 -DA:104,18 -DA:105,18 -DA:107,18 +DA:101,1 +DA:104,1 +DA:105,1 DA:108,1 -DA:109,1 -DA:110,1 -DA:111,1 -DA:114,18 -DA:115,14 -DA:116,14 -DA:117,14 -DA:118,14 -DA:121,18 -DA:122,10 -DA:123,10 -DA:124,10 -DA:125,10 -DA:128,18 -DA:129,6 -DA:130,6 -DA:131,6 -DA:132,6 -DA:135,18 -DA:136,3 -DA:137,3 -DA:138,3 -DA:141,18 -DA:144,1 -DA:146,34 -DA:148,34 -DA:149,34 -DA:150,34 -DA:151,2 -DA:153,32 -DA:154,0 -DA:156,32 -DA:158,1 -LF:85 -LH:82 -BRDA:24,0,0,0 -BRDA:24,0,1,21 -BRDA:26,1,0,0 -BRDA:26,1,1,21 -BRDA:31,2,0,4 -BRDA:31,2,1,8 -BRDA:31,2,2,3 -BRDA:31,2,3,3 -BRDA:31,2,4,3 -BRDA:70,3,0,2 -BRDA:70,3,1,2 -BRDA:70,3,2,2 -BRDA:70,3,3,2 -BRDA:70,3,4,2 -BRDA:103,4,0,17 -BRDA:103,4,1,1 -BRDA:107,5,0,1 -BRDA:107,5,1,17 -BRDA:114,6,0,14 -BRDA:114,6,1,4 -BRDA:121,7,0,10 -BRDA:121,7,1,8 -BRDA:128,8,0,6 -BRDA:128,8,1,12 -BRDA:135,9,0,3 -BRDA:135,9,1,15 -BRDA:146,10,0,0 -BRDA:146,10,1,34 -BRDA:150,11,0,2 -BRDA:150,11,1,32 -BRDA:153,12,0,0 -BRDA:153,12,1,32 -BRF:32 -BRH:28 +DA:109,10 +DA:111,2 +DA:113,2 +DA:115,2 +DA:117,2 +DA:119,2 +DA:123,61 +DA:124,32 +DA:126,32 +DA:127,32 +DA:128,32 +DA:130,32 +DA:131,176 +DA:132,42 +DA:133,42 +DA:134,42 +DA:136,118 +DA:139,32 +DA:140,43 +DA:141,43 +DA:142,43 +DA:143,43 +DA:144,43 +DA:145,5 +DA:147,38 +DA:151,32 +DA:152,12 +DA:153,12 +DA:154,12 +DA:155,12 +DA:156,12 +DA:157,5 +DA:159,7 +DA:163,32 +DA:166,1 +DA:168,55 +DA:170,55 +DA:171,55 +DA:172,55 +DA:173,5 +DA:175,50 +DA:176,3 +DA:178,47 +DA:180,1 +LF:95 +LH:93 +BRDA:29,0,0,0 +BRDA:29,0,1,29 +BRDA:31,1,0,0 +BRDA:31,1,1,29 +BRDA:36,2,0,11 +BRDA:36,2,1,6 +BRDA:36,2,2,4 +BRDA:36,2,3,4 +BRDA:36,2,4,4 +BRDA:75,3,0,4 +BRDA:75,3,1,4 +BRDA:75,3,2,5 +BRDA:75,3,3,5 +BRDA:75,3,4,4 +BRDA:110,4,0,2 +BRDA:110,4,1,2 +BRDA:110,4,2,2 +BRDA:110,4,3,2 +BRDA:110,4,4,2 +BRDA:111,5,0,1 +BRDA:111,5,1,1 +BRDA:113,6,0,1 +BRDA:113,6,1,1 +BRDA:115,7,0,1 +BRDA:115,7,1,1 +BRDA:117,8,0,1 +BRDA:117,8,1,1 +BRDA:119,9,0,1 +BRDA:119,9,1,1 +BRDA:123,10,0,29 +BRDA:123,10,1,3 +BRDA:126,11,0,12 +BRDA:126,11,1,20 +BRDA:126,12,0,32 +BRDA:126,12,1,12 +BRDA:127,13,0,22 +BRDA:127,13,1,10 +BRDA:127,14,0,32 +BRDA:127,14,1,22 +BRDA:131,15,0,42 +BRDA:131,15,1,118 +BRDA:144,16,0,5 +BRDA:144,16,1,38 +BRDA:156,17,0,5 +BRDA:156,17,1,7 +BRDA:168,18,0,0 +BRDA:168,18,1,55 +BRDA:172,19,0,5 +BRDA:172,19,1,50 +BRDA:175,20,0,3 +BRDA:175,20,1,47 +BRF:51 +BRH:48 end_of_record diff --git a/src/index.ts b/src/index.ts index de52d42..fb0e57c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,12 @@ -export type Unit = 'd' | 'h' | 'm' | 's' | 'i'; +const units = ['d' , 'h' , 'm' , 's', 'i'] +const remUnits = ['D', 'H', 'M', 'S', 'I'] +export type Unit = typeof units[number]; +export type RemUnit = typeof remUnits[number] export interface FormatOptions { padStart?: { char: string; - count: number; + length: number; }; leadingZero?: boolean; } @@ -14,6 +17,8 @@ const I = 1, H = M * 60, D = H * 24; +const U: {[K in RemUnit]: number} = {I, S, M, H, D} + export class Duration { private value: number; @@ -100,43 +105,60 @@ export class Duration { return this.in('i'); } - format(formatString: string, options: FormatOptions = {}) { - let formattedString = formatString; - let remainingDuration = this.value; - - if (formatString.includes('d')) { - const days = Math.floor(remainingDuration / D); - remainingDuration = remainingDuration - days * D; - const str = Duration.applyFormatOptions(days, options); - formattedString = formattedString.replace(/d/, str); - } - - if (formatString.includes('h')) { - const hours = Math.floor(remainingDuration / H); - remainingDuration = remainingDuration - hours * H; - const str = Duration.applyFormatOptions(hours, options); - formattedString = formattedString.replace(/h/, str); - } - - if (formatString.includes('m')) { - const minutes = Math.floor(remainingDuration / M); - remainingDuration = remainingDuration - minutes * M; - const str = Duration.applyFormatOptions(minutes, options); - formattedString = formattedString.replace(/m/, str); + units(value: number, unit: Unit): string { + switch(unit) { + case "d": + return value === 1 ? 'day' : 'days' + case "h": + return value === 1 ? 'hour' : 'hours' + case "m": + return value === 1 ? 'minute' : 'minutes' + case "s": + return value === 1 ? 'second' : 'seconds' + case "i": + return value === 1 ? 'millisecond' : 'milliseconds' } + } - if (formatString.includes('s')) { - const seconds = Math.floor(remainingDuration / S); - remainingDuration = remainingDuration - seconds * S; - const str = Duration.applyFormatOptions(seconds, options); - formattedString = formattedString.replace(/s/, str); - } + format(formatString: string, options: FormatOptions = {}) { + let formattedString = formatString; - if (formatString.includes('i')) { - const milliseconds = Math.floor(remainingDuration / I); - const str = Duration.applyFormatOptions(milliseconds, options); - formattedString = formattedString.replace(/i/, str); - } + const durationTokens = formatString.match(/{([dhmsi]o?)}/g) ?? [] + const remainingTokens = formatString.match(/{([DHMSI]o?)}/g) ?? [] + const remainingValues: {[K in RemUnit]: number} = {D:0, H:0, M:0, S:0, I:0} + + remUnits.reduce((remainingDuration, unit) => { + if(remainingTokens.some(token => token.includes(unit))) { + const value = Math.floor(remainingDuration / U[unit]) + remainingValues[unit] = value + return remainingDuration - value * U[unit] + } + return remainingDuration + }, this.value) + + formattedString = remainingTokens.reduce((str, token) => { + const tag = token.slice(1, -1) + const [unit, withUnits] = tag.split('') + const value = remainingValues[unit as RemUnit] + const formattedValue = Duration.applyFormatOptions(value, options) + if(withUnits) { + return str.replace(new RegExp(token, 'g'), `${formattedValue} ${this.units(value, unit.toLowerCase() as Unit)}`) + } else { + return str.replace(new RegExp(token, 'g'), formattedValue) + } + }, formattedString) + + formattedString = durationTokens.reduce((str, token) => { + const tag = token.slice(1, -1) + const [unit, withUnits] = tag.split('') + const value = this.in(unit as Unit) + const formattedValue = Duration.applyFormatOptions(value, options) + if(withUnits) { + return str.replace(new RegExp(token, 'g'), `${formattedValue} ${this.units(value, unit as Unit)}`) + } else { + return str.replace(new RegExp(token, 'g'), formattedValue) + } + }, formattedString) return formattedString; } @@ -151,8 +173,8 @@ export class Duration { return string.padStart(2, '0'); } if (padStart) { - return string.padStart(padStart.count, padStart.char); + return string.padStart(padStart.length, padStart.char); } return string; } -} +} \ No newline at end of file diff --git a/test/duration.test.ts b/test/duration.test.ts index 9b57f2e..4077f4c 100644 --- a/test/duration.test.ts +++ b/test/duration.test.ts @@ -2,7 +2,7 @@ import { Duration } from '../src'; const N = 2; describe('instantiation', () => { - test('Duration.hours', () => { + test('Duration.days', () => { const duration = Duration.days(N); expect(duration).toEqual(Duration.from('d', N)); expect(duration.valueOf()).toBe(N * 24 * 60 * 60 * 1000); @@ -58,40 +58,74 @@ describe('access', () => { }); describe('formatString', () => { - test('single units', () => { + test('single duration units', () => { const duration = Duration.days(2); - expect(duration.format('d')).toBe(String(2)); - expect(duration.format('h')).toBe(String(2 * 24)); - expect(duration.format('m')).toBe(String(2 * 24 * 60)); - expect(duration.format('s')).toBe(String(2 * 24 * 60 * 60)); - expect(duration.format('i')).toBe(String(2 * 24 * 60 * 60 * 1000)); + expect(duration.format('{d}')).toBe(String(2)); + expect(duration.format('{h}')).toBe(String(2 * 24)); + expect(duration.format('{m}')).toBe(String(2 * 24 * 60)); + expect(duration.format('{s}')).toBe(String(2 * 24 * 60 * 60)); + expect(duration.format('{i}')).toBe(String(2 * 24 * 60 * 60 * 1000)); }); - test('mixed units', () => { - const duration = Duration.hours(2.5373); - expect(duration.format('h')).toBe('2'); - expect(duration.format('h m')).toBe('2 32'); - expect(duration.format('h m s')).toBe('2 32 14'); - expect(duration.format('h m s i')).toBe('2 32 14 280'); + + test('single remaining units', () => { + const duration = Duration.days(2); + expect(duration.format('{D}')).toBe(String(2)); + expect(duration.format('{H}')).toBe(String(2 * 24)); + expect(duration.format('{M}')).toBe(String(2 * 24 * 60)); + expect(duration.format('{S}')).toBe(String(2 * 24 * 60 * 60)); + expect(duration.format('{I}')).toBe(String(2 * 24 * 60 * 60 * 1000)); }); - test('reversed mixed units', () => { - const duration = Duration.hours(2.5373); - expect(duration.format('h')).toBe('2'); - expect(duration.format('m h')).toBe('32 2'); - expect(duration.format('s m h')).toBe('14 32 2'); - expect(duration.format('i s m h')).toBe('280 14 32 2'); + + test('mixed remaining units', () => { + const duration = Duration.days(2.5373); + expect(duration.format('{D}')).toBe('2'); + expect(duration.format('{D} {H}')).toBe('2 12'); + expect(duration.format('{D} {H} {M}')).toBe('2 12 53'); + expect(duration.format('{D} {H} {M} {S}')).toBe('2 12 53 42'); + expect(duration.format('{D} {H} {M} {S} {I}')).toBe('2 12 53 42 720'); }); - test('wierd mixed units', () => { - const duration = Duration.hours(2.5373); - expect(duration.format('h h')).toBe('2 h'); - expect(duration.format('m h m')).toBe('32 2 m'); - expect(duration.format('s s s h')).toBe('1934 s s 2'); + + test('reversed remaining units', () => { + const duration = Duration.days(2.5373); + expect(duration.format('{I} {S} {M} {H} {D}')).toBe('720 42 53 12 2'); }); - test('with other chars', () => { + + test('wierd mixed units', () => { const duration = Duration.hours(2.5373); - expect(duration.format('h:m')).toBe('2:32'); + expect(duration.format('{H} hours')).toBe('2 hours'); + expect(duration.format('{M} {m}')).toBe('152 152'); + expect(duration.format('{M} {s} {M} {H}')).toBe('32 9134 32 2'); }); + test('with leading 0', () => { const duration = Duration.hours(2.03); - expect(duration.format('h:m', { leadingZero: true })).toBe('02:01'); + expect(duration.format('{H}:{M}', { leadingZero: true })).toBe('02:01'); }); + + test('single remaining units with unit string', () => { + const duration = Duration.days(2); + expect(duration.format('{Do}')).toBe("2 days"); + expect(duration.format('{Ho}')).toBe("48 hours"); + expect(duration.format('{Mo}')).toBe("2880 minutes"); + expect(duration.format('{So}')).toBe("172800 seconds"); + expect(duration.format('{Io}')).toBe("172800000 milliseconds"); + }); + + test('timer', () => { + const duration = Duration.days(2.34) + expect(duration.format("{H}:{M}:{S}", {leadingZero: true})).toBe("56:09:36") + }) + + test('padStart', () => { + const duration = Duration.days(2.34) + expect(duration.format("{H}:{M}:{S}", {padStart: {char: "X", length: 3}})).toBe("X56:XX9:X36") + }) + + test('single unit formatting', () => { + expect(Duration.days(1).format("{do}")).toBe("1 day") + expect(Duration.hours(1).format("{ho}")).toBe("1 hour") + expect(Duration.minutes(1).format("{mo}")).toBe("1 minute") + expect(Duration.seconds(1).format("{so}")).toBe("1 second") + expect(Duration.milliseconds(1).format("{io}")).toBe("1 millisecond") + }) });