@seethruhead/cra-payroll 0.8.1 → 0.8.3

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.
package/README.md CHANGED
@@ -1,36 +1,15 @@
1
- # cra-payroll
1
+ # @seethruhead/cra-payroll
2
2
 
3
3
  Calculate Canadian payroll deductions using CRA's [Payroll Deductions Online Calculator (PDOC)](https://apps.cra-arc.gc.ca/ebci/rhpd/beta/entry).
4
4
 
5
- Automates the CRA wizard via Playwright and returns your net pay, taxes, CPP, EI, and RRSP breakdown — per paycheck, monthly, or annually.
6
-
7
- ## Download
8
-
9
- Grab the latest binary for your platform from [**Releases**](https://github.com/SeeThruHead/cra-payroll/releases):
10
-
11
- | Platform | File |
12
- |----------|------|
13
- | macOS (Apple Silicon) | `cra-payroll-darwin-arm64` |
14
- | macOS (Intel) | `cra-payroll-darwin-x64` |
15
- | Linux (x64) | `cra-payroll-linux-x64` |
16
-
17
- ```bash
18
- # Example: macOS Apple Silicon
19
- curl -L -o cra-payroll https://github.com/SeeThruHead/cra-payroll/releases/latest/download/cra-payroll-darwin-arm64
20
- chmod +x cra-payroll
21
-
22
- # Remove macOS quarantine flag (unsigned binary)
23
- xattr -d com.apple.quarantine cra-payroll
24
-
25
- sudo mv cra-payroll /usr/local/bin/
26
- ```
5
+ Automates the CRA wizard via Puppeteer and returns your net pay, taxes, CPP, EI, and RRSP breakdown — per paycheck, monthly, or annually.
27
6
 
28
7
  > **Requires Google Chrome** — uses your system Chrome, no extra browser install needed.
29
8
 
30
- Or use the one-liner:
9
+ ## Install
31
10
 
32
11
  ```bash
33
- curl -fsSL https://raw.githubusercontent.com/SeeThruHead/cra-payroll/main/install.sh | bash
12
+ npm install -g @seethruhead/cra-payroll
34
13
  ```
35
14
 
36
15
  ## Usage
@@ -53,21 +32,12 @@ cra-payroll --salary 100000 --monthly
53
32
 
54
33
  # Combine them
55
34
  cra-payroll --salary 150000 --table --annual --monthly
56
-
57
- # Verbose logging
58
- cra-payroll -v --salary 100000
59
-
60
- # Check version
61
- cra-payroll --version
62
-
63
- # Self-update to latest release
64
- cra-payroll --update
65
35
  ```
66
36
 
67
37
  ### Example output (`--table`)
68
38
 
69
39
  ```
70
- 📊 Per-Paycheck Table (2026)
40
+ Per-Paycheck Table (2026)
71
41
  ══════════════════════════════════════════════════════════════════════════════════════════════
72
42
  # │ Gross │ Fed Tax │ Prov Tax │ CPP │ EI │ Net Pay │ Cum CPP/EI
73
43
  ──────────────────────────────────────────────────────────────────────────────────────────────
@@ -81,30 +51,28 @@ cra-payroll --update
81
51
 
82
52
  ## Config
83
53
 
84
- Config is loaded from the first file found:
85
- 1. `--config <path>`
86
- 2. `./config.json`
87
- 3. `~/.config/cra-payroll.json`
88
- 4. `~/.cra-payroll.json`
89
-
90
- CLI args override config file values. Missing values are prompted interactively.
54
+ Create `~/.config/cra-payroll.json`:
91
55
 
92
56
  ```json
93
57
  {
94
58
  "province": "Ontario",
95
59
  "annualSalary": 100000,
96
60
  "payPeriod": "Semi-monthly (24 pay periods a year)",
61
+ "year": 2026,
97
62
  "rrspEmployeePercent": 4,
98
63
  "rrspEmployerPercent": 4
99
64
  }
100
65
  ```
101
66
 
67
+ CLI args override config file values. Missing values are prompted interactively.
68
+
102
69
  ### Options
103
70
 
104
71
  | Option | CLI flag | Config key | Default |
105
72
  |--------|----------|------------|---------|
106
73
  | Province | `-p`, `--province` | `province` | `Ontario` |
107
74
  | Annual salary | `-s`, `--salary` | `annualSalary` | _(prompted)_ |
75
+ | Tax year | `-y`, `--year` | `year` | current year |
108
76
  | Pay period | `--pay-period` | `payPeriod` | `Semi-monthly (24)` |
109
77
  | Employee RRSP % | `--rrsp-employee` | `rrspEmployeePercent` | `4` |
110
78
  | Employer RRSP % | `--rrsp-employer` | `rrspEmployerPercent` | `4` |
@@ -114,69 +82,20 @@ CLI args override config file values. Missing values are prompted interactively.
114
82
  | Annual totals | `-a`, `--annual` | — | `false` |
115
83
  | Monthly averages | `-m`, `--monthly` | — | `false` |
116
84
  | Verbose | `-v`, `--verbose` | — | `false` |
117
- | Self-update | `--update` | — | — |
118
- | Show version | `--version` | — | — |
119
85
  | Headless | `--headless` | — | `false` |
120
86
  | Config path | `-c`, `--config` | — | — |
121
87
 
122
- ### 2026 CPP/EI Maximums (used for `--table`)
123
-
124
- | | Amount |
125
- |---|---|
126
- | CPP max contribution | $4,230.45 |
127
- | CPP2 max (additional) | $416.00 |
128
- | EI max premium | $1,123.07 |
129
-
130
- ## Run from source
131
-
132
- If you'd rather not download a binary, you can clone and run directly. You'll need [Google Chrome](https://www.google.com/chrome/) installed.
133
-
134
- ### With Bun
135
-
136
- ```bash
137
- git clone https://github.com/SeeThruHead/cra-payroll.git
138
- cd cra-payroll
139
- bun install
140
- bun run dev -- --salary 100000
141
- bun run dev -- --salary 150000 --table
142
- ```
143
-
144
- ### With Node
145
-
146
- ```bash
147
- git clone https://github.com/SeeThruHead/cra-payroll.git
148
- cd cra-payroll
149
- npm install
150
- npx tsx src/cli.ts --salary 100000
151
- npx tsx src/cli.ts --salary 150000 --table
152
- ```
153
-
154
- ## Development
155
-
156
- ```bash
157
- # Run directly
158
- bun run dev -- --salary 100000
159
-
160
- # Build standalone binary
161
- bun run build
162
-
163
- # Unit tests (fast, no browser)
164
- bun test
165
-
166
- # Integration tests (hits CRA, needs Chrome, may be flaky)
167
- bun run test:integration
168
-
169
- # All tests
170
- bun run test:all
171
- ```
172
-
173
88
  ## How it works
174
89
 
175
90
  1. Launches your system Chrome via Puppeteer (headed by default — CRA blocks headless)
176
91
  2. Fills out the PDOC wizard: province, pay period, salary, RRSP contributions
177
92
  3. Sets CPP/EI status and hits Calculate
178
93
  4. Scrapes the results page for taxes, deductions, and net pay
179
- 5. For `--table` mode: runs twice (with/without CPP/EI) and simulates each paycheck using the 2026 maximums
94
+ 5. For `--table` mode: runs twice (with/without CPP/EI) and simulates each paycheck using the annual maximums
95
+
96
+ ## Standalone binary
97
+
98
+ If you prefer a standalone binary without Node.js, see the [GitHub releases](https://github.com/SeeThruHead/cra-payroll/releases).
180
99
 
181
100
  ## License
182
101
 
package/README.md.bak ADDED
@@ -0,0 +1,183 @@
1
+ # cra-payroll
2
+
3
+ Calculate Canadian payroll deductions using CRA's [Payroll Deductions Online Calculator (PDOC)](https://apps.cra-arc.gc.ca/ebci/rhpd/beta/entry).
4
+
5
+ Automates the CRA wizard via Playwright and returns your net pay, taxes, CPP, EI, and RRSP breakdown — per paycheck, monthly, or annually.
6
+
7
+ ## Download
8
+
9
+ Grab the latest binary for your platform from [**Releases**](https://github.com/SeeThruHead/cra-payroll/releases):
10
+
11
+ | Platform | File |
12
+ |----------|------|
13
+ | macOS (Apple Silicon) | `cra-payroll-darwin-arm64` |
14
+ | macOS (Intel) | `cra-payroll-darwin-x64` |
15
+ | Linux (x64) | `cra-payroll-linux-x64` |
16
+
17
+ ```bash
18
+ # Example: macOS Apple Silicon
19
+ curl -L -o cra-payroll https://github.com/SeeThruHead/cra-payroll/releases/latest/download/cra-payroll-darwin-arm64
20
+ chmod +x cra-payroll
21
+
22
+ # Remove macOS quarantine flag (unsigned binary)
23
+ xattr -d com.apple.quarantine cra-payroll
24
+
25
+ sudo mv cra-payroll /usr/local/bin/
26
+ ```
27
+
28
+ > **Requires Google Chrome** — uses your system Chrome, no extra browser install needed.
29
+
30
+ Or use the one-liner:
31
+
32
+ ```bash
33
+ curl -fsSL https://raw.githubusercontent.com/SeeThruHead/cra-payroll/main/install.sh | bash
34
+ ```
35
+
36
+ ## Usage
37
+
38
+ ```bash
39
+ # Interactive — prompts for missing values
40
+ cra-payroll
41
+
42
+ # CLI args
43
+ cra-payroll --salary 120000 --province "British Columbia"
44
+
45
+ # Per-paycheck table for the year (tracks CPP/EI maxout)
46
+ cra-payroll --salary 150000 --table
47
+
48
+ # Annual totals
49
+ cra-payroll --salary 100000 --annual
50
+
51
+ # Monthly averages
52
+ cra-payroll --salary 100000 --monthly
53
+
54
+ # Combine them
55
+ cra-payroll --salary 150000 --table --annual --monthly
56
+
57
+ # Verbose logging
58
+ cra-payroll -v --salary 100000
59
+
60
+ # Check version
61
+ cra-payroll --version
62
+
63
+ # Self-update to latest release
64
+ cra-payroll --update
65
+ ```
66
+
67
+ ### Example output (`--table`)
68
+
69
+ ```
70
+ 📊 Per-Paycheck Table (2026)
71
+ ══════════════════════════════════════════════════════════════════════════════════════════════
72
+ # │ Gross │ Fed Tax │ Prov Tax │ CPP │ EI │ Net Pay │ Cum CPP/EI
73
+ ──────────────────────────────────────────────────────────────────────────────────────────────
74
+ 1 │ 6,250.00 │ 1,028.37 │ 612.45 │ 382.51 │ 102.08 │ 4,124.59 │ 484.59
75
+ 2 │ 6,250.00 │ 1,028.37 │ 612.45 │ 382.51 │ 102.08 │ 4,124.59 │ 969.18
76
+ ... │ ... │ ... │ ... │ ... │ ... │ ... │ ...
77
+ 11 │ 6,250.00 │ 1,028.37 │ 612.45 │ 112.50 │ 19.37 │ 4,477.31 │ 5,353.52 ← partial
78
+ 12 │ 6,250.00 │ 1,028.37 │ 612.45 │ 0.00 │ 0.00 │ 4,609.18 │ 5,353.52 ✓ maxed
79
+ ... │ ... │ ... │ ... │ ... │ ... │ ... │ ...
80
+ ```
81
+
82
+ ## Config
83
+
84
+ Config is loaded from the first file found:
85
+ 1. `--config <path>`
86
+ 2. `./config.json`
87
+ 3. `~/.config/cra-payroll.json`
88
+ 4. `~/.cra-payroll.json`
89
+
90
+ CLI args override config file values. Missing values are prompted interactively.
91
+
92
+ ```json
93
+ {
94
+ "province": "Ontario",
95
+ "annualSalary": 100000,
96
+ "payPeriod": "Semi-monthly (24 pay periods a year)",
97
+ "rrspEmployeePercent": 4,
98
+ "rrspEmployerPercent": 4
99
+ }
100
+ ```
101
+
102
+ ### Options
103
+
104
+ | Option | CLI flag | Config key | Default |
105
+ |--------|----------|------------|---------|
106
+ | Province | `-p`, `--province` | `province` | `Ontario` |
107
+ | Annual salary | `-s`, `--salary` | `annualSalary` | _(prompted)_ |
108
+ | Pay period | `--pay-period` | `payPeriod` | `Semi-monthly (24)` |
109
+ | Employee RRSP % | `--rrsp-employee` | `rrspEmployeePercent` | `4` |
110
+ | Employer RRSP % | `--rrsp-employer` | `rrspEmployerPercent` | `4` |
111
+ | CPP maxed | `--cpp-maxed` | `cppMaxedOut` | `false` |
112
+ | EI maxed | `--ei-maxed` | `eiMaxedOut` | `false` |
113
+ | Yearly table | `-t`, `--table` | — | `false` |
114
+ | Annual totals | `-a`, `--annual` | — | `false` |
115
+ | Monthly averages | `-m`, `--monthly` | — | `false` |
116
+ | Verbose | `-v`, `--verbose` | — | `false` |
117
+ | Self-update | `--update` | — | — |
118
+ | Show version | `--version` | — | — |
119
+ | Headless | `--headless` | — | `false` |
120
+ | Config path | `-c`, `--config` | — | — |
121
+
122
+ ### 2026 CPP/EI Maximums (used for `--table`)
123
+
124
+ | | Amount |
125
+ |---|---|
126
+ | CPP max contribution | $4,230.45 |
127
+ | CPP2 max (additional) | $416.00 |
128
+ | EI max premium | $1,123.07 |
129
+
130
+ ## Run from source
131
+
132
+ If you'd rather not download a binary, you can clone and run directly. You'll need [Google Chrome](https://www.google.com/chrome/) installed.
133
+
134
+ ### With Bun
135
+
136
+ ```bash
137
+ git clone https://github.com/SeeThruHead/cra-payroll.git
138
+ cd cra-payroll
139
+ bun install
140
+ bun run dev -- --salary 100000
141
+ bun run dev -- --salary 150000 --table
142
+ ```
143
+
144
+ ### With Node
145
+
146
+ ```bash
147
+ git clone https://github.com/SeeThruHead/cra-payroll.git
148
+ cd cra-payroll
149
+ npm install
150
+ npx tsx src/cli.ts --salary 100000
151
+ npx tsx src/cli.ts --salary 150000 --table
152
+ ```
153
+
154
+ ## Development
155
+
156
+ ```bash
157
+ # Run directly
158
+ bun run dev -- --salary 100000
159
+
160
+ # Build standalone binary
161
+ bun run build
162
+
163
+ # Unit tests (fast, no browser)
164
+ bun test
165
+
166
+ # Integration tests (hits CRA, needs Chrome, may be flaky)
167
+ bun run test:integration
168
+
169
+ # All tests
170
+ bun run test:all
171
+ ```
172
+
173
+ ## How it works
174
+
175
+ 1. Launches your system Chrome via Puppeteer (headed by default — CRA blocks headless)
176
+ 2. Fills out the PDOC wizard: province, pay period, salary, RRSP contributions
177
+ 3. Sets CPP/EI status and hits Calculate
178
+ 4. Scrapes the results page for taxes, deductions, and net pay
179
+ 5. For `--table` mode: runs twice (with/without CPP/EI) and simulates each paycheck using the 2026 maximums
180
+
181
+ ## License
182
+
183
+ MIT
@@ -39589,7 +39589,7 @@ var require_estraverse = __commonJS((exports) => {
39589
39589
  this.parent = parent;
39590
39590
  this.key = key;
39591
39591
  }
39592
- Reference.prototype.replace = function replace(node) {
39592
+ Reference.prototype.replace = function replace2(node) {
39593
39593
  this.parent[this.key] = node;
39594
39594
  };
39595
39595
  Reference.prototype.remove = function remove() {
@@ -39610,13 +39610,13 @@ var require_estraverse = __commonJS((exports) => {
39610
39610
  function Controller() {}
39611
39611
  Controller.prototype.path = function path() {
39612
39612
  var i, iz, j, jz, result, element;
39613
- function addToPath(result2, path) {
39614
- if (Array.isArray(path)) {
39615
- for (j = 0, jz = path.length;j < jz; ++j) {
39616
- result2.push(path[j]);
39613
+ function addToPath(result2, path2) {
39614
+ if (Array.isArray(path2)) {
39615
+ for (j = 0, jz = path2.length;j < jz; ++j) {
39616
+ result2.push(path2[j]);
39617
39617
  }
39618
39618
  } else {
39619
- result2.push(path);
39619
+ result2.push(path2);
39620
39620
  }
39621
39621
  }
39622
39622
  if (!this.__current.path) {
@@ -39704,7 +39704,7 @@ var require_estraverse = __commonJS((exports) => {
39704
39704
  }
39705
39705
  return false;
39706
39706
  }
39707
- Controller.prototype.traverse = function traverse(root, visitor) {
39707
+ Controller.prototype.traverse = function traverse2(root, visitor) {
39708
39708
  var worklist, leavelist, element, node, nodeType, ret, key, current, current2, candidates, candidate, sentinel;
39709
39709
  this.__initialize(root, visitor);
39710
39710
  sentinel = {};
@@ -39777,7 +39777,7 @@ var require_estraverse = __commonJS((exports) => {
39777
39777
  }
39778
39778
  }
39779
39779
  };
39780
- Controller.prototype.replace = function replace(root, visitor) {
39780
+ Controller.prototype.replace = function replace2(root, visitor) {
39781
39781
  var worklist, leavelist, node, nodeType, target, element, current, current2, candidates, candidate, sentinel, outer, key;
39782
39782
  function removeElem(element2) {
39783
39783
  var i, key2, nextElem, parent;
@@ -51531,12 +51531,12 @@ var require_path = __commonJS((exports, module) => {
51531
51531
  var types = fork.use(types_1.default);
51532
51532
  var isArray4 = types.builtInTypes.array;
51533
51533
  var isNumber2 = types.builtInTypes.number;
51534
- var Path = function Path(value, parentPath, name) {
51535
- if (!(this instanceof Path)) {
51534
+ var Path = function Path2(value, parentPath, name) {
51535
+ if (!(this instanceof Path2)) {
51536
51536
  throw new Error("Path constructor cannot be invoked without 'new'");
51537
51537
  }
51538
51538
  if (parentPath) {
51539
- if (!(parentPath instanceof Path)) {
51539
+ if (!(parentPath instanceof Path2)) {
51540
51540
  throw new Error("");
51541
51541
  }
51542
51542
  } else {
@@ -51592,14 +51592,14 @@ var require_path = __commonJS((exports, module) => {
51592
51592
  }
51593
51593
  }
51594
51594
  };
51595
- Pp.map = function map(callback, context2) {
51595
+ Pp.map = function map2(callback, context2) {
51596
51596
  var result = [];
51597
51597
  this.each(function(childPath) {
51598
51598
  result.push(callback.call(this, childPath));
51599
51599
  }, context2);
51600
51600
  return result;
51601
51601
  };
51602
- Pp.filter = function filter(callback, context2) {
51602
+ Pp.filter = function filter2(callback, context2) {
51603
51603
  var result = [];
51604
51604
  this.each(function(childPath) {
51605
51605
  if (callback.call(this, childPath)) {
@@ -51832,14 +51832,14 @@ var require_scope = __commonJS((exports, module) => {
51832
51832
  var Expression = namedTypes.Expression;
51833
51833
  var isArray4 = types.builtInTypes.array;
51834
51834
  var b = types.builders;
51835
- var Scope = function Scope(path, parentScope) {
51836
- if (!(this instanceof Scope)) {
51835
+ var Scope = function Scope2(path, parentScope) {
51836
+ if (!(this instanceof Scope2)) {
51837
51837
  throw new Error("Scope constructor cannot be invoked without 'new'");
51838
51838
  }
51839
51839
  ScopeType.assert(path.value);
51840
51840
  var depth;
51841
51841
  if (parentScope) {
51842
- if (!(parentScope instanceof Scope)) {
51842
+ if (!(parentScope instanceof Scope2)) {
51843
51843
  throw new Error("");
51844
51844
  }
51845
51845
  depth = parentScope.depth + 1;
@@ -52077,8 +52077,8 @@ var require_node_path = __commonJS((exports, module) => {
52077
52077
  var isArray4 = types.builtInTypes.array;
52078
52078
  var Path = fork.use(path_1.default);
52079
52079
  var Scope = fork.use(scope_1.default);
52080
- var NodePath = function NodePath(value, parentPath, name) {
52081
- if (!(this instanceof NodePath)) {
52080
+ var NodePath = function NodePath2(value, parentPath, name) {
52081
+ if (!(this instanceof NodePath2)) {
52082
52082
  throw new Error("NodePath constructor cannot be invoked without 'new'");
52083
52083
  }
52084
52084
  Path.call(this, value, parentPath, name);
@@ -52428,8 +52428,8 @@ var require_path_visitor = __commonJS((exports, module) => {
52428
52428
  var isObject = types.builtInTypes.object;
52429
52429
  var isFunction2 = types.builtInTypes.function;
52430
52430
  var undefined2;
52431
- var PathVisitor = function PathVisitor() {
52432
- if (!(this instanceof PathVisitor)) {
52431
+ var PathVisitor = function PathVisitor2() {
52432
+ if (!(this instanceof PathVisitor2)) {
52433
52433
  throw new Error("PathVisitor constructor cannot be invoked without 'new'");
52434
52434
  }
52435
52435
  this._reusableContextStack = [];
@@ -52466,8 +52466,8 @@ var require_path_visitor = __commonJS((exports, module) => {
52466
52466
  if (!isObject.check(methods)) {
52467
52467
  return new PathVisitor;
52468
52468
  }
52469
- var Visitor = function Visitor() {
52470
- if (!(this instanceof Visitor)) {
52469
+ var Visitor = function Visitor2() {
52470
+ if (!(this instanceof Visitor2)) {
52471
52471
  throw new Error("Visitor constructor cannot be invoked without 'new'");
52472
52472
  }
52473
52473
  PathVisitor.call(this);
@@ -55975,7 +55975,7 @@ var require_ffi_WASM_RELEASE_SYNC = __commonJS((exports) => {
55975
55975
 
55976
55976
  // node_modules/@tootallnate/quickjs-emscripten/dist/generated/emscripten-module.WASM_RELEASE_SYNC.js
55977
55977
  var require_emscripten_module_WASM_RELEASE_SYNC = __commonJS((exports, module) => {
55978
- var __dirname = "/Users/shanekeulen/code/cra-payroll/node_modules/@tootallnate/quickjs-emscripten/dist/generated", __filename = "/Users/shanekeulen/code/cra-payroll/node_modules/@tootallnate/quickjs-emscripten/dist/generated/emscripten-module.WASM_RELEASE_SYNC.js";
55978
+ var __dirname = "/repo/node_modules/@tootallnate/quickjs-emscripten/dist/generated", __filename = "/repo/node_modules/@tootallnate/quickjs-emscripten/dist/generated/emscripten-module.WASM_RELEASE_SYNC.js";
55979
55979
  var QuickJSRaw = (() => {
55980
55980
  var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : undefined;
55981
55981
  if (typeof __filename !== "undefined")
@@ -63233,7 +63233,7 @@ var require_tar_fs = __commonJS((exports) => {
63233
63233
  const statNext = statAll(xfs, opts.dereference ? xfs.stat : xfs.lstat, cwd, ignore, opts.entries, opts.sort);
63234
63234
  const strict = opts.strict !== false;
63235
63235
  const umask = typeof opts.umask === "number" ? ~opts.umask : ~processUmask();
63236
- const pack = opts.pack || tar.pack();
63236
+ const pack2 = opts.pack || tar.pack();
63237
63237
  const finish = opts.finish || noop2;
63238
63238
  let map2 = opts.map || noop2;
63239
63239
  let dmode = typeof opts.dmode === "number" ? opts.dmode : 0;
@@ -63252,20 +63252,20 @@ var require_tar_fs = __commonJS((exports) => {
63252
63252
  function onsymlink(filename, header) {
63253
63253
  xfs.readlink(path7.join(cwd, filename), function(err2, linkname) {
63254
63254
  if (err2)
63255
- return pack.destroy(err2);
63255
+ return pack2.destroy(err2);
63256
63256
  header.linkname = normalize(linkname);
63257
- pack.entry(header, onnextentry);
63257
+ pack2.entry(header, onnextentry);
63258
63258
  });
63259
63259
  }
63260
63260
  function onstat(err2, filename, stat) {
63261
- if (pack.destroyed)
63261
+ if (pack2.destroyed)
63262
63262
  return;
63263
63263
  if (err2)
63264
- return pack.destroy(err2);
63264
+ return pack2.destroy(err2);
63265
63265
  if (!filename) {
63266
63266
  if (opts.finalize !== false)
63267
- pack.finalize();
63268
- return finish(pack);
63267
+ pack2.finalize();
63268
+ return finish(pack2);
63269
63269
  }
63270
63270
  if (stat.isSocket())
63271
63271
  return onnextentry();
@@ -63282,7 +63282,7 @@ var require_tar_fs = __commonJS((exports) => {
63282
63282
  header.size = 0;
63283
63283
  header.type = "directory";
63284
63284
  header = map2(header) || header;
63285
- return pack.entry(header, onnextentry);
63285
+ return pack2.entry(header, onnextentry);
63286
63286
  }
63287
63287
  if (stat.isSymbolicLink()) {
63288
63288
  header.size = 0;
@@ -63293,10 +63293,10 @@ var require_tar_fs = __commonJS((exports) => {
63293
63293
  header = map2(header) || header;
63294
63294
  if (!stat.isFile()) {
63295
63295
  if (strict)
63296
- return pack.destroy(new Error("unsupported type for " + filename));
63296
+ return pack2.destroy(new Error("unsupported type for " + filename));
63297
63297
  return onnextentry();
63298
63298
  }
63299
- const entry = pack.entry(header, onnextentry);
63299
+ const entry = pack2.entry(header, onnextentry);
63300
63300
  const rs = mapStream(xfs.createReadStream(path7.join(cwd, filename), { start: 0, end: header.size > 0 ? header.size - 1 : header.size }), header);
63301
63301
  rs.on("error", function(err3) {
63302
63302
  entry.destroy(err3);
@@ -63305,10 +63305,10 @@ var require_tar_fs = __commonJS((exports) => {
63305
63305
  }
63306
63306
  function onnextentry(err2) {
63307
63307
  if (err2)
63308
- return pack.destroy(err2);
63308
+ return pack2.destroy(err2);
63309
63309
  statNext(onstat);
63310
63310
  }
63311
- return pack;
63311
+ return pack2;
63312
63312
  };
63313
63313
  function head(list) {
63314
63314
  return list.length ? list[list.length - 1] : null;
@@ -63329,7 +63329,7 @@ var require_tar_fs = __commonJS((exports) => {
63329
63329
  const ignore = opts.ignore || opts.filter || noop2;
63330
63330
  const mapStream = opts.mapStream || echo;
63331
63331
  const own = opts.chown !== false && !win32 && processGetuid() === 0;
63332
- const extract = opts.extract || tar.extract();
63332
+ const extract2 = opts.extract || tar.extract();
63333
63333
  const stack = [];
63334
63334
  const now = new Date;
63335
63335
  const umask = typeof opts.umask === "number" ? ~opts.umask : ~processUmask();
@@ -63348,10 +63348,10 @@ var require_tar_fs = __commonJS((exports) => {
63348
63348
  dmode |= parseInt(333, 8);
63349
63349
  fmode |= parseInt(222, 8);
63350
63350
  }
63351
- extract.on("entry", onentry);
63351
+ extract2.on("entry", onentry);
63352
63352
  if (opts.finish)
63353
- extract.on("finish", opts.finish);
63354
- return extract;
63353
+ extract2.on("finish", opts.finish);
63354
+ return extract2;
63355
63355
  function onentry(header, stream, next) {
63356
63356
  header = map2(header) || header;
63357
63357
  header.name = normalize(header.name);
@@ -66245,14 +66245,14 @@ function usage(yargs, shim2) {
66245
66245
  const logger = yargs.getInternalMethods().getLoggerInstance();
66246
66246
  if (fails.length) {
66247
66247
  for (let i = fails.length - 1;i >= 0; --i) {
66248
- const fail = fails[i];
66249
- if (isBoolean(fail)) {
66248
+ const fail2 = fails[i];
66249
+ if (isBoolean(fail2)) {
66250
66250
  if (err2)
66251
66251
  throw err2;
66252
66252
  else if (msg)
66253
66253
  throw Error(msg);
66254
66254
  } else {
66255
- fail(msg, err2, self2);
66255
+ fail2(msg, err2, self2);
66256
66256
  }
66257
66257
  }
66258
66258
  } else {
@@ -66309,7 +66309,7 @@ function usage(yargs, shim2) {
66309
66309
  examples.push([cmd, description || ""]);
66310
66310
  };
66311
66311
  let commands = [];
66312
- self2.command = function command(cmd, description, isDefault, aliases, deprecated = false) {
66312
+ self2.command = function command2(cmd, description, isDefault, aliases, deprecated = false) {
66313
66313
  if (isDefault) {
66314
66314
  commands = commands.map((cmdArray) => {
66315
66315
  cmdArray[2] = false;
@@ -79067,7 +79067,7 @@ var formMethods = (page) => ({
79067
79067
  btn.click();
79068
79068
  return true;
79069
79069
  }, { timeout: ACTION_TIMEOUT }, textMatch).then(() => {}), `click "${textMatch}"`),
79070
- selectByLabel: async (labelMatch, optionText) => safe(page.evaluate((match, text) => {
79070
+ selectByLabel: async (labelMatch, optionText) => safe(page.waitForFunction((match, text) => {
79071
79071
  const fireChangeEvents = (el) => {
79072
79072
  el.dispatchEvent(new Event("change", { bubbles: true }));
79073
79073
  el.dispatchEvent(new Event("input", { bubbles: true }));
@@ -79079,14 +79079,14 @@ var formMethods = (page) => ({
79079
79079
  if (label.includes(match) || title.includes(match)) {
79080
79080
  const opt = Array.from(s.options).find((o) => o.text.includes(text));
79081
79081
  if (!opt)
79082
- throw new Error(`Option "${text}" not found in "${match}"`);
79082
+ return false;
79083
79083
  s.value = opt.value;
79084
79084
  fireChangeEvents(s);
79085
- return;
79085
+ return true;
79086
79086
  }
79087
79087
  }
79088
- throw new Error(`Select "${match}" not found`);
79089
- }, labelMatch, optionText), `select ${labelMatch}="${optionText}"`),
79088
+ return false;
79089
+ }, { timeout: ACTION_TIMEOUT }, labelMatch, optionText).then(() => {}), `select ${labelMatch}="${optionText}"`),
79090
79090
  selectYear: async (year) => safe(page.evaluate((y) => {
79091
79091
  const fireChangeEvents = (el) => {
79092
79092
  el.dispatchEvent(new Event("change", { bubbles: true }));
@@ -79638,7 +79638,7 @@ import { existsSync as existsSync4, renameSync, unlinkSync, chmodSync } from "fs
79638
79638
  // package.json
79639
79639
  var package_default = {
79640
79640
  name: "@seethruhead/cra-payroll",
79641
- version: "0.8.1",
79641
+ version: "0.8.3",
79642
79642
  description: "Calculate Canadian payroll deductions using CRA's Payroll Deductions Online Calculator",
79643
79643
  type: "module",
79644
79644
  bin: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seethruhead/cra-payroll",
3
- "version": "0.8.1",
3
+ "version": "0.8.3",
4
4
  "description": "Calculate Canadian payroll deductions using CRA's Payroll Deductions Online Calculator",
5
5
  "type": "module",
6
6
  "bin": {