assertron 7.1.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +56 -23
  2. package/{dist-es2015 → cjs}/assert-order/AssertOrder.d.ts +3 -2
  3. package/cjs/assert-order/AssertOrder.d.ts.map +1 -0
  4. package/cjs/assert-order/AssertOrder.js +148 -0
  5. package/cjs/assert-order/InvalidOrder.d.ts +10 -0
  6. package/cjs/assert-order/InvalidOrder.d.ts.map +1 -0
  7. package/cjs/assert-order/InvalidOrder.js +44 -0
  8. package/{dist-es5 → cjs}/assert-order/StateMachine.d.ts +4 -5
  9. package/cjs/assert-order/StateMachine.d.ts.map +1 -0
  10. package/cjs/assert-order/StateMachine.js +111 -0
  11. package/{dist-es2015 → cjs}/assert-order/index.d.ts +1 -0
  12. package/cjs/assert-order/index.d.ts.map +1 -0
  13. package/cjs/assert-order/index.js +6 -0
  14. package/{dist-es2015 → cjs}/assert-order/interfaces.d.ts +1 -0
  15. package/cjs/assert-order/interfaces.d.ts.map +1 -0
  16. package/cjs/assert-order/interfaces.js +3 -0
  17. package/{dist-es2015 → cjs}/assertron/assertron.d.ts +1 -0
  18. package/cjs/assertron/assertron.d.ts.map +1 -0
  19. package/cjs/assertron/assertron.js +32 -0
  20. package/{dist-es2015 → cjs}/assertron/falsy.d.ts +1 -0
  21. package/cjs/assertron/falsy.d.ts.map +1 -0
  22. package/cjs/assertron/falsy.js +11 -0
  23. package/cjs/assertron/index.d.ts +2 -0
  24. package/cjs/assertron/index.d.ts.map +1 -0
  25. package/cjs/assertron/index.js +5 -0
  26. package/{dist-es2015 → cjs}/assertron/pathEqual.d.ts +1 -0
  27. package/cjs/assertron/pathEqual.d.ts.map +1 -0
  28. package/cjs/assertron/pathEqual.js +13 -0
  29. package/{dist-es2015 → cjs}/assertron/rejects.d.ts +1 -0
  30. package/cjs/assertron/rejects.d.ts.map +1 -0
  31. package/cjs/assertron/rejects.js +14 -0
  32. package/{dist-es2015 → cjs}/assertron/repeat.d.ts +9 -0
  33. package/cjs/assertron/repeat.d.ts.map +1 -0
  34. package/cjs/assertron/repeat.js +44 -0
  35. package/{dist-es2015 → cjs}/assertron/resolves.d.ts +1 -0
  36. package/cjs/assertron/resolves.d.ts.map +1 -0
  37. package/cjs/assertron/resolves.js +17 -0
  38. package/cjs/assertron/satisfies.d.ts +10 -0
  39. package/cjs/assertron/satisfies.d.ts.map +1 -0
  40. package/cjs/assertron/satisfies.js +19 -0
  41. package/{dist-es2015 → cjs}/assertron/throws.d.ts +2 -0
  42. package/cjs/assertron/throws.d.ts.map +1 -0
  43. package/cjs/assertron/throws.js +62 -0
  44. package/{dist-es2015 → cjs}/assertron/truthy.d.ts +1 -0
  45. package/cjs/assertron/truthy.d.ts.map +1 -0
  46. package/cjs/assertron/truthy.js +11 -0
  47. package/{dist-es2015 → cjs}/errors/NotSatisfied.d.ts +1 -0
  48. package/cjs/errors/NotSatisfied.d.ts.map +1 -0
  49. package/cjs/errors/NotSatisfied.js +28 -0
  50. package/{dist-es5 → cjs}/errors/index.d.ts +1 -0
  51. package/cjs/errors/index.d.ts.map +1 -0
  52. package/cjs/errors/index.js +11 -0
  53. package/{dist-es2015 → cjs}/errors/interfaces.d.ts +1 -0
  54. package/cjs/errors/interfaces.d.ts.map +1 -0
  55. package/cjs/errors/interfaces.js +3 -0
  56. package/{dist-es2015 → cjs}/errors/notEqualMessage.d.ts +1 -0
  57. package/cjs/errors/notEqualMessage.d.ts.map +1 -0
  58. package/cjs/errors/notEqualMessage.js +8 -0
  59. package/{dist-es2015 → cjs}/errors/notRejectedMessage.d.ts +1 -0
  60. package/cjs/errors/notRejectedMessage.d.ts.map +1 -0
  61. package/cjs/errors/notRejectedMessage.js +8 -0
  62. package/{dist-es2015 → cjs}/errors/notThrownMessage.d.ts +1 -0
  63. package/cjs/errors/notThrownMessage.d.ts.map +1 -0
  64. package/cjs/errors/notThrownMessage.js +9 -0
  65. package/{dist-es2015 → cjs}/errors/returnNotRejectedMessage.d.ts +1 -0
  66. package/cjs/errors/returnNotRejectedMessage.d.ts.map +1 -0
  67. package/cjs/errors/returnNotRejectedMessage.js +8 -0
  68. package/{dist-es2015 → cjs}/errors/unexpectedErrorMessage.d.ts +1 -0
  69. package/cjs/errors/unexpectedErrorMessage.d.ts.map +1 -0
  70. package/cjs/errors/unexpectedErrorMessage.js +10 -0
  71. package/{dist-es2015 → cjs}/errors/util.d.ts +1 -0
  72. package/cjs/errors/util.d.ts.map +1 -0
  73. package/cjs/errors/util.js +8 -0
  74. package/{dist-es5 → cjs}/index.d.ts +1 -0
  75. package/cjs/index.d.ts.map +1 -0
  76. package/cjs/index.js +8 -0
  77. package/esm/assert-order/AssertOrder.js +132 -0
  78. package/esm/assert-order/InvalidOrder.js +31 -0
  79. package/esm/assert-order/StateMachine.js +103 -0
  80. package/esm/assert-order/index.js +3 -0
  81. package/esm/assert-order/interfaces.js +2 -0
  82. package/esm/assertron/assertron.js +28 -0
  83. package/esm/assertron/falsy.js +6 -0
  84. package/esm/assertron/index.js +2 -0
  85. package/esm/assertron/pathEqual.js +8 -0
  86. package/esm/assertron/rejects.js +9 -0
  87. package/esm/assertron/repeat.js +35 -0
  88. package/esm/assertron/resolves.js +12 -0
  89. package/esm/assertron/satisfies.js +14 -0
  90. package/esm/assertron/throws.js +57 -0
  91. package/esm/assertron/truthy.js +6 -0
  92. package/esm/errors/NotSatisfied.js +23 -0
  93. package/esm/errors/index.js +8 -0
  94. package/esm/errors/interfaces.js +2 -0
  95. package/esm/errors/notEqualMessage.js +4 -0
  96. package/esm/errors/notRejectedMessage.js +4 -0
  97. package/esm/errors/notThrownMessage.js +5 -0
  98. package/esm/errors/returnNotRejectedMessage.js +4 -0
  99. package/esm/errors/unexpectedErrorMessage.js +6 -0
  100. package/esm/errors/util.js +4 -0
  101. package/esm/index.js +5 -0
  102. package/package.json +63 -24
  103. package/src/assert-order/AssertOrder.spec.ts +0 -1
  104. package/src/assert-order/AssertOrder.ts +3 -3
  105. package/src/assert-order/InvalidOrder.ts +5 -8
  106. package/src/assert-order/StateMachine.ts +24 -28
  107. package/src/assert-order/interfaces.ts +5 -5
  108. package/src/assert-order/internalInterfaces.ts +3 -3
  109. package/src/assertron/assertron.spec.ts +3 -4
  110. package/src/assertron/assertron.ts +9 -9
  111. package/src/assertron/falsy.spec.ts +2 -2
  112. package/src/assertron/pathEqual.spec.ts +3 -3
  113. package/src/assertron/pathEqual.ts +3 -3
  114. package/src/assertron/rejects.spec.ts +7 -7
  115. package/src/assertron/rejects.ts +4 -6
  116. package/src/assertron/repeat.spec.ts +27 -1
  117. package/src/assertron/repeat.ts +27 -10
  118. package/src/assertron/resolves.spec.ts +4 -4
  119. package/src/assertron/resolves.ts +7 -10
  120. package/src/assertron/satisfies.spec.ts +8 -9
  121. package/src/assertron/satisfies.ts +15 -5
  122. package/src/assertron/throws.spec.ts +33 -13
  123. package/src/assertron/throws.ts +8 -5
  124. package/src/assertron/truthy.spec.ts +3 -3
  125. package/src/errors/NotSatisfied.ts +1 -1
  126. package/src/errors/interfaces.ts +1 -1
  127. package/src/errors/notThrownMessage.ts +3 -1
  128. package/src/errors/util.ts +2 -2
  129. package/src/testUtils.ts +17 -13
  130. package/dist-es2015/assert-order/AssertOrder.js +0 -132
  131. package/dist-es2015/assert-order/AssertOrder.js.map +0 -1
  132. package/dist-es2015/assert-order/InvalidOrder.d.ts +0 -8
  133. package/dist-es2015/assert-order/InvalidOrder.js +0 -31
  134. package/dist-es2015/assert-order/InvalidOrder.js.map +0 -1
  135. package/dist-es2015/assert-order/StateMachine.d.ts +0 -23
  136. package/dist-es2015/assert-order/StateMachine.js +0 -106
  137. package/dist-es2015/assert-order/StateMachine.js.map +0 -1
  138. package/dist-es2015/assert-order/index.js +0 -2
  139. package/dist-es2015/assert-order/index.js.map +0 -1
  140. package/dist-es2015/assert-order/interfaces.js +0 -1
  141. package/dist-es2015/assert-order/interfaces.js.map +0 -1
  142. package/dist-es2015/assertron/assertron.js +0 -28
  143. package/dist-es2015/assertron/assertron.js.map +0 -1
  144. package/dist-es2015/assertron/falsy.js +0 -6
  145. package/dist-es2015/assertron/falsy.js.map +0 -1
  146. package/dist-es2015/assertron/index.d.ts +0 -1
  147. package/dist-es2015/assertron/index.js +0 -2
  148. package/dist-es2015/assertron/index.js.map +0 -1
  149. package/dist-es2015/assertron/pathEqual.js +0 -8
  150. package/dist-es2015/assertron/pathEqual.js.map +0 -1
  151. package/dist-es2015/assertron/rejects.js +0 -10
  152. package/dist-es2015/assertron/rejects.js.map +0 -1
  153. package/dist-es2015/assertron/repeat.js +0 -21
  154. package/dist-es2015/assertron/repeat.js.map +0 -1
  155. package/dist-es2015/assertron/resolves.js +0 -12
  156. package/dist-es2015/assertron/resolves.js.map +0 -1
  157. package/dist-es2015/assertron/satisfies.d.ts +0 -5
  158. package/dist-es2015/assertron/satisfies.js +0 -14
  159. package/dist-es2015/assertron/satisfies.js.map +0 -1
  160. package/dist-es2015/assertron/throws.js +0 -55
  161. package/dist-es2015/assertron/throws.js.map +0 -1
  162. package/dist-es2015/assertron/truthy.js +0 -6
  163. package/dist-es2015/assertron/truthy.js.map +0 -1
  164. package/dist-es2015/errors/NotSatisfied.js +0 -23
  165. package/dist-es2015/errors/NotSatisfied.js.map +0 -1
  166. package/dist-es2015/errors/index.d.ts +0 -7
  167. package/dist-es2015/errors/index.js +0 -7
  168. package/dist-es2015/errors/index.js.map +0 -1
  169. package/dist-es2015/errors/interfaces.js +0 -1
  170. package/dist-es2015/errors/interfaces.js.map +0 -1
  171. package/dist-es2015/errors/notEqualMessage.js +0 -4
  172. package/dist-es2015/errors/notEqualMessage.js.map +0 -1
  173. package/dist-es2015/errors/notRejectedMessage.js +0 -4
  174. package/dist-es2015/errors/notRejectedMessage.js.map +0 -1
  175. package/dist-es2015/errors/notThrownMessage.js +0 -4
  176. package/dist-es2015/errors/notThrownMessage.js.map +0 -1
  177. package/dist-es2015/errors/returnNotRejectedMessage.js +0 -4
  178. package/dist-es2015/errors/returnNotRejectedMessage.js.map +0 -1
  179. package/dist-es2015/errors/unexpectedErrorMessage.js +0 -6
  180. package/dist-es2015/errors/unexpectedErrorMessage.js.map +0 -1
  181. package/dist-es2015/errors/util.js +0 -4
  182. package/dist-es2015/errors/util.js.map +0 -1
  183. package/dist-es2015/index.d.ts +0 -4
  184. package/dist-es2015/index.js +0 -5
  185. package/dist-es2015/index.js.map +0 -1
  186. package/dist-es5/assert-order/AssertOrder.d.ts +0 -40
  187. package/dist-es5/assert-order/AssertOrder.js +0 -147
  188. package/dist-es5/assert-order/AssertOrder.js.map +0 -1
  189. package/dist-es5/assert-order/InvalidOrder.d.ts +0 -8
  190. package/dist-es5/assert-order/InvalidOrder.js +0 -58
  191. package/dist-es5/assert-order/InvalidOrder.js.map +0 -1
  192. package/dist-es5/assert-order/StateMachine.js +0 -115
  193. package/dist-es5/assert-order/StateMachine.js.map +0 -1
  194. package/dist-es5/assert-order/index.d.ts +0 -2
  195. package/dist-es5/assert-order/index.js +0 -7
  196. package/dist-es5/assert-order/index.js.map +0 -1
  197. package/dist-es5/assert-order/interfaces.d.ts +0 -7
  198. package/dist-es5/assert-order/interfaces.js +0 -3
  199. package/dist-es5/assert-order/interfaces.js.map +0 -1
  200. package/dist-es5/assertron/assertron.d.ts +0 -20
  201. package/dist-es5/assertron/assertron.js +0 -33
  202. package/dist-es5/assertron/assertron.js.map +0 -1
  203. package/dist-es5/assertron/falsy.d.ts +0 -1
  204. package/dist-es5/assertron/falsy.js +0 -12
  205. package/dist-es5/assertron/falsy.js.map +0 -1
  206. package/dist-es5/assertron/index.d.ts +0 -1
  207. package/dist-es5/assertron/index.js +0 -7
  208. package/dist-es5/assertron/index.js.map +0 -1
  209. package/dist-es5/assertron/pathEqual.d.ts +0 -1
  210. package/dist-es5/assertron/pathEqual.js +0 -14
  211. package/dist-es5/assertron/pathEqual.js.map +0 -1
  212. package/dist-es5/assertron/rejects.d.ts +0 -1
  213. package/dist-es5/assertron/rejects.js +0 -16
  214. package/dist-es5/assertron/rejects.js.map +0 -1
  215. package/dist-es5/assertron/repeat.d.ts +0 -5
  216. package/dist-es5/assertron/repeat.js +0 -27
  217. package/dist-es5/assertron/repeat.js.map +0 -1
  218. package/dist-es5/assertron/resolves.d.ts +0 -1
  219. package/dist-es5/assertron/resolves.js +0 -18
  220. package/dist-es5/assertron/resolves.js.map +0 -1
  221. package/dist-es5/assertron/satisfies.d.ts +0 -5
  222. package/dist-es5/assertron/satisfies.js +0 -20
  223. package/dist-es5/assertron/satisfies.js.map +0 -1
  224. package/dist-es5/assertron/throws.d.ts +0 -4
  225. package/dist-es5/assertron/throws.js +0 -61
  226. package/dist-es5/assertron/throws.js.map +0 -1
  227. package/dist-es5/assertron/truthy.d.ts +0 -1
  228. package/dist-es5/assertron/truthy.js +0 -12
  229. package/dist-es5/assertron/truthy.js.map +0 -1
  230. package/dist-es5/errors/NotSatisfied.d.ts +0 -2
  231. package/dist-es5/errors/NotSatisfied.js +0 -26
  232. package/dist-es5/errors/NotSatisfied.js.map +0 -1
  233. package/dist-es5/errors/index.js +0 -12
  234. package/dist-es5/errors/index.js.map +0 -1
  235. package/dist-es5/errors/interfaces.d.ts +0 -2
  236. package/dist-es5/errors/interfaces.js +0 -3
  237. package/dist-es5/errors/interfaces.js.map +0 -1
  238. package/dist-es5/errors/notEqualMessage.d.ts +0 -1
  239. package/dist-es5/errors/notEqualMessage.js +0 -7
  240. package/dist-es5/errors/notEqualMessage.js.map +0 -1
  241. package/dist-es5/errors/notRejectedMessage.d.ts +0 -1
  242. package/dist-es5/errors/notRejectedMessage.js +0 -7
  243. package/dist-es5/errors/notRejectedMessage.js.map +0 -1
  244. package/dist-es5/errors/notThrownMessage.d.ts +0 -1
  245. package/dist-es5/errors/notThrownMessage.js +0 -7
  246. package/dist-es5/errors/notThrownMessage.js.map +0 -1
  247. package/dist-es5/errors/returnNotRejectedMessage.d.ts +0 -1
  248. package/dist-es5/errors/returnNotRejectedMessage.js +0 -7
  249. package/dist-es5/errors/returnNotRejectedMessage.js.map +0 -1
  250. package/dist-es5/errors/unexpectedErrorMessage.d.ts +0 -2
  251. package/dist-es5/errors/unexpectedErrorMessage.js +0 -9
  252. package/dist-es5/errors/unexpectedErrorMessage.js.map +0 -1
  253. package/dist-es5/errors/util.d.ts +0 -2
  254. package/dist-es5/errors/util.js +0 -7
  255. package/dist-es5/errors/util.js.map +0 -1
  256. package/dist-es5/index.js +0 -10
  257. package/dist-es5/index.js.map +0 -1
