diff --git a/.changeset/fep-2677-link-url-resolver.md b/.changeset/fep-2677-link-url-resolver.md new file mode 100644 index 000000000..ddaa62a0c --- /dev/null +++ b/.changeset/fep-2677-link-url-resolver.md @@ -0,0 +1,8 @@ +--- +"@stackflow/link": major +--- + +Require Link consumers to provide a URL resolver through +`LinkUrlResolverProvider`. This removes Link's direct dependency on +`@stackflow/plugin-history-sync` and keeps generated URLs consistent with the +configured routing plugin. diff --git a/.pnp.cjs b/.pnp.cjs index bda09f835..e5db87c0d 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -115,7 +115,7 @@ const RAW_RUNTIME_STATE = ["@stackflow/plugin-blocker", ["workspace:extensions/plugin-blocker"]],\ ["@stackflow/plugin-devtools", ["virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#workspace:extensions/plugin-devtools", "workspace:extensions/plugin-devtools"]],\ ["@stackflow/plugin-google-analytics-4", ["workspace:extensions/plugin-google-analytics-4"]],\ - ["@stackflow/plugin-history-sync", ["virtual:0892efb9b4f386c24dba440a9d2a0ff9dd8aabcfd8ef5403c4c5f10c0d1c23fd4bad505b8db6b1207f29fb736fee165114aaa48c8dc6b509afc29633adbfcc46#workspace:extensions/plugin-history-sync", "workspace:extensions/plugin-history-sync"]],\ + ["@stackflow/plugin-history-sync", ["workspace:extensions/plugin-history-sync"]],\ ["@stackflow/plugin-lifecycle", ["workspace:extensions/plugin-lifecycle"]],\ ["@stackflow/plugin-renderer-basic", ["virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#workspace:extensions/plugin-renderer-basic", "workspace:extensions/plugin-renderer-basic"]],\ ["@stackflow/plugin-renderer-web", ["workspace:extensions/plugin-renderer-web"]],\ @@ -4082,11 +4082,11 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:4f4a2ef6c5b21698ba5dede146cd1400d3b0066e665e90fde63114d6566072a2d8c630254158bf570aad90e7d5f8a18dee47d459302f95a950cc6965a62453fb#npm:9.0.5", {\ - "packageLocation": "./.yarn/__virtual__/@graphql-tools-merge-virtual-07b692da0d/0/cache/@graphql-tools-merge-npm-9.0.5-a514a8ad9b-ec98638e78.zip/node_modules/@graphql-tools/merge/",\ + ["virtual:e2c394a98ed6ed4ff5ab160f49cdc9ed949fe3a74c1065765c6992089552f8a4fb261c1937424b73b9937ac4a40d41a4620ffea8c1f1e37ac44df594052b2658#npm:9.0.5", {\ + "packageLocation": "./.yarn/__virtual__/@graphql-tools-merge-virtual-8a80188199/0/cache/@graphql-tools-merge-npm-9.0.5-a514a8ad9b-ec98638e78.zip/node_modules/@graphql-tools/merge/",\ "packageDependencies": [\ - ["@graphql-tools/merge", "virtual:4f4a2ef6c5b21698ba5dede146cd1400d3b0066e665e90fde63114d6566072a2d8c630254158bf570aad90e7d5f8a18dee47d459302f95a950cc6965a62453fb#npm:9.0.5"],\ - ["@graphql-tools/utils", "virtual:4f4a2ef6c5b21698ba5dede146cd1400d3b0066e665e90fde63114d6566072a2d8c630254158bf570aad90e7d5f8a18dee47d459302f95a950cc6965a62453fb#npm:10.5.2"],\ + ["@graphql-tools/merge", "virtual:e2c394a98ed6ed4ff5ab160f49cdc9ed949fe3a74c1065765c6992089552f8a4fb261c1937424b73b9937ac4a40d41a4620ffea8c1f1e37ac44df594052b2658#npm:9.0.5"],\ + ["@graphql-tools/utils", "virtual:e2c394a98ed6ed4ff5ab160f49cdc9ed949fe3a74c1065765c6992089552f8a4fb261c1937424b73b9937ac4a40d41a4620ffea8c1f1e37ac44df594052b2658#npm:10.5.2"],\ ["@types/graphql", null],\ ["graphql", "npm:16.9.0"],\ ["tslib", "npm:2.5.0"]\ @@ -4106,12 +4106,12 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:10.0.5", {\ - "packageLocation": "./.yarn/__virtual__/@graphql-tools-schema-virtual-4f4a2ef6c5/0/cache/@graphql-tools-schema-npm-10.0.5-ec976a54e7-f5c275a580.zip/node_modules/@graphql-tools/schema/",\ + ["virtual:038d976d2b7f3e8fd148f18e9a5ef6bd00ac410ac8a72b75f7f5638a0435d7823d8b7e12953476b405049282091613331adeb4b267577f96604772f6b6322006#npm:10.0.5", {\ + "packageLocation": "./.yarn/__virtual__/@graphql-tools-schema-virtual-e2c394a98e/0/cache/@graphql-tools-schema-npm-10.0.5-ec976a54e7-f5c275a580.zip/node_modules/@graphql-tools/schema/",\ "packageDependencies": [\ - ["@graphql-tools/schema", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:10.0.5"],\ - ["@graphql-tools/merge", "virtual:4f4a2ef6c5b21698ba5dede146cd1400d3b0066e665e90fde63114d6566072a2d8c630254158bf570aad90e7d5f8a18dee47d459302f95a950cc6965a62453fb#npm:9.0.5"],\ - ["@graphql-tools/utils", "virtual:4f4a2ef6c5b21698ba5dede146cd1400d3b0066e665e90fde63114d6566072a2d8c630254158bf570aad90e7d5f8a18dee47d459302f95a950cc6965a62453fb#npm:10.5.2"],\ + ["@graphql-tools/schema", "virtual:038d976d2b7f3e8fd148f18e9a5ef6bd00ac410ac8a72b75f7f5638a0435d7823d8b7e12953476b405049282091613331adeb4b267577f96604772f6b6322006#npm:10.0.5"],\ + ["@graphql-tools/merge", "virtual:e2c394a98ed6ed4ff5ab160f49cdc9ed949fe3a74c1065765c6992089552f8a4fb261c1937424b73b9937ac4a40d41a4620ffea8c1f1e37ac44df594052b2658#npm:9.0.5"],\ + ["@graphql-tools/utils", "virtual:e2c394a98ed6ed4ff5ab160f49cdc9ed949fe3a74c1065765c6992089552f8a4fb261c1937424b73b9937ac4a40d41a4620ffea8c1f1e37ac44df594052b2658#npm:10.5.2"],\ ["@types/graphql", null],\ ["graphql", "npm:16.9.0"],\ ["tslib", "npm:2.5.0"],\ @@ -4132,11 +4132,11 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:4f4a2ef6c5b21698ba5dede146cd1400d3b0066e665e90fde63114d6566072a2d8c630254158bf570aad90e7d5f8a18dee47d459302f95a950cc6965a62453fb#npm:10.5.2", {\ - "packageLocation": "./.yarn/__virtual__/@graphql-tools-utils-virtual-00e3608fca/0/cache/@graphql-tools-utils-npm-10.5.2-b443d9e793-f400ef22ac.zip/node_modules/@graphql-tools/utils/",\ + ["virtual:e2c394a98ed6ed4ff5ab160f49cdc9ed949fe3a74c1065765c6992089552f8a4fb261c1937424b73b9937ac4a40d41a4620ffea8c1f1e37ac44df594052b2658#npm:10.5.2", {\ + "packageLocation": "./.yarn/__virtual__/@graphql-tools-utils-virtual-19c2de4320/0/cache/@graphql-tools-utils-npm-10.5.2-b443d9e793-f400ef22ac.zip/node_modules/@graphql-tools/utils/",\ "packageDependencies": [\ - ["@graphql-tools/utils", "virtual:4f4a2ef6c5b21698ba5dede146cd1400d3b0066e665e90fde63114d6566072a2d8c630254158bf570aad90e7d5f8a18dee47d459302f95a950cc6965a62453fb#npm:10.5.2"],\ - ["@graphql-typed-document-node/core", "virtual:00e3608fcaa16b6ddd7a1963290d75adc04a8ab1e919013ad25c0f94907a08a0cdb703b417f7959a271d9fe2fd00278106b57ee76bd3ce93cd528ec56b309020#npm:3.2.0"],\ + ["@graphql-tools/utils", "virtual:e2c394a98ed6ed4ff5ab160f49cdc9ed949fe3a74c1065765c6992089552f8a4fb261c1937424b73b9937ac4a40d41a4620ffea8c1f1e37ac44df594052b2658#npm:10.5.2"],\ + ["@graphql-typed-document-node/core", "virtual:19c2de4320dd9f62c472a686692d634e8bf4cb35b61a8f822042f0e0a50906330e2fa4a0595186a3f6be61fbc9663328313d2d1123a2c876325ac36ad3a66603#npm:3.2.0"],\ ["@types/graphql", null],\ ["cross-inspect", "npm:1.0.1"],\ ["dset", "npm:3.1.3"],\ @@ -4158,10 +4158,10 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:00e3608fcaa16b6ddd7a1963290d75adc04a8ab1e919013ad25c0f94907a08a0cdb703b417f7959a271d9fe2fd00278106b57ee76bd3ce93cd528ec56b309020#npm:3.2.0", {\ - "packageLocation": "./.yarn/__virtual__/@graphql-typed-document-node-core-virtual-e83525f87c/0/cache/@graphql-typed-document-node-core-npm-3.2.0-505adb1e90-fa44443acc.zip/node_modules/@graphql-typed-document-node/core/",\ + ["virtual:19c2de4320dd9f62c472a686692d634e8bf4cb35b61a8f822042f0e0a50906330e2fa4a0595186a3f6be61fbc9663328313d2d1123a2c876325ac36ad3a66603#npm:3.2.0", {\ + "packageLocation": "./.yarn/__virtual__/@graphql-typed-document-node-core-virtual-9011abb4fb/0/cache/@graphql-typed-document-node-core-npm-3.2.0-505adb1e90-fa44443acc.zip/node_modules/@graphql-typed-document-node/core/",\ "packageDependencies": [\ - ["@graphql-typed-document-node/core", "virtual:00e3608fcaa16b6ddd7a1963290d75adc04a8ab1e919013ad25c0f94907a08a0cdb703b417f7959a271d9fe2fd00278106b57ee76bd3ce93cd528ec56b309020#npm:3.2.0"],\ + ["@graphql-typed-document-node/core", "virtual:19c2de4320dd9f62c472a686692d634e8bf4cb35b61a8f822042f0e0a50906330e2fa4a0595186a3f6be61fbc9663328313d2d1123a2c876325ac36ad3a66603#npm:3.2.0"],\ ["@types/graphql", null],\ ["graphql", "npm:16.9.0"]\ ],\ @@ -6663,11 +6663,9 @@ const RAW_RUNTIME_STATE = ["@stackflow/config", "workspace:config"],\ ["@stackflow/core", "workspace:core"],\ ["@stackflow/esbuild-config", "workspace:packages/esbuild-config"],\ - ["@stackflow/plugin-history-sync", "virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#npm:1.12.0::__archiveUrl=https%3A%2F%2Fregistry.npmjs.org%2F%40stackflow%2Fplugin-history-sync%2F-%2Fplugin-history-sync-1.12.0.tgz"],\ ["@stackflow/react", "virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#workspace:integrations/react"],\ ["@types/react", "npm:18.3.3"],\ ["@types/stackflow__core", null],\ - ["@types/stackflow__plugin-history-sync", null],\ ["@types/stackflow__react", null],\ ["esbuild", "npm:0.23.0"],\ ["esbuild-plugin-file-path-extensions", "npm:2.1.3"],\ @@ -6677,11 +6675,9 @@ const RAW_RUNTIME_STATE = ],\ "packagePeers": [\ "@stackflow/core",\ - "@stackflow/plugin-history-sync",\ "@stackflow/react",\ "@types/react",\ "@types/stackflow__core",\ - "@types/stackflow__plugin-history-sync",\ "@types/stackflow__react",\ "react"\ ],\ @@ -6694,7 +6690,6 @@ const RAW_RUNTIME_STATE = ["@stackflow/config", "workspace:config"],\ ["@stackflow/core", "workspace:core"],\ ["@stackflow/esbuild-config", "workspace:packages/esbuild-config"],\ - ["@stackflow/plugin-history-sync", "virtual:0892efb9b4f386c24dba440a9d2a0ff9dd8aabcfd8ef5403c4c5f10c0d1c23fd4bad505b8db6b1207f29fb736fee165114aaa48c8dc6b509afc29633adbfcc46#workspace:extensions/plugin-history-sync"],\ ["@stackflow/react", "virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#workspace:integrations/react"],\ ["@types/react", "npm:18.3.3"],\ ["esbuild", "npm:0.23.0"],\ @@ -6810,7 +6805,7 @@ const RAW_RUNTIME_STATE = ["@types/react", "npm:18.3.3"],\ ["esbuild", "npm:0.27.3"],\ ["jest", "virtual:b327d7e228fba669b88a8bb23bcf526374e46fa67e617b1e6848e8a205357fee5ce94b47c49b5a570fd9e8a44fa218a13cd00e2eca327c99114cbd21d72ecf9c#npm:29.7.0"],\ - ["jest-environment-jsdom", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:29.7.0"],\ + ["jest-environment-jsdom", "virtual:983596cc6314880cdf5646ccae28a297f9a9d9cc50891bcdd6486e5d19a65321933850dc7adb791ac89d6716f7185d6397520da0ee1852df1d3f86cb026a38fc#npm:29.7.0"],\ ["react", "npm:18.3.1"],\ ["react-dom", "virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#npm:18.3.1"],\ ["rimraf", "npm:6.1.3"],\ @@ -6907,57 +6902,6 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "HARD"\ }],\ - ["virtual:0892efb9b4f386c24dba440a9d2a0ff9dd8aabcfd8ef5403c4c5f10c0d1c23fd4bad505b8db6b1207f29fb736fee165114aaa48c8dc6b509afc29633adbfcc46#workspace:extensions/plugin-history-sync", {\ - "packageLocation": "./.yarn/__virtual__/@stackflow-plugin-history-sync-virtual-0b16c4696c/1/extensions/plugin-history-sync/",\ - "packageDependencies": [\ - ["@stackflow/plugin-history-sync", "virtual:0892efb9b4f386c24dba440a9d2a0ff9dd8aabcfd8ef5403c4c5f10c0d1c23fd4bad505b8db6b1207f29fb736fee165114aaa48c8dc6b509afc29633adbfcc46#workspace:extensions/plugin-history-sync"],\ - ["@graphql-tools/schema", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:10.0.5"],\ - ["@stackflow/config", "workspace:config"],\ - ["@stackflow/core", "workspace:core"],\ - ["@stackflow/esbuild-config", "workspace:packages/esbuild-config"],\ - ["@stackflow/plugin-renderer-basic", "virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#workspace:extensions/plugin-renderer-basic"],\ - ["@stackflow/react", "virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#workspace:integrations/react"],\ - ["@swc/core", "virtual:b327d7e228fba669b88a8bb23bcf526374e46fa67e617b1e6848e8a205357fee5ce94b47c49b5a570fd9e8a44fa218a13cd00e2eca327c99114cbd21d72ecf9c#npm:1.6.6"],\ - ["@swc/jest", "virtual:b327d7e228fba669b88a8bb23bcf526374e46fa67e617b1e6848e8a205357fee5ce94b47c49b5a570fd9e8a44fa218a13cd00e2eca327c99114cbd21d72ecf9c#npm:0.2.36"],\ - ["@testing-library/dom", "npm:10.4.1"],\ - ["@testing-library/react", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:16.3.2"],\ - ["@types/jest", "npm:29.5.12"],\ - ["@types/node", "npm:20.14.9"],\ - ["@types/react", "npm:18.3.3"],\ - ["@types/react-dom", "npm:18.3.0"],\ - ["@types/react-relay", "npm:16.0.6"],\ - ["@types/relay-runtime", "npm:17.0.4"],\ - ["@types/stackflow__config", null],\ - ["@types/stackflow__core", null],\ - ["@types/stackflow__react", null],\ - ["esbuild", "npm:0.23.0"],\ - ["flatted", "npm:3.3.1"],\ - ["graphql", "npm:16.9.0"],\ - ["history", "npm:5.3.0"],\ - ["jest", "virtual:b327d7e228fba669b88a8bb23bcf526374e46fa67e617b1e6848e8a205357fee5ce94b47c49b5a570fd9e8a44fa218a13cd00e2eca327c99114cbd21d72ecf9c#npm:29.7.0"],\ - ["jest-environment-jsdom", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:29.7.0"],\ - ["react", "npm:18.3.1"],\ - ["react-dom", "virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#npm:18.3.1"],\ - ["react-relay", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:17.0.0"],\ - ["react18-use", "virtual:0f555d13a58e9dd5c800ba6c444965d36246460fac7ea23a2ab4acc22d433bd134e1beca6f312395a6e7138233daf2b253710629ef0b429f21772e5419e43990#npm:0.4.1"],\ - ["relay-compiler", "npm:17.0.0"],\ - ["relay-runtime", "npm:17.0.0"],\ - ["rimraf", "npm:3.0.2"],\ - ["typescript", "patch:typescript@npm%3A5.5.3#optional!builtin::version=5.5.3&hash=379a07"],\ - ["url-pattern", "npm:1.0.3"]\ - ],\ - "packagePeers": [\ - "@stackflow/config",\ - "@stackflow/core",\ - "@stackflow/react",\ - "@types/react",\ - "@types/stackflow__config",\ - "@types/stackflow__core",\ - "@types/stackflow__react",\ - "react"\ - ],\ - "linkType": "SOFT"\ - }],\ ["virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#npm:1.12.0::__archiveUrl=https%3A%2F%2Fregistry.npmjs.org%2F%40stackflow%2Fplugin-history-sync%2F-%2Fplugin-history-sync-1.12.0.tgz", {\ "packageLocation": "./.yarn/__virtual__/@stackflow-plugin-history-sync-virtual-0f555d13a5/0/cache/@stackflow-plugin-history-sync-npm-1.12.0-f5ab13d9ae-b1d1f5a380.zip/node_modules/@stackflow/plugin-history-sync/",\ "packageDependencies": [\ @@ -6991,7 +6935,7 @@ const RAW_RUNTIME_STATE = "packageLocation": "./extensions/plugin-history-sync/",\ "packageDependencies": [\ ["@stackflow/plugin-history-sync", "workspace:extensions/plugin-history-sync"],\ - ["@graphql-tools/schema", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:10.0.5"],\ + ["@graphql-tools/schema", "virtual:038d976d2b7f3e8fd148f18e9a5ef6bd00ac410ac8a72b75f7f5638a0435d7823d8b7e12953476b405049282091613331adeb4b267577f96604772f6b6322006#npm:10.0.5"],\ ["@stackflow/config", "workspace:config"],\ ["@stackflow/core", "workspace:core"],\ ["@stackflow/esbuild-config", "workspace:packages/esbuild-config"],\ @@ -7000,7 +6944,7 @@ const RAW_RUNTIME_STATE = ["@swc/core", "virtual:b327d7e228fba669b88a8bb23bcf526374e46fa67e617b1e6848e8a205357fee5ce94b47c49b5a570fd9e8a44fa218a13cd00e2eca327c99114cbd21d72ecf9c#npm:1.6.6"],\ ["@swc/jest", "virtual:b327d7e228fba669b88a8bb23bcf526374e46fa67e617b1e6848e8a205357fee5ce94b47c49b5a570fd9e8a44fa218a13cd00e2eca327c99114cbd21d72ecf9c#npm:0.2.36"],\ ["@testing-library/dom", "npm:10.4.1"],\ - ["@testing-library/react", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:16.3.2"],\ + ["@testing-library/react", "virtual:038d976d2b7f3e8fd148f18e9a5ef6bd00ac410ac8a72b75f7f5638a0435d7823d8b7e12953476b405049282091613331adeb4b267577f96604772f6b6322006#npm:16.3.2"],\ ["@types/jest", "npm:29.5.12"],\ ["@types/node", "npm:20.14.9"],\ ["@types/react", "npm:18.3.3"],\ @@ -7012,10 +6956,10 @@ const RAW_RUNTIME_STATE = ["graphql", "npm:16.9.0"],\ ["history", "npm:5.3.0"],\ ["jest", "virtual:b327d7e228fba669b88a8bb23bcf526374e46fa67e617b1e6848e8a205357fee5ce94b47c49b5a570fd9e8a44fa218a13cd00e2eca327c99114cbd21d72ecf9c#npm:29.7.0"],\ - ["jest-environment-jsdom", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:29.7.0"],\ + ["jest-environment-jsdom", "virtual:983596cc6314880cdf5646ccae28a297f9a9d9cc50891bcdd6486e5d19a65321933850dc7adb791ac89d6716f7185d6397520da0ee1852df1d3f86cb026a38fc#npm:29.7.0"],\ ["react", "npm:18.3.1"],\ ["react-dom", "virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#npm:18.3.1"],\ - ["react-relay", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:17.0.0"],\ + ["react-relay", "virtual:038d976d2b7f3e8fd148f18e9a5ef6bd00ac410ac8a72b75f7f5638a0435d7823d8b7e12953476b405049282091613331adeb4b267577f96604772f6b6322006#npm:17.0.0"],\ ["react18-use", "virtual:0f555d13a58e9dd5c800ba6c444965d36246460fac7ea23a2ab4acc22d433bd134e1beca6f312395a6e7138233daf2b253710629ef0b429f21772e5419e43990#npm:0.4.1"],\ ["relay-compiler", "npm:17.0.0"],\ ["relay-runtime", "npm:17.0.0"],\ @@ -7044,7 +6988,7 @@ const RAW_RUNTIME_STATE = ["@types/react", "npm:18.3.3"],\ ["esbuild", "npm:0.27.3"],\ ["jest", "virtual:b327d7e228fba669b88a8bb23bcf526374e46fa67e617b1e6848e8a205357fee5ce94b47c49b5a570fd9e8a44fa218a13cd00e2eca327c99114cbd21d72ecf9c#npm:29.7.0"],\ - ["jest-environment-jsdom", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:29.7.0"],\ + ["jest-environment-jsdom", "virtual:983596cc6314880cdf5646ccae28a297f9a9d9cc50891bcdd6486e5d19a65321933850dc7adb791ac89d6716f7185d6397520da0ee1852df1d3f86cb026a38fc#npm:29.7.0"],\ ["react", "npm:18.3.1"],\ ["react-dom", "virtual:413bca98ff76262f6f1f73762ccc4b7edee04a5da42f3d6b9ed2cb2d6dbc397b2094da59b50f6e828091c88e7b5f86990feff596c43f0eb50a58fc42aae64a20#npm:18.3.1"],\ ["rimraf", "npm:6.1.3"],\ @@ -7503,10 +7447,10 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:16.3.2", {\ - "packageLocation": "./.yarn/__virtual__/@testing-library-react-virtual-4882a36d99/0/cache/@testing-library-react-npm-16.3.2-67b0b894c8-0ca88c6f67.zip/node_modules/@testing-library/react/",\ + ["virtual:038d976d2b7f3e8fd148f18e9a5ef6bd00ac410ac8a72b75f7f5638a0435d7823d8b7e12953476b405049282091613331adeb4b267577f96604772f6b6322006#npm:16.3.2", {\ + "packageLocation": "./.yarn/__virtual__/@testing-library-react-virtual-1101e0d7a1/0/cache/@testing-library-react-npm-16.3.2-67b0b894c8-0ca88c6f67.zip/node_modules/@testing-library/react/",\ "packageDependencies": [\ - ["@testing-library/react", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:16.3.2"],\ + ["@testing-library/react", "virtual:038d976d2b7f3e8fd148f18e9a5ef6bd00ac410ac8a72b75f7f5638a0435d7823d8b7e12953476b405049282091613331adeb4b267577f96604772f6b6322006#npm:16.3.2"],\ ["@babel/runtime", "npm:7.25.0"],\ ["@testing-library/dom", "npm:10.4.1"],\ ["@types/react", "npm:18.3.3"],\ @@ -13045,10 +12989,10 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:29.7.0", {\ - "packageLocation": "./.yarn/__virtual__/jest-environment-jsdom-virtual-a089821e60/0/cache/jest-environment-jsdom-npm-29.7.0-0b72dd0e0b-23bbfc9bca.zip/node_modules/jest-environment-jsdom/",\ + ["virtual:983596cc6314880cdf5646ccae28a297f9a9d9cc50891bcdd6486e5d19a65321933850dc7adb791ac89d6716f7185d6397520da0ee1852df1d3f86cb026a38fc#npm:29.7.0", {\ + "packageLocation": "./.yarn/__virtual__/jest-environment-jsdom-virtual-03ba513b4a/0/cache/jest-environment-jsdom-npm-29.7.0-0b72dd0e0b-23bbfc9bca.zip/node_modules/jest-environment-jsdom/",\ "packageDependencies": [\ - ["jest-environment-jsdom", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:29.7.0"],\ + ["jest-environment-jsdom", "virtual:983596cc6314880cdf5646ccae28a297f9a9d9cc50891bcdd6486e5d19a65321933850dc7adb791ac89d6716f7185d6397520da0ee1852df1d3f86cb026a38fc#npm:29.7.0"],\ ["@jest/environment", "npm:29.7.0"],\ ["@jest/fake-timers", "npm:29.7.0"],\ ["@jest/types", "npm:29.6.3"],\ @@ -13058,7 +13002,7 @@ const RAW_RUNTIME_STATE = ["canvas", null],\ ["jest-mock", "npm:29.7.0"],\ ["jest-util", "npm:29.7.0"],\ - ["jsdom", "virtual:a089821e60430e98a5b3ef663a5eeb2414d40cb3eed0eb44d0cf9f0936e27fda9c9045d546e1a91634c47e938bf0f44cfcf4df7f4d7fae586f4dcdce3aab0194#npm:20.0.3"]\ + ["jsdom", "virtual:03ba513b4a4f2f49a0ee779e0b1da3ef4f41cbf0cff4a27f151a6c11d5162aae67852dc5c3f387d71c020640c3547cdf783b461f72a6ebbd7907fd3300ce6913#npm:20.0.3"]\ ],\ "packagePeers": [\ "@types/canvas",\ @@ -13421,10 +13365,10 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:a089821e60430e98a5b3ef663a5eeb2414d40cb3eed0eb44d0cf9f0936e27fda9c9045d546e1a91634c47e938bf0f44cfcf4df7f4d7fae586f4dcdce3aab0194#npm:20.0.3", {\ - "packageLocation": "./.yarn/__virtual__/jsdom-virtual-0ddf92ef70/0/cache/jsdom-npm-20.0.3-906a2f7005-a4cdcff5b0.zip/node_modules/jsdom/",\ + ["virtual:03ba513b4a4f2f49a0ee779e0b1da3ef4f41cbf0cff4a27f151a6c11d5162aae67852dc5c3f387d71c020640c3547cdf783b461f72a6ebbd7907fd3300ce6913#npm:20.0.3", {\ + "packageLocation": "./.yarn/__virtual__/jsdom-virtual-09fbede01d/0/cache/jsdom-npm-20.0.3-906a2f7005-a4cdcff5b0.zip/node_modules/jsdom/",\ "packageDependencies": [\ - ["jsdom", "virtual:a089821e60430e98a5b3ef663a5eeb2414d40cb3eed0eb44d0cf9f0936e27fda9c9045d546e1a91634c47e938bf0f44cfcf4df7f4d7fae586f4dcdce3aab0194#npm:20.0.3"],\ + ["jsdom", "virtual:03ba513b4a4f2f49a0ee779e0b1da3ef4f41cbf0cff4a27f151a6c11d5162aae67852dc5c3f387d71c020640c3547cdf783b461f72a6ebbd7907fd3300ce6913#npm:20.0.3"],\ ["@types/canvas", null],\ ["abab", "npm:2.0.6"],\ ["acorn", "npm:8.16.0"],\ @@ -13451,7 +13395,7 @@ const RAW_RUNTIME_STATE = ["whatwg-encoding", "npm:2.0.0"],\ ["whatwg-mimetype", "npm:3.0.0"],\ ["whatwg-url", "npm:11.0.0"],\ - ["ws", "virtual:0ddf92ef7004d8a162ebc1a217af0f907c2ccde8ba64ef771dcb5bc0c694507e9eadb73ca24a6db674131ba0253634cb4670815bec7ff50c6ab6b975735689b4#npm:8.19.0"],\ + ["ws", "virtual:09fbede01d752e610be1714c18909368fe4fa709b16e76a5ed8cde05b6dbb3342f037902ae401113b5bbbb44b9753fbd2ba83c3277f1f798491ade558971e25f#npm:8.19.0"],\ ["xml-name-validator", "npm:4.0.0"]\ ],\ "packagePeers": [\ @@ -16940,10 +16884,10 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:17.0.0", {\ - "packageLocation": "./.yarn/__virtual__/react-relay-virtual-32d5466f1a/0/cache/react-relay-npm-17.0.0-b76694d525-5f4c3f1e99.zip/node_modules/react-relay/",\ + ["virtual:038d976d2b7f3e8fd148f18e9a5ef6bd00ac410ac8a72b75f7f5638a0435d7823d8b7e12953476b405049282091613331adeb4b267577f96604772f6b6322006#npm:17.0.0", {\ + "packageLocation": "./.yarn/__virtual__/react-relay-virtual-e541417c2f/0/cache/react-relay-npm-17.0.0-b76694d525-5f4c3f1e99.zip/node_modules/react-relay/",\ "packageDependencies": [\ - ["react-relay", "virtual:0b16c4696c71f8b9ab6ff13965cb6891a42897b4bb0994338440e95ea94562b0b68d2e71acdf31f08648da7d5a35d8b342325f7cb96e5b84f9e77bc4d98f8564#npm:17.0.0"],\ + ["react-relay", "virtual:038d976d2b7f3e8fd148f18e9a5ef6bd00ac410ac8a72b75f7f5638a0435d7823d8b7e12953476b405049282091613331adeb4b267577f96604772f6b6322006#npm:17.0.0"],\ ["@babel/runtime", "npm:7.25.0"],\ ["@types/react", "npm:18.3.3"],\ ["fbjs", "npm:3.0.5"],\ @@ -19472,10 +19416,10 @@ const RAW_RUNTIME_STATE = ],\ "linkType": "SOFT"\ }],\ - ["virtual:0ddf92ef7004d8a162ebc1a217af0f907c2ccde8ba64ef771dcb5bc0c694507e9eadb73ca24a6db674131ba0253634cb4670815bec7ff50c6ab6b975735689b4#npm:8.19.0", {\ - "packageLocation": "./.yarn/__virtual__/ws-virtual-2228229947/0/cache/ws-npm-8.19.0-c967c046a5-26e4901e93.zip/node_modules/ws/",\ + ["virtual:09fbede01d752e610be1714c18909368fe4fa709b16e76a5ed8cde05b6dbb3342f037902ae401113b5bbbb44b9753fbd2ba83c3277f1f798491ade558971e25f#npm:8.19.0", {\ + "packageLocation": "./.yarn/__virtual__/ws-virtual-99b0ff26e3/0/cache/ws-npm-8.19.0-c967c046a5-26e4901e93.zip/node_modules/ws/",\ "packageDependencies": [\ - ["ws", "virtual:0ddf92ef7004d8a162ebc1a217af0f907c2ccde8ba64ef771dcb5bc0c694507e9eadb73ca24a6db674131ba0253634cb4670815bec7ff50c6ab6b975735689b4#npm:8.19.0"],\ + ["ws", "virtual:09fbede01d752e610be1714c18909368fe4fa709b16e76a5ed8cde05b6dbb3342f037902ae401113b5bbbb44b9753fbd2ba83c3277f1f798491ade558971e25f#npm:8.19.0"],\ ["@types/bufferutil", null],\ ["@types/utf-8-validate", null],\ ["bufferutil", null],\ diff --git a/extensions/link/README.md b/extensions/link/README.md index 4210f1dea..77c4a0e1d 100644 --- a/extensions/link/README.md +++ b/extensions/link/README.md @@ -4,9 +4,8 @@ It mimics the `` component behavior provided by Gatsby or Next.js. ## Dependencies -It can be used only when `@stackflow/plugin-history-sync` is set. - -- `@stackflow/plugin-history-sync` +Provide a URL resolver with `LinkUrlResolverProvider`. The resolver can come +from `@stackflow/plugin-history-sync` or another routing plugin. ## Usage @@ -38,21 +37,35 @@ import { historySyncPlugin } from "@stackflow/plugin-history-sync"; import { config } from "./stackflow.config"; import { MyActivity } from "./MyActivity"; +const historySync = historySyncPlugin({ + config, + fallbackActivity: () => "MyActivity", +}); + const { Stack } = stackflow({ config, components: { MyActivity, }, plugins: [ - historySyncPlugin({ - config, - fallbackActivity: () => "MyActivity", - }), + historySync, // ... ], }); ``` +Wrap `Stack` with the resolver from the routing plugin. + +```tsx +import { LinkUrlResolverProvider } from "@stackflow/link"; + +const App = () => ( + + + +); +``` + ```tsx /** * MyComponent.ts diff --git a/extensions/link/package.json b/extensions/link/package.json index 860c3b4bb..c05525596 100644 --- a/extensions/link/package.json +++ b/extensions/link/package.json @@ -34,7 +34,6 @@ "@stackflow/config": "^2.0.0", "@stackflow/core": "^3.0.0", "@stackflow/esbuild-config": "^1.0.3", - "@stackflow/plugin-history-sync": "^2.1.0", "@stackflow/react": "^2.1.2", "@types/react": "^18.3.3", "esbuild": "^0.23.0", @@ -45,7 +44,6 @@ }, "peerDependencies": { "@stackflow/core": "^2.0.0 || ^3.0.0", - "@stackflow/plugin-history-sync": "^1.6.4-canary.0 || ^2.0.0", "@stackflow/react": "^2.0.0", "@types/react": ">=16.8.0", "react": ">=16.8.0" diff --git a/extensions/link/src/Link.tsx b/extensions/link/src/Link.tsx index 9a0619ad2..db8fea073 100644 --- a/extensions/link/src/Link.tsx +++ b/extensions/link/src/Link.tsx @@ -1,18 +1,12 @@ -/// - import type { InferActivityParams, RegisteredActivityName, } from "@stackflow/config"; -import type { Route } from "@stackflow/plugin-history-sync"; -import { useConfig, useFlow } from "@stackflow/react"; +import { useFlow } from "@stackflow/react"; import { useMemo } from "react"; +import { useLinkUrlResolver } from "./LinkUrlResolverContext"; import { omit } from "./omit"; -function toRoute(route: string | Route): Route { - return typeof route === "string" ? { path: route, decode: undefined } : route; -} - type AnchorProps = Omit< React.DetailedHTMLProps< React.AnchorHTMLAttributes, @@ -31,26 +25,13 @@ export interface LinkProps } export function Link(props: LinkProps) { - const config = useConfig(); + const urlResolver = useLinkUrlResolver(); const { push, replace } = useFlow(); - const href = useMemo(() => { - const match = config.activities.find((r) => r.name === props.activityName); - - if (!match || !match.route || !config.historySync) { - return undefined; - } - - const { path, decode } = Array.isArray(match.route) - ? toRoute(match.route[0]) - : toRoute(match.route); - - const { makeTemplate, urlPatternOptions } = config.historySync; - - const template = makeTemplate({ path, decode }, urlPatternOptions); - - return template.fill(props.activityParams); - }, [config, props.activityName, props.activityParams]); + const href = useMemo( + () => urlResolver.makeActivityUrl(props.activityName, props.activityParams), + [urlResolver.makeActivityUrl, props.activityName, props.activityParams], + ); const anchorProps = omit(props, [ // Custom Props diff --git a/extensions/link/src/LinkUrlResolverContext.tsx b/extensions/link/src/LinkUrlResolverContext.tsx new file mode 100644 index 000000000..264e8d82f --- /dev/null +++ b/extensions/link/src/LinkUrlResolverContext.tsx @@ -0,0 +1,38 @@ +import { createContext, type ReactNode, useContext } from "react"; + +export interface LinkUrlResolver { + readonly makeActivityUrl: ( + activityName: string, + activityParams: Record, + ) => string; +} + +export const LinkUrlResolverContext = createContext( + null, +); + +export function LinkUrlResolverProvider({ + resolver, + children, +}: { + resolver: LinkUrlResolver; + children: ReactNode; +}) { + return ( + + {children} + + ); +} + +export function useLinkUrlResolver() { + const urlResolver = useContext(LinkUrlResolverContext); + + if (urlResolver === null) { + throw new Error( + "No LinkUrlResolver was found in context. Wrap the component tree with LinkUrlResolverProvider.", + ); + } + + return urlResolver; +} diff --git a/extensions/link/src/index.ts b/extensions/link/src/index.ts index 3b40a46d8..4f1b4792f 100644 --- a/extensions/link/src/index.ts +++ b/extensions/link/src/index.ts @@ -1 +1,5 @@ export * from "./Link"; +export { + type LinkUrlResolver, + LinkUrlResolverProvider, +} from "./LinkUrlResolverContext"; diff --git a/yarn.lock b/yarn.lock index eda3670a3..7d743fa87 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5728,7 +5728,6 @@ __metadata: "@stackflow/config": "npm:^2.0.0" "@stackflow/core": "npm:^3.0.0" "@stackflow/esbuild-config": "npm:^1.0.3" - "@stackflow/plugin-history-sync": "npm:^2.1.0" "@stackflow/react": "npm:^2.1.2" "@types/react": "npm:^18.3.3" esbuild: "npm:^0.23.0" @@ -5738,7 +5737,6 @@ __metadata: typescript: "npm:^5.5.3" peerDependencies: "@stackflow/core": ^2.0.0 || ^3.0.0 - "@stackflow/plugin-history-sync": ^1.6.4-canary.0 || ^2.0.0 "@stackflow/react": ^2.0.0 "@types/react": ">=16.8.0" react: ">=16.8.0" @@ -5890,7 +5888,7 @@ __metadata: languageName: node linkType: hard -"@stackflow/plugin-history-sync@npm:^2.1.0, @stackflow/plugin-history-sync@workspace:extensions/plugin-history-sync": +"@stackflow/plugin-history-sync@workspace:extensions/plugin-history-sync": version: 0.0.0-use.local resolution: "@stackflow/plugin-history-sync@workspace:extensions/plugin-history-sync" dependencies: