53c0e095cf
The data layer is now reached through one pulled, version-pinned engagement (`.project/concepts/data-layer/contract_polyfill-surface.md`, @1ecf511e9d). That copy is the only reference: the provider's sources are never opened, and what the contract does not answer is a gap raised with it, never worked around here. Surface - `@ng-eventually/sdk` -> `@ng-eventually/polyfill`, one entry point. - `configure` loses `getSession`, `normalizeId`, `currentUser`; the session belongs to the package and its own `init` captures it. - Placement is named by scope alone -- a session is one user, so the app no longer passes an identity it had no way to obtain. This removes a constant that made every user collide on one owner's document. - `init(...)` then `await ensureIdentity()`, in that order, as one sequence: React runs child effects first, so the two calls sat in the wrong order and the contract now makes that throw. - `sessionId` relayed as `string | number`, `materialize` -> `read`. A rejection means "unknown", never "absent" Four places treated a caught error as an empty result. The worst wrote a duplicate participation: an unknown count read as zero defeated the idempotence guard of `joinEvent`. Also fixed: a per-document count, a silently dropped notification shown optimistically anyway, and a failed listing that left the owned-event set empty and disabled the materializer for the whole session. Shared identity is not a Festipod notion A browser context is one user. The per-scenario identity plant is deleted at its source and its five sites; what stays is the deployment's wallet file, which the contract requires an application to serve. Documentation The doctrine no longer describes how the data layer works underneath: five leaves whose subject was internals are gone, a dozen more are re-founded on the contract's own words, and two frozen arbitrations about a deleted screen were removed rather than left to mislead a future session. Test harness It can sign in at last: cucumber runs under node, which does not load `.env`, so the harness never received the wallet material and every scenario silently fell back to an empty local mode. A failed sign-in is now loud on both sides. The suite also releases what it opens and exits on its own -- runs were still resident hours after reporting, holding a browser and two servers. Known red: `@data` cannot be measured. The served wallet accumulates and nothing resets it; moving the browser profile aside does not, since the data lives in the wallet file, not the profile.
70 lines
2.7 KiB
JSON
70 lines
2.7 KiB
JSON
{
|
|
"name": "festipod",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "portless festipod bun --hot src/index.ts",
|
|
"start": "NODE_ENV=production bun src/index.ts",
|
|
"build": "bun run build.ts",
|
|
"test:cucumber": "bun run cucumber:run && bun run cucumber:report && bun run features:parse && bun run steps:extract",
|
|
"cucumber:run": "node --import tsx/esm node_modules/@cucumber/cucumber/bin/cucumber.js --config cucumber.json",
|
|
"test:data": "node --import tsx/esm node_modules/@cucumber/cucumber/bin/cucumber.js --config cucumber.json --tags @data",
|
|
"test:auth-setup": "bun scripts/setup-test-auth.ts",
|
|
"cucumber:report": "bun scripts/parse-test-results.ts",
|
|
"features:parse": "bun scripts/parse-features.ts",
|
|
"steps:extract": "bun scripts/extract-step-definitions.ts",
|
|
"build:orm": "rdf-orm build --input ./src/shared/shapes/shex --output ./src/shared/shapes/orm",
|
|
"validate": "bun scripts/validate.ts",
|
|
"build:ng": "bash scripts/build-ng-packages.sh",
|
|
"link:polyfill": "bun scripts/link-polyfill.ts",
|
|
"storybook": "storybook dev -p 6006",
|
|
"build-storybook": "storybook build"
|
|
},
|
|
"dependencies": {
|
|
"@ng-eventually/polyfill": "git+https://gitea.reconnexion.apps.gueraud.net/Reconnexion/ng-eventually.git#main&path:/packages/polyfill",
|
|
"@ng-org/alien-deepsignals": "0.1.2-alpha.11",
|
|
"@ng-org/orm": "0.1.2-alpha.18",
|
|
"@ng-org/shex-orm": "0.1.2-alpha.8",
|
|
"@ng-org/web": "0.1.2-alpha.13",
|
|
"@radix-ui/react-label": "^2.1.7",
|
|
"@radix-ui/react-select": "^2.2.6",
|
|
"@radix-ui/react-slot": "^1.2.3",
|
|
"@radix-ui/react-tooltip": "^1.2.8",
|
|
"bun-plugin-tailwind": "^0.1.2",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"lucide-react": "^0.545.0",
|
|
"react": "^19",
|
|
"react-dom": "^19",
|
|
"tailwind-merge": "^3.3.1"
|
|
},
|
|
"devDependencies": {
|
|
"@cucumber/cucumber": "^12.5.0",
|
|
"@cucumber/gherkin": "^29.0.0",
|
|
"@cucumber/messages": "^26.0.1",
|
|
"@types/bun": "latest",
|
|
"@types/chai": "^5.2.3",
|
|
"@types/react": "^19",
|
|
"@types/react-dom": "^19",
|
|
"chai": "^6.2.2",
|
|
"happy-dom": "^16.6.0",
|
|
"playwright": "^1.58.2",
|
|
"tailwindcss": "^4.1.11",
|
|
"tsx": "^4.21.0",
|
|
"tw-animate-css": "^1.4.0",
|
|
"storybook": "^10.3.5",
|
|
"@storybook/react-webpack5": "^10.3.5",
|
|
"@storybook/addon-webpack5-compiler-swc": "^4.0.3",
|
|
"@storybook/addon-a11y": "^10.3.5",
|
|
"@storybook/addon-docs": "^10.3.5",
|
|
"@storybook/addon-onboarding": "^10.3.5"
|
|
},
|
|
"pnpm": {
|
|
"onlyBuiltDependencies": [
|
|
"bun"
|
|
]
|
|
},
|
|
"packageManager": "pnpm@10.26.0+sha512.3b3f6c725ebe712506c0ab1ad4133cf86b1f4b687effce62a9b38b4d72e3954242e643190fc51fa1642949c735f403debd44f5cb0edd657abe63a8b6a7e1e402"
|
|
}
|