Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@knighted/specifier",
"version": "3.1.0",
"version": "3.2.0",
"description": "Node.js tool for updating your ES module and CommonJS specifiers.",
"type": "module",
"main": "dist",
Expand Down
24 changes: 24 additions & 0 deletions src/format.ts
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,30 @@ const format = async (src: string, ast: ParseResult, cb: Callback) => {
'BlockStatement:exit'() {
popScope()
},
ForStatement() {
pushScope()
},
'ForStatement:exit'() {
popScope()
},
ForInStatement() {
pushScope()
},
'ForInStatement:exit'() {
popScope()
},
ForOfStatement() {
pushScope()
},
'ForOfStatement:exit'() {
popScope()
},
SwitchStatement() {
pushScope()
},
'SwitchStatement:exit'() {
popScope()
},
Comment thread
knightedcodemonkey marked this conversation as resolved.
CatchClause(node) {
pushScope()

Expand Down
98 changes: 98 additions & 0 deletions test/updateSrc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -329,4 +329,102 @@ describe('updateSrc', () => {

assert.ok(update.indexOf("loader('./outside.mjs')") > -1)
})

it('does not rewrite require shadowed by for-of scope', async () => {
const update = await specifier.updateSrc(
`
for (const require of [value => value]) {
require('./skip.js')
}

require('./rewrite.js')
`,
'js',
spec => {
return spec.value.replace('.js', '.mjs')
},
)

assert.ok(update.indexOf("require('./skip.js')") > -1)
assert.ok(update.indexOf("require('./rewrite.mjs')") > -1)
})

it('does not rewrite require shadowed by for-in scope', async () => {
const update = await specifier.updateSrc(
`
for (const require in { value: 1 }) {
require('./skip.js')
}

require('./rewrite.js')
`,
'js',
spec => {
return spec.value.replace('.js', '.mjs')
},
)

assert.ok(update.indexOf("require('./skip.js')") > -1)
assert.ok(update.indexOf("require('./rewrite.mjs')") > -1)
})

it('does not rewrite require shadowed by for scope', async () => {
const update = await specifier.updateSrc(
`
for (let require = value => value; false; ) {
require('./skip.js')
}

require('./rewrite.js')
`,
'js',
spec => {
return spec.value.replace('.js', '.mjs')
},
)

assert.ok(update.indexOf("require('./skip.js')") > -1)
assert.ok(update.indexOf("require('./rewrite.mjs')") > -1)
})

it('does not rewrite require shadowed by switch scope', async () => {
const update = await specifier.updateSrc(
`
switch (0) {
default:
const require = value => value
require('./skip.js')
}

require('./rewrite.js')
`,
'js',
spec => {
return spec.value.replace('.js', '.mjs')
},
)

assert.ok(update.indexOf("require('./skip.js')") > -1)
assert.ok(update.indexOf("require('./rewrite.mjs')") > -1)
})

it('does not desync createRequire tracking after a re-export declaration', async () => {
const update = await specifier.updateSrc(
`
export { foo } from './reexport.js'

const { createRequire } = require('node:module')
const customRequire = createRequire(import.meta.url)

customRequire('./rewrite.js')
`,
'js',
spec => {
return spec.value.replace('.js', '.mjs')
},
)

assert.ok(update.indexOf("from './reexport.mjs'") > -1)
assert.ok(update.indexOf("customRequire('./rewrite.mjs')") > -1)
})
})
Loading