remove --no-node-snapshots flag

Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
This commit is contained in:
aramissennyeydd
2025-12-08 17:28:19 -05:00
parent f6f22a9509
commit 0def824b4d
6 changed files with 71 additions and 59 deletions
+1 -1
View File
@@ -203,7 +203,7 @@ jobs:
env:
CI: true
NODE_OPTIONS: --max-old-space-size=8192 --no-node-snapshot --experimental-vm-modules
NODE_OPTIONS: --max-old-space-size=8192 --experimental-vm-modules
INTEGRATION_TEST_GITHUB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITHUB_TOKEN }}
INTEGRATION_TEST_GITLAB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITLAB_TOKEN }}
INTEGRATION_TEST_BITBUCKET_TOKEN: ${{ secrets.INTEGRATION_TEST_BITBUCKET_TOKEN }}
+1 -1
View File
@@ -28,7 +28,7 @@ jobs:
env:
CI: true
NODE_OPTIONS: --max-old-space-size=8192 --no-node-snapshot --experimental-vm-modules
NODE_OPTIONS: --max-old-space-size=8192 --experimental-vm-modules
name: E2E Windows ${{ matrix.node-version }}
steps:
+1 -1
View File
@@ -21,7 +21,7 @@ jobs:
env:
CI: true
NODE_OPTIONS: --max-old-space-size=8192 --no-node-snapshot --experimental-vm-modules
NODE_OPTIONS: --max-old-space-size=8192 --experimental-vm-modules
INTEGRATION_TEST_GITHUB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITHUB_TOKEN }}
INTEGRATION_TEST_GITLAB_TOKEN: ${{ secrets.INTEGRATION_TEST_GITLAB_TOKEN }}
INTEGRATION_TEST_BITBUCKET_TOKEN: ${{ secrets.INTEGRATION_TEST_BITBUCKET_TOKEN }}
+1 -1
View File
@@ -610,7 +610,7 @@ With that in mind, here are some IDEs configurations to run backstage components
1. Click on "Edit Configurations" on top panel
2. In the modal dialog click on link "Edit configuration templates..." located in the bottom left corner.
3. "Configuration file": leave empty (`backstage-cli` adds the config)
4. "Node options": `--no-node-snapshot --experimental-vm-modules`
4. "Node options": ` --experimental-vm-modules`
5. "Jest package": `~/workspace/backstage/node_modules/@backstage/cli` - the location of the backstage cli package.
6. "Working directory": `~/workspace/backstage`
7. "Jest Options": `repo test --runInBand --watch=false`
@@ -15,6 +15,7 @@
*/
import { runBackend } from './runBackend';
import spawn from 'cross-spawn';
// Mock external dependencies
jest.mock('chokidar', () => ({
@@ -51,8 +52,12 @@ jest.mock('ctrlc-windows', () => ({
describe('runBackend', () => {
let originalEnv: NodeJS.ProcessEnv;
let originalPlatform: string;
const mockSpawn = spawn as jest.MockedFunction<typeof spawn>;
beforeEach(() => {
// Use fake timers to control debounce
jest.useFakeTimers();
// Save original environment
originalEnv = { ...process.env };
originalPlatform = process.platform;
@@ -76,44 +81,56 @@ describe('runBackend', () => {
});
jest.clearAllMocks();
jest.useRealTimers();
});
describe('NODE_OPTIONS environment variable', () => {
it('should add --no-node-snapshot when NODE_OPTIONS is not set', async () => {
describe('--no-node-snapshot argument handling', () => {
it('should pass --no-node-snapshot when NODE_OPTIONS is not set', () => {
delete process.env.NODE_OPTIONS;
runBackend({
entry: 'src/index',
});
expect(process.env.NODE_OPTIONS).toBe('--no-node-snapshot');
// Fast-forward past the debounce delay (100ms)
jest.advanceTimersByTime(100);
expect(mockSpawn).toHaveBeenCalled();
const spawnArgs = mockSpawn.mock.calls[0][1] as string[];
expect(spawnArgs).toContain('--no-node-snapshot');
});
it('should append --no-node-snapshot when NODE_OPTIONS exists without it', async () => {
it('should pass --no-node-snapshot when NODE_OPTIONS exists without --node-snapshot', () => {
process.env.NODE_OPTIONS = '--max-old-space-size=4096';
runBackend({
entry: 'src/index',
});
expect(process.env.NODE_OPTIONS).toBe(
'--max-old-space-size=4096 --no-node-snapshot',
);
// Fast-forward past the debounce delay (100ms)
jest.advanceTimersByTime(100);
expect(mockSpawn).toHaveBeenCalled();
const spawnArgs = mockSpawn.mock.calls[0][1] as string[];
expect(spawnArgs).toContain('--no-node-snapshot');
});
it('should not add --no-node-snapshot when --node-snapshot already exists', async () => {
it('should not pass --no-node-snapshot when --node-snapshot already exists in NODE_OPTIONS', () => {
process.env.NODE_OPTIONS = '--node-snapshot --max-old-space-size=4096';
runBackend({
entry: 'src/index',
});
expect(process.env.NODE_OPTIONS).toBe(
'--node-snapshot --max-old-space-size=4096',
);
// Fast-forward past the debounce delay (100ms)
jest.advanceTimersByTime(100);
expect(mockSpawn).toHaveBeenCalled();
const spawnArgs = mockSpawn.mock.calls[0][1] as string[];
expect(spawnArgs).not.toContain('--no-node-snapshot');
});
it('should not add --no-node-snapshot when --node-snapshot exists in the middle of NODE_OPTIONS', async () => {
it('should not pass --no-node-snapshot when --node-snapshot exists in the middle of NODE_OPTIONS', () => {
process.env.NODE_OPTIONS =
'--max-old-space-size=4096 --node-snapshot --inspect';
@@ -121,26 +138,49 @@ describe('runBackend', () => {
entry: 'src/index',
});
expect(process.env.NODE_OPTIONS).toBe(
'--max-old-space-size=4096 --node-snapshot --inspect',
);
// Fast-forward past the debounce delay (100ms)
jest.advanceTimersByTime(100);
expect(mockSpawn).toHaveBeenCalled();
const spawnArgs = mockSpawn.mock.calls[0][1] as string[];
expect(spawnArgs).not.toContain('--no-node-snapshot');
});
it('should handle NODE_OPTIONS with trailing spaces', async () => {
it('should pass --no-node-snapshot even with trailing spaces in NODE_OPTIONS', () => {
process.env.NODE_OPTIONS = '--max-old-space-size=4096 ';
runBackend({
entry: 'src/index',
});
expect(process.env.NODE_OPTIONS).toBe(
'--max-old-space-size=4096 --no-node-snapshot',
);
// Fast-forward past the debounce delay (100ms)
jest.advanceTimersByTime(100);
expect(mockSpawn).toHaveBeenCalled();
const spawnArgs = mockSpawn.mock.calls[0][1] as string[];
expect(spawnArgs).toContain('--no-node-snapshot');
});
it('should pass --no-node-snapshot alongside other option args like --inspect', () => {
delete process.env.NODE_OPTIONS;
runBackend({
entry: 'src/index',
inspectEnabled: true,
});
// Fast-forward past the debounce delay (100ms)
jest.advanceTimersByTime(100);
expect(mockSpawn).toHaveBeenCalled();
const spawnArgs = mockSpawn.mock.calls[0][1] as string[];
expect(spawnArgs).toContain('--no-node-snapshot');
expect(spawnArgs).toContain('--inspect');
});
});
describe('NODE_ENV environment variable', () => {
it('should set NODE_ENV to development when not set', async () => {
it('should set NODE_ENV to development when not set', () => {
delete process.env.NODE_ENV;
runBackend({
@@ -150,7 +190,7 @@ describe('runBackend', () => {
expect(process.env.NODE_ENV).toBe('development');
});
it('should not override existing NODE_ENV', async () => {
it('should not override existing NODE_ENV', () => {
process.env.NODE_ENV = 'production';
runBackend({
@@ -160,30 +200,4 @@ describe('runBackend', () => {
expect(process.env.NODE_ENV).toBe('production');
});
});
describe('combined environment setup', () => {
it('should set both NODE_ENV and NODE_OPTIONS when neither is set', async () => {
delete process.env.NODE_ENV;
delete process.env.NODE_OPTIONS;
runBackend({
entry: 'src/index',
});
expect(process.env.NODE_ENV).toBe('development');
expect(process.env.NODE_OPTIONS).toBe('--no-node-snapshot');
});
it('should handle both environment variables independently', async () => {
process.env.NODE_ENV = 'test';
process.env.NODE_OPTIONS = '--inspect';
runBackend({
entry: 'src/index',
});
expect(process.env.NODE_ENV).toBe('test');
expect(process.env.NODE_OPTIONS).toBe('--inspect --no-node-snapshot');
});
});
});
@@ -52,14 +52,6 @@ export async function runBackend(options: RunBackendOptions) {
envEnv.NODE_ENV = 'development';
}
// Unless the user explicitly toggles node-snapshot, default to provide --no-node-snapshot to reduce number of steps to run scaffolder
// on Node LTS.
if (!envEnv.NODE_OPTIONS?.includes('--node-snapshot')) {
envEnv.NODE_OPTIONS =
(envEnv.NODE_OPTIONS ? envEnv.NODE_OPTIONS + ' ' : '') +
'--no-node-snapshot';
}
// Set up the parent IPC server and bind the available services
const server = new IpcServer();
ServerDataStore.bind(server);
@@ -123,6 +115,12 @@ export async function runBackend(options: RunBackendOptions) {
}
}
// Unless the user explicitly toggles node-snapshot, default to provide --no-node-snapshot to reduce number of steps to run scaffolder
// on Node LTS.
if (!envEnv.NODE_OPTIONS?.includes('--node-snapshot')) {
optionArgs.push('--no-node-snapshot');
}
const userArgs = process.argv
.slice(['node', 'backstage-cli', 'package', 'start'].length)
.filter(arg => !optionArgs.includes(arg));