Skip to content

Commit cd30254

Browse files
refactor(cli): create-key (#14501)
1 parent ec3cbe1 commit cd30254

File tree

9 files changed

+107
-63
lines changed

9 files changed

+107
-63
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import type { Logger } from '../../../core/logger/core.js';
2+
import type { KeyGenerator } from '../definitions.js';
3+
4+
interface CreateKeyOptions {
5+
logger: Logger;
6+
keyGenerator: KeyGenerator;
7+
}
8+
9+
export async function createKey({ logger, keyGenerator }: CreateKeyOptions) {
10+
const key = await keyGenerator.generate();
11+
12+
logger.info(
13+
'crypto',
14+
`Generated a key to encrypt props passed to server islands. To reuse the same key across builds, set this value as ASTRO_KEY in an environment variable on your build server.
15+
16+
ASTRO_KEY=${key}`,
17+
);
18+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export interface KeyGenerator {
2+
generate: () => Promise<string>;
3+
}

packages/astro/src/cli/create-key/index.ts

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { createKey, encodeKey } from '../../../core/encryption.js';
2+
import type { KeyGenerator } from '../definitions.js';
3+
4+
export function createCryptoKeyGenerator(): KeyGenerator {
5+
return {
6+
async generate() {
7+
const key = await createKey();
8+
const encoded = await encodeKey(key);
9+
return encoded;
10+
},
11+
};
12+
}

packages/astro/src/cli/index.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,16 @@ async function runCommand(cmd: string, flags: yargs.Arguments) {
109109
return;
110110
}
111111
case 'create-key': {
112-
const { createKey } = await import('./create-key/index.js');
113-
const exitCode = await createKey({ flags });
114-
return process.exit(exitCode);
112+
const [{ createKey }, { createLoggerFromFlags }, { createCryptoKeyGenerator }] =
113+
await Promise.all([
114+
import('./create-key/core/create-key.js'),
115+
import('./flags.js'),
116+
import('./create-key/infra/crypto-key-generator.js'),
117+
]);
118+
const logger = createLoggerFromFlags(flags);
119+
const keyGenerator = createCryptoKeyGenerator();
120+
await createKey({ logger, keyGenerator });
121+
return;
115122
}
116123
case 'docs': {
117124
const { docs } = await import('./docs/index.js');

packages/astro/test/units/assets/fonts/orchestrate.test.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ import { createBuildUrlProxyHashResolver } from '../../../../dist/assets/fonts/i
2020
import { createDevUrlResolver } from '../../../../dist/assets/fonts/implementations/url-resolver.js';
2121
import { orchestrate } from '../../../../dist/assets/fonts/orchestrate.js';
2222
import { defineAstroFontProvider } from '../../../../dist/assets/fonts/providers/index.js';
23-
import { defaultLogger } from '../../test-utils.js';
23+
import { createSpyLogger, defaultLogger } from '../../test-utils.js';
2424
import {
25-
createSpyLogger,
2625
createSpyStorage,
2726
fakeFontMetricsResolver,
2827
fakeHasher,

packages/astro/test/units/assets/fonts/utils.js

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -83,31 +83,6 @@ export const fakeFontMetricsResolver = {
8383
},
8484
};
8585

86-
export function createSpyLogger() {
87-
/** @type {Array<{ type: string; label: string | null; message: string }>} */
88-
const logs = [];
89-
90-
/** @type {import('../../../../dist/core/logger/core').Logger} */
91-
const logger = {
92-
debug: (label, ...messages) => {
93-
logs.push(...messages.map((message) => ({ type: 'debug', label, message })));
94-
},
95-
error: (label, message) => {
96-
logs.push({ type: 'error', label, message });
97-
},
98-
info: (label, message) => {
99-
logs.push({ type: 'info', label, message });
100-
},
101-
warn: (label, message) => {
102-
logs.push({ type: 'warn', label, message });
103-
},
104-
};
105-
return {
106-
logs,
107-
logger,
108-
};
109-
}
110-
11186
/**
11287
* @param {string} input
11388
*/
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// @ts-check
2+
import assert from 'node:assert/strict';
3+
import { describe, it } from 'node:test';
4+
import { createKey } from '../../../dist/cli/create-key/core/create-key.js';
5+
import { createSpyLogger } from '../test-utils.js';
6+
7+
describe('CLI create-key', () => {
8+
describe('core', () => {
9+
describe('create-key', () => {
10+
it('logs the generated key', async () => {
11+
const { logger, logs } = createSpyLogger();
12+
13+
await createKey({
14+
logger,
15+
keyGenerator: {
16+
generate: async () => 'FOO',
17+
},
18+
});
19+
20+
assert.equal(logs[0].type, 'info');
21+
assert.equal(logs[0].label, 'crypto');
22+
assert.match(logs[0].message, /ASTRO_KEY=FOO/);
23+
});
24+
});
25+
});
26+
});

packages/astro/test/units/test-utils.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { getDefaultClientDirectives } from '../../dist/core/client-directive/ind
77
import { resolveConfig } from '../../dist/core/config/index.js';
88
import { createBaseSettings } from '../../dist/core/config/settings.js';
99
import { createContainer } from '../../dist/core/dev/container.js';
10-
import { Logger } from '../../dist/core/logger/core.js';
10+
import { AstroIntegrationLogger, Logger } from '../../dist/core/logger/core.js';
1111
import { nodeLogDestination } from '../../dist/core/logger/node.js';
1212
import { NOOP_MIDDLEWARE_FN } from '../../dist/core/middleware/noop-middleware.js';
1313
import { Pipeline } from '../../dist/core/render/index.js';
@@ -167,3 +167,39 @@ export async function runInContainer(options = {}, callback) {
167167
await container.close();
168168
}
169169
}
170+
171+
export function createSpyLogger() {
172+
/** @type {Array<{ type: string; label: string | null; message: string }>} */
173+
const logs = [];
174+
175+
/** @type {import('../../dist/core/logger/core').Logger} */
176+
const logger = {
177+
debug: (label, ...messages) => {
178+
logs.push(...messages.map((message) => ({ type: 'debug', label, message })));
179+
},
180+
error: (label, message) => {
181+
logs.push({ type: 'error', label, message });
182+
},
183+
info: (label, message) => {
184+
logs.push({ type: 'info', label, message });
185+
},
186+
warn: (label, message) => {
187+
logs.push({ type: 'warn', label, message });
188+
},
189+
options: {
190+
dest: {
191+
write: () => true,
192+
},
193+
level: 'silent',
194+
},
195+
level: () => 'silent',
196+
forkIntegrationLogger(label) {
197+
return new AstroIntegrationLogger(this.options, label);
198+
},
199+
};
200+
201+
return {
202+
logs,
203+
logger,
204+
};
205+
}

0 commit comments

Comments
 (0)