From 00d35d498c3521f4d5d239709728ad292ccb0a44 Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Tue, 1 Oct 2024 08:37:14 -0400 Subject: [PATCH 01/15] fix: router typegen variable naming --- .../plugins/vite-plugin-fs-router-typegen.ts | 100 ++++++++---------- 1 file changed, 43 insertions(+), 57 deletions(-) diff --git a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts index 73dd33d9f..b29bca851 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts @@ -6,49 +6,29 @@ import { joinPath } from '../utils/path.js'; const SRC_PAGES = 'pages'; +const invalidCharRegex = /[^0-9a-zA-Z_$]/g; const srcToName = (src: string) => { - const split = src - .split('/') - .map((part) => part[0]!.toUpperCase() + part.slice(1)); - - if (split.at(-1) === '_layout.tsx') { - return split.slice(0, -1).join('') + '_Layout'; - } else if (split.at(-1) === 'index.tsx') { - return split.slice(0, -1).join('') + 'Index'; - } else if (split.at(-1)?.startsWith('[...')) { - const fileName = split - .at(-1)! - .replace('-', '_') - .replace('.tsx', '') - .replace('[...', '') - .replace(']', ''); - return ( - split.slice(0, -1).join('') + - 'Wild' + - fileName[0]!.toUpperCase() + - fileName.slice(1) - ); - } else if (split.at(-1)?.startsWith('[')) { - const fileName = split - .at(-1)! - .replace('-', '_') - .replace('.tsx', '') - .replace('[', '') - .replace(']', ''); - return ( - split.slice(0, -1).join('') + - 'Slug' + - fileName[0]!.toUpperCase() + - fileName.slice(1) - ); - } else { - const fileName = split.at(-1)!.replace('-', '_').replace('.tsx', ''); - return ( - split.slice(0, -1).join('') + - fileName[0]!.toUpperCase() + - fileName.slice(1) - ); - } + const split = src.split('/'); + const filename = split + .at(-1)! + .replace(/.tsx$/, '') + .replace(invalidCharRegex, '') + .replace('_layout', 'Layout'); + const entryPath = + split.length > 1 + ? split.slice(0, -1).map((part) => { + let _part = part; + if (_part.startsWith('[...')) { + _part = 'Wild_' + _part; + } + if (_part[0] === '[') { + _part = 'Slug_' + _part; + } + _part = _part.replace(invalidCharRegex, ''); + return _part[0]!.toUpperCase() + _part.slice(1); + }) + : []; + return entryPath.join('') + filename[0]!.toUpperCase() + filename.slice(1); }; export const fsRouterTypegenPlugin = (opts: { srcDir: string }): Plugin => { @@ -91,20 +71,26 @@ export const fsRouterTypegenPlugin = (opts: { srcDir: string }): Plugin => { } // Recursively collect `.tsx` files in the given directory - const collectFiles = async (dir: string): Promise => { - if (!pagesDir) return []; - const results: string[] = []; - const files = await readdir(dir, { - withFileTypes: true, - recursive: true, - }); - - for (const file of files) { - if (file.name.endsWith('.tsx')) { - results.push('/' + file.name); + const collectFiles = async ( + dir: string, + cwd: string = '', + files: string[] = [], + ): Promise => { + if (!cwd) { + cwd = dir; + } + const entries = await readdir(cwd, { withFileTypes: true }); + for (const entry of entries) { + const fullPath = joinPath(cwd, entry.name); + if (entry.isDirectory()) { + await collectFiles(dir, fullPath, files); + } else { + if (entry.name.endsWith('.tsx')) { + files.push(fullPath.slice(dir.length)); + } } } - return results; + return files; }; const fileExportsGetConfig = (filePath: string) => { @@ -124,14 +110,14 @@ export const fsRouterTypegenPlugin = (opts: { srcDir: string }): Plugin => { const src = filePath.slice(1); const hasGetConfig = fileExportsGetConfig(filePath); - if (filePath === '/_layout.tsx') { + if (filePath.endsWith('/_layout.tsx')) { fileInfo.push({ type: 'layout', path: filePath.replace('_layout.tsx', ''), src, hasGetConfig, }); - } else if (filePath === '/index.tsx') { + } else if (filePath.endsWith('/index.tsx')) { fileInfo.push({ type: 'page', path: filePath.replace('index.tsx', ''), @@ -164,7 +150,7 @@ import type { PathsForPages } from 'waku/router';\n\n`; } result += `]); - + declare module 'waku/router' { interface RouteConfig { paths: PathsForPages; From e7dfef7b7e983e26e6e467d9410d0efc08470c1c Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Tue, 1 Oct 2024 22:34:03 -0400 Subject: [PATCH 02/15] Improve module name generation. Add unit tests --- .../plugins/vite-plugin-fs-router-typegen.ts | 70 ++++++++++++------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts index b29bca851..47a5d129b 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts @@ -3,33 +3,49 @@ import { readdir, writeFile } from 'node:fs/promises'; import { existsSync, readFileSync } from 'node:fs'; import { SRC_ENTRIES, EXTENSIONS } from '../constants.js'; import { joinPath } from '../utils/path.js'; +import crypto from 'node:crypto'; const SRC_PAGES = 'pages'; -const invalidCharRegex = /[^0-9a-zA-Z_$]/g; -const srcToName = (src: string) => { - const split = src.split('/'); - const filename = split - .at(-1)! - .replace(/.tsx$/, '') - .replace(invalidCharRegex, '') - .replace('_layout', 'Layout'); - const entryPath = - split.length > 1 - ? split.slice(0, -1).map((part) => { - let _part = part; - if (_part.startsWith('[...')) { - _part = 'Wild_' + _part; - } - if (_part[0] === '[') { - _part = 'Slug_' + _part; - } - _part = _part.replace(invalidCharRegex, ''); - return _part[0]!.toUpperCase() + _part.slice(1); - }) - : []; - return entryPath.join('') + filename[0]!.toUpperCase() + filename.slice(1); -}; +// https://tc39.es/ecma262/multipage/ecmascript-language-lexical-grammar.html#sec-names-and-keywords +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#reserved_words +export function toIdentifier(input: string): string { + // Strip the file extension + let identifier = input.includes('.') ? input.split('.').slice(0, -1).join('.') : input; + // Replace any characters besides letters, numbers, underscores, and dollar signs with underscores + identifier = identifier.replace(/[^\p{L}\p{N}_$]/gu, '_'); + // Ensure it starts with a letter + if (/^\d/.test(identifier)) { + identifier = '_' + identifier; + } + // Turn it into PascalCase + // Since the first letter is uppercased, it will not be a reserved word + return identifier.split('_').map((part) => { + if (part[0] === undefined) return ''; + return part[0].toUpperCase() + part.slice(1); + }).join('') +} + +export function getImportModuleNames(filePaths: string[]) { + const _moduleNames: { [k: string]: true } = {}; + const moduleNames: { [k: string]: string } = {}; + for (const filePath of filePaths) { + let identifier = toIdentifier(filePath); + if (identifier in _moduleNames) { + const defaultIdentifier = identifier; + const hash = crypto.createHash('md5').update(filePath).digest('hex') + let length = 8; + while (length < hash.length && identifier in _moduleNames) { + identifier = `${defaultIdentifier}_${hash.slice(0, length)}`; + length = length + 1; + } + } + _moduleNames[identifier] = true; + moduleNames[filePath] = identifier; + } + return moduleNames; +} export const fsRouterTypegenPlugin = (opts: { srcDir: string }): Plugin => { let entriesFilePossibilities: string[] | undefined; @@ -105,6 +121,8 @@ export const fsRouterTypegenPlugin = (opts: { srcDir: string }): Plugin => { const generateFile = (filePaths: string[]): string => { const fileInfo = []; + const moduleNames = getImportModuleNames(filePaths); + for (const filePath of filePaths) { // where to import the component from const src = filePath.slice(1); @@ -138,14 +156,14 @@ export const fsRouterTypegenPlugin = (opts: { srcDir: string }): Plugin => { import type { PathsForPages } from 'waku/router';\n\n`; for (const file of fileInfo) { - const moduleName = srcToName(file.src); + const moduleName = moduleNames[file.src]; result += `import ${moduleName}${file.hasGetConfig ? `, { getConfig as ${moduleName}_getConfig }` : ''} from './${SRC_PAGES}/${file.src.replace('.tsx', '')}';\n`; } result += `\nconst _pages = createPages(async (pagesFns) => [\n`; for (const file of fileInfo) { - const moduleName = srcToName(file.src); + const moduleName = moduleNames[file.src]; result += ` pagesFns.${file.type === 'layout' ? 'createLayout' : 'createPage'}({ path: '${file.path}', component: ${moduleName}, ${file.hasGetConfig ? `...(await ${moduleName}_getConfig())` : `render: '${file.type === 'layout' ? 'static' : 'dynamic'}'`} }),\n`; } From 9bb2d885d689805d551d6ac62461dc11b5299467 Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Tue, 1 Oct 2024 22:36:55 -0400 Subject: [PATCH 03/15] Use pagesDir from parent context --- .../src/lib/plugins/vite-plugin-fs-router-typegen.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts index 47a5d129b..b717a268f 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts @@ -89,20 +89,16 @@ export const fsRouterTypegenPlugin = (opts: { srcDir: string }): Plugin => { // Recursively collect `.tsx` files in the given directory const collectFiles = async ( dir: string, - cwd: string = '', files: string[] = [], ): Promise => { - if (!cwd) { - cwd = dir; - } - const entries = await readdir(cwd, { withFileTypes: true }); + const entries = await readdir(dir, { withFileTypes: true }); for (const entry of entries) { - const fullPath = joinPath(cwd, entry.name); + const fullPath = joinPath(dir, entry.name); if (entry.isDirectory()) { await collectFiles(dir, fullPath, files); } else { if (entry.name.endsWith('.tsx')) { - files.push(fullPath.slice(dir.length)); + files.push(pagesDir ? fullPath.slice(pagesDir.length) : fullPath); } } } From ba1ef410592c588ccc053696c9b12b68b09277af Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Tue, 1 Oct 2024 22:38:00 -0400 Subject: [PATCH 04/15] Prettier --- .../plugins/vite-plugin-fs-router-typegen.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts index b717a268f..88035a9c1 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts @@ -12,7 +12,9 @@ const SRC_PAGES = 'pages'; // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#reserved_words export function toIdentifier(input: string): string { // Strip the file extension - let identifier = input.includes('.') ? input.split('.').slice(0, -1).join('.') : input; + let identifier = input.includes('.') + ? input.split('.').slice(0, -1).join('.') + : input; // Replace any characters besides letters, numbers, underscores, and dollar signs with underscores identifier = identifier.replace(/[^\p{L}\p{N}_$]/gu, '_'); // Ensure it starts with a letter @@ -21,10 +23,13 @@ export function toIdentifier(input: string): string { } // Turn it into PascalCase // Since the first letter is uppercased, it will not be a reserved word - return identifier.split('_').map((part) => { - if (part[0] === undefined) return ''; - return part[0].toUpperCase() + part.slice(1); - }).join('') + return identifier + .split('_') + .map((part) => { + if (part[0] === undefined) return ''; + return part[0].toUpperCase() + part.slice(1); + }) + .join(''); } export function getImportModuleNames(filePaths: string[]) { @@ -34,7 +39,7 @@ export function getImportModuleNames(filePaths: string[]) { let identifier = toIdentifier(filePath); if (identifier in _moduleNames) { const defaultIdentifier = identifier; - const hash = crypto.createHash('md5').update(filePath).digest('hex') + const hash = crypto.createHash('md5').update(filePath).digest('hex'); let length = 8; while (length < hash.length && identifier in _moduleNames) { identifier = `${defaultIdentifier}_${hash.slice(0, length)}`; From 784686e976c272933424a9b5241d112a84904222 Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Tue, 1 Oct 2024 22:39:23 -0400 Subject: [PATCH 05/15] Add todo about revisiting readdir recursive --- packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts index 88035a9c1..0ca7cb894 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts @@ -96,6 +96,8 @@ export const fsRouterTypegenPlugin = (opts: { srcDir: string }): Plugin => { dir: string, files: string[] = [], ): Promise => { + // TODO revisit recursive option for readdir once more stable + // https://nodejs.org/docs/latest-v20.x/api/fs.html#direntparentpath const entries = await readdir(dir, { withFileTypes: true }); for (const entry of entries) { const fullPath = joinPath(dir, entry.name); From f0084071a22f50db47c1ae17dd3700b42600fe83 Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Tue, 1 Oct 2024 22:42:06 -0400 Subject: [PATCH 06/15] Fix typo in refactor --- packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts index 0ca7cb894..c56f42db5 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts @@ -102,7 +102,7 @@ export const fsRouterTypegenPlugin = (opts: { srcDir: string }): Plugin => { for (const entry of entries) { const fullPath = joinPath(dir, entry.name); if (entry.isDirectory()) { - await collectFiles(dir, fullPath, files); + await collectFiles(dir, files); } else { if (entry.name.endsWith('.tsx')) { files.push(pagesDir ? fullPath.slice(pagesDir.length) : fullPath); From 42705d3458566987b9e0b7a4a9dd069b2e15a14e Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Tue, 1 Oct 2024 22:45:18 -0400 Subject: [PATCH 07/15] Unit tests for vite-plugin-fs-router-typegen supporting functions --- .../vite-plugin-fs-router-typegen.test.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 packages/waku/tests/vite-plugin-fs-router-typegen.test.ts diff --git a/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts b/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts new file mode 100644 index 000000000..1e292165c --- /dev/null +++ b/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, test } from 'vitest'; + +import { + getImportModuleNames, + toIdentifier, +} from '../src/lib/plugins/vite-plugin-fs-router-typegen.js'; + +describe('vite-plugin-fs-router-typegen', () => { + test('generates valid module names for fs entries', async () => { + expect(toIdentifier('/_layout.tsx')).toBe('Layout'); + expect(toIdentifier('/[category]/[...tags]/index.tsx')).toBe( + 'CategoryTagsIndex', + ); + }); + + test('allows unicode characters in module names', async () => { + expect(toIdentifier('/øné_two_three.tsx')).toBe('ØnéTwoThree'); + }); + + test('handles collisions of fs entry module names', async () => { + expect( + getImportModuleNames([ + '/one-two-three.tsx', + '/one_two_three.tsx', + '/one__two_three.tsx', + ]), + ).toEqual({ + '/one-two-three.tsx': 'OneTwoThree', + '/one_two_three.tsx': 'OneTwoThree_b7ec48bc', + '/one__two_three.tsx': 'OneTwoThree_fb958a64', + }); + }); +}); From c410344def58846625e123405858a3bb313af40e Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Tue, 1 Oct 2024 22:48:52 -0400 Subject: [PATCH 08/15] Another test case for collisions from nested paths --- packages/waku/tests/vite-plugin-fs-router-typegen.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts b/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts index 1e292165c..482d787ee 100644 --- a/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts +++ b/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts @@ -21,11 +21,13 @@ describe('vite-plugin-fs-router-typegen', () => { expect( getImportModuleNames([ '/one-two-three.tsx', + '/one/two/three.tsx', '/one_two_three.tsx', '/one__two_three.tsx', ]), ).toEqual({ '/one-two-three.tsx': 'OneTwoThree', + '/one/two/three.tsx': 'OneTwoThree_6760f883', '/one_two_three.tsx': 'OneTwoThree_b7ec48bc', '/one__two_three.tsx': 'OneTwoThree_fb958a64', }); From 7f7bd9f2e9029f30d3977aa9cca2ef55b52f4b1a Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Tue, 1 Oct 2024 23:31:39 -0400 Subject: [PATCH 09/15] Serial number instead of hash for collision suffix --- .../src/lib/plugins/vite-plugin-fs-router-typegen.ts | 10 ++++------ .../waku/tests/vite-plugin-fs-router-typegen.test.ts | 6 +++--- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts index c56f42db5..c5289268b 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts @@ -3,7 +3,6 @@ import { readdir, writeFile } from 'node:fs/promises'; import { existsSync, readFileSync } from 'node:fs'; import { SRC_ENTRIES, EXTENSIONS } from '../constants.js'; import { joinPath } from '../utils/path.js'; -import crypto from 'node:crypto'; const SRC_PAGES = 'pages'; @@ -39,11 +38,10 @@ export function getImportModuleNames(filePaths: string[]) { let identifier = toIdentifier(filePath); if (identifier in _moduleNames) { const defaultIdentifier = identifier; - const hash = crypto.createHash('md5').update(filePath).digest('hex'); - let length = 8; - while (length < hash.length && identifier in _moduleNames) { - identifier = `${defaultIdentifier}_${hash.slice(0, length)}`; - length = length + 1; + let duplicateSuffix = 1; + while (identifier in _moduleNames) { + identifier = `${defaultIdentifier}_${duplicateSuffix}`; + duplicateSuffix = duplicateSuffix + 1; } } _moduleNames[identifier] = true; diff --git a/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts b/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts index 482d787ee..164eb3796 100644 --- a/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts +++ b/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts @@ -27,9 +27,9 @@ describe('vite-plugin-fs-router-typegen', () => { ]), ).toEqual({ '/one-two-three.tsx': 'OneTwoThree', - '/one/two/three.tsx': 'OneTwoThree_6760f883', - '/one_two_three.tsx': 'OneTwoThree_b7ec48bc', - '/one__two_three.tsx': 'OneTwoThree_fb958a64', + '/one/two/three.tsx': 'OneTwoThree_1', + '/one_two_three.tsx': 'OneTwoThree_2', + '/one__two_three.tsx': 'OneTwoThree_3', }); }); }); From 862e240ca675c1ca9cc71f62739cbdd0f032a51e Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Wed, 2 Oct 2024 00:23:43 -0400 Subject: [PATCH 10/15] Cleaner getImportModuleNames Co-authored-by: Tyler <26290074+thegitduck@users.noreply.github.com> --- .../plugins/vite-plugin-fs-router-typegen.ts | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts index c5289268b..5e774885c 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts @@ -31,20 +31,17 @@ export function toIdentifier(input: string): string { .join(''); } -export function getImportModuleNames(filePaths: string[]) { - const _moduleNames: { [k: string]: true } = {}; +export function getImportModuleNames(filePaths: string[]): { + [k: string]: string; +} { + const moduleNameCount: { [k: string]: number } = {}; const moduleNames: { [k: string]: string } = {}; for (const filePath of filePaths) { let identifier = toIdentifier(filePath); - if (identifier in _moduleNames) { - const defaultIdentifier = identifier; - let duplicateSuffix = 1; - while (identifier in _moduleNames) { - identifier = `${defaultIdentifier}_${duplicateSuffix}`; - duplicateSuffix = duplicateSuffix + 1; - } + moduleNameCount[identifier] = (moduleNameCount[identifier] ?? -1) + 1; + if (moduleNameCount[identifier]) { + identifier = `${identifier}_${moduleNameCount[identifier]}`; } - _moduleNames[identifier] = true; moduleNames[filePath] = identifier; } return moduleNames; From a25053ebd2e816f04a8e709660ecba406754102a Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Wed, 2 Oct 2024 08:31:38 -0400 Subject: [PATCH 11/15] Fix key used in moduleName map --- .../src/lib/plugins/vite-plugin-fs-router-typegen.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts index 5e774885c..6a2704914 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts @@ -6,6 +6,14 @@ import { joinPath } from '../utils/path.js'; const SRC_PAGES = 'pages'; +// from waku/router/common +export function getInputString(path: string): string { + if (!path.startsWith('/')) { + throw new Error('Path should start with `/`'); + } + return path.slice(1); +} + // https://tc39.es/ecma262/multipage/ecmascript-language-lexical-grammar.html#sec-names-and-keywords // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#reserved_words @@ -42,7 +50,7 @@ export function getImportModuleNames(filePaths: string[]): { if (moduleNameCount[identifier]) { identifier = `${identifier}_${moduleNameCount[identifier]}`; } - moduleNames[filePath] = identifier; + moduleNames[getInputString(filePath)] = identifier; } return moduleNames; } @@ -123,7 +131,7 @@ export const fsRouterTypegenPlugin = (opts: { srcDir: string }): Plugin => { for (const filePath of filePaths) { // where to import the component from - const src = filePath.slice(1); + const src = getInputString(filePath); const hasGetConfig = fileExportsGetConfig(filePath); if (filePath.endsWith('/_layout.tsx')) { From 16690bbb329ba81e9f52bab7feaa2c5c1359e1cc Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Wed, 2 Oct 2024 09:28:11 -0400 Subject: [PATCH 12/15] WIP test vite-plugin-fs-router-typegen configureServer --- .../plugins/vite-plugin-fs-router-typegen.ts | 2 +- .../pages/[category]/[...tags]/index.tsx | 9 ++++ .../pages/[category]/_layout.tsx | 9 ++++ .../pages/_layout.tsx | 9 ++++ .../plugin-fs-router-typegen/pages/index.tsx | 9 ++++ .../pages/one-two-three.tsx | 9 ++++ .../pages/one__two_three.tsx | 9 ++++ .../pages/one_two_three.tsx | 9 ++++ .../pages/\303\270n\303\251_two_three.tsx" | 9 ++++ .../plugin-fs-router-typegen/server.ts | 2 + .../vite-plugin-fs-router-typegen.test.ts | 43 ++++++++++++++++++- 11 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/[...tags]/index.tsx create mode 100644 packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/_layout.tsx create mode 100644 packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/_layout.tsx create mode 100644 packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/index.tsx create mode 100644 packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one-two-three.tsx create mode 100644 packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one__two_three.tsx create mode 100644 packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one_two_three.tsx create mode 100644 "packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/\303\270n\303\251_two_three.tsx" create mode 100644 packages/waku/tests/fixtures/plugin-fs-router-typegen/server.ts diff --git a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts index 6a2704914..dcbc1fdfb 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts @@ -105,7 +105,7 @@ export const fsRouterTypegenPlugin = (opts: { srcDir: string }): Plugin => { for (const entry of entries) { const fullPath = joinPath(dir, entry.name); if (entry.isDirectory()) { - await collectFiles(dir, files); + await collectFiles(fullPath, files); } else { if (entry.name.endsWith('.tsx')) { files.push(pagesDir ? fullPath.slice(pagesDir.length) : fullPath); diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/[...tags]/index.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/[...tags]/index.tsx new file mode 100644 index 000000000..3b2e4216f --- /dev/null +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/[...tags]/index.tsx @@ -0,0 +1,9 @@ +export default function Page() { + return null; +} + +export const getConfig = async () => { + return { + render: "dynamic", + }; +}; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/_layout.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/_layout.tsx new file mode 100644 index 000000000..dbd89661b --- /dev/null +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/_layout.tsx @@ -0,0 +1,9 @@ +export default function Layout() { + return null; +} + +export const getConfig = async () => { + return { + render: "static", + }; +}; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/_layout.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/_layout.tsx new file mode 100644 index 000000000..dbd89661b --- /dev/null +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/_layout.tsx @@ -0,0 +1,9 @@ +export default function Layout() { + return null; +} + +export const getConfig = async () => { + return { + render: "static", + }; +}; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/index.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/index.tsx new file mode 100644 index 000000000..3b2e4216f --- /dev/null +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/index.tsx @@ -0,0 +1,9 @@ +export default function Page() { + return null; +} + +export const getConfig = async () => { + return { + render: "dynamic", + }; +}; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one-two-three.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one-two-three.tsx new file mode 100644 index 000000000..3b2e4216f --- /dev/null +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one-two-three.tsx @@ -0,0 +1,9 @@ +export default function Page() { + return null; +} + +export const getConfig = async () => { + return { + render: "dynamic", + }; +}; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one__two_three.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one__two_three.tsx new file mode 100644 index 000000000..3b2e4216f --- /dev/null +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one__two_three.tsx @@ -0,0 +1,9 @@ +export default function Page() { + return null; +} + +export const getConfig = async () => { + return { + render: "dynamic", + }; +}; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one_two_three.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one_two_three.tsx new file mode 100644 index 000000000..3b2e4216f --- /dev/null +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one_two_three.tsx @@ -0,0 +1,9 @@ +export default function Page() { + return null; +} + +export const getConfig = async () => { + return { + render: "dynamic", + }; +}; diff --git "a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/\303\270n\303\251_two_three.tsx" "b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/\303\270n\303\251_two_three.tsx" new file mode 100644 index 000000000..3b2e4216f --- /dev/null +++ "b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/\303\270n\303\251_two_three.tsx" @@ -0,0 +1,9 @@ +export default function Page() { + return null; +} + +export const getConfig = async () => { + return { + render: "dynamic", + }; +}; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/server.ts b/packages/waku/tests/fixtures/plugin-fs-router-typegen/server.ts new file mode 100644 index 000000000..f4c8ccae3 --- /dev/null +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/server.ts @@ -0,0 +1,2 @@ +'use server'; +console.log('This is server side code'); diff --git a/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts b/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts index 164eb3796..44278cae4 100644 --- a/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts +++ b/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts @@ -1,9 +1,44 @@ -import { describe, expect, test } from 'vitest'; - +import { describe, expect, test, vi } from 'vitest'; import { + fsRouterTypegenPlugin, getImportModuleNames, toIdentifier, } from '../src/lib/plugins/vite-plugin-fs-router-typegen.js'; +import { LoggingFunction, RollupLog } from 'rollup'; +import { fileURLToPath } from 'node:url'; +import { build, FSWatcher, ViteDevServer } from 'vite'; +import path from 'node:path'; +import { existsSync, readFileSync, rmSync } from 'node:fs'; + +const root = fileURLToPath( + new URL('./fixtures', import.meta.url), +); + +async function runTest(root: string, expectedEntriesGen: string, srcDir = 'plugin-fs-router-typegen') { + const entriesPath = path.join(root, srcDir, 'entries.gen.tsx'); + if (existsSync(entriesPath)) { + rmSync(entriesPath); + } + const plugin = fsRouterTypegenPlugin({ + srcDir, + }); + expect(plugin.configureServer).toBeDefined(); + expect(typeof plugin.configureServer).toBe('function'); + expect(plugin.configResolved).toBeDefined(); + expect(typeof plugin.configResolved).toBe('function'); + if (typeof plugin.configureServer !== 'function' || typeof plugin.configResolved !== 'function') { + return; + } + // @ts-expect-error - we're not passing the full Vite config + await plugin.configResolved?.({ root }); + await plugin.configureServer?.({ watcher: { add: () => { }, on: () => {} } as unknown as FSWatcher } as ViteDevServer); + const generated = readFileSync(entriesPath, 'utf-8'); + expect(generated).toEqual(expectedEntriesGen); +} + +vi.mock('prettier', () => { + return { format: (x: string) => x, resolveConfig: () => ({ }) } +}) describe('vite-plugin-fs-router-typegen', () => { test('generates valid module names for fs entries', async () => { @@ -32,4 +67,8 @@ describe('vite-plugin-fs-router-typegen', () => { '/one__two_three.tsx': 'OneTwoThree_3', }); }); + + test('creates the expected imports the generated entries file', async () => { + await runTest(root, `export * from './_layout';\n`); + }); }); From 676ba0e3e2dd19aa42e0946b2ff290588bea8cd6 Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Wed, 2 Oct 2024 13:08:23 -0400 Subject: [PATCH 13/15] Improved vitest and importing getInputString --- .../plugins/vite-plugin-fs-router-typegen.ts | 15 ++-- .../vite-plugin-fs-router-typegen.test.ts | 74 ++++++++++++------- 2 files changed, 55 insertions(+), 34 deletions(-) diff --git a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts index dcbc1fdfb..1c7c4b5b6 100644 --- a/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts +++ b/packages/waku/src/lib/plugins/vite-plugin-fs-router-typegen.ts @@ -3,17 +3,10 @@ import { readdir, writeFile } from 'node:fs/promises'; import { existsSync, readFileSync } from 'node:fs'; import { SRC_ENTRIES, EXTENSIONS } from '../constants.js'; import { joinPath } from '../utils/path.js'; +import { getInputString } from '../../router/common.js'; const SRC_PAGES = 'pages'; -// from waku/router/common -export function getInputString(path: string): string { - if (!path.startsWith('/')) { - throw new Error('Path should start with `/`'); - } - return path.slice(1); -} - // https://tc39.es/ecma262/multipage/ecmascript-language-lexical-grammar.html#sec-names-and-keywords // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#identifiers // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#reserved_words @@ -50,7 +43,11 @@ export function getImportModuleNames(filePaths: string[]): { if (moduleNameCount[identifier]) { identifier = `${identifier}_${moduleNameCount[identifier]}`; } - moduleNames[getInputString(filePath)] = identifier; + try { + moduleNames[getInputString(filePath)] = identifier; + } catch (e) { + console.log(e); + } } return moduleNames; } diff --git a/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts b/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts index 44278cae4..9d02f7c59 100644 --- a/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts +++ b/packages/waku/tests/vite-plugin-fs-router-typegen.test.ts @@ -4,21 +4,30 @@ import { getImportModuleNames, toIdentifier, } from '../src/lib/plugins/vite-plugin-fs-router-typegen.js'; -import { LoggingFunction, RollupLog } from 'rollup'; import { fileURLToPath } from 'node:url'; -import { build, FSWatcher, ViteDevServer } from 'vite'; -import path from 'node:path'; -import { existsSync, readFileSync, rmSync } from 'node:fs'; +import { FSWatcher, ViteDevServer } from 'vite'; +import { writeFile } from 'node:fs/promises'; -const root = fileURLToPath( - new URL('./fixtures', import.meta.url), -); +const root = fileURLToPath(new URL('./fixtures', import.meta.url)); -async function runTest(root: string, expectedEntriesGen: string, srcDir = 'plugin-fs-router-typegen') { - const entriesPath = path.join(root, srcDir, 'entries.gen.tsx'); - if (existsSync(entriesPath)) { - rmSync(entriesPath); - } +vi.mock('prettier', () => { + return { format: (x: string) => x, resolveConfig: () => ({}) }; +}); +vi.mock('node:fs/promises', async (importOriginal) => { + const mod = await importOriginal(); + return { + // https://vitest.dev/api/vi.html#vi-mock + // @ts-expect-error - docs say this should be inferred... + ...mod, + writeFile: vi.fn(), + }; +}); + +async function runTest( + root: string, + expectedEntriesGen: string, + srcDir = 'plugin-fs-router-typegen', +) { const plugin = fsRouterTypegenPlugin({ srcDir, }); @@ -26,20 +35,25 @@ async function runTest(root: string, expectedEntriesGen: string, srcDir = 'plugi expect(typeof plugin.configureServer).toBe('function'); expect(plugin.configResolved).toBeDefined(); expect(typeof plugin.configResolved).toBe('function'); - if (typeof plugin.configureServer !== 'function' || typeof plugin.configResolved !== 'function') { + if ( + typeof plugin.configureServer !== 'function' || + typeof plugin.configResolved !== 'function' + ) { return; } // @ts-expect-error - we're not passing the full Vite config await plugin.configResolved?.({ root }); - await plugin.configureServer?.({ watcher: { add: () => { }, on: () => {} } as unknown as FSWatcher } as ViteDevServer); - const generated = readFileSync(entriesPath, 'utf-8'); - expect(generated).toEqual(expectedEntriesGen); + await plugin.configureServer?.({ + watcher: { add: () => {}, on: () => {} } as unknown as FSWatcher, + } as ViteDevServer); + await vi.waitFor(async () => { + if (vi.mocked(writeFile).mock.lastCall === undefined) { + throw new Error('writeFile not called'); + } + }); + expect(vi.mocked(writeFile).mock.lastCall?.[1]).toContain(expectedEntriesGen); } -vi.mock('prettier', () => { - return { format: (x: string) => x, resolveConfig: () => ({ }) } -}) - describe('vite-plugin-fs-router-typegen', () => { test('generates valid module names for fs entries', async () => { expect(toIdentifier('/_layout.tsx')).toBe('Layout'); @@ -61,14 +75,24 @@ describe('vite-plugin-fs-router-typegen', () => { '/one__two_three.tsx', ]), ).toEqual({ - '/one-two-three.tsx': 'OneTwoThree', - '/one/two/three.tsx': 'OneTwoThree_1', - '/one_two_three.tsx': 'OneTwoThree_2', - '/one__two_three.tsx': 'OneTwoThree_3', + 'one-two-three.tsx': 'OneTwoThree', + 'one/two/three.tsx': 'OneTwoThree_1', + 'one_two_three.tsx': 'OneTwoThree_2', + 'one__two_three.tsx': 'OneTwoThree_3', }); }); test('creates the expected imports the generated entries file', async () => { - await runTest(root, `export * from './_layout';\n`); + await runTest( + root, + `import CategoryTagsIndex, { getConfig as CategoryTagsIndex_getConfig } from './pages/[category]/[...tags]/index'; +import CategoryLayout, { getConfig as CategoryLayout_getConfig } from './pages/[category]/_layout'; +import Layout, { getConfig as Layout_getConfig } from './pages/_layout'; +import Index, { getConfig as Index_getConfig } from './pages/index'; +import OneTwoThree, { getConfig as OneTwoThree_getConfig } from './pages/one-two-three'; +import OneTwoThree_1, { getConfig as OneTwoThree_1_getConfig } from './pages/one__two_three'; +import OneTwoThree_2, { getConfig as OneTwoThree_2_getConfig } from './pages/one_two_three'; +import ØnéTwoThree, { getConfig as ØnéTwoThree_getConfig } from './pages/øné_two_three';`, + ); }); }); From 63311ff3853f63ed921e5889718cd6ae9ab8612e Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Wed, 2 Oct 2024 13:11:03 -0400 Subject: [PATCH 14/15] Prettier --- .../pages/[category]/[...tags]/index.tsx | 2 +- .../plugin-fs-router-typegen/pages/[category]/_layout.tsx | 2 +- .../tests/fixtures/plugin-fs-router-typegen/pages/_layout.tsx | 2 +- .../tests/fixtures/plugin-fs-router-typegen/pages/index.tsx | 2 +- .../fixtures/plugin-fs-router-typegen/pages/one-two-three.tsx | 2 +- .../fixtures/plugin-fs-router-typegen/pages/one__two_three.tsx | 2 +- .../fixtures/plugin-fs-router-typegen/pages/one_two_three.tsx | 2 +- .../pages/\303\270n\303\251_two_three.tsx" | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/[...tags]/index.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/[...tags]/index.tsx index 3b2e4216f..c046a3f89 100644 --- a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/[...tags]/index.tsx +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/[...tags]/index.tsx @@ -4,6 +4,6 @@ export default function Page() { export const getConfig = async () => { return { - render: "dynamic", + render: 'dynamic', }; }; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/_layout.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/_layout.tsx index dbd89661b..0b96b0dc0 100644 --- a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/_layout.tsx +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/[category]/_layout.tsx @@ -4,6 +4,6 @@ export default function Layout() { export const getConfig = async () => { return { - render: "static", + render: 'static', }; }; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/_layout.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/_layout.tsx index dbd89661b..0b96b0dc0 100644 --- a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/_layout.tsx +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/_layout.tsx @@ -4,6 +4,6 @@ export default function Layout() { export const getConfig = async () => { return { - render: "static", + render: 'static', }; }; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/index.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/index.tsx index 3b2e4216f..c046a3f89 100644 --- a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/index.tsx +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/index.tsx @@ -4,6 +4,6 @@ export default function Page() { export const getConfig = async () => { return { - render: "dynamic", + render: 'dynamic', }; }; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one-two-three.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one-two-three.tsx index 3b2e4216f..c046a3f89 100644 --- a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one-two-three.tsx +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one-two-three.tsx @@ -4,6 +4,6 @@ export default function Page() { export const getConfig = async () => { return { - render: "dynamic", + render: 'dynamic', }; }; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one__two_three.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one__two_three.tsx index 3b2e4216f..c046a3f89 100644 --- a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one__two_three.tsx +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one__two_three.tsx @@ -4,6 +4,6 @@ export default function Page() { export const getConfig = async () => { return { - render: "dynamic", + render: 'dynamic', }; }; diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one_two_three.tsx b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one_two_three.tsx index 3b2e4216f..c046a3f89 100644 --- a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one_two_three.tsx +++ b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/one_two_three.tsx @@ -4,6 +4,6 @@ export default function Page() { export const getConfig = async () => { return { - render: "dynamic", + render: 'dynamic', }; }; diff --git "a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/\303\270n\303\251_two_three.tsx" "b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/\303\270n\303\251_two_three.tsx" index 3b2e4216f..c046a3f89 100644 --- "a/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/\303\270n\303\251_two_three.tsx" +++ "b/packages/waku/tests/fixtures/plugin-fs-router-typegen/pages/\303\270n\303\251_two_three.tsx" @@ -4,6 +4,6 @@ export default function Page() { export const getConfig = async () => { return { - render: "dynamic", + render: 'dynamic', }; }; From 034f8dd620f483de22e7fe74b44f039e86000969 Mon Sep 17 00:00:00 2001 From: Rob Marscher Date: Wed, 2 Oct 2024 13:15:40 -0400 Subject: [PATCH 15/15] Remove unnecessary fixture file --- packages/waku/tests/fixtures/plugin-fs-router-typegen/server.ts | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 packages/waku/tests/fixtures/plugin-fs-router-typegen/server.ts diff --git a/packages/waku/tests/fixtures/plugin-fs-router-typegen/server.ts b/packages/waku/tests/fixtures/plugin-fs-router-typegen/server.ts deleted file mode 100644 index f4c8ccae3..000000000 --- a/packages/waku/tests/fixtures/plugin-fs-router-typegen/server.ts +++ /dev/null @@ -1,2 +0,0 @@ -'use server'; -console.log('This is server side code');