@servicetitan/startup 37.0.0 → 37.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/test/runners/vitest.ts"],"names":[],"mappings":"AAOA,qBAAa,MAAM;IACT,GAAG;CAQZ"}
1
+ {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/test/runners/vitest.ts"],"names":[],"mappings":"AAQA,qBAAa,MAAM;IACT,GAAG;CAQZ"}
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "Vitest", {
11
11
  const _config = require("vitest/config");
12
12
  const _node = require("vitest/node");
13
13
  const _utils = require("../../../../utils");
14
+ const _plugins = require("../../../../vite/plugins");
14
15
  const _svgtransformer = /*#__PURE__*/ _interop_require_default(require("../../../../vitest/svg-transformer"));
15
16
  function _interop_require_default(obj) {
16
17
  return obj && obj.__esModule ? obj : {
@@ -84,7 +85,12 @@ async function getUserConfig() {
84
85
  const result = (0, _config.mergeConfig)((0, _config.mergeConfig)((0, _utils.omit)(getDefaultConfig(), omitDefault), config), (_viteConfig_test = viteConfig.test) !== null && _viteConfig_test !== void 0 ? _viteConfig_test : {});
85
86
  /* istanbul ignore next: debug only */ _utils.log.debug('vitest:userConfig', ()=>JSON.stringify(result, null, 2));
86
87
  const plugins = [
87
- (0, _svgtransformer.default)()
88
+ (0, _svgtransformer.default)(),
89
+ (0, _plugins.ignoreModulesPlugin)({
90
+ package: {
91
+ dependencies: {}
92
+ }
93
+ })
88
94
  ].filter(({ name })=>!omitDefault.includes(`plugins.${name}`));
89
95
  return {
90
96
  test: result,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/cli/commands/test/runners/vitest.ts"],"sourcesContent":["import { configDefaults, coverageConfigDefaults, mergeConfig, ViteUserConfig } from 'vitest/config';\nimport { parseCLI, resolveConfig, startVitest } from 'vitest/node';\nimport { getDefaultTestExcludes, getVitestConfiguration, log, omit } from '../../../../utils';\nimport svgTransformer from '../../../../vitest/svg-transformer';\n\ntype VitestConfig = NonNullable<ViteUserConfig['test']>;\n\nexport class Vitest {\n async run() {\n const cliOptions = getCliOptions();\n const userConfig = await getUserConfig();\n\n // startVitest sets process.exitCode to 1 when tests fail\n const vitest = await startVitest('test', cliOptions.filter, cliOptions.options, userConfig);\n await vitest.close();\n }\n}\n\nconst RUNNER_OPTION = '--runner';\n\nfunction excludeRunnerOption(args: string[]) {\n return args.reduce<string[]>((result, item, index) => {\n if (!item.startsWith(RUNNER_OPTION) && (index === 0 || args[index - 1] !== RUNNER_OPTION)) {\n result.push(item);\n }\n return result;\n }, []);\n}\n\nfunction getCliOptions() {\n // parseCLI requires the first element to be \"vitest\"\n const result = parseCLI(['vitest', ...excludeRunnerOption(process.argv.slice(3))]);\n\n /* istanbul ignore next: debug only */\n log.debug('vitest:cliOptions', () => JSON.stringify(result, null, 2));\n\n return result;\n}\n\nfunction getDefaultConfig(): VitestConfig {\n return {\n coverage: {\n exclude: [...coverageConfigDefaults.exclude, ...getDefaultTestExcludes()],\n include: ['**/*.{ts,tsx}'],\n reporter: ['html-spa', 'text', 'json', 'cobertura', 'lcov'],\n },\n environment: 'jsdom',\n exclude: [...configDefaults.exclude, ...getDefaultTestExcludes()],\n restoreMocks: true,\n server: { deps: { inline: ['@servicetitan/anvil2'] } }, // fixes css parser errors\n };\n}\n\nasync function getUserConfig(): Promise<ViteUserConfig> {\n const { viteConfig } = await resolveConfig();\n\n const { omitDefault = [], ...config } = getVitestConfiguration();\n\n const result = mergeConfig(\n mergeConfig(omit(getDefaultConfig(), omitDefault), config),\n viteConfig.test ?? {}\n );\n\n /* istanbul ignore next: debug only */\n log.debug('vitest:userConfig', () => JSON.stringify(result, null, 2));\n\n const plugins: NonNullable<ViteUserConfig['plugins']> = [svgTransformer()].filter(\n ({ name }) => !omitDefault.includes(`plugins.${name}`)\n );\n\n return { test: result, ...(plugins.length ? { plugins } : {}) };\n}\n"],"names":["Vitest","run","cliOptions","getCliOptions","userConfig","getUserConfig","vitest","startVitest","filter","options","close","RUNNER_OPTION","excludeRunnerOption","args","reduce","result","item","index","startsWith","push","parseCLI","process","argv","slice","log","debug","JSON","stringify","getDefaultConfig","coverage","exclude","coverageConfigDefaults","getDefaultTestExcludes","include","reporter","environment","configDefaults","restoreMocks","server","deps","inline","viteConfig","resolveConfig","omitDefault","config","getVitestConfiguration","mergeConfig","omit","test","plugins","svgTransformer","name","includes","length"],"mappings":";;;;+BAOaA;;;eAAAA;;;wBAPuE;sBAC/B;uBACqB;uEAC/C;;;;;;AAIpB,MAAMA;IACT,MAAMC,MAAM;QACR,MAAMC,aAAaC;QACnB,MAAMC,aAAa,MAAMC;QAEzB,yDAAyD;QACzD,MAAMC,SAAS,MAAMC,IAAAA,iBAAW,EAAC,QAAQL,WAAWM,MAAM,EAAEN,WAAWO,OAAO,EAAEL;QAChF,MAAME,OAAOI,KAAK;IACtB;AACJ;AAEA,MAAMC,gBAAgB;AAEtB,SAASC,oBAAoBC,IAAc;IACvC,OAAOA,KAAKC,MAAM,CAAW,CAACC,QAAQC,MAAMC;QACxC,IAAI,CAACD,KAAKE,UAAU,CAACP,kBAAmBM,CAAAA,UAAU,KAAKJ,IAAI,CAACI,QAAQ,EAAE,KAAKN,aAAY,GAAI;YACvFI,OAAOI,IAAI,CAACH;QAChB;QACA,OAAOD;IACX,GAAG,EAAE;AACT;AAEA,SAASZ;IACL,qDAAqD;IACrD,MAAMY,SAASK,IAAAA,cAAQ,EAAC;QAAC;WAAaR,oBAAoBS,QAAQC,IAAI,CAACC,KAAK,CAAC;KAAI;IAEjF,oCAAoC,GACpCC,UAAG,CAACC,KAAK,CAAC,qBAAqB,IAAMC,KAAKC,SAAS,CAACZ,QAAQ,MAAM;IAElE,OAAOA;AACX;AAEA,SAASa;IACL,OAAO;QACHC,UAAU;YACNC,SAAS;mBAAIC,8BAAsB,CAACD,OAAO;mBAAKE,IAAAA,6BAAsB;aAAG;YACzEC,SAAS;gBAAC;aAAgB;YAC1BC,UAAU;gBAAC;gBAAY;gBAAQ;gBAAQ;gBAAa;aAAO;QAC/D;QACAC,aAAa;QACbL,SAAS;eAAIM,sBAAc,CAACN,OAAO;eAAKE,IAAAA,6BAAsB;SAAG;QACjEK,cAAc;QACdC,QAAQ;YAAEC,MAAM;gBAAEC,QAAQ;oBAAC;iBAAuB;YAAC;QAAE;IACzD;AACJ;AAEA,eAAenC;QAOPoC;IANJ,MAAM,EAAEA,UAAU,EAAE,GAAG,MAAMC,IAAAA,mBAAa;IAE1C,MAAM,EAAEC,cAAc,EAAE,EAAE,GAAGC,QAAQ,GAAGC,IAAAA,6BAAsB;IAE9D,MAAM9B,SAAS+B,IAAAA,mBAAW,EACtBA,IAAAA,mBAAW,EAACC,IAAAA,WAAI,EAACnB,oBAAoBe,cAAcC,UACnDH,mBAAAA,WAAWO,IAAI,cAAfP,8BAAAA,mBAAmB,CAAC;IAGxB,oCAAoC,GACpCjB,UAAG,CAACC,KAAK,CAAC,qBAAqB,IAAMC,KAAKC,SAAS,CAACZ,QAAQ,MAAM;IAElE,MAAMkC,UAAkD;QAACC,IAAAA,uBAAc;KAAG,CAAC1C,MAAM,CAC7E,CAAC,EAAE2C,IAAI,EAAE,GAAK,CAACR,YAAYS,QAAQ,CAAC,CAAC,QAAQ,EAAED,MAAM;IAGzD,OAAO;QAAEH,MAAMjC;QAAQ,GAAIkC,QAAQI,MAAM,GAAG;YAAEJ;QAAQ,IAAI,CAAC,CAAC;IAAE;AAClE"}
1
+ {"version":3,"sources":["../../../../../src/cli/commands/test/runners/vitest.ts"],"sourcesContent":["import { configDefaults, coverageConfigDefaults, mergeConfig, ViteUserConfig } from 'vitest/config';\nimport { parseCLI, resolveConfig, startVitest } from 'vitest/node';\nimport { getDefaultTestExcludes, getVitestConfiguration, log, omit } from '../../../../utils';\nimport { ignoreModulesPlugin } from '../../../../vite/plugins';\nimport svgTransformer from '../../../../vitest/svg-transformer';\n\ntype VitestConfig = NonNullable<ViteUserConfig['test']>;\n\nexport class Vitest {\n async run() {\n const cliOptions = getCliOptions();\n const userConfig = await getUserConfig();\n\n // startVitest sets process.exitCode to 1 when tests fail\n const vitest = await startVitest('test', cliOptions.filter, cliOptions.options, userConfig);\n await vitest.close();\n }\n}\n\nconst RUNNER_OPTION = '--runner';\n\nfunction excludeRunnerOption(args: string[]) {\n return args.reduce<string[]>((result, item, index) => {\n if (!item.startsWith(RUNNER_OPTION) && (index === 0 || args[index - 1] !== RUNNER_OPTION)) {\n result.push(item);\n }\n return result;\n }, []);\n}\n\nfunction getCliOptions() {\n // parseCLI requires the first element to be \"vitest\"\n const result = parseCLI(['vitest', ...excludeRunnerOption(process.argv.slice(3))]);\n\n /* istanbul ignore next: debug only */\n log.debug('vitest:cliOptions', () => JSON.stringify(result, null, 2));\n\n return result;\n}\n\nfunction getDefaultConfig(): VitestConfig {\n return {\n coverage: {\n exclude: [...coverageConfigDefaults.exclude, ...getDefaultTestExcludes()],\n include: ['**/*.{ts,tsx}'],\n reporter: ['html-spa', 'text', 'json', 'cobertura', 'lcov'],\n },\n environment: 'jsdom',\n exclude: [...configDefaults.exclude, ...getDefaultTestExcludes()],\n restoreMocks: true,\n server: { deps: { inline: ['@servicetitan/anvil2'] } }, // fixes css parser errors\n };\n}\n\nasync function getUserConfig(): Promise<ViteUserConfig> {\n const { viteConfig } = await resolveConfig();\n\n const { omitDefault = [], ...config } = getVitestConfiguration();\n\n const result = mergeConfig(\n mergeConfig(omit(getDefaultConfig(), omitDefault), config),\n viteConfig.test ?? {}\n );\n\n /* istanbul ignore next: debug only */\n log.debug('vitest:userConfig', () => JSON.stringify(result, null, 2));\n\n const plugins: NonNullable<ViteUserConfig['plugins']> = [\n svgTransformer(),\n ignoreModulesPlugin({ package: { dependencies: {} } }),\n ].filter(({ name }) => !omitDefault.includes(`plugins.${name}`));\n\n return { test: result, ...(plugins.length ? { plugins } : {}) };\n}\n"],"names":["Vitest","run","cliOptions","getCliOptions","userConfig","getUserConfig","vitest","startVitest","filter","options","close","RUNNER_OPTION","excludeRunnerOption","args","reduce","result","item","index","startsWith","push","parseCLI","process","argv","slice","log","debug","JSON","stringify","getDefaultConfig","coverage","exclude","coverageConfigDefaults","getDefaultTestExcludes","include","reporter","environment","configDefaults","restoreMocks","server","deps","inline","viteConfig","resolveConfig","omitDefault","config","getVitestConfiguration","mergeConfig","omit","test","plugins","svgTransformer","ignoreModulesPlugin","package","dependencies","name","includes","length"],"mappings":";;;;+BAQaA;;;eAAAA;;;wBARuE;sBAC/B;uBACqB;yBACtC;uEACT;;;;;;AAIpB,MAAMA;IACT,MAAMC,MAAM;QACR,MAAMC,aAAaC;QACnB,MAAMC,aAAa,MAAMC;QAEzB,yDAAyD;QACzD,MAAMC,SAAS,MAAMC,IAAAA,iBAAW,EAAC,QAAQL,WAAWM,MAAM,EAAEN,WAAWO,OAAO,EAAEL;QAChF,MAAME,OAAOI,KAAK;IACtB;AACJ;AAEA,MAAMC,gBAAgB;AAEtB,SAASC,oBAAoBC,IAAc;IACvC,OAAOA,KAAKC,MAAM,CAAW,CAACC,QAAQC,MAAMC;QACxC,IAAI,CAACD,KAAKE,UAAU,CAACP,kBAAmBM,CAAAA,UAAU,KAAKJ,IAAI,CAACI,QAAQ,EAAE,KAAKN,aAAY,GAAI;YACvFI,OAAOI,IAAI,CAACH;QAChB;QACA,OAAOD;IACX,GAAG,EAAE;AACT;AAEA,SAASZ;IACL,qDAAqD;IACrD,MAAMY,SAASK,IAAAA,cAAQ,EAAC;QAAC;WAAaR,oBAAoBS,QAAQC,IAAI,CAACC,KAAK,CAAC;KAAI;IAEjF,oCAAoC,GACpCC,UAAG,CAACC,KAAK,CAAC,qBAAqB,IAAMC,KAAKC,SAAS,CAACZ,QAAQ,MAAM;IAElE,OAAOA;AACX;AAEA,SAASa;IACL,OAAO;QACHC,UAAU;YACNC,SAAS;mBAAIC,8BAAsB,CAACD,OAAO;mBAAKE,IAAAA,6BAAsB;aAAG;YACzEC,SAAS;gBAAC;aAAgB;YAC1BC,UAAU;gBAAC;gBAAY;gBAAQ;gBAAQ;gBAAa;aAAO;QAC/D;QACAC,aAAa;QACbL,SAAS;eAAIM,sBAAc,CAACN,OAAO;eAAKE,IAAAA,6BAAsB;SAAG;QACjEK,cAAc;QACdC,QAAQ;YAAEC,MAAM;gBAAEC,QAAQ;oBAAC;iBAAuB;YAAC;QAAE;IACzD;AACJ;AAEA,eAAenC;QAOPoC;IANJ,MAAM,EAAEA,UAAU,EAAE,GAAG,MAAMC,IAAAA,mBAAa;IAE1C,MAAM,EAAEC,cAAc,EAAE,EAAE,GAAGC,QAAQ,GAAGC,IAAAA,6BAAsB;IAE9D,MAAM9B,SAAS+B,IAAAA,mBAAW,EACtBA,IAAAA,mBAAW,EAACC,IAAAA,WAAI,EAACnB,oBAAoBe,cAAcC,UACnDH,mBAAAA,WAAWO,IAAI,cAAfP,8BAAAA,mBAAmB,CAAC;IAGxB,oCAAoC,GACpCjB,UAAG,CAACC,KAAK,CAAC,qBAAqB,IAAMC,KAAKC,SAAS,CAACZ,QAAQ,MAAM;IAElE,MAAMkC,UAAkD;QACpDC,IAAAA,uBAAc;QACdC,IAAAA,4BAAmB,EAAC;YAAEC,SAAS;gBAAEC,cAAc,CAAC;YAAE;QAAE;KACvD,CAAC7C,MAAM,CAAC,CAAC,EAAE8C,IAAI,EAAE,GAAK,CAACX,YAAYY,QAAQ,CAAC,CAAC,QAAQ,EAAED,MAAM;IAE9D,OAAO;QAAEN,MAAMjC;QAAQ,GAAIkC,QAAQO,MAAM,GAAG;YAAEP;QAAQ,IAAI,CAAC,CAAC;IAAE;AAClE"}
@@ -1,4 +1,6 @@
1
- import { BuildContext } from '../types';
1
+ import type { PackageContext } from '../types';
2
2
  import type { CheckerArgs, IgnoreMode } from './types';
3
- export declare function checkResource(context: BuildContext): ({ resource, importer }: CheckerArgs) => IgnoreMode | false;
3
+ export declare function checkResource(context: {
4
+ package: Pick<PackageContext, 'dependencies'>;
5
+ }): ({ resource, importer }: CheckerArgs) => IgnoreMode | false;
4
6
  //# sourceMappingURL=check-resource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-resource.d.ts","sourceRoot":"","sources":["../../../src/core/check-resource/check-resource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAIxC,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvD,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,IAC9B,wBAAwB,WAAW,KAAG,UAAU,GAAG,KAAK,CAsB5E"}
1
+ {"version":3,"file":"check-resource.d.ts","sourceRoot":"","sources":["../../../src/core/check-resource/check-resource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAI/C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvD,wBAAgB,aAAa,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA;CAAE,IACnE,wBAAwB,WAAW,KAAG,UAAU,GAAG,KAAK,CAsB5E"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/check-resource/check-resource.ts"],"sourcesContent":["import { log } from '../../utils';\nimport { BuildContext } from '../types';\nimport { getPeerDependencyMeta } from './get-peer-dependency-meta';\nimport { isManagedReactDomClientDependency } from './is-managed-react-dom-client-dependency';\nimport { isResolvable } from './is-resolvable';\nimport type { CheckerArgs, IgnoreMode } from './types';\n\nexport function checkResource(context: BuildContext) {\n return function ({ resource, importer }: CheckerArgs): IgnoreMode | false {\n if (!context.package.dependencies[resource]) {\n const meta = getPeerDependencyMeta({ resource, importer });\n if (meta?.optional && !isResolvable({ resource, importer })) {\n const mode = meta.fallback ?? 'throw';\n log.debug('check-resource', `${JSON.stringify({ resource, importer })} => ${mode}`);\n return mode;\n }\n }\n\n /**\n * react-dom/client isn't an explicit dependency, so the peerDependenciesMeta\n * path above can't catch it.\n */\n if (\n isManagedReactDomClientDependency({ resource, importer }) &&\n !isResolvable({ resource, importer })\n ) {\n return 'empty';\n }\n return false;\n };\n}\n"],"names":["checkResource","context","resource","importer","package","dependencies","meta","getPeerDependencyMeta","optional","isResolvable","mode","fallback","log","debug","JSON","stringify","isManagedReactDomClientDependency"],"mappings":";;;;+BAOgBA;;;eAAAA;;;uBAPI;uCAEkB;mDACY;8BACrB;AAGtB,SAASA,cAAcC,OAAqB;IAC/C,OAAO,SAAU,EAAEC,QAAQ,EAAEC,QAAQ,EAAe;QAChD,IAAI,CAACF,QAAQG,OAAO,CAACC,YAAY,CAACH,SAAS,EAAE;YACzC,MAAMI,OAAOC,IAAAA,4CAAqB,EAAC;gBAAEL;gBAAUC;YAAS;YACxD,IAAIG,CAAAA,iBAAAA,2BAAAA,KAAME,QAAQ,KAAI,CAACC,IAAAA,0BAAY,EAAC;gBAAEP;gBAAUC;YAAS,IAAI;oBAC5CG;gBAAb,MAAMI,QAAOJ,iBAAAA,KAAKK,QAAQ,cAAbL,4BAAAA,iBAAiB;gBAC9BM,UAAG,CAACC,KAAK,CAAC,kBAAkB,GAAGC,KAAKC,SAAS,CAAC;oBAAEb;oBAAUC;gBAAS,GAAG,IAAI,EAAEO,MAAM;gBAClF,OAAOA;YACX;QACJ;QAEA;;;SAGC,GACD,IACIM,IAAAA,oEAAiC,EAAC;YAAEd;YAAUC;QAAS,MACvD,CAACM,IAAAA,0BAAY,EAAC;YAAEP;YAAUC;QAAS,IACrC;YACE,OAAO;QACX;QACA,OAAO;IACX;AACJ"}
1
+ {"version":3,"sources":["../../../src/core/check-resource/check-resource.ts"],"sourcesContent":["import { log } from '../../utils';\nimport type { PackageContext } from '../types';\nimport { getPeerDependencyMeta } from './get-peer-dependency-meta';\nimport { isManagedReactDomClientDependency } from './is-managed-react-dom-client-dependency';\nimport { isResolvable } from './is-resolvable';\nimport type { CheckerArgs, IgnoreMode } from './types';\n\nexport function checkResource(context: { package: Pick<PackageContext, 'dependencies'> }) {\n return function ({ resource, importer }: CheckerArgs): IgnoreMode | false {\n if (!context.package.dependencies[resource]) {\n const meta = getPeerDependencyMeta({ resource, importer });\n if (meta?.optional && !isResolvable({ resource, importer })) {\n const mode = meta.fallback ?? 'throw';\n log.debug('check-resource', `${JSON.stringify({ resource, importer })} => ${mode}`);\n return mode;\n }\n }\n\n /**\n * react-dom/client isn't an explicit dependency, so the peerDependenciesMeta\n * path above can't catch it.\n */\n if (\n isManagedReactDomClientDependency({ resource, importer }) &&\n !isResolvable({ resource, importer })\n ) {\n return 'empty';\n }\n return false;\n };\n}\n"],"names":["checkResource","context","resource","importer","package","dependencies","meta","getPeerDependencyMeta","optional","isResolvable","mode","fallback","log","debug","JSON","stringify","isManagedReactDomClientDependency"],"mappings":";;;;+BAOgBA;;;eAAAA;;;uBAPI;uCAEkB;mDACY;8BACrB;AAGtB,SAASA,cAAcC,OAA0D;IACpF,OAAO,SAAU,EAAEC,QAAQ,EAAEC,QAAQ,EAAe;QAChD,IAAI,CAACF,QAAQG,OAAO,CAACC,YAAY,CAACH,SAAS,EAAE;YACzC,MAAMI,OAAOC,IAAAA,4CAAqB,EAAC;gBAAEL;gBAAUC;YAAS;YACxD,IAAIG,CAAAA,iBAAAA,2BAAAA,KAAME,QAAQ,KAAI,CAACC,IAAAA,0BAAY,EAAC;gBAAEP;gBAAUC;YAAS,IAAI;oBAC5CG;gBAAb,MAAMI,QAAOJ,iBAAAA,KAAKK,QAAQ,cAAbL,4BAAAA,iBAAiB;gBAC9BM,UAAG,CAACC,KAAK,CAAC,kBAAkB,GAAGC,KAAKC,SAAS,CAAC;oBAAEb;oBAAUC;gBAAS,GAAG,IAAI,EAAEO,MAAM;gBAClF,OAAOA;YACX;QACJ;QAEA;;;SAGC,GACD,IACIM,IAAAA,oEAAiC,EAAC;YAAEd;YAAUC;QAAS,MACvD,CAACM,IAAAA,0BAAY,EAAC;YAAEP;YAAUC;QAAS,IACrC;YACE,OAAO;QACX;QACA,OAAO;IACX;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/jest/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,QAAA,MAAM,QAAQ,EAAE,YAGf,CAAC;AAEF,SAAS,QAAQ,CAAC"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/jest/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAMjD,QAAA,MAAM,QAAQ,EAAE,YAgBf,CAAC;AAEF,SAAS,QAAQ,CAAC"}
@@ -1,10 +1,29 @@
1
1
  "use strict";
2
+ const _checkresource = require("../core/check-resource");
2
3
  const _transformsvg = require("../utils/transform-svg");
4
+ const EMPTY_MODULE_PATH = require.resolve('../webpack/configs/plugins/ignore-plugin/empty-module');
3
5
  const resolver = (path, options)=>{
4
6
  var _ref;
5
7
  var _SVG_PATH_REGEX_exec;
6
8
  const { type, path: pathSansType } = (_ref = (_SVG_PATH_REGEX_exec = _transformsvg.SVG_PATH_REGEX.exec(path)) === null || _SVG_PATH_REGEX_exec === void 0 ? void 0 : _SVG_PATH_REGEX_exec.groups) !== null && _ref !== void 0 ? _ref : {};
7
- return options.defaultResolver(type ? pathSansType : path, options);
9
+ const resolvedPath = type ? pathSansType : path;
10
+ try {
11
+ return options.defaultResolver(resolvedPath, options);
12
+ } catch (error) {
13
+ var _options_basedir;
14
+ const mode = (0, _checkresource.checkResource)({
15
+ package: {
16
+ dependencies: {}
17
+ }
18
+ })({
19
+ resource: resolvedPath,
20
+ importer: (_options_basedir = options.basedir) !== null && _options_basedir !== void 0 ? _options_basedir : ''
21
+ });
22
+ if (mode === 'empty') {
23
+ return EMPTY_MODULE_PATH;
24
+ }
25
+ throw error;
26
+ }
8
27
  };
9
28
  module.exports = resolver;
10
29
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/jest/resolver.ts"],"sourcesContent":["import type { SyncResolver } from 'jest-resolve';\nimport { SVG_PATH_REGEX } from '../utils/transform-svg';\n\nconst resolver: SyncResolver = (path, options) => {\n const { type, path: pathSansType } = SVG_PATH_REGEX.exec(path)?.groups ?? {};\n return options.defaultResolver(type ? pathSansType : path, options);\n};\n\nexport = resolver;\n"],"names":["resolver","path","options","SVG_PATH_REGEX","type","pathSansType","exec","groups","defaultResolver"],"mappings":";8BAC+B;AAE/B,MAAMA,WAAyB,CAACC,MAAMC;;QACGC;IAArC,MAAM,EAAEC,IAAI,EAAEH,MAAMI,YAAY,EAAE,YAAGF,uBAAAA,4BAAc,CAACG,IAAI,CAACL,mBAApBE,2CAAAA,qBAA2BI,MAAM,uCAAI,CAAC;IAC3E,OAAOL,QAAQM,eAAe,CAACJ,OAAOC,eAAeJ,MAAMC;AAC/D;iBAESF"}
1
+ {"version":3,"sources":["../../src/jest/resolver.ts"],"sourcesContent":["import type { SyncResolver } from 'jest-resolve';\nimport { checkResource } from '../core/check-resource';\nimport { SVG_PATH_REGEX } from '../utils/transform-svg';\n\nconst EMPTY_MODULE_PATH = require.resolve('../webpack/configs/plugins/ignore-plugin/empty-module');\n\nconst resolver: SyncResolver = (path, options) => {\n const { type, path: pathSansType } = SVG_PATH_REGEX.exec(path)?.groups ?? {};\n const resolvedPath = type ? pathSansType : path;\n\n try {\n return options.defaultResolver(resolvedPath, options);\n } catch (error) {\n const mode = checkResource({ package: { dependencies: {} } })({\n resource: resolvedPath,\n importer: options.basedir ?? '',\n });\n if (mode === 'empty') {\n return EMPTY_MODULE_PATH;\n }\n throw error;\n }\n};\n\nexport = resolver;\n"],"names":["EMPTY_MODULE_PATH","require","resolve","resolver","path","options","SVG_PATH_REGEX","type","pathSansType","exec","groups","resolvedPath","defaultResolver","error","mode","checkResource","package","dependencies","resource","importer","basedir"],"mappings":";+BAC8B;8BACC;AAE/B,MAAMA,oBAAoBC,QAAQC,OAAO,CAAC;AAE1C,MAAMC,WAAyB,CAACC,MAAMC;;QACGC;IAArC,MAAM,EAAEC,IAAI,EAAEH,MAAMI,YAAY,EAAE,YAAGF,uBAAAA,4BAAc,CAACG,IAAI,CAACL,mBAApBE,2CAAAA,qBAA2BI,MAAM,uCAAI,CAAC;IAC3E,MAAMC,eAAeJ,OAAOC,eAAeJ;IAE3C,IAAI;QACA,OAAOC,QAAQO,eAAe,CAACD,cAAcN;IACjD,EAAE,OAAOQ,OAAO;YAGER;QAFd,MAAMS,OAAOC,IAAAA,4BAAa,EAAC;YAAEC,SAAS;gBAAEC,cAAc,CAAC;YAAE;QAAE,GAAG;YAC1DC,UAAUP;YACVQ,QAAQ,GAAEd,mBAAAA,QAAQe,OAAO,cAAff,8BAAAA,mBAAmB;QACjC;QACA,IAAIS,SAAS,SAAS;YAClB,OAAOd;QACX;QACA,MAAMa;IACV;AACJ;iBAESV"}
@@ -1,5 +1,5 @@
1
1
  import type { Plugin } from 'vite';
2
- import { BuildContext } from '../../core';
2
+ import type { PackageContext } from '../../core/types';
3
3
  export declare const THROW_PREFIX = "\0IGNORE_THROW:";
4
4
  export declare const EMPTY_PREFIX = "\0IGNORE_EMPTY:";
5
5
  /**
@@ -17,5 +17,7 @@ export declare const EMPTY_PREFIX = "\0IGNORE_EMPTY:";
17
17
  * `import * as X from 'optional'` followed by `X.foo === undefined` detection. Opt in via
18
18
  * `cli.peerDependenciesMeta["pkg"].fallback = "empty"` in the importer's package.json.
19
19
  */
20
- export declare function ignoreModulesPlugin(context: BuildContext): Plugin;
20
+ export declare function ignoreModulesPlugin(context: {
21
+ package: Pick<PackageContext, 'dependencies'>;
22
+ }): Plugin;
21
23
  //# sourceMappingURL=ignore-modules-plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ignore-modules-plugin.d.ts","sourceRoot":"","sources":["../../../src/vite/plugins/ignore-modules-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,EAAE,YAAY,EAAiB,MAAM,YAAY,CAAC;AAEzD,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAC9C,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAE9C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA6BjE"}
1
+ {"version":3,"file":"ignore-modules-plugin.d.ts","sourceRoot":"","sources":["../../../src/vite/plugins/ignore-modules-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAC9C,eAAO,MAAM,YAAY,oBAAoB,CAAC;AAE9C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IACzC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;CACjD,GAAG,MAAM,CA6BT"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/vite/plugins/ignore-modules-plugin.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport { BuildContext, checkResource } from '../../core';\n\nexport const THROW_PREFIX = '\\0IGNORE_THROW:';\nexport const EMPTY_PREFIX = '\\0IGNORE_EMPTY:';\n\n/**\n * Handles optional peer dependencies that are not installed.\n *\n * @see {@link file://./../../webpack/configs/plugins/ignore-plugin/ignore-plugin.ts} for the webpack counterpart.\n *\n * 'throw' mode: substitutes a virtual module whose body throws \"Cannot find module\" on\n * evaluation. Mirrors webpack's `webpackMissingModule()` semantics. Top-level static\n * imports of the resource crash module evaluation, and `try { await import(...) } catch {}`\n * (or `try { require(...) } catch {}` in CJS code Rolldown bundles) work as expected.\n * This is the default for matched optional peers.\n *\n * 'empty' mode: substitutes a virtual module with no exports. Required for top-level\n * `import * as X from 'optional'` followed by `X.foo === undefined` detection. Opt in via\n * `cli.peerDependenciesMeta[\"pkg\"].fallback = \"empty\"` in the importer's package.json.\n */\nexport function ignoreModulesPlugin(context: BuildContext): Plugin {\n const checker = checkResource(context);\n\n return {\n name: 'ignore-modules',\n enforce: 'pre',\n resolveId(source, importer) {\n if (!importer) {\n return;\n }\n const mode = checker({ resource: source, importer });\n if (mode === 'throw') {\n return `${THROW_PREFIX}${source}`;\n }\n if (mode === 'empty') {\n return `${EMPTY_PREFIX}${source}`;\n }\n },\n load(id) {\n if (id.startsWith(THROW_PREFIX)) {\n const source = id.slice(THROW_PREFIX.length);\n const message = JSON.stringify(`Cannot find module '${source}'`);\n return `throw Object.assign(new Error(${message}), { code: 'MODULE_NOT_FOUND' });`;\n }\n if (id.startsWith(EMPTY_PREFIX)) {\n return 'export {};';\n }\n },\n };\n}\n"],"names":["EMPTY_PREFIX","THROW_PREFIX","ignoreModulesPlugin","context","checker","checkResource","name","enforce","resolveId","source","importer","mode","resource","load","id","startsWith","slice","length","message","JSON","stringify"],"mappings":";;;;;;;;;;;QAIaA;eAAAA;;QADAC;eAAAA;;QAkBGC;eAAAA;;;sBApB4B;AAErC,MAAMD,eAAe;AACrB,MAAMD,eAAe;AAiBrB,SAASE,oBAAoBC,OAAqB;IACrD,MAAMC,UAAUC,IAAAA,mBAAa,EAACF;IAE9B,OAAO;QACHG,MAAM;QACNC,SAAS;QACTC,WAAUC,MAAM,EAAEC,QAAQ;YACtB,IAAI,CAACA,UAAU;gBACX;YACJ;YACA,MAAMC,OAAOP,QAAQ;gBAAEQ,UAAUH;gBAAQC;YAAS;YAClD,IAAIC,SAAS,SAAS;gBAClB,OAAO,GAAGV,eAAeQ,QAAQ;YACrC;YACA,IAAIE,SAAS,SAAS;gBAClB,OAAO,GAAGX,eAAeS,QAAQ;YACrC;QACJ;QACAI,MAAKC,EAAE;YACH,IAAIA,GAAGC,UAAU,CAACd,eAAe;gBAC7B,MAAMQ,SAASK,GAAGE,KAAK,CAACf,aAAagB,MAAM;gBAC3C,MAAMC,UAAUC,KAAKC,SAAS,CAAC,CAAC,oBAAoB,EAAEX,OAAO,CAAC,CAAC;gBAC/D,OAAO,CAAC,8BAA8B,EAAES,QAAQ,iCAAiC,CAAC;YACtF;YACA,IAAIJ,GAAGC,UAAU,CAACf,eAAe;gBAC7B,OAAO;YACX;QACJ;IACJ;AACJ"}
1
+ {"version":3,"sources":["../../../src/vite/plugins/ignore-modules-plugin.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport { checkResource } from '../../core';\nimport type { PackageContext } from '../../core/types';\n\nexport const THROW_PREFIX = '\\0IGNORE_THROW:';\nexport const EMPTY_PREFIX = '\\0IGNORE_EMPTY:';\n\n/**\n * Handles optional peer dependencies that are not installed.\n *\n * @see {@link file://./../../webpack/configs/plugins/ignore-plugin/ignore-plugin.ts} for the webpack counterpart.\n *\n * 'throw' mode: substitutes a virtual module whose body throws \"Cannot find module\" on\n * evaluation. Mirrors webpack's `webpackMissingModule()` semantics. Top-level static\n * imports of the resource crash module evaluation, and `try { await import(...) } catch {}`\n * (or `try { require(...) } catch {}` in CJS code Rolldown bundles) work as expected.\n * This is the default for matched optional peers.\n *\n * 'empty' mode: substitutes a virtual module with no exports. Required for top-level\n * `import * as X from 'optional'` followed by `X.foo === undefined` detection. Opt in via\n * `cli.peerDependenciesMeta[\"pkg\"].fallback = \"empty\"` in the importer's package.json.\n */\nexport function ignoreModulesPlugin(context: {\n package: Pick<PackageContext, 'dependencies'>;\n}): Plugin {\n const checker = checkResource(context);\n\n return {\n name: 'ignore-modules',\n enforce: 'pre',\n resolveId(source, importer) {\n if (!importer) {\n return;\n }\n const mode = checker({ resource: source, importer });\n if (mode === 'throw') {\n return `${THROW_PREFIX}${source}`;\n }\n if (mode === 'empty') {\n return `${EMPTY_PREFIX}${source}`;\n }\n },\n load(id) {\n if (id.startsWith(THROW_PREFIX)) {\n const source = id.slice(THROW_PREFIX.length);\n const message = JSON.stringify(`Cannot find module '${source}'`);\n return `throw Object.assign(new Error(${message}), { code: 'MODULE_NOT_FOUND' });`;\n }\n if (id.startsWith(EMPTY_PREFIX)) {\n return 'export {};';\n }\n },\n };\n}\n"],"names":["EMPTY_PREFIX","THROW_PREFIX","ignoreModulesPlugin","context","checker","checkResource","name","enforce","resolveId","source","importer","mode","resource","load","id","startsWith","slice","length","message","JSON","stringify"],"mappings":";;;;;;;;;;;QAKaA;eAAAA;;QADAC;eAAAA;;QAkBGC;eAAAA;;;sBArBc;AAGvB,MAAMD,eAAe;AACrB,MAAMD,eAAe;AAiBrB,SAASE,oBAAoBC,OAEnC;IACG,MAAMC,UAAUC,IAAAA,mBAAa,EAACF;IAE9B,OAAO;QACHG,MAAM;QACNC,SAAS;QACTC,WAAUC,MAAM,EAAEC,QAAQ;YACtB,IAAI,CAACA,UAAU;gBACX;YACJ;YACA,MAAMC,OAAOP,QAAQ;gBAAEQ,UAAUH;gBAAQC;YAAS;YAClD,IAAIC,SAAS,SAAS;gBAClB,OAAO,GAAGV,eAAeQ,QAAQ;YACrC;YACA,IAAIE,SAAS,SAAS;gBAClB,OAAO,GAAGX,eAAeS,QAAQ;YACrC;QACJ;QACAI,MAAKC,EAAE;YACH,IAAIA,GAAGC,UAAU,CAACd,eAAe;gBAC7B,MAAMQ,SAASK,GAAGE,KAAK,CAACf,aAAagB,MAAM;gBAC3C,MAAMC,UAAUC,KAAKC,SAAS,CAAC,CAAC,oBAAoB,EAAEX,OAAO,CAAC,CAAC;gBAC/D,OAAO,CAAC,8BAA8B,EAAES,QAAQ,iCAAiC,CAAC;YACtF;YACA,IAAIJ,GAAGC,UAAU,CAACf,eAAe;gBAC7B,OAAO;YACX;QACJ;IACJ;AACJ"}
@@ -1,4 +1,4 @@
1
1
  import { BuildContext } from '../../../core';
2
2
  import { Overrides } from '../../types';
3
- export declare function filterWarningsPlugin(context: BuildContext, _: Overrides): any;
3
+ export declare function filterWarningsPlugin(_context: BuildContext, _: Overrides): any;
4
4
  //# sourceMappingURL=filter-warnings-plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter-warnings-plugin.d.ts","sourceRoot":"","sources":["../../../../src/webpack/configs/plugins/filter-warnings-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,OAQvE"}
1
+ {"version":3,"file":"filter-warnings-plugin.d.ts","sourceRoot":"","sources":["../../../../src/webpack/configs/plugins/filter-warnings-plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,OAIxE"}
@@ -9,10 +9,7 @@ Object.defineProperty(exports, "filterWarningsPlugin", {
9
9
  }
10
10
  });
11
11
  const FilterWarningsPlugin = require('webpack-filter-warnings-plugin');
12
- function filterWarningsPlugin(context, _) {
13
- if (context.build.light) {
14
- return;
15
- }
12
+ function filterWarningsPlugin(_context, _) {
16
13
  return new FilterWarningsPlugin({
17
14
  exclude: /export .* was not found in/
18
15
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/webpack/configs/plugins/filter-warnings-plugin.ts"],"sourcesContent":["const FilterWarningsPlugin = require('webpack-filter-warnings-plugin');\nimport { BuildContext } from '../../../core';\nimport { Overrides } from '../../types';\n\nexport function filterWarningsPlugin(context: BuildContext, _: Overrides) {\n if (context.build.light) {\n return;\n }\n\n return new FilterWarningsPlugin({\n exclude: /export .* was not found in/,\n });\n}\n"],"names":["filterWarningsPlugin","FilterWarningsPlugin","require","context","_","build","light","exclude"],"mappings":";;;;+BAIgBA;;;eAAAA;;;AAJhB,MAAMC,uBAAuBC,QAAQ;AAI9B,SAASF,qBAAqBG,OAAqB,EAAEC,CAAY;IACpE,IAAID,QAAQE,KAAK,CAACC,KAAK,EAAE;QACrB;IACJ;IAEA,OAAO,IAAIL,qBAAqB;QAC5BM,SAAS;IACb;AACJ"}
1
+ {"version":3,"sources":["../../../../src/webpack/configs/plugins/filter-warnings-plugin.ts"],"sourcesContent":["const FilterWarningsPlugin = require('webpack-filter-warnings-plugin');\nimport { BuildContext } from '../../../core';\nimport { Overrides } from '../../types';\n\nexport function filterWarningsPlugin(_context: BuildContext, _: Overrides) {\n return new FilterWarningsPlugin({\n exclude: /export .* was not found in/,\n });\n}\n"],"names":["filterWarningsPlugin","FilterWarningsPlugin","require","_context","_","exclude"],"mappings":";;;;+BAIgBA;;;eAAAA;;;AAJhB,MAAMC,uBAAuBC,QAAQ;AAI9B,SAASF,qBAAqBG,QAAsB,EAAEC,CAAY;IACrE,OAAO,IAAIH,qBAAqB;QAC5BI,SAAS;IACb;AACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/startup",
3
- "version": "37.0.0",
3
+ "version": "37.0.1",
4
4
  "description": "CLI to create multi-package Lerna projects with TypeScript and React",
5
5
  "homepage": "https://docs.st.dev/docs/frontend/uikit/startup",
6
6
  "repository": {
@@ -103,13 +103,13 @@
103
103
  "@jest/core": "~30.4.2",
104
104
  "@jest/types": "~30.4.1",
105
105
  "@jsdevtools/coverage-istanbul-loader": "^3.0.5",
106
- "@servicetitan/eslint-config": "37.0.0",
107
- "@servicetitan/install": "37.0.0",
108
- "@servicetitan/startup-utils": "37.0.0",
109
- "@servicetitan/stylelint-config": "37.0.0",
106
+ "@servicetitan/eslint-config": "37.0.1",
107
+ "@servicetitan/install": "37.0.1",
108
+ "@servicetitan/startup-utils": "37.0.1",
109
+ "@servicetitan/stylelint-config": "37.0.1",
110
110
  "@svgr/webpack": "^8.1.0",
111
111
  "@swc/cli": "^0.8.1",
112
- "@swc/core": "1.15.41",
112
+ "@swc/core": "1.15.43",
113
113
  "@types/debug": "^4.1.12",
114
114
  "@types/jest": "~30.0.0",
115
115
  "@vitest/coverage-v8": "^4.1.9",
@@ -140,7 +140,7 @@
140
140
  "less-plugin-npm-import": "~2.1.0",
141
141
  "lodash.kebabcase": "^4.1.1",
142
142
  "lodash.memoize": "^4.1.2",
143
- "memfs": "~4.57.7",
143
+ "memfs": "~4.57.8",
144
144
  "mini-css-extract-plugin": "~2.10.2",
145
145
  "moment-locales-webpack-plugin": "~1.2.0",
146
146
  "multimatch": "~8.0.0",
@@ -150,7 +150,7 @@
150
150
  "prettier": "~3.8.4",
151
151
  "sass": "~1.101.0",
152
152
  "sass-loader": "~17.0.0",
153
- "semver": "~7.8.4",
153
+ "semver": "~7.8.5",
154
154
  "source-map-loader": "~5.0.0",
155
155
  "style-loader": "~4.0.0",
156
156
  "stylelint": "~17.13.0",
@@ -197,5 +197,5 @@
197
197
  "cli": {
198
198
  "webpack": false
199
199
  },
200
- "gitHead": "f0acf332ece207c91acb18da23a614efbc8551ec"
200
+ "gitHead": "9a2e5579f88cf9895fd2948ce5d5810e976d20b0"
201
201
  }
@@ -3,6 +3,7 @@ import { fs, vol } from 'memfs';
3
3
  import { configDefaults, coverageConfigDefaults, mergeConfig, ViteUserConfig } from 'vitest/config';
4
4
  import { parseCLI, resolveConfig, startVitest } from 'vitest/node';
5
5
  import { getDefaultTestExcludes } from '../../../../../utils';
6
+ import { ignoreModulesPlugin } from '../../../../../vite/plugins';
6
7
  import { Vitest } from '../vitest';
7
8
 
8
9
  /**
@@ -20,6 +21,7 @@ jest.mock('vitest/', () => ({
20
21
  }));
21
22
 
22
23
  jest.mock('fs', () => fs);
24
+ jest.mock('../../../../../vite/plugins', () => ({ ignoreModulesPlugin: jest.fn() }));
23
25
 
24
26
  describe(`[startup] Test ${Vitest.name}`, () => {
25
27
  const defaultExcludes = getDefaultTestExcludes();
@@ -42,6 +44,7 @@ describe(`[startup] Test ${Vitest.name}`, () => {
42
44
  jest.mocked(parseCLI).mockReturnValue({ filter: [], options: {} });
43
45
  jest.mocked(resolveConfig).mockResolvedValue({ viteConfig: {} } as any);
44
46
  jest.mocked(startVitest).mockResolvedValue({ close: jest.fn() } as any);
47
+ jest.mocked(ignoreModulesPlugin).mockReturnValue({ name: 'ignore-modules' } as any);
45
48
 
46
49
  vol.fromJSON({ 'package.json': JSON.stringify({}) });
47
50
  });
@@ -60,7 +63,10 @@ describe(`[startup] Test ${Vitest.name}`, () => {
60
63
  {},
61
64
  {
62
65
  test: config,
63
- plugins: [expect.objectContaining({ name: 'vitest-svg-transformer' })],
66
+ plugins: [
67
+ expect.objectContaining({ name: 'vitest-svg-transformer' }),
68
+ expect.objectContaining({ name: 'ignore-modules' }),
69
+ ],
64
70
  ...overrides,
65
71
  }
66
72
  );
@@ -105,6 +111,7 @@ describe(`[startup] Test ${Vitest.name}`, () => {
105
111
  'coverage.include',
106
112
  'environment',
107
113
  'plugins.vitest-svg-transformer',
114
+ 'plugins.ignore-modules',
108
115
  ],
109
116
  },
110
117
  },
@@ -1,6 +1,7 @@
1
1
  import { configDefaults, coverageConfigDefaults, mergeConfig, ViteUserConfig } from 'vitest/config';
2
2
  import { parseCLI, resolveConfig, startVitest } from 'vitest/node';
3
3
  import { getDefaultTestExcludes, getVitestConfiguration, log, omit } from '../../../../utils';
4
+ import { ignoreModulesPlugin } from '../../../../vite/plugins';
4
5
  import svgTransformer from '../../../../vitest/svg-transformer';
5
6
 
6
7
  type VitestConfig = NonNullable<ViteUserConfig['test']>;
@@ -64,9 +65,10 @@ async function getUserConfig(): Promise<ViteUserConfig> {
64
65
  /* istanbul ignore next: debug only */
65
66
  log.debug('vitest:userConfig', () => JSON.stringify(result, null, 2));
66
67
 
67
- const plugins: NonNullable<ViteUserConfig['plugins']> = [svgTransformer()].filter(
68
- ({ name }) => !omitDefault.includes(`plugins.${name}`)
69
- );
68
+ const plugins: NonNullable<ViteUserConfig['plugins']> = [
69
+ svgTransformer(),
70
+ ignoreModulesPlugin({ package: { dependencies: {} } }),
71
+ ].filter(({ name }) => !omitDefault.includes(`plugins.${name}`));
70
72
 
71
73
  return { test: result, ...(plugins.length ? { plugins } : {}) };
72
74
  }
@@ -1,11 +1,11 @@
1
1
  import { log } from '../../utils';
2
- import { BuildContext } from '../types';
2
+ import type { PackageContext } from '../types';
3
3
  import { getPeerDependencyMeta } from './get-peer-dependency-meta';
4
4
  import { isManagedReactDomClientDependency } from './is-managed-react-dom-client-dependency';
5
5
  import { isResolvable } from './is-resolvable';
6
6
  import type { CheckerArgs, IgnoreMode } from './types';
7
7
 
8
- export function checkResource(context: BuildContext) {
8
+ export function checkResource(context: { package: Pick<PackageContext, 'dependencies'> }) {
9
9
  return function ({ resource, importer }: CheckerArgs): IgnoreMode | false {
10
10
  if (!context.package.dependencies[resource]) {
11
11
  const meta = getPeerDependencyMeta({ resource, importer });
@@ -1,7 +1,14 @@
1
+ import { checkResource } from '../../core/check-resource';
1
2
  import resolver from '../resolver';
2
3
 
4
+ jest.mock('../../core/check-resource');
5
+
3
6
  describe('[startup] Jest resolver', () => {
4
- const options: Partial<Parameters<typeof resolver>[1]> = { defaultResolver: jest.fn() };
7
+ const checker = jest.fn();
8
+ const options: Partial<Parameters<typeof resolver>[1]> = {
9
+ defaultResolver: jest.fn(),
10
+ basedir: '/node_modules/some-package/dist',
11
+ };
5
12
  let path: string;
6
13
  let queryParam: string | undefined;
7
14
 
@@ -9,6 +16,8 @@ describe('[startup] Jest resolver', () => {
9
16
  path = 'foo.svg';
10
17
  queryParam = undefined;
11
18
  jest.clearAllMocks();
19
+ jest.mocked(checkResource).mockReturnValue(checker as any);
20
+ checker.mockReturnValue(false);
12
21
  });
13
22
 
14
23
  const subject = () => resolver(`${path}${queryParam ?? ''}`, options as any);
@@ -38,4 +47,36 @@ describe('[startup] Jest resolver', () => {
38
47
 
39
48
  itCallsDefaultResolver();
40
49
  });
50
+
51
+ describe('when defaultResolver throws', () => {
52
+ const error = new Error("Cannot find module 'foo'");
53
+
54
+ beforeEach(() =>
55
+ jest.mocked(options.defaultResolver!).mockImplementation(() => {
56
+ throw error;
57
+ })
58
+ );
59
+
60
+ test('rethrows the error', () => {
61
+ expect(subject).toThrow(error);
62
+ });
63
+
64
+ describe('when checkResource returns "empty"', () => {
65
+ beforeEach(() => checker.mockReturnValue('empty'));
66
+
67
+ test('returns the empty module path', () => {
68
+ expect(subject()).toBe(
69
+ require.resolve('../../webpack/configs/plugins/ignore-plugin/empty-module')
70
+ );
71
+ });
72
+ });
73
+
74
+ describe('when checkResource returns "throw"', () => {
75
+ beforeEach(() => checker.mockReturnValue('throw'));
76
+
77
+ test('rethrows the error', () => {
78
+ expect(subject).toThrow(error);
79
+ });
80
+ });
81
+ });
41
82
  });
@@ -1,9 +1,25 @@
1
1
  import type { SyncResolver } from 'jest-resolve';
2
+ import { checkResource } from '../core/check-resource';
2
3
  import { SVG_PATH_REGEX } from '../utils/transform-svg';
3
4
 
5
+ const EMPTY_MODULE_PATH = require.resolve('../webpack/configs/plugins/ignore-plugin/empty-module');
6
+
4
7
  const resolver: SyncResolver = (path, options) => {
5
8
  const { type, path: pathSansType } = SVG_PATH_REGEX.exec(path)?.groups ?? {};
6
- return options.defaultResolver(type ? pathSansType : path, options);
9
+ const resolvedPath = type ? pathSansType : path;
10
+
11
+ try {
12
+ return options.defaultResolver(resolvedPath, options);
13
+ } catch (error) {
14
+ const mode = checkResource({ package: { dependencies: {} } })({
15
+ resource: resolvedPath,
16
+ importer: options.basedir ?? '',
17
+ });
18
+ if (mode === 'empty') {
19
+ return EMPTY_MODULE_PATH;
20
+ }
21
+ throw error;
22
+ }
7
23
  };
8
24
 
9
25
  export = resolver;
@@ -1,5 +1,6 @@
1
1
  import type { Plugin } from 'vite';
2
- import { BuildContext, checkResource } from '../../core';
2
+ import { checkResource } from '../../core';
3
+ import type { PackageContext } from '../../core/types';
3
4
 
4
5
  export const THROW_PREFIX = '\0IGNORE_THROW:';
5
6
  export const EMPTY_PREFIX = '\0IGNORE_EMPTY:';
@@ -19,7 +20,9 @@ export const EMPTY_PREFIX = '\0IGNORE_EMPTY:';
19
20
  * `import * as X from 'optional'` followed by `X.foo === undefined` detection. Opt in via
20
21
  * `cli.peerDependenciesMeta["pkg"].fallback = "empty"` in the importer's package.json.
21
22
  */
22
- export function ignoreModulesPlugin(context: BuildContext): Plugin {
23
+ export function ignoreModulesPlugin(context: {
24
+ package: Pick<PackageContext, 'dependencies'>;
25
+ }): Plugin {
23
26
  const checker = checkResource(context);
24
27
 
25
28
  return {
@@ -23,6 +23,7 @@ import {
23
23
  webpackProdConfigFileName,
24
24
  } from '../create-webpack-config';
25
25
  import { getCallerFile, splitByEntry } from '../utils';
26
+ const FilterWarningsPlugin = require('webpack-filter-warnings-plugin');
26
27
 
27
28
  jest.mock('fs', () => fs);
28
29
  jest.mock('html-webpack-plugin', () => jest.fn());
@@ -36,6 +37,7 @@ jest.mock('webpack', () => ({
36
37
  IgnorePlugin: jest.fn(),
37
38
  }));
38
39
  jest.mock('webpack-assets-manifest', () => ({ WebpackAssetsManifest: jest.fn() }));
40
+ jest.mock('webpack-filter-warnings-plugin', () => jest.fn());
39
41
  jest.mock('webpack-virtual-modules', () => jest.fn());
40
42
 
41
43
  jest.mock('../../utils', () => ({
@@ -104,6 +106,7 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
104
106
  };
105
107
 
106
108
  jest.resetAllMocks();
109
+ jest.mocked(FilterWarningsPlugin).mockImplementation(mockPlugIn('FilterWarningsPlugin'));
107
110
  jest.mocked(MiniCssExtractPlugin).mockImplementation(mockPlugIn('MiniCssExtractPlugin'));
108
111
  jest.mocked(DefinePlugin).mockImplementation(mockPlugIn('DefinePlugin'));
109
112
  jest.mocked(HtmlWebpackPlugin).mockImplementation(mockPlugIn('HtmlWebpackPlugin'));
@@ -340,6 +343,14 @@ describe(`[startup] ${createWebpackConfig.name}`, () => {
340
343
  });
341
344
  });
342
345
 
346
+ test('configures FilterWarningsPlugin plugin', () => {
347
+ expect(subject().plugins).toContainEqual(
348
+ new FilterWarningsPlugin({
349
+ exclude: /export .* was not found in/,
350
+ })
351
+ );
352
+ });
353
+
343
354
  describe('when light option is set to true', () => {
344
355
  beforeEach(() => (options.light = true));
345
356
 
@@ -2,11 +2,7 @@ const FilterWarningsPlugin = require('webpack-filter-warnings-plugin');
2
2
  import { BuildContext } from '../../../core';
3
3
  import { Overrides } from '../../types';
4
4
 
5
- export function filterWarningsPlugin(context: BuildContext, _: Overrides) {
6
- if (context.build.light) {
7
- return;
8
- }
9
-
5
+ export function filterWarningsPlugin(_context: BuildContext, _: Overrides) {
10
6
  return new FilterWarningsPlugin({
11
7
  exclude: /export .* was not found in/,
12
8
  });