diff --git a/.talismanrc b/.talismanrc index 587a20374..34256bef2 100644 --- a/.talismanrc +++ b/.talismanrc @@ -1,6 +1,6 @@ fileignoreconfig: - filename: pnpm-lock.yaml - checksum: 069d87fc69d059bd53fa46d98916e831641ea4889cebcc9b9b30884ac67dab30 + checksum: 11bf156488b12f529ab393fffa8e9d8741388ef2929263e89650eada87bfcf8a - filename: packages/contentstack-branches/README.md checksum: ad32bd365db7f085cc2ea133d69748954606131ec6157a272a3471aea60011c2 - filename: packages/contentstack-branches/src/branch/diff-handler.ts @@ -11,4 +11,24 @@ fileignoreconfig: checksum: d0613295ee26f7a77d026e40db0a4ab726fabd0a74965f729f1a66d1ef14768f - filename: packages/contentstack-branches/src/branch/merge-handler.ts checksum: 4fd8dba9b723733530b9ba12e81e1d3e5d60b73ac4c082defb10593f257bb133 + - filename: packages/contentstack-export/src/export/modules/environments.ts + checksum: a92c5de7ed8e80f08f911727973a66e0416b4a52265c275d1d25c3095f912811 + - filename: packages/contentstack-import/src/utils/backup-handler.ts + checksum: 9a892b5c4b5aac230fb5969e7f34afdac0b6f96208e64bf9d1195468c935c66c + - filename: packages/contentstack-import/test/unit/utils/backup-handler.test.ts + checksum: 69860727e9b3099d8e1e95db2af17fc8b161684f675477981d27877cd8e1b3bb + - filename: pnpm-lock.yaml + checksum: 11bf156488b12f529ab393fffa8e9d8741388ef2929263e89650eada87bfcf8a + - filename: packages/contentstack-export/test/unit/export/modules/marketplace-apps.test.ts + checksum: 299b8f60cce1f64be7c20786d6a7c9c370474b97b06d1846114a76a70ec20cf7 + - filename: packages/contentstack-export/test/unit/export/module-exporter.test.ts + checksum: 67b70c93ed679ccb2c61d0c277380676e33c91da8a423f948e81937e5d1d9479 + - filename: packages/contentstack-asset-management/src/import/assets.ts + checksum: ed6af5d798282808c09643e1dcd1eaede89ce2b09bd0425998af64849b4f3f61 + - filename: skills/code-review/SKILL.md + checksum: 29673e16f6b41fcec7fa236912e7f72b920ed4a3d9a66a89308b4a058b247f3e + - filename: skills/contentstack-cli/SKILL.md + checksum: 36762d43bbacedd0b344f9d4f1179a88e3dbc7e2467341ba42198dcd1bf9e40c + - filename: skills/testing/SKILL.md + checksum: ee1c82f1bb51860cb26fb9f112a53df0127e316fcb22a094034024741251fa3c version: '1.0' diff --git a/packages/contentstack-audit/README.md b/packages/contentstack-audit/README.md index 9f2c53d70..4217deaaf 100644 --- a/packages/contentstack-audit/README.md +++ b/packages/contentstack-audit/README.md @@ -19,7 +19,7 @@ $ npm install -g @contentstack/cli-audit $ csdx COMMAND running command... $ csdx (--version|-v) -@contentstack/cli-audit/2.0.0-beta.6 darwin-arm64 node-v24.13.0 +@contentstack/cli-audit/2.0.0-beta.9 darwin-arm64 node-v22.13.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-audit/src/config/index.ts b/packages/contentstack-audit/src/config/index.ts index 457e5e59b..5e36e0d90 100644 --- a/packages/contentstack-audit/src/config/index.ts +++ b/packages/contentstack-audit/src/config/index.ts @@ -110,6 +110,7 @@ const config = { 'publish_locale', 'publish_environment', 'asset_uid', + 'space_id', 'selectedValue', 'ct_uid', 'action', diff --git a/packages/contentstack-audit/src/messages/index.ts b/packages/contentstack-audit/src/messages/index.ts index 3ac92d09e..76d7f3f3e 100644 --- a/packages/contentstack-audit/src/messages/index.ts +++ b/packages/contentstack-audit/src/messages/index.ts @@ -44,6 +44,7 @@ const auditMsg = { ENTRY_PUBLISH_DETAILS: `Removing the publish details for entry '{uid}' of ct '{ctuid}' in locale '{locale}' as locale '{publocale}' or environment '{environment}' does not exist`, CT_REFERENCE_FIELD: `The mentioned Reference field is not Array field reference is '{reference_to}' having display name '{display_name}''`, ASSET_NOT_EXIST: `The publish_details either does not exist or is not an array for asset uid '{uid}'`, + AUDITING_SPACE: `Auditing assets for space: '{spaceId}'`, ENTRY_PUBLISH_DETAILS_NOT_EXIST: `The publish_details either does not exist or is not an array for entry uid '{uid}'`, FIELD_RULE_CONDITION_ABSENT: `The operand field '{condition_field}' is not present in the schema of the content-type {ctUid}`, FIELD_RULE_TARGET_ABSENT: `The target field '{target_field}' is not present in the schema of the content-type {ctUid}`, diff --git a/packages/contentstack-audit/src/modules/assets.ts b/packages/contentstack-audit/src/modules/assets.ts index 6e84abc78..c6c1a637b 100644 --- a/packages/contentstack-audit/src/modules/assets.ts +++ b/packages/contentstack-audit/src/modules/assets.ts @@ -1,12 +1,7 @@ import { join, resolve } from 'path'; -import { existsSync, readFileSync, writeFileSync } from 'fs'; -import { FsUtility, sanitizePath, cliux, log } from '@contentstack/cli-utilities'; -import { - ContentTypeStruct, - CtConstructorParam, - ModuleConstructorParam, - EntryStruct, -} from '../types'; +import { existsSync, readFileSync, readdirSync, writeFileSync } from 'fs'; +import { FsUtility, sanitizePath, cliux, log, configHandler } from '@contentstack/cli-utilities'; +import { ContentTypeStruct, CtConstructorParam, ModuleConstructorParam, EntryStruct } from '../types'; import auditConfig from '../config'; import { $t, auditFixMsg, auditMsg, commonMsg } from '../messages'; import values from 'lodash/values'; @@ -28,6 +23,7 @@ export default class Assets extends BaseClass { protected missingEnvLocales: Record = {}; public moduleName: keyof typeof auditConfig.moduleConfig; private fixOverwriteConfirmed: boolean | null = null; + private resolvedBasePaths: Array<{ path: string; spaceId: string | null }> = []; constructor({ fix, config, moduleName }: ModuleConstructorParam & CtConstructorParam) { super({ config }); @@ -62,7 +58,8 @@ export default class Assets extends BaseClass { log.debug(`Data directory: ${this.folderPath}`, this.config.auditContext); log.debug(`Fix mode: ${this.fix}`, this.config.auditContext); - if (!existsSync(this.folderPath)) { + const spacesDir = join(this.config.basePath, 'spaces'); + if (!existsSync(this.folderPath) && !existsSync(spacesDir)) { log.debug(`Skipping ${this.moduleName} audit - path does not exist`, this.config.auditContext); log.warn(`Skipping ${this.moduleName} audit`, this.config.auditContext); cliux.print($t(auditMsg.NOT_VALID_PATH, { path: this.folderPath }), { color: 'yellow' }); @@ -80,26 +77,32 @@ export default class Assets extends BaseClass { progress.updateStatus('Validating asset references...'); } + this.resolvedBasePaths = this.resolveAssetBasePaths(); + log.debug(`Resolved ${this.resolvedBasePaths.length} asset base path(s)`, this.config.auditContext); + log.debug('Starting asset Reference, Environment and Locale validation', this.config.auditContext); await this.lookForReference(); - if (returnFixSchema) { - log.debug(`Returning fixed schema with ${this.schema?.length || 0} items`, this.config.auditContext); - return this.schema; - } + if (returnFixSchema) { + log.debug(`Returning fixed schema with ${this.schema?.length || 0} items`, this.config.auditContext); + return this.schema; + } - log.debug('Cleaning up empty missing environment/locale references', this.config.auditContext); - for (let propName in this.missingEnvLocales) { - if (Array.isArray(this.missingEnvLocales[propName])) { - if (!this.missingEnvLocales[propName].length) { - delete this.missingEnvLocales[propName]; + log.debug('Cleaning up empty missing environment/locale references', this.config.auditContext); + for (let propName in this.missingEnvLocales) { + if (Array.isArray(this.missingEnvLocales[propName])) { + if (!this.missingEnvLocales[propName].length) { + delete this.missingEnvLocales[propName]; + } } } - } const totalIssues = Object.keys(this.missingEnvLocales).length; - log.debug(`${this.moduleName} audit completed. Found ${totalIssues} assets with missing environment/locale references`, this.config.auditContext); - + log.debug( + `${this.moduleName} audit completed. Found ${totalIssues} assets with missing environment/locale references`, + this.config.auditContext, + ); + this.completeProgress(true); return this.missingEnvLocales; } catch (error: any) { @@ -120,11 +123,11 @@ export default class Assets extends BaseClass { const localesFolderPath = resolve(this.config.basePath, this.config.moduleConfig.locales.dirName); const localesPath = join(localesFolderPath, this.config.moduleConfig.locales.fileName); const masterLocalesPath = join(localesFolderPath, 'master-locale.json'); - + log.debug(`Loading locales from: ${localesFolderPath}`, this.config.auditContext); log.debug(`Master locales path: ${masterLocalesPath}`, this.config.auditContext); log.debug(`Locales path: ${localesPath}`, this.config.auditContext); - + this.locales = existsSync(masterLocalesPath) ? values(JSON.parse(readFileSync(masterLocalesPath, 'utf8'))) : []; log.debug(`Loaded ${this.locales.length} locales from master-locale.json`, this.config.auditContext); @@ -139,19 +142,53 @@ export default class Assets extends BaseClass { this.locales = this.locales.map((locale: any) => locale.code); log.debug(`Total locales loaded: ${this.locales.length}`, this.config.auditContext); log.debug(`Locale codes: ${this.locales.join(', ')}`, this.config.auditContext); - + const environmentPath = resolve( this.config.basePath, this.config.moduleConfig.environments.dirName, this.config.moduleConfig.environments.fileName, ); log.debug(`Loading environments from: ${environmentPath}`, this.config.auditContext); - + this.environments = existsSync(environmentPath) ? keys(JSON.parse(readFileSync(environmentPath, 'utf8'))) : []; log.debug(`Total environments loaded: ${this.environments.length}`, this.config.auditContext); log.debug(`Environment names: ${this.environments.join(', ')}`, this.config.auditContext); } + /** + * Detects whether the export uses the old flat structure (/assets/) or the new + * multi-space structure (/spaces//assets/) and returns a list of resolved + * asset base paths paired with their space IDs (null for old structure). + */ + private resolveAssetBasePaths(): Array<{ path: string; spaceId: string | null }> { + const spacesDir = join(this.config.basePath, 'spaces'); + + if (!existsSync(spacesDir)) { + log.debug('No spaces/ directory found — using flat asset structure', this.config.auditContext); + return [{ path: this.folderPath, spaceId: null }]; + } + + log.debug(`Multi-space directory found: ${spacesDir}`, this.config.auditContext); + const spaceDirs = readdirSync(spacesDir, { withFileTypes: true }).filter( + (entry) => entry.isDirectory() && existsSync(join(spacesDir, entry.name, 'assets')), + ); + + if (spaceDirs.length === 0) { + log.debug( + 'spaces/ directory exists but contains no valid space directories with assets/', + this.config.auditContext, + ); + return []; + } + + const paths = spaceDirs.map((entry) => ({ + path: join(spacesDir, entry.name, 'assets'), + spaceId: entry.name, + })); + log.debug(`Resolved ${paths.length} space(s): ${paths.map((p) => p.spaceId).join(', ')}`, this.config.auditContext); + return paths; + } + /** * The function checks if it can write the fix content to a file and if so, it writes the content as * JSON to the specified file path. @@ -169,7 +206,10 @@ export default class Assets extends BaseClass { canWrite = this.fixOverwriteConfirmed; log.debug(`Using cached overwrite confirmation: ${canWrite}`, this.config.auditContext); } else { - log.debug(`Asking user for confirmation to write fix content (--yes flag: ${this.config.flags.yes})`, this.config.auditContext); + log.debug( + `Asking user for confirmation to write fix content (--yes flag: ${this.config.flags.yes})`, + this.config.auditContext, + ); this.completeProgress(true); canWrite = await cliux.confirm(commonMsg.FIX_CONFIRMATION); this.fixOverwriteConfirmed = canWrite; @@ -188,85 +228,130 @@ export default class Assets extends BaseClass { } /** - * This function traverses over the publish details of the assets and removes the publish details where the locale or environment does not exist + * This function traverses over the publish details of the assets and removes the publish details where the locale or environment does not exist. + * Supports both the old flat structure (/assets/) and the new multi-space structure + * (/spaces//assets/) via this.resolvedBasePaths. */ async lookForReference(): Promise { log.debug('Starting asset reference validation', this.config.auditContext); - let basePath = join(this.folderPath); - log.debug(`Assets base path: ${basePath}`, this.config.auditContext); - - let fsUtility = new FsUtility({ basePath, indexFileName: 'assets.json' }); - let indexer = fsUtility.indexFileContent; - log.debug(`Found ${Object.keys(indexer).length} asset files to process`, this.config.auditContext); - - for (const fileIndex in indexer) { - log.debug(`Processing asset file: ${indexer[fileIndex]}`, this.config.auditContext); - const assets = (await fsUtility.readChunkFiles.next()) as Record; - this.assets = assets; - log.debug(`Loaded ${Object.keys(assets).length} assets from file`, this.config.auditContext); - - for (const assetUid in assets) { - log.debug(`Processing asset: ${assetUid}`, this.config.auditContext); - - if (this.assets[assetUid]?.publish_details && !Array.isArray(this.assets[assetUid].publish_details)) { - log.debug(`Asset ${assetUid} has invalid publish_details format`, this.config.auditContext); - cliux.print($t(auditMsg.ASSET_NOT_EXIST, { uid: assetUid }), { color: 'red' }); - this.assets[assetUid].publish_details = []; - } + const logConfig = configHandler.get('log') || {}; + const showConsoleLogs = logConfig.showConsoleLogs ?? false; - const publishDetails = this.assets[assetUid]?.publish_details; - log.debug(`Asset ${assetUid} has ${publishDetails?.length || 0} publish details`, this.config.auditContext); - - if (Array.isArray(this.assets[assetUid].publish_details)) { - this.assets[assetUid].publish_details = this.assets[assetUid].publish_details.filter((pd: any) => { - log.debug(`Checking publish detail: locale=${pd?.locale}, environment=${pd?.environment}`, this.config.auditContext); - - if (this.locales?.includes(pd?.locale) && this.environments?.includes(pd?.environment)) { - log.debug(`Publish detail valid for asset ${assetUid}: locale=${pd.locale}, environment=${pd.environment}`, this.config.auditContext); - return true; - } else { - log.debug(`Publish detail invalid for asset ${assetUid}: locale=${pd.locale}, environment=${pd.environment}`, this.config.auditContext); - cliux.print( - $t(auditMsg.SCAN_ASSET_WARN_MSG, { uid: assetUid, locale: pd.locale, environment: pd.environment }), - { color: 'yellow' }, - ); - if (!Object.keys(this.missingEnvLocales).includes(assetUid)) { - log.debug(`Creating new missing reference entry for asset ${assetUid}`, this.config.auditContext); - this.missingEnvLocales[assetUid] = [ - { asset_uid: assetUid, publish_locale: pd.locale, publish_environment: pd.environment }, - ]; - } else { - log.debug(`Adding to existing missing reference entry for asset ${assetUid}`, this.config.auditContext); - this.missingEnvLocales[assetUid].push({ - asset_uid: assetUid, - publish_locale: pd.locale, - publish_environment: pd.environment, - }); - } - return false; + if (!this.resolvedBasePaths.length) { + this.resolvedBasePaths = this.resolveAssetBasePaths(); + } + + for (const { path: spacePath, spaceId } of this.resolvedBasePaths) { + log.debug(`Processing asset path: ${spacePath} (spaceId=${spaceId ?? 'none'})`, this.config.auditContext); + + // Log UX: print a space header so output is clearly separated per space + if (showConsoleLogs && spaceId !== null) { + cliux.print(''); + cliux.print($t(auditMsg.AUDITING_SPACE, { spaceId }), { color: 'cyan' }); + } + + // Progress bar UX: update status label to reflect the current space + this.progressManager?.updateStatus?.(spaceId ? `Space: ${spaceId}` : 'Scanning assets...'); + + let fsUtility = new FsUtility({ basePath: spacePath, indexFileName: 'assets.json' }); + let indexer = fsUtility.indexFileContent; + log.debug(`Found ${Object.keys(indexer).length} asset files to process`, this.config.auditContext); + + for (const fileIndex in indexer) { + log.debug(`Processing asset file: ${indexer[fileIndex]}`, this.config.auditContext); + const assets = (await fsUtility.readChunkFiles.next()) as Record; + this.assets = assets; + log.debug(`Loaded ${Object.keys(assets).length} assets from file`, this.config.auditContext); + + for (const assetUid in assets) { + log.debug(`Processing asset: ${assetUid}`, this.config.auditContext); + + if (this.assets[assetUid]?.publish_details && !Array.isArray(this.assets[assetUid].publish_details)) { + log.debug(`Asset ${assetUid} has invalid publish_details format`, this.config.auditContext); + cliux.print($t(auditMsg.ASSET_NOT_EXIST, { uid: assetUid }), { color: 'red' }); + this.assets[assetUid].publish_details = []; + } + + const publishDetails = this.assets[assetUid]?.publish_details; + log.debug(`Asset ${assetUid} has ${publishDetails?.length || 0} publish details`, this.config.auditContext); + + if (Array.isArray(this.assets[assetUid].publish_details)) { + this.assets[assetUid].publish_details = this.assets[assetUid].publish_details.filter((pd: any) => { + log.debug( + `Checking publish detail: locale=${pd?.locale}, environment=${pd?.environment}`, + this.config.auditContext, + ); + + if (this.locales?.includes(pd?.locale) && this.environments?.includes(pd?.environment)) { + log.debug( + `Publish detail valid for asset ${assetUid}: locale=${pd.locale}, environment=${pd.environment}`, + this.config.auditContext, + ); + return true; + } else { + log.debug( + `Publish detail invalid for asset ${assetUid}: locale=${pd.locale}, environment=${pd.environment}`, + this.config.auditContext, + ); + cliux.print( + $t(auditMsg.SCAN_ASSET_WARN_MSG, { uid: assetUid, locale: pd.locale, environment: pd.environment }), + { color: 'yellow' }, + ); + if (!Object.keys(this.missingEnvLocales).includes(assetUid)) { + log.debug(`Creating new missing reference entry for asset ${assetUid}`, this.config.auditContext); + this.missingEnvLocales[assetUid] = [ + { + asset_uid: assetUid, + publish_locale: pd.locale, + publish_environment: pd.environment, + space_id: spaceId, + }, + ]; + } else { + log.debug( + `Adding to existing missing reference entry for asset ${assetUid}`, + this.config.auditContext, + ); + this.missingEnvLocales[assetUid].push({ + asset_uid: assetUid, + publish_locale: pd.locale, + publish_environment: pd.environment, + space_id: spaceId, + }); + } + return false; + } + }); + } + + log.info($t(auditMsg.SCAN_ASSET_SUCCESS_MSG, { uid: assetUid }), this.config.auditContext); + const remainingPublishDetails = this.assets[assetUid].publish_details?.length || 0; + log.debug( + `Asset ${assetUid} now has ${remainingPublishDetails} valid publish details`, + this.config.auditContext, + ); + + if (this.progressManager) { + this.progressManager.tick(true, `asset: ${assetUid}`, null); + } + + if (this.fix) { + log.debug(`Fixing asset ${assetUid}`, this.config.auditContext); + log.info($t(auditFixMsg.ASSET_FIX, { uid: assetUid }), this.config.auditContext); } - }); - } - log.info($t(auditMsg.SCAN_ASSET_SUCCESS_MSG, { uid: assetUid }), this.config.auditContext); - const remainingPublishDetails = this.assets[assetUid].publish_details?.length || 0; - log.debug(`Asset ${assetUid} now has ${remainingPublishDetails} valid publish details`, this.config.auditContext); - - // Track progress for each asset processed - if (this.progressManager) { - this.progressManager.tick(true, `asset: ${assetUid}`, null); } if (this.fix) { - log.debug(`Fixing asset ${assetUid}`, this.config.auditContext); - log.info($t(auditFixMsg.ASSET_FIX, { uid: assetUid }), this.config.auditContext); + await this.writeFixContent(`${spacePath}/${indexer[fileIndex]}`, this.assets); } } - - if (this.fix) { - await this.writeFixContent(`${basePath}/${indexer[fileIndex]}`, this.assets); - } } - - log.debug(`Asset reference validation completed. Processed ${Object.keys(this.missingEnvLocales).length} assets with issues`, this.config.auditContext); + + log.debug( + `Asset reference validation completed. Processed ${ + Object.keys(this.missingEnvLocales).length + } assets with issues`, + this.config.auditContext, + ); } } diff --git a/packages/contentstack-audit/src/modules/modulesData.ts b/packages/contentstack-audit/src/modules/modulesData.ts index dc638c66c..8873dff29 100644 --- a/packages/contentstack-audit/src/modules/modulesData.ts +++ b/packages/contentstack-audit/src/modules/modulesData.ts @@ -1,5 +1,5 @@ import { join, resolve } from 'path'; -import { existsSync, readFileSync } from 'fs'; +import { existsSync, readFileSync, readdirSync } from 'fs'; import { FsUtility, sanitizePath, log } from '@contentstack/cli-utilities'; import { ConfigType, ContentTypeStruct, CtConstructorParam, ModuleConstructorParam } from '../types'; import { keys, values } from 'lodash'; @@ -46,10 +46,25 @@ export default class ModuleDataReader { break; case 'assets': { log.debug(`Counting assets`, this.config.auditContext); - const assetsPath = join(this.folderPath, 'assets'); - log.debug(`Assets path: ${assetsPath}`, this.config.auditContext); - count = (await this.readEntryAssetsModule(assetsPath, 'assets')) || 0; - log.debug(`Assets count: ${count}`, this.config.auditContext); + const spacesDir = join(this.folderPath, 'spaces'); + if (existsSync(spacesDir)) { + log.debug(`Multi-space structure detected at: ${spacesDir}`, this.config.auditContext); + const spaceDirs = readdirSync(spacesDir, { withFileTypes: true }).filter( + (entry) => entry.isDirectory() && existsSync(join(spacesDir, entry.name, 'assets')), + ); + for (const spaceDir of spaceDirs) { + const spaceAssetsPath = join(spacesDir, spaceDir.name, 'assets'); + log.debug(`Counting assets in space: ${spaceDir.name} at ${spaceAssetsPath}`, this.config.auditContext); + const spaceCount = (await this.readEntryAssetsModule(spaceAssetsPath, 'assets')) || 0; + log.debug(`Space ${spaceDir.name} asset count: ${spaceCount}`, this.config.auditContext); + count += spaceCount; + } + } else { + const assetsPath = join(this.folderPath, 'assets'); + log.debug(`Flat structure detected, assets path: ${assetsPath}`, this.config.auditContext); + count = (await this.readEntryAssetsModule(assetsPath, 'assets')) || 0; + } + log.debug(`Total assets count: ${count}`, this.config.auditContext); break; } case 'entries': diff --git a/packages/contentstack-audit/src/types/content-types.ts b/packages/contentstack-audit/src/types/content-types.ts index 2a27e92af..59cd78316 100644 --- a/packages/contentstack-audit/src/types/content-types.ts +++ b/packages/contentstack-audit/src/types/content-types.ts @@ -162,6 +162,7 @@ enum OutputColumn { 'publish_locale' = 'publish_locale', 'publish_environment' = 'publish_environment', 'asset_uid' = 'asset_uid', + 'space_id' = 'space_id', 'selectedValue' = 'selectedValue', 'fixStatus' = 'fixStatus', 'Content_type_uid' = 'ct_uid', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f959bdcca..81fae2cfb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10851,8 +10851,8 @@ snapshots: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) eslint-config-xo-space: 0.35.0(eslint@8.57.1) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-mocha: 10.5.0(eslint@8.57.1) eslint-plugin-n: 15.7.0(eslint@8.57.1) eslint-plugin-perfectionist: 2.11.0(eslint@8.57.1)(typescript@5.9.3) @@ -10913,8 +10913,8 @@ snapshots: eslint-config-oclif: 5.2.2(eslint@8.57.1) eslint-config-xo: 0.49.0(eslint@8.57.1) eslint-config-xo-space: 0.35.0(eslint@8.57.1) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jsdoc: 50.8.0(eslint@8.57.1) eslint-plugin-mocha: 10.5.0(eslint@8.57.1) eslint-plugin-n: 17.24.0(eslint@8.57.1)(typescript@5.9.3) @@ -10955,7 +10955,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3(supports-color@8.1.1) @@ -10966,7 +10966,7 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -10981,18 +10981,18 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -11007,14 +11007,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.59.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -11031,7 +11031,7 @@ snapshots: eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -11042,7 +11042,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) hasown: 2.0.3 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -11089,7 +11089,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -11100,7 +11100,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.3 is-core-module: 2.16.1 is-glob: 4.0.3