| // Flags: --enable-source-maps --max-old-space-size=10 --expose-gc |
| |
| /** |
| * This test verifies that the source map of a CJS module is cleared after the |
| * CJS module is reclaimed by GC. |
| */ |
| |
| 'use strict'; |
| require('../common'); |
| const { gcUntil } = require('../common/gc'); |
| const assert = require('node:assert'); |
| const { findSourceMap } = require('node:module'); |
| |
| const moduleId = require.resolve('../fixtures/source-map/no-throw.js'); |
| const moduleIdRepeat = require.resolve('../fixtures/source-map/no-throw2.js'); |
| |
| function run(moduleId) { |
| require(moduleId); |
| delete require.cache[moduleId]; |
| const idx = module.children.findIndex((child) => child.id === moduleId); |
| assert.ok(idx >= 0); |
| module.children.splice(idx, 1); |
| |
| // Verify that the source map is still available |
| assert.notStrictEqual(findSourceMap(moduleId), undefined); |
| } |
| |
| // Run the test in a function scope so that every variable can be reclaimed by GC. |
| run(moduleId); |
| |
| // Run until the source map is cleared by GC, or fail the test after determined iterations. |
| gcUntil('SourceMap of deleted CJS module is cleared', () => { |
| // Repetitively load a second module with --max-old-space-size=10 to make GC more aggressive. |
| run(moduleIdRepeat); |
| // Verify that the source map is cleared. |
| return findSourceMap(moduleId) == null; |
| }); |