Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
391 commits
Select commit Hold shift + click to select a range
4ab7651
Keep a timed-out request a network failure
arun279 Sep 9, 2026
092bc37
Type the queue's provisional advance instead of inferring it
arun279 Sep 9, 2026
c57415b
Keep the manifest facts the exact-alarm cleanup dropped
arun279 Sep 9, 2026
b98b22a
Give the navigators the scheme's own fill and ink
arun279 Sep 9, 2026
6533cdd
Draw the card's plain surface the way it is composed
arun279 Sep 9, 2026
e60aae6
Start a row's artwork where its text starts
arun279 Sep 9, 2026
30273fb
Run native size checks in the local gate
arun279 Sep 9, 2026
7390368
Make size ceilings downward only
arun279 Sep 9, 2026
d9c1107
Gate pull request size deltas
arun279 Sep 9, 2026
565bd2d
Gate store download sizes
arun279 Sep 9, 2026
b8d64d7
Gate native export assets
arun279 Sep 9, 2026
0e2bade
Publish native bundle attribution
arun279 Sep 9, 2026
77d1576
Say what the browser lanes now find
arun279 Sep 9, 2026
399f4f9
Budget the mock lane by a ceiling, and let it share a machine
arun279 Sep 9, 2026
471acc7
Record the suppression the queue partition no longer needs
arun279 Sep 9, 2026
657c96b
Patch the two advisories the audit gate now reports
arun279 Sep 9, 2026
fed9d38
Stop gating on an App Thinning report the export never writes
arun279 Sep 9, 2026
f3aad64
Drop the Material Symbols font with Expo's own flag
arun279 Sep 9, 2026
bf42285
Draw the Android tab icons inside the drawable viewport
arun279 Sep 9, 2026
491a6b1
Make the size gates fail on what they cannot measure
arun279 Sep 9, 2026
ab732de
Re-anchor the Play download measurement
arun279 Sep 9, 2026
b644ff4
Merge feat/sync-follow-up into feat/expo-native
arun279 Sep 9, 2026
031158f
Override the transitive js-yaml and xmldom advisories
arun279 Sep 9, 2026
3b003a6
Merge remote-tracking branch 'origin/feat/expo-native' into feat/size…
arun279 Sep 9, 2026
1283a72
Merge feat/expo-native into feat/screens-up-next
arun279 Sep 9, 2026
8cc29d6
Keep the Atlas attribution from both platforms
arun279 Sep 9, 2026
e25554b
Merge feat/size-gates into feat/expo-native
arun279 Sep 9, 2026
f3be38f
Separate season and episode mutation paths
arun279 Sep 9, 2026
2ecc34b
Separate queued write reconciliation by operation
arun279 Sep 9, 2026
a6ba19e
Separate device authorization polling outcomes
arun279 Sep 9, 2026
9aa9e5f
Separate Up Next classification from grouping
arun279 Sep 9, 2026
f0fd64a
Separate episode progress from navigation
arun279 Sep 9, 2026
354f419
Separate authorized read and write recovery
arun279 Sep 9, 2026
1c28163
Separate library source assembly
arun279 Sep 9, 2026
d89c386
Separate movie library source assembly
arun279 Sep 9, 2026
5f8c9fc
Keep the facts the comment trim removed
arun279 Sep 9, 2026
249c293
Prove reconcile refuses an operation Trakt never applied
arun279 Sep 9, 2026
eeb687d
Merge feat/debt-burn-down into feat/expo-native
arun279 Sep 9, 2026
12300a2
Keep simulator framework linkage coherent
arun279 Sep 9, 2026
fa51b06
Merge fix/native-e2e-dyld into feat/expo-native
arun279 Sep 9, 2026
2b2b78a
Merge remote-tracking branch 'origin/feat/expo-native' into HEAD
arun279 Sep 9, 2026
21d86a6
Refresh quality budget after branch merge
arun279 Sep 9, 2026
636cf17
Preserve established size ceilings across merges
arun279 Sep 9, 2026
f28a132
Make native asset verification order independent
arun279 Sep 9, 2026
0a76fe5
Refresh pull request checks
arun279 Sep 9, 2026
1887b41
Add Expo iOS TestFlight lane
arun279 Sep 9, 2026
5268008
Add Expo Android Firebase lane
arun279 Sep 9, 2026
846b622
Select native line in mobile releases
arun279 Sep 9, 2026
4b7ca3a
Start Expo releases at version 2
arun279 Sep 9, 2026
1b96792
Merge feat/screens-up-next into feat/expo-native
arun279 Sep 9, 2026
bd7de44
Pass bundletool passwords through files
arun279 Sep 9, 2026
4948795
Scope TestFlight build check to app version
arun279 Sep 9, 2026
531045f
Mount the native freshness poll
arun279 Sep 9, 2026
8969307
Centralize the day duration
arun279 Sep 9, 2026
943c47b
Reuse the shared local day key
arun279 Sep 9, 2026
23bde35
Unify read hook status
arun279 Sep 9, 2026
77a14d8
Inline single-caller read and write hooks
arun279 Sep 9, 2026
4b7271e
Unify outstanding write locks
arun279 Sep 9, 2026
947c659
Enforce the native test id vocabulary
arun279 Sep 9, 2026
19e724c
Make Expo routes the screen owners
arun279 Sep 9, 2026
b387c0d
Centralize native text reflow
arun279 Sep 9, 2026
2841f5a
Share persisted storage keys
arun279 Sep 9, 2026
fec1069
Inject portable identity and digest services
arun279 Sep 9, 2026
957638a
Move shared behavior tests into core
arun279 Sep 9, 2026
21a173d
Refresh the last aired frontier after marks
arun279 Sep 9, 2026
26de74a
Distinguish unreadable Trakt responses
arun279 Sep 9, 2026
29b2764
Finish pagination without headers
arun279 Sep 9, 2026
dd17201
Coalesce concurrent Trakt reads
arun279 Sep 9, 2026
54fb041
Add margin to Trakt write pacing
arun279 Sep 9, 2026
1b82649
Name permanent Trakt account failures
arun279 Sep 9, 2026
1e862b6
Identify native Trakt requests
arun279 Sep 9, 2026
72de575
Gate native render counts
arun279 Sep 9, 2026
d3e4743
Keep migrated tests outside product boundaries
arun279 Sep 9, 2026
ffad692
Align checks with migrated tests
arun279 Sep 9, 2026
dc21668
Share performance test fixtures
arun279 Sep 9, 2026
a62294b
Bump the persisted cache shape
arun279 Sep 9, 2026
e1d96ce
Classify render gate inputs
arun279 Sep 9, 2026
279c074
Align read tests with transport pacing
arun279 Sep 9, 2026
8620208
Bound paginated test fixtures
arun279 Sep 9, 2026
0289e62
Describe headerless pagination accurately
arun279 Sep 9, 2026
9649dc2
Refresh the persisted cache witness
arun279 Sep 9, 2026
7e333d2
Allow hosted render measurements to complete
arun279 Sep 9, 2026
916d28f
Preserve Up Next behavior after base update
arun279 Sep 9, 2026
11bb786
Stabilize the native connect transition
arun279 Sep 9, 2026
837990e
Bound web fixtures to one page
arun279 Sep 9, 2026
af5857d
Keep the core test project inside the core
arun279 Sep 10, 2026
f1a72d4
Narrow the episode plays view to what it answers
arun279 Sep 10, 2026
c680776
Gate the concepts these hooks now share
arun279 Sep 10, 2026
05e6e75
Merge remote-tracking branch 'origin/feat/core-cleanup' into feat/exp…
arun279 Sep 10, 2026
8df2de8
Merge fix/launch-flow-hang into feat/expo-native
arun279 Sep 10, 2026
c5a80b4
Merge feat/native-release-lane into feat/expo-native
arun279 Sep 10, 2026
2383fbd
Delete obsolete mobile shell projects
arun279 Sep 10, 2026
d17cb1f
Make web adapters browser only
arun279 Sep 10, 2026
6a7d0f1
Keep only Expo delivery lanes
arun279 Sep 10, 2026
a67e21d
Remove unused native notifications
arun279 Sep 10, 2026
4a69f2f
Suppress unused install referrer permission
arun279 Sep 10, 2026
c4bb5a2
ci(android): launch release APK on emulator
arun279 Sep 10, 2026
c672fe5
test(ci): mark Android emulator lane non-required
arun279 Sep 10, 2026
d0660d0
Merge fix/ios-push-entitlement into feat/expo-native
arun279 Sep 10, 2026
9135fd5
fix(ci): make emulator launch script portable
arun279 Sep 10, 2026
0acc271
Merge remote-tracking branch 'origin/feat/expo-native' into feat/remo…
arun279 Sep 10, 2026
93c0fbd
Remove unused reminder wrapper
arun279 Sep 10, 2026
f5e6f57
fix(ci): run Android launch assertions in one shell
arun279 Sep 10, 2026
9a58f24
test(ci): classify Android launch verifier
arun279 Sep 10, 2026
077756a
Merge feat/remove-capacitor into feat/expo-native
arun279 Sep 10, 2026
e0ef8f7
fix(ci): sign Android emulator APK
arun279 Sep 10, 2026
9af8182
Merge remote-tracking branch 'origin/feat/expo-native' into fix/andro…
arun279 Sep 10, 2026
cd64eb3
Verify the exported IPA at the path the build returns
arun279 Sep 10, 2026
f191ca0
fix(ci): locate Android signature verifier
arun279 Sep 10, 2026
943e4b5
fix(native): embed public client id in release bundles
arun279 Sep 10, 2026
980b9fc
test(ci): keep workflow expressions lint-clean
arun279 Sep 10, 2026
6b1ce36
Remove the DOM application
arun279 Sep 10, 2026
296e635
Move network behavior coverage into core
arun279 Sep 10, 2026
1d17c22
Prune obsolete workspace surface
arun279 Sep 10, 2026
3826a2d
Merge fix/android-launch-crash into feat/expo-native
arun279 Sep 10, 2026
ef458aa
Merge remote-tracking branch 'origin/feat/expo-native' into feat/remo…
arun279 Sep 10, 2026
65ce3f4
Use one name for the Trakt client id variable
arun279 Sep 10, 2026
86a64d2
Merge feat/remove-web-ui into feat/expo-native
arun279 Sep 10, 2026
881e9e3
Create read query factories
arun279 Sep 10, 2026
9247d3b
Measure returning-user startup in native CI
arun279 Sep 10, 2026
bb088f2
Classify the startup summary as CI tooling
arun279 Sep 10, 2026
edc51df
Move Up Next reads into the screen
arun279 Sep 10, 2026
03225de
Move detail reads into native screens
arun279 Sep 10, 2026
24224ab
Move library grouping into the domain
arun279 Sep 10, 2026
0a02638
Move calendar reads to their consumers
arun279 Sep 10, 2026
c85ef96
Split search input from read subscriptions
arun279 Sep 10, 2026
fd6d3ce
Split history writes from paged reads
arun279 Sep 10, 2026
b7c05b2
Ratchet core read layer coverage
arun279 Sep 10, 2026
f6c09df
Ratchet simulator startup timing
arun279 Sep 10, 2026
ea5c38b
Merge refactor/core-read-layer into feat/expo-native
arun279 Sep 10, 2026
6d03b37
Merge ci/startup-timing-gate into feat/expo-native
arun279 Sep 10, 2026
c20a4f8
Build show detail and the episode sheet
arun279 Sep 10, 2026
6016865
Reset the fake Trakt from a Maestro script
arun279 Sep 10, 2026
789dbe1
Center the rows the detail flows scroll to
arun279 Sep 10, 2026
b2bb89b
Align mobile release triggers
arun279 Sep 19, 2026
21c2b8b
Remove obsolete path matcher dependencies
arun279 Sep 19, 2026
85b5d99
Restore native launcher artwork
arun279 Sep 19, 2026
8927592
Ship an arm64 Android tester APK
arun279 Sep 19, 2026
efe3b2f
Replace unfinished tabs with themed coming-soon states
arun279 Sep 19, 2026
db8c6d2
Keep Android tab icons and show all four labels
arun279 Sep 19, 2026
bcda5e9
Drive the native color-scheme mock in placeholder tests
arun279 Sep 19, 2026
cc4b63a
Keep marquee content outside rounded artwork clipping
arun279 Sep 19, 2026
631c0b2
Use a valid Android name for the tab resource keep file
arun279 Sep 19, 2026
0f691cc
Capture Android release UI and verify packaged tab icons
arun279 Sep 19, 2026
c202272
Classify the Android UI verifier as a CI-only file
arun279 Sep 19, 2026
9c937de
Match AAPT drawable names without a package prefix
arun279 Sep 19, 2026
aac373d
Keep marquee border widths finite when artwork arrives
arun279 Sep 19, 2026
aeedeb3
Report and ratchet installable artifacts
arun279 Sep 19, 2026
7bdca76
Require Android UI evidence before mobile releases
arun279 Sep 19, 2026
b70bf08
Remove the stale release gate ruleset equivalence claim
arun279 Sep 19, 2026
a858640
Run Expo export from the native package
arun279 Sep 19, 2026
26081e1
Exclude release ceilings from size-limit
arun279 Sep 19, 2026
ebe1788
Reuse base iOS size measurements
arun279 Sep 19, 2026
0766455
Restrict Android cleartext exceptions to HTTP loopback
arun279 Sep 19, 2026
1f516f6
Capture signed-in Android tabs with local Trakt artwork
arun279 Sep 19, 2026
90ee438
Declare the exact loopback domain in Android network security
arun279 Sep 19, 2026
2fd6ee0
Merge remote-tracking branch 'origin/feat/expo-native' into feat/scre…
arun279 Sep 19, 2026
bf5de35
Present the episode sheet without a nav header
arun279 Sep 19, 2026
e8e5213
Say a show's progress once, and fold More into the overview
arun279 Sep 19, 2026
5818ff3
Merge ci/honest-sizes into feat/expo-native
arun279 Sep 19, 2026
5b9a8ed
Use the device-code connect flow for Android UI capture
arun279 Sep 19, 2026
e900d8a
Make network harness retries deterministic
arun279 Sep 19, 2026
c6e6f29
Merge fix/android-first-run into feat/expo-native
arun279 Sep 19, 2026
a3a9b26
Synchronize network harness on runtime events
arun279 Sep 19, 2026
b9d6795
Refuse unsupported Node versions
arun279 Sep 19, 2026
e2eceed
Lay the episode sheet out instead of scrolling it
arun279 Sep 19, 2026
c1fd1f7
Reuse native builds by Expo fingerprint
arun279 Sep 19, 2026
d7d0862
Repaint episode detail after undo
arun279 Sep 19, 2026
9027c09
Overlap native UI validation with build setup
arun279 Sep 19, 2026
68a4c42
Fix fast validation failures
arun279 Sep 19, 2026
c0b8422
Allow Expo configuration cache inputs
arun279 Sep 19, 2026
4c6298f
Stabilize startup timing gate
arun279 Sep 19, 2026
506ef24
Merge ci/fast-pr-validation into feat/expo-native
arun279 Sep 19, 2026
92a634b
Make the fake approve a device grant on request
arun279 Sep 19, 2026
17cfce1
Fit the episode sheet inside its compact detent
arun279 Sep 19, 2026
8b4a078
Merge feat/expo-native into feat/screens-show-detail
arun279 Sep 19, 2026
1650ab5
Simplify pull request footprint gates
arun279 Sep 19, 2026
9baedf2
Gate unexplained artifact growth
arun279 Sep 19, 2026
bf075f6
Gate app idle and visible feedback
arun279 Sep 19, 2026
4acb6d7
Merge feat/screens-show-detail into feat/expo-native
arun279 Sep 19, 2026
718c1dc
Gate render regressions and Android ANRs
arun279 Sep 19, 2026
bbfb3e7
Gate coverage on changed core lines
arun279 Sep 19, 2026
176bcbd
Reconcile current target changes
arun279 Sep 19, 2026
383c5a5
Sync current target
arun279 Sep 19, 2026
b538fbc
Build the Library screen over the shared library read
arun279 Sep 19, 2026
ac7a117
Cover the Library states, chips and order
arun279 Sep 19, 2026
6f3d865
Walk the Library screen in a flow
arun279 Sep 19, 2026
8174258
Fix behavior gate execution
arun279 Sep 19, 2026
9c34c29
Keep the Library tools reachable at the largest text
arun279 Sep 19, 2026
e1cb36e
Let Clear filter take the first tap
arun279 Sep 19, 2026
5cf7b85
Share the perf harness between the two screens
arun279 Sep 19, 2026
90ef22e
Gate exact render counts only
arun279 Sep 19, 2026
4a85d3f
Build the Calendar screen over the shared airing row
arun279 Sep 19, 2026
0fac68c
Merge ci/gate-audit into feat/expo-native
arun279 Sep 19, 2026
acfc6aa
Prove the calendar on a device, and reseed the shape witness
arun279 Sep 19, 2026
909569b
Merge feat/expo-native into feat/screens-library
arun279 Sep 19, 2026
4d743ac
Restore footprint data from successful jobs
arun279 Sep 19, 2026
a86b39e
Run app-idle measurement after relaunching flows
arun279 Sep 19, 2026
58f570c
Merge remote-tracking branch 'origin/feat/expo-native' into feat/scre…
arun279 Sep 19, 2026
6894561
Merge feat/screens-library into feat/expo-native
arun279 Sep 19, 2026
c433873
Merge remote-tracking branch 'origin/feat/expo-native' into feat/scre…
arun279 Sep 19, 2026
65556d4
Draw the monogram from its plate, not the text scale
arun279 Sep 19, 2026
9417686
Share the font-scale mock across the row tests
arun279 Sep 19, 2026
b2be4f2
Cover shared airing grammar branches
arun279 Sep 19, 2026
ddd3b6b
Verify the implemented Calendar tab on Android
arun279 Sep 19, 2026
e334b6d
Merge remote-tracking branch 'origin/feat/expo-native' into fix/detai…
arun279 Sep 19, 2026
1195a83
Refresh pull request policy inputs
arun279 Sep 19, 2026
7d7636b
Build the Search screen over the platform field
arun279 Sep 19, 2026
ae44919
Drop the explanatory comments from the polish fixes
arun279 Sep 19, 2026
f5c7346
Prove Search by test and by flow
arun279 Sep 19, 2026
ec0de71
Read the live pull request description in the rationale gates
arun279 Sep 19, 2026
c694c0f
Merge fix/detail-polish into feat/expo-native
arun279 Sep 19, 2026
4f4dd83
Remember searches, not the prefixes typed through them
arun279 Sep 19, 2026
42cf3e7
Merge feat/screens-calendar into feat/expo-native
arun279 Sep 19, 2026
22469d3
Reach the movies grid past the fold in the flow
arun279 Sep 19, 2026
527a4c6
Build movie detail with reversible watch actions
arun279 Sep 19, 2026
a78ce37
Read the search failure through the shared status mapper
arun279 Sep 19, 2026
8ae9bb6
Hold the mock harness to what the fake now serves
arun279 Sep 19, 2026
ba01f5a
Verify movie related query cache isolation
arun279 Sep 19, 2026
0f40ded
Merge remote-tracking branch 'origin/feat/expo-native' into feat/scre…
arun279 Sep 19, 2026
5b26d92
Target the native movie menu by its accessible label
arun279 Sep 19, 2026
143a196
Stabilize Search CI coverage and device checks
arun279 Sep 19, 2026
a355a19
Keep shared idle markers visible on Android
arun279 Sep 19, 2026
ee5fef1
Build native history screen
arun279 Sep 19, 2026
97ceb9a
Baseline history render count
arun279 Sep 19, 2026
bf01a4b
Expose detail art and related fixtures
arun279 Sep 19, 2026
11df1d9
Keep CI markers platform-visible
arun279 Sep 19, 2026
d2df593
Align history search placement and native dismissal
arun279 Sep 19, 2026
99bd114
Stabilize show bulk mark tap
arun279 Sep 19, 2026
c54c4bc
Merge feat/screens-search into feat/expo-native
arun279 Sep 19, 2026
9d8877c
Keep season action clear of detail header
arun279 Sep 19, 2026
dc2488c
Merge updated Expo base
arun279 Sep 19, 2026
4211c0f
Merge remote-tracking branch 'origin/feat/expo-native' into feat/scre…
arun279 Sep 19, 2026
9ccc791
Build Profile and Settings screens
arun279 Sep 19, 2026
8eeaafc
Keep show season action clear of header
arun279 Sep 19, 2026
3b7660c
Make the month jump reachable by assistive tech
arun279 Sep 19, 2026
2364910
Move season action below sticky content
arun279 Sep 19, 2026
514c0d2
Retry the safely positioned season action
arun279 Sep 19, 2026
fc71c78
Hold the month jump and the time column at large text
arun279 Sep 19, 2026
9a1b4ff
Expose History headers and repeat plays
arun279 Sep 19, 2026
060de4e
Fix show-detail-bulk-mark flow on taller iOS screen
arun279 Sep 19, 2026
55a321e
Reset fake before History device flow
arun279 Sep 19, 2026
4515d93
Merge feat/screens-movie-detail into feat/expo-native
arun279 Sep 19, 2026
1d07a74
Assert History count through the accessible row
arun279 Sep 19, 2026
b87620c
Add deliberate EAS update publishing
arun279 Sep 19, 2026
ca719a0
Prove the sign-out flow against the fake Trakt
arun279 Sep 19, 2026
7869cbd
Merge feat/screens-history into feat/expo-native
arun279 Sep 19, 2026
2d54b39
Merge feat/eas-update into feat/expo-native
arun279 Sep 19, 2026
029f745
Centre a failed state's action and widen the picker value
arun279 Sep 20, 2026
e6ecdf9
Merge feat/screens-account into feat/expo-native
arun279 Sep 20, 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
  •  
  •  
  •  