@@ -0,0 +1,132 @@
1
+ import { InvalidOrder } from './InvalidOrder';
2
+ import { StateMachine } from './StateMachine';
3
+ // order.atLeast(step, count) // expected to be executed at least `count` times
4
+ // order.atMost(step, count) // exected to be executed at most `count` times
5
+ export class AssertOrder {
6
+ constructor(plan) {
7
+ this.state = new StateMachine(plan);
8
+ }
9
+ /**
10
+ * Gets the current expecting step.
11
+ */
12
+ get currentStep() {
13
+ return this.state.step;
14
+ }
15
+ /**
16
+ * Asserts the current step is `step`.
17
+ * @param step expected step.
18
+ */
19
+ is(step) {
20
+ this.assert('is', step);
21
+ }
22
+ /**
23
+ * Asserts the current step is not `step`.
24
+ * @param step not expected step.
25
+ */
26
+ not(step) {
27
+ if (this.state.isValid(step)) {
28
+ throw new InvalidOrder(this.state.get(), 'not', this.not, step);
29
+ }
30
+ }
31
+ /**
32
+ * Reset to specified step.
33
+ */
34
+ jump(step) {
35
+ this.state.jump(step);
36
+ }
37
+ /**
38
+ * Move to next step.
39
+ */
40
+ move() {
41
+ this.state.move();
42
+ }
43
+ /**
44
+ * Asserts the specified step will run once.
45
+ */
46
+ once(step) {
47
+ this.assert('once', step);
48
+ this.state.move();
49
+ }
50
+ on(step, assert) {
51
+ this.state.on(step, () => {
52
+ assert(step);
53
+ });
54
+ }
55
+ atLeastOnce(step) {
56
+ const nextStep = step + 1;
57
+ if (this.state.step === step) {
58
+ this.state.move();
59
+ return this.state.moveSubStep();
60
+ }
61
+ else if (this.state.step === nextStep && this.state.subStep > 0) {
62
+ return this.state.moveSubStep();
63
+ }
64
+ else
65
+ throw new InvalidOrder(this.state.get(), 'atLeastOnce', this.atLeastOnce, step);
66
+ }
67
+ any(steps) {
68
+ const index = steps.indexOf(this.state.step);
69
+ if (index === -1)
70
+ throw new InvalidOrder(this.state.get(), 'any', this.any, steps);
71
+ this.state.move();
72
+ return steps[index];
73
+ }
74
+ onAny(steps, ...asserts) {
75
+ steps.forEach(step => {
76
+ this.state.on(step, () => {
77
+ let firstError;
78
+ let hasPass = false;
79
+ asserts.forEach(assert => {
80
+ try {
81
+ assert(step);
82
+ hasPass = true;
83
+ }
84
+ catch (err) {
85
+ if (!firstError)
86
+ firstError = err;
87
+ }
88
+ });
89
+ if (!hasPass)
90
+ throw firstError;
91
+ });
92
+ });
93
+ return;
94
+ }
95
+ end(timeout) {
96
+ if (timeout) {
97
+ return new Promise(r => {
98
+ setTimeout(r, timeout);
99
+ }).then(() => {
100
+ return this.end();
101
+ });
102
+ }
103
+ if (!this.state.isMaxStepDefined()) {
104
+ this.state.stopAccepting();
105
+ return this.state.getTimeTaken();
106
+ }
107
+ if (this.state.isAccepting()) {
108
+ throw new InvalidOrder(this.state.get(), 'end', this.end);
109
+ }
110
+ }
111
+ exactly(step, times) {
112
+ if (this.state.isNotValid(step))
113
+ throw new InvalidOrder(this.state.get(), 'exactly', this.exactly, step, times);
114
+ if (this.state.maxSubStep === undefined) {
115
+ this.state.maxSubStep = times;
116
+ this.state.minSubStep = times;
117
+ }
118
+ return this.state.moveSubStep();
119
+ }
120
+ wait(step, callback) {
121
+ if (callback)
122
+ this.on(step, callback);
123
+ else
124
+ return new Promise(a => { this.on(step, a); });
125
+ }
126
+ assert(method, step) {
127
+ if (this.state.isNotValid(step)) {
128
+ throw new InvalidOrder(this.state.get(), method, this[method], step);
129
+ }
130
+ }
131
+ }
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNzZXJ0T3JkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXJ0LW9yZGVyL0Fzc2VydE9yZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFN0MsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUU1RSxNQUFNLE9BQU8sV0FBVztJQVN0QixZQUFZLElBQWE7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBVkQ7O09BRUc7SUFDSCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFBO0lBQ3hCLENBQUM7SUFPRDs7O09BR0c7SUFDSCxFQUFFLENBQUMsSUFBWTtRQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQUMsSUFBWTtRQUNkLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUIsTUFBTSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO1NBQ2hFO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLElBQVk7UUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJO1FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFD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
@@ -0,0 +1,31 @@
1
+ import AssertionError from 'assertion-error';
2
+ export class InvalidOrder extends AssertionError {
3
+ constructor(state, method, ssf, ...args) {
4
+ const message = method === 'end' ? getEndMessage(state) : getExpectingMessage(state, method, args);
5
+ super(message, { method, state, args }, ssf);
6
+ }
7
+ }
8
+ function getEndMessage(state) {
9
+ return `Planned for ${state.maxStep} step but expecting step ${state.step} when 'end()' is called`;
10
+ }
11
+ function getExpectingMessage(state, method, args) {
12
+ return `Expecting ${getExpectingCalls(state)}, but received '${method}(${getMethodArgs(args)})'`;
13
+ }
14
+ function getExpectingCalls(state) {
15
+ let message;
16
+ if (state.subStep === 0) {
17
+ const methods = ['is', 'once', 'any'];
18
+ message = methods.map(m => ['any'].indexOf(m) === -1 ?
19
+ `'${m}(${state.step})'` :
20
+ `'${m}([${state.step}])'`).join(', ');
21
+ }
22
+ else {
23
+ const methods = ['exactly'];
24
+ message = methods.map(m => `'${m}(${state.step}, ${state.maxSubStep})'`).join(', ');
25
+ }
26
+ return message;
27
+ }
28
+ function getMethodArgs(args) {
29
+ return args.map(a => Array.isArray(a) ? `[${a.join(', ')}]` : a).join(', ');
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW52YWxpZE9yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fzc2VydC1vcmRlci9JbnZhbGlkT3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUE7QUFHNUMsTUFBTSxPQUFPLFlBQWEsU0FBUSxjQUE2RDtJQUM3RixZQUFZLEtBQVksRUFBRSxNQUFjLEVBQUUsR0FBNEIsRUFBRSxHQUFHLElBQVc7UUFDcEYsTUFBTSxPQUFPLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ2xHLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQzlDLENBQUM7Q0FDRjtBQUVELFNBQVMsYUFBYSxDQUFDLEtBQVk7SUFDakMsT0FBTyxlQUFlLEtBQUssQ0FBQyxPQUFPLDRCQUE0QixLQUFLLENBQUMsSUFBSSx5QkFBeUIsQ0FBQTtBQUNwRyxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxLQUFZLEVBQUUsTUFBYyxFQUFFLElBQVc7SUFDcEUsT0FBTyxhQUFhLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxtQkFBbUIsTUFBTSxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO0FBQ2xHLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEtBQVk7SUFDckMsSUFBSSxPQUFlLENBQUE7SUFDbkIsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLENBQUMsRUFBRTtRQUN2QixNQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDckMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FDMUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7S0FDYjtTQUNJO1FBQ0gsTUFBTSxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUMzQixPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0tBQ3BGO0lBQ0QsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLElBQVc7SUFDaEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUM3RSxDQUFDIn0=
@@ -0,0 +1,103 @@
1
+ import isNode from 'is-node';
2
+ // istanbul ignore next
3
+ function nodeVersionIsOrAbove(major, minor = 0, patch = 0) {
4
+ // without this, systemJS will complain `process is not defined`
5
+ if (!global.process)
6
+ return false;
7
+ const versionString = process.version.startsWith('v') ? process.version.slice(1) : process.version;
8
+ const [actualMajor, actualMinor, actualPatch] = versionString.split('.').map(s => parseInt(s, 10));
9
+ const checking = major * 1000 * 1000 + minor * 1000 + patch;
10
+ const actual = actualMajor * 1000 * 1000 + actualMinor * 1000 + actualPatch;
11
+ return actual >= checking;
12
+ }
13
+ // istanbul ignore next
14
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
15
+ const performance = isNode && nodeVersionIsOrAbove(8, 5) ? require('perf_hooks').performance : undefined;
16
+ let timeTracker;
17
+ // istanbul ignore else
18
+ if (process && typeof process.hrtime === 'function') {
19
+ let tick;
20
+ timeTracker = {
21
+ start() { tick = process.hrtime(); },
22
+ taken() {
23
+ const [second, nanoSecond] = process.hrtime(tick);
24
+ return second * 1000 + nanoSecond / 1e6;
25
+ }
26
+ };
27
+ }
28
+ else if (performance && typeof performance.now === 'function') {
29
+ let tick;
30
+ timeTracker = {
31
+ start() { tick = performance.now(); },
32
+ taken() { return performance.now() - tick; }
33
+ };
34
+ }
35
+ else {
36
+ let tick;
37
+ timeTracker = {
38
+ start() { tick = new Date().valueOf(); },
39
+ taken() { return new Date().valueOf() - tick; }
40
+ };
41
+ }
42
+ export class StateMachine {
43
+ constructor(maxStep) {
44
+ this.listeners = {};
45
+ this.step = 1;
46
+ this.subStep = 0;
47
+ this.maxStep = maxStep;
48
+ timeTracker.start();
49
+ }
50
+ jump(step) {
51
+ this.step = step;
52
+ this.subStep = 0;
53
+ return this.step;
54
+ }
55
+ move() {
56
+ const listeners = this.listeners[this.step];
57
+ this.step = this.step + 1;
58
+ this.subStep = 0;
59
+ if (listeners) {
60
+ listeners.forEach(l => l());
61
+ }
62
+ return this.step;
63
+ }
64
+ moveSubStep() {
65
+ const subStep = ++this.subStep;
66
+ if (this.maxSubStep === this.subStep)
67
+ this.move();
68
+ return subStep;
69
+ }
70
+ get() {
71
+ const { step, subStep, maxStep, minSubStep, maxSubStep } = this;
72
+ return {
73
+ step,
74
+ maxStep,
75
+ subStep,
76
+ minSubStep,
77
+ maxSubStep
78
+ };
79
+ }
80
+ on(step, listener) {
81
+ this.listeners[step] = [listener];
82
+ }
83
+ isNotValid(step) {
84
+ return step !== this.step || (this.maxStep !== undefined && this.maxStep < step);
85
+ }
86
+ isValid(step) {
87
+ return step === this.step;
88
+ }
89
+ isMaxStepDefined() {
90
+ return this.maxStep !== undefined;
91
+ }
92
+ stopAccepting() {
93
+ this.maxStep = this.step - 1;
94
+ }
95
+ isAccepting() {
96
+ // istanbul ignore next
97
+ return this.maxStep ? this.maxStep >= this.step : true;
98
+ }
99
+ getTimeTaken() {
100
+ return timeTracker.taken();
101
+ }
102
+ }
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhdGVNYWNoaW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fzc2VydC1vcmRlci9TdGF0ZU1hY2hpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sU0FBUyxDQUFBO0FBRzVCLHVCQUF1QjtBQUN2QixTQUFTLG9CQUFvQixDQUFDLEtBQWEsRUFBRSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDO0lBQy9ELGdFQUFnRTtJQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87UUFDakIsT0FBTyxLQUFLLENBQUE7SUFDZCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUE7SUFDbEcsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDbEcsTUFBTSxRQUFRLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUE7SUFDM0QsTUFBTSxNQUFNLEdBQUcsV0FBVyxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsV0FBVyxHQUFHLElBQUksR0FBRyxXQUFXLENBQUE7SUFDM0UsT0FBTyxNQUFNLElBQUksUUFBUSxDQUFBO0FBQzNCLENBQUM7QUFFRCx1QkFBdUI7QUFDdkIsOERBQThEO0FBQzlELE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtBQUV4RyxJQUFJLFdBQStDLENBQUE7QUFDbkQsdUJBQXVCO0FBQ3ZCLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7SUFDbkQsSUFBSSxJQUFzQixDQUFBO0lBQzFCLFdBQVcsR0FBRztRQUNaLEtBQUssS0FBSyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFBLENBQUMsQ0FBQztRQUNuQyxLQUFLO1lBQ0gsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2pELE9BQU8sTUFBTSxHQUFHLElBQUksR0FBRyxVQUFVLEdBQUcsR0FBRyxDQUFBO1FBQ3pDLENBQUM7S0FDRixDQUFBO0NBQ0Y7S0FDSSxJQUFJLFdBQVcsSUFBSSxPQUFPLFdBQVcsQ0FBQyxHQUFHLEtBQUssVUFBVSxFQUFFO0lBQzdELElBQUksSUFBWSxDQUFBO0lBQ2hCLFdBQVcsR0FBRztRQUNaLEtBQUssS0FBSyxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFBLENBQUMsQ0FBQztRQUNwQyxLQUFLLEtBQUssT0FBTyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBLENBQUMsQ0FBQztLQUM1QyxDQUFBO0NBQ0Y7S0FDSTtJQUNILElBQUksSUFBWSxDQUFBO0lBQ2hCLFdBQVcsR0FBRztRQUNaLEtBQUssS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUM7UUFDdkMsS0FBSyxLQUFLLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUEsQ0FBQyxDQUFDO0tBQy9DLENBQUE7Q0FDRjtBQUVELE1BQU0sT0FBTyxZQUFZO0lBUXZCLFlBQVksT0FBZ0I7UUFQNUIsY0FBUyxHQUFzQyxFQUFFLENBQUE7UUFDakQsU0FBSSxHQUFHLENBQUMsQ0FBQTtRQUdSLFlBQU8sR0FBRyxDQUFDLENBQUE7UUFJVCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDckIsQ0FBQztJQUNELElBQUksQ0FBQyxJQUFZO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUE7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUE7UUFDaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQ2xCLENBQUM7SUFDRCxJQUFJO1FBQ0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDM0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQTtRQUNoQixJQUFJLFNBQVMsRUFBRTtZQUNiLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1NBQzVCO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQ2xCLENBQUM7SUFDRCxXQUFXO1FBQ1QsTUFBTSxPQUFPLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFBO1FBQzlCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsT0FBTztZQUNsQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDYixPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBQ0QsR0FBRztRQUNELE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQy9ELE9BQU87WUFDTCxJQUFJO1lBQ0osT0FBTztZQUNQLE9BQU87WUFDUCxVQUFVO1lBQ1YsVUFBVTtTQUNYLENBQUE7SUFDSCxDQUFDO0lBQ0QsRUFBRSxDQUFDLElBQVksRUFBRSxRQUFvQjtRQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUNELFVBQVUsQ0FBQyxJQUFZO1FBQ3JCLE9BQU8sSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ2xGLENBQUM7SUFDRCxPQUFPLENBQUMsSUFBWTtRQUNsQixPQUFPLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQzNCLENBQUM7SUFDRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFBO0lBQ25DLENBQUM7SUFDRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBQ0QsV0FBVztRQUNULHVCQUF1QjtRQUN2QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQ3hELENBQUM7SUFDRCxZQUFZO1FBQ1YsT0FBTyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDNUIsQ0FBQztDQUNGIn0=
@@ -0,0 +1,3 @@
1
+ export * from './AssertOrder';
2
+ export * from './interfaces';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXJ0LW9yZGVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZUFBZSxDQUFBO0FBQzdCLGNBQWMsY0FBYyxDQUFBIn0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hc3NlcnQtb3JkZXIvaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,28 @@
1
+ import AssertionError from 'assertion-error';
2
+ import { falsy } from './falsy';
3
+ import { pathEqual } from './pathEqual';
4
+ import { rejects } from './rejects';
5
+ import { repeat } from './repeat';
6
+ import { resolves } from './resolves';
7
+ import { satisfies } from './satisfies';
8
+ import { throws } from './throws';
9
+ import { truthy } from './truthy';
10
+ export const assertron = {
11
+ false(value) {
12
+ if (value !== false)
13
+ throw new AssertionError(`Expected value to equal false, but received ${value}`, { value }, assertron.false);
14
+ },
15
+ falsy,
16
+ pathEqual,
17
+ rejects,
18
+ repeat,
19
+ resolves,
20
+ satisfies,
21
+ throws,
22
+ true(value) {
23
+ if (value !== true)
24
+ throw new AssertionError(`Expected value to equal true, but received ${value}`, { value }, assertron.true);
25
+ },
26
+ truthy
27
+ };
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0cm9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fzc2VydHJvbi9hc3NlcnRyb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3JDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRztJQUN2QixLQUFLLENBQUMsS0FBVTtRQUNkLElBQUksS0FBSyxLQUFLLEtBQUs7WUFDakIsTUFBTSxJQUFJLGNBQWMsQ0FDdEIsK0NBQStDLEtBQUssRUFBRSxFQUN0RCxFQUFFLEtBQUssRUFBRSxFQUNULFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN0QixDQUFDO0lBQ0QsS0FBSztJQUNMLFNBQVM7SUFDVCxPQUFPO0lBQ1AsTUFBTTtJQUNOLFFBQVE7SUFDUixTQUFTO0lBQ1QsTUFBTTtJQUNOLElBQUksQ0FBQyxLQUFVO1FBQ2IsSUFBSSxLQUFLLEtBQUssSUFBSTtZQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsOENBQThDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ2hJLENBQUM7SUFDRCxNQUFNO0NBQ1AsQ0FBQSJ9
@@ -0,0 +1,6 @@
1
+ import AssertionError from 'assertion-error';
2
+ export function falsy(value) {
3
+ if (value)
4
+ throw new AssertionError(`Expected value to be falsy, but received ${value}`, { value }, falsy);
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFsc3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXJ0cm9uL2ZhbHN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sY0FBYyxNQUFNLGlCQUFpQixDQUFBO0FBRTVDLE1BQU0sVUFBVSxLQUFLLENBQUMsS0FBVTtJQUM5QixJQUFJLEtBQUs7UUFDUCxNQUFNLElBQUksY0FBYyxDQUN0Qiw0Q0FBNEMsS0FBSyxFQUFFLEVBQ25ELEVBQUUsS0FBSyxFQUFFLEVBQ1QsS0FBSyxDQUNOLENBQUE7QUFDTCxDQUFDIn0=
@@ -0,0 +1,2 @@
1
+ export * from './assertron';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXJ0cm9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFBIn0=
@@ -0,0 +1,8 @@
1
+ import AssertionError from 'assertion-error';
2
+ import { pathEqual as isPathEqual } from 'path-equal';
3
+ import { notEqualMessage } from '../errors';
4
+ export function pathEqual(actual, expected) {
5
+ if (!isPathEqual(actual, expected))
6
+ throw new AssertionError(notEqualMessage(actual, expected), { actual, expected }, pathEqual);
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aEVxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fzc2VydHJvbi9wYXRoRXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxFQUFFLFNBQVMsSUFBSSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUUzQyxNQUFNLFVBQVUsU0FBUyxDQUFDLE1BQWMsRUFBRSxRQUFnQjtJQUN4RCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7UUFDaEMsTUFBTSxJQUFJLGNBQWMsQ0FDdEIsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFDakMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQ3BCLFNBQVMsQ0FBQyxDQUFBO0FBQ2hCLENBQUMifQ==
@@ -0,0 +1,9 @@
1
+ import { tersify } from 'tersify';
2
+ import AssertionError from 'assertion-error';
3
+ export function rejects(promise) {
4
+ return promise.then(value => {
5
+ throw new AssertionError(`Expected promise to reject, but it resolves with ${typeof value === 'string' ?
6
+ `'${value}'` : tersify(value, { maxLength: Infinity })}`, { value }, rejects);
7
+ }, () => { });
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVqZWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hc3NlcnRyb24vcmVqZWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ2pDLE9BQU8sY0FBYyxNQUFNLGlCQUFpQixDQUFBO0FBRTVDLE1BQU0sVUFBVSxPQUFPLENBQUMsT0FBcUI7SUFDM0MsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUNqQixLQUFLLENBQUMsRUFBRTtRQUNOLE1BQU0sSUFBSSxjQUFjLENBQ3RCLG9EQUFvRCxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQztZQUM3RSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFDMUQsRUFBRSxLQUFLLEVBQUUsRUFDVCxPQUFPLENBQUMsQ0FBQTtJQUNaLENBQUMsRUFDRCxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQ1YsQ0FBQTtBQUNILENBQUMifQ==
@@ -0,0 +1,35 @@
1
+ import isPromise from 'is-promise';
2
+ import AssertionError from 'assertion-error';
3
+ /**
4
+ * Repeat the specified function n times and return the last result.
5
+ * If the result is a promise, it will run the function sequentially.
6
+ */
7
+ export function repeat(fn, times) {
8
+ return repeatRecur(fn, 1, times);
9
+ }
10
+ function repeatRecur(fn, i, times) {
11
+ try {
12
+ const result = fn();
13
+ if (i === times)
14
+ return result;
15
+ if (isPromise(result)) {
16
+ return result.then(() => repeatRecur(fn, i + 1, times), (e) => { throw new FailOnOccurrence(i, e); });
17
+ }
18
+ else {
19
+ return repeatRecur(fn, i + 1, times);
20
+ }
21
+ }
22
+ catch (e) {
23
+ if (e instanceof FailOnOccurrence)
24
+ throw e;
25
+ throw new FailOnOccurrence(i, e);
26
+ }
27
+ }
28
+ export class FailOnOccurrence extends AssertionError {
29
+ constructor(occurrence, error) {
30
+ super(`Failed on ${occurrence} occurrence`);
31
+ this.occurrence = occurrence;
32
+ this.error = error;
33
+ }
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fzc2VydHJvbi9yZXBlYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sY0FBYyxNQUFNLGlCQUFpQixDQUFBO0FBRTVDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxNQUFNLENBQUksRUFBZ0MsRUFBRSxLQUFhO0lBQ3ZFLE9BQU8sV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFJLEVBQWdDLEVBQUUsQ0FBUyxFQUFFLEtBQWE7SUFDaEYsSUFBSTtRQUNGLE1BQU0sTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFBO1FBQ25CLElBQUksQ0FBQyxLQUFLLEtBQUs7WUFBRSxPQUFPLE1BQWEsQ0FBQTtRQUVyQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNyQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQ2hCLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsRUFDbkMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQ3JDLENBQUE7U0FDVDthQUNJO1lBQ0gsT0FBTyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUE7U0FDckM7S0FDRjtJQUNELE9BQU8sQ0FBQyxFQUFFO1FBQ1IsSUFBSSxDQUFDLFlBQVksZ0JBQWdCO1lBQUUsTUFBTSxDQUFDLENBQUE7UUFDMUMsTUFBTSxJQUFJLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtLQUNqQztBQUNILENBQUM7QUFFRCxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsY0FBc0M7SUFDMUUsWUFBbUIsVUFBa0IsRUFBUyxLQUFVO1FBQ3RELEtBQUssQ0FBQyxhQUFhLFVBQVUsYUFBYSxDQUFDLENBQUE7UUFEMUIsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUFTLFVBQUssR0FBTCxLQUFLLENBQUs7SUFFeEQsQ0FBQztDQUNGIn0=
@@ -0,0 +1,12 @@
1
+ import { tersify } from 'tersify';
2
+ import AssertionError from 'assertion-error';
3
+ export function resolves(promise) {
4
+ return promise.then(() => { }, error => {
5
+ throw new AssertionError(`Expected promise to resolve, but it rejects with ${typeof error === 'string' ?
6
+ `'${error}'` :
7
+ error instanceof Error ?
8
+ error :
9
+ tersify(error, { maxLength: Infinity })}`, { error }, resolves);
10
+ });
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXNzZXJ0cm9uL3Jlc29sdmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDakMsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUE7QUFFNUMsTUFBTSxVQUFVLFFBQVEsQ0FBQyxPQUFxQjtJQUM1QyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQ2pCLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFDVCxLQUFLLENBQUMsRUFBRTtRQUNOLE1BQU0sSUFBSSxjQUFjLENBQUMsb0RBQW9ELE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO1lBQ3RHLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNkLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQztnQkFDdEIsS0FBSyxDQUFDLENBQUM7Z0JBQ1AsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLENBQ2pFLENBQUE7SUFDSCxDQUFDLENBQ0YsQ0FBQTtBQUNILENBQUMifQ==
@@ -0,0 +1,14 @@
1
+ import AssertionError from 'assertion-error';
2
+ import { createSatisfier } from 'satisfier';
3
+ import { notSatisfiedMessage } from '../errors';
4
+ /**
5
+ * Check if `actual` satisfies criteria in `expected`.
6
+ * @param expected All properties can be a value which will be compared to the same property in `actual`, RegExp, or a predicate function that will be used to check against the property.
7
+ */
8
+ export function satisfies(actual, expected) {
9
+ const diff = createSatisfier(expected).exec(actual);
10
+ if (diff) {
11
+ throw new AssertionError(notSatisfiedMessage(diff), { diff }, satisfies);
12
+ }
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F0aXNmaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fzc2VydHJvbi9zYXRpc2ZpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUE7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUUzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFXL0M7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBUyxNQUFjLEVBQUUsUUFBb0M7SUFDcEYsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLFFBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRCxJQUFJLElBQUksRUFBRTtRQUNSLE1BQU0sSUFBSSxjQUFjLENBQ3RCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUN6QixFQUFFLElBQUksRUFBRSxFQUNSLFNBQVMsQ0FDVixDQUFBO0tBQ0Y7QUFDSCxDQUFDIn0=
@@ -0,0 +1,57 @@
1
+ import AssertionError from 'assertion-error';
2
+ import isPromise from 'is-promise';
3
+ import { notRejectedMessage, notThrownMessage, returnNotRejectedMessage, unexpectedErrorMessage } from '../errors';
4
+ import { isErrorConstructor } from '../errors/util';
5
+ export function throws(value, validator) {
6
+ if (typeof value !== 'function' && !isPromise(value)) {
7
+ throw new AssertionError('`assertron.throws()` must be called with a function or promise.', undefined, throws);
8
+ }
9
+ if (isPromise(value)) {
10
+ return value.then(value => {
11
+ throw new AssertionError(notRejectedMessage(value), { value }, throws);
12
+ }, err => {
13
+ validateError(validator, err);
14
+ return err;
15
+ });
16
+ }
17
+ const { threw, err, result } = tryCatch(value);
18
+ if (threw) {
19
+ validateError(validator, err);
20
+ return err;
21
+ }
22
+ if (isPromise(result)) {
23
+ return result.then(value => {
24
+ throw new AssertionError(returnNotRejectedMessage(value), { value }, throws);
25
+ }, err => {
26
+ validateError(validator, err);
27
+ return err;
28
+ });
29
+ }
30
+ throw new AssertionError(notThrownMessage(result), { value: result }, throws);
31
+ }
32
+ function tryCatch(fn) {
33
+ let result;
34
+ let err;
35
+ let threw = false;
36
+ try {
37
+ result = fn();
38
+ }
39
+ catch (e) {
40
+ err = e;
41
+ threw = true;
42
+ }
43
+ return { threw, err, result };
44
+ }
45
+ function validateError(validator, error) {
46
+ if (validator) {
47
+ if (isErrorConstructor(validator)) {
48
+ if (!(error instanceof validator))
49
+ throw new AssertionError(unexpectedErrorMessage(error, validator), { actual: error, expected: validator }, throws);
50
+ }
51
+ else if (!validator(error)) {
52
+ // console.log('msg:', unexpectedErrorMessage(error, validator))
53
+ throw new AssertionError(unexpectedErrorMessage(error, validator), { actual: error, expected: validator }, throws);
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyb3dzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fzc2VydHJvbi90aHJvd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBb0Msa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsd0JBQXdCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckosT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFNcEQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxLQUF3RCxFQUFFLFNBQWtEO0lBQ2pJLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3BELE1BQU0sSUFBSSxjQUFjLENBQ3RCLGlFQUFpRSxFQUNqRSxTQUFTLEVBQ1QsTUFBTSxDQUNQLENBQUE7S0FDRjtJQUVELElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FDZixLQUFLLENBQUMsRUFBRTtZQUNOLE1BQU0sSUFBSSxjQUFjLENBQ3RCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUN6QixFQUFFLEtBQUssRUFBRSxFQUNULE1BQU0sQ0FBQyxDQUFBO1FBQ1gsQ0FBQyxFQUNELEdBQUcsQ0FBQyxFQUFFO1lBQ0osYUFBYSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUM3QixPQUFPLEdBQUcsQ0FBQTtRQUNaLENBQUMsQ0FDRixDQUFBO0tBQ0Y7SUFDRCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDOUMsSUFBSSxLQUFLLEVBQUU7UUFDVCxhQUFhLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQzdCLE9BQU8sR0FBRyxDQUFBO0tBQ1g7SUFDRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNyQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQ2hCLEtBQUssQ0FBQyxFQUFFO1lBQ04sTUFBTSxJQUFJLGNBQWMsQ0FDdEIsd0JBQXdCLENBQUMsS0FBSyxDQUFDLEVBQy9CLEVBQUUsS0FBSyxFQUFFLEVBQ1QsTUFBTSxDQUFDLENBQUE7UUFDWCxDQUFDLEVBQ0QsR0FBRyxDQUFDLEVBQUU7WUFDSixhQUFhLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1lBQzdCLE9BQU8sR0FBRyxDQUFBO1FBQ1osQ0FBQyxDQUNGLENBQUE7S0FDRjtJQUVELE1BQU0sSUFBSSxjQUFjLENBQ3RCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUN4QixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFDakIsTUFBTSxDQUNQLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsRUFBYTtJQUM3QixJQUFJLE1BQU0sQ0FBQTtJQUNWLElBQUksR0FBRyxDQUFBO0lBQ1AsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ2pCLElBQUk7UUFDRixNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUE7S0FDZDtJQUNELE9BQU8sQ0FBQyxFQUFFO1FBQ1IsR0FBRyxHQUFHLENBQUMsQ0FBQTtRQUNQLEtBQUssR0FBRyxJQUFJLENBQUE7S0FDYjtJQUNELE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFBO0FBQy9CLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxTQUE2RCxFQUFFLEtBQVU7SUFDOUYsSUFBSSxTQUFTLEVBQUU7UUFDYixJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxTQUFTLENBQUM7Z0JBQy9CLE1BQU0sSUFBSSxjQUFjLENBQ3RCLHNCQUFzQixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFDeEMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFDdEMsTUFBTSxDQUNQLENBQUE7U0FDSjthQUNJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUIsZ0VBQWdFO1lBQ2hFLE1BQU0sSUFBSSxjQUFjLENBQ3RCLHNCQUFzQixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFDeEMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFDdEMsTUFBTSxDQUNQLENBQUE7U0FDRjtLQUNGO0FBQ0gsQ0FBQyJ9
@@ -0,0 +1,6 @@
1
+ import AssertionError from 'assertion-error';
2
+ export function truthy(value) {
3
+ if (!value)
4
+ throw new AssertionError(`Expected value to be truthy, but received ${value}`, { value }, truthy);
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1dGh5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fzc2VydHJvbi90cnV0aHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxjQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsTUFBTSxVQUFVLE1BQU0sQ0FBQyxLQUFVO0lBQy9CLElBQUksQ0FBQyxLQUFLO1FBQUUsTUFBTSxJQUFJLGNBQWMsQ0FDbEMsNkNBQTZDLEtBQUssRUFBRSxFQUNwRCxFQUFFLEtBQUssRUFBRSxFQUNULE1BQU0sQ0FDUCxDQUFBO0FBQ0gsQ0FBQyJ9
@@ -0,0 +1,23 @@
1
+ import { tersify } from 'tersify';
2
+ export function notSatisfiedMessage(entries) {
3
+ return entries.map(e => {
4
+ const path = formatPath(e.path);
5
+ return `Expect ${path} to satisfy ${formatValue(e.expected)}, but received ${formatValue(e.actual)}`;
6
+ }).join('\n');
7
+ }
8
+ function formatPath(entries) {
9
+ if (entries.length === 0)
10
+ return 'actual';
11
+ const nodes = [...entries];
12
+ if (isIndice(nodes[0])) {
13
+ nodes.unshift('actual');
14
+ }
15
+ return nodes.map(n => isIndice(n) ? `[${n}]` : '.' + n).join('').slice(1);
16
+ }
17
+ function isIndice(node) {
18
+ return typeof node === 'number';
19
+ }
20
+ function formatValue(value) {
21
+ return tersify(value);
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm90U2F0aXNmaWVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy9Ob3RTYXRpc2ZpZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVsQyxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBZTtJQUNqRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckIsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMvQixPQUFPLFVBQVUsSUFBSSxlQUFlLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGtCQUFrQixXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUE7SUFDdEcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ2YsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLE9BQTRCO0lBQzlDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQ3RCLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQTtJQUMxQixJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0tBQ3hCO0lBQ0QsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUMzRSxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsSUFBcUI7SUFDckMsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUE7QUFDakMsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQVU7SUFDN0IsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDdkIsQ0FBQyJ9
@@ -0,0 +1,8 @@
1
+ export * from './interfaces';
2
+ export * from './notEqualMessage';
3
+ export * from './notRejectedMessage';
4
+ export * from './NotSatisfied';
5
+ export * from './notThrownMessage';
6
+ export * from './returnNotRejectedMessage';
7
+ export * from './unexpectedErrorMessage';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJyb3JzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDBCQUEwQixDQUFDIn0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMvaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,4 @@
1
+ export function notEqualMessage(actual, expected) {
2
+ return `"${actual}" does not equal "${expected}".`;
3
+ }
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90RXF1YWxNZXNzYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy9ub3RFcXVhbE1lc3NhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFXLEVBQUUsUUFBYTtJQUN4RCxPQUFPLElBQUksTUFBTSxxQkFBcUIsUUFBUSxJQUFJLENBQUE7QUFDcEQsQ0FBQyJ9
@@ -0,0 +1,4 @@
1
+ export function notRejectedMessage(value) {
2
+ return `Expected promise to be rejected, but it was resolved instead '${value}'`;
3
+ }
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90UmVqZWN0ZWRNZXNzYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy9ub3RSZWplY3RlZE1lc3NhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQVU7SUFDM0MsT0FBTyxpRUFBaUUsS0FBSyxHQUFHLENBQUE7QUFDbEYsQ0FBQyJ9
@@ -0,0 +1,5 @@
1
+ import { tersify } from 'tersify';
2
+ export function notThrownMessage(value) {
3
+ return `Expect function to throw, but it returned '${tersify(value)}' instead.`;
4
+ }
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90VGhyb3duTWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMvbm90VGhyb3duTWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBRWpDLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFVO0lBQ3pDLE9BQU8sOENBQThDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFBO0FBQ2pGLENBQUMifQ==
@@ -0,0 +1,4 @@
1
+ export function returnNotRejectedMessage(value) {
2
+ return `Expected return promise to be rejected, but it was resolved instead '${value}'`;
3
+ }
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0dXJuTm90UmVqZWN0ZWRNZXNzYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy9yZXR1cm5Ob3RSZWplY3RlZE1lc3NhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLHdCQUF3QixDQUFDLEtBQVU7SUFDakQsT0FBTyx3RUFBd0UsS0FBSyxHQUFHLENBQUE7QUFDekYsQ0FBQyJ9
@@ -0,0 +1,6 @@
1
+ import { tersify } from 'tersify';
2
+ import { isErrorConstructor } from './util';
3
+ export function unexpectedErrorMessage(actual, expected) {
4
+ return `Unexpected error. Expecting '${isErrorConstructor(expected) ? expected.name : tersify(expected)}' but received ${tersify(actual)}`;
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5leHBlY3RlZEVycm9yTWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMvdW5leHBlY3RlZEVycm9yTWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWxDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUU1QyxNQUFNLFVBQVUsc0JBQXNCLENBQUMsTUFBVyxFQUFFLFFBQWdEO0lBQ2xHLE9BQU8sZ0NBQWdDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLGtCQUFrQixPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQTtBQUM1SSxDQUFDIn0=
@@ -0,0 +1,4 @@
1
+ export function isErrorConstructor(validator) {
2
+ return Object.prototype.isPrototypeOf.call(Error.prototype, validator.prototype);
3
+ }
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsa0JBQWtCLENBQUMsU0FBYztJQUMvQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtBQUNsRixDQUFDIn0=
package/esm/index.js ADDED
@@ -0,0 +1,5 @@
1
+ import { assertron } from './assertron';
2
+ export * from './assertron';
3
+ export * from './assert-order';
4
+ export default assertron;
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUV2QyxjQUFjLGFBQWEsQ0FBQTtBQUMzQixjQUFjLGdCQUFnQixDQUFBO0FBQzlCLGVBQWUsU0FBUyxDQUFBIn0=