diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f1039e9e..ff6a81ec4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 For changes prior to v1.0.0, see the [legacy releases](https://legacy.inertiajs.com/releases). -## [Unreleased](https://github.com/inertiajs/inertia/compare/v2.0.0...HEAD) - -- Nothing +## [Unreleased](https://github.com/inertiajs/inertia/compare/v2.0.2...HEAD) + +- Nothing yet + +## [v2.0.2](https://github.com/inertiajs/inertia/compare/v2.0.1...v2.0.2) + +- Fix SSR with scroll restoration ([#2190](https://github.com/inertiajs/inertia/pull/2190)) +- Fix for scroll + back bug ([#2191](https://github.com/inertiajs/inertia/pull/2191)) +- Backport 1.x fixes from [v1.3.0](https://github.com/inertiajs/inertia/releases/tag/v1.3.0) release ([#2193](https://github.com/inertiajs/inertia/pull/2193)) + +## [v2.0.1](https://github.com/inertiajs/inertia/compare/v2.0.0...v2.0.1) + +- Fix playground dependencies ([#2070](https://github.com/inertiajs/inertia/pull/2070)) +- Removed Vitest tests + dependencies ([#2175](https://github.com/inertiajs/inertia/pull/2175)) +- Augment `vue` instead of `@vue/runtime-core` ([#2099](https://github.com/inertiajs/inertia/pull/2099)) +- Fix prefetch missing `cacheFor` default value ([#2136](https://github.com/inertiajs/inertia/pull/2136)) +- Fix `useForm` re-renders by memoizing functions in React [#2146](https://github.com/inertiajs/inertia/pull/2146) +- WhenVisible useEffect function is not recreated when params change. ([#2153](https://github.com/inertiajs/inertia/pull/2153)) +- Ensure callback execution ([#2163](https://github.com/inertiajs/inertia/pull/2163)) +- More resilient logic for stripping the origin from page URLs ([#2164](https://github.com/inertiajs/inertia/pull/2164)) +- Add helper scripts for running tests ([#2173](https://github.com/inertiajs/inertia/pull/2173)) +- Export `InertiaFormProps` in React ([#2161](https://github.com/inertiajs/inertia/pull/2161)) +- Use default empty object in `useForm` Vue and Svelte ([#2052](https://github.com/inertiajs/inertia/pull/2052)) +- Remove `data` option from `useForm` options type ([#2060](https://github.com/inertiajs/inertia/pull/2060)) +- Take over scroll restoration from browser ([#2051](https://github.com/inertiajs/inertia/pull/2051)) ## [v2.0.0](https://github.com/inertiajs/inertia/compare/v1.2.0...v2.0.0) diff --git a/package-lock.json b/package-lock.json index f885da30b..12520117b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -829,19 +829,6 @@ "resolved": "playgrounds/vue3", "link": true }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", @@ -1227,13 +1214,6 @@ "win32" ] }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, "node_modules/@sveltejs/package": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/@sveltejs/package/-/package-2.3.7.tgz", @@ -1445,109 +1425,6 @@ "vue": "^3.2.25" } }, - "node_modules/@vitest/expect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", - "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", - "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "1.6.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", - "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", - "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/@volar/language-core": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.4.1.tgz", @@ -1818,19 +1695,6 @@ "acorn": ">=8.9.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/alien-signals": { "version": "0.4.12", "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.12.tgz", @@ -1851,19 +1715,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -1901,16 +1752,6 @@ "node": ">= 0.4" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2051,16 +1892,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", @@ -2121,38 +1952,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -2234,13 +2033,6 @@ "node": ">= 6" } }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2339,19 +2131,6 @@ "dev": true, "license": "MIT" }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -2384,16 +2163,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -2569,30 +2338,6 @@ "@types/estree": "^1.0.0" } }, - "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -2784,16 +2529,6 @@ "node": ">=6.9.0" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/get-intrinsic": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", @@ -2831,19 +2566,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -2914,21 +2636,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/happy-dom": { - "version": "14.12.3", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-14.12.3.tgz", - "integrity": "sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.5.0", - "webidl-conversions": "^7.0.0", - "whatwg-mimetype": "^3.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -2969,16 +2676,6 @@ "integrity": "sha512-BYh0wceM2Vm4/Q8TNfnKaHXs4DCv2DuYVS87DR40elSvFc+8a6B9mE9ej+8nCOkdqPx7puEx9+hm+GoJ3f9PzA==", "license": "Public Domain" }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, "node_modules/ignore-walk": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", @@ -3116,19 +2813,6 @@ "@types/estree": "^1.0.6" } }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3162,13 +2846,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -3245,23 +2922,6 @@ "dev": true, "license": "MIT" }, - "node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/locate-character": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", @@ -3302,16 +2962,6 @@ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "license": "MIT" }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -3354,13 +3004,6 @@ "dev": true, "license": "CC0-1.0" }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3406,19 +3049,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -3445,19 +3075,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mlly": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz", - "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.14.0", - "pathe": "^1.1.2", - "pkg-types": "^1.2.1", - "ufo": "^1.5.4" - } - }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -3637,35 +3254,6 @@ "node": ">=10" } }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3708,22 +3296,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -3825,23 +3397,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/periscopic": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", @@ -3894,18 +3449,6 @@ "node": ">= 6" } }, - "node_modules/pkg-types": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.0.tgz", - "integrity": "sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.3", - "pathe": "^1.1.2" - } - }, "node_modules/playwright": { "version": "1.49.1", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", @@ -4207,21 +3750,6 @@ } } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -4308,13 +3836,6 @@ "react": "^19.0.0" } }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -4579,13 +4100,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -4624,20 +4138,6 @@ "node": ">=0.10.0" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", - "dev": true, - "license": "MIT" - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -4742,32 +4242,6 @@ "node": ">=8" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -4991,33 +4465,6 @@ "globrex": "^0.1.2" } }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5055,16 +4502,6 @@ "dev": true, "license": "0BSD" }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/typescript": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", @@ -5078,13 +4515,6 @@ "node": ">=14.17" } }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true, - "license": "MIT" - }, "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", @@ -5190,29 +4620,6 @@ } } }, - "node_modules/vite-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", - "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/vite-plugin-full-reload": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/vite-plugin-full-reload/-/vite-plugin-full-reload-1.2.0.tgz", @@ -5688,72 +5095,6 @@ } } }, - "node_modules/vitest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", - "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.0", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.0", - "@vitest/ui": "1.6.0", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, "node_modules/vscode-uri": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", @@ -5840,26 +5181,6 @@ "vscode-uri": "^3.0.8" } }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5876,23 +5197,6 @@ "node": ">= 8" } }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -6052,7 +5356,7 @@ }, "packages/core": { "name": "@jamesst20/inertia-core", - "version": "2.0.0", + "version": "2.0.2", "license": "MIT", "dependencies": { "axios": "^1.6.0", @@ -6066,9 +5370,7 @@ "@types/qs": "^6.9.0", "esbuild": "^0.16.13", "esbuild-node-externals": "^1.6.0", - "happy-dom": "^14.12.3", - "typescript": "^4.9.4", - "vitest": "^1.6.0" + "typescript": "^4.9.4" } }, "packages/core/node_modules/@types/node": { @@ -6094,10 +5396,10 @@ }, "packages/react": { "name": "@jamesst20/inertia-react", - "version": "2.0.0", + "version": "2.0.2", "license": "MIT", "dependencies": { - "@jamesst20/inertia-core": "file:../core", + "@jamesst20/inertia-core": "2.0.2", "lodash.isequal": "^4.5.0" }, "devDependencies": { @@ -6127,10 +5429,10 @@ }, "packages/svelte": { "name": "@jamesst20/inertia-svelte", - "version": "2.0.0", + "version": "2.0.2", "license": "MIT", "dependencies": { - "@jamesst20/inertia-core": "^2.0.0", + "@jamesst20/inertia-core": "2.0.2", "html-escape": "^2.0.0", "lodash": "^4.5.0" }, @@ -6743,10 +6045,10 @@ }, "packages/vue3": { "name": "@jamesst20/inertia-vue3", - "version": "2.0.0", + "version": "2.0.2", "license": "MIT", "dependencies": { - "@jamesst20/inertia-core": "file:../core", + "@jamesst20/inertia-core": "2.0.2", "lodash.clonedeep": "^4.5.0", "lodash.isequal": "^4.5.0" }, @@ -6778,7 +6080,7 @@ "playgrounds/react": { "name": "@jamesst20/inertia-react-playground", "devDependencies": { - "@jamesst20/inertia-react": "2.0.0", + "@jamesst20/inertia-react": "2.0.2", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", "@vitejs/plugin-react": "^4.3.2", @@ -6831,7 +6133,7 @@ "playgrounds/svelte4": { "name": "@jamesst20/inertia-svelte4-playground", "devDependencies": { - "@jamesst20/inertia-svelte": "2.0.0", + "@jamesst20/inertia-svelte": "2.0.2", "@sveltejs/vite-plugin-svelte": "^3.1.2", "@tsconfig/svelte": "^5.0.4", "autoprefixer": "^10.4.13", @@ -6944,7 +6246,7 @@ "playgrounds/svelte5": { "name": "@jamesst20/inertia-svelte5-playground", "devDependencies": { - "@jamesst20/inertia-svelte": "2.0.0", + "@jamesst20/inertia-svelte": "2.0.2", "@sveltejs/vite-plugin-svelte": "^4.0.0-next.6", "@tsconfig/svelte": "^5.0.4", "autoprefixer": "^10.4.13", @@ -6962,7 +6264,7 @@ "playgrounds/vue3": { "name": "@jamesst20/inertia-vue3-playground", "devDependencies": { - "@jamesst20/inertia-vue3": "2.0.0", + "@jamesst20/inertia-vue3": "2.0.2", "@vitejs/plugin-vue": "^5.0.5", "@volar/vue-typescript": "^1.0.22", "@vue/server-renderer": "^3.3.4", diff --git a/package.json b/package.json index 4422e28e4..6a16a35cb 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,14 @@ "packages/*", "playgrounds/*" ], + "scripts": { + "test:react": "cd tests && PACKAGE=react npx playwright test", + "test:react:watch": "cd packages/react/test-app && npm run watch", + "test:svelte": "cd tests && PACKAGE=svelte npx playwright test", + "test:svelte:watch": "cd packages/svelte/test-app && npm run watch", + "test:vue": "cd tests && PACKAGE=vue3 npx playwright test", + "test:vue:watch": "cd packages/vue3/test-app && npm run watch" + }, "dependencies": { "prettier": "^3.2.5", "prettier-plugin-organize-imports": "^4.1.0", diff --git a/packages/core/package.json b/packages/core/package.json index 5b582b7de..8d89cb198 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@jamesst20/inertia-core", - "version": "2.0.0", + "version": "2.0.2", "license": "MIT", "description": "A framework for creating server-driven single page apps.", "contributors": [ @@ -62,8 +62,6 @@ "@types/qs": "^6.9.0", "esbuild": "^0.16.13", "esbuild-node-externals": "^1.6.0", - "happy-dom": "^14.12.3", - "typescript": "^4.9.4", - "vitest": "^1.6.0" + "typescript": "^4.9.4" } } diff --git a/packages/core/src/eventHandler.ts b/packages/core/src/eventHandler.ts index 1eea3b978..4b33dbc19 100644 --- a/packages/core/src/eventHandler.ts +++ b/packages/core/src/eventHandler.ts @@ -15,6 +15,7 @@ class EventHandler { public init() { if (typeof window !== 'undefined') { window.addEventListener('popstate', this.handlePopstateEvent.bind(this)) + window.addEventListener('scroll', debounce(Scroll.onWindowScroll.bind(Scroll), 100), true) } if (typeof document !== 'undefined') { @@ -71,28 +72,26 @@ class EventHandler { url.hash = window.location.hash history.replaceState({ ...currentPage.get(), url: url.href }) - Scroll.reset(currentPage.get()) + Scroll.reset() return } - if (history.isValidState(state)) { - history - .decrypt(state.page) - .then((data) => { - currentPage.setQuietly(data, { preserveState: false }).then(() => { - Scroll.restore(currentPage.get()) - fireNavigateEvent(currentPage.get()) - }) - }) - .catch(() => { - this.onMissingHistoryItem() - }) - - return + if (!history.isValidState(state)) { + return this.onMissingHistoryItem() } - this.onMissingHistoryItem() + history + .decrypt(state.page) + .then((data) => { + currentPage.setQuietly(data, { preserveState: false }).then(() => { + Scroll.restore(history.getScrollRegions()) + fireNavigateEvent(currentPage.get()) + }) + }) + .catch(() => { + this.onMissingHistoryItem() + }) } } diff --git a/packages/core/src/history.ts b/packages/core/src/history.ts index 1f5c1b271..6534e3bb9 100644 --- a/packages/core/src/history.ts +++ b/packages/core/src/history.ts @@ -1,16 +1,18 @@ import { decryptHistory, encryptHistory, historySessionStorageKeys } from './encryption' import { page as currentPage } from './page' +import Queue from './queue' import { SessionStorage } from './sessionStorage' -import { Page } from './types' +import { Page, ScrollRegion } from './types' const isServer = typeof window === 'undefined' +const queue = new Queue>() +const isChromeIOS = !isServer && /CriOS/.test(window.navigator.userAgent) class History { public rememberedState = 'rememberedState' as const public scrollRegions = 'scrollRegions' as const public preserveUrl = false protected current: Partial = {} - protected queue: (() => Promise)[] = [] // We need initialState for `restore` protected initialState: Partial | null = null @@ -31,24 +33,31 @@ class History { } public pushState(page: Page, cb: (() => void) | null = null): void { - if (isServer || this.preserveUrl) { + if (isServer) { + return + } + + if (this.preserveUrl) { + cb && cb() return } this.current = page - this.addToQueue(() => { + queue.add(() => { return this.getPageData(page).then((data) => { - window.history.pushState( - { - page: data, - timestamp: Date.now(), - }, - '', - page.url, - ) - - cb && cb() + // Defer history.pushState to the next event loop tick to prevent timing conflicts. + // Ensure any previous history.replaceState completes before pushState is executed. + const doPush = () => { + this.doPushState({ page: data }, page.url) + cb && cb() + } + + if (isChromeIOS) { + setTimeout(doPush) + } else { + doPush() + } }) }) } @@ -60,13 +69,7 @@ class History { } public processQueue(): Promise { - const next = this.queue.shift() - - if (next) { - return next().then(() => this.processQueue()) - } - - return Promise.resolve() + return queue.process() } public decrypt(page: Page | null = null): Promise { @@ -95,34 +98,102 @@ class History { return pageData instanceof ArrayBuffer ? decryptHistory(pageData) : Promise.resolve(pageData) } + public saveScrollPositions(scrollRegions: ScrollRegion[]): void { + queue.add(() => { + return Promise.resolve().then(() => { + this.doReplaceState( + { + page: window.history.state.page, + scrollRegions, + }, + this.current.url!, + ) + }) + }) + } + + public saveDocumentScrollPosition(scrollRegion: ScrollRegion): void { + queue.add(() => { + return Promise.resolve().then(() => { + this.doReplaceState( + { + page: window.history.state.page, + documentScrollPosition: scrollRegion, + }, + this.current.url!, + ) + }) + }) + } + + public getScrollRegions(): ScrollRegion[] { + return window.history.state.scrollRegions || [] + } + + public getDocumentScrollPosition(): ScrollRegion { + return window.history.state.documentScrollPosition || { top: 0, left: 0 } + } + public replaceState(page: Page, cb: (() => void) | null = null): void { currentPage.merge(page) - if (isServer || this.preserveUrl) { + if (isServer) { + return + } + + if (this.preserveUrl) { + cb && cb() return } this.current = page - this.addToQueue(() => { + queue.add(() => { return this.getPageData(page).then((data) => { - window.history.replaceState( - { - page: data, - timestamp: Date.now(), - }, - '', - page.url, - ) - - cb && cb() + // Defer history.replaceState to the next event loop tick to prevent timing conflicts. + // Ensure any previous history.pushState completes before replaceState is executed. + const doReplace = () => { + this.doReplaceState({ page: data }, page.url) + cb && cb() + } + + if (isChromeIOS) { + setTimeout(doReplace) + } else { + doReplace() + } }) }) } - protected addToQueue(fn: () => Promise): void { - this.queue.push(fn) - this.processQueue() + protected doReplaceState( + data: { + page: Page | ArrayBuffer + scrollRegions?: ScrollRegion[] + documentScrollPosition?: ScrollRegion + }, + url: string, + ): void { + window.history.replaceState( + { + ...data, + scrollRegions: data.scrollRegions ?? window.history.state?.scrollRegions, + documentScrollPosition: data.documentScrollPosition ?? window.history.state?.documentScrollPosition, + }, + '', + url, + ) + } + + protected doPushState( + data: { + page: Page | ArrayBuffer + scrollRegions?: ScrollRegion[] + documentScrollPosition?: ScrollRegion + }, + url: string, + ): void { + window.history.pushState(data, '', url) } public getState(key: keyof Page, defaultValue?: T): any { @@ -145,6 +216,10 @@ class History { SessionStorage.remove(historySessionStorageKeys.iv) } + public setCurrent(page: Page): void { + this.current = page + } + public isValidState(state: any): boolean { return !!state.page } @@ -154,4 +229,8 @@ class History { } } +if (typeof window !== 'undefined' && window.history.scrollRestoration) { + window.history.scrollRestoration = 'manual' +} + export const history = new History() diff --git a/packages/core/src/initialVisit.ts b/packages/core/src/initialVisit.ts index 67d602748..afc43082d 100644 --- a/packages/core/src/initialVisit.ts +++ b/packages/core/src/initialVisit.ts @@ -27,11 +27,13 @@ export class InitialVisit { return false } + const scrollRegions = history.getScrollRegions() + history .decrypt() .then((data) => { currentPage.set(data, { preserveScroll: true, preserveState: true }).then(() => { - Scroll.restore(currentPage.get()) + Scroll.restore(scrollRegions) fireNavigateEvent(currentPage.get()) }) }) @@ -62,9 +64,8 @@ export class InitialVisit { .decrypt() .then(() => { const rememberedState = history.getState(history.rememberedState, {}) - const scrollRegions = history.getState(history.scrollRegions, []) + const scrollRegions = history.getScrollRegions() currentPage.remember(rememberedState) - currentPage.scrollRegions(scrollRegions) currentPage .set(currentPage.get(), { @@ -73,7 +74,7 @@ export class InitialVisit { }) .then(() => { if (locationVisit.preserveScroll) { - Scroll.restore(currentPage.get()) + Scroll.restore(scrollRegions) } fireNavigateEvent(currentPage.get()) @@ -91,7 +92,8 @@ export class InitialVisit { currentPage.setUrlHash(window.location.hash) } - currentPage.set(currentPage.get(), { preserveState: true }).then(() => { + currentPage.set(currentPage.get(), { preserveScroll: true, preserveState: true }).then(() => { + Scroll.restore(history.getScrollRegions()) fireNavigateEvent(currentPage.get()) }) } diff --git a/packages/core/src/navigationType.ts b/packages/core/src/navigationType.ts index 449451796..0202b47e3 100644 --- a/packages/core/src/navigationType.ts +++ b/packages/core/src/navigationType.ts @@ -2,11 +2,23 @@ class NavigationType { protected type: NavigationTimingType public constructor() { - if (typeof window !== 'undefined' && window?.performance.getEntriesByType('navigation').length > 0) { - this.type = (window.performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming).type - } else { - this.type = 'navigate' + this.type = this.resolveType() + } + + protected resolveType(): NavigationTimingType { + if (typeof window === 'undefined') { + return 'navigate' } + + if ( + window.performance && + window.performance.getEntriesByType && + window.performance.getEntriesByType('navigation').length > 0 + ) { + return (window.performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming).type + } + + return 'navigate' } public get(): NavigationTimingType { diff --git a/packages/core/src/page.ts b/packages/core/src/page.ts index 9a3e274ce..5d37cb083 100644 --- a/packages/core/src/page.ts +++ b/packages/core/src/page.ts @@ -56,8 +56,8 @@ class CurrentPage { return } - page.scrollRegions ??= [] page.rememberedState ??= {} + const location = typeof window !== 'undefined' ? window.location : new URL(page.url) replace = replace || isSameUrlWithoutHash(hrefToUrl(page.url), location) @@ -81,7 +81,7 @@ class CurrentPage { return this.swap({ component, page, preserveState }).then(() => { if (!preserveScroll) { - Scroll.reset(page) + Scroll.reset() } eventHandler.fireInternalEvent('loadDeferredProps') @@ -105,6 +105,7 @@ class CurrentPage { return this.resolve(page.component, page).then((component) => { this.page = page this.cleared = false + history.setCurrent(page) return this.swap({ component, page, preserveState }) }) } @@ -126,17 +127,15 @@ class CurrentPage { } public setUrlHash(hash: string): void { - this.page.url += hash + if (!this.page.url.includes(hash)) { + this.page.url += hash + } } public remember(data: Page['rememberedState']): void { this.page.rememberedState = data } - public scrollRegions(regions: Page['scrollRegions']): void { - this.page.scrollRegions = regions - } - public swap({ component, page, diff --git a/packages/core/src/queue.ts b/packages/core/src/queue.ts new file mode 100644 index 000000000..999733baf --- /dev/null +++ b/packages/core/src/queue.ts @@ -0,0 +1,27 @@ +export default class Queue { + protected items: (() => T)[] = [] + protected processingPromise: Promise | null = null + + public add(item: () => T) { + this.items.push(item) + return this.process() + } + + public process() { + this.processingPromise ??= this.processNext().then(() => { + this.processingPromise = null + }) + + return this.processingPromise + } + + protected processNext(): Promise { + const next = this.items.shift() + + if (next) { + return Promise.resolve(next()).then(() => this.processNext()) + } + + return Promise.resolve() + } +} diff --git a/packages/core/src/response.ts b/packages/core/src/response.ts index 4b905b666..c02f72281 100644 --- a/packages/core/src/response.ts +++ b/packages/core/src/response.ts @@ -3,44 +3,13 @@ import { fireErrorEvent, fireInvalidEvent, firePrefetchedEvent, fireSuccessEvent import { history } from './history' import modal from './modal' import { page as currentPage } from './page' +import Queue from './queue' import { RequestParams } from './requestParams' import { SessionStorage } from './sessionStorage' import { ActiveVisit, ErrorBag, Errors, Page } from './types' import { hrefToUrl, isSameUrlWithoutHash, setHashIfSameUrl } from './url' -class ResponseQueue { - protected queue: Response[] = [] - protected processing = false - - public add(response: Response) { - this.queue.push(response) - } - - public async process(): Promise { - if (this.processing) { - return Promise.resolve() - } - - this.processing = true - await this.processQueue() - this.processing = false - - return Promise.resolve() - } - - protected async processQueue(): Promise { - const nextResponse = this.queue.shift() - - if (nextResponse) { - await nextResponse.process() - return this.processQueue() - } - - return Promise.resolve() - } -} - -const queue = new ResponseQueue() +const queue = new Queue>() export class Response { constructor( @@ -60,8 +29,7 @@ export class Response { } public async handle() { - queue.add(this) - return queue.process() + return queue.add(() => this.process()) } public async process() { @@ -233,7 +201,7 @@ export class Response { setHashIfSameUrl(this.requestParams.all().url, responseUrl) - return responseUrl.href.split(responseUrl.host).pop() + return responseUrl.pathname + responseUrl.search + responseUrl.hash } protected mergeProps(pageResponse: Page): void { diff --git a/packages/core/src/router.ts b/packages/core/src/router.ts index 7d27fe232..f1f3c1cc8 100644 --- a/packages/core/src/router.ts +++ b/packages/core/src/router.ts @@ -114,6 +114,10 @@ export class Router { type: TEventName, callback: (event: GlobalEvent) => GlobalEventResult, ): VoidFunction { + if (typeof window === 'undefined') { + return () => {} + } + return eventHandler.onGlobalEvent(type, callback) } @@ -152,7 +156,7 @@ export class Router { if (!currentPage.isCleared() && !visit.preserveUrl) { // Save scroll regions for the current page - Scroll.save(currentPage.get()) + Scroll.save() } const requestParams: PendingVisit & VisitCallbacks = { @@ -187,7 +191,7 @@ export class Router { return prefetchedRequests.findInFlight(this.getPrefetchParams(href, options)) } - public prefetch(href: string | URL, options: VisitOptions = {}, { cacheFor }: PrefetchOptions) { + public prefetch(href: string | URL, options: VisitOptions = {}, { cacheFor = 30_000 }: PrefetchOptions) { if (options.method !== 'get') { throw new Error('Prefetch requests must use the GET method') } @@ -267,7 +271,7 @@ export class Router { protected clientVisit(params: ClientSideVisitOptions, { replace = false }: { replace?: boolean } = {}): void { const current = currentPage.get() - const props = typeof params.props === 'function' ? params.props(current.props) : params.props ?? current.props + const props = typeof params.props === 'function' ? params.props(current.props) : (params.props ?? current.props) currentPage.set( { diff --git a/packages/core/src/scroll.ts b/packages/core/src/scroll.ts index 8e528bc34..df1bb51be 100644 --- a/packages/core/src/scroll.ts +++ b/packages/core/src/scroll.ts @@ -1,23 +1,21 @@ import { history } from './history' -import { page as currentPage } from './page' -import { Page } from './types' +import { ScrollRegion } from './types' export class Scroll { - public static save(page: Page): void { - history.replaceState({ - ...page, - scrollRegions: Array.from(this.regions()).map((region) => ({ + public static save(): void { + history.saveScrollPositions( + Array.from(this.regions()).map((region) => ({ top: region.scrollTop, left: region.scrollLeft, })), - }) + ) } protected static regions(): NodeListOf { return document.querySelectorAll('[scroll-region]') } - public static reset(page: Page): void { + public static reset(): void { if (typeof window !== 'undefined') { window.scrollTo(0, 0) } @@ -31,7 +29,7 @@ export class Scroll { } }) - this.save(page) + this.save() if (window.location.hash) { // We're using a setTimeout() here as a workaround for a bug in the React adapter where the @@ -40,13 +38,11 @@ export class Scroll { } } - public static restore(page: Page): void { - if (!page.scrollRegions) { - return - } + public static restore(scrollRegions: ScrollRegion[]): void { + this.restoreDocument() this.regions().forEach((region: Element, index: number) => { - const scrollPosition = page.scrollRegions[index] + const scrollPosition = scrollRegions[index] if (!scrollPosition) { return @@ -61,11 +57,26 @@ export class Scroll { }) } + public static restoreDocument(): void { + const scrollPosition = history.getDocumentScrollPosition() + + if (typeof window !== 'undefined') { + window.scrollTo(scrollPosition.left, scrollPosition.top) + } + } + public static onScroll(event: Event): void { const target = event.target as Element if (typeof target.hasAttribute === 'function' && target.hasAttribute('scroll-region')) { - this.save(currentPage.get()) + this.save() } } + + public static onWindowScroll(): void { + history.saveDocumentScrollPosition({ + top: window.scrollY, + left: window.scrollX, + }) + } } diff --git a/packages/core/src/shouldIntercept.ts b/packages/core/src/shouldIntercept.ts index c46b9b5c2..5502e07bc 100644 --- a/packages/core/src/shouldIntercept.ts +++ b/packages/core/src/shouldIntercept.ts @@ -1,9 +1,18 @@ -export default function shouldIntercept(event: MouseEvent | KeyboardEvent): boolean { +// The actual event passed to this function could be a native JavaScript event +// or a React synthetic event, so we are picking just the keys needed here (that +// are present in both types). + +export default function shouldIntercept( + event: Pick< + MouseEvent, + 'altKey' | 'ctrlKey' | 'defaultPrevented' | 'target' | 'currentTarget' | 'metaKey' | 'shiftKey' | 'button' + >, +): boolean { const isLink = (event.currentTarget as HTMLElement).tagName.toLowerCase() === 'a' + return !( (event.target && (event?.target as HTMLElement).isContentEditable) || event.defaultPrevented || - (isLink && event.which > 1) || (isLink && event.altKey) || (isLink && event.ctrlKey) || (isLink && event.metaKey) || diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 57ab216ef..7ea5099ad 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -43,12 +43,15 @@ export interface Page { deferredProps?: Record mergeProps?: string[] - /** @internal */ - scrollRegions: Array<{ top: number; left: number }> /** @internal */ rememberedState: Record } +export type ScrollRegion = { + top: number + left: number +} + export interface ClientSideVisitOptions { component?: Page['component'] url?: Page['url'] diff --git a/packages/core/tests/page.test.ts b/packages/core/tests/page.test.ts deleted file mode 100644 index c97d763d0..000000000 --- a/packages/core/tests/page.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { test } from 'vitest' - -test('we can set the current page', { todo: true }, () => { - // sensible defaults for scrollRegions and rememberedState -}) - -test('we can set the current page and preserve scroll', { todo: true }, () => {}) - -test('we can replace the current page', { todo: true }, () => {}) - -test( - 'if there is a race condition we will not swap in an old component if there is a newer one', - { todo: true }, - () => {}, -) diff --git a/packages/core/tests/request.test.ts b/packages/core/tests/request.test.ts deleted file mode 100644 index ea4fe64d8..000000000 --- a/packages/core/tests/request.test.ts +++ /dev/null @@ -1,301 +0,0 @@ -import axios from 'axios' -import { beforeEach, expect, test, vi } from 'vitest' -import * as events from '../src/events' -import { page } from '../src/page' -import { Request } from '../src/request' -import { Response } from '../src/response' -import { axiosResponse, getRequestParams, homePage } from './support' - -beforeEach(() => { - vi.useFakeTimers() - - page.init({ - initialPage: homePage, - resolveComponent: async (component) => component, - swapComponent: async ({ component }) => component, - }) -}) - -vi.mock('axios') - -const axiosMock = vi.mocked(axios) - -test('create a request from the helper method', () => { - const request = Request.create(getRequestParams(), page.get()) - - expect(request).toBeInstanceOf(Request) -}) - -test('sending the correct headers for partial requests', async () => { - axiosMock.mockResolvedValue(axiosResponse()) - const responseHandleSpy = vi.spyOn(Response.prototype, 'handle').mockResolvedValue() - - const request = Request.create(getRequestParams({ only: ['foo', 'bar'] }), page.get()) - - await request.send() - - expect(axios).toHaveBeenCalledWith({ - method: 'get', - url: 'http://localhost:3000/', - data: {}, - headers: { - Accept: 'text/html, application/xhtml+xml', - 'X-Requested-With': 'XMLHttpRequest', - 'X-Inertia': true, - 'X-Inertia-Version': '1', - 'X-Inertia-Partial-Component': 'Home', - 'X-Inertia-Partial-Data': 'foo,bar', - }, - onUploadProgress: expect.any(Function), - params: {}, - signal: expect.any(Object), - }) - - expect(responseHandleSpy).toHaveBeenCalledOnce() -}) - -test('including inertia version request header', async () => { - await page.set({ - ...homePage, - version: '2', - }) - - const responseHandleSpy = vi.spyOn(Response.prototype, 'handle').mockResolvedValue() - - axiosMock.mockResolvedValue(axiosResponse()) - - const request = Request.create(getRequestParams(), page.get()) - - await request.send() - - expect(axios).toHaveBeenCalledWith({ - method: 'get', - url: 'http://localhost:3000/', - data: {}, - headers: { - Accept: 'text/html, application/xhtml+xml', - 'X-Requested-With': 'XMLHttpRequest', - 'X-Inertia': true, - 'X-Inertia-Version': '2', - }, - onUploadProgress: expect.any(Function), - params: {}, - signal: expect.any(Object), - }) - - expect(responseHandleSpy).toHaveBeenCalledOnce() -}) - -test('including the error bag in request header', async () => { - const responseHandleSpy = vi.spyOn(Response.prototype, 'handle').mockResolvedValue() - - axiosMock.mockResolvedValue(axiosResponse()) - - const request = Request.create( - getRequestParams({ - errorBag: 'error-tho', - }), - page.get(), - ) - - await request.send() - - expect(axios).toHaveBeenCalledWith({ - method: 'get', - url: 'http://localhost:3000/', - data: {}, - headers: { - Accept: 'text/html, application/xhtml+xml', - 'X-Requested-With': 'XMLHttpRequest', - 'X-Inertia': true, - 'X-Inertia-Version': '1', - 'X-Inertia-Error-Bag': 'error-tho', - }, - onUploadProgress: expect.any(Function), - params: {}, - signal: expect.any(Object), - }) - - expect(responseHandleSpy).toHaveBeenCalledOnce() -}) - -test('firing on progress events', { todo: true }, async () => { - // onProgress - // global -}) - -test.each([ - { - label: 'cancelling', - cancelParams: { - cancelled: true, - }, - expectedFinal: { - cancelled: true, - interrupted: false, - completed: false, - }, - }, - { - label: 'interrupting', - cancelParams: { - interrupted: true, - }, - expectedFinal: { - cancelled: false, - interrupted: true, - completed: false, - }, - }, -])('$label a request', async ({ cancelParams, expectedFinal }) => { - const responseHandleSpy = vi.spyOn(Response.prototype, 'handle').mockResolvedValue() - - const abortSpy = vi.spyOn(AbortController.prototype, 'abort') - const fireFinishEventsSpy = vi.spyOn(events, 'fireFinishEvent').mockReturnValue() - const fireStartEventsSpy = vi.spyOn(events, 'fireStartEvent').mockReturnValue() - const onCancel = vi.fn() - const onFinish = vi.fn() - const onStart = vi.fn() - - axiosMock.mockResolvedValue(axiosResponse()) - - const requestParams = getRequestParams({ - onCancel, - onFinish, - onStart, - }) - - const request = Request.create(requestParams, page.get()) - - request.send() - request.cancel(cancelParams) - - await vi.runAllTimersAsync() - - expect(onCancel).toHaveBeenCalledOnce() - expect(abortSpy).toHaveBeenCalledOnce() - - const finalParams = { - ...requestParams, - ...expectedFinal, - } - - expect(fireFinishEventsSpy).toHaveBeenCalledOnce() - expect(fireFinishEventsSpy).toHaveBeenCalledWith(finalParams) - - expect(fireStartEventsSpy).toHaveBeenCalledOnce() - expect(fireStartEventsSpy).toHaveBeenCalledWith(finalParams) - - expect(onStart).toHaveBeenCalledOnce() - expect(onStart).toHaveBeenCalledWith(finalParams) - - expect(onFinish).toHaveBeenCalledOnce() - expect(onFinish).toHaveBeenCalledWith(finalParams) - - expect(responseHandleSpy).toHaveBeenCalledOnce() -}) - -test('errors with responses', async () => { - const responseHandleSpy = vi.spyOn(Response.prototype, 'handle').mockResolvedValue() - - const fireFinishEventsSpy = vi.spyOn(events, 'fireFinishEvent').mockReturnValue() - const onFinish = vi.fn() - - axiosMock.mockRejectedValue({ - response: axiosResponse({ - status: 422, - }), - }) - - const requestParams = getRequestParams({ - onFinish, - }) - - const request = Request.create(requestParams, page.get()) - - await request.send() - - expect(fireFinishEventsSpy).toHaveBeenCalledOnce() - expect(fireFinishEventsSpy).toHaveBeenCalledWith(requestParams) - - expect(onFinish).toHaveBeenCalledOnce() - expect(onFinish).toHaveBeenCalledWith(requestParams) - - expect(responseHandleSpy).toHaveBeenCalledOnce() -}) - -test.each([ - { - shouldThrow: true, - label: 'should throw', - }, - { - shouldThrow: false, - label: 'should not throw', - }, -])('handle generic errors and it $label', { todo: true }, async ({ shouldThrow }) => { - const responseHandleSpy = vi.spyOn(Response.prototype, 'handle').mockResolvedValue() - - const fireFinishEventsSpy = vi.spyOn(events, 'fireFinishEvent').mockReturnValue() - const fireExceptionEventsSpy = vi.spyOn(events, 'fireExceptionEvent').mockReturnValue(shouldThrow) - const onFinish = vi.fn() - - axiosMock.mockRejectedValue(null) - - const requestParams = getRequestParams({ - onFinish, - }) - - const request = Request.create(requestParams, page.get()) - - // if (!shouldThrow) { - await expect(request.send()).rejects.toThrow() - // } else { - // await request.send() - // } - - expect(fireFinishEventsSpy).toHaveBeenCalledOnce() - expect(fireFinishEventsSpy).toHaveBeenCalledWith(requestParams) - - expect(onFinish).toHaveBeenCalledOnce() - expect(onFinish).toHaveBeenCalledWith(requestParams) - - expect(fireExceptionEventsSpy).toHaveBeenCalledOnce() - - expect(responseHandleSpy).not.toHaveBeenCalled() -}) - -test('request cancelled errors are handled gracefully', async () => { - const responseHandleSpy = vi.spyOn(Response.prototype, 'handle').mockResolvedValue() - - const fireFinishEventsSpy = vi.spyOn(events, 'fireFinishEvent').mockReturnValue() - const fireExceptionEventsSpy = vi.spyOn(events, 'fireExceptionEvent').mockReturnValue() - const isCancelSpy = vi.spyOn(axios, 'isCancel').mockReturnValue(true) - - const onFinish = vi.fn() - - axiosMock.mockRejectedValue(null) - - const requestParams = getRequestParams({ - onFinish, - }) - - const request = Request.create(requestParams, page.get()) - - await request.send() - - expect(fireFinishEventsSpy).toHaveBeenCalledOnce() - expect(fireFinishEventsSpy).toHaveBeenCalledWith(requestParams) - - expect(onFinish).toHaveBeenCalledOnce() - expect(onFinish).toHaveBeenCalledWith(requestParams) - - expect(fireExceptionEventsSpy).not.toHaveBeenCalled() - - expect(isCancelSpy).toHaveBeenCalledOnce() - - expect(responseHandleSpy).not.toHaveBeenCalled() - expect(fireExceptionEventsSpy).not.toHaveBeenCalled() -}) - -test('it creates response objects for valid responses that are not 2xx', { todo: true }, async () => {}) diff --git a/packages/core/tests/response.test.ts b/packages/core/tests/response.test.ts deleted file mode 100644 index d5340237c..000000000 --- a/packages/core/tests/response.test.ts +++ /dev/null @@ -1,614 +0,0 @@ -import { beforeEach, expect, test, vi } from 'vitest' -import { ActiveVisit, Page, PreserveStateOption } from '../src' -import * as events from '../src/events' -import { History } from '../src/history' -import modal from '../src/modal' -import { page as currentPage, page } from '../src/page' -import { RequestParams } from '../src/requestParams' -import { Response } from '../src/response' -import { SessionStorage } from '../src/sessionStorage' -import { axiosResponse, getRequestParams, homePage, pageComponent } from './support' - -beforeEach(() => { - vi.useFakeTimers() - - currentPage.init({ - initialPage: homePage, - resolveComponent: async (component) => component, - swapComponent: async ({ component }) => component, - }) -}) - -const requestParams = (overrides: Partial = {}) => { - return new RequestParams(getRequestParams(overrides)) -} - -test('create a response from the helper method', () => { - const response = Response.create(requestParams(), axiosResponse(), page.get()) - - expect(response).toBeInstanceOf(Response) -}) - -test('props are merged for partial request responses', async () => { - await currentPage.set( - pageComponent({ - props: { - errors: {}, - existing: 'value', - }, - }), - ) - - const pageSpies = { - set: vi.spyOn(currentPage, 'set'), - } - - const response = Response.create( - requestParams({ - only: ['foo'], - }), - axiosResponse({ - headers: { - 'x-inertia': 'true', - }, - data: pageComponent({ - props: { - errors: {}, - foo: 'bar', - }, - }), - }), - page.get(), - ) - - await response.handle() - - expect(pageSpies.set).toHaveBeenCalledOnce() - expect(pageSpies.set).toHaveBeenCalledWith( - { - ...homePage, - props: { - errors: {}, - existing: 'value', - foo: 'bar', - }, - url: 'http://localhost:3000/', - }, - { - preserveState: false, - preserveScroll: false, - replace: false, - }, - ) -}) - -test.each([ - { - value: true, - expected: true, - label: 'true', - responseProps: {}, - }, - { - value: false, - expected: false, - label: 'false', - responseProps: {}, - }, - { - value: () => true, - expected: true, - label: 'function', - responseProps: {}, - }, - { - value: 'errors' as PreserveStateOption, - expected: false, - label: 'errors but none', - responseProps: {}, - }, - { - value: 'errors' as PreserveStateOption, - expected: true, - label: 'errors but present', - // @ts-ignore - responseProps: { - props: { - // TODO: Why is this type wrong...? - errors: { - foo: 'bar', - }, - }, - } as Partial, - }, -])('preserve scroll option is respected after response [$label]', async ({ value, expected, responseProps }) => { - const pageSpies = { - set: vi.spyOn(currentPage, 'set'), - } - - const response = Response.create( - requestParams({ - preserveScroll: value, - }), - axiosResponse({ - headers: { - 'x-inertia': 'true', - }, - data: pageComponent({ ...responseProps }), - }), - page.get(), - ) - - await response.handle() - - expect(pageSpies.set).toHaveBeenCalledOnce() - expect(pageSpies.set).toHaveBeenCalledWith( - { - ...homePage, - ...responseProps, - url: 'http://localhost:3000/', - }, - { - preserveState: false, - preserveScroll: expected, - replace: false, - }, - ) -}) - -test.each([ - { - value: true, - expected: true, - label: 'true', - responseProps: {}, - historyStateCount: 1, - }, - { - value: false, - expected: false, - label: 'false', - responseProps: {}, - historyStateCount: 0, - }, - { - value: () => true, - expected: true, - label: 'function', - responseProps: {}, - historyStateCount: 1, - }, - { - value: 'errors' as PreserveStateOption, - expected: false, - label: 'errors but none', - responseProps: {}, - historyStateCount: 1, - }, - { - value: 'errors' as PreserveStateOption, - expected: true, - label: 'errors but present', - historyStateCount: 1, - // @ts-ignore - responseProps: { - props: { - // TODO: Why is this type wrong...? - errors: { - foo: 'bar', - }, - }, - } as Partial, - }, -])( - 'preserve state option is respected after response [$label]', - async ({ value, expected, responseProps, historyStateCount }) => { - const pageSpies = { - set: vi.spyOn(currentPage, 'set'), - } - - const historyGetStateSpy = vi.spyOn(History, 'getState').mockReturnValue(false) - - const response = Response.create( - requestParams({ - preserveState: value, - }), - axiosResponse({ - headers: { - 'x-inertia': 'true', - }, - data: pageComponent({ ...responseProps }), - }), - page.get(), - ) - - await response.handle() - - expect(pageSpies.set).toHaveBeenCalledOnce() - expect(pageSpies.set).toHaveBeenCalledWith( - { - ...homePage, - ...responseProps, - url: 'http://localhost:3000/', - }, - { - preserveState: expected, - preserveScroll: false, - replace: false, - }, - ) - - expect(historyGetStateSpy).toHaveBeenCalledTimes(historyStateCount) - }, -) - -test('remembered state is set after response', async () => { - const pageSpies = { - set: vi.spyOn(currentPage, 'set'), - } - - const historyGetStateSpy = vi.spyOn(History, 'getState').mockReturnValue({ - customState: 'here it is', - }) - - const response = Response.create( - requestParams({ - preserveState: true, - }), - axiosResponse({ - headers: { - 'x-inertia': 'true', - }, - data: pageComponent(), - }), - page.get(), - ) - - await response.handle() - - expect(pageSpies.set).toHaveBeenCalledOnce() - expect(pageSpies.set).toHaveBeenCalledWith( - { - ...homePage, - rememberedState: { - customState: 'here it is', - }, - url: 'http://localhost:3000/', - }, - { - preserveState: true, - preserveScroll: false, - replace: false, - }, - ) - - expect(historyGetStateSpy).toHaveBeenCalledTimes(2) - expect(historyGetStateSpy).toHaveBeenCalledWith('rememberedState') -}) - -test('remembered state is not set if preserve state is false', async () => { - const pageSpies = { - set: vi.spyOn(currentPage, 'set'), - } - - const historyGetStateSpy = vi.spyOn(History, 'getState').mockReturnValue({ - customState: 'here it is', - }) - - const response = Response.create( - requestParams({ - preserveState: false, - }), - axiosResponse({ - headers: { - 'x-inertia': 'true', - }, - data: pageComponent(), - }), - page.get(), - ) - - await response.handle() - - expect(pageSpies.set).toHaveBeenCalledOnce() - expect(pageSpies.set).toHaveBeenCalledWith( - { - ...homePage, - url: 'http://localhost:3000/', - }, - { - preserveState: false, - preserveScroll: false, - replace: false, - }, - ) - - expect(historyGetStateSpy).not.toHaveBeenCalled() -}) - -test('remembered state is not set if the response component is different', async () => { - const pageSpies = { - set: vi.spyOn(currentPage, 'set'), - } - - const historyGetStateSpy = vi.spyOn(History, 'getState').mockReturnValue({ - customState: 'here it is', - }) - - const response = Response.create( - requestParams({ - preserveState: true, - }), - axiosResponse({ - headers: { - 'x-inertia': 'true', - }, - data: pageComponent({ - component: 'DifferentComponent', - }), - }), - page.get(), - ) - - await response.handle() - - expect(pageSpies.set).toHaveBeenCalledOnce() - expect(pageSpies.set).toHaveBeenCalledWith( - { - ...homePage, - component: 'DifferentComponent', - url: 'http://localhost:3000/', - }, - { - preserveState: true, - preserveScroll: false, - replace: false, - }, - ) - - expect(historyGetStateSpy).toHaveBeenCalledOnce() - expect(historyGetStateSpy).toHaveBeenCalledWith('rememberedState') -}) - -test('preserve url hash if response url is the same', async () => { - const pageSpies = { - set: vi.spyOn(currentPage, 'set'), - } - - const testRequestParams = requestParams() - - testRequestParams.params.url.hash = '#test' - - const response = Response.create( - testRequestParams, - axiosResponse({ - headers: { - 'x-inertia': 'true', - }, - data: pageComponent(), - }), - page.get(), - ) - - await response.handle() - - expect(pageSpies.set).toHaveBeenCalledOnce() - expect(pageSpies.set).toHaveBeenCalledWith( - { - ...homePage, - url: 'http://localhost:3000/#test', - }, - { - preserveState: false, - preserveScroll: false, - replace: false, - }, - ) -}) - -test('if there are errors, fire error events', async () => { - const pageSpies = { - set: vi.spyOn(currentPage, 'set'), - } - - const fireErrorEventSpy = vi.spyOn(events, 'fireErrorEvent') - const fireSuccessEventSpy = vi.spyOn(events, 'fireSuccessEvent') - - const onError = vi.fn() - const onSuccess = vi.fn() - - const response = Response.create( - requestParams({ - onError, - onSuccess, - }), - axiosResponse({ - headers: { - 'x-inertia': 'true', - }, - data: pageComponent({ - props: { - errors: { - // TODO: Why is this type wrong...? - // @ts-ignore - foo: 'bar', - }, - }, - }), - }), - page.get(), - ) - - await response.handle() - - expect(onError).toHaveBeenCalledOnce() - expect(onError).toHaveBeenCalledWith({ - foo: 'bar', - }) - - expect(fireErrorEventSpy).toHaveBeenCalledOnce() - expect(fireErrorEventSpy).toHaveBeenCalledWith({ - foo: 'bar', - }) - - expect(pageSpies.set).toHaveBeenCalledOnce() - - expect(onSuccess).not.toHaveBeenCalled() - expect(fireSuccessEventSpy).not.toHaveBeenCalled() -}) - -test('if there are no errors, fire success events', async () => { - const pageSpies = { - set: vi.spyOn(currentPage, 'set'), - } - - const fireSuccessEventSpy = vi.spyOn(events, 'fireSuccessEvent') - const fireErrorEventSpy = vi.spyOn(events, 'fireErrorEvent') - - const onSuccess = vi.fn() - const onError = vi.fn() - - const response = Response.create( - requestParams({ - onSuccess, - onError, - }), - axiosResponse({ - headers: { - 'x-inertia': 'true', - }, - data: pageComponent(), - }), - page.get(), - ) - - await response.handle() - - const eventParams = { - ...homePage, - url: 'http://localhost:3000/', - } - - expect(onSuccess).toHaveBeenCalledOnce() - expect(onSuccess).toHaveBeenCalledWith(eventParams) - - expect(fireSuccessEventSpy).toHaveBeenCalledOnce() - expect(fireSuccessEventSpy).toHaveBeenCalledWith(eventParams) - - expect(pageSpies.set).toHaveBeenCalledOnce() - - expect(onError).not.toHaveBeenCalled() - expect(fireErrorEventSpy).not.toHaveBeenCalled() -}) - -test('handles location responses', async () => { - const sessionStorageSpies = { - setItem: vi.spyOn(SessionStorage, 'set').mockReturnValue(), - } - const windowReloadSpy = vi.spyOn(window.location, 'reload') - - const response = Response.create( - requestParams(), - axiosResponse({ - status: 409, - headers: { - 'x-inertia-location': '/new-location', - }, - data: pageComponent(), - }), - page.get(), - ) - - await response.handle() - - expect(sessionStorageSpies.setItem).toHaveBeenCalledOnce() - expect(sessionStorageSpies.setItem).toHaveBeenCalledWith({ preserveScroll: false }) - - expect(window.location.href).toBe('http://localhost:3000/new-location') - expect(windowReloadSpy).not.toHaveBeenCalled() - - // Reset the internal state - window.location.href = 'http://localhost:3000/' -}) - -test.each([ - { - path: '/', - expected: 'http://localhost:3000/', - label: 'without hash', - }, - { - path: '/', - expected: 'http://localhost:3000/#test', - label: 'with hash', - }, -])('reloads when location destination is the same as current url $label', async ({ path, expected }) => { - const sessionStorageSpies = { - setItem: vi.spyOn(SessionStorage, 'set').mockReturnValue(), - } - - window.location.href = expected - - const windowReloadSpy = vi.spyOn(window.location, 'reload') - - const response = Response.create( - requestParams(), - axiosResponse({ - status: 409, - headers: { - 'x-inertia-location': path, - }, - data: pageComponent(), - }), - page.get(), - ) - - await response.handle() - - expect(sessionStorageSpies.setItem).toHaveBeenCalledOnce() - expect(sessionStorageSpies.setItem).toHaveBeenCalledWith({ preserveScroll: false }) - - expect(window.location.href).toBe(expected) - expect(windowReloadSpy).toHaveBeenCalledOnce() - - // Reset the internal state - window.location.href = 'http://localhost:3000/' -}) - -test.each([ - { - shouldFire: true, - modalShowCount: 1, - }, - { - shouldFire: false, - modalShowCount: 0, - }, -])('handles invalid responses (valid but not inertia)', async ({ shouldFire, modalShowCount }) => { - const modalSpies = { - show: vi.spyOn(modal, 'show').mockReturnValue(), - } - - const fireInvalidEvent = vi.spyOn(events, 'fireInvalidEvent').mockReturnValue(shouldFire) - - const response = Response.create( - requestParams(), - axiosResponse({ - status: 200, - headers: {}, - data: 'This is not an Inertia response', - }), - page.get(), - ) - - await response.handle() - - expect(modalSpies.show).toHaveBeenCalledTimes(modalShowCount) - expect(fireInvalidEvent).toHaveBeenCalledOnce() -}) - -test('will continue to error if there is no response in the error object', { todo: true }, async () => {}) - -test('we return an on cancel token from the onCancel callback', { todo: true }, async () => { - // https://inertiajs.com/manual-visits#visit-cancellation -}) diff --git a/packages/core/tests/router.test.ts b/packages/core/tests/router.test.ts deleted file mode 100644 index 3010b31ea..000000000 --- a/packages/core/tests/router.test.ts +++ /dev/null @@ -1,631 +0,0 @@ -import { beforeEach, expect, expectTypeOf, suite, test, vi } from 'vitest' -import * as events from '../src/events' -import { History } from '../src/history' -import { navigationType } from '../src/navigationType' -import { page } from '../src/page' -import { Request } from '../src/request' -import { Router } from '../src/router' -import { Scroll } from '../src/scroll' -import { SessionStorage } from '../src/sessionStorage' -import { FormDataConvertible } from '../src/types' -import { homePage } from './support' - -beforeEach(() => { - vi.useFakeTimers() -}) - -expect.extend({ - dataToBeFormData(received, _expected) { - const { isNot } = this - - return { - pass: typeof received === 'object' && received.data instanceof FormData, - message: () => `data is${isNot ? ' not' : ''} instance of FormData`, - } - }, - dataToBeFormDataConvertible(received, _expected) { - const { isNot } = this - - return { - pass: typeof received === 'object' && expectTypeOf(received.data).toMatchTypeOf(), - message: () => `data is${isNot ? ' not' : ''} instance of FormData`, - } - }, -}) - -const getRouter = (cb?: (router: Router) => void) => { - const router = new Router() - - if (cb) { - cb(router) - } - - router.init({ - initialPage: homePage, - resolveComponent: () => {}, - swapComponent: () => { - return Promise.resolve({ - component: 'home', - props: { - errors: {}, - }, - url: '/', - version: '1', - scrollRegions: [], - rememberedState: {}, - }) - }, - }) - - return router -} - -suite('init', () => { - test('clear remembered state on navigation type reload', () => { - const navTypeSpy = vi.spyOn(navigationType, 'isReload').mockReturnValue(true) - const historySpy = vi.spyOn(History, 'deleteState').mockReturnValue() - - getRouter() - - expect(navTypeSpy).toHaveBeenCalledOnce() - expect(historySpy).toHaveBeenCalledWith('rememberedState') - }) - - test('will not clear remembered state when navigation type is not reload', () => { - const navTypeSpy = vi.spyOn(navigationType, 'isReload').mockReturnValue(false) - const historySpy = vi.spyOn(History, 'deleteState').mockReturnValue() - - getRouter() - - expect(navTypeSpy).toHaveBeenCalledOnce() - expect(historySpy).not.toHaveBeenCalled() - }) - - test('handle back forward visit', async () => { - const navTypeSpy = vi.spyOn(navigationType, 'isBackForward').mockReturnValue(true) - const historySpies = { - hasAnyState: vi.spyOn(History, 'hasAnyState').mockReturnValue(true), - setState: vi.spyOn(History, 'setState').mockReturnValue(), - getAllState: vi.spyOn(History, 'getAllState').mockReturnValue({ - myState: 'is here', - }), - } - const pageSpy = vi.spyOn(page, 'set').mockResolvedValue() - const scrollRestoreSpy = vi.spyOn(Scroll, 'restore').mockReturnValue() - const fireNavigateEventSpy = vi.spyOn(events, 'fireNavigateEvent').mockReturnValue() - - getRouter() - - await vi.runAllTimersAsync() - - expect(navTypeSpy).toHaveBeenCalledOnce() - - expect(historySpies.hasAnyState).toHaveBeenCalledOnce() - expect(historySpies.setState).toHaveBeenCalledOnce() - expect(historySpies.setState).toHaveBeenCalledWith('version', '1') - expect(historySpies.getAllState).toHaveBeenCalledOnce() - - expect(pageSpy).toHaveBeenCalledOnce() - expect(pageSpy).toHaveBeenCalledWith({ myState: 'is here' }, { preserveScroll: true, preserveState: true }) - - expect(scrollRestoreSpy).toHaveBeenCalledOnce() - expect(scrollRestoreSpy).toHaveBeenCalledWith(homePage) - - expect(fireNavigateEventSpy).toHaveBeenCalledOnce() - expect(fireNavigateEventSpy).toHaveBeenCalledWith(homePage) - }) - - test.each([ - { preserveScroll: true, shouldBeCalled: 1 }, - { preserveScroll: false, shouldBeCalled: 0 }, - ])( - 'handle location visit with preserve scroll equal to $preserveScroll', - async ({ preserveScroll, shouldBeCalled }) => { - const sessionStorageSpies = { - exists: vi.spyOn(SessionStorage, 'exists').mockReturnValue(true), - get: vi.spyOn(SessionStorage, 'get').mockReturnValue( - JSON.stringify({ - preserveScroll, - }), - ), - remove: vi.spyOn(SessionStorage, 'remove').mockReturnValue(), - } - - const pageSpies = { - setUrlHash: vi.spyOn(page, 'setUrlHash').mockReturnValue(), - remember: vi.spyOn(page, 'remember').mockResolvedValue(), - scrollRegions: vi.spyOn(page, 'scrollRegions').mockResolvedValue(), - set: vi.spyOn(page, 'set').mockResolvedValue(), - } - - const historySpies = { - getState: vi.spyOn(History, 'getState').mockReturnValue({}), - } - - const scrollSpy = { - restore: vi.spyOn(Scroll, 'restore').mockReturnValue(), - } - - const fireNavigateEventSpy = vi.spyOn(events, 'fireNavigateEvent').mockReturnValue() - - getRouter() - - await vi.runAllTimersAsync() - - expect(sessionStorageSpies.exists).toHaveBeenCalledOnce() - expect(sessionStorageSpies.get).toHaveBeenCalledOnce() - expect(sessionStorageSpies.remove).toHaveBeenCalledOnce() - - expect(historySpies.getState).toHaveBeenCalledTimes(2) - expect(historySpies.getState).toHaveBeenNthCalledWith(1, 'rememberedState', {}) - expect(historySpies.getState).toHaveBeenNthCalledWith(2, 'scrollRegions', []) - - expect(pageSpies.setUrlHash).toHaveBeenCalledOnce() - expect(pageSpies.remember).toHaveBeenCalledOnce() - expect(pageSpies.scrollRegions).toHaveBeenCalledOnce() - expect(pageSpies.set).toHaveBeenCalledOnce() - expect(pageSpies.set).toHaveBeenCalledWith(homePage, { preserveScroll, preserveState: true }) - - expect(fireNavigateEventSpy).toHaveBeenCalledOnce() - - expect(scrollSpy.restore).toHaveBeenCalledTimes(shouldBeCalled) - }, - ) - - test('handle initial page visit', async () => { - const pageSpies = { - setUrlHash: vi.spyOn(page, 'setUrlHash').mockReturnValue(), - set: vi.spyOn(page, 'set').mockResolvedValue(), - } - - const fireNavigateEventSpy = vi.spyOn(events, 'fireNavigateEvent').mockReturnValue() - - getRouter() - - await vi.runAllTimersAsync() - - expect(pageSpies.setUrlHash).toHaveBeenCalledOnce() - expect(pageSpies.set).toHaveBeenCalledOnce() - expect(pageSpies.set).toHaveBeenCalledWith(homePage, { preserveState: true }) - - expect(fireNavigateEventSpy).toHaveBeenCalledOnce() - }) - - test('it sets up listeners on init', { todo: true }, () => { - // Listen for popstate - // Listen for scroll (debounced) - }) - - test('handles popstate event when the state is null', { todo: true }, () => { - const historySpy = vi.spyOn(History, 'replaceState').mockReturnValue() - const scrollSpy = vi.spyOn(Scroll, 'reset').mockReturnValue() - - getRouter() - - // Might have to extract the handler to something we can call directly - window.dispatchEvent(new PopStateEvent('popstate', { state: null })) - - expect(historySpy).toHaveBeenCalledOnce() - expect(scrollSpy).toHaveBeenCalledOnce() - // If the state is null - // - re-construct the url from the current page + window hash - // - replace the history state with the current page + full url - // - reset scroll positions - // Otherwise - // - get the page from the state - // - resolve the component - // - swap the component - // - restore scroll positions - // - fire navigate event - }) - - test('handles scroll event', { todo: true }, async () => { - const scrollSpy = vi.spyOn(Scroll, 'onScroll').mockReturnValue() - - getRouter() - - // If the current page has scroll regions, save the scroll position - window.dispatchEvent(new CustomEvent('scroll')) - - await vi.runAllTimersAsync() - - expect(scrollSpy).toHaveBeenCalledOnce() - }) -}) - -suite('visit', () => { - test('it can cancel a visit', async () => { - const requestSpies = { - create: vi.spyOn(Request, 'create'), - send: vi.spyOn(Request.prototype, 'send').mockResolvedValue(), - cancel: vi.spyOn(Request.prototype, 'cancel').mockReturnValue(), - } - - const router = getRouter() - - router.visit('/home') - router.cancel() - - await vi.runAllTimersAsync() - - expect(requestSpies.create).toHaveBeenCalledOnce() - expect(requestSpies.send).toHaveBeenCalledOnce() - expect(requestSpies.cancel).toHaveBeenCalledOnce() - expect(requestSpies.cancel).toHaveBeenCalledWith({ cancelled: true, interrupted: false }) - }) - - test.each([ - { url: '/home', expectedUrl: new URL('/home', 'http://localhost:3000') }, - { url: new URL('/home', 'http://localhost'), expectedUrl: new URL('/home', 'http://localhost') }, - ])('it can make a visit with either a string url or URL object', { todo: true }, async ({ url, expectedUrl }) => { - const requestSpies = { - create: vi.spyOn(Request, 'create'), - send: vi.spyOn(Request.prototype, 'send').mockResolvedValue(), - } - - const router = getRouter() - - router.visit(url) - - await vi.runAllTimersAsync() - - expect(requestSpies.create).toHaveBeenCalledOnce() - expect(requestSpies.create).toHaveBeenCalledWith( - expect.objectContaining({ - url: expectedUrl, - }), - ) - }) - - test.each([ - { - from: 'file', - to: 'FormData', - params: { - data: { - file: new File([''], 'file.txt'), - }, - }, - // @ts-ignore - expectation: () => expect.dataToBeFormData(), - }, - { - from: 'force', - to: 'FormData', - params: { - data: { - whatever: 'ok', - }, - forceFormData: true, - }, - // @ts-ignore - expectation: () => expect.dataToBeFormData(), - }, - { - from: 'object', - to: 'FormDataConvertible', - params: { - data: { - whatever: 'ok', - }, - }, - // @ts-ignore - expectation: () => expect.dataToBeFormDataConvertible(), - }, - ])('it can transform incoming data from $from to $to', { todo: true }, async ({ params, expectation }) => { - const requestSpies = { - create: vi.spyOn(Request, 'create'), - send: vi.spyOn(Request.prototype, 'send').mockResolvedValue(), - } - - const router = getRouter() - - router.visit('/home', params) - - await vi.runAllTimersAsync() - - expect(requestSpies.create).toHaveBeenCalledOnce() - expect(requestSpies.create).toHaveBeenCalledWith(expectation()) - // TODO: Also check that the url has changed? - }) - - test('abort a request by returning false from the onBefore callback', async () => { - const requestSpies = { - create: vi.spyOn(Request, 'create'), - send: vi.spyOn(Request.prototype, 'send').mockResolvedValue(), - } - - const router = getRouter() - - router.visit('/home', { - onBefore() { - return false - }, - }) - - await vi.runAllTimersAsync() - - expect(requestSpies.create).not.toHaveBeenCalled() - expect(requestSpies.send).not.toHaveBeenCalled() - }) - - test('abort a request by returning false from the global before callback', async () => { - const requestSpies = { - create: vi.spyOn(Request, 'create'), - send: vi.spyOn(Request.prototype, 'send').mockResolvedValue(), - } - - const router = getRouter() - - const stopListening = router.on('before', () => false) - - router.visit('/home') - - await vi.runAllTimersAsync() - - stopListening() - - expect(requestSpies.create).not.toHaveBeenCalled() - expect(requestSpies.send).not.toHaveBeenCalled() - }) - - test('cancel an inflight request if another comes in', async () => { - const requestSpies = { - create: vi.spyOn(Request, 'create'), - send: vi.spyOn(Request.prototype, 'send').mockResolvedValue(), - cancel: vi.spyOn(Request.prototype, 'cancel').mockReturnValue(), - } - - const router = getRouter() - - router.visit('/home') - router.visit('/about') - - await vi.runAllTimersAsync() - - expect(requestSpies.create).toHaveBeenCalledTimes(2) - expect(requestSpies.cancel).toHaveBeenCalledOnce() - expect(requestSpies.cancel).toHaveBeenCalledWith({ interrupted: true, cancelled: false }) - }) - - test('save scroll positions when we start a request', async () => { - const requestSpies = { - create: vi.spyOn(Request, 'create'), - send: vi.spyOn(Request.prototype, 'send').mockResolvedValue(), - } - - // TODO: This calls "reset()"... is that correct? - // There's a double "save" call when this isn't present - const pageSpies = { - set: vi.spyOn(page, 'set').mockResolvedValue(), - } - - const scrollSpy = vi.spyOn(Scroll, 'save').mockReturnValue() - - const router = getRouter() - - router.visit('/home') - - await vi.runAllTimersAsync() - - expect(scrollSpy).toHaveBeenCalledOnce() - expect(scrollSpy).toHaveBeenCalledWith(homePage) - expect(pageSpies.set).toHaveBeenCalledOnce() - expect(requestSpies.create).toHaveBeenCalledOnce() - expect(requestSpies.send).toHaveBeenCalledOnce() - }) - - test('verify that request params are passed to the request', { todo: true }, async () => { - const requestSpies = { - create: vi.spyOn(Request, 'create'), - send: vi.spyOn(Request.prototype, 'send').mockResolvedValue(), - } - - const router = getRouter() - - router.visit('/home', { - method: 'post', - data: { - name: 'John Doe', - }, - headers: { - 'X-My-Header': 'my-value', - }, - }) - - await vi.runAllTimersAsync() - - expect(requestSpies.create).toHaveBeenCalledOnce() - expect(requestSpies.create).toHaveBeenCalledWith( - expect.objectContaining({ - method: 'post', - data: { name: 'John Doe' }, - headers: { - 'X-My-Header': 'my-value', - }, - }), - ) - }) - - test('get helper', () => { - const router = getRouter() - - const visitSpy = vi.spyOn(router, 'visit').mockReturnValue() - - const data = { - name: 'Joe', - } - - const options = { - only: ['name'], - } - - router.get('/home', data, options) - - expect(visitSpy).toHaveBeenCalledOnce() - expect(visitSpy).toHaveBeenCalledWith('/home', { ...options, method: 'get', data }) - }) - - test('post helper', () => { - const router = getRouter() - - const visitSpy = vi.spyOn(router, 'visit').mockReturnValue() - - const data = { - name: 'Joe', - } - - const options = { - only: ['name'], - } - - router.post('/home', data, options) - - expect(visitSpy).toHaveBeenCalledOnce() - expect(visitSpy).toHaveBeenCalledWith('/home', { - ...options, - preserveState: true, - method: 'post', - data, - }) - }) - - test('put helper', () => { - const router = getRouter() - - const visitSpy = vi.spyOn(router, 'visit').mockReturnValue() - - const data = { - name: 'Joe', - } - - const options = { - only: ['name'], - } - - router.put('/home', data, options) - - expect(visitSpy).toHaveBeenCalledOnce() - expect(visitSpy).toHaveBeenCalledWith('/home', { - ...options, - preserveState: true, - method: 'put', - data, - }) - }) - - test('patch helper', () => { - const router = getRouter() - - const visitSpy = vi.spyOn(router, 'visit').mockReturnValue() - - const data = { - name: 'Joe', - } - - const options = { - only: ['name'], - } - - router.patch('/home', data, options) - - expect(visitSpy).toHaveBeenCalledOnce() - expect(visitSpy).toHaveBeenCalledWith('/home', { - ...options, - preserveState: true, - method: 'patch', - data, - }) - }) - - test('delete helper', () => { - const router = getRouter() - - const visitSpy = vi.spyOn(router, 'visit').mockReturnValue() - - const options = { - only: ['name'], - } - - router.delete('/home', options) - - expect(visitSpy).toHaveBeenCalledOnce() - expect(visitSpy).toHaveBeenCalledWith('/home', { - ...options, - preserveState: true, - method: 'delete', - }) - }) - - test('reload helper', () => { - const router = getRouter() - - const visitSpy = vi.spyOn(router, 'visit').mockReturnValue() - - const options = { - only: ['name'], - } - - router.reload(options) - - expect(visitSpy).toHaveBeenCalledOnce() - expect(visitSpy).toHaveBeenCalledWith('http://localhost:3000/', { - ...options, - async: true, - preserveState: true, - preserveScroll: true, - }) - }) - - test.each([ - { - label: 'default key', - key: undefined, - expectedKey: 'default', - }, - { - label: 'custom key', - key: 'myKey', - expectedKey: 'myKey', - }, - ])('we can remember state with $label', ({ key, expectedKey }) => { - const historySpies = { - remember: vi.spyOn(History, 'remember').mockReturnValue(), - } - - const router = getRouter() - - router.remember({ name: 'Joe' }, key) - - expect(historySpies.remember).toHaveBeenCalledOnce() - expect(historySpies.remember).toHaveBeenCalledWith({ name: 'Joe' }, expectedKey) - }) - - test.each([ - { - label: 'default key', - key: undefined, - expectedKey: 'default', - }, - { - label: 'custom key', - key: 'myKey', - expectedKey: 'myKey', - }, - ])('we can restore state with $label', ({ key, expectedKey }) => { - const historySpies = { - restore: vi.spyOn(History, 'restore').mockReturnValue(null), - } - - const router = getRouter() - - router.restore(key) - - expect(historySpies.restore).toHaveBeenCalledOnce() - expect(historySpies.restore).toHaveBeenCalledWith(expectedKey) - }) - - test('we can listen for global events', { todo: true }, () => { - // if event is cancelable and callback returns false, cancel the event - }) -}) diff --git a/packages/core/tests/support.ts b/packages/core/tests/support.ts deleted file mode 100644 index a7e01e2b5..000000000 --- a/packages/core/tests/support.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { AxiosHeaders, AxiosResponse } from 'axios' -import { ActiveVisit, Page } from '../src' - -export const getRequestParams = (overrides: Partial = {}): ActiveVisit => ({ - url: new URL('/', 'http://localhost:3000'), - method: 'get', - data: {}, - headers: {}, - onCancelToken: () => {}, - onBefore: () => {}, - onStart: () => {}, - onProgress: () => {}, - onFinish: () => {}, - onCancel: () => {}, - onSuccess: () => {}, - onError: () => {}, - completed: false, - cancelled: false, - interrupted: false, - forceFormData: false, - queryStringArrayFormat: 'brackets', - replace: false, - only: [], - except: [], - preserveScroll: false, - preserveState: false, - errorBag: '', - async: false, - ...overrides, -}) - -export const axiosResponse = (overrides: Partial = {}): AxiosResponse => ({ - data: {}, - status: 200, - statusText: 'OK', - headers: {}, - config: { - headers: new AxiosHeaders(), - }, - request: {}, - ...overrides, -}) - -export const pageComponent = (overrides: Partial = {}): Page => ({ - component: 'Home', - props: { - errors: {}, - }, - url: '/', - version: '1', - scrollRegions: [], - rememberedState: {}, - ...overrides, -}) - -export const homePage = pageComponent() diff --git a/packages/core/vitest.config.ts b/packages/core/vitest.config.ts deleted file mode 100644 index ba67ff197..000000000 --- a/packages/core/vitest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -// vitest.config.ts -import { defineConfig } from 'vitest/config' - -export default defineConfig({ - test: { - environment: 'happy-dom', - restoreMocks: true, - }, -}) diff --git a/packages/core/vitest.d.ts b/packages/core/vitest.d.ts deleted file mode 100644 index 6b6f93cad..000000000 --- a/packages/core/vitest.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import 'vitest' - -interface CustomMatchers { - dataToBeFormdata: () => R -} - -declare module 'vitest' { - interface Assertion extends CustomMatchers {} - interface AsymmetricMatchersContaining extends CustomMatchers {} -} diff --git a/packages/react/package.json b/packages/react/package.json index 6478b1a09..9886321a1 100755 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@jamesst20/inertia-react", - "version": "2.0.0", + "version": "2.0.2", "license": "MIT", "description": "The React adapter for Inertia.js", "contributors": [ @@ -59,7 +59,7 @@ "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "dependencies": { - "@jamesst20/inertia-core": "file:../core", + "@jamesst20/inertia-core": "2.0.2", "lodash.isequal": "^4.5.0" } } diff --git a/packages/react/src/WhenVisible.ts b/packages/react/src/WhenVisible.ts index 64f14d035..f96c38089 100644 --- a/packages/react/src/WhenVisible.ts +++ b/packages/react/src/WhenVisible.ts @@ -1,10 +1,10 @@ import { ReloadOptions, router } from '@jamesst20/inertia-core' -import { createElement, ReactElement, useEffect, useRef, useState } from 'react' +import { createElement, ReactElement, useCallback, useEffect, useRef, useState } from 'react' interface WhenVisibleProps { children: ReactElement | number | string fallback: ReactElement | number | string - data: string | string[] + data?: string | string[] params?: ReloadOptions buffer?: number as?: string @@ -17,11 +17,11 @@ const WhenVisible = ({ children, data, params, buffer, as, always, fallback }: W fallback = fallback ?? null const [loaded, setLoaded] = useState(false) - const [fetching, setFetching] = useState(false) - const observer = useRef(null) + const hasFetched = useRef(false) + const fetching = useRef(false) const ref = useRef(null) - const getReloadParams = (): Partial => { + const getReloadParams = useCallback<() => Partial>(() => { if (data) { return { only: (Array.isArray(data) ? data : [data]) as string[], @@ -33,41 +33,46 @@ const WhenVisible = ({ children, data, params, buffer, as, always, fallback }: W } return params - } + }, [params, data]) useEffect(() => { if (!ref.current) { return } - observer.current = new IntersectionObserver( + const observer = new IntersectionObserver( (entries) => { if (!entries[0].isIntersecting) { return } - if (!always) { - observer.current?.disconnect() + if (!always && hasFetched.current) { + observer.disconnect() } - if (fetching) { + if (fetching.current) { return } - setFetching(true) + hasFetched.current = true + fetching.current = true const reloadParams = getReloadParams() router.reload({ ...reloadParams, onStart: (e) => { - setFetching(true) + fetching.current = true reloadParams.onStart?.(e) }, onFinish: (e) => { setLoaded(true) - setFetching(false) + fetching.current = false reloadParams.onFinish?.(e) + + if (!always) { + observer.disconnect() + } }, }) }, @@ -76,12 +81,12 @@ const WhenVisible = ({ children, data, params, buffer, as, always, fallback }: W }, ) - observer.current.observe(ref.current) + observer.observe(ref.current) return () => { - observer.current?.disconnect() + observer.disconnect() } - }, [ref]) + }, [ref, getReloadParams, buffer]) if (always || !loaded) { return createElement( diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 93fc35df9..294e84c7c 100755 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -5,7 +5,7 @@ export { default as createInertiaApp } from './createInertiaApp' export { default as Deferred } from './Deferred' export { default as Head } from './Head' export { InertiaLinkProps, default as Link } from './Link' -export { default as useForm } from './useForm' +export { InertiaFormProps, default as useForm } from './useForm' export { default as usePage } from './usePage' export { default as usePoll } from './usePoll' export { default as usePrefetch } from './usePrefetch' diff --git a/packages/react/src/useForm.ts b/packages/react/src/useForm.ts index 81c741e3c..0ee58f1c2 100644 --- a/packages/react/src/useForm.ts +++ b/packages/react/src/useForm.ts @@ -6,7 +6,8 @@ import useRemember from './useRemember' type setDataByObject = (data: TForm) => void type setDataByMethod = (data: (previousData: TForm) => TForm) => void type setDataByKeyValuePair = (key: K, value: TForm[K]) => void -type FormDataType = object +type FormDataType = Record +type FormOptions = Omit export interface InertiaFormProps { data: TForm @@ -26,12 +27,12 @@ export interface InertiaFormProps { clearErrors: (...fields: (keyof TForm)[]) => void setError(field: keyof TForm, value: string): void setError(errors: Record): void - submit: (method: Method, url: string, options?: VisitOptions) => void - get: (url: string, options?: VisitOptions) => void - patch: (url: string, options?: VisitOptions) => void - post: (url: string, options?: VisitOptions) => void - put: (url: string, options?: VisitOptions) => void - delete: (url: string, options?: VisitOptions) => void + submit: (method: Method, url: string, options?: FormOptions) => void + get: (url: string, options?: FormOptions) => void + patch: (url: string, options?: FormOptions) => void + post: (url: string, options?: FormOptions) => void + put: (url: string, options?: FormOptions) => void + delete: (url: string, options?: FormOptions) => void cancel: () => void } export default function useForm(initialValues?: TForm): InertiaFormProps @@ -59,7 +60,7 @@ export default function useForm( const [progress, setProgress] = useState(null) const [wasSuccessful, setWasSuccessful] = useState(false) const [recentlySuccessful, setRecentlySuccessful] = useState(false) - let transform = (data) => data + const transform = useRef((data) => data) useEffect(() => { isMounted.current = true @@ -158,17 +159,16 @@ export default function useForm( } if (method === 'delete') { - router.delete(url, { ..._options, data: transform(data) }) + router.delete(url, { ..._options, data: transform.current(data) }) } else { - router[method](url, transform(data), _options) + router[method](url, transform.current(data), _options) } }, [data, setErrors, transform], ) - return { - data, - setData(keyOrData: keyof TForm | Function | TForm, maybeValue?: TForm[keyof TForm]) { + const setDataFunction = useCallback( + (keyOrData: keyof TForm | Function | TForm, maybeValue?: TForm[keyof TForm]) => { if (typeof keyOrData === 'string') { setData((data) => ({ ...data, [keyOrData]: maybeValue })) } else if (typeof keyOrData === 'function') { @@ -177,17 +177,11 @@ export default function useForm( setData(keyOrData as TForm) } }, - isDirty: !isEqual(data, defaults), - errors, - hasErrors, - processing, - progress, - wasSuccessful, - recentlySuccessful, - transform(callback) { - transform = callback - }, - setDefaults(fieldOrFields?: keyof TForm | Partial, maybeValue?: FormDataConvertible) { + [setData], + ) + + const setDefaultsFunction = useCallback( + (fieldOrFields?: keyof TForm | Partial, maybeValue?: FormDataConvertible) => { if (typeof fieldOrFields === 'undefined') { setDefaults(() => data) } else { @@ -197,11 +191,15 @@ export default function useForm( })) } }, - reset(...fields) { + [data, setDefaults], + ) + + const reset = useCallback( + (...fields) => { if (fields.length === 0) { setData(defaults) } else { - setData( + setData((data) => (Object.keys(defaults) as Array) .filter((key) => fields.includes(key)) .reduce( @@ -214,7 +212,11 @@ export default function useForm( ) } }, - setError(fieldOrFields: keyof TForm | Record, maybeValue?: string) { + [setData, defaults], + ) + + const setError = useCallback( + (fieldOrFields: keyof TForm | Record, maybeValue?: string) => { setErrors((errors) => { const newErrors = { ...errors, @@ -226,7 +228,11 @@ export default function useForm( return newErrors }) }, - clearErrors(...fields) { + [setErrors, setHasErrors], + ) + + const clearErrors = useCallback( + (...fields) => { setErrors((errors) => { const newErrors = (Object.keys(errors) as Array).reduce( (carry, field) => ({ @@ -239,26 +245,49 @@ export default function useForm( return newErrors }) }, + [setErrors, setHasErrors], + ) + + const createSubmitMethod = (method) => (url, options) => { + submit(method, url, options) + } + const get = useCallback(createSubmitMethod('get'), [submit]) + const post = useCallback(createSubmitMethod('post'), [submit]) + const put = useCallback(createSubmitMethod('put'), [submit]) + const patch = useCallback(createSubmitMethod('patch'), [submit]) + const deleteMethod = useCallback(createSubmitMethod('delete'), [submit]) + + const cancel = useCallback(() => { + if (cancelToken.current) { + cancelToken.current.cancel() + } + }, []) + + const transformFunction = useCallback((callback) => { + transform.current = callback + }, []) + + return { + data, + setData: setDataFunction, + isDirty: !isEqual(data, defaults), + errors, + hasErrors, + processing, + progress, + wasSuccessful, + recentlySuccessful, + transform: transformFunction, + setDefaults: setDefaultsFunction, + reset, + setError, + clearErrors, submit, - get(url, options) { - submit('get', url, options) - }, - post(url, options) { - submit('post', url, options) - }, - put(url, options) { - submit('put', url, options) - }, - patch(url, options) { - submit('patch', url, options) - }, - delete(url, options) { - submit('delete', url, options) - }, - cancel() { - if (cancelToken.current) { - cancelToken.current.cancel() - } - }, + get, + post, + put, + patch, + delete: deleteMethod, + cancel, } } diff --git a/packages/react/test-app/Pages/WhenVisible.jsx b/packages/react/test-app/Pages/WhenVisible.jsx index 160b75b8a..ca1100391 100644 --- a/packages/react/test-app/Pages/WhenVisible.jsx +++ b/packages/react/test-app/Pages/WhenVisible.jsx @@ -1,31 +1,53 @@ import { WhenVisible } from '@jamesst20/inertia-react' +import { useState } from 'react' const Foo = ({ label }) => { return
{label}
} -export default () => ( - <> -
- Loading first one...
}> - - - +export default () => { + const [count, setCount] = useState(0) -
- Loading second one...
}> - - - + return ( + <> +
+ Loading first one...
}> + + + -
- Loading third one...
} always> - - - +
+ Loading second one...
}> + + + -
- Loading fourth one...
}> - - -) +
+ Loading third one...
} always> + + + + +
+ Loading fourth one...
}> + + +
+ Loading fifth one...
} + always + params={{ + data: { + count, + }, + onSuccess: () => { + setCount((c) => c + 1) + }, + }} + > + + + + + ) +} diff --git a/packages/svelte/package.json b/packages/svelte/package.json index b1768ac80..a426e088f 100755 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@jamesst20/inertia-svelte", - "version": "2.0.0", + "version": "2.0.2", "license": "MIT", "description": "The Svelte adapter for Inertia.js", "contributors": [ @@ -43,7 +43,7 @@ "svelte": "^5.0.0" }, "dependencies": { - "@jamesst20/inertia-core": "^2.0.0", + "@jamesst20/inertia-core": "2.0.2", "html-escape": "^2.0.0", "lodash": "^4.5.0" }, diff --git a/packages/svelte/src/useForm.svelte.ts b/packages/svelte/src/useForm.svelte.ts index c5ddd8a2d..51986b9dc 100644 --- a/packages/svelte/src/useForm.svelte.ts +++ b/packages/svelte/src/useForm.svelte.ts @@ -15,6 +15,7 @@ import cloneDeep from 'lodash/cloneDeep' import isEqual from 'lodash/isEqual' type FormDataType = Record +type FormOptions = Omit export interface InertiaFormProps { isDirty: boolean @@ -35,12 +36,12 @@ export interface InertiaFormProps { clearErrors(...fields: (keyof TForm)[]): this setError(field: keyof TForm, value: string): this setError(errors: Errors): this - submit(method: Method, url: string, options?: Partial): void - get(url: string, options?: Partial): void - post(url: string, options?: Partial): void - put(url: string, options?: Partial): void - patch(url: string, options?: Partial): void - delete(url: string, options?: Partial): void + submit(method: Method, url: string, options?: FormOptions): void + get(url: string, options?: FormOptions): void + post(url: string, options?: FormOptions): void + put(url: string, options?: FormOptions): void + patch(url: string, options?: FormOptions): void + delete(url: string, options?: FormOptions): void cancel(): void } @@ -56,7 +57,7 @@ export default function useForm( maybeData?: TForm | (() => TForm), ): InertiaForm { const rememberKey = typeof rememberKeyOrData === 'string' ? rememberKeyOrData : null - const inputData = typeof rememberKeyOrData === 'string' ? maybeData : rememberKeyOrData + const inputData = (typeof rememberKeyOrData === 'string' ? maybeData : rememberKeyOrData) ?? {} const data: TForm = typeof inputData === 'function' ? inputData() : (inputData as TForm) const restored = rememberKey ? (router.restore(rememberKey) as { data: TForm; errors: Record } | null) @@ -137,7 +138,7 @@ export default function useForm( ) return this }, - submit(method, url, options: Partial = {}) { + submit(method, url, options: FormOptions = {}) { const data = transform(this.data()) as RequestPayload const _options: Omit = { ...options, diff --git a/packages/svelte/test-app/Pages/Svelte/PropsAndPageStore.svelte b/packages/svelte/test-app/Pages/Svelte/PropsAndPageStore.svelte index b1dfa96bb..6cd75d456 100644 --- a/packages/svelte/test-app/Pages/Svelte/PropsAndPageStore.svelte +++ b/packages/svelte/test-app/Pages/Svelte/PropsAndPageStore.svelte @@ -1,9 +1,9 @@
@@ -39,3 +41,20 @@
+ +
+ + +
Loading fifth one...
+
+ +
Count is now {count}
+
+
diff --git a/packages/vue3/package.json b/packages/vue3/package.json index d3f2dc520..9b9aadfaf 100755 --- a/packages/vue3/package.json +++ b/packages/vue3/package.json @@ -1,6 +1,6 @@ { "name": "@jamesst20/inertia-vue3", - "version": "2.0.0", + "version": "2.0.2", "license": "MIT", "description": "The Vue 3 adapter for Inertia.js", "contributors": [ @@ -58,7 +58,7 @@ "vue": "^3.0.0" }, "dependencies": { - "@jamesst20/inertia-core": "file:../core", + "@jamesst20/inertia-core": "2.0.2", "lodash.clonedeep": "^4.5.0", "lodash.isequal": "^4.5.0" } diff --git a/packages/vue3/src/app.ts b/packages/vue3/src/app.ts index fc261c546..85e027e3d 100755 --- a/packages/vue3/src/app.ts +++ b/packages/vue3/src/app.ts @@ -135,7 +135,6 @@ export function usePage(): Page { clearHistory: computed(() => page.value?.clearHistory), deferredProps: computed(() => page.value?.deferredProps), mergeProps: computed(() => page.value?.mergeProps), - scrollRegions: computed(() => page.value?.scrollRegions), rememberedState: computed(() => page.value?.rememberedState), encryptHistory: computed(() => page.value?.encryptHistory), }) diff --git a/packages/vue3/src/index.ts b/packages/vue3/src/index.ts index 89550622b..53e903c95 100755 --- a/packages/vue3/src/index.ts +++ b/packages/vue3/src/index.ts @@ -5,7 +5,7 @@ export { default as Deferred } from './deferred' export { default as Head } from './head' export { InertiaLinkProps, default as Link } from './link' export * from './types' -export { InertiaForm, default as useForm } from './useForm' +export { InertiaForm, InertiaFormProps, default as useForm } from './useForm' export { default as usePoll } from './usePoll' export { default as usePrefetch } from './usePrefetch' export { default as useRemember } from './useRemember' diff --git a/packages/vue3/src/types.ts b/packages/vue3/src/types.ts index c4b7bc9da..1e2f40304 100644 --- a/packages/vue3/src/types.ts +++ b/packages/vue3/src/types.ts @@ -12,7 +12,7 @@ declare module '@jamesst20/inertia-core' { } } -declare module '@vue/runtime-core' { +declare module 'vue' { export interface ComponentCustomProperties { $inertia: typeof router $page: Page diff --git a/packages/vue3/src/useForm.ts b/packages/vue3/src/useForm.ts index 2e9f95f8d..e18143e15 100644 --- a/packages/vue3/src/useForm.ts +++ b/packages/vue3/src/useForm.ts @@ -3,9 +3,10 @@ import cloneDeep from 'lodash.clonedeep' import isEqual from 'lodash.isequal' import { reactive, watch } from 'vue' -type FormDataType = object +type FormDataType = Record +type FormOptions = Omit -interface InertiaFormProps { +export interface InertiaFormProps { isDirty: boolean errors: Partial> hasErrors: boolean @@ -22,12 +23,12 @@ interface InertiaFormProps { clearErrors(...fields: (keyof TForm)[]): this setError(field: keyof TForm, value: string): this setError(errors: Record): this - submit(method: Method, url: string, options?: Partial): void - get(url: string, options?: Partial): void - post(url: string, options?: Partial): void - put(url: string, options?: Partial): void - patch(url: string, options?: Partial): void - delete(url: string, options?: Partial): void + submit(method: Method, url: string, options?: FormOptions): void + get(url: string, options?: FormOptions): void + post(url: string, options?: FormOptions): void + put(url: string, options?: FormOptions): void + patch(url: string, options?: FormOptions): void + delete(url: string, options?: FormOptions): void cancel(): void } @@ -43,11 +44,11 @@ export default function useForm( maybeData?: TForm | (() => TForm), ): InertiaForm { const rememberKey = typeof rememberKeyOrData === 'string' ? rememberKeyOrData : null - const data = typeof rememberKeyOrData === 'string' ? maybeData : rememberKeyOrData + const data = (typeof rememberKeyOrData === 'string' ? maybeData : rememberKeyOrData) ?? {} const restored = rememberKey ? (router.restore(rememberKey) as { data: TForm; errors: Record }) : null - let defaults = typeof data === 'object' ? cloneDeep(data) : cloneDeep(data()) + let defaults = typeof data === 'function' ? cloneDeep(data()) : cloneDeep(data) let cancelToken = null let recentlySuccessfulTimeoutId = null let transform = (data) => data @@ -79,6 +80,7 @@ export default function useForm( if (typeof fieldOrFields === 'undefined') { defaults = this.data() + this.isDirty = false } else { defaults = Object.assign( {}, @@ -90,7 +92,7 @@ export default function useForm( return this }, reset(...fields) { - const resolvedData = typeof data === 'object' ? cloneDeep(defaults) : cloneDeep(data()) + const resolvedData = typeof data === 'function' ? cloneDeep(data()) : cloneDeep(defaults) const clonedData = cloneDeep(resolvedData) if (fields.length === 0) { defaults = clonedData @@ -126,7 +128,7 @@ export default function useForm( return this }, - submit(method, url, options: VisitOptions = {}) { + submit(method, url, options: FormOptions = {}) { const data = transform(this.data()) const _options = { ...options, diff --git a/packages/vue3/test-app/Pages/History/Page.vue b/packages/vue3/test-app/Pages/History/Page.vue index 15b597c7b..c0247e7d6 100644 --- a/packages/vue3/test-app/Pages/History/Page.vue +++ b/packages/vue3/test-app/Pages/History/Page.vue @@ -15,4 +15,6 @@ defineProps<{ pageNumber: number; multiByte: string }>()
This is page {{ pageNumber }}.
Multi byte character: {{ multiByte }}
+ +
diff --git a/packages/vue3/test-app/Pages/WhenVisible.vue b/packages/vue3/test-app/Pages/WhenVisible.vue index b31fc1261..ffacc60b0 100644 --- a/packages/vue3/test-app/Pages/WhenVisible.vue +++ b/packages/vue3/test-app/Pages/WhenVisible.vue @@ -1,5 +1,8 @@ + +
+ + + +
Count is now {{ count }}
+
+
diff --git a/playgrounds/react/composer.lock b/playgrounds/react/composer.lock index a3c1160bc..e2b10f8c0 100644 --- a/playgrounds/react/composer.lock +++ b/playgrounds/react/composer.lock @@ -1133,16 +1133,16 @@ }, { "name": "laravel/framework", - "version": "v10.48.22", + "version": "v10.48.23", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "c4ea52bb044faef4a103d7dd81746c01b2ec860e" + "reference": "625269ca4881d2b50eded2045cb930960a181d98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/c4ea52bb044faef4a103d7dd81746c01b2ec860e", - "reference": "c4ea52bb044faef4a103d7dd81746c01b2ec860e", + "url": "https://api.github.com/repos/laravel/framework/zipball/625269ca4881d2b50eded2045cb930960a181d98", + "reference": "625269ca4881d2b50eded2045cb930960a181d98", "shasum": "" }, "require": { @@ -1336,7 +1336,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-09-12T15:00:09+00:00" + "time": "2024-11-12T15:39:10+00:00" }, { "name": "laravel/prompts", @@ -1464,16 +1464,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v1.3.5", + "version": "v1.3.7", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c" + "reference": "4f48ade902b94323ca3be7646db16209ec76be3d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", - "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/4f48ade902b94323ca3be7646db16209ec76be3d", + "reference": "4f48ade902b94323ca3be7646db16209ec76be3d", "shasum": "" }, "require": { @@ -1521,7 +1521,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2024-09-23T13:33:08+00:00" + "time": "2024-11-14T18:34:49+00:00" }, { "name": "laravel/tinker", @@ -1967,16 +1967,16 @@ }, { "name": "monolog/monolog", - "version": "3.7.0", + "version": "3.8.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", - "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/32e515fdc02cdafbe4593e30a9350d486b125b67", + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67", "shasum": "" }, "require": { @@ -1996,12 +1996,14 @@ "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.5.17", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", "predis/predis": "^1.1 || ^2", - "ruflin/elastica": "^7", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", "symfony/mailer": "^5.4 || ^6", "symfony/mime": "^5.4 || ^6" }, @@ -2052,7 +2054,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.7.0" + "source": "https://github.com/Seldaek/monolog/tree/3.8.0" }, "funding": [ { @@ -2064,7 +2066,7 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:40:51+00:00" + "time": "2024-11-12T13:57:08+00:00" }, { "name": "nesbot/carbon", @@ -2381,33 +2383,32 @@ }, { "name": "nunomaduro/termwind", - "version": "v1.15.1", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/5369ef84d8142c1d87e4ec278711d4ece3cbf301", + "reference": "5369ef84d8142c1d87e4ec278711d4ece3cbf301", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^8.0", - "symfony/console": "^5.3.0|^6.0.0" + "php": "^8.1", + "symfony/console": "^6.4.15" }, "require-dev": { - "ergebnis/phpstan-rules": "^1.0.", - "illuminate/console": "^8.0|^9.0", - "illuminate/support": "^8.0|^9.0", - "laravel/pint": "^1.0.0", - "pestphp/pest": "^1.21.0", - "pestphp/pest-plugin-mock": "^1.0", - "phpstan/phpstan": "^1.4.6", - "phpstan/phpstan-strict-rules": "^1.1.0", - "symfony/var-dumper": "^5.2.7|^6.0.0", + "illuminate/console": "^10.48.24", + "illuminate/support": "^10.48.24", + "laravel/pint": "^1.18.2", + "pestphp/pest": "^2.36.0", + "pestphp/pest-plugin-mock": "2.0.0", + "phpstan/phpstan": "^1.12.11", + "phpstan/phpstan-strict-rules": "^1.6.1", + "symfony/var-dumper": "^6.4.15", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -2447,7 +2448,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + "source": "https://github.com/nunomaduro/termwind/tree/v1.17.0" }, "funding": [ { @@ -2463,7 +2464,7 @@ "type": "github" } ], - "time": "2023-02-08T01:06:31+00:00" + "time": "2024-11-21T10:36:35+00:00" }, { "name": "phpoption/phpoption", @@ -3258,16 +3259,16 @@ }, { "name": "symfony/console", - "version": "v6.4.12", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", + "url": "https://api.github.com/repos/symfony/console/zipball/f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", "shasum": "" }, "require": { @@ -3332,7 +3333,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.12" + "source": "https://github.com/symfony/console/tree/v6.4.15" }, "funding": [ { @@ -3348,20 +3349,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:15:52+00:00" + "time": "2024-11-06T14:19:14+00:00" }, { "name": "symfony/css-selector", - "version": "v7.1.1", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/601a5ce9aaad7bf10797e3663faefce9e26c24e2", + "reference": "601a5ce9aaad7bf10797e3663faefce9e26c24e2", "shasum": "" }, "require": { @@ -3397,7 +3398,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.1" + "source": "https://github.com/symfony/css-selector/tree/v7.2.0" }, "funding": [ { @@ -3413,20 +3414,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", "shasum": "" }, "require": { @@ -3464,7 +3465,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" }, "funding": [ { @@ -3480,20 +3481,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.10", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0" + "reference": "9e024324511eeb00983ee76b9aedc3e6ecd993d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/9e024324511eeb00983ee76b9aedc3e6ecd993d9", + "reference": "9e024324511eeb00983ee76b9aedc3e6ecd993d9", "shasum": "" }, "require": { @@ -3539,7 +3540,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.10" + "source": "https://github.com/symfony/error-handler/tree/v6.4.14" }, "funding": [ { @@ -3555,20 +3556,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-11-05T15:34:40+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.1", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", + "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", "shasum": "" }, "require": { @@ -3619,7 +3620,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" }, "funding": [ { @@ -3635,20 +3636,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", - "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", "shasum": "" }, "require": { @@ -3695,7 +3696,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" }, "funding": [ { @@ -3711,20 +3712,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/finder", - "version": "v6.4.11", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453" + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453", + "url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", "shasum": "" }, "require": { @@ -3759,7 +3760,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.11" + "source": "https://github.com/symfony/finder/tree/v6.4.13" }, "funding": [ { @@ -3775,20 +3776,20 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:27:37+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.12", + "version": "v6.4.16", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "133ac043875f59c26c55e79cf074562127cce4d2" + "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/133ac043875f59c26c55e79cf074562127cce4d2", - "reference": "133ac043875f59c26c55e79cf074562127cce4d2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/431771b7a6f662f1575b3cfc8fd7617aa9864d57", + "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57", "shasum": "" }, "require": { @@ -3798,12 +3799,12 @@ "symfony/polyfill-php83": "^1.27" }, "conflict": { - "symfony/cache": "<6.3" + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, "require-dev": { "doctrine/dbal": "^2.13.1|^3|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.3|^7.0", + "symfony/cache": "^6.4.12|^7.1.5", "symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/expression-language": "^5.4|^6.0|^7.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", @@ -3836,7 +3837,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.12" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.16" }, "funding": [ { @@ -3852,20 +3853,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:18:25+00:00" + "time": "2024-11-13T18:58:10+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.12", + "version": "v6.4.16", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "96df83d51b5f78804f70c093b97310794fd6257b" + "reference": "8838b5b21d807923b893ccbfc2cbeda0f1bc00f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/96df83d51b5f78804f70c093b97310794fd6257b", - "reference": "96df83d51b5f78804f70c093b97310794fd6257b", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8838b5b21d807923b893ccbfc2cbeda0f1bc00f0", + "reference": "8838b5b21d807923b893ccbfc2cbeda0f1bc00f0", "shasum": "" }, "require": { @@ -3950,7 +3951,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.12" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.16" }, "funding": [ { @@ -3966,20 +3967,20 @@ "type": "tidelift" } ], - "time": "2024-09-21T06:02:57+00:00" + "time": "2024-11-27T12:49:36+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26" + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/b6a25408c569ae2366b3f663a4edad19420a9c26", - "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26", + "url": "https://api.github.com/repos/symfony/mailer/zipball/c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", "shasum": "" }, "require": { @@ -4030,7 +4031,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.12" + "source": "https://github.com/symfony/mailer/tree/v6.4.13" }, "funding": [ { @@ -4046,20 +4047,20 @@ "type": "tidelift" } ], - "time": "2024-09-08T12:30:05+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/mime", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "abe16ee7790b16aa525877419deb0f113953f0e1" + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/abe16ee7790b16aa525877419deb0f113953f0e1", - "reference": "abe16ee7790b16aa525877419deb0f113953f0e1", + "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", "shasum": "" }, "require": { @@ -4115,7 +4116,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.12" + "source": "https://github.com/symfony/mime/tree/v6.4.13" }, "funding": [ { @@ -4131,7 +4132,7 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:18:25+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/polyfill-ctype", @@ -4771,16 +4772,16 @@ }, { "name": "symfony/process", - "version": "v6.4.12", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392", + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392", "shasum": "" }, "require": { @@ -4812,7 +4813,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.12" + "source": "https://github.com/symfony/process/tree/v6.4.15" }, "funding": [ { @@ -4828,20 +4829,20 @@ "type": "tidelift" } ], - "time": "2024-09-17T12:47:12+00:00" + "time": "2024-11-06T14:19:14+00:00" }, { "name": "symfony/routing", - "version": "v6.4.12", + "version": "v6.4.16", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f" + "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/a7c8036bd159486228dc9be3e846a00a0dda9f9f", - "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f", + "url": "https://api.github.com/repos/symfony/routing/zipball/91e02e606b4b705c2f4fb42f7e7708b7923a3220", + "reference": "91e02e606b4b705c2f4fb42f7e7708b7923a3220", "shasum": "" }, "require": { @@ -4895,7 +4896,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.12" + "source": "https://github.com/symfony/routing/tree/v6.4.16" }, "funding": [ { @@ -4911,20 +4912,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:32:26+00:00" + "time": "2024-11-13T15:31:34+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", "shasum": "" }, "require": { @@ -4978,7 +4979,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" }, "funding": [ { @@ -4994,20 +4995,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/string", - "version": "v7.1.5", + "version": "v7.2.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", + "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", + "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", "shasum": "" }, "require": { @@ -5065,7 +5066,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.5" + "source": "https://github.com/symfony/string/tree/v7.2.0" }, "funding": [ { @@ -5081,20 +5082,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2024-11-13T13:31:26+00:00" }, { "name": "symfony/translation", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "cf8360b8352b086be620fae8342c4d96e391a489" + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/cf8360b8352b086be620fae8342c4d96e391a489", - "reference": "cf8360b8352b086be620fae8342c4d96e391a489", + "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66", "shasum": "" }, "require": { @@ -5160,7 +5161,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.12" + "source": "https://github.com/symfony/translation/tree/v6.4.13" }, "funding": [ { @@ -5176,20 +5177,20 @@ "type": "tidelift" } ], - "time": "2024-09-16T06:02:54+00:00" + "time": "2024-09-27T18:14:25+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.5.0", + "version": "v3.5.1", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", - "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", + "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", "shasum": "" }, "require": { @@ -5238,7 +5239,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" }, "funding": [ { @@ -5254,20 +5255,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/uid", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d" + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", - "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", + "url": "https://api.github.com/repos/symfony/uid/zipball/18eb207f0436a993fffbdd811b5b8fa35fa5e007", + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007", "shasum": "" }, "require": { @@ -5312,7 +5313,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.12" + "source": "https://github.com/symfony/uid/tree/v6.4.13" }, "funding": [ { @@ -5328,20 +5329,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:32:26+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.11", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "ee14c8254a480913268b1e3b1cba8045ed122694" + "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694", - "reference": "ee14c8254a480913268b1e3b1cba8045ed122694", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80", + "reference": "38254d5a5ac2e61f2b52f9caf54e7aa3c9d36b80", "shasum": "" }, "require": { @@ -5397,7 +5398,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.11" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.15" }, "funding": [ { @@ -5413,7 +5414,7 @@ "type": "tidelift" } ], - "time": "2024-08-30T16:03:21+00:00" + "time": "2024-11-08T15:28:48+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -5554,16 +5555,16 @@ }, { "name": "voku/portable-ascii", - "version": "2.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "b56450eed252f6801410d810c8e1727224ae0743" + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", - "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", + "reference": "b1d923f88091c6bf09699efcd7c8a1b1bfd7351d", "shasum": "" }, "require": { @@ -5588,7 +5589,7 @@ "authors": [ { "name": "Lars Moelleken", - "homepage": "http://www.moelleken.org/" + "homepage": "https://www.moelleken.org/" } ], "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", @@ -5600,7 +5601,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/2.0.1" + "source": "https://github.com/voku/portable-ascii/tree/2.0.3" }, "funding": [ { @@ -5624,7 +5625,7 @@ "type": "tidelift" } ], - "time": "2022-03-08T17:03:00+00:00" + "time": "2024-11-21T01:49:47+00:00" }, { "name": "webmozart/assert", diff --git a/playgrounds/react/package.json b/playgrounds/react/package.json index 68b151f72..7839d3063 100644 --- a/playgrounds/react/package.json +++ b/playgrounds/react/package.json @@ -7,7 +7,7 @@ }, "type": "module", "devDependencies": { - "@jamesst20/inertia-react": "2.0.0", + "@jamesst20/inertia-react": "2.0.2", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", "@vitejs/plugin-react": "^4.3.2", diff --git a/playgrounds/svelte4/composer.json b/playgrounds/svelte4/composer.json index a30d474c2..2cbc2ee45 100644 --- a/playgrounds/svelte4/composer.json +++ b/playgrounds/svelte4/composer.json @@ -7,7 +7,7 @@ "require": { "php": "^8.0.2", "guzzlehttp/guzzle": "^7.2", - "inertiajs/inertia-laravel": "@dev", + "inertiajs/inertia-laravel": "2.x-dev", "laravel/framework": "^10.0", "laravel/sanctum": "^3.2", "laravel/tinker": "^2.7" @@ -62,14 +62,5 @@ } }, "minimum-stability": "dev", - "prefer-stable": true, - "repositories": [ - { - "type": "path", - "url": "./../../../inertia-laravel/", - "options": { - "symlink": true - } - } - ] + "prefer-stable": true } diff --git a/playgrounds/svelte4/composer.lock b/playgrounds/svelte4/composer.lock index a658e38f8..a6507de07 100644 --- a/playgrounds/svelte4/composer.lock +++ b/playgrounds/svelte4/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "764d9aef4bf3cc9e043aed896c9ff744", + "content-hash": "45a9e748df5cc8af0c2f5ab8453946d6", "packages": [ { "name": "brick/math", @@ -380,16 +380,16 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v3.3.3", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + "reference": "8c784d071debd117328803d86b2097615b457500" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", "shasum": "" }, "require": { @@ -402,10 +402,14 @@ "require-dev": { "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.0", - "phpstan/phpstan-webmozart-assert": "^1.0", "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "autoload": { "psr-4": { "Cron\\": "src/Cron/" @@ -429,7 +433,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" }, "funding": [ { @@ -437,7 +441,7 @@ "type": "github" } ], - "time": "2023-08-10T19:36:49+00:00" + "time": "2024-10-09T13:47:03+00:00" }, { "name": "egulias/email-validator", @@ -767,16 +771,16 @@ }, { "name": "guzzlehttp/promises", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { @@ -830,7 +834,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.3" + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, "funding": [ { @@ -846,7 +850,7 @@ "type": "tidelift" } ], - "time": "2024-07-18T10:29:17+00:00" + "time": "2024-10-17T10:06:22+00:00" }, { "name": "guzzlehttp/psr7", @@ -1053,10 +1057,16 @@ { "name": "inertiajs/inertia-laravel", "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/inertiajs/inertia-laravel.git", + "reference": "a836013b5b86b999189b4eb2ce60835cd1329136" + }, "dist": { - "type": "path", - "url": "./../../../inertia-laravel-v2", - "reference": "f6ad746994d2e0b64693af56c4fdfbed7b53ea0f" + "type": "zip", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/a836013b5b86b999189b4eb2ce60835cd1329136", + "reference": "a836013b5b86b999189b4eb2ce60835cd1329136", + "shasum": "" }, "require": { "ext-json": "*", @@ -1086,18 +1096,14 @@ } }, "autoload": { - "psr-4": { - "Inertia\\": "src" - }, "files": [ "./helpers.php" - ] - }, - "autoload-dev": { + ], "psr-4": { - "Inertia\\Tests\\": "tests/" + "Inertia\\": "src" } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1113,10 +1119,17 @@ "inertia", "laravel" ], - "transport-options": { - "symlink": true, - "relative": true - } + "support": { + "issues": "https://github.com/inertiajs/inertia-laravel/issues", + "source": "https://github.com/inertiajs/inertia-laravel/tree/2.x" + }, + "funding": [ + { + "url": "https://github.com/reinink", + "type": "github" + } + ], + "time": "2024-10-18T17:55:17+00:00" }, { "name": "laravel/framework", @@ -1766,16 +1779,16 @@ }, { "name": "league/flysystem", - "version": "3.29.0", + "version": "3.29.1", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "0adc0d9a51852e170e0028a60bd271726626d3f0" + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/0adc0d9a51852e170e0028a60bd271726626d3f0", - "reference": "0adc0d9a51852e170e0028a60bd271726626d3f0", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", "shasum": "" }, "require": { @@ -1843,9 +1856,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.29.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" }, - "time": "2024-09-29T11:59:11+00:00" + "time": "2024-10-08T08:58:34+00:00" }, { "name": "league/flysystem-local", @@ -2162,24 +2175,24 @@ }, { "name": "nette/schema", - "version": "v1.3.0", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", "shasum": "" }, "require": { "nette/utils": "^4.0", - "php": "8.1 - 8.3" + "php": "8.1 - 8.4" }, "require-dev": { - "nette/tester": "^2.4", + "nette/tester": "^2.5.2", "phpstan/phpstan-nette": "^1.0", "tracy/tracy": "^2.8" }, @@ -2218,9 +2231,9 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.0" + "source": "https://github.com/nette/schema/tree/v1.3.2" }, - "time": "2023-12-11T11:54:22+00:00" + "time": "2024-10-06T23:10:23+00:00" }, { "name": "nette/utils", @@ -2310,16 +2323,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.3.0", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "3abf7425cd284141dc5d8d14a9ee444de3345d1a" + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3abf7425cd284141dc5d8d14a9ee444de3345d1a", - "reference": "3abf7425cd284141dc5d8d14a9ee444de3345d1a", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", "shasum": "" }, "require": { @@ -2362,39 +2375,38 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" }, - "time": "2024-09-29T13:56:26+00:00" + "time": "2024-10-08T18:51:32+00:00" }, { "name": "nunomaduro/termwind", - "version": "v1.15.1", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + "reference": "dcf1ec3dfa36137b7ce41d43866644a7ab8fc257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dcf1ec3dfa36137b7ce41d43866644a7ab8fc257", + "reference": "dcf1ec3dfa36137b7ce41d43866644a7ab8fc257", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^8.0", - "symfony/console": "^5.3.0|^6.0.0" + "php": "^8.1", + "symfony/console": "^6.4.12" }, "require-dev": { - "ergebnis/phpstan-rules": "^1.0.", - "illuminate/console": "^8.0|^9.0", - "illuminate/support": "^8.0|^9.0", - "laravel/pint": "^1.0.0", - "pestphp/pest": "^1.21.0", - "pestphp/pest-plugin-mock": "^1.0", - "phpstan/phpstan": "^1.4.6", - "phpstan/phpstan-strict-rules": "^1.1.0", - "symfony/var-dumper": "^5.2.7|^6.0.0", + "illuminate/console": "^10.48.22", + "illuminate/support": "^10.48.22", + "laravel/pint": "^1.18.1", + "pestphp/pest": "^2", + "pestphp/pest-plugin-mock": "2.0.0", + "phpstan/phpstan": "^1.12.6", + "phpstan/phpstan-strict-rules": "^1.6.1", + "symfony/var-dumper": "^6.4.11", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -2434,7 +2446,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + "source": "https://github.com/nunomaduro/termwind/tree/v1.16.0" }, "funding": [ { @@ -2450,7 +2462,7 @@ "type": "github" } ], - "time": "2023-02-08T01:06:31+00:00" + "time": "2024-10-15T15:27:12+00:00" }, { "name": "phpoption/phpoption", @@ -3245,16 +3257,16 @@ }, { "name": "symfony/console", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" + "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", + "url": "https://api.github.com/repos/symfony/console/zipball/f793dd5a7d9ae9923e35d0503d08ba734cec1d79", + "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79", "shasum": "" }, "require": { @@ -3319,7 +3331,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.12" + "source": "https://github.com/symfony/console/tree/v6.4.13" }, "funding": [ { @@ -3335,20 +3347,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:15:52+00:00" + "time": "2024-10-09T08:40:40+00:00" }, { "name": "symfony/css-selector", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", "shasum": "" }, "require": { @@ -3384,7 +3396,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.1" + "source": "https://github.com/symfony/css-selector/tree/v7.1.6" }, "funding": [ { @@ -3400,7 +3412,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3471,16 +3483,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.10", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0" + "reference": "e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c", + "reference": "e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c", "shasum": "" }, "require": { @@ -3526,7 +3538,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.10" + "source": "https://github.com/symfony/error-handler/tree/v6.4.13" }, "funding": [ { @@ -3542,20 +3554,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + "reference": "87254c78dd50721cfd015b62277a8281c5589702" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", + "reference": "87254c78dd50721cfd015b62277a8281c5589702", "shasum": "" }, "require": { @@ -3606,7 +3618,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6" }, "funding": [ { @@ -3622,7 +3634,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3702,16 +3714,16 @@ }, { "name": "symfony/finder", - "version": "v6.4.11", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453" + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453", + "url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", "shasum": "" }, "require": { @@ -3746,7 +3758,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.11" + "source": "https://github.com/symfony/finder/tree/v6.4.13" }, "funding": [ { @@ -3762,20 +3774,20 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:27:37+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "133ac043875f59c26c55e79cf074562127cce4d2" + "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/133ac043875f59c26c55e79cf074562127cce4d2", - "reference": "133ac043875f59c26c55e79cf074562127cce4d2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", + "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", "shasum": "" }, "require": { @@ -3823,7 +3835,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.12" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.13" }, "funding": [ { @@ -3839,20 +3851,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:18:25+00:00" + "time": "2024-10-11T19:20:58+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "96df83d51b5f78804f70c093b97310794fd6257b" + "reference": "4474015c363ec0cd3bf47d55657e68630dbae66e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/96df83d51b5f78804f70c093b97310794fd6257b", - "reference": "96df83d51b5f78804f70c093b97310794fd6257b", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4474015c363ec0cd3bf47d55657e68630dbae66e", + "reference": "4474015c363ec0cd3bf47d55657e68630dbae66e", "shasum": "" }, "require": { @@ -3937,7 +3949,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.12" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.13" }, "funding": [ { @@ -3953,20 +3965,20 @@ "type": "tidelift" } ], - "time": "2024-09-21T06:02:57+00:00" + "time": "2024-10-27T13:00:29+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26" + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/b6a25408c569ae2366b3f663a4edad19420a9c26", - "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26", + "url": "https://api.github.com/repos/symfony/mailer/zipball/c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", "shasum": "" }, "require": { @@ -4017,7 +4029,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.12" + "source": "https://github.com/symfony/mailer/tree/v6.4.13" }, "funding": [ { @@ -4033,20 +4045,20 @@ "type": "tidelift" } ], - "time": "2024-09-08T12:30:05+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/mime", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "abe16ee7790b16aa525877419deb0f113953f0e1" + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/abe16ee7790b16aa525877419deb0f113953f0e1", - "reference": "abe16ee7790b16aa525877419deb0f113953f0e1", + "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", "shasum": "" }, "require": { @@ -4102,7 +4114,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.12" + "source": "https://github.com/symfony/mime/tree/v6.4.13" }, "funding": [ { @@ -4118,7 +4130,7 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:18:25+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/polyfill-ctype", @@ -4758,16 +4770,16 @@ }, { "name": "symfony/process", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" + "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "url": "https://api.github.com/repos/symfony/process/zipball/1f9f59b46880201629df3bd950fc5ae8c55b960f", + "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f", "shasum": "" }, "require": { @@ -4799,7 +4811,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.12" + "source": "https://github.com/symfony/process/tree/v6.4.13" }, "funding": [ { @@ -4815,20 +4827,20 @@ "type": "tidelift" } ], - "time": "2024-09-17T12:47:12+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/routing", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f" + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/a7c8036bd159486228dc9be3e846a00a0dda9f9f", - "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f", + "url": "https://api.github.com/repos/symfony/routing/zipball/640a74250d13f9c30d5ca045b6aaaabcc8215278", + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278", "shasum": "" }, "require": { @@ -4882,7 +4894,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.12" + "source": "https://github.com/symfony/routing/tree/v6.4.13" }, "funding": [ { @@ -4898,7 +4910,7 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:32:26+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/service-contracts", @@ -4985,16 +4997,16 @@ }, { "name": "symfony/string", - "version": "v7.1.5", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", + "url": "https://api.github.com/repos/symfony/string/zipball/61b72d66bf96c360a727ae6232df5ac83c71f626", + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626", "shasum": "" }, "require": { @@ -5052,7 +5064,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.5" + "source": "https://github.com/symfony/string/tree/v7.1.6" }, "funding": [ { @@ -5068,20 +5080,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/translation", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "cf8360b8352b086be620fae8342c4d96e391a489" + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/cf8360b8352b086be620fae8342c4d96e391a489", - "reference": "cf8360b8352b086be620fae8342c4d96e391a489", + "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66", "shasum": "" }, "require": { @@ -5147,7 +5159,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.12" + "source": "https://github.com/symfony/translation/tree/v6.4.13" }, "funding": [ { @@ -5163,7 +5175,7 @@ "type": "tidelift" } ], - "time": "2024-09-16T06:02:54+00:00" + "time": "2024-09-27T18:14:25+00:00" }, { "name": "symfony/translation-contracts", @@ -5245,16 +5257,16 @@ }, { "name": "symfony/uid", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d" + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", - "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", + "url": "https://api.github.com/repos/symfony/uid/zipball/18eb207f0436a993fffbdd811b5b8fa35fa5e007", + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007", "shasum": "" }, "require": { @@ -5299,7 +5311,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.12" + "source": "https://github.com/symfony/uid/tree/v6.4.13" }, "funding": [ { @@ -5315,20 +5327,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:32:26+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.11", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "ee14c8254a480913268b1e3b1cba8045ed122694" + "reference": "2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694", - "reference": "ee14c8254a480913268b1e3b1cba8045ed122694", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41", + "reference": "2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41", "shasum": "" }, "require": { @@ -5384,7 +5396,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.11" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.13" }, "funding": [ { @@ -5400,7 +5412,7 @@ "type": "tidelift" } ], - "time": "2024-08-30T16:03:21+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -5996,16 +6008,16 @@ }, { "name": "laravel/sail", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "d54af9d5745e3680d8a6463ffd9f314aa53eb2d1" + "reference": "5d385f2e698f0f774cdead82aff5d989fb95309b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/d54af9d5745e3680d8a6463ffd9f314aa53eb2d1", - "reference": "d54af9d5745e3680d8a6463ffd9f314aa53eb2d1", + "url": "https://api.github.com/repos/laravel/sail/zipball/5d385f2e698f0f774cdead82aff5d989fb95309b", + "reference": "5d385f2e698f0f774cdead82aff5d989fb95309b", "shasum": "" }, "require": { @@ -6055,7 +6067,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2024-09-22T19:04:21+00:00" + "time": "2024-10-21T17:13:38+00:00" }, { "name": "mockery/mockery", @@ -8173,16 +8185,16 @@ }, { "name": "symfony/yaml", - "version": "v7.1.5", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", "shasum": "" }, "require": { @@ -8224,7 +8236,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.5" + "source": "https://github.com/symfony/yaml/tree/v7.1.6" }, "funding": [ { @@ -8240,7 +8252,7 @@ "type": "tidelift" } ], - "time": "2024-09-17T12:49:58+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "theseer/tokenizer", diff --git a/playgrounds/svelte4/package.json b/playgrounds/svelte4/package.json index 0c7680348..6255cde2f 100644 --- a/playgrounds/svelte4/package.json +++ b/playgrounds/svelte4/package.json @@ -9,7 +9,7 @@ "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch" }, "devDependencies": { - "@jamesst20/inertia-svelte": "2.0.0", + "@jamesst20/inertia-svelte": "2.0.2", "@sveltejs/vite-plugin-svelte": "^3.1.2", "@tsconfig/svelte": "^5.0.4", "autoprefixer": "^10.4.13", diff --git a/playgrounds/svelte5/composer.json b/playgrounds/svelte5/composer.json index a30d474c2..2cbc2ee45 100644 --- a/playgrounds/svelte5/composer.json +++ b/playgrounds/svelte5/composer.json @@ -7,7 +7,7 @@ "require": { "php": "^8.0.2", "guzzlehttp/guzzle": "^7.2", - "inertiajs/inertia-laravel": "@dev", + "inertiajs/inertia-laravel": "2.x-dev", "laravel/framework": "^10.0", "laravel/sanctum": "^3.2", "laravel/tinker": "^2.7" @@ -62,14 +62,5 @@ } }, "minimum-stability": "dev", - "prefer-stable": true, - "repositories": [ - { - "type": "path", - "url": "./../../../inertia-laravel/", - "options": { - "symlink": true - } - } - ] + "prefer-stable": true } diff --git a/playgrounds/svelte5/composer.lock b/playgrounds/svelte5/composer.lock index a658e38f8..a6507de07 100644 --- a/playgrounds/svelte5/composer.lock +++ b/playgrounds/svelte5/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "764d9aef4bf3cc9e043aed896c9ff744", + "content-hash": "45a9e748df5cc8af0c2f5ab8453946d6", "packages": [ { "name": "brick/math", @@ -380,16 +380,16 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v3.3.3", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + "reference": "8c784d071debd117328803d86b2097615b457500" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", "shasum": "" }, "require": { @@ -402,10 +402,14 @@ "require-dev": { "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.0", - "phpstan/phpstan-webmozart-assert": "^1.0", "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "autoload": { "psr-4": { "Cron\\": "src/Cron/" @@ -429,7 +433,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" }, "funding": [ { @@ -437,7 +441,7 @@ "type": "github" } ], - "time": "2023-08-10T19:36:49+00:00" + "time": "2024-10-09T13:47:03+00:00" }, { "name": "egulias/email-validator", @@ -767,16 +771,16 @@ }, { "name": "guzzlehttp/promises", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { @@ -830,7 +834,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.3" + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, "funding": [ { @@ -846,7 +850,7 @@ "type": "tidelift" } ], - "time": "2024-07-18T10:29:17+00:00" + "time": "2024-10-17T10:06:22+00:00" }, { "name": "guzzlehttp/psr7", @@ -1053,10 +1057,16 @@ { "name": "inertiajs/inertia-laravel", "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/inertiajs/inertia-laravel.git", + "reference": "a836013b5b86b999189b4eb2ce60835cd1329136" + }, "dist": { - "type": "path", - "url": "./../../../inertia-laravel-v2", - "reference": "f6ad746994d2e0b64693af56c4fdfbed7b53ea0f" + "type": "zip", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/a836013b5b86b999189b4eb2ce60835cd1329136", + "reference": "a836013b5b86b999189b4eb2ce60835cd1329136", + "shasum": "" }, "require": { "ext-json": "*", @@ -1086,18 +1096,14 @@ } }, "autoload": { - "psr-4": { - "Inertia\\": "src" - }, "files": [ "./helpers.php" - ] - }, - "autoload-dev": { + ], "psr-4": { - "Inertia\\Tests\\": "tests/" + "Inertia\\": "src" } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1113,10 +1119,17 @@ "inertia", "laravel" ], - "transport-options": { - "symlink": true, - "relative": true - } + "support": { + "issues": "https://github.com/inertiajs/inertia-laravel/issues", + "source": "https://github.com/inertiajs/inertia-laravel/tree/2.x" + }, + "funding": [ + { + "url": "https://github.com/reinink", + "type": "github" + } + ], + "time": "2024-10-18T17:55:17+00:00" }, { "name": "laravel/framework", @@ -1766,16 +1779,16 @@ }, { "name": "league/flysystem", - "version": "3.29.0", + "version": "3.29.1", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "0adc0d9a51852e170e0028a60bd271726626d3f0" + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/0adc0d9a51852e170e0028a60bd271726626d3f0", - "reference": "0adc0d9a51852e170e0028a60bd271726626d3f0", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", "shasum": "" }, "require": { @@ -1843,9 +1856,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.29.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" }, - "time": "2024-09-29T11:59:11+00:00" + "time": "2024-10-08T08:58:34+00:00" }, { "name": "league/flysystem-local", @@ -2162,24 +2175,24 @@ }, { "name": "nette/schema", - "version": "v1.3.0", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", "shasum": "" }, "require": { "nette/utils": "^4.0", - "php": "8.1 - 8.3" + "php": "8.1 - 8.4" }, "require-dev": { - "nette/tester": "^2.4", + "nette/tester": "^2.5.2", "phpstan/phpstan-nette": "^1.0", "tracy/tracy": "^2.8" }, @@ -2218,9 +2231,9 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.0" + "source": "https://github.com/nette/schema/tree/v1.3.2" }, - "time": "2023-12-11T11:54:22+00:00" + "time": "2024-10-06T23:10:23+00:00" }, { "name": "nette/utils", @@ -2310,16 +2323,16 @@ }, { "name": "nikic/php-parser", - "version": "v5.3.0", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "3abf7425cd284141dc5d8d14a9ee444de3345d1a" + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3abf7425cd284141dc5d8d14a9ee444de3345d1a", - "reference": "3abf7425cd284141dc5d8d14a9ee444de3345d1a", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", "shasum": "" }, "require": { @@ -2362,39 +2375,38 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" }, - "time": "2024-09-29T13:56:26+00:00" + "time": "2024-10-08T18:51:32+00:00" }, { "name": "nunomaduro/termwind", - "version": "v1.15.1", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + "reference": "dcf1ec3dfa36137b7ce41d43866644a7ab8fc257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dcf1ec3dfa36137b7ce41d43866644a7ab8fc257", + "reference": "dcf1ec3dfa36137b7ce41d43866644a7ab8fc257", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^8.0", - "symfony/console": "^5.3.0|^6.0.0" + "php": "^8.1", + "symfony/console": "^6.4.12" }, "require-dev": { - "ergebnis/phpstan-rules": "^1.0.", - "illuminate/console": "^8.0|^9.0", - "illuminate/support": "^8.0|^9.0", - "laravel/pint": "^1.0.0", - "pestphp/pest": "^1.21.0", - "pestphp/pest-plugin-mock": "^1.0", - "phpstan/phpstan": "^1.4.6", - "phpstan/phpstan-strict-rules": "^1.1.0", - "symfony/var-dumper": "^5.2.7|^6.0.0", + "illuminate/console": "^10.48.22", + "illuminate/support": "^10.48.22", + "laravel/pint": "^1.18.1", + "pestphp/pest": "^2", + "pestphp/pest-plugin-mock": "2.0.0", + "phpstan/phpstan": "^1.12.6", + "phpstan/phpstan-strict-rules": "^1.6.1", + "symfony/var-dumper": "^6.4.11", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -2434,7 +2446,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + "source": "https://github.com/nunomaduro/termwind/tree/v1.16.0" }, "funding": [ { @@ -2450,7 +2462,7 @@ "type": "github" } ], - "time": "2023-02-08T01:06:31+00:00" + "time": "2024-10-15T15:27:12+00:00" }, { "name": "phpoption/phpoption", @@ -3245,16 +3257,16 @@ }, { "name": "symfony/console", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765" + "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765", - "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765", + "url": "https://api.github.com/repos/symfony/console/zipball/f793dd5a7d9ae9923e35d0503d08ba734cec1d79", + "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79", "shasum": "" }, "require": { @@ -3319,7 +3331,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.12" + "source": "https://github.com/symfony/console/tree/v6.4.13" }, "funding": [ { @@ -3335,20 +3347,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:15:52+00:00" + "time": "2024-10-09T08:40:40+00:00" }, { "name": "symfony/css-selector", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", "shasum": "" }, "require": { @@ -3384,7 +3396,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.1" + "source": "https://github.com/symfony/css-selector/tree/v7.1.6" }, "funding": [ { @@ -3400,7 +3412,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3471,16 +3483,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.10", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0" + "reference": "e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/231f1b2ee80f72daa1972f7340297d67439224f0", - "reference": "231f1b2ee80f72daa1972f7340297d67439224f0", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c", + "reference": "e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c", "shasum": "" }, "require": { @@ -3526,7 +3538,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.10" + "source": "https://github.com/symfony/error-handler/tree/v6.4.13" }, "funding": [ { @@ -3542,20 +3554,20 @@ "type": "tidelift" } ], - "time": "2024-07-26T12:30:32+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + "reference": "87254c78dd50721cfd015b62277a8281c5589702" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", + "reference": "87254c78dd50721cfd015b62277a8281c5589702", "shasum": "" }, "require": { @@ -3606,7 +3618,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6" }, "funding": [ { @@ -3622,7 +3634,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3702,16 +3714,16 @@ }, { "name": "symfony/finder", - "version": "v6.4.11", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453" + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453", - "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453", + "url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", "shasum": "" }, "require": { @@ -3746,7 +3758,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.11" + "source": "https://github.com/symfony/finder/tree/v6.4.13" }, "funding": [ { @@ -3762,20 +3774,20 @@ "type": "tidelift" } ], - "time": "2024-08-13T14:27:37+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "133ac043875f59c26c55e79cf074562127cce4d2" + "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/133ac043875f59c26c55e79cf074562127cce4d2", - "reference": "133ac043875f59c26c55e79cf074562127cce4d2", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", + "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", "shasum": "" }, "require": { @@ -3823,7 +3835,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.12" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.13" }, "funding": [ { @@ -3839,20 +3851,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:18:25+00:00" + "time": "2024-10-11T19:20:58+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "96df83d51b5f78804f70c093b97310794fd6257b" + "reference": "4474015c363ec0cd3bf47d55657e68630dbae66e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/96df83d51b5f78804f70c093b97310794fd6257b", - "reference": "96df83d51b5f78804f70c093b97310794fd6257b", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4474015c363ec0cd3bf47d55657e68630dbae66e", + "reference": "4474015c363ec0cd3bf47d55657e68630dbae66e", "shasum": "" }, "require": { @@ -3937,7 +3949,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.12" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.13" }, "funding": [ { @@ -3953,20 +3965,20 @@ "type": "tidelift" } ], - "time": "2024-09-21T06:02:57+00:00" + "time": "2024-10-27T13:00:29+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26" + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/b6a25408c569ae2366b3f663a4edad19420a9c26", - "reference": "b6a25408c569ae2366b3f663a4edad19420a9c26", + "url": "https://api.github.com/repos/symfony/mailer/zipball/c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", "shasum": "" }, "require": { @@ -4017,7 +4029,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.12" + "source": "https://github.com/symfony/mailer/tree/v6.4.13" }, "funding": [ { @@ -4033,20 +4045,20 @@ "type": "tidelift" } ], - "time": "2024-09-08T12:30:05+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/mime", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "abe16ee7790b16aa525877419deb0f113953f0e1" + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/abe16ee7790b16aa525877419deb0f113953f0e1", - "reference": "abe16ee7790b16aa525877419deb0f113953f0e1", + "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", "shasum": "" }, "require": { @@ -4102,7 +4114,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.12" + "source": "https://github.com/symfony/mime/tree/v6.4.13" }, "funding": [ { @@ -4118,7 +4130,7 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:18:25+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/polyfill-ctype", @@ -4758,16 +4770,16 @@ }, { "name": "symfony/process", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3" + "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3f94e5f13ff58df371a7ead461b6e8068900fbb3", - "reference": "3f94e5f13ff58df371a7ead461b6e8068900fbb3", + "url": "https://api.github.com/repos/symfony/process/zipball/1f9f59b46880201629df3bd950fc5ae8c55b960f", + "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f", "shasum": "" }, "require": { @@ -4799,7 +4811,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.12" + "source": "https://github.com/symfony/process/tree/v6.4.13" }, "funding": [ { @@ -4815,20 +4827,20 @@ "type": "tidelift" } ], - "time": "2024-09-17T12:47:12+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/routing", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f" + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/a7c8036bd159486228dc9be3e846a00a0dda9f9f", - "reference": "a7c8036bd159486228dc9be3e846a00a0dda9f9f", + "url": "https://api.github.com/repos/symfony/routing/zipball/640a74250d13f9c30d5ca045b6aaaabcc8215278", + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278", "shasum": "" }, "require": { @@ -4882,7 +4894,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.12" + "source": "https://github.com/symfony/routing/tree/v6.4.13" }, "funding": [ { @@ -4898,7 +4910,7 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:32:26+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/service-contracts", @@ -4985,16 +4997,16 @@ }, { "name": "symfony/string", - "version": "v7.1.5", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", - "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", + "url": "https://api.github.com/repos/symfony/string/zipball/61b72d66bf96c360a727ae6232df5ac83c71f626", + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626", "shasum": "" }, "require": { @@ -5052,7 +5064,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.5" + "source": "https://github.com/symfony/string/tree/v7.1.6" }, "funding": [ { @@ -5068,20 +5080,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:28:38+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/translation", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "cf8360b8352b086be620fae8342c4d96e391a489" + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/cf8360b8352b086be620fae8342c4d96e391a489", - "reference": "cf8360b8352b086be620fae8342c4d96e391a489", + "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66", "shasum": "" }, "require": { @@ -5147,7 +5159,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.12" + "source": "https://github.com/symfony/translation/tree/v6.4.13" }, "funding": [ { @@ -5163,7 +5175,7 @@ "type": "tidelift" } ], - "time": "2024-09-16T06:02:54+00:00" + "time": "2024-09-27T18:14:25+00:00" }, { "name": "symfony/translation-contracts", @@ -5245,16 +5257,16 @@ }, { "name": "symfony/uid", - "version": "v6.4.12", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d" + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", - "reference": "2f16054e0a9b194b8ca581d4a64eee3f7d4a9d4d", + "url": "https://api.github.com/repos/symfony/uid/zipball/18eb207f0436a993fffbdd811b5b8fa35fa5e007", + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007", "shasum": "" }, "require": { @@ -5299,7 +5311,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.12" + "source": "https://github.com/symfony/uid/tree/v6.4.13" }, "funding": [ { @@ -5315,20 +5327,20 @@ "type": "tidelift" } ], - "time": "2024-09-20T08:32:26+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.11", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "ee14c8254a480913268b1e3b1cba8045ed122694" + "reference": "2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/ee14c8254a480913268b1e3b1cba8045ed122694", - "reference": "ee14c8254a480913268b1e3b1cba8045ed122694", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41", + "reference": "2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41", "shasum": "" }, "require": { @@ -5384,7 +5396,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.11" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.13" }, "funding": [ { @@ -5400,7 +5412,7 @@ "type": "tidelift" } ], - "time": "2024-08-30T16:03:21+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -5996,16 +6008,16 @@ }, { "name": "laravel/sail", - "version": "v1.33.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "d54af9d5745e3680d8a6463ffd9f314aa53eb2d1" + "reference": "5d385f2e698f0f774cdead82aff5d989fb95309b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/d54af9d5745e3680d8a6463ffd9f314aa53eb2d1", - "reference": "d54af9d5745e3680d8a6463ffd9f314aa53eb2d1", + "url": "https://api.github.com/repos/laravel/sail/zipball/5d385f2e698f0f774cdead82aff5d989fb95309b", + "reference": "5d385f2e698f0f774cdead82aff5d989fb95309b", "shasum": "" }, "require": { @@ -6055,7 +6067,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2024-09-22T19:04:21+00:00" + "time": "2024-10-21T17:13:38+00:00" }, { "name": "mockery/mockery", @@ -8173,16 +8185,16 @@ }, { "name": "symfony/yaml", - "version": "v7.1.5", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4" + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4e561c316e135e053bd758bf3b3eb291d9919de4", - "reference": "4e561c316e135e053bd758bf3b3eb291d9919de4", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", "shasum": "" }, "require": { @@ -8224,7 +8236,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.5" + "source": "https://github.com/symfony/yaml/tree/v7.1.6" }, "funding": [ { @@ -8240,7 +8252,7 @@ "type": "tidelift" } ], - "time": "2024-09-17T12:49:58+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "theseer/tokenizer", diff --git a/playgrounds/svelte5/package.json b/playgrounds/svelte5/package.json index 021576411..1df01ef6c 100644 --- a/playgrounds/svelte5/package.json +++ b/playgrounds/svelte5/package.json @@ -9,7 +9,7 @@ "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch" }, "devDependencies": { - "@jamesst20/inertia-svelte": "2.0.0", + "@jamesst20/inertia-svelte": "2.0.2", "@sveltejs/vite-plugin-svelte": "^4.0.0-next.6", "@tsconfig/svelte": "^5.0.4", "autoprefixer": "^10.4.13", diff --git a/playgrounds/vue3/composer.json b/playgrounds/vue3/composer.json index bf803c1f5..3011c58c1 100644 --- a/playgrounds/vue3/composer.json +++ b/playgrounds/vue3/composer.json @@ -65,14 +65,5 @@ } }, "minimum-stability": "dev", - "prefer-stable": true, - "repositories": [ - { - "type": "path", - "url": "./../../../inertia-laravel/", - "options": { - "symlink": true - } - } - ] + "prefer-stable": true } diff --git a/playgrounds/vue3/composer.lock b/playgrounds/vue3/composer.lock index d8eb5c71f..a6507de07 100644 --- a/playgrounds/vue3/composer.lock +++ b/playgrounds/vue3/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "044cb419b0bc1993f31714ae8489405c", + "content-hash": "45a9e748df5cc8af0c2f5ab8453946d6", "packages": [ { "name": "brick/math", @@ -380,16 +380,16 @@ }, { "name": "dragonmantank/cron-expression", - "version": "v3.3.3", + "version": "v3.4.0", "source": { "type": "git", "url": "https://github.com/dragonmantank/cron-expression.git", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a" + "reference": "8c784d071debd117328803d86b2097615b457500" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", - "reference": "adfb1f505deb6384dc8b39804c5065dd3c8c8c0a", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8c784d071debd117328803d86b2097615b457500", + "reference": "8c784d071debd117328803d86b2097615b457500", "shasum": "" }, "require": { @@ -402,10 +402,14 @@ "require-dev": { "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.0", - "phpstan/phpstan-webmozart-assert": "^1.0", "phpunit/phpunit": "^7.0|^8.0|^9.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, "autoload": { "psr-4": { "Cron\\": "src/Cron/" @@ -429,7 +433,7 @@ ], "support": { "issues": "https://github.com/dragonmantank/cron-expression/issues", - "source": "https://github.com/dragonmantank/cron-expression/tree/v3.3.3" + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.4.0" }, "funding": [ { @@ -437,7 +441,7 @@ "type": "github" } ], - "time": "2023-08-10T19:36:49+00:00" + "time": "2024-10-09T13:47:03+00:00" }, { "name": "egulias/email-validator", @@ -641,16 +645,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.9.1", + "version": "7.9.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "a629e5b69db96eb4939c1b34114130077dd4c6fc" + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a629e5b69db96eb4939c1b34114130077dd4c6fc", - "reference": "a629e5b69db96eb4939c1b34114130077dd4c6fc", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { @@ -747,7 +751,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.1" + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, "funding": [ { @@ -763,20 +767,20 @@ "type": "tidelift" } ], - "time": "2024-07-19T16:19:57+00:00" + "time": "2024-07-24T11:22:20+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { @@ -830,7 +834,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.3" + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, "funding": [ { @@ -846,7 +850,7 @@ "type": "tidelift" } ], - "time": "2024-07-18T10:29:17+00:00" + "time": "2024-10-17T10:06:22+00:00" }, { "name": "guzzlehttp/psr7", @@ -1053,10 +1057,16 @@ { "name": "inertiajs/inertia-laravel", "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/inertiajs/inertia-laravel.git", + "reference": "a836013b5b86b999189b4eb2ce60835cd1329136" + }, "dist": { - "type": "path", - "url": "./../../../inertia-laravel", - "reference": "141256b2ed1833158852c9d239d00abec8ff4942" + "type": "zip", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/a836013b5b86b999189b4eb2ce60835cd1329136", + "reference": "a836013b5b86b999189b4eb2ce60835cd1329136", + "shasum": "" }, "require": { "ext-json": "*", @@ -1086,18 +1096,14 @@ } }, "autoload": { - "psr-4": { - "Inertia\\": "src" - }, "files": [ "./helpers.php" - ] - }, - "autoload-dev": { + ], "psr-4": { - "Inertia\\Tests\\": "tests/" + "Inertia\\": "src" } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -1113,23 +1119,30 @@ "inertia", "laravel" ], - "transport-options": { - "symlink": true, - "relative": true - } + "support": { + "issues": "https://github.com/inertiajs/inertia-laravel/issues", + "source": "https://github.com/inertiajs/inertia-laravel/tree/2.x" + }, + "funding": [ + { + "url": "https://github.com/reinink", + "type": "github" + } + ], + "time": "2024-10-18T17:55:17+00:00" }, { "name": "laravel/framework", - "version": "v10.48.16", + "version": "v10.48.22", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "f9a3a50fae399d75e125b0eea637dda90c99eae7" + "reference": "c4ea52bb044faef4a103d7dd81746c01b2ec860e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/f9a3a50fae399d75e125b0eea637dda90c99eae7", - "reference": "f9a3a50fae399d75e125b0eea637dda90c99eae7", + "url": "https://api.github.com/repos/laravel/framework/zipball/c4ea52bb044faef4a103d7dd81746c01b2ec860e", + "reference": "c4ea52bb044faef4a103d7dd81746c01b2ec860e", "shasum": "" }, "require": { @@ -1323,20 +1336,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-07-09T15:25:22+00:00" + "time": "2024-09-12T15:00:09+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.24", + "version": "v0.1.25", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "409b0b4305273472f3754826e68f4edbd0150149" + "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/409b0b4305273472f3754826e68f4edbd0150149", - "reference": "409b0b4305273472f3754826e68f4edbd0150149", + "url": "https://api.github.com/repos/laravel/prompts/zipball/7b4029a84c37cb2725fc7f011586e2997040bc95", + "reference": "7b4029a84c37cb2725fc7f011586e2997040bc95", "shasum": "" }, "require": { @@ -1379,9 +1392,9 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.24" + "source": "https://github.com/laravel/prompts/tree/v0.1.25" }, - "time": "2024-06-17T13:58:22+00:00" + "time": "2024-08-12T22:06:33+00:00" }, { "name": "laravel/sanctum", @@ -1451,26 +1464,27 @@ }, { "name": "laravel/serializable-closure", - "version": "v1.3.3", + "version": "v1.3.5", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", - "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", + "reference": "1dc4a3dbfa2b7628a3114e43e32120cce7cdda9c", "shasum": "" }, "require": { "php": "^7.3|^8.0" }, "require-dev": { - "nesbot/carbon": "^2.61", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0", + "nesbot/carbon": "^2.61|^3.0", "pestphp/pest": "^1.21.3", "phpstan/phpstan": "^1.8.2", - "symfony/var-dumper": "^5.4.11" + "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" }, "type": "library", "extra": { @@ -1507,20 +1521,20 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-11-08T14:08:06+00:00" + "time": "2024-09-23T13:33:08+00:00" }, { "name": "laravel/tinker", - "version": "v2.9.0", + "version": "v2.10.0", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe" + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/502e0fe3f0415d06d5db1f83a472f0f3b754bafe", - "reference": "502e0fe3f0415d06d5db1f83a472f0f3b754bafe", + "url": "https://api.github.com/repos/laravel/tinker/zipball/ba4d51eb56de7711b3a37d63aa0643e99a339ae5", + "reference": "ba4d51eb56de7711b3a37d63aa0643e99a339ae5", "shasum": "" }, "require": { @@ -1571,22 +1585,22 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.9.0" + "source": "https://github.com/laravel/tinker/tree/v2.10.0" }, - "time": "2024-01-04T16:10:04+00:00" + "time": "2024-09-23T13:32:56+00:00" }, { "name": "league/commonmark", - "version": "2.5.0", + "version": "2.5.3", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "0026475f5c9a104410ae824cb5a4d63fa3bdb1df" + "reference": "b650144166dfa7703e62a22e493b853b58d874b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/0026475f5c9a104410ae824cb5a4d63fa3bdb1df", - "reference": "0026475f5c9a104410ae824cb5a4d63fa3bdb1df", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0", + "reference": "b650144166dfa7703e62a22e493b853b58d874b0", "shasum": "" }, "require": { @@ -1599,8 +1613,8 @@ }, "require-dev": { "cebe/markdown": "^1.0", - "commonmark/cmark": "0.31.0", - "commonmark/commonmark.js": "0.31.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", "composer/package-versions-deprecated": "^1.8", "embed/embed": "^4.4", "erusev/parsedown": "^1.0", @@ -1679,7 +1693,7 @@ "type": "tidelift" } ], - "time": "2024-07-22T18:18:14+00:00" + "time": "2024-08-16T11:46:16+00:00" }, { "name": "league/config", @@ -1765,16 +1779,16 @@ }, { "name": "league/flysystem", - "version": "3.28.0", + "version": "3.29.1", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c" + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", - "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", + "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", "shasum": "" }, "require": { @@ -1842,22 +1856,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.28.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" }, - "time": "2024-05-22T10:09:12+00:00" + "time": "2024-10-08T08:58:34+00:00" }, { "name": "league/flysystem-local", - "version": "3.28.0", + "version": "3.29.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40" + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40", - "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", "shasum": "" }, "require": { @@ -1891,22 +1905,22 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" }, - "time": "2024-05-06T20:05:52+00:00" + "time": "2024-08-09T21:24:39+00:00" }, { "name": "league/mime-type-detection", - "version": "1.15.0", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", - "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", "shasum": "" }, "require": { @@ -1937,7 +1951,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" }, "funding": [ { @@ -1949,7 +1963,7 @@ "type": "tidelift" } ], - "time": "2024-01-28T23:22:08+00:00" + "time": "2024-09-21T08:32:55+00:00" }, { "name": "monolog/monolog", @@ -2161,24 +2175,24 @@ }, { "name": "nette/schema", - "version": "v1.3.0", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188" + "reference": "da801d52f0354f70a638673c4a0f04e16529431d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", - "reference": "a6d3a6d1f545f01ef38e60f375d1cf1f4de98188", + "url": "https://api.github.com/repos/nette/schema/zipball/da801d52f0354f70a638673c4a0f04e16529431d", + "reference": "da801d52f0354f70a638673c4a0f04e16529431d", "shasum": "" }, "require": { "nette/utils": "^4.0", - "php": "8.1 - 8.3" + "php": "8.1 - 8.4" }, "require-dev": { - "nette/tester": "^2.4", + "nette/tester": "^2.5.2", "phpstan/phpstan-nette": "^1.0", "tracy/tracy": "^2.8" }, @@ -2217,26 +2231,26 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.0" + "source": "https://github.com/nette/schema/tree/v1.3.2" }, - "time": "2023-12-11T11:54:22+00:00" + "time": "2024-10-06T23:10:23+00:00" }, { "name": "nette/utils", - "version": "v4.0.4", + "version": "v4.0.5", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", - "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", + "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96", "shasum": "" }, "require": { - "php": ">=8.0 <8.4" + "php": "8.0 - 8.4" }, "conflict": { "nette/finder": "<3", @@ -2303,22 +2317,22 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.4" + "source": "https://github.com/nette/utils/tree/v4.0.5" }, - "time": "2024-01-17T16:50:36+00:00" + "time": "2024-08-07T15:39:19+00:00" }, { "name": "nikic/php-parser", - "version": "v5.1.0", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", "shasum": "" }, "require": { @@ -2361,39 +2375,38 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" }, - "time": "2024-07-01T20:03:41+00:00" + "time": "2024-10-08T18:51:32+00:00" }, { "name": "nunomaduro/termwind", - "version": "v1.15.1", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc" + "reference": "dcf1ec3dfa36137b7ce41d43866644a7ab8fc257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/8ab0b32c8caa4a2e09700ea32925441385e4a5dc", - "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dcf1ec3dfa36137b7ce41d43866644a7ab8fc257", + "reference": "dcf1ec3dfa36137b7ce41d43866644a7ab8fc257", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^8.0", - "symfony/console": "^5.3.0|^6.0.0" + "php": "^8.1", + "symfony/console": "^6.4.12" }, "require-dev": { - "ergebnis/phpstan-rules": "^1.0.", - "illuminate/console": "^8.0|^9.0", - "illuminate/support": "^8.0|^9.0", - "laravel/pint": "^1.0.0", - "pestphp/pest": "^1.21.0", - "pestphp/pest-plugin-mock": "^1.0", - "phpstan/phpstan": "^1.4.6", - "phpstan/phpstan-strict-rules": "^1.1.0", - "symfony/var-dumper": "^5.2.7|^6.0.0", + "illuminate/console": "^10.48.22", + "illuminate/support": "^10.48.22", + "laravel/pint": "^1.18.1", + "pestphp/pest": "^2", + "pestphp/pest-plugin-mock": "2.0.0", + "phpstan/phpstan": "^1.12.6", + "phpstan/phpstan-strict-rules": "^1.6.1", + "symfony/var-dumper": "^6.4.11", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -2433,7 +2446,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v1.15.1" + "source": "https://github.com/nunomaduro/termwind/tree/v1.16.0" }, "funding": [ { @@ -2449,7 +2462,7 @@ "type": "github" } ], - "time": "2023-02-08T01:06:31+00:00" + "time": "2024-10-15T15:27:12+00:00" }, { "name": "phpoption/phpoption", @@ -2839,16 +2852,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -2883,9 +2896,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "psr/simple-cache", @@ -3244,16 +3257,16 @@ }, { "name": "symfony/console", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9" + "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9", - "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9", + "url": "https://api.github.com/repos/symfony/console/zipball/f793dd5a7d9ae9923e35d0503d08ba734cec1d79", + "reference": "f793dd5a7d9ae9923e35d0503d08ba734cec1d79", "shasum": "" }, "require": { @@ -3318,7 +3331,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.9" + "source": "https://github.com/symfony/console/tree/v6.4.13" }, "funding": [ { @@ -3334,20 +3347,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-10-09T08:40:40+00:00" }, { "name": "symfony/css-selector", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", - "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", + "reference": "4aa4f6b3d6749c14d3aa815eef8226632e7bbc66", "shasum": "" }, "require": { @@ -3383,7 +3396,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.1.1" + "source": "https://github.com/symfony/css-selector/tree/v7.1.6" }, "funding": [ { @@ -3399,7 +3412,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3470,16 +3483,16 @@ }, { "name": "symfony/error-handler", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c9b7cc075b3ab484239855622ca05cb0b99c13ec" + "reference": "e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c9b7cc075b3ab484239855622ca05cb0b99c13ec", - "reference": "c9b7cc075b3ab484239855622ca05cb0b99c13ec", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c", + "reference": "e3c78742f86a5b65fe2ac4c4b6b776d92fd7ca0c", "shasum": "" }, "require": { @@ -3525,7 +3538,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.9" + "source": "https://github.com/symfony/error-handler/tree/v6.4.13" }, "funding": [ { @@ -3541,20 +3554,20 @@ "type": "tidelift" } ], - "time": "2024-06-21T16:04:15+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + "reference": "87254c78dd50721cfd015b62277a8281c5589702" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", - "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", + "reference": "87254c78dd50721cfd015b62277a8281c5589702", "shasum": "" }, "require": { @@ -3605,7 +3618,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6" }, "funding": [ { @@ -3621,7 +3634,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3701,16 +3714,16 @@ }, { "name": "symfony/finder", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3ef977a43883215d560a2cecb82ec8e62131471c" + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3ef977a43883215d560a2cecb82ec8e62131471c", - "reference": "3ef977a43883215d560a2cecb82ec8e62131471c", + "url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", "shasum": "" }, "require": { @@ -3745,7 +3758,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.8" + "source": "https://github.com/symfony/finder/tree/v6.4.13" }, "funding": [ { @@ -3761,20 +3774,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "27de8cc95e11db7a50b027e71caaab9024545947" + "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/27de8cc95e11db7a50b027e71caaab9024545947", - "reference": "27de8cc95e11db7a50b027e71caaab9024545947", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", + "reference": "4c0341b3e0a7291e752c69d2a1ed9a84b68d604c", "shasum": "" }, "require": { @@ -3822,7 +3835,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.8" + "source": "https://github.com/symfony/http-foundation/tree/v6.4.13" }, "funding": [ { @@ -3838,20 +3851,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-11T19:20:58+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "cc4a9bec6e1bdd2405f40277a68a6ed1bb393005" + "reference": "4474015c363ec0cd3bf47d55657e68630dbae66e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cc4a9bec6e1bdd2405f40277a68a6ed1bb393005", - "reference": "cc4a9bec6e1bdd2405f40277a68a6ed1bb393005", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4474015c363ec0cd3bf47d55657e68630dbae66e", + "reference": "4474015c363ec0cd3bf47d55657e68630dbae66e", "shasum": "" }, "require": { @@ -3936,7 +3949,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.9" + "source": "https://github.com/symfony/http-kernel/tree/v6.4.13" }, "funding": [ { @@ -3952,20 +3965,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T11:48:06+00:00" + "time": "2024-10-27T13:00:29+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45" + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45", - "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45", + "url": "https://api.github.com/repos/symfony/mailer/zipball/c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", + "reference": "c2f7e0d8d7ac8fe25faccf5d8cac462805db2663", "shasum": "" }, "require": { @@ -4016,7 +4029,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.9" + "source": "https://github.com/symfony/mailer/tree/v6.4.13" }, "funding": [ { @@ -4032,20 +4045,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T07:59:05+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/mime", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7d048964877324debdcb4e0549becfa064a20d43" + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7d048964877324debdcb4e0549becfa064a20d43", - "reference": "7d048964877324debdcb4e0549becfa064a20d43", + "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", "shasum": "" }, "require": { @@ -4101,7 +4114,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.9" + "source": "https://github.com/symfony/mime/tree/v6.4.13" }, "funding": [ { @@ -4117,24 +4130,24 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -4180,7 +4193,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -4196,24 +4209,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -4258,7 +4271,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -4274,26 +4287,25 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -4342,7 +4354,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -4358,24 +4370,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -4423,7 +4435,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -4439,24 +4451,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -4503,7 +4515,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -4519,97 +4531,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "10112722600777e02d2745716b70c5db4ca70442" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", - "reference": "10112722600777e02d2745716b70c5db4ca70442", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -4656,7 +4595,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -4672,24 +4611,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -4732,7 +4671,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" }, "funding": [ { @@ -4748,24 +4687,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:35:24+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9" + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9", - "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-uuid": "*" @@ -4811,7 +4750,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" }, "funding": [ { @@ -4827,20 +4766,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/1f9f59b46880201629df3bd950fc5ae8c55b960f", + "reference": "1f9f59b46880201629df3bd950fc5ae8c55b960f", "shasum": "" }, "require": { @@ -4872,7 +4811,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.8" + "source": "https://github.com/symfony/process/tree/v6.4.13" }, "funding": [ { @@ -4888,20 +4827,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/routing", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58" + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58", - "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58", + "url": "https://api.github.com/repos/symfony/routing/zipball/640a74250d13f9c30d5ca045b6aaaabcc8215278", + "reference": "640a74250d13f9c30d5ca045b6aaaabcc8215278", "shasum": "" }, "require": { @@ -4955,7 +4894,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.8" + "source": "https://github.com/symfony/routing/tree/v6.4.13" }, "funding": [ { @@ -4971,7 +4910,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/service-contracts", @@ -5058,16 +4997,16 @@ }, { "name": "symfony/string", - "version": "v7.1.2", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8" + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/14221089ac66cf82e3cf3d1c1da65de305587ff8", - "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8", + "url": "https://api.github.com/repos/symfony/string/zipball/61b72d66bf96c360a727ae6232df5ac83c71f626", + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626", "shasum": "" }, "require": { @@ -5125,7 +5064,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.1.2" + "source": "https://github.com/symfony/string/tree/v7.1.6" }, "funding": [ { @@ -5141,20 +5080,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:27:18+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "symfony/translation", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a" + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/a002933b13989fc4bd0b58e04bf7eec5210e438a", - "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a", + "url": "https://api.github.com/repos/symfony/translation/zipball/bee9bfabfa8b4045a66bf82520e492cddbaffa66", + "reference": "bee9bfabfa8b4045a66bf82520e492cddbaffa66", "shasum": "" }, "require": { @@ -5220,7 +5159,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.8" + "source": "https://github.com/symfony/translation/tree/v6.4.13" }, "funding": [ { @@ -5236,7 +5175,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-27T18:14:25+00:00" }, { "name": "symfony/translation-contracts", @@ -5318,16 +5257,16 @@ }, { "name": "symfony/uid", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "35904eca37a84bb764c560cbfcac9f0ac2bcdbdf" + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/35904eca37a84bb764c560cbfcac9f0ac2bcdbdf", - "reference": "35904eca37a84bb764c560cbfcac9f0ac2bcdbdf", + "url": "https://api.github.com/repos/symfony/uid/zipball/18eb207f0436a993fffbdd811b5b8fa35fa5e007", + "reference": "18eb207f0436a993fffbdd811b5b8fa35fa5e007", "shasum": "" }, "require": { @@ -5372,7 +5311,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.8" + "source": "https://github.com/symfony/uid/tree/v6.4.13" }, "funding": [ { @@ -5388,20 +5327,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172" + "reference": "2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c31566e4ca944271cc8d8ac6887cbf31b8c6a172", - "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41", + "reference": "2acb151474ed8cb43624e3f41a0bf7c4c8ce4f41", "shasum": "" }, "require": { @@ -5457,7 +5396,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.9" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.13" }, "funding": [ { @@ -5473,7 +5412,7 @@ "type": "tidelift" } ], - "time": "2024-06-27T13:23:14+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -5881,26 +5820,26 @@ }, { "name": "filp/whoops", - "version": "2.15.4", + "version": "2.16.0", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546" + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a139776fa3f5985a50b509f2a02ff0f709d2a546", - "reference": "a139776fa3f5985a50b509f2a02ff0f709d2a546", + "url": "https://api.github.com/repos/filp/whoops/zipball/befcdc0e5dce67252aa6322d82424be928214fa2", + "reference": "befcdc0e5dce67252aa6322d82424be928214fa2", "shasum": "" }, "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", + "php": "^7.1 || ^8.0", "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + "mockery/mockery": "^1.0", + "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^4.0 || ^5.0" }, "suggest": { "symfony/var-dumper": "Pretty print complex values better with var-dumper available", @@ -5940,7 +5879,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.15.4" + "source": "https://github.com/filp/whoops/tree/2.16.0" }, "funding": [ { @@ -5948,7 +5887,7 @@ "type": "github" } ], - "time": "2023-11-03T12:00:00+00:00" + "time": "2024-09-25T12:00:00+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -6069,16 +6008,16 @@ }, { "name": "laravel/sail", - "version": "v1.30.2", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/laravel/sail.git", - "reference": "f5a9699a1001e15de1aa5e7cb5c9f50a3f63f887" + "reference": "5d385f2e698f0f774cdead82aff5d989fb95309b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sail/zipball/f5a9699a1001e15de1aa5e7cb5c9f50a3f63f887", - "reference": "f5a9699a1001e15de1aa5e7cb5c9f50a3f63f887", + "url": "https://api.github.com/repos/laravel/sail/zipball/5d385f2e698f0f774cdead82aff5d989fb95309b", + "reference": "5d385f2e698f0f774cdead82aff5d989fb95309b", "shasum": "" }, "require": { @@ -6128,7 +6067,7 @@ "issues": "https://github.com/laravel/sail/issues", "source": "https://github.com/laravel/sail" }, - "time": "2024-07-05T16:01:51+00:00" + "time": "2024-10-21T17:13:38+00:00" }, { "name": "mockery/mockery", @@ -6481,35 +6420,35 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.31", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.6" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -6518,7 +6457,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -6547,7 +6486,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -6555,7 +6494,7 @@ "type": "github" } ], - "time": "2024-03-02T06:37:42+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", @@ -6800,16 +6739,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.20", + "version": "9.6.21", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "49d7820565836236411f5dc002d16dd689cde42f" + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/49d7820565836236411f5dc002d16dd689cde42f", - "reference": "49d7820565836236411f5dc002d16dd689cde42f", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", "shasum": "" }, "require": { @@ -6824,7 +6763,7 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.31", + "phpunit/php-code-coverage": "^9.2.32", "phpunit/php-file-iterator": "^3.0.6", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.4", @@ -6883,7 +6822,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.20" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21" }, "funding": [ { @@ -6899,7 +6838,7 @@ "type": "tidelift" } ], - "time": "2024-07-10T11:45:39+00:00" + "time": "2024-09-19T10:50:18+00:00" }, { "name": "sebastian/cli-parser", @@ -7929,16 +7868,16 @@ }, { "name": "spatie/error-solutions", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/spatie/error-solutions.git", - "reference": "a014da18f2675ea15af0ba97f7e9aee59e13964f" + "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/error-solutions/zipball/a014da18f2675ea15af0ba97f7e9aee59e13964f", - "reference": "a014da18f2675ea15af0ba97f7e9aee59e13964f", + "url": "https://api.github.com/repos/spatie/error-solutions/zipball/ae7393122eda72eed7cc4f176d1e96ea444f2d67", + "reference": "ae7393122eda72eed7cc4f176d1e96ea444f2d67", "shasum": "" }, "require": { @@ -7991,7 +7930,7 @@ ], "support": { "issues": "https://github.com/spatie/error-solutions/issues", - "source": "https://github.com/spatie/error-solutions/tree/1.1.0" + "source": "https://github.com/spatie/error-solutions/tree/1.1.1" }, "funding": [ { @@ -7999,20 +7938,20 @@ "type": "github" } ], - "time": "2024-07-22T08:18:22+00:00" + "time": "2024-07-25T11:06:04+00:00" }, { "name": "spatie/flare-client-php", - "version": "1.7.0", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/spatie/flare-client-php.git", - "reference": "097040ff51e660e0f6fc863684ac4b02c93fa234" + "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/097040ff51e660e0f6fc863684ac4b02c93fa234", - "reference": "097040ff51e660e0f6fc863684ac4b02c93fa234", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", + "reference": "180f8ca4c0d0d6fc51477bd8c53ce37ab5a96122", "shasum": "" }, "require": { @@ -8030,7 +7969,7 @@ "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", - "spatie/phpunit-snapshot-assertions": "^4.0|^5.0" + "spatie/pest-plugin-snapshots": "^1.0|^2.0" }, "type": "library", "extra": { @@ -8060,7 +7999,7 @@ ], "support": { "issues": "https://github.com/spatie/flare-client-php/issues", - "source": "https://github.com/spatie/flare-client-php/tree/1.7.0" + "source": "https://github.com/spatie/flare-client-php/tree/1.8.0" }, "funding": [ { @@ -8068,7 +8007,7 @@ "type": "github" } ], - "time": "2024-06-12T14:39:14+00:00" + "time": "2024-08-01T08:27:26+00:00" }, { "name": "spatie/ignition", @@ -8246,16 +8185,16 @@ }, { "name": "symfony/yaml", - "version": "v7.1.1", + "version": "v7.1.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "fa34c77015aa6720469db7003567b9f772492bf2" + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/fa34c77015aa6720469db7003567b9f772492bf2", - "reference": "fa34c77015aa6720469db7003567b9f772492bf2", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", "shasum": "" }, "require": { @@ -8297,7 +8236,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.1.1" + "source": "https://github.com/symfony/yaml/tree/v7.1.6" }, "funding": [ { @@ -8313,7 +8252,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-09-25T14:20:29+00:00" }, { "name": "theseer/tokenizer", diff --git a/playgrounds/vue3/package.json b/playgrounds/vue3/package.json index 8ce26647e..66d41a1ba 100644 --- a/playgrounds/vue3/package.json +++ b/playgrounds/vue3/package.json @@ -6,7 +6,7 @@ "build": "vue-tsc && vite build && vite build --ssr" }, "devDependencies": { - "@jamesst20/inertia-vue3": "2.0.0", + "@jamesst20/inertia-vue3": "2.0.2", "@vitejs/plugin-vue": "^5.0.5", "@volar/vue-typescript": "^1.0.22", "@vue/server-renderer": "^3.3.4", diff --git a/tests/app/package-lock.json b/tests/app/package-lock.json index 3e063ae75..718e3dbde 100644 --- a/tests/app/package-lock.json +++ b/tests/app/package-lock.json @@ -8,7 +8,7 @@ "body-parser": "^1.19.0", "css-loader": "^5.0.1", "eslint": "^7.17.0", - "express": "^4.17.1", + "express": "^4.21.1", "multer": "^1.4.2" } }, @@ -877,9 +877,9 @@ } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "engines": { "node": ">= 0.6" @@ -1389,9 +1389,9 @@ } }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dev": true, "dependencies": { "accepts": "~1.3.8", @@ -1399,7 +1399,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", diff --git a/tests/app/package.json b/tests/app/package.json old mode 100755 new mode 100644 index 0c4bde4d9..b762da487 --- a/tests/app/package.json +++ b/tests/app/package.json @@ -7,7 +7,7 @@ "body-parser": "^1.19.0", "css-loader": "^5.0.1", "eslint": "^7.17.0", - "express": "^4.17.1", + "express": "^4.21.1", "multer": "^1.4.2" } } diff --git a/tests/app/server.js b/tests/app/server.js index 91b69610e..f68696c71 100644 --- a/tests/app/server.js +++ b/tests/app/server.js @@ -237,8 +237,8 @@ app.get('/when-visible', (req, res) => { props: {}, }) - if (req.headers['x-inertia-partial-data']) { - setTimeout(page, 500) + if (req.headers['x-inertia-partial-data'] || req.query.count) { + setTimeout(page, 250) } else { page() } diff --git a/tests/history.spec.ts b/tests/history.spec.ts index 1e0c481d5..878691821 100644 --- a/tests/history.spec.ts +++ b/tests/history.spec.ts @@ -9,7 +9,6 @@ test('it will not encrypt history by default', async ({ page }) => { const historyState1 = await page.evaluate(() => window.history.state) await expect(historyState1.page.component).toBe('History/Page') await expect(historyState1.page.props.pageNumber).toBe('1') - await expect(historyState1.timestamp).toBeGreaterThan(0) await expect(page.getByText('This is page 1')).toBeVisible() await clickAndWaitForResponse(page, 'Page 2', '/history/2') @@ -17,7 +16,6 @@ test('it will not encrypt history by default', async ({ page }) => { await expect(historyState2.page.component).toBe('History/Page') await expect(historyState2.page.props.pageNumber).toBe('2') await expect(page.getByText('This is page 2')).toBeVisible() - await expect(historyState2.timestamp).toBeGreaterThan(0) requests.listen(page) @@ -39,7 +37,6 @@ test('it can encrypt history', async ({ page }) => { // but Playwright doesn't transfer it as such over the wire (page.evaluate), // so if the object is "empty" and the page check below works, it's working. await expect(historyState3.page).toEqual({}) - await expect(historyState3.timestamp).toBeGreaterThan(0) requests.listen(page) @@ -52,7 +49,6 @@ test('it can encrypt history', async ({ page }) => { const historyState1 = await page.evaluate(() => window.history.state) await expect(historyState1.page.component).toBe('History/Page') await expect(historyState1.page.props.pageNumber).toBe('1') - await expect(historyState1.timestamp).toBeGreaterThan(0) await page.goForward() await page.waitForURL('/history/3') @@ -110,14 +106,13 @@ test('history can be cleared via props', async ({ page }) => { await expect(requests.requests).toHaveLength(1) }) -test('multi byte strings can be encrypyed', async ({ page }) => { +test('multi byte strings can be encrypted', async ({ page }) => { await clickAndWaitForResponse(page, 'Page 5', '/history/5') const historyState5 = await page.evaluate(() => window.history.state) // When history is encrypted, the page is an ArrayBuffer, // but Playwright doesn't transfer it as such over the wire (page.evaluate), // so if the object is "empty" and the page check below works, it's working. await expect(historyState5.page).toEqual({}) - await expect(historyState5.timestamp).toBeGreaterThan(0) await expect(page.getByText('Multi byte character: 😃')).toBeVisible() await clickAndWaitForResponse(page, 'Page 1', '/history/1') @@ -132,3 +127,14 @@ test('multi byte strings can be encrypyed', async ({ page }) => { await expect(requests.requests).toHaveLength(0) await expect(page.getByText('Multi byte character: 😃')).toBeVisible() }) + +test('url will update after scrolling and pressing back', async ({ page }) => { + // Weird bug that surfaced after setting scroll restoration to manual + await page.waitForURL('/history/1') + await clickAndWaitForResponse(page, 'Page 5', '/history/5') + await page.evaluate(() => (window as any).scrollTo(0, 1000)) + await page.goBack() + await page.waitForURL('/history/1') + await page.waitForTimeout(200) + await page.waitForURL('/history/1') +}) diff --git a/tests/links.spec.ts b/tests/links.spec.ts index adc8bda05..73b50312c 100644 --- a/tests/links.spec.ts +++ b/tests/links.spec.ts @@ -1,5 +1,5 @@ import { expect, test } from '@playwright/test' -import { consoleMessages, pageLoads, requests, shouldBeDumpPage } from './support' +import { consoleMessages, pageLoads, requests, scrollElementTo, shouldBeDumpPage } from './support' test.beforeEach(async ({ page }) => {}) @@ -363,9 +363,14 @@ test.describe('preserve scroll', () => { await page.goto('/links/preserve-scroll-false') await expect(page.getByText('Foo is now default')).toBeVisible() - await page.evaluate(() => window.scrollTo(5, 7)) - // @ts-ignore - await page.evaluate(() => document.querySelector('#slot').scrollTo(10, 15)) + await scrollElementTo( + page, + page.evaluate(() => window.scrollTo(5, 7)), + ) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(10, 15)), + ) await expect(page.getByText('Document scroll position is 5 & 7')).toBeVisible() await expect(page.getByText('Slot scroll position is 10 & 15')).toBeVisible() @@ -406,8 +411,10 @@ test.describe('preserve scroll', () => { await expect(page).toHaveURL('/links/preserve-scroll-false-page-two') await expect(page.getByText('Foo is now bar')).toBeVisible() - // @ts-ignore - await page.evaluate(() => document.querySelector('#slot').scrollTo(0, 0)) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(0, 0)), + ) await expect(page.getByText('Slot scroll position is 0 & 0')).toBeVisible() await page.goBack() @@ -429,8 +436,10 @@ test.describe('preserve scroll', () => { await expect(page).toHaveURL('/links/preserve-scroll-false-page-two') await expect(page.getByText('Foo is now baz')).toBeVisible() - // @ts-ignore - await page.evaluate(() => document.querySelector('#slot').scrollTo(0, 0)) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(0, 0)), + ) await expect(page.getByText('Slot scroll position is 0 & 0')).toBeVisible() const message = JSON.parse(consoleMessages.messages[0]) @@ -469,10 +478,14 @@ test.describe('enabled', () => { await page.goto('/links/preserve-scroll') await expect(page.getByText('Foo is now default')).toBeVisible() - await page.evaluate(() => window.scrollTo(5, 7)) - // @ts-ignore - await page.evaluate(() => document.querySelector('#slot').scrollTo(10, 15)) - + await scrollElementTo( + page, + page.evaluate(() => window.scrollTo(5, 7)), + ) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(10, 15)), + ) await expect(page.getByText('Document scroll position is 5 & 7')).toBeVisible() await expect(page.getByText('Slot scroll position is 10 & 15')).toBeVisible() }) @@ -534,7 +547,10 @@ test.describe('enabled', () => { await expect(page).toHaveURL('/links/preserve-scroll-page-two') - await page.evaluate(() => (document as any).querySelector('#slot').scrollTo(0, 0)) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(0, 0)), + ) await expect(page.getByText('Slot scroll position is 0 & 0')).toBeVisible() diff --git a/tests/manual-visits.spec.ts b/tests/manual-visits.spec.ts index d3beb6ca4..e2d82efe1 100644 --- a/tests/manual-visits.spec.ts +++ b/tests/manual-visits.spec.ts @@ -1,5 +1,12 @@ import test, { expect } from '@playwright/test' -import { clickAndWaitForResponse, consoleMessages, pageLoads, requests, shouldBeDumpPage } from './support' +import { + clickAndWaitForResponse, + consoleMessages, + pageLoads, + requests, + scrollElementTo, + shouldBeDumpPage, +} from './support' test('visits a different page', async ({ page }) => { pageLoads.watch(page) @@ -429,10 +436,14 @@ test.describe('Preserve scroll', () => { await page.goto('/visits/preserve-scroll-false') await expect(page.getByText('Foo is now default')).toBeVisible() - await page.evaluate(() => window.scrollTo(5, 7)) - // @ts-ignore - await page.evaluate(() => document.querySelector('#slot').scrollTo(10, 15)) - + await scrollElementTo( + page, + page.evaluate(() => window.scrollTo(5, 7)), + ) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(10, 15)), + ) await expect(page.getByText('Document scroll position is 5 & 7')).toBeVisible() await expect(page.getByText('Slot scroll position is 10 & 15')).toBeVisible() }) @@ -482,8 +493,10 @@ test.describe('Preserve scroll', () => { await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two') await expect(page.getByText('Foo is now bar')).toBeVisible() - // @ts-ignore - await page.evaluate(() => document.querySelector('#slot').scrollTo(0, 0)) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(0, 0)), + ) await expect(page.getByText('Slot scroll position is 0 & 0')).toBeVisible() await page.goBack() @@ -500,8 +513,10 @@ test.describe('Preserve scroll', () => { await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two') await expect(page.getByText('Foo is now baz')).toBeVisible() - // @ts-ignore - await page.evaluate(() => document.querySelector('#slot').scrollTo(0, 0)) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(0, 0)), + ) await expect(page.getByText('Slot scroll position is 0 & 0')).toBeVisible() await page.goBack() @@ -522,8 +537,10 @@ test.describe('Preserve scroll', () => { await expect(page).toHaveURL('/visits/preserve-scroll-false-page-two') await expect(page.getByText('Foo is now baz')).toBeVisible() - // @ts-ignore - await page.evaluate(() => document.querySelector('#slot').scrollTo(0, 0)) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(0, 0)), + ) await expect(page.getByText('Slot scroll position is 0 & 0')).toBeVisible() const message = JSON.parse(consoleMessages.messages[0]) @@ -562,10 +579,14 @@ test.describe('Preserve scroll', () => { await page.goto('/visits/preserve-scroll') await expect(page.getByText('Foo is now default')).toBeVisible() - await page.evaluate(() => window.scrollTo(5, 7)) - // @ts-ignore - await page.evaluate(() => document.querySelector('#slot').scrollTo(10, 15)) - + await scrollElementTo( + page, + page.evaluate(() => window.scrollTo(5, 7)), + ) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(10, 15)), + ) await expect(page.getByText('Document scroll position is 5 & 7')).toBeVisible() await expect(page.getByText('Slot scroll position is 10 & 15')).toBeVisible() }) @@ -648,8 +669,10 @@ test.describe('Preserve scroll', () => { await expect(page).toHaveURL('/visits/preserve-scroll-page-two') - // @ts-ignore - await page.evaluate(() => document.querySelector('#slot').scrollTo(0, 0)) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(0, 0)), + ) await expect(page.getByText('Slot scroll position is 0 & 0')).toBeVisible() @@ -666,8 +689,10 @@ test.describe('Preserve scroll', () => { await expect(page).toHaveURL('/visits/preserve-scroll-page-two') - // @ts-ignore - await page.evaluate(() => document.querySelector('#slot').scrollTo(0, 0)) + await scrollElementTo( + page, + page.evaluate(() => document.querySelector('#slot')?.scrollTo(0, 0)), + ) await expect(page.getByText('Slot scroll position is 0 & 0')).toBeVisible() diff --git a/tests/support.ts b/tests/support.ts index 8e9135a8c..34bfe05bb 100644 --- a/tests/support.ts +++ b/tests/support.ts @@ -60,3 +60,9 @@ export const shouldBeDumpPage = async (page: Page, method: 'get' | 'post' | 'pat return dump } + +export const scrollElementTo = async (page: Page, promise: Promise) => { + await promise + // Wait for scroll listener debounce + await page.waitForTimeout(100) +} diff --git a/tests/when-visible.spec.ts b/tests/when-visible.spec.ts index 565b0c6c1..5fb504392 100644 --- a/tests/when-visible.spec.ts +++ b/tests/when-visible.spec.ts @@ -69,4 +69,19 @@ test('it will wait to fire the reload until element is visible', async ({ page } await expect(page.getByText('Loading fourth one...')).toBeVisible() await page.waitForResponse(page.url()) await expect(page.getByText('Loading fourth one...')).not.toBeVisible() + + await page.evaluate(() => (window as any).scrollTo(0, 26_000)) + await expect(page.getByText('Loading fifth one...')).toBeVisible() + await page.waitForResponse(page.url() + '?count=0') + await expect(page.getByText('Loading fifth one...')).not.toBeVisible() + await expect(page.getByText('Count is now 1')).toBeVisible() + + // Now scroll up and down to re-trigger it + await page.evaluate(() => (window as any).scrollTo(0, 20_000)) + await page.waitForTimeout(100) + + await page.evaluate(() => (window as any).scrollTo(0, 26_000)) + await expect(page.getByText('Count is now 1')).toBeVisible() + await page.waitForResponse(page.url() + '?count=1') + await expect(page.getByText('Count is now 2')).toBeVisible() })