Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1207 commits
Select commit Hold shift + click to select a range
3bb6239
ABN-533: the checkout-config subtree withholds only on a rejected key
dgjlindsay Sep 9, 2026
f1a2aee
ABN-533: the order-intent and lookup routes stop refusing on a blip
dgjlindsay Sep 9, 2026
a17620d
ABN-533: review round - gate before the identity read, scope it to th…
dgjlindsay Sep 9, 2026
e5c0e20
ABN-533: review round - one normaliser, and it cannot fatal on a bad …
dgjlindsay Sep 9, 2026
e86983c
ABN-533: drop an is_array guard no test can kill
dgjlindsay Sep 9, 2026
7518289
ABN-533: say what identityFrom actually promises
dgjlindsay Sep 9, 2026
394f1cc
Merge pull request #482 from two-inc/doug/ABN-533-config-provider-gate
dgjlindsay Sep 9, 2026
c7b74a3
ABN-544: no default term is invented when the merchant offers none
dgjlindsay Sep 9, 2026
0538859
ABN-544: pin the checkout-config and totals seams for a missing defau…
dgjlindsay Sep 9, 2026
740b415
ABN-544: drop a stray docblock and a duplicate config read from the n…
dgjlindsay Sep 9, 2026
9544959
ABN-544: rewire the new config-provider test onto the merchant-identi…
dgjlindsay Sep 9, 2026
11eff1d
Merge pull request #484 from two-inc/doug/ABN-544-no-invented-term
dgjlindsay Sep 9, 2026
9b8ab42
fix(ABN-497): enforce the surcharge tax treatment on every brand's ad…
dgjlindsay Sep 9, 2026
08b6897
fix(ABN-497): review round 1 — never refuse a save the treatment fiel…
dgjlindsay Sep 9, 2026
a2ea190
fix: read the merchant record at the scope the admin form is editing …
dgjlindsay Sep 9, 2026
0a393f6
fix: verify the API key panel at its form's scope, keep the FX store …
dgjlindsay Sep 9, 2026
1b191c5
test: align the api-key status doubles with the scope parameter (ABN-…
dgjlindsay Sep 9, 2026
19d5914
docs(comments): cite the requirement, not a person
dgjlindsay Sep 9, 2026
62c6002
i18n(ABN-492): translate other-charges refund refusals
dgjlindsay Sep 9, 2026
91f410d
Merge pull request #477 from two-inc/doug/ABN-497-surcharge-tax-treat…
dgjlindsay Sep 9, 2026
f7aea40
Merge pull request #485 from two-inc/doug/ABN-530-admin-scope-threading
dgjlindsay Sep 9, 2026
d6836a5
Merge pull request #487 from two-inc/doug/ABN-492-other-charges-i18n
dgjlindsay Sep 9, 2026
0f9a1f7
Merge pull request #486 from two-inc/doug/comment-scrub-authority
dgjlindsay Sep 9, 2026
76209d2
ABN-518: tell the merchant why the payment method is absent from chec…
dgjlindsay Sep 9, 2026
e709e65
ABN-518: report the scope's own verdict, both minimum floors, and the…
dgjlindsay Sep 9, 2026
9af5b47
ABN-518: distinguish an unreadable country list, collapse floors that…
dgjlindsay Sep 9, 2026
d60941e
ABN-518: state the ABN-533 rule as landed
dgjlindsay Sep 9, 2026
50e9757
ABN-518: drop the transient-verdict row now ABN-533 has landed
dgjlindsay Sep 9, 2026
cc22958
ABN-518: restore the transient-verdict row, and name an unknown floor
dgjlindsay Sep 9, 2026
fd0d939
ABN-518: mark the transient-verdict row for deletion with ABN-533
dgjlindsay Sep 9, 2026
dd5fd1b
ABN-518: say the transient verdict withholds, and stop suppressing a …
dgjlindsay Sep 9, 2026
47b1757
ABN-518: ABN-533 has landed, so the transient and empty-term-set arms…
dgjlindsay Sep 9, 2026
74b35b6
ABN-518: judge the whole panel at the page's scope, and name the buye…
dgjlindsay Sep 9, 2026
0a73d24
ABN-518: resolve the verdict once, and repair the edit residue
dgjlindsay Sep 9, 2026
1d197e9
ABN-518: name both country gates together, and scope the whole panel
dgjlindsay Sep 9, 2026
eb77959
ABN-518: repair the edit residue round 10 found
dgjlindsay Sep 9, 2026
f94182d
Merge pull request #476 from two-inc/doug/ABN-518-withholding-reasons
dgjlindsay Sep 9, 2026
fe9d943
ABN-546: withhold the payment method when the buyer fee quote fails
dgjlindsay Sep 9, 2026
0b845b8
ABN-546: price the charged term in the availability gate
dgjlindsay Sep 9, 2026
a48001a
ABN-546: bound, broaden and scope the render-path fee quote
dgjlindsay Sep 9, 2026
22ed736
ABN-546: record why a withheld fee quote failed, and pin the gate's o…
dgjlindsay Sep 9, 2026
de0a480
ABN-546: set the render-path fee-quote timeout ceiling to 30 seconds
dgjlindsay Sep 9, 2026
965d5e2
ABN-546: record the accepted render cost, drop the delegation wrapper
dgjlindsay Sep 9, 2026
8bda6b1
ABN-546: one surcharge-pricing ceiling for every path
dgjlindsay Sep 9, 2026
66f76ec
fix: show the configured sole-trader failure message to the buyer
dgjlindsay Sep 9, 2026
fa1dbcd
Merge pull request #491 from two-inc/doug/wire-sole-trader-error-message
dgjlindsay Sep 9, 2026
1bbfcb9
docs: qualify tracker references and drop internal review-document ci…
dgjlindsay Sep 9, 2026
5870868
docs: scrub remaining internal work-split labels from comments
dgjlindsay Sep 9, 2026
ca51204
docs: drop two remaining internal defect numbers and de-duplicate a c…
dgjlindsay Sep 9, 2026
3ed9274
docs: state the admin section scheme by its real labels, and correct …
dgjlindsay Sep 9, 2026
3df8802
docs: drop the lettered section markers and the remaining A-E scheme …
dgjlindsay Sep 9, 2026
7f52ae2
Merge pull request #490 from two-inc/doug/scrub-citations-magento
dgjlindsay Sep 9, 2026
0db7cdf
Merge pull request #441 from two-inc/dependabot/npm_and_yarn/js-yaml-…
dgjlindsay Sep 9, 2026
afd51d4
Merge pull request #440 from two-inc/dependabot/npm_and_yarn/babel/co…
dgjlindsay Sep 9, 2026
240f108
ABN-548: prefer a 30-day default payment term when the merchant offer…
dgjlindsay Sep 9, 2026
2fb2894
ABN-548: review round 1 - the admin default-term field follows the sa…
dgjlindsay Sep 9, 2026
de0f474
ABN-548: the admin default-term field offers Automatic instead of a g…
dgjlindsay Sep 9, 2026
bbde936
ABN-548: the admin surfaces that name the default term resolve it
dgjlindsay Sep 9, 2026
88e2d52
ABN-548: review round 4 - the admin's copy of the order intersects too
dgjlindsay Sep 9, 2026
69bb187
Merge pull request #489 from two-inc/doug/ABN-548-default-term-prefer-30
dgjlindsay Sep 9, 2026
ddf00ec
Merge pull request #488 from two-inc/doug/ABN-546-fee-quote-withhold
dgjlindsay Sep 9, 2026
f007ded
fix: ABN-561 return focus to the company field when the signup closes
dgjlindsay Sep 10, 2026
77d0593
fix: ABN-550 refuse placement on a payment term the server has not co…
dgjlindsay Sep 10, 2026
7536931
fix: ABN-550 keep the session term unmoved when select-term fails
dgjlindsay Sep 11, 2026
19bc386
fix: ABN-550 treat a select-term 200 without totals as a refusal
dgjlindsay Sep 11, 2026
d522d24
test: ABN-550 answer select-term with the segments it always returns
dgjlindsay Sep 11, 2026
a189748
refactor: ABN-550 cut the reconciliation comments to the bar
dgjlindsay Sep 11, 2026
3280f98
fix: ABN-561 do not reclaim focus a popup handover has placed
dgjlindsay Sep 11, 2026
b79cd99
fix: ABN-550 reprice back whenever the staged save may have persisted
dgjlindsay Sep 11, 2026
289bb68
fix: ABN-550 close four ways the reconciliation gate could still be w…
dgjlindsay Sep 11, 2026
4efefdd
fix: itemise the surcharge on every customer order and invoice surface
dgjlindsay Sep 11, 2026
0117ae6
fix: ABN-561 judge the reclaim on state the close cannot have changed
dgjlindsay Sep 11, 2026
4f59589
fix: stop an irrelevant hidden admin field refusing the save in silence
dgjlindsay Sep 11, 2026
34d88ce
fix: translate the company picker on the storefront checkouts
dgjlindsay Sep 11, 2026
bb0761c
fix: ABN-550 stop a throwing totals subscriber latching the gate
dgjlindsay Sep 11, 2026
f9ed73e
docs: ABN-561 say what the handover test can and cannot separate
dgjlindsay Sep 11, 2026
bc57f94
fix: review round 1 — close the remaining silent-refusal paths
dgjlindsay Sep 11, 2026
ad1bd1b
fix: ABN-550 confirm the term a partly-applied response still committed
dgjlindsay Sep 11, 2026
76435f8
fix: review round 2 — judge a changed value even on a hidden column
dgjlindsay Sep 11, 2026
62cee4b
fix: ABN-550 keep the rollback from pricing one term against another
dgjlindsay Sep 11, 2026
942d3ea
fix: review round 3 — excuse a cell against the value in effect, not …
dgjlindsay Sep 11, 2026
d3a348e
fix: resolve surcharge table names through ResourceConnection
dgjlindsay Sep 11, 2026
70f4132
fix: ABN-561 judge the reclaim on an open signup, not on where focus …
dgjlindsay Sep 11, 2026
1552c04
fix: ABN-550 reprice the rollback on the term it restores
dgjlindsay Sep 11, 2026
e8f4ae6
test: ABN-550 settle select-term in the shape the wire carries
dgjlindsay Sep 11, 2026
201c3cf
test: ABN-561 hold the launch blur against the focus the rebuild rest…
dgjlindsay Sep 11, 2026
93d010f
fix: review round 4 — resolve the render path's table name, pin both …
dgjlindsay Sep 11, 2026
650531e
test: prune the table-name scan rather than filtering its results
dgjlindsay Sep 11, 2026
f8981f8
docs: ABN-561 shorten the chip-rebuild focus note
dgjlindsay Sep 11, 2026
a1e7443
fix: ABN-565 keep the capture mode a chip asked for across the popup …
dgjlindsay Sep 11, 2026
87527f8
test: correct two docblocks naming a parameter default that is gone
dgjlindsay Sep 11, 2026
2efeab5
test: name the mutation the afterSave helper actually pins
dgjlindsay Sep 11, 2026
c9340d9
ABN-560: base the credit-memo surcharge tax delta on what is still re…
dgjlindsay Sep 11, 2026
cdb5b33
docs: record the lack of table-prefix support as a standing gap
dgjlindsay Sep 11, 2026
0705833
Merge pull request #492 from two-inc/doug/ABN-550-term-total-reconcile
dgjlindsay Sep 11, 2026
dbf85c1
Merge pull request #493 from two-inc/doug/ABN-561-soletrader-focus-re…
dgjlindsay Sep 11, 2026
9261b9b
Merge pull request #495 from two-inc/doug/ABN-565-manual-entry-across…
dgjlindsay Sep 11, 2026
e878bf9
Revert the table-prefix fix, leaving the module prefix-neutral
dgjlindsay Sep 11, 2026
46309bd
fix: explain a declined order intent to the buyer (ABN-563)
dgjlindsay Sep 11, 2026
111b3d3
test: name the declined-notice cases from their own table rows (ABN-563)
dgjlindsay Sep 11, 2026
f51635e
docs: drop the overlay count from the decline note (ABN-563)
dgjlindsay Sep 11, 2026
9cef048
refactor: cut the decline-notice comments to the non-obvious fact (AB…
dgjlindsay Sep 11, 2026
abef3ea
test: assert nothing conditional encloses the decline region (ABN-563)
dgjlindsay Sep 11, 2026
fa51dcb
test: drop an unused harness import (ABN-563)
dgjlindsay Sep 11, 2026
a826ef9
docs: say which region owns each reason the order button is disabled …
dgjlindsay Sep 11, 2026
c3007d9
Merge pull request #496 from two-inc/doug/ABN-560-creditmemo-fee-vat-…
dgjlindsay Sep 11, 2026
2d430f2
Merge pull request #494 from two-inc/doug/ABN-555-558-559-qa-fixes
dgjlindsay Sep 11, 2026
d6854ac
Merge pull request #497 from two-inc/doug/ABN-563-decline-notice
dgjlindsay Sep 11, 2026
e687ba7
fix: expose payment control names and selection state (ABN-554)
dgjlindsay Sep 11, 2026
8f11c26
fix: keep the tile title's inherited colour now it is a label (ABN-554)
dgjlindsay Sep 11, 2026
4f54b52
fix: keep the chip nodes and the browser's own arrow keys (ABN-554)
dgjlindsay Sep 11, 2026
09fa0de
fix: say why an unapplied payment term refuses placement (ABN-550)
dgjlindsay Sep 11, 2026
5b4b822
docs: state the term invariant as the reason string it now is (ABN-550)
dgjlindsay Sep 11, 2026
9b06cfa
test: pin the chip fee call form and the chip array's assignment (ABN…
dgjlindsay Sep 11, 2026
5dfde07
docs: correct why the chip fee bindings call their computeds (ABN-554)
dgjlindsay Sep 11, 2026
cf53ecb
fix: tell the buyer when a payment term was not applied (ABN-550)
dgjlindsay Sep 11, 2026
d507f52
test: name each revert case in its title only (ABN-550)
dgjlindsay Sep 11, 2026
3d529cc
fix: measure the surcharge VAT a credit memo was granted (follows ABN…
dgjlindsay Sep 11, 2026
869f70f
test: assert each memo in a refund sequence carries its own surcharge…
dgjlindsay Sep 11, 2026
ab418cd
chore: describe the invoice surcharge fixture generically
dgjlindsay Sep 11, 2026
1d054e3
refactor: read the merchant surcharge cap through one shared resolver
dgjlindsay Sep 11, 2026
74dbc70
fix: bound the buyer surcharge by the merchant cap at the charging path
dgjlindsay Sep 11, 2026
365b848
test: pin the merchant surcharge cap on every configuration route
dgjlindsay Sep 11, 2026
5893fdd
docs: record where the merchant surcharge cap is enforced
dgjlindsay Sep 11, 2026
0bffe60
fix: review round 1 — do not refuse a fee of nothing over an unresolv…
dgjlindsay Sep 11, 2026
6dd8ee5
refactor: cut the cap comments to the non-obvious fact
dgjlindsay Sep 11, 2026
7279ded
style: wrap two over-long test lines
dgjlindsay Sep 11, 2026
8ec07d0
fix(checkout): ABN-554 return focus to the company field on every pop…
dgjlindsay Sep 11, 2026
45397a2
fix: state the term type on the payment-term chips (ABN-554)
dgjlindsay Sep 11, 2026
f7369ca
fix(checkout): ABN-554 leave focus alone when it has already settled …
dgjlindsay Sep 11, 2026
4431f54
docs: correct the close-path list in AGENTS.md
dgjlindsay Sep 11, 2026
6f6f679
fix(checkout): ABN-554 hand focus to the field after an outside press…
dgjlindsay Sep 11, 2026
fb990d0
docs: shorten the two close-path focus comments
dgjlindsay Sep 11, 2026
dac602e
fix: state the surcharge in the end-of-month chip name (ABN-554)
dgjlindsay Sep 11, 2026
ce9f198
fix: render the sole offered term as a disabled button (ABN-554)
dgjlindsay Sep 11, 2026
e2ee4e5
fix(checkout): ABN-554 place focus again after a capture-mode change
dgjlindsay Sep 11, 2026
446b138
fix(checkout): ABN-554 answer Escape anywhere in the popover
dgjlindsay Sep 11, 2026
98e7f1e
fix(checkout): ABN-554 make a press on the popover's dead space a no-op
dgjlindsay Sep 11, 2026
7e424bc
docs: ABN-554 record the popover's mode-change focus contract
dgjlindsay Sep 11, 2026
70d546b
fix(checkout): ABN-554 hand the field back where the popover holds no…
dgjlindsay Sep 11, 2026
2119f82
fix: substitute the amount by split/join, never by replace (ABN-554)
dgjlindsay Sep 11, 2026
2bed8ac
fix(checkout): ABN-554 cancel a dead-space press on a results list of…
dgjlindsay Sep 11, 2026
2106856
fix: a lone term chip states only the term (ABN-554)
dgjlindsay Sep 11, 2026
bed287a
style: prettier (ABN-554)
dgjlindsay Sep 11, 2026
bf8c09a
fix(checkout): ABN-554 keep a keystroke the withdrawn search would sw…
dgjlindsay Sep 11, 2026
ace6ecb
fix(checkout): ABN-554 keep the caret on the field across its own inp…
dgjlindsay Sep 11, 2026
a333989
Merge pull request #498 from two-inc/doug/ABN-554-payment-control-a11y
dgjlindsay Sep 11, 2026
a13fbda
Merge remote-tracking branch 'origin/staging' into doug/term-chip-lab…
dgjlindsay Sep 11, 2026
78fdf06
Merge pull request #504 from two-inc/doug/term-chip-label-parity
dgjlindsay Sep 11, 2026
667667b
Merge remote-tracking branch 'origin/staging' into doug/chip-name-fee…
dgjlindsay Sep 11, 2026
cfcbf2f
Merge pull request #506 from two-inc/doug/chip-name-fee-and-sole-button
dgjlindsay Sep 12, 2026
99abac5
Merge remote-tracking branch 'origin/staging' into doug/chip-visible-…
dgjlindsay Sep 12, 2026
cab06e4
Merge pull request #507 from two-inc/doug/chip-visible-text-parity
dgjlindsay Sep 12, 2026
bee50f6
Merge remote-tracking branch 'origin/staging' into doug/popover-close…
dgjlindsay Sep 12, 2026
9c36b30
Merge pull request #503 from two-inc/doug/popover-close-returns-focus
dgjlindsay Sep 12, 2026
19798ac
Merge remote-tracking branch 'origin/staging' into doug/popover-mode-…
dgjlindsay Sep 12, 2026
968628a
Merge pull request #505 from two-inc/doug/popover-mode-change-focus
dgjlindsay Sep 12, 2026
30272e6
Merge remote-tracking branch 'origin/staging' into doug/ABN-554-withd…
dgjlindsay Sep 12, 2026
7bd2845
Merge pull request #508 from two-inc/doug/ABN-554-withdrawn-search-ke…
dgjlindsay Sep 12, 2026
9f82a00
merge: resolve gateway_method.html conflict against staging (ABN-550/…
dgjlindsay Sep 12, 2026
79a4378
Merge pull request #499 from two-inc/doug/surcharge-gate-status-parity
dgjlindsay Sep 12, 2026
0e26c1e
Merge remote-tracking branch 'origin/staging' into doug/surcharge-rev…
dgjlindsay Sep 12, 2026
b73ad57
Merge pull request #500 from two-inc/doug/surcharge-revert-message-or…
dgjlindsay Sep 12, 2026
95e8f36
Merge remote-tracking branch 'origin/staging' into doug/creditmemo-pa…
dgjlindsay Sep 12, 2026
6ddb591
Merge pull request #501 from two-inc/doug/creditmemo-partial-memo-fee…
dgjlindsay Sep 12, 2026
f4a35aa
Merge remote-tracking branch 'origin/staging' into doug/surcharge-cap…
dgjlindsay Sep 12, 2026
2f0616b
Merge pull request #502 from two-inc/doug/surcharge-cap-enforcement-o…
dgjlindsay Sep 12, 2026
7481ba6
fix(company-search): park the focus the sole-trader signup popup takes
dgjlindsay Sep 12, 2026
c8bb912
fix(ABN-550): hold placement and tell the buyer in the tile when a te…
dgjlindsay Sep 12, 2026
f44d8de
review: park only while the signup popup is still up
dgjlindsay Sep 12, 2026
b3532fe
review: drop the park before the abandon reclaim reads focus
dgjlindsay Sep 12, 2026
3de5f38
docs: the settle drops the park before reading focus (ABN-554)
dgjlindsay Sep 12, 2026
e72df2d
Merge pull request #509 from two-inc/doug/ABN-554-soletrader-mode-focus
dgjlindsay Sep 12, 2026
ebd9123
test(ABN-550): review round — the refusal status in both placement-ga…
dgjlindsay Sep 12, 2026
8dc15ff
fix(ABN-554): the popover's mode chips carry the term chips' focus ring
dgjlindsay Sep 12, 2026
50e29d3
Merge pull request #510 from two-inc/doug/ABN-550-unapplied-term-hold…
dgjlindsay Sep 12, 2026
4be03a8
Merge pull request #511 from two-inc/doug/ABN-554-magento-mode-chip-f…
dgjlindsay Sep 12, 2026
e22e922
fix(company-search): close the popover on Escape from the company field
dgjlindsay Sep 12, 2026
3a7994c
Merge pull request #512 from two-inc/doug/ABN-554-escape-after-mode-c…
dgjlindsay Sep 12, 2026
5a01084
ABN-554: keep the sole offered term chip solid on Luma
dgjlindsay Sep 12, 2026
1197ad8
fix: admin surcharge grid shows the stored amount under differential …
dgjlindsay Sep 12, 2026
9222787
ABN-554: a fee its own extension refunds must not reach Two's residual
dgjlindsay Sep 12, 2026
ae51a72
Review: cut the comment to one line
dgjlindsay Sep 12, 2026
206dda2
ABN-554: lock the vendored company-search panel to a shared digest
dgjlindsay Sep 12, 2026
1e8e703
ABN-554: state the lock without asserting the other repo's file layout
dgjlindsay Sep 12, 2026
007bd3a
ABN-554: strip the combobox attributes on destroy() too
dgjlindsay Sep 12, 2026
fe16942
ABN-554: rehome the teardown assertions out of the tab-stop suite
dgjlindsay Sep 12, 2026
2d22724
ABN-554: surcharge line label follows the end-of-month basis
dgjlindsay Sep 12, 2026
0b136de
ABN-554: resolve the shipped default per brand, not from a constant
dgjlindsay Sep 12, 2026
66cefbe
ABN-554: proxy and memoise the shipped-default lookup
dgjlindsay Sep 12, 2026
9dbeefd
ABN-554: fall back to the brand's shipped wording, not the base module's
dgjlindsay Sep 12, 2026
1c90638
ABN-554: drop a false server-behaviour claim from order_item_id comments
dgjlindsay Sep 12, 2026
1c4cdd0
Merge pull request #513 from two-inc/doug/ABN-554-admin-shows-stored-…
dgjlindsay Sep 12, 2026
8e41e0b
Merge branch 'staging' into doug/ABN-554-sole-chip-opacity
dgjlindsay Sep 12, 2026
1d10260
Merge pull request #515 from two-inc/doug/ABN-554-sole-chip-opacity
dgjlindsay Sep 12, 2026
9101ab2
Merge branch 'staging' into doug/ABN-554-panel-vendor-parity
dgjlindsay Sep 12, 2026
7b341cb
Merge pull request #516 from two-inc/doug/ABN-554-panel-vendor-parity
dgjlindsay Sep 12, 2026
ee3efc5
Merge branch 'staging' into doug/abn-554-eom-fee-label
dgjlindsay Sep 12, 2026
b605e23
Merge pull request #518 from two-inc/doug/abn-554-eom-fee-label
dgjlindsay Sep 12, 2026
7d968fa
Merge branch 'staging' into doug/ABN-554-fee-owner-residual
dgjlindsay Sep 12, 2026
0dc903f
Merge pull request #514 from two-inc/doug/ABN-554-fee-owner-residual
dgjlindsay Sep 12, 2026
74e11e4
ABN-554: stop the company field's opener aiming the next keystroke at…
dgjlindsay Sep 12, 2026
e9e98b2
ABN-554: review round — widen the chip keydown guard, keep the messag…
dgjlindsay Sep 12, 2026
2776639
ABN-554: keep the buyer's text in the field a mode with no query row …
dgjlindsay Sep 12, 2026
118dfd2
ABN-554: name the country-gate exception in the input-handler contract
dgjlindsay Sep 12, 2026
52ec658
ABN-554: move the vendored panel digest onto the shared copy
dgjlindsay Sep 12, 2026
630c65d
Merge pull request #517 from two-inc/doug/ABN-554-first-char-after-mo…
dgjlindsay Sep 12, 2026
81cd8ef
fix(ABN-554): repaint the Luma order summary on the selected term
dgjlindsay Sep 12, 2026
eade19a
fix(ABN-554): let a refused summary refresh go
dgjlindsay Sep 12, 2026
fcfb4f3
Merge pull request #519 from two-inc/doug/ABN-554-luma-summary-term-r…
dgjlindsay Sep 13, 2026
48d61ec
ABN-554: keep the selected chip's tick out of its accessible name
dgjlindsay Sep 13, 2026
3101fce
Merge pull request #520 from two-inc/doug/ABN-554-chip-tick-accessibl…
dgjlindsay Sep 13, 2026
c938382
ABN-554: the company-search panel says what a search returned
dgjlindsay Sep 13, 2026
6dc9c0c
ABN-554: review round — only a search's own answer is announced
dgjlindsay Sep 13, 2026
9f14c8a
ABN-554: the announcement reaches the storefront JS dictionary
dgjlindsay Sep 13, 2026
5b7e736
Merge pull request #521 from two-inc/doug/ABN-554-panel-live-region
dgjlindsay Sep 13, 2026
0db0ebb
fix: hold the field's focus opener across a sole-trader signup flight
dgjlindsay Sep 13, 2026
e354cff
feat(checkout): one what-is-Two icon with a hover/focus tooltip
dgjlindsay Sep 13, 2026
6bea749
fix: release the field opener on a blocked supersede, and cover the r…
dgjlindsay Sep 13, 2026
f0fa746
docs: state the parked-focus rule as it stands, not as a diff
dgjlindsay Sep 13, 2026
095006b
fix: end the field-opener hold on the window's return, not the popup'…
dgjlindsay Sep 13, 2026
c2a8723
fix: open the popover on a Tab arrival that lands during a signup flight
dgjlindsay Sep 13, 2026
93b8555
fix(checkout): the what-is-Two icon sits beside the tile title
dgjlindsay Sep 13, 2026
10a021e
fix(a11y): the closed about tooltip leaves the accessibility tree
dgjlindsay Sep 13, 2026
d28e82b
ABN-554: sanitise the checkout tile subtitle to text plus a single link
dgjlindsay Sep 13, 2026
97ed743
fix(checkout): the about control is flow content, and ships nothing w…
dgjlindsay Sep 13, 2026
031d3dc
Merge pull request #522 from two-inc/doug/ABN-554-popover-reopen-on-p…
dgjlindsay Sep 13, 2026
1816ab4
ABN-554: close the round-1 review findings on the subtitle escaper
dgjlindsay Sep 13, 2026
f7999d3
Merge pull request #523 from two-inc/doug/ABN-554-what-is-two-icon
dgjlindsay Sep 13, 2026
ffdc855
ABN-554: close the round-2 review findings on the subtitle escaper
dgjlindsay Sep 13, 2026
a127b38
ABN-554: state the real reason the closed tooltip keeps its box
dgjlindsay Sep 13, 2026
4ed0e5a
ABN-554: cover the escaper edges a mutant set showed untested
dgjlindsay Sep 13, 2026
d408bc8
Merge pull request #525 from two-inc/doug/ABN-554-opacity-comment
dgjlindsay Sep 13, 2026
9c8f118
Merge pull request #524 from two-inc/doug/ABN-554-subtitle-parity
dgjlindsay Sep 13, 2026
9dd1401
fix: escape translated tooltip copy in the checkout tile (ABN-554)
dgjlindsay Sep 13, 2026
92de2e8
test: cover escapeTextOnly directly and widen the tooltip payload rows
dgjlindsay Sep 13, 2026
06a9a94
test: drop the duplicated entity row and the restated comment
dgjlindsay Sep 13, 2026
2355469
Merge pull request #526 from two-inc/doug/ABN-554-tooltip-translation…
dgjlindsay Sep 13, 2026
58489ad
ABN-554: reject subtitle markup the tile would strip
dgjlindsay Sep 13, 2026
08faa01
ABN-554: escape the refused subtitle in the admin notice
dgjlindsay Sep 13, 2026
461232f
Merge pull request #527 from two-inc/doug/ABN-554-subtitle-validation
dgjlindsay Sep 13, 2026
077aa57
ABN-554: escape the consent sentence the terms checkbox labels
dgjlindsay Sep 13, 2026
9912c01
Merge pull request #528 from two-inc/doug/ABN-554-payment-terms-xss
dgjlindsay Sep 13, 2026
6889cce
ABN-554: rebuild company-row labels as nodes
dgjlindsay Sep 13, 2026
6e52f3b
ABN-554: tighten the sanitiser's comment
dgjlindsay Sep 13, 2026
dd67cfb
ABN-554: assert the rebuilt row markup exactly
dgjlindsay Sep 13, 2026
0ba3350
ABN-554: name the no-label case for what it asserts
dgjlindsay Sep 13, 2026
ef43b3b
Merge pull request #529 from two-inc/doug/ABN-554-company-row-mark-sa…
dgjlindsay Sep 13, 2026
b94aa12
ABN-554: fall back to the plain company name in a search-results row …
dgjlindsay Sep 13, 2026
3717a0d
Merge pull request #530 from two-inc/doug/ABN-554-company-row-label-f…
dgjlindsay Sep 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 8 additions & 1 deletion .env.local.example → .env.example
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
# Local dev environment — copy to .env and adjust. Read via Makefile
# `-include .env`.

# Merchant API key for the sandbox environment. Without this, `make install`
# falls back to TWO_API_KEY=dummy-dev-key and payment calls to the sandbox
# API will fail.
TWO_API_KEY=dummy-dev-key

# Point TWO_API_BASE_URL at staging or release; start-proxy.sh derives the frp
# tunnel domain from it (api.<env>.two.inc -> <subdomain>.frp.<env>.two.inc) and
# refuses any env other than staging/release. Switch env by editing this value,
# or inline: TWO_API_BASE_URL=https://api.release.two.inc ./start-proxy.sh
TWO_API_BASE_URL=https://api.staging.two.inc
TWO_CHECKOUT_BASE_URL=https://checkout.staging.two.inc
TWO_API_KEY=dummy-dev-key
296 changes: 296 additions & 0 deletions .github/scripts/decide-bump-level.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,296 @@
#!/usr/bin/env bash
#
# Compute the version this pull request should land on `staging` with.
#
# The version describes the CHANGE, not the branch it is landing on. It is
# derived from the conventional-commit types of the commits this PR adds, which
# is what semver actually asks for. The previous scheme ("patch on staging,
# minor on main") made the number describe the branch rule instead, so the same
# change got a different version depending on where it merged.
#
# M = version on `origin/main` - the last released version
# C = version on this PR's head - what the tree currently declares
# L = conventional-commit classification of `<base>..<head> --no-merges`
#
# breaking -> candidate = (M.major + 1).0.0
# feat -> candidate = M.major.(M.minor + 1).0
# otherwise -> candidate = M.major.M.minor.(M.patch + 1)
#
# new = max(C, candidate) # version_compare semantics
# new == C -> nothing to do
#
# Four properties this shape has deliberately, none of them incidental:
#
# 1. THE RANGE IS THIS PR'S COMMITS ONLY (`origin/staging..HEAD`), never the
# cumulative `main..staging`. The cumulative range currently contains
# `feat!:` commits in several of these repos, so every PR would keep
# re-discovering the same break and re-proposing a major.
#
# 2. THE `max()` CLAMP, not "bump by one from C". This makes the computation
# idempotent by construction - re-running on the same head is a no-op, a
# second fix commit on the same PR is a no-op, and the version can NEVER
# REGRESS. That last part is load-bearing because `main` sits behind
# `staging` in these repos: with a stale main the raw candidate can compute
# BELOW the version already on staging, which would resurrect an
# already-run `upgrade/upgrade-<version>.php` filename.
#
# 3. ONLY `feat` EARNS A MINOR. `chore`, `docs`, `ci`, `test`, `refactor`,
# `build`, `perf`, `style` all take a patch. The obvious-looking "minor
# unless every commit is a fix" rule would send a docs-only PR to a minor.
#
# 4. `.next-major` IS COMPARED AGAINST MAIN'S MAJOR, not the head's. A
# declaration below the released major is always stale, and is a hard error
# rather than a silent no-op:
#
# target_major = max(declared, M.major + breaking)
#
# Filename-discovered upgrade scripts: where the platform discovers upgrade
# scripts BY FILENAME and runs `upgrade/upgrade-<version>.php` only for versions
# strictly above the installed one, appending a second migration to an
# already-installed version's script never runs on a shop that already reached
# that version - silently, `number_upgraded=0`. So if this PR ADDS a new upgrade
# script and the rule above produced no version change, force a patch bump so
# the script gets a filename of its own. Editing an EXISTING script does not
# trigger this. The clause is inert in the repos that have no
# `upgrade/upgrade-*.php` at all.
#
# Usage: decide-bump-level.sh [<base-ref>] [<head-ref>]
# defaults: origin/staging HEAD
# MAIN_REF overrides the released-version ref (default origin/main).
#
# Writes `set_version=`, `changed=` and `reason=` to stdout as `key=value`
# lines, and appends the same to $GITHUB_OUTPUT when running under Actions.
# `set_version` is ABSOLUTE and always populated; consumers pass it straight to
# `bumpver update --set-version`. There is no bump "level" any more - a level
# cannot express "clamp to what the tree already has".
set -euo pipefail

base_ref="${1:-origin/staging}"
head_ref="${2:-HEAD}"
main_ref="${MAIN_REF:-origin/main}"

repo_root=$(git rev-parse --show-toplevel)

die() {
echo "::error::$*" >&2
exit 1
}

# --- reading a version out of a ref ------------------------------------------
#
# bumpver.toml is the source of truth everywhere it exists. It does NOT exist on
# `main` in every repo (in some it was only ever added on `staging`), so fall
# back to the module's own declarations rather than crashing - reading M is not
# optional, it is the base of every candidate below.
read_version() {
local ref="$1" v=""

v=$(git show "${ref}:bumpver.toml" 2>/dev/null |
sed -n 's/^[[:space:]]*current_version[[:space:]]*=[[:space:]]*"\([^"]*\)".*/\1/p' | head -1) || true
[ -n "$v" ] && {
printf '%s' "$v"
return 0
}

v=$(git show "${ref}:config.xml" 2>/dev/null |
sed -n 's/.*<version><!\[CDATA\[\([^]]*\)\]\]><\/version>.*/\1/p' | head -1) || true
[ -n "$v" ] && {
printf '%s' "$v"
return 0
}

v=$(git show "${ref}:twopayment.php" 2>/dev/null |
sed -n "s/.*this->version[[:space:]]*=[[:space:]]*'\([^']*\)'.*/\1/p" | head -1) || true
[ -n "$v" ] && {
printf '%s' "$v"
return 0
}

return 1
}

# MAJOR MINOR PATCH out of a version string, ignoring any -TAGNUM suffix.
split_version() {
local v="${1%%-*}"
[[ $v =~ ^([0-9]+)\.([0-9]+)\.([0-9]+)$ ]] || return 1
printf '%s %s %s' "${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
}

# `version_compare` semantics: echo the greater of the two versions. Ties echo
# the first argument, which is why callers pass the head version first - a tie
# means "the tree already has it" and must not read as a change.
version_max() {
local am ai ap bm bi bp
read -r am ai ap <<<"$(split_version "$1")"
read -r bm bi bp <<<"$(split_version "$2")"
if [ "$am" -ne "$bm" ]; then
if [ "$am" -gt "$bm" ]; then printf '%s' "$1"; else printf '%s' "$2"; fi
return
fi
if [ "$ai" -ne "$bi" ]; then
if [ "$ai" -gt "$bi" ]; then printf '%s' "$1"; else printf '%s' "$2"; fi
return
fi
if [ "$ap" -ne "$bp" ]; then
if [ "$ap" -gt "$bp" ]; then printf '%s' "$1"; else printf '%s' "$2"; fi
return
fi
printf '%s' "$1"
}

main_version=$(read_version "$main_ref") ||
die "could not read a version from ${main_ref} (tried bumpver.toml, config.xml, twopayment.php)"
head_version=$(read_version "$head_ref") ||
die "could not read a version from ${head_ref} (tried bumpver.toml, config.xml, twopayment.php)"

main_parts=$(split_version "$main_version") ||
die "unparseable version '${main_version}' on ${main_ref}"
read -r M_major M_minor M_patch <<<"$main_parts"
split_version "$head_version" >/dev/null ||
die "unparseable version '${head_version}' on ${head_ref}"

# --- classify this PR's commits ----------------------------------------------
range="${base_ref}..${head_ref}"
subject_re='^([A-Z]+-[0-9]+/)?[a-z]+(\([^)]+\))?!:'
footer_re='^BREAKING[ -]CHANGE:'
feat_re='^([A-Z]+-[0-9]+/)?feat(\([^)]+\))?:'

breaking=0
breaking_reason=""
feat=0
feat_reason=""

while IFS= read -r subject; do
[ -n "$subject" ] || continue
if printf '%s' "$subject" | grep -qE "$subject_re"; then
breaking=1
breaking_reason="$subject"
break
fi
if [ "$feat" -eq 0 ] && printf '%s' "$subject" | grep -qE "$feat_re"; then
feat=1
feat_reason="$subject"
fi
done < <(git log "$range" --no-merges --format='%s')

if [ "$breaking" -eq 0 ]; then
footer=$(git log "$range" --no-merges --format='%B' | grep -m1 -E "$footer_re" || true)
if [ -n "$footer" ]; then
breaking=1
breaking_reason="$footer"
fi
fi

# --- declared major (`.next-major`) ------------------------------------------
declared=0
declared_reason=""
next_major_file="${repo_root}/.next-major"
if [ -f "$next_major_file" ]; then
raw=$(head -1 "$next_major_file")
declared=$(printf '%s' "$raw" | awk '{print $1}')
declared_reason=$(printf '%s' "$raw" | sed 's/^[^[:space:]]*[[:space:]]*//; s/^#[[:space:]]*//')
case "$declared" in
'' | *[!0-9]*)
die ".next-major must start with the target major version as a bare integer; got '${raw}'"
;;
esac
# A declaration that has fallen behind the RELEASED major is always stale -
# the major it declared has already shipped some other way. Ignoring it
# silently lets it rot; honouring it would regress. Fail.
if [ "$declared" -lt "$M_major" ]; then
die ".next-major declares major ${declared} but ${main_ref} is at ${main_version} (major ${M_major}). A declaration below the released major is always stale - delete or raise it."
fi
fi

target_major=$declared
discovered_major=$((M_major + breaking))
[ "$discovered_major" -gt "$target_major" ] && target_major=$discovered_major

# --- candidate ---------------------------------------------------------------
if [ "$target_major" -gt "$M_major" ]; then
candidate="${target_major}.0.0"
if [ "$declared" -ge "$target_major" ]; then
why="declared .next-major=${declared}"
[ -n "$declared_reason" ] && why="${why} (${declared_reason})"
else
why="breaking change: ${breaking_reason}"
fi
elif [ "$feat" -eq 1 ]; then
candidate="${M_major}.$((M_minor + 1)).0"
why="feature: ${feat_reason}"
else
candidate="${M_major}.${M_minor}.$((M_patch + 1))"
why="no feature or breaking commit in this PR -> patch"
fi

new=$(version_max "$head_version" "$candidate")
if [ "$new" != "$candidate" ]; then
why="${why}; clamped to the version already on the head (${head_version} >= candidate ${candidate})"
fi

# --- a NEW upgrade script needs a filename of its own ------------------------
#
# `--diff-filter=A` against the merge base, so an EDIT to an existing script
# never triggers this - only a genuinely new file does.
added_upgrade_scripts=""
if git rev-parse -q --verify "$base_ref" >/dev/null 2>&1; then
added_upgrade_scripts=$(git diff --diff-filter=A --name-only \
"${base_ref}...${head_ref}" -- 'upgrade/upgrade-*.php' 2>/dev/null || true)
fi

if [ -n "$added_upgrade_scripts" ] && [ "$new" = "$head_version" ]; then
# ...unless one of the added scripts is ALREADY named for the head version.
# That is the converged state: the script has a filename of its own and
# forcing again on the next `synchronize` would bump forever.
owns_its_filename=0
while IFS= read -r path; do
[ -n "$path" ] || continue
v=${path##*/upgrade-}
v=${v%.php}
[ "$v" = "$head_version" ] && owns_its_filename=1
done <<<"$added_upgrade_scripts"

if [ "$owns_its_filename" -eq 0 ]; then
read -r n_major n_minor n_patch <<<"$(split_version "$new")"
new="${n_major}.${n_minor}.$((n_patch + 1))"
why="${why}; forced a patch because this PR adds a new upgrade script and PrestaShop discovers upgrade scripts by filename"
else
why="${why}; the new upgrade script is already named for this version"
fi
fi

changed=false
[ "$new" != "$head_version" ] && changed=true

reason=$(printf '%s' "$why" | tr '\n' ' ')

{
echo "----- version decision -----"
echo "main (${main_ref}) : ${main_version}"
echo "head (${head_ref}) : ${head_version}"
echo "range : ${range}"
if [ -f "$next_major_file" ]; then
echo "declared major : ${declared}${declared_reason:+ - ${declared_reason}}"
else
echo "declared major : (no .next-major)"
fi
echo "breaking commit : ${breaking_reason:-none}"
echo "feature commit : ${feat_reason:-none}"
echo "added upgrade scripts : $(printf '%s' "${added_upgrade_scripts:-none}" | tr '\n' ' ')"
echo "candidate : ${candidate}"
echo "set_version : ${new} (changed=${changed})"
echo "reason : ${reason}"
echo "----------------------------"
} >&2

echo "set_version=${new}"
echo "changed=${changed}"
echo "reason=${reason}"

if [ -n "${GITHUB_OUTPUT:-}" ]; then
{
echo "set_version=${new}"
echo "changed=${changed}"
echo "reason=${reason}"
} >>"$GITHUB_OUTPUT"
fi
Loading
Loading