From b8c5eabcb7bc9848a1b8255a8a05b4b2ac2a4d42 Mon Sep 17 00:00:00 2001 From: "jyc.dev" Date: Wed, 15 Jan 2025 14:01:52 +0100 Subject: [PATCH] Anchor (#834) * :tada: NEW: anchor support * add changeset --- .changeset/rich-panthers-sniff.md | 5 ++ .../vite-plugin-kit-routes/src/lib/ROUTES.ts | 18 +++- .../vite-plugin-kit-routes/src/lib/format.ts | 14 ++- .../vite-plugin-kit-routes/src/lib/plugin.ts | 29 +++++- .../src/lib/plugins.spec.ts | 18 ++++ .../src/routes/+layout.svelte | 7 +- .../src/routes/anchors/+page.svelte | 89 +++++++++++++++++++ .../src/test/ROUTES_base.ts | 17 +++- .../src/test/ROUTES_format-object-path.ts | 21 +++-- .../ROUTES_format-object-path_shortened.ts | 21 +++-- .../src/test/ROUTES_format-object-symbol.ts | 21 +++-- .../ROUTES_format-object-symbol_shortened.ts | 21 +++-- .../ROUTES_format-route-and-object-path.ts | 21 +++-- ..._format-route-and-object-path_shortened.ts | 21 +++-- .../ROUTES_format-route-and-object-symbol.ts | 17 +++- ...ormat-route-and-object-symbol_shortened.ts | 17 +++- .../ROUTES_format-route-path-page-route-id.ts | 21 +++-- ...rmat-route-path-page-route-id_shortened.ts | 21 +++-- .../src/test/ROUTES_format-route-path.ts | 21 +++-- .../ROUTES_format-route-path_shortened.ts | 21 +++-- .../src/test/ROUTES_format-route-symbol.ts | 17 +++- .../ROUTES_format-route-symbol_shortened.ts | 17 +++- .../src/test/ROUTES_format-variables.ts | 21 +++-- .../test/ROUTES_format-variables_shortened.ts | 21 +++-- .../src/test/ROUTES_hash.ts | 17 +++- .../src/test/ROUTES_post-update.ts | 17 +++- .../vite-plugin-kit-routes/vite.config.ts | 12 +++ 27 files changed, 466 insertions(+), 97 deletions(-) create mode 100644 .changeset/rich-panthers-sniff.md create mode 100644 packages/vite-plugin-kit-routes/src/routes/anchors/+page.svelte diff --git a/.changeset/rich-panthers-sniff.md b/.changeset/rich-panthers-sniff.md new file mode 100644 index 00000000..a4e28a9c --- /dev/null +++ b/.changeset/rich-panthers-sniff.md @@ -0,0 +1,5 @@ +--- +'vite-plugin-kit-routes': patch +--- + +add anchor support diff --git a/packages/vite-plugin-kit-routes/src/lib/ROUTES.ts b/packages/vite-plugin-kit-routes/src/lib/ROUTES.ts index a11ee608..7a0e3255 100644 --- a/packages/vite-plugin-kit-routes/src/lib/ROUTES.ts +++ b/packages/vite-plugin-kit-routes/src/lib/ROUTES.ts @@ -70,6 +70,12 @@ const PAGES = { '/a/[...rest]/z': (params: { rest: (string | number)[] }) => { return `/a/${params['rest']?.join('/')}/z` }, + '/anchors': (params: { + anchor: 'section0' | 'section1' | 'section2' | 'section3' + anotherOne?: string + }) => { + return `/anchors${appendSp({ __KIT_ROUTES_ANCHOR__: params['anchor'], anotherOne: params['anotherOne'] })}` + }, '/lay/normal': `/lay/normal`, '/lay/root-layout': `/lay/root-layout`, '/lay/skip': `/lay/skip`, @@ -183,7 +189,12 @@ export const appendSp = ( } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -194,8 +205,8 @@ export const appendSp = ( } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -286,6 +297,7 @@ export type KIT_ROUTES = { '/site/[id]': 'lang' | 'id' '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' '/a/[...rest]/z': 'rest' + '/anchors': never '/lay/normal': never '/lay/root-layout': never '/lay/skip': never @@ -323,6 +335,8 @@ export type KIT_ROUTES = { siteId: never contractId: never rest: never + anchor: never + anotherOne: never ids: never locale: never redirectTo: never diff --git a/packages/vite-plugin-kit-routes/src/lib/format.ts b/packages/vite-plugin-kit-routes/src/lib/format.ts index c7eb87f6..dcc7fd3e 100644 --- a/packages/vite-plugin-kit-routes/src/lib/format.ts +++ b/packages/vite-plugin-kit-routes/src/lib/format.ts @@ -24,7 +24,10 @@ export const appendSp = `type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -34,7 +37,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = \`#\${val}\` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -45,8 +53,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return \`\${prefix}\${formatted}\` + if (formatted || anchor) { + return \`\${prefix}\${formatted}\${anchor}\` } return '' } diff --git a/packages/vite-plugin-kit-routes/src/lib/plugin.ts b/packages/vite-plugin-kit-routes/src/lib/plugin.ts index d4bffa2b..bf6f68c1 100644 --- a/packages/vite-plugin-kit-routes/src/lib/plugin.ts +++ b/packages/vite-plugin-kit-routes/src/lib/plugin.ts @@ -288,6 +288,23 @@ export type ExplicitSearchParam = ExtendParam & { * @default 'split' */ arrayMode?: 'join' | 'split' + + /** + * If `true`, the key has no impact on the route. + * and one of the type will be used as the #hash. + * @example + * explicit_search_params: { + * anchor: { + * type: '"section1" | "section2" | "section3"', + * required: true, + * isAnchor: true + * } + * } + * will result in something like : /anchors#section1 + * + * @default false + */ + isAnchor?: boolean } export const log = new Log('Kit Routes') @@ -593,6 +610,7 @@ export function buildMetadata( type: sp[1].type, default: sp[1].default, isArray: false, + isAnchor: sp[1].isAnchor, } paramsFromPath.push(param) @@ -617,7 +635,12 @@ export function buildMetadata( Object.entries(customConf.explicit_search_params).forEach((sp) => { const val = paramsIsOptional ? `params?.['${sp[0]}']` : `params['${sp[0]}']` - explicit_search_params_to_function.push([sp[0], getSpValue(val, sp[1])]) + let key = sp[0] + if (sp[1].isAnchor) { + key = `__KIT_ROUTES_ANCHOR__` + } + + explicit_search_params_to_function.push([key, getSpValue(val, sp[1])]) }) } @@ -631,10 +654,10 @@ export function buildMetadata( // If it's in the explicite and it's THIS one, let's change the array... if ( explicit_search_params_to_function.length === 1 && - explicit_search_params_to_function[0][0] === paramsReq[0].name + (explicit_search_params_to_function[0][0] === paramsReq[0].name || + explicit_search_params_to_function[0][0] === `__KIT_ROUTES_ANCHOR__`) ) { const sp = customConf.explicit_search_params![paramsReq[0].name] - explicit_search_params_to_function[0][1] = getSpValue(paramsReq[0].name, sp) } else { // in params diff --git a/packages/vite-plugin-kit-routes/src/lib/plugins.spec.ts b/packages/vite-plugin-kit-routes/src/lib/plugins.spec.ts index 270c6638..da13ee88 100644 --- a/packages/vite-plugin-kit-routes/src/lib/plugins.spec.ts +++ b/packages/vite-plugin-kit-routes/src/lib/plugins.spec.ts @@ -362,6 +362,18 @@ describe('run()', async () => { spArrayComma: { explicit_search_params: { ids: { type: 'number[]', required: true, arrayMode: 'join' } }, }, + anchors: { + explicit_search_params: { + anchor: { + type: '"section0" | "section1" | "section2" | "section3"', + required: true, + isAnchor: true, + }, + // anotherOne: { + // type: 'string', + // }, + }, + }, }, SERVERS: {}, ACTIONS: { @@ -387,6 +399,7 @@ describe('run()', async () => { '/match/[id=int]': commonConfig_variables.PAGES?.match_id_int, '/site_contract/[siteId]-[contractId]': commonConfig_variables.PAGES?.site_contract_siteId_contractId, + '/anchors': commonConfig_variables.PAGES?.anchors, }, SERVERS: {}, ACTIONS: { @@ -405,6 +418,7 @@ describe('run()', async () => { '/[[lang]]/match/[id=int]': commonConfig_variables.PAGES?.match_id_int, '/[[lang]]/site_contract/[siteId]-[contractId]': commonConfig_variables.PAGES?.site_contract_siteId_contractId, + '/anchors': commonConfig_variables.PAGES?.anchors, }, SERVERS: {}, ACTIONS: { @@ -914,6 +928,7 @@ describe('rmv Helper', () => { "/site_contract/[siteId]-[contractId]/+page.server.ts", "/site_contract/[siteId]-[contractId]/+page.svelte", "a/[...rest]/z/+page.svelte", + "anchors/+page.svelte", "api/graphql/+server.ts", "data/errors/[locale].json/+server.ts", "lay/(layVerySpecial)/+layout.svelte", @@ -963,6 +978,7 @@ describe('rmv Helper', () => { "[[lang]]/site_contract/[siteId]-[contractId]/+page.server.ts", "[[lang]]/site_contract/[siteId]-[contractId]/+page.svelte", "a/[...rest]/z/+page.svelte", + "anchors/+page.svelte", "api/graphql/+server.ts", "data/errors/[locale].json/+server.ts", "lay/(layVerySpecial)/+layout.svelte", @@ -1005,6 +1021,7 @@ describe('rmv Helper', () => { "[[lang]]/site_contract/[siteId]-[contractId]/+page.server.ts", "[[lang]]/site_contract/[siteId]-[contractId]/+page.svelte", "a/[...rest]/z/+page.svelte", + "anchors/+page.svelte", "api/graphql/+server.ts", "data/errors/[locale].json/+server.ts", "lay/+layout.svelte", @@ -1050,6 +1067,7 @@ describe('rmv Helper', () => { "/site_contract/[siteId]-[contractId]/+page.server.ts", "/site_contract/[siteId]-[contractId]/+page.svelte", "a/[...rest]/z/+page.svelte", + "anchors/+page.svelte", "api/graphql/+server.ts", "data/errors/[locale].json/+server.ts", "lay/+layout.svelte", diff --git a/packages/vite-plugin-kit-routes/src/routes/+layout.svelte b/packages/vite-plugin-kit-routes/src/routes/+layout.svelte index 21c188ab..f519b1db 100644 --- a/packages/vite-plugin-kit-routes/src/routes/+layout.svelte +++ b/packages/vite-plugin-kit-routes/src/routes/+layout.svelte @@ -99,7 +99,12 @@ Array Search Params | Array Search Params (comma-separated) - Unsafe Link +
  • + Unsafe Link +
  • +
  • + Anchors +

  • diff --git a/packages/vite-plugin-kit-routes/src/routes/anchors/+page.svelte b/packages/vite-plugin-kit-routes/src/routes/anchors/+page.svelte new file mode 100644 index 00000000..40b6e7a5 --- /dev/null +++ b/packages/vite-plugin-kit-routes/src/routes/anchors/+page.svelte @@ -0,0 +1,89 @@ + + +
    + + +
    +

    Section 1

    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut + labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris nisi ut aliquip ex ea commodo consequat. +

    +

    + Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt + mollit anim id est laborum. +

    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut + labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris nisi ut aliquip ex ea commodo consequat. +

    +

    + Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt + mollit anim id est laborum. +

    +
    + +
    +

    Section 2

    +

    + Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque + laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto + beatae vitae dicta sunt explicabo. +

    +

    + Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia + consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. +

    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut + labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris nisi ut aliquip ex ea commodo consequat. +

    +

    + Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt + mollit anim id est laborum. +

    +
    + +
    +

    Section 3

    +

    + At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium + voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati + cupiditate non provident. +

    +

    + Similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. + Et harum quidem rerum facilis est et expedita distinctio. +

    +

    + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut + labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco + laboris nisi ut aliquip ex ea commodo consequat. +

    +

    + Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt + mollit anim id est laborum. +

    +
    +
    diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_base.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_base.ts index 761bda0a..0fdb9850 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_base.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_base.ts @@ -47,6 +47,7 @@ const PAGES = { "/a/[...rest]/z": (params: { rest: (string | number)[] }) => { return `${base}/a/${params['rest']?.join('/')}/z` }, + "/anchors": `${base}/anchors`, "/lay/normal": `${base}/lay/normal`, "/lay/root-layout": `${base}/lay/root-layout`, "/lay/skip": `${base}/lay/skip`, @@ -114,7 +115,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -124,7 +128,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -135,8 +144,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -206,7 +215,7 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'id' | 'lang', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } + PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'id' | 'lang', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } SERVERS: { 'GET /server_func_get': never, 'GET /server_func_get_and_': never, 'POST /server_func_post': never, 'GET /contract': 'lang', 'POST /contract': 'lang', 'GET /site': 'lang', 'GET /api/graphql': never, 'POST /api/graphql': never, 'GET /data/errors/[locale].json': 'locale' } ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'update /site/[id]': 'id' | 'lang', 'delete /site/[id]': 'id' | 'lang', 'noSatisfies /site_contract': 'lang', 'send /site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' } LINKS: Record diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-path.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-path.ts index 8a31068d..ce1d1ccc 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-path.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-path.ts @@ -51,6 +51,9 @@ export const PAGES = { "/a/[...rest]/z": (params: { rest: (string | number)[] }) => { return `/a/${params['rest']?.join('/')}/z` }, + "/anchors": (params: { anchor: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['anchor'] })}` + }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, "/lay/skip": `/lay/skip`, @@ -127,7 +130,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -137,7 +143,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -148,8 +159,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -187,9 +198,9 @@ export const currentSp = () => { * ``` */ export type KIT_ROUTES = { - PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } + PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } SERVERS: { 'GET /server_func_get': never, 'GET /server_func_get_and_': never, 'POST /server_func_post': never, 'GET /contract': 'lang', 'POST /contract': 'lang', 'GET /site': 'lang', 'GET /api/graphql': never, 'POST /api/graphql': never, 'GET /data/errors/[locale].json': 'locale' } ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'update /site/[id]': 'id' | 'lang', 'delete /site/[id]': 'id' | 'lang', 'noSatisfies /site_contract': 'lang', 'send /site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-path_shortened.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-path_shortened.ts index d5d1224d..4d38aa8e 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-path_shortened.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-path_shortened.ts @@ -51,6 +51,9 @@ export const PAGES = { "/a/[...rest]/z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, + "/anchors": (anchor: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': anchor })}` + }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, "/lay/skip": `/lay/skip`, @@ -128,7 +131,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -138,7 +144,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -149,8 +160,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -188,9 +199,9 @@ export const currentSp = () => { * ``` */ export type KIT_ROUTES = { - PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'lang' | 'id', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'lang' | 'id', '/match/[id=int]': 'lang' | 'id', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } + PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'lang' | 'id', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'lang' | 'id', '/match/[id=int]': 'lang' | 'id', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } SERVERS: { 'GET /server_func_get': never, 'GET /server_func_get_and_': never, 'POST /server_func_post': never, 'GET /contract': 'lang', 'POST /contract': 'lang', 'GET /site': 'lang', 'GET /api/graphql': never, 'POST /api/graphql': never, 'GET /data/errors/[locale].json': 'locale' } ACTIONS: { 'default /contract/[id]': 'lang' | 'id', 'create /site': 'lang', 'update /site/[id]': 'lang' | 'id', 'delete /site/[id]': 'lang' | 'id', 'noSatisfies /site_contract': 'lang', 'send /site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-symbol.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-symbol.ts index e0b2c988..2f8087e8 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-symbol.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-symbol.ts @@ -51,6 +51,9 @@ export const PAGES = { "a_rest_z": (params: { rest: (string | number)[] }) => { return `/a/${params['rest']?.join('/')}/z` }, + "anchors": (params: { anchor: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['anchor'] })}` + }, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, "lay_skip": `/lay/skip`, @@ -131,7 +134,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -141,7 +147,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -152,8 +163,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -191,9 +202,9 @@ export const currentSp = () => { * ``` */ export type KIT_ROUTES = { - PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'id' | 'lang', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'id' | 'lang', 'match_id_int': 'id' | 'lang', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } + PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'id' | 'lang', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'id' | 'lang', 'match_id_int': 'id' | 'lang', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'anchors': never, 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } SERVERS: { 'GET_server_func_get': never, 'GET_server_func_get_and': never, 'POST_server_func_post': never, 'GET_contract': 'lang', 'POST_contract': 'lang', 'GET_site': 'lang', 'GET_api_graphql': never, 'POST_api_graphql': never, 'GET_data_errors_locale_json': 'locale' } ACTIONS: { 'default_contract_id': 'id' | 'lang', 'create_site': 'lang', 'update_site_id': 'id' | 'lang', 'delete_site_id': 'id' | 'lang', 'noSatisfies_site_contract': 'lang', 'send_site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'ids': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'ids': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-symbol_shortened.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-symbol_shortened.ts index fb9e55bc..6ed49fa5 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-symbol_shortened.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-object-symbol_shortened.ts @@ -51,6 +51,9 @@ export const PAGES = { "a_rest_z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, + "anchors": (anchor: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': anchor })}` + }, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, "lay_skip": `/lay/skip`, @@ -132,7 +135,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -142,7 +148,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -153,8 +164,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -192,9 +203,9 @@ export const currentSp = () => { * ``` */ export type KIT_ROUTES = { - PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'lang' | 'id', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'lang' | 'id', 'match_id_int': 'lang' | 'id', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } + PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'lang' | 'id', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'lang' | 'id', 'match_id_int': 'lang' | 'id', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'anchors': never, 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } SERVERS: { 'GET_server_func_get': never, 'GET_server_func_get_and': never, 'POST_server_func_post': never, 'GET_contract': 'lang', 'POST_contract': 'lang', 'GET_site': 'lang', 'GET_api_graphql': never, 'POST_api_graphql': never, 'GET_data_errors_locale_json': 'locale' } ACTIONS: { 'default_contract_id': 'lang' | 'id', 'create_site': 'lang', 'update_site_id': 'lang' | 'id', 'delete_site_id': 'lang' | 'id', 'noSatisfies_site_contract': 'lang', 'send_site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'ids': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'ids': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-path.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-path.ts index 95fbb041..d1d66732 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-path.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-path.ts @@ -51,6 +51,9 @@ export const PAGES = { "/a/[...rest]/z": (params: { rest: (string | number)[] }) => { return `/a/${params['rest']?.join('/')}/z` }, + "/anchors": (params: { anchor: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['anchor'] })}` + }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, "/lay/skip": `/lay/skip`, @@ -127,7 +130,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -137,7 +143,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -148,8 +159,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -219,9 +230,9 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } + PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } SERVERS: { 'GET /server_func_get': never, 'GET /server_func_get_and_': never, 'POST /server_func_post': never, 'GET /contract': 'lang', 'POST /contract': 'lang', 'GET /site': 'lang', 'GET /api/graphql': never, 'POST /api/graphql': never, 'GET /data/errors/[locale].json': 'locale' } ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'update /site/[id]': 'id' | 'lang', 'delete /site/[id]': 'id' | 'lang', 'noSatisfies /site_contract': 'lang', 'send /site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-path_shortened.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-path_shortened.ts index 7079a48e..9bee7eb7 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-path_shortened.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-path_shortened.ts @@ -51,6 +51,9 @@ export const PAGES = { "/a/[...rest]/z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, + "/anchors": (anchor: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': anchor })}` + }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, "/lay/skip": `/lay/skip`, @@ -128,7 +131,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -138,7 +144,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -149,8 +160,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -220,9 +231,9 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'lang' | 'id', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'lang' | 'id', '/match/[id=int]': 'lang' | 'id', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } + PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'lang' | 'id', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'lang' | 'id', '/match/[id=int]': 'lang' | 'id', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } SERVERS: { 'GET /server_func_get': never, 'GET /server_func_get_and_': never, 'POST /server_func_post': never, 'GET /contract': 'lang', 'POST /contract': 'lang', 'GET /site': 'lang', 'GET /api/graphql': never, 'POST /api/graphql': never, 'GET /data/errors/[locale].json': 'locale' } ACTIONS: { 'default /contract/[id]': 'lang' | 'id', 'create /site': 'lang', 'update /site/[id]': 'lang' | 'id', 'delete /site/[id]': 'lang' | 'id', 'noSatisfies /site_contract': 'lang', 'send /site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-symbol.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-symbol.ts index 8d4851a0..fc73e288 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-symbol.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-symbol.ts @@ -51,6 +51,7 @@ export const PAGES = { "a_rest_z": (params: { rest: (string | number)[] }) => { return `/a/${params['rest']?.join('/')}/z` }, + "anchors": `/anchors`, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, "lay_skip": `/lay/skip`, @@ -127,7 +128,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -137,7 +141,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -148,8 +157,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -219,7 +228,7 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'id' | 'lang', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'id' | 'lang', 'match_id_int': 'id' | 'lang', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } + PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'id' | 'lang', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'id' | 'lang', 'match_id_int': 'id' | 'lang', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'anchors': never, 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } SERVERS: { 'GET server_func_get': never, 'GET server_func_get_and': never, 'POST server_func_post': never, 'GET contract': 'lang', 'POST contract': 'lang', 'GET site': 'lang', 'GET api_graphql': never, 'POST api_graphql': never, 'GET data_errors_locale_json': 'locale' } ACTIONS: { 'default contract_id': 'id' | 'lang', 'create site': 'lang', 'update site_id': 'id' | 'lang', 'delete site_id': 'id' | 'lang', 'noSatisfies site_contract': 'lang', 'send site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-symbol_shortened.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-symbol_shortened.ts index 6d4ae030..632cb381 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-symbol_shortened.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-symbol_shortened.ts @@ -51,6 +51,7 @@ export const PAGES = { "a_rest_z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, + "anchors": `/anchors`, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, "lay_skip": `/lay/skip`, @@ -128,7 +129,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -138,7 +142,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -149,8 +158,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -220,7 +229,7 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'lang' | 'id', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'lang' | 'id', 'match_id_int': 'lang' | 'id', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } + PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'lang' | 'id', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'lang' | 'id', 'match_id_int': 'lang' | 'id', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'anchors': never, 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } SERVERS: { 'GET server_func_get': never, 'GET server_func_get_and': never, 'POST server_func_post': never, 'GET contract': 'lang', 'POST contract': 'lang', 'GET site': 'lang', 'GET api_graphql': never, 'POST api_graphql': never, 'GET data_errors_locale_json': 'locale' } ACTIONS: { 'default contract_id': 'lang' | 'id', 'create site': 'lang', 'update site_id': 'lang' | 'id', 'delete site_id': 'lang' | 'id', 'noSatisfies site_contract': 'lang', 'send site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path-page-route-id.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path-page-route-id.ts index a954b4c1..36006430 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path-page-route-id.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path-page-route-id.ts @@ -51,6 +51,9 @@ const PAGES = { "/a/[...rest]/z": (params: { rest: (string | number)[] }) => { return `/a/${params['rest']?.join('/')}/z` }, + "/anchors": (params: { anchor: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['anchor'] })}` + }, "/lay/(layVerySpecial)/normal": `/lay/normal`, "/lay/(layVerySpecial)/root-layout": `/lay/root-layout`, "/lay/(layVerySpecial)/skip": `/lay/skip`, @@ -127,7 +130,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -137,7 +143,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -148,8 +159,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -219,9 +230,9 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '/(rootGroup)': never, '/(rootGroup)/subGroup': never, '/(rootGroup)/subGroup/(anotherSub)/user': never, '/(rootGroup)/subGroup2': never, '/[[lang]]/contract': 'lang', '/[[lang]]/contract/[id]': 'id' | 'lang', '/[[lang]]/gp/(logged)/one': 'lang', '/[[lang]]/gp/(public)/two': 'lang', '/[[lang]]/main': 'lang', '/[[lang]]/match/[id=ab]': 'id' | 'lang', '/[[lang]]/match/[id=int]': 'id' | 'lang', '/[[lang]]/site': 'lang', '/[[lang]]/site/[id]': 'lang' | 'id', '/[[lang]]/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/lay/(layVerySpecial)/normal': never, '/lay/(layVerySpecial)/root-layout': never, '/lay/(layVerySpecial)/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } + PAGES: { '/(rootGroup)': never, '/(rootGroup)/subGroup': never, '/(rootGroup)/subGroup/(anotherSub)/user': never, '/(rootGroup)/subGroup2': never, '/[[lang]]/contract': 'lang', '/[[lang]]/contract/[id]': 'id' | 'lang', '/[[lang]]/gp/(logged)/one': 'lang', '/[[lang]]/gp/(public)/two': 'lang', '/[[lang]]/main': 'lang', '/[[lang]]/match/[id=ab]': 'id' | 'lang', '/[[lang]]/match/[id=int]': 'id' | 'lang', '/[[lang]]/site': 'lang', '/[[lang]]/site/[id]': 'lang' | 'id', '/[[lang]]/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/lay/(layVerySpecial)/normal': never, '/lay/(layVerySpecial)/root-layout': never, '/lay/(layVerySpecial)/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } SERVERS: { 'GET /(servers)/server_func_get': never, 'GET /(servers)/server_func_get_and_': never, 'POST /(servers)/server_func_post': never, 'GET /[[lang]]/contract': 'lang', 'POST /[[lang]]/contract': 'lang', 'GET /[[lang]]/site': 'lang', 'GET /api/graphql': never, 'POST /api/graphql': never, 'GET /data/errors/[locale].json': 'locale' } ACTIONS: { 'default /[[lang]]/contract/[id]': 'id' | 'lang', 'create /[[lang]]/site': 'lang', 'update /[[lang]]/site/[id]': 'id' | 'lang', 'delete /[[lang]]/site/[id]': 'id' | 'lang', 'noSatisfies /[[lang]]/site_contract': 'lang', 'send /[[lang]]/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path-page-route-id_shortened.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path-page-route-id_shortened.ts index ca3f80b4..ddb4461f 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path-page-route-id_shortened.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path-page-route-id_shortened.ts @@ -51,6 +51,9 @@ const PAGES = { "/a/[...rest]/z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, + "/anchors": (anchor: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': anchor })}` + }, "/lay/(layVerySpecial)/normal": `/lay/normal`, "/lay/(layVerySpecial)/root-layout": `/lay/root-layout`, "/lay/(layVerySpecial)/skip": `/lay/skip`, @@ -128,7 +131,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -138,7 +144,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -149,8 +160,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -220,9 +231,9 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '/(rootGroup)': never, '/(rootGroup)/subGroup': never, '/(rootGroup)/subGroup/(anotherSub)/user': never, '/(rootGroup)/subGroup2': never, '/[[lang]]/contract': 'lang', '/[[lang]]/contract/[id]': 'lang' | 'id', '/[[lang]]/gp/(logged)/one': 'lang', '/[[lang]]/gp/(public)/two': 'lang', '/[[lang]]/main': 'lang', '/[[lang]]/match/[id=ab]': 'lang' | 'id', '/[[lang]]/match/[id=int]': 'lang' | 'id', '/[[lang]]/site': 'lang', '/[[lang]]/site/[id]': 'lang' | 'id', '/[[lang]]/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/lay/(layVerySpecial)/normal': never, '/lay/(layVerySpecial)/root-layout': never, '/lay/(layVerySpecial)/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } + PAGES: { '/(rootGroup)': never, '/(rootGroup)/subGroup': never, '/(rootGroup)/subGroup/(anotherSub)/user': never, '/(rootGroup)/subGroup2': never, '/[[lang]]/contract': 'lang', '/[[lang]]/contract/[id]': 'lang' | 'id', '/[[lang]]/gp/(logged)/one': 'lang', '/[[lang]]/gp/(public)/two': 'lang', '/[[lang]]/main': 'lang', '/[[lang]]/match/[id=ab]': 'lang' | 'id', '/[[lang]]/match/[id=int]': 'lang' | 'id', '/[[lang]]/site': 'lang', '/[[lang]]/site/[id]': 'lang' | 'id', '/[[lang]]/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/lay/(layVerySpecial)/normal': never, '/lay/(layVerySpecial)/root-layout': never, '/lay/(layVerySpecial)/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } SERVERS: { 'GET /(servers)/server_func_get': never, 'GET /(servers)/server_func_get_and_': never, 'POST /(servers)/server_func_post': never, 'GET /[[lang]]/contract': 'lang', 'POST /[[lang]]/contract': 'lang', 'GET /[[lang]]/site': 'lang', 'GET /api/graphql': never, 'POST /api/graphql': never, 'GET /data/errors/[locale].json': 'locale' } ACTIONS: { 'default /[[lang]]/contract/[id]': 'lang' | 'id', 'create /[[lang]]/site': 'lang', 'update /[[lang]]/site/[id]': 'lang' | 'id', 'delete /[[lang]]/site/[id]': 'lang' | 'id', 'noSatisfies /[[lang]]/site_contract': 'lang', 'send /[[lang]]/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path.ts index 97436cdc..437efdc7 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path.ts @@ -51,6 +51,9 @@ const PAGES = { "/a/[...rest]/z": (params: { rest: (string | number)[] }) => { return `/a/${params['rest']?.join('/')}/z` }, + "/anchors": (params: { anchor: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['anchor'] })}` + }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, "/lay/skip": `/lay/skip`, @@ -127,7 +130,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -137,7 +143,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -148,8 +159,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -219,9 +230,9 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } + PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } SERVERS: { 'GET /server_func_get': never, 'GET /server_func_get_and_': never, 'POST /server_func_post': never, 'GET /contract': 'lang', 'POST /contract': 'lang', 'GET /site': 'lang', 'GET /api/graphql': never, 'POST /api/graphql': never, 'GET /data/errors/[locale].json': 'locale' } ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'update /site/[id]': 'id' | 'lang', 'delete /site/[id]': 'id' | 'lang', 'noSatisfies /site_contract': 'lang', 'send /site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path_shortened.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path_shortened.ts index 8ec51a37..b4c6996f 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path_shortened.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path_shortened.ts @@ -51,6 +51,9 @@ const PAGES = { "/a/[...rest]/z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, + "/anchors": (anchor: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': anchor })}` + }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, "/lay/skip": `/lay/skip`, @@ -128,7 +131,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -138,7 +144,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -149,8 +160,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -220,9 +231,9 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'lang' | 'id', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'lang' | 'id', '/match/[id=int]': 'lang' | 'id', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } + PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'lang' | 'id', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'lang' | 'id', '/match/[id=int]': 'lang' | 'id', '/site': 'lang', '/site/[id]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } SERVERS: { 'GET /server_func_get': never, 'GET /server_func_get_and_': never, 'POST /server_func_post': never, 'GET /contract': 'lang', 'POST /contract': 'lang', 'GET /site': 'lang', 'GET /api/graphql': never, 'POST /api/graphql': never, 'GET /data/errors/[locale].json': 'locale' } ACTIONS: { 'default /contract/[id]': 'lang' | 'id', 'create /site': 'lang', 'update /site/[id]': 'lang' | 'id', 'delete /site/[id]': 'lang' | 'id', 'noSatisfies /site_contract': 'lang', 'send /site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-symbol.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-symbol.ts index 9f9faaea..9a891b30 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-symbol.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-symbol.ts @@ -51,6 +51,7 @@ const PAGES = { "a_rest_z": (params: { rest: (string | number)[] }) => { return `/a/${params['rest']?.join('/')}/z` }, + "anchors": `/anchors`, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, "lay_skip": `/lay/skip`, @@ -127,7 +128,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -137,7 +141,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -148,8 +157,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -219,7 +228,7 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'id' | 'lang', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'id' | 'lang', 'match_id_int': 'id' | 'lang', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } + PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'id' | 'lang', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'id' | 'lang', 'match_id_int': 'id' | 'lang', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'anchors': never, 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } SERVERS: { 'GET server_func_get': never, 'GET server_func_get_and': never, 'POST server_func_post': never, 'GET contract': 'lang', 'POST contract': 'lang', 'GET site': 'lang', 'GET api_graphql': never, 'POST api_graphql': never, 'GET data_errors_locale_json': 'locale' } ACTIONS: { 'default contract_id': 'id' | 'lang', 'create site': 'lang', 'update site_id': 'id' | 'lang', 'delete site_id': 'id' | 'lang', 'noSatisfies site_contract': 'lang', 'send site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-symbol_shortened.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-symbol_shortened.ts index 641a0868..6a1ed9a2 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-symbol_shortened.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-symbol_shortened.ts @@ -51,6 +51,7 @@ const PAGES = { "a_rest_z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, + "anchors": `/anchors`, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, "lay_skip": `/lay/skip`, @@ -128,7 +129,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -138,7 +142,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -149,8 +158,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -220,7 +229,7 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'lang' | 'id', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'lang' | 'id', 'match_id_int': 'lang' | 'id', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } + PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'lang' | 'id', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'lang' | 'id', 'match_id_int': 'lang' | 'id', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'anchors': never, 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } SERVERS: { 'GET server_func_get': never, 'GET server_func_get_and': never, 'POST server_func_post': never, 'GET contract': 'lang', 'POST contract': 'lang', 'GET site': 'lang', 'GET api_graphql': never, 'POST api_graphql': never, 'GET data_errors_locale_json': 'locale' } ACTIONS: { 'default contract_id': 'lang' | 'id', 'create site': 'lang', 'update site_id': 'lang' | 'id', 'delete site_id': 'lang' | 'id', 'noSatisfies site_contract': 'lang', 'send site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-variables.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-variables.ts index 0f37f8cc..15262d4c 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-variables.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-variables.ts @@ -50,6 +50,9 @@ export const PAGE_site_contract_siteId_contractId = (params: { siteId: (string | export const PAGE_a_rest_z = (params: { rest: (string | number)[] }) => { return `/a/${params['rest']?.join('/')}/z` } +export const PAGE_anchors = (params: { anchor: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['anchor'] })}` +} export const PAGE_lay_normal = `/lay/normal` export const PAGE_lay_root_layout = `/lay/root-layout` export const PAGE_lay_skip = `/lay/skip` @@ -123,7 +126,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -133,7 +139,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -144,8 +155,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -183,9 +194,9 @@ export const currentSp = () => { * ``` */ export type KIT_ROUTES = { - PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'id' | 'lang', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'id' | 'lang', 'match_id_int': 'id' | 'lang', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } + PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'id' | 'lang', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'id' | 'lang', 'match_id_int': 'id' | 'lang', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'anchors': never, 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } SERVERS: { 'GET_server_func_get': never, 'GET_server_func_get_and': never, 'POST_server_func_post': never, 'GET_contract': 'lang', 'POST_contract': 'lang', 'GET_site': 'lang', 'GET_api_graphql': never, 'POST_api_graphql': never, 'GET_data_errors_locale_json': 'locale' } ACTIONS: { 'default_contract_id': 'id' | 'lang', 'create_site': 'lang', 'update_site_id': 'id' | 'lang', 'delete_site_id': 'id' | 'lang', 'noSatisfies_site_contract': 'lang', 'send_site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'ids': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'ids': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-variables_shortened.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-variables_shortened.ts index eae302aa..fc77e765 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_format-variables_shortened.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-variables_shortened.ts @@ -50,6 +50,9 @@ export const PAGE_site_contract_siteId_contractId = (params: { siteId: (string | export const PAGE_a_rest_z = (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` } +export const PAGE_anchors = (anchor: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': anchor })}` +} export const PAGE_lay_normal = `/lay/normal` export const PAGE_lay_root_layout = `/lay/root-layout` export const PAGE_lay_skip = `/lay/skip` @@ -124,7 +127,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -134,7 +140,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -145,8 +156,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -184,9 +195,9 @@ export const currentSp = () => { * ``` */ export type KIT_ROUTES = { - PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'lang' | 'id', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'lang' | 'id', 'match_id_int': 'lang' | 'id', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } + PAGES: { '_ROOT': never, 'subGroup': never, 'subGroup_user': never, 'subGroup2': never, 'contract': 'lang', 'contract_id': 'lang' | 'id', 'gp_one': 'lang', 'gp_two': 'lang', 'main': 'lang', 'match_id_ab': 'lang' | 'id', 'match_id_int': 'lang' | 'id', 'site': 'lang', 'site_id': 'lang' | 'id', 'site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang', 'a_rest_z': 'rest', 'anchors': never, 'lay_normal': never, 'lay_root_layout': never, 'lay_skip': never, 'sp': never, 'spArray': never, 'spArrayComma': never } SERVERS: { 'GET_server_func_get': never, 'GET_server_func_get_and': never, 'POST_server_func_post': never, 'GET_contract': 'lang', 'POST_contract': 'lang', 'GET_site': 'lang', 'GET_api_graphql': never, 'POST_api_graphql': never, 'GET_data_errors_locale_json': 'locale' } ACTIONS: { 'default_contract_id': 'lang' | 'id', 'create_site': 'lang', 'update_site_id': 'lang' | 'id', 'delete_site_id': 'lang' | 'id', 'noSatisfies_site_contract': 'lang', 'send_site_contract_siteId_contractId': 'siteId' | 'contractId' | 'lang' } LINKS: { 'twitter': never, 'twitter_post': 'name' | 'id', 'gravatar': 'str' } - Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'ids': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } + Params: { 'first': never, 'lang': never, 'id': never, 'limit': never, 'demo': never, 'da-sh': never, 'siteId': never, 'contractId': never, 'rest': never, 'anchor': never, 'ids': never, 'locale': never, 'extra': never, 'name': never, 'str': never, 's': never, 'd': never } } diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_hash.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_hash.ts index 42aa6916..640d0cbe 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_hash.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_hash.ts @@ -46,6 +46,7 @@ const PAGES = { "/a/[...rest]/z": (params: { rest: (string | number)[] }) => { return `#/a/${params['rest']?.join('/')}/z` }, + "/anchors": `#/anchors`, "/lay/normal": `#/lay/normal`, "/lay/root-layout": `#/lay/root-layout`, "/lay/skip": `#/lay/skip`, @@ -113,7 +114,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -123,7 +127,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -134,8 +143,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -205,7 +214,7 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'id' | 'lang', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } + PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'id' | 'lang', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } SERVERS: { 'GET /server_func_get': never, 'GET /server_func_get_and_': never, 'POST /server_func_post': never, 'GET /contract': 'lang', 'POST /contract': 'lang', 'GET /site': 'lang', 'GET /api/graphql': never, 'POST /api/graphql': never, 'GET /data/errors/[locale].json': 'locale' } ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'update /site/[id]': 'id' | 'lang', 'delete /site/[id]': 'id' | 'lang', 'noSatisfies /site_contract': 'lang', 'send /site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' } LINKS: Record diff --git a/packages/vite-plugin-kit-routes/src/test/ROUTES_post-update.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_post-update.ts index c905aedc..6c162b16 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_post-update.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_post-update.ts @@ -46,6 +46,7 @@ const PAGES = { "/a/[...rest]/z": (params: { rest: (string | number)[] }) => { return `/a/${params['rest']?.join('/')}/z` }, + "/anchors": `/anchors`, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, "/lay/skip": `/lay/skip`, @@ -113,7 +114,10 @@ type ParamValue = string | number | undefined /** * Append search params to a string */ -export const appendSp = (sp?: Record, prefix: '?' | '&' = '?') => { +export const appendSp = ( + sp?: Record, + prefix: '?' | '&' = '?', +) => { if (sp === undefined) return '' const params = new URLSearchParams() @@ -123,7 +127,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__') { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -134,8 +143,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}` } return '' } @@ -205,7 +214,7 @@ export function route(key: T, ...params: any[]): strin * ``` */ export type KIT_ROUTES = { - PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'id' | 'lang', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } + PAGES: { '/': never, '/subGroup': never, '/subGroup/user': never, '/subGroup2': never, '/contract': 'lang', '/contract/[id]': 'id' | 'lang', '/gp/one': 'lang', '/gp/two': 'lang', '/main': 'lang', '/match/[id=ab]': 'id' | 'lang', '/match/[id=int]': 'id' | 'lang', '/site': 'lang', '/site/[id]': 'id' | 'lang', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/lay/normal': never, '/lay/root-layout': never, '/lay/skip': never, '/sp': never, '/spArray': never, '/spArrayComma': never } SERVERS: { 'GET /server_func_get': never, 'GET /server_func_get_and_': never, 'POST /server_func_post': never, 'GET /contract': 'lang', 'POST /contract': 'lang', 'GET /site': 'lang', 'GET /api/graphql': never, 'POST /api/graphql': never, 'GET /data/errors/[locale].json': 'locale' } ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'update /site/[id]': 'id' | 'lang', 'delete /site/[id]': 'id' | 'lang', 'noSatisfies /site_contract': 'lang', 'send /site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang' } LINKS: Record diff --git a/packages/vite-plugin-kit-routes/vite.config.ts b/packages/vite-plugin-kit-routes/vite.config.ts index 368ca40b..45e020f8 100644 --- a/packages/vite-plugin-kit-routes/vite.config.ts +++ b/packages/vite-plugin-kit-routes/vite.config.ts @@ -75,6 +75,18 @@ export default defineConfig({ '/spArrayComma': { explicit_search_params: { ids: { type: 'number[]', required: true, arrayMode: 'join' } }, }, + '/anchors': { + explicit_search_params: { + anchor: { + type: '"section0" | "section1" | "section2" | "section3"', + required: true, + isAnchor: true, + }, + anotherOne: { + type: 'string', + }, + }, + }, }, SERVERS: { // site: {