151 changes: 98 additions & 53 deletions .dependency-cruiser.cjs
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
// dependency-cruiser resolves every `to.path` against the *resolved* module
// path, not the import specifier. Under pnpm that means npm packages surface as
// `node_modules/.pnpm/<pkg>@<ver>/node_modules/<pkg>/...`, so npm bans must match
// the `(^|/)node_modules/<pkg>/` tail: a bare `^react` / `^@capacitor/` anchor
// never fires. Node built-ins carry dependencyType "core", matched separately.
// the `(^|/)node_modules/<pkg>/` tail. Node built-ins carry dependencyType
// "core", matched separately.
// An UNINSTALLED package is the one exception: nothing resolves it, so its
// module path is the specifier itself, which is why the expo and react-native
// bans below carry both spellings.
const RE_REACT = "(^|/)node_modules/react/";
const RE_REACT_DOM = "(^|/)node_modules/react-dom/";
const RE_CAPACITOR = "(^|/)node_modules/@capacitor/";
const RE_DOES_NOT_SHIP_DIRECTORY = "^(docs|\\.github|e2e|test|assets|scripts/mock-trakt)(/|$)";
const RE_DOES_NOT_SHIP_MARKDOWN = "^[^/]*\\.md$";
const RE_DOES_NOT_SHIP_FILE =
"^(LICENSE|playwright\\.config\\.ts|vitest\\.config\\.ts|lefthook\\.yml|cspell\\.json|dprint\\.json|biome\\.jsonc|knip\\.json|\\.jscpd\\.json|\\.dependency-cruiser\\.cjs|\\.env\\.example|\\.env\\.test|\\.env\\.mock|\\.gitignore)$";

