diff --git a/.changeset/pretty-news-invent.md b/.changeset/pretty-news-invent.md new file mode 100644 index 00000000..73dad7a7 --- /dev/null +++ b/.changeset/pretty-news-invent.md @@ -0,0 +1,5 @@ +--- +'vite-plugin-kit-routes': minor +--- + +BREAKING: kit-routes plugin is not running in test mode (vitest) diff --git a/.changeset/silly-tigers-clean.md b/.changeset/silly-tigers-clean.md new file mode 100644 index 00000000..ae1f67f7 --- /dev/null +++ b/.changeset/silly-tigers-clean.md @@ -0,0 +1,5 @@ +--- +'vite-plugin-kit-routes': patch +--- + +support kebab cased actions diff --git a/packages/vite-plugin-kit-routes/src/lib/ROUTES.ts b/packages/vite-plugin-kit-routes/src/lib/ROUTES.ts index 3b26d721..2cc27b38 100644 --- a/packages/vite-plugin-kit-routes/src/lib/ROUTES.ts +++ b/packages/vite-plugin-kit-routes/src/lib/ROUTES.ts @@ -137,6 +137,9 @@ const ACTIONS = { }) => { return `${params?.['lang'] ? `/${params?.['lang']}` : ''}/site?/create${appendSp({ redirectTo: params?.['redirectTo'] }, '&')}` }, + 'u-p-d-a-t-e /site': (params?: { lang?: 'fr' | 'en' | 'hu' | 'at' | string }) => { + return `${params?.['lang'] ? `/${params?.['lang']}` : ''}/site?/u-p-d-a-t-e` + }, 'update /site/[id]': (params: { id: string | number lang?: 'fr' | 'en' | 'hu' | 'at' | string @@ -327,6 +330,7 @@ export type KIT_ROUTES = { ACTIONS: { 'default /contract/[id]': 'id' | 'lang' 'create /site': 'lang' + 'u-p-d-a-t-e /site': 'lang' 'update /site/[id]': 'id' | 'lang' 'delete /site/[id]': 'id' | 'lang' 'noSatisfies /site_contract': 'lang' diff --git a/packages/vite-plugin-kit-routes/src/lib/ast.ts b/packages/vite-plugin-kit-routes/src/lib/ast.ts index 7359dd40..6736e755 100644 --- a/packages/vite-plugin-kit-routes/src/lib/ast.ts +++ b/packages/vite-plugin-kit-routes/src/lib/ast.ts @@ -74,7 +74,11 @@ export const getActionsOfServerPages = (pathFile: string) => { if (properties) { properties.forEach((property: any) => { - actions.push(property.key.name) + if (property.key.name) { + actions.push(property.key.name) + } else if (property.key.value) { + actions.push(property.key.value) + } }) } } diff --git a/packages/vite-plugin-kit-routes/src/lib/plugin.ts b/packages/vite-plugin-kit-routes/src/lib/plugin.ts index 7ca18aa8..1389fddd 100644 --- a/packages/vite-plugin-kit-routes/src/lib/plugin.ts +++ b/packages/vite-plugin-kit-routes/src/lib/plugin.ts @@ -954,15 +954,21 @@ export const run = async (atStart: boolean, o?: Options) => { return `/**\n * ${c.type}\n */ ${c.files .map((key) => { + let valiableName = `${c.type.slice(0, -1)}_${key.keyToUse}` + const invalidInVariable = ['-', ' '] + for (const invalid of invalidInVariable) { + valiableName = valiableName.replaceAll(invalid, '_') + } + if (key.strParams) { return ( - `export const ${c.type.slice(0, -1)}_${key.keyToUse} = (${key.strParams}) => {` + + `export const ${valiableName} = (${key.strParams}) => {` + `${format({ bottom: 0, top: 1, left: 2 }, key.strDefault)} return ${key.strReturn} }` ) } else { - return `export const ${c.type.slice(0, -1)}_${key.keyToUse} = ${key.strReturn}` + return `export const ${valiableName} = ${key.strReturn}` } }) .join('\n')}` @@ -1194,7 +1200,9 @@ export function kitRoutes( { name: 'kit-routes', async buildStart() { - await run(true, options) + if (this.environment.config.env.MODE !== 'test') { + await run(true, options) + } }, }, 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 378f97ed..f1b095ee 100644 --- a/packages/vite-plugin-kit-routes/src/lib/plugins.spec.ts +++ b/packages/vite-plugin-kit-routes/src/lib/plugins.spec.ts @@ -18,7 +18,7 @@ import { type Options, } from './plugin.js' -describe('vite-plugin-kit-routes', () => { +describe('extractParamsFromPath', () => { it('get id', async () => { expect(extractParamsFromPath('/site/[id]', {})).toMatchInlineSnapshot(` [ @@ -123,7 +123,9 @@ describe('vite-plugin-kit-routes', () => { ] `) }) +}) +describe('formatKey', () => { it('formatKey default', async () => { expect(formatKey('/[param]site/[yop](group)/[id]', {})).toMatchInlineSnapshot( '"/[param]site/[yop]/[id]"', @@ -159,7 +161,9 @@ describe('vite-plugin-kit-routes', () => { it('formatKey ROOT', async () => { expect(formatKey('/', { format: 'object[path]' })).toMatchInlineSnapshot('"/"') }) +}) +describe('fileToMetadata', () => { it('fileToMetadata optional only', async () => { const key = '/[[lang]]' const meta = transformToMetadata(key, key, 'PAGES', {}, undefined) @@ -295,6 +299,220 @@ describe('vite-plugin-kit-routes', () => { }) }) +describe('getFilesUnder', () => { + it('Looking at another path (lib)', async () => { + const location = routes_path('/src/lib') + expect(getFilesUnder(location)).toMatchInlineSnapshot(` + [ + "ROUTES.ts", + "ast.ts", + "format.ts", + "index.ts", + "plugin.ts", + "plugins.spec.ts", + ] + `) + }) + + it('Looking at another path (routes/api)', async () => { + const location = routes_path('/src/routes/api') + expect(getFilesUnder(location)).toMatchInlineSnapshot(` + [ + "graphql/+server.ts", + ] + `) + }) + + it('rmvOptional', async () => { + const location = routes_path() + expect(getFilesUnder(location).map((c) => rmvOptional(c))).toMatchInlineSnapshot(` + [ + "(rootGroup)/+page.svelte", + "(rootGroup)/subGroup/(anotherSub)/user/+page.svelte", + "(rootGroup)/subGroup/+page.svelte", + "(rootGroup)/subGroup2/+page.svelte", + "(servers)/server_func_get/+server.ts", + "(servers)/server_func_get_and_/+server.ts", + "(servers)/server_func_post/+server.ts", + "+layout.svelte", + "/contract/+page.svelte", + "/contract/+server.ts", + "/contract/[id]/+page.server.ts", + "/contract/[id]/+page.svelte", + "/gp/(logged)/one/+page.svelte", + "/gp/(public)/two/+page.svelte", + "/main/+page.svelte", + "/match/[id=ab]/+page.svelte", + "/match/[id=int]/+page.svelte", + "/site/+page.server.ts", + "/site/+page.svelte", + "/site/+server.ts", + "/site/[id]/+page.server.ts", + "/site/[id]/+page.svelte", + "/site_contract/+page.server.ts", + "/site_contract/[siteId]-[contractId]/+page.server.ts", + "/site_contract/[siteId]-[contractId]/+page.svelte", + "a/[...rest]/z/+page.svelte", + "anchors/+page.svelte", + "anchors/[id]/+page.svelte", + "api/graphql/+server.ts", + "data/errors/[locale].json/+server.ts", + "lay/(layVerySpecial)/+layout.svelte", + "lay/(layVerySpecial)/normal/+page.svelte", + "lay/(layVerySpecial)/root-layout/+page@.svelte", + "lay/(layVerySpecial)/skip/+page@lay.svelte", + "lay/+layout.svelte", + "page_server_woAction/+page.server.ts", + "sp/+page.svelte", + "spArray/+page.svelte", + "spArrayComma/+page.svelte", + ] + `) + }) + + it('rmvGroups with multi groups', async () => { + expect(rmvGroups('/(rootGroup)/subGroup/(anotherSub)/user')).toBe('/subGroup/user') + }) + + it('rmvGroups', async () => { + const location = routes_path() + expect(getFilesUnder(location)).toMatchInlineSnapshot(` + [ + "(rootGroup)/+page.svelte", + "(rootGroup)/subGroup/(anotherSub)/user/+page.svelte", + "(rootGroup)/subGroup/+page.svelte", + "(rootGroup)/subGroup2/+page.svelte", + "(servers)/server_func_get/+server.ts", + "(servers)/server_func_get_and_/+server.ts", + "(servers)/server_func_post/+server.ts", + "+layout.svelte", + "[[lang]]/contract/+page.svelte", + "[[lang]]/contract/+server.ts", + "[[lang]]/contract/[id]/+page.server.ts", + "[[lang]]/contract/[id]/+page.svelte", + "[[lang]]/gp/(logged)/one/+page.svelte", + "[[lang]]/gp/(public)/two/+page.svelte", + "[[lang]]/main/+page.svelte", + "[[lang]]/match/[id=ab]/+page.svelte", + "[[lang]]/match/[id=int]/+page.svelte", + "[[lang]]/site/+page.server.ts", + "[[lang]]/site/+page.svelte", + "[[lang]]/site/+server.ts", + "[[lang]]/site/[id]/+page.server.ts", + "[[lang]]/site/[id]/+page.svelte", + "[[lang]]/site_contract/+page.server.ts", + "[[lang]]/site_contract/[siteId]-[contractId]/+page.server.ts", + "[[lang]]/site_contract/[siteId]-[contractId]/+page.svelte", + "a/[...rest]/z/+page.svelte", + "anchors/+page.svelte", + "anchors/[id]/+page.svelte", + "api/graphql/+server.ts", + "data/errors/[locale].json/+server.ts", + "lay/(layVerySpecial)/+layout.svelte", + "lay/(layVerySpecial)/normal/+page.svelte", + "lay/(layVerySpecial)/root-layout/+page@.svelte", + "lay/(layVerySpecial)/skip/+page@lay.svelte", + "lay/+layout.svelte", + "page_server_woAction/+page.server.ts", + "sp/+page.svelte", + "spArray/+page.svelte", + "spArrayComma/+page.svelte", + ] + `) + + expect(getFilesUnder(location).map((c) => rmvGroups(c))).toMatchInlineSnapshot(` + [ + "/+page.svelte", + "/subGroup/user/+page.svelte", + "/subGroup/+page.svelte", + "/subGroup2/+page.svelte", + "/server_func_get/+server.ts", + "/server_func_get_and_/+server.ts", + "/server_func_post/+server.ts", + "+layout.svelte", + "[[lang]]/contract/+page.svelte", + "[[lang]]/contract/+server.ts", + "[[lang]]/contract/[id]/+page.server.ts", + "[[lang]]/contract/[id]/+page.svelte", + "[[lang]]/gp/one/+page.svelte", + "[[lang]]/gp/two/+page.svelte", + "[[lang]]/main/+page.svelte", + "[[lang]]/match/[id=ab]/+page.svelte", + "[[lang]]/match/[id=int]/+page.svelte", + "[[lang]]/site/+page.server.ts", + "[[lang]]/site/+page.svelte", + "[[lang]]/site/+server.ts", + "[[lang]]/site/[id]/+page.server.ts", + "[[lang]]/site/[id]/+page.svelte", + "[[lang]]/site_contract/+page.server.ts", + "[[lang]]/site_contract/[siteId]-[contractId]/+page.server.ts", + "[[lang]]/site_contract/[siteId]-[contractId]/+page.svelte", + "a/[...rest]/z/+page.svelte", + "anchors/+page.svelte", + "anchors/[id]/+page.svelte", + "api/graphql/+server.ts", + "data/errors/[locale].json/+server.ts", + "lay/+layout.svelte", + "lay/normal/+page.svelte", + "lay/root-layout/+page@.svelte", + "lay/skip/+page@lay.svelte", + "lay/+layout.svelte", + "page_server_woAction/+page.server.ts", + "sp/+page.svelte", + "spArray/+page.svelte", + "spArrayComma/+page.svelte", + ] + `) + }) + + it('rmvGroups & Optional', async () => { + const location = routes_path() + expect(getFilesUnder(location).map((c) => rmvGroups(rmvOptional(c)))).toMatchInlineSnapshot(` + [ + "/+page.svelte", + "/subGroup/user/+page.svelte", + "/subGroup/+page.svelte", + "/subGroup2/+page.svelte", + "/server_func_get/+server.ts", + "/server_func_get_and_/+server.ts", + "/server_func_post/+server.ts", + "+layout.svelte", + "/contract/+page.svelte", + "/contract/+server.ts", + "/contract/[id]/+page.server.ts", + "/contract/[id]/+page.svelte", + "/gp/one/+page.svelte", + "/gp/two/+page.svelte", + "/main/+page.svelte", + "/match/[id=ab]/+page.svelte", + "/match/[id=int]/+page.svelte", + "/site/+page.server.ts", + "/site/+page.svelte", + "/site/+server.ts", + "/site/[id]/+page.server.ts", + "/site/[id]/+page.svelte", + "/site_contract/+page.server.ts", + "/site_contract/[siteId]-[contractId]/+page.server.ts", + "/site_contract/[siteId]-[contractId]/+page.svelte", + "a/[...rest]/z/+page.svelte", + "anchors/+page.svelte", + "anchors/[id]/+page.svelte", + "api/graphql/+server.ts", + "data/errors/[locale].json/+server.ts", + "lay/+layout.svelte", + "lay/normal/+page.svelte", + "lay/root-layout/+page@.svelte", + "lay/skip/+page@lay.svelte", + "lay/+layout.svelte", + "page_server_woAction/+page.server.ts", + "sp/+page.svelte", + "spArray/+page.svelte", + "spArrayComma/+page.svelte", + ] + `) + }) +}) + describe('run()', async () => { const commonConfig: Options = { LINKS: { @@ -455,6 +673,7 @@ describe('run()', async () => { const getPathROUTES = (f: string) => { return `src/test/ROUTES_${f}.ts` } + const getToRunShortened = (info: any) => { return { ...info, @@ -511,9 +730,11 @@ describe('run()', async () => { for (let i = 0; i < runs.length; i++) { const toRun = runs[i] it(`run ${toRun.pathFile}`, async () => { + const generated_file_path = getPathROUTES(toRun.pathFile) + const ret = await run(false, { format: toRun.format, - generated_file_path: getPathROUTES(toRun.pathFile), + generated_file_path, ...toRun.extra, }) @@ -877,219 +1098,3 @@ describe('run()', async () => { expect(read(generated_file_path)?.includes('#/')).toBe(true) }) }) - -describe('options', () => { - it('Looking at another path (lib)', async () => { - const location = routes_path('/src/lib') - expect(getFilesUnder(location)).toMatchInlineSnapshot(` - [ - "ROUTES.ts", - "ast.ts", - "format.ts", - "index.ts", - "plugin.ts", - "plugins.spec.ts", - ] - `) - }) - - it('Looking at another path (routes/api)', async () => { - const location = routes_path('/src/routes/api') - expect(getFilesUnder(location)).toMatchInlineSnapshot(` - [ - "graphql/+server.ts", - ] - `) - }) -}) - -describe('rmv Helper', () => { - it('rmvOptional', async () => { - const location = routes_path() - expect(getFilesUnder(location).map((c) => rmvOptional(c))).toMatchInlineSnapshot(` - [ - "(rootGroup)/+page.svelte", - "(rootGroup)/subGroup/(anotherSub)/user/+page.svelte", - "(rootGroup)/subGroup/+page.svelte", - "(rootGroup)/subGroup2/+page.svelte", - "(servers)/server_func_get/+server.ts", - "(servers)/server_func_get_and_/+server.ts", - "(servers)/server_func_post/+server.ts", - "+layout.svelte", - "/contract/+page.svelte", - "/contract/+server.ts", - "/contract/[id]/+page.server.ts", - "/contract/[id]/+page.svelte", - "/gp/(logged)/one/+page.svelte", - "/gp/(public)/two/+page.svelte", - "/main/+page.svelte", - "/match/[id=ab]/+page.svelte", - "/match/[id=int]/+page.svelte", - "/site/+page.server.ts", - "/site/+page.svelte", - "/site/+server.ts", - "/site/[id]/+page.server.ts", - "/site/[id]/+page.svelte", - "/site_contract/+page.server.ts", - "/site_contract/[siteId]-[contractId]/+page.server.ts", - "/site_contract/[siteId]-[contractId]/+page.svelte", - "a/[...rest]/z/+page.svelte", - "anchors/+page.svelte", - "anchors/[id]/+page.svelte", - "api/graphql/+server.ts", - "data/errors/[locale].json/+server.ts", - "lay/(layVerySpecial)/+layout.svelte", - "lay/(layVerySpecial)/normal/+page.svelte", - "lay/(layVerySpecial)/root-layout/+page@.svelte", - "lay/(layVerySpecial)/skip/+page@lay.svelte", - "lay/+layout.svelte", - "page_server_woAction/+page.server.ts", - "sp/+page.svelte", - "spArray/+page.svelte", - "spArrayComma/+page.svelte", - ] - `) - }) - - it('rmvGroups with multi groups', async () => { - expect(rmvGroups('/(rootGroup)/subGroup/(anotherSub)/user')).toBe('/subGroup/user') - }) - - it('rmvGroups', async () => { - const location = routes_path() - expect(getFilesUnder(location)).toMatchInlineSnapshot(` - [ - "(rootGroup)/+page.svelte", - "(rootGroup)/subGroup/(anotherSub)/user/+page.svelte", - "(rootGroup)/subGroup/+page.svelte", - "(rootGroup)/subGroup2/+page.svelte", - "(servers)/server_func_get/+server.ts", - "(servers)/server_func_get_and_/+server.ts", - "(servers)/server_func_post/+server.ts", - "+layout.svelte", - "[[lang]]/contract/+page.svelte", - "[[lang]]/contract/+server.ts", - "[[lang]]/contract/[id]/+page.server.ts", - "[[lang]]/contract/[id]/+page.svelte", - "[[lang]]/gp/(logged)/one/+page.svelte", - "[[lang]]/gp/(public)/two/+page.svelte", - "[[lang]]/main/+page.svelte", - "[[lang]]/match/[id=ab]/+page.svelte", - "[[lang]]/match/[id=int]/+page.svelte", - "[[lang]]/site/+page.server.ts", - "[[lang]]/site/+page.svelte", - "[[lang]]/site/+server.ts", - "[[lang]]/site/[id]/+page.server.ts", - "[[lang]]/site/[id]/+page.svelte", - "[[lang]]/site_contract/+page.server.ts", - "[[lang]]/site_contract/[siteId]-[contractId]/+page.server.ts", - "[[lang]]/site_contract/[siteId]-[contractId]/+page.svelte", - "a/[...rest]/z/+page.svelte", - "anchors/+page.svelte", - "anchors/[id]/+page.svelte", - "api/graphql/+server.ts", - "data/errors/[locale].json/+server.ts", - "lay/(layVerySpecial)/+layout.svelte", - "lay/(layVerySpecial)/normal/+page.svelte", - "lay/(layVerySpecial)/root-layout/+page@.svelte", - "lay/(layVerySpecial)/skip/+page@lay.svelte", - "lay/+layout.svelte", - "page_server_woAction/+page.server.ts", - "sp/+page.svelte", - "spArray/+page.svelte", - "spArrayComma/+page.svelte", - ] - `) - - expect(getFilesUnder(location).map((c) => rmvGroups(c))).toMatchInlineSnapshot(` - [ - "/+page.svelte", - "/subGroup/user/+page.svelte", - "/subGroup/+page.svelte", - "/subGroup2/+page.svelte", - "/server_func_get/+server.ts", - "/server_func_get_and_/+server.ts", - "/server_func_post/+server.ts", - "+layout.svelte", - "[[lang]]/contract/+page.svelte", - "[[lang]]/contract/+server.ts", - "[[lang]]/contract/[id]/+page.server.ts", - "[[lang]]/contract/[id]/+page.svelte", - "[[lang]]/gp/one/+page.svelte", - "[[lang]]/gp/two/+page.svelte", - "[[lang]]/main/+page.svelte", - "[[lang]]/match/[id=ab]/+page.svelte", - "[[lang]]/match/[id=int]/+page.svelte", - "[[lang]]/site/+page.server.ts", - "[[lang]]/site/+page.svelte", - "[[lang]]/site/+server.ts", - "[[lang]]/site/[id]/+page.server.ts", - "[[lang]]/site/[id]/+page.svelte", - "[[lang]]/site_contract/+page.server.ts", - "[[lang]]/site_contract/[siteId]-[contractId]/+page.server.ts", - "[[lang]]/site_contract/[siteId]-[contractId]/+page.svelte", - "a/[...rest]/z/+page.svelte", - "anchors/+page.svelte", - "anchors/[id]/+page.svelte", - "api/graphql/+server.ts", - "data/errors/[locale].json/+server.ts", - "lay/+layout.svelte", - "lay/normal/+page.svelte", - "lay/root-layout/+page@.svelte", - "lay/skip/+page@lay.svelte", - "lay/+layout.svelte", - "page_server_woAction/+page.server.ts", - "sp/+page.svelte", - "spArray/+page.svelte", - "spArrayComma/+page.svelte", - ] - `) - }) - - it('rmvGroups & Optional', async () => { - const location = routes_path() - expect(getFilesUnder(location).map((c) => rmvGroups(rmvOptional(c)))).toMatchInlineSnapshot(` - [ - "/+page.svelte", - "/subGroup/user/+page.svelte", - "/subGroup/+page.svelte", - "/subGroup2/+page.svelte", - "/server_func_get/+server.ts", - "/server_func_get_and_/+server.ts", - "/server_func_post/+server.ts", - "+layout.svelte", - "/contract/+page.svelte", - "/contract/+server.ts", - "/contract/[id]/+page.server.ts", - "/contract/[id]/+page.svelte", - "/gp/one/+page.svelte", - "/gp/two/+page.svelte", - "/main/+page.svelte", - "/match/[id=ab]/+page.svelte", - "/match/[id=int]/+page.svelte", - "/site/+page.server.ts", - "/site/+page.svelte", - "/site/+server.ts", - "/site/[id]/+page.server.ts", - "/site/[id]/+page.svelte", - "/site_contract/+page.server.ts", - "/site_contract/[siteId]-[contractId]/+page.server.ts", - "/site_contract/[siteId]-[contractId]/+page.svelte", - "a/[...rest]/z/+page.svelte", - "anchors/+page.svelte", - "anchors/[id]/+page.svelte", - "api/graphql/+server.ts", - "data/errors/[locale].json/+server.ts", - "lay/+layout.svelte", - "lay/normal/+page.svelte", - "lay/root-layout/+page@.svelte", - "lay/skip/+page@lay.svelte", - "lay/+layout.svelte", - "page_server_woAction/+page.server.ts", - "sp/+page.svelte", - "spArray/+page.svelte", - "spArrayComma/+page.svelte", - ] - `) - }) -}) diff --git a/packages/vite-plugin-kit-routes/src/routes/[[lang]]/site/+page.server.ts b/packages/vite-plugin-kit-routes/src/routes/[[lang]]/site/+page.server.ts index 6b7506ee..dd992625 100644 --- a/packages/vite-plugin-kit-routes/src/routes/[[lang]]/site/+page.server.ts +++ b/packages/vite-plugin-kit-routes/src/routes/[[lang]]/site/+page.server.ts @@ -2,4 +2,5 @@ import type { Actions } from './$types.d.ts' export const actions = { create: async () => {}, + 'u-p-d-a-t-e': async () => {}, } satisfies Actions 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 6c53f8b6..64ba176f 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_base.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_base.ts @@ -92,6 +92,9 @@ const ACTIONS = { "create /site": (params?: { lang?: (string | number) }) => { return `${base}${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` }, + "u-p-d-a-t-e /site": (params?: { lang?: (string | number) }) => { + return `${base}${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` + }, "update /site/[id]": (params: { id: (string | number), lang?: (string | number) }) => { return `${base}${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/update` }, @@ -220,7 +223,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', '/anchors': never, '/anchors/[id]': 'id', '/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' } + ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'u-p-d-a-t-e /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 Params: { 'lang': never, 'id': never, 'siteId': never, 'contractId': never, 'rest': never, 'locale': never } } 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 5dbb39a4..c5a140ff 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 @@ -13,47 +13,49 @@ export const PAGES = { "/subGroup": `/subGroup`, "/subGroup/user": `/subGroup/user`, "/subGroup2": (params: { first: (string | number) }) => { - return `/subGroup2${appendSp({ first: params.first })}` + return `/subGroup2${appendSp({ 'first': params['first'] })}` }, "/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "/contract/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}` }, "/gp/one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "/gp/two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "/main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "/match/[id=ab]": (params: { id: (Parameters[0]), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "/match/[id=int]": (params: { id: (number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "/site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "/a/[...rest]/z": (params: { rest: (string | number)[] }) => { - return `/a/${params.rest?.join('/')}/z` + return `/a/${params['rest']?.join('/')}/z` }, - "/anchors": `/anchors`, - "/anchors/[id]": (params: { id: (string | number) }) => { - return `/anchors/${params.id}` + "/anchors": (params: { hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` + }, + "/anchors/[id]": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, @@ -71,18 +73,18 @@ export const SERVERS = { "GET /server_func_get_and_": `/server_func_get_and_`, "POST /server_func_post": `/server_func_post`, "GET /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET /api/graphql": `/api/graphql`, "POST /api/graphql": `/api/graphql`, "GET /data/errors/[locale].json": (params: { locale: (string | number) }) => { - return `/data/errors/${params.locale}.json` + return `/data/errors/${params['locale']}.json` } } @@ -91,23 +93,26 @@ export const SERVERS = { */ export const ACTIONS = { "default /contract/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}${appendSp({ 'limit': params['limit'] })}` }, "create /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update /site/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/update` }, "delete /site/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/delete` }, "noSatisfies /site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send /site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,12 +122,12 @@ export const ACTIONS = { export const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (params: { str: (string | number), s?: (number), d?: ("retro" | "identicon") }) => { - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${params.str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${params['str']}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -131,7 +136,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 +149,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -152,8 +165,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -193,7 +206,7 @@ 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', '/anchors': never, '/anchors/[id]': 'id', '/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' } + ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'u-p-d-a-t-e /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, 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, 'hash': 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 f39bae48..b3035b63 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 @@ -16,44 +16,46 @@ export const PAGES = { return `/subGroup2${appendSp({ first })}` }, "/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "/contract/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}` }, "/gp/one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "/gp/two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "/main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "/match/[id=ab]": (id: (Parameters[0]), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "/match/[id=int]": (id: (number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "/site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "/a/[...rest]/z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, - "/anchors": `/anchors`, - "/anchors/[id]": (id: (string | number), params?: { }) => { - return `/anchors/${id}` + "/anchors": (hash: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': hash })}` + }, + "/anchors/[id]": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, @@ -71,13 +73,13 @@ export const SERVERS = { "GET /server_func_get_and_": `/server_func_get_and_`, "POST /server_func_post": `/server_func_post`, "GET /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET /api/graphql": `/api/graphql`, "POST /api/graphql": `/api/graphql`, @@ -91,23 +93,26 @@ export const SERVERS = { */ export const ACTIONS = { "default /contract/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}${appendSp({ limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}${appendSp({ 'limit': params?.['limit'] })}` }, "create /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update /site/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/update` }, "delete /site/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/delete` }, "noSatisfies /site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send /site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,13 +122,13 @@ export const ACTIONS = { export const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (str: (string | number), params?: { s?: (number), d?: ("retro" | "identicon") }) => { params = params ?? {} - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${str}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -132,7 +137,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 +150,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -153,8 +166,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -194,7 +207,7 @@ 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', '/anchors': never, '/anchors/[id]': 'id', '/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' } + ACTIONS: { 'default /contract/[id]': 'lang' | 'id', 'create /site': 'lang', 'u-p-d-a-t-e /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, 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, 'hash': 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 91c6c742..3c41a065 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 @@ -13,57 +13,59 @@ export const PAGES = { "subGroup": `/subGroup`, "subGroup_user": `/subGroup/user`, "subGroup2": (params: { first: (string | number) }) => { - return `/subGroup2${appendSp({ first: params.first })}` + return `/subGroup2${appendSp({ 'first': params['first'] })}` }, "contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "contract_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}` }, "gp_one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "gp_two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "match_id_ab": (params: { id: (Parameters[0]), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "match_id_int": (params: { id: (number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "a_rest_z": (params: { rest: (string | number)[] }) => { - return `/a/${params.rest?.join('/')}/z` + return `/a/${params['rest']?.join('/')}/z` }, - "anchors": `/anchors`, - "anchors_id": (params: { id: (string | number) }) => { - return `/anchors/${params.id}` + "anchors": (params: { hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` + }, + "anchors_id": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, "lay_skip": `/lay/skip`, "sp": `/sp`, "spArray": (params: { ids: (number[]) }) => { - return `/spArray${appendSp({ ids: params.ids })}` + return `/spArray${appendSp({ 'ids': params['ids'] })}` }, "spArrayComma": (params: { ids: (number[]) }) => { - return `/spArrayComma${appendSp({ ids: String(params.ids) })}` + return `/spArrayComma${appendSp({ 'ids': String(params['ids']) })}` } } @@ -75,18 +77,18 @@ export const SERVERS = { "GET_server_func_get_and": `/server_func_get_and_`, "POST_server_func_post": `/server_func_post`, "GET_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET_site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET_api_graphql": `/api/graphql`, "POST_api_graphql": `/api/graphql`, "GET_data_errors_locale_json": (params: { locale: (string | number) }) => { - return `/data/errors/${params.locale}.json` + return `/data/errors/${params['locale']}.json` } } @@ -95,23 +97,26 @@ export const SERVERS = { */ export const ACTIONS = { "default_contract_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}${appendSp({ 'limit': params['limit'] })}` }, "create_site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e_site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update_site_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/update` }, "delete_site_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/delete` }, "noSatisfies_site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send_site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -121,12 +126,12 @@ export const ACTIONS = { export const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (params: { str: (string | number), s?: (number), d?: ("retro" | "identicon") }) => { - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${params.str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${params['str']}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -135,7 +140,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() @@ -145,7 +153,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -156,8 +169,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -197,7 +210,7 @@ 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', 'anchors': never, 'anchors_id': 'id', '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' } + ACTIONS: { 'default_contract_id': 'id' | 'lang', 'create_site': 'lang', 'u-p-d-a-t-e_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, 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, 'hash': 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 c5d97694..ac725618 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 @@ -16,44 +16,46 @@ export const PAGES = { return `/subGroup2${appendSp({ first })}` }, "contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "contract_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}` }, "gp_one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "gp_two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "match_id_ab": (id: (Parameters[0]), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "match_id_int": (id: (number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "a_rest_z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, - "anchors": `/anchors`, - "anchors_id": (id: (string | number), params?: { }) => { - return `/anchors/${id}` + "anchors": (hash: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': hash })}` + }, + "anchors_id": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, @@ -63,7 +65,7 @@ export const PAGES = { return `/spArray${appendSp({ ids })}` }, "spArrayComma": (ids: (number[]), params?: { }) => { - return `/spArrayComma${appendSp({ ids: String(ids) })}` + return `/spArrayComma${appendSp({ 'ids': String(ids) })}` } } @@ -75,13 +77,13 @@ export const SERVERS = { "GET_server_func_get_and": `/server_func_get_and_`, "POST_server_func_post": `/server_func_post`, "GET_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET_site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET_api_graphql": `/api/graphql`, "POST_api_graphql": `/api/graphql`, @@ -95,23 +97,26 @@ export const SERVERS = { */ export const ACTIONS = { "default_contract_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}${appendSp({ limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}${appendSp({ 'limit': params?.['limit'] })}` }, "create_site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e_site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update_site_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/update` }, "delete_site_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/delete` }, "noSatisfies_site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send_site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -121,13 +126,13 @@ export const ACTIONS = { export const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (str: (string | number), params?: { s?: (number), d?: ("retro" | "identicon") }) => { params = params ?? {} - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${str}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -136,7 +141,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() @@ -146,7 +154,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -157,8 +170,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -198,7 +211,7 @@ 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', 'anchors': never, 'anchors_id': 'id', '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' } + ACTIONS: { 'default_contract_id': 'lang' | 'id', 'create_site': 'lang', 'u-p-d-a-t-e_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, 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, 'hash': 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 eafa20ac..acd5e464 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 @@ -13,47 +13,49 @@ export const PAGES = { "/subGroup": `/subGroup`, "/subGroup/user": `/subGroup/user`, "/subGroup2": (params: { first: (string | number) }) => { - return `/subGroup2${appendSp({ first: params.first })}` + return `/subGroup2${appendSp({ 'first': params['first'] })}` }, "/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "/contract/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}` }, "/gp/one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "/gp/two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "/main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "/match/[id=ab]": (params: { id: (Parameters[0]), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "/match/[id=int]": (params: { id: (number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "/site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "/a/[...rest]/z": (params: { rest: (string | number)[] }) => { - return `/a/${params.rest?.join('/')}/z` + return `/a/${params['rest']?.join('/')}/z` }, - "/anchors": `/anchors`, - "/anchors/[id]": (params: { id: (string | number) }) => { - return `/anchors/${params.id}` + "/anchors": (params: { hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` + }, + "/anchors/[id]": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, @@ -71,18 +73,18 @@ export const SERVERS = { "GET /server_func_get_and_": `/server_func_get_and_`, "POST /server_func_post": `/server_func_post`, "GET /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET /api/graphql": `/api/graphql`, "POST /api/graphql": `/api/graphql`, "GET /data/errors/[locale].json": (params: { locale: (string | number) }) => { - return `/data/errors/${params.locale}.json` + return `/data/errors/${params['locale']}.json` } } @@ -91,23 +93,26 @@ export const SERVERS = { */ export const ACTIONS = { "default /contract/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}${appendSp({ 'limit': params['limit'] })}` }, "create /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update /site/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/update` }, "delete /site/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/delete` }, "noSatisfies /site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send /site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,12 +122,12 @@ export const ACTIONS = { export const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (params: { str: (string | number), s?: (number), d?: ("retro" | "identicon") }) => { - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${params.str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${params['str']}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -131,7 +136,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 +149,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -152,8 +165,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -191,7 +204,7 @@ export const routes = [ /** * To be used like this: * ```ts - * import { route } from './ROUTES' + * import { route } from '$lib/ROUTES' * * route('site_id', { id: 1 }) * ``` @@ -225,7 +238,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]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/anchors/[id]': 'id', '/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' } + ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'u-p-d-a-t-e /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, 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, 'hash': 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 5d43e44d..823f0527 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 @@ -16,44 +16,46 @@ export const PAGES = { return `/subGroup2${appendSp({ first })}` }, "/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "/contract/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}` }, "/gp/one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "/gp/two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "/main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "/match/[id=ab]": (id: (Parameters[0]), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "/match/[id=int]": (id: (number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "/site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "/a/[...rest]/z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, - "/anchors": `/anchors`, - "/anchors/[id]": (id: (string | number), params?: { }) => { - return `/anchors/${id}` + "/anchors": (hash: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': hash })}` + }, + "/anchors/[id]": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, @@ -71,13 +73,13 @@ export const SERVERS = { "GET /server_func_get_and_": `/server_func_get_and_`, "POST /server_func_post": `/server_func_post`, "GET /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET /api/graphql": `/api/graphql`, "POST /api/graphql": `/api/graphql`, @@ -91,23 +93,26 @@ export const SERVERS = { */ export const ACTIONS = { "default /contract/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}${appendSp({ limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}${appendSp({ 'limit': params?.['limit'] })}` }, "create /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update /site/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/update` }, "delete /site/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/delete` }, "noSatisfies /site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send /site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,13 +122,13 @@ export const ACTIONS = { export const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (str: (string | number), params?: { s?: (number), d?: ("retro" | "identicon") }) => { params = params ?? {} - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${str}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -132,7 +137,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 +150,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -153,8 +166,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -192,7 +205,7 @@ export const routes = [ /** * To be used like this: * ```ts - * import { route } from './ROUTES' + * import { route } from '$lib/ROUTES' * * route('site_id', { id: 1 }) * ``` @@ -226,7 +239,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]': '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, '/anchors/[id]': 'id', '/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' } + ACTIONS: { 'default /contract/[id]': 'lang' | 'id', 'create /site': 'lang', 'u-p-d-a-t-e /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, 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, 'hash': 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 7ee581fd..0f7319ab 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 @@ -13,47 +13,49 @@ export const PAGES = { "subGroup": `/subGroup`, "subGroup_user": `/subGroup/user`, "subGroup2": (params: { first: (string | number) }) => { - return `/subGroup2${appendSp({ first: params.first })}` + return `/subGroup2${appendSp({ 'first': params['first'] })}` }, "contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "contract_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}` }, "gp_one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "gp_two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "match_id_ab": (params: { id: (Parameters[0]), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "match_id_int": (params: { id: (number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "a_rest_z": (params: { rest: (string | number)[] }) => { - return `/a/${params.rest?.join('/')}/z` + return `/a/${params['rest']?.join('/')}/z` }, - "anchors": `/anchors`, - "anchors_id": (params: { id: (string | number) }) => { - return `/anchors/${params.id}` + "anchors": (params: { hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` + }, + "anchors_id": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, @@ -71,18 +73,18 @@ export const SERVERS = { "GET server_func_get_and": `/server_func_get_and_`, "POST server_func_post": `/server_func_post`, "GET contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET api_graphql": `/api/graphql`, "POST api_graphql": `/api/graphql`, "GET data_errors_locale_json": (params: { locale: (string | number) }) => { - return `/data/errors/${params.locale}.json` + return `/data/errors/${params['locale']}.json` } } @@ -91,23 +93,26 @@ export const SERVERS = { */ export const ACTIONS = { "default contract_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}${appendSp({ 'limit': params['limit'] })}` }, "create site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update site_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/update` }, "delete site_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/delete` }, "noSatisfies site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,12 +122,12 @@ export const ACTIONS = { export const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (params: { str: (string | number), s?: (number), d?: ("retro" | "identicon") }) => { - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${params.str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${params['str']}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -131,7 +136,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 +149,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -152,8 +165,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -191,7 +204,7 @@ export const routes = [ /** * To be used like this: * ```ts - * import { route } from './ROUTES' + * import { route } from '$lib/ROUTES' * * route('site_id', { id: 1 }) * ``` @@ -225,7 +238,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', 'anchors': never, 'anchors_id': 'id', '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' } + ACTIONS: { 'default contract_id': 'id' | 'lang', 'create site': 'lang', 'u-p-d-a-t-e 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, 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, 'hash': 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_shortened.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-and-object-symbol_shortened.ts index 5e60834a..ccc1de27 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 @@ -16,44 +16,46 @@ export const PAGES = { return `/subGroup2${appendSp({ first })}` }, "contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "contract_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}` }, "gp_one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "gp_two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "match_id_ab": (id: (Parameters[0]), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "match_id_int": (id: (number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "a_rest_z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, - "anchors": `/anchors`, - "anchors_id": (id: (string | number), params?: { }) => { - return `/anchors/${id}` + "anchors": (hash: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': hash })}` + }, + "anchors_id": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, @@ -71,13 +73,13 @@ export const SERVERS = { "GET server_func_get_and": `/server_func_get_and_`, "POST server_func_post": `/server_func_post`, "GET contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET api_graphql": `/api/graphql`, "POST api_graphql": `/api/graphql`, @@ -91,23 +93,26 @@ export const SERVERS = { */ export const ACTIONS = { "default contract_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}${appendSp({ limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}${appendSp({ 'limit': params?.['limit'] })}` }, "create site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update site_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/update` }, "delete site_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/delete` }, "noSatisfies site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,13 +122,13 @@ export const ACTIONS = { export const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (str: (string | number), params?: { s?: (number), d?: ("retro" | "identicon") }) => { params = params ?? {} - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${str}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -132,7 +137,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 +150,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -153,8 +166,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -192,7 +205,7 @@ export const routes = [ /** * To be used like this: * ```ts - * import { route } from './ROUTES' + * import { route } from '$lib/ROUTES' * * route('site_id', { id: 1 }) * ``` @@ -226,7 +239,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', 'anchors': never, 'anchors_id': 'id', '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' } + ACTIONS: { 'default contract_id': 'lang' | 'id', 'create site': 'lang', 'u-p-d-a-t-e 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, 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, 'hash': 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.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-path-page-route-id.ts index 571eaf37..f211b22c 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 @@ -13,47 +13,49 @@ const PAGES = { "/(rootGroup)/subGroup": `/subGroup`, "/(rootGroup)/subGroup/(anotherSub)/user": `/subGroup/user`, "/(rootGroup)/subGroup2": (params: { first: (string | number) }) => { - return `/subGroup2${appendSp({ first: params.first })}` + return `/subGroup2${appendSp({ 'first': params['first'] })}` }, "/[[lang]]/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "/[[lang]]/contract/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}` }, "/[[lang]]/gp/(logged)/one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "/[[lang]]/gp/(public)/two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "/[[lang]]/main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "/[[lang]]/match/[id=ab]": (params: { id: (Parameters[0]), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "/[[lang]]/match/[id=int]": (params: { id: (number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "/[[lang]]/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "/[[lang]]/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "/[[lang]]/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "/[[lang]]/site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "/a/[...rest]/z": (params: { rest: (string | number)[] }) => { - return `/a/${params.rest?.join('/')}/z` + return `/a/${params['rest']?.join('/')}/z` }, - "/anchors": `/anchors`, - "/anchors/[id]": (params: { id: (string | number) }) => { - return `/anchors/${params.id}` + "/anchors": (params: { hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` + }, + "/anchors/[id]": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "/lay/(layVerySpecial)/normal": `/lay/normal`, "/lay/(layVerySpecial)/root-layout": `/lay/root-layout`, @@ -71,18 +73,18 @@ const SERVERS = { "GET /(servers)/server_func_get_and_": `/server_func_get_and_`, "POST /(servers)/server_func_post": `/server_func_post`, "GET /[[lang]]/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST /[[lang]]/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET /[[lang]]/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET /api/graphql": `/api/graphql`, "POST /api/graphql": `/api/graphql`, "GET /data/errors/[locale].json": (params: { locale: (string | number) }) => { - return `/data/errors/${params.locale}.json` + return `/data/errors/${params['locale']}.json` } } @@ -91,23 +93,26 @@ const SERVERS = { */ const ACTIONS = { "default /[[lang]]/contract/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}${appendSp({ 'limit': params['limit'] })}` }, "create /[[lang]]/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e /[[lang]]/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update /[[lang]]/site/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/update` }, "delete /[[lang]]/site/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/delete` }, "noSatisfies /[[lang]]/site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send /[[lang]]/site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,12 +122,12 @@ const ACTIONS = { const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (params: { str: (string | number), s?: (number), d?: ("retro" | "identicon") }) => { - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${params.str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${params['str']}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -131,7 +136,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 +149,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -152,8 +165,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -191,7 +204,7 @@ export const routes = [ /** * To be used like this: * ```ts - * import { route } from './ROUTES' + * import { route } from '$lib/ROUTES' * * route('site_id', { id: 1 }) * ``` @@ -225,7 +238,7 @@ 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', '/anchors': never, '/anchors/[id]': 'id', '/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' } + ACTIONS: { 'default /[[lang]]/contract/[id]': 'id' | 'lang', 'create /[[lang]]/site': 'lang', 'u-p-d-a-t-e /[[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, 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, 'hash': 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 d075224f..4b9d238f 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 @@ -16,44 +16,46 @@ const PAGES = { return `/subGroup2${appendSp({ first })}` }, "/[[lang]]/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "/[[lang]]/contract/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}` }, "/[[lang]]/gp/(logged)/one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "/[[lang]]/gp/(public)/two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "/[[lang]]/main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "/[[lang]]/match/[id=ab]": (id: (Parameters[0]), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "/[[lang]]/match/[id=int]": (id: (number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "/[[lang]]/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "/[[lang]]/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "/[[lang]]/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "/[[lang]]/site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "/a/[...rest]/z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, - "/anchors": `/anchors`, - "/anchors/[id]": (id: (string | number), params?: { }) => { - return `/anchors/${id}` + "/anchors": (hash: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': hash })}` + }, + "/anchors/[id]": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "/lay/(layVerySpecial)/normal": `/lay/normal`, "/lay/(layVerySpecial)/root-layout": `/lay/root-layout`, @@ -71,13 +73,13 @@ const SERVERS = { "GET /(servers)/server_func_get_and_": `/server_func_get_and_`, "POST /(servers)/server_func_post": `/server_func_post`, "GET /[[lang]]/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST /[[lang]]/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET /[[lang]]/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET /api/graphql": `/api/graphql`, "POST /api/graphql": `/api/graphql`, @@ -91,23 +93,26 @@ const SERVERS = { */ const ACTIONS = { "default /[[lang]]/contract/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}${appendSp({ limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}${appendSp({ 'limit': params?.['limit'] })}` }, "create /[[lang]]/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e /[[lang]]/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update /[[lang]]/site/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/update` }, "delete /[[lang]]/site/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/delete` }, "noSatisfies /[[lang]]/site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send /[[lang]]/site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,13 +122,13 @@ const ACTIONS = { const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (str: (string | number), params?: { s?: (number), d?: ("retro" | "identicon") }) => { params = params ?? {} - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${str}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -132,7 +137,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 +150,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -153,8 +166,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -192,7 +205,7 @@ export const routes = [ /** * To be used like this: * ```ts - * import { route } from './ROUTES' + * import { route } from '$lib/ROUTES' * * route('site_id', { id: 1 }) * ``` @@ -226,7 +239,7 @@ 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', '/anchors': never, '/anchors/[id]': 'id', '/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' } + ACTIONS: { 'default /[[lang]]/contract/[id]': 'lang' | 'id', 'create /[[lang]]/site': 'lang', 'u-p-d-a-t-e /[[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, 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, 'hash': 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 8940bb9f..a39552b1 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 @@ -13,47 +13,49 @@ const PAGES = { "/subGroup": `/subGroup`, "/subGroup/user": `/subGroup/user`, "/subGroup2": (params: { first: (string | number) }) => { - return `/subGroup2${appendSp({ first: params.first })}` + return `/subGroup2${appendSp({ 'first': params['first'] })}` }, "/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "/contract/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}` }, "/gp/one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "/gp/two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "/main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "/match/[id=ab]": (params: { id: (Parameters[0]), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "/match/[id=int]": (params: { id: (number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "/site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "/a/[...rest]/z": (params: { rest: (string | number)[] }) => { - return `/a/${params.rest?.join('/')}/z` + return `/a/${params['rest']?.join('/')}/z` }, - "/anchors": `/anchors`, - "/anchors/[id]": (params: { id: (string | number) }) => { - return `/anchors/${params.id}` + "/anchors": (params: { hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` + }, + "/anchors/[id]": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, @@ -71,18 +73,18 @@ const SERVERS = { "GET /server_func_get_and_": `/server_func_get_and_`, "POST /server_func_post": `/server_func_post`, "GET /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET /api/graphql": `/api/graphql`, "POST /api/graphql": `/api/graphql`, "GET /data/errors/[locale].json": (params: { locale: (string | number) }) => { - return `/data/errors/${params.locale}.json` + return `/data/errors/${params['locale']}.json` } } @@ -91,23 +93,26 @@ const SERVERS = { */ const ACTIONS = { "default /contract/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}${appendSp({ 'limit': params['limit'] })}` }, "create /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update /site/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/update` }, "delete /site/[id]": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/delete` }, "noSatisfies /site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send /site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,12 +122,12 @@ const ACTIONS = { const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (params: { str: (string | number), s?: (number), d?: ("retro" | "identicon") }) => { - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${params.str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${params['str']}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -131,7 +136,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 +149,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -152,8 +165,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -191,7 +204,7 @@ export const routes = [ /** * To be used like this: * ```ts - * import { route } from './ROUTES' + * import { route } from '$lib/ROUTES' * * route('site_id', { id: 1 }) * ``` @@ -225,7 +238,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]': 'lang' | 'id', '/site_contract/[siteId]-[contractId]': 'siteId' | 'contractId' | 'lang', '/a/[...rest]/z': 'rest', '/anchors': never, '/anchors/[id]': 'id', '/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' } + ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'u-p-d-a-t-e /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, 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, 'hash': 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 2bc55c0b..ae05f9c9 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 @@ -16,44 +16,46 @@ const PAGES = { return `/subGroup2${appendSp({ first })}` }, "/contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "/contract/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}` }, "/gp/one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "/gp/two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "/main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "/match/[id=ab]": (id: (Parameters[0]), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "/match/[id=int]": (id: (number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "/site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "/site/[id]": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "/site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "/a/[...rest]/z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, - "/anchors": `/anchors`, - "/anchors/[id]": (id: (string | number), params?: { }) => { - return `/anchors/${id}` + "/anchors": (hash: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': hash })}` + }, + "/anchors/[id]": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "/lay/normal": `/lay/normal`, "/lay/root-layout": `/lay/root-layout`, @@ -71,13 +73,13 @@ const SERVERS = { "GET /server_func_get_and_": `/server_func_get_and_`, "POST /server_func_post": `/server_func_post`, "GET /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST /contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET /api/graphql": `/api/graphql`, "POST /api/graphql": `/api/graphql`, @@ -91,23 +93,26 @@ const SERVERS = { */ const ACTIONS = { "default /contract/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}${appendSp({ limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}${appendSp({ 'limit': params?.['limit'] })}` }, "create /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e /site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update /site/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/update` }, "delete /site/[id]": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/delete` }, "noSatisfies /site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send /site_contract/[siteId]-[contractId]": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,13 +122,13 @@ const ACTIONS = { const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (str: (string | number), params?: { s?: (number), d?: ("retro" | "identicon") }) => { params = params ?? {} - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${str}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -132,7 +137,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 +150,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -153,8 +166,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -192,7 +205,7 @@ export const routes = [ /** * To be used like this: * ```ts - * import { route } from './ROUTES' + * import { route } from '$lib/ROUTES' * * route('site_id', { id: 1 }) * ``` @@ -226,7 +239,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]': '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, '/anchors/[id]': 'id', '/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' } + ACTIONS: { 'default /contract/[id]': 'lang' | 'id', 'create /site': 'lang', 'u-p-d-a-t-e /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, 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, 'hash': 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 450717f1..fe26dd0d 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 @@ -13,47 +13,49 @@ const PAGES = { "subGroup": `/subGroup`, "subGroup_user": `/subGroup/user`, "subGroup2": (params: { first: (string | number) }) => { - return `/subGroup2${appendSp({ first: params.first })}` + return `/subGroup2${appendSp({ 'first': params['first'] })}` }, "contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "contract_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}` }, "gp_one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "gp_two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "match_id_ab": (params: { id: (Parameters[0]), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "match_id_int": (params: { id: (number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` }, "site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "a_rest_z": (params: { rest: (string | number)[] }) => { - return `/a/${params.rest?.join('/')}/z` + return `/a/${params['rest']?.join('/')}/z` }, - "anchors": `/anchors`, - "anchors_id": (params: { id: (string | number) }) => { - return `/anchors/${params.id}` + "anchors": (params: { hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` + }, + "anchors_id": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, @@ -71,18 +73,18 @@ const SERVERS = { "GET server_func_get_and": `/server_func_get_and_`, "POST server_func_post": `/server_func_post`, "GET contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET api_graphql": `/api/graphql`, "POST api_graphql": `/api/graphql`, "GET data_errors_locale_json": (params: { locale: (string | number) }) => { - return `/data/errors/${params.locale}.json` + return `/data/errors/${params['locale']}.json` } } @@ -91,23 +93,26 @@ const SERVERS = { */ const ACTIONS = { "default contract_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}${appendSp({ 'limit': params['limit'] })}` }, "create site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update site_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/update` }, "delete site_id": (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/delete` }, "noSatisfies site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,12 +122,12 @@ const ACTIONS = { const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (params: { str: (string | number), s?: (number), d?: ("retro" | "identicon") }) => { - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${params.str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${params['str']}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -131,7 +136,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 +149,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -152,8 +165,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -191,7 +204,7 @@ export const routes = [ /** * To be used like this: * ```ts - * import { route } from './ROUTES' + * import { route } from '$lib/ROUTES' * * route('site_id', { id: 1 }) * ``` @@ -225,7 +238,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', 'anchors': never, 'anchors_id': 'id', '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' } + ACTIONS: { 'default contract_id': 'id' | 'lang', 'create site': 'lang', 'u-p-d-a-t-e 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, 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, 'hash': 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_shortened.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-route-symbol_shortened.ts index 4d30e795..8ee5bf42 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 @@ -16,44 +16,46 @@ const PAGES = { return `/subGroup2${appendSp({ first })}` }, "contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` }, "contract_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}` }, "gp_one": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` }, "gp_two": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` }, "main": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` }, "match_id_ab": (id: (Parameters[0]), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "match_id_int": (id: (number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` }, "site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` }, - "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { + "site_id": (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` }, "site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` }, "a_rest_z": (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` }, - "anchors": `/anchors`, - "anchors_id": (id: (string | number), params?: { }) => { - return `/anchors/${id}` + "anchors": (hash: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': hash })}` + }, + "anchors_id": (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` }, "lay_normal": `/lay/normal`, "lay_root_layout": `/lay/root-layout`, @@ -71,13 +73,13 @@ const SERVERS = { "GET server_func_get_and": `/server_func_get_and_`, "POST server_func_post": `/server_func_post`, "GET contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "POST contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` }, "GET site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` }, "GET api_graphql": `/api/graphql`, "POST api_graphql": `/api/graphql`, @@ -91,23 +93,26 @@ const SERVERS = { */ const ACTIONS = { "default contract_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}${appendSp({ limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}${appendSp({ 'limit': params?.['limit'] })}` }, "create site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` + }, + "u-p-d-a-t-e site": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` }, "update site_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/update` }, "delete site_id": (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/delete` }, "noSatisfies site_contract": (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` }, "send site_contract_siteId_contractId": (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } } @@ -117,13 +122,13 @@ const ACTIONS = { const LINKS = { "twitter": `https://twitter.com/jycouet`, "twitter_post": (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` }, "gravatar": (str: (string | number), params?: { s?: (number), d?: ("retro" | "identicon") }) => { params = params ?? {} - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${str}${appendSp({ 's': params['s'], 'd': params['d'] })}` } } @@ -132,7 +137,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 +150,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -153,8 +166,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -192,7 +205,7 @@ export const routes = [ /** * To be used like this: * ```ts - * import { route } from './ROUTES' + * import { route } from '$lib/ROUTES' * * route('site_id', { id: 1 }) * ``` @@ -226,7 +239,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', 'anchors': never, 'anchors_id': 'id', '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' } + ACTIONS: { 'default contract_id': 'lang' | 'id', 'create site': 'lang', 'u-p-d-a-t-e 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, 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, 'hash': 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.ts b/packages/vite-plugin-kit-routes/src/test/ROUTES_format-variables.ts index 85669737..bcde46b3 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 @@ -12,57 +12,59 @@ export const PAGE__ROOT = `/` export const PAGE_subGroup = `/subGroup` export const PAGE_subGroup_user = `/subGroup/user` export const PAGE_subGroup2 = (params: { first: (string | number) }) => { - return `/subGroup2${appendSp({ first: params.first })}` + return `/subGroup2${appendSp({ 'first': params['first'] })}` } export const PAGE_contract = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` } export const PAGE_contract_id = (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}` } export const PAGE_gp_one = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` } export const PAGE_gp_two = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` } export const PAGE_main = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` } export const PAGE_match_id_ab = (params: { id: (Parameters[0]), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` } export const PAGE_match_id_int = (params: { id: (number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${params.id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${params['id']}` } export const PAGE_site = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` } -export const PAGE_site_id = (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { +export const PAGE_site_id = (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` } export const PAGE_site_contract_siteId_contractId = (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` } export const PAGE_a_rest_z = (params: { rest: (string | number)[] }) => { - return `/a/${params.rest?.join('/')}/z` + return `/a/${params['rest']?.join('/')}/z` } -export const PAGE_anchors = `/anchors` -export const PAGE_anchors_id = (params: { id: (string | number) }) => { - return `/anchors/${params.id}` +export const PAGE_anchors = (params: { hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` +} +export const PAGE_anchors_id = (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` } export const PAGE_lay_normal = `/lay/normal` export const PAGE_lay_root_layout = `/lay/root-layout` export const PAGE_lay_skip = `/lay/skip` export const PAGE_sp = `/sp` export const PAGE_spArray = (params: { ids: (number[]) }) => { - return `/spArray${appendSp({ ids: params.ids })}` + return `/spArray${appendSp({ 'ids': params['ids'] })}` } export const PAGE_spArrayComma = (params: { ids: (number[]) }) => { - return `/spArrayComma${appendSp({ ids: String(params.ids) })}` + return `/spArrayComma${appendSp({ 'ids': String(params['ids']) })}` } /** @@ -72,41 +74,44 @@ export const SERVER_GET_server_func_get = `/server_func_get` export const SERVER_GET_server_func_get_and = `/server_func_get_and_` export const SERVER_POST_server_func_post = `/server_func_post` export const SERVER_GET_contract = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` } export const SERVER_POST_contract = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` } export const SERVER_GET_site = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` } export const SERVER_GET_api_graphql = `/api/graphql` export const SERVER_POST_api_graphql = `/api/graphql` export const SERVER_GET_data_errors_locale_json = (params: { locale: (string | number) }) => { - return `/data/errors/${params.locale}.json` + return `/data/errors/${params['locale']}.json` } /** * ACTIONS */ export const ACTION_default_contract_id = (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${params.id}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${params['id']}${appendSp({ 'limit': params['limit'] })}` } export const ACTION_create_site = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` +} +export const ACTION_u_p_d_a_t_e_site = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` } export const ACTION_update_site_id = (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/update` } export const ACTION_delete_site_id = (params: { id: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/delete` } export const ACTION_noSatisfies_site_contract = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` } export const ACTION_send_site_contract_siteId_contractId = (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } /** @@ -114,12 +119,12 @@ export const ACTION_send_site_contract_siteId_contractId = (params: { siteId: (s */ export const LINK_twitter = `https://twitter.com/jycouet` export const LINK_twitter_post = (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` } export const LINK_gravatar = (params: { str: (string | number), s?: (number), d?: ("retro" | "identicon") }) => { - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${params.str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${params['str']}${appendSp({ 's': params['s'], 'd': params['d'] })}` } type ParamValue = string | number | undefined @@ -127,7 +132,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 +145,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -148,8 +161,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -189,7 +202,7 @@ 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', 'anchors': never, 'anchors_id': 'id', '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' } + ACTIONS: { 'default_contract_id': 'id' | 'lang', 'create_site': 'lang', 'u-p-d-a-t-e_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, 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, 'hash': 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 6f46120b..58465330 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 @@ -15,44 +15,46 @@ export const PAGE_subGroup2 = (first: (string | number), params?: { }) => { return `/subGroup2${appendSp({ first })}` } export const PAGE_contract = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract${appendSp(sp)}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract${appendSp(sp)}` } export const PAGE_contract_id = (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}` } export const PAGE_gp_one = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/one` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/one` } export const PAGE_gp_two = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/gp/two` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/gp/two` } export const PAGE_main = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/main` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/main` } export const PAGE_match_id_ab = (id: (Parameters[0]), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` } export const PAGE_match_id_int = (id: (number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/match/${id}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/match/${id}` } export const PAGE_site = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }, sp?: Record) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site${appendSp({ ...sp, limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site${appendSp({ ...sp, 'limit': params?.['limit'] })}` } -export const PAGE_site_id = (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string) }) => { +export const PAGE_site_id = (params?: { lang?: ('fr' | 'hu' | undefined), id?: (string), limit?: (number), demo?: (string), 'da-sh'?: (string) }) => { params = params ?? {} - params.lang = params.lang ?? "fr"; - params.id = params.id ?? "Vienna"; - return `${params?.lang ? `/${params?.lang}`: ''}/site/${params.id}${appendSp({ limit: params.limit, demo: params.demo })}` + params['lang'] = params['lang'] ?? "fr"; + params['id'] = params['id'] ?? "Vienna"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}${appendSp({ 'limit': params['limit'], 'demo': params['demo'], 'da-sh': params['da-sh'] })}` } export const PAGE_site_contract_siteId_contractId = (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}${appendSp({ limit: params.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}${appendSp({ 'limit': params['limit'] })}` } export const PAGE_a_rest_z = (rest: (string | number)[], params?: { }) => { return `/a/${rest?.join('/')}/z` } -export const PAGE_anchors = `/anchors` -export const PAGE_anchors_id = (id: (string | number), params?: { }) => { - return `/anchors/${id}` +export const PAGE_anchors = (hash: ("section0" | "section1" | "section2" | "section3"), params?: { }) => { + return `/anchors${appendSp({ '__KIT_ROUTES_ANCHOR__': hash })}` +} +export const PAGE_anchors_id = (params: { id: (string | number), hash: ("section0" | "section1" | "section2" | "section3") }) => { + return `/anchors/${params['id']}${appendSp({ '__KIT_ROUTES_ANCHOR__': params['hash'] })}` } export const PAGE_lay_normal = `/lay/normal` export const PAGE_lay_root_layout = `/lay/root-layout` @@ -62,7 +64,7 @@ export const PAGE_spArray = (ids: (number[]), params?: { }) => { return `/spArray${appendSp({ ids })}` } export const PAGE_spArrayComma = (ids: (number[]), params?: { }) => { - return `/spArrayComma${appendSp({ ids: String(ids) })}` + return `/spArrayComma${appendSp({ 'ids': String(ids) })}` } /** @@ -72,13 +74,13 @@ export const SERVER_GET_server_func_get = `/server_func_get` export const SERVER_GET_server_func_get_and = `/server_func_get_and_` export const SERVER_POST_server_func_post = `/server_func_post` export const SERVER_GET_contract = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` } export const SERVER_POST_contract = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract` } export const SERVER_GET_site = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site` } export const SERVER_GET_api_graphql = `/api/graphql` export const SERVER_POST_api_graphql = `/api/graphql` @@ -90,23 +92,26 @@ export const SERVER_GET_data_errors_locale_json = (locale: (string | number), pa * ACTIONS */ export const ACTION_default_contract_id = (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string), limit?: (number) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/contract/${id}${appendSp({ limit: params?.limit })}` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/contract/${id}${appendSp({ 'limit': params?.['limit'] })}` } export const ACTION_create_site = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site?/create` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` +} +export const ACTION_u_p_d_a_t_e_site = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` } export const ACTION_update_site_id = (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/update` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/update` } export const ACTION_delete_site_id = (id: (string | number), params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site/${id}?/delete` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${id}?/delete` } export const ACTION_noSatisfies_site_contract = (params?: { lang?: ('fr' | 'en' | 'hu' | 'at' | string) }) => { - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract?/noSatisfies` + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract?/noSatisfies` } export const ACTION_send_site_contract_siteId_contractId = (params: { siteId: (string | number), contractId: (string | number), lang?: ('fr' | 'en' | 'hu' | 'at' | string), extra?: ('A' | 'B') }) => { - params.extra = params.extra ?? "A"; - return `${params?.lang ? `/${params?.lang}`: ''}/site_contract/${params.siteId}-${params.contractId}?/send${appendSp({ extra: params.extra }, '&')}` + params['extra'] = params['extra'] ?? "A"; + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site_contract/${params['siteId']}-${params['contractId']}?/send${appendSp({ 'extra': params['extra'] }, '&')}` } /** @@ -114,13 +119,13 @@ export const ACTION_send_site_contract_siteId_contractId = (params: { siteId: (s */ export const LINK_twitter = `https://twitter.com/jycouet` export const LINK_twitter_post = (params: { name: (string | number), id: (string | number) }) => { - return `https://twitter.com/${params.name}/status/${params.id}` + return `https://twitter.com/${params['name']}/status/${params['id']}` } export const LINK_gravatar = (str: (string | number), params?: { s?: (number), d?: ("retro" | "identicon") }) => { params = params ?? {} - params.s = params.s ?? 75; - params.d = params.d ?? "identicon"; - return `https://www.gravatar.com/avatar/${str}${appendSp({ s: params.s, d: params.d })}` + params['s'] = params['s'] ?? 75; + params['d'] = params['d'] ?? "identicon"; + return `https://www.gravatar.com/avatar/${str}${appendSp({ 's': params['s'], 'd': params['d'] })}` } type ParamValue = string | number | undefined @@ -128,7 +133,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 +146,12 @@ export const appendSp = (sp?: Record, prefix: } } + let anchor = '' for (const [name, val] of Object.entries(sp)) { + if (name === '__KIT_ROUTES_ANCHOR__' && val !== undefined) { + anchor = `#${val}` + continue + } if (Array.isArray(val)) { for (const v of val) { append(name, v) @@ -149,8 +162,8 @@ export const appendSp = (sp?: Record, prefix: } const formatted = params.toString() - if (formatted) { - return `${prefix}${formatted}` + if (formatted || anchor) { + return `${prefix}${formatted}${anchor}`.replace('?#', '#') } return '' } @@ -190,7 +203,7 @@ 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', 'anchors': never, 'anchors_id': 'id', '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' } + ACTIONS: { 'default_contract_id': 'lang' | 'id', 'create_site': 'lang', 'u-p-d-a-t-e_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, 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, 'hash': 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 f299c871..94741b4e 100644 --- a/packages/vite-plugin-kit-routes/src/test/ROUTES_hash.ts +++ b/packages/vite-plugin-kit-routes/src/test/ROUTES_hash.ts @@ -91,6 +91,9 @@ const ACTIONS = { "create /site": (params?: { lang?: (string | number) }) => { return `#${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` }, + "u-p-d-a-t-e /site": (params?: { lang?: (string | number) }) => { + return `#${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` + }, "update /site/[id]": (params: { id: (string | number), lang?: (string | number) }) => { return `#${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/update` }, @@ -219,7 +222,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', '/anchors': never, '/anchors/[id]': 'id', '/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' } + ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'u-p-d-a-t-e /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 Params: { 'lang': never, 'id': never, 'siteId': never, 'contractId': never, 'rest': never, 'locale': never } } 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 fe9d466b..71fd8649 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 @@ -91,6 +91,9 @@ const ACTIONS = { "create /site": (params?: { lang?: (string | number) }) => { return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/create` }, + "u-p-d-a-t-e /site": (params?: { lang?: (string | number) }) => { + return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site?/u-p-d-a-t-e` + }, "update /site/[id]": (params: { id: (string | number), lang?: (string | number) }) => { return `${params?.['lang'] ? `/${params?.['lang']}`: ''}/site/${params['id']}?/update` }, @@ -219,7 +222,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', '/anchors': never, '/anchors/[id]': 'id', '/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' } + ACTIONS: { 'default /contract/[id]': 'id' | 'lang', 'create /site': 'lang', 'u-p-d-a-t-e /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 Params: { 'lang': never, 'id': never, 'siteId': never, 'contractId': never, 'rest': never, 'locale': never } } diff --git a/packages/vite-plugin-kit-routes/vite.config.ts b/packages/vite-plugin-kit-routes/vite.config.ts index 2d071086..ac3caff5 100644 --- a/packages/vite-plugin-kit-routes/vite.config.ts +++ b/packages/vite-plugin-kit-routes/vite.config.ts @@ -1,5 +1,5 @@ import { sveltekit } from '@sveltejs/kit/vite' -import { defineConfig } from 'vite' +import { defineConfig } from 'vitest/config' import type { KIT_ROUTES } from '$lib/ROUTES.js' @@ -141,4 +141,7 @@ export default defineConfig({ }, }), ], + test: { + include: ['src/**/*.spec.ts'], + }, })