0
Fork 0
mirror of https://github.com/withastro/astro.git synced 2025-04-07 23:41:43 -05:00

fix(astro): dynamically import actions (#13510)

* feat: update test

* feat: dynamic import

* chore: changeset

* Update .changeset/clever-tigers-dig.md
This commit is contained in:
Florian Lefebvre 2025-03-26 10:38:50 +01:00 committed by GitHub
parent e4f870b79a
commit 5b14d33f81
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 96 additions and 51 deletions

View file

@ -0,0 +1,5 @@
---
'astro': patch
---
Fixes a case where `astro:env` secrets used in actions would not be available

View file

@ -0,0 +1,5 @@
import type { SSRActions } from '../core/app/types.js';
export const NOOP_ACTIONS_MOD: SSRActions = {
server: {},
};

View file

@ -77,7 +77,7 @@ export type SSRManifest = {
key: Promise<CryptoKey>;
i18n: SSRManifestI18n | undefined;
middleware?: () => Promise<AstroMiddlewareInstance> | AstroMiddlewareInstance;
actions?: SSRActions;
actions?: () => Promise<SSRActions> | SSRActions;
checkOrigin: boolean;
sessionConfig?: ResolvedSessionConfig<any>;
cacheDir: string | URL;

View file

@ -19,6 +19,7 @@ import { NOOP_MIDDLEWARE_FN } from './middleware/noop-middleware.js';
import { sequence } from './middleware/sequence.js';
import { RouteCache } from './render/route-cache.js';
import { createDefaultRoutes } from './routing/default.js';
import { NOOP_ACTIONS_MOD } from '../actions/noop-actions.js';
/**
* The `Pipeline` represents the static parts of rendering that do not change between requests.
@ -131,9 +132,9 @@ export abstract class Pipeline {
if (this.resolvedActions) {
return this.resolvedActions;
} else if (this.actions) {
return this.actions;
return await this.actions();
}
return { server: {} };
return NOOP_ACTIONS_MOD;
}
async getAction(path: string): Promise<ActionClient<unknown, ActionAccept, ZodType>> {

View file

@ -49,6 +49,7 @@ import type {
StylesheetAsset,
} from './types.js';
import { getTimeStat, shouldAppendForwardSlash } from './util.js';
import { NOOP_ACTIONS_MOD } from '../../actions/noop-actions.js';
export async function generatePages(options: StaticBuildOptions, internals: BuildInternals) {
const generatePagesTimer = performance.now();
@ -66,7 +67,7 @@ export async function generatePages(options: StaticBuildOptions, internals: Buil
const actions: SSRActions = internals.astroActionsEntryPoint
? await import(internals.astroActionsEntryPoint.toString()).then((mod) => mod)
: { server: {} };
: NOOP_ACTIONS_MOD;
manifest = createBuildManifest(
options.settings,
internals,
@ -651,7 +652,7 @@ function createBuildManifest(
onRequest: middleware,
};
},
actions,
actions: () => actions,
checkOrigin:
(settings.config.security?.checkOrigin && settings.buildOutput === 'server') ?? false,
key,

View file

@ -168,7 +168,6 @@ function generateSSRCode(adapter: AstroAdapter, middlewareId: string) {
const imports = [
`import { renderers } from '${RENDERERS_MODULE_ID}';`,
`import * as actions from '${ASTRO_ACTIONS_INTERNAL_MODULE_ID}';`,
`import * as serverEntrypointModule from '${ADAPTER_VIRTUAL_MODULE_ID}';`,
`import { manifest as defaultManifest } from '${SSR_MANIFEST_VIRTUAL_MODULE_ID}';`,
`import { serverIslandMap } from '${VIRTUAL_ISLAND_MAP_ID}';`,
@ -180,7 +179,7 @@ function generateSSRCode(adapter: AstroAdapter, middlewareId: string) {
` pageMap,`,
` serverIslandMap,`,
` renderers,`,
` actions,`,
` actions: () => import("${ASTRO_ACTIONS_INTERNAL_MODULE_ID}"),`,
` middleware: ${edgeMiddleware ? 'undefined' : `() => import("${middlewareId}")`}`,
`});`,
`const _args = ${adapter.args ? JSON.stringify(adapter.args, null, 4) : 'undefined'};`,

View file

@ -62,4 +62,11 @@ describe('astro:env', () => {
const $ = cheerio.load(html);
assert.equal($('#secret').text().includes('123456789'), true);
});
it('action secret', async () => {
const res = await fetch('http://127.0.0.1:8788/test');
const html = await res.text();
const $ = cheerio.load(html);
assert.equal($('#secret').text().includes('123456789'), true);
});
});

View file

@ -7,6 +7,6 @@
"astro": "workspace:*"
},
"devDependencies": {
"wrangler": "^3.112.0"
"wrangler": "^4.4.1"
}
}

View file

@ -0,0 +1,12 @@
import { defineAction } from "astro:actions";
import { API_SECRET } from "astro:env/server";
export const server = {
getSecret: defineAction({
handler(_input, _context) {
return {
secret: API_SECRET,
};
},
}),
};

View file

@ -0,0 +1,9 @@
import { defineMiddleware } from 'astro/middleware'
import { API_SECRET } from 'astro:env/server'
const secret = API_SECRET
export const onRequest = defineMiddleware((_ctx, next) => {
console.log({ secret })
return next()
})

View file

@ -0,0 +1,6 @@
---
import { actions } from "astro:actions";
const { data } = await Astro.callAction(actions.getSecret, {});
---
<span id="secret">{data?.secret}</span>

86
pnpm-lock.yaml generated
View file

@ -4569,7 +4569,7 @@ importers:
version: 0.30.17
miniflare:
specifier: ^4.20250317.0
version: 4.20250319.0
version: 4.20250321.0
tinyglobby:
specifier: ^0.2.12
version: 0.2.12
@ -4578,7 +4578,7 @@ importers:
version: 6.2.3(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.2)(sass@1.86.0)(yaml@2.5.1)
wrangler:
specifier: ^4.2.0
version: 4.3.0(@cloudflare/workers-types@4.20250320.0)
version: 4.4.1(@cloudflare/workers-types@4.20250320.0)
devDependencies:
astro:
specifier: workspace:*
@ -4622,8 +4622,8 @@ importers:
version: link:../../../../../astro
devDependencies:
wrangler:
specifier: ^3.112.0
version: 3.112.0(@cloudflare/workers-types@4.20250320.0)
specifier: ^4.4.1
version: 4.4.1(@cloudflare/workers-types@4.20250320.0)
packages/integrations/cloudflare/test/fixtures/compile-image-service:
dependencies:
@ -6662,11 +6662,11 @@ packages:
resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==}
engines: {node: '>=18.0.0'}
'@cloudflare/unenv-preset@2.2.0':
resolution: {integrity: sha512-U5/TQBjJN/HQ1JA4mzt5sTbvdT9aoucHYGbokY2JWwDkYbgoaTygYBshZpXHUo8lDppsAGdUf3pGlOc6U09HAg==}
'@cloudflare/unenv-preset@2.3.0':
resolution: {integrity: sha512-AaKYnbFpHaVDZGh3Hjy3oLYd12+LZw9aupAOudYJ+tjekahxcIqlSAr0zK9kPOdtgn10tzaqH7QJFUWcLE+k7g==}
peerDependencies:
unenv: 2.0.0-rc.15
workerd: ^1.20250310.0
workerd: ^1.20250311.0
peerDependenciesMeta:
workerd:
optional: true
@ -6677,8 +6677,8 @@ packages:
cpu: [x64]
os: [darwin]
'@cloudflare/workerd-darwin-64@1.20250319.0':
resolution: {integrity: sha512-8B08kYAp1rEgXRe+YV3uCAGYa65KS8V/pajmgh5U4yULLmHryd4OPo8wf3RYl4uk5ZNbtUKR1GUNLkIraTL6Rw==}
'@cloudflare/workerd-darwin-64@1.20250321.0':
resolution: {integrity: sha512-y273GfLaNCxkL8hTfo0c8FZKkOPdq+CPZAKJXPWB+YpS1JCOULu6lNTptpD7ZtF14dTYPkn5Weug31TTlviJmw==}
engines: {node: '>=16'}
cpu: [x64]
os: [darwin]
@ -6689,8 +6689,8 @@ packages:
cpu: [arm64]
os: [darwin]
'@cloudflare/workerd-darwin-arm64@1.20250319.0':
resolution: {integrity: sha512-UW1c15oFYRPxwt4qEQufA/XlK5AnbVJFs7PwXo2suLXhxAdTZUKk0Mg1DgDTN65wmqQimRt4ayLVbfxFpzt0bA==}
'@cloudflare/workerd-darwin-arm64@1.20250321.0':
resolution: {integrity: sha512-qvf7/gkkQq7fAsoMlntJSimN/WfwQqxi2oL0aWZMGodTvs/yRHO2I4oE0eOihVdK1BXyBHJXNxEvNDBjF0+Yuw==}
engines: {node: '>=16'}
cpu: [arm64]
os: [darwin]
@ -6701,8 +6701,8 @@ packages:
cpu: [x64]
os: [linux]
'@cloudflare/workerd-linux-64@1.20250319.0':
resolution: {integrity: sha512-oYrTq/FP74IxaEwqHZep8sPoy5btrb8x9ubt6aYy+A1s8IHqma3bYzDmRJ8AMDl9d5+ASFqkAqB/Cj8HN1agPA==}
'@cloudflare/workerd-linux-64@1.20250321.0':
resolution: {integrity: sha512-AEp3xjWFrNPO/h0StCOgOb0bWCcNThnkESpy91Wf4mfUF2p7tOCdp37Nk/1QIRqSxnfv4Hgxyi7gcWud9cJuMw==}
engines: {node: '>=16'}
cpu: [x64]
os: [linux]
@ -6713,8 +6713,8 @@ packages:
cpu: [arm64]
os: [linux]
'@cloudflare/workerd-linux-arm64@1.20250319.0':
resolution: {integrity: sha512-n9Qy+iA6SQSL3dRLXlkTQEHP65/i6Mk4UOFh67BOlrFJlov+/u77pyGG4koPLcuts0SnGxA0eDNlua6CN/GGAg==}
'@cloudflare/workerd-linux-arm64@1.20250321.0':
resolution: {integrity: sha512-wRWyMIoPIS1UBXCisW0FYTgGsfZD4AVS0hXA5nuLc0c21CvzZpmmTjqEWMcwPFenwy/MNL61NautVOC4qJqQ3Q==}
engines: {node: '>=16'}
cpu: [arm64]
os: [linux]
@ -6725,8 +6725,8 @@ packages:
cpu: [x64]
os: [win32]
'@cloudflare/workerd-windows-64@1.20250319.0':
resolution: {integrity: sha512-MUYzPZiz3wbLtHjfc0RdO0tETTDJF9OcRPNzw8RpWba98Z1uhMX2hQ5gNQNgQJ+Y5TDMlcKHZVIJU/5E7/qcZw==}
'@cloudflare/workerd-windows-64@1.20250321.0':
resolution: {integrity: sha512-8vYP3QYO0zo2faUDfWl88jjfUvz7Si9GS3mUYaTh/TR9LcAUtsO7muLxPamqEyoxNFtbQgy08R4rTid94KRi3w==}
engines: {node: '>=16'}
cpu: [x64]
os: [win32]
@ -10609,8 +10609,8 @@ packages:
engines: {node: '>=16.13'}
hasBin: true
miniflare@4.20250319.0:
resolution: {integrity: sha512-xBBsl1TOkelBcSXikhvu5bQMZucXy8lXNGUgix4Fi0Fuz3d9flMpyIM7XVI5Br1BPqQ3hwwLASMOBBahAJYWag==}
miniflare@4.20250321.0:
resolution: {integrity: sha512-os+NJA7Eqi00BJHdVhzIa+3PMotnCtZg3hiUIRYcsZF5W7He8SK2EkV8csAb+npZq3jZ4SNpDebO01swM5dcWw==}
engines: {node: '>=18.0.0'}
hasBin: true
@ -12605,8 +12605,8 @@ packages:
engines: {node: '>=16'}
hasBin: true
workerd@1.20250319.0:
resolution: {integrity: sha512-/+JfU0Iq+L2DWpJeBCvQIY88OkxoEV5IPbTpa+FFkBTW3eAyE7pV+DpvcvXfG94DFrA3D4z0EE9ZNwVKO5w42A==}
workerd@1.20250321.0:
resolution: {integrity: sha512-vyuz9pdJ+7o1lC79vQ2UVRLXPARa2Lq94PbTfqEcYQeSxeR9X+YqhNq2yysv8Zs5vpokmexLCtMniPp9u+2LVQ==}
engines: {node: '>=16'}
hasBin: true
@ -12620,12 +12620,12 @@ packages:
'@cloudflare/workers-types':
optional: true
wrangler@4.3.0:
resolution: {integrity: sha512-eGSj/Og4cxMF2jwstPswayU2aj9fN4FSX7rF3p+Pqe/EEVrCrs/38YsBXePbAjTs+4F8K/VvWtXYRzZ1xtZRuA==}
wrangler@4.4.1:
resolution: {integrity: sha512-EFwr7hiVeAmPOuOGQ7HFfeaLKLxEXQMJ86kyn6RFB8pGjMEUtvZMsVa9cPubKkKgNi3WcDEFeFLalclGyq+tGA==}
engines: {node: '>=18.0.0'}
hasBin: true
peerDependencies:
'@cloudflare/workers-types': ^4.20250319.0
'@cloudflare/workers-types': ^4.20250321.0
peerDependenciesMeta:
'@cloudflare/workers-types':
optional: true
@ -13302,40 +13302,40 @@ snapshots:
dependencies:
mime: 3.0.0
'@cloudflare/unenv-preset@2.2.0(unenv@2.0.0-rc.15)(workerd@1.20250319.0)':
'@cloudflare/unenv-preset@2.3.0(unenv@2.0.0-rc.15)(workerd@1.20250321.0)':
dependencies:
unenv: 2.0.0-rc.15
optionalDependencies:
workerd: 1.20250319.0
workerd: 1.20250321.0
'@cloudflare/workerd-darwin-64@1.20250214.0':
optional: true
'@cloudflare/workerd-darwin-64@1.20250319.0':
'@cloudflare/workerd-darwin-64@1.20250321.0':
optional: true
'@cloudflare/workerd-darwin-arm64@1.20250214.0':
optional: true
'@cloudflare/workerd-darwin-arm64@1.20250319.0':
'@cloudflare/workerd-darwin-arm64@1.20250321.0':
optional: true
'@cloudflare/workerd-linux-64@1.20250214.0':
optional: true
'@cloudflare/workerd-linux-64@1.20250319.0':
'@cloudflare/workerd-linux-64@1.20250321.0':
optional: true
'@cloudflare/workerd-linux-arm64@1.20250214.0':
optional: true
'@cloudflare/workerd-linux-arm64@1.20250319.0':
'@cloudflare/workerd-linux-arm64@1.20250321.0':
optional: true
'@cloudflare/workerd-windows-64@1.20250214.0':
optional: true
'@cloudflare/workerd-windows-64@1.20250319.0':
'@cloudflare/workerd-windows-64@1.20250321.0':
optional: true
'@cloudflare/workers-types@4.20250320.0': {}
@ -17446,7 +17446,7 @@ snapshots:
- bufferutil
- utf-8-validate
miniflare@4.20250319.0:
miniflare@4.20250321.0:
dependencies:
'@cspotcode/source-map-support': 0.8.1
acorn: 8.14.0
@ -17455,7 +17455,7 @@ snapshots:
glob-to-regexp: 0.4.1
stoppable: 1.1.0
undici: 5.28.5
workerd: 1.20250319.0
workerd: 1.20250321.0
ws: 8.18.0
youch: 3.2.3
zod: 3.22.3
@ -19636,13 +19636,13 @@ snapshots:
'@cloudflare/workerd-linux-arm64': 1.20250214.0
'@cloudflare/workerd-windows-64': 1.20250214.0
workerd@1.20250319.0:
workerd@1.20250321.0:
optionalDependencies:
'@cloudflare/workerd-darwin-64': 1.20250319.0
'@cloudflare/workerd-darwin-arm64': 1.20250319.0
'@cloudflare/workerd-linux-64': 1.20250319.0
'@cloudflare/workerd-linux-arm64': 1.20250319.0
'@cloudflare/workerd-windows-64': 1.20250319.0
'@cloudflare/workerd-darwin-64': 1.20250321.0
'@cloudflare/workerd-darwin-arm64': 1.20250321.0
'@cloudflare/workerd-linux-64': 1.20250321.0
'@cloudflare/workerd-linux-arm64': 1.20250321.0
'@cloudflare/workerd-windows-64': 1.20250321.0
wrangler@3.112.0(@cloudflare/workers-types@4.20250320.0):
dependencies:
@ -19663,16 +19663,16 @@ snapshots:
- bufferutil
- utf-8-validate
wrangler@4.3.0(@cloudflare/workers-types@4.20250320.0):
wrangler@4.4.1(@cloudflare/workers-types@4.20250320.0):
dependencies:
'@cloudflare/kv-asset-handler': 0.4.0
'@cloudflare/unenv-preset': 2.2.0(unenv@2.0.0-rc.15)(workerd@1.20250319.0)
'@cloudflare/unenv-preset': 2.3.0(unenv@2.0.0-rc.15)(workerd@1.20250321.0)
blake3-wasm: 2.1.5
esbuild: 0.24.2
miniflare: 4.20250319.0
miniflare: 4.20250321.0
path-to-regexp: 6.3.0
unenv: 2.0.0-rc.15
workerd: 1.20250319.0
workerd: 1.20250321.0
optionalDependencies:
'@cloudflare/workers-types': 4.20250320.0
fsevents: 2.3.3