const RE_NATIVE = ["(^|/)node_modules/(expo|react-native)([-/]|$)", "^(expo|react-native)([-/]|$)"];
const RE_DOM_ONLY = [
RE_REACT_DOM,
"(^|/)node_modules/idb-keyval/",
"(^|/)node_modules/radix-ui/",
"(^|/)node_modules/@tanstack/react-router/",
"(^|/)node_modules/@tanstack/react-virtual/",
"(^|/)node_modules/lucide-react/",
];
/** @type {import("dependency-cruiser").IConfiguration} */
module.exports = {
forbidden: [
Expand All @@ -21,98 +27,137 @@ module.exports = {
from: {},
to: { circular: true },
},
// These patterns mirror DOES_NOT_SHIP in test/ci/release-paths.test.ts.
// Changes to that list require matching updates here.
// Known gaps: this rule is static analysis over import specifiers that
// dependency-cruiser can resolve. import.meta.glob(...) and
// new URL("...", import.meta.url) are invisible to it. Neither produces a
// resolvable import edge that dependency-cruiser follows, so a file matched
// by either idiom is never flagged, even if it points at a non-shipping
// path. import.meta.glob(...) is already used in
// src/ui/screens/settings/Settings.tsx. Also, from.path "^src/" covers only
// the first edge out of src. It does not cover a transitive hop through a
// non-src root file that imports a non-shipping path.
{
name: "src-no-non-shipping-imports",
name: "packages-declare-their-imports",
severity: "error",
comment:
"Importing a non-shipping path into src can put it in the production bundle while mobile release paths-ignore still skips changes to it.",
from: { path: "^src/" },
to: {
path: [RE_DOES_NOT_SHIP_DIRECTORY, RE_DOES_NOT_SHIP_MARKDOWN, RE_DOES_NOT_SHIP_FILE],
},
"dependency-cruiser's own no-non-package-json, anchored at the packages. A package may import only what its OWN manifest declares. `nodeLinker: hoisted` (pnpm-workspace.yaml) puts every transitive dependency at the workspace root where any package can reach it undeclared, which is the strictness the default linker exists to provide and the price the native package's resolver charges for it. knip's dependency lane does not close this: react is a peerDependency of @tanstack/react-query, so it read 33 undeclared react imports in @cue/core as satisfied.",
from: { path: "^packages/" },
to: { dependencyTypes: ["npm-no-pkg", "npm-unknown", "unknown"] },
},
{
name: "domain-stays-pure",
severity: "error",
comment:
"src/domain is runtime-agnostic: global fetch + zod only. No data/ui/app/platform, no react, no react-dom, no capacitor.",
from: { path: "^src/domain/" },
"The domain is runtime-agnostic: global fetch + zod only. Stated positively, as what it MAY reach rather than as a list of the directories it may not: the ban then covers a directory added to the core tomorrow instead of waiting to be amended. In-repo, the domain may reach the domain and nothing else; from npm it may take no react and no react-dom.",
from: { path: "^packages/core/src/domain/" },
to: {
path: ["^src/(data|ui|platform|app)/", RE_REACT, RE_REACT_DOM, RE_CAPACITOR],
path: ["^packages/", RE_REACT, RE_REACT_DOM],
pathNot: "^packages/core/src/domain/",
},
},
{
name: "domain-no-node-builtins",
severity: "error",
comment:
"src/domain must not touch Node built-ins (fs/path/crypto/...); it runs in browser + native.",
from: { path: "^src/domain/" },
"The domain must not touch Node built-ins (fs/path/crypto/...); it runs in a browser and on a native engine. Kept beside the other domain rules even though core-stays-portable-node bans them across the package, because the stricter statement belongs where the domain rules are read.",
from: { path: "^packages/core/src/domain/" },
to: { dependencyTypes: ["core"] },
},
{
name: "data-stays-headless",
severity: "error",
comment:
"src/data (clients/repos) may import domain, but never ui/app/platform, react, or react-dom.",
from: { path: "^src/data/" },
to: { path: ["^src/(ui|app|platform)/", RE_REACT, RE_REACT_DOM] },
"The data layer (clients/repos) is stated the same way round: in-repo it may reach the domain, its own tree and the ports it is filled through, and nothing else. That is what keeps a repository from reaching a hook, a store or the auth layer, which the directory blacklist this replaces stopped covering the moment those trees moved into the core. From npm it may take no react and no react-dom.",
from: { path: "^packages/core/src/data/" },
to: {
path: ["^packages/", RE_REACT, RE_REACT_DOM],
pathNot: "^packages/core/src/(data|domain|ports)/",
},
},
{
name: "ports-have-no-impls",
severity: "error",
comment:
"A port is a seam the apps fill, so it may take value imports from the domain, from its sibling ports and from react, and nothing else. Stated that way rather than as 'types only': token-store.ts imports tokenSchema, a zod value, from domain/model/token, and five of the ports publish a React context and hook beside their interface, which is how a component reaches the injected instance. React is the injection mechanism rather than an implementation, and everything an implementation would actually need (the DOM, idb-keyval or expo) is still banned here by core-stays-portable and by biome's globals override over this package.",
from: { path: "^packages/core/src/ports/" },
to: {
dependencyTypesNot: ["type-only"],
pathNot: ["^packages/core/src/(ports|domain)/", RE_REACT],
},
},
{
name: "ui-no-platform-impl",
name: "core-stays-portable",
severity: "error",
comment:
"src/ui depends on domain/data abstractions; platform impls and the app composition root are injected, not imported directly.",
from: { path: "^src/ui/" },
to: { path: "^src/(platform|app)/" },
"@cue/core executes independently of its Expo host, so it takes neither DOM libraries nor React Native or Expo. Anchored at src because the package's own test suite runs on Node and reads git.",
from: { path: "^packages/core/src/" },
to: { path: [...RE_DOM_ONLY, ...RE_NATIVE] },
},
{
name: "core-stays-portable-node",
severity: "error",
comment:
"The other half of the same ban. It has to be a second rule: a `to` clause is a conjunction, so one rule carrying both the package list and dependencyTypes would read 'a module whose path matches AND which is a Node built-in', which is never true.",
from: { path: "^packages/core/src/" },
to: { dependencyTypes: ["core"] },
},
{
name: "queries-have-no-react",
severity: "error",
comment: "Query option factories cannot import React.",
from: { path: "^packages/core/src/queries/" },
to: { path: RE_REACT },
},
{
name: "core-imports-no-app",
severity: "error",
comment:
"The shared package imports neither app. Dependencies flow into the core and never back out, or the claim that both targets run the same code is only a claim.",
from: { path: "^packages/core/" },
to: { path: "^packages/native/" },
},
{
name: "native-owns-expo",
severity: "error",
comment: "Expo and React Native belong to the native app and to nothing else.",
from: { path: "^packages/", pathNot: "^packages/native/" },
to: { path: RE_NATIVE },
},
{
name: "trakt-reads-stay-pooled",
severity: "error",
comment:
"src/data/trakt/endpoints.ts issues raw, unpooled GETs. Only read-budget.ts " +
"data/trakt/endpoints.ts issues raw, unpooled GETs. Only read-budget.ts " +
"(the pool primitive) and pooled-endpoints.ts (its wrapper for every other " +
"caller) may import it directly: every other read must go through a pooled " +
"wrapper, so a read reachable from the runtime without withReadRateRetry " +
"fails here by naming the unpooled importer, instead of only an instance test " +
"that a mutation can dodge by pooling one caller and leaving the rest raw.",
from: {
path: "^src/",
pathNot: "^src/data/trakt/(read-budget|pooled-endpoints)\\.ts$",
path: "^packages/[^/]+/src/",
pathNot: "^packages/core/src/data/trakt/(read-budget|pooled-endpoints)\\.ts$",
},
to: { path: "^src/data/trakt/endpoints\\.ts$" },
to: { path: "^packages/core/src/data/trakt/endpoints\\.ts$" },
},
{
name: "capacitor-only-in-platform",
name: "mark-revalidation-stays-scoped",
severity: "error",
comment:
"@capacitor/* is imported ONLY in src/platform, keeping domain/data/ui/app portable and testable without native mocks.",
from: { path: "^src/", pathNot: "^src/platform/" },
to: { path: RE_CAPACITOR },
"query-invalidation.ts refreshes a marked show's OWN detail reads and " +
"deliberately leaves the Up Next aggregate alone, so a surface that calls it " +
"directly ticks show detail and leaves the queue row reading pre-mark " +
"progress. Only hooks/library-cache.ts may reach it from the hook and UI " +
"layers: its refreshShowProgress pairs that invalidation with the scoped " +
"progress read that replaces the one library entry, so a new mark surface " +
"fails here rather than shipping a queue that quietly stops moving.",
from: {
path: "^packages/[^/]+/(src/(hooks|queries|stores|ui|screens)|app)/",
pathNot: "^packages/core/src/hooks/library-cache\\.ts$",
},
to: { path: "^packages/core/src/data/query-invalidation\\.ts$" },
},
],
options: {
doNotFollow: { path: "node_modules" },
// Anchor to project root: an unanchored `(^|/)dist/` also matched
// node_modules/@capacitor/core/dist/*, silently excluding capacitor from the
// graph so every capacitor ban passed.
exclude: { path: "^(dist|coverage|ios|android)/" },
exclude: { path: "^(packages/[^/]+/(dist|coverage)|coverage)/" },
tsPreCompilationDeps: true,
tsConfig: { fileName: "tsconfig.json" },
enhancedResolveOptions: {
// Capacitor ships only `main`/`module` (no `exports`), so an
// `exportsFields`-only resolver drops it from the graph entirely and every
// capacitor ban silently passes. Listing `mainFields` restores resolution.
// exportsFields is what resolves @cue/core/... at all: the package declares
// one wildcard subpath key and no main.
// preserveSymlinks defaults to false, which resolves the workspace link to
// its realpath under packages/core, which is what makes the anchors above
// match instead of node_modules.
exportsFields: ["exports"],
conditionNames: ["import", "require", "node", "browser", "default"],
mainFields: ["module", "browser", "main"],
Expand Down
15 changes: 0 additions & 15 deletions .env.example

This file was deleted.

4 changes: 0 additions & 4 deletions .env.mock

This file was deleted.

1 change: 0 additions & 1 deletion .env.test

This file was deleted.

4 changes: 4 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ updates:
directory: /.github/actions/setup-node-pnpm
schedule:
interval: weekly
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
- package-ecosystem: bundler
directory: /
schedule:
Expand Down
Loading
Loading