diff --git a/packages/brisa/src/__fixtures__/actions/a1.tsx b/packages/brisa/src/__fixtures__/actions/a1.tsx deleted file mode 100644 index 50ec9fc9e..000000000 --- a/packages/brisa/src/__fixtures__/actions/a1.tsx +++ /dev/null @@ -1,12 +0,0 @@ -export function a1_1(props: any) { - console.log('a1_1', props); -} - -export function a1_2(props: any) { - return 'a1_2'; -} - -export function a1_3(props: any, req: any) { - const [event] = req.store.get('__params:a1_3'); - event.target.reset(); // Simulate a form reset -} diff --git a/packages/brisa/src/__fixtures__/actions/a2.tsx b/packages/brisa/src/__fixtures__/actions/a2.tsx deleted file mode 100644 index 7fea500df..000000000 --- a/packages/brisa/src/__fixtures__/actions/a2.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import type { RequestContext } from '@/types'; - -export async function a2_1({ onAction }: any) { - return 'a2_1' + ((await onAction?.('foo')) ?? ''); -} - -export function a2_2({}, req: RequestContext) { - const foo = req.store.get('__params:a2_2')[0]; - return '-a2_2-' + foo; -} diff --git a/packages/brisa/src/__fixtures__/actions/a3.tsx b/packages/brisa/src/__fixtures__/actions/index.tsx similarity index 74% rename from packages/brisa/src/__fixtures__/actions/a3.tsx rename to packages/brisa/src/__fixtures__/actions/index.tsx index 7ae650119..ffa4a2e08 100644 --- a/packages/brisa/src/__fixtures__/actions/a3.tsx +++ b/packages/brisa/src/__fixtures__/actions/index.tsx @@ -1,3 +1,27 @@ +import type { RequestContext } from '@/types'; + +export function a1_1(props: any) { + console.log('a1_1', props); +} + +export function a1_2(props: any) { + return 'a1_2'; +} + +export function a1_3(props: any, req: any) { + const [event] = req.store.get('__params:a1_3'); + event.target.reset(); // Simulate a form reset +} + +export async function a2_1({ onAction }: any) { + return 'a2_1' + ((await onAction?.('foo')) ?? ''); +} + +export function a2_2({}, req: RequestContext) { + const foo = req.store.get('__params:a2_2')[0]; + return '-a2_2-' + foo; +} + export async function a3_1({ onAction2 }: any, req: any) { const [withAwait] = req.store.get('__params:a3_1'); console.log('a3_1 before calling nested action'); diff --git a/packages/brisa/src/cli/dev-live-reload.tsx b/packages/brisa/src/cli/dev-live-reload.tsx index 156b5ec83..418770256 100644 --- a/packages/brisa/src/cli/dev-live-reload.tsx +++ b/packages/brisa/src/cli/dev-live-reload.tsx @@ -86,6 +86,7 @@ async function activateHotReload() { if (!globalThis.brisaServer) return; await reinitConstants(); + Object.keys(require.cache).forEach((key) => delete require.cache[key]); globalThis.brisaServer.publish('hot-reload', LIVE_RELOAD_COMMAND); if (waitFilename) { diff --git a/packages/brisa/src/cli/serve/serve-options.tsx b/packages/brisa/src/cli/serve/serve-options.tsx index c2b54955e..7cb112ac2 100644 --- a/packages/brisa/src/cli/serve/serve-options.tsx +++ b/packages/brisa/src/cli/serve/serve-options.tsx @@ -253,9 +253,8 @@ export async function getServeOptions() { // Middleware if (customMiddleware) { - const middlewareResponse = await Promise.resolve().then(() => - customMiddleware(req), - ); + // @ts-ignore TODO: Remove this comment when TypeScript adds Promise.try + const middlewareResponse = await Promise.try(() => customMiddleware(req)); if (middlewareResponse) return middlewareResponse; } diff --git a/packages/brisa/src/utils/compile-files/index.test.ts b/packages/brisa/src/utils/compile-files/index.test.ts index 2d0ef413c..4aad3e5bb 100644 --- a/packages/brisa/src/utils/compile-files/index.test.ts +++ b/packages/brisa/src/utils/compile-files/index.test.ts @@ -194,10 +194,10 @@ describe('utils', () => { ).text(); expect(homePageContent).toContain( - `"data-action-onclick":"a1_1","data-action"`, + `"data-action-onclick":"a2n9c_1","data-action"`, ); expect(homePageContent).toContain( - `"data-action-onclick":"a1_2","data-action"`, + `"data-action-onclick":"a2n9c_2","data-action"`, ); const pagesClient = fs @@ -283,7 +283,7 @@ describe('utils', () => { ${info}Ω /i18n | 162 B | ${info}Ψ /websocket | 207 B | ${info}Θ /web-components/_integrations | 67 B | - ${info}λ /pages/index | 821 B | ${greenLog('3 kB')} + ${info}λ /pages/index | 827 B | ${greenLog('3 kB')} ${info}λ /pages/page-with-web-component | 761 B | ${greenLog('5 kB')} ${info}λ /pages/somepage | 1 kB | ${greenLog('0 B')} ${info}λ /pages/somepage-with-context | 1 kB | ${greenLog('0 B')} @@ -433,7 +433,7 @@ describe('utils', () => { ).text(); expect(layoutContent).toContain( - `"data-action-onclick":"a1_1","data-action"`, + `"data-action-onclick":"a2n9c_1","data-action"`, ); const pagesClient = fs @@ -464,7 +464,7 @@ describe('utils', () => { ${info}Route | JS server | JS client (gz) ${info}---------------------------------------------- ${info}λ /pages/index | 444 B | ${greenLog('3 kB')} - ${info}Δ /layout | 706 B | + ${info}Δ /layout | 709 B | ${info} ${info}λ Server entry-points ${info}Δ Layout diff --git a/packages/brisa/src/utils/compile-files/index.ts b/packages/brisa/src/utils/compile-files/index.ts index 03e436e3a..95f680fd1 100644 --- a/packages/brisa/src/utils/compile-files/index.ts +++ b/packages/brisa/src/utils/compile-files/index.ts @@ -13,7 +13,7 @@ import { logTable } from '@/utils/log/log-build'; import serverComponentPlugin from '@/utils/server-component-plugin'; import createContextPlugin from '@/utils/create-context/create-context-plugin'; import getI18nClientMessages from '@/utils/get-i18n-client-messages'; -import compileActions from '@/utils/compile-actions'; +import { transpileActions, buildActions } from '@/utils/transpile-actions'; import generateStaticExport from '@/utils/generate-static-export'; import getWebComponentsPerEntryPoints from '@/utils/get-webcomponents-per-entrypoints'; import { shouldTransferTranslatedPagePaths } from '@/utils/transfer-translated-page-paths'; @@ -102,7 +102,7 @@ export default async function compileFiles() { let code = await Bun.file(path).text(); try { - const fileID = `a${actionIdCount}`; + const fileID = `a${Bun.hash(path).toString(36)}`; const result = serverComponentPlugin(code, { path, allWebComponents, @@ -117,7 +117,10 @@ export default async function compileFiles() { actionsEntrypoints.push(actionEntrypoint); actionIdCount += 1; - await Bun.write(actionEntrypoint, result.code); + await Bun.write( + actionEntrypoint, + transpileActions(result.code), + ); } code = result.code; @@ -145,7 +148,7 @@ export default async function compileFiles() { if (!success) return { success, logs, pagesSize: {} }; if (actionsEntrypoints.length) { - const actionResult = await compileActions({ actionsEntrypoints, define }); + const actionResult = await buildActions({ actionsEntrypoints, define }); if (!actionResult.success) logs.push(...actionResult.logs); } diff --git a/packages/brisa/src/utils/get-client-code-in-page/index.test.ts b/packages/brisa/src/utils/get-client-code-in-page/index.test.ts index a431a8904..057457ef9 100644 --- a/packages/brisa/src/utils/get-client-code-in-page/index.test.ts +++ b/packages/brisa/src/utils/get-client-code-in-page/index.test.ts @@ -22,7 +22,7 @@ const i18nCode = 2799; const brisaSize = 5720; // TODO: Reduce this size :/ const webComponents = 1107; const unsuspenseSize = 213; -const rpcSize = 2509; // TODO: Reduce this size +const rpcSize = 2500; // TODO: Reduce this size const lazyRPCSize = 4105; // TODO: Reduce this size // lazyRPC is loaded after user interaction (action, link), // so it's not included in the initial size diff --git a/packages/brisa/src/utils/import-file-if-exists/index.ts b/packages/brisa/src/utils/import-file-if-exists/index.ts index ca4c3fff8..2c86de1fb 100644 --- a/packages/brisa/src/utils/import-file-if-exists/index.ts +++ b/packages/brisa/src/utils/import-file-if-exists/index.ts @@ -7,7 +7,8 @@ export default async function importFileIfExists( | 'i18n' | 'brisa.config' | '_integrations' - | 'css-files', + | 'css-files' + | 'actions', dir = path.join(process.cwd(), 'build'), ) { const importablePath = getImportableFilepath(filename, dir); diff --git a/packages/brisa/src/utils/response-action/index.test.ts b/packages/brisa/src/utils/response-action/index.test.ts index 6909dc09a..dd58e2689 100644 --- a/packages/brisa/src/utils/response-action/index.test.ts +++ b/packages/brisa/src/utils/response-action/index.test.ts @@ -9,7 +9,7 @@ import { } from 'bun:test'; import path from 'node:path'; import extendRequestContext from '@/utils/extend-request-context'; -import responseAction, { getActionFile } from '.'; +import responseAction from '.'; import { getConstants } from '@/constants'; import { ENCRYPT_NONTEXT_PREFIX, encrypt } from '@/utils/crypto'; import { boldLog } from '@/utils/log/log-color'; @@ -847,10 +847,4 @@ describe('utils', () => { expect(await res.text()).toBe(JSON.stringify([['foo', 'bar']])); }); }); - - describe('getActionFile', () => { - it('should return the file with the .js extension to work in Node.js and Bun.js', () => { - expect(getActionFile('a1_1')).toBe('a1.js'); - }); - }); }); diff --git a/packages/brisa/src/utils/response-action/index.ts b/packages/brisa/src/utils/response-action/index.ts index 938372e6d..30917ce95 100644 --- a/packages/brisa/src/utils/response-action/index.ts +++ b/packages/brisa/src/utils/response-action/index.ts @@ -1,26 +1,24 @@ -import { join } from 'node:path'; -import { getConstants } from '@/constants'; import type { RequestContext } from '@/types'; import { deserialize } from '@/utils/serialization'; import transferStoreService from '@/utils/transfer-store-service'; import { resolveStore } from '@/utils/transfer-store-service'; import { logError } from '@/utils/log/log-build'; import { pathToFileURLWhenNeeded } from '../get-importable-filepath'; +import importFileIfExists from '../import-file-if-exists'; +import { getConstants } from '@/constants'; const DEPENDENCIES = Symbol.for('DEPENDENCIES'); export default async function responseAction(req: RequestContext) { + const { BUILD_DIR } = getConstants(); + const actionModule = await importFileIfExists('actions', BUILD_DIR); + const { transferClientStoreToServer, formData, body } = await transferStoreService(req); - const { BUILD_DIR } = getConstants(); const url = new URL(req.url); const action = req.headers.get('x-action') ?? url.searchParams.get('_aid') ?? ''; const actionsHeaderValue = req.headers.get('x-actions') ?? '[]'; - const actionFile = getActionFile(action); - const actionModule = await import( - pathToFileURLWhenNeeded(join(BUILD_DIR, 'actions', actionFile!)) - ); let resetForm = false; const target = { @@ -90,19 +88,9 @@ export default async function responseAction(req: RequestContext) { for (const [eventName, actionId] of actions) { nextProps[eventName] = async (...params: unknown[]) => { const { promise, resolve, reject } = Promise.withResolvers(); + const actionDependency = actionModule[actionId]; actionCallPromises.push([actionId, promise]); - - const file = actionId.split('_').at(0); - const actionDependency = - file === actionFile - ? actionModule[actionId] - : ( - await import( - pathToFileURLWhenNeeded(join(BUILD_DIR, 'actions', file!)) - ) - )[actionId]; - req.store.set(`__params:${actionId}`, params); try { @@ -211,7 +199,3 @@ export default async function responseAction(req: RequestContext) { return response; } - -export function getActionFile(action: string) { - return action.split('_').at(0) + '.js'; -} diff --git a/packages/brisa/src/utils/compile-actions/get-actions-info/index.test.ts b/packages/brisa/src/utils/transpile-actions/get-actions-info/index.test.ts similarity index 100% rename from packages/brisa/src/utils/compile-actions/get-actions-info/index.test.ts rename to packages/brisa/src/utils/transpile-actions/get-actions-info/index.test.ts diff --git a/packages/brisa/src/utils/compile-actions/get-actions-info/index.ts b/packages/brisa/src/utils/transpile-actions/get-actions-info/index.ts similarity index 100% rename from packages/brisa/src/utils/compile-actions/get-actions-info/index.ts rename to packages/brisa/src/utils/transpile-actions/get-actions-info/index.ts diff --git a/packages/brisa/src/utils/compile-actions/get-purged-body/index.test.ts b/packages/brisa/src/utils/transpile-actions/get-purged-body/index.test.ts similarity index 99% rename from packages/brisa/src/utils/compile-actions/get-purged-body/index.test.ts rename to packages/brisa/src/utils/transpile-actions/get-purged-body/index.test.ts index 5f7cd93d8..cfc559e1b 100644 --- a/packages/brisa/src/utils/compile-actions/get-purged-body/index.test.ts +++ b/packages/brisa/src/utils/transpile-actions/get-purged-body/index.test.ts @@ -2,7 +2,7 @@ import { normalizeHTML } from '@/helpers'; import AST from '@/utils/ast'; import { describe, it, expect } from 'bun:test'; import { getPurgedBody } from '.'; -import getActionsInfo from '@/utils/compile-actions/get-actions-info'; +import getActionsInfo from '@/utils/transpile-actions/get-actions-info'; const { parseCodeToAST, generateCodeFromAST } = AST('tsx'); diff --git a/packages/brisa/src/utils/compile-actions/get-purged-body/index.ts b/packages/brisa/src/utils/transpile-actions/get-purged-body/index.ts similarity index 96% rename from packages/brisa/src/utils/compile-actions/get-purged-body/index.ts rename to packages/brisa/src/utils/transpile-actions/get-purged-body/index.ts index ff648a776..710a9c348 100644 --- a/packages/brisa/src/utils/compile-actions/get-purged-body/index.ts +++ b/packages/brisa/src/utils/transpile-actions/get-purged-body/index.ts @@ -1,5 +1,5 @@ import type { ESTree } from 'meriyah'; -import type { ActionInfo } from '@/utils/compile-actions/get-actions-info'; +import type { ActionInfo } from '@/utils/transpile-actions/get-actions-info'; import removeAllReturns from '@/utils/ast/remove-all-returns'; import containsIdentifiers from '@/utils/ast/contains-identifiers'; import getAllIdentifiers from '@/utils/ast/get-all-identifiers'; diff --git a/packages/brisa/src/utils/compile-actions/index.test.ts b/packages/brisa/src/utils/transpile-actions/index.test.ts similarity index 97% rename from packages/brisa/src/utils/compile-actions/index.test.ts rename to packages/brisa/src/utils/transpile-actions/index.test.ts index 6f4e88083..a5c0f6ee2 100644 --- a/packages/brisa/src/utils/compile-actions/index.test.ts +++ b/packages/brisa/src/utils/transpile-actions/index.test.ts @@ -1,20 +1,20 @@ import { describe, it, expect, afterEach } from 'bun:test'; import path from 'node:path'; -import { transformToActionCode } from '.'; +import { transpileActions } from '.'; import { normalizeHTML } from '@/helpers'; import { getConstants } from '@/constants'; import serverComponentPlugin, { workaroundText, } from '@/utils/server-component-plugin'; -function compileActions(code: string) { +function buildActions(code: string) { const modifiedCode = serverComponentPlugin(code, { allWebComponents: {}, fileID: 'a1', path: '', }).code.replace(workaroundText, ''); - return normalizeHTML(transformToActionCode(modifiedCode)); + return normalizeHTML(transpileActions(modifiedCode)); } const brisaServerFile = path @@ -25,14 +25,14 @@ describe('utils', () => { afterEach(() => { globalThis.mockConstants = undefined; }); - describe('transformToActionCode', () => { + describe('transpileActions', () => { it('should transform a simple component with 1 action', () => { const code = ` export default function Component({text}) { return
console.log('hello world')}>{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -67,7 +67,7 @@ describe('utils', () => { return
console.log('hello world')}>Hello world
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -103,7 +103,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -140,7 +140,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -176,7 +176,7 @@ describe('utils', () => { return
console.log('hello world')}>{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -212,7 +212,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -247,7 +247,7 @@ describe('utils', () => { return
{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -283,7 +283,7 @@ describe('utils', () => { return
{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -322,7 +322,7 @@ describe('utils', () => { return
{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -359,7 +359,7 @@ describe('utils', () => { return
console.log('hello world')}>{foo}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -394,7 +394,7 @@ describe('utils', () => { return
console.log('hello world')}>{foo}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -427,7 +427,7 @@ describe('utils', () => { const code = ` export default ({foo}) =>
console.log('hello world')}>{foo}
`; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -460,7 +460,7 @@ describe('utils', () => { const code = ` export default async ({foo}) =>
console.log('hello world')}>{foo}
`; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -495,7 +495,7 @@ describe('utils', () => { return
console.log('hello world')}>{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -539,7 +539,7 @@ describe('utils', () => { SlowComponent.suspense = () => <>Loading slow component... `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -583,7 +583,7 @@ describe('utils', () => { export default Component; `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -620,7 +620,7 @@ describe('utils', () => { export default Component; `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -655,7 +655,7 @@ describe('utils', () => { export default Component; `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -695,7 +695,7 @@ describe('utils', () => { export {ComponentA, ComponentB}; `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -755,7 +755,7 @@ describe('utils', () => { ); } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -825,7 +825,7 @@ describe('utils', () => { export {Foo}; `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -901,7 +901,7 @@ describe('utils', () => { } } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -978,7 +978,7 @@ describe('utils', () => { } } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1056,7 +1056,7 @@ describe('utils', () => { } } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1131,7 +1131,7 @@ describe('utils', () => { } } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1205,7 +1205,7 @@ describe('utils', () => { return
console.log('hello world')} data-action-onClick="a1_1" data-action>{text}
} `; - expect(normalizeHTML(transformToActionCode(code))).toContain( + expect(normalizeHTML(transpileActions(code))).toContain( normalizeHTML( 'component: __props => jsx(Component, {text, ...__props})', ), @@ -1220,7 +1220,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1259,7 +1259,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1300,7 +1300,7 @@ describe('utils', () => { export {SOME_CONSTANT, Component} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1338,7 +1338,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1376,7 +1376,7 @@ describe('utils', () => { return el; } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -1415,7 +1415,7 @@ describe('utils', () => { return el; } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -1474,7 +1474,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1524,7 +1524,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1565,7 +1565,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1606,7 +1606,7 @@ describe('utils', () => { return
{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1645,7 +1645,7 @@ describe('utils', () => { return
{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1683,7 +1683,7 @@ describe('utils', () => { return
{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1722,7 +1722,7 @@ describe('utils', () => { return
{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1763,7 +1763,7 @@ describe('utils', () => { return
{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1810,7 +1810,7 @@ describe('utils', () => { return
{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1854,7 +1854,7 @@ describe('utils', () => { return
{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1897,7 +1897,7 @@ describe('utils', () => { return
console.log('hello world'))}>{text}
} `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1934,7 +1934,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -1971,7 +1971,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -2007,7 +2007,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -2043,7 +2043,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -2105,7 +2105,7 @@ describe('utils', () => { ); }`; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -2197,7 +2197,7 @@ describe('utils', () => { ); }`; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -2292,7 +2292,7 @@ describe('utils', () => { ); }`; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -2365,7 +2365,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -2435,7 +2435,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -2486,7 +2486,7 @@ describe('utils', () => { return getEl(text); } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from "brisa/server"; @@ -2552,7 +2552,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -2655,7 +2655,7 @@ describe('utils', () => { export const ComponentWithAction = () => el; `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -2726,7 +2726,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -2786,7 +2786,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -2848,7 +2848,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -2914,7 +2914,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -2980,7 +2980,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import {resolveAction as __resolveAction} from 'brisa/server'; @@ -3046,7 +3046,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import { resolveAction as __resolveAction } from 'brisa/server'; @@ -3092,7 +3092,7 @@ describe('utils', () => { } `; - const output = compileActions(code); + const output = buildActions(code); const expected = normalizeHTML(` import { resolveAction as __resolveAction } from 'brisa/server'; diff --git a/packages/brisa/src/utils/compile-actions/index.ts b/packages/brisa/src/utils/transpile-actions/index.ts similarity index 95% rename from packages/brisa/src/utils/compile-actions/index.ts rename to packages/brisa/src/utils/transpile-actions/index.ts index 3ba817abc..1670060b0 100644 --- a/packages/brisa/src/utils/compile-actions/index.ts +++ b/packages/brisa/src/utils/transpile-actions/index.ts @@ -1,4 +1,3 @@ -import type { BunPlugin } from 'bun'; import type { ESTree } from 'meriyah'; import fs from 'node:fs'; import { join } from 'node:path'; @@ -25,61 +24,7 @@ const FN_EXPRESSION_TYPES = new Set([ 'FunctionExpression', ]); -export default async function compileActions({ - actionsEntrypoints, - define, -}: CompileActionsParams) { - const { BUILD_DIR, IS_PRODUCTION, CONFIG } = getConstants(); - const isNode = CONFIG.output === 'node' && IS_PRODUCTION; - const rawActionsDir = join(BUILD_DIR, 'actions_raw'); - const external = CONFIG.external ? [...CONFIG.external, 'brisa'] : ['brisa']; - const res = await Bun.build({ - entrypoints: actionsEntrypoints, - outdir: join(BUILD_DIR, 'actions'), - external, - sourcemap: IS_PRODUCTION ? undefined : 'inline', - root: rawActionsDir, - target: isNode ? 'node' : 'bun', - minify: IS_PRODUCTION, - splitting: true, - define, - plugins: [actionPlugin({ actionsEntrypoints })], - }); - - if (!res.success) { - logBuildError('Failed to compile actions', res.logs); - } - - fs.rmSync(rawActionsDir, { recursive: true }); - - return res; -} - -function actionPlugin({ - actionsEntrypoints, -}: { - actionsEntrypoints: string[]; -}) { - // These replaces are to fix the regex in Windows - const filter = new RegExp( - `(${actionsEntrypoints.join('|').replace(/\\/g, '\\\\')})$`.replace( - /\//g, - '[\\\\/]', - ), - ); - - return { - name: 'action-plugin', - setup(build) { - build.onLoad({ filter }, async ({ path, loader }) => { - const code = await Bun.file(path).text(); - return { contents: transformToActionCode(code), loader }; - }); - }, - } satisfies BunPlugin; -} - -export function transformToActionCode(code: string) { +export function transpileActions(code: string) { let ast = parseCodeToAST(code); ast = addResolveActionImport(ast); @@ -644,3 +589,39 @@ function wrapWithTypeCatch({ ], }; } + +export async function buildActions({ + actionsEntrypoints, + define, +}: CompileActionsParams) { + const { BUILD_DIR, IS_PRODUCTION, CONFIG } = getConstants(); + const isNode = CONFIG.output === 'node' && IS_PRODUCTION; + const rawActionsDir = join(BUILD_DIR, 'actions_raw'); + const barrelFile = join(rawActionsDir, 'index.ts'); + + await Bun.write( + barrelFile, + actionsEntrypoints.map((p) => `export * from '${p}'`).join('\n'), + ); + + const external = CONFIG.external ? [...CONFIG.external, 'brisa'] : ['brisa']; + const res = await Bun.build({ + entrypoints: [barrelFile], + outdir: join(BUILD_DIR, 'actions'), + external, + sourcemap: IS_PRODUCTION ? undefined : 'inline', + root: rawActionsDir, + target: isNode ? 'node' : 'bun', + minify: IS_PRODUCTION, + splitting: true, + define, + }); + + if (!res.success) { + logBuildError('Failed to compile actions', res.logs); + } + + fs.rmSync(rawActionsDir, { recursive: true }); + + return res; +}