Path: blob/main/tests/src/rules/dynamic-import-chunkname.js
829 views
import { SYNTAX_CASES, getTSParsers } from '../utils';1import { RuleTester } from 'eslint';2import semver from 'semver';34const rule = require('rules/dynamic-import-chunkname');5const ruleTester = new RuleTester();67const commentFormat = '[0-9a-zA-Z-_/.]+';8const pickyCommentFormat = '[a-zA-Z-_/.]+';9const options = [{ importFunctions: ['dynamicImport'] }];10const pickyCommentOptions = [{11importFunctions: ['dynamicImport'],12webpackChunknameFormat: pickyCommentFormat,13}];14const multipleImportFunctionOptions = [{15importFunctions: ['dynamicImport', 'definitelyNotStaticImport'],16}];17const parser = require.resolve('babel-eslint');1819const noLeadingCommentError = 'dynamic imports require a leading comment with the webpack chunkname';20const nonBlockCommentError = 'dynamic imports require a /* foo */ style comment, not a // foo comment';21const noPaddingCommentError = 'dynamic imports require a block comment padded with spaces - /* foo */';22const invalidSyntaxCommentError = 'dynamic imports require a "webpack" comment with valid syntax';23const commentFormatError = `dynamic imports require a leading comment in the form /* webpackChunkName: ["']${commentFormat}["'],? */`;24const pickyCommentFormatError = `dynamic imports require a leading comment in the form /* webpackChunkName: ["']${pickyCommentFormat}["'],? */`;2526ruleTester.run('dynamic-import-chunkname', rule, {27valid: [28{29code: `dynamicImport(30/* webpackChunkName: "someModule" */31'test'32)`,33options,34},35{36code: `dynamicImport(37/* webpackChunkName: "Some_Other_Module" */38"test"39)`,40options,41},42{43code: `dynamicImport(44/* webpackChunkName: "SomeModule123" */45"test"46)`,47options,48},49{50code: `dynamicImport(51/* webpackChunkName: "someModule" */52'someModule'53)`,54options: pickyCommentOptions,55errors: [{56message: pickyCommentFormatError,57type: 'CallExpression',58}],59},60{61code: `import(62/* webpackChunkName: "someModule" */63'test'64)`,65options,66parser,67},68{69code: `import(70/* webpackChunkName: "Some_Other_Module" */71"test"72)`,73options,74parser,75},76{77code: `import(78/* webpackChunkName: "SomeModule123" */79"test"80)`,81options,82parser,83},84{85code: `import(86/* webpackChunkName: "someModule", webpackPrefetch: true */87'test'88)`,89options,90parser,91},92{93code: `import(94/* webpackChunkName: "someModule", webpackPrefetch: true, */95'test'96)`,97options,98parser,99},100{101code: `import(102/* webpackPrefetch: true, webpackChunkName: "someModule" */103'test'104)`,105options,106parser,107},108{109code: `import(110/* webpackPrefetch: true, webpackChunkName: "someModule", */111'test'112)`,113options,114parser,115},116{117code: `import(118/* webpackPrefetch: true */119/* webpackChunkName: "someModule" */120'test'121)`,122options,123parser,124},125{126code: `import(127/* webpackChunkName: "someModule" */128/* webpackPrefetch: true */129'test'130)`,131options,132parser,133},134{135code: `import(136/* webpackChunkName: 'someModule' */137'someModule'138)`,139options,140parser,141},142{143code: `import(144/* webpackChunkName: "someModule" */145'someModule'146)`,147options: pickyCommentOptions,148parser,149errors: [{150message: pickyCommentFormatError,151type: 'CallExpression',152}],153},154...SYNTAX_CASES,155],156157invalid: [158{159code: `import(160// webpackChunkName: "someModule"161'someModule'162)`,163options,164parser,165output: `import(166// webpackChunkName: "someModule"167'someModule'168)`,169errors: [{170message: nonBlockCommentError,171type: 'CallExpression',172}],173},174{175code: 'import(\'test\')',176options,177parser,178output: 'import(\'test\')',179errors: [{180message: noLeadingCommentError,181type: 'CallExpression',182}],183},184{185code: `import(186/* webpackChunkName: someModule */187'someModule'188)`,189options,190parser,191output: `import(192/* webpackChunkName: someModule */193'someModule'194)`,195errors: [{196message: invalidSyntaxCommentError,197type: 'CallExpression',198}],199},200{201code: `import(202/* webpackChunkName: "someModule' */203'someModule'204)`,205options,206parser,207output: `import(208/* webpackChunkName: "someModule' */209'someModule'210)`,211errors: [{212message: invalidSyntaxCommentError,213type: 'CallExpression',214}],215},216{217code: `import(218/* webpackChunkName: 'someModule" */219'someModule'220)`,221options,222parser,223output: `import(224/* webpackChunkName: 'someModule" */225'someModule'226)`,227errors: [{228message: invalidSyntaxCommentError,229type: 'CallExpression',230}],231},232{233code: `import(234/* webpackChunkName "someModule" */235'someModule'236)`,237options,238parser,239output: `import(240/* webpackChunkName "someModule" */241'someModule'242)`,243errors: [{244message: invalidSyntaxCommentError,245type: 'CallExpression',246}],247},248{249code: `import(250/* webpackChunkName:"someModule" */251'someModule'252)`,253options,254parser,255output: `import(256/* webpackChunkName:"someModule" */257'someModule'258)`,259errors: [{260message: commentFormatError,261type: 'CallExpression',262}],263},264{265code: `import(266/*webpackChunkName: "someModule"*/267'someModule'268)`,269options,270parser,271output: `import(272/*webpackChunkName: "someModule"*/273'someModule'274)`,275errors: [{276message: noPaddingCommentError,277type: 'CallExpression',278}],279},280{281code: `import(282/* webpackChunkName : "someModule" */283'someModule'284)`,285options,286parser,287output: `import(288/* webpackChunkName : "someModule" */289'someModule'290)`,291errors: [{292message: commentFormatError,293type: 'CallExpression',294}],295},296{297code: `import(298/* webpackChunkName: "someModule" ; */299'someModule'300)`,301options,302parser,303output: `import(304/* webpackChunkName: "someModule" ; */305'someModule'306)`,307errors: [{308message: invalidSyntaxCommentError,309type: 'CallExpression',310}],311},312{313code: `import(314/* totally not webpackChunkName: "someModule" */315'someModule'316)`,317options,318parser,319output: `import(320/* totally not webpackChunkName: "someModule" */321'someModule'322)`,323errors: [{324message: invalidSyntaxCommentError,325type: 'CallExpression',326}],327},328{329code: `import(330/* webpackPrefetch: true */331/* webpackChunk: "someModule" */332'someModule'333)`,334options,335parser,336output: `import(337/* webpackPrefetch: true */338/* webpackChunk: "someModule" */339'someModule'340)`,341errors: [{342message: commentFormatError,343type: 'CallExpression',344}],345},346{347code: `import(348/* webpackPrefetch: true, webpackChunk: "someModule" */349'someModule'350)`,351options,352parser,353output: `import(354/* webpackPrefetch: true, webpackChunk: "someModule" */355'someModule'356)`,357errors: [{358message: commentFormatError,359type: 'CallExpression',360}],361},362{363code: `import(364/* webpackChunkName: "someModule123" */365'someModule'366)`,367options: pickyCommentOptions,368parser,369output: `import(370/* webpackChunkName: "someModule123" */371'someModule'372)`,373errors: [{374message: pickyCommentFormatError,375type: 'CallExpression',376}],377},378{379code: `dynamicImport(380/* webpackChunkName "someModule" */381'someModule'382)`,383options: multipleImportFunctionOptions,384output: `dynamicImport(385/* webpackChunkName "someModule" */386'someModule'387)`,388errors: [{389message: invalidSyntaxCommentError,390type: 'CallExpression',391}],392},393{394code: `definitelyNotStaticImport(395/* webpackChunkName "someModule" */396'someModule'397)`,398options: multipleImportFunctionOptions,399output: `definitelyNotStaticImport(400/* webpackChunkName "someModule" */401'someModule'402)`,403errors: [{404message: invalidSyntaxCommentError,405type: 'CallExpression',406}],407},408{409code: `dynamicImport(410// webpackChunkName: "someModule"411'someModule'412)`,413options,414output: `dynamicImport(415// webpackChunkName: "someModule"416'someModule'417)`,418errors: [{419message: nonBlockCommentError,420type: 'CallExpression',421}],422},423{424code: 'dynamicImport(\'test\')',425options,426output: 'dynamicImport(\'test\')',427errors: [{428message: noLeadingCommentError,429type: 'CallExpression',430}],431},432{433code: `dynamicImport(434/* webpackChunkName: someModule */435'someModule'436)`,437options,438output: `dynamicImport(439/* webpackChunkName: someModule */440'someModule'441)`,442errors: [{443message: invalidSyntaxCommentError,444type: 'CallExpression',445}],446},447{448code: `dynamicImport(449/* webpackChunkName "someModule" */450'someModule'451)`,452options,453output: `dynamicImport(454/* webpackChunkName "someModule" */455'someModule'456)`,457errors: [{458message: invalidSyntaxCommentError,459type: 'CallExpression',460}],461},462{463code: `dynamicImport(464/* webpackChunkName:"someModule" */465'someModule'466)`,467options,468output: `dynamicImport(469/* webpackChunkName:"someModule" */470'someModule'471)`,472errors: [{473message: commentFormatError,474type: 'CallExpression',475}],476},477{478code: `dynamicImport(479/* webpackChunkName: "someModule123" */480'someModule'481)`,482options: pickyCommentOptions,483output: `dynamicImport(484/* webpackChunkName: "someModule123" */485'someModule'486)`,487errors: [{488message: pickyCommentFormatError,489type: 'CallExpression',490}],491},492],493});494495context('TypeScript', () => {496getTSParsers().forEach((typescriptParser) => {497const nodeType = typescriptParser.includes('typescript-eslint-parser') || (typescriptParser.includes('@typescript-eslint/parser') && semver.satisfies(require('@typescript-eslint/parser/package.json').version, '^2'))498? 'CallExpression'499: 'ImportExpression';500501ruleTester.run('dynamic-import-chunkname', rule, {502valid: [503{504code: `import(505/* webpackChunkName: "someModule" */506'test'507)`,508options,509parser: typescriptParser,510},511{512code: `import(513/* webpackChunkName: "Some_Other_Module" */514"test"515)`,516options,517parser: typescriptParser,518},519{520code: `import(521/* webpackChunkName: "SomeModule123" */522"test"523)`,524options,525parser: typescriptParser,526},527{528code: `import(529/* webpackChunkName: "someModule", webpackPrefetch: true */530'test'531)`,532options,533parser: typescriptParser,534},535{536code: `import(537/* webpackChunkName: "someModule", webpackPrefetch: true, */538'test'539)`,540options,541parser: typescriptParser,542},543{544code: `import(545/* webpackPrefetch: true, webpackChunkName: "someModule" */546'test'547)`,548options,549parser: typescriptParser,550},551{552code: `import(553/* webpackPrefetch: true, webpackChunkName: "someModule", */554'test'555)`,556options,557parser: typescriptParser,558},559{560code: `import(561/* webpackPrefetch: true */562/* webpackChunkName: "someModule" */563'test'564)`,565options,566parser: typescriptParser,567},568{569code: `import(570/* webpackChunkName: "someModule" */571/* webpackPrefetch: true */572'test'573)`,574options,575parser: typescriptParser,576},577{578code: `import(579/* webpackChunkName: "someModule" */580'someModule'581)`,582options: pickyCommentOptions,583parser: typescriptParser,584errors: [{585message: pickyCommentFormatError,586type: nodeType,587}],588},589{590code: `import(591/* webpackChunkName: 'someModule' */592'test'593)`,594options,595parser: typescriptParser,596},597],598invalid: [599{600code: `import(601// webpackChunkName: "someModule"602'someModule'603)`,604options,605parser: typescriptParser,606output: `import(607// webpackChunkName: "someModule"608'someModule'609)`,610errors: [{611message: nonBlockCommentError,612type: nodeType,613}],614},615{616code: 'import(\'test\')',617options,618parser: typescriptParser,619output: 'import(\'test\')',620errors: [{621message: noLeadingCommentError,622type: nodeType,623}],624},625{626code: `import(627/* webpackChunkName: someModule */628'someModule'629)`,630options,631parser: typescriptParser,632output: `import(633/* webpackChunkName: someModule */634'someModule'635)`,636errors: [{637message: invalidSyntaxCommentError,638type: nodeType,639}],640},641{642code: `import(643/* webpackChunkName "someModule' */644'someModule'645)`,646options,647parser: typescriptParser,648output: `import(649/* webpackChunkName "someModule' */650'someModule'651)`,652errors: [{653message: invalidSyntaxCommentError,654type: nodeType,655}],656},657{658code: `import(659/* webpackChunkName 'someModule" */660'someModule'661)`,662options,663parser: typescriptParser,664output: `import(665/* webpackChunkName 'someModule" */666'someModule'667)`,668errors: [{669message: invalidSyntaxCommentError,670type: nodeType,671}],672},673{674code: `import(675/* webpackChunkName "someModule" */676'someModule'677)`,678options,679parser: typescriptParser,680output: `import(681/* webpackChunkName "someModule" */682'someModule'683)`,684errors: [{685message: invalidSyntaxCommentError,686type: nodeType,687}],688},689{690code: `import(691/* webpackChunkName:"someModule" */692'someModule'693)`,694options,695parser: typescriptParser,696output: `import(697/* webpackChunkName:"someModule" */698'someModule'699)`,700errors: [{701message: commentFormatError,702type: nodeType,703}],704},705{706code: `import(707/*webpackChunkName: "someModule"*/708'someModule'709)`,710options,711parser: typescriptParser,712output: `import(713/*webpackChunkName: "someModule"*/714'someModule'715)`,716errors: [{717message: noPaddingCommentError,718type: nodeType,719}],720},721{722code: `import(723/* webpackChunkName : "someModule" */724'someModule'725)`,726options,727parser: typescriptParser,728output: `import(729/* webpackChunkName : "someModule" */730'someModule'731)`,732errors: [{733message: commentFormatError,734type: nodeType,735}],736},737{738code: `import(739/* webpackChunkName: "someModule" ; */740'someModule'741)`,742options,743parser: typescriptParser,744output: `import(745/* webpackChunkName: "someModule" ; */746'someModule'747)`,748errors: [{749message: invalidSyntaxCommentError,750type: nodeType,751}],752},753{754code: `import(755/* totally not webpackChunkName: "someModule" */756'someModule'757)`,758options,759parser: typescriptParser,760output: `import(761/* totally not webpackChunkName: "someModule" */762'someModule'763)`,764errors: [{765message: invalidSyntaxCommentError,766type: nodeType,767}],768},769{770code: `import(771/* webpackPrefetch: true */772/* webpackChunk: "someModule" */773'someModule'774)`,775options,776parser: typescriptParser,777output: `import(778/* webpackPrefetch: true */779/* webpackChunk: "someModule" */780'someModule'781)`,782errors: [{783message: commentFormatError,784type: nodeType,785}],786},787{788code: `import(789/* webpackPrefetch: true, webpackChunk: "someModule" */790'someModule'791)`,792options,793parser: typescriptParser,794output: `import(795/* webpackPrefetch: true, webpackChunk: "someModule" */796'someModule'797)`,798errors: [{799message: commentFormatError,800type: nodeType,801}],802},803{804code: `import(805/* webpackChunkName: "someModule123" */806'someModule'807)`,808options: pickyCommentOptions,809parser: typescriptParser,810output: `import(811/* webpackChunkName: "someModule123" */812'someModule'813)`,814errors: [{815message: pickyCommentFormatError,816type: nodeType,817}],818},819],820});821});822});823824825