|
1 | 1 | import { expect } from 'chai';
|
| 2 | +import eslintPkg from 'eslint/package.json'; |
| 3 | +import semver from 'semver'; |
2 | 4 |
|
3 | 5 | import resolve, { CASE_SENSITIVE_FS, fileExistsWithCaseSync } from 'eslint-module-utils/resolve';
|
4 | 6 | import ModuleCache from 'eslint-module-utils/ModuleCache';
|
@@ -162,6 +164,158 @@ describe('resolve', function () {
|
162 | 164 | expect(testContextReports[0].loc).to.eql({ line: 1, column: 0 });
|
163 | 165 | });
|
164 | 166 |
|
| 167 | + // context.getPhysicalFilename() is available in ESLint 7.28+ |
| 168 | + (semver.satisfies(eslintPkg.version, '>= 7.28') ? describe : describe.skip)('getPhysicalFilename()', () => { |
| 169 | + function unexpectedCallToGetFilename() { |
| 170 | + throw new Error('Expected to call to getPhysicalFilename() instead of getFilename()'); |
| 171 | + } |
| 172 | + |
| 173 | + it('resolves via a custom resolver with interface version 1', function () { |
| 174 | + const testContext = utils.testContext({ 'import/resolver': './foo-bar-resolver-v1' }); |
| 175 | + |
| 176 | + expect(resolve( '../files/foo' |
| 177 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('foo.js'); } }), |
| 178 | + )).to.equal(utils.testFilePath('./bar.jsx')); |
| 179 | + |
| 180 | + expect(resolve( '../files/exception' |
| 181 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('exception.js'); } }), |
| 182 | + )).to.equal(undefined); |
| 183 | + |
| 184 | + expect(resolve( '../files/not-found' |
| 185 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('not-found.js'); } }), |
| 186 | + )).to.equal(undefined); |
| 187 | + }); |
| 188 | + |
| 189 | + it('resolves via a custom resolver with interface version 1 assumed if not specified', function () { |
| 190 | + const testContext = utils.testContext({ 'import/resolver': './foo-bar-resolver-no-version' }); |
| 191 | + |
| 192 | + expect(resolve( '../files/foo' |
| 193 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('foo.js'); } }), |
| 194 | + )).to.equal(utils.testFilePath('./bar.jsx')); |
| 195 | + |
| 196 | + expect(resolve( '../files/exception' |
| 197 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('exception.js'); } }), |
| 198 | + )).to.equal(undefined); |
| 199 | + |
| 200 | + expect(resolve( '../files/not-found' |
| 201 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('not-found.js'); } }), |
| 202 | + )).to.equal(undefined); |
| 203 | + }); |
| 204 | + |
| 205 | + it('resolves via a custom resolver with interface version 2', function () { |
| 206 | + const testContext = utils.testContext({ 'import/resolver': './foo-bar-resolver-v2' }); |
| 207 | + const testContextReports = []; |
| 208 | + testContext.report = function (reportInfo) { |
| 209 | + testContextReports.push(reportInfo); |
| 210 | + }; |
| 211 | + |
| 212 | + expect(resolve( '../files/foo' |
| 213 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('foo.js'); } }), |
| 214 | + )).to.equal(utils.testFilePath('./bar.jsx')); |
| 215 | + |
| 216 | + testContextReports.length = 0; |
| 217 | + expect(resolve( '../files/exception' |
| 218 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('exception.js'); } }), |
| 219 | + )).to.equal(undefined); |
| 220 | + expect(testContextReports[0]).to.be.an('object'); |
| 221 | + expect(replaceErrorStackForTest(testContextReports[0].message)).to.equal('Resolve error: foo-bar-resolver-v2 resolve test exception\n<stack-was-here>'); |
| 222 | + expect(testContextReports[0].loc).to.eql({ line: 1, column: 0 }); |
| 223 | + |
| 224 | + testContextReports.length = 0; |
| 225 | + expect(resolve( '../files/not-found' |
| 226 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('not-found.js'); } }), |
| 227 | + )).to.equal(undefined); |
| 228 | + expect(testContextReports.length).to.equal(0); |
| 229 | + }); |
| 230 | + |
| 231 | + it('respects import/resolver as array of strings', function () { |
| 232 | + const testContext = utils.testContext({ 'import/resolver': [ './foo-bar-resolver-v2', './foo-bar-resolver-v1' ] }); |
| 233 | + |
| 234 | + expect(resolve( '../files/foo' |
| 235 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('foo.js'); } }), |
| 236 | + )).to.equal(utils.testFilePath('./bar.jsx')); |
| 237 | + }); |
| 238 | + |
| 239 | + it('respects import/resolver as object', function () { |
| 240 | + const testContext = utils.testContext({ 'import/resolver': { './foo-bar-resolver-v2': {} } }); |
| 241 | + |
| 242 | + expect(resolve( '../files/foo' |
| 243 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('foo.js'); } }), |
| 244 | + )).to.equal(utils.testFilePath('./bar.jsx')); |
| 245 | + }); |
| 246 | + |
| 247 | + it('respects import/resolver as array of objects', function () { |
| 248 | + const testContext = utils.testContext({ 'import/resolver': [ { './foo-bar-resolver-v2': {} }, { './foo-bar-resolver-v1': {} } ] }); |
| 249 | + |
| 250 | + expect(resolve( '../files/foo' |
| 251 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('foo.js'); } }), |
| 252 | + )).to.equal(utils.testFilePath('./bar.jsx')); |
| 253 | + }); |
| 254 | + |
| 255 | + it('finds resolvers from the source files rather than eslint-module-utils', function () { |
| 256 | + const testContext = utils.testContext({ 'import/resolver': { 'foo': {} } }); |
| 257 | + |
| 258 | + expect(resolve( '../files/foo' |
| 259 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('foo.js'); } }), |
| 260 | + )).to.equal(utils.testFilePath('./bar.jsx')); |
| 261 | + }); |
| 262 | + |
| 263 | + it('reports invalid import/resolver config', function () { |
| 264 | + const testContext = utils.testContext({ 'import/resolver': 123.456 }); |
| 265 | + const testContextReports = []; |
| 266 | + testContext.report = function (reportInfo) { |
| 267 | + testContextReports.push(reportInfo); |
| 268 | + }; |
| 269 | + |
| 270 | + testContextReports.length = 0; |
| 271 | + expect(resolve( '../files/foo' |
| 272 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('foo.js'); } }), |
| 273 | + )).to.equal(undefined); |
| 274 | + expect(testContextReports[0]).to.be.an('object'); |
| 275 | + expect(testContextReports[0].message).to.equal('Resolve error: invalid resolver config'); |
| 276 | + expect(testContextReports[0].loc).to.eql({ line: 1, column: 0 }); |
| 277 | + }); |
| 278 | + |
| 279 | + it('reports loaded resolver with invalid interface', function () { |
| 280 | + const resolverName = './foo-bar-resolver-invalid'; |
| 281 | + const testContext = utils.testContext({ 'import/resolver': resolverName }); |
| 282 | + const testContextReports = []; |
| 283 | + testContext.report = function (reportInfo) { |
| 284 | + testContextReports.push(reportInfo); |
| 285 | + }; |
| 286 | + testContextReports.length = 0; |
| 287 | + expect(resolve( '../files/foo' |
| 288 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('foo.js'); } }), |
| 289 | + )).to.equal(undefined); |
| 290 | + expect(testContextReports[0]).to.be.an('object'); |
| 291 | + expect(testContextReports[0].message).to.equal(`Resolve error: ${resolverName} with invalid interface loaded as resolver`); |
| 292 | + expect(testContextReports[0].loc).to.eql({ line: 1, column: 0 }); |
| 293 | + }); |
| 294 | + |
| 295 | + it('respects import/resolve extensions', function () { |
| 296 | + const testContext = utils.testContext({ 'import/resolve': { 'extensions': ['.jsx'] } }); |
| 297 | + |
| 298 | + expect(resolve( './jsx/MyCoolComponent' |
| 299 | + , testContext, |
| 300 | + )).to.equal(utils.testFilePath('./jsx/MyCoolComponent.jsx')); |
| 301 | + }); |
| 302 | + |
| 303 | + it('reports load exception in a user resolver', function () { |
| 304 | + const testContext = utils.testContext({ 'import/resolver': './load-error-resolver' }); |
| 305 | + const testContextReports = []; |
| 306 | + testContext.report = function (reportInfo) { |
| 307 | + testContextReports.push(reportInfo); |
| 308 | + }; |
| 309 | + |
| 310 | + expect(resolve( '../files/exception' |
| 311 | + , Object.assign({}, testContext, { getFilename: unexpectedCallToGetFilename, getPhysicalFilename: function () { return utils.getFilename('exception.js'); } }), |
| 312 | + )).to.equal(undefined); |
| 313 | + expect(testContextReports[0]).to.be.an('object'); |
| 314 | + expect(replaceErrorStackForTest(testContextReports[0].message)).to.equal('Resolve error: SyntaxError: TEST SYNTAX ERROR\n<stack-was-here>'); |
| 315 | + expect(testContextReports[0].loc).to.eql({ line: 1, column: 0 }); |
| 316 | + }); |
| 317 | + }); |
| 318 | + |
165 | 319 | const caseDescribe = (!CASE_SENSITIVE_FS ? describe : describe.skip);
|
166 | 320 | caseDescribe('case sensitivity', function () {
|
167 | 321 | let file;
|
|
0 commit